| 1 | # $Id$ |
|---|
| 2 | |
|---|
| 3 | use strict; |
|---|
| 4 | my $number = 15; |
|---|
| 5 | |
|---|
| 6 | use Test::More; |
|---|
| 7 | |
|---|
| 8 | use lib 't/lib', 'extlib', 'lib', '../lib', '../extlib'; |
|---|
| 9 | use MT; |
|---|
| 10 | use vars qw( $DB_DIR $T_CFG ); |
|---|
| 11 | use MT::Test; |
|---|
| 12 | |
|---|
| 13 | my $mt = MT->instance or die MT->errstr; |
|---|
| 14 | SKIP: { |
|---|
| 15 | if ( !$mt->component('enterprise') ) { |
|---|
| 16 | plan skip_all => "Enterprise pack is not installed"; |
|---|
| 17 | } else { |
|---|
| 18 | plan tests => $number; |
|---|
| 19 | } |
|---|
| 20 | |
|---|
| 21 | eval "require Net::LDAP;"; |
|---|
| 22 | if ($@) { |
|---|
| 23 | skip "Net::LDAP is not installed.", $number; |
|---|
| 24 | } |
|---|
| 25 | eval "require MT::LDAP;"; |
|---|
| 26 | if ($@) { |
|---|
| 27 | skip "MT::LDAP is not found. Did you enable Enterprise Pack?", $number; |
|---|
| 28 | } |
|---|
| 29 | { |
|---|
| 30 | # @test create MT object |
|---|
| 31 | MT::Test->import( qw(:db :data) ); |
|---|
| 32 | |
|---|
| 33 | ok($mt); |
|---|
| 34 | |
|---|
| 35 | # @test create MT::LDAP object |
|---|
| 36 | my $ldap = MT::LDAP->new; |
|---|
| 37 | ok($ldap); |
|---|
| 38 | |
|---|
| 39 | $ldap->bind_ldap; |
|---|
| 40 | |
|---|
| 41 | my $filter = '(uid=Bob)'; |
|---|
| 42 | my $attrs = [ |
|---|
| 43 | 'cn', |
|---|
| 44 | 'mail', |
|---|
| 45 | 'displayName', |
|---|
| 46 | MT->config->LDAPUserIdAttribute |
|---|
| 47 | ]; |
|---|
| 48 | |
|---|
| 49 | # @test search unavailable user |
|---|
| 50 | my @ldap_entries = $ldap->search_ldap( |
|---|
| 51 | filter => $filter, |
|---|
| 52 | attrs => $attrs); |
|---|
| 53 | |
|---|
| 54 | is($#ldap_entries, 0); |
|---|
| 55 | |
|---|
| 56 | &ldapadd( |
|---|
| 57 | name => 'Bob D', |
|---|
| 58 | email => 'bobd@example.com', |
|---|
| 59 | displayName => 'Dylan', |
|---|
| 60 | uid => 'Bob', |
|---|
| 61 | ); |
|---|
| 62 | |
|---|
| 63 | # @test search available user |
|---|
| 64 | @ldap_entries = $ldap->search_ldap( |
|---|
| 65 | filter => $filter, |
|---|
| 66 | attrs => $attrs); |
|---|
| 67 | |
|---|
| 68 | is(@ldap_entries, 1); |
|---|
| 69 | |
|---|
| 70 | # @test valid login |
|---|
| 71 | my $res = $ldap->can_login( |
|---|
| 72 | 'cn=Bob D,'.$ldap->{base}, |
|---|
| 73 | 'Bob', |
|---|
| 74 | 'password'); |
|---|
| 75 | ok($res); |
|---|
| 76 | |
|---|
| 77 | |
|---|
| 78 | # @test invalid login (password invalid) |
|---|
| 79 | my $res = $ldap->can_login( |
|---|
| 80 | 'cn=Bob D,'.$ldap->{base}, |
|---|
| 81 | 'Bob', |
|---|
| 82 | 'bob'); |
|---|
| 83 | ok(!$res); |
|---|
| 84 | |
|---|
| 85 | |
|---|
| 86 | # @test get user dn |
|---|
| 87 | my $dn = $ldap->get_dn('Bob'); |
|---|
| 88 | is($dn, 'cn=Bob D,'.$ldap->{base}); |
|---|
| 89 | |
|---|
| 90 | # @test user attribute validation |
|---|
| 91 | my $entry = $ldap->get_entry_by_name('Bob', $attrs); |
|---|
| 92 | |
|---|
| 93 | ok($entry); |
|---|
| 94 | is($entry->get_value('cn'), 'Bob D'); |
|---|
| 95 | is($entry->get_value('mail'), 'bobd@example.com'); |
|---|
| 96 | is($entry->get_value('displayName'), 'Dylan'); |
|---|
| 97 | |
|---|
| 98 | my $uuid = $entry->get_value(MT->config->LDAPUserIdAttribute); |
|---|
| 99 | |
|---|
| 100 | # @test user attribute validation |
|---|
| 101 | $entry = $ldap->get_entry_by_uuid($uuid, $attrs); |
|---|
| 102 | |
|---|
| 103 | ok($entry); |
|---|
| 104 | is($entry->get_value('cn'), 'Bob D'); |
|---|
| 105 | is($entry->get_value('mail'), 'bobd@example.com'); |
|---|
| 106 | is($entry->get_value('displayName'), 'Dylan'); |
|---|
| 107 | |
|---|
| 108 | |
|---|
| 109 | $ldap->unbind_ldap; |
|---|
| 110 | |
|---|
| 111 | &ldapdelete( name => 'Bob D' ); |
|---|
| 112 | } |
|---|
| 113 | |
|---|
| 114 | } # end of skip block |
|---|
| 115 | |
|---|
| 116 | sub _ldapbind { |
|---|
| 117 | my ($auth, $ldap) = @_; |
|---|
| 118 | my $res; |
|---|
| 119 | my $base = $auth->{base}; |
|---|
| 120 | my $bind_dn = $auth->{bind_dn}; |
|---|
| 121 | my $bind_password = $auth->{bind_password}; |
|---|
| 122 | my $sasl_mechanism = $auth->{sasl_mechanism}; |
|---|
| 123 | my $uid_attr_name = $auth->{uid_attr_name}; |
|---|
| 124 | my $filter = $auth->{filter}; |
|---|
| 125 | my $scope = $auth->{scope}; |
|---|
| 126 | if (!$bind_dn) { |
|---|
| 127 | $res = $ldap->bind; |
|---|
| 128 | } else { |
|---|
| 129 | if ($sasl_mechanism eq 'PLAIN') { |
|---|
| 130 | $res = $ldap->bind($bind_dn, password => $bind_password); |
|---|
| 131 | } else { |
|---|
| 132 | require Authen::SASL; |
|---|
| 133 | my $sasl = Authen::SASL->new( |
|---|
| 134 | mechanism => $sasl_mechanism, |
|---|
| 135 | callback => { |
|---|
| 136 | pass => $bind_password, |
|---|
| 137 | user => $bind_dn, |
|---|
| 138 | }, |
|---|
| 139 | ); |
|---|
| 140 | $res = $ldap->bind($bind_dn, sasl => $sasl); |
|---|
| 141 | } |
|---|
| 142 | } |
|---|
| 143 | 1; |
|---|
| 144 | } |
|---|
| 145 | |
|---|
| 146 | sub ldapadd { |
|---|
| 147 | my (%opt) = @_; |
|---|
| 148 | my $auth = MT::LDAP->new; |
|---|
| 149 | my $ldap = $auth->{ldap}; |
|---|
| 150 | _ldapbind($auth, $ldap); |
|---|
| 151 | my $base = $auth->{base}; |
|---|
| 152 | my $dn = "cn=$opt{name},$base"; |
|---|
| 153 | my $result = $ldap->add( $dn, |
|---|
| 154 | attr => [ |
|---|
| 155 | $auth->{uid_attr_name} => [$opt{name}], |
|---|
| 156 | 'cn' => [$opt{name}], |
|---|
| 157 | 'sn' => $opt{name}, |
|---|
| 158 | 'uid' => $opt{uid}, |
|---|
| 159 | #'userPassword' => ["{CRYPT}kVY9KP1SHbGN2"], |
|---|
| 160 | 'userPassword' => ["{SSHA}P3KrGHWOjo/b+haSXBGGHtJjonkeLgDt"], |
|---|
| 161 | MT->config->LDAPUserFullNameAttribute => $opt{displayName}, |
|---|
| 162 | MT->config->LDAPUserEmailAttribute => $opt{email}, |
|---|
| 163 | 'objectclass' => ['top', 'person', |
|---|
| 164 | 'organizationalPerson', |
|---|
| 165 | 'inetOrgPerson' ], |
|---|
| 166 | ] |
|---|
| 167 | ); |
|---|
| 168 | $result->code && warn "failed to add entry: ", $result->error ; |
|---|
| 169 | my $mesg = $ldap->unbind; # take down session |
|---|
| 170 | 1; |
|---|
| 171 | } |
|---|
| 172 | |
|---|
| 173 | sub ldapdelete { |
|---|
| 174 | my (%opt) = @_; |
|---|
| 175 | my $auth = MT::LDAP->new; |
|---|
| 176 | my $ldap = $auth->{ldap}; |
|---|
| 177 | _ldapbind($auth, $ldap); |
|---|
| 178 | my $base = $auth->{base}; |
|---|
| 179 | my $dn = "cn=$opt{name},$base"; |
|---|
| 180 | my $result = $ldap->delete($dn); |
|---|
| 181 | $result->code && warn "failed to delete entry: ", $result->error ; |
|---|
| 182 | my $mesg = $ldap->unbind; # take down session |
|---|
| 183 | 1; |
|---|
| 184 | } |
|---|
| 185 | |
|---|
| 186 | 1; |
|---|