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

Last change on this file since 1352 was 1352, checked in by nanardon, 9 years ago

memberOf attribute for Unix base is multivalued

  • 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 id {
87    $_[0]->{account}
88}
89
90sub get_field {
91    my ($self, $field) = @_;
92    for ($field) {
93        /^login$/ and return $self->id;
94        /^(sn|givenName)$/ and do {
95            my $gecos = $self->{gecos} || '';
96            my ($given, $sn) = $gecos =~ /^([^, ]+) +([^, ]+)/;
97            return $field eq 'sn' ? $sn : $given;
98        };
99        /^memberOf$/ and do {
100            my @res;
101            foreach (sort keys %{ $self->base->{groups} || {}}) {
102                push(@res, $_)
103                    if(exists($self->base->{groups}{$_}{'users'}{$self->id}));
104            }
105            return \@res;
106        };
107    }
108    $self->{$field}
109}
110
111sub set_fields {
112    my ($self, %data) = @_;
113    foreach my $field (keys %data) {
114        $field =~ /^(uid|gid)$/ and do {
115            if(!(defined($data{$field}) && $data{$field} =~ /^\d+$/)) {
116                $self->base->log(LA_ERR,
117                    "Invalid data for $field: " . ($data{$field} || ''));
118                return;
119            }
120        }
121    }
122    foreach my $field (keys %data) {
123        # TODO check fields exists !
124        $field =~ /^(sn|givenName)$/ and next;
125        $field eq 'memberOf' and do {
126            my %set;
127            foreach(@{ $data{$field} || []}) {
128                $set{$_} = 1;
129            }
130            foreach (sort keys %{ $self->base->{groups} || {}}) {
131                if ($set{$_}) {
132                    $self->base->{groups}{$_}{'users'}{$self->id} = 1;
133                } else {
134                    delete($self->base->{groups}{$_}{'users'}{$self->id});
135                }
136            }
137        };
138        $self->{$field} = $data{$field};
139    }
140    1;
141}
142
1431;
144
145__END__
146
147=head1 SEE ALSO
148
149L<LATMOS::Accounts::Bases::Unix>
150
151=head1 AUTHOR
152
153Olivier Thauvin, E<lt>olivier.thauvin@latmos.ipsl.frE<gt>
154
155=head1 COPYRIGHT AND LICENSE
156
157Copyright (C) 2008, 2009 CNRS SA/CETP/LATMOS
158
159This library is free software; you can redistribute it and/or modify
160it under the same terms as Perl itself, either Perl version 5.10.0 or,
161at your option, any later version of Perl 5 you may have available.
162
163
164=cut
Note: See TracBrowser for help on using the repository browser.