diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/AdminPanel/Module/Users.pm | 384 | ||||
-rw-r--r-- | lib/AdminPanel/Shared.pm | 29 | ||||
-rw-r--r-- | lib/AdminPanel/Shared/Users.pm | 532 |
3 files changed, 685 insertions, 260 deletions
diff --git a/lib/AdminPanel/Module/Users.pm b/lib/AdminPanel/Module/Users.pm index 81ee1f41..a3210ef2 100644 --- a/lib/AdminPanel/Module/Users.pm +++ b/lib/AdminPanel/Module/Users.pm @@ -72,8 +72,6 @@ use POSIX qw(ceil); use Config::Auto; use File::ShareDir ':ALL'; -## USER is from userdrake -use USER; use utf8; use Sys::Syslog; use Glib; @@ -125,20 +123,6 @@ has 'action_menu' => ( init_arg => undef, ); -## Used by USER (for getting values? TODO need explanations, where?) -has 'USER_GetValue' => ( - default => -65533, - is => 'ro', - isa => 'Int', - init_arg => undef, -); - -## Used by USER (for getting values? TODO need explanations, where?) -has 'ctx' => ( - is => 'ro', - init_arg => undef, - builder => '_USERInitialize', -); ## min UID was 500 now is 1000, let's change in a single point has 'min_UID' => ( @@ -148,17 +132,6 @@ has 'min_UID' => ( init_arg => undef, ); -sub _USERInitialize { - my $self = shift; - - # $EUID: effective user identifier - if ($EUID == 0) { - return USER::ADMIN->new; - } - - return undef; -} - has 'edit_tab_widgets' => ( traits => ['Hash'], default => sub { {} }, @@ -400,33 +373,6 @@ sub ChooseGroup { #============================================================= -=head2 _updateOrDelUsersInGroup - -=head3 INPUT - - $name: username - -=head3 DESCRIPTION - - Fixes user deletion into groups. - -=cut - -#============================================================= -sub _updateOrDelUserInGroup { - my ($self, $name) = @_; - my $groups = $self->ctx->GroupsEnumerateFull; - foreach my $g (@$groups) { - my $members = $g->MemberName(1, 0); - if ($self->_inArray($name, $members)) { - eval { $g->MemberName($name, 2) }; - eval { $self->ctx->GroupModify($g) }; - } - } -} - -#============================================================= - =head2 _deleteGroupDialog =head3 INPUT @@ -483,21 +429,18 @@ sub _deleteGroupDialog { last; } elsif ($widget == $deleteButton) { - my $groupEnt = $self->ctx->LookupGroupByName($groupname); - my $members = $self->ctx->EnumerateUsersByGroup($groupname); - my $continue = 1; - GLOOP: foreach my $username (@$members) { - my $userEnt = $self->ctx->LookupUserByName($username); - if ($userEnt && $userEnt->Gid($self->USER_GetValue) == $groupEnt->Gid($self->USER_GetValue)) { - $self->sh_gui->msgBox({text => $self->loc->N("%s is a primary group for user %s\n Remove the user first", - $groupname, $username)}); - $continue = 0; - last GLOOP; - } + my $username = $self->sh_users->isPrimaryGroup($groupname); + if (defined($username)) { + $self->sh_gui->msgBox({ + text => $self->loc->N("%s is a primary group for user %s\n Remove the user first", + $groupname, $username + ) + }); } - if ($continue) { - Sys::Syslog::syslog('info|local1', $self->loc->N("Removing group: %s", $groupname)); - eval { $self->ctx->GroupDel($groupEnt) }; + else { + if ($self->sh_users->deleteGroup($groupname)) { + Sys::Syslog::syslog('info|local1', $self->loc->N("Removing group: %s", $groupname)); + } $self->_refresh(); } last; @@ -536,8 +479,9 @@ sub _deleteUserDialog { } my $username = $item->label(); - my $userEnt = $self->ctx->LookupUserByName($username); - my $homedir = $userEnt->HomeDir($self->USER_GetValue); + my $homedir = $self->sh_users->getUserHome($username); + return if !defined($homedir); + ## push application title my $appTitle = yui::YUI::app()->applicationTitle(); @@ -583,25 +527,13 @@ sub _deleteUserDialog { } elsif ($widget == $deleteButton) { Sys::Syslog::syslog('info|local1', $self->loc->N("Removing user: %s", $username)); - $self->ctx->UserDel($userEnt); - $self->_updateOrDelUserInGroup($username); - #Let's check out the user's primary group - my $usergid = $userEnt->Gid($self->USER_GetValue); - my $groupEnt = $self->ctx->LookupGroupById($usergid); - if ($groupEnt) { - my $member = $groupEnt->MemberName(1, 0); - if (scalar(@$member) == 0 && $groupEnt->Gid($self->USER_GetValue) > 499) { - $self->ctx->GroupDel($groupEnt); - } - } - if ($checkhome->isChecked()) { - eval { $self->ctx->CleanHome($userEnt) }; - $@ and $self->sh_gui->msgBox({text => $@}) and last; - } - if ($checkspool->isChecked()) { - eval { $self->ctx->CleanSpool($userEnt) }; - $@ and $self->sh_gui->msgBox({text => $@}) and last; - } + my $option = undef; + $option->{clean_home} = $checkhome->isChecked() if $checkhome->isChecked(); + $option->{clean_spool} = $checkspool->isChecked() if $checkspool->isChecked(); + + my $err = $self->sh_users->deleteUser($username, $option); + $self->sh_gui->msgBox({text => $err}) if (defined($err)); + #remove added icon $self->sh_users->removeKdmIcon($username); $self->_refresh(); @@ -678,31 +610,26 @@ sub _addGroupDialog { ## check data my $groupname = $groupName->value(); my ($continue, $errorString) = $self->sh_users->valid_groupname($groupname); - my $nm = $continue && $self->ctx->LookupGroupByName($groupname); + my $nm = $continue && $self->sh_users->groupNameExist($groupname); if ($nm) { $groupName->setValue(""); $errorString = $self->loc->N("Group already exists, please choose another Group Name"); $continue = 0; } - my $groupEnt = $self->ctx->InitGroup($groupname, $is_system); - + my $gid = 0; if ($continue && $gidManually->value()) { if (($gid = $GID->value()) < 500) { $errorString = ""; my $gidchoice = $self->sh_gui->ask_YesOrNo({ title => $self->loc->N(" Group Gid is < 500"), text => $self->loc->N("Creating a group with a GID less than 500 is not recommended.\n Are you sure you want to do this?\n\n")}); - $continue = $gidchoice and $groupEnt->Gid($gid); - } else { - my $g = $self->ctx->LookupGroupById($gid); - if ($g) { + $continue = $gidchoice; + } else { + if ($self->sh_users->groupIDExists($gid)) { $errorString = ""; my $gidchoice = $self->sh_gui->ask_YesOrNo({title => $self->loc->N(" Group ID is already used "), text => $self->loc->N("Creating a group with a non unique GID?\n\n")}); - $continue = $gidchoice and $groupEnt->Gid($gid); - } - else { - $groupEnt and $groupEnt->Gid($gid); + $continue = $gidchoice; } } } @@ -714,7 +641,11 @@ sub _addGroupDialog { } else { Sys::Syslog::syslog('info|local1', $self->loc->N("Adding group: %s ", $groupname)); - $self->ctx->GroupAdd($groupEnt); + $self->sh_users->addGroup({ + groupname => $groupname, + gid => $gid, + is_system => $is_system, + }); $self->_refresh(); last; } @@ -757,7 +688,7 @@ sub _buildUserData { my ($self, $layout, $selected_shell) = @_; - my @shells = @{$self->ctx->GetUserShells}; + my @shells = @{$self->sh_users->getUserShells()}; my $factory = yui::YUI::widgetFactory; @@ -971,7 +902,7 @@ sub addUserDialog { ## check data my $username = $userData{ login_name }->value(); my ($continue, $errorString) = $self->sh_users->valid_username($username); - my $nm = $continue && $self->ctx->LookupUserByName($username); + my $nm = $continue && $self->sh_users->userNameExists($username); if ($nm) { $userData{ login_name }->setValue(""); $homeDir->setValue(""); @@ -987,46 +918,42 @@ sub addUserDialog { $errorString = $self->loc->N("This password is too simple. \n Good passwords should be > 6 characters"); $continue = 0; } - my $userEnt = $continue && $self->ctx->InitUser($username, $is_system); + my $homedir; if ($continue && $createHome->value()) { - my $homedir = $homeDir->value(); + $homedir = $homeDir->value(); if ( -d $homedir) { $errorString = $self->loc->N("Home directory <%s> already exists.\nPlease uncheck the home creation option, or change the directory path name", $homedir); $continue = 0; } else { $dontcreatehomedir = 0; - $userEnt and $userEnt->HomeDir($homedir); } } else { $dontcreatehomedir = 1; } - my $uid = 0; + my $uid = -1; if ($continue && $uidManually->value()) { if (($uid = $UID->value()) < $self->min_UID) { $errorString = ""; my $uidchoice = $self->sh_gui->ask_YesOrNo({title => $self->loc->N("User Uid is < %d", $self->min_UID), text => $self->loc->N("Creating a user with a UID less than %d is not recommended.\nAre you sure you want to do this?\n\n", $self->min_UID)}); - $continue = $uidchoice and $userEnt->Uid($uid); - } else { - $userEnt and $userEnt->Uid($uid); + $continue = $uidchoice; } } - my $gid = 0; + my $gid = undef; if ($createGroup->value()) { if ($continue) { #Check if group exist - my $gr = $self->ctx->LookupGroupByName($username); - if ($gr) { + if ($self->sh_users->groupNameExists($username)) { my $groupchoice = $self->ChooseGroup(); if ($groupchoice == 0 ) { #You choose to put it in the existing group - $gid = $gr->Gid($self->USER_GetValue); + $gid = $self->sh_users->groupID($username); } elsif ($groupchoice == 1) { # Put it in 'users' group Sys::Syslog::syslog('info|local1', $self->loc->N("Putting %s to 'users' group", $username)); - $gid = $self->sh_users->Add2UsersGroup($username, $self->ctx); + $gid = $self->sh_users->Add2UsersGroup($username); } else { $errorString = ""; @@ -1034,14 +961,15 @@ sub addUserDialog { } } else { #it's a new group: Add it - my $newgroup = $self->ctx->InitGroup($username,$is_system); + $gid = $self->sh_users->addGroup({ + groupname => $username, + is_system => $is_system, + }); Sys::Syslog::syslog('info|local1', $self->loc->N("Creating new group: %s", $username)); - $gid = $newgroup->Gid($self->USER_GetValue); - $self->ctx->GroupAdd($newgroup); } } } else { - $continue and $gid = $self->sh_users->Add2UsersGroup($username, $self->ctx); + $continue and $gid = $self->sh_users->Add2UsersGroup($username); } if (!$continue) { @@ -1055,12 +983,20 @@ sub addUserDialog { my $loginshell = $userData{ login_shell }->value(); my $fullname = $userData{ full_name }->value(); utf8::decode($fullname); - $userEnt->Gecos($fullname); $userEnt->LoginShell($loginshell); - $userEnt->Gid($gid); - $userEnt->ShadowMin(-1); $userEnt->ShadowMax(99999); - $userEnt->ShadowWarn(-1); $userEnt->ShadowInact(-1); - $self->ctx->UserAdd($userEnt, $is_system, $dontcreatehomedir); - $self->ctx->UserSetPass($userEnt, $passwd); + + my $userParams = { + username => $username, + is_system => $is_system, + donotcreatehome => $dontcreatehomedir, + shell => $loginshell, + fullname => $fullname, + gid => $gid, + password => $passwd, + }; + $userParams->{uid} = $uid if $uid != -1; + $userParams->{homedir} = $homedir if !$dontcreatehomedir; + $self->sh_users->addUser($userParams); + defined $icon->label() and $self->sh_users->addKdmIcon($username, $icon->label()); ### TODO Migration wizard @@ -1171,34 +1107,7 @@ sub _createGroupTable { } -#============================================================= - -=head2 _computeLockExpire -=head3 INPUT - - $l: login user info - -=head3 OUTPUT - - $status: Locked, Expired, or empty string - -=head3 DESCRIPTION - - This method returns if the login is Locked, Expired or ok. - Note this function is meant for internal use only - -=cut - -#============================================================= -sub _computeLockExpire { - my ( $self, $l ) = @_; - my $ep = $l->ShadowExpire($self->USER_GetValue); - my $tm = ceil(time()/(24*60*60)); - $ep = -1 if int($tm) <= $ep; - my $status = $self->ctx->IsLocked($l) ? $self->loc->N("Locked") : ($ep != -1 ? $self->loc->N("Expired") : ''); - $status; -} #============================================================= @@ -1223,7 +1132,7 @@ sub _refreshUsers { my $filterusers = $self->get_widget('filter_system')->isChecked(); my ($users, $group, $groupnm, $expr); - defined $self->ctx and $users = $self->ctx->UsersEnumerateFull; + defined $self->sh_users->ctx and $users = $self->sh_users->ctx->UsersEnumerateFull; $self->dialog->startMultipleChanges(); #for some reasons QT send an event using table->selectItem() @@ -1233,31 +1142,31 @@ sub _refreshUsers { my @UserReal; LOOP: foreach my $l (@$users) { - next LOOP if $filterusers && $l->Uid($self->USER_GetValue) <= 499 || $l->Uid($self->USER_GetValue) == 65534; - next LOOP if $filterusers && $l->Uid($self->USER_GetValue) > 499 && $l->Uid($self->USER_GetValue) < $self->min_UID && - ($l->HomeDir($self->USER_GetValue) =~ /^\/($|var\/|run\/)/ || $l->LoginShell($self->USER_GetValue) =~ /(nologin|false)$/); - push @UserReal, $l if $l->UserName($self->USER_GetValue) =~ /^\Q$strfilt/; + next LOOP if $filterusers && $l->Uid($self->sh_users->USER_GetValue) <= 499 || $l->Uid($self->sh_users->USER_GetValue) == 65534; + next LOOP if $filterusers && $l->Uid($self->sh_users->USER_GetValue) > 499 && $l->Uid($self->sh_users->USER_GetValue) < $self->min_UID && + ($l->HomeDir($self->sh_users->USER_GetValue) =~ /^\/($|var\/|run\/)/ || $l->LoginShell($self->sh_users->USER_GetValue) =~ /(nologin|false)$/); + push @UserReal, $l if $l->UserName($self->sh_users->USER_GetValue) =~ /^\Q$strfilt/; } my $i; my $itemColl = new yui::YItemCollection; foreach my $l (@UserReal) { $i++; - my $uid = $l->Uid($self->USER_GetValue); + my $uid = $l->Uid($self->sh_users->USER_GetValue); if (!defined $uid) { warn "bogus user at line $i\n"; next; } - my $a = $l->Gid($self->USER_GetValue); - $group = $self->ctx->LookupGroupById($a); + my $a = $l->Gid($self->sh_users->USER_GetValue); + $group = $self->sh_users->ctx->LookupGroupById($a); $groupnm = ''; - $expr = $self->_computeLockExpire($l); - $group and $groupnm = $group->GroupName($self->USER_GetValue); - my $fulln = $l->Gecos($self->USER_GetValue); + $expr = $self->sh_users->computeLockExpire($l); + $group and $groupnm = $group->GroupName($self->sh_users->USER_GetValue); + my $fulln = $l->Gecos($self->sh_users->USER_GetValue); utf8::decode($fulln); - my $username = $l->UserName($self->USER_GetValue); - my $Uid = $l->Uid($self->USER_GetValue); - my $shell = $l->LoginShell($self->USER_GetValue); - my $homedir = $l->HomeDir($self->USER_GetValue); + my $username = $l->UserName($self->sh_users->USER_GetValue); + my $Uid = $l->Uid($self->sh_users->USER_GetValue); + my $shell = $l->LoginShell($self->sh_users->USER_GetValue); + my $homedir = $l->HomeDir($self->sh_users->USER_GetValue); my $item = new yui::YTableItem ("$username", "$Uid", "$groupnm", @@ -1303,7 +1212,7 @@ sub _refreshGroups { my $filtergroups = $self->get_widget('filter_system')->isChecked(); my $groups; - defined $self->ctx and $groups = $self->ctx->GroupsEnumerateFull; + defined $self->sh_users->ctx and $groups = $self->sh_users->ctx->GroupsEnumerateFull; $self->dialog->startMultipleChanges(); #for some reasons QT send an event using table->selectItem() @@ -1312,18 +1221,18 @@ sub _refreshGroups { $self->get_widget('table')->deleteAllItems(); my @GroupReal; LOOP: foreach my $g (@$groups) { - next LOOP if $filtergroups && $g->Gid($self->USER_GetValue) <= 499 || $g->Gid($self->USER_GetValue) == 65534; - push @GroupReal, $g if $g->GroupName($self->USER_GetValue) =~ /^\Q$strfilt/; + next LOOP if $filtergroups && $g->Gid($self->sh_users->USER_GetValue) <= 499 || $g->Gid($self->sh_users->USER_GetValue) == 65534; + push @GroupReal, $g if $g->GroupName($self->sh_users->USER_GetValue) =~ /^\Q$strfilt/; } my $itemColl = new yui::YItemCollection; foreach my $g (@GroupReal) { - my $a = $g->GroupName($self->USER_GetValue); + my $a = $g->GroupName($self->sh_users->USER_GetValue); #my $group = $ctx->LookupGroupById($a); - my $u_b_g = $a && $self->ctx->EnumerateUsersByGroup($a); + my $u_b_g = $a && $self->sh_users->ctx->EnumerateUsersByGroup($a); my $listUbyG = join(',', @$u_b_g); - my $group_id = $g->Gid($self->USER_GetValue); - my $groupname = $g->GroupName($self->USER_GetValue); + my $group_id = $g->Gid($self->sh_users->USER_GetValue); + my $groupname = $g->GroupName($self->sh_users->USER_GetValue); my $item = new yui::YTableItem ("$groupname", "$group_id", "$listUbyG"); @@ -1402,14 +1311,14 @@ sub _getUserInfo { my %userData; $userData{username} = $item->label(); - my $userEnt = $self->ctx->LookupUserByName($userData{username}); + my $userEnt = $self->sh_users->ctx->LookupUserByName($userData{username}); - my $s = $userEnt->Gecos($self->USER_GetValue); + my $s = $userEnt->Gecos($self->sh_users->USER_GetValue); utf8::decode($s); $userData{full_name} = $s; - $userData{shell} = $userEnt->LoginShell($self->USER_GetValue); - $userData{homedir} = $userEnt->HomeDir($self->USER_GetValue); - $userData{UID} = $userEnt->Uid($self->USER_GetValue); + $userData{shell} = $userEnt->LoginShell($self->sh_users->USER_GetValue); + $userData{homedir} = $userEnt->HomeDir($self->sh_users->USER_GetValue); + $userData{UID} = $userEnt->Uid($self->sh_users->USER_GetValue); # default expiration time my ($day, $mo, $ye) = (localtime())[3, 4, 5]; @@ -1417,7 +1326,7 @@ sub _getUserInfo { $userData{acc_expm} = $mo+1; $userData{acc_expd} = $day; $userData{acc_check_exp} = 0; - my $expire = $userEnt->ShadowExpire($self->USER_GetValue); + my $expire = $userEnt->ShadowExpire($self->sh_users->USER_GetValue); if ($expire && $expire != -1) { my $times = _TimeOfArray($expire, 1); $userData{acc_expy} = $times->{year}; @@ -1432,14 +1341,14 @@ sub _getUserInfo { $userData{password1} = undef; # Check if user account is locked - $userData{lockuser} = $self->ctx->IsLocked($userEnt); + $userData{lockuser} = $self->sh_users->ctx->IsLocked($userEnt); $userData{icon_face} = $self->sh_users->GetFaceIcon($userData{username}); $userData{pwd_check_exp} = 0; - $userData{pwd_exp_min} = $userEnt->ShadowMin($self->USER_GetValue); - $userData{pwd_exp_max} = $userEnt->ShadowMax($self->USER_GetValue); - $userData{pwd_exp_warn} = $userEnt->ShadowWarn($self->USER_GetValue); - $userData{pwd_exp_inact} = $userEnt->ShadowInact($self->USER_GetValue); + $userData{pwd_exp_min} = $userEnt->ShadowMin($self->sh_users->USER_GetValue); + $userData{pwd_exp_max} = $userEnt->ShadowMax($self->sh_users->USER_GetValue); + $userData{pwd_exp_warn} = $userEnt->ShadowWarn($self->sh_users->USER_GetValue); + $userData{pwd_exp_inact} = $userEnt->ShadowInact($self->sh_users->USER_GetValue); if ($userData{pwd_exp_min} && $userData{pwd_exp_min} != -1 || $userData{pwd_exp_max} && $userData{pwd_exp_max} != 99999 || @@ -1448,8 +1357,8 @@ sub _getUserInfo { $userData{pwd_check_exp} = 1; } - $userData{members} = $self->ctx->EnumerateGroupsByUser($userData{username}); - $userData{primary_group} = $userEnt->Gid($self->USER_GetValue); + $userData{members} = $self->sh_users->ctx->EnumerateGroupsByUser($userData{username}); + $userData{primary_group} = $userEnt->Gid($self->sh_users->USER_GetValue); return %userData; @@ -1494,8 +1403,8 @@ sub _getGroupInfo { $groupData{start_groupname} = $item->label(); $groupData{groupname} = $item->label(); - my $groupEnt = $self->ctx->LookupGroupByName($groupData{groupname}); - $groupData{members} = $self->ctx->EnumerateUsersByGroup($groupData{groupname}); + my $groupEnt = $self->sh_users->ctx->LookupGroupByName($groupData{groupname}); + $groupData{members} = $self->sh_users->ctx->EnumerateUsersByGroup($groupData{groupname}); return %groupData; @@ -1569,8 +1478,8 @@ sub _storeDataFromUserEditPreviousTab { $userData{members} = [ @members ]; if ($self->get_edit_tab_widget('primary_group')->selectedItem()) { - my $Gent = $self->ctx->LookupGroupByName($self->get_edit_tab_widget('primary_group')->selectedItem()->label()); - my $primgroup = $Gent->Gid($self->USER_GetValue); + my $Gent = $self->sh_users->ctx->LookupGroupByName($self->get_edit_tab_widget('primary_group')->selectedItem()->label()); + my $primgroup = $Gent->Gid($self->sh_users->USER_GetValue); $userData{primary_group} = $primgroup; } @@ -1766,8 +1675,8 @@ sub _userPasswordInfoTabWidget { my $layout = $factory->createVBox($replace_pnt); my %userPasswordWidget; - my $userEnt = $self->ctx->LookupUserByName($userData{username}); - my $lastchg = $userEnt->ShadowLastChange($self->USER_GetValue); + my $userEnt = $self->sh_users->ctx->LookupUserByName($userData{username}); + my $lastchg = $userEnt->ShadowLastChange($self->sh_users->USER_GetValue); my $align = $factory->createLeft($layout); my $hbox = $factory->createHBox($align); @@ -1849,8 +1758,8 @@ sub _groupUsersTabWidget { $groupUsersWidget{members} = $mgaFactory->createCBTable($layout, $yTableHeader, $yui::YCBTableCheckBoxOnFirstColumn); - my $groupEnt = $self->ctx->LookupGroupByName($groupData{groupname}); - my $users = $self->ctx->UsersEnumerate; + my $groupEnt = $self->sh_users->ctx->LookupGroupByName($groupData{groupname}); + my $users = $self->sh_users->ctx->UsersEnumerate; my @susers = sort(@$users); my $itemCollection = new yui::YItemCollection; @@ -1884,8 +1793,8 @@ sub _userGroupsTabWidget { $replace_pnt->deleteChildren(); my %userGroupsWidget; - my $userEnt = $self->ctx->LookupUserByName($userData{username}); - my $lastchg = $userEnt->ShadowLastChange($self->USER_GetValue); + my $userEnt = $self->sh_users->ctx->LookupUserByName($userData{username}); + my $lastchg = $userEnt->ShadowLastChange($self->sh_users->USER_GetValue); my $layout = _labeledFrameBox($replace_pnt, $self->loc->N("Select groups that the user will be member of:")); @@ -1895,7 +1804,7 @@ sub _userGroupsTabWidget { $userGroupsWidget{members} = $mgaFactory->createCBTable($layout, $yTableHeader, $yui::YCBTableCheckBoxOnFirstColumn); - my $grps = $self->ctx->GroupsEnumerate; + my $grps = $self->sh_users->ctx->GroupsEnumerate; my @sgroups = sort @$grps; my $itemCollection = new yui::YItemCollection; @@ -1911,8 +1820,8 @@ sub _userGroupsTabWidget { $userGroupsWidget{members}->setNotify(1); my $primgroup = ''; if ($userData{primary_group} != -1) { - my $Gent = $self->ctx->LookupGroupById($userData{primary_group}); - $primgroup = $Gent->GroupName($self->USER_GetValue); + my $Gent = $self->sh_users->ctx->LookupGroupById($userData{primary_group}); + $primgroup = $Gent->GroupName($self->sh_users->USER_GetValue); } my $align = $factory->createLeft($layout); @@ -1948,30 +1857,30 @@ sub _groupEdit_Ok { $self->sh_gui->msgBox({text => $errorString}) if ($errorString); return $continue; } - my $groupEnt = $self->ctx->LookupGroupByName($groupData{start_groupname}); + my $groupEnt = $self->sh_users->ctx->LookupGroupByName($groupData{start_groupname}); if ($groupData{start_groupname} ne $groupData{groupname}) { $groupEnt->GroupName($groupData{groupname}); } my $members = $groupData{members}; - my $gid = $groupEnt->Gid($self->USER_GetValue); - my $users = $self->ctx->UsersEnumerate; + my $gid = $groupEnt->Gid($self->sh_users->USER_GetValue); + my $users = $self->sh_users->ctx->UsersEnumerate; my @susers = sort(@$users); foreach my $user (@susers) { - my $uEnt = $self->ctx->LookupGroupByName($user); + my $uEnt = $self->sh_users->ctx->LookupGroupByName($user); if ($uEnt) { - my $ugid = $uEnt->Gid($self->USER_GetValue); - my $m = $self->ctx->EnumerateUsersByGroup($groupData{start_groupname}); + my $ugid = $uEnt->Gid($self->sh_users->USER_GetValue); + my $m = $self->sh_users->ctx->EnumerateUsersByGroup($groupData{start_groupname}); if (MDK::Common::DataStructure::member($user, @$members)) { - if (!$self->_inArray($user, $m)) { + if (!AdminPanel::Shared::inArray($user, $m)) { if ($ugid != $gid) { eval { $groupEnt->MemberName($user,1) }; } } } else { - if ($self->_inArray($user, $m)) { + if (AdminPanel::Shared::inArray($user, $m)) { if ($ugid == $gid) { $self->sh_gui->msgBox({text => $self->loc->N("You cannot remove user '%s' from their primary group", $user)}); return 0; @@ -1984,7 +1893,7 @@ sub _groupEdit_Ok { } } - $self->ctx->GroupModify($groupEnt); + $self->sh_users->ctx->GroupModify($groupEnt); $self->_refresh(); return 1; @@ -2006,39 +1915,39 @@ sub _userEdit_Ok { $self->sh_gui->msgBox({text => $self->loc->N("Password Mismatch")}); return 0; } - my $userEnt = $self->ctx->LookupUserByName($userData{username}); + my $userEnt = $self->sh_users->ctx->LookupUserByName($userData{username}); if ($userData{password} ne '') { if ($self->sh_users->weakPasswordForSecurityLevel($userData{password})) { $self->sh_gui->msgBox({text => $self->loc->N("This password is too simple. \n Good passwords should be > 6 characters")}); return 0; } - $self->ctx->UserSetPass($userEnt, $userData{password}); + $self->sh_users->ctx->UserSetPass($userEnt, $userData{password}); } $userEnt->UserName($userData{username}); $userEnt->Gecos($userData{full_name}); $userEnt->HomeDir($userData{homedir}); $userEnt->LoginShell($userData{shell}); - my $username = $userEnt->UserName($self->USER_GetValue); - my $grps = $self->ctx->GroupsEnumerate; + my $username = $userEnt->UserName($self->sh_users->USER_GetValue); + my $grps = $self->sh_users->ctx->GroupsEnumerate; my @sgroups = sort @$grps; my $members = $userData{members}; foreach my $group (@sgroups) { - my $gEnt = $self->ctx->LookupGroupByName($group); - my $ugid = $gEnt->Gid($self->USER_GetValue); + my $gEnt = $self->sh_users->ctx->LookupGroupByName($group); + my $ugid = $gEnt->Gid($self->sh_users->USER_GetValue); my $m = $gEnt->MemberName(1,0); if (MDK::Common::DataStructure::member($group, @$members)) { - if (!$self->_inArray($username, $m) && $userData{primary_group} != $ugid) { + if (!AdminPanel::Shared::inArray($username, $m) && $userData{primary_group} != $ugid) { eval { $gEnt->MemberName($username, 1) }; - $self->ctx->GroupModify($gEnt); + $self->sh_users->ctx->GroupModify($gEnt); } } else { - if ($self->_inArray($username, $m)) { + if (AdminPanel::Shared::inArray($username, $m)) { eval { $gEnt->MemberName($username, 2) }; - $self->ctx->GroupModify($gEnt); + $self->sh_users->ctx->GroupModify($gEnt); } } } @@ -2086,13 +1995,13 @@ sub _userEdit_Ok { $userEnt->ShadowInact(-1); } - $self->ctx->UserModify($userEnt); + $self->sh_users->ctx->UserModify($userEnt); if ($userData{lockuser}) { - !$self->ctx->IsLocked($userEnt) and $self->ctx->Lock($userEnt); + !$self->sh_users->ctx->IsLocked($userEnt) and $self->sh_users->ctx->Lock($userEnt); } else { - $self->ctx->IsLocked($userEnt) and $self->ctx->UnLock($userEnt); + $self->sh_users->ctx->IsLocked($userEnt) and $self->sh_users->ctx->UnLock($userEnt); } defined $userData{icon_face} and $self->sh_users->addKdmIcon($userData{username}, $userData{icon_face}); @@ -2261,8 +2170,8 @@ sub _editUserDialog { for(my $i=0;$i < $tbl->itemsCount();$i++) { if ($tbl->toCBYTableItem($tbl->item($i))->checked()) { my $pgItem = new yui::YItem ($tbl->item($i)->label(), 0); - my $Gent = $self->ctx->LookupGroupById($userData{primary_group}); - my $primgroup = $Gent->GroupName($self->USER_GetValue); + my $Gent = $self->sh_users->ctx->LookupGroupById($userData{primary_group}); + my $primgroup = $Gent->GroupName($self->sh_users->USER_GetValue); $pgItem->setSelected(1) if ($pgItem->label() eq $primgroup); $itemColl->push($pgItem); @@ -2747,33 +2656,6 @@ sub _skipShortcut { return ($label); } -#============================================================= - -=head2 _inArray - -=head3 INPUT - - $self: this object - $item: item to search - $arr: array container - -=head3 OUTPUT - - true: if the array contains the item - -=head3 DESCRIPTION - -This method returns if an item is into the array container - -=cut - -#============================================================= -sub _inArray { - my ($self, $item, $arr) = @_; - - return grep( /^$item$/, @$arr ); -} - sub _ValidInt { foreach my $i (@_) { $i =~ /\d+/ or return 0 } diff --git a/lib/AdminPanel/Shared.pm b/lib/AdminPanel/Shared.pm index b6c8fe15..51039970 100644 --- a/lib/AdminPanel/Shared.pm +++ b/lib/AdminPanel/Shared.pm @@ -89,6 +89,9 @@ our @EXPORT = qw( distName apcat find + inArray + disable_x_screensaver + enable_x_screensaver ); @@ -214,6 +217,32 @@ sub trim { return $st; } +#============================================================= + +=head2 inArray + +=head3 INPUT + + $self: this object + $item: item to search + $arr: array container + +=head3 OUTPUT + + true: if the array contains the item + +=head3 DESCRIPTION + +This method returns if an item is into the array container + +=cut + +#============================================================= +sub inArray { + my ($self, $item, $arr) = @_; + + return grep( /^$item$/, @{$arr} ); +} #============================================================= diff --git a/lib/AdminPanel/Shared/Users.pm b/lib/AdminPanel/Shared/Users.pm index 8797e848..cd253bd9 100644 --- a/lib/AdminPanel/Shared/Users.pm +++ b/lib/AdminPanel/Shared/Users.pm @@ -51,8 +51,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA =cut - - use diagnostics; use strict; @@ -63,6 +61,11 @@ use File::Basename; use File::Copy; use File::Remove 'remove'; +## USER is from userdrake +use USER; +use English; +use POSIX qw/ceil/; + use AdminPanel::Shared::Locales; use AdminPanel::Shared; @@ -121,6 +124,32 @@ sub _localeInitialize { # TODO if we want to give the opportunity to test locally add dir_name => 'path' } +## Used by USER (for getting values? TODO need explanations, where?) +has 'USER_GetValue' => ( + default => -65533, + is => 'ro', + isa => 'Int', + init_arg => undef, +); + +## Used by USER (for getting values? TODO need explanations, where?) +has 'ctx' => ( + is => 'ro', + init_arg => undef, + builder => '_USERInitialize', +); + +sub _USERInitialize { + my $self = shift; + + # $EUID: effective user identifier + if ($EUID == 0) { + return USER::ADMIN->new; + } + + return undef; +} + #============================================================= @@ -238,13 +267,13 @@ sub face2png { #============================================================= -sub facenames() { +sub facenames { my $self = shift; my $dir = $self->face_dir; my @files = io->dir($dir)->all_files; my @l = grep { /^[A-Z]/ } @files; - my @namelist = map { my $f =fileparse($_->filename, qr/\Q.png\E/) } (@l ? @l : @files); + my @namelist = map { my $f = fileparse($_->filename, qr/\Q.png\E/) } (@l ? @l : @files); return \@namelist; } @@ -400,6 +429,493 @@ sub valid_groupname { #============================================================= +=head2 updateOrDelUsersInGroup + +=head3 INPUT + + $name: username + +=head3 DESCRIPTION + + Fixes user deletion into groups. + +=cut + +#============================================================= +sub updateOrDelUserInGroup { + my ($self, $name) = @_; + my $groups = $self->ctx->GroupsEnumerateFull; + foreach my $g (@$groups) { + my $members = $g->MemberName(1, 0); + if (AdminPanel::Shared::inArray($name, $members)) { + eval { $g->MemberName($name, 2) }; + eval { $self->ctx->GroupModify($g) }; + } + } +} + + +#============================================================= + +=head2 groupNameExists + +=head3 INPUT + +$groupname: the name of the group to check + +=head3 OUTPUT + +if group exists + +=head3 DESCRIPTION + +This method return if a given group exists + +=cut + +#============================================================= +sub groupNameExists { + my ($self, $groupname) = @_; + + return 0 if (!defined($groupname)); + + return (defined($self->ctx->LookupGroupByName($groupname))); +} + +#============================================================= + +=head2 groupIDExists + +=head3 INPUT + +$group: the id of the group to check + +=head3 OUTPUT + +if group exists + +=head3 DESCRIPTION + +This method return if a given group exists + +=cut + +#============================================================= +sub groupIDExists { + my ($self, $group) = @_; + + return 0 if (!defined($group)); + + return (defined($self->ctx->LookupGroupById($group))); +} + + +#============================================================= + +=head2 groupID + +=head3 INPUT + +$groupname: group name + +=head3 OUTPUT + +groupid or undef + +=head3 DESCRIPTION + +This method returns the group id for the group name + +=cut + +#============================================================= +sub groupID { + my ($self, $groupname) = @_; + + my $gr = $self->ctx->LookupGroupByName($groupname); + return $gr->Gid($self->USER_GetValue) if ($gr); + + return undef; +} +#============================================================= + +=head2 addGroup + +=head3 INPUT + +$params: HASH reference containing: + groupname => name of teh group to be added + gid => group id of the group to be added + is_system => is a system group? + +=head3 OUTPUT + + $gid the actual group id + +=head3 DESCRIPTION + +This method add a group to system + +=cut + +#============================================================= + +sub addGroup { + my ($self, $params) = @_; + + my $is_system = defined($params->{is_system}) ? + $params->{is_system} : + 0; + + return -1 if !defined($params->{groupname}); + + my $groupEnt = $self->ctx->InitGroup($params->{groupname}, $is_system); + + return -1 if !defined($groupEnt); + + $groupEnt->Gid($params->{gid}) if defined($params->{gid}); + + $self->ctx->GroupAdd($groupEnt); + + return $groupEnt->Gid($self->USER_GetValue); +} + +#============================================================= + +=head2 groupMembers + +=head3 INPUT + +$groupname: The group name + +=head3 OUTPUT + +$members: ARRAY reference containing all the user belonging + to the given $groupname + +=head3 DESCRIPTION + +This method gets the group name and returns the users belonging +to it + +=cut + +#============================================================= +sub groupMembers { + my ($self, $groupname) = @_; + + return $groupname if !defined($groupname); + + my $groupEnt = $self->ctx->LookupGroupByName($groupname); + my $members = $self->ctx->EnumerateUsersByGroup($groupname); + + return $members; +} + + +#============================================================= + +=head2 isPrimaryGroup + +=head3 INPUT + +$groupname: the name of the group + +=head3 OUTPUT + +$username: undef if it is primary group or the username for + which the group is the primary one. + +=head3 DESCRIPTION + +This methods check if the given group name is primary group +for any users belonging to the group + +=cut + +#============================================================= +sub isPrimaryGroup { + my ($self, $groupname) = @_; + + return $groupname if !defined($groupname); + + my $groupEnt = $self->ctx->LookupGroupByName($groupname); + my $members = $self->ctx->EnumerateUsersByGroup($groupname); + foreach my $username (@$members) { + my $userEnt = $self->ctx->LookupUserByName($username); + if ($userEnt && $userEnt->Gid($self->USER_GetValue) == $groupEnt->Gid($self->USER_GetValue)) { + return $username; + } + } + return undef; +} + + +#============================================================= + +=head2 deleteGroup + +=head3 INPUT + +$groupname: in_par_description + +=head3 OUTPUT + +0: if error occurred +1: if removed + +=head3 DESCRIPTION + +This method remove the group from the system + +=cut + +#============================================================= +sub deleteGroup { + my ($self, $groupname) = @_; + + return 0 if !defined($groupname); + + my $groupEnt = $self->ctx->LookupGroupByName($groupname); + eval { $self->ctx->GroupDel($groupEnt) }; + return 0 if $@; + + return 1; +} + +#============================================================= + +=head2 getUserHome + +=head3 INPUT + + $username: given user name + +=head3 OUTPUT + + $homedir: user home directory + +=head3 DESCRIPTION + + This method return the home directory belonging to the given + username + +=cut + +#============================================================= +sub getUserHome { + my ($self, $username) = @_; + + return $username if !defined($username); + + my $userEnt = $self->ctx->LookupUserByName($username); + my $homedir = $userEnt->HomeDir($self->USER_GetValue); + + return $homedir; +} + +#============================================================= + +=head2 userNameExists + +=head3 INPUT + +$username: the name of the user to check + +=head3 OUTPUT + +if user exists + +=head3 DESCRIPTION + +This method return if a given user exists + +=cut + +#============================================================= +sub userNameExists { + my ($self, $username) = @_; + + return 0 if (!defined($username)); + + return (defined($self->ctx->LookupUserByName($username))); +} + +#============================================================= + +=head2 computeLockExpire + +=head3 INPUT + + $l: login user info + +=head3 OUTPUT + + $status: Locked, Expired, or empty string + +=head3 DESCRIPTION + + This method returns if the login is Locked, Expired or ok. + Note this function is meant for internal use only + +=cut + +#============================================================= +sub computeLockExpire { + my ( $self, $l ) = @_; + my $ep = $l->ShadowExpire($self->USER_GetValue); + my $tm = ceil(time()/(24*60*60)); + $ep = -1 if int($tm) <= $ep; + my $status = $self->ctx->IsLocked($l) ? $self->loc->N("Locked") : ($ep != -1 ? $self->loc->N("Expired") : ''); + $status; +} + +#============================================================= + +=head2 addUser + +=head3 INPUT + +$params: HASH reference containing: + username => name of teh user to be added + uid => user id of the username to be added + is_system => is a system user? + homedir => user home directory + donotcreatehome => do not create the home directory + shell => user shall + fullname => user full name + gid => group id for the user + shadowMin => min time password validity + shadowMax => max time password validity + shadowInact => + shadowWarn => + password => user password + +=head3 OUTPUT + + 0 if errors 1 if ok + +=head3 DESCRIPTION + +This method add a user to system + +=cut + +#============================================================= + +sub addUser { + my ($self, $params) = @_; + + return 0 if !defined($params->{username}); + + my $is_system = defined($params->{is_system}) ? + $params->{is_system} : + 0; + + my $userEnt = $self->ctx->InitUser($params->{username}, $is_system); + return 0 if !defined($userEnt); + + + $userEnt->HomeDir($params->{homedir}) if defined($params->{homedir}); + $userEnt->Uid($params->{uid}) if defined($params->{uid}); + $userEnt->Gecos($params->{fullname}) if defined($params->{fullname}); + $userEnt->LoginShell($params->{shell}) if defined($params->{shell}); + $userEnt->Gid($params->{gid}) if defined ($params->{gid}); + my $shd = defined ($params->{shadowMin}) ? $params->{shadowMin} : -1; + $userEnt->ShadowMin($shd); + $shd = defined ($params->{shadowMax}) ? $params->{shadowMax} : 99999; + $userEnt->ShadowMax($shd); + $shd = defined ($params->{shadowWarn}) ? $params->{shadowWarn} : -1; + $userEnt->ShadowWarn($shd); + $shd = defined ($params->{shadowInact}) ? $params->{shadowInact} : -1; + $userEnt->ShadowInact($shd); + $self->ctx->UserAdd($userEnt, $is_system, $params->{donotcreatehome}); + $self->ctx->UserSetPass($userEnt, $params->{password}); + + return 1; +} + + +#============================================================= + +=head2 deleteUser + +=head3 INPUT + +$username: username to be deleted +$options: HASH reference containing + clean_home => if home has to be removed + clean_spool => if sppol has to be removed + +=head3 OUTPUT + +error string or undef if no errors occurred + +=head3 DESCRIPTION + +This method delete a user from the system. + +=cut + +#============================================================= +sub deleteUser { + my ($self, $username, $options) = @_; + + return $username if !defined($username); + + my $userEnt = $self->ctx->LookupUserByName($username); + + $self->ctx->UserDel($userEnt); + $self->updateOrDelUserInGroup($username); + #Let's check out the user's primary group + my $usergid = $userEnt->Gid($self->USER_GetValue); + my $groupEnt = $self->ctx->LookupGroupById($usergid); + if ($groupEnt) { + my $member = $groupEnt->MemberName(1, 0); + # TODO check if 499 is ok nowadays + if (scalar(@$member) == 0 && $groupEnt->Gid($self->USER_GetValue) > 499) { + $self->ctx->GroupDel($groupEnt); + } + } + if (defined($options)) { + ## testing jusr if exists also undef is allowed + ## as valid option + if (exists($options->{clean_home})) { + eval { $self->ctx->CleanHome($userEnt) }; + return $@ if $@; + } + if (exists($options->{clean_spool})) { + eval { $self->ctx->CleanSpool($userEnt) }; + return $@ if $@; + } + } + return undef; +} + +#============================================================= + +=head2 getUserShells + + +=head3 OUTPUT + +GetUserShells: from libUSER + +=head3 DESCRIPTION + +This method returns the available shell + +=cut + +#============================================================= + +sub getUserShells { + my $self = shift; + + return $self->ctx->GetUserShells; +} +#============================================================= + =head2 GetFaceIcon =head3 INPUT @@ -540,7 +1056,6 @@ sub weakPasswordForSecurityLevel { =head3 INPUT $name: username - $ctx: USER::ADMIN object =head3 OUTPUT @@ -554,12 +1069,11 @@ Adds the given username $name to 'users' group #============================================================= sub Add2UsersGroup { - my ($self, $name, $ctx) = @_; - my $GetValue = -65533; ## Used by USER (for getting values? TODO need explanations, where?) + my ($self, $name) = @_; - my $usersgroup = $ctx->LookupGroupByName('users'); + my $usersgroup = $self->ctx->LookupGroupByName('users'); $usersgroup->MemberName($name, 1); - return $usersgroup->Gid($GetValue); + return $usersgroup->Gid($self->USER_GetValue); } |