summaryrefslogtreecommitdiff
path: root/noncore/settings/usermanager/usermanager.cpp
Side-by-side diff
Diffstat (limited to 'noncore/settings/usermanager/usermanager.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/settings/usermanager/usermanager.cpp242
1 files changed, 242 insertions, 0 deletions
diff --git a/noncore/settings/usermanager/usermanager.cpp b/noncore/settings/usermanager/usermanager.cpp
new file mode 100644
index 0000000..883e5d7
--- a/dev/null
+++ b/noncore/settings/usermanager/usermanager.cpp
@@ -0,0 +1,242 @@
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "usermanager.h"
+
+#include <qlayout.h>
+#include <stdio.h>
+
+#include <qmessagebox.h>
+#include <qfile.h>
+#include <qpe/resource.h>
+
+#include <qregexp.h>
+
+/**
+ * The mainwindow constructor.
+ *
+ * @param QWidget *parent
+ * @param const char *name
+ * @ param WFlags fl
+ *
+ */
+UserConfig::UserConfig(QWidget* parent, const char* name, WFlags fl) : QMainWindow(parent, name, fl) {
+ setCaption(tr("OPIE User Manager"));
+
+ // Create an instance of the global object 'accounts'. This holds all user/group info, and functions to modify them.
+ accounts=new Passwd();
+ accounts->open(); // This actually loads the files /etc/passwd & /etc/group into memory.
+
+ // Create the toolbar.
+ QPEToolBar *toolbar = new QPEToolBar(this,"Toolbar");
+ toolbar->setHorizontalStretchable(1); // Is there any other way to get the toolbar to stretch of the full screen!?
+ adduserToolButton = new QToolButton(Resource::loadPixmap("userconfig/adduser"),"Add User",0,this,SLOT(addUser()),toolbar,"Add User");
+ edituserToolButton = new QToolButton(Resource::loadPixmap("userconfig/edituser"),"Edit User",0,this,SLOT(editUser()),toolbar,"Edit User");
+ deleteuserToolButton = new QToolButton(Resource::loadPixmap("userconfig/deleteuser"),"Delete User",0,this,SLOT(delUser()),toolbar,"Delete User");
+ QToolButton *userstext = new QToolButton(0,"User",0,0,0,toolbar,"User");
+ userstext->setUsesTextLabel(true);
+ toolbar->addSeparator();
+ addgroupToolButton = new QToolButton(Resource::loadPixmap("userconfig/addgroup"),"Add Group",0,this,SLOT(addGroup()),toolbar,"Add Group");
+ editgroupToolButton = new QToolButton(Resource::loadPixmap("userconfig/editgroup"),"Edit Group",0,this,SLOT(editGroup()),toolbar,"Edit Group");
+ deletegroupToolButton = new QToolButton(Resource::loadPixmap("userconfig/deletegroup"),"Delete Group",0,this,SLOT(delGroup()),toolbar,"Delete Group");
+ QToolButton *groupstext = new QToolButton(0,"Group",0,0,0,toolbar,"Group");
+ groupstext->setUsesTextLabel(true);
+ addToolBar(toolbar,"myToolBar");
+
+ // Add a tabwidget and all the tabs.
+ myTabWidget = new QTabWidget(this,"My Tab Widget");
+ setupTabAccounts();
+ setupTabAllUsers();
+ setupTabAllGroups();
+
+ getUsers(); // Fill out the iconview & listview with all users.
+ getGroups(); // Fill out the group listview with all groups.
+
+ setCentralWidget(myTabWidget);
+}
+
+UserConfig::~UserConfig() {
+ accounts->close();
+ delete accounts;
+}
+
+void UserConfig::setupTabAccounts() {
+ QWidget *tabpage = new QWidget(this);
+ QVBoxLayout *layout = new QVBoxLayout(tabpage);
+ layout->setMargin(5);
+
+ usersIconView=new QIconView(tabpage,"users");
+ usersIconView->setItemTextPos(QIconView::Right);
+ layout->addWidget(usersIconView);
+
+ myTabWidget->addTab(tabpage,"Users");
+}
+
+void UserConfig::setupTabAllUsers() {
+ QWidget *tabpage = new QWidget(this);
+ QVBoxLayout *layout = new QVBoxLayout(tabpage);
+ layout->setMargin(5);
+
+ usersListView=new QListView(tabpage,"allusers");
+ usersListView->addColumn("UID");
+ usersListView->addColumn("Login");
+ usersListView->addColumn("Username");
+ layout->addWidget(usersListView);
+ usersListView->setSorting(1,1);
+ usersListView->setAllColumnsShowFocus(true);
+
+ myTabWidget->addTab(tabpage,"All Users");
+}
+
+void UserConfig::setupTabAllGroups() {
+ QWidget *tabpage = new QWidget(this);
+ QVBoxLayout *layout = new QVBoxLayout(tabpage);
+ layout->setMargin(5);
+
+ groupsListView=new QListView(tabpage,"groups");
+ groupsListView->addColumn("GID");
+ groupsListView->addColumn("Groupname");
+ layout->addWidget(groupsListView);
+ groupsListView->setSorting(1,1);
+ groupsListView->setAllColumnsShowFocus(true);
+
+ myTabWidget->addTab(tabpage,"All Groups");
+}
+void UserConfig::getUsers() {
+ QString mytext;
+ QPixmap mypixmap;
+
+ // Empty the iconview & the listview.
+ usersIconView->clear();
+ usersListView->clear();
+
+ // availableUID is used as a deposite for the next available UID on the system, this should start at an ID over 500.
+ availableUID=500;
+ for(QStringList::Iterator it=accounts->passwdStringList.begin(); it!=accounts->passwdStringList.end(); ++it) {
+ accounts->splitPasswdEntry(*it); // Split the string into it's components and store in variables in the accounts object. ("pr_name" and so on.)
+ new QListViewItem(usersListView,QString::number(accounts->pw_uid),accounts->pw_name,accounts->pw_gecos);
+ if((accounts->pw_uid>=500) && (accounts->pw_uid<65000)) { // Is this user a "normal" user ?
+ mytext=QString(accounts->pw_name)+" - ("+QString(accounts->pw_gecos)+")"; // The string displayed next to the icon.
+ mypixmap=Resource::loadPixmap(QString("users/"+accounts->pw_name)); // Is there an icon for this user?
+ if(mypixmap.isNull()) {
+ mypixmap=Resource::loadPixmap(QString("userconfig/usericon")); // If this user has no icon, load the default icon.
+ }
+ new QIconViewItem(usersIconView,mytext,mypixmap); // Add the icon+text to the qiconview.
+ }
+ if((accounts->pw_uid>=availableUID) && (accounts->pw_uid<65000)) availableUID=accounts->pw_uid+1; // Increase 1 to the latest know UID to get a free uid.
+ }
+}
+
+void UserConfig::addUser() {
+ if(UserDialog::addUser(availableUID,availableGID)) { // Add the user to the system, also send next available UID and GID.
+ getUsers(); // Update users views.
+ getGroups(); // Update groups view.
+ }
+}
+
+void UserConfig::editUser() {
+ QString username;
+ if(myTabWidget->currentPageIndex()==0) { // Users
+ if(usersIconView->currentItem()) { // Any icon selected?
+ username=usersIconView->currentItem()->text(); // Get the text associated with the icon.
+ username=username.left(username.find(" - (",0,true)); // Strip out the username.
+ if(UserDialog::editUser(username)) { // Bring up the userinfo dialog.
+ // If there were any changed also update the views.
+ getUsers();
+ getGroups();
+ }
+ } else {
+ QMessageBox::information(this,"No selection.","No user has been selected.");
+ }
+ }
+ if(myTabWidget->currentPageIndex()==1) { // All users
+ if(usersListView->currentItem()) { // Anything changed!?
+ username=usersListView->currentItem()->text(1); // Get the username.
+ if(UserDialog::editUser(username)) { // Bring up the userinfo dialog.
+ // And again update the views if there were any changes.
+ getUsers();
+ getGroups();
+ }
+ } else {
+ QMessageBox::information(this,"No selection.","No user has been selected.");
+ }
+ }
+}
+
+void UserConfig::delUser() {
+ QString username;
+
+ if(myTabWidget->currentPageIndex()==0) { // Users, Iconview.
+ if(usersIconView->currentItem()) { // Anything selected?
+ username=usersIconView->currentItem()->text(); // Get string associated with icon.
+ username=username.left(username.find(" - (",0,true)); // Strip out the username.
+ if(QMessageBox::warning(this,"Delete user","Are you sure you want to\ndelete this user? \""+QString(username)+"\" ?","&No","&Yes",0,0,1)) {
+ if(UserDialog::delUser(username)) { // Delete the user if possible.
+ // Update views.
+ getUsers();
+ getGroups();
+ }
+ }
+ } else {
+ QMessageBox::information(this,"No selection","No user has been selected.");
+ }
+ }
+ if(myTabWidget->currentPageIndex()==1) { // All users
+ if(usersListView->currentItem()) { // Anything changed!?
+ username=usersListView->currentItem()->text(1); // Get the username.
+ if(QMessageBox::warning(this,"Delete user","Are you sure you want to\ndelete this user? \""+QString(username)+"\" ?","&No","&Yes",0,0,1)) {
+ if(UserDialog::delUser(username)) { // Try to delete the user.
+ // Update views.
+ getUsers();
+ getGroups();
+ }
+ }
+ } else {
+ QMessageBox::information(this,"No selection","No user has been selected.");
+ }
+ }
+
+}
+
+void UserConfig::getGroups() {
+ groupsListView->clear(); // Empty the listview.
+ availableGID=500; // We need to find the next free GID, and are only interested in values between 500 & 65000.
+ for(QStringList::Iterator it=accounts->groupStringList.begin(); it!=accounts->groupStringList.end(); ++it) { // Split the list into lines.
+ accounts->splitGroupEntry(*it); // Split the line into its components and fill the variables of 'accounts'. (gr_name, gr_uid & gr_mem).
+ new QListViewItem(groupsListView,QString::number(accounts->gr_gid),accounts->gr_name);
+ if((accounts->gr_gid>=availableGID) && (accounts->gr_gid<65000)) availableGID=accounts->gr_gid+1; // Maybe a new free GID.
+ }
+}
+
+void UserConfig::addGroup() {
+ if(GroupDialog::addGroup(availableGID)) getGroups(); // Bring up the add group dialog.
+}
+
+void UserConfig::editGroup() {
+ int gid;
+ if(groupsListView->currentItem()) { // Any group selected?
+ gid=groupsListView->currentItem()->text(0).toInt(); // Get the GID from the listview.
+ if(GroupDialog::editGroup(gid)) getGroups(); // Bring up the edit group dialog.
+ } else {
+ QMessageBox::information(this,"No selection","No group has been selected.");
+ }
+}
+
+void UserConfig::delGroup() {
+ const char *groupname;
+ if(groupsListView->currentItem()) { // Any group selected?
+ groupname=groupsListView->currentItem()->text(1); // Get the groupname from the listview.
+ if(QMessageBox::warning(this,"Delete group","Are you sure you want to\ndelete the group \""+QString(groupname)+"\" ?","&No","&Yes",0,0,1)) {
+ // If confirmed, try to delete the group.
+ if(GroupDialog::delGroup(groupname)) getGroups(); // And also update the view afterwards if the user was deleted.
+ }
+ } else {
+ QMessageBox::information(this,"No selection","No group has been selected.");
+ }
+}