Passwort setzen
Aus OpenNewsNetwork
Beispiel für ein Script zum Setzen des Nutzerpasswortes:
#!/usr/bin/perl -w
use strict;
use warnings;
use CGI qw/-nosticky/;
use CGI::Carp qw/fatalsToBrowser warningsToBrowser/;
use CGI::Pretty;
use URI::Escape;
use Digest::SHA1;
use Digest::MD5;
use MIME::Base64;
use Net::LDAP;
#
# Constants
#
my $LDAP_HOST = 'ldap1.mb-net.net';
my $LDAP_BASE = 'dc=open-news-network,dc=org';
my $SALT = 'Pk73';
my $TITLE = 'ONN Password changer';
my $VERSION = '0.1';
#
# Variables
#
my $Cgi = CGI->new();
my $Self = $Cgi->url(-query => 0);
#
# Function prototypes
#
sub generate_ssha_password($);
sub generate_smd5_password($);
#
# MAIN
#
# Seitenkopf
print $Cgi->header,
$Cgi->start_html (
-title => $TITLE,
-style => {'-src' => 'mb-net.css'},
),
$Cgi->h1($TITLE),
;
warningsToBrowser(1);
# Aktion auswaehlen
my $Submit = $Cgi->param('submit') || '';
if ($Submit) {
do_change();
} else {
print_form();
}
print
$Cgi->hr,
$Cgi->address($Cgi->small(qq{$TITLE, Version $VERSION})),
$Cgi->end_html;
exit;
#
# Subroutines
#
sub generate_ssha_password($)
{
my $ctx = Digest::SHA1->new;
$ctx->add(shift);
$ctx->add($SALT);
return '{SSHA}' . encode_base64($ctx->digest . $SALT ,'');
}
sub generate_smd5_password($)
{
my $ctx = Digest::MD5->new;
$ctx->add(shift);
$ctx->add($SALT);
return '{SMD5}' . encode_base64($ctx->digest . $SALT ,'');
}
sub posresult {
my $txt = shift;
print $Cgi->p({-class => 'positive'}, $txt);
}
sub info {
my $txt = shift;
print $Cgi->p({-class => 'meldung'}, $txt);
}
sub warning {
my $txt = shift;
print $Cgi->p({-class => 'warnung'}, $txt);
}
sub error {
my $txt = shift;
print $Cgi->p({-class => 'danger'}, $txt);
}
sub strip {
return undef unless $_[0];
for (@_) {
s/^\s+//;
s/\s+$//;
}
return (wantarray ? @_ : $_[0]);
}
sub print_form {
print
$Cgi->hr,
$Cgi->start_form(-method => 'POST'),
$Cgi->p('User-ID: ' .
$Cgi->textfield(-name=>'userid', -size=>15, -maxlength=>15)),
$Cgi->p('Aktuelles userPasswort: ' .
$Cgi->password_field('curpass','',20,20)),
$Cgi->p('Neues userPassword: ' .
$Cgi->password_field('userpass1','',20,20) .
'Wiederholung: ' .
$Cgi->password_field('userpass2','',20,20)),
#
# $Cgi->p('Neues popPassword: ' .
# $Cgi->password_field('poppass1','',20,20) .
# 'Wiederholung: ' .
# $Cgi->password_field('poppass2','',20,20)),
#
# $Cgi->p('Neues smtpPassword: ' .
# $Cgi->password_field('smtppass1','',20,20) .
# 'Wiederholung: ' .
# $Cgi->password_field('smtppass2','',20,20)),
#
$Cgi->submit(-name => 'submit', -value => 'submit'),
$Cgi->end_form,
;
}
sub do_change {
my $userid = $Cgi->param('userid') || '';
my $current_pass = $Cgi->param('curpass') || '';
my $userpass1 = $Cgi->param('userpass1') || '';
my $userpass2 = $Cgi->param('userpass2') || '';
# my $poppass1 = $Cgi->param('poppass1') || '';
# my $poppass2 = $Cgi->param('poppass2') || '';
# my $smtppass1 = $Cgi->param('smtppass1') || '';
# my $smtppass2 = $Cgi->param('smtppass2') || '';
unless ($Cgi->param('userpass1') eq ($Cgi->param('userpass2'))) {
error('Die Felder userPassword stimmen nicht überein');
return;
}
# unless ($Cgi->param('poppass1') eq ($Cgi->param('poppass2'))) {
# error('Die Felder popPassword stimmen nicht überein');
# return;
# }
# unless ($Cgi->param('smtppass1') eq ($Cgi->param('smtppass2'))) {
# error('Die Felder smtpPassword stimmen nicht überein');
# return;
# }
# Mindestens eine sinnvolle Operation
unless ( ($Cgi->param('userpass1')) || ($Cgi->param('poppass1')) || ($Cgi->param('smtppass1'))) {
error("Kein zu änderndes Passwort angegeben");
return;
}
# Perform user bind
my $dn = "uid=$userid,$LDAP_BASE";
info("Starte Anmeldung als $dn...");
my $ldap = Net::LDAP->new($LDAP_HOST,
timeout => 20,
version => 3) || die "Could not connect to LDAP host $LDAP_HOST: $!";
my $mesg = $ldap->bind(
$dn, password => $current_pass);
if ($mesg->code) {
error("Anmeldung als Nutzer $userid fehlgeschlagen: " . $mesg->error);
return;
}
posresult("Anmeldung von $dn erfolgreich");
# Setze userPassword?
if ($userpass1) {
my $newpw = generate_ssha_password($userpass1);
info("Ändere userPassword...");
$mesg = $ldap->modify(
$dn,
replace => { 'userPassword' => $newpw });
if ($mesg->code) {
warning("Änderung von userPassword fehlgeschlagen: " . $mesg->error);
} else {
posresult("userPassword erfolgreich geändert");
}
} else {
info("Keine Änderung von userPassword");
}
# if ($poppass1) {
# my $newpw = generate_smd5_password($poppass1);
#
# info("Ändere popPassword...");
# $mesg = $ldap->modify(
# $dn,
# replace => { 'popPassword' => $newpw });
# if ($mesg->code) {
# warning("Änderung von popPassword fehlgeschlagen: " . $mesg->error);
# } else {
# posresult("popPassword erfolgreich geändert");
# }
# } else {
# info("Keine Änderung von popPassword");
# }
#
# if ($smtppass1) {
# info("Ändere smtpPassword...");
# $mesg = $ldap->modify(
# $dn,
# replace => { 'smtpPassword' => $smtppass1 });
# if ($mesg->code) {
# warning("Änderung von smtpPassword fehlgeschlagen: " . $mesg->error);
# } else {
# posresult("smtpPassword erfolgreich geändert");
# }
# } else {
# info("Keine Änderung von smtpPassword");
# }
posresult("Alle Änderungsoperationen erfolgreich durchgeführt");
info("Abmeldung vom LDAP-Server...");
$mesg = $ldap->unbind();
if ($mesg->code) {
warning("Abmeldung fehlgeschlagen: " . $mesg->error . " (ignoriert)");
}
info("Beende Verbindung zum LDAP-Server...");
$mesg = $ldap->unbind();
if ($mesg->code) {
warning("Disconnect fehlgeschlagen: " . $mesg->error . " (ignoriert)");
}
return;
}

