2014-11-18 19:43:50 +00:00
/*
* 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 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 <stdio.h>
# include <kinputdialog.h>
# include <ktoolbar.h>
# include <kiconloader.h>
# include <kmessagebox.h>
# include <klocale.h>
# include <kdebug.h>
# include "ku_misc.h"
# include "ku_edituser.h"
# include "ku_adduser.h"
# include "ku_deluser.h"
# include "ku_pwdlg.h"
# include "ku_editgroup.h"
# include "ku_global.h"
# include "ku_mainview.h"
KU_MainView : : KU_MainView ( QWidget * parent ) : KTabWidget ( parent )
{
init ( ) ;
}
void KU_MainView : : init ( ) {
users = 0 ;
groups = 0 ;
usermodel = 0 ;
groupmodel = 0 ;
userview = new QTreeView ( 0 ) ;
userview - > setSelectionMode ( QAbstractItemView : : ExtendedSelection ) ;
userview - > setItemsExpandable ( false ) ;
userview - > setRootIsDecorated ( false ) ;
userview - > setSortingEnabled ( true ) ;
userview - > setUniformRowHeights ( true ) ;
addTab ( userview , i18n ( " Users " ) ) ;
groupview = new QTreeView ( 0 ) ;
groupview - > setSelectionMode ( QAbstractItemView : : ExtendedSelection ) ;
groupview - > setItemsExpandable ( false ) ;
groupview - > setRootIsDecorated ( false ) ;
groupview - > setSortingEnabled ( true ) ;
groupview - > setUniformRowHeights ( true ) ;
addTab ( groupview , i18n ( " Groups " ) ) ;
connect ( userview , SIGNAL ( activated ( QModelIndex ) ) , this , SLOT ( userSelected ( ) ) ) ;
connect ( groupview , SIGNAL ( activated ( QModelIndex ) ) , this , SLOT ( groupSelected ( ) ) ) ;
connect ( this , SIGNAL ( currentChanged ( int ) ) , this , SLOT ( slotTabChanged ( ) ) ) ;
}
KU_MainView : : ~ KU_MainView ( )
{
}
void KU_MainView : : slotTabChanged ( )
{
if ( currentWidget ( ) = = userview )
{
emit userSelected ( true ) ;
emit groupSelected ( false ) ;
}
else
{
emit userSelected ( false ) ;
emit groupSelected ( true ) ;
}
}
void KU_MainView : : clearUsers ( )
{
// lbusers->clear();
}
void KU_MainView : : clearGroups ( )
{
// lbgroups->clear();
}
void KU_MainView : : reloadUsers ( )
{
users = KU_Global : : users ( ) ;
if ( usermodel = = 0 ) {
usermodel = new KU_UserModel ;
userproxymodel . setSourceModel ( usermodel ) ;
userview - > setModel ( & userproxymodel ) ;
}
userproxymodel . setFirstUser ( mShowSys ? 0 : KU_Global : : kcfg ( ) - > firstUID ( ) ) ;
usermodel - > init ( ) ;
userview - > sortByColumn ( 0 , Qt : : AscendingOrder ) ;
}
void KU_MainView : : reloadGroups ( )
{
groups = KU_Global : : groups ( ) ;
if ( groupmodel = = 0 ) {
groupmodel = new KU_GroupModel ;
groupproxymodel . setSourceModel ( groupmodel ) ;
groupview - > setModel ( & groupproxymodel ) ;
}
groupproxymodel . setFirstGroup ( mShowSys ? 0 : KU_Global : : kcfg ( ) - > firstGID ( ) ) ;
groupmodel - > init ( ) ;
groupview - > sortByColumn ( 0 , Qt : : AscendingOrder ) ;
}
bool KU_MainView : : queryClose ( )
{
return true ;
}
void KU_MainView : : setpwd ( )
{
QModelIndexList selectedindexes = userview - > selectionModel ( ) - > selectedIndexes ( ) ;
int count = selectedindexes . count ( ) / usermodel - > columnCount ( ) ;
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? " ,
count ) , QString ( ) , KGuiItem ( i18n ( " Change " ) ) , KGuiItem ( i18n ( " Do Not Change " ) ) ) = = KMessageBox : : No ) return ;
}
KU_PwDlg d ( this ) ;
if ( d . exec ( ) ! = QDialog : : Accepted ) return ;
KU_User user ;
int index ;
foreach ( const QModelIndex & selectedindex , selectedindexes ) {
if ( selectedindex . column ( ) ! = 0 ) continue ;
index = userproxymodel . mapToSource ( selectedindex ) . row ( ) ;
user = users - > at ( index ) ;
kDebug ( ) < < " Changing password for ' " < < user . getName ( ) < < " ' " ;
users - > createPassword ( user , d . getPassword ( ) ) ;
user . setLastChange ( now ( ) ) ;
user . setDisabled ( false ) ;
users - > mod ( index , user ) ;
}
updateUsers ( ) ;
}
void KU_MainView : : userSelected ( )
{
useredit ( ) ;
}
void KU_MainView : : groupSelected ( )
{
grpedit ( ) ;
}
void KU_MainView : : useradd ( )
{
KU_User user ;
setCurrentIndex ( 0 ) ;
2021-03-09 20:33:55 +02:00
uid_t uid = 0 ;
2014-11-18 19:43:50 +00:00
if ( ( uid = users - > first_free ( ) ) = = KU_Users : : NO_FREE ) {
KMessageBox : : sorry ( 0 , i18n ( " You have run out of uid space. " ) ) ;
return ;
}
bool ok ;
2019-05-15 00:24:16 +00:00
QString name = KInputDialog : : getText ( QString ( ) , //krazy:exclude=nullstrassign for old broken gcc
2014-11-18 19:43:50 +00:00
i18n ( " Please type the name of the new user: " ) ,
QString ( ) , & ok ) ;
if ( ! ok ) return ;
if ( users - > lookup ( name ) ! = - 1 ) {
KMessageBox : : sorry ( 0 , i18n ( " User with name %1 already exists. " , name ) ) ;
return ;
}
2021-03-09 20:33:55 +02:00
user . setCaps ( KU_User : : Cap_POSIX ) ;
2014-11-18 19:43:50 +00:00
user . setUID ( uid ) ;
user . setName ( name ) ;
user . setShell ( KU_Global : : kcfg ( ) - > shell ( ) ) ;
user . setHomeDir ( KU_Global : : kcfg ( ) - > homepath ( ) . replace ( QLatin1String ( " %U " ) , name , Qt : : CaseInsensitive ) ) ;
2021-03-09 20:33:55 +02:00
if ( users - > getCaps ( ) & KU_Users : : Cap_Shadow ) {
2014-11-18 19:43:50 +00:00
user . setLastChange ( now ( ) ) ;
}
user . setMin ( KU_Global : : kcfg ( ) - > smin ( ) ) ;
user . setMax ( KU_Global : : kcfg ( ) - > smax ( ) ) ;
user . setWarn ( KU_Global : : kcfg ( ) - > swarn ( ) ) ;
user . setInactive ( KU_Global : : kcfg ( ) - > sinact ( ) ) ;
user . setExpire ( KU_Global : : kcfg ( ) - > sneverexpire ( ) ? ( uint ) - 1 :
( KU_Global : : kcfg ( ) - > sexpire ( ) ) . toTime_t ( ) ) ;
bool privgroup = KU_Global : : kcfg ( ) - > userPrivateGroup ( ) ;
if ( ! privgroup ) user . setGID ( KU_Global : : kcfg ( ) - > defaultgroup ( ) ) ;
KU_AddUser au ( user , privgroup , this ) ;
au . setCreateHomeDir ( KU_Global : : kcfg ( ) - > createHomeDir ( ) ) ;
au . setCopySkel ( KU_Global : : kcfg ( ) - > copySkel ( ) ) ;
if ( au . exec ( ) = = QDialog : : Rejected ) {
return ;
}
user = au . getNewUser ( ) ;
kDebug ( ) < < " surname: " < < user . getSurname ( ) ;
if ( privgroup ) {
KU_Group group ;
int index ;
index = groups - > lookup ( user . getName ( ) ) ;
//if no group exists with the user's name, create one
if ( index = = - 1 ) {
gid_t gid ;
if ( groups - > lookup ( user . getUID ( ) ) = = - 1 ) {
gid = user . getUID ( ) ;
} else {
gid = groups - > first_free ( ) ;
}
kDebug ( ) < < " private group GID: " < < gid ;
2021-03-09 20:33:55 +02:00
if ( gid = = KU_Groups : : NO_FREE ) {
2014-11-18 19:43:50 +00:00
groups - > cancelMods ( ) ;
return ;
}
group . setGID ( gid ) ;
group . setName ( user . getName ( ) ) ;
groups - > add ( group ) ;
} else {
group = groups - > at ( index ) ;
}
user . setGID ( group . getGID ( ) ) ;
}
users - > doCreate ( & user ) ;
users - > add ( user ) ;
if ( ! updateUsers ( ) ) {
groups - > cancelMods ( ) ;
return ;
}
updateGroups ( ) ;
}
void KU_MainView : : useredit ( )
{
QList < int > selected ;
QModelIndexList selectedindexes = userview - > selectionModel ( ) - > selectedIndexes ( ) ;
foreach ( const QModelIndex & selectedindex , selectedindexes ) {
if ( selectedindex . column ( ) = = 0 )
selected . append ( userproxymodel . mapToSource ( selectedindex ) . row ( ) ) ;
}
if ( selected . isEmpty ( ) ) return ;
KU_EditUser editUser ( selected , this ) ;
if ( editUser . exec ( ) = = QDialog : : Rejected ) return ;
KU_User user ;
foreach ( int i , selected ) {
editUser . mergeUser ( users - > at ( i ) , user ) ;
users - > mod ( i , user ) ;
}
updateUsers ( ) ;
updateGroups ( ) ;
}
void KU_MainView : : userdel ( )
{
QModelIndex currentindex = userview - > selectionModel ( ) - > currentIndex ( ) ;
if ( ! currentindex . isValid ( ) ) return ;
int index = userproxymodel . mapToSource ( currentindex ) . row ( ) ;
kDebug ( ) < < " selected index: " < < index ;
KU_User user = users - > at ( index ) ;
QString username = user . getName ( ) ;
gid_t gid = user . getGID ( ) ;
KU_DelUser dlg ( & user , this ) ;
if ( dlg . exec ( ) = = QDialog : : Rejected )
return ;
user . setDeleteHome ( dlg . getDeleteHomeDir ( ) ) ;
user . setDeleteMailBox ( dlg . getDeleteMailBox ( ) ) ;
users - > doDelete ( & user ) ;
users - > del ( index ) ;
if ( ! updateUsers ( ) ) return ;
for ( int i = 0 ; i < groups - > count ( ) ; i + + ) {
KU_Group group = groups - > at ( i ) ;
kDebug ( ) < < " group: " < < group . getName ( ) ;
if ( group . lookup_user ( username ) ) {
kDebug ( ) < < " group: " < < group . getName ( ) < < " found user: " < < username ;
group . removeUser ( username ) ;
groups - > mod ( i , group ) ;
}
}
if ( KU_Global : : kcfg ( ) - > userPrivateGroup ( ) ) {
int i = groups - > lookup ( gid ) ;
if ( i ! = - 1 & &
KMessageBox : : questionYesNo ( 0 , i18n ( " You are using private groups. \n "
" Do you want to delete the user's private group '%1'? " ,
groups - > at ( i ) . getName ( ) ) , QString ( ) ,
KStandardGuiItem : : del ( ) , KGuiItem ( i18n ( " Do Not Delete " ) ) ) = = KMessageBox : : Yes ) {
kDebug ( ) < < " del private group " ;
groups - > del ( i ) ;
}
}
kDebug ( ) < < " update groups " ;
updateGroups ( ) ;
}
void KU_MainView : : grpadd ( )
{
setCurrentIndex ( 1 ) ;
gid_t gid ;
if ( ( gid = groups - > first_free ( ) ) = = KU_Groups : : NO_FREE )
{
KMessageBox : : sorry ( 0 , i18n ( " You have run out of gid space. " ) ) ;
return ;
}
/*
if ( samba & & ( rid = KU_Global : : getGroups ( ) . first_free_sam ( ) ) = = 0 )
{
KMessageBox : : sorry ( 0 , i18n ( " You have run out of group RID space. " ) ) ;
return ;
}
*/
KU_Group group ;
group . setGID ( gid ) ;
KU_EditGroup egdlg ( group , true ) ;
if ( egdlg . exec ( ) = = QDialog : : Rejected ) {
return ;
}
groups - > add ( egdlg . getGroup ( ) ) ;
updateGroups ( ) ;
}
void KU_MainView : : grpedit ( )
{
QModelIndex currentindex = groupview - > selectionModel ( ) - > currentIndex ( ) ;
if ( ! currentindex . isValid ( ) ) return ;
int index = groupproxymodel . mapToSource ( currentindex ) . row ( ) ;
kDebug ( ) < < " selected index: " < < index ;
KU_Group group = groups - > at ( index ) ;
KU_EditGroup egdlg ( group , false ) ;
if ( egdlg . exec ( ) = = QDialog : : Accepted ) {
groups - > mod ( index , egdlg . getGroup ( ) ) ;
updateGroups ( ) ;
}
}
void KU_MainView : : grpdel ( )
{
QList < int > selected ;
QModelIndexList selectedindexes = groupview - > selectionModel ( ) - > selectedIndexes ( ) ;
foreach ( const QModelIndex & selectedindex , selectedindexes ) {
if ( selectedindex . column ( ) = = 0 )
selected . append ( groupproxymodel . mapToSource ( selectedindex ) . row ( ) ) ;
}
if ( selected . isEmpty ( ) ) return ;
KU_Group group ;
int index ;
for ( index = 0 ; index < selected . count ( ) ; index + + ) {
group = groups - > at ( selected . at ( index ) ) ;
KU_Users : : const_iterator it = users - > constBegin ( ) ;
while ( it ! = users - > constEnd ( ) ) {
if ( it - > 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. " , group . getName ( ) , it - > getName ( ) ) ) ;
return ;
}
+ + it ;
}
}
if ( selected . count ( ) = = 1 ) {
if ( KMessageBox : : warningContinueCancel ( 0 ,
i18n ( " Do you really want to delete the group '%1'? " , group . getName ( ) ) ,
QString ( ) , KStandardGuiItem : : del ( ) ) ! = KMessageBox : : Continue ) return ;
} else {
if ( KMessageBox : : warningContinueCancel ( 0 ,
i18n ( " Do you really want to delete the %1 selected groups? " , selected . count ( ) ) ,
QString ( ) , KStandardGuiItem : : del ( ) ) ! = KMessageBox : : Continue ) return ;
}
for ( index = 0 ; index < selected . count ( ) ; index + + ) {
groups - > del ( selected . at ( index ) ) ;
}
updateGroups ( ) ;
}
bool KU_MainView : : updateUsers ( )
{
bool ret ;
kDebug ( ) < < " updateUsers() " ;
ret = users - > dbcommit ( ) ;
if ( ! ret ) {
KU_Global : : displayUsersError ( ) ;
}
usermodel - > commitMod ( ) ;
usermodel - > commitDel ( ) ;
usermodel - > commitAdd ( ) ;
users - > cancelMods ( ) ;
return ret ;
}
bool KU_MainView : : updateGroups ( )
{
bool ret ;
kDebug ( ) < < " updateGroups() " ;
ret = groups - > dbcommit ( ) ;
if ( ! ret ) {
KU_Global : : displayGroupsError ( ) ;
}
groupmodel - > commitMod ( ) ;
groupmodel - > commitDel ( ) ;
groupmodel - > commitAdd ( ) ;
groups - > cancelMods ( ) ;
return ret ;
}
2015-02-27 11:02:43 +00:00
# include "moc_ku_mainview.cpp"