diff options
| -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);  } | 
