source: LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Ad/User.pm @ 188

Last change on this file since 188 was 188, checked in by nanardon, 15 years ago
  • remove debug warn
  • Property svn:keywords set to Id Rev
File size: 5.1 KB
Line 
1package LATMOS::Accounts::Bases::Ad::User;
2
3use 5.010000;
4use strict;
5use warnings;
6
7use base qw(LATMOS::Accounts::Bases::Ad::objects);
8use Net::LDAP;
9use Net::LDAP::Entry;
10use Net::LDAP::Control::Paged;
11use Net::LDAP::Constant qw( LDAP_CONTROL_PAGED ); 
12use Net::LDAP::Util     qw( escape_filter_value );
13
14our $VERSION = (q$Rev$ =~ /^Rev: (\d+) /)[0];
15
16=head1 NAME
17
18LATMOS::Ad - Perl extension for blah blah blah
19
20=head1 SYNOPSIS
21
22  use LATMOS::Ad;
23  blah blah blah
24
25=head1 DESCRIPTION
26
27Stub documentation for LATMOS::Ad, created by h2xs. It looks like the
28author of the extension was negligent enough to leave the stub
29unedited.
30
31Blah blah blah.
32
33=head1 FUNCTIONS
34
35=cut
36
37sub _class_filter { '(&(ObjectClass=user) (!(ObjectClass=computer)))' }
38
39sub _key_attr { 'cn' } 
40
41sub _delayed_fields {
42    my ($self)= @_;
43    return qw(memberOf);
44}
45
46sub _canonical_fields {
47    my ($self, $base, $mode) = @_;
48    (
49        qw(
50        sn name givenName
51        sAMAccountName uid gecos
52        homeDirectory loginShell
53        uidNumber gidNumber gecos
54        userPassword
55        shadowLastChange shadowMin shadowMax
56        shadowWarning shadowInactive shadowExpire
57        shadowFlag
58        description
59        mail
60        ipPhone otherTelephone department
61        title modbile homePhone
62        memberOf
63        accountExpires
64        streetAddress postalCode postOfficeBox l
65        physicalDeliveryOfficeName
66        company st
67        displayName
68        initials
69        manager
70        userAccountControl
71        locked
72        ),
73        ($mode !~ /w/
74            ? qw(cn dn uSNCreated uSNChanged directReports)
75            : ()
76        )
77    )
78}
79
80sub _create {
81    my ($class, $base, $id, %data) = @_;
82
83    my $entry = Net::LDAP::Entry->new();
84
85    $entry->dn(join(',',
86        sprintf('cn=%s', escape_filter_value($id)),
87        $base->object_base_dn($class->type),
88    ));
89    $entry->replace('sAMAccountName', $id);
90    $entry->replace(objectClass => [ qw(top person organizationalPerson user)],);
91    $entry->replace(userAccountControl => 66112);
92    $entry->replace(sAMAccountType => 0x30000000);
93    $entry->replace(accountExpires => '9223372036854775807'); # TODO hardcoded, burk
94    $entry->replace(userPrincipalName => "$id\@" . $base->ad_domain);
95    foreach (keys %data) {
96        $class->_populate_entry($entry, $_, $data{$_});
97    }
98    my $msg = $base->ldap->add($entry);
99    return $msg->code ? 0 : 1;
100}
101
102sub get_field {
103    my ($self, $field) = @_;
104
105    $field eq 'memberOf' and do {
106        my @res;
107        $self->base->_unlimited_search(
108            base => $self->base->object_base_dn('group'),
109            filter => sprintf(
110                '(&(objectClass=group)(member=%s))',
111                escape_filter_value($self->{entry}->dn),
112            ),
113            callback => sub {
114                my ($mesg, $entry) = @_;
115                ref $entry eq 'Net::LDAP::Entry' or return;
116                push(@res, $entry->get_value('cn'));
117            },
118        );
119        return [ sort(@res) ];
120    };
121    $field eq 'directReports' and do {
122        my $res = $self->SUPER::get_field($field);
123        return [ map { $self->base->get_value('cn') } @{ ref $res ? $res : [ $res ] } ];
124    };
125    $field eq 'manager' and do {
126        my $entry = $self->SUPER::get_field($field) or return;
127        return $entry->get_value('cn');
128    };
129    $self->SUPER::get_field($field);
130}
131
132sub set_fields {
133    my ($self, %data) = @_;
134    my %ndata;
135    while (my ($f, $val) = each(%data)) {
136        $f eq 'memberOf' and do {
137            my %users;
138            $users{$_}{e} = 1 foreach (@{ $self->get_field('memberOf') || []});
139            $users{$_}{n} = 1 foreach (@{ $val || []});
140            foreach (keys %users) {
141                $users{$_}{e} && $users{$_}{n} and next;
142                my $user = $self->base->get_object('group', $_) or next;
143                if ($users{$_}{e}) {
144                    $self->{entry}->del(memberOf => $user->get_field('dn'));
145                } elsif ($users{$_}{n}) {
146                    $self->{entry}->add(memberOf => $user->get_field('dn'));
147                } # else {} # can't happen
148                my $mesg = $self->{entry}->update($self->base->ldap);
149            }
150            next;
151        };
152        $f eq 'manager' && $val and do {
153            my $user = $self->base->get_object('user', $val) or next;
154            $ndata{$f} = $user->get_field('dn');
155            next;
156        };
157        $f eq 'locked' and do {
158            my $uac = $self->get_field('userAccountControl');
159            if ($val) {
160                $uac |= 0x00000002;
161            } else {
162                $uac &= (0xFFFFFFFF ^ 0x00000002);
163            }
164            $ndata{userAccountControl} = "$uac";
165            next;
166        };
167        $ndata{$f} = $val;
168    }
169    $self->SUPER::set_fields(%ndata);
170}
171
1721;
173
174__END__
175
176=head1 SEE ALSO
177
178=head1 AUTHOR
179
180Olivier Thauvin, E<lt>olivier.thauvin@aerov.jussieu.frE<gt>
181
182=head1 COPYRIGHT AND LICENSE
183
184Copyright (C) 2008 CNRS SA/CETP/LATMOS
185
186This library is free software; you can redistribute it and/or modify
187it under the same terms as Perl itself, either Perl version 5.10.0 or,
188at your option, any later version of Perl 5 you may have available.
189
190
191=cut
Note: See TracBrowser for help on using the repository browser.