# You should have received a copy of the GNU General Public License
# along with Koha; if not, see <http://www.gnu.org/licenses>.
-use strict;
-#use warnings; FIXME - Bug 2505
+use Modern::Perl;
use Carp;
use C4::Debug;
use C4::Context;
-use C4::Members qw(AddMember);
-use C4::Members::Attributes;
-use C4::Members::AttributeTypes;
use C4::Members::Messaging;
use C4::Auth qw(checkpw_internal);
use Koha::Patrons;
}
my %config = (
- anonymous => ($ldapname and $ldappassword) ? 0 : 1,
+ anonymous => defined ($ldap->{anonymous_bind}) ? $ldap->{anonymous_bind} : 1,
replicate => defined($ldap->{replicate}) ? $ldap->{replicate} : 1, # add from LDAP to Koha database for new user
update => defined($ldap->{update} ) ? $ldap->{update} : 1, # update from LDAP to Koha database for existing user
);
warn sprintf("LDAP Auth rejected : %s gets %d hits\n", $filter->as_string, $count) . description($search);
return 0;
}
- if ($count != 1) {
- warn sprintf("LDAP Auth rejected : %s gets %d hits\n", $filter->as_string, $count);
- return 0;
- }
+ if ($count == 0) {
+ warn sprintf("LDAP Auth rejected : search with filter '%s' returns no hit\n", $filter->as_string);
+ return 0;
+ }
return $search;
}
#$debug and $db->debug(5);
my $userldapentry;
+ # first, LDAP authentication
if ( $ldap->{auth_by_bind} ) {
my $principal_name;
- if ( $ldap->{anonymous_bind} ) {
+ if ( $config{anonymous} ) {
# Perform an anonymous bind
my $res = $db->bind;
# Perform a LDAP bind for the given username using the matched DN
my $res = $db->bind( $principal_name, password => $password );
if ( $res->code ) {
- if ( $ldap->{anonymous_bind} ) {
+ if ( $config{anonymous} ) {
# With anonymous_bind approach we can be sure we have found the correct user
# and that any 'code' response indicates a 'bad' user (be that blocked, banned
# or password changed). We should not fall back to local accounts in this case.
$userldapentry = $search->shift_entry;
}
} else {
- my $res = ($config{anonymous}) ? $db->bind : $db->bind($ldapname, password=>$ldappassword);
+ my $res = ($config{anonymous}) ? $db->bind : $db->bind($ldapname, password=>$ldappassword);
if ($res->code) { # connection refused
warn "LDAP bind failed as ldapuser " . ($ldapname || '[ANONYMOUS]') . ": " . description($res);
return 0;
}
my $search = search_method($db, $userid) or return 0; # warnings are in the sub
- $userldapentry = $search->shift_entry;
- my $cmpmesg = $db->compare( $userldapentry, attr=>'userpassword', value => $password );
- if ($cmpmesg->code != 6) {
- warn "LDAP Auth rejected : invalid password for user '$userid'. " . description($cmpmesg);
- return -1;
- }
- }
+ # Handle multiple branches. Same login exists several times in different branches.
+ my $bind_ok = 0;
+ while (my $entry = $search->shift_entry) {
+ my $user_ldap_bind_ret = $db->bind($entry->dn, password => $password);
+ unless ($user_ldap_bind_ret->code) {
+ $userldapentry = $entry;
+ $bind_ok = 1;
+ last;
+ }
+ }
+
+ unless ($bind_ok) {
+ warn "LDAP Auth rejected : invalid password for user '$userid'.";
+ return -1;
+ }
+
+
+ }
# To get here, LDAP has accepted our user's login attempt.
# But we still have work to do. See perldoc below for detailed breakdown.
return(1, $cardnumber, $local_userid);
}
} elsif ($config{replicate}) { # A2, C2
- $borrowernumber = AddMember(%borrower) or die "AddMember failed";
+ my @columns = Koha::Patrons->columns;
+ my $patron = Koha::Patron->new(
+ {
+ map { exists( $borrower{$_} ) ? ( $_ => $borrower{$_} ) : () } @columns
+ }
+ )->store;
+ die "Insert of new patron failed" unless $patron;
+ $borrowernumber = $patron->borrowernumber;
C4::Members::Messaging::SetMessagingPreferencesFromDefaults( { borrowernumber => $borrowernumber, categorycode => $borrower{'categorycode'} } );
} else {
return 0; # B2, D2
}
if (C4::Context->preference('ExtendedPatronAttributes') && $borrowernumber && ($config{update} ||$config{replicate})) {
- foreach my $attribute_type ( C4::Members::AttributeTypes::GetAttributeTypes() ) {
- my $code = $attribute_type->{code};
+ my $library_id = C4::Context->userenv ? C4::Context->userenv->{'branch'} : undef;
+ my $attribute_types = Koha::Patron::Attribute::Types->search_with_library_limits({}, {}, $library_id);
+ while ( my $attribute_type = $attribute_types->next ) {
+ my $code = $attribute_type->code;
unless (exists($borrower{$code}) && $borrower{$code} !~ m/^\s*$/ ) {
next;
}
- if (C4::Members::Attributes::CheckUniqueness($code, $borrower{$code}, $borrowernumber)) {
- C4::Members::Attributes::UpdateBorrowerAttribute($borrowernumber, {code => $code, attribute => $borrower{$code}});
- } else {
- warn "ERROR_extended_unique_id_failed $code $borrower{$code}";
+ my $patron = Koha::Patrons->find($borrowernumber);
+ if ( $patron ) { # Should not be needed, but we are in C4::Auth LDAP...
+ eval {
+ my $attribute = Koha::Patron::Attribute->new({code => $code, attribute => $borrower{$code}});
+ $patron->extended_attributes([$attribute->unblessed]);
+ };
+ if ($@) { # FIXME Test if Koha::Exceptions::Patron::Attribute::NonRepeatable
+ warn "ERROR_extended_unique_id_failed $code $borrower{$code}";
+ }
}
}
}
my $data = $memberhash{ lc($mapping{$key}->{is}) }; # Net::LDAP returns all names in lowercase
$debug and printf STDERR "mapping %20s ==> %-20s (%s)\n", $key, $mapping{$key}->{is}, $data;
unless (defined $data) {
- $data = $mapping{$key}->{content} || ''; # default or failsafe ''
+ $data = $mapping{$key}->{content} || undef;
}
- $borrower{$key} = ($data ne '') ? $data : ' ' ;
+ $borrower{$key} = $data;
}
$borrower{initials} = $memberhash{initials} ||
( substr($borrower{'firstname'},0,1)
$sth->execute($borrowerid);
return $cardnum;
}
- my $digest = hash_password($password);
+ my $digest = hash_password($password);
$debug and print STDERR "changing local password for borrowernumber=$borrowerid to '$digest'\n";
- Koha::Patrons->find($borrowerid)->update_password( $userid, $digest );
+ Koha::Patrons->find($borrowerid)->set_password({ password => $password, skip_validation => 1 });
my ($ok, $cardnum) = checkpw_internal(C4::Context->dbh, $userid, $password);
return $cardnum if $ok;
my $borrowerid = shift or croak "No borrowerid";
my $borrower = shift or croak "No borrower record";
+ # skip extended patron attributes in 'borrowers' attribute update
my @keys = keys %$borrower;
+ if (C4::Context->preference('ExtendedPatronAttributes')) {
+ my $library_id = C4::Context->userenv ? C4::Context->userenv->{'branch'} : undef;
+ my $attribute_types = Koha::Patron::Attribute::Types->search_with_library_limits({}, {}, $library_id);
+ while ( my $attribute_type = $attribute_types->next ) {
+ my $code = $attribute_type->code;
+ @keys = grep { $_ ne $code } @keys;
+ $debug and printf STDERR "ignoring extended patron attribute '%s' in update_local()\n", $code;
+ }
+ }
+
my $dbh = C4::Context->dbh;
my $query = "UPDATE borrowers\nSET " .
join(',', map {"$_=?"} @keys) .
);
# MODIFY PASSWORD/LOGIN if password was mapped
- _do_changepassword($userid, $borrowerid, $password) if $borrower->{'password'};
+ _do_changepassword($userid, $borrowerid, $password) if exists( $borrower->{'password'} );
}
1;
| contactname | mediumtext | YES | | NULL | |
| contactfirstname | text | YES | | NULL | |
| contacttitle | text | YES | | NULL | |
- | guarantorid | int(11) | YES | MUL | NULL | |
| borrowernotes | mediumtext | YES | | NULL | |
| relationship | varchar(100) | YES | | NULL | |
| ethnicity | varchar(50) | YES | | NULL | |