diff options
author | Angelo Naselli <anaselli@linux.it> | 2015-03-16 19:20:40 +0100 |
---|---|---|
committer | Angelo Naselli <anaselli@linux.it> | 2015-03-16 19:20:40 +0100 |
commit | b4e446c21e299af0441ec44db7a86334980b77c2 (patch) | |
tree | ea17c359431cb9e10aeed60346cb7b5a2c7af19d /lib/AdminPanel/Shared/Users.pm | |
parent | fc9772f1f03684e8dab50ff77d2c46c5e0309c7b (diff) | |
download | colin-keep-b4e446c21e299af0441ec44db7a86334980b77c2.tar colin-keep-b4e446c21e299af0441ec44db7a86334980b77c2.tar.gz colin-keep-b4e446c21e299af0441ec44db7a86334980b77c2.tar.bz2 colin-keep-b4e446c21e299af0441ec44db7a86334980b77c2.tar.xz colin-keep-b4e446c21e299af0441ec44db7a86334980b77c2.zip |
Moved the tree accordingly
Diffstat (limited to 'lib/AdminPanel/Shared/Users.pm')
-rw-r--r-- | lib/AdminPanel/Shared/Users.pm | 1612 |
1 files changed, 0 insertions, 1612 deletions
diff --git a/lib/AdminPanel/Shared/Users.pm b/lib/AdminPanel/Shared/Users.pm deleted file mode 100644 index 83c6061..0000000 --- a/lib/AdminPanel/Shared/Users.pm +++ /dev/null @@ -1,1612 +0,0 @@ -# vim: set et ts=4 sw=4: -package ManaTools::Shared::Users; -#============================================================= -*-perl-*- - -=head1 NAME - -ManaTools::Shared::Users - backend to manage users - -=head1 SYNOPSIS - - my $userBackEnd = ManaTools::Shared::Users->new(); - my $userInfo = $userManager->getUserInfo('username'); - -=head1 DESCRIPTION - -This module gives a low level access to the system user management it uses libUSER module. - - -=head1 SUPPORT - -You can find documentation for this module with the perldoc command: - -perldoc ManaTools::Shared::Users - -=head1 SEE ALSO - -libUSER - -=head1 AUTHOR - -Angelo Naselli <anaselli@linux.it> - -=head1 COPYRIGHT and LICENSE - -Copyright (C) 2014-2015, Angelo Naselli. - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License version 2, as -published by the Free Software Foundation. - -This program 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 General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - -=head1 METHODS - -=cut - -use Moose; -use diagnostics; - -use Config::Auto; -use Data::Password::Meter; -use IO::All; -use File::Basename; -use File::Copy; -use File::Remove 'remove'; - -## USER is from userdrake -use USER; -use English; -use POSIX qw/ceil/; - -use ManaTools::Shared::Locales; -use ManaTools::Shared; - - -#============================================================= - -=head2 new - optional parameters - -=head3 face_dir - - optional parameter to set the system face icon directory, - default value is /usr/share/mga/faces/ - -=cut - -#============================================================= - -has 'face_dir' => ( - is => 'rw', - isa => 'Str', - default => "/usr/share/mga/faces/", -); - -#============================================================= - -=head2 new - optional parameters - -=head3 user_face_dir - - optional parameter to set the user face icon directory, - default value is /usr/share/mga/faces/ - -=cut - -#============================================================= -has 'user_face_dir' => ( - is => 'rw', - isa => 'Str', - default => "/usr/share/faces/", -); - - -has 'loc' => ( - is => 'rw', - init_arg => undef, - builder => '_localeInitialize' -); - - -sub _localeInitialize { - my $self = shift(); - - # TODO fix domain binding for translation - $self->loc(ManaTools::Shared::Locales->new(domain_name => 'userdrake') ); - # 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; -} - -## min (custom) UID was 500 now is 1000, let's change in a single point -has 'min_UID' => ( - default => 1000, - is => 'ro', - isa => 'Int', - init_arg => undef, -); - -## min (custom) GID was 500 now should be 1000 as for users -has 'min_GID' => ( - default => 1000, - is => 'ro', - isa => 'Int', - init_arg => undef, -); - -#============================================================= - -=head2 BUILD - -=head3 INPUT - - $self: this object - -=head3 DESCRIPTION - - The BUILD method is called after a Moose object is created, - Into this method new optional parameters are tested once, - instead of into any other methods. - -=cut - -#============================================================= -sub BUILD { - my $self = shift; - - die "Missing face directory" if (! -d $self->face_dir); - die "Missing user face directory" if (! -d $self->user_face_dir); - - $self->face_dir($self->face_dir . "/") if (substr($self->face_dir, -1) ne "/"); - $self->user_face_dir($self->user_face_dir . "/") if (substr($self->user_face_dir, -1) ne "/"); - -} - - -=head2 facedir - -=head3 OUTPUT - - path to directory containing face icon - -=head3 DESCRIPTION - - Return the directory containing face icons. - -=cut - -#============================================================= - -sub facedir { - my $self = shift; - - return $self->face_dir; -} - - -#============================================================= - -=head2 userfacedir - -=head3 OUTPUT - - path to directory containing user face icons - -=head3 DESCRIPTION - - Return the directory containing user face icons. - -=cut - -#============================================================= - -sub userfacedir { - my $self = shift; - - return $self->user_face_dir; -} - - -#============================================================= - -=head2 face2png - -=head3 INPUT - - $face: face icon name (usually username) - -=head3 OUTPUT - - pathname to $face named icon with png extension - -=head3 DESCRIPTION - - This method returns the face icon pathname related to username - -=cut - -#============================================================= - -sub face2png { - my ($self, $face) = @_; - - return $self->face_dir . $face . ".png" if $face; -} - -#============================================================= - -=head2 facenames - - -=head3 OUTPUT - - $namelist: ARRAY reference containing the face name list - -=head3 DESCRIPTION - - Retrieves the list of icon name from facesdir() - -=cut - -#============================================================= - -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); - - return \@namelist; -} - -#============================================================= - -=head2 addKdmIcon - -=head3 INPUT - - $user: username to add - $icon: chosen icon for username $user - - -=head3 DESCRIPTION - - Add a $user named icon to $self->user_face_dir. It just copies - $icon to $self->user_face_dir, naming it as $user - -=cut - -#============================================================= - -sub addKdmIcon { - my ($self, $user, $icon) = @_; - - if ($icon && $user) { - my $icon_name = $self->face_dir . $icon . ".png"; - my $dest = $self->user_face_dir . $user . ".png"; - - eval { copy($icon_name, $dest) } ; - } -} - -#============================================================= - -=head2 removeKdmIcon - -=head3 INPUT - - $user: username icon to remove - -=head3 DESCRIPTION - - Remove a $user named icon from $self->user_face_dir - -=cut - -#============================================================= -sub removeKdmIcon { - my ($self, $user) = @_; - - if ($user) { - my $icon_name = $self->user_face_dir . $user . ".png"; - eval { remove($icon_name) } ; - } -} - - -#============================================================= - -=head2 _valid - -=head3 INPUT - - $name: User or Group name - $name_length: Max length of $name (default 32) - -=head3 OUTPUT - - 1, locale "Ok" if valid - 0, and explanation string if not valid: - - Name field is empty please provide a name - - The name must contain only lower cased latin letters, numbers, '.', '-' and '_' - - Name is too long - -=head3 DESCRIPTION - - this internal method return if a name is compliant to - a group or user name. - -=cut - -#============================================================= - -sub _valid { - my ($self, $name, $name_length) = @_; - - return (0, $self->loc->N("Name field is empty please provide a name")) if (!$name ); - - $name_length = 32 if !$name_length; - - $name =~ /^[a-z]+?[a-z0-9_\-\.]*?$/ or do { - return (0, $self->loc->N("The name must start with a letter and contain only lower cased latin letters, numbers, '.', '-' and '_'")); - }; - - return (0, $self->loc->N("Name is too long. Maximum length is %d", $name_length)) if (! (length($name) <= $name_length)); - - return (1, $self->loc->N("Ok")); -} - -#============================================================= - -=head2 valid_username - -=head3 INPUT - - $username: user name to check - -=head3 OUTPUT - - 1 if valid, 0 if not (see _valid) - -=head3 DESCRIPTION - - Checks the valididty of the string $username - -=cut - -#============================================================= - -sub valid_username { - my ($self, $username) = @_; - - return $self->_valid($username, 32); -} - -#============================================================= - -=head2 valid_groupname - -=head3 INPUT - - $groupname: user name to check - -=head3 OUTPUT - - 1 if valid, 0 if not (see _valid) - -=head3 DESCRIPTION - - Checks the valididty of the string $groupname - -=cut - -#============================================================= -sub valid_groupname { - my ($self, $groupname) = @_; - - return $self->_valid($groupname, 16); -} - - -#============================================================= - -=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 (ManaTools::Shared::inArray($name, $members)) { - eval { $g->MemberName($name, 2) }; - eval { $self->ctx->GroupModify($g) }; - } - } -} - - -#============================================================= - -=head2 getGoups - -=head3 OUTPUT - - $groups: ARRAY reference containing all the groups - -=head3 DESCRIPTION - - This method return the configured groups - -=cut - -#============================================================= -sub getGoups { - my $self = shift; - - return $self->ctx->GroupsEnumerate; -} - - -#============================================================= - -=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 groupName - -=head3 INPUT - - $gid group identifier - -=head3 OUTPUT - - group name or undef - -=head3 DESCRIPTION - - This method returns the group name for the given group - identifier - -=cut - -#============================================================= -sub groupName { - my ($self, $gid) = @_; - - my $gr = $self->ctx->LookupGroupById($gid); - return $gr->GroupName($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 $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 modifyGroup - -=head3 INPUT - - $groupInfo: HASH reference containing: - old_groupname => old name of the group (if renaming) - groupname => group name - members => users belonging to the group - -=head3 OUTPUT - - $retval => HASH reference - status => 1 (ok) 0 (error) - error => error message if status is 0 - -=head3 DESCRIPTION - - This method modifies the group groupname - -=cut - -#============================================================= -sub modifyGroup { - my ($self, $groupInfo) = @_; - - die "group name is mandatory" if !defined($groupInfo->{groupname}); - - my $groupEnt = defined($groupInfo->{old_groupname}) ? - $self->ctx->LookupGroupByName($groupInfo->{old_groupname}) : - $self->ctx->LookupGroupByName($groupInfo->{groupname}); - - my $orig_groupname = $groupInfo->{groupname}; - if (defined($groupInfo->{old_groupname}) && - $groupInfo->{old_groupname} ne $groupInfo->{groupname}) { - $groupEnt->GroupName($groupInfo->{groupname}); - $orig_groupname = $groupInfo->{old_groupname}; - } - - my $members = $groupInfo->{members}; - my $gid = $groupEnt->Gid($self->USER_GetValue); - my $users = $self->getUsers(); - my @susers = sort(@{$users}); - - foreach my $user (@susers) { - my $uEnt = $self->ctx->LookupGroupByName($user); - if ($uEnt) { - my $ugid = $uEnt->Gid($self->USER_GetValue); - my $m = $self->ctx->EnumerateUsersByGroup($orig_groupname); - if (MDK::Common::DataStructure::member($user, @{$members})) { - if (!ManaTools::Shared::inArray($user, $m)) { - if ($ugid != $gid) { - eval { $groupEnt->MemberName($user, 1) }; - } - } - } - else { - if (ManaTools::Shared::inArray($user, $m)) { - if ($ugid == $gid) { - return { - status => 0, - error =>$self->loc->N("You cannot remove user <%s> from their primary group", $user) - }; - } - else { - eval { $groupEnt->MemberName($user, 2) }; - } - } - } - } - } - - $self->ctx->GroupModify($groupEnt); - - return {status => 1,}; -} - -#============================================================= - -=head2 getGroupsInfo - - $options: HASH reference containing - groupname_filter => groupname search string - filter_system => hides system groups - -=head3 OUTPUT - - $groupsInfo: HASH reference containing - groupname-1 => { - gid => group identifier - members => ARRAY of username - } - groupname-2 => { - ... - } - -=head3 DESCRIPTION - - This method get group information (all groups or the - filtered ones) - -=cut - -#============================================================= -sub getGroupsInfo { - my ($self, $options) = @_; - - my $groupsInfo = {}; - return $groupsInfo if !defined $self->ctx; - - my $strfilt = $options->{groupname_filter} if exists($options->{groupname_filter}); - my $filtergroups = $options->{filter_system} if exists($options->{filter_system}); - - my $groups = $self->ctx->GroupsEnumerateFull; - - my @GroupReal; - LOOP: foreach my $g (@{$groups}) { - my $gid = $g->Gid($self->USER_GetValue); - next LOOP if $filtergroups && $gid <= 499 || $gid == 65534; - if ($filtergroups && $gid > 499 && $gid < $self->min_GID) { - my $groupname = $g->GroupName($self->USER_GetValue); - my $l = $self->ctx->LookupUserByName($groupname); - if (!defined($l)) { - my $members = $self->ctx->EnumerateUsersByGroup($groupname); - next LOOP if !scalar(@{$members}); - foreach my $username (@$members) { - my $userEnt = $self->ctx->LookupUserByName($username); - next LOOP if $userEnt->HomeDir($self->USER_GetValue) =~ /^\/($|var\/|run\/)/ || $userEnt->LoginShell($self->USER_GetValue) =~ /(nologin|false)$/; - } - } - else { - next LOOP if $l->HomeDir($self->USER_GetValue) =~ /^\/($|var\/|run\/)/ || $l->LoginShell($self->USER_GetValue) =~ /(nologin|false)$/; - } - } - push @GroupReal, $g if $g->GroupName($self->USER_GetValue) =~ /^\Q$strfilt/; - } - - foreach my $g (@GroupReal) { - my $groupname = $g->GroupName($self->USER_GetValue); - my $u_b_g = $self->ctx->EnumerateUsersByGroup($groupname); - my $group_id = $g->Gid($self->USER_GetValue); - - $groupsInfo->{"$groupname"} = { - gid => $group_id, - members => $u_b_g, - }; - } - - return $groupsInfo; -} - -#============================================================= - -=head2 getUsers - -=head3 OUTPUT - - $users: ARRAY reference containing all the users - -=head3 DESCRIPTION - - This method return the configured users - -=cut - -#============================================================= -sub getUsers { - my $self = shift; - - return $self->ctx->UsersEnumerate; -} - -#============================================================= - -=head2 getUserInfo - -=head3 INPUT - - $username: user name - -=head3 OUTPUT - - $userInfo: HASH reference containing - { - uid => user identifier - gid => group identifier - fullname => user full name - home => home directory - shell => user shell - expire => shadow expire time - locked => is locked? - exp_min => shadow Min - exp_max => shadow Max - exp_warn => shadow Warn - exp_inact => shadow Inact - last_change => Shadow last change - members => groups the user belongs to - } - -=head3 DESCRIPTION - - This method get all the information for the given user - -=cut - -#============================================================= -sub getUserInfo { - my ($self, $username) = @_; - - my $userInfo = {}; - return $userInfo if !defined $self->ctx; - - my $userEnt = $self->ctx->LookupUserByName($username); - return $userInfo if !defined($userEnt); - - my $fullname = $userEnt->Gecos($self->USER_GetValue); - utf8::decode($fullname); - $userInfo->{fullname} = $fullname; - $userInfo->{shell} = $userEnt->LoginShell($self->USER_GetValue); - $userInfo->{home} = $userEnt->HomeDir($self->USER_GetValue); - $userInfo->{uid} = $userEnt->Uid($self->USER_GetValue); - $userInfo->{gid} = $userEnt->Gid($self->USER_GetValue); - $userInfo->{expire} = $userEnt->ShadowExpire($self->USER_GetValue); - $userInfo->{locked} = $self->ctx->IsLocked($userEnt); - - $userInfo->{exp_min} = $userEnt->ShadowMin($self->USER_GetValue); - $userInfo->{exp_max} = $userEnt->ShadowMax($self->USER_GetValue); - $userInfo->{exp_warn} = $userEnt->ShadowWarn($self->USER_GetValue); - $userInfo->{exp_inact} = $userEnt->ShadowInact($self->USER_GetValue); - $userInfo->{last_change} = $userEnt->ShadowLastChange($self->USER_GetValue); - $userInfo->{members} = $self->ctx->EnumerateGroupsByUser($username); - - return $userInfo; -} - -#============================================================= - -=head2 getUsersInfo - -=head3 INPUT - - $options: HASH reference containing - username_filter => username search string - filter_system => hides system users - -=head3 OUTPUT - - $usersInfo: HASH reference containing - username-1 => { - uid => user identifier - group => primary group name - gid => group identifier - fullname => user full name - home => home directory - shell => user shell - status => login status (locked, expired, etc) - } - username-2 => { - ... - } - -=head3 DESCRIPTION - - This method get user information (all users or filtered ones) - -=cut - -#============================================================= -sub getUsersInfo { - my ($self, $options) = @_; - - my $usersInfo = {}; - return $usersInfo if !defined $self->ctx; - - my $strfilt = $options->{username_filter} if exists($options->{username_filter}); - my $filterusers = $options->{filter_system} if exists($options->{filter_system}); - - my ($users, $group, $groupnm, $expr); - $users = $self->ctx->UsersEnumerateFull; - - my @UserReal; - LOOP: foreach my $l (@{$users}) { - my $uid = $l->Uid($self->USER_GetValue); - next LOOP if $filterusers && $uid <= 499 || $uid == 65534; - next LOOP if $filterusers && $uid > 499 && $uid < $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/; - } - my $i; - my $itemColl = new yui::YItemCollection; - foreach my $l (@UserReal) { - $i++; - my $uid = $l->Uid($self->USER_GetValue); - if (!defined $uid) { - warn "bogus user at line $i\n"; - next; - } - my $gid = $l->Gid($self->USER_GetValue); - $group = $self->ctx->LookupGroupById($gid); - $groupnm = ''; - $expr = $self->computeLockExpire($l); - $group and $groupnm = $group->GroupName($self->USER_GetValue); - my $fulln = $l->Gecos($self->USER_GetValue); - utf8::decode($fulln); - my $username = $l->UserName($self->USER_GetValue); - my $shell = $l->LoginShell($self->USER_GetValue); - my $homedir = $l->HomeDir($self->USER_GetValue); - $usersInfo->{"$username"} = { - uid => $uid, - group => $groupnm, - gid => $gid, - fullname => $fulln, - home => $homedir, - status => $expr, - shell => $shell, - }; - } - - return $usersInfo; -} - -#============================================================= - -=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") : ''); - return $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 modifyUser - -=head3 INPUT - - $userInfo: HASH reference containing: - old_username => old name of the user (if renaming) - username => user name - fullname => full name of teh user - password => password - homedir => home directory - shell => user shell - members => groups the user belongs to - gid => primary group identifier - lockuser => lock user - acc_expires => account expire time - containing: - exp_y => year - exp_m => month - exp_d => day - password_expires => password expire time - containing: - exp_min => min - exp_max => max - exp_warn => when warn - exp_inact => when inactive - -=head3 DESCRIPTION - - This method modifies the group groupname - -=cut - -#============================================================= -sub modifyUser { - my ($self, $userInfo) = @_; - - die "user name is mandatory" if !defined($userInfo->{username}); - die "primary group identifier is mandatory" if !defined($userInfo->{gid}); - die "a valid group identifier is mandatory" if $userInfo->{gid} < 0; - - if (defined($userInfo->{acc_expires})) { - die "expiring year is mandatory" if !defined($userInfo->{acc_expires}->{exp_y}); - die "expiring month is mandatory" if !defined($userInfo->{acc_expires}->{exp_m}); - die "expiring day is mandatory" if !defined($userInfo->{acc_expires}->{exp_d}); - } - if (defined($userInfo->{password_expires})) { - die "password expiring min is mandatory" if !($userInfo->{password_expires}->{exp_min}); - die "password expiring max is mandatory" if !($userInfo->{password_expires}->{exp_max}); - die "password expiring warn is mandatory" if !($userInfo->{password_expires}->{exp_warn}); - die "password expiring inactive is mandatory" if !($userInfo->{password_expires}->{exp_inact}); - } - my $userEnt = defined($userInfo->{old_username}) ? - $self->ctx->LookupUserByName($userInfo->{old_username}) : - $self->ctx->LookupUserByName($userInfo->{username}); - - my $orig_username = $userInfo->{username}; - if (defined($userInfo->{old_username}) && - $userInfo->{old_username} ne $userInfo->{username}) { - $userEnt->UserName($userInfo->{username}); - $orig_username = $userInfo->{old_username}; - } - - # $userEnt->UserName($userInfo->{username}); - $userEnt->Gecos($userInfo->{fullname}) if defined($userInfo->{fullname}); - $userEnt->HomeDir($userInfo->{homedir}) if defined($userInfo->{homedir}); - $userEnt->LoginShell($userInfo->{shell}) if defined($userInfo->{shell}); - - - my $username = $userEnt->UserName($self->USER_GetValue); - my $grps = $self->getGoups(); - my @sgroups = sort @{$grps}; - - my $members = $userInfo->{members}; - foreach my $group (@sgroups) { - my $gEnt = $self->ctx->LookupGroupByName($group); - my $ugid = $gEnt->Gid($self->USER_GetValue); - my $m = $gEnt->MemberName(1,0); - if (MDK::Common::DataStructure::member($group, @$members)) { - if (!ManaTools::Shared::inArray($username, $m) && $userInfo->{gid} != $ugid) { - eval { $gEnt->MemberName($username, 1) }; - $self->ctx->GroupModify($gEnt); - } - } - else { - if (ManaTools::Shared::inArray($username, $m)) { - eval { $gEnt->MemberName($username, 2) }; - $self->ctx->GroupModify($gEnt); - } - } - } - - $userEnt->Gid($userInfo->{gid}) if defined($userInfo->{gid}); - - if (defined($userInfo->{acc_expires})) { - my $yr = $userInfo->{acc_expires}->{exp_y}; - my $mo = $userInfo->{acc_expires}->{exp_m}; - my $dy = $userInfo->{acc_expires}->{exp_d}; - my $Exp = _ConvTime($dy, $mo, $yr); - $userEnt->ShadowExpire($Exp); - } - else { - $userEnt->ShadowExpire(ceil(-1)) - } - if (defined($userInfo->{password_expires})) { - my $allowed = $userInfo->{password_expires}->{exp_min}; - my $required = $userInfo->{password_expires}->{exp_max}; - my $warning = $userInfo->{password_expires}->{exp_warn}; - my $inactive = $userInfo->{password_expires}->{exp_inact}; - $userEnt->ShadowMin($allowed); - $userEnt->ShadowMax($required); - $userEnt->ShadowWarn($warning); - $userEnt->ShadowInact($inactive); - } - else { - $userEnt->ShadowMin(-1); - $userEnt->ShadowMax(99999); - $userEnt->ShadowWarn(-1); - $userEnt->ShadowInact(-1); - } - - $self->ctx->UserSetPass($userEnt, $userInfo->{password}) if defined($userInfo->{password}); - $self->ctx->UserModify($userEnt); - - if ($userInfo->{lockuser}) { - !$self->ctx->IsLocked($userEnt) and $self->ctx->Lock($userEnt); - } - else { - $self->ctx->IsLocked($userEnt) and $self->ctx->UnLock($userEnt); - } - - 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 - - $name: icon name for the given username - $next: if passed means getting next icon from the given $name - -=head3 OUTPUT - - $user_icon: icon name - -=head3 DESCRIPTION - - This method returns the icon for the given user ($name) or the - following one if $next is passed - -=cut - -#============================================================= -sub GetFaceIcon { - my ($self, $name, $next) = @_; - my $icons = $self->facenames(); - my $i; - my $current_icon; - # remove shortcut "&" from label - $name =~ s/&// if ($name); - my $user_icon = $self->user_face_dir . $name . ".png" if ($name); - if ($name) { - $user_icon = $self->face2png($name) unless(-e $user_icon); - } - if ($name && -e $user_icon) { - my $current_md5 = ManaTools::Shared::md5sum($user_icon); - my $found = 0; - for ($i = 0; $i < scalar(@$icons); $i++) { - if (ManaTools::Shared::md5sum($self->face2png($icons->[$i])) eq $current_md5) { - $found = 1; - last; - } - } - if ($found) { #- current icon found in @icons, select it - $current_icon = $icons->[$i]; - } else { #- add and select current icon in @icons - push @$icons, $user_icon; - $current_icon = $user_icon; - $i = scalar(@$icons) - 1; - } - } else { - #- no icon yet, select a random one - $current_icon = $icons->[$i = rand(scalar(@$icons))]; - } - - if ($next) { - $current_icon = $icons->[$i = defined $icons->[$i+1] ? $i+1 : 0]; - } - return $current_icon; -} - - -#============================================================= - -=head2 strongPassword - -=head3 INPUT - - $passwd: password to be checked - -=head3 OUTPUT - - 1: if password is strong - 0: if password is weak - -=head3 DESCRIPTION - - Check for a strong password - -=cut - -#============================================================= -sub strongPassword { - my ($self, $passwd, $threshold) = @_; - - return 0 if !$passwd; - - my $pwdm = $threshold ? Data::Password::Meter->new($threshold) : Data::Password::Meter->new(); - - # Check a password - return $pwdm->strong($passwd); -} - - -# TODO methods not tested in Users.t - -#============================================================= - -=head2 weakPasswordForSecurityLevel - -=head3 INPUT - - $passwd: password to check - -=head3 OUTPUT - - 1: if the password is too weak for security level - -=head3 DESCRIPTION - - Check the security level set if /etc/security/msec/security.conf - exists and the level is not 'standard' and if the password - is not at least 6 characters return true - -=cut - -#============================================================= -sub weakPasswordForSecurityLevel { - my ($self, $passwd) = @_; - - my $sec_conf_file = "/etc/security/msec/security.conf"; - if (-e $sec_conf_file) { - my $prefs = Config::Auto::parse($sec_conf_file); - my $level = $prefs->{BASE_LEVEL}; - if ($level eq 'none' or $level eq 'standard') { - return 0; - } - elsif (length($passwd) < 6) { - return 1; - } - } - - return 0; -} - - -#============================================================= - -=head2 Add2UsersGroup - -=head3 INPUT - - $name: username - -=head3 OUTPUT - - $gid: group id - -=head3 DESCRIPTION - - Adds the given username $name to 'users' group - -=cut - -#============================================================= -sub Add2UsersGroup { - my ($self, $name) = @_; - - my $usersgroup = $self->ctx->LookupGroupByName('users'); - $usersgroup->MemberName($name, 1); - return $usersgroup->Gid($self->USER_GetValue); -} - -sub _ConvTime { - my ($day, $month, $year) = @_; - my ($tm, $days, $mon, $yr); - $mon = $month - 1; $yr = $year - 1900; - $tm = POSIX::mktime(0, 0, 0, $day, $mon, $yr); - $days = ceil($tm / (24 * 60 * 60)); - return $days; -} - -no Moose; -__PACKAGE__->meta->make_immutable; - -1; |