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

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

sambaGroupType is mandatory

File size: 4.1 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
87    $entry->dn(join(',',
88        sprintf('%s=%s',
89            $class->_dn_attribute($base),
90            escape_filter_value($id)),
91            $base->object_base_dn($class->type),
92    ));
93    $entry->replace(objectClass => [ $class->_my_ldap_classes ],);
94    my %delayed;
95    $data{$class->_key_attribute($base)} = $id;
96    foreach (keys %data) {
97        /^(memberUID)$/ and do {
98            $delayed{memberUID} = $data{$_};
99            next;
100        };
101        $class->_populate_entry($entry, $_, $data{$_});
102    }
103    my $msg = $base->ldap->add($entry);
104    $base->log(LA_ERR, "Cannot create group: %s", $msg->error) if ($msg->code);
105    return if ($msg->code);
106    if (! keys %delayed) { return 1 };
107    my $res = $base->get_object('group', $id)->set_fields(%delayed);
108    return defined($res) ? 1 : 0;
109}
110
111sub _computeSSID {
112    my ($value) = @_;
113    $value * 2 + 1000
114}
115
116sub get_field {
117    my ($self, $field) = @_;
118
119    $field eq 'memberUID' and do {
120        my $val = $self->SUPER::get_field('memberUid');
121        return ref $val ? $val : [ grep { $_ } $val ];
122    };
123    $self->SUPER::get_field($field);
124}
125
126sub set_fields {
127    my ($self, %data) = @_;
128    my %ndata;
129    while (my ($f, $val) = each(%data)) {
130        $f eq 'memberUID' and do {
131            $val = [ $val ] unless(ref $val);
132            my %users;
133            $users{$_}{e} = 1 foreach (@{ $self->get_field('memberUID') || []});
134            $users{$_}{n} = 1 foreach (grep { $_ } @{ $val || []});
135            foreach (keys %users) {
136                $users{$_}{e} && $users{$_}{n} and next;
137                if ($users{$_}{e}) {
138                    $self->{entry}->delete(memberUid => $_);
139                } elsif ($users{$_}{n} && $self->base->get_object('user', $_)) {
140                    $self->{entry}->add(memberUid => $_);
141                } # else {} # can't happen
142                my $mesg = $self->{entry}->update($self->base->ldap);
143            }
144            next;
145        };
146        $ndata{$f} = $val;
147    }
148    $self->SUPER::set_fields(%ndata);
149}
150
1511;
152
153__END__
154
155=head1 SEE ALSO
156
157=head1 AUTHOR
158
159Olivier Thauvin, E<lt>olivier.thauvin@aerov.jussieu.frE<gt>
160
161=head1 COPYRIGHT AND LICENSE
162
163Copyright (C) 2008 CNRS SA/CETP/LATMOS
164
165This library is free software; you can redistribute it and/or modify
166it under the same terms as Perl itself, either Perl version 5.10.0 or,
167at your option, any later version of Perl 5 you may have available.
168
169
170=cut
Note: See TracBrowser for help on using the repository browser.