chore: import upstream snapshot with attribution

This commit is contained in:
wehub-resource-sync
2026-07-13 13:12:17 +08:00
commit cf8edb9f21
44281 changed files with 1655134 additions and 0 deletions
+57
View File
@@ -0,0 +1,57 @@
---- Changes since 1.130 ----
The default background, text and link colours of pages can be edited for Usermin, just like in Webmin.
Unavailable modules are shown in red on the module restriction page.
---- Changes since 1.140 ----
Module update emails are now sent using the Read User Mail module.
---- Changes since 1.170 ----
Added page showing current Usermin logins, with the ability to cancel sessions.
---- Changes since 1.180 ----
Scheduled updates can now be downloaded at any time configurable using Cron, by enabling a new option on the Module Config page.
---- Changes since 1.190 ----
Trusted referers for Usermin can now be edited.
---- Changes since 1.200 ----
Additional SSL certificates for Usermin can now be defined for different local IP addresses. This can be useful for sites doing SSL virtual hosting that want to share the same certificate between Apache and Webmin for the same address.
---- Changes since 1.220 ----
Added an option to enable Utmp logging where users login to or logout from Usermin. Requires the User::Utmp Perl module.
Added an option to have missing home directories automatically created at login time, and to specify their permissions.
---- Changes since 1.230 ----
The inactivity timeout can now be specified on a per-user or group basis, rather than just using a single global timeout.
---- Changes since 1.250 ----
Added page for configuring DAV support in Usermin 1.181 or higher.
Added a form for exporting Usermin modules, similar to the feature that already existed in Webmin.
The IP addresses of connected users are displayed on the sessions page.
---- Changes since 1.260 ----
Added an option on the SSL Encryption page to prevent the use of SSL version 2.
Added a form on the sessions page for logging in as a Usermin user without needing to know their password.
Added an option on the User Interface page to have the current username prepended to all page titles.
Added a form to the Usermin Themes page for exporting a theme to a file.
---- Changes since 1.290 ----
Added support for installing and upgrading the Debian package version of Usermin.
Added a page for overriding module titles.
Added the Advanced Options page, which can be used to change the temporary files directory, Umask and stack trace display.
---- Changes since 1.350 ----
Added an option to the Authentication page to block users with too many failed logins, as well as hosts.
Created the new Blocked Hosts and Users page to show blocks currently in force, and allow them to be cleared.
---- Changes since 1.360 ----
Separated the Configure Module page into tabs, to make it clearer which options are global and which are default user preferences.
---- Changes since 1.370 ----
The format for dates displayed by Webmin can be changed by a new option on the User Interface page.
---- Changes since 1.380 ----
Added the Mobule Device Options page, for setting a theme specifically for small-screen browsers.
---- Changes since 1.440 ----
Converted commands in the module's API file to POD format, and added more details about each function.
---- Changes since 1.450 ----
Added a field for allowed SSL cipher types.
Expired passwords can now be changed using an external command, instead of PAM or directly updating /etc/shadow. This is set on the Authentication page.
---- Changes since 1.470 ----
Added a field to the Operating System and Environment page for additional Perl module directories.
---- Changes since 1.520 ----
IPv6 support for Usermin can now be enabled on the Ports and Addresses page.
---- Changes since 1.560 ----
Updated the SSL Encryption page to have the same UI and features as Webmin.
---- Changes since 1.580 ----
Added a button to copy the SSL certificate and other settings from Webmin.
---- Changes since 1.770 ----
Converted all pages to use the new Webmin UI library, for a more consistent and themeable experience.
---- Changes since 1.830 ----
Per-domain-name SSL certificates can now be created as well as per-IP, allowing for multiple certs to exist on the same IP address.
+48
View File
@@ -0,0 +1,48 @@
require 'usermin-lib.pl';
# acl_security_form(&options)
# Output HTML for editing security options for the usermin module
sub acl_security_form
{
my ($o) = @_;
print &ui_table_row($text{'acl_icons'},
&ui_select("icons", [ keys %$o ],
[ map { [ $_, $text{$_."_title"} ] } &get_icons() ],
10, 1));
print &ui_table_row($text{'acl_mods'},
&ui_radio("mods_def", $o->{'mods'} eq '*' ? 1 : 0,
[ [ 1, $text{'acl_all'} ],
[ 0, $text{'acl_sel'} ] ])."<br>\n".
&ui_select("mods", [ split(/\s+/, $o->{'mods'}) ],
[ map { [ $_->{'dir'}, &html_escape($_->{'desc'}) ] }
&list_modules() ],
10, 1));
print &ui_table_row($text{'acl_stop'},
&ui_yesno_radio("stop", $o->{'stop'}));
print &ui_table_row($text{'acl_bootup'},
&ui_yesno_radio("bootup", $o->{'bootup'}));
}
# acl_security_save(&options)
# Parse the form for security options for the usermin module
sub acl_security_save
{
my ($o) = @_;
my %icons = map { $_, 1 } split(/\0/, $in{'icons'});
foreach my $i (&get_icons()) {
$o->{$i} = $icons{$i};
}
$o->{'mods'} = $in{'mods_def'} ? "*" : join(" ", split(/\0/, $in{'mods'}));
$o->{'stop'} = $in{'stop'};
$o->{'bootup'} = $in{'bootup'};
}
sub get_icons
{
return ( "access" ,"bind" ,"ui" ,"umods" ,"os" ,"lang" ,"upgrade" ,"session" ,"assignment" ,"categories" ,"themes", "referers", "anon", "ssl" ,"configs" ,"acl" ,"restrict" ,"users" ,"defacl", "sessions", "blocked", "advanced" );
}
+89
View File
@@ -0,0 +1,89 @@
do 'usermin-lib.pl';
# backup_config_files()
# Returns files and directories that can be backed up
sub backup_config_files
{
&get_usermin_miniserv_config(\%miniserv);
local @rv = ( "$config{'usermin_dir'}/config",
"$config{'usermin_dir'}/miniserv.conf",
"$config{'usermin_dir'}/webmin.cats",
"$config{'usermin_dir'}/webmin.catnames",
"$config{'usermin_dir'}/usermin.mods",
$miniserv{'keyfile'},
$miniserv{'certfile'},
$miniserv{'ca'},
"$config{'usermin_dir'}/webmin.acl",
$miniserv{'userfile'},
"$config{'usermin_dir'}/user.acl",
);
foreach my $m (&list_modules()) {
push(@rv, "$config{'usermin_dir'}/$m->{'dir'}/config");
push(@rv, "$config{'usermin_dir'}/$m->{'dir'}/uconfig");
}
return @rv;
}
# pre_backup(&files)
# Called before the files are actually read
sub pre_backup
{
return undef;
}
# post_backup(&files)
# Called after the files are actually read
sub post_backup
{
return undef;
}
# pre_restore(&files)
# Called before the files are restored from a backup
sub pre_restore
{
# Get current configs, for later merging
&get_usermin_miniserv_config(\%oldminiserv);
&read_file("$config{'usermin_dir'}/config", \%oldconfig);
return undef;
}
# post_restore(&files)
# Called after the files are restored from a backup
sub post_restore
{
# Merge in local settings that cannot be copied
local %miniserv;
&get_usermin_miniserv_config(\%miniserv);
foreach my $k (keys %oldminiserv) {
my $copy = 0;
foreach my $keep ("root", "mimetypes", "logfile", "pidfile",
"env_WEBMIN_CONFIG", "env_WEBMIN_VAR", "logout",
"passwd_.*") {
$copy = 1 if ($k =~ /^$keep$/);
}
$miniserv{$k} = $oldminiserv{$k} if ($copy);
}
&put_usermin_miniserv_config(\%miniserv);
local %gconfig;
&read_file("$config{'usermin_dir'}/config", \%gconfig);
foreach my $k (keys %oldconfig) {
my $copy = 0;
foreach my $nocopy ("os_type", "os_version",
"real_os_type", "real_os_version",
"find_pid_command", "ld_env", "passwd_.*") {
$copy = 1 if ($k =~ /^$keep$/);
}
$config{$k} = $oldconfig{$k} if ($copy);
}
&write_file("$config{'usermin_dir'}/config", \%gconfig);
&flush_modules_cache();
&restart_usermin_miniserv();
return undef;
}
1;
+51
View File
@@ -0,0 +1,51 @@
#!/usr/local/bin/perl
# bootup.cgi
# Create, enable or disable usermin startup at boot time
require './usermin-lib.pl';
$access{'bootup'} || &error($text{'bootup_ecannot'});
&foreign_require("init");
&ReadParse();
my %miniserv;
&get_usermin_miniserv_config(\%miniserv);
if ($in{'boot'}) {
# Enable starting at boot
$start = "$config{'usermin_dir'}/start";
if ($init::init_mode eq "launchd") {
# Launchd forks automatically
$start .= " --nofork";
$fork = 0;
}
else {
$fork = 1;
}
$stop = "$config{'usermin_dir'}/stop";
$status = <<EOF;
pidfile=`grep "^pidfile=" $config{'usermin_dir'}/miniserv.conf | sed -e 's/pidfile=//g'`
if [ -s \$pidfile ]; then
pid=`cat \$pidfile`
kill -0 \$pid >/dev/null 2>&1
if [ "\$?" = "0" ]; then
echo "usermin (pid \$pid) is running"
RETVAL=0
else
echo "usermin is stopped"
RETVAL=1
fi
else
echo "usermin is stopped"
RETVAL=1
fi
EOF
&init::enable_at_boot("usermin", "Start or stop Usermin",
$start, $stop, $status,
{ 'fork' => $fork,
'pidfile' => $miniserv{'pidfile'} });
}
else {
# Disable starting at boot
&init::disable_at_boot("usermin");
}
&redirect("");
+12
View File
@@ -0,0 +1,12 @@
do 'usermin-lib.pl';
sub cgi_args
{
my ($cgi) = @_;
if ($cgi =~ /^edit_/ || $cgi eq 'index.cgi') {
# No args needed for sure
return '';
}
return 'none';
}
+27
View File
@@ -0,0 +1,27 @@
#!/usr/local/bin/perl
# change_access.cgi
# Update IP allow and deny parameters
require './usermin-lib.pl';
$access{'access'} || &error($text{'acl_ecannot'});
use Socket;
&ReadParse();
&error_setup($text{'access_err'});
@hosts = split(/\s+/, $in{"ip"});
&lock_file($usermin_miniserv_config);
&get_usermin_miniserv_config(\%miniserv);
delete($miniserv{"allow"});
delete($miniserv{"deny"});
if ($in{"access"} == 1) { $miniserv{"allow"} = join(' ', @hosts); }
elsif ($in{"access"} == 2) { $miniserv{"deny"} = join(' ', @hosts); }
$miniserv{"known_ips"} = $miniserv{"allow"} || $miniserv{"deny"} ||
(!@hosts && $in{"access"} == 0 ? "" : $miniserv{"known_ips"});
$miniserv{'libwrap'} = $in{'libwrap'};
$miniserv{'alwaysresolve'} = $in{'alwaysresolve'};
&put_usermin_miniserv_config(\%miniserv);
&unlock_file($usermin_miniserv_config);
&restart_usermin_miniserv();
&webmin_log("access", undef, undef, \%in);
&redirect("");
+70
View File
@@ -0,0 +1,70 @@
#!/usr/local/bin/perl
# Save advanced options
require './usermin-lib.pl';
&ReadParse();
&error_setup($text{'advanced_err'});
&get_usermin_miniserv_config(\%miniserv);
&get_usermin_config(\%uconfig);
# Save global temp dir setting
if ($in{'tempdir_def'}) {
delete($uconfig{'tempdir'});
}
else {
-d $in{'tempdir'} || &error($text{'advanced_etemp'});
$uconfig{'tempdir'} = $in{'tempdir'};
}
# Save per-module temp dirs
for($i=0; defined($tmod = $in{'tmod_'.$i}); $i++) {
next if (!$tmod);
$tdir = $in{'tdir_'.$i};
%minfo = &get_usermin_module_info($tmod);
-d $tdir || &error(&text('advanced_etdir',
&html_escape($minfo{'desc'})));
push(@tdirs, [ $tmod, $tdir ]);
}
&webmin::save_tempdirs(\%uconfig, \@tdirs);
# Save umask
if ($in{'umask_def'}) {
delete($uconfig{'umask'});
}
else {
$in{'umask'} =~ /^[0-7]{3}$/ ||
&error($text{'advanced_eumask'});
$uconfig{'umask'} = $in{'umask'};
}
# Sort config file's keys alphabetically
if (defined($in{'sortconfigs'})) {
$uconfig{'sortconfigs'} = $in{'sortconfigs'};
}
&lock_file($usermin_config);
&write_file($usermin_config, \%uconfig);
&unlock_file($usermin_config);
# Save password pass option
$miniserv{'pass_password'} = $in{'pass'};
if (defined($in{'preload'})) {
# Save preload option, forcing new mode
if ($in{'preload'}) {
$miniserv{'premodules'} = 'WebminCore';
}
else {
delete($miniserv{'premodules'});
}
&webmin::save_preloads(\%miniserv, [ ]);
}
&lock_file($usermin_miniserv_config);
&put_usermin_miniserv_config(\%miniserv);
&unlock_file($usermin_miniserv_config);
&restart_usermin_miniserv();
&webmin_log("advanced");
&redirect("");
+26
View File
@@ -0,0 +1,26 @@
#!/usr/local/bin/perl
# change_anon.cgi
# Update list of anonymously accessible modules
require './usermin-lib.pl';
&ReadParse();
&get_usermin_miniserv_config(\%miniserv);
&error_setup($text{'anon_err'});
# Check inputs
&read_acl(undef, \%acl);
for($i=0; defined($in{"url_$i"}); $i++) {
next if (!$in{"url_$i"});
$in{"url_$i"} =~ /^\/\S+$/ || &error(&text('anon_eurl', $in{"url_$i"}));
getpwnam($in{"user_$i"}) || &error(&text('anon_euser', $in{"url_$i"}));
push(@anon, $in{"url_$i"}."=".$in{"user_$i"});
}
&lock_file($usermin_miniserv_config);
$miniserv{'anonymous'} = join(" ", @anon);
&put_usermin_miniserv_config(\%miniserv);
&unlock_file($usermin_miniserv_config);
&restart_usermin_miniserv();
&webmin_log("anon", undef, undef, \%in);
&redirect("");
+124
View File
@@ -0,0 +1,124 @@
#!/usr/local/bin/perl
# change_bind.cgi
# Update the binding IP address and port for miniserv
require './usermin-lib.pl';
$access{'bind'} || &error($text{'acl_ecannot'});
use Socket;
&ReadParse();
&get_usermin_miniserv_config(\%miniserv);
%oldminiserv = %miniserv;
&error_setup($text{'bind_err'});
# Validate inputs
for($i=0; defined($in{"ip_def_$i"}); $i++) {
next if (!$in{"ip_def_$i"});
if ($in{"ip_def_$i"} == 1) {
$ip = "*";
}
else {
$ip = $in{"ip_$i"};
&check_ipaddress($ip) ||
$in{'ipv6'} && &check_ip6address($ip) ||
&error(&text('bind_eip2', $ip));
}
if ($in{"port_def_$i"} == 1) {
$port = $in{"port_$i"};
$port =~ /^\d+$/ && $port < 65536 ||
&error(&text('bind_eport2', $port));
}
else {
$port = "*";
}
push(@sockets, [ $ip, $port ]);
push(@ports, $port) if ($port && $port ne "*");
}
@sockets || &error($text{'bind_enone'});
$in{'hostname_def'} || $in{'hostname'} =~ /^[a-z0-9\.\-]+$/i ||
&error($text{'bind_ehostname'});
if ($in{'ipv6'}) {
eval "use Socket6";
$@ && &error(&text('bind_eipv6', "<tt>Socket6</tt>"));
}
# For any new ports, check if they are already in use
@oldports = split(/\s+/, $in{'oldports'});
@newports = &unique(grep { &indexof($_, @oldports) < 0 } @ports);
if (&has_command("lsof")) {
foreach my $p (@newports) {
my $qp = quotemeta($p);
$out = &backquote_command("lsof -t -i tcp:$qp 2>/dev/null");
if ($out =~ /\d+/) {
&error(&text('bind_elsof', $p));
}
}
}
# Update config file
&lock_file($usermin_miniserv_config);
$first = shift(@sockets);
$miniserv{'port'} = $first->[1];
if ($first->[0] eq "*") {
delete($miniserv{'bind'});
}
else {
$miniserv{'bind'} = $first->[0];
}
$miniserv{'sockets'} = join(" ", map { "$_->[0]:$_->[1]" } @sockets);
if ($in{'websocket_base_port_def'}) {
delete($miniserv{'websocket_base_port'});
}
else {
$miniserv{'websocket_base_port'} = $in{'websocket_base_port'};
}
if ($in{'websocket_host_def'}) {
delete($miniserv{'websocket_host'});
}
else {
$miniserv{'websocket_host'} = $in{'websocket_host'};
}
$miniserv{'ipv6'} = $in{'ipv6'};
if ($in{'listen_def'}) {
delete($miniserv{'listen'});
}
else {
$miniserv{'listen'} = $in{'listen'};
}
if ($in{'hostname_def'}) {
delete($miniserv{'host'});
}
else {
$miniserv{'host'} = $in{'hostname'};
}
&put_usermin_miniserv_config(\%miniserv);
&unlock_file($usermin_miniserv_config);
# Attempt to re-start miniserv
$rv = &system_logged("$config{'usermin_dir'}/restart >/dev/null 2>&1 </dev/null");
if ($rv) {
# Failed! Roll back config and start again
&lock_file($usermin_miniserv_config);
&put_usermin_miniserv_config(\%oldminiserv);
&unlock_file($usermin_miniserv_config);
&system_logged("$config{'usermin_dir'}/restart >/dev/null 2>&1 </dev/null");
&error(&text('bind_erestart', $out));
}
# If possible, open the new ports
foreach my $mod ("firewall", "firewalld") {
if (&foreign_check($mod) && $in{'firewall'}) {
if (@newports) {
&clean_environment();
$ENV{'WEBMIN_CONFIG'} = $config_directory;
&system_logged(
&module_root_directory($mod)."/open-ports.pl ".
join(" ", map { quotemeta($_).":".quotemeta($_+10) } @newports).
" >/dev/null 2>&1");
&reset_environment();
}
}
}
&webmin_log("bind", undef, undef, \%in);
&redirect("");
+18
View File
@@ -0,0 +1,18 @@
#!/usr/local/bin/perl
# change_lang.cgi
# Change language setting
require './usermin-lib.pl';
$access{'lang'} || &error($text{'acl_ecannot'});
&ReadParse();
&lock_file($usermin_config);
&get_usermin_config(\%uconfig);
$uconfig{'lang'} = $in{'lang'};
$uconfig{'acceptlang'} = $in{'acceptlang'};
$uconfig{'dateformat'} = $in{'dateformat'};
$uconfig{'locale'} = $in{'locale'};
&put_usermin_config(\%uconfig);
&unlock_file($usermin_config);
&webmin_log("lang", undef, undef, \%in);
&redirect("");
+37
View File
@@ -0,0 +1,37 @@
#!/usr/local/bin/perl
# Display options specific to mobile devices
require './usermin-lib.pl';
&ReadParse();
&error_setup($text{'mobile_err'});
&lock_file($usermin_miniserv_config);
&lock_file("$config{'usermin_dir'}/config");
&get_usermin_miniserv_config(\%miniserv);
&get_usermin_config(\%uconfig);
# Validate and store inputs
if ($in{'theme'} eq '*') {
delete($miniserv{'mobile_preroot'});
delete($uconfig{'mobile_theme'});
}
else {
$miniserv{'mobile_preroot'} = $in{'theme'};
$uconfig{'mobile_theme'} = $in{'theme'};
}
$miniserv{'mobile_nosession'} = $in{'nosession'};
$in{'agents'} =~ s/\r//g;
$miniserv{'mobile_agents'} = join("\t", split(/\n+/, $in{'agents'}));
$miniserv{'mobile_prefixes'} = $in{'prefixes'};
# Write out files
&put_usermin_miniserv_config(\%miniserv);
&unlock_file($usermin_miniserv_config);
&put_usermin_config(\%uconfig);
&unlock_file("$config{'usermin_dir'}/config");
&reload_usermin_miniserv();
&webmin_log('mobile', undef, undef, \%in);
&redirect("");
+57
View File
@@ -0,0 +1,57 @@
#!/usr/local/bin/perl
# change_os.cgi
# Change OS settings
require './usermin-lib.pl';
$access{'os'} || &error($text{'acl_ecannot'});
&ReadParse();
&lock_file($usermin_config);
&get_usermin_config(\%uconfig);
&get_usermin_miniserv_config(\%miniserv);
$osfile = "$miniserv{'root'}/os_list.txt";
if ($in{'update'}) {
# Automatically detect
%osinfo = &webmin::detect_operating_system($osfile);
$uconfig{'real_os_type'} = $osinfo{'real_os_type'};
$uconfig{'real_os_version'} = $osinfo{'real_os_version'};
$uconfig{'os_type'} = $osinfo{'os_type'};
$uconfig{'os_version'} = $osinfo{'os_version'};
}
elsif ($in{'type'} ne $uconfig{'real_os_type'} ||
$in{'version'} ne $uconfig{'real_os_version'} ||
$in{'itype'} ne $uconfig{'os_type'} ||
$in{'iversion'} ne $uconfig{'os_version'}) {
# Manually change
$uconfig{'real_os_type'} = $in{'type'};
$in{'version'} || &error($text{'os_eversion'});
$uconfig{'real_os_version'} = $in{'version'};
($os) = grep { $_->{'realtype'} eq $in{'type'} }
&webmin::list_operating_systems($osfile);
$uconfig{'os_type'} = $in{'itype'};
$in{'iversion'} || &error($text{'os_eiversion'});
$uconfig{'os_version'} = $in{'iversion'};
}
$uconfig{'path'} = join(":", split(/[\r\n]+/, $in{'path'}));
$uconfig{'ld_path'} = join(":", split(/[\r\n]+/, $in{'ld_path'}));
&put_usermin_config(\%uconfig);
&unlock_file($usermin_config);
&lock_file($usermin_miniserv_config);
foreach $e (keys %miniserv) {
delete($miniserv{$e}) if ($e =~ /^env_(\S+)$/ &&
$1 ne "WEBMIN_CONFIG" && $1 ne "WEBMIN_VAR");
}
for($i=0; defined($n = $in{"name_$i"}); $i++) {
next if (!$n);
$miniserv{'env_'.$n} = $in{"value_$i"}
if ($n ne "WEBMIN_CONFIG" && $n ne "WEBMIN_VAR");
}
$miniserv{'perllib'} = join(':', split(/\r?\n/, $in{'perllib'}));
&put_usermin_miniserv_config(\%miniserv);
&unlock_file($usermin_miniserv_config);
&restart_usermin_miniserv();
&webmin_log("os", undef, undef, \%in);
&redirect("");
+18
View File
@@ -0,0 +1,18 @@
#!/usr/local/bin/perl
# change_referers.cgi
# Change referer checking settings
require './usermin-lib.pl';
&ReadParse();
&get_usermin_config(\%ugconfig);
&lock_file($usermin_config);
$ugconfig{'referer'} = $in{'referer'};
$ugconfig{'referers'} = join(" ", split(/\s+/, $in{'referers'}));
$ugconfig{'referers_none'} = !$in{'referers_none'};
&put_usermin_config(\%ugconfig);
&unlock_file($usermin_config);
&webmin_log('referers', undef, undef, \%in);
&redirect("");
+176
View File
@@ -0,0 +1,176 @@
#!/usr/local/bin/perl
# change_session.cgi
# Enable or disable session authentication
require './usermin-lib.pl';
$access{'session'} || &error($text{'acl_ecannot'});
&ReadParse();
&error_setup($text{'session_err'});
$ver = &get_usermin_version();
&lock_file($usermin_miniserv_config);
&get_usermin_miniserv_config(\%miniserv);
$miniserv{'passdelay'} = $in{'passdelay'};
# Save blocked hosts
if ($in{'blockhost_on'}) {
$in{'blockhost_time'} =~ /^\d+$/ && $in{'blockhost_time'} > 0 ||
&error($text{'session_eblockhost_time'});
$in{'blockhost_failures'} =~ /^\d+$/ && $in{'blockhost_failures'} > 0 ||
&error($text{'session_eblockhost_failures'});
$miniserv{'blockhost_time'} = $in{'blockhost_time'};
$miniserv{'blockhost_failures'} = $in{'blockhost_failures'};
}
else {
$miniserv{'blockhost_time'} = $miniserv{'blockhost_failures'} = undef;
}
# Save blocked users
if ($in{'blockuser_on'}) {
$in{'blockuser_time'} =~ /^\d+$/ && $in{'blockuser_time'} > 0 ||
&error($text{'session_eblockuser_time'});
$in{'blockuser_failures'} =~ /^\d+$/ && $in{'blockuser_failures'} > 0 ||
&error($text{'session_eblockuser_failures'});
$miniserv{'blockuser_time'} = $in{'blockuser_time'};
$miniserv{'blockuser_failures'} = $in{'blockuser_failures'};
}
else {
$miniserv{'blockuser_time'} = $miniserv{'blockuser_failures'} = undef;
}
$miniserv{'syslog'} = $in{'syslog'};
if ($in{'session'} && $ENV{'HTTP_COOKIE'} !~ /sessiontest=1/i) {
&error($text{'session_ecookie'});
}
$miniserv{'session'} = $in{'session'};
if ($in{'logouttime_on'}) {
$in{'logouttime'} =~ /^\d+$/ && $in{'logouttime'} > 0 ||
&error($text{'session_elogouttime'});
}
$miniserv{'logouttime'} = $in{'logouttime_on'} ? $in{'logouttime'} : undef;
if ($in{'localauth'}) {
$lsof = &has_command("lsof");
&error($text{'session_elsof'}) if (!$lsof);
$miniserv{'localauth'} = $lsof;
}
else {
delete($miniserv{'localauth'});
}
if ($in{'passwd_file'}) {
$in{'passwd_file'} =~ /\|$/ || -r $in{'passwd_file'} ||
&error($text{'session_epasswd_file'});
$in{'passwd_uindex'} =~ /^\d+$/ ||
&error($text{'session_epasswd_uindex'});
$in{'passwd_pindex'} =~ /^\d+$/ ||
&error($text{'session_epasswd_pindex'});
$miniserv{'passwd_file'} = $in{'passwd_file'};
$miniserv{'passwd_uindex'} = $in{'passwd_uindex'};
$miniserv{'passwd_pindex'} = $in{'passwd_pindex'};
}
else {
delete($miniserv{'passwd_file'});
delete($miniserv{'passwd_uindex'});
delete($miniserv{'passwd_pindex'});
}
if ($in{'extauth'}) {
$in{'extauth'} =~ /^(\S+)/ && -x $1 ||
&error($text{'session_eextauth'});
$miniserv{'extauth'} = $in{'extauth'};
}
else {
delete($miniserv{'extauth'});
}
if ($ver >= 1.047 && defined($in{'passwd_mode'})) {
$miniserv{'passwd_mode'} = $in{'passwd_mode'};
}
if ($ver >= 1.087) {
$miniserv{'passwd_blank'} = $in{'passwd_blank'};
}
if ($ver >= 1.003) {
$miniserv{'domainuser'} = $in{'domainuser'};
}
if ($ver >= 1.021) {
$miniserv{'domainstrip'} = $in{'domainstrip'};
if ($in{'user_mapping_on'}) {
-r $in{'user_mapping'} || $in{'user_mapping'} =~ /\|$/ ||
&error($text{'session_eusermap'});
$miniserv{'user_mapping'} = $in{'user_mapping'};
}
else {
delete($miniserv{'user_mapping'});
}
$miniserv{'user_mapping_reverse'} = $in{'user_mapping_reverse'};
}
&lock_file($miniserv{'userfile'});
@users = &get_usermin_miniserv_users();
if ($in{'authmode'} == 0) {
delete($miniserv{'no_pam'});
$users[0]->{'pass'} = 'x';
}
elsif ($in{'authmode'} == 1) {
$in{'passwd_file'} || &error($text{'session_eauthmode1'});
$miniserv{'no_pam'} = 1;
$users[0]->{'pass'} = 'x';
}
else {
$in{'extauth'} || &error($text{'session_eauthmode2'});
$users[0]->{'pass'} = 'e';
}
$miniserv{'pam_conv'} = $in{'pam_conv'};
$miniserv{'pam_end'} = $in{'pam_end'};
if ($in{'cmd_def'}) {
delete($gconfig{'passwd_cmd'});
}
else {
$in{'cmd'} =~ /\S/ && &has_command($in{'cmd'}) ||
&error($text{'session_ecmd'});
$gconfig{'passwd_cmd'} = $in{'cmd'};
}
$miniserv{'session_ip'} = $in{'session_ip'};
$miniserv{'utmp'} = $in{'utmp'};
&save_usermin_miniserv_users(@users);
&unlock_file($miniserv{'userfile'});
&put_usermin_miniserv_config(\%miniserv);
&unlock_file($usermin_miniserv_config);
&lock_file($usermin_config);
&get_usermin_config(\%uconfig);
#$uconfig{'locking'} = $in{'locking'};
$uconfig{'noremember'} = !$in{'remember'};
$uconfig{'realname'} = $in{'realname'};
$uconfig{'forgot_pass'} = $in{'forgot'};
if ($in{'passwd_file'}) {
$uconfig{'passwd_file'} = $in{'passwd_file'};
$uconfig{'passwd_uindex'} = $in{'passwd_uindex'};
$uconfig{'passwd_pindex'} = $in{'passwd_pindex'};
}
else {
delete($uconfig{'passwd_file'});
delete($uconfig{'passwd_uindex'});
delete($uconfig{'passwd_pindex'});
}
if ($in{'banner_def'}) {
delete($uconfig{'loginbanner'});
}
else {
-r $in{'banner'} || &error($text{'session_ebanner'});
$uconfig{'loginbanner'} = $in{'banner'};
}
$uconfig{'create_homedir'} = $in{'create_homedir'};
if ($in{'create_homedir_perms_def'}) {
delete($uconfig{'create_homedir_perms'});
}
else {
$in{'create_homedir_perms'} =~ /^[0-7]{3,4}$/ ||
&error($text{'session_ehomedir_perms'});
$uconfig{'create_homedir_perms'} = $in{'create_homedir_perms'};
}
&put_usermin_config(\%uconfig);
&unlock_file($usermin_config);
&restart_usermin_miniserv();
&webmin_log("session", undef, undef, \%in);
&redirect("");
+75
View File
@@ -0,0 +1,75 @@
#!/usr/local/bin/perl
# change_ssl.cgi
# Enable or disable SSL support
require './usermin-lib.pl';
&ReadParse();
&error_setup($text{'ssl_err'});
&lock_file($usermin_miniserv_config);
&get_usermin_miniserv_config(\%miniserv);
$sslcurr = $miniserv{'ssl'};
$miniserv{'ssl'} = $in{'ssl'};
$miniserv{'ssl_enforce'} = int($in{'ssl_enforce'});
$miniserv{'ssl_hsts'} = $miniserv{'ssl_enforce'} == 2 ? 1 : 0;
&webmin::validate_key_cert($in{'key'}, $in{'cert_def'} ? undef : $in{'cert'});
$miniserv{'keyfile'} = $in{'key'};
$miniserv{'certfile'} = $in{'cert_def'} ? undef : $in{'cert'};
$miniserv{'no_sslcompression'} = !$in{'ssl_compression'};
$miniserv{'ssl_honorcipherorder'} = $in{'ssl_honorcipherorder'};
if ($in{'version_def'}) {
delete($miniserv{'ssl_version'});
}
else {
$in{'version'} =~ /^\d+$/ || &error($text{'ssl_eversion'});
$miniserv{'ssl_version'} = $in{'version'};
}
$miniserv{'no_ssl2'} = $in{'no_ssl2'};
$miniserv{'no_ssl3'} = $in{'no_ssl3'};
$miniserv{'no_tls1'} = $in{'no_tls1'};
$miniserv{'no_tls1_1'} = $in{'no_tls1_1'};
$miniserv{'no_tls1_2'} = $in{'no_tls1_2'};
if ($in{'cipher_list_def'} == 1) {
delete($miniserv{'ssl_cipher_list'});
}
elsif ($in{'cipher_list_def'} == 2) {
$miniserv{'ssl_cipher_list'} = $webmin::strong_ssl_ciphers;
}
elsif ($in{'cipher_list_def'} == 3) {
# Check for PFS support
eval "use Net::SSLeay";
$Net::SSLeay::VERSION >= 1.57 ||
&error(&text('ssl_epfsversion', $Net::SSLeay::VERSION, 1.57));
$miniserv{'ssl_cipher_list'} = $webmin::pfs_ssl_ciphers;
$miniserv{'dhparams_file'} ||= "$config{'usermin_dir'}/dhparams.pem";
if (!-r $miniserv{'dhparams_file'}) {
# Generate file needed for PFS
my $out = &backquote_command(
"openssl dhparam -out ".
quotemeta($miniserv{'dhparams_file'})." 4096 2>&1");
if ($?) {
&error(&text('ssl_edhparams',
"<pre>".&html_escape($out)."</pre>"));
}
&set_ownership_permissions(
undef, undef, 700, $miniserv{'dhparams_file'});
}
}
else {
$in{'cipher_list'} =~ /^\S+$/ || &error($text{'ssl_ecipher_list'});
$miniserv{'ssl_cipher_list'} = $in{'cipher_list'};
}
foreach $ec (split(/[\r\n]+/, $in{'extracas'})) {
-r $ec && !-d $ec || &error(&text('ssl_eextraca', $ec));
push(@extracas, $ec);
}
$miniserv{'extracas'} = join("\t", @extracas);
&put_usermin_miniserv_config(\%miniserv);
&unlock_file($usermin_miniserv_config);
$SIG{'TERM'} = 'IGNORE'; # stop process from being killed by restart
&restart_usermin_miniserv();
&webmin_log("ssl", undef, undef, \%in);
&redirect("");
+29
View File
@@ -0,0 +1,29 @@
#!/usr/local/bin/perl
# change_theme.cgi
# Change the current webmin theme
require './usermin-lib.pl';
$access{'themes'} || &error($text{'acl_ecannot'});
&ReadParse();
&lock_file($usermin_config);
&get_usermin_config(\%uconfig);
$uconfig{'theme'} = $in{'theme'};
&put_usermin_config(\%uconfig);
&unlock_file($usermin_config);
&lock_file($usermin_miniserv_config);
&get_usermin_miniserv_config(\%miniserv);
if ($in{'theme'}) {
$miniserv{'preroot'} = $in{'theme'};
}
else {
delete($miniserv{'preroot'});
}
&put_usermin_miniserv_config(\%miniserv);
&unlock_file($usermin_miniserv_config);
&restart_usermin_miniserv();
&webmin_log('theme', undef, undef, \%in);
&redirect("");
+33
View File
@@ -0,0 +1,33 @@
#!/usr/local/bin/perl
# Enable two-factor authentication
require './usermin-lib.pl';
&ReadParse();
&error_setup($text{'twofactor_err'});
&get_usermin_miniserv_config(\%miniserv);
&foreign_require("cron");
# Validate inputs
if ($in{'twofactor_provider'}) {
($prov) = grep { $_->[0] eq $in{'twofactor_provider'} }
&webmin::list_twofactor_providers();
$prov || &error($text{'twofactor_eprovider'});
$vfunc = "webmin::validate_twofactor_apikey_".$in{'twofactor_provider'};
$err = defined(&$vfunc) && &$vfunc(\%in, \%miniserv);
&error($err) if ($err);
}
# Save settings
&lock_file($usermin_miniserv_config);
$miniserv{'twofactor_provider'} = $in{'twofactor_provider'};
$miniserv{'twofactorfile'} ||= "$config{'usermin_dir'}/twofactor-users";
$miniserv{'twofactor_wrapper'} =
"$config{'usermin_dir'}/twofactor/twofactor.pl";
&create_cron_wrapper($miniserv{'twofactor_wrapper'},
"twofactor", "twofactor.pl");
&put_usermin_miniserv_config(\%miniserv);
&unlock_file($usermin_miniserv_config);
&restart_usermin_miniserv();
&webmin_log("twofactor", undef, undef, \%in);
&redirect("");
+42
View File
@@ -0,0 +1,42 @@
#!/usr/local/bin/perl
# change_ui.cgi
# Change colour scheme
require './usermin-lib.pl';
$access{'ui'} || &error($text{'acl_ecannot'});
&error_setup($text{'ui_err'});
&ReadParse();
$in{'feedback_def'} || $in{'feedback'} =~ /\S/ || &error($text{'ui_efeedback'});
$in{'feedbackmail_def'} || &to_ipaddress($in{'feedbackmail'}) ||
&to_ip6address($in{'feedbackmail'}) || &error($text{'ui_efeedbackmail'});
$in{'feedbackhost_def'} || $in{'feedbackhost'} =~ /^\S+$/ ||
&error($text{'ui_efeedbackhost'});
&lock_file($usermin_config);
&get_usermin_config(\%uconfig);
for($i=0; $i<@webmin::cs_names; $i++) {
$cd = $webmin::cs_codes[$i];
if ($in{"${cd}_def"}) { delete($uconfig{$cd}); }
elsif ($in{"${cd}"} !~ /^[0-9a-fA-F]{6}$/) {
&error(&text('ui_ergb', $webmin::cs_names[$i] . $in{"${cd}_rgb"}));
}
else { $uconfig{$cd} = $in{"${cd}"}; }
}
$uconfig{'texttitles'} = $in{'texttitles'};
$uconfig{'sysinfo'} = $in{'sysinfo'};
$uconfig{'feedback'} = $in{'feedback_def'} ? undef : $in{'feedback'};
$uconfig{'feedbackmail'} = $in{'feedbackmail_def'} ? undef :$in{'feedbackmail'};
$uconfig{'feedbackhost'} = $in{'feedbackhost_def'} ? undef :$in{'feedbackhost'};
$uconfig{'gotoone'} = $in{'gotoone'};
$uconfig{'gotomodule'} = $in{'gotomodule'};
$uconfig{'nohostname'} = $in{'nohostname'};
$uconfig{'showlogin'} = $in{'showlogin'};
$uconfig{'hostnamemode'} = $in{'hostnamemode'};
$uconfig{'hostnamedisplay'} = $in{'hostnamedisplay'};
$uconfig{'notabs'} = $in{'notabs'};
$uconfig{'ui_show'} = join(" ", split(/\0/, $in{'ui_show'}));
&write_file($usermin_config, \%uconfig);
&unlock_file($usermin_config);
&webmin_log('ui', undef, undef, \%in);
&redirect("");
+48
View File
@@ -0,0 +1,48 @@
#!/usr/local/bin/perl
# change_users.cgi
# Update user allow and deny parameters
require './usermin-lib.pl';
$access{'users'} || &error($text{'acl_ecannot'});
use Socket;
&ReadParse();
&error_setup($text{'users_err'});
@users = split(/\s+/, $in{"user"});
if ($in{"access"}) {
foreach $u (@users) {
if ($u =~ /^\@(\S+)$/) {
defined(getgrnam($1)) ||
&error(&text('users_egroup', "$1"));
}
elsif ($u =~ /^(\d*)-(\d*)$/ && ($1 || $2)) {
# Assume UIDs are ok
}
else {
defined(getpwnam($u)) ||
&error(&text('users_euser', $u));
}
}
}
if ($in{'shells_deny'}) {
-r $in{'shells'} || &error($text{'users_eshell'});
}
&lock_file($usermin_miniserv_config);
&get_usermin_miniserv_config(\%miniserv);
delete($miniserv{"allowusers"});
delete($miniserv{"denyusers"});
if ($in{"access"} == 1) { $miniserv{"allowusers"} = join(' ', @users); }
elsif ($in{"access"} == 2) { $miniserv{"denyusers"} = join(' ', @users); }
if ($in{'shells_deny'}) {
$miniserv{'shells_deny'} = $in{'shells'};
}
else {
delete($miniserv{'shells_deny'});
}
&put_usermin_miniserv_config(\%miniserv);
&unlock_file($usermin_miniserv_config);
&restart_usermin_miniserv();
&webmin_log("users", undef, undef, \%in);
&redirect("");
+104
View File
@@ -0,0 +1,104 @@
#!/usr/local/bin/perl
# Save webserver options
require './usermin-lib.pl';
&ReadParse();
&error_setup($text{'web_err'});
&get_usermin_miniserv_config(\%miniserv);
&get_usermin_config(\%uconfig);
# Save expires
if ($in{'expires_def'}) {
delete($miniserv{'expires'});
}
else {
$in{'expires'} =~ /^\d+$/ ||
&error($text{'web_eexpires'});
$miniserv{'expires'} = $in{'expires'};
}
# Save per-path expires
for(my $i=0; defined($p = $in{"expirespath_$i"}); $i++) {
$t = $in{"expirestime_$i"};
next if ($p !~ /\S/);
$t =~ /^\d+$/ || &error(&text('web_eexpires2', $i+1));
push(@expires_paths, [ $p, $t ]);
}
$miniserv{'expires_paths'} = join("\t", map { $_->[0]."=".$_->[1] }
@expires_paths);
# Save redirects
delete($miniserv{'redirect_host'});
delete($miniserv{'redirect_port'});
delete($miniserv{'redirect_prefix'});
delete($miniserv{'redirect_ssl'});
my $redir_host = $in{'redirect_host'};
$redir_host =~ /^[A-z0-9\-\.\:]+$/ ||
$redir_host =~ /^\s*$/ ||
&error(&text('web_eredirhost', &html_escape($redir_host)));
$miniserv{'redirect_host'} = $redir_host
if ($redir_host);
my $redir_port = &trim($in{'redirect_port'});
($redir_port =~ /^\d+$/ && $redir_port < 65536) ||
$redir_port =~ /^\s*$/ ||
&error(&text('bind_eport2', &html_escape($redir_port)));
$miniserv{'redirect_port'} = $redir_port
if ($redir_port);
my $redir_pref = &trim($in{'redirect_prefix'});
$redir_pref =~ /^\// || $redir_pref =~ /^\s*$/ ||
&error($text{'web_eredirpref'});
$redir_pref !~ /\s/ || &error($text{'web_eredirpref2'});
$miniserv{'redirect_prefix'} = $redir_pref
if ($redir_pref);
my $redir_ssl = $in{'redirect_ssl'};
$miniserv{'redirect_ssl'} = 1 if ($redir_ssl == 1);
# Save switch redirect to Usermin URL
if ($in{'redirect_url_def'}) {
delete($miniserv{'redirect_url'});
}
else {
my $rediruurl = &trim($in{'redirect_url'});
$rediruurl !~ /\s/ ||
&error(&text('web_eredirurl',
&html_escape($rediruurl)));
$miniserv{'redirect_url'} = $rediruurl;
}
# Save stack trace option
$uconfig{'error_stack'} = $in{'stack'};
# Save showing of stderr
$miniserv{'noshowstderr'} = !$in{'showstderr'};
if (!$miniserv{'session'}) {
# Save password pass option
$miniserv{'pass_password'} = $in{'pass'};
}
# Save gzip option
if ($in{'gzip'} == 1) {
eval "use Compress::Zlib";
$@ && &error(&text('advanced_egzip', '<tt>Compress::Zlib</tt>'));
}
$miniserv{'gzip'} = $in{'gzip'};
# Save redirect type
$uconfig{'relative_redir'} = $in{'redir'};
# Save directory list option
$miniserv{'nolistdir'} = !$in{'listdir'};
# Save global config
&lock_file($usermin_config);
&write_file($usermin_config, \%uconfig);
&unlock_file($usermin_config);
# Save miniserv config
&lock_file($usermin_miniserv_config);
&put_usermin_miniserv_config(\%miniserv);
&unlock_file($usermin_miniserv_config);
&restart_usermin_miniserv();
&webmin_log("web");
&redirect("");
+8
View File
@@ -0,0 +1,8 @@
#!/usr/local/bin/perl
# Re-start Usermin to clear blocks
require './usermin-lib.pl';
&restart_usermin_miniserv();
&redirect("");
+55
View File
@@ -0,0 +1,55 @@
#!/usr/local/bin/perl
# clone_mod.cgi
# Clone an existing usermin module under a new name
require './usermin-lib.pl';
&ReadParse();
&error_setup($text{'clone_err'});
$access{'umods'} || &error($text{'acl_ecannot'});
# Filter out potentially dangerous strings
$in{'desc'} = &filter_javascript($in{'desc'});
# Symlink the code directory
&get_usermin_miniserv_config(\%miniserv);
$src = $in{'mod'};
%minfo = &get_usermin_module_info($src);
$count = 2;
do {
$dst = $src.$count;
$count++;
} while(-d "$miniserv{'root'}/$dst");
&symlink_logged($src, "$miniserv{'root'}/$dst") ||
&error(&text('clone_elink', $!));
# Copy the config directory
mkdir("$config{'usermin_dir'}/$dst", 0755);
$qsrc = quotemeta($src);
$qdst = quotemeta($dst);
$out = &backquote_logged("( (cd $config{'usermin_dir'}/$qsrc ; tar cf - .) | (cd $config{'usermin_dir'}/$qdst ; tar xpf -) ) 2>&1");
if ($?) {
&error(&text('clone_ecopy', $out));
}
$in{'desc'} = &text('clone_desc', $minfo{'desc'}) if (!$in{'desc'});
&open_tempfile(CLONE, ">$config{'usermin_dir'}/$dst/clone");
&print_tempfile(CLONE, "desc=$in{'desc'}\n");
&close_tempfile(CLONE);
# Grant access to the clone to this user
&read_usermin_acl(undef, \%acl);
@mods = &unique(@{$acl{"user"}}, $dst);
&save_usermin_acl("user", \@mods);
if ($in{'cat'} ne '*') {
# Assign to category
&lock_file("$config{'usermin_dir'}/webmin.cats");
&read_file("$config{'usermin_dir'}/webmin.cats", \%cats);
$cats{$dst} = $in{'cat'};
&write_file("$config{'usermin_dir'}/webmin.cats", \%cats);
&unlock_file("$config{'usermin_dir'}/webmin.cats");
}
&webmin_log("clone", undef, $in{'mod'}, { 'desc' => $minfo{'desc'},
'dst' => $dst,
'dstdesc' => $in{'desc'} });
&redirect("");
+7
View File
@@ -0,0 +1,7 @@
usermin_dir=/etc/usermin
update=0
upmissing=0
upshow=1
updays=1
uphour=4
cron_mode=0
+4
View File
@@ -0,0 +1,4 @@
usermin_dir=Usermin configuration directory,0
cron_mode=Show update times as,1,0-Simple interface,1-Cron time selector
host=Usermin hostname for switching users,3,Same as Webmin
port=Usermin port for switching users,3,Determine automatically
+4
View File
@@ -0,0 +1,4 @@
usermin_dir=تكوين دليل Usermin,0
cron_mode=عرض أوقات التحديث كـ,1,0-واجهة بسيطة,1-اختيار وقت Cron
host=اسم مضيف Usermin للتبديل بين المستخدمين,3,نفس Webmin
port=منفذ Usermin لتبديل المستخدمين,3,تحديد تلقائيا
+4
View File
@@ -0,0 +1,4 @@
usermin_dir=Directori de configuració d'Usermin,0
cron_mode=Mostra els temps d'actualització com,1,0-Interfície simple,1-Selector de temps cron
host=Nom de host Usermin per al canvi d'usuari,3,El mateix que Webmin
port=Port Usermin per al canvi d'usuari,3,Determina'l automàticament
+4
View File
@@ -0,0 +1,4 @@
usermin_dir=Adresář Usermin konfigurace,0
cron_mode=Zobrazit čas aktualizace jako,1,0-Jednoduché rozhraní,1-Výběr času jako v cronu
host=Jméno hosta Userminu pro připojené uživatele,3,Stejné jako u Webminu
port=Port Userminu pro připojené uživatele,3,Zjistit automaticky
+4
View File
@@ -0,0 +1,4 @@
usermin_dir=Usermin Konfigurations&#45;Verzeichnis,0
cron_mode=Zeige Aktualisierungszeiten an als,1,0-Einfache Anzeige,1-Cron&#45;Zeit&#45;Auswahl
host=Usermin Hostname für Benutzerwechsel,3,Gleicher wie Webmin
port=Usermin Port für Benutzerwechsel,3,Automatisch ermitteln
+4
View File
@@ -0,0 +1,4 @@
usermin_dir=Directorio de configuración de Usermin,0
cron_mode=Mostrar horas de actualización como,1,0-Interfaz simple,1-Selector horario de Cron
host=Nombre de host de Usermin para cambiar usuarios,1,El mismo que Webmin
port=Puerto de Usermin para cambiar usuarios,1,Determinar automáticamente
+2
View File
@@ -0,0 +1,2 @@
usermin_dir=فهرست راهنماي پيکربندي يوزرمين,0
cron_mode=نمايش دادن زمانهاي به‌روزرساني به‌صورت,1,0-واسط ساده,1-انتخاب کننده زمان cron
+4
View File
@@ -0,0 +1,4 @@
usermin_dir=Usermin asetushakemisto,0
cron_mode=Näytä päivitysajat,1,0-Helpotettu käyttöliittymä,1-Cron aika valitsin
host=Usermin koneen nimi käyttäjien vaihtoa varten,3,Sama kuin Webmin
port=Usermin portti käyttäjien vaihtoa varten,3,Määritä automaattisesti
+4
View File
@@ -0,0 +1,4 @@
usermin_dir=Répertoire de configuration Usermin,0
cron_mode=Afficher les heures de mise à jour comme,1,0-Interface simple,1-Sélecteur de temps Cron
host=Nom d'hôte Usermin pour changer d'utilisateur,3,Identique à Webmin
port=Port Usermin pour changer d'utilisateur,3,Déterminer automatiquement
View File
+4
View File
@@ -0,0 +1,4 @@
usermin_dir=Directory di configurazione di Usermin,0
cron_mode=Mostra i tempi di aggiornamenti come:,1,0-Semplice interfaccia,1-Selettore tempo di Cron
host=Nome host di Usermin per il cambio degli utenti,3,Lo stesso di Webmin
port=Porta di Usermin per il cambio degli utenti,3,Determina automaticamente
+4
View File
@@ -0,0 +1,4 @@
usermin_dir=Usermin 設定ディレクトリ,0
cron_mode=更新時間表示,1,0-簡易インターフェイス,1-Cron 時間セレクタ
host=ユーザ切り替え時の Usermin ホスト名,3,Webminと同じ
port=ユーザ切り替え時の Usermin ポート,3,自動判別
+4
View File
@@ -0,0 +1,4 @@
usermin_dir=Direktori konfigurasi Usermin,0
cron_mode=Paparkan masa kemaskini sebagai,1,0-Antaramuka mudah,1-Masa terpilih Cron
host=Nama hos Usermin untuk menukar pengguna,3,Sama seperti Webmin
port=Port Usermin untuk menukar pengguna,3,Tentukan secara automatik
+4
View File
@@ -0,0 +1,4 @@
usermin_dir=Usermin configuratie directory,0
cron_mode=Laat update tijden zien als,1,0-Simpele interface,1-Cron tijden kiezer
host=Usermin hostnaam voor omschakelen gebruikers,3,Zelfde als Webmin
port=Usermin poort voor omschakelen gebruikers,3,Automatisch bepalen
+4
View File
@@ -0,0 +1,4 @@
usermin_dir=Usermin konfigurasjonskatalog,0
cron_mode=Vis oppdateringstider som,1,0-Enkelt grensesnitt,1-Cron tids-velger
host=Usermin vertsnavn for å bytte brukere,3,Samme som Webmin
port=Usermin port for å bytte brukere,3,Bestem automatisk
+4
View File
@@ -0,0 +1,4 @@
usermin_dir=Katalog konfiguracyjny Usermina,0
cron_mode=Pokaż czas aktualizacji jako,1,0-Prosty interfejs,1-Cron time selector
host=Nazwa hosta Usermina do przełączania użytkowników,3,Taki sam jak w Webmin
port=Port Usermina do przełączania użytkowników,3,Określony automatycznie
+1
View File
@@ -0,0 +1 @@
usermin_dir=Diretório de configuração do Usermin,0
+1
View File
@@ -0,0 +1 @@
usermin_dir=Каталог конфигурации Usermin,0
+1
View File
@@ -0,0 +1 @@
usermin_dir=Каталог конфігурації Usermin,0
+1
View File
@@ -0,0 +1 @@
usermin_dir=Usermin組態目錄,0
+53
View File
@@ -0,0 +1,53 @@
#!/usr/local/bin/perl
# Copy Webmin's SSL settings
require './usermin-lib.pl';
&ReadParse();
&error_setup($text{'copycert_err'});
&get_miniserv_config(\%wminiserv);
$wminiserv{'ssl'} || &error($text{'copycert_essl'});
$wminiserv{'keyfile'} || &error($text{'copycert_ekeyfile'});
&lock_file($usermin_miniserv_config);
&get_usermin_miniserv_config(\%miniserv);
# Copy across the key file
$miniserv{'keyfile'} ||= $config{'usermin_dir'}."/miniserv.pem";
if ($miniserv{'keyfile'} ne $wminiserv{'keyfile'}) {
&lock_file($miniserv{'keyfile'});
&copy_source_dest($wminiserv{'keyfile'},
$miniserv{'keyfile'});
&unlock_file($miniserv{'keyfile'});
}
if ($wminiserv{'certfile'}) {
$miniserv{'certfile'} ||= $config{'usermin_dir'}."/miniserv.cert";
if ($miniserv{'certfile'} ne $wminiserv{'certfile'}) {
&lock_file($miniserv{'certfile'});
&copy_source_dest($wminiserv{'certfile'},
$miniserv{'certfile'});
&unlock_file($miniserv{'certfile'});
}
}
else {
delete($miniserv{'certfile'});
}
# Copy other settings
$miniserv{'ssl'} = $wminiserv{'ssl'};
$miniserv{'ssl_version'} = $wminiserv{'ssl_version'};
$miniserv{'ssl_cipher_list'} = $wminiserv{'ssl_cipher_list'};
$miniserv{'extracas'} = $wminiserv{'extracas'};
# Copy per-IP certs
@ipkeys = &webmin::get_ipkeys(\%wminiserv);
&webmin::save_ipkeys(\%miniserv, \@ipkeys);
&put_usermin_miniserv_config(\%miniserv);
&unlock_file($usermin_miniserv_config);
$SIG{'TERM'} = 'IGNORE'; # stop process from being killed by restart
&restart_usermin_miniserv();
&webmin_log("copycert");
&redirect("");
+31
View File
@@ -0,0 +1,31 @@
access=1
bind=1
ui=1
umods=1
os=1
lang=1
upgrade=1
session=1
assignment=1
categories=1
themes=1
ssl=1
configs=1
acl=1
restrict=1
users=1
defacl=1
mods=*
stop=1
bootup=1
sessions=1
referers=1
anon=1
logout=1
dav=1
descs=1
blocked=1
advanced=1
mobile=1
twofactor=1
web=1
+78
View File
@@ -0,0 +1,78 @@
#!/usr/local/bin/perl
# delete_mod.cgi
# Delete selected modules from usermin
require './usermin-lib.pl';
$access{'umods'} || &error($text{'acl_ecannot'});
&ReadParse();
&error_setup($text{'delete_err'});
@mods = split(/\0/, $in{'mod'});
@mods || &error($text{'delete_enone'});
local %miniserv;
&get_usermin_miniserv_config(\%miniserv);
# Check if any other module depends on those to be deleted
# %depends maps module dirs to the descriptions of those that depend on them
foreach $minfo (&list_modules()) {
if (&check_usermin_os_support($minfo)) {
foreach $d (split(/\s+/, $minfo->{'depends'})) {
if (&indexof($minfo->{'dir'}, @mods) < 0) {
$depends{$d} = $minfo->{'desc'};
}
}
}
}
foreach $m (@mods) {
%minfo = &get_usermin_module_info($m);
%minfo = &get_usermin_theme_info($m) if (!%minfo);
if (!-l "$miniserv{'root'}/$m" && $depends{$m}) {
&error(&text('delete_edep',
"<tt>".&html_escape($minfo{'desc'})."</tt>",
"<tt>".&html_escape($depends{$m})."</tt>"));
}
}
# ask the user if he is sure
if (!$in{'confirm'}) {
&ui_print_header(undef, $text{'delete_title'}, "");
print "<p><form action=delete_mod.cgi>\n";
foreach $m (@mods) {
local %minfo = &get_usermin_module_info($m);
if (!%minfo) {
$theme++;
%minfo = &get_usermin_theme_info($m);
}
print "<input type=hidden name=mod value=$m>\n";
$total += &disk_usage_kb("$miniserv{'root'}/$m")
if (!-l "$miniserv{'root'}/$m");
$descs .= " , " if ($descs);
$descs .= "<b>".&html_escape($minfo{'desc'})."</b>";
}
print "<center>",&text($theme ? 'delete_rusure2' : 'delete_rusure',
int($total), $descs),"<p>",
"<input type=submit name=confirm value='$text{'delete'}'>",
"</form></center>\n";
&ui_print_footer("", $text{'index_return'});
exit;
}
# delete the selected modules or themes
foreach $m (split(/\0/, $in{'mod'})) {
next if (!$m || !-d "$miniserv{'root'}/$m");
local $mdesc = &delete_usermin_module($m);
if ($mdesc) {
push(@mdesc, $mdesc);
}
}
&flush_modules_cache();
&ui_print_header(undef, $text{'delete_title'}, "");
print $text{'delete_msg'},"<p>\n";
print "<ul>\n";
for($i=0; $i<@mdesc; $i++) {
print $mdesc[$i],"<p>\n";
}
print "</ul><p>\n";
&ui_print_footer("", $text{'index_return'});
+13
View File
@@ -0,0 +1,13 @@
#!/usr/local/bin/perl
# delete_session.cgi
# Delete a single session
require './usermin-lib.pl';
&ReadParse();
$access{'sessions'} || &error($text{'sessions_ecannot'});
&get_usermin_miniserv_config(\%miniserv);
&acl::delete_session_id(\%miniserv, $in{'id'});
&restart_usermin_miniserv();
&redirect("list_sessions.cgi");
+27
View File
@@ -0,0 +1,27 @@
#!/usr/local/bin/perl
# Output the certificate in PEM or PKCS12 format
require './usermin-lib.pl';
&ReadParse();
&get_usermin_miniserv_config(\%miniserv);
if ($ENV{'PATH_INFO'} =~ /\.p12$/) {
# PKCS12 format
$data = &webmin::cert_pkcs12_data($miniserv{'keyfile'},
$miniserv{'certfile'});
$type = "application/x-pkcs12";
}
else {
# PEM format
$data = &webmin::cert_pem_data($miniserv{'certfile'} ||
$miniserv{'keyfile'});
$type = "text/plain";
}
if ($data) {
print "Content-type: $type\n\n";
print $data;
}
else {
&error($text{'ssl_edownload'});
}
+40
View File
@@ -0,0 +1,40 @@
#!/usr/local/bin/perl
# edit_access.cgi
# Display IP access control form
require './usermin-lib.pl';
$access{'access'} || &error($text{'acl_ecannot'});
&ui_print_header(undef, $text{'access_title'}, "");
&get_usermin_miniserv_config(\%miniserv);
print $text{'access_desc'},"<p>\n";
print &ui_form_start("change_access.cgi", "post");
print &ui_table_start($text{'access_header'}, undef, 2, [ "width=30%" ]);
$access = $miniserv{"allow"} ? 1 : $miniserv{"deny"} ? 2 : 0;
print &ui_table_row($text{'access_ip'},
&ui_radio("access", $access,
[ [ 0, $text{'access_all'} ],
[ 1, $text{'access_allow'} ],
[ 2, $text{'access_deny'} ] ])."<br>\n".
&ui_textarea("ip",
$access == 1 ? join("\n", split(/\s+/, $miniserv{"allow"})) :
$access == 2 ? join("\n", split(/\s+/, $miniserv{"deny"})) :
$miniserv{"known_ips"} ? join("\n", split(/\s+/, $miniserv{"known_ips"})) :
"", 6, 30));
print &ui_table_row($text{'access_always'},
&ui_yesno_radio("alwaysresolve", int($miniserv{'alwaysresolve'})));
eval "use Authen::Libwrap qw(hosts_ctl STRING_UNKNOWN)";
if (!$@) {
print &ui_table_row($text{'access_libwrap'},
&ui_yesno_radio("libwrap", int($miniserv{'libwrap'})));
}
print &ui_table_end();
print &ui_form_end([ [ "save", $text{'save'} ] ]);
&ui_print_footer("", $text{'index_return'});
+22
View File
@@ -0,0 +1,22 @@
#!/usr/local/bin/perl
# edit_acl.cgi
# Choose visible usermin modules
require './usermin-lib.pl';
$access{'acl'} || &error($text{'acl_ecannot'});
&ui_print_header(undef, $text{'acl_title'}, "");
&read_usermin_acl(\%acl);
print "$text{'acl_desc'}<p>\n";
print &ui_form_start("save_acl.cgi");
@mods = &list_modules();
@grid = ( );
foreach $m (@mods) {
push(@grid, &ui_checkbox("mod", $m->{'dir'}, &html_escape($m->{'desc'}),
$acl{'user',$m->{'dir'}}));
}
print &ui_grid_table(\@grid, 3, 100, [ "width=33%", "width=33%", "width=33%" ]);
print &ui_form_end([ [ undef, $text{'save'} ] ]);
&ui_print_footer("", $text{'index_return'});
+65
View File
@@ -0,0 +1,65 @@
#!/usr/local/bin/perl
# Display the advanced options form
require './usermin-lib.pl';
&ui_print_header(undef, $text{'advanced_title'}, "");
&get_usermin_miniserv_config(\%miniserv);
&get_usermin_config(\%uconfig);
print &ui_form_start("change_advanced.cgi", "post");
print &ui_table_start($text{'advanced_header'}, undef, 2);
# Global temp directory
print &ui_table_row($text{'advanced_temp'},
&ui_opt_textbox("tempdir", $uconfig{'tempdir'},
30, $text{'advanced_tempdef'}));
# Per-module temp directories
@mods = sort { $a->{'desc'} cmp $b->{'desc'} } &list_modules();
$ttable = &ui_columns_start([ $text{'advanced_tmod'},
$text{'advanced_tdir'} ]);
$i = 0;
foreach $d (&webmin::get_tempdirs(\%uconfig), [ ]) {
$ttable .= &ui_columns_row([
&ui_select("tmod_$i", $d->[0],
[ [ "", "&nbsp;" ],
map { [ $_->{'dir'}, $_->{'desc'} ] } @mods ]),
&ui_textbox("tdir_$i", $d->[1], 30)
]);
$i++;
}
$ttable .= &ui_columns_end();
print &ui_table_row($text{'advanced_tempmods'}, $ttable);
# Pass passwords to CGI programs
print &ui_table_row($text{'advanced_pass_desc'},
&ui_yesno_radio("pass", int($miniserv{'pass_password'})).
&ui_help($text{'advanced_pass_help'}));
@preloads = &webmin::get_preloads(\%miniserv);
if (!@preloads && (!$miniserv{'premodules'} ||
$miniserv{'premodules'} eq 'WebminCore')) {
# New-style preload possible or enabled
print &ui_table_row($text{'advanced_preload'},
&ui_yesno_radio("preload",
$miniserv{'premodules'} eq 'WebminCore'));
}
elsif ($preloads[0]->[0] eq "main" && $preloads[0]->[1] eq "web-lib-funcs.pl") {
# Old-style preloads enabled
print &ui_table_row($text{'advanced_preload'},
&ui_yesno_radio("preload", 1));
}
# Umask for created files
print &ui_table_row($text{'advanced_umask'},
&ui_opt_textbox("umask", $uconfig{'umask'}, 5, $text{'default'}));
# Sort config file's keys alphabetically
print &ui_table_row($text{'advanced_sortconfigs'},
&ui_yesno_radio("sortconfigs", $uconfig{'sortconfigs'}));
print &ui_table_end();
print &ui_form_end([ [ "save", $text{'save'} ] ]);
&ui_print_footer("", $text{'index_return'});
+34
View File
@@ -0,0 +1,34 @@
#!/usr/local/bin/perl
# edit_anon.cgi
# Display anonymous access form
require './usermin-lib.pl';
&ui_print_header(undef, $text{'anon_title'}, "");
&get_usermin_miniserv_config(\%miniserv);
print $text{'anon_desc'},"<p>\n";
foreach $a (split(/\s+/, $miniserv{'anonymous'})) {
if ($a =~ /^([^=]+)=(\S+)$/) {
push(@anon, [ $1, $2 ]);
}
}
print &ui_form_start("change_anon.cgi");
print &ui_columns_start([ $text{'anon_url'},
$text{'anon_user'} ]);
push(@anon, scalar(@anon)%2 == 0 ? ( [ ], [ ] ) : ( [ ] ));
my $i = 0;
foreach $a (@anon) {
print &ui_columns_row([
&ui_textbox("url_$i", $a->[0], 30),
&ui_textbox("user_$i", $a->[1], 20)]);
$i++;
}
print &ui_columns_end();
print &ui_form_end([ [ "save", $text{'save'} ] ]);
&ui_print_footer("", $text{'index_return'});
+42
View File
@@ -0,0 +1,42 @@
#!/usr/local/bin/perl
require './usermin-lib.pl';
$access{'assignment'} || &error($text{'acl_ecannot'});
@modules = &list_modules();
&read_file("$config{'usermin_dir'}/webmin.catnames", \%catnames);
&get_usermin_miniserv_config(\%miniserv);
&read_file("$miniserv{'root'}/lang/en", \%utext);
&read_file("$miniserv{'root'}/ulang/en", \%utext);
&ui_print_header(undef, $text{'assignment_title'}, undef);
print &ui_form_start("save_assignment.cgi", "post");
@grid = ( );
foreach (@modules){
push(@grid, &html_escape($_->{'desc'} || $_->{'dir'}));
push(@grid, &cats($_->{'dir'}, $_->{'category'}));
}
print &ui_grid_table(\@grid, 4, 100, [ "valign=middle","valign=middle","valign=middle","valign=middle" ], undef, $text{'assignment_header'});
print &ui_form_end([ [ undef, $text{'assignment_ok'} ] ]);
&ui_print_footer("", $text{'index_return'});
sub cats
{
my ($name, $value) = @_;
my $cats;
my %cats;
foreach (keys %utext) {
next unless /^category_/;
my $desc = $utext{$_};
s/^category_//;
$cats{$_} = $desc;
}
foreach (keys %catnames) {
$cats{$_} = $catnames{$_};
}
return &ui_select($name, $value,
[ map { [ $_, &html_escape($cats{$_}) ] }
sort { $cats{$a} cmp $cats{$b} } keys %cats ]);
}
+80
View File
@@ -0,0 +1,80 @@
#!/usr/local/bin/perl
# edit_bind.cgi
# Display port / address form
require './usermin-lib.pl';
$access{'bind'} || &error($text{'acl_ecannot'});
&ui_print_header(undef, $text{'bind_title'}, "");
&get_usermin_miniserv_config(\%miniserv);
print $text{'bind_desc2'},"<p>\n";
print &ui_form_start("change_bind.cgi", "post");
print &ui_table_start($text{'bind_header'}, undef, 2, [ "width=30%" ]);
# Build list of sockets
my @sockets = &webmin::get_miniserv_sockets(\%miniserv);
# Show table of all bound IPs and ports
my $stable = &ui_columns_start([ $text{'bind_sip'}, $text{'bind_sport'} ]);
my $i = 0;
my @ports;
foreach $s (@sockets, [ undef, "*" ]) {
# IP address
my @cols;
push(@cols, &ui_select("ip_def_$i",
$s->[0] eq "" ? 0 :
$s->[0] eq "*" ? 1 : 2,
[ [ 0, "&nbsp;" ],
[ 1, $text{'bind_sip1'} ],
[ 2, $text{'bind_sip2'} ] ])." ".
&ui_textbox("ip_$i",
$s->[0] eq "*" ? undef : $s->[0], 20));
# Port
push(@cols, &ui_select("port_def_$i", $s->[1] eq "*" ? 0 : 1,
[ $i ? ( [ 0, $text{'bind_sport0'} ] ) : ( ),
[ 1, $text{'bind_sport1'} ] ])." ".
&ui_textbox("port_$i", $s->[1] eq "*" ? undef : $s->[1],5));
$stable .= &ui_columns_row(\@cols, [ "nowrap", "nowrap" ]);
push(@ports, $s->[1]) if ($s->[1] && $s->[1] ne "*");
$i++;
}
$stable .= &ui_columns_end();
if (&foreign_check("firewall") || &foreign_check("firewalld")) {
$stable .= &ui_checkbox("firewall", 1, $text{'bind_firewall'}, 1);
}
print &ui_table_row($text{'bind_sockets'}, $stable);
# WebSocket based port
print &ui_table_row($text{'bind_websocport'},
&ui_radio("websocket_base_port_def",
$miniserv{"websocket_base_port"} ? 0 : 1,
[ [ 1, $text{'bind_websocport_none'} ],
[ 0, &ui_textbox("websocket_base_port",
$miniserv{"websocket_base_port"}, 6) ] ]));
# Hostname for WebSocket connections
print &ui_table_row($text{'bind_websoc_host'},
&ui_radio("websocket_host_def",
$miniserv{"websocket_host"} ? 0 : 1,
[ [ 1, $text{'bind_websoc_host_auto'} ],
[ 0, &ui_textbox("websocket_host",
$miniserv{"websocket_host"}, 25) ] ]));
# IPv6 enabled?
print &ui_table_row($text{'bind_ipv6'},
&ui_yesno_radio("ipv6", $miniserv{'ipv6'}));
# Show web server hostname
print &ui_table_row($text{'bind_hostname'},
&ui_radio("hostname_def", $miniserv{"host"} ? 0 : 1,
[ [ 1, $text{'bind_auto'} ],
[ 0, &ui_textbox("hostname", $miniserv{"host"}, 25) ] ]));
print &ui_table_end();
print &ui_hidden("oldports", join(" ", @ports));
print &ui_form_end([ [ "save", $text{'save'} ] ]);
&ui_print_footer("", $text{'index_return'});
+35
View File
@@ -0,0 +1,35 @@
#!/usr/local/bin/perl
# Show a list of blocked users and hosts
require './usermin-lib.pl';
&ui_print_header(undef, $text{'blocked_title'}, "");
&get_usermin_miniserv_config(\%miniserv);
@blocked = &webmin::get_blocked_users_hosts(\%miniserv);
if (@blocked) {
print &ui_columns_start([ $text{'blocked_type'},
$text{'blocked_who'},
$text{'blocked_fails'},
$text{'blocked_when'},
]);
foreach $b (@blocked) {
print &ui_columns_row([
$text{'blocked_'.$b->{'type'}},
$b->{'user'} || $b->{'host'},
$b->{'fails'},
&make_date($b->{'when'}),
]);
}
print &ui_columns_end();
print &ui_hr();
print &ui_buttons_start();
print &ui_buttons_row("clear_blocked.cgi",
$text{'blocked_clear'},
$text{'blocked_cleardesc'});
print &ui_buttons_end();
}
else {
print "<b>$text{'blocked_none'}</b><p>\n";
}
&ui_print_footer("", $text{'index_return'});
+62
View File
@@ -0,0 +1,62 @@
#!/usr/local/bin/perl
require './usermin-lib.pl';
$access{'categories'} || &error($text{'acl_ecannot'});
&get_usermin_miniserv_config(\%miniserv);
&read_file("$miniserv{'root'}/lang/en", \%utext);
&read_file("$miniserv{'root'}/ulang/en", \%utext);
&ui_print_header(undef, $text{'categories_title'}, undef);
# Show language selector
print ui_form_start("edit_categories.cgi");
print "<b>$text{'categories_lang'}</b>\n";
print ui_select("lang", $in{'lang'},
[ [ "", "&lt;$text{'default'}&gt;" ],
map { [ $_->{'lang'}, &html_escape($_->{'desc'}) ] }
list_languages() ]),"\n";
print ui_submit($text{'categories_langok'}),"\n";
print ui_form_end();
print "$text{'categories_desc'}<p>\n";
print ui_form_start("save_categories.cgi");
print ui_hidden("lang", $in{'lang'});
print &ui_columns_start([ $text{'categories_code'},
$text{'categories_name'} ]);
# Show the existing categories
$file = "$config{'usermin_dir'}/webmin.catnames";
$file .= ".".$in{'lang'} if ($in{'lang'});
read_file($file, \%catnames);
foreach $t (keys %utext) {
$t =~ s/^category_// || next;
$field = $t || "other";
print &ui_columns_row([
$t || "<i>other</i>",
&ui_opt_textbox($field, $catnames{$t}, 30,
$text{'default'}, $text{'categories_custom'}),
], [ "valign=middle","valign=middle" ]);
$realcat{$t}++;
}
# Show new categories
$i = 0;
foreach $c (keys %catnames) {
if (!$realcat{$c}) {
print &ui_columns_row([
&ui_textbox("cat_$i", $c, 10),
&ui_textbox("desc_$i", $catnames{$c}, 30),
], [ "valign=middle","valign=middle" ]);
$i++;
}
}
print &ui_columns_row([
&ui_textbox("cat_$i", "", 10),
&ui_textbox("desc_$i", "", 30),
], [ "valign=middle","valign=middle" ]);
print &ui_columns_end();
print ui_form_end([ [ "ok", $text{'categories_ok'} ] ]);
ui_print_footer("", $text{'index_return'});
+79
View File
@@ -0,0 +1,79 @@
#!/usr/local/bin/perl
# edit_configs.cgi
# Display the configs for a usermin module
require './usermin-lib.pl';
require '../config-lib.pl';
$access{'configs'} || &error($text{'acl_ecannot'});
&ReadParse();
&can_use_module($in{'mod'}) || &error($text{'configs_ecannot'});
&ui_print_header(undef, $text{'configs_title2'}, "");
&get_usermin_miniserv_config(\%miniserv);
# Show start of tabs
$prog = "edit_configs.cgi?mod=$in{'mod'}&mode=";
if (-r "$miniserv{'root'}/$in{'mod'}/config.info") {
push(@tabs, [ "global", $text{'configs_global'}, $prog."global" ]);
}
if (-r "$miniserv{'root'}/$in{'mod'}/uconfig.info") {
push(@tabs, [ "user", $text{'configs_user'}, $prog."user" ]);
}
print &ui_tabs_start(\@tabs, "mode", $in{'mode'} || $tabs[0]->[0], 1);
&read_file("$config{'usermin_dir'}/$in{'mod'}/config", \%mconfig);
if (-r "$miniserv{'root'}/$in{'mod'}/config.info") {
# Display config form for the module
print &ui_tabs_start_tab("mode", "global");
print $text{'configs_globaldesc'},"<p>\n";
%minfo = &get_usermin_module_info($in{'mod'});
print &ui_form_start("save_configs.cgi", "post");
print &ui_hidden("mod", $in{'mod'}),"\n";
print &ui_table_start(
&text('config_header', &html_escape($minfo{'desc'})),
"width=100%", 2);
# Use config.info to create config inputs
&generate_config(\%mconfig, "$miniserv{'root'}/$in{'mod'}/config.info");
print &ui_table_end();
print &ui_form_end([ [ "save", $text{'save'} ] ]);
print &ui_tabs_end_tab();
}
if (-r "$miniserv{'root'}/$in{'mod'}/uconfig.info") {
# Display default user config form for the module
print &ui_tabs_start_tab("mode", "user");
print $text{'configs_userdesc'},"<p>\n";
%minfo = &get_usermin_module_info($in{'mod'});
print &ui_form_start("save_uconfigs.cgi", "post");
print &ui_hidden("mod", $in{'mod'}),"\n";
print &ui_table_start(
&text('configs_uheader', &html_escape($minfo{'desc'})),
"width=100%", 2);
&read_file("$miniserv{'root'}/$in{'mod'}/defaultuconfig", \%uconfig);
&read_file("$config{'usermin_dir'}/$in{'mod'}/uconfig", \%uconfig);
# Can edit prefs?
&read_file("$config{'usermin_dir'}/$in{'mod'}/canconfig", \%canconfig);
$noprefs = $mconfig{'noprefs'} == 1 ? 1 :
%canconfig ? 2 : 0;
print &ui_table_row($text{'configs_prefs'},
&ui_radio("noprefs", $noprefs,
[ [ 0, $text{'yes'} ], [ 1, $text{'no'} ],
[ 2, $text{'configs_sels'} ] ]));
print &ui_table_hr();
# Use uconfig.info to create config inputs
&generate_config(\%uconfig,
"$miniserv{'root'}/$in{'mod'}/uconfig.info",
undef, $noprefs == 2 ? \%canconfig : undef, "_can");
print &ui_table_end();
print &ui_form_end([ [ "save", $text{'save'} ] ]);
print &ui_tabs_end_tab();
}
print &ui_tabs_end(1);
&ui_print_footer("list_configs.cgi", $text{'configs_return'});
+60
View File
@@ -0,0 +1,60 @@
#!/usr/local/bin/perl
# Display DAV server options
require './usermin-lib.pl';
&ui_print_header(undef, $text{'dav_title'}, "");
&get_usermin_miniserv_config(\%miniserv);
print $text{'dav_desc'},"<p>\n";
# Check for need Perl modules
foreach $m ("Filesys::Virtual::Plain", "Filesys::Virtual", "Net::DAV::Server",
"HTTP::Request") {
eval "use $m";
if ($@) {
# Missing!
print &text('dav_emodule', "<tt>$m</tt>"),"\n";
if (&foreign_available("cpan")) {
print &text('dav_cpan', "../cpan/download.cgi?source=3&cpan=$m&mode=2&return=/$module_name/&returndesc=".&urlize($text{'index_return'})),"\n";
}
print "<p>\n";
&ui_print_footer("", $text{'index_return'});
exit;
}
}
print &ui_form_start("save_dav.cgi", "post");
print &ui_table_start($text{'dav_header'}, undef, 2);
# Allowed paths
print &ui_table_row($text{'dav_path'},
&ui_radio("path_def", $miniserv{'davpaths'} ? 0 : 1,
[ [ 1, $text{'dav_disabled'} ],
[ 0, &text('dav_enabled',
&ui_textbox("path", $miniserv{'davpaths'} || "/dav", 30)) ] ]
));
# Root directory
$rmode = $miniserv{'dav_root'} eq '' ? 0 :
$miniserv{'dav_root'} eq '*' ? 1 : 2;
print &ui_table_row($text{'dav_root'},
&ui_radio("root_def", $rmode,
[ [ 0, $text{'dav_root0'} ],
[ 1, $text{'dav_root1'} ],
[ 2, &text('dav_root2',
&ui_textbox("root", $rmode == 2 ? $miniserv{'dav_root'} : undef,
30)) ] ]));
# Allowed users
print &ui_table_row($text{'dav_users'},
&ui_radio("users_def", $miniserv{'dav_users'} ? 0 : 1,
[ [ 1, $text{'dav_users1'} ],
[ 0, $text{'dav_users0'} ] ])."<br>\n".
&ui_textarea("users", join("\n", split(/\s+/, $miniserv{'dav_users'})),
5, 40));
print &ui_table_end();
print &ui_form_end([ [ "save", $text{'save'} ] ]);
&ui_print_footer("", $text{'index_return'});
+23
View File
@@ -0,0 +1,23 @@
#!/usr/local/bin/perl
# edit_defacl.cgi
# Display global ACL options for usermin
require './usermin-lib.pl';
$access{'defacl'} || &error($text{'acl_ecannot'});
&ui_print_header(undef, $text{'defacl_title'}, "");
print "$text{'defacl_desc'}<p>\n";
print &ui_form_start("save_defacl.cgi", "post");
print &ui_table_start($text{'defacl_header'}, "width=100%", 4);
&get_usermin_miniserv_config(\%miniserv);
do "$miniserv{'root'}/acl_security.pl";
&read_file("$miniserv{'root'}/defaultacl", \%acl);
&read_file("$config{'usermin_dir'}/user.acl", \%acl);
&acl_security_form(\%acl);
print &ui_table_end();
print &ui_form_end([ [ undef, $text{'save'} ] ]);
&ui_print_footer("", $text{'index_return'});
+27
View File
@@ -0,0 +1,27 @@
#!/usr/local/bin/perl
# Show module description overrides
require './usermin-lib.pl';
&ui_print_header(undef, $text{'descs_title'}, undef);
print "$text{'descs_info'}<p>\n";
&read_file("$config{'usermin_dir'}/webmin.descs", \%descs);
print &ui_form_start("save_descs.cgi");
print &ui_columns_start([ $text{'descs_mod'},
$text{'descs_desc'} ]);
$i = 0;
@mods = sort { $a->{'realdesc'} cmp $b->{'realdesc'} } &list_modules();
foreach $d ((sort { $a cmp $b } (keys %descs)), undef, undef, undef) {
next if ($d =~ /^(\S+)\s+(\S+)$/);
print &ui_columns_row([
&ui_select("mod_$i", $d,
[ [ "", "&nbsp;" ],
map { [ $_->{'dir'}, $_->{'realdesc'} ] } @mods ]),
&ui_textbox("desc_$i", $descs{$d}, 40) ]);
$i++;
}
print &ui_columns_end();
print &ui_form_end([ [ "save", $text{'save'} ] ]);
&ui_print_footer("", $text{'index_return'});
+57
View File
@@ -0,0 +1,57 @@
#!/usr/local/bin/perl
# Show an IP-specific SSL key
require './usermin-lib.pl';
&ReadParse();
&get_usermin_miniserv_config(\%miniserv);
if ($in{'new'}) {
&ui_print_header(undef, $text{'ipkey_title1'}, "");
}
else {
&ui_print_header(undef, $text{'ipkey_title2'}, "");
@ipkeys = &webmin::get_ipkeys(\%miniserv);
$ipkey = $ipkeys[$in{'idx'}];
}
print &ui_form_start("save_ipkey.cgi", "post");
print &ui_hidden("new", $in{'new'}),"\n";
print &ui_hidden("idx", $in{'idx'}),"\n";
print &ui_table_start($text{'ipkey_header'}, undef, 2);
print &ui_table_row($text{'ipkey_ips2'},
&ui_textarea("ips", join("\n", @{$ipkey->{'ips'}}),
3, 20));
print &ui_table_row($text{'ssl_key'},
&ui_textbox("key", $ipkey->{'key'}, 40)."\n".
&file_chooser_button("key"));
print &ui_table_row($text{'ssl_cert'},
&ui_opt_textbox("cert", $ipkey->{'cert'}, 40,
$text{'ssl_cert_def'})."\n".
&file_chooser_button("cert"));
$mode = $ipkey->{'extracas'} eq "none" ? 2 :
$ipkey->{'extracas'} ? 1 : 0;
print &ui_table_row($text{'ssl_extracas'},
&ui_radio("extracas_mode", $mode,
[ [ 0, $text{'ssl_extracasdef'} ],
[ 2, $text{'ssl_extracasnone'} ],
[ 1, $text{'ssl_extracasbelow'} ] ])."<br>\n".
&ui_textarea("extracas",
$mode == 1 ? join("\n",split(/\s+/, $ipkey->{'extracas'}))
: "",
3, 60)." ".
&file_chooser_button("extracas", 0, undef, undef, 1));
print &ui_table_end();
if ($in{'new'}) {
print &ui_form_end([ [ "create", $text{'create'} ] ]);
}
else {
print &ui_form_end([ [ "save", $text{'save'} ],
[ "delete", $text{'delete'} ] ]);
}
&ui_print_footer("edit_ssl.cgi", $text{'ssl_return'});
+50
View File
@@ -0,0 +1,50 @@
#!/usr/local/bin/perl
# edit_lang.cgi
# Language config form
require './usermin-lib.pl';
$access{'lang'} || &error($text{'acl_ecannot'});
&ui_print_header(undef, $text{'lang_title'}, "");
&get_usermin_config(\%uconfig);
print $text{'lang_intro'},"<p>\n";
print &ui_form_start("change_lang.cgi", "post");
print &ui_table_start($text{'lang_title2'}, undef, 2);
# Language
$clang = $uconfig{'lang'} ? safe_language($uconfig{'lang'}) : $default_lang;
print &ui_table_row($text{'lang_lang'},
&ui_select("lang", $clang,
[ map { [ $_->{'lang'}, &html_escape($_->{'desc'}) ] }
&list_languages() ]));
# Old datetime format or a new locale
eval "use DateTime; use DateTime::Locale; use DateTime::TimeZone;";
if (!$@ && $] > 5.011) {
my $locales = &list_locales();
my %localesrev = reverse %{$locales};
my $locale_auto = &parse_accepted_language(\%uconfig);
print &ui_table_row($text{'lang_locale'},
&ui_select("locale", $locale_auto || $uconfig{'locale'} || &get_default_system_locale(),
[ map { [ $localesrev{$_}, $_ ] } sort values %{$locales} ]).
&ui_hidden("dateformat", $uconfig{'dateformat'}));
}
else {
print &ui_table_row($text{'lang_dateformat'},
&ui_select("dateformat", $uconfig{'dateformat'} || "dd/mon/yyyy",
[ map { [ $_, $text{'lang_dateformat_'.$_} ] }
@webmin::webmin_date_formats ]).
&ui_hidden("locale", $uconfig{'locale'}));
}
# Use language from browser?
print &ui_table_row($text{'lang_accept'},
&ui_yesno_radio("acceptlang", int($uconfig{'acceptlang'})));
print &ui_table_end();
print &ui_form_end([ [ "", $text{'lang_ok'} ] ]);
&ui_print_footer("", $text{'index_return'});
+46
View File
@@ -0,0 +1,46 @@
#!/usr/local/bin/perl
# Display per-user and group logout times options
require './usermin-lib.pl';
$access{'logout'} || &error($text{'logout_ecannot'});
&ui_print_header(undef, $text{'logout_title'}, "");
&get_usermin_miniserv_config(\%miniserv);
print $text{'logout_desc'},"<p>\n";
foreach $a (split(/\s+/, $miniserv{'logouttimes'})) {
if ($a =~ /^([^=]+)=(\S+)$/) {
push(@logout, [ $1, $2 ]);
}
}
print &ui_form_start("save_logout.cgi", "post");
print &ui_columns_start([ $text{'logout_type'},
$text{'logout_who'},
$text{'logout_time'} ]);
$i = 0;
foreach $l (@logout, [ ], [ ], [ ]) {
local ($type, $who) = (0, $l->[0]);
if ($l->[0] =~ /^\@(.*)$/) {
$type = 2;
$who = $1;
}
elsif ($l->[0] =~ /^(\/.*)$/) {
$type = 3;
}
elsif ($l->[0]) {
$type = 1;
}
print &ui_columns_row([
&ui_select("type_$i", $type,
[ [ 0, "&nbsp;" ],
[ 1, $text{'logout_user'} ],
[ 2, $text{'logout_group'} ],
[ 3, $text{'logout_file'} ] ]),
&ui_textbox("who_$i", $who, 30),
&ui_textbox("time_$i", $l->[1], 6) ]);
$i++;
}
print &ui_columns_end();
print &ui_form_end([ [ "save", $text{'save'} ] ]);
&ui_print_footer("", $text{'index_return'});
+37
View File
@@ -0,0 +1,37 @@
#!/usr/local/bin/perl
# Display options specific to mobile devices
require './usermin-lib.pl';
&ReadParse();
&ui_print_header(undef, $text{'mobile_title'}, "");
&get_usermin_miniserv_config(\%miniserv);
print &ui_form_start("change_mobile.cgi");
print &ui_table_start($text{'mobile_header'}, undef, 2);
# Custom theme for mobile devices
@themes = &list_themes();
$m = $miniserv{'mobile_preroot'};
print &ui_table_row($text{'mobile_theme'},
&ui_select("theme", defined($m) ? $m : "*",
[ [ "*", $text{'mobile_themeglob'} ],
map { [ $_->{'dir'}, &html_escape($_->{'desc'}) ] }
@themes ]));
# Skip session login for mobile devices
print &ui_table_row($text{'mobile_nosession'},
&ui_yesno_radio("nosession", int($miniserv{'mobile_nosession'})));
# Extra user agents
print &ui_table_row($text{'mobile_agents'},
&ui_textarea("agents",
join("\n", split(/\t+/, $miniserv{'mobile_agents'})), 5, 50));
# Hostname prefixes for mobile
print &ui_table_row($text{'mobile_prefixes'},
&ui_textbox("prefixes", $miniserv{'mobile_prefixes'}, 50));
print &ui_table_end();
print &ui_form_end([ [ "save", $text{'save'} ] ]);
&ui_print_footer("", $text{'index_return'});
+139
View File
@@ -0,0 +1,139 @@
#!/usr/local/bin/perl
# edit_mods.cgi
# Form for installing and removing usermin modules
require './usermin-lib.pl';
$access{'umods'} || &error($text{'acl_ecannot'});
&ui_print_header(undef, $text{'mods_title'}, "");
# Show tabs
@tabs = ( [ "install", $text{'mods_tabinstall'}, "edit_mods.cgi?mode=install" ],
[ "clone", $text{'mods_tabclone'}, "edit_mods.cgi?mode=clone" ],
[ "delete", $text{'mods_tabdelete'}, "edit_mods.cgi?mode=delete" ],
[ "export", $text{'mods_tabexport'}, "edit_mods.cgi?mode=export" ],
);
print &ui_tabs_start(\@tabs, "mode", $in{'mode'} || "install", 1);
# Display installation form
print &ui_tabs_start_tab("mode", "install");
print "$text{'mods_desc1'}<p>";
print &ui_form_start("install_mod.cgi", "form-data");
print &ui_table_start($text{'mods_install'}, undef, 2);
print &ui_table_row($text{'mods_installsource'},
&ui_radio_table("source", 0,
[ [ 0, $text{'mods_local'},
&ui_textbox("file", undef, 40)." ".
&file_chooser_button("file", 0) ],
[ 1, $text{'mods_uploaded'},
&ui_upload("upload", 40) ],
[ 2, $text{'mods_ftp'},
&ui_textbox("url", undef, 40) ] ]));
print &ui_table_row($text{'mods_nodeps'},
&ui_yesno_radio("nodeps", 0));
print &ui_table_end();
print &ui_form_end([ [ "", $text{'mods_installok'} ] ]);
print &ui_tabs_end_tab();
# Display cloning form
print &ui_tabs_start_tab("mode", "clone");
@mlist = &list_modules();
print "$text{'mods_desc2'}<p>";
print &ui_form_start("clone_mod.cgi", "post");
print &ui_table_start($text{'mods_clone'}, undef, 2);
# Source module
print &ui_table_row($text{'mods_cname'},
&ui_select("mod", undef,
[ map { [ $_->{'dir'}, &html_escape($_->{'desc'}) ] }
grep { !$_->{'clone'} } @mlist ]));
# New description
print &ui_table_row($text{'mods_cnew'},
&ui_textbox("desc", undef, 40));
# New category
&get_usermin_miniserv_config(\%miniserv);
&read_file("$miniserv{'root'}/lang/en", \%utext);
&read_file("$miniserv{'root'}/ulang/en", \%utext);
foreach $t (keys %utext) {
if ($t =~ /^category_(.*)/) {
$cats{$1} = $utext{$t};
}
}
&read_file("$config{'usermin_dir'}/webmin.catnames", \%catnames);
foreach $t (keys %catnames) {
$cats{$t} = $catnames{$t};
}
print &ui_table_row($text{'mods_ccat'},
&ui_select("cat", "*",
[ [ "*", $text{'mods_csame'} ],
map { [ $_, $cats{$_} ] }
sort { lc($a) cmp lc($b) } (keys %cats) ]));
print &ui_table_end();
print &ui_form_end([ [ "", $text{'mods_cloneok'} ] ]);
print &ui_tabs_end_tab();
# Display deletion form
print &ui_tabs_start_tab("mode", "delete");
print "$text{'mods_desc3'}<p>\n";
print &ui_form_start("delete_mod.cgi", "post");
print &ui_table_start($text{'mods_delete'}, undef, 2);
$version = &get_usermin_version();
&get_usermin_miniserv_config(\%miniserv);
$home = $miniserv{'root'} eq '/usr/local/useradmin';
@opts = ( );
foreach $m (@mlist) {
if (&check_usermin_os_support($m)) {
my @st = stat("$miniserv{'root'}/$m->{'dir'}");
my @tm = localtime($st[9]);
my $vstr = $m->{'version'} == $version ? "" :
$m->{'version'} ? "(v. $m->{'version'})" :
$home ? "" :
sprintf "(%d/%d/%d)",
$tm[3], $tm[4]+1, $tm[5]+1900;
push(@opts, [ $m->{'dir'},
&html_escape($m->{'desc'})." ".$vstr ]);
}
}
print &ui_table_row(undef,
&ui_select("mod", undef, \@opts, 10, 1)."<br>\n".
&ui_checkbox("nodeps", 1, $text{'mods_nodeps2'}, 0), 2);
print &ui_table_end();
print &ui_form_end([ [ "", $text{'mods_deleteok'} ] ]);
print &ui_tabs_end_tab();
# Display export form
print &ui_tabs_start_tab("mode", "export");
print "$text{'mods_desc4'}<p>\n";
print &ui_form_start("export_mod.cgi/module.wbm.gz");
print &ui_table_start($text{'mods_header4'}, undef, 2);
print &ui_table_row($text{'mods_exportmods'},
&ui_select("mod", undef,
[ map { [ $_->{'dir'}, &html_escape($_->{'desc'}) ] } @mlist ],
10, 1));
print &ui_table_row($text{'mods_exportto'},
&ui_radio("to", 0,
[ [ 0, $text{'mods_exportshow'}."<br>" ],
[ 1, &text('mods_exportfile',
&ui_textbox("file", undef, 40)) ] ]));
print &ui_table_end();
print &ui_form_end([ [ "ok", $text{'mods_exportok'} ] ]);
print &ui_tabs_end_tab();
print &ui_tabs_end(1);
&ui_print_footer("", $text{'index_return'});
+94
View File
@@ -0,0 +1,94 @@
#!/usr/local/bin/perl
# edit_os.cgi
# Operating system config form
require './usermin-lib.pl';
$access{'os'} || &error($text{'acl_ecannot'});
&ui_print_header(undef, $text{'os_title'}, "");
print $text{'os_desc3'},"<br>\n";
print $text{'os_desc2'},"<br>\n";
&get_usermin_config(\%uconfig);
&get_usermin_miniserv_config(\%miniserv);
print &ui_form_start("change_os.cgi", "post");
print &ui_table_start($text{'os_header'}, undef, 2, [ "width=30%" ]);
# OS according to Usermin
$osfile = "$miniserv{'root'}/os_list.txt";
print &ui_table_row($text{'os_usermin'},
&ui_select("type", $uconfig{'real_os_type'},
[ map { [ $_ ] } sort { $a cmp $b } &unique(map { $_->{'realtype'} }
&webmin::list_operating_systems($os_file)) ])." ".
&ui_textbox("version", $uconfig{'real_os_version'}, 10));
# Internal OS code
print &ui_table_row($text{'os_iusermin'},
&ui_select("itype", $uconfig{'os_type'},
[ map { [ $_ ] } sort { $a cmp $b } &unique(map { $_->{'type'} }
&webmin::list_operating_systems($os_file)) ])." ".
&ui_textbox("iversion", $uconfig{'os_version'}, 10));
# Detected OS
%osinfo = &webmin::detect_operating_system($osfile);
if ($osinfo{'real_os_type'}) {
print &ui_table_row(
$text{'os_detect'},
"$osinfo{'real_os_type'} $osinfo{'real_os_version'}\n".
($osinfo{'os_type'} ne $uconfig{'os_type'} ||
$osinfo{'os_version'} ne $uconfig{'os_version'} ?
"<br>".&ui_checkbox("update", 1, $text{'os_update'}) :
""));
}
else {
print &ui_table_row($text{'os_detect'},
"<i>$text{'os_cannot'}</i>");
}
print &ui_table_hr();
# Search path
print &ui_table_row($text{'os_path'},
&ui_textarea("path",
join("\n", split($path_separator, $uconfig{'path'})),
5, 30)."<br>".
&ui_checkbox(
"syspath", 1, $text{'os_syspath'}, !$uconfig{'syspath'}));
# Shared library path
if ($uconfig{'ld_env'}) {
print &ui_table_row($text{'os_ld_path'},
&ui_textarea("ld_path",
join("\n", split($path_separator, $uconfig{'ld_path'})),
5, 30));
}
# Perl search path
print &ui_table_row($text{'os_perllib'},
&ui_textarea("perllib",
join("\n", split(":", $miniserv{'perllib'})), 3, 30));
# Global environment variables
$atable = &ui_columns_start([ $text{'os_name'},
$text{'os_value'} ]);
$i = 0;
foreach $e (keys %miniserv) {
if ($e =~ /^env_(\S+)$/ &&
$1 ne "WEBMIN_CONFIG" && $1 ne "WEBMIN_VAR") {
$atable .= &ui_columns_row([
&ui_textbox("name_$i", $1, 20),
&ui_textbox("value_$i", $miniserv{$e}, 30)
]);
$i++;
}
}
$atable .= &ui_columns_row([ &ui_textbox("name_$i", undef, 20),
&ui_textbox("value_$i", undef, 30) ]);
$atable .= &ui_columns_end();
print &ui_table_row($text{'os_envs'}, $atable);
print &ui_table_end();
print &ui_form_end([ [ "", $text{'save'} ] ]);
&ui_print_footer("", $text{'index_return'});
+31
View File
@@ -0,0 +1,31 @@
#!/usr/local/bin/perl
# edit_referers.cgi
# Display a list of trusted referers
require './usermin-lib.pl';
&ui_print_header(undef, $text{'referers_title'}, "");
&get_usermin_config(\%ugconfig);
print $text{'referers_desc'},"<br>\n";
print &ui_form_start("change_referers.cgi");
print &ui_table_start(undef, undef, 2);
print &ui_table_row($text{'referers_referer'},
&ui_radio("referer", $ugconfig{'referer'} ? 1 : 0,
[ [ 0, $text{'yes'} ], [ 1, $text{'no'} ] ]));
print &ui_table_row($text{'referers_list'},
&ui_textarea("referers",
join("\n", split(/\s+/, $ugconfig{'referers'})),
5, 60)."<br>\n".
(!$ugconfig{'referers_none'} ?
&ui_checkbox("referers_none", 1,
$text{'referers_none'}."<br>".
&ui_text_color($text{'referers_none2'}, 'warn'),
!$ugconfig{'referers_none'}) : ""));
print &ui_table_end();
print &ui_form_end([ [ undef, $text{'save'} ] ]);
&ui_print_footer("", $text{'index_return'});
+70
View File
@@ -0,0 +1,70 @@
#!/usr/local/bin/perl
# edit_restrict.cgi
# Edit a user or group module restriction
require './usermin-lib.pl';
$access{'restrict'} || &error($text{'acl_ecannot'});
&ReadParse();
if ($in{'new'}) {
&ui_print_header(undef, $text{'restrict_create'}, "");
}
else {
&ui_print_header(undef, $text{'restrict_edit'}, "");
@usermods = &list_usermin_usermods();
$um = $usermods[$in{'idx'}];
}
print &ui_form_start("save_restrict.cgi", "post");
print &ui_hidden("new", $in{'new'});
print &ui_hidden("all", $in{'all'});
print &ui_hidden("idx", $in{'idx'});
print &ui_table_start($text{'restrict_header'}, undef, 2);
$umode = $um->[0] eq "*" ? 2 :
$um->[0] =~ /^\@/ ? 1 :
$um->[0] =~ /^\// ? 3 : 0;
print &ui_table_row($text{'restrict_who2'},
&ui_radio_table("umode", $umode,
[ [ 2, $text{'restrict_umode2'} ],
[ 0, $text{'restrict_umode0'},
&ui_user_textbox("user", $umode == 0 ? $um->[0] : "") ],
[ 1, $text{'restrict_umode1'},
&ui_group_textbox("group",
$umode == 1 ? substr($um->[0], 1) : "") ],
[ 3, $text{'restrict_umode3'},
&ui_filebox("file", $umode == 3 ? $um->[0] : "", 40) ] ]));
&read_usermin_acl(\%acl);
my @mods = &list_modules();
my @grid;
foreach my $m (@mods) {
my $hdesc = &html_escape($m->{'desc'});
push(@grid,
&ui_checkbox("mod", $m->{'dir'},
$acl{"user",$m->{'dir'}} ? $hdesc :
"<font color=red>$hdesc</font>",
&indexof($m->{'dir'}, @{$um->[2]}) >= 0));
}
print &ui_table_row($text{'restrict_mods'},
&ui_radio("mmode", $um->[1] eq "" ? 0 :
$um->[1] eq "+" ? 1 : 2,
[ [ 0, $text{'restrict_mmode0'} ],
[ 1, $text{'restrict_mmode1'} ],
[ 2, $text{'restrict_mmode2'} ] ])."<br>\n".
&ui_grid_table(\@grid, 3, 100)."\n".
&ui_links_row([ &select_all_link("mod", 0),
&select_invert_link("mod", 0) ])."\n".
&text('restrict_modsdesc', "edit_acl.cgi"));
print &ui_table_end();
if ($in{'new'}) {
print &ui_form_end([ [ undef, $text{'create'} ] ]);
}
else {
print &ui_form_end([ [ undef, $text{'save'} ],
[ 'delete', $text{'delete'} ] ]);
}
&ui_print_footer("list_restrict.cgi", $text{'restrict_return'});
+175
View File
@@ -0,0 +1,175 @@
#!/usr/local/bin/perl
# edit_session.cgi
# Edit session login options
require './usermin-lib.pl';
$access{'session'} || &error($text{'acl_ecannot'});
print "Set-Cookie: sessiontest=1; path=/\n";
&ui_print_header(undef, $text{'session_title'}, "");
&get_usermin_miniserv_config(\%miniserv);
$ver = &get_usermin_version();
&get_usermin_config(\%uconfig);
print "$text{'session_desc1'}<p>\n";
print ui_form_start("change_session.cgi", "post");
print ui_table_start($text{'session_header'}, undef, 2);
# Bad password delay
print &ui_table_row($text{'session_ptimeout'},
&ui_radio("passdelay", $miniserv{'passdelay'} ? 1 : 0,
[ [ 0, $text{'session_pdisable'}."<br>\n" ],
[ 1, $text{'session_penable'} ] ]));
# Block hosts
print &ui_table_row($text{'session_pblock'},
&ui_checkbox("blockhost_on", 1,
text('session_blockhost',
ui_textbox("blockhost_failures", $miniserv{'blockhost_failures'}, 2),
ui_textbox("blockhost_time", $miniserv{'blockhost_time'}, 2)),
$miniserv{'blockhost_failures'} ? 1 : 0));
# Block users
print &ui_table_row("",
&ui_checkbox("blockuser_on", 1,
text('session_blockuser',
ui_textbox("blockuser_failures", $miniserv{'blockuser_failures'}, 2),
ui_textbox("blockuser_time", $miniserv{'blockuser_time'}, 2)),
$miniserv{'blockuser_failures'} ? 1 : 0));
# Enable forgotten password recovery
print &ui_table_row($text{'session_forgot'},
&ui_radio("forgot", $uconfig{'forgot_pass'},
[ [ 0, $text{'no'}."<br>" ],
[ 1, $text{'yes'}."<br>" ],
[ 2, $text{'forgot_nossl'} ] ]));
# Log to syslog
eval "use Sys::Syslog qw(:DEFAULT setlogsock)";
if (!$@) {
print &ui_table_row($text{'session_syslog3'},
&ui_yesno_radio("syslog", $miniserv{'syslog'}));
}
else {
print ui_hidden('syslog', $miniserv{'syslog'});
}
print "<p>\n";
# Session authentication
print &ui_table_row($text{'session_stype'},
&ui_radio("session", $miniserv{'session'} ? 1 : 0,
[ [ 0, $text{'session_disable'}."<br>" ],
[ 1, $text{'session_enable'} ] ]));
# Session auth options
print &ui_table_row($text{'session_sopts'},
&ui_checkbox("logouttime_on", 1,
&text('session_logouttime',
&ui_textbox("logouttime", $miniserv{'logouttime'}, 10)),
$miniserv{'logouttime'} ? 1 : 0).
"<br>\n".
&ui_checkbox("remember", 1, $text{'session_remember'},
$gconfig{'noremember'} ? 0 : 1).
"<br>\n".
&ui_checkbox("realname", 1, $text{'session_realname'},
$gconfig{'realname'} ? 1 : 0).
"<br>\n".
&ui_checkbox("session_ip", 1, $text{'session_ip'},
$miniserv{'session_ip'} ? 1 : 0).
"<br>\n".
&ui_checkbox("utmp", 1, $text{'session_utmp'},
$miniserv{'utmp'} ? 1 : 0));
# Pre-login banner
print &ui_table_row($text{'session_banner'},
&ui_radio("banner_def", $gconfig{'loginbanner'} ? 0 : 1,
[ [ 1, $text{'session_banner1'}."<br>" ],
[ 0, $text{'session_banner0'} ] ]).
&ui_filebox("banner", $gconfig{'loginbanner'}, 50));
# Local authentication
print &ui_table_row($text{'session_local'},
&ui_radio("localauth", $miniserv{'localauth'} ? 1 : 0,
[ [ 0, $text{'session_localoff'}."<br>" ],
[ 1, $text{'session_localon'} ] ]));
# Authentication mode
@users = &get_usermin_miniserv_users();
$authmode = $users[0]->{'pass'} eq 'e' ? 2 :
$miniserv{'no_pam'} ? 1 : 0;
print &ui_table_row($text{'session_authmode'},
&ui_radio("authmode", $authmode,
[ [ 0, $text{'session_authmode0'}."<br>" ],
[ 1, &text('session_authmode1',
&ui_textbox("passwd_file",
$miniserv{'passwd_file'}, 12),
&ui_textbox("passwd_uindex",
$miniserv{'passwd_uindex'}, 2),
&ui_textbox("passwd_pindex",
$miniserv{'passwd_pindex'}, 2)).
"<br>" ],
[ 2, $text{'session_authmode2'}." ".
&ui_textbox("extauth", $miniserv{'extauth'}, 40) ] ]));
# PAM options
print &ui_table_row($text{'session_popts'},
ui_checkbox("pam_conv", 1, $text{'session_pamconv'},
$miniserv{'pam_conv'}).
"<br>".
ui_checkbox("pam_end", 1, $text{'session_pamend'},
$miniserv{'pam_end'}));
# Unix password change
print &ui_table_row($text{'session_cmddef'},
&ui_oneradio("cmd_def", 1, $text{'session_cmddef1'},
!$gconfig{'passwd_cmd'}).
"<br>".
&ui_oneradio("cmd_def", 0, $text{'session_cmddef0'},
$gconfig{'passwd_cmd'}).
" ".
&ui_textbox("cmd", $gconfig{'passwd_cmd'}, 60));
if ($miniserv{'passwd_cindex'} ne '') {
# Password expiry policy
print &ui_table_row($text{'session_pmodedesc3'},
&ui_radio("passwd_mode", $miniserv{'passwd_mode'} || 0,
[ [ 0, $text{'session_pmode0'}."<br>" ],
[ 1, $text{'session_pmode1'}."<br>" ],
[ 2, $text{'session_pmode2'} ] ]));
}
# Prompt to choose password at login
print &ui_table_row($text{'session_blank'},
&ui_yesno_radio("passwd_blank", $miniserv{'passwd_blank'}));
# Try adding domain name to username?
print &ui_table_row($text{'session_domain'},
&ui_yesno_radio("domainuser", $miniserv{'domainuser'}).
"<br>\n".
&ui_checkbox("domainstrip", 1, $text{'session_strip'},
$miniserv{'domainstrip'}).
"<br>\n".
&ui_checkbox("user_mapping_on", 1, $text{'session_usermap'},
$miniserv{'user_mapping'})." ".
&ui_filebox("user_mapping", $miniserv{'user_mapping'}, 30).
"<br>\n".
"$text{'session_userfmt'} ".
&ui_radio("user_mapping_reverse",
int($miniserv{'user_mapping_reverse'}),
[ [ 0, $text{'session_userfmt0'} ],
[ 1, $text{'session_userfmt1'} ] ]));
# Create homedir at login?
print &ui_table_row($text{'session_homedir'},
&ui_yesno_radio("create_homedir", $uconfig{'create_homedir'}));
# Perms for new homedir
print &ui_table_row($text{'session_homedir_perms'},
&ui_opt_textbox("create_homedir_perms",
$uconfig{'create_homedir_perms'}, 4, $text{'default'}));
print ui_table_end();
print ui_form_end([ [ "save", $text{'save'} ] ]);
&ui_print_footer("", $text{'index_return'});
+198
View File
@@ -0,0 +1,198 @@
#!/usr/local/bin/perl
# edit_ssl.cgi
# Webserver SSL form
require './usermin-lib.pl';
&ui_print_header(undef, $text{'ssl_title'}, "");
&ReadParse();
&get_usermin_miniserv_config(\%miniserv);
# Show tabs
@tabs = map { [ $_, $text{'ssl_tab'.$_}, "edit_ssl.cgi?mode=$_" ] }
( "ssl", "current", "ips", "create", "upload" );
print &ui_tabs_start(\@tabs, "mode", $in{'mode'} || $tabs[0]->[0], 1);
# Basic SSL settings
print &ui_tabs_start_tab("mode", "ssl");
print $text{'ssl_desc1'},"<p>\n";
print &ui_form_start("change_ssl.cgi", "post");
print &ui_table_start($text{'ssl_header'}, undef, 2);
print &ui_table_row($text{'ssl_on'},
&ui_yesno_radio("ssl", $miniserv{'ssl'}));
print ui_table_row($text{'ssl_enforce'},
ui_radio("ssl_enforce", $miniserv{'ssl_enforce'} // 1,
[ [ 2, $text{'ssl_hsts'} ],
[ 1, $text{'yes'} ],
[ 0, $text{'no'} ] ]));
print &ui_table_row($text{'ssl_key'},
&ui_textbox("key", $miniserv{'keyfile'}, 40)." ".
&file_chooser_button("key"));
print &ui_table_row($text{'ssl_cert'},
&ui_opt_textbox("cert", $miniserv{'certfile'}, 40,
$text{'ssl_cert_def'}."<br>",$text{'ssl_cert_oth'})." ".
&file_chooser_button("cert"));
print &ui_table_row($text{'ssl_version'},
&ui_opt_textbox("version", $miniserv{'ssl_version'}, 4,
$text{'ssl_auto'}));
print &ui_table_row($text{'ssl_deny'},
&ui_checkbox("no_ssl2", 1, "SSLv2", $miniserv{'no_ssl2'})."\n".
&ui_checkbox("no_ssl3", 1, "SSLv3", $miniserv{'no_ssl3'})."\n".
ui_checkbox("no_tls1", 1, "TLSv1.0", $miniserv{'no_tls1'})."\n".
ui_checkbox("no_tls1_1", 1, "TLSv1.1", $miniserv{'no_tls1_1'})."\n".
ui_checkbox("no_tls1_2", 1, "TLSv1.2", $miniserv{'no_tls1_2'})."\n"
);
print &ui_table_row($text{'ssl_compression'},
&ui_yesno_radio("ssl_compression", !$miniserv{'no_sslcompression'}));
print &ui_table_row($text{'ssl_honorcipherorder'},
&ui_yesno_radio("ssl_honorcipherorder",
$miniserv{'ssl_honorcipherorder'}));
$clist = $miniserv{'ssl_cipher_list'};
$cmode = !$clist ? 1 :
$clist eq $webmin::strong_ssl_ciphers ? 2 :
$clist eq $webmin::pfs_ssl_ciphers ? 3 :
0;
print &ui_table_row($text{'ssl_cipher_list'},
&ui_radio("cipher_list_def", $cmode,
[ [ 1, $text{'ssl_auto'}."<br>" ],
[ 2, $text{'ssl_strong'}."<br>" ],
[ 3, $text{'ssl_pfs'}."<br>" ],
[ 0, $text{'ssl_clist'}." ".
&ui_textbox("cipher_list",
$cmode == 0 ? $clist : "", 30) ] ]));
print &ui_table_row($text{'ssl_extracas'},
&ui_textarea("extracas", join("\n",split(/\s+/, $miniserv{'extracas'})),
3, 60)." ".
&file_chooser_button("extracas", 0, undef, undef, 1)."<p><br><p>");
print &ui_table_end();
print &ui_form_end([ [ "", $text{'save'} ] ]);
print &ui_tabs_end_tab();
# Page showing current cert
print &ui_tabs_start_tab("mode", "current");
print "$text{'ssl_current'}<p>\n";
print &ui_table_start($text{'ssl_cheader'}, undef, 4);
$info = &webmin::cert_info($miniserv{'certfile'} || $miniserv{'keyfile'});
foreach $i ('cn', 'o', 'email', 'issuer_cn', 'issuer_o', 'issuer_email',
'notafter', 'type') {
if ($info->{$i}) {
print &ui_table_row($text{'ca_'.$i}, $info->{$i});
}
}
@clinks = (
&ui_link("download_cert.cgi/cert.pem", $text{'ssl_pem'}),
&ui_link("download_cert.cgi/cert.p12", $text{'ssl_pkcs12'})
);
print &ui_table_row($text{'ssl_download'}, &ui_links_row(\@clinks));
print &ui_table_end();
print &ui_tabs_end_tab();
# Table listing per-IP SSL certs
print &ui_tabs_start_tab("mode", "ips");
print "$text{'ssl_ipkeys'}<p>\n";
@ipkeys = &webmin::get_ipkeys(\%miniserv);
if (@ipkeys) {
print &ui_columns_start([ $text{'ssl_ips'}, $text{'ssl_key'},
$text{'ssl_cert'} ]);
foreach $k (@ipkeys) {
print &ui_columns_row([
&ui_link("edit_ipkey.cgi?idx=$k->{'index'}",
join(", ", @{$k->{'ips'}})),
"<tt>$k->{'key'}</tt>",
$k->{'cert'} ? "<tt>$k->{'cert'}</tt>"
: $text{'ssl_cert_def'},
]);
}
print &ui_columns_end();
}
else {
print "<b>$text{'ssl_ipkeynone'}</b><p>\n";
}
print &ui_link("edit_ipkey.cgi?new=1", $text{'ssl_addipkey'}),"<p>\n";
print &ui_tabs_end_tab();
# SSL key generation form
print &ui_tabs_start_tab("mode", "create");
print "$text{'ssl_newkey'}<p>\n";
my $curkey = &read_file_contents($miniserv{'keyfile'});
my $origkey = &read_file_contents("$root_directory/miniserv.pem");
if ($curkey eq $origkey) {
# System is using the original (insecure) Webmin key!
print "<b>$text{'ssl_hole'}</b><p>\n";
}
print &ui_form_start("newkey.cgi");
print &ui_table_start($text{'ssl_header1'}, undef, 2);
$host = $ENV{'HTTP_HOST'};
$host =~ s/:.*//;
print &webmin::show_ssl_key_form($host, undef,
"Usermin Webserver on ".&get_system_hostname());
print &ui_table_row($text{'ssl_newfile'},
&ui_textbox("newfile", "$config{'usermin_dir'}/miniserv.pem", 40));
print &ui_table_row($text{'ssl_usenew'},
&ui_yesno_radio("usenew", 1));
print &ui_table_end();
print &ui_form_end([ [ "", $text{'ssl_create'} ] ]);
print &ui_tabs_end_tab();
# SSL key upload form
print &ui_tabs_start_tab("mode", "upload");
print "$text{'ssl_savekey'}<p>\n";
print &ui_form_start("savekey.cgi", "form-data");
print &ui_table_start($text{'ssl_saveheader'}, undef, 2);
print &ui_table_row($text{'ssl_privkey'},
&ui_textarea("key", undef, 7, 70)."<br>\n".
"<b>$text{'ssl_upload'}</b>\n".
&ui_upload("keyfile"));
print &ui_table_row($text{'ssl_privcert'},
&ui_radio("cert_def", 1,
[ [ 1, $text{'ssl_same'} ],
[ 0, $text{'ssl_below'} ] ])."<br>\n".
&ui_textarea("cert", undef, 7, 70)."<br>\n".
"<b>$text{'ssl_upload'}</b>\n".
&ui_upload("certfile"));
print &ui_table_row($text{'ssl_privchain'},
&ui_radio("chain_def", 1,
[ [ 1, $miniserv{'extracas'} ? $text{'ssl_leavechain'}
: $text{'ssl_nochain'} ],
[ 0, $text{'ssl_below'} ] ])."<br>\n".
&ui_textarea("chain", undef, 7, 70)."<br>\n".
"<b>$text{'ssl_upload'}</b>\n".
&ui_upload("chainfile"));
print &ui_table_end();
print &ui_form_end([ [ "save", $text{'save'} ] ]);
print &ui_tabs_end_tab();
print &ui_tabs_end(1);
# Button to copy cert from Webmin
&get_miniserv_config(\%wminiserv);
if ($wminiserv{'ssl'}) {
print &ui_hr();
print &ui_buttons_start();
print &ui_buttons_row("copycert.cgi", $text{'ssl_copycert'},
$text{'ssl_copycertdesc'});
print &ui_buttons_end();
}
&ui_print_footer("", $text{'index_return'});
+112
View File
@@ -0,0 +1,112 @@
#!/usr/local/bin/perl
# edit_themes.cgi
# Display all themes, and allow installation of a new one
require './usermin-lib.pl';
$access{'themes'} || &error($text{'acl_ecannot'});
&ReadParse();
&ui_print_header(undef, $text{'themes_title'}, "");
&get_usermin_config(\%uconfig);
@themes = &list_visible_themes($uconfig{'theme'});
$prog = "edit_themes.cgi?mode=";
($gtheme) = split(/\s+/, $gconfig{'theme'});
$curr_theme_selected = $gconfig{"theme_$base_remote_user"} || $gtheme;
($curr_theme) = grep { $_->{'dir'} eq $curr_theme_selected } @themes;
# Start tabs
if (@themes) {
@tabs = ( [ "change", $text{'themes_tabchange'}, $prog."change" ] );
}
push(@tabs, [ "install", $text{'themes_tabinstall'}, $prog."install" ]);
if (@themes) {
push(@tabs, [ "delete", $text{'themes_tabdelete'}, $prog."delete" ]);
}
if (@themes) {
push(@tabs, [ "export", $text{'themes_tabexport'}, $prog."export" ] );
}
print &ui_tabs_start(\@tabs, "mode", $in{'mode'} || $tabs[0]->[0], 1);
if (@themes) {
print &ui_tabs_start_tab("mode", "change");
print "$text{'themes_desc'}<p>\n";
print &ui_form_start("change_theme.cgi");
print "<b>$text{'themes_sel'}</b>&nbsp;&nbsp;\n";
print &ui_select("theme", $uconfig{'theme'},
[ !$uconfig{'theme'} ? [ '', $text{'themes_default'} ] : (),
map { [ $_->{'dir'}, &html_escape($_->{'desc'}) ] } @themes ]);
if ($curr_theme->{'config_link'} &&
$uconfig{'theme'} eq $curr_theme->{'dir'}) {
print &ui_link(
"@{[&get_webprefix()]}/$curr_theme->{'config_link'}",
&ui_tag('span', '⚙',
{ class => 'theme-config-char',
title => $text{'themes_configure'} }),
'text-link');
}
print &ui_form_end([ [ undef, $text{'themes_change'} ] ]);
print &ui_tabs_end_tab("mode", "change");
}
# Display install form
print &ui_tabs_start_tab("mode", "install");
print "$text{'themes_installdesc'}<p>\n";
print &ui_form_start("install_theme.cgi", "form-data");
print &ui_radio_table("source", 0,
[ [ 0, $text{'mods_local'}, &ui_filebox("file", undef ,40) ],
[ 1, $text{'mods_uploaded'}, &ui_upload("upload") ],
[ 2, $text{'mods_ftp'}, &ui_textbox("url", undef, 40) ] ]);
print &ui_form_end([ [ undef, $text{'themes_installok'} ] ]);
print &ui_tabs_end_tab("mode", "install");
# Display deletion form (for themes not in use)
&get_usermin_config(\%uconfig);
foreach $c (keys %uconfig) {
if ($c =~ /^theme_(\S+)$/) {
$utheme{$uconfig{$c}}++ if (defined(getpwnam($1)));
}
}
@delthemes = grep { $_->{'dir'} ne $uconfig{'theme'} &&
!$utheme{$_->{'dir'}} } @themes;
if (@delthemes) {
# Display deletion form
print &ui_tabs_start_tab("mode", "delete");
print "$text{'themes_delete'}<p>\n";
print &ui_form_start("delete_mod.cgi");
print "<b>$text{'themes_delok'}</b>&nbsp;&nbsp;\n";
print &ui_select("mod", undef,
[ map { [ $_->{'dir'}, &html_escape($_->{'desc'}) ] }
@delthemes ]),"<br>\n";
print &ui_form_end([ [ undef, $text{'delete'} ] ]);
print &ui_tabs_end_tab("mode", "delete");
}
if (@themes) {
# Display export form
print &ui_tabs_start_tab("mode", "export");
print "$text{'themes_desc4'}<p>\n";
print &ui_form_start("export_mod.cgi/theme.ubt.gz");
print &ui_table_start(undef, undef, 2);
print &ui_table_row($text{'themes_exportmods'},
&ui_select("mod", undef,
[ map { [ $_->{'dir'}, &html_escape($_->{'desc'}) ] }
@themes ], 5, 1));
print &ui_table_row($text{'mods_exportto'},
&ui_radio("to", 0,
[ [ 0, $text{'mods_exportshow'}."<br>" ],
[ 1, &text('mods_exportfile',
&ui_textbox("file", undef, 40)) ] ]));
print &ui_table_end();
print &ui_form_end([ [ "ok", $text{'themes_exportok'} ] ]);
print &ui_tabs_end_tab("mode", "export");
}
print &ui_tabs_end(1);
&ui_print_footer("", $text{'index_return'});
+56
View File
@@ -0,0 +1,56 @@
#!/usr/local/bin/perl
# Show two-factor authentication options
require './usermin-lib.pl';
ui_print_header(undef, $text{'twofactor_title'}, "", "twofactor");
get_usermin_miniserv_config(\%miniserv);
$miniserv{'session'} || &error($text{'twofactor_esession'});
print "$text{'twofactor_desc'}<p>\n";
$root = &get_usermin_root_directory();
if (!-r $root."/twofactor") {
&ui_print_endpage("<b>$text{'twofactor_eversion'}</b>");
}
print <<EOF;
<style>
.opener_shown {display:inline}
.opener_hidden {display:none}
</style>
EOF
@provs = &webmin::list_twofactor_providers();
print "<script>\n";
print "function show_prov(name) {\n";
foreach $p (@provs) {
print "d = document.getElementById(\"hiddendiv_$p->[0]\");\n";
print "d && (d.className = name == \"$p->[0]\" ? \"opener_shown\" : \"opener_hidden\");\n";
}
print "}\n";
print "</script>\n";
print ui_form_start("change_twofactor.cgi", "post");
print ui_table_start($text{'twofactor_header'}, undef, 2);
# Two-factor provider
print ui_table_row($text{'twofactor_provider'},
ui_select("twofactor_provider", $miniserv{'twofactor_provider'},
[ [ "", "&lt;".$text{'twofactor_none'}."&gt;" ],
map { [ $_->[0], $_->[1] ] } @provs ],
1, 0, 0, 0, "onChange='show_prov(value)'"), undef, [ "valign=middle","valign=middle" ]);
foreach $p (@provs) {
my $sfunc = "webmin::show_twofactor_apikey_".$p->[0];
if (defined(&$sfunc)) {
print &ui_hidden_table_row_start(undef, $p->[0],
$p->[0] eq $miniserv{'twofactor_provider'}, undef);
print &$sfunc(\%miniserv);
print &ui_hidden_table_row_end($p->[0]);
}
}
print ui_table_end();
print ui_form_end([ [ "save", $text{'save'} ] ]);
ui_print_footer("", $text{'index_return'});
+87
View File
@@ -0,0 +1,87 @@
#!/usr/local/bin/perl
# edit_ui.cgi
# Edit user interface options
require './usermin-lib.pl';
$access{'ui'} || &error($text{'acl_ecannot'});
&ui_print_header(undef, $text{'ui_title'}, "");
&get_usermin_config(\%uconfig);
print $text{'ui_desc'},"<p>\n";
print &ui_form_start("change_ui.cgi", "post");
print &ui_table_start($text{'ui_header'}, undef, 2, [ "width=30%" ]);
for($i=0; $i<@webmin::cs_names; $i++) {
$cd = $webmin::cs_codes[$i];
print &ui_table_row($webmin::cs_names[$i],
&ui_opt_textbox($cd, $uconfig{$cd}, 8, $text{'ui_default'},
$text{'ui_rgb'}));
}
print &ui_table_row($text{'ui_texttitles'},
&ui_yesno_radio("texttitles", int($uconfig{'texttitles'})));
print &ui_table_row($text{'ui_sysinfo'},
&ui_select("sysinfo", int($uconfig{'sysinfo'}),
[ map { [ $_, $text{'ui_sysinfo'.$_} ] } (0, 1, 4, 2, 3) ]));
print &ui_table_row($text{'ui_hostnamemode'},
&ui_select("hostnamemode", int($uconfig{'hostnamemode'}),
[ map { [ $_, $text{'ui_hnm'.$_} ] } (0 .. 3) ]).
" ".&ui_textbox("hostnamedisplay", $uconfig{'hostnamedisplay'}, 20));
print &ui_table_row($text{'ui_showlogin'},
&ui_yesno_radio("showlogin", $uconfig{'showlogin'}));
print &ui_table_row($text{'startpage_nohost'},
&ui_radio("nohostname", $uconfig{'nohostname'} ? 1 : 0,
[ [ 0, $text{'yes'} ], [ 1, $text{'no'} ] ]));
print &ui_table_row($text{'startpage_gotoone'},
&ui_yesno_radio("gotoone", int($uconfig{'gotoone'})));
@modules = &list_modules();
print &ui_table_row($text{'startpage_gotomodule'},
&ui_select("gotomodule", $uconfig{'gotomodule'},
[ [ "", $text{'startpage_gotonone'} ],
map { [ $_->{'dir'}, &html_escape($_->{'desc'}) ] }
sort { $a->{'desc'} cmp $b->{'desc'} } @modules ]));
print &ui_table_row($text{'ui_feedbackmode'},
&ui_radio('feedback_def',
$uconfig{'feedback'} ? 0 : 1,
[ [ 0, $text{'ui_feedbackyes'} . ' '
. &ui_textbox('feedback', $uconfig{'feedback'}) ]
, [ 1, $text{'no'} ] ]));
print &ui_table_row($text{'ui_feedbackmail'},
&ui_radio('feedbackmail_def',
$uconfig{'feedbackmail'} ? 0 : 1,
[ [ 1, $text{'ui_feedbackmail1'} ]
, [ 0, $text{'ui_feedbackmail0'} . ' '
. &ui_textbox('feedbackmail', $uconfig{'feedbackmail'}) ] ]));
print &ui_table_row($text{'ui_feedbackhost'},
&ui_opt_textbox("feedbackhost", $uconfig{'feedbackhost'}, 30,
$text{'ui_feedbackthis'}));
print &ui_table_row($text{'ui_tabs'},
&ui_radio("notabs", $uconfig{'notabs'} ? 1 : 0,
[ [ 0, $text{'yes'} ], [ 1, $text{'no'} ] ]));
my @ui_show = split(/\s+/, $uconfig{'ui_show'} // 'host os ver tver time');
print &ui_table_row($text{'ui_show'},
&ui_select("ui_show", \@ui_show,
[ ['host', $text{'ui_show_host'} ],
['os', $text{'ui_show_os'} ],
['ver', $text{'ui_show_ver'} ],
['tver', $text{'ui_show_tver'} ],
['time', $text{'ui_show_time'} ] ], 5, 1));
print &ui_table_end();
print &ui_form_end([ [ "save", $text{'save'} ] ]);
&ui_print_footer("", $text{'index_return'});
+136
View File
@@ -0,0 +1,136 @@
#!/usr/local/bin/perl
# edit_upgrade.cgi
# Display a form for upgrading all of usermin from a tarfile
require './usermin-lib.pl';
$access{'upgrade'} || error($text{'acl_ecannot'});
ui_print_header(undef, $text{'upgrade_title'}, "");
# what kind of install was this?
my $mode = get_install_type();
# was the install to a target directory?
my $dir;
if (open(DIR, "<$config{'usermin_dir'}/install-dir")) {
chop($dir = <DIR>);
close(DIR);
}
# Show tabs
@tabs = map { [ $_, $text{'upgrade_tab'.$_}, "edit_upgrade.cgi?mode=$_" ] }
( "upgrade", "update", "sched" );
print ui_tabs_start(\@tabs, "mode", $in{'mode'} || $tabs[0]->[0], 1);
# Show upgrade form
print ui_tabs_start_tab("mode", "upgrade");
print $text{"upgrade_desc$mode"},"<p>";
print ui_form_start("upgrade.cgi", "form-data");
print ui_hidden("mode", $mode);
print ui_hidden("dir", $dir);
print ui_table_start($text{'upgrade_title'}, undef, 2);
@opts = ( [ 0, $text{'upgrade_local'},
&ui_filebox("file", undef, 60) ],
[ 1, $text{'upgrade_uploaded'},
&ui_upload("file") ],
[ 5, $text{'upgrade_url'},
&ui_textbox("url", undef, 60) ],
[ 2, $text{'upgrade_ftp'} ]);
print &ui_table_row($text{'upgrade_src'},
&ui_radio_table("source", $opts[$#opts]->[0], \@opts));
my @cbs;
if (!$mode && !$dir) {
push(@cbs, &ui_checkbox("delete", 1, $text{'upgrade_delete'}, 0));
}
push(@cbs, &ui_checkbox("force", 1, $text{'upgrade_force'}, 0));
print &ui_table_row($text{'upgrade_opts'}, join("<br>\n", @cbs));
print ui_table_end();
print ui_form_end([ [ "upgrade", $text{'upgrade_ok'} ] ]);
print ui_tabs_end_tab();
# Show module update form
print ui_tabs_start_tab("mode", "update");
print "$text{'update_desc1'}<p>\n";
print ui_form_start("update.cgi", "post");
print ui_table_start($text{'update_header1'}, undef, 2);
print &ui_table_row($text{'update_src'},
&ui_radio("source", $config{'upsource'} ? 1 : 0,
[ [ 0, $text{'update_webmin'}."<br>" ],
[ 1, $text{'update_other'} ] ])."<br>\n".
&ui_textarea("other", join("\n", split(/\t+/, $config{'upsource'})),
2, 50));
print &ui_table_row($text{'update_opts'},
&ui_checkbox("show", 1, $text{'update_show'},
$config{'upshow'}).
"<br>\n".
&ui_checkbox("missing", 1, $text{'update_missing'},
$config{'upmissing'}));
print ui_table_end();
print ui_form_end([ [ undef, $text{'update_ok'} ] ]);
print ui_tabs_end_tab();
# Show scheduled module update form
print ui_tabs_start_tab("mode", "sched");
print "$text{'update_desc2'}<p>\n";
print ui_form_start("update_sched.cgi", "post");
print ui_table_start($text{'update_header2'}, undef, 2);
print &ui_table_row($text{'update_enabled'},
&ui_yesno_radio("enabled", $config{'update'}));
print &ui_table_row($text{'update_src'},
&ui_radio("source", $config{'upsource'} ? 1 : 0,
[ [ 0, $text{'update_webmin'}."<br>" ],
[ 1, $text{'update_other'} ] ])."<br>\n".
&ui_textarea("other", join("\n", split(/\t+/, $config{'upsource'})),
2, 50));
if ($config{'cron_mode'} == 0) {
$upmins = sprintf "%2.2d", $config{'upmins'};
print &ui_table_row("",
&text('update_sched2',
&ui_textbox("hour", $config{'uphour'}, 2),
&ui_textbox("mins", $upmins, 2),
&ui_textbox("days", $config{'updays'}, 3)));
}
else {
&foreign_require("cron", "cron-lib.pl");
@jobs = &cron::list_cron_jobs();
$job = &find_cron_job(\@jobs);
$job ||= { 'mins' => 0,
'hours' => $config{'uphour'},
'days' => "*/$config{'updays'}",
'months' => '*',
'weekdays' => '*' };
print &cron::get_times_input($job, 1);
}
print &ui_table_row($text{'update_opts'},
&ui_checkbox("show", 1, $text{'update_show'},
$config{'upshow'}).
"<br>\n".
&ui_checkbox("missing", 1, $text{'update_missing'},
$config{'upmissing'}).
"<br>\n".
&ui_checkbox("quiet", 1, $text{'update_quiet'},
$config{'upquiet'}));
print &ui_table_row($text{'update_email'},
&ui_textbox("upemail", $config{'upemail'}, 30));
print ui_table_end();
print ui_form_end([ [ undef, $text{'update_apply'} ] ]);
print ui_tabs_end_tab();
print &ui_tabs_end(1);
ui_print_footer("", $text{'index_return'});
+39
View File
@@ -0,0 +1,39 @@
#!/usr/local/bin/perl
# edit_users.cgi
# Display user access control form
require './usermin-lib.pl';
$access{'users'} || &error($text{'acl_ecannot'});
&ui_print_header(undef, $text{'users_title'}, "");
&get_usermin_miniserv_config(\%miniserv);
print $text{'users_desc'}," ",$text{'users_desc2'},"<p>\n";
print &ui_form_start("change_users.cgi", "post");
print &ui_table_start($text{'users_header'}, undef, 2);
$txt = $miniserv{"allowusers"} ?
join("\n", split(/\s+/, $miniserv{"allowusers"})) :
$miniserv{"denyusers"} ?
join("\n", split(/\s+/, $miniserv{"denyusers"})) : "";
print &ui_table_row(undef,
&ui_radio("access", $miniserv{"denyusers"} ? 2 :
$miniserv{"allowusers"} ? 1 : 0,
[ [ 0, $text{'users_all'} ],
[ 1, $text{'users_allow'} ],
[ 2, $text{'users_deny'} ] ])."<br>\n".
&ui_textarea("user", $txt, 6, 60));
if (&get_usermin_version() > 0.95) {
print &ui_table_row(undef,
&ui_checkbox("shells_deny", 1, $text{'users_shells'},
$miniserv{'shells_deny'})." ".
&ui_filebox("shells", $miniserv{'shells_deny'} || "/etc/shells",
40));
}
print &ui_table_end();
print &ui_form_end([ [ undef, $text{'save'} ] ]);
&ui_print_footer("", $text{'index_return'});
+92
View File
@@ -0,0 +1,92 @@
#!/usr/local/bin/perl
# Show the web serving options form
require './usermin-lib.pl';
&ui_print_header(undef, $text{'web_title'}, "");
&get_usermin_miniserv_config(\%miniserv);
&get_usermin_config(\%uconfig);
print &ui_form_start("change_web.cgi", "post");
print &ui_table_start($text{'web_header'}, undef, 2);
# Default content expiry time
print &ui_table_row($text{'web_expires'},
&ui_opt_textbox("expires", $miniserv{'expires'}, 10,
$text{'web_expiresdef'}, $text{'web_expiressecs'}), undef);
# Additional expiry times based on path
my @expires_paths;
foreach my $pe (split(/\t+/, $miniserv{'expires_paths'})) {
my ($p, $e) = split(/=/, $pe);
if ($p && $e ne '') {
push(@expires_paths, [ $p, $e ]);
}
}
push(@expires_paths, [ undef, $miniserv{'expires'} || 86400 ]);
my $etable = &ui_columns_start([ $text{'web_expirespath'},
$text{'web_expirestime'} ]);
for(my $i=0; $i<@expires_paths; $i++) {
$etable .= &ui_columns_row([
&ui_textbox("expirespath_$i", $expires_paths[$i]->[0], 40),
&ui_textbox("expirestime_$i", $expires_paths[$i]->[1], 10),
]);
}
$etable .= &ui_columns_end();
print &ui_table_row($text{'web_expirespaths'}, $etable);
# Display redirects
my $rtable = &ui_columns_start([ $text{'web_redirhost'},
$text{'web_redirport'},
$text{'web_redirpref'},
$text{'web_redirssl'} ], 'auto');
$rtable .= &ui_columns_row([
&ui_textbox('redirect_host', $miniserv{'redirect_host'}, 30),
&ui_textbox('redirect_port', $miniserv{'redirect_port'}, 5),
&ui_textbox('redirect_prefix', $miniserv{'redirect_prefix'}, 10),
&ui_checkbox("redirect_ssl", 1, $text{'redirect_ssl'},
$miniserv{'redirect_ssl'}),
], ['', '', '', ' style="text-align: center"']);
$rtable .= &ui_columns_end();
print &ui_table_row($text{'web_redirdesc'}, $rtable);
# Display switch redirect to Usermin URL
print &ui_table_row($text{'web_rediruurl'},
&ui_opt_textbox("redirect_url", $miniserv{'redirect_url'}, 40, $text{'default'}));
# Show call stack on error
print &ui_table_row($text{'advanced_stack'},
&ui_yesno_radio("stack", int($uconfig{'error_stack'})), undef);
# Show CGI errors
print &ui_table_row($text{'advanced_showstderr'},
&ui_yesno_radio("showstderr", int(!$miniserv{'noshowstderr'})), undef);
if (!$miniserv{'session'}) {
# Pass passwords to CGI programs
print &ui_table_row($text{'advanced_pass'},
&ui_yesno_radio("pass", int($miniserv{'pass_password'})), undef);
}
# Gzip static files?
print &ui_table_row($text{'advanced_gzip'},
&ui_radio("gzip", $miniserv{'gzip'},
[ [ '', $text{'advanced_gzipauto'} ],
[ 0, $text{'advanced_gzip0'} ],
[ 1, $text{'advanced_gzip1'} ] ]), undef);
# Redirect type
print &ui_table_row($text{'advanced_redir'},
&ui_radio("redir", $uconfig{'relative_redir'} ? 1 : 0,
[ [ 1, $text{'advanced_redir1'} ],
[ 0, $text{'advanced_redir0'} ] ]), undef);
# Allow directory listing
print &ui_table_row($text{'advanced_listdir'},
&ui_yesno_radio("listdir", !$miniserv{'nolistdir'}));
print &ui_table_end();
print &ui_form_end([ [ "save", $text{'save'} ] ]);
&ui_print_footer("", $text{'index_return'});
+49
View File
@@ -0,0 +1,49 @@
#!/usr/local/bin/perl
# Create and output a wbm.gz file of selected modules
require './usermin-lib.pl';
&ReadParse();
&error_setup($text{'export_err'});
@mods = split(/\0/, $in{'mod'});
@mods || &error($text{'delete_enone'});
# Make sure we have the needed commands
&has_command("tar") || &error(&text('export_ecmd', "<tt>tar</tt>"));
&has_command("gzip") || &error(&twebmin::ext('export_ecmd', "<tt>gzip</tt>"));
$in{'to'} == 0 || $in{'file'} =~ /^\// || &error($text{'export_efile'});
# Make the tar.gz file
$temp = $in{'to'} ? $in{'file'} : &transname();
local %miniserv;
&get_usermin_miniserv_config(\%miniserv);
chdir($miniserv{'root'});
$cmd = "tar chf -";
foreach $m (@mods) {
$cmd .= " ".quotemeta($m);
}
$cmd .= " | gzip -c >".quotemeta($temp);
$out = &backquote_logged("($cmd) 2>&1 </dev/null");
$? && &error("<pre>$out</pre>");
if ($in{'to'} == 0) {
# Output the file
print "Content-type: application/octet-stream\n\n";
open(TEMP, "<$temp");
my $buf;
my $bs = &get_buffer_size();
while(read(TEMP, $buf, $bs)) {
print $buf;
}
close(TEMP);
unlink($temp);
}
else {
# Tell the user
&ui_print_header(undef, $text{'export_title'}, "");
print &text('export_done', "<tt>$in{'file'}</tt>"),"<p>\n";
&ui_print_footer("/$module_name/edit_mods.cgi", $text{'mods_return'},
"", $text{'index_return'});
}
+11
View File
@@ -0,0 +1,11 @@
do 'usermin-lib.pl';
sub feedback_files
{
return ( "$config{'usermin_dir'}/miniserv.conf",
"$config{'usermin_dir'}/config" );
}
1;
Binary file not shown.

After

Width:  |  Height:  |  Size: 275 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 478 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 332 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 405 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 281 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 393 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 835 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Some files were not shown because too many files have changed in this diff Show More