-rw-r--r-- | noncore/settings/usermanager/passwd.cpp | 23 | ||||
-rw-r--r-- | noncore/settings/usermanager/userdialog.cpp | 35 | ||||
-rw-r--r-- | noncore/settings/usermanager/userdialog.h | 9 |
3 files changed, 51 insertions, 16 deletions
diff --git a/noncore/settings/usermanager/passwd.cpp b/noncore/settings/usermanager/passwd.cpp index 5063661..0a2bfba 100644 --- a/noncore/settings/usermanager/passwd.cpp +++ b/noncore/settings/usermanager/passwd.cpp @@ -50,8 +50,9 @@ char *Passwd::crypt_make_salt() { result[2] = '\0'; return result; } +// opens the files /etc/passwd & /etc/group and loads the contents into passwdStringList & groupStringList bool Passwd::open() { int returnvalue=false; QFile passwd_file("/etc/passwd"); @@ -75,8 +76,9 @@ bool Passwd::open() { } return returnvalue; } +// Writes back the contents of passwdStringList to /etc/passwd & groupStringList to /etc/group bool Passwd::close() { int returnvalue=false; QFile passwd_file("/etc/passwd"); QFile group_file("/etc/group"); @@ -97,8 +99,9 @@ bool Passwd::close() { } return returnvalue; } +// Splits a "passwd" line into the components and stores them in the pw_* variables. void Passwd::splitPasswdEntry(QString &userString) { userdataStringList=QStringList::split(":",userString,true); QStringList::Iterator it=userdataStringList.begin(); pw_name=(*it++); @@ -109,8 +112,9 @@ void Passwd::splitPasswdEntry(QString &userString) { pw_dir=(*it++); pw_shell=(*it++); } +// Splits a "group" line into the components and stores them in the gr_* variables. void Passwd::splitGroupEntry(QString &groupString) { groupdataStringList=QStringList::split(":",groupString,true); QStringList::Iterator it=groupdataStringList.begin(); gr_name=(*it++); @@ -118,8 +122,9 @@ void Passwd::splitGroupEntry(QString &groupString) { gr_gid=(*it++).toInt(); gr_mem=QStringList::split(" ",(*it++)); } +// Find a user in the passwdStringList. Return true if found and also fill the pw_* variables. bool Passwd::searchUser(QRegExp &userRegExp) { QStringList tempStringList(passwdStringList.grep(userRegExp)); if((tempStringList.isEmpty())) { return false; @@ -129,18 +134,21 @@ bool Passwd::searchUser(QRegExp &userRegExp) { } return true; } +// Find a user by login. bool Passwd::findUser(const char *username) { QRegExp userRegExp(QString("^%1\\:").arg(username)); return searchUser(userRegExp); } +// Find a user by uid. bool Passwd::findUser(int uid) { QRegExp userRegExp(QString(":%1\\:").arg(uid)); return searchUser(userRegExp); } +// Add a user to the passwdStringList, create home directory, and optionally create a group for the user. bool Passwd::addUser(QString pw_name, QString pw_passwd, int pw_uid, int pw_gid, QString pw_gecos,QString pw_dir, QString pw_shell, bool createGroup) { QString tempString; if((createGroup) && (!(findGroup(pw_gid)))) addGroup(pw_name,pw_gid); pw_passwd = crypt(pw_passwd, crypt_make_salt()); @@ -155,8 +163,9 @@ bool Passwd::addUser(QString pw_name, QString pw_passwd, int pw_uid, int pw_gid, } return 1; } +// Update info for a user in passwdStringList, take info from the pw_* fields. bool Passwd::updateUser(QString login) { QRegExp userRegExp(QString("^%1\\:").arg(login)); for(QStringList::Iterator it=passwdStringList.begin(); it!=passwdStringList.end(); ++it) { if(userRegExp.find((*it),0)!=-1) { @@ -166,8 +175,9 @@ bool Passwd::updateUser(QString login) { } return false; } +// Delete a user from passwdStringList. bool Passwd::deleteUser(QRegExp &userRegExp, bool delGroup) { for(QStringList::Iterator it=passwdStringList.begin(); it!=passwdStringList.end(); ++it) { if(userRegExp.find((*it),0)!=-1) { splitPasswdEntry(*it); @@ -178,18 +188,21 @@ bool Passwd::deleteUser(QRegExp &userRegExp, bool delGroup) { } return false; } +// Delete a user by login, and optionally also delete group. bool Passwd::delUser(const char *username, bool delGroup) { QRegExp userRegExp(QString("^%1\\:").arg(username)); return deleteUser(userRegExp,delGroup); } +// Delete a user by uid, and optionally also delete group. bool Passwd::delUser(int uid, bool delGroup) { QRegExp userRegExp(QString(":%1\\:").arg(uid)); return deleteUser(userRegExp,delGroup); } +// Locate a group in the groupStringList, fill out the gr_* variables and return "true" if found. bool Passwd::searchGroup(QRegExp &groupRegExp) { QStringList tempStringList(groupStringList.grep(groupRegExp)); if((tempStringList.isEmpty())) { return false; @@ -199,25 +212,29 @@ bool Passwd::searchGroup(QRegExp &groupRegExp) { } return true; } +// Find a group by groupname. bool Passwd::findGroup(const char *groupname) { QRegExp groupRegExp(QString("^%1\\:").arg(groupname)); return searchGroup(groupRegExp); } +// Find a group by gid. bool Passwd::findGroup(int gid) { QRegExp groupRegExp(QString(":%1\\:").arg(gid)); return searchGroup(groupRegExp); } +// Add a group to groupStringList bool Passwd::addGroup(QString gr_name, int gr_gid) { QString tempString; tempString=gr_name+":*:"+QString::number(gr_gid)+":"; groupStringList.append(tempString); return 1; } +// Update fields for a group in groupStringList, take info from the gr_* variables. bool Passwd::updateGroup(int gid) { QRegExp groupRegExp(QString(":%1\\:").arg(QString::number(gid))); for(QStringList::Iterator it=groupStringList.begin(); it!=groupStringList.end(); ++it) { if(groupRegExp.find((*it),0)!=-1) { @@ -231,8 +248,9 @@ bool Passwd::updateGroup(int gid) { } return false; } +// Delete a group from groupStringList. bool Passwd::deleteGroup(QRegExp &groupRegExp) { for(QStringList::Iterator it=groupStringList.begin(); it!=groupStringList.end(); ++it) { if(groupRegExp.find((*it),0)!=-1) { groupStringList.remove(it); @@ -241,25 +259,29 @@ bool Passwd::deleteGroup(QRegExp &groupRegExp) { } return false; } +// Delete a group by groupname. bool Passwd::delGroup(const char *groupname) { QRegExp groupRegExp(QString("^%1\\:").arg(groupname)); return deleteGroup(groupRegExp); } +// Delete a group by gid. bool Passwd::delGroup(int gid) { QRegExp groupRegExp(QString(":%1\\:").arg(gid)); return deleteGroup(groupRegExp); } +// Add a user as a member to a group in groupStringList. bool Passwd::addGroupMember(QString groupname, QString member) { if(!(findGroup(groupname))) return false; gr_mem << member; if(!(updateGroup(gr_gid))) return false; return true; } +// Delete a user as a groupmember from a group in groupStringList. bool Passwd::delGroupMember(QString groupname, QString member) { if(!(findGroup(groupname))) return false; for(QStringList::Iterator it=gr_mem.begin(); it!=gr_mem.end(); ++it) { if(*it==member) { @@ -270,5 +292,6 @@ bool Passwd::delGroupMember(QString groupname, QString member) { if(!(updateGroup(gr_gid))) return false; return true; } +// Global Object Passwd *accounts; diff --git a/noncore/settings/usermanager/userdialog.cpp b/noncore/settings/usermanager/userdialog.cpp index 36bcf86..c82cc9d 100644 --- a/noncore/settings/usermanager/userdialog.cpp +++ b/noncore/settings/usermanager/userdialog.cpp @@ -31,9 +31,10 @@ using namespace Opie; /** * UserDialog constructor. Setup the dialog, fill the groupComboBox & groupsListView with all groups. * */ -UserDialog::UserDialog(QWidget* parent, const char* name, bool modal, WFlags fl) : QDialog(parent, name, modal, fl) { +UserDialog::UserDialog(int viewmode, QWidget* parent, const char* name, bool modal, WFlags fl) : QDialog(parent, name, modal, fl) { + vm=viewmode; QVBoxLayout *layout = new QVBoxLayout(this); myTabWidget=new QTabWidget(this,"User Tab Widget"); layout->addWidget(myTabWidget); setupTab1(); @@ -108,15 +109,15 @@ void UserDialog::setupTab1() { QLabel *groupLabel=new QLabel(tabpage,"group"); groupLabel->setText("Primary group: "); groupComboBox=new QComboBox(tabpage,"PrimaryGroup"); - // Copy /etc/skel - QLabel *skelLabel=new QLabel(tabpage,"skel"); - skelLabel->setText("Copy /etc/skel: "); - skelCheckBox=new QCheckBox(tabpage); - skelCheckBox->setChecked(true); -// skelLabel->setDisabled(true); -// skelCheckBox->setDisabled(true); + if(vm==VIEWMODE_NEW) { + // Copy /etc/skel + skelLabel=new QLabel(tabpage,"skel"); + skelLabel->setText("Copy /etc/skel: "); + skelCheckBox=new QCheckBox(tabpage); + skelCheckBox->setChecked(true); + } // Widget layout QHBoxLayout *hlayout=new QHBoxLayout(-1,"hlayout"); layout->addWidget(picturePushButton); @@ -135,10 +136,12 @@ void UserDialog::setupTab1() { vlayout1->addSpacing(5); vlayout1->addWidget(shellLabel); vlayout1->addSpacing(5); vlayout1->addWidget(groupLabel); - vlayout1->addSpacing(5); - vlayout1->addWidget(skelLabel); + if(vm==VIEWMODE_NEW) { + vlayout1->addSpacing(5); + vlayout1->addWidget(skelLabel); + } // Second column, data vlayout2->addWidget(loginLineEdit); vlayout2->addSpacing(5); vlayout2->addWidget(uidLineEdit); @@ -149,10 +152,12 @@ void UserDialog::setupTab1() { vlayout2->addSpacing(5); vlayout2->addWidget(shellComboBox); vlayout2->addSpacing(5); vlayout2->addWidget(groupComboBox); - vlayout2->addSpacing(5); - vlayout2->addWidget(skelCheckBox); + if(vm==VIEWMODE_NEW) { + vlayout2->addSpacing(5); + vlayout2->addWidget(skelCheckBox); + } hlayout->addLayout(vlayout1); hlayout->addLayout(vlayout2); myTabWidget->addTab(tabpage,"User Info"); @@ -195,9 +200,10 @@ bool UserDialog::addUser(int uid, int gid) { QCheckListItem *temp; QFile ozTest; int oz=false; if(ODevice::inst()->system()==System_OpenZaurus) oz=true; - UserDialog *adduserDialog=new UserDialog(); + // viewmode is a workaround for a bug in qte-2.3.4 that gives bus error on manipulating adduserDialog's widgets here. + UserDialog *adduserDialog=new UserDialog(VIEWMODE_NEW); adduserDialog->setCaption(tr("Add User")); adduserDialog->userID=uid; // Set next available UID as default uid. adduserDialog->groupID=gid; // Set next available GID as default gid. // Insert default group into groupComboBox @@ -297,9 +303,10 @@ bool UserDialog::delUser(const char *username) { * */ bool UserDialog::editUser(const char *username) { int invalid_group=0; - UserDialog *edituserDialog=new UserDialog(); // Create Dialog + // viewmode is a workaround for a bug in qte-2.3.4 that gives bus error on manipulating edituserDialog's widgets here. + UserDialog *edituserDialog=new UserDialog(VIEWMODE_EDIT); // Create Dialog edituserDialog->setCaption(tr("Edit User")); accounts->findUser(username); // Locate user in database and fill variables in 'accounts' object. if(!(accounts->findGroup(accounts->pw_gid))) { // Locate the user's primary group, and fill group variables in 'accounts' object. invalid_group=1; diff --git a/noncore/settings/usermanager/userdialog.h b/noncore/settings/usermanager/userdialog.h index 133b35d..b7b925d 100644 --- a/noncore/settings/usermanager/userdialog.h +++ b/noncore/settings/usermanager/userdialog.h @@ -41,18 +41,23 @@ private: QString pictureLocation; QImage userImage; int groupID; int userID; - + int vm; + enum VIEWMODE { + VIEWMODE_NEW, + VIEWMODE_EDIT + }; + void setupTab1(void); void setupTab2(void); void accept(void); private slots: void clickedPicture(void); public: - UserDialog( QWidget* parent = 0, const char* name = 0, bool modal=true, WFlags fl = 0 ); + UserDialog( int viewmode=VIEWMODE_NEW, QWidget* parent = 0, const char* name = 0, bool modal=true, WFlags fl = 0 ); ~UserDialog(); static bool addUser(int uid, int gid); static bool editUser(const char *username); static bool delUser(const char *username); |