All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.izforge.izpack.util.unix.UnixUser Maven / Gradle / Ivy

There is a newer version: 5.2.3
Show newest version
/*
 * IzPack - Copyright 2001-2008 Julien Ponge, All Rights Reserved.
 *
 * http://izpack.org/
 * http://izpack.codehaus.org/
 *
 * Copyright 2006 Marc Eppelmann
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.izforge.izpack.util.unix;

import com.izforge.izpack.util.FileExecutor;

import java.io.File;
import java.io.IOException;
import java.util.StringTokenizer;


/**
 * This represents a Unix User. If initialized via fromEtcPasswdLine(),  the users
 * Name, home, uid, gid, and shell can be asked.
 *
 * @author marc.eppelmann@reddot.de
 */
public class UnixUser
{
    //~ Instance fields ********************************************************************

    /**
     * internal itsName
     */
    private String itsName;

    /**
     * internal itsPasswdDigest
     */
    private String itsPasswdDigest;

    /**
     * internal itsId
     */
    private String itsId;

    /**
     * internal itsGid
     */
    private String itsGid;

    /**
     * internal itsDescription
     */
    private String itsDescription;

    /**
     * internal itsHome
     */
    private String itsHome;

    /**
     * internal itsShell
     */
    private String itsShell;

    /**
     * internal name
     */
    private static String XDGDesktopFolderNameScriptFilename;


    private static File XDGDesktopFolderNameScript;
    //~ Methods ****************************************************************************

    /**
     * Gets the Users Login Name
     *
     * @return the users login Name
     */
    public String getName()
    {
        return itsName;
    }

    /**
     * Gets the users passwd Digest or X if hidden in /etc/shadow
     *
     * @return the passwdDigest or x
     */
    public String getPasswdDigest()
    {
        return itsPasswdDigest;
    }

    /**
     * Gets the Users UID
     *
     * @return The Uid
     */
    public String getId()
    {
        return itsId;
    }

    /**
     * Gtes the Users Group ID
     *
     * @return the gid
     */
    public String getGid()
    {
        return itsGid;
    }

    /**
     * Gets the Description aka Full Name
     *
     * @return the users descriptio or full name
     */
    public String getDescription()
    {
        return itsDescription;
    }

    /**
     * Gets the Users Home Directory
     *
     * @return the users home dir
     */
    public String getHome()
    {
        return itsHome.trim();
    }

    /**
     * Gets the users default Login-Shell
     *
     * @return The login shell or /bin/false for system users
     */
    public String getShell()
    {
        return itsShell;
    }

    /**
     * Parses a Line from /etc/passwd and stores each :token: in their field of the user.
     * Sample Line from /etc/passwd "eppelmann.local:x:900:100:Marc Eppelmann:/mnt/local/home/eppelmann.local:/bin/bash"
     *
     * @param anEtcPasswdLine A Passwd Line of the User.
     * @return The filled User
     */
    public UnixUser fromEtcPasswdLine(String anEtcPasswdLine)
    {
        if (anEtcPasswdLine == null)
        {
            return null;
        }

        StringTokenizer usersToken = new StringTokenizer(anEtcPasswdLine, ":");

        UnixUser user = new UnixUser();

        if (usersToken.hasMoreTokens())
        {
            user.itsName = usersToken.nextToken();
        }

        if (usersToken.hasMoreTokens())
        {
            user.itsPasswdDigest = usersToken.nextToken();
        }

        if (usersToken.hasMoreTokens())
        {
            user.itsId = usersToken.nextToken();
        }

        if (usersToken.hasMoreTokens())
        {
            user.itsGid = usersToken.nextToken();
        }

        if (usersToken.hasMoreTokens())
        {
            user.itsDescription = usersToken.nextToken();
        }

        if (usersToken.hasMoreTokens())
        {
            user.itsHome = usersToken.nextToken();
        }

        if (usersToken.hasMoreTokens())
        {
            user.itsShell = usersToken.nextToken();
        }

        return user;
    }

    /**
     * Creates a small script, which calls $HOME/.config/user-dirs.dirs then echoes the $XDG_DESKTOP_DIR
     * in the /tmp folder and returns its pseudo unique absolute filename.
     * The call of this script should return the absolute Desktop foldername.
     *
     * @return the absolute Filename of the script.
     */
    public String getCreatedXDGDesktopFolderNameScriptFilename()
    {
        ShellScript sh = new ShellScript();

        sh.appendln(". " + getHome() + File.separator + ".config" + File.separator + "user-dirs.dirs");
        sh.appendln();
        sh.appendln("echo $XDG_DESKTOP_DIR");

        String pseudoUnique = this.getClass().getName() + Long.toString(System.currentTimeMillis());

        String scriptFilename = null;

        try
        {
            scriptFilename = File.createTempFile(pseudoUnique, ".sh").toString();
        }
        catch (IOException e)
        {
            scriptFilename = System.getProperty("java.io.tmpdir", "/tmp") + "/" + pseudoUnique
                    + ".sh";
            e.printStackTrace();
        }

        sh.write(scriptFilename);

        return scriptFilename;
    }

    /**
     * Gets the Name of the XDG-Desktop Folder if defined in the $HOME/.config/user-dirs.dirs File as absolute File/Pathname
     *
     * @return The absolute File/Pathname of the Desktop foldername.
     */
    public String getXdgDesktopfolder()
    {
        File configFile = new File(getHome() + File.separator + ".config" + File.separator + "user-dirs.dirs");
        if (configFile.exists())
        {
            if (XDGDesktopFolderNameScript == null)
            /** TODO: can be optimized with a shared script **/
            {
                XDGDesktopFolderNameScriptFilename = getCreatedXDGDesktopFolderNameScriptFilename();
            }

            FileExecutor.getExecOutput(new String[]{UnixHelper.getCustomCommand("chmod"), "+x", XDGDesktopFolderNameScriptFilename}, true);
            String xdgDesktopfolder = FileExecutor.getExecOutput(new String[]{XDGDesktopFolderNameScriptFilename}, true).trim();
            new File(XDGDesktopFolderNameScriptFilename).delete();

            return xdgDesktopfolder;

        }
        else
        {
            return getHome() + File.separator + "Desktop";
        }
    }

    /**
     * Dumps the USer fields
     *
     * @return The User representation as String
     */
    public String toString()
    {
        StringBuffer result = new StringBuffer();

        result.append("User: ");
        result.append(itsName);

        result.append(" X: ");
        result.append(itsPasswdDigest);

        result.append(" Id: ");
        result.append(itsId);

        result.append(" Gid: ");
        result.append(itsGid);

        result.append(" Desc.: ");
        result.append(itsDescription);

        result.append(" Home: ");
        result.append(itsHome);

        result.append(" Shell: ");
        result.append(itsShell);

        return result.toString();
    }

    /**
     * Static Test Main
     *
     * @param args
     */
    public static void main(String[] args)
    {
        System.out.println(new UnixUser().fromEtcPasswdLine(""));
        System.out.println(new UnixUser().fromEtcPasswdLine("eppelmann.local:x:500:100:Marc L Eppelmann:/mnt/local/home/eppelmann.local:/bin/bash"));
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy