source: trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Zimbra/User.pm @ 1381

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

remove debug message

File size: 6.5 KB
Line 
1package LATMOS::Accounts::Bases::Zimbra::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 SOAP::Lite;
12
13our $VERSION = (q$Rev$ =~ /^Rev: (\d+) /)[0];
14
15=head1 NAME
16
17LATMOS::Ad - Perl extension for blah blah blah
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, }, # Zimbra internal id
39        uid => { ro => 1, },
40        cn => { },
41        sn => { },
42        givenName => { },
43        mail => { ro => 1, },
44        displayName => { },
45        objectClass => { ro => 1, multiple => 1, },
46        zimbraMailDeliveryAddress => { multiple => 1, ro => 1, },
47        zimbraMailAlias => { 
48            multiple => 1,
49            set => sub {
50                my ($self, $data) = @_;
51                my @zimbraMailAlias = ref $self->object->{zinfo}{zimbraMailAlias}
52                    ? @{ $self->object->{zinfo}{zimbraMailAlias} }
53                    : $self->object->{zinfo}{zimbraMailAlias};
54                my %currentalias = map { $_ => 1 } grep { $_ } @zimbraMailAlias;
55                my %newalias = map { $_ => 1 } grep { $_ } (ref $data ? @{$data} : $data);
56                foreach (keys %currentalias) {
57                    $newalias{$_} and next;
58                    my $xpath = $self->object->base->soapcall(
59                        'RemoveAccountAliasRequest',
60                        SOAP::Data->name('id')->value($self->object->{zinfo}{zid}),
61                        SOAP::Data->name('alias')->value($_),
62                    ) or do {
63                        $self->object->base->la_log('Cannot remove alias $_');
64                        return;
65                    };
66                }
67                foreach (keys %newalias) {
68                    $currentalias{$_} and next;
69                    my $xpath = $self->object->base->soapcall(
70                        'AddAccountAliasRequest',
71                        SOAP::Data->name('id')->value($self->object->{zinfo}{zid}),
72                        SOAP::Data->name('alias')->value($_),
73                    ) or do {
74                        $self->object->base->la_log('Cannot add alias $_');
75                        return;
76                    };
77                }
78            }
79        },
80        zimbraCOSId => { },
81    }
82}
83
84sub new {
85    my ($class, $base, $id) = @_;
86
87    my %users = $class->_lists_account($base);
88
89    if (!$users{$id}) {
90        la_log(LA_DEBUG, "Cannot find user $id");
91        return;
92    } else {
93        my $user = bless {
94            _id => $id,
95            name => $users{$id},
96            _base => $base,
97        }, $class;
98        $user->_get_info();
99        return $user;
100    }
101}
102
103sub get_field {
104    my ($self, $field) = @_;
105
106    my $attribute = $self->attribute($field) or return;
107
108    return $self->{zinfo}{$field};
109}
110
111sub set_fields {
112    my ($self, %data) = @_;
113
114    my @values = ();
115
116    foreach my $key (keys %data) {
117        foreach my $val (ref $data{$key} ? @{ $data{$key} } : $data{$key}) {
118            push(@values, SOAP::Data->name('a')
119                ->attr({ 'n' => $key })
120                ->value($val)
121            );
122        }
123    }
124
125    my $xpath = $self->base->soapcall(
126        'ModifyAccountRequest',
127        SOAP::Data->name('id')->value($self->{zinfo}{zid}),
128        @values,
129    );
130
131}
132
133sub _create {
134    my ($class, $base, $id, %data) = @_;
135
136    my $pass = LATMOS::Accounts::Utils::genpassword();
137
138    my @values = ();
139
140    foreach my $key (keys %data) {
141        foreach my $val (ref $data{$key} ? @{ $data{$key} } : $data{$key}) {
142            push(@values, SOAP::Data->name('a')
143                ->attr({ 'n' => $key })
144                ->value($val)
145            );
146        }
147    }
148
149    my $xpath = $base->soapcall(
150        'CreateAccountRequest',
151        SOAP::Data->name('name')->value($id . '@' . $base->{domain}),
152        SOAP::Data->name('password')->value($pass),
153        @values,
154    );
155
156}
157
158sub _delete {
159    my ($class, $base, $id) = @_;
160
161    my $user = $base->get_object('user', $id) or do {
162        $base->log(LA_ERR, "Cannot get user $id");
163        return;
164    };
165
166    my $xpath = $base->soapcall(
167        'DeleteAccountRequest',
168        SOAP::Data->name('id')->value($user->{zinfo}{zid}),
169    );
170
171}
172
173sub _lists_account {
174    my ($class, $base) = @_;
175
176    my $xpath = $base->soapcall(
177        'GetAllAccountsRequest',
178        SOAP::Data->name('domain')->value($base->{domain})->attr({ by => 'name' }),
179    ) or do {
180        la_log(LA_ERR, "Error while trying to get users list");
181        return;
182    };
183
184    my %users;
185    foreach my $node ($xpath->findnodes('//account')) {
186        my $name = $node->getAttribute('name');
187        foreach ($node->getChildNodes) {
188            $_->getAttribute('n') eq 'uid' and do {
189                $users{$_->string_value} = $name;
190                last;
191            };
192        }
193    }
194
195    %users
196}
197
198sub _get_info {
199    my ($self) = @_;
200
201    my $xpath = $self->base->soapcall(
202        'GetAccountRequest',
203        SOAP::Data->name('account')->value($self->{name})->attr({ by => 'name' }),
204    ) or return;
205    require Data::Dumper;
206    #print Data::Dumper::Dumper($xpath);
207
208    my ($accountnode) = $xpath->findnodes('//account');
209
210    $self->{zinfo}{zid} = $accountnode->getAttribute('id');
211
212    foreach my $node ($xpath->findnodes('//a')) {
213        my $attr = $node->getAttribute('n');
214        if ($self->{zinfo}{$attr}) {
215            if (!ref $self->{zinfo}{$attr}) {
216                my $buf = $self->{zinfo}{$attr};
217                $self->{zinfo}{$attr} = [ $buf, $node->string_value ];
218            } else {
219                push(@{ $self->{zinfo}{$attr} }, $node->string_value);
220            }   
221        } else {
222            $self->{zinfo}{$attr} = $node->string_value;
223        }
224    }
225}
226
227sub list {
228    my ($class, $base) = @_;
229
230    my %users = $class->_lists_account($base);
231    return sort keys(%users);
232}
233
2341;
235
236__END__
237
238=head1 SEE ALSO
239
240=head1 AUTHOR
241
242Olivier Thauvin, E<lt>olivier.thauvin@latmos.ipsl.frE<gt>
243
244=head1 COPYRIGHT AND LICENSE
245
246Copyright (C) 2008, 2009 CNRS SA/CETP/LATMOS
247
248This library is free software; you can redistribute it and/or modify
249it under the same terms as Perl itself, either Perl version 5.10.0 or,
250at your option, any later version of Perl 5 you may have available.
251
252=cut
Note: See TracBrowser for help on using the repository browser.