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

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

Add support for GroupOfNames? object in ldap (from group)

File size: 4.1 KB
Line 
1package LATMOS::Accounts::Bases::Ldap::Groupofnames;
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 is_supported {
39    my ($class, $base) = @_;
40    return $base->config('groupofnames_container') ? 1 : 0;
41}
42
43
44sub _class_filter { '(ObjectClass=groupOfNames)' }
45
46sub _key_attr { 'cn' } 
47
48sub _my_ldap_classes { qw(top groupOfNames) }
49
50sub _get_attr_schema {
51    my ($class, $base) = @_;
52    $class->SUPER::_get_attr_schema($base,
53    {
54        description => { },
55        member => {
56            mandatory => 1,
57            multiple => 1,
58            reference => 'user',
59        },
60        cn => { ro => 1 },
61        dn => { ro => 1 },
62        objectClass => { ro => 1 },
63    }
64    );
65}
66
67sub _create {
68    my ($class, $base, $id, %data) = @_;
69
70    my $entry = Net::LDAP::Entry->new();
71
72    $entry->dn(join(',',
73        sprintf('%s=%s',
74            $class->_dn_attribute($base),
75            escape_filter_value($id)),
76            $base->object_base_dn($class->type),
77    ));
78    $entry->replace(objectClass => [ $class->_my_ldap_classes ],);
79    my %delayed;
80    $data{$class->_key_attribute($base)} = $id;
81    foreach (keys %data) {
82        /^(member)$/ and do {
83            my @DNs;
84            foreach my $user ( ref $data{$_} ? @{ $data{$_} } : $data{$_} ) {
85                my $OUser = $base->get_object('user', $user) or next;
86                push(@DNs, $OUser->{entry}->dn);
87            }
88            $data{$_} = \@DNs;
89        };
90        $class->_populate_entry($entry, $_, $data{$_});
91    }
92    my $msg = $base->ldap->add($entry);
93    $base->log(LA_ERR, "Cannot create group: %s", $msg->error) if ($msg->code);
94    return if ($msg->code);
95    if (! keys %delayed) { return 1 };
96    my $res = $base->get_object('group', $id)->set_fields(%delayed);
97    return defined($res) ? 1 : 0;
98}
99
100sub get_field {
101    my ($self, $field) = @_;
102
103    $field eq 'member' and do {
104        my @res;
105        foreach my $dn ($self->{entry}->get_value('member')) {
106            my $User = $self->base->_get_object_from_dn($dn) or next;
107            push(@res, $User->get_value( LATMOS::Accounts::Bases::Ldap::User::_key_attr() ) );
108        }
109        return [ sort(@res) ];
110    };
111
112    $self->SUPER::get_field($field);
113}
114
115sub set_fields {
116    my ($self, %data) = @_;
117    my %ndata;
118    while (my ($f, $val) = each(%data)) {
119        $f eq 'member' and do {
120            my %users;
121            $val = [ $val ] unless(ref $val);
122            $users{$_}{e} = 1 foreach (grep { defined($_) } @{ $self->get_field('member') || []});
123            $users{$_}{n} = 1 foreach (grep { defined($_) } @{ $val || []});
124            foreach (keys %users) {
125                $users{$_}{e} && $users{$_}{n} and next;
126                my $user = $self->base->get_object('user', $_) or next;
127                if ($users{$_}{e}) {
128                    $self->{entry}->delete(member => $user->get_field('dn'));
129                } elsif ($users{$_}{n}) {
130                    $self->{entry}->add(member => $user->get_field('dn'));
131                } # else {} # can't happen
132            }
133            next;
134        };
135        $ndata{$f} = $val;
136    }
137    $self->SUPER::set_fields(%ndata);
138}
139
1401;
141
142__END__
143
144=head1 SEE ALSO
145
146=head1 AUTHOR
147
148Olivier Thauvin, E<lt>olivier.thauvin@aerov.jussieu.frE<gt>
149
150=head1 COPYRIGHT AND LICENSE
151
152Copyright (C) 2008 CNRS SA/CETP/LATMOS
153
154This library is free software; you can redistribute it and/or modify
155it under the same terms as Perl itself, either Perl version 5.10.0 or,
156at your option, any later version of Perl 5 you may have available.
157
158
159=cut
Note: See TracBrowser for help on using the repository browser.