root/branches/boomer/t/53-grouptsync.t @ 1098

Revision 1098, 7.9 kB (checked in by hachi, 2 years ago)

Branching for boomer from release-19, rev 62318

  • Property svn:keywords set to Author Date Id Revision
Line 
1# $Id$
2
3use strict;
4use MT::Author;
5use MT;
6use strict;
7use MT::Auth;
8
9my $number = 25;
10
11use Test::More tests => 25;
12
13use MT;
14
15use vars qw( $DB_DIR $T_CFG );
16use lib 't/lib', 'extlib', 'lib', '../lib', '../extlib';
17use MT::Test qw(:db :data);
18
19SKIP: {
20eval "require Net::LDAP;";
21if ($@) {
22    skip "Net::LDAP is not installed.", $number;
23}
24eval "require MT::LDAP;";
25if ($@) {
26    skip "MT::LDAP is not found.  Did you enable Enterprise Pack?", $number;
27}
28
29my $mt = MT->new( Config => $T_CFG ) or die MT->errstr;
30if (!MT::ConfigMgr->instance->LDAPUserIdAttribute) {
31    print "Set LDAPUserIdAttribute directive or this test will fail.\n";
32}
33if (!MT::ConfigMgr->instance->LDAPGroupIdAttribute) {
34    print "Set LDAPGroupIdAttribute directive or this test will fail.\n";
35}
36
37&ldapadd_user(
38    name => 'Bob D',
39    email => 'bobd@example.com',
40    displayName => 'Dylan',
41);
42my ($entry) = &ldapsearch(
43                    filter => '(cn=Bob D)',
44                    attrs => [MT::ConfigMgr->instance->LDAPUserIdAttribute]
45                );
46
47my $author = MT::Author->load({ name => 'Bob D' });
48ok($author);
49ok($author->is_active);
50$author->external_id($entry->get_value(MT::ConfigMgr->instance->LDAPUserIdAttribute));
51$author->save;
52
53&ldapadd_group(
54    name => 'Group 1',
55    members => [ 'Bob D' ],
56);
57my ($entry) = &ldapsearch(
58                    filter => '(cn=Group 1)',
59                    attrs => [MT::ConfigMgr->instance->LDAPGroupIdAttribute]
60                );
61
62ok(MT::Auth->synchronize_group);
63
64my $group = MT::Group->load({ name => 'Group 1' }, {cached_ok=>0});
65is($group->name, 'Group 1');
66ok($group->is_active);
67is($group->user_count, 1);
68my $iter1 = $group->user_iter();
69while (my $user = $iter1->()) {
70    is($user->name, $author->name);
71    is($user->external_id, $author->external_id);
72}
73
74&ldapadd_user(
75    name => 'Chuck D',
76    email => 'chuckd@example.com',
77    displayName => 'Chuck',
78);
79my ($entry2) = &ldapsearch(
80                    filter => '(cn=Chuck D)',
81                    attrs => [MT::ConfigMgr->instance->LDAPUserIdAttribute]
82                );
83
84my $authorC = MT::Author->load({ name => 'Chuck D' });
85ok($authorC);
86ok($authorC->is_active);
87$authorC->external_id($entry2->get_value(MT::ConfigMgr->instance->LDAPUserIdAttribute));
88$authorC->save;
89
90&ldapmodify(
91    name => 'Group 1',
92    newname => 'New Group',
93    newnick => 'Group name modified',
94    members => [ 'Bob D', 'Chuck D' ],
95);
96
97ok(MT::Auth->synchronize_group);
98
99my $groupX = MT::Group->load({ name => 'Group 1' }, {cached_ok=>0});
100ok(!$groupX);
101my $group2 = MT::Group->load({ name => 'New Group' }, {cached_ok=>0});
102is($group2->name, 'New Group');
103ok($group2->is_active);
104is($group2->user_count, 2);
105my $iter2 = $group->user_iter({}, { sort => 'name' });
106my $user2 = $iter2->();
107is($user2->name, 'Bob D');
108my $user3 = $iter2->();
109is($user3->name, 'Chuck D');
110
111&ldapmodify(
112    name => 'New Group',
113    newname => 'New Group',
114    newnick => 'Group name modified',
115    members => [ 'Chuck D' ],
116);
117
118ok(MT::Auth->synchronize_group);
119
120my $group3 = MT::Group->load({ name => 'New Group' }, {cached_ok=>0});
121is($group3->user_count, 1);
122my $iter3 = $group3->user_iter({}, { sort => 'name' });
123my $user3 = $iter3->();
124is($user3->name, 'Chuck D');
125
126&ldapdelete( name => 'New Group' );
127
128ok(MT::Auth->synchronize_group);
129
130my $group4 = MT::Group->load({ name => 'New Group' }, {cached_ok=>0});
131ok(!$group4); # We remove groups upon synchronization instead of disabling
132
133&ldapadd_group(
134    name => 'New Group',
135    members => [ 'Bob D' ],
136);
137
138ok(MT::Auth->synchronize_group);
139
140SKIP: {
141skip "These can't be run with our intensive caching.", 2;
142my $group5 = MT::Group->load({ name => 'New Group' }, {cached_ok=>0});
143ok($group5);
144ok(!$group5->is_active);  ## make sure newly created group with the same name does not re-activate an group.
145}
146
147&ldapdelete( name => 'New Group' );
148&ldapdelete( name => 'Bob D' );
149&ldapdelete( name => 'Chuck D' );
150} # end of SKIP block
151
152sub _ldapbind {
153    my ($auth, $ldap) = @_;
154    my $res;
155    my $base = $auth->{base};
156    my $bind_dn = $auth->{bind_dn};
157    my $bind_password = $auth->{bind_password};
158    my $sasl_mechanism = $auth->{sasl_mechanism};
159    my $uid_attr_name = $auth->{uid_attr_name};
160    my $filter = $auth->{filter};
161    my $scope = $auth->{scope};
162    if (!$bind_dn) {
163        $res = $ldap->bind;
164    } else {
165        if ($sasl_mechanism eq 'PLAIN') {
166            $res = $ldap->bind($bind_dn, password => $bind_password);
167        } else {
168            require Authen::SASL;
169            my $sasl = Authen::SASL->new(
170                mechanism => $sasl_mechanism,
171                callback => {
172                    pass => $bind_password,
173                    user => $bind_dn,
174                },
175            );
176            $res = $ldap->bind($bind_dn, sasl => $sasl);
177        }
178    }
179    1;
180}
181   
182use MT::Auth;
183use MT::Auth::LDAP;
184
185sub ldapadd_user {
186    my (%opt) = @_;
187    my $auth = MT::LDAP->new;
188    my $ldap = $auth->ldap;
189    _ldapbind($auth, $ldap);
190    my $base = $auth->{base};
191    my $dn = "cn=$opt{name},$base";
192    my $result = $ldap->add( $dn,
193                        attr => [
194                         $auth->{uid_attr_name} => [$opt{name}],
195                         'cn'   => [$opt{name}],
196                         'sn'   => $opt{name},                         
197                         MT::ConfigMgr->instance->LDAPUserFullNameAttribute => $opt{displayName},
198                         MT::ConfigMgr->instance->LDAPUserEmailAttribute => $opt{email},
199                         'objectclass' => ['top', 'person',
200                                           'organizationalPerson',
201                                           'inetOrgPerson' ],
202                       ]
203                     );
204    $result->code && warn "failed to add entry: ", $result->error ;
205    my $mesg = $ldap->unbind;  # take down session
206    1;
207}
208
209sub ldapadd_group {
210    my (%opt) = @_;
211    my $auth = MT::LDAP->new;
212    my $ldap = $auth->ldap;
213    _ldapbind($auth, $ldap);
214    my $base = $auth->{base};
215    my $dn = "cn=$opt{name},$base";
216    my $cfg = MT::ConfigMgr->instance;
217    my $result = $ldap->add( $dn,
218                        attr => [
219                         $cfg->LDAPGroupNameAttribute => [$opt{name}],
220                         $cfg->LDAPGroupMemberAttribute => @{$opt{members}},
221                         'objectclass' => ['top', 'posixGroup'],
222                         'gidNumber' => int(rand(100)),
223                       ]
224                     );
225    $result->code && warn "failed to add entry: ", $result->error ;
226    my $mesg = $ldap->unbind;  # take down session
227    1;
228}
229
230sub ldapmodify {
231    my (%opt) = @_;
232    my $auth = MT::LDAP->new;
233    my $ldap = $auth->ldap;
234    my $cfg = MT::ConfigMgr->instance;
235    _ldapbind($auth, $ldap);
236    my $base = $auth->{base};
237    my $dn = "cn=$opt{name},$base";
238    my $mesg = $ldap->moddn( $dn, newrdn => "cn=$opt{newname}" );
239    $dn = "cn=$opt{newname},$base";
240    my $result = $ldap->modify( $dn,
241                        changes => [replace => [
242                         $cfg->LDAPGroupNameAttribute => [$opt{newname}],
243                         #$cfg->LDAPGroupFullNameAttribute => $opt{newnick},
244                         $cfg->LDAPGroupMemberAttribute => $opt{members},
245                        ]]
246                     );
247    $result->code && warn "failed to modify entry: ", $result->error ;
248    $mesg = $ldap->unbind;  # take down session
249    1;
250}
251
252sub ldapdelete {
253    my (%opt) = @_;
254    my $auth = MT::LDAP->new;
255    my $ldap = $auth->ldap;
256    _ldapbind($auth, $ldap);
257    my $base = $auth->{base};
258    my $dn = "cn=$opt{name},$base";
259    my $result = $ldap->delete($dn);
260    $result->code && warn "failed to delete entry: ", $result->error ;
261    my $mesg = $ldap->unbind;  # take down session
262    1;
263}
264
265sub ldapsearch {
266    my (%opt) = @_;
267    my $auth = MT::LDAP->new;
268    my $ldap = $auth->ldap;
269    _ldapbind($auth, $ldap);
270    my $base = $auth->{base};
271    my $res = $ldap->search(
272        base => $base,
273        filter => $opt{filter},
274        attrs => $opt{attrs},
275    );
276    $res->entries;
277}
278
2791;
Note: See TracBrowser for help on using the browser.