Files
webmin/usermin/switch.cgi
2007-04-12 20:24:50 +00:00

57 lines
1.4 KiB
Perl
Executable File

#!/usr/local/bin/perl
# Set the Usermin session cookie to be some other user
require './usermin-lib.pl';
&ReadParse();
$access{'sessions'} || &error($text{'switch_euser'});
&get_usermin_miniserv_config(\%miniserv);
if (&check_pid_file($miniserv{'pidfile'})) {
# Stop Usermin first, so that the DBM can be safely written
&stop_usermin();
$stopped = 1;
}
&acl::open_session_db(\%miniserv);
&seed_random();
$now = time();
$sid = int(rand()*$now);
$acl::sessiondb{$sid} = "$in{'user'} $now $ENV{'REMOTE_ADDR'}";
dbmclose(%acl::sessiondb);
if ($stopped) {
&start_usermin();
}
&reload_usermin_miniserv();
&webmin_log("switch", undef, $in{'user'});
eval "use Net::SSLeay";
if ($@) {
$miniserv{'ssl'} = 0;
}
$ssl = $miniserv{'ssl'} || $miniserv{'inetd_ssl'};
$sec = $ssl ? "; secure" : "";
$sidname = $miniserv{'sidname'} || 'sid';
print "Set-Cookie: $sidname=$sid; path=/$sec\n";
# Work out redirect host
@sockets = &webmin::get_miniserv_sockets(\%miniserv);
if ($config{'host'}) {
# Specific hostname set
$host = $config{'host'};
}
else {
if ($sockets[0]->[0] ne "*") {
# Listening on special IP
$host = $sockets[0]->[0];
$port = $sockets[0]->[1] if ($sockets[0]->[1] ne '*');
}
else {
# Use same hostname as this server
$host = $ENV{'HTTP_HOST'};
$host =~ s/:.*//;
}
}
$port ||= $config{'port'} || $miniserv{'port'};
&redirect(($ssl ? "https://" : "http://").
$host.":".$port."/");