source: trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Ldap/Group.pm @ 2488

Last change on this file since 2488 was 2488, checked in by nanardon, 3 years ago

Fix ldap class upgrade

File size: 4.2 KB
Line 
1package LATMOS::Accounts::Bases::Ldap::Group;
2
3use 5.010000;
4use strict;
5use warnings;
6
7use base qw(LATMOS::Accounts::Bases::Ldap::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 );
13use LATMOS::Accounts::Log;
14
15our $VERSION = (q$Rev: 649 $ =~ /^Rev: (\d+) /)[0];
16
17=head1 NAME
18
19LATMOS::Ldap - Perl extension for blah blah blah
20
21=head1 SYNOPSIS
22
23  use LATMOS::Ldap;
24  blah blah blah
25
26=head1 DESCRIPTION
27
28Stub documentation for LATMOS::Ldap, created by h2xs. It looks like the
29author of the extension was negligent enough to leave the stub
30unedited.
31
32Blah blah blah.
33
34=head1 FUNCTIONS
35
36=cut
37
38sub _class_filter { '(ObjectClass=posixGroup)' }
39
40sub _key_attr { 'cn' } 
41
42sub _my_ldap_classes { qw(top posixGroup sambaGroupMapping) }
43
44sub _get_attr_schema {
45    my ($class, $base) = @_;
46    $class->SUPER::_get_attr_schema($base,
47    {
48        gidNumber => { uniq => 1, },
49        description => { },
50        memberUID => {
51            multiple => 1,
52            delayed => 1,
53            reference => 'user',
54        },
55        cn => { ro => 1 },
56        dn => { ro => 1 },
57        objectClass => { ro => 1 },
58        sambaSID => {
59            uniq => 1,
60            mandatory => 1,
61        },
62        sambaGroupType => {
63            mandatory => 1,
64        },
65    }
66    );
67}
68
69sub _update_class {
70    my ($self) = @_;
71
72    $self->SUPER::_update_class(
73        sambaSID => $self->base->sambaSID(
74            _computeSSID($self->_get_attributes('gidNumber'))
75        ),
76        sambaGroupType => 5,
77    );
78}
79
80sub _create {
81    my ($class, $base, $id, %data) = @_;
82
83    my $entry = Net::LDAP::Entry->new();
84
85    $data{sambaSID} ||= $base->sambaSID(_computeSSID($data{gidNumber}));
86    $data{sambaGroupType} ||= 5;
87
88    $entry->dn(join(',',
89        sprintf('%s=%s',
90            $class->_dn_attribute($base),
91            escape_filter_value($id)),
92            $base->object_base_dn($class->type),
93    ));
94    $entry->replace(objectClass => [ $class->_my_ldap_classes ],);
95    my %delayed;
96    $data{$class->_key_attribute($base)} = $id;
97    foreach (keys %data) {
98        /^(memberUID)$/ and do {
99            $delayed{memberUID} = $data{$_};
100            next;
101        };
102        $class->_populate_entry($entry, $_, $data{$_});
103    }
104    my $msg = $base->ldap->add($entry);
105    $base->log(LA_ERR, "Cannot create group: %s", $msg->error) if ($msg->code);
106    return if ($msg->code);
107    if (! keys %delayed) { return 1 };
108    my $res = $base->get_object('group', $id)->set_fields(%delayed);
109    return defined($res) ? 1 : 0;
110}
111
112sub _computeSSID {
113    my ($value) = @_;
114    $value * 2 + 1001
115}
116
117sub get_field {
118    my ($self, $field) = @_;
119
120    $field eq 'memberUID' and do {
121        my $val = $self->SUPER::get_field('memberUid');
122        return ref $val ? $val : [ grep { $_ } $val ];
123    };
124    $self->SUPER::get_field($field);
125}
126
127sub set_fields {
128    my ($self, %data) = @_;
129    my %ndata;
130    while (my ($f, $val) = each(%data)) {
131        $f eq 'memberUID' and do {
132            $val = [ $val ] unless(ref $val);
133            my %users;
134            $users{$_}{e} = 1 foreach (@{ $self->get_field('memberUID') || []});
135            $users{$_}{n} = 1 foreach (grep { $_ } @{ $val || []});
136            foreach (keys %users) {
137                $users{$_}{e} && $users{$_}{n} and next;
138                if ($users{$_}{e}) {
139                    $self->{entry}->delete(memberUid => $_);
140                } elsif ($users{$_}{n} && $self->base->get_object('user', $_)) {
141                    $self->{entry}->add(memberUid => $_);
142                } # else {} # can't happen
143                my $mesg = $self->{entry}->update($self->base->ldap);
144            }
145            next;
146        };
147        $ndata{$f} = $val;
148    }
149    $self->SUPER::set_fields(%ndata);
150}
151
1521;
153
154__END__
155
156=head1 SEE ALSO
157
158=head1 AUTHOR
159
160Olivier Thauvin, E<lt>olivier.thauvin@aerov.jussieu.frE<gt>
161
162=head1 COPYRIGHT AND LICENSE
163
164Copyright (C) 2008 CNRS SA/CETP/LATMOS
165
166This library is free software; you can redistribute it and/or modify
167it under the same terms as Perl itself, either Perl version 5.10.0 or,
168at your option, any later version of Perl 5 you may have available.
169
170
171=cut
Note: See TracBrowser for help on using the repository browser.