source: trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Partage/User.pm @ 2506

Last change on this file since 2506 was 2506, checked in by nanardon, 2 years ago

Add support for RENATER/Partage

File size: 7.9 KB
Line 
1package LATMOS::Accounts::Bases::Partage::User;
2
3use 5.010000;
4use strict;
5use warnings;
6use overload '""' => 'stringify';
7
8use LATMOS::Accounts::Log;
9use LATMOS::Accounts::Utils;
10use base qw(LATMOS::Accounts::Bases::Objects);
11use DateTime;
12
13our $VERSION = (q$Rev$ =~ /^Rev: (\d+) /)[0];
14
15=head1 NAME
16
17    LATMOS::Accounts::Bases::Partage::User - Support for Partage users
18
19=head1 DESCRIPTION
20
21Account base access over standard unix file format.
22
23=head1 FUNCTIONS
24
25=cut
26
27sub _get_attr_schema {
28    my ($class, $base) = @_;
29
30    {
31        name => {
32            ro => 1,
33            get => sub {
34                my ($self) = @_;
35                return $self->object->{name}
36            },
37        },
38        zid => { ro => 1, iname => 'id' }, # Zimbra internal id
39        uid => { ro => 1, },
40        cn => { },
41        sn => { },
42        givenName => { },
43        mail => { ro => 1, get => sub { return $_[0]->object->{_zid} } },
44        displayName => { },
45        objectClass => { ro => 1, multiple => 1, },
46        zimbraMailDeliveryAddress => { multiple => 1, ro => 1, },
47        zimbraMailAlias => { 
48            multiple => 1,
49            ro => 1,
50            get => sub {
51                my ($self) = @_;
52                my $domain = $self->base->{domain};
53                return [
54                    map { s/@\Q$domain\E$//; $_ }
55                    grep { $_ }
56                    ref $self->object->{zinfo}{zimbraMailAlias}
57                        ? @{ $self->object->{zinfo}{zimbraMailAlias} }
58                        : $self->object->{zinfo}{zimbraMailAlias}
59                ]
60            },
61        },
62        aliases => {
63            multiple => 1,
64            get => sub {
65                my ($self) = @_;
66                my $domain = $self->base->{domain};
67                return [
68                    map { s/@\Q$domain\E$//; $_ }
69                    grep { $_ }
70                    ref $self->object->{zinfo}{zimbraMailAlias}
71                        ? @{ $self->object->{zinfo}{zimbraMailAlias} }
72                        : $self->object->{zinfo}{zimbraMailAlias}
73                ]
74            },
75            set => sub {
76                my ($self, $data) = @_;
77                my $domain = $self->object->base->{domain};
78                $self->object->_get_info();
79                my @zimbraMailAlias =
80                    map { s/@\Q$domain\E$//; $_ }
81                    grep { $_ }
82                    ref $self->object->{zinfo}{zimbraMailAlias}
83                        ? @{ $self->object->{zinfo}{zimbraMailAlias} }
84                        : $self->object->{zinfo}{zimbraMailAlias};
85                my %currentalias = map { $_ => 1 } grep { $_ } @zimbraMailAlias;
86                my %newalias;
87                foreach (grep { $_ } (ref $data ? @{$data} : $data)) {
88                    # Adding domain to unqualified aliases
89                    s/@.*//;
90                    $newalias{lc($_)} = 1;
91                }
92                foreach (keys %currentalias) {
93                    $newalias{$_} and next;
94                    warn "Del $_";
95                    my $res = $self->object->base->sendrequest(
96                        'RemoveAccountAlias',
97                        name  => $self->object->{_zid},
98                        alias => "$_\@$domain",
99                    ) or do {
100                        $self->object->base->la_log("Cannot remove alias $_");
101                        return;
102                    };
103                    $self->object->{zinfo} = undef;
104                }
105                foreach (keys %newalias) {
106                    $currentalias{$_} and next;
107                    warn "Add $_";
108                    my $res = $self->object->base->sendrequest(
109                        'AddAccountAlias',
110                        name  => $self->object->{_zid},
111                        alias => "$_\@$domain",
112                    ) or do {
113                        $self->object->base->la_log("Cannot add alias $_");
114                        return;
115                    };
116                    $self->object->{zinfo} = undef;
117                }
118            }
119        },
120        zimbraCOSId => { },
121    }
122}
123
124sub new {
125    my ($class, $base, $id) = @_;
126
127    my %users = $class->_lists_account($base);
128
129    if (!$users{$id}) {
130        la_log(LA_DEBUG, "Cannot find user $id");
131        return;
132    } else {
133        my $user = bless {
134            name  => $id,
135            _id   => $id,
136            _zid  => $users{$id},
137            _base => $base,
138        }, $class;
139        $user->_get_info();
140        return $user;
141    }
142}
143 
144sub get_field {
145    my ($self, $field) = @_;
146
147    $self->_get_info();
148
149    return $self->{zinfo}{ $field };
150}
151
152sub set_fields {
153    my ($self, %data) = @_;
154
155    my @values = ();
156
157    my $res = $self->base->sendrequest(
158        'ModifyAccount',
159        name => $self->{_zid},
160        %data,
161    );
162
163    $self->{zinfo} = undef;
164
165    $res ? 1 : 0;
166}
167
168sub _set_password {
169    my ($self, $clear_pass) = @_;
170
171    my $res = $self->base->sendrequest(
172        'SetPassword',
173        name     => $self->{_zid},
174        password => $clear_pass,
175    );
176
177}
178 
179sub _create {
180    my ($class, $base, $id, %data) = @_;
181
182    my $pass = LATMOS::Accounts::Utils::genpassword();
183
184    my %cdata;
185
186    my $aliases = $data{ 'aliases' };
187    delete( $data{ 'aliases' } );
188
189    foreach my $attr ( keys %data ) {
190        $data{ $attr } or next;
191        my $Attr = $base->attribute( 'user', $attr ) or next;
192        $Attr->ro and next;
193        $cdata{ $attr } = $data{ $attr };
194    }
195
196    my $res = $base->sendrequest(
197        'CreateAccount',
198        name     => $id . '@' . $base->{domain},
199        password => $pass,
200        %cdata,
201    );
202
203    if ( $aliases ) {
204        my $user = $base->get_object( 'user', $id ) or return;
205
206        return $user->_set_c_fields( aliases => $aliases );
207    }
208
209    1;
210}
211
212sub _delete {
213    my ($class, $base, $id) = @_;
214
215    my $user = $base->get_object('user', $id) or do {
216        $base->log(LA_ERR, "Cannot get user $id");
217        return;
218    };
219
220    $base->sendrequest(
221        'DeleteAccount',
222        name => $id . '@' . $base->{domain},
223    );
224}
225 
226sub _lists_account {
227    my ($class, $base) = @_;
228
229    my %users;
230    my $offset =   0;
231    my $limit  = 500;
232    while ( 1 ) {
233        my $res = $base->sendrequest(
234            'GetAllAccounts',
235            offset => $offset,
236            limit  => $limit,
237        ) or do {
238            la_log(LA_ERR, "Error while trying to get users list");
239            return;
240        };
241
242        my @accounts = @{ $res->{accounts}{account} || [] }
243            or last;
244
245        require Data::Dumper;
246        warn Data::Dumper::Dumper( $res );
247        foreach my $node (@accounts) {
248            my $name = $node->{name};
249            $name =~ s/@.*$//;
250            $users{$name} = $node->{name}
251        }
252
253        scalar( @accounts ) < $limit and last;
254
255        $offset += $limit;
256    }
257
258    %users
259}
260 
261sub _get_info {
262    my ($self) = @_;
263
264    if ( $self->{zinfo}{cacheTime} ) {
265        return 1;
266    }
267
268    my $res = $self->base->sendrequest(
269        'GetAccount',
270        name => $self->{_zid},
271    ) or return;
272    require Data::Dumper;
273    print Data::Dumper::Dumper($res);
274
275    my $elem = $res->{account}[0];
276    $self->{zinfo} = { cacheTime => DateTime->now };
277
278    foreach my $attr (sort keys %{ $elem || {} }) {
279        if ( ref $elem->{ $attr } eq 'HASH' ) {
280            $self->{zinfo}{ $attr } = $elem->{ $attr }{ $attr };
281        } else {
282            $self->{zinfo}{ $attr } = $elem->{ $attr };
283        }
284    }
285}
286
287sub list {
288    my ($class, $base) = @_;
289
290    my %users = $class->_lists_account($base);
291    return sort keys(%users);
292}
293
2941;
295
296__END__
297
298=head1 SEE ALSO
299
300=head1 AUTHOR
301
302Olivier Thauvin, E<lt>olivier.thauvin@latmos.ipsl.frE<gt>
303
304=head1 COPYRIGHT AND LICENSE
305
306Copyright (C) 2008, 2009 CNRS SA/CETP/LATMOS
307
308This library is free software; you can redistribute it and/or modify
309it under the same terms as Perl itself, either Perl version 5.10.0 or,
310at your option, any later version of Perl 5 you may have available.
311
312=cut
Note: See TracBrowser for help on using the repository browser.