Passwort setzen

Aus OpenNewsNetwork

Wechseln zu: Navigation, Suche

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;
}
Persönliche Werkzeuge