Das ist der (neue) Benutzermanager.
Dateiname: /usr/local/httpd/htdocs/admin/usermanager3.cgi.
#!/usr/bin/perl -wT
# usermanager
#
# Copyright (c) 2001 Thomas Bleher <ThomasBleher@gmx.de>
# Copyright (c) 2002,2003 Andreas Dangel <adabolo@adabolo.de>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
use strict;
use CGI;
use User::pwent;
use CGI::Carp qw(fatalsToBrowser);
# =============================================================================
# KONFIGURATION
# =============================================================================
my $user_status_script = "sudo /usr/local/sbin/user-status3";
$ENV{"PATH"} = "/bin:/usr/bin";
# =============================================================================
# GLOBALE VARIABLEN
# =============================================================================
my $q; # für CGI
my @users; # speichert die ausgewählten Benutzer (login-names)
my $this_script;
my $now_time_string = localtime;
my $error = "";
# =============================================================================
# SUBS
# =============================================================================
sub main;
sub print_header;
sub print_seite0;
sub print_page_end;
sub print_page_data;
sub get_userlist;
######
main;
exit 0;
######
# =============================================================================
# MAIN
# =============================================================================
sub main {
$q = new CGI;
$this_script = $q->url();
# wurden Daten gesendet?
if ($q->param) {
#&print_header("Parameter vorhanden!");
#print $q->Dump;
#&print_page_end;
if (defined($q->param("user"))) {
&print_user_data($q->param("user"));
} elsif ($q->param("seite") == 0) {
&print_page_data;
} elsif ($q->param("seite") == 1) {
if (defined($q->param("action"))) {
if ($q->param("action") eq "lock") {
&do_lock_users;
} elsif ($q->param("action") eq "pw") {
&ask_pw_users;
} elsif ($q->param("action") eq "rights") {
&ask_rights_users;
} elsif ($q->param("action") eq "delete") {
&ask_delete_users;
}
} else {
$error = "Falscher Befehl!";
&print_page_data;
}
} elsif ($q->param("seite") == 2) {
&do_pw_users;
} elsif ($q->param("seite") == 3) {
&do_rights_users;
} elsif ($q->param("seite") == 4) {
&do_delete_users;
} elsif ($q->param("seite") == 5) {
&do_save_user_data;
}
} else {
&print_seite0;
}
}
# =============================================================================
# PRINT_HEADER
# =============================================================================
sub print_header {
my $title = shift;
print $q->header;
print qq(<html>\n);
print qq(<head>\n);
print qq( <title>$title</title>\n);
print qq(</head>\n);
print qq(<body>\n);
print qq(<h1>$title</h1>\n);
}
# =============================================================================
# PRINT_SEITE0
# =============================================================================
sub print_seite0 {
&print_header("Benutzermanager");
print qq(<form method="post">\n);
print qq(<h3>Welche Benutzer sollen angezeigt werden?</h3>\n);
print qq(<input type="radio" name="auswahl" value="alle" checked>Alle<br>\n);
print qq(<input type="radio" name="auswahl" value="passwort">Nur Benutzer,
die als Passwort "passwort" haben<br>\n);
print qq(<input type="radio" name="auswahl" value="gesperrt">Nur gesperrte
Benutzer<br>\n);
print qq(<input type="radio" name="auswahl" value="aktiv">Nur aktivierte
Benutzer<br>\n);
print qq(<input type="radio" name="auswahl" value="jahrgang">Nur bestimmter
Abi-Jahrgang (nur Schüler):\n);
print qq( <input type="text" name="abijahr" value="" size="2"
maxlength="2"><br>\n);
print qq(<input type="radio" name="auswahl" value="gruppen">Nur bestimmte
Gruppen:\n);
print qq( <input type="checkbox" name="gruppe_schueler">Schüler\n);
print qq( <input type="checkbox" name="gruppe_lehrer">Lehrer\n);
print qq( <input type="checkbox" name="gruppe_internet">Internet\n);
print qq( <input type="checkbox" name="gruppe_admin">Administratoren\n);
print qq( <input type="checkbox" name="gruppe_homepage">Homepage<br>\n);
print qq(<input type="radio" name="auswahl" value="name">Bestimmter
Benutzer:\n);
print qq( <input type="text" name="loginname" value="" size="15">\n);
print qq(<p>\n);
print qq(<input type="hidden" name="seite" value="0">\n);
print qq(<input type="submit" value="Anfrage starten..."\n);
print qq(</form>\n);
&print_page_end;
}
# =============================================================================
# PRINT_PAGE_END
# =============================================================================
sub print_page_end {
print qq(<hr>\n);
print qq(<a href="http://server/">zur Startseite</a>\n);
print qq( - <a href="http://server/admin/">Administration</a>\n);
print qq( - <a href="$this_script">Benutzermanager</a>\n);
print qq( - $now_time_string\n);
#print qq( - <i>© adabolo.de network solutions</i>\n);
print qq(</body>\n);
print qq(</html>\n);
}
# =============================================================================
# PRINT_PAGE_DATA
# =============================================================================
sub print_page_data {
&print_header("Benutzermanager");
if ($error ne "") {
print qq(<font color="green">$error</font>\n);
}
my @userlist = &get_userlist;
my $anzahl = @userlist;
# Benutzerliste sortieren...
my @sorted = sort {
my $c = $a;
my $d = $b;
# Lehrer:
if ($c =~ m/\A(\w)\.([\w\-]+)\Z/) { $c = "000.$2.$1." };
if ($d =~ m/\A(\w)\.([\w\-]+)\Z/) { $d = "000.$2.$1." };
# Sonstige:
if ($c =~ m/\Abo\.vhs(\d\d)\Z/) { $c = "EEE.bo.vhs.$1." };
if ($d =~ m/\Abo\.vhs(\d\d)\Z/) { $d = "EEE.bo.vhs.$1." };
if ($c =~ m/\Abl\.vhs(\d+)\Z/) { $c = "FFF.bl.vhs.$1." };
if ($d =~ m/\Abl\.vhs(\d+)\Z/) { $d = "FFF.bl.vhs.$1." };
if ($c =~ m/\Akghs(\d+)\Z/) { $c = "GGG.kghs.$1." };
if ($d =~ m/\Akghs(\d+)\Z/) { $d = "GGG.kghs.$1." };
if ($c =~ m/\Abo\.kgrt(\d+)\Z/) { $c = "HHH.bo.kgrt.$1." };
if ($d =~ m/\Abo\.kgrt(\d+)\Z/) { $d = "HHH.bo.kgrt.$1." };
# Schüler
if ($c =~ m/\A(\w)(\w+)(\d\d)\Z/) { $c = "AAA.$3.$2.$1." };
if ($d =~ m/\A(\w)(\w+)(\d\d)\Z/) { $d = "AAA.$3.$2.$1." };
$c cmp $d;
} @userlist;
# JavaScript Programm:
print qq(\n<script type="text/javascript" language="javascript">\n);
print qq(function mark_all() {\n);
print qq( var b = window.document.forms[0].checker.checked;\n);
print qq( var count = 0;\n);
print qq( while (count < $anzahl) {\n);
print qq( window.document.forms[0].elements[count++].checked = b;\n);
print qq( }\n);
print qq(}\n);
print qq(</script>\n\n);
# Formular starten
print $q->start_form;
# Tabelle starten
print qq(<table border="1">\n);
print qq(<tr><th>Login</th><th>Name</th><th>Gruppen (Rechte)</th>);
print qq(<th>Quota</th><th>"passwort" (letzte Änderung)</th><th>Status</th>);
print qq(<th>Auswahl</th></tr>\n);
foreach (@sorted) {
my $login = $_;
my $name = &get_fullname($_);
my $gruppen = &get_groups($_);
my $quota = &get_quota($_);
my $passwort = &get_password($_);
my $status = &get_status($_);
my $color = "#FFFFDD";
if ($passwort =~ m/JA/) {
$color = "#FF0000";
}
if ($status eq "deaktiviert") {
$color = "#EEEEEE";
}
print qq(<tr bgcolor="$color">);
print qq(<td><a href="$this_script?user=$_">$_</a></td>);
print qq(<td>$name</td>);
print qq(<td>$gruppen</td>);
print qq(<td>$quota</td>);
print qq(<td>$passwort</td>);
print qq(<td>$status</td>);
print qq(<td><input type="checkbox" name="users" value="$_"></td></tr>\n);
}
print qq(<tr><td align="right" colspan="6">Alle angezeigten
Benutzer markieren:</td>);
print qq(<td><input type="checkbox" name="checker" onclick="mark_all();">
</td></tr>\n);
print qq(</table>\n);
print qq(Angezeigte Benutzer: $anzahl\n);
print qq(<p>\n);
print qq(<h2>Aktion</h2>\n);
print qq(<input type="radio" name="action" value="lock">Benutzer
sperren/freigeben<br>\n);
print qq(<input type="radio" name="action" value="pw">Passwort ändern<br>\n);
print qq(<input type="radio" name="action" value="rights">Rechte
ändern<br>\n);
print qq(<input type="radio" name="action" value="delete">Benutzer
löschen<br>\n);
print qq(<input type="hidden" name="seite" value="1">\n);
&print_seite1_values;
print qq(<input type="submit" value="Ausführen"> <input type="reset"
value="Abbrechen">\n);
print qq(</form>\n);
&print_page_end;
}
# =============================================================================
# GET_USERLIST
# =============================================================================
sub get_userlist {
my @users = split / /, (getgrnam('users'))[3];
if ($q->param("auswahl") eq "alle") {
return @users;
} elsif ($q->param("auswahl") eq "passwort") {
my @userlist = qw();
foreach (@users) {
# für jeden Benutzer prüfen, ob "passwort" das Passwort ist...
# das Script gibt den Benutzernamen zurück, wenn das Passwort
# unsicher ist. Es gibt "---secure" zurück, wenn das Passwort
# sicher ist.
my $ret = `$user_status_script -passwd $_`;
if ($ret ne "---secure") {
push(@userlist, $_);
}
}
return @userlist;
} elsif ($q->param("auswahl") eq "gesperrt") {
my @userlist = qw();
foreach (@users) {
# für jeden Benutzer prüfen, ob er gesperrt ist...
my $ret = `$user_status_script -locked $_`;
if ($ret ne "---unlocked") {
push(@userlist, $_);
}
}
return @userlist;
} elsif ($q->param("auswahl") eq "aktiv") {
my @userlist = qw();
foreach (@users) {
# für jeden Benutzer prüfen, ob er "unlocked" ist...
my $ret = `$user_status_script -locked $_`;
if ($ret eq "---unlocked") {
push(@userlist, $_);
}
}
return @userlist;
} elsif ($q->param("auswahl") eq "jahrgang") {
# erst Abi-Jahrgang herausfinden
my $abi = $q->param("abijahr");
# keine zwei Ziffern?
if ($abi !~ m/\d\d/) {
# dann alle Benutzer anzeigen...
return @users;
}
# jeden Benutzer durchgehen und in @userlist speichern
my @userlist = qw();
foreach (@users) {
if ($_ =~ m/\w+$abi/) {
push(@userlist, $_);
}
}
return @userlist;
} elsif ($q->param("auswahl") eq "gruppen") {
# wenn gar nichts gewählt...
if ($q->param("gruppe_schueler") ne "on" &&
$q->param("gruppe_lehrer") ne "on" &&
$q->param("gruppe_internet") ne "on" &&
$q->param("gruppe_admin") ne "on" &&
$q->param("gruppe_homepage") ne "on") {
return @users;
}
my %userlist;
my @group_users;
if ($q->param("gruppe_schueler") eq "on") {
@group_users = split / /, (getgrnam('schueler'))[3];
foreach (@group_users) { $userlist{$_} = 1; }
}
if ($q->param("gruppe_lehrer") eq "on") {
@group_users = split / /, (getgrnam('lehrer'))[3];
foreach (@group_users) { $userlist{$_} = 1; }
}
if ($q->param("gruppe_internet") eq "on") {
@group_users = split / /, (getgrnam('internet'))[3];
foreach (@group_users) { $userlist{$_} = 1; }
}
if ($q->param("gruppe_admin") eq "on") {
@group_users = split / /, (getgrnam('admin'))[3];
foreach (@group_users) { $userlist{$_} = 1; }
}
if ($q->param("gruppe_homepage") eq "on") {
@group_users = split / /, (getgrnam('homepage'))[3];
foreach (@group_users) { $userlist{$_} = 1; }
}
return keys(%userlist);
} elsif ($q->param("auswahl") eq "name") {
my $login = $q->param("loginname");
$login = quotemeta($login);
return grep(/$login/, @users);
} else {
# in sonstigen Fällen, die eigentlich nicht auftreten sollten:
# Alle Benutzer anzeigen...
return @users;
}
}
# =============================================================================
# GET_FULLNAME
# =============================================================================
sub get_fullname {
my $login = shift;
my $user = getpwnam($login);
return $user->gecos;
}
# =============================================================================
# GET_HOMEDIR
# =============================================================================
sub get_homedir {
my $login = shift;
my $user = getpwnam($login);
return $user->dir;
}
# =============================================================================
# GET_SHELL
# =============================================================================
sub get_shell {
my $login = shift;
my $user = getpwnam($login);
return $user->shell;
}
# =============================================================================
# GET_GROUPS
# =============================================================================
sub get_groups {
my $login = shift;
# untaint
$login =~ m/([\w\.\-]+)/;
$login = $1;
my $groups = `id -nG $login`;
return $groups;
}
# =============================================================================
# GET_PASSWORD
# =============================================================================
sub get_password {
my $login = shift;
my $ret = `$user_status_script -passwd $login`;
my $answer = "";
if ($ret eq "---secure") {
$answer .= "nein ";
} else {
$answer .= "JA ";
}
$answer .= "(" . `$user_status_script -change $login` . ")";
return $answer;
}
# =============================================================================
# GET_STATUS
# =============================================================================
sub get_status {
my $login = shift;
# untaint
$login =~ m/([\w\.\-]+)/;
$login = $1;
my $ret = `$user_status_script -locked $login`;
if ($ret eq "---unlocked") {
return "aktiviert";
} else {
return "deaktiviert";
}
}
# =============================================================================
# GET_QUOTA
# =============================================================================
sub get_quota {
my $login = shift;
# untaint
$login =~ m/([\w\.\-]+)/;
$login = $1;
my $ret = `$user_status_script -quota $login`;
return $ret;
}
# =============================================================================
# PRINT_USER_DATA
# =============================================================================
sub print_user_data {
my $login = shift;
# untaint
$login =~ m/([\w\.\-]+)/;
$login = $1;
&print_header("Benutzermanager - $login");
my $fullname = &get_fullname($login);
my $homedir = &get_homedir($login);
my $shell = &get_shell($login);
my $rights = &get_groups($login);
my $quota = &get_quota($login);
$quota =~ m/(\d+)\/(\d+)/;
my $quota_used = $1;
my $quota_limit = $2;
my $status = &get_status($login);
my $change = `$user_status_script -change $login`;
print $q->start_form;
print qq(<table border="0">\n);
print qq(<tr><td><b>Login</b></td><td>$login</td></tr>\n);
print qq(<tr><td><b>Homeverzeichnis</b></td><td>$homedir</td></tr>\n);
print qq(<tr><td><b>Shell</b></td><td>$shell</td></tr>\n);
print qq(<tr><td><b>Name</b></td><td><input type="text" name="fullname"
value="$fullname"></td></tr>\n);
print qq(<tr><td><b>Gruppen</b></td><td>);
print qq(<input type="checkbox" name="rights" value="schueler");
print qq( checked) if ($rights =~ m/schueler/);
print qq(>Schüler );
print qq(<input type="checkbox" name="rights" value="lehrer");
print qq( checked) if ($rights =~ m/lehrer/);
print qq(>Lehrer );
print qq(<input type="checkbox" name="rights" value="internet");
print qq( checked) if ($rights =~ m/internet/);
print qq(>Internet );
print qq(<input type="checkbox" name="rights" value="admin");
print qq( checked) if ($rights =~ m/admin/);
print qq(>Administratoren );
print qq(<input type="checkbox" name="rights" value="homepage");
print qq( checked) if ($rights =~ m/homepage/);
print qq(>Homepage );
print qq(</td></tr>\n);
print qq(<tr><td><b>Quota</b></td><td>);
print qq($quota_used / <input type="text" size="4" value="$quota_limit"
name="quota"> MB);
print qq(</td></tr>\n);
print qq(<tr><td><b>Status</b></td><td>);
print qq(<input type="radio" name="lock" value="gesperrt");
print qq( checked) if ($status eq "deaktiviert");
print qq(>gesperrt );
print qq(<input type="radio" name="lock" value="freigegeben");
print qq( checked) if ($status eq "aktiviert");
print qq(>freigegeben );
print qq(</td></tr>\n);
print qq(<tr><td><b>Passwort</b></td><td>);
print qq(<input type="password" name="passwort" value="">);
print qq( \(Letzte Änderung: $change\));
print qq(</td></tr>\n);
print qq(</table>\n);
print qq(<input type="submit" name="save" value="speichern">\n);
print qq(<input type="submit" name="abort" value="abbrechen">\n);
print qq(<input type="hidden" name="edit_user" value="$login">\n);
print qq(<input type="hidden" name="seite" value="5">\n);
#&print_seite1_values;
print qq(<input type="hidden" name="auswahl" value="name">\n);
print qq(<input type="hidden" name="loginname" value="$login">\n);
print qq(</form>\n);
&print_page_end;
}
# =============================================================================
# DO_LOCK_USERS
# =============================================================================
sub do_lock_users {
my @users = qw();
if (defined($q->param("users"))) {
@users = $q->param("users");
} else {
$error = "<strong>Fehler:</strong> Keine Benutzer ausgewählt!";
return;
}
$error = "Folgende Benutzer wurden gesperrt bzw. freigegeben:<br>\n<b>";
foreach (@users) {
my $login = $_;
# untaint
$login =~ m/([\w\.\-]+)/;
$login = $1;
my $status = &get_status($login);
if ($status eq "aktiviert") {
# sperre Benutzer $login
`sudo /usr/bin/passwd -l $login`;
fehler("Benutzer sperren (passwd) [$login]") if ($? != 0);
`sudo /usr/bin/smbpasswd -d $login`;
fehler("Benutzer sperren (smbpasswd) [$login]") if ($? != 0);
} else {
# Gebe Benutzer $login frei
`sudo /usr/bin/passwd -u $login`;
fehler("Benutzer freigeben (passwd) [$login]") if ($? != 0);
`sudo /usr/bin/smbpasswd -e $login`;
fehler("Benutzer freigeben (smbpasswd) [$login]") if ($? != 0);
}
$error .= "$_ ";
}
$error .= "</b>";
`sudo /usr/local/sbin/generate_apache_auth`;
&print_page_data;
}
# =============================================================================
# ASK_PW_USERS
# =============================================================================
sub ask_pw_users {
my @users = qw();
if (defined($q->param("users"))) {
@users = $q->param("users");
} else {
$error = "<strong>Fehler:</strong> Keine Benutzer ausgewählt!";
&print_page_data;
return;
}
&print_header("Benutzermanager - Passwort ändern");
print qq(Von folgenden Benutzern soll das Passwort geändert werden: <b>);
print join(" ", @users);
print qq(</b>\n<p>\n);
print $q->start_form;
print qq(Bitte geben Sie das neue Passwort ein:\n);
print qq(<input type="password" name="password" size="8" maxlength="8"
value="passwort">\n);
print qq(<input type="hidden" name="seite" value="2">\n);
foreach (@users) {
print qq(<input type="hidden" name="users" value="$_">\n);
}
&print_seite1_values;
print qq(<p>);
print qq(<input type="submit" name="do_it" value="Passwort ändern">\n);
print qq(<input type="submit" name="abort" value="Abbrechen">\n);
print qq(</form>\n);
&print_page_end;
}
# =============================================================================
# PRINT_SEITE1_VALUES
# =============================================================================
sub print_seite1_values {
print qq(<input type="hidden" name="auswahl" value=");
print $q->param("auswahl");
print qq(">\n);
print qq(<input type="hidden" name="loginname" value=");
print $q->param("loginname");
print qq(">\n);
print qq(<input type="hidden" name="abijahr" value=");
print $q->param("abijahr");
print qq(">\n);
print qq(<input type="hidden" name="gruppe_schueler" value=");
print $q->param("gruppe_schueler");
print qq(">\n);
print qq(<input type="hidden" name="gruppe_lehrer" value=");
print $q->param("gruppe_lehrer");
print qq(">\n);
print qq(<input type="hidden" name="gruppe_internet" value=");
print $q->param("gruppe_internet");
print qq(">\n);
print qq(<input type="hidden" name="gruppe_admin" value=");
print $q->param("gruppe_admin");
print qq(">\n);
print qq(<input type="hidden" name="gruppe_homepage" value=");
print $q->param("gruppe_homepage");
print qq(">\n);
}
# =============================================================================
# DO_PW_USERS
# =============================================================================
sub do_pw_users {
my @users = $q->param("users");
my $password = $q->param("password");
if (defined($q->param("abort"))) {
&print_page_data;
return;
}
#untaint
$password =~ m/([-\w#*,;:.+!$%&\/|?{\[()\]}]+)/;
$password = $1;
my $enc_pw = crypt($password,
join("", (".", "/", 0..9, "a".."z", "A".."Z")[rand 64, rand 64]));
$error = "Von folgenden Benutzern wurde das Passwort geändert:<br>\n<b>";
foreach (@users) {
my $login = $_;
#untaint
$login =~ m/([\w\.\-]+)/;
$login = $1;
`sudo /usr/sbin/usermod -p $enc_pw $login`;
fehler("Passwortänderung (usermod) [$login]") if ($? != 0);
open PIPE, "| sudo /usr/bin/smbpasswd -s $login > /dev/null"
or fehler("Passwortänderung (pipe open) [$login]");
print PIPE "$password\n$password\n"
or fehler("Passwortänderung (pipe write) [$login]");
close PIPE
or fehler("Passwortänderung (pipe close) [$login]");
$error .= "$login ";
}
$error .= "</b>";
`sudo /usr/local/sbin/generate_apache_auth`;
&print_page_data;
}
# =============================================================================
# ASK_RIGHTS_USERS
# =============================================================================
sub ask_rights_users {
my @users = qw();
if (defined($q->param("users"))) {
@users = $q->param("users");
} else {
$error = "<strong>Fehler:</strong> Keine Benutzer ausgewählt!";
&print_page_data;
return;
}
&print_header("Benutzermanager - Rechteänderung");
print qq(Von folgenden Benutzern sollen die Rechte geändert werden: <b>);
print join(" ", @users);
print qq(</b>\n<p>\n);
print $q->start_form;
print qq(<h2>Rechte</h2>\n);
print qq(<input type="checkbox" name="rights" value="schueler">Schüler<br>\n);
print qq(<input type="checkbox" name="rights" value="lehrer">Lehrer<br>\n);
print qq(<input type="checkbox" name="rights" value="internet">Internet
<br>\n);
print qq(<input type="checkbox" name="rights" value="admin">Administratoren
<br>\n);
print qq(<input type="checkbox" name="rights" value="homepage">Homepage
<br>\n);
print qq(Quota (0 = unbegrenzt): <input type="text" name="quota" value="50"
size="4">MB<br>\n);
print qq(<input type="hidden" name="seite" value="3">\n);
foreach (@users) {
print qq(<input type="hidden" name="users" value="$_">\n);
}
&print_seite1_values;
print qq(<p>);
print qq(<input type="submit" name="do_it" value="Rechte ändern">\n);
print qq(<input type="submit" name="abort" value="Abbrechen">\n);
print qq(</form>\n);
&print_page_end;
}
# =============================================================================
# DO_RIGHTS_USERS
# =============================================================================
sub do_rights_users {
my @users = $q->param("users");
if (defined($q->param("abort"))) {
$error = "Abbruch!";
&print_page_data;
return;
}
# Rechte sammeln und überprüfen
my @new_rights;
push(@new_rights, "users");
my @rights = $q->param("rights");
foreach (@rights) {
push(@new_rights, "schueler") if ($_ eq "schueler");
push(@new_rights, "lehrer") if ($_ eq "lehrer");
push(@new_rights, "internet") if ($_ eq "internet");
push(@new_rights, "admin") if ($_ eq "admin");
push(@new_rights, "homepage") if ($_ eq "homepage");
}
my $rights_string = join(",", @new_rights);
# Quota
$q->param("quota") =~ m/(\d+)/;
my $quota = $1 * 1024; # Anzahl der KB-Blöcke
# Shell
my $shell = "/bin/false";
if ($rights_string =~ m/admin/) {
$shell = "/bin/bash";
}
$error = "Von folgenden Benutzern wurden die Rechte auf <i>$rights_string</i>
geändert:<br>\n<b>";
foreach (@users) {
my $login = $_;
#untaint
$login =~ m/([\w\.\-]+)/;
$login = $1;
`sudo /usr/sbin/usermod -s $shell -G $rights_string,$login $login`;
fehler("Rechteänderung (usermod) [$login]") if ($? != 0);
`sudo /usr/sbin/setquota $login $quota $quota 0 0 /dev/md0`;
fehler("Rechteänderung (setquota) [$login]") if ($? != 0);
$error .= "$login ";
}
$error .= "</b>\n";
`sudo /usr/local/sbin/generate_apache_auth`;
&print_page_data;
}
# =============================================================================
# ASK_DELETE_USERS
# =============================================================================
sub ask_delete_users {
my @users = qw();
if (defined($q->param("users"))) {
@users = $q->param("users");
} else {
$error = "<strong>Fehler:</strong> Keine Benutzer ausgewählt!";
&print_page_data;
return;
}
&print_header("Benutzermanager - Benutzer löschen");
print qq(<font color="red"><b>ACHTUNG!</b></font> Folgende Benutzer werden
gelöscht: <b>);
print join(" ", @users);
print qq(</b>\n<p>\n);
print qq(Auch die Homeverzeichnisse und alle persönlichen Daten werden
gelöscht );
print qq(und <strong>können nicht wiederhergestellt werden</strong>. Nur
die );
print qq(<tt>public_html</tt>-Verzeichnisse bleiben erhalten.<p>\n);
print qq(Wollen Sie wirklick fortfahren?<p>\n);
print $q->start_form;
print qq(<input type="hidden" name="seite" value="4">\n);
foreach (@users) {
print qq(<input type="hidden" name="users" value="$_">\n);
}
&print_seite1_values;
print qq(<p>);
print qq(<input type="submit" name="do_it" value="Benutzer löschen!">\n);
print qq(<input type="submit" name="abort" value="Abbrechen">\n);
print qq(</form>\n);
&print_page_end;
}
# =============================================================================
# DO_DELETE_USERS
# =============================================================================
sub do_delete_users {
my @users = $q->param("users");
if (defined($q->param("abort"))) {
$error = "Abbruch!";
&print_page_data;
return;
}
$error = "Folgende Benutzer wurden gelöscht:<br>\n<b>";
foreach (@users) {
my $login = $_;
#untaint
$login =~ m/([\w\.\-]+)/;
$login = $1;
# Samba-User löschen
`sudo /usr/bin/smbpasswd -x $login`;
fehler("Benutzer löschen (smbpasswd) [$login]") if ($? != 0);
# public_html-Verzeichnis verschieben
`sudo /bin/mv /home/public_html/$login /usr/local/httpd/htdocs/oldhomes/`;
fehler("Benutzer löschen (move public_html) [$login]") if ($? != 0);
`sudo /bin/chown -hfR root:www-data /usr/local/httpd/htdocs/oldhomes/$login`;
fehler("Benutzer löschen (chown public_html) [$login]") if ($? != 0);
`sudo /bin/chmod -R 755 /usr/local/httpd/htdocs/oldhomes/$login`;
fehler("Benutzer löschen (chmod public_html) [$login]") if ($? != 0);
# Benutzer und Homeverzeichnis löschen
`sudo /usr/sbin/userdel -r $login`;
fehler("Benutzer löschen (userdel) [$login]") if ($? != 0);
`sudo /usr/sbin/groupdel $login`;
fehler("Benutzer löschen (groupdel) [$login]") if ($? != 0);
$error .= "$login ";
}
$error .= "</b>\n";
`sudo /usr/local/sbin/generate_apache_auth`;
&print_page_data;
}
# =============================================================================
# FEHLER
# =============================================================================
sub fehler {
my $text = shift;
$error .= qq(<p><font color="red"><big><strong>Schwerwiegender Fehler:
</strong></big> $text</font>);
`sudo /usr/local/sbin/generate_apache_auth`;
&print_page_data;
exit 1;
}
# =============================================================================
# DO_SAVE_USER_DATA
# =============================================================================
sub do_save_user_data {
if (defined($q->param("abort"))) {
$error = "Abbruch!";
&print_page_data;
return;
}
my $login = $q->param("edit_user");
# untaint
$login =~ m/([\w\.\-]+)/;
$login = $1;
my $fullname;
my $rights;
my $quota;
my $status;
if (defined($q->param("fullname"))) {
$fullname = $q->param("fullname");
#untaint
$fullname =~ m/([\w\.\ ,äöüÄÖÜ\-*#']+)/;
$fullname = $1;
`sudo /usr/sbin/usermod -c "$fullname" $login`;
fehler("Benutzer ändern, Name (usermod) [$login]") if ($? != 0);
}
if (defined($q->param("rights"))) {
# Rechte sammeln und überprüfen
my @new_rights;
push(@new_rights, "users");
my @rights = $q->param("rights");
foreach (@rights) {
push(@new_rights, "schueler") if ($_ eq "schueler");
push(@new_rights, "lehrer") if ($_ eq "lehrer");
push(@new_rights, "internet") if ($_ eq "internet");
push(@new_rights, "admin") if ($_ eq "admin");
push(@new_rights, "homepage") if ($_ eq "homepage");
}
my $rights_string = join(",", @new_rights);
my $shell = "/bin/false";
if ($rights_string =~ m/admin/) { $shell = "/bin/bash"; }
`sudo /usr/sbin/usermod -s $shell -G $rights_string,$login $login`;
fehler("Benutzer ändern, Rechte (usermod) [$login]") if ($? != 0);
}
if (defined($q->param("lock"))) {
$status = $q->param("lock");
if ($status eq "gesperrt") {
# sperre Benutzer $login
`sudo /usr/bin/passwd -l $login`;
fehler("Benutzer sperren (passwd) [$login]") if ($? != 0);
`sudo /usr/bin/smbpasswd -d $login`;
fehler("Benutzer sperren (smbpasswd) [$login]") if ($? != 0);
} else {
# Gebe Benutzer $login frei
`sudo /usr/bin/passwd -u $login`;
fehler("Benutzer freigeben (passwd) [$login]") if ($? != 0);
`sudo /usr/bin/smbpasswd -e $login`;
fehler("Benutzer freigeben (smbpasswd) [$login]") if ($? != 0);
}
}
if (defined($q->param("quota"))) {
# Quota
$q->param("quota") =~ m/(\d+)/;
my $quota = $1 * 1024; # Anzahl der KB-Blöcke
`sudo /usr/sbin/setquota $login $quota $quota 0 0 /dev/md0`;
fehler("Benutzer ändern, Quota (setquota) [$login]") if ($? != 0);
}
if (defined($q->param("passwort")) && $q->param("passwort") ne "") {
my $password = $q->param("passwort");
#untaint
$password =~ m/([-\w#*,;:.+!$%&\/|?{\[()\]}]+)/;
$password = $1;
my $enc_pw = crypt($password,
join("", (".", "/", 0..9, "a".."z", "A".."Z")[rand 64, rand 64]));
`sudo /usr/sbin/usermod -p $enc_pw $login`;
fehler("Benutzer ändern, Passwort (usermod) [$login]") if ($? != 0);
open PIPE, "| sudo /usr/bin/smbpasswd -s $login > /dev/null"
or fehler("Benutzer ändern, Passwort (pipe open) [$login]");
print PIPE "$password\n$password\n"
or fehler("Benutzer ändern, Passwort (pipe write) [$login]");
close PIPE
or fehler("Benutzer ändern, Passwort (pipe close) [$login]");
}
`sudo /usr/local/sbin/generate_apache_auth`;
$error = "Benutzer $login geändert.";
&print_page_data;
}
Dateiname: /usr/local/sbin/user-status3.
#!/usr/bin/perl -wT
use User::pwent;
# Path setzen, wegen Taint-Mode
$ENV{"PATH"} = "/bin:/usr/bin";
# Parameter holen...
my $action = shift;
my $login = shift;
# $login untainten
if (defined($login)) {
$login =~ m/([\w\.-]+)/;
$login = $1;
}
if (defined($action) && defined($login)) {
if ($action eq "-passwd") { &print_passwd(); }
elsif ($action eq "-locked") { &print_locked(); }
elsif ($action eq "-groups") { &print_groups(); }
elsif ($action eq "-change") { &print_change(); }
elsif ($action eq "-quota") { &print_quota(); }
}
print "fehlerhafte Argumente...\n";
print "user-status action login\n";
print "action: {-passwd|-locked|-groups|-change|-quota}\n";
exit 1;
sub print_passwd {
my $user = getpwnam($login);
if (crypt("passwort", $user->passwd) eq $user->passwd) {
print $login;
} else {
print "---secure";
}
exit 0;
}
sub print_locked {
my $user = getpwnam($login);
if (substr($user->passwd, 0, 1) eq "!") {
print $login;
} else {
print "---unlocked";
}
exit 0;
}
sub print_groups {
my $groups = `id -nG $login`;
print $groups;
exit 0;
}
sub print_change {
open(SHADOW, "</etc/shadow");
my @data = <SHADOW>;
close(SHADOW);
my @user = grep(/$login/, @data);
my $line = shift @user;
my $age = (split(/:/, $line))[2];
$age = $age * 24 * 60 * 60;
my $day;
my $mon;
my $year;
(undef, undef, undef, $day, $mon, $year) = localtime($age);
$mon += 1;
$year += 1900;
if ($day < 10) { $day = "0$day"; }
if ($mon < 10) { $mon = "0$mon"; }
print "$day.$mon.$year";
exit 0;
}
sub print_quota {
my $ret = `quota -v $login`;
$ret =~ tr/ //s;
my @zeilen = split /\n/, $ret;
my @quota = split / /, $zeilen[2];
$quota[2] =~ m/(\d+)/;
my $quota_used = $1;
$quota_used = int($quota_used/1024);
$quota[3] =~ m/(\d+)/;
my $quota_limit = $1;
$quota_limit = int($quota_limit/1024);
print "$quota_used/$quota_limit MB";
exit 0;
}