summaryrefslogtreecommitdiff
authorumopapisdn <umopapisdn>2003-03-28 13:12:09 (UTC)
committer umopapisdn <umopapisdn>2003-03-28 13:12:09 (UTC)
commitb271d575fa05cf570a1a829136517761bd47e69b (patch) (unidiff)
treee82c8e348b3b926fb365c42454d12a56dda0adc6
parent8e8803488d2c11b12449e785802da4a5a9adad0f (diff)
downloadopie-b271d575fa05cf570a1a829136517761bd47e69b.zip
opie-b271d575fa05cf570a1a829136517761bd47e69b.tar.gz
opie-b271d575fa05cf570a1a829136517761bd47e69b.tar.bz2
Bugfix: (bug #0000765) Lines in /etc/passwd & /etc/group starting with a "#" are comments and should not be editable.
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/settings/usermanager/opie-usermanager.control2
-rw-r--r--noncore/settings/usermanager/passwd.cpp11
-rw-r--r--noncore/settings/usermanager/userdialog.cpp6
-rw-r--r--noncore/settings/usermanager/usermanager.cpp26
4 files changed, 28 insertions, 17 deletions
diff --git a/noncore/settings/usermanager/opie-usermanager.control b/noncore/settings/usermanager/opie-usermanager.control
index f971fdc..e1c7762 100644
--- a/noncore/settings/usermanager/opie-usermanager.control
+++ b/noncore/settings/usermanager/opie-usermanager.control
@@ -1,9 +1,9 @@
1Files: bin/usermanager apps/Settings/usermanager.desktop pics/usermanager/* 1Files: bin/usermanager apps/Settings/usermanager.desktop pics/usermanager/*
2Priority: optional 2Priority: optional
3Section: opie/settings 3Section: opie/settings
4Version: $QPE_VERSION-$SUB_VERSION 4Version: $QPE_VERSION-$SUB_VERSION
5Depends: opie-base 5Depends: opie-base
6Architecture: arm 6Architecture: arm
7Maintainer: Ted Parnefors <zaurus@bredband.net> 7Maintainer: Ted Parnefors <zaurus@bredband.net>
8License: GPL 8License: GPL
9Description: User/Group manager for OPIE. 9Description: User/Group manager for Opie.
diff --git a/noncore/settings/usermanager/passwd.cpp b/noncore/settings/usermanager/passwd.cpp
index 1e98778..f8e6d17 100644
--- a/noncore/settings/usermanager/passwd.cpp
+++ b/noncore/settings/usermanager/passwd.cpp
@@ -186,52 +186,57 @@ bool Passwd::deleteUser(QRegExp &userRegExp, bool delGroup) {
186 return true; 186 return true;
187 } 187 }
188 } 188 }
189 return false; 189 return false;
190} 190}
191 191
192// Delete a user by login, and optionally also delete group. 192// Delete a user by login, and optionally also delete group.
193bool Passwd::delUser(const char *username, bool delGroup) { 193bool Passwd::delUser(const char *username, bool delGroup) {
194 QRegExp userRegExp(QString("^%1\\:").arg(username)); 194 QRegExp userRegExp(QString("^%1\\:").arg(username));
195 return deleteUser(userRegExp,delGroup); 195 return deleteUser(userRegExp,delGroup);
196} 196}
197 197
198// Delete a user by uid, and optionally also delete group. 198// Delete a user by uid, and optionally also delete group.
199bool Passwd::delUser(int uid, bool delGroup) { 199bool Passwd::delUser(int uid, bool delGroup) {
200 QRegExp userRegExp(QString(":%1\\:").arg(uid)); 200 QRegExp userRegExp(QString(":%1\\:").arg(uid));
201 return deleteUser(userRegExp,delGroup); 201 return deleteUser(userRegExp,delGroup);
202} 202}
203 203
204// Locate a group in the groupStringList, fill out the gr_* variables and return "true" if found. 204// Locate a group in the groupStringList, fill out the gr_* variables and return "true" if found.
205bool Passwd::searchGroup(QRegExp &groupRegExp) { 205bool Passwd::searchGroup(QRegExp &groupRegExp) {
206 QStringList tempStringList(groupStringList.grep(groupRegExp)); 206 QStringList tempStringList(groupStringList.grep(groupRegExp));
207 if((tempStringList.isEmpty())) { 207 if((tempStringList.isEmpty())) {
208 return false; 208 return false;
209 } else { 209 } else {
210 groupString=(*(tempStringList.begin())); 210 for(QStringList::Iterator it=tempStringList.begin(); it!=tempStringList.end(); it++) {
211 splitGroupEntry(groupString); 211 groupString=*it;
212 if(!groupString.find(QRegExp("^#"),0)) {// Skip commented lines.
213 splitGroupEntry(groupString);
214 return true;
215 }
216 }
212 } 217 }
213 return true; 218 return false;
214} 219}
215 220
216// Find a group by groupname. 221// Find a group by groupname.
217bool Passwd::findGroup(const char *groupname) { 222bool Passwd::findGroup(const char *groupname) {
218 QRegExp groupRegExp(QString("^%1\\:").arg(groupname)); 223 QRegExp groupRegExp(QString("^%1\\:").arg(groupname));
219 return searchGroup(groupRegExp); 224 return searchGroup(groupRegExp);
220} 225}
221 226
222// Find a group by gid. 227// Find a group by gid.
223bool Passwd::findGroup(int gid) { 228bool Passwd::findGroup(int gid) {
224 QRegExp groupRegExp(QString(":%1\\:").arg(gid)); 229 QRegExp groupRegExp(QString(":%1\\:").arg(gid));
225 return searchGroup(groupRegExp); 230 return searchGroup(groupRegExp);
226} 231}
227 232
228// Add a group to groupStringList 233// Add a group to groupStringList
229bool Passwd::addGroup(QString gr_name, int gr_gid) { 234bool Passwd::addGroup(QString gr_name, int gr_gid) {
230 QString tempString; 235 QString tempString;
231 tempString=gr_name+":*:"+QString::number(gr_gid)+":"; 236 tempString=gr_name+":*:"+QString::number(gr_gid)+":";
232 groupStringList.append(tempString); 237 groupStringList.append(tempString);
233 return 1; 238 return 1;
234} 239}
235 240
236// Update fields for a group in groupStringList, take info from the gr_* variables. 241// Update fields for a group in groupStringList, take info from the gr_* variables.
237bool Passwd::updateGroup(int gid) { 242bool Passwd::updateGroup(int gid) {
diff --git a/noncore/settings/usermanager/userdialog.cpp b/noncore/settings/usermanager/userdialog.cpp
index 0d2122b..c06f639 100644
--- a/noncore/settings/usermanager/userdialog.cpp
+++ b/noncore/settings/usermanager/userdialog.cpp
@@ -23,50 +23,52 @@
23#include <signal.h> 23#include <signal.h>
24 24
25#include "passwd.h" 25#include "passwd.h"
26 26
27#include <opie/odevice.h> 27#include <opie/odevice.h>
28using namespace Opie; 28using namespace Opie;
29 29
30 30
31/** 31/**
32 * UserDialog constructor. Setup the dialog, fill the groupComboBox & groupsListView with all groups. 32 * UserDialog constructor. Setup the dialog, fill the groupComboBox & groupsListView with all groups.
33 * 33 *
34 */ 34 */
35UserDialog::UserDialog(int viewmode, QWidget* parent, const char* name, bool modal, WFlags fl) : QDialog(parent, name, modal, fl) { 35UserDialog::UserDialog(int viewmode, QWidget* parent, const char* name, bool modal, WFlags fl) : QDialog(parent, name, modal, fl) {
36 vm=viewmode; 36 vm=viewmode;
37 QVBoxLayout *layout = new QVBoxLayout(this); 37 QVBoxLayout *layout = new QVBoxLayout(this);
38 myTabWidget=new QTabWidget(this,"User Tab Widget"); 38 myTabWidget=new QTabWidget(this,"User Tab Widget");
39 layout->addWidget(myTabWidget); 39 layout->addWidget(myTabWidget);
40 setupTab1(); 40 setupTab1();
41 setupTab2(); 41 setupTab2();
42 42
43 accounts->groupStringList.sort(); 43 accounts->groupStringList.sort();
44 // And also fill the listview & the combobox with all available groups. 44 // And also fill the listview & the combobox with all available groups.
45 for( QStringList::Iterator it = accounts->groupStringList.begin(); it!=accounts->groupStringList.end(); ++it) { 45 for( QStringList::Iterator it = accounts->groupStringList.begin(); it!=accounts->groupStringList.end(); ++it) {
46 accounts->splitGroupEntry(*it); 46 accounts->splitGroupEntry(*it);
47 new QCheckListItem(groupsListView,accounts->gr_name,QCheckListItem::CheckBox); 47 if(accounts->gr_name.find(QRegExp("^#"),0)) {// Skip commented lines.
48 groupComboBox->insertItem(accounts->gr_name); 48 new QCheckListItem(groupsListView,accounts->gr_name,QCheckListItem::CheckBox);
49 groupComboBox->insertItem(accounts->gr_name);
50 }
49 } 51 }
50 showMaximized(); 52 showMaximized();
51} 53}
52 54
53/** 55/**
54 * Empty destructor. 56 * Empty destructor.
55 * 57 *
56 */ 58 */
57UserDialog::~UserDialog() { 59UserDialog::~UserDialog() {
58} 60}
59 61
60/** 62/**
61 * Creates the first tab, all userinfo is here. 63 * Creates the first tab, all userinfo is here.
62 * 64 *
63 */ 65 */
64void UserDialog::setupTab1() { 66void UserDialog::setupTab1() {
65 QPixmap mypixmap; 67 QPixmap mypixmap;
66 QWidget *tabpage = new QWidget(myTabWidget,"page1"); 68 QWidget *tabpage = new QWidget(myTabWidget,"page1");
67 QVBoxLayout *layout = new QVBoxLayout(tabpage); 69 QVBoxLayout *layout = new QVBoxLayout(tabpage);
68 layout->setMargin(5); 70 layout->setMargin(5);
69 71
70 // Picture 72 // Picture
71 picturePushButton = new QPushButton(tabpage,"Label"); 73 picturePushButton = new QPushButton(tabpage,"Label");
72 picturePushButton->setMinimumSize(48,48); 74 picturePushButton->setMinimumSize(48,48);
diff --git a/noncore/settings/usermanager/usermanager.cpp b/noncore/settings/usermanager/usermanager.cpp
index 57efa71..1946013 100644
--- a/noncore/settings/usermanager/usermanager.cpp
+++ b/noncore/settings/usermanager/usermanager.cpp
@@ -105,58 +105,60 @@ void UserConfig::setupTabAllGroups() {
105 layout->setMargin(5); 105 layout->setMargin(5);
106 106
107 groupsListView=new QListView(tabpage,"groups"); 107 groupsListView=new QListView(tabpage,"groups");
108 groupsListView->addColumn("GID"); 108 groupsListView->addColumn("GID");
109 groupsListView->addColumn("Groupname"); 109 groupsListView->addColumn("Groupname");
110 layout->addWidget(groupsListView); 110 layout->addWidget(groupsListView);
111 groupsListView->setSorting(1,1); 111 groupsListView->setSorting(1,1);
112 groupsListView->setAllColumnsShowFocus(true); 112 groupsListView->setAllColumnsShowFocus(true);
113 113
114 myTabWidget->addTab(tabpage,"All Groups"); 114 myTabWidget->addTab(tabpage,"All Groups");
115} 115}
116void UserConfig::getUsers() { 116void UserConfig::getUsers() {
117 QString mytext; 117 QString mytext;
118 QPixmap mypixmap; 118 QPixmap mypixmap;
119 QListViewItem *listviewitem; 119 QListViewItem *listviewitem;
120 120
121 // Empty the iconview & the listview. 121 // Empty the iconview & the listview.
122 usersIconView->clear(); 122 usersIconView->clear();
123 usersListView->clear(); 123 usersListView->clear();
124 124
125 // availableUID is used as a deposite for the next available UID on the system, this should start at an ID over 500. 125 // availableUID is used as a deposite for the next available UID on the system, this should start at an ID over 500.
126 availableUID=500; 126 availableUID=500;
127 for(QStringList::Iterator it=accounts->passwdStringList.begin(); it!=accounts->passwdStringList.end(); ++it) { 127 for(QStringList::Iterator it=accounts->passwdStringList.begin(); it!=accounts->passwdStringList.end(); ++it) {
128 accounts->splitPasswdEntry(*it); // Split the string into it's components and store in variables in the accounts object. ("pr_name" and so on.) 128 accounts->splitPasswdEntry(*it); // Split the string into it's components and store in variables in the accounts object. ("pr_name" and so on.)
129 new QListViewItem(usersListView,QString::number(accounts->pw_uid),accounts->pw_name,accounts->pw_gecos); 129 if(accounts->pw_name.find(QRegExp("^#"),0)) {// Skip commented lines.
130 if((accounts->pw_uid>=500) && (accounts->pw_uid<65000)) {// Is this user a "normal" user ? 130 new QListViewItem(usersListView,QString::number(accounts->pw_uid),accounts->pw_name,accounts->pw_gecos);
131 mytext=QString(accounts->pw_name)+" - ("+QString(accounts->pw_gecos)+")"; // The string displayed next to the icon. 131 if((accounts->pw_uid>=500) && (accounts->pw_uid<65000)) {// Is this user a "normal" user ?
132 if(!(mypixmap.load("/opt/QtPalmtop/pics/users/"+accounts->pw_name+".png"))) { // Is there an icon for this user? Resource::loadPixmap is caching, doesn't work. 132 mytext=QString(accounts->pw_name)+" - ("+QString(accounts->pw_gecos)+")"; // The string displayed next to the icon.
133 mypixmap=Resource::loadPixmap(QString("usermanager/usericon"));// If this user has no icon, load the default icon. 133 if(!(mypixmap.load("/opt/QtPalmtop/pics/users/"+accounts->pw_name+".png"))) { // Is there an icon for this user? Resource::loadPixmap is caching, doesn't work.
134 mypixmap=Resource::loadPixmap(QString("usermanager/usericon"));// If this user has no icon, load the default icon.
135 }
136 listviewitem=new QListViewItem(usersIconView,"",mytext);// Add the icon+text to the qiconview.
137 listviewitem->setPixmap(0,mypixmap);
134 } 138 }
135 listviewitem=new QListViewItem(usersIconView,"",mytext);// Add the icon+text to the qiconview. 139 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.
136 listviewitem->setPixmap(0,mypixmap);
137 } 140 }
138 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.
139 } 141 }
140 usersIconView->sort(); 142 usersIconView->sort();
141} 143}
142 144
143void UserConfig::addUser() { 145void UserConfig::addUser() {
144 if(UserDialog::addUser(availableUID,availableGID)) {// Add the user to the system, also send next available UID and GID. 146 if(UserDialog::addUser(availableUID,availableGID)) {// Add the user to the system, also send next available UID and GID.
145 getUsers(); // Update users views. 147 getUsers(); // Update users views.
146 getGroups(); // Update groups view. 148 getGroups(); // Update groups view.
147 } 149 }
148} 150}
149 151
150void UserConfig::editUser() { 152void UserConfig::editUser() {
151 QString username; 153 QString username;
152 if(myTabWidget->currentPageIndex()==0) {// Users 154 if(myTabWidget->currentPageIndex()==0) {// Users
153 if(usersIconView->currentItem()) {// Any icon selected? 155 if(usersIconView->currentItem()) {// Any icon selected?
154 username=usersIconView->currentItem()->text(1);// Get the text associated with the icon. 156 username=usersIconView->currentItem()->text(1);// Get the text associated with the icon.
155 username=username.left(username.find(" - (",0,true));// Strip out the username. 157 username=username.left(username.find(" - (",0,true));// Strip out the username.
156 if(UserDialog::editUser(username)) {// Bring up the userinfo dialog. 158 if(UserDialog::editUser(username)) {// Bring up the userinfo dialog.
157 // If there were any changed also update the views. 159 // If there were any changed also update the views.
158 getUsers(); 160 getUsers();
159 getGroups(); 161 getGroups();
160 } 162 }
161 } else { 163 } else {
162 QMessageBox::information(this,"No selection.","No user has been selected."); 164 QMessageBox::information(this,"No selection.","No user has been selected.");
@@ -195,52 +197,54 @@ void UserConfig::delUser() {
195 } 197 }
196 } 198 }
197 if(myTabWidget->currentPageIndex()==1) {// All users 199 if(myTabWidget->currentPageIndex()==1) {// All users
198 if(usersListView->currentItem()) {// Anything changed!? 200 if(usersListView->currentItem()) {// Anything changed!?
199 username=usersListView->currentItem()->text(1);// Get the username. 201 username=usersListView->currentItem()->text(1);// Get the username.
200 if(QMessageBox::warning(this,"Delete user","Are you sure you want to\ndelete this user? \""+QString(username)+"\" ?","&No","&Yes",0,0,1)) { 202 if(QMessageBox::warning(this,"Delete user","Are you sure you want to\ndelete this user? \""+QString(username)+"\" ?","&No","&Yes",0,0,1)) {
201 if(UserDialog::delUser(username)) {// Try to delete the user. 203 if(UserDialog::delUser(username)) {// Try to delete the user.
202 // Update views. 204 // Update views.
203 getUsers(); 205 getUsers();
204 getGroups(); 206 getGroups();
205 } 207 }
206 } 208 }
207 } else { 209 } else {
208 QMessageBox::information(this,"No selection","No user has been selected."); 210 QMessageBox::information(this,"No selection","No user has been selected.");
209 } 211 }
210 } 212 }
211 213
212} 214}
213 215
214void UserConfig::getGroups() { 216void UserConfig::getGroups() {
215 groupsListView->clear();// Empty the listview. 217 groupsListView->clear();// Empty the listview.
216 availableGID=500;// We need to find the next free GID, and are only interested in values between 500 & 65000. 218 availableGID=500;// We need to find the next free GID, and are only interested in values between 500 & 65000.
217 for(QStringList::Iterator it=accounts->groupStringList.begin(); it!=accounts->groupStringList.end(); ++it) {// Split the list into lines. 219 for(QStringList::Iterator it=accounts->groupStringList.begin(); it!=accounts->groupStringList.end(); ++it) {// Split the list into lines.
218 accounts->splitGroupEntry(*it);// Split the line into its components and fill the variables of 'accounts'. (gr_name, gr_uid & gr_mem). 220 accounts->splitGroupEntry(*it);// Split the line into its components and fill the variables of 'accounts'. (gr_name, gr_uid & gr_mem).
219 new QListViewItem(groupsListView,QString::number(accounts->gr_gid),accounts->gr_name); 221 if(accounts->gr_name.find(QRegExp("^#"),0)) {// Skip commented lines.
220 if((accounts->gr_gid>=availableGID) && (accounts->gr_gid<65000)) availableGID=accounts->gr_gid+1;// Maybe a new free GID. 222 new QListViewItem(groupsListView,QString::number(accounts->gr_gid),accounts->gr_name);
223 if((accounts->gr_gid>=availableGID) && (accounts->gr_gid<65000)) availableGID=accounts->gr_gid+1;// Maybe a new free GID.
224 }
221 } 225 }
222} 226}
223 227
224void UserConfig::addGroup() { 228void UserConfig::addGroup() {
225 if(GroupDialog::addGroup(availableGID)) getGroups();// Bring up the add group dialog. 229 if(GroupDialog::addGroup(availableGID)) getGroups();// Bring up the add group dialog.
226} 230}
227 231
228void UserConfig::editGroup() { 232void UserConfig::editGroup() {
229 int gid; 233 int gid;
230 if(groupsListView->currentItem()) {// Any group selected? 234 if(groupsListView->currentItem()) {// Any group selected?
231 gid=groupsListView->currentItem()->text(0).toInt();// Get the GID from the listview. 235 gid=groupsListView->currentItem()->text(0).toInt();// Get the GID from the listview.
232 if(GroupDialog::editGroup(gid)) getGroups();// Bring up the edit group dialog. 236 if(GroupDialog::editGroup(gid)) getGroups();// Bring up the edit group dialog.
233 } else { 237 } else {
234 QMessageBox::information(this,"No selection","No group has been selected."); 238 QMessageBox::information(this,"No selection","No group has been selected.");
235 } 239 }
236} 240}
237 241
238void UserConfig::delGroup() { 242void UserConfig::delGroup() {
239 const char *groupname; 243 const char *groupname;
240 if(groupsListView->currentItem()) {// Any group selected? 244 if(groupsListView->currentItem()) {// Any group selected?
241 groupname=groupsListView->currentItem()->text(1);// Get the groupname from the listview. 245 groupname=groupsListView->currentItem()->text(1);// Get the groupname from the listview.
242 if(QMessageBox::warning(this,"Delete group","Are you sure you want to\ndelete the group \""+QString(groupname)+"\" ?","&No","&Yes",0,0,1)) { 246 if(QMessageBox::warning(this,"Delete group","Are you sure you want to\ndelete the group \""+QString(groupname)+"\" ?","&No","&Yes",0,0,1)) {
243 // If confirmed, try to delete the group. 247 // If confirmed, try to delete the group.
244 if(GroupDialog::delGroup(groupname)) getGroups(); // And also update the view afterwards if the user was deleted. 248 if(GroupDialog::delGroup(groupname)) getGroups(); // And also update the view afterwards if the user was deleted.
245 } 249 }
246 } else { 250 } else {