Date: Mon, 7 Dec 1998 16:26:57 +1100 From: "John Saunders" <john.saunders@scitec.com.au> To: "Cliff Reardon" <cj@webnet.com.au> Cc: "FreeBSD questions" <freebsd-questions@FreeBSD.ORG> Subject: RE: Change Password On-Line Message-ID: <002a01be21a2$357262e0$6cb611cb@saruman.scitec.com.au> In-Reply-To: <365DE1EF.9B4A1EA7@webnet.com.au>
next in thread | previous in thread | raw e-mail | index | archive | help
> I was wondering if anybody had a script to use via the web ie: either
> .cgi or .pl or even .c so as dial in users can change their passwords
> on-line. They are authenticated using the passwd file on a freebsd
> computer, and we are using Apache as the web server.
Not sure if anybody has answered you yet. Anyway the easiest way I
have found is to install the poppassd port (/usr/ports/mail/poppassd)
which allows Eudora Mail to change passwords from it's menu.
With this in place I wrote a HTML form and got a perl cgi script
to talk to the popassd server. The perl script came from a wwwpass
package I found. It's also portable, with poppassd running on
Linux or anything else the web side doesn't need to be changed.
P.S. I've removed some company messages from these things so expect
a couple of typos you may need to clean up before it works.
Cheers.
-chpasswd.html--------------------------------------------------------------
---------
<html>
<body>
<h2 align="center">Change Your Password</h2>
<form action="password.cgi" method="POST">
<center>
<p>
Enter your username:<br>
<input type="text" size=17 name="username">
</p>
<p>
Enter your password:<br>
<input type="password" size=17 name="password">
</p>
</center>
<hr>
<center>
<p>
Now, enter what you want to change your password to.
</p>
<p>
New password:<br>
<input type="password" name="newpasswd">
</p>
<p>
Re-type new password:<br>
<input type="password" name="verifypasswd">
</p>
</center>
<center>
<p>
<input type="submit" value="Change Password">
<input type="reset" value="Clear Form">
</p>
</center>
</form>
</body>
</html>
-chpasswd.html--------------------------------------------------------------
---------
-chpasswd.cgi---------------------------------------------------------------
---------
#!/usr/local/bin/perl
# Back-end script to let a user change their password from a web page
# Interfaces to popassd daemon
use Socket;
require "cgi-lib.pl";
# Replace with the name of your password host.
$pass_host = "pop.domain.com";
&ReadParse;
print &PrintHeader;
$| = 1;
umask(077);
$login = $in{"username"};
$p = $in{"password"};
$np = $in{"newpasswd"};
$np1 = $in{"verifypasswd"};
$l = length($np);
if (($np ne $np1) || ($l < 6) || ($np eq ''))
{
print "<html>\n";
print "<body>\n\n";
print "<h2 align=\"center\">Change Password Error!</h2>\n\n<p>\nI'm sorry
$login, ";
if ($np ne $np1) {
print "<b>the two new passwords you entered did not match</b>.\n</p>\n";
} elsif ($l < 6) {
print "<b>your password must have a least 6 characters</b>.\n</p>\n";
} else {
print "<b>you may not enter a blank password</b>.\n</p>\n";
}
print "\n<p>\nYour password was not changed. Would you like to\n";
print "<a href=\"chpasswd.html\">try again</a>?\n</p>\n\n";
print "</body>\n</html>\n";
exit 0;
}
&start_poppassd($pass_host);
# Get hello prompt
$_ = <PASSD>;
unless (/^200/) {&pass_error;}
# Send username
print PASSD "user $login\n";
$_ = <PASSD>;
unless (/^200/) {&pass_error;}
# Send Old Password
print PASSD "pass $p\n";
$_ = <PASSD>;
if (/^500/) {
# For now, a generic error
&pass_error;
}
# Now new password
print PASSD "newpass $np\n";
$_ = <PASSD>;
if (/^500/) {
# Generic error again
&pass_error;
}
# We are done, quit;
print PASSD "quit\n";
$_ = <PASSD>;
print "<html>\n";
print "<body>\n\n";
print "<h2 align=\"center\">Change Password OK</h2>\n\n";
print "<p>\n$login, <b>your password has been successfully changed</b>.
Don't\n";
print "forget to change your log-in script and your mail programs to\n";
print "reflect this new password.\n</p>\n";
print "\n<p>\n<b>Also, don't forget your new password!</b>\n</p>\n\n";
print "</body>\n</html>\n";
exit 0;
sub pass_error
{
s/^\d\d\d //;
print "<html>\n";
print "<body>\n\n";
print "<h2 align=\"center\">Change Password Error!</h2>\n\n";
print "<p>\nI'm sorry, I was unable to change your password. The\n";
print "password server returned the following error:\n";
print "<b>$_</b>\n</p>\n";
print "\n<p>\nWould you like to <a href=\"chpasswd.html\">\n";
print "try again</A> ?\n</p>\n\n";
print "</body></html>\n";
exit 0;
}
#**********
# START_POPPASSD -- Open poppassd connection to user server
#**********
sub start_poppassd {
local($name)=@_;
$SIG{'INT'}='dokill';
$sockaddr='Sna4x8';
($n,$aliases,$proto)=getprotobyname('tcp');
($n,$aliases,$port)=getservbyname('poppassd','tcp');
if ($name =~ /^\d+\.\d+\.\d+\.\d+$/) {
$thataddr = pack('cccc',split(/\./,$name));
} else {
($n,$aliases,$type,$len,$thataddr)=gethostbyname($name);
}
$that=pack($sockaddr, AF_INET, $port, $thataddr);
socket(PASSD, PF_INET, SOCK_STREAM, $proto) || die "socket: $!";
connect(PASSD, $that) || die "connect: $!";
select(PASSD); $|=1;
select(STDIN); $|=1;
select(STDOUT); $|=1;
}
-chpasswd.cgi---------------------------------------------------------------
---------
-- . +-------------------------------------------------------+
,--_|\ | John Saunders mailto:John.Saunders@scitec.com.au |
/ Oz \ | SCITEC LIMITED Phone +61294289563 Fax +61294289933 |
\_,--\_/ | "By the time you make ends meet, they move the ends." |
v +-------------------------------------------------------+
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-questions" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?002a01be21a2$357262e0$6cb611cb>
