diff --git a/src/library/sysadm-usermanager.cpp b/src/library/sysadm-usermanager.cpp index 9586bf6..fa8a0dc 100644 --- a/src/library/sysadm-usermanager.cpp +++ b/src/library/sysadm-usermanager.cpp @@ -16,12 +16,12 @@ UserManager::UserManager(QString chroot) loadShells(); } -void UserManager::NewUser(QString fullName, QString userName, QString password, QString shell) +void UserManager::NewUser(QString fullName, QString userName, QString password, QString home, QString shell, int uid, int gid, bool encrypt) { User user; user.UserName = userName; user.FullName = fullName; - user.HomeFolder = "/usr/home/"+userName; + user.HomeFolder = (home.isEmpty())?"/usr/home/"+userName : home; user.Shell = shell; //Add User @@ -42,8 +42,23 @@ void UserManager::NewUser(QString fullName, QString userName, QString password, args << "-c"; //sets the comment field args << "\""+ fullName+"\""; //with the full name of the user args << "-m"; //create the user's home directory + if(!home.isEmpty()) + { + args << "-d"; //set the home directory to + args << home; //this + } args << "-s"; //set the user's shell args << shell; //to this + if(gid != -1) + { + args << "-g"; //set the group id to + args << QString::number(gid); //this + } + if(uid != -1) + { + args << "-u"; //set the user id to + args << QString::number(uid); //this + } args << "-G"; //additionally add the user to args << "operator"; //the operator's group @@ -64,6 +79,10 @@ void UserManager::NewUser(QString fullName, QString userName, QString password, General::RunCommand("su",args); } + //if we're going to PersonaCrypt the home directory + if(encrypt) + initPCDevice(user,home,password); + //reloads the groups and users so that the internal model is consistent loadUsers(); loadGroups(); @@ -89,7 +108,7 @@ void UserManager::DeleteUser(User user) if ( ! chroot.isEmpty() ) General::RunCommand("chroot", args); else - General::RunCommand("pw", args); + General::RunCommand("pw", args); loadUsers(); loadGroups(); @@ -122,6 +141,8 @@ const User UserManager::GetUser(QString userName) void UserManager::ChangeUserPassword(User user, QString newPassword) { + //Don't Change the password of a user with an encrypted Home directory + if( !QFile::exists("/var/db/personacrypt/"+user.UserName+".key") ){ return; } //Create a temporary file to store the password in QTemporaryFile nfile("/tmp/.XXXXXXXX"); @@ -363,3 +384,162 @@ void UserManager::loadShells() // Add /sbin/nologin as well shells.append("/sbin/nologin"); } + + +void UserManager::importPCKey(User user, QString filename){ + //Double check that the key does not exist (button should have been hidden earlier if invalid) + if( QFile::exists("/var/db/personacrypt/"+user.UserName+".key") ){ return; } + + //if the location is empty cancel + if(filename.isEmpty()){ return; } + + //Now run the import command + QStringList args; + args << "import"; + args << "\""+filename + "\""; + if( 0 == General::RunCommand("personacrypt",args) ){ + //Success + qDebug("The key file was imported successfully."); + }else{ + //Failure + qWarning("The key file could not be imported. Please ensure you are using a valid file."); + } +} + +void UserManager::exportPCKey(User user, QString filename){ + //Double check that the key exists (button should have been hidden earlier if invalid) + if( !QFile::exists("/var/db/personacrypt/"+user.UserName+".key") ){ return; } + + if(filename.isEmpty()){ return; } //cancelled + if( !filename.endsWith(".key") ){ filename.append(".key"); } + //Now get/save the key file + QStringList args; + args << "export"; + args << "\"" + user.UserName + "\""; + QString key = General::RunCommand("personacrypt",args); + + QFile file(filename); + if( !file.open(QIODevice::WriteOnly | QIODevice::Truncate) ){ + //Could not open output file + qWarning() <<"Output file could not be opened:\n\n" << filename; + return; + } + QTextStream out(&file); + out << key; + file.close(); + qDebug() << "The PersonaCrypt key has been saved successfully: \n\n" << filename; +} + +void UserManager::disablePCKey(User user){ +//Double check that the key exists (button should have been hidden earlier if invalid) + if( !QFile::exists("/var/db/personacrypt/"+user.UserName+".key") ){ return; } + + if( QFile::remove("/var/db/personacrypt/"+user.UserName+".key") ){ + //Success + qDebug("The PersonaCrypt user key has been disabled." ); + }else{ + //Failure (should almost never happen, since this utility runs as root and just needs to delete a file) + qDebug("The PersonaCrypt user key could not be removed. Do you have the proper permissions?" ); + } +} + +void UserManager::disableAndCopyPCKey(User user, QString password){ + QStringList args; + args << "list"; + QStringList cusers = General::RunCommand("personacrypt",args).split("\n"); + bool available = false; + for(int i=0; i