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

View File

@@ -8,7 +8,7 @@ table { border-width: 0px;
} }
table.formsection, table.ui_table, table.loginform { table.formsection, table.ui_table, table.loginform {
border-collapse: separate; border-collapse: separate;
*border-collapse: collapse; border-collapse: collapse;
border: 1px solid #FFFFFF; border: 1px solid #FFFFFF;
width: 100%; width: 100%;
} }
@@ -216,6 +216,20 @@ br[data-x-br] {
opacity: .8; 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] { [data-tooltip][aria-label] {
position: relative; position: relative;
} }

View File

@@ -261,7 +261,7 @@ if ($rpmdepends && defined($minfo{'depends'})) {
close($fh); close($fh);
@mod_def_list = split(/\s+/, $mod_def_list); @mod_def_list = split(/\s+/, $mod_def_list);
if ( grep( /^$dmod$/, @mod_def_list ) ) { if ( grep( /^$dmod$/, @mod_def_list ) ) {
next; next;
} }
} }
push(@rdeps, $dwebmin ? ("webmin", ">=", $dwebmin) : 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_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 max_text=Maximum display length for text fields,3,Unlimited
charset=Character set for MySQL data,15,charset charset=Character set for MySQL data,15,charset
auth_plugin=Force use of authentication plugin,3,System default
line2=System configuration,11 line2=System configuration,11
mysqlshow=Path to mysqlshow command,0 mysqlshow=Path to mysqlshow command,0
mysqladmin=Path to mysqladmin command,0 mysqladmin=Path to mysqladmin command,0

View File

@@ -1620,13 +1620,18 @@ return $sql;
sub get_mysql_plugin sub get_mysql_plugin
{ {
my ($query) = @_; my ($query) = @_;
my @plugin = &execute_sql($master_db, if ($config{'auth_plugin'}) {
"show variables LIKE '%default_authentication_plugin%'"); return " with $config{'auth_plugin'}";
my $plugin = $plugin[0]->{'data'}->[0]->[1]; }
if ($plugin && $query) { else {
$plugin = " with $plugin "; 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) # 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'}, print &ui_table_row($text{'ifcs_virts'},
$vcount." ". &ui_text_wrap($vcount)." ".
"(<a href='edit_aifc.cgi?new=1&virtual=$a->{'name'}'>". &ui_element_inline("(<a href='edit_aifc.cgi?new=1&virtual=$a->{'name'}'>".
"$text{'ifcs_addvirt'}</a>)"); "$text{'ifcs_addvirt'}</a>)", 'button'));
} }
# Physical parameters # Physical parameters

View File

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

View File

@@ -35,19 +35,20 @@ foreach my $f (glob("$nm_conn_dir/*.nmconnection")) {
# IPv4 addresses # IPv4 addresses
my @virts; my @virts;
my $offset = $iface->{'dhcp'} ? 1 : 2;
for(my $i=1; defined(my $addr = &find_nm_config($cfg, "ipv4", "address$i")); $i++) { for(my $i=1; defined(my $addr = &find_nm_config($cfg, "ipv4", "address$i")); $i++) {
my ($ad, $gw) = split(/,/, $addr); my ($ad, $gw) = split(/,/, $addr);
my ($ad, $cidr) = split(/\//, $ad); my ($ad, $cidr) = split(/\//, $ad);
my $nm = &prefix_to_mask($cidr); my $nm = &prefix_to_mask($cidr);
if ($i == 1) { if ($i == $offset-1) {
$iface->{'address'} = $ad; $iface->{'address'} = $ad;
$iface->{'netmask'} = $nm; $iface->{'netmask'} = $nm;
$iface->{'gateway'} = $gw; $iface->{'gateway'} = $gw;
} }
else { else {
push(@virts,{ 'name' => $iface->{'name'}, push(@virts,{ 'name' => $iface->{'name'},
'fullname' => $iface->{'name'}.":".($i-2), 'fullname' => $iface->{'name'}.":".($i-$offset),
'virtual' => $i-2, 'virtual' => $i-$offset,
'file' => $f, 'file' => $f,
'cfg' => $cfg, 'cfg' => $cfg,
'edit' => 1, '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); print &ui_table_start($text{'db_header1'}, "width=100%", 2);
# Allow persistent MySQL connections # 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"), &onoff_radio("mysql.allow_persistent"),
undef, \@tds); undef, \@tds);
# Max persistent connections # Max persistent connections
$mp = &find_value("mysql.max_persistent", $conf); $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, &ui_opt_textbox("mysql.max_persistent", $mp <= 0 ? undef : $mp,
5, $text{'db_unlimited'}), 5, $text{'db_unlimited'}),
undef, \@tds); undef, \@tds);
# Max total connections # Max total connections
$mp = &find_value("mysql.max_links", $conf); $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, &ui_opt_textbox("mysql.max_links", $mp <= 0 ? undef : $mp,
5, $text{'db_unlimited'}), 5, $text{'db_unlimited'}),
undef, \@tds); undef, \@tds);
# Connection timeout # Connection timeout
$ct = &find_value("mysql.connect_timeout", $conf); $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, &ui_opt_textbox("mysql.connect_timeout", $ct <= 0 ? undef : $ct,
5,$text{'default'})." ".$text{'db_s'}, 5,$text{'default'})." ".$text{'db_s'},
undef, \@tds); undef, \@tds);
# Default host # 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", &ui_opt_textbox("mysql.default_host",
&find_value("mysql.default_host", $conf), &find_value("mysql.default_host", $conf),
30, "<tt>localhost</tt>"), 30, "<tt>localhost</tt>"),
undef, \@tds); undef, \@tds);
# Default port # 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", &ui_opt_textbox("mysql.default_port",
&find_value("mysql.default_port", $conf), &find_value("mysql.default_port", $conf),
5, "<tt>3306</tt>"), 5, "<tt>3306</tt>"),
@@ -62,25 +62,25 @@ print &ui_table_end();
print &ui_table_start($text{'db_header2'}, "width=100%", 2); print &ui_table_start($text{'db_header2'}, "width=100%", 2);
# Allow persistent PostgreSQL connections # 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"), &onoff_radio("pgsql.allow_persistent"),
undef, \@tds); undef, \@tds);
# Re-open persistent PostgreSQL connections # 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"), &onoff_radio("pgsql.auto_reset_persistent"),
undef, \@tds); undef, \@tds);
# Max persistent connections # Max persistent connections
$mp = &find_value("pgsql.max_persistent", $conf); $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, &ui_opt_textbox("pgsql.max_persistent", $mp <= 0 ? undef : $mp,
5, $text{'db_unlimited'}), 5, $text{'db_unlimited'}),
undef, \@tds); undef, \@tds);
# Max total connections # Max total connections
$mp = &find_value("pgsql.max_links", $conf); $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, &ui_opt_textbox("pgsql.max_links", $mp <= 0 ? undef : $mp,
5, $text{'db_unlimited'}), 5, $text{'db_unlimited'}),
undef, \@tds); undef, \@tds);

View File

@@ -14,7 +14,7 @@ print &ui_table_start($text{'dirs_header'}, "width=100%", 2);
# Include files directories # Include files directories
$include = &find_value("include_path", $conf); $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, &ui_radio("include_def", $include ? 0 : 1,
[ [ 1, $text{'default'} ], [ 0, $text{'dirs_below'} ] ]). [ [ 1, $text{'default'} ], [ 0, $text{'dirs_below'} ] ]).
"<br>\n". "<br>\n".
@@ -36,7 +36,7 @@ if (@avail) {
} }
# Can accept uploads? # 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")); &onoff_radio("file_uploads"));
# Upload temp files directory # 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); print &ui_table_start($text{'errors_header'}, "width=100%", 4);
# Show and log errors # 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")); &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")); &onoff_radio("log_errors"));
# Ignore repeated # 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")); &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")); &onoff_radio("ignore_repeated_source"));
# Error types to show # Error types to show
@@ -43,23 +43,23 @@ if ($errs =~ /^[A-Z_\|]*$/) {
$etable .= "</tr>\n" if ($i++%4 == 3); $etable .= "</tr>\n" if ($i++%4 == 3);
} }
$etable .= "</table>\n"; $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 { else {
# Custom expression # 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); &ui_opt_textbox("error_reporting", $errs, 60, $text{'default'}), 3);
} }
# Max error length # Max error length
$ml = &find_value("log_errors_max_len", $conf); $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, &ui_opt_textbox("log_errors_max_len", $ml || undef, 5,
$text{'errors_unlimited'})); $text{'errors_unlimited'}));
# Where to log errors # Where to log errors
$el = &find_value("error_log", $conf); $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, &ui_radio("error_log_def", $el eq "syslog" ? 1 : $el ? 2 : 0,
[ [ 0, $text{'errors_none'} ], [ [ 0, $text{'errors_none'} ],
[ 1, $text{'errors_syslog'} ], [ 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); print &ui_table_start($text{'limits_header'}, "width=100%", 4);
# Memory limit # 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", &ui_opt_textbox("memory_limit",
&find_value("memory_limit", $conf), &find_value("memory_limit", $conf),
8, $text{'default'})); 8, $text{'default'}));
# POST limit # 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", &ui_opt_textbox("post_max_size",
&find_value("post_max_size", $conf), &find_value("post_max_size", $conf),
8, $text{'default'})); 8, $text{'default'}));
# Upload limit # 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", &ui_opt_textbox("upload_max_filesize",
&find_value("upload_max_filesize", $conf), &find_value("upload_max_filesize", $conf),
8, $text{'default'})); 8, $text{'default'}));
# Max run time # 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", &ui_opt_textbox("max_execution_time",
&find_value("max_execution_time", $conf), &find_value("max_execution_time", $conf),
8, $text{'default'})." ".$text{'db_s'}); 8, $text{'default'})." ".$text{'db_s'});
# Max parsing time # 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", &ui_opt_textbox("max_input_time",
&find_value("max_input_time", $conf), &find_value("max_input_time", $conf),
8, $text{'default'})." ".$text{'db_s'}); 8, $text{'default'})." ".$text{'db_s'});
# Max parsing time # 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", &ui_opt_textbox("max_input_vars",
&find_value("max_input_vars", $conf), &find_value("max_input_vars", $conf),
8, $text{'default'})); 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); print &ui_table_start($text{'misc_header'}, "width=100%", 4);
# Tag styles # 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")); &onoff_radio("short_open_tag"));
print &ui_table_row($text{'misc_asp'}, if (php_version_test_maximum('5.6')) {
&onoff_radio("asp_tags")); print &ui_table_row(&opt_help($text{'misc_asp'}, 'asp_tags'),
&onoff_radio("asp_tags"));
}
# Output options # 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")); &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")); &onoff_radio("implicit_flush"));
# URL open options # 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")); &onoff_radio("allow_url_fopen"));
print &ui_table_hr(); print &ui_table_hr();
# Email sending options # Email sending options
$smtp = &find_value("SMTP", $conf); $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'})); &ui_opt_textbox("smtp", $smtp, 20, $text{'misc_none'}));
$port = &find_value("smtp_port", $conf); $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'})); &ui_opt_textbox("smtp_port", $port, 5, $text{'default'}));
$sendmail = &find_value("sendmail_path", $conf); $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, &ui_opt_textbox("sendmail_path", $sendmail, 60,
$text{'misc_none'}), 3); $text{'misc_none'}), 3);
@@ -56,11 +58,11 @@ print &ui_table_row($text{'misc_sendmail'},
print &ui_table_hr(); print &ui_table_hr();
# Include open options # 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")); &onoff_radio("allow_url_include"));
# CGI Fix Path options # 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")); &onoff_radio("cgi.fix_pathinfo"));
# PHP Timezone Dropdown # PHP Timezone Dropdown
@@ -76,7 +78,7 @@ print &ui_table_row(&hlink($text{'misc_timezone'}, "misc_timezone"),
# Default charset # Default charset
$charset = &find_value("default_charset", $conf); $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, &ui_opt_textbox("default_charset", $charset, 20,
$text{'default'})); $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); print &ui_table_start($text{'session_header'}, "width=100%", 2);
# Session saving handler # 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", &ui_select("session.save_handler",
&find_value("session.save_handler", $conf), &find_value("session.save_handler", $conf),
[ [ "files", $text{'session_files'} ], [ [ "files", $text{'session_files'} ],
@@ -23,26 +23,26 @@ print &ui_table_row($text{'session_handler'},
[ "memcache", $text{'session_memcache'} ] ])); [ "memcache", $text{'session_memcache'} ] ]));
# Where to save session files # 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", &ui_opt_textbox("session.save_path",
&find_value("session.save_path", $conf), &find_value("session.save_path", $conf),
60, $text{'default'}." (<tt>/tmp</tt>)")); 60, $text{'default'}." (<tt>/tmp</tt>)"));
# Use cookies for sessions? # 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")); &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")); &onoff_radio("session.use_only_cookies"));
# Cookie lifetime # Cookie lifetime
$lf = &find_value("session.cookie_lifetime", $conf); $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, &ui_opt_textbox("session.cookie_lifetime", $lf || undef,
5, $text{'session_forever'})." ".$text{'db_s'}); 5, $text{'session_forever'})." ".$text{'db_s'});
# Session lifetime # Session lifetime
$lf = &find_value("session.gc_maxlifetime", $conf); $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, &ui_opt_textbox("session.gc_maxlifetime", $lf || undef,
5, $text{'session_forever'})." ".$text{'db_s'}); 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_form_start("save_vars.cgi", "post");
print &ui_hidden("file", $in{'file'}),"\n"; print &ui_hidden("file", $in{'file'}),"\n";
print &ui_table_start($text{'vars_header'}, "width=100%", 4); 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'}, if (php_version_test_maximum('5.6')) {
&onoff_radio("magic_quotes_gpc")); 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'}, print &ui_table_row(&opt_help($text{'vars_args'}, 'register_argc_argv'),
&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'},
&onoff_radio("register_argc_argv")); &onoff_radio("register_argc_argv"));
print &ui_table_end(); 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_manual=Can manually edit configuration files?
acl_inis=Additional configuration files<br>(In <i>filename</i>=<i>description</i> format) acl_inis=Additional configuration files<br>(In <i>filename</i>=<i>description</i> format)
acl_user=Read and write files as user acl_user=Read and write files as user
opt_default=Default Value: <tt>$1</tt>
opt_default_unknown=Unknown
__norefs=1 __norefs=1

View File

@@ -282,7 +282,16 @@ return grep { !$done{$_->[0]}++ } @rv;
} }
# get_php_ini_binary(file) # 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 sub get_php_ini_binary
{ {
my ($file) = @_; my ($file) = @_;
@@ -305,18 +314,110 @@ if (&foreign_check("virtual-server")) {
} }
} }
# Try to get version from the path # Try to get version from the path, e.g.
if ($fle =~ /php(\d+)/) { # 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 $ver = $1;
my $nodot = $ver; my $nodot = $ver;
$nodot =~ s/\.//g; $nodot =~ s/\.//g;
my $binary = &has_command("php$ver") || my $binary = &has_command("php$ver") ||
&has_command("php$nodot"); &has_command("php$nodot");
return $binary if ($binary); return $binary if ($binary);
} }
return &has_command("php"); 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) # onoff_radio(name)
# Returns a field for editing a binary configuration value # Returns a field for editing a binary configuration value
sub onoff_radio sub onoff_radio
@@ -485,5 +586,40 @@ if ($dir) {
return (); 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; 1;

View File

@@ -2804,7 +2804,7 @@ if (defined(&theme_ui_div_row)) {
return &theme_ui_div_row(@_); return &theme_ui_div_row(@_);
} }
my ($label, $content) = @_; 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) =head2 ui_space(number)
@@ -2819,7 +2819,7 @@ if (defined(&theme_ui_space)) {
} }
my ($number) = @_; my ($number) = @_;
$number ||= 1; $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) =head2 ui_newline(number)
@@ -2834,7 +2834,7 @@ if (defined(&theme_ui_newline)) {
} }
my ($number) = @_; my ($number) = @_;
$number ||= 1; $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) =head2 ui_text_wrap(text)
@@ -2848,7 +2848,21 @@ if (defined(&theme_ui_text_wrap)) {
return &theme_ui_text_wrap(@_); return &theme_ui_text_wrap(@_);
} }
my ($text) = @_; 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) =head2 ui_paginations(&array, &opts)

View File

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

View File

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

View File

@@ -1,52 +1,52 @@
-----BEGIN PGP PUBLIC KEY BLOCK----- -----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v2.0.22 (GNU/Linux)
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
bk6OFSh+t0wH NwLr+Y0i9j34kj2CjamfZrYtCjOVytsfVGGogSd5GBumqfYt2bmJywuom1Wkpvkv
=1KZ4 eMAhu3k=
=ha4Q
-----END PGP PUBLIC KEY BLOCK----- -----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 $webmin_key_fingerprint = "1719 003A CE3E 5A41 E2DE 70DF D97A 3AE9 11F6 3C51";
our $developers_key_email = "developers\@webmin.com"; 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_email = "gpg\@ilia.engineer";
our $authentic_key_fingerprint = "EC60 F3DA 9CB7 9ADC CF56 0D1F 121E 166D D9C8 21AB"; our $authentic_key_fingerprint = "EC60 F3DA 9CB7 9ADC CF56 0D1F 121E 166D D9C8 21AB";