source: trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Unix/User.pm @ 1904

Last change on this file since 1904 was 1875, checked in by nanardon, 8 years ago

Fix another ref to array

  • Property svn:keywords set to Id
File size: 4.3 KB
Line 
1package LATMOS::Accounts::Bases::Unix::User;
2
3use 5.010000;
4use strict;
5use warnings;
6
7use base qw(LATMOS::Accounts::Bases::Objects);
8use LATMOS::Accounts::Log;
9
10our $VERSION = (q$Rev: 205 $ =~ /^Rev: (\d+) /)[0];
11
12=head1 NAME
13
14LATMOS::Ad - Perl extension for blah blah blah
15
16=head1 SYNOPSIS
17
18  use LATMOS::Accounts::Bases;
19  my $base = LATMOS::Accounts::Bases->new('unix');
20  ...
21
22=head1 DESCRIPTION
23
24Account base access over standard unix file format.
25
26=head1 FUNCTIONS
27
28=cut
29
30sub _get_attr_schema {
31    my ($class, $base) = @_;
32    {
33        uidNumber       => { iname => 'uid', uniq => 1, },
34        gidNumber       => { iname => 'gid',
35            can_values => sub {
36                map { $_->get_attributes('gidNumber') }
37                map { $base->get_object('group', $_) }
38                $base->list_objects('group')
39            },
40            reference => 'group',
41            mandatory => 1,
42        },
43        gecos           => { },
44        homeDirectory   => { iname => 'home' },
45        loginShell      => { iname => 'shell' },
46        userPassword    => {
47            iname => ($base->{use_shadow} ? 'spassword' : 'password'),
48        },
49        memberOf        => {
50            delayed => 1,
51            multiple => 1,
52        },
53        locked          => {},
54        givenName       => { ro => 1 },
55        sn              => { ro => 1 },
56        uid             => { iname => 'login', ro => 1 },
57        sAMAccountName  => { iname => 'login', ro => 1 },
58        $base->{use_shadow} ?
59        (
60            shadowLastChange => { iname => 'last_changed' },
61            shadowMin        => { iname => 'before_ch' },
62            shadowMax        => { iname => 'after_ch' },
63            shadowWarning    => { iname => 'exp_warn' },
64            shadowInactive   => { iname => 'exp_disable' },
65            shadowExpire     => { iname => 'disable' },
66            shadowFlag       => { iname => 'res' },
67        ) : (),
68    };
69}
70
71=head2 new(%config)
72
73=cut
74
75sub new {
76    my ($class, $base, $id, @args) = @_;
77    # we profit of ref, quite easy
78    if (exists($base->{users}{$id}) && $base->{users}{$id}) {
79        if ($base->{users}{$id}{uid} < ($base->{min_uid} || 0)) {
80            return;
81        }
82        return bless($base->{users}{$id}, $class);
83    } else { return }
84}
85
86sub get_field {
87    my ($self, $field) = @_;
88    for ($field) {
89        /^login$/ and return $self->id;
90        /^(sn|givenName)$/ and do {
91            my $gecos = $self->{gecos} || '';
92            my ($given, $sn) = $gecos =~ /^([^, ]+) +([^, ]+)/;
93            return $field eq 'sn' ? $sn : $given;
94        };
95        /^memberOf$/ and do {
96            my @res;
97            foreach (sort keys %{ $self->base->{groups} || {}}) {
98                push(@res, $_)
99                    if(exists($self->base->{groups}{$_}{'users'}{$self->id}));
100            }
101            return \@res;
102        };
103    }
104    $self->{$field}
105}
106
107sub set_fields {
108    my ($self, %data) = @_;
109    foreach my $field (keys %data) {
110        $field =~ /^(uid|gid)$/ and do {
111            if(!(defined($data{$field}) && $data{$field} =~ /^\d+$/)) {
112                $self->base->log(LA_ERR,
113                    "Invalid data for $field: " . (defined($data{$field}) ? $data{$field} : '(none)'));
114                return;
115            }
116        }
117    }
118    foreach my $field (keys %data) {
119        # TODO check fields exists !
120        $field =~ /^(sn|givenName)$/ and next;
121        $field eq 'memberOf' and do {
122            my %set;
123            $data{$field} = [ $data{$field} ] unless(ref $data{$field});
124            foreach(@{ $data{$field} || []}) {
125                $set{$_} = 1;
126            }
127            foreach (sort keys %{ $self->base->{groups} || {}}) {
128                if ($set{$_}) {
129                    $self->base->{groups}{$_}{'users'}{$self->id} = 1;
130                } else {
131                    delete($self->base->{groups}{$_}{'users'}{$self->id});
132                }
133            }
134        };
135        $self->{$field} = $data{$field};
136    }
137    1;
138}
139
1401;
141
142__END__
143
144=head1 SEE ALSO
145
146L<LATMOS::Accounts::Bases::Unix>
147
148=head1 AUTHOR
149
150Olivier Thauvin, E<lt>olivier.thauvin@latmos.ipsl.frE<gt>
151
152=head1 COPYRIGHT AND LICENSE
153
154Copyright (C) 2008, 2009 CNRS SA/CETP/LATMOS
155
156This library is free software; you can redistribute it and/or modify
157it under the same terms as Perl itself, either Perl version 5.10.0 or,
158at your option, any later version of Perl 5 you may have available.
159
160
161=cut
Note: See TracBrowser for help on using the repository browser.