/* * Copyright (c) 1998 Denis Perchine * Copyright (c) 2004 Szombathelyi GyĂśrgy * Former maintainer: Adriaan de Groot * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License version 2 or at your option version 3 as published by * the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. **/ #include "globals.h" #include #include #include #include #include #include #include #include #include #include "ku_edituser.h" #include "ku_pwdlg.h" #include "ku_global.h" #include "ku_misc.h" void KU_EditUser::addRow(QWidget *parent, QGridLayout *layout, int row, QWidget *widget, const QString &label, const QString &what, bool two_column, bool nochange) { QLabel *lab = new QLabel( label, parent ); lab->setBuddy( widget ); lab->setMinimumSize(lab->sizeHint()); widget->setMinimumSize(widget->sizeHint()); layout->addWidget(lab, row, 0); if (!what.isEmpty()) { lab->setWhatsThis( what); widget->setWhatsThis( what); } if (two_column) layout->addWidget( widget, row, 1, 1, 2 ); else layout->addWidget(widget, row, 1); if ( !nochange || ro ) return; QCheckBox *nc = new QCheckBox( i18n("Do not change"), parent ); layout->addWidget( nc, row, 3 ); nc->hide(); mNoChanges[ widget ] = nc; } KIntSpinBox *KU_EditUser::addDaysGroup(QWidget *parent, QGridLayout *layout, int row, const QString &title, bool never) { KIntSpinBox *days; QLabel *label = new QLabel( title, parent ); layout->addWidget( label, row, 0, 1, 2, Qt::AlignRight ); days = new KIntSpinBox( parent ); label->setBuddy( days ); days->setSuffix( i18n(" days") ); days->setMaximum( 99999 ); if (never) { days->setMinimum( -1 ); days->setSpecialValueText(i18n("Never")); } else { days->setMinimum( 0 ); } layout->addWidget( days, row, 2 ); connect(days, SIGNAL(valueChanged(int)), this, SLOT(changed())); QCheckBox *nc = new QCheckBox( i18n("Do not change"), parent ); layout->addWidget( nc, row, 3 ); nc->hide(); mNoChanges[ days ] = nc; return days; } void KU_EditUser::initDlg() { ro = KU_Global::users()->getCaps() & KU_Users::Cap_ReadOnly; QString whatstr; // Tab 1: User Info { QFrame *frame = new QFrame(); addPage(frame, i18n("User Info")); QGridLayout *layout = new QGridLayout( frame ); int row = 0; frontpage = frame; frontlayout = layout; lbuser = new QLabel(frame); // whatstr = i18n("WHAT IS THIS: User login"); addRow(frame, layout, row++, lbuser, i18n("User login:"), whatstr, false, false); leid = new KLineEdit(frame); // whatstr = i18n("WHAT IS THIS: User Id"); leid->setValidator(new QIntValidator(frame)); addRow(frame, layout, row++, leid, i18n("&User ID:"), whatstr); connect(leid, SIGNAL(textChanged(QString)), this, SLOT(changed())); if ( !ro ) { pbsetpwd = new QPushButton(i18n("Set &Password..."), frame); layout->addWidget(pbsetpwd, 0, 2); connect(pbsetpwd, SIGNAL(clicked()), this, SLOT(setpwd())); } lefname = new KLineEdit(frame); // whatstr = i18n("WHAT IS THIS: Full Name"); addRow(frame, layout, row++, lefname, i18n("Full &name:"), whatstr); connect(lefname, SIGNAL(textChanged(QString)), this, SLOT(changed())); lefname->setFocus(); if ( KU_Global::users()->getCaps() & KU_Users::Cap_InetOrg ) { lesurname = new KLineEdit(frame); // whatstr = i18n("WHAT IS THIS: Surname"); addRow(frame, layout, row++, lesurname, i18n("Surname:"), whatstr); connect(lesurname, SIGNAL(textChanged(QString)), this, SLOT(changed())); lemail = new KLineEdit(frame); // whatstr = i18n("WHAT IS THIS: Email"); addRow(frame, layout, row++, lemail, i18n("Email address:"), whatstr); connect(lemail, SIGNAL(textChanged(QString)), this, SLOT(changed())); } leshell = new KComboBox(true, frame); leshell->clear(); leshell->insertItem( 0, i18n("") ); QStringList shells = readShells(); shells.sort(); leshell->insertItems( 1, shells ); connect(leshell, SIGNAL(activated(QString)), this, SLOT(changed())); connect(leshell, SIGNAL(editTextChanged(QString)), this, SLOT(changed())); // whatstr = i18n("WHAT IS THIS: Login Shell"); addRow(frame, layout, row++, leshell, i18n("&Login shell:"), whatstr); lehome = new KLineEdit(frame); connect(lehome, SIGNAL(textChanged(QString)), this, SLOT(changed())); // whatstr = i18n("WHAT IS THIS: Home Directory"); addRow(frame, layout, row++, lehome, i18n("&Home folder:"), whatstr); // FreeBSD appears to use the comma separated fields in the GECOS entry // differently than Linux. if ( KU_Global::users()->getCaps() & KU_Users::Cap_BSD ) { leoffice = new KLineEdit(frame); connect(leoffice, SIGNAL(textChanged(QString)), this, SLOT(changed())); // whatstr = i18n("WHAT IS THIS: Office"); addRow(frame, layout, row++, leoffice, i18n("&Office:"), whatstr); leophone = new KLineEdit(frame); connect(leophone, SIGNAL(textChanged(QString)), this, SLOT(changed())); // whatstr = i18n("WHAT IS THIS: Office Phone"); addRow(frame, layout, row++, leophone, i18n("Offi&ce Phone:"), whatstr); lehphone = new KLineEdit(frame); connect(lehphone, SIGNAL(textChanged(QString)), this, SLOT(changed())); // whatstr = i18n("WHAT IS THIS: Home Phone"); addRow(frame, layout, row++, lehphone, i18n("Ho&me Phone:"), whatstr); leclass = new KLineEdit(frame); connect(leclass, SIGNAL(textChanged(QString)), this, SLOT(changed())); // whatstr = i18n("WHAT IS THIS: Login class"); addRow(frame, layout, row++, leclass, i18n("Login class:"), whatstr, true); } else { leoffice1 = new KLineEdit(frame); connect(leoffice1, SIGNAL(textChanged(QString)), this, SLOT(changed())); // whatstr = i18n("WHAT IS THIS: Office1"); addRow(frame, layout, row++, leoffice1, i18n("&Office #1:"), whatstr); leoffice2 = new KLineEdit(frame); connect(leoffice2, SIGNAL(textChanged(QString)), this, SLOT(changed())); // whatstr = i18n("WHAT IS THIS: Office2"); addRow(frame, layout, row++, leoffice2, i18n("O&ffice #2:"), whatstr); leaddress = new KLineEdit(frame); connect(leaddress, SIGNAL(textChanged(QString)), this, SLOT(changed())); // whatstr = i18n("WHAT IS THIS: Address"); addRow(frame, layout, row++, leaddress, i18n("&Address:"), whatstr); } cbdisabled = new QCheckBox(frame); connect(cbdisabled, SIGNAL(stateChanged(int)), this, SLOT(changed())); addRow(frame, layout, row++, cbdisabled, i18n("Account &disabled"), whatstr); if ( KU_Global::users()->getCaps() & KU_Users::Cap_Disable_POSIX ) { cbposix = new QCheckBox(frame); connect(cbposix, SIGNAL(stateChanged(int)), this, SLOT(changed())); connect(cbposix, SIGNAL(stateChanged(int)), this, SLOT(cbposixChanged())); addRow(frame, layout, row++, cbposix, i18n("Disable &POSIX account information"), whatstr); } else { cbposix = 0; } frontrow = row; } if ( KU_Global::users()->getCaps() & KU_Users::Cap_Shadow || KU_Global::users()->getCaps() & KU_Users::Cap_BSD ) { // Tab 2 : Password Management QFrame *frame = new QFrame(); addPage(frame, i18n("Password Management")); QGridLayout *layout = new QGridLayout( frame ); int row = 0; QDateTime time; leslstchg = new QLabel(frame); addRow(frame, layout, row++, leslstchg, i18n("Last password change:"), QString(), true); layout->addWidget(new KSeparator(Qt::Horizontal, frame), row, 0, 1, 4); row++; if ( KU_Global::users()->getCaps() & KU_Users::Cap_Shadow ) { layout->addWidget( new QLabel( i18n("POSIX parameters:"), frame ), row++, 0 ); lesmin = addDaysGroup(frame, layout, row++, i18n("Time before password may ¬ be changed after last password change:"), false); lesmax = addDaysGroup(frame, layout, row++, i18n("Time when password &expires after last password change:") ); leswarn = addDaysGroup(frame, layout, row++, i18n("Time before password expires to &issue an expire warning:")); lesinact = addDaysGroup(frame, layout, row++, i18n("Time when account will be &disabled after expiration of password:")); layout->addWidget(new KSeparator(Qt::Horizontal, frame), row, 0, 1, 4); row++; } QLabel *label = new QLabel( i18n("&Account will expire on:"), frame ); layout->addWidget( label, row, 0 ); lesexpire = new KDateTimeWidget( frame ); label->setBuddy( lesexpire ); layout->addWidget( lesexpire, row, 1, 1, 2 ); cbexpire = new QCheckBox( i18n("Never"), frame ); layout->addWidget( cbexpire, row++, 3 ); connect( lesexpire, SIGNAL(valueChanged(QDateTime)), this, SLOT(changed()) ); connect( cbexpire, SIGNAL(stateChanged(int)), this, SLOT(changed()) ); connect( cbexpire, SIGNAL(toggled(bool)), lesexpire, SLOT(setDisabled(bool)) ); } // Tab 4: Groups { QFrame *frame = new QFrame(); addPage(frame, i18n("Groups")); QGridLayout *layout = new QGridLayout( frame ); lstgrp = new QListWidget(frame); // lstgrp->setFullWidth(true); // Single column, full widget width. // lstgrp->addColumn( i18n("Groups") ); if ( ro ) lstgrp->setSelectionMode( QListWidget::NoSelection ); // QString whatstr = i18n("Select the groups that this user belongs to."); lstgrp->setWhatsThis( whatstr); layout->addWidget( lstgrp, 0, 0, 1, 2 ); leprigr = new QLabel( i18n("Primary group: "), frame ); layout->addWidget( leprigr, 1, 0 ); if ( !ro ) { pbprigr = new QPushButton( i18n("Set as Primary"), frame ); layout->addWidget( pbprigr, 1, 1 ); connect( pbprigr, SIGNAL(clicked()), this, SLOT(setpgroup()) ); } connect( lstgrp, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(gchanged()) ); } // connect( this, SIGNAL(okClicked()), SLOT(slotOk()) ); } KU_EditUser::KU_EditUser( const QList &selected, QWidget *parent ) : KPageDialog( parent) { setCaption(i18n("User Properties")); setButtons( Ok | Cancel); setDefaultButton(Ok); setFaceType(KPageDialog::Tabbed); mSelected = selected; if ( mSelected.count() > 1 ) setCaption( i18n("User Properties - %1 Selected Users", mSelected.count() ) ); else { mUser = KU_Global::users()->at( selected[0] ); mSelected.clear(); } initDlg(); loadgroups( false ); selectuser(); ischanged = false; isgchanged = false; } KU_EditUser::KU_EditUser( KU_User &user, bool fixedprivgroup, QWidget *parent ) : KPageDialog(parent) { setCaption(i18n("User Properties")); setButtons(Ok | Cancel); setDefaultButton( Ok); setModal(true); setFaceType(KPageDialog::Tabbed); mUser = user; initDlg(); loadgroups( fixedprivgroup ); selectuser(); ischanged = false; isgchanged = false; } KU_EditUser::~KU_EditUser() { } void KU_EditUser::cbposixChanged() { bool posix = !( cbposix->checkState() == Qt::Checked ); leid->setEnabled( posix && mSelected.isEmpty() ); leshell->setEnabled( posix ); lehome->setEnabled( posix ); if ( KU_Global::users()->getCaps() & KU_Users::Cap_Shadow ) { lesmin->setEnabled( posix ); lesmax->setEnabled( posix ); leswarn->setEnabled( posix ); lesinact->setEnabled( posix ); } } void KU_EditUser::setLE( KLineEdit *le, const QString &val, bool first ) { if ( first ) { le->setText( val ); if ( ro ) le->setReadOnly( true ); return; } if ( val.isEmpty() && le->text().isEmpty() ) return; if ( le->text() != val ) { le->setText( QLatin1String( "" ) ); if ( !ro && mNoChanges.contains( le ) ) { mNoChanges[ le ]->show(); mNoChanges[ le ]->setChecked( true ); } } } void KU_EditUser::setCB( QCheckBox *cb, bool val, bool first ) { if ( first ) { cb->setChecked( val ); if ( ro ) cb->setEnabled( false ); return; } if ( cb->isChecked() != val ) { cb->setTristate(); cb->setCheckState( Qt::PartiallyChecked ); } } void KU_EditUser::setSB( KIntSpinBox *sb, int val, bool first ) { if ( first ) { sb->setValue( val ); if ( ro ) sb->setEnabled( false ); return; } if ( sb->value() != val ) { sb->setValue( 0 ); if ( !ro && mNoChanges.contains( sb ) ) { mNoChanges[ sb ]->show(); mNoChanges[ sb ]->setChecked( true ); } } } void KU_EditUser::selectuser() { KU_User user; bool one = mSelected.isEmpty(); int index = 0; ismoreshells = false; user = one ? mUser : KU_Global::users()->at(mSelected[0]); olduid = user.getUID(); oldrid = user.getSID().getRID(); oldshell = user.getShell(); lstchg = user.getLastChange(); QDateTime datetime; datetime.setTime_t( lstchg ); if ( KU_Global::users()->getCaps() & KU_Users::Cap_Shadow || KU_Global::users()->getCaps() & KU_Users::Cap_BSD ) { leslstchg->setText( KGlobal::locale()->formatDateTime( datetime, KLocale::LongDate ) ); } if ( one ) { lbuser->setText( user.getName() ); leid->setText( QString::number( user.getUID() ) ); if ( ro ) leid->setReadOnly( true ); } else { leid->setEnabled( false ); } if ( ro ) leshell->setEditable( false ); bool first; while ( true ) { first = (index == 0); setLE( lefname, user.getFullName(), first ); QString home; home = user.getHomeDir(); if ( !one ) home.replace( user.getName(), QLatin1String( "%U" ), Qt::CaseInsensitive ); setLE( lehome, home, first ); QString shell = user.getShell(); if ( first ) { if ( !shell.isEmpty() ) { bool tested = false; for ( int i=0; icount(); i++ ) if ( leshell->itemText(i) == shell ) { tested = true; leshell->setCurrentIndex(i); break; } if ( !tested ) { leshell->insertItem( leshell->count(), shell ); leshell->setCurrentIndex( leshell->count()-1 ); } } else leshell->setCurrentIndex( 0 ); } else { if ( leshell->currentText() != shell ) { if ( !ismoreshells ) { leshell->insertItem( 0, i18n("Do Not Change") ); ismoreshells = true; } leshell->setCurrentIndex( 0 ); } } setCB( cbdisabled, user.getDisabled(), first ); if ( KU_Global::users()->getCaps() & KU_Users::Cap_Disable_POSIX ) { setCB( cbposix, !(user.getCaps() & KU_User::Cap_POSIX), first ); } if ( KU_Global::users()->getCaps() & KU_Users::Cap_Shadow || KU_Global::users()->getCaps() & KU_Users::Cap_BSD ) { if ( user.getLastChange() != lstchg ) { leslstchg->setText( QLatin1String( "" ) ); lstchg = 0; } QDateTime expire; expire.setTime_t( user.getExpire() ); kDebug() << "expiration: " << user.getExpire(); setCB( cbexpire, (int) expire.toTime_t() == -1, first ); if ( (int) expire.toTime_t() == -1 ) expire.setTime_t( 0 ); if ( first ) { lesexpire->setDateTime( expire ); } else { if ( lesexpire->dateTime() != expire ) { expire.setTime_t( 0 ); lesexpire->setDateTime( expire ); } } } if ( KU_Global::users()->getCaps() & KU_Users::Cap_Shadow ) { setSB( lesmin, user.getMin(), first ); setSB( lesmax, user.getMax(), first ); setSB( leswarn, user.getWarn(), first ); setSB( lesinact, user.getInactive(), first ); } if ( KU_Global::users()->getCaps() & KU_Users::Cap_InetOrg ) { setLE( lesurname, user.getSurname(), first ); setLE( lemail, user.getEmail(), first ); } if ( KU_Global::users()->getCaps() & KU_Users::Cap_BSD ) { setLE( leoffice, user.getOffice(), first ); setLE( leophone, user.getWorkPhone(), first ); setLE( lehphone, user.getHomePhone(), first ); setLE( leclass, user.getClass(), first ); } else { setLE( leoffice1, user.getOffice1(), first ); setLE( leoffice2, user.getOffice2(), first ); setLE( leaddress, user.getAddress(), first ); } first = false; if ( index == mSelected.count() ) break; user = KU_Global::users()->at(mSelected[index++]); } } void KU_EditUser::loadgroups( bool fixedprivgroup ) { bool wasprivgr = false; primaryGroupWasOn = false; for ( QList::Iterator it = KU_Global::groups()->begin(); it != KU_Global::groups()->end(); ++it ) { QString groupName = (*it).getName(); QListWidgetItem *item = new QListWidgetItem(groupName, lstgrp); item->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable ); int index = 0; KU_User user = mSelected.count() > 0 ? KU_Global::users()->at(mSelected[0]) : mUser; while ( true ) { bool prigr = ( !fixedprivgroup && (*it).getGID() == user.getGID() ) || ( fixedprivgroup && groupName == user.getName() ); bool on = (*it).lookup_user( user.getName() ) || prigr; if ( prigr ) { item->setFlags( item->flags() & ~(Qt::ItemIsEnabled | Qt::ItemIsUserCheckable) ); if ( !wasprivgr ) primaryGroup = groupName; else if ( primaryGroup != groupName ) primaryGroup = QLatin1String( "" ); // primaryGroupWasOn = group->lookup_user(user->getName()); wasprivgr = true; } if ( index == 0 ) { item->setCheckState( on ? Qt::Checked : Qt::Unchecked ); } else if ( item->checkState() != ( on ? Qt::Checked : Qt::Unchecked ) ) { item->setFlags( item->flags() | Qt::ItemIsTristate ); item->setCheckState( Qt::PartiallyChecked ); } if ( index == mSelected.count() ) break; kDebug() << "index: " << index << " count: " << mSelected.count(); user = KU_Global::users()->at(mSelected[index++]); } } if ( fixedprivgroup ) { KU_User user = mSelected.isEmpty() ? mUser : KU_Global::users()->at(mSelected[0]); kDebug() << "privgroup: " << user.getName(); if ( !wasprivgr ) { QListWidgetItem *item = new QListWidgetItem(user.getName(),lstgrp); item->setCheckState( Qt::Checked ); item->setFlags( item->flags() & ~(Qt::ItemIsEnabled | Qt::ItemIsUserCheckable) ); primaryGroup = user.getName(); } } leprigr->setText( i18n("Primary group: ") + primaryGroup ); } void KU_EditUser::setpgroup() { isgchanged = true; QList items = lstgrp->selectedItems(); if ( items.isEmpty() ) return; QListWidgetItem *item = items[0]; if ( item->text() == primaryGroup ) return; bool prevPrimaryGroupWasOn = primaryGroupWasOn; primaryGroup = item->text(); for ( int row = 0; row < lstgrp->count(); row++ ) { item = lstgrp->item( row ); QString groupName = item->text(); if ( !(item->flags() & Qt::ItemIsEnabled) ) { item->setFlags( item->flags() | Qt::ItemIsEnabled | Qt::ItemIsUserCheckable ); item->setCheckState(prevPrimaryGroupWasOn ? Qt::Checked : Qt::Unchecked ); } if ( groupName == primaryGroup ) { primaryGroupWasOn = ( item->checkState() == Qt::Checked ); item->setFlags( item->flags() & ~(Qt::ItemIsEnabled | Qt::ItemIsUserCheckable) ); item->setCheckState( Qt::Checked ); } } leprigr->setText( i18n("Primary group: ") + primaryGroup ); } void KU_EditUser::changed() { QWidget *widget = (QWidget*) sender(); if ( mNoChanges.contains( widget ) ) mNoChanges[ widget ]->setChecked( false ); ischanged = true; kDebug() << "changed"; } void KU_EditUser::gchanged() { isgchanged = true; } QString KU_EditUser::mergeLE( KLineEdit *le, const QString &val, bool one ) { QCheckBox *cb = 0; if ( mNoChanges.contains( le ) ) cb = mNoChanges[ le ]; return ( one || ( cb && !cb->isChecked() ) ) ? le->text() : val; } int KU_EditUser::mergeSB( KIntSpinBox *sb, int val, bool one ) { QCheckBox *cb = 0; if ( mNoChanges.contains( sb ) ) cb = mNoChanges[ sb ]; return ( one || ( cb && !cb->isChecked() ) ) ? sb->value() : val; } void KU_EditUser::mergeUser( const KU_User &user, KU_User &newuser ) { QDateTime epoch ; epoch.setTime_t(0); bool one = mSelected.isEmpty(); bool posix = false; newuser = user; if ( KU_Global::users()->getCaps() & KU_Users::Cap_Disable_POSIX && cbposix->checkState() != Qt::PartiallyChecked ) { if ( cbposix->isChecked() ) newuser.setCaps( newuser.getCaps() & ~KU_User::Cap_POSIX ); else newuser.setCaps( newuser.getCaps() | KU_User::Cap_POSIX ); } posix = newuser.getCaps() & KU_User::Cap_POSIX; kDebug() << "posix: " << posix; if ( one ) { newuser.setName( lbuser->text() ); newuser.setUID( posix ? leid->text().toInt() : 0 ); } if ( !newpass.isNull() ) { KU_Global::users()->createPassword( newuser, newpass ); newuser.setLastChange( lstchg ); } newuser.setFullName( mergeLE( lefname, user.getFullName(), one ) ); if ( KU_Global::users()->getCaps() & KU_Users::Cap_BSD ) { newuser.setOffice( mergeLE( leoffice, user.getOffice(), one ) ); newuser.setWorkPhone( mergeLE( leophone, user.getWorkPhone(), one ) ); newuser.setHomePhone( mergeLE( lehphone, user.getHomePhone(), one ) ); newuser.setClass( mergeLE( leclass, user.getClass(), one ) ); } else { newuser.setOffice1( mergeLE( leoffice1, user.getOffice1(), one ) ); newuser.setOffice2( mergeLE( leoffice2, user.getOffice2(), one ) ); newuser.setAddress( mergeLE( leaddress, user.getAddress(), one ) ); } newuser.setHomeDir( posix ? mergeLE( lehome, user.getHomeDir(), one ).replace( QLatin1String( "%U" ), newuser.getName(), Qt::CaseInsensitive ) : QString() ); if ( posix ) { if ( leshell->currentIndex() == 0 && ismoreshells ) { newuser.setShell( user.getShell() ); } else if ( ( leshell->currentIndex() == 0 && !ismoreshells ) || ( leshell->currentIndex() == 1 && ismoreshells ) ) { newuser.setShell( QString::null ); //krazy:exclude=nullstrassign for old broken gcc } else { // TODO: Check shell. newuser.setShell( leshell->currentText() ); } } else newuser.setShell( QString::null ); //krazy:exclude=nullstrassign for old broken gcc newuser.setDisabled( (cbdisabled->checkState() == Qt::PartiallyChecked) ? user.getDisabled() : cbdisabled->isChecked() ); if ( KU_Global::users()->getCaps() & KU_Users::Cap_InetOrg ) { newuser.setSurname( mergeLE( lesurname, user.getSurname(), one ) ); newuser.setEmail( mergeLE( lemail, user.getEmail(), one ) ); kDebug() << "surname: " << newuser.getSurname() << " mail: " << newuser.getEmail(); } if ( KU_Global::users()->getCaps() & KU_Users::Cap_Shadow ) { newuser.setMin( posix ? mergeSB( lesmin, user.getMin(), one ) : 0 ); newuser.setMax( posix ? mergeSB( lesmax, user.getMax(), one ) : 0 ); newuser.setWarn( posix ? mergeSB( leswarn, user.getWarn(), one ) : 0 ); newuser.setInactive( posix ? mergeSB( lesinact, user.getInactive(), one ) : 0 ); } if ( ( (KU_Global::users()->getCaps() & KU_Users::Cap_Shadow) && posix ) || ( (KU_Global::users()->getCaps() & KU_Users::Cap_BSD) && posix ) ) { switch ( cbexpire->checkState() ) { case Qt::PartiallyChecked: newuser.setExpire( user.getExpire() ); break; case Qt::Checked: newuser.setExpire( -1 ); break; case Qt::Unchecked: newuser.setExpire( !one && lesexpire->dateTime().toTime_t() == 0 ? user.getExpire() : lesexpire->dateTime().toTime_t() ); break; } } else { newuser.setExpire( -1 ); } if ( !primaryGroup.isEmpty() ) { int index = KU_Global::groups()->lookup( primaryGroup ); if ( index != -1 ) { KU_Group group = KU_Global::groups()->at( index ); newuser.setGID( group.getGID() ); } } } bool KU_EditUser::saveg() { if ( !isgchanged ) return true; for ( int row = 0; row < lstgrp->count(); row++ ) { QListWidgetItem *item = lstgrp->item( row ); kDebug() << "saveg: group name: " << item->text(); int grpindex = KU_Global::groups()->lookup(item->text()); if ( grpindex != -1 && item->checkState() != Qt::PartiallyChecked ) { KU_Group group = KU_Global::groups()->at( grpindex ); bool mod = false; int index = 0; KU_User user = mSelected.isEmpty() ? mUser : KU_Global::users()->at(mSelected[0]); while ( true ) { if ( item->checkState() == Qt::Checked && (( !primaryGroup.isEmpty() && primaryGroup != group.getName() ) || ( primaryGroup.isEmpty() && user.getGID() != group.getGID() )) ) { if ( group.addUser( user.getName() ) ) mod = true; } else { if ( group.removeUser( user.getName() ) ) mod = true; } if ( index == mSelected.count() ) break; user = KU_Global::users()->at(mSelected[index++]); } if ( mod ) KU_Global::groups()->mod( grpindex, group ); } } return true; } bool KU_EditUser::checkShell(const QString &shell) { if (shell.isEmpty()) return true; QStringList shells = readShells(); return shells.contains(shell); } bool KU_EditUser::check() { kDebug() << "KU_EditUser::check()"; bool one = mSelected.isEmpty(); bool posix = !( KU_Global::users()->getCaps() & KU_Users::Cap_Disable_POSIX ) || !( cbposix->isChecked() ); if ( one && posix && leid->text().isEmpty() ) { KMessageBox::sorry( 0, i18n("You need to specify an UID.") ); return false; } if ( one && posix && lehome->text().isEmpty() ) { KMessageBox::sorry( 0, i18n("You must specify a home directory.") ); return false; } if ( KU_Global::users()->getCaps() & KU_Users::Cap_InetOrg ) { if ( one && lesurname->text().isEmpty() ) { KMessageBox::sorry( 0, i18n("You must fill the surname field.") ); return false; } } return true; } void KU_EditUser::setpwd() { KU_PwDlg pd( this ); if ( pd.exec() == QDialog::Accepted ) { ischanged = true; newpass = pd.getPassword(); lstchg = now(); QDateTime datetime; datetime.setTime_t( lstchg ); if ( KU_Global::users()->getCaps() & KU_Users::Cap_Shadow || KU_Global::users()->getCaps() & KU_Users::Cap_BSD ) { leslstchg->setText( KGlobal::locale()->formatDateTime( datetime, KLocale::LongDate ) ); } cbdisabled->setChecked( false ); } } void KU_EditUser::accept() { kDebug() << "KU_EditUser::slotOk() ischanged: " << ischanged; if ( ro ) { reject(); return; } bool one = mSelected.isEmpty(); uid_t newuid = leid->text().toULong(); if ( one && ( !( KU_Global::users()->getCaps() & KU_Users::Cap_Disable_POSIX ) || !cbposix->isChecked() ) && olduid != newuid ) { if ( KU_Global::users()->lookup(newuid) != -1 ) { KMessageBox::sorry( 0, i18n("User with UID %1 already exists", newuid) ); return; } } QString newshell; if (leshell->currentIndex() != 0) newshell = leshell->currentText(); if (oldshell != newshell) { if (!checkShell(newshell)) { int result = KMessageBox::warningYesNoCancel( 0, i18n("

The shell %1 is not yet listed in the file %2. " "In order to use this shell you must add it to " "this file first.
" "Do you want to add it now?

", newshell, QFile::decodeName(SHELL_FILE)), i18n("Unlisted Shell"), KGuiItem(i18n("&Add Shell")), KGuiItem(i18n("Do &Not Add"))); if (result == KMessageBox::Cancel) return; if (result == KMessageBox::Yes) addShell(newshell); } } if ( !ischanged && !isgchanged ) { reject(); } else if ( check() ) { saveg(); done( Accepted ); } } #include "moc_ku_edituser.cpp"