#!/usr/bin/perl
##############################################################################
# ldappassadm.cgi
#
# Modify 2003/3/28 Akira Takahashi akira@kushiro-ct.ac.jp
# http://www.kushiro-ct.ac.jp/akira/misc/ldappassadm.html
#
# Modify 2003/9/30
# use Crypt::SmbHash Thanks higa@heart-land.jp
##############################################################################
#
# changepass.pl - A program to allow users to change their passwords
# via a web browser.
# Terry Davis
#
# URLs
# Net::LDAP - http://
# usermod and this file - http://www.cloudamster.com/cloudmaster/projects
#
# Release History:
# Version 0.1 - initial write
#
# ToDo:
# ... the ToDo section is on the ToDo list...
#
# Limitations:
# The password cannot contain single and double quotes.....welcome to quoting hell....
#
# Notes:
# This code is largely based on work done by Danny Sauer - http://www.cloudamster.com/cloudmaster/projects
# His work is not licensed and is marked as 'freely distributable'.
# Thank you to Danny for his hard work on the initial work.
#
################################################################################
use CGI qw(:standard);
use Net::LDAP;
use Crypt::SmbHash;
# CONFIGURATION SECTION
$masterLDAP = "ldap.gcc.kushiro-ct.ac.jp";
$basedn = "dc=kushiro-ct,dc=ac,dc=jp";
$userdn = "ou=People,$basedn";
# $masterPw = "";
# $masterDN = "cn=Manager,$basedn";
# $ldap_path = "/usr/bin";
# $ldap_opts = "-x ";
# $ldappasswd = "$ldap_path/ldappasswd $ldap_opts -h $masterLDAP ";
# END CONFIGURATION
# DONT EDIT ANYTHING BELOW THIS LINE
$logtag = "Target UID:";
$npasstag1 = "Target New password:";
$npasstag2 = "Retype New password:";
$logtag2 = "Manager UID:";
$passtag = "Manager password:";
$error = "";
$color = "";
$stopcolor = "";
if(param()){
nologin() unless ($username = param('login'));
nologin2() unless ($username2 = param('login2'));
nopass() unless ($oldpass = param('oldpass'));
nonewpass(1) unless ($newpass1 = param('newpass'));
nonewpass(2) unless ($newpass2 = param('newpass2'));
verifyuser($username) or die "bad user";
verifyuser2($username,$username2,$oldpass) or die "bad manager";
# verifypass($username, $oldpass) or die "bad pass";
testnewpass($newpass1, $newpass2) or die "bad new pass";
changepassadm($username,$username2,$oldpass,$newpass1) or die "couldn't change pass";
printsuccess();
}else{
printpage();
}
exit(0);
sub changepassadm{
local $user = shift;
local $manager = shift;
local $bindpass = shift;
local $newpass = shift;
local $dn = "uid=$user,$userdn";
my $bindDN = "uid=$manager,$userdn" ;
my $ldap = Net::LDAP->new($masterLDAP) or die "can't make new LDAP object: $@";
my $res1 = $ldap->bind($bindDN, password => $bindpass)-> code ;
if (0 < $res1) {
$passtag = $color . $logtag2 . $color;
$error = "Wrong Manager Password ";
printpage();
return 0;
}
my $cpass ;
my $lmpassword ;
my $ntpassword ;
$cpass = "{crypt}" . crypt($newpass,$user) ;
ntlmgen $newpass,$lmpassword,$ntpassword ;
$mesg = $ldap->modify( $dn,
changes => [
replace => [ 'userpassword' => $cpass],
replace => [ 'lmPassword' => $lmpassword],
replace => [ 'ntPassword' => $ntpassword]
]
);
return 1;
# exit(1);
}
sub verifyuser{
local $user = shift;
$ldap = Net::LDAP->new($masterLDAP) or die "can't make new LDAP object: $@";
$ldap->bind();
if (0 < $ldap->search(base => $basedn, filter => "(uid=$user)")->count){
return 1;
}
$logtag = $color . $logtag . $color;
$error = "No such user";
printpage();
return 0;
}
sub verifyuser2{
local $user = shift;
local $manager = shift;
local $bindpass = shift;
my $bindDN = "uid=$manager,$userdn" ;
my $ldap = Net::LDAP->new($masterLDAP) or die "can't make new LDAP object: $@";
my $res1 = $ldap->bind($bindDN, password => $bindpass)-> code ;
if (0 < $res1) {
$passtag = $color . $logtag2 . $color;
$error = "Wrong Manager Password ";
printpage();
return 0;
}
my $mesg = $ldap->search(
base => "$userdn",
filter => "uid=$user",
);
my $entry = $mesg->entry($index);
my $res2 = $entry->get_value( 'userPassword' );
if ($res2 eq "" ) {
$logtag2 = $color . $logtag2 . $color;
$error = "$user cannot change password";
printpage();
return 0;
}
return 1;
}
#sub verifypass{
# $uid = shift;
# $pass = shift;
# $ldap = Net::LDAP->new($masterLDAP) or die "can't make new LDAP object: $@";
# $binddn = "uid=$uid,ou=People,$basedn";
# return 1 if( $ldap->bind($binddn, password => $pass) ->code == 0);
# if($ldap->bind()){
# $passtag = $color . $passtag . $color;
# $error = "Incorrect password";
# printpage();
# return 0;
# }else{
# print header, start_html(-title=>"LDAP dead");
# print h2("
The LDAP server is temporarily unavailable."),
# p,"Please try again later";
# return 0;
# } die "Something (or someone) is defective, contact your friendly Systems Administrator";
#}
sub testnewpass{
$p1 = shift; $p2 = shift;
if ($p1 ne $p2){
$npasstag1 = $color . $npasstag1 . $color;
$npasstag2 = $color . $npasstag2 . $color;
$error = "Passwords don't match ($p1 vs $p2)";
printpage();
return 0;
}
if ($p1 =~ /"/ ){
$npasstag1 = $color . $npasstag1 . $color;
$npasstag2 = $color . $npasstag2 . $color;
$error = "Passwords cannot contain double quotes. Sorry";
printpage();
return 0;
}
if ($p1 =~ /'/ ){
$npasstag1 = $color . $npasstag1 . $color;
$npasstag2 = $color . $npasstag2 . $color;
$error = "Passwords cannot contain single quotes. Sorry";
printpage();
return 0;
}
return 1;
}
sub nologin{
$logtag = $color . $logtag . $color;
$error = "You need to enter a Target Login Name";
printpage();
exit(1);
}
sub nologin2{
$logtag = $color . $logtag2 . $color;
$error = "You need to enter a Your Login Name";
printpage();
exit(1);
}
sub nopass{
$passtag = $color . $passtag . $color;
$error = "Please enter Your password";
printpage();
exit(1);
}
sub nonewpass{
$f=shift;
$npasstag1 = $color . $npasstag1 . $color if($f==1);
$npasstag2 = $color . $npasstag2 . $color if($f==2);
$error = "You need to enter your new password twice" if($f==2);
printpage();
exit(1);
}
sub printpage{
print header,
start_html(-title=> "Password Change For Manager",
-author=> 'tdavis\@birddog.com,akira\@kushiro-ct.ac.jp',
-BGCOLOR=> 'WHITE'),
h3('Password Change For Manager'),
"
",
startform(-method=>'POST'),
"",
"",
"",
$logtag,
" | ",
textfield(-name=>'login', -default=>$login, -size=>15, -maxlength=>20),
" |
",
$npasstag1,
" | ",
password_field(-name=>'newpass', -size=>15, -maxlength=>25),
" |
",
$npasstag2,
" | ",
password_field(-name=>'newpass2', -size=>15, -maxlength=>25),
" |
",
$logtag2,
" | ",
textfield(-name=>'login2', -default=>$login2,
-size=>15, -maxlength=>20),
" |
",
$passtag,
" | ",
password_field(-name=>'oldpass', -size=>15, -maxlength=>25),
" |
| ",
submit(-name=>"CHANGE"),reset(-name=>"RESET"),
" |
",
"",
endform(),
"$error",
end_html;
}
sub printsuccess(){
print header,
start_html(-title=> "Success",
-BGCOLOR=> 'WHITE'),
h2("Password Succesfully Changed"),
"
",
end_html;
}