# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
-# You should have received a copy of the GNU General Public License along with
-# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
-# Suite 330, Boston, MA 02111-1307 USA
+# You should have received a copy of the GNU General Public License along
+# with Koha; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
use strict;
-# use warnings; almost?
+#use warnings; FIXME - Bug 2505
use Digest::MD5 qw(md5_base64);
use C4::Debug;
use C4::Context;
use C4::Members qw(AddMember changepassword);
+use C4::Members::Attributes;
+use C4::Members::AttributeTypes;
use C4::Utils qw( :all );
+use List::MoreUtils qw( any );
use Net::LDAP;
use Net::LDAP::Filter;
my $base = $ldap->{base} or die ldapserver_error('base');
$ldapname = $ldap->{user} ;
$ldappassword = $ldap->{pass} ;
-our %mapping = %{$ldap->{mapping}} || (); # or die ldapserver_error('mapping');
+our %mapping = %{$ldap->{mapping}}; # FIXME dpavlin -- don't die because of || (); from 6eaf8511c70eb82d797c941ef528f4310a15e9f9
my @mapkeys = keys %mapping;
$debug and print STDERR "Got ", scalar(@mapkeys), " ldap mapkeys ( total ): ", join ' ', @mapkeys, "\n";
@mapkeys = grep {defined $mapping{$_}->{is}} @mapkeys;
my $userid = shift or return;
my $uid_field = $mapping{userid}->{is} or die ldapserver_error("mapping for 'userid'");
my $filter = Net::LDAP::Filter->new("$uid_field=$userid") or die "Failed to create new Net::LDAP::Filter";
- 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 = $db->search(
base => $base,
filter => $filter,
$debug and warn "LDAP bind failed as kohauser $principal_name: ". description($res);
return 0;
}
+
+ # FIXME dpavlin -- we really need $userldapentry leater on even if using auth_by_bind!
+
+ # BUG #5094
+ # 2010-08-04 JeremyC
+ # a $userldapentry is only needed if either updating or replicating are enabled
+ if($config{update} or $config{replicate}) {
+ my $search = search_method($db, $userid) or return 0; # warnings are in the sub
+ $userldapentry = $search->shift_entry;
+ }
+
} else {
+ 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 );
($cardnumber eq $c2) or warn "update_local returned cardnumber '$c2' instead of '$cardnumber'";
} else { # C1, D1
# maybe update just the password?
+ return(1, $cardnumber, $local_userid);
}
} elsif ($config{replicate}) { # A2, C2
$borrowernumber = AddMember(%borrower) or die "AddMember failed";
- } else {
+ } else {
return 0; # B2, D2
}
- return(1, $cardnumber);
+ if (C4::Context->preference('ExtendedPatronAttributes') && $borrowernumber && ($config{update} ||$config{replicate})) {
+ my @types = C4::Members::AttributeTypes::GetAttributeTypes();
+ my @attributes = grep{my $key=$_; any{$_ eq $key}@types;} keys %borrower;
+ my $extended_patron_attributes;
+ @{$extended_patron_attributes} =
+ map { { code => $_, value => $borrower{$_} } } @attributes;
+ my @errors;
+ #Check before add
+ for (my $i; $i< scalar(@$extended_patron_attributes)-1;$i++) {
+ my $attr=$extended_patron_attributes->[$i];
+ unless (C4::Members::Attributes::CheckUniqueness($attr->{code}, $attr->{value}, $borrowernumber)) {
+ unshift @errors, $i;
+ warn "ERROR_extended_unique_id_failed $attr->{code} $attr->{value}";
+ }
+ }
+ #Removing erroneous attributes
+ foreach my $index (@errors){
+ @$extended_patron_attributes=splice(@$extended_patron_attributes,$index,1);
+ }
+ C4::Members::Attributes::SetBorrowerAttributes($borrowernumber, $extended_patron_attributes);
+ }
+return(1, $cardnumber, $userid);
}
# Pass LDAP entry object and local cardnumber (userid).
$debug and print STDERR "Finsihed \%memberhash has ", scalar(keys %memberhash), " keys\n",
"Referencing \%mapping with ", scalar(keys %mapping), " keys\n";
foreach my $key (keys %mapping) {
- my $data = $memberhash{$mapping{$key}->{is}};
+ 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 ''
What are the required fields? Well, in mysql you can check the database table "borrowers" like this:
mysql> show COLUMNS from borrowers;
- +------------------+--------------+------+-----+---------+----------------+
- | Field | Type | Null | Key | Default | Extra |
- +------------------+--------------+------+-----+---------+----------------+
- | borrowernumber | int(11) | NO | PRI | NULL | auto_increment |
- | cardnumber | varchar(16) | YES | UNI | NULL | |
- | surname | mediumtext | NO | | | |
- | firstname | text | YES | | NULL | |
- | title | mediumtext | YES | | NULL | |
- | othernames | mediumtext | YES | | NULL | |
- | initials | text | YES | | NULL | |
- | streetnumber | varchar(10) | YES | | NULL | |
- | streettype | varchar(50) | YES | | NULL | |
- | address | mediumtext | NO | | | |
- | address2 | text | YES | | NULL | |
- | city | mediumtext | NO | | | |
- | zipcode | varchar(25) | YES | | NULL | |
- | email | mediumtext | YES | | NULL | |
- | phone | text | YES | | NULL | |
- | mobile | varchar(50) | YES | | NULL | |
- | fax | mediumtext | YES | | NULL | |
- | emailpro | text | YES | | NULL | |
- | phonepro | text | YES | | NULL | |
- | B_streetnumber | varchar(10) | YES | | NULL | |
- | B_streettype | varchar(50) | YES | | NULL | |
- | B_address | varchar(100) | YES | | NULL | |
- | B_city | mediumtext | YES | | NULL | |
- | B_zipcode | varchar(25) | YES | | NULL | |
- | B_email | text | YES | | NULL | |
- | B_phone | mediumtext | YES | | NULL | |
- | dateofbirth | date | YES | | NULL | |
- | branchcode | varchar(10) | NO | MUL | | |
- | categorycode | varchar(10) | NO | MUL | | |
- | dateenrolled | date | YES | | NULL | |
- | dateexpiry | date | YES | | NULL | |
- | gonenoaddress | tinyint(1) | YES | | NULL | |
- | lost | tinyint(1) | YES | | NULL | |
- | debarred | tinyint(1) | YES | | NULL | |
- | contactname | mediumtext | YES | | NULL | |
- | contactfirstname | text | YES | | NULL | |
- | contacttitle | text | YES | | NULL | |
- | guarantorid | int(11) | YES | | NULL | |
- | borrowernotes | mediumtext | YES | | NULL | |
- | relationship | varchar(100) | YES | | NULL | |
- | ethnicity | varchar(50) | YES | | NULL | |
- | ethnotes | varchar(255) | YES | | NULL | |
- | sex | varchar(1) | YES | | NULL | |
- | password | varchar(30) | YES | | NULL | |
- | flags | int(11) | YES | | NULL | |
- | userid | varchar(30) | YES | MUL | NULL | | # UNIQUE in next release.
- | opacnote | mediumtext | YES | | NULL | |
- | contactnote | varchar(255) | YES | | NULL | |
- | sort1 | varchar(80) | YES | | NULL | |
- | sort2 | varchar(80) | YES | | NULL | |
- +------------------+--------------+------+-----+---------+----------------+
- 50 rows in set (0.01 sec)
-
+ +---------------------+--------------+------+-----+---------+----------------+
+ | Field | Type | Null | Key | Default | Extra |
+ +---------------------+--------------+------+-----+---------+----------------+
+ | borrowernumber | int(11) | NO | PRI | NULL | auto_increment |
+ | cardnumber | varchar(16) | YES | UNI | NULL | |
+ | surname | mediumtext | NO | | NULL | |
+ | firstname | text | YES | | NULL | |
+ | title | mediumtext | YES | | NULL | |
+ | othernames | mediumtext | YES | | NULL | |
+ | initials | text | YES | | NULL | |
+ | streetnumber | varchar(10) | YES | | NULL | |
+ | streettype | varchar(50) | YES | | NULL | |
+ | address | mediumtext | NO | | NULL | |
+ | address2 | text | YES | | NULL | |
+ | city | mediumtext | NO | | NULL | |
+ | state | mediumtext | YES | | NULL | |
+ | zipcode | varchar(25) | YES | | NULL | |
+ | country | text | YES | | NULL | |
+ | email | mediumtext | YES | | NULL | |
+ | phone | text | YES | | NULL | |
+ | mobile | varchar(50) | YES | | NULL | |
+ | fax | mediumtext | YES | | NULL | |
+ | emailpro | text | YES | | NULL | |
+ | phonepro | text | YES | | NULL | |
+ | B_streetnumber | varchar(10) | YES | | NULL | |
+ | B_streettype | varchar(50) | YES | | NULL | |
+ | B_address | varchar(100) | YES | | NULL | |
+ | B_address2 | text | YES | | NULL | |
+ | B_city | mediumtext | YES | | NULL | |
+ | B_state | mediumtext | YES | | NULL | |
+ | B_zipcode | varchar(25) | YES | | NULL | |
+ | B_country | text | YES | | NULL | |
+ | B_email | text | YES | | NULL | |
+ | B_phone | mediumtext | YES | | NULL | |
+ | dateofbirth | date | YES | | NULL | |
+ | branchcode | varchar(10) | NO | MUL | | |
+ | categorycode | varchar(10) | NO | MUL | | |
+ | dateenrolled | date | YES | | NULL | |
+ | dateexpiry | date | YES | | NULL | |
+ | gonenoaddress | tinyint(1) | YES | | NULL | |
+ | lost | tinyint(1) | YES | | NULL | |
+ | debarred | tinyint(1) | YES | | NULL | |
+ | 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 | |
+ | ethnotes | varchar(255) | YES | | NULL | |
+ | sex | varchar(1) | YES | | NULL | |
+ | password | varchar(30) | YES | | NULL | |
+ | flags | int(11) | YES | | NULL | |
+ | userid | varchar(30) | YES | MUL | NULL | |
+ | opacnote | mediumtext | YES | | NULL | |
+ | contactnote | varchar(255) | YES | | NULL | |
+ | sort1 | varchar(80) | YES | | NULL | |
+ | sort2 | varchar(80) | YES | | NULL | |
+ | altcontactfirstname | varchar(255) | YES | | NULL | |
+ | altcontactsurname | varchar(255) | YES | | NULL | |
+ | altcontactaddress1 | varchar(255) | YES | | NULL | |
+ | altcontactaddress2 | varchar(255) | YES | | NULL | |
+ | altcontactaddress3 | varchar(255) | YES | | NULL | |
+ | altcontactstate | mediumtext | YES | | NULL | |
+ | altcontactzipcode | varchar(50) | YES | | NULL | |
+ | altcontactcountry | text | YES | | NULL | |
+ | altcontactphone | varchar(50) | YES | | NULL | |
+ | smsalertnumber | varchar(50) | YES | | NULL | |
+ | privacy | int(11) | NO | | 1 | |
+ +---------------------+--------------+------+-----+---------+----------------+
+ 66 rows in set (0.00 sec)
Where Null="NO", the field is required.
=head1 KOHA_CONF and field mapping