summaryrefslogtreecommitdiffstats
path: root/kuser/mainView.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kuser/mainView.cpp')
-rw-r--r--kuser/mainView.cpp526
1 files changed, 526 insertions, 0 deletions
diff --git a/kuser/mainView.cpp b/kuser/mainView.cpp
new file mode 100644
index 0000000..4f4e388
--- /dev/null
+++ b/kuser/mainView.cpp
@@ -0,0 +1,526 @@
+/*
+ * Copyright (c) 1998 Denis Perchine <dyp@perchine.com>
+ * Copyright (c) 2004 Szombathelyi György <gyurco@freemail.hu>
+ * Former maintainer: Adriaan de Groot <groot@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License version 2 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 "mainView.h"
+
+#include <stdio.h>
+
+#include <qtooltip.h>
+#include <qfile.h>
+
+#include <kinputdialog.h>
+#include <ktoolbar.h>
+#include <kiconloader.h>
+#include <kmessagebox.h>
+#include <kdebug.h>
+
+#include "misc.h"
+#include "kglobal_.h"
+#include "propdlg.h"
+#include "addUser.h"
+#include "delUser.h"
+#include "pwddlg.h"
+#include "editGroup.h"
+
+mainView::mainView(QWidget *parent) : QTabWidget(parent)
+{
+ init();
+}
+
+void mainView::init() {
+
+ lbusers = new KUserView( this, "lbusers" );
+ addTab( lbusers, i18n("Users") );
+
+ lbgroups = new KGroupView( this, "lbgroups" );
+ addTab( lbgroups, i18n("Groups"));
+
+ connect(lbusers, SIGNAL(doubleClicked(QListViewItem *)), this, SLOT(userSelected()));
+ connect(lbusers, SIGNAL(returnPressed(QListViewItem *)), this, SLOT(userSelected()));
+
+ connect(lbgroups, SIGNAL(doubleClicked(QListViewItem *)), this, SLOT(groupSelected()));
+ connect(lbgroups, SIGNAL(returnPressed(QListViewItem *)), this, SLOT(groupSelected()));
+
+ connect(this, SIGNAL(currentChanged(QWidget *)), this, SLOT(slotTabChanged()));
+}
+
+mainView::~mainView()
+{
+}
+
+void mainView::slotTabChanged()
+{
+ if (currentPage() == lbusers)
+ {
+ emit userSelected(true);
+ emit groupSelected(false);
+ }
+ else
+ {
+ emit userSelected(false);
+ emit groupSelected(true);
+ }
+}
+
+void mainView::clearUsers()
+{
+ lbusers->clear();
+}
+
+void mainView::clearGroups()
+{
+ lbgroups->clear();
+}
+
+void mainView::reloadUsers()
+{
+ KU::KUser *ku;
+
+ lbusers->clear();
+ lbusers->init();
+ uid_t uid = kug->kcfg()->firstUID();
+
+ ku = kug->getUsers().first();
+ while ( ku ) {
+ if ( ku->getUID() >= uid || mShowSys ) lbusers->insertItem( ku );
+ ku = kug->getUsers().next();
+ }
+ if (lbusers->firstChild())
+ lbusers->setSelected(lbusers->firstChild(), true);
+}
+
+void mainView::reloadGroups()
+{
+ KU::KGroup *kg;
+
+ lbgroups->clear();
+ lbgroups->init();
+ gid_t gid = kug->kcfg()->firstGID();
+
+ kg = kug->getGroups().first();
+ while ( kg ) {
+ if ( kg->getGID() >= gid || mShowSys ) lbgroups->insertItem(kg);
+ kg = kug->getGroups().next();
+ }
+}
+
+void mainView::useredit()
+{
+ userSelected();
+}
+
+void mainView::userdel()
+{
+ KU::KUser *user = lbusers->getCurrentUser();
+ if (!user)
+ return;
+
+ QString username = user->getName();
+ gid_t gid = user->getGID();
+ delUser dlg(user, this);
+
+ if ( dlg.exec() == QDialog::Rejected )
+ return;
+
+ user->setDeleteHome( dlg.getDeleteHomeDir() );
+ user->setDeleteMailBox( dlg.getDeleteMailBox() );
+
+ kug->getUsers().del( user );
+ if ( !updateUsers() ) return;
+
+ KU::KGroup *group = 0;
+ group = kug->getGroups().first();
+ while ( group ) {
+ kdDebug() << "group: " << group->getName() << endl;
+ if ( group->lookup_user( username ) ) {
+ kdDebug() << "group: " << group->getName() << " found user: " << username << endl;
+ KU::KGroup newgroup( group );
+ newgroup.removeUser( username );
+ kug->getGroups().mod( group, newgroup );
+ }
+ group = kug->getGroups().next();
+ }
+
+ if ( kug->kcfg()->userPrivateGroup() ) {
+
+ group = kug->getGroups().lookup( gid );
+
+ if ( group &&
+ KMessageBox::questionYesNo( 0, i18n("You are using private groups.\n"
+ "Do you want to delete the user's private group '%1'?")
+ .arg(group->getName()), QString::null,
+ KStdGuiItem::del(), i18n("Do Not Delete")) == KMessageBox::Yes) {
+ kdDebug() << "del private group" << endl;
+ kug->getGroups().del( group );
+ }
+ }
+ kdDebug() << "update groups" << endl;
+ updateGroups();
+}
+
+void mainView::useradd()
+{
+ KU::KUser *tk;
+
+ showPage(lbusers);
+
+ uid_t uid, rid = 0;
+ bool samba = kug->getUsers().getCaps() & KU::KUsers::Cap_Samba;
+
+ if ((uid = kug->getUsers().first_free()) == KU::KUsers::NO_FREE) {
+ KMessageBox::sorry( 0, i18n("You have run out of uid space.") );
+ return;
+ }
+/*
+ if ( samba && (rid = kug->getUsers().first_free_sam()) == 0) {
+ KMessageBox::sorry( 0, i18n("You have run out of user RID space.") );
+ return;
+ }
+*/
+ if ( samba ) rid = SID::uid2rid( uid );
+ bool ok;
+ QString name = KInputDialog::getText( QString::null,
+ i18n("Please type the name of the new user:"),
+ QString::null, &ok );
+
+ if ( !ok ) return;
+
+ if ( kug->getUsers().lookup( name ) ) {
+ KMessageBox::sorry( 0, i18n("User with name %1 already exists.").arg( name ) );
+ return;
+ }
+
+ tk = new KU::KUser();
+ tk->setCaps( samba ? KU::KUser::Cap_POSIX | KU::KUser::Cap_Samba : KU::KUser::Cap_POSIX );
+ tk->setUID( uid );
+ tk->setName( name );
+
+ if ( samba ) {
+ SID sid;
+ sid.setDOM( kug->getUsers().getDOMSID() );
+ sid.setRID( rid );
+ tk->setSID( sid );
+ tk->setProfilePath( kug->kcfg()->samprofilepath().replace( "%U",name ) );
+ tk->setHomePath( kug->kcfg()->samhomepath().replace( "%U", name ) );
+ tk->setHomeDrive( kug->kcfg()->samhomedrive() );
+ tk->setLoginScript( kug->kcfg()->samloginscript() );
+ tk->setDomain( kug->kcfg()->samdomain() );
+ }
+
+ tk->setShell( kug->kcfg()->shell() );
+ tk->setHomeDir( kug->kcfg()->homepath().replace( "%U", name ) );
+ if ( kug->getUsers().getCaps() & KU::KUsers::Cap_Shadow || samba ) {
+ tk->setLastChange( now() );
+ }
+
+ tk->setMin( kug->kcfg()->smin() );
+ tk->setMax( kug->kcfg()->smax() );
+ tk->setWarn( kug->kcfg()->swarn() );
+ tk->setInactive( kug->kcfg()->sinact() );
+ tk->setExpire( kug->kcfg()->sneverexpire() ? (uint) -1 :
+ (kug->kcfg()->sexpire()).toTime_t() );
+
+ bool privgroup = kug->kcfg()->userPrivateGroup();
+
+ if ( !privgroup ) tk->setGID( kug->kcfg()->defaultgroup() );
+
+ addUser au( tk, privgroup, this );
+
+ au.setCreateHomeDir( kug->kcfg()->createHomeDir() );
+ au.setCopySkel( kug->kcfg()->copySkel() );
+
+ if ( au.exec() == QDialog::Rejected ) {
+ delete tk;
+ return;
+ }
+ if ( privgroup ) {
+ KU::KGroup *tg;
+
+ if ((tg = kug->getGroups().lookup(tk->getName())) == 0) {
+ gid_t gid;
+ if ( kug->getGroups().lookup( tk->getUID() ) == 0 ) {
+ gid = tk->getUID();
+ } else {
+ gid = kug->getGroups().first_free();
+ }
+ kdDebug() << "private group GID: " << gid << endl;
+ uid_t rid = 0;
+// if ( samba ) rid = kug->getGroups().first_free_sam();
+ if ( samba ) rid = SID::gid2rid( gid );
+ if ( gid == KU::KGroups::NO_FREE || ( samba && rid == 0 ) ) {
+ kug->getGroups().cancelMods();
+ delete tk;
+ return;
+ }
+ tg = new KU::KGroup();
+ tg->setGID( gid );
+ if ( samba && ( tk->getCaps() & KU::KUser::Cap_Samba ) ) {
+ SID sid;
+ sid.setDOM( kug->getGroups().getDOMSID() );
+ sid.setRID( rid );
+ tg->setSID( sid );
+ tg->setDisplayName( tk->getName() );
+ tg->setCaps( KU::KGroup::Cap_Samba );
+ }
+ tg->setName( tk->getName() );
+ kug->getGroups().add( tg );
+ }
+ tk->setGID( tg->getGID() );
+ tk->setPGSID( tg->getSID() );
+ }
+ kug->getUsers().add( tk );
+ if ( !updateUsers() ) {
+ kug->getGroups().cancelMods();
+ return;
+ }
+ updateGroups();
+}
+
+bool mainView::queryClose()
+{
+ return true;
+}
+
+void mainView::setpwd()
+{
+ int count = lbusers->selectedItems().count();
+ if ( count == 0 ) return;
+ if ( count > 1 ) {
+ if ( KMessageBox::questionYesNo( 0,
+ i18n("You have selected %1 users. Do you really want to change the password for all the selected users?")
+ .arg( count ), QString::null, i18n("Change"), i18n("Do Not Change") ) == KMessageBox::No ) return;
+ }
+ pwddlg d( this );
+ if ( d.exec() != QDialog::Accepted ) return;
+
+ KU::KUser newuser, *user;
+ QListViewItem *item;
+
+ item = lbusers->firstChild();
+ while ( item ) {
+ if ( item->isSelected() ) {
+ user = ((KUserViewItem*) item)->user();
+ newuser.copy( user );
+ kug->getUsers().createPassword( &newuser, d.getPassword() );
+ newuser.setLastChange( now() );
+ newuser.setDisabled( false );
+ kug->getUsers().mod( user, newuser );
+ }
+ item = item->nextSibling();
+ }
+ updateUsers();
+}
+
+void mainView::groupSelected()
+{
+ bool samba = kug->getGroups().getCaps() & KU::KGroups::Cap_Samba;
+ KU::KGroup *tmpKG = lbgroups->getCurrentGroup();
+ if ( !tmpKG ) return;
+ KU::KGroup newGroup( tmpKG );
+
+ kdDebug() << "The SID for group " << newGroup.getName() << " is: '" << newGroup.getSID().getSID() << "'" << endl;
+ if ( samba && ( newGroup.getCaps() & KU::KGroup::Cap_Samba ) &&
+ newGroup.getSID().isEmpty() ) {
+ SID sid;
+ sid.setDOM( kug->getGroups().getDOMSID() );
+// sid.setRID( kug->getGroups().first_free_sam() );
+ sid.setRID( SID::gid2rid( newGroup.getGID() ) );
+ newGroup.setSID( sid );
+ kdDebug() << "The new SID for group " << newGroup.getName() << " is: " << sid.getSID() << endl;
+ }
+ editGroup egdlg( &newGroup, samba, false );
+
+ if ( egdlg.exec() == QDialog::Accepted ) {
+ kug->getGroups().mod( tmpKG, newGroup );
+ updateGroups();
+ }
+}
+
+void mainView::userSelected()
+{
+ QListViewItem *item;
+ QPtrList<KU::KUser> ulist;
+
+ item = lbusers->firstChild();
+ while ( item ) {
+ if ( item->isSelected() ) {
+ ulist.append( ((KUserViewItem*) item)->user() );
+ }
+ item = item->nextSibling();
+ }
+ if ( ulist.isEmpty() ) return;
+
+ propdlg editUser( ulist, this );
+ if ( editUser.exec() == QDialog::Rejected ) return;
+
+ KU::KUser *user, newuser;
+ user = ulist.first();
+ while ( user ) {
+ editUser.mergeUser( user, &newuser );
+ kug->getUsers().mod( user, newuser );
+ user = ulist.next();
+ }
+ updateUsers();
+ updateGroups();
+}
+
+void mainView::grpadd()
+{
+ showPage(lbgroups);
+
+ gid_t gid;
+ uid_t rid = 0;
+ bool samba;
+
+ samba = kug->getGroups().getCaps() & KU::KGroups::Cap_Samba;
+
+ if ( (gid = kug->getGroups().first_free()) == KU::KGroups::NO_FREE )
+ {
+ KMessageBox::sorry( 0, i18n("You have run out of gid space.") );
+ return;
+ }
+/*
+ if ( samba && (rid = kug->getGroups().first_free_sam()) == 0 )
+ {
+ KMessageBox::sorry( 0, i18n("You have run out of group RID space.") );
+ return;
+ }
+*/
+ if ( samba ) rid = SID::gid2rid( gid );
+
+ KU::KGroup *tk = new KU::KGroup();
+ tk->setGID(gid);
+ if ( samba ) {
+ SID sid;
+ sid.setRID( rid );
+ sid.setDOM( kug->getGroups().getDOMSID() );
+ tk->setSID( sid );
+ }
+ editGroup egdlg( tk, samba, true );
+
+ if ( egdlg.exec() == QDialog::Rejected ) {
+ delete tk;
+ return;
+ }
+ kug->getGroups().add(tk);
+ updateGroups();
+}
+
+void mainView::grpedit()
+{
+ groupSelected();
+}
+
+void mainView::grpdel()
+{
+ QListViewItem *item;
+ KU::KGroup *group = NULL;
+ int selected = 0;
+
+ item = lbgroups->firstChild();
+ while ( item ) {
+ if ( item->isSelected() ) {
+
+ selected++;
+ group = ((KGroupViewItem*) item)->group();
+
+ KU::KUser *user = kug->getUsers().first();
+ while ( user ) {
+ if ( user->getGID() == group->getGID() ) {
+ KMessageBox::error( 0, i18n( "The group '%1' is the primary group of one or more users (such as '%2'); it cannot be deleted." ).arg( group->getName() ).arg( user->getName() ) );
+ return;
+ }
+ user = kug->getUsers().next();
+ }
+ }
+ item = item->nextSibling();
+ }
+
+ switch ( selected ) {
+ case 0: return;
+ case 1:
+ if (KMessageBox::warningContinueCancel( 0,
+ i18n("Do you really want to delete the group '%1'?").arg(group->getName()),
+ QString::null, KStdGuiItem::del()) != KMessageBox::Continue) return;
+ break;
+ default:
+ if (KMessageBox::warningContinueCancel( 0,
+ i18n("Do you really want to delete the %1 selected groups?").arg(selected),
+ QString::null, KStdGuiItem::del()) != KMessageBox::Continue) return;
+ }
+
+ item = lbgroups->firstChild();
+ while ( item ) {
+ if ( item->isSelected() ) {
+ group = ((KGroupViewItem*) item)->group();
+ kug->getGroups().del( group );
+ }
+ item = item->nextSibling();
+ }
+ updateGroups();
+}
+
+bool mainView::updateGroups()
+{
+ bool ret;
+ kdDebug() << "updateGroups() " << endl;
+ ret = kug->getGroups().dbcommit();
+
+ KU::KGroup *group;
+ KU::KGroups::DelIt dit( kug->getGroups().mDelSucc );
+ KU::KGroups::AddIt ait( kug->getGroups().mAddSucc );
+
+ while ( (group = dit.current()) != 0 ) {
+ ++dit;
+ lbgroups->removeItem( group );
+ }
+ while ( (group = ait.current()) != 0 ) {
+ ++ait;
+ lbgroups->insertItem( group );
+ }
+ kdDebug() << "commit groups" << endl;
+ kug->getGroups().commit();
+ return ret;
+}
+
+bool mainView::updateUsers()
+{
+ bool ret;
+ kdDebug() << "updateUsers() " << endl;
+ ret = kug->getUsers().dbcommit();
+
+ KU::KUser *user;
+ KU::KUsers::DelIt dit( kug->getUsers().mDelSucc );
+ KU::KUsers::AddIt ait( kug->getUsers().mAddSucc );
+
+ while ( (user = dit.current()) != 0 ) {
+ ++dit;
+ lbusers->removeItem( user );
+ }
+ while ( (user = ait.current()) != 0 ) {
+ ++ait;
+ lbusers->insertItem( user );
+ }
+ kug->getUsers().commit();
+ return ret;
+}
+
+
+#include "mainView.moc"