Compare commits

...

35 Commits

Author SHA1 Message Date
iliajie
cae06a79a0 Fix to use regular params 2023-07-18 22:53:58 +03:00
iliajie
b2f4dd4fe8 Fix to clearly say if option cannot be extracted 2023-07-16 20:35:02 +03:00
iliajie
0c575c5266 Fix not to display options that are deprecated or removed 2023-07-16 17:27:47 +03:00
iliajie
acc47ce0e7 Add PHP API for comparison and version extraction 2023-07-16 17:13:50 +03:00
iliajie
81e5120fc4 Add displaying tooltip with defaults for "PHP Variables" page 2023-07-16 15:14:23 +03:00
iliajie
281cb21cce Add displaying tooltip with defaults for "Directory Settings" page 2023-07-16 15:10:41 +03:00
iliajie
ad084a1ceb Fix to display unknown value as empty not to be confusing 2023-07-16 15:07:17 +03:00
iliajie
4b436c2f16 Add displaying tooltip with defaults for "Database Settings" page 2023-07-16 15:05:51 +03:00
iliajie
51e672b87d Add displaying tooltip with defaults for "Session Options" page 2023-07-16 14:52:59 +03:00
iliajie
f21650971e Add displaying tooltip with defaults for "Error Logging" page 2023-07-16 14:52:27 +03:00
iliajie
eccb7a169c Add displaying tooltip with defaults for "Other Settings" page 2023-07-16 14:50:33 +03:00
iliajie
77c9d1fa9c Fix tooltip content formatting if HTML is supported 2023-07-16 14:49:04 +03:00
iliajie
fb0b6b4044 Fix to simplify linkage to PHP.net 2023-07-16 13:13:08 +03:00
iliajie
deb172ca82 Fix PHP detection from the path to work for all supported distros 2023-07-16 13:09:19 +03:00
iliajie
f7dc0add11 Add initial support for displaying default PHP value 2023-07-16 03:44:10 +03:00
iliajie
915781d381 Fix typo 2023-07-16 01:36:31 +03:00
iliajie
dca48f4f00 Add support for the new link bubbles 2023-07-16 01:35:11 +03:00
iliajie
8e47199147 Fix to consider active interface using new ui_element_inline API 2023-07-15 23:28:57 +03:00
iliajie
437bdd2528 Fix typo when detecting PHP binary 2023-07-15 23:27:18 +03:00
iliajie
bedb091e56 Add ui_element_inline API and use it on the button in **Net** module 2023-07-15 14:51:54 +03:00
Jamie Cameron
323f0cc043 Use formal params 2023-07-14 16:51:25 -07:00
Jamie Cameron
df7bf3af4a Handle case where main IP is assigned by DHCP 2023-07-14 14:55:44 -07:00
Jamie Cameron
94d3727b41 Fix spacing 2023-07-14 10:20:13 -07:00
Jamie Cameron
510c7153e4 Merge branch 'master' of github.com:webmin/webmin 2023-07-14 10:18:18 -07:00
Jamie Cameron
389d061972 Use new developers key 2023-07-14 10:18:12 -07:00
iliajie
ad5e279231 wuftpd, mon, and jabber are obsolete 2023-07-14 20:14:15 +03:00
Jamie Cameron
f9bccb3853 Merge branch 'master' of github.com:webmin/webmin 2023-07-13 19:49:15 -07:00
Jamie Cameron
3c21733d57 use a safe function to rename a file 2023-07-13 19:48:51 -07:00
iliajie
0d45d61edc Fix to put error details into help bubble 2023-07-13 14:51:13 +03:00
Jamie Cameron
eb79f4c169 Add config option to force use of some authentication plugin 2023-07-12 16:55:03 -07:00
Jamie Cameron
48eb29e547 Merge branch 'master' of github.com:webmin/webmin 2023-07-12 15:52:31 -07:00
Jamie Cameron
3fe5aa8887 Grub 1 and Vgetty are obsolete https://github.com/webmin/webmin/issues/1950 2023-07-12 15:52:23 -07:00
Jamie Cameron
50e058d2b6 Merge pull request #1951 from webmin/dev/error-less-obscure
Fix to make errors less obscure
2023-07-12 14:01:28 -07:00
iliajie
2d85a2951c Fix to make errors less obscure 2023-07-12 23:40:41 +03:00
Jamie Cameron
21e4debf24 Merge pull request #1948 from webmin/dev/server-header
Add ability to control `Server:` response header #1945
2023-07-11 18:56:16 -07:00
24 changed files with 341 additions and 149 deletions

File diff suppressed because one or more lines are too long

View File

@@ -495,11 +495,10 @@ return $name.
# Increase the serial number in some SOA record by 1
sub bump_soa_record
{
my($r, $v, $vals);
for(my $i=0; $i<@{$_[1]}; $i++) {
$r = $_[1]->[$i];
my ($file, $recs) = @_;
foreach my $r (@$recs) {
if ($r->{'type'} eq "SOA") {
$v = $r->{'values'};
my $v = $r->{'values'};
# already set serial if no acl allow it to update or update
# is disabled
my $serial = $v->[2];
@@ -507,8 +506,8 @@ for(my $i=0; $i<@{$_[1]}; $i++) {
# automatically handle serial numbers ?
$serial = &compute_serial($v->[2]);
}
$vals = "$v->[0] $v->[1] (\n\t\t\t$serial\n\t\t\t$v->[3]\n".
"\t\t\t$v->[4]\n\t\t\t$v->[5]\n\t\t\t$v->[6] )";
my $vals = "$v->[0] $v->[1] (\n\t\t\t$serial\n\t\t\t$v->[3]\n".
"\t\t\t$v->[4]\n\t\t\t$v->[5]\n\t\t\t$v->[6] )";
&modify_record($r->{'file'}, $r, $r->{'realname'}, $r->{'ttl'},
$r->{'class'}, $r->{'type'}, $vals);
}

View File

@@ -8,7 +8,7 @@ table { border-width: 0px;
}
table.formsection, table.ui_table, table.loginform {
border-collapse: separate;
*border-collapse: collapse;
border-collapse: collapse;
border: 1px solid #FFFFFF;
width: 100%;
}
@@ -216,6 +216,20 @@ br[data-x-br] {
opacity: .8;
}
.ui_text_wrap {
float: right;
}
.ui_link_help {
display: initial;
float: right;
margin-right: 4px;
}
td:not(:hover) .ui_link_help {
visibility: hidden;
}
[data-tooltip][aria-label] {
position: relative;
}

View File

@@ -261,7 +261,7 @@ if ($rpmdepends && defined($minfo{'depends'})) {
close($fh);
@mod_def_list = split(/\s+/, $mod_def_list);
if ( grep( /^$dmod$/, @mod_def_list ) ) {
next;
next;
}
}
push(@rdeps, $dwebmin ? ("webmin", ">=", $dwebmin) :

View File

@@ -1 +1 @@
cron dfsadmin exports inetd init mount samba useradmin fdisk format proc webmin quota software pap acl apache lpadmin bind8 sendmail squid bsdexports hpuxexports net dhcpd custom servers time wuftpd syslog mysql man inittab raid postfix webminlog postgresql xinetd status cpan pam nis shell grub fetchmail passwd at proftpd sshd heartbeat cluster-software cluster-useradmin qmailadmin mon jabber stunnel usermin fsdump lvm procmail cluster-webmin firewall sgiexports vgetty openslp webalizer shorewall adsl-client updown ppp-client pptp-server pptp-client ipsec ldap-useradmin change-user cluster-shell cluster-cron spam htaccess-htpasswd logrotate cluster-passwd mailboxes ipfw sarg bandwidth cluster-copy backup-config smart-status idmapd krb5 smf ipfilter rbac tunnel zones cluster-usermin dovecot syslog-ng mailcap ldap-client phpini filter bacula-backup ldap-server exim tcpwrappers package-updates system-status webmincron shorewall6 iscsi-server iscsi-client gray-theme iscsi-target iscsi-tgtd bsdfdisk fail2ban authentic-theme firewalld filemin firewall6 logviewer xterm
cron dfsadmin exports inetd init mount samba useradmin fdisk format proc webmin quota software pap acl apache lpadmin bind8 sendmail squid bsdexports hpuxexports net dhcpd custom servers time syslog mysql man inittab raid postfix webminlog postgresql xinetd status cpan pam nis shell fetchmail passwd at proftpd sshd heartbeat cluster-software cluster-useradmin qmailadmin stunnel usermin fsdump lvm procmail cluster-webmin firewall sgiexports openslp webalizer shorewall adsl-client updown ppp-client pptp-server pptp-client ipsec ldap-useradmin change-user cluster-shell cluster-cron spam htaccess-htpasswd logrotate cluster-passwd mailboxes ipfw sarg bandwidth cluster-copy backup-config smart-status idmapd krb5 smf ipfilter rbac tunnel zones cluster-usermin dovecot syslog-ng mailcap ldap-client phpini filter bacula-backup ldap-server exim tcpwrappers package-updates system-status webmincron shorewall6 iscsi-server iscsi-client gray-theme iscsi-target iscsi-tgtd bsdfdisk fail2ban authentic-theme firewalld filemin firewall6 logviewer xterm

View File

@@ -12,6 +12,7 @@ encoding=Encoding for database content,3,Default (from current language)
max_dbs=Maximum number of databases and tables&#44; indexes and views to display,0,5
max_text=Maximum display length for text fields,3,Unlimited
charset=Character set for MySQL data,15,charset
auth_plugin=Force use of authentication plugin,3,System default
line2=System configuration,11
mysqlshow=Path to mysqlshow command,0
mysqladmin=Path to mysqladmin command,0

View File

@@ -1620,13 +1620,18 @@ return $sql;
sub get_mysql_plugin
{
my ($query) = @_;
my @plugin = &execute_sql($master_db,
"show variables LIKE '%default_authentication_plugin%'");
my $plugin = $plugin[0]->{'data'}->[0]->[1];
if ($plugin && $query) {
$plugin = " with $plugin ";
if ($config{'auth_plugin'}) {
return " with $config{'auth_plugin'}";
}
else {
my @plugin = &execute_sql($master_db,
"show variables LIKE '%default_authentication_plugin%'");
my $plugin = $plugin[0]->{'data'}->[0]->[1];
if ($plugin && $query) {
$plugin = " with $plugin ";
}
return $plugin;
}
return $plugin;
}
# perms_column_to_privilege_map(col)

View File

@@ -161,9 +161,9 @@ if ($a && $a->{'virtual'} eq "" && !$in{'new'}) {
}
}
print &ui_table_row($text{'ifcs_virts'},
$vcount." ".
"(<a href='edit_aifc.cgi?new=1&virtual=$a->{'name'}'>".
"$text{'ifcs_addvirt'}</a>)");
&ui_text_wrap($vcount)." ".
&ui_element_inline("(<a href='edit_aifc.cgi?new=1&virtual=$a->{'name'}'>".
"$text{'ifcs_addvirt'}</a>)", 'button'));
}
# Physical parameters

View File

@@ -227,10 +227,10 @@ if ($b && $b->{'virtual'} eq "" && !$in{'new'}) {
}
$vlink = "";
if ($access{'virt'} && !$noos_support_add_virtifcs) {
$vlink = "(<a href='edit_bifc.cgi?new=1&virtual=$b->{'name'}'>".
"$text{'ifcs_addvirt'}</a>)\n";
$vlink = &ui_element_inline("(<a href='edit_bifc.cgi?new=1&virtual=$b->{'name'}'>".
"$text{'ifcs_addvirt'}</a>)\n", 'button');
}
print &ui_table_row($text{'ifcs_virts'}, $vcount." ".$vlink);
print &ui_table_row($text{'ifcs_virts'}, &ui_text_wrap($vcount)." ".$vlink);
}
# Special parameters for teaming

View File

@@ -35,19 +35,20 @@ foreach my $f (glob("$nm_conn_dir/*.nmconnection")) {
# IPv4 addresses
my @virts;
my $offset = $iface->{'dhcp'} ? 1 : 2;
for(my $i=1; defined(my $addr = &find_nm_config($cfg, "ipv4", "address$i")); $i++) {
my ($ad, $gw) = split(/,/, $addr);
my ($ad, $cidr) = split(/\//, $ad);
my $nm = &prefix_to_mask($cidr);
if ($i == 1) {
if ($i == $offset-1) {
$iface->{'address'} = $ad;
$iface->{'netmask'} = $nm;
$iface->{'gateway'} = $gw;
}
else {
push(@virts,{ 'name' => $iface->{'name'},
'fullname' => $iface->{'name'}.":".($i-2),
'virtual' => $i-2,
'fullname' => $iface->{'name'}.":".($i-$offset),
'virtual' => $i-$offset,
'file' => $f,
'cfg' => $cfg,
'edit' => 1,

View File

@@ -16,40 +16,40 @@ print &ui_hidden("file", $in{'file'}),"\n";
print &ui_table_start($text{'db_header1'}, "width=100%", 2);
# Allow persistent MySQL connections
print &ui_table_row($text{'db_persist'},
print &ui_table_row(&opt_help($text{'db_persist'}, 'mysql.allow_persistent'),
&onoff_radio("mysql.allow_persistent"),
undef, \@tds);
# Max persistent connections
$mp = &find_value("mysql.max_persistent", $conf);
print &ui_table_row($text{'db_maxpersist'},
print &ui_table_row(&opt_help($text{'db_maxpersist'}, 'mysql.max_persistent'),
&ui_opt_textbox("mysql.max_persistent", $mp <= 0 ? undef : $mp,
5, $text{'db_unlimited'}),
undef, \@tds);
# Max total connections
$mp = &find_value("mysql.max_links", $conf);
print &ui_table_row($text{'db_maxlinks'},
print &ui_table_row(&opt_help($text{'db_maxlinks'}, 'mysql.max_links'),
&ui_opt_textbox("mysql.max_links", $mp <= 0 ? undef : $mp,
5, $text{'db_unlimited'}),
undef, \@tds);
# Connection timeout
$ct = &find_value("mysql.connect_timeout", $conf);
print &ui_table_row($text{'db_timeout'},
print &ui_table_row(&opt_help($text{'db_timeout'}, 'mysql.connect_timeout'),
&ui_opt_textbox("mysql.connect_timeout", $ct <= 0 ? undef : $ct,
5,$text{'default'})." ".$text{'db_s'},
undef, \@tds);
# Default host
print &ui_table_row($text{'db_host'},
print &ui_table_row(&opt_help($text{'db_host'}, 'mysql.default_host'),
&ui_opt_textbox("mysql.default_host",
&find_value("mysql.default_host", $conf),
30, "<tt>localhost</tt>"),
undef, \@tds);
# Default port
print &ui_table_row($text{'db_port'},
print &ui_table_row(&opt_help($text{'db_port'}, 'mysql.default_port'),
&ui_opt_textbox("mysql.default_port",
&find_value("mysql.default_port", $conf),
5, "<tt>3306</tt>"),
@@ -62,25 +62,25 @@ print &ui_table_end();
print &ui_table_start($text{'db_header2'}, "width=100%", 2);
# Allow persistent PostgreSQL connections
print &ui_table_row($text{'db_persist'},
print &ui_table_row(&opt_help($text{'db_persist'}, 'pgsql.allow_persistent'),
&onoff_radio("pgsql.allow_persistent"),
undef, \@tds);
# Re-open persistent PostgreSQL connections
print &ui_table_row($text{'db_reset'},
print &ui_table_row(&opt_help($text{'db_reset'}, 'pgsql.auto_reset_persistent'),
&onoff_radio("pgsql.auto_reset_persistent"),
undef, \@tds);
# Max persistent connections
$mp = &find_value("pgsql.max_persistent", $conf);
print &ui_table_row($text{'db_maxpersist'},
print &ui_table_row(&opt_help($text{'db_maxpersist'}, 'pgsql.max_persistent'),
&ui_opt_textbox("pgsql.max_persistent", $mp <= 0 ? undef : $mp,
5, $text{'db_unlimited'}),
undef, \@tds);
# Max total connections
$mp = &find_value("pgsql.max_links", $conf);
print &ui_table_row($text{'db_maxlinks'},
print &ui_table_row(&opt_help($text{'db_maxlinks'}, 'pgsql.max_links'),
&ui_opt_textbox("pgsql.max_links", $mp <= 0 ? undef : $mp,
5, $text{'db_unlimited'}),
undef, \@tds);

View File

@@ -14,7 +14,7 @@ print &ui_table_start($text{'dirs_header'}, "width=100%", 2);
# Include files directories
$include = &find_value("include_path", $conf);
print &ui_table_row($text{'dirs_include'},
print &ui_table_row(&opt_help($text{'dirs_include'}, 'include'),
&ui_radio("include_def", $include ? 0 : 1,
[ [ 1, $text{'default'} ], [ 0, $text{'dirs_below'} ] ]).
"<br>\n".
@@ -36,7 +36,7 @@ if (@avail) {
}
# Can accept uploads?
print &ui_table_row($text{'dirs_upload'},
print &ui_table_row(&opt_help($text{'dirs_upload'}, 'file_uploads'),
&onoff_radio("file_uploads"));
# Upload temp files directory

View File

@@ -13,15 +13,15 @@ print &ui_hidden("file", $in{'file'}),"\n";
print &ui_table_start($text{'errors_header'}, "width=100%", 4);
# Show and log errors
print &ui_table_row($text{'errors_display'},
print &ui_table_row(&opt_help($text{'errors_display'}, 'display_errors'),
&onoff_radio("display_errors"));
print &ui_table_row($text{'errors_log'},
print &ui_table_row(&opt_help($text{'errors_log'}, 'log_errors'),
&onoff_radio("log_errors"));
# Ignore repeated
print &ui_table_row($text{'errors_ignore'},
print &ui_table_row(&opt_help($text{'errors_ignore'}, 'ignore_repeated_errors'),
&onoff_radio("ignore_repeated_errors"));
print &ui_table_row($text{'errors_source'},
print &ui_table_row(&opt_help($text{'errors_source'}, 'ignore_repeated_source'),
&onoff_radio("ignore_repeated_source"));
# Error types to show
@@ -43,23 +43,23 @@ if ($errs =~ /^[A-Z_\|]*$/) {
$etable .= "</tr>\n" if ($i++%4 == 3);
}
$etable .= "</table>\n";
print &ui_table_row($text{'errors_bits'}, $etable, 3);
print &ui_table_row(&opt_help($text{'errors_bits'}, 'error_reporting'), $etable, 3);
}
else {
# Custom expression
print &ui_table_row($text{'errors_reporting'},
print &ui_table_row(&opt_help($text{'errors_reporting'}, 'error_reporting'),
&ui_opt_textbox("error_reporting", $errs, 60, $text{'default'}), 3);
}
# Max error length
$ml = &find_value("log_errors_max_len", $conf);
print &ui_table_row($text{'errors_maxlen'},
print &ui_table_row(&opt_help($text{'errors_maxlen'}, 'log_errors_max_len'),
&ui_opt_textbox("log_errors_max_len", $ml || undef, 5,
$text{'errors_unlimited'}));
# Where to log errors
$el = &find_value("error_log", $conf);
print &ui_table_row($text{'errors_file'},
print &ui_table_row(&opt_help($text{'errors_file'}, 'error_log'),
&ui_radio("error_log_def", $el eq "syslog" ? 1 : $el ? 2 : 0,
[ [ 0, $text{'errors_none'} ],
[ 1, $text{'errors_syslog'} ],

View File

@@ -13,37 +13,37 @@ print &ui_hidden("file", $in{'file'}),"\n";
print &ui_table_start($text{'limits_header'}, "width=100%", 4);
# Memory limit
print &ui_table_row($text{'limits_mem'},
print &ui_table_row(&opt_help($text{'limits_mem'}, 'memory_limit'),
&ui_opt_textbox("memory_limit",
&find_value("memory_limit", $conf),
8, $text{'default'}));
# POST limit
print &ui_table_row($text{'limits_post'},
print &ui_table_row(&opt_help($text{'limits_post'}, 'post_max_size'),
&ui_opt_textbox("post_max_size",
&find_value("post_max_size", $conf),
8, $text{'default'}));
# Upload limit
print &ui_table_row($text{'limits_upload'},
print &ui_table_row(&opt_help($text{'limits_upload'}, 'upload_max_filesize'),
&ui_opt_textbox("upload_max_filesize",
&find_value("upload_max_filesize", $conf),
8, $text{'default'}));
# Max run time
print &ui_table_row($text{'limits_exec'},
print &ui_table_row(&opt_help($text{'limits_exec'}, 'max_execution_time'),
&ui_opt_textbox("max_execution_time",
&find_value("max_execution_time", $conf),
8, $text{'default'})." ".$text{'db_s'});
# Max parsing time
print &ui_table_row($text{'limits_input'},
print &ui_table_row(&opt_help($text{'limits_input'}, 'max_input_time'),
&ui_opt_textbox("max_input_time",
&find_value("max_input_time", $conf),
8, $text{'default'})." ".$text{'db_s'});
# Max parsing time
print &ui_table_row($text{'limits_vars'},
print &ui_table_row(&opt_help($text{'limits_vars'}, 'max_input_vars'),
&ui_opt_textbox("max_input_vars",
&find_value("max_input_vars", $conf),
8, $text{'default'}));

View File

@@ -22,33 +22,35 @@ print &ui_hidden("file", $in{'file'}),"\n";
print &ui_table_start($text{'misc_header'}, "width=100%", 4);
# Tag styles
print &ui_table_row($text{'misc_short'},
print &ui_table_row(&opt_help($text{'misc_short'}, 'short_open_tag'),
&onoff_radio("short_open_tag"));
print &ui_table_row($text{'misc_asp'},
&onoff_radio("asp_tags"));
if (php_version_test_maximum('5.6')) {
print &ui_table_row(&opt_help($text{'misc_asp'}, 'asp_tags'),
&onoff_radio("asp_tags"));
}
# Output options
print &ui_table_row($text{'misc_zlib'},
print &ui_table_row(&opt_help($text{'misc_zlib'}, 'zlib.output_compression'),
&onoff_radio("zlib.output_compression"));
print &ui_table_row($text{'misc_flush'},
print &ui_table_row(&opt_help($text{'misc_flush'}, 'implicit_flush'),
&onoff_radio("implicit_flush"));
# URL open options
print &ui_table_row($text{'misc_fopen'},
print &ui_table_row(&opt_help($text{'misc_fopen'}, 'allow_url_fopen'),
&onoff_radio("allow_url_fopen"));
print &ui_table_hr();
# Email sending options
$smtp = &find_value("SMTP", $conf);
print &ui_table_row($text{'misc_smtp'},
print &ui_table_row(&opt_help($text{'misc_smtp'}, 'smtp'),
&ui_opt_textbox("smtp", $smtp, 20, $text{'misc_none'}));
$port = &find_value("smtp_port", $conf);
print &ui_table_row($text{'misc_port'},
print &ui_table_row(&opt_help($text{'misc_port'}, 'smtp_port'),
&ui_opt_textbox("smtp_port", $port, 5, $text{'default'}));
$sendmail = &find_value("sendmail_path", $conf);
print &ui_table_row($text{'misc_sendmail'},
print &ui_table_row(&opt_help($text{'misc_sendmail'}, 'sendmail_path'),
&ui_opt_textbox("sendmail_path", $sendmail, 60,
$text{'misc_none'}), 3);
@@ -56,11 +58,11 @@ print &ui_table_row($text{'misc_sendmail'},
print &ui_table_hr();
# Include open options
print &ui_table_row($text{'misc_include'},
print &ui_table_row(&opt_help($text{'misc_include'}, 'allow_url_include'),
&onoff_radio("allow_url_include"));
# CGI Fix Path options
print &ui_table_row($text{'misc_path'},
print &ui_table_row(&opt_help($text{'misc_path'}, 'cgi.fix_pathinfo'),
&onoff_radio("cgi.fix_pathinfo"));
# PHP Timezone Dropdown
@@ -76,7 +78,7 @@ print &ui_table_row(&hlink($text{'misc_timezone'}, "misc_timezone"),
# Default charset
$charset = &find_value("default_charset", $conf);
print &ui_table_row($text{'misc_charset'},
print &ui_table_row(&opt_help($text{'misc_charset'}, 'default_charset'),
&ui_opt_textbox("default_charset", $charset, 20,
$text{'default'}));

View File

@@ -13,7 +13,7 @@ print &ui_hidden("file", $in{'file'}),"\n";
print &ui_table_start($text{'session_header'}, "width=100%", 2);
# Session saving handler
print &ui_table_row($text{'session_handler'},
print &ui_table_row(&opt_help($text{'session_handler'}, 'session.save_handler'),
&ui_select("session.save_handler",
&find_value("session.save_handler", $conf),
[ [ "files", $text{'session_files'} ],
@@ -23,26 +23,26 @@ print &ui_table_row($text{'session_handler'},
[ "memcache", $text{'session_memcache'} ] ]));
# Where to save session files
print &ui_table_row($text{'session_path'},
print &ui_table_row(&opt_help($text{'session_path'}, 'session.save_path'),
&ui_opt_textbox("session.save_path",
&find_value("session.save_path", $conf),
60, $text{'default'}." (<tt>/tmp</tt>)"));
# Use cookies for sessions?
print &ui_table_row($text{'session_cookies'},
print &ui_table_row(&opt_help($text{'session_cookies'}, 'session.use_cookies'),
&onoff_radio("session.use_cookies"));
print &ui_table_row($text{'session_only_cookies'},
print &ui_table_row(&opt_help($text{'session_only_cookies'}, 'session.use_only_cookies'),
&onoff_radio("session.use_only_cookies"));
# Cookie lifetime
$lf = &find_value("session.cookie_lifetime", $conf);
print &ui_table_row($text{'session_life'},
print &ui_table_row(&opt_help($text{'session_life'}, 'session.cookie_lifetime'),
&ui_opt_textbox("session.cookie_lifetime", $lf || undef,
5, $text{'session_forever'})." ".$text{'db_s'});
# Session lifetime
$lf = &find_value("session.gc_maxlifetime", $conf);
print &ui_table_row($text{'session_maxlife'},
print &ui_table_row(&opt_help($text{'session_maxlife'}, 'session.gc_maxlifetime'),
&ui_opt_textbox("session.gc_maxlifetime", $lf || undef,
5, $text{'session_forever'})." ".$text{'db_s'});

View File

@@ -11,20 +11,21 @@ $conf = &get_config_as_user($in{'file'});
print &ui_form_start("save_vars.cgi", "post");
print &ui_hidden("file", $in{'file'}),"\n";
print &ui_table_start($text{'vars_header'}, "width=100%", 4);
if (php_version_test_maximum('7.4')) {
print &ui_table_row(&opt_help($text{'vars_magic'}, 'magic_quotes_gpc'),
&onoff_radio("magic_quotes_gpc"));
print &ui_table_row(&opt_help($text{'vars_runtime'}, 'magic_quotes_runtime'),
&onoff_radio("magic_quotes_runtime"));
}
print &ui_table_row($text{'vars_magic'},
&onoff_radio("magic_quotes_gpc"));
if (php_version_test_maximum('5.6')) {
print &ui_table_row(&opt_help($text{'vars_register'}, 'register_globals'),
&onoff_radio("register_globals"));
print &ui_table_row(&opt_help($text{'vars_long'}, 'register_long_arrays'),
&onoff_radio("register_long_arrays"));
}
print &ui_table_row($text{'vars_runtime'},
&onoff_radio("magic_quotes_runtime"));
print &ui_table_row($text{'vars_register'},
&onoff_radio("register_globals"));
print &ui_table_row($text{'vars_long'},
&onoff_radio("register_long_arrays"));
print &ui_table_row($text{'vars_args'},
print &ui_table_row(&opt_help($text{'vars_args'}, 'register_argc_argv'),
&onoff_radio("register_argc_argv"));
print &ui_table_end();

View File

@@ -167,4 +167,8 @@ acl_anyfile=Can edit any file as a PHP configuration?
acl_manual=Can manually edit configuration files?
acl_inis=Additional configuration files<br>(In <i>filename</i>=<i>description</i> format)
acl_user=Read and write files as user
opt_default=Default Value: <tt>$1</tt>
opt_default_unknown=Unknown
__norefs=1

View File

@@ -282,7 +282,16 @@ return grep { !$done{$_->[0]}++ } @rv;
}
# get_php_ini_binary(file)
# Given a php.ini path, try to guess the php command for it
# Given a php.ini path, try to guess the PHP command for it
# Examples:
# caller: get_php_binary_version("/etc/php/8.3/fpm/pool.d/www.conf");
# return: /bin/php8.3
#
# caller: get_php_binary_version("/etc/opt/remi/php81/php.ini");
# return: /bin/php81
#
# caller: get_php_binary_version("php7.4");
# return: /bin/php7.4 or /bin/php74
sub get_php_ini_binary
{
my ($file) = @_;
@@ -305,18 +314,110 @@ if (&foreign_check("virtual-server")) {
}
}
# Try to get version from the path
if ($fle =~ /php(\d+)/) {
# Try to get version from the path, e.g.
# RHEL and derivatives /etc/opt/remi/php83
# Debian/Ubuntu /etc/php/8.3/fpm/pool.d/www.conf
# RHEL and derivatives Debian/Ubuntu
if ($file =~ /php(\d+)/ || $file =~ /php\/([\d\.]+)/) {
my $ver = $1;
my $binary = &has_command("php$ver");
return $binary if ($binary);
}
# Given PHP version, e.g. `php7.4` as a string try to get binary
if ($file =~ /^php.*?([\d\.]+)$/) {
my $ver = $1;
my $nodot = $ver;
$nodot =~ s/\.//g;
my $binary = &has_command("php$ver") ||
&has_command("php$nodot");
&has_command("php$nodot");
return $binary if ($binary);
}
return &has_command("php");
}
# get_php_binary_version(file|version-string)
# Given a php.ini path or binary, try to guess the
# PHP command and extract version for it
# Examples:
# caller: get_php_binary_version("/etc/php/8.3/fpm/pool.d/www.conf");
# return: 8.3.0
# caller: get_php_binary_version("/etc/opt/remi/php81/php.ini");
# return: 8.1.2
# caller: get_php_binary_version("php7.4");
# return: 7.4.33
sub get_php_binary_version
{
my ($file) = @_;
my $phpbinary = &get_php_ini_binary($file || $in{'file'});
return undef if (!$phpbinary);
my $phpver = &backquote_command("$phpbinary -v 2>&1");
($phpver) = $phpver =~ /^PHP\s+([\d\.]+)/;
return $phpver;
}
# php_version_test_against(version, comparison-operator, [file|version-string])
# Given PHP version test if matches with currently installed or given
# Returns 1 if given version matches to the given and/or installed, 0 if not matches
#
# Examples:
# caller: php_version_test_against("7.4");
# return: 1 if version 7.4 is lower or equal to the current (current is 7.4.33)
# -----------------------------------------------------------------------------
# caller: php_version_test_against("7.3", undef, "/etc/opt/remi/php81/php.ini");
# return: 0 because version 7.3 is lower and not equal to found/instaled 8.1
# -----------------------------------------------------------------------------
# caller: php_version_test_against("7.4.33", undef, "php7.4.33");
# return: 1 because version 7.4.33 is lower or equal to found/instaled 7.4.33
# -----------------------------------------------------------------------------
# caller: php_version_test_against("7.4.33", undef, "php7.3.3");
# return: 0 because version 7.4.33 is greater found/instaled 7.3.3
# -----------------------------------------------------------------------------
# caller: php_version_test_against("7.3", undef, "php7.2");
# return: 0 because version 7.3 is greater found/instaled 7.2
# -----------------------------------------------------------------------------
# caller: php_version_test_against('7.4.33', '<=', 'php7.4');
# return: 1 for version 7.4.33 because PHP 7.4 is installed and version 7.4.33
# -----------------------------------------------------------------------------
# caller: php_version_test_against('7.4.34', '<=', 'php7.4');
# return: 0 because version 7.4.34 is not lower or equal than intalled (7.4.33)
sub php_version_test_against
{
my ($version, $cmp, $file) = @_;
my $curr_php = &get_php_binary_version($file);
return undef if (!$curr_php);
$cmp ||= '>=';
# Normalize the base version
if ($version =~ /^\d+\.\d+$/) {
# 7.4
$curr_php =~ s/(\d+\.\d+)(.*)/$1/;
}
if ($version =~ /^\d+$/) {
# 7
$curr_php =~ s/(\d+)(.*)/$1/;
}
if (&compare_version_numbers($version, $cmp, $curr_php)) {
return 1;
}
return 0;
}
# php_version_test_minimum(version, [file|version-string])
# Returns minimum version of PHP agaisnt installed or given
sub php_version_test_minimum
{
my ($version, $file) = @_;
return &php_version_test_against($version, '<=', $file);
}
# php_version_test_maximum(version, [file|version-string])
# Returns maximum version of PHP agaisnt installed or given
sub php_version_test_maximum
{
my ($version, $file) = @_;
return &php_version_test_against($version, '>=', $file);
}
# onoff_radio(name)
# Returns a field for editing a binary configuration value
sub onoff_radio
@@ -485,5 +586,40 @@ if ($dir) {
return ();
}
# list_default_value(file, value, no-cache)
# Returns a list of all available PHP extension modules
sub list_default_value
{
my ($file, $value, $nocache) = @_;
my $binary = &get_php_ini_binary($file);
if ($binary) {
my $out = $main::list_default_value_cache{$binary};
if ($nocache || !$out) {
# Return defaults (without using any config file)
$out = &backquote_command("$binary --no-php-ini -i 2>/dev/null </dev/null");
$main::list_default_value_cache{$binary} = $out;
}
# Get default master value
if ($out =~ /\Q$value\E\s+\=>\s+\S+\s+\=>\s+(\S+)/) {
return $1;
}
}
return undef;
}
# opt_help(text, php-opt-name)
# Returns the link to the PHP manual for some option
sub opt_help
{
my ($text, $opt) = @_;
my $opt_name = $opt;
$opt_name =~ s/_/-/g;
my $php_opt_default = &list_default_value($in{'file'}, $opt);
my $optdef = defined($php_opt_default) ? $php_opt_default : "<em>$text{'opt_default_unknown'}</em>";
$php_opt_default = "<strong>".&text('opt_default', "<br>$opt = $optdef")."</strong>";
my $link = "https://www.php.net/$opt_name";
return "@{[&ui_text_wrap($text)]}".&ui_link($link, &ui_help($php_opt_default), 'ui_link_help', 'target="_blank"');
}
1;

View File

@@ -2804,7 +2804,7 @@ if (defined(&theme_ui_div_row)) {
return &theme_ui_div_row(@_);
}
my ($label, $content) = @_;
return "<div class='ui_div_row'><span>$label</span><span>$content</span></div>";
return "<div class='ui_div_row'><span>$label</span><span>$content</span></div>\n";
}
=head2 ui_space(number)
@@ -2819,7 +2819,7 @@ if (defined(&theme_ui_space)) {
}
my ($number) = @_;
$number ||= 1;
return "<span class='ui_space'>".("&nbsp;" x $number)."</span>";
return "<span class='ui_space'>".("&nbsp;" x $number)."</span>\n";
}
=head2 ui_newline(number)
@@ -2834,7 +2834,7 @@ if (defined(&theme_ui_newline)) {
}
my ($number) = @_;
$number ||= 1;
return "<span class='ui_newline'>".("<br>" x $number)."</span>";
return "<span class='ui_newline'>".("<br>" x $number)."</span>\n";
}
=head2 ui_text_wrap(text)
@@ -2848,7 +2848,21 @@ if (defined(&theme_ui_text_wrap)) {
return &theme_ui_text_wrap(@_);
}
my ($text) = @_;
return "<span class='ui_text_wrap'>$text</span>";
return "<span class='ui_text_wrap'>$text</span>\n";
}
=head2 ui_element_inline(text)
Wraps any text into span tags
=cut
sub ui_element_inline
{
if (defined(&theme_ui_element_inline)) {
return &theme_ui_element_inline(@_);
}
my ($element, $type) = @_;
return "<span data-element='$type' class='ui_element_inline'>$element</span>\n";
}
=head2 ui_paginations(&array, &opts)

View File

@@ -56,7 +56,7 @@ if (!@index) {
push(@index, $bak) if (-r "$dir/$bak");
}
push(@index, "$in{'wav_filename'}.rmd");
system("mv $rmdfile $dir/$in{'wav_filename'}.rmd");
&rename_file($rmdfile, "$dir/$in{'wav_filename'}.rmd");
&open_lock_tempfile(INDEX, ">$index");
&print_tempfile(INDEX, map { "$_\n" } @index);
&close_tempfile(INDEX);

View File

@@ -1688,6 +1688,20 @@ $main::no_miniserv_userdb = 1;
&setvar('error-fatal', 1);
my $msg = join("", @_);
$msg =~ s/<[^>]*>//g;
my (@msg) = @_;
my @stack;
for(my $i=0; my @stack_ = caller($i); $i++) {
push(@stack, \@stack_);
}
my $err_caller;
$err_caller = "$stack[1]->[1] (line $stack[1]->[2])"
if ($stack[1]->[1] && $stack[1]->[2]);
if ($err_caller) {
$err_caller =~ s/$root_directory\///;
my $err_caller_ = &ui_help($err_caller);
$msg = $msg ? "$msg $err_caller_" : $err_caller_;
push(@msg, $err_caller_);
}
my $error_details = (($ENV{'WEBMIN_DEBUG'} || $gconfig{'debug_enabled'}) ? "" : "\n");
my $error_output_right = sub {
my ($err_msg) = @_;
@@ -1698,7 +1712,7 @@ if (!$main::error_must_die) {
}
&load_theme_library();
if ($main::error_must_die) {
die "@_$error_details";
die "@msg$error_details";
}
&call_error_handlers();
if (!$ENV{'REQUEST_METHOD'}) {
@@ -1711,7 +1725,7 @@ if (!$ENV{'REQUEST_METHOD'}) {
&print_call_stack() if ($gconfig{'error_stack'});
}
elsif (defined(&theme_error)) {
&theme_error(@_);
&theme_error({err => \@_, stack => \@stack, err_caller => $err_caller});
}
elsif ($ENV{'REQUEST_URI'} =~ /json-error=1/) {
my %jerror;
@@ -1721,7 +1735,8 @@ elsif ($ENV{'REQUEST_URI'} =~ /json-error=1/) {
%jerror = (error => $error,
error_fatal => 1,
error_what => $error_what,
error_message => $error_message
error_message => $error_message,
error_caller => $err_caller,
);
print_json(\%jerror);
}
@@ -1738,11 +1753,11 @@ else {
print "<hr>\n" if ($hh);
if ($hh) {
print "<h3 data-fatal-error-text>",($main::whatfailed ? "$main::whatfailed : " : ""),
@_,"</h3>\n";
@msg,"</h3>\n";
}
else {
my $error_what = ($main::whatfailed ? "$main::whatfailed: " : "");
my $error_html = join(",", @_);
my $error_html = join(",", @msg);
my $error_text;
if ($error_html !~ /<pre.*?>/) {
$error_text = " &mdash; $error_html";
@@ -1759,11 +1774,11 @@ else {
print "<tr> <td$cls_err_td><b>$text{'error_file'}</b></td> ",
"<td$cls_err_td><b>$text{'error_line'}</b></td> ",
"<td$cls_err_td><b>$text{'error_sub'}</b></td> </tr>\n";
for($i=0; my @stack = caller($i); $i++) {
foreach my $stack (@stack) {
print "<tr>\n";
print "<td$cls_err_td>$stack[1]</td>\n";
print "<td$cls_err_td>$stack[2]</td>\n";
print "<td$cls_err_td>$stack[3]</td>\n";
print "<td$cls_err_td>$stack->[1]</td>\n";
print "<td$cls_err_td>$stack->[2]</td>\n";
print "<td$cls_err_td>$stack->[3]</td>\n";
print "</tr>\n";
}
print "</table>\n";

View File

@@ -1,52 +1,52 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v2.0.22 (GNU/Linux)
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
bk6OFSh+t0wH
=1KZ4
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
eMAhu3k=
=ha4Q
-----END PGP PUBLIC KEY BLOCK-----

View File

@@ -44,7 +44,7 @@ our $webmin_key_email = "jcameron\@webmin.com";
our $webmin_key_fingerprint = "1719 003A CE3E 5A41 E2DE 70DF D97A 3AE9 11F6 3C51";
our $developers_key_email = "developers\@webmin.com";
our $developers_key_fingerprint = "B966 3227 39F9 8E2E 092E 69CF 28E1 1943 FF6A DD8B966 3227 39F9 8E2E 092E 69CF 28E1 1943 FF6A DD855";
our $developers_key_fingerprint = "7D1A E915 F3DC FADA 344A 4FCB 2D22 3B91 8916 F2A2";
our $authentic_key_email = "gpg\@ilia.engineer";
our $authentic_key_fingerprint = "EC60 F3DA 9CB7 9ADC CF56 0D1F 121E 166D D9C8 21AB";