View | Details | Raw Unified | Return to bug 6979
Collapse All | Expand All

(-)a/C4/Auth_with_ldap.pm (-2 / +3 lines)
Lines 60-65 my $prefhost = $ldap->{hostname} or die ldapserver_error('hostname'); Link Here
60
my $base      = $ldap->{base}		or die ldapserver_error('base');
60
my $base      = $ldap->{base}		or die ldapserver_error('base');
61
$ldapname     = $ldap->{user}		;
61
$ldapname     = $ldap->{user}		;
62
$ldappassword = $ldap->{pass}		;
62
$ldappassword = $ldap->{pass}		;
63
$ldap->{anonymous_bind} = 1 unless $ldapname && $ldappassword;
63
our %mapping  = %{$ldap->{mapping}}; # FIXME dpavlin -- don't die because of || (); from 6eaf8511c70eb82d797c941ef528f4310a15e9f9
64
our %mapping  = %{$ldap->{mapping}}; # FIXME dpavlin -- don't die because of || (); from 6eaf8511c70eb82d797c941ef528f4310a15e9f9
64
my @mapkeys = keys %mapping;
65
my @mapkeys = keys %mapping;
65
$debug and print STDERR "Got ", scalar(@mapkeys), " ldap mapkeys (  total  ): ", join ' ', @mapkeys, "\n";
66
$debug and print STDERR "Got ", scalar(@mapkeys), " ldap mapkeys (  total  ): ", join ' ', @mapkeys, "\n";
Lines 67-73 $debug and print STDERR "Got ", scalar(@mapkeys), " ldap mapkeys ( total ): ", Link Here
67
$debug and print STDERR "Got ", scalar(@mapkeys), " ldap mapkeys (populated): ", join ' ', @mapkeys, "\n";
68
$debug and print STDERR "Got ", scalar(@mapkeys), " ldap mapkeys (populated): ", join ' ', @mapkeys, "\n";
68
69
69
my %config = (
70
my %config = (
70
	anonymous => ($ldapname and $ldappassword) ? 0 : 1,
71
    replicate => defined($ldap->{replicate}) ? $ldap->{replicate} : 1,  #    add from LDAP to Koha database for new user
71
    replicate => defined($ldap->{replicate}) ? $ldap->{replicate} : 1,  #    add from LDAP to Koha database for new user
72
       update => defined($ldap->{update}   ) ? $ldap->{update}    : 1,  # update from LDAP to Koha database for existing user
72
       update => defined($ldap->{update}   ) ? $ldap->{update}    : 1,  # update from LDAP to Koha database for existing user
73
);
73
);
Lines 167-173 sub checkpw_ldap { Link Here
167
            $userldapentry = $search->shift_entry;
167
            $userldapentry = $search->shift_entry;
168
        }
168
        }
169
    } else {
169
    } else {
170
		my $res = ($config{anonymous}) ? $db->bind : $db->bind($ldapname, password=>$ldappassword);
170
		my $res = ($ldap->{anonymous_bind}) ? $db->bind : $db->bind($ldapname, password=>$ldappassword);
171
		if ($res->code) {		# connection refused
171
		if ($res->code) {		# connection refused
172
			warn "LDAP bind failed as ldapuser " . ($ldapname || '[ANONYMOUS]') . ": " . description($res);
172
			warn "LDAP bind failed as ldapuser " . ($ldapname || '[ANONYMOUS]') . ": " . description($res);
173
			return 0;
173
			return 0;
Lines 180-185 sub checkpw_ldap { Link Here
180
            warn "LDAP Auth rejected : invalid password for user '$userid'. " . description($user_ldap_bind_ret);
180
            warn "LDAP Auth rejected : invalid password for user '$userid'. " . description($user_ldap_bind_ret);
181
            return -1;
181
            return -1;
182
        }
182
        }
183
183
	}
184
	}
184
185
185
    # To get here, LDAP has accepted our user's login attempt.
186
    # To get here, LDAP has accepted our user's login attempt.
(-)a/t/db_dependent/Auth_with_ldap.t (-52 / +36 lines)
Lines 37-47 my $anonymous_bind = 1; Link Here
37
# Variables controlling LDAP behaviour
37
# Variables controlling LDAP behaviour
38
my $desired_authentication_result = 'success';
38
my $desired_authentication_result = 'success';
39
my $desired_connection_result     = 'error';
39
my $desired_connection_result     = 'error';
40
my $desired_bind_result           = 'error';
40
my $desired_admin_bind_result     = 'error';
41
my $desired_compare_result        = 'error';
41
my $desired_compare_result        = 'error';
42
my $desired_search_result         = 'error';
42
my $desired_search_result         = 'error';
43
my $desired_count_result          = 1;
43
my $desired_count_result          = 1;
44
my $non_anonymous_bind_result     = 'error';
44
my $desired_bind_result           = 'error';
45
my $ret;
45
my $ret;
46
46
47
# Mock the context module
47
# Mock the context module
Lines 90-96 subtest "checkpw_ldap tests" => sub { Link Here
90
90
91
        $desired_authentication_result = 'success';
91
        $desired_authentication_result = 'success';
92
        $anonymous_bind        = 1;
92
        $anonymous_bind        = 1;
93
        $desired_bind_result   = 'error';
93
        $desired_admin_bind_result   = 'error';
94
        $desired_search_result = 'error';
94
        $desired_search_result = 'error';
95
        reload_ldap_module();
95
        reload_ldap_module();
96
96
Lines 103-117 subtest "checkpw_ldap tests" => sub { Link Here
103
103
104
        $desired_authentication_result = 'success';
104
        $desired_authentication_result = 'success';
105
        $anonymous_bind        = 1;
105
        $anonymous_bind        = 1;
106
        $desired_bind_result   = 'success';
106
        $desired_admin_bind_result   = 'success';
107
        $desired_search_result = 'success';
107
        $desired_search_result = 'success';
108
        $desired_count_result  = 0; # user auth problem
108
        $desired_count_result  = 0; # user auth problem
109
        $non_anonymous_bind_result = 'success';
109
        $desired_bind_result = 'success';
110
        reload_ldap_module();
110
        reload_ldap_module();
111
        is ( C4::Auth_with_ldap::checkpw_ldap( $dbh, 'hola', password => 'hey' ),
111
        is ( C4::Auth_with_ldap::checkpw_ldap( $dbh, 'hola', password => 'hey' ),
112
            0, "checkpw_ldap returns 0 if user lookup returns 0");
112
            0, "checkpw_ldap returns 0 if user lookup returns 0");
113
113
114
        $non_anonymous_bind_result = 'error';
114
        $desired_bind_result = 'error';
115
        reload_ldap_module();
115
        reload_ldap_module();
116
116
117
        warning_like { $ret = C4::Auth_with_ldap::checkpw_ldap(
117
        warning_like { $ret = C4::Auth_with_ldap::checkpw_ldap(
Lines 123-132 subtest "checkpw_ldap tests" => sub { Link Here
123
        # regression tests for bug 12831
123
        # regression tests for bug 12831
124
        $desired_authentication_result = 'error';
124
        $desired_authentication_result = 'error';
125
        $anonymous_bind        = 0;
125
        $anonymous_bind        = 0;
126
        $desired_bind_result   = 'error';
126
        $desired_admin_bind_result   = 'error';
127
        $desired_search_result = 'success';
127
        $desired_search_result = 'success';
128
        $desired_count_result  = 0; # user auth problem
128
        $desired_count_result  = 0; # user auth problem
129
        $non_anonymous_bind_result = 'error';
129
        $desired_bind_result = 'error';
130
        reload_ldap_module();
130
        reload_ldap_module();
131
131
132
        warning_like { $ret = C4::Auth_with_ldap::checkpw_ldap(
132
        warning_like { $ret = C4::Auth_with_ldap::checkpw_ldap(
Lines 145-152 subtest "checkpw_ldap tests" => sub { Link Here
145
145
146
        # Anonymous bind
146
        # Anonymous bind
147
        $anonymous_bind            = 1;
147
        $anonymous_bind            = 1;
148
        $desired_bind_result       = 'error';
148
        $desired_admin_bind_result = 'error';
149
        $non_anonymous_bind_result = 'error';
149
        $desired_bind_result = 'error';
150
        reload_ldap_module();
150
        reload_ldap_module();
151
151
152
        warning_like { $ret = C4::Auth_with_ldap::checkpw_ldap(
152
        warning_like { $ret = C4::Auth_with_ldap::checkpw_ldap(
Lines 156-164 subtest "checkpw_ldap tests" => sub { Link Here
156
        is ( $ret, 0, "checkpw_ldap returns 0 if bind fails");
156
        is ( $ret, 0, "checkpw_ldap returns 0 if bind fails");
157
157
158
        $anonymous_bind            = 1;
158
        $anonymous_bind            = 1;
159
        $desired_bind_result       = 'success';
159
        $desired_admin_bind_result = 'success';
160
        $non_anonymous_bind_result = 'success';
160
        $desired_bind_result = 'error';
161
        $desired_compare_result    = 'error';
162
        reload_ldap_module();
161
        reload_ldap_module();
163
162
164
        warning_like { $ret = C4::Auth_with_ldap::checkpw_ldap(
163
        warning_like { $ret = C4::Auth_with_ldap::checkpw_ldap(
Lines 169-177 subtest "checkpw_ldap tests" => sub { Link Here
169
168
170
        # Non-anonymous bind
169
        # Non-anonymous bind
171
        $anonymous_bind            = 0;
170
        $anonymous_bind            = 0;
172
        $desired_bind_result       = 'success';
171
        $desired_admin_bind_result = 'error';
173
        $non_anonymous_bind_result = 'error';
172
        $desired_bind_result = 'error';
174
        $desired_compare_result    = 'dont care';
175
        reload_ldap_module();
173
        reload_ldap_module();
176
174
177
        warning_like { $ret = C4::Auth_with_ldap::checkpw_ldap(
175
        warning_like { $ret = C4::Auth_with_ldap::checkpw_ldap(
Lines 181-189 subtest "checkpw_ldap tests" => sub { Link Here
181
        is ( $ret, 0, "checkpw_ldap returns 0 if bind fails");
179
        is ( $ret, 0, "checkpw_ldap returns 0 if bind fails");
182
180
183
        $anonymous_bind            = 0;
181
        $anonymous_bind            = 0;
184
        $desired_bind_result       = 'success';
182
        $desired_admin_bind_result = 'success';
185
        $non_anonymous_bind_result = 'success';
183
        $desired_bind_result = 'error';
186
        $desired_compare_result    = 'error';
187
        reload_ldap_module();
184
        reload_ldap_module();
188
185
189
        warning_like { $ret = C4::Auth_with_ldap::checkpw_ldap(
186
        warning_like { $ret = C4::Auth_with_ldap::checkpw_ldap(
Lines 265-305 sub mock_net_ldap { Link Here
265
    my $mocked_ldap = Test::MockObject->new();
262
    my $mocked_ldap = Test::MockObject->new();
266
263
267
    $mocked_ldap->mock( 'bind', sub {
264
    $mocked_ldap->mock( 'bind', sub {
268
265
        if (is_admin_bind(@_)) {
269
        my @args = @_;
266
            return mock_net_ldap_message(
270
        my $mocked_message;
267
                ($desired_admin_bind_result eq 'error' ) ? 1 : 0, # code
271
268
                ($desired_admin_bind_result eq 'error' ) ? 1 : 0, # error
272
        if ( $#args > 1 ) {
269
                ($desired_admin_bind_result eq 'error' ) ? 'error_name' : 0, # error_name
273
            # Args passed => non-anonymous bind
270
                ($desired_admin_bind_result eq 'error' ) ? 'error_text' : 0  # error_text
274
            if ( $non_anonymous_bind_result eq 'error' ) {
275
                return mock_net_ldap_message(1,1,'error_name','error_text');
276
            } else {
277
                return mock_net_ldap_message(0,0,'','');
278
            }
279
        } else {
280
            $mocked_message = mock_net_ldap_message(
281
                ($desired_bind_result eq 'error' ) ? 1 : 0, # code
282
                ($desired_bind_result eq 'error' ) ? 1 : 0, # error
283
                ($desired_bind_result eq 'error' ) ? 'error_name' : 0, # error_name
284
                ($desired_bind_result eq 'error' ) ? 'error_text' : 0  # error_text
285
            );
271
            );
286
        }
287
288
        return $mocked_message;
289
    });
290
291
    $mocked_ldap->mock( 'compare', sub {
292
293
        my $mocked_message;
294
295
        if ( $desired_compare_result eq 'error' ) {
296
            $mocked_message = mock_net_ldap_message(1,1,'error_name','error_text');
297
        } else {
272
        } else {
298
            # we expect return code 6 for success
273
            if ( $desired_bind_result eq 'error' ) {
299
            $mocked_message = mock_net_ldap_message(6,0,'','');
274
                return mock_net_ldap_message(1,1,'error_name','error_text');
275
            }
276
            return mock_net_ldap_message(0,0,'','');
300
        }
277
        }
301
302
        return $mocked_message;
303
    });
278
    });
304
279
305
    $mocked_ldap->mock( 'search', sub {
280
    $mocked_ldap->mock( 'search', sub {
Lines 374-379 sub reload_ldap_module { Link Here
374
    C4::Auth_with_ldap->import;
349
    C4::Auth_with_ldap->import;
375
}
350
}
376
351
352
sub is_admin_bind {
353
    my @args = @_;
354
355
    if ($#args <= 1 || $args[1] eq 'cn=Manager,dc=metavore,dc=com') {
356
        return 1;
357
    }
358
359
    return 0;
360
}
361
377
$dbh->rollback;
362
$dbh->rollback;
378
363
379
1;
364
1;
380
- 

Return to bug 6979