aboutsummaryrefslogtreecommitdiffstats
path: root/lib/AdminPanel/Shared/Users.pm
blob: 411f9425bc8aca393adbce36bb1440088b365f93 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package AdminPanel::Shared::Users; 

use diagnostics;
use strict;

use Data::Password::Meter;

#-######################################################################################
#- misc imports
#-######################################################################################
use common;

# use run_program;

use base qw(Exporter);

our @EXPORT = qw(
                facesdir
                face2png
                facenames
                addKdmIcon
                valid_username
                valid_groupname
                GetFaceIcon
                Add2UsersGroup
                strongPassword
                );

sub facesdir() {
    "$::prefix/usr/share/mga/faces/";
}
sub face2png {
    my ($face) = @_;
    facesdir() . $face . ".png";
}
sub facenames() {
    my $dir = facesdir();
    my @l = grep { /^[A-Z]/ } all($dir);
    map { if_(/(.*)\.png/, $1) } (@l ? @l : all($dir));
}

sub addKdmIcon {
    my ($user, $icon) = @_;
    my $dest = "$::prefix/usr/share/faces/$user.png";
    eval { cp_af(facesdir() . $icon . ".png", $dest) } if $icon;
}


sub valid {
    return (0, N("Name field is empty please provide a name")) if (!$_[0] );

    $_[0] =~ /^[a-z]+?[a-z0-9_\-\.]*?$/ or do {
        return (0, N("The name must contain only lower cased latin letters, numbers, `.', `-' and `_'"));
    };
    return (0, N("Name is too long")) if (! (length($_[0]) <= $_[1]));
    return (1, N("Ok"));
}

sub valid_username {
     return valid($_[0], 32);
}

sub valid_groupname {
    return valid($_[0], 16);
}

##################################################
## GetFaceIcon
## params
##
## 'name' icon name for the given name
## 'next' get next icon from the given 'name' 
##
## return
## 'user_icon' icon name
##
sub GetFaceIcon {
    my ($name, $next) = @_;
    my @icons = facenames();
    my $i;
    my $current_icon;
    # remove shortcut "&" from label
    $name =~ s/&// if ($name); 
    my $user_icon = "$::prefix/usr/share/faces/$name.png" if ($name);
    if ($name) {
        $user_icon    = face2png($name) unless(-e $user_icon);
    }
    if ($name && -e $user_icon) {
        my $current_md5 = common::md5file($user_icon);
        eval { $i = find_index { common::md5file(face2png($_)) eq $current_md5 } @icons };
        if (!$@) { #- 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 = @icons - 1;
        }
    } else {
        #- no icon yet, select a random one
        $current_icon = $icons[$i = rand(@icons)];
    }

    if ($next) {
        $current_icon = $icons[$i = defined $icons[$i+1] ? $i+1 : 0];
    }
    return $current_icon;
}

##################################################
## Add2UsersGroup
## params
##
## 'name' username
## 'ctx' USER::ADMIN object 
##
## return
##  gid  group id
##
sub Add2UsersGroup {
    my ($name, $ctx) = @_;
    my $GetValue = -65533; ## Used by USER (for getting values? TODO need explanations, where?)

    my $usersgroup = $ctx->LookupGroupByName('users');
    $usersgroup->MemberName($name, 1);
    return $usersgroup->Gid($GetValue);
}


sub strongPassword {
    my $passwd = shift;
    my $pwdm = Data::Password::Meter->new();

    # Check a password
    return $pwdm->strong($passwd);
}

1;