- it connects to LDAP using admin account(or account that can search for userid availablein LDAP server)
- search base on user uid
- retrive cn
- compare password
- then get the LDAP entry
- and calls the memberadd if necessary
and here the perl code:
# this checkpw is a LDAP based one
# it connects to LDAP using admin account
# search base on user uid
# retrive cn
# compare password
# then get the LDAP entry
# and calls the memberadd if necessary
sub checkpw {
use Net::LDAP;
my ($dbh, $userid, $password, $authtype) = @_;
if ($userid eq C4::Context->config('user') && $password eq C4::Context->config('pass')) {
# KOHA superuser account
return 2;
}
################################edited by mbek for KOHA@SOMEPROJECT###########################################
### LOCAL
### Change the code below to match your own LDAP server.
##################################################
# LDAP connexion parameters
# LDAP server
my $ldapserver = '192.168.0.12'; #ur LDAP server's IP/hostname
my $ldapadmin = 'ldapadminaccount';
my $ldappassword = 'ldapadminpassword';
# Base DN for users
#my $name = "ou=users,dc=tow,dc=net";
my $name = "cn=$ldapadmin,dc=sub,dc=domain,dc=edu,dc=my";
my $searchbase = "dc=sub,dc=domain,dc=edu,dc=my";
my $checkname = "ou=People,dc=sub,dc=domain,dc=edu,dc=my";
# Bind uses the users full DN, if uid doesn't work try "cn"
my $binddn = "$name";
# my $binddn = "uid=$userid,$name";
my $db = Net::LDAP->new( $ldapserver );
# do bind
my $res =$db->bind();
# check connexion, anything other code than LDAP_SUCCESS (0)
# is a problem
if($res->code != 0 ) {
# auth refused
warn
#die
"LDAP Auth failed server not responding or wrong user password combination";
return 0;
}else {
# search user
my $userdnsearch = $db->search(
base => "$searchbase",
filter =>"(uid=$userid)",
);
my $userldapentry=$userdnsearch -> shift_entry;
# build LDAP hash
my %memberhash;
my $x =$userldapentry->{asn}{attributes};
my $key;
foreach my $k ( @$x) {
foreach my $k2 (keys %$k) {
if ($k2 eq 'type') {
$key = $$k{$k2};
} else {
my $a = @$k{$k2};
foreach my $k3 (@$a) {
$memberhash{$key} .= $k3."";
}
}
}
}
$res = $db->unbind;
my %borrower;
if($memberhash{cn}){
my $newldap = Net::LDAP->new( "$ldapserver" , timeout=>60) or die "$@";
$checkname = "cn=$memberhash{cn}," . $checkname;
my $msg = $newldap->bind($checkname, password => $password);
my $status = $msg->code;
if($msg->code != 0 ) {
warn "LDAP Auth failed server not responding or wrong user password combination";
return 0;
}else{
$msg = $newldap->search(
base => "$searchbase",
filter =>"(uid=$userid)",
);
my $userldapentry=$msg -> shift_entry;
# build LDAP hash
my %validhash;
my $x =$userldapentry->{asn}{attributes};
my $key;
foreach my $k ( @$x) {
foreach my $k2 (keys %$k) {
if ($k2 eq 'type') {
$key = $$k{$k2};
} else {
my $a = @$k{$k2};
foreach my $k3 (@$a) {
$validhash{$key} .= $k3." ";
}
}
}
}
#
# BUILD %borrower to CREATE or MODIFY BORROWER
# change $memberhash{'xxx'} to fit your ldap structure.
# check twice that mandatory fields are correctly filled
#
$borrower{cardnumber} = $userid;
$borrower{firstname} = $validhash{givenName}; # MANDATORY FIELD
$borrower{surname} = $validhash{sn}; # MANDATORY FIELD
$borrower{initials} = substr($borrower{firstname},0,1).substr($borrower{surname},0,1)." "; # MANDATORY FIELD
$borrower{streetaddress} = $validhash{homePostalAddress}." "; # MANDATORY FIELD
$borrower{city} = $validhash{l}." "; # MANDATORY FIELD
$borrower{phone} = $validhash{homePhone}." "; # MANDATORY FIELD
$borrower{branchcode} = $validhash{businessCategory}; # MANDATORY FIELD
$borrower{emailaddress} = $validhash{mail};
$borrower{categorycode} = $validhash{employeeType};
}
}else{
warn "LDAP Auth failed server not responding or wrong user password combination";
return 0;
}
################################End edited by mbek for KOHA@SOMEPROJECT###########################################
##################################################
### /LOCAL
### No change needed after this line (unless there's a bug ;-) )
##################################################
# check if borrower exists
my $sth=$dbh->prepare("select password from borrowers where cardnumber=?");
$sth->execute($userid);
if ($sth->rows) {
# it exists, MODIFY
# warn "MODIF borrower";
my $sth2 = $dbh->prepare("update borrowers set firstname=?,surname=?,initials=?,streetaddress=?,city=?,phone=?, categorycode=?,branchcode=?,emailaddress=?,sort1=? where cardnumber=?");
$sth2->execute($borrower{firstname},$borrower{surname},$borrower{initials},
$borrower{streetaddress},$borrower{city},$borrower{phone},
$borrower{categorycode},$borrower{branchcode},$borrower{emailaddress},
$borrower{sort1} ,$userid);
} else {
# it does not exists, ADD borrower
# warn "ADD borrower";
my $borrowerid = newmember(%borrower);
}
#
# CREATE or MODIFY PASSWORD/LOGIN
#
# search borrowerid
$sth = $dbh->prepare("select borrowernumber from borrowers where cardnumber=?");
$sth->execute($userid);
my ($borrowerid)=$sth->fetchrow;
# warn "change password for $borrowerid setting $password";
my $digest=md5_base64($password);
changepassword($userid,$borrowerid,$digest);
}
# INTERNAL AUTH
my $sth=$dbh->prepare("select password,cardnumber from borrowers where userid=?");
$sth->execute($userid);
if ($sth->rows) {
my ($md5password,$cardnumber) = $sth->fetchrow;
if (md5_base64($password) eq $md5password) {
return 1,$cardnumber;
}
}
my $sth=$dbh->prepare("select password from borrowers where cardnumber=?");
$sth->execute($userid);
if ($sth->rows) {
my ($md5password) = $sth->fetchrow;
if (md5_base64($password) eq $md5password) {
return 1,$userid;
}
}
return 0;
}
happy coding
**Gong Xi Fa Cai

1 comment:
Hi Hairul,
Can you send me your email id?
My email id is rajs@oraclebrains.com.
I need your expertise in one of the proposal.
Thanks & Regards,
Raj
Post a Comment