diff --git a/WebminCore.pm b/WebminCore.pm
index cbf302a9f..82672c98c 100644
--- a/WebminCore.pm
+++ b/WebminCore.pm
@@ -20,7 +20,7 @@ require Exporter;
# Add functions in web-lib-funcs.pl
# Generated with :
# grep -h "^sub " web-lib-funcs.pl ui-lib.pl | sed -e 's/sub /\&/' | xargs echo
-@EXPORT = qw(&read_file &read_file_cached &read_file_cached_with_stat &write_file &html_escape "e_escape "e_javascript &tempname &transname &trunc &indexof &indexoflc &sysprint &check_ipaddress &check_ip6address &generate_icon &urlize &un_urlize &include ©data &ReadParseMime &ReadParse &read_fully &read_parse_mime_callback &read_parse_mime_javascript &PrintHeader &header &get_html_title &get_html_framed_title &get_html_status_line &popup_header &footer &popup_footer &load_theme_library &redirect &kill_byname &kill_byname_logged &find_byname &error &popup_error &error_setup &wait_for &fast_wait_for &has_command &make_date &file_chooser_button &popup_window_button &popup_window_link &read_acl &acl_filename &acl_check &get_miniserv_config &put_miniserv_config &restart_miniserv &reload_miniserv &check_os_support &http_download &complete_http_download &http_post &ftp_download &ftp_upload &no_proxy &open_socket &download_timeout &ftp_command &to_ipaddress &to_ip6address &to_hostname &icons_table &replace_file_line &read_file_lines &flush_file_lines &unflush_file_lines &unix_user_input &unix_group_input &hlink &user_chooser_button &group_chooser_button &foreign_check &foreign_exists &foreign_available &foreign_require &foreign_call &foreign_config &foreign_installed &foreign_defined &get_system_hostname &get_webmin_version &get_module_acl &get_group_module_acl &save_module_acl &save_group_module_acl &init_config &load_language &text_subs &text &encode_base64 &decode_base64 &encode_base32 &decode_base32 &get_module_info &get_all_module_infos &list_themes &get_theme_info &list_languages &read_env_file &write_env_file &lock_file &unlock_file &test_lock &unlock_all_files &can_lock_file &webmin_log &additional_log &webmin_debug_log &system_logged &backquote_logged &backquote_with_timeout &backquote_command &kill_logged &rename_logged &rename_file &symlink_logged &symlink_file &link_file &make_dir &set_ownership_permissions &unlink_logged &unlink_file ©_source_dest &remote_session_name &remote_foreign_require &remote_foreign_call &remote_foreign_check &remote_foreign_config &remote_eval &remote_write &remote_read &remote_finished &remote_error_setup &remote_rpc_call &remote_multi_callback &remote_multi_callback_error &serialise_variable &unserialise_variable &other_groups &date_chooser_button &help_file &seed_random &disk_usage_kb &recursive_disk_usage &help_search_link &make_http_connection &read_http_connection &write_http_connection &close_http_connection &clean_environment &reset_environment &clean_language &progress_callback &switch_to_remote_user &switch_to_unix_user &create_user_config_dirs &create_missing_homedir &filter_javascript &resolve_links &simplify_path &same_file &flush_webmin_caches &list_usermods &available_usermods &get_available_module_infos &get_visible_module_infos &get_visible_modules_categories &is_under_directory &parse_http_url &check_clicks_function &load_entities_map &entities_to_ascii &get_product_name &get_charset &get_display_hostname &save_module_config &save_user_module_config &nice_size &get_perl_path &get_goto_module &select_all_link &select_invert_link &select_rows_link &check_pid_file &get_mod_lib &module_root_directory &list_mime_types &guess_mime_type &open_tempfile &close_tempfile &print_tempfile &is_selinux_enabled &get_clear_file_attributes &reset_file_attributes &cleanup_tempnames &open_lock_tempfile &END &month_to_number &number_to_month &get_rbac_module_acl &supports_rbac &supports_ipv6 &use_rbac_module_acl &execute_command &open_readfile &open_execute_command &translate_filename &translate_command ®ister_filename_callback ®ister_command_callback &capture_function_output &capture_function_output_tempfile &modules_chooser_button &substitute_template &running_in_zone &running_in_vserver &running_in_xen &running_in_openvz &list_categories &is_readonly_mode &command_as_user &list_osdn_mirrors &convert_osdn_url &get_current_dir &supports_users &supports_symlinks "e_path &get_windows_root &read_file_contents &write_file_contents &unix_crypt &split_quoted_string &write_to_http_cache &check_in_http_cache &supports_javascript &ui_link &ui_img &ui_table_start &ui_table_end &ui_table_row &ui_table_hr &ui_table_span &ui_columns_start &ui_columns_row &ui_columns_header &ui_checked_columns_row &ui_radio_columns_row &ui_columns_end &ui_columns_table &ui_form_columns_table &ui_form_start &ui_form_end &ui_textbox &ui_filebox &ui_bytesbox &ui_upload &ui_password &ui_hidden &ui_select &ui_multi_select &ui_multi_select_javascript &ui_radio &ui_yesno_radio &ui_checkbox &ui_oneradio &ui_textarea &ui_user_textbox &ui_group_textbox &ui_opt_textbox &ui_submit &ui_reset &ui_button &ui_date_input &ui_buttons_start &ui_buttons_end &ui_buttons_row &ui_buttons_hr &ui_post_header &ui_pre_footer &ui_print_header &ui_print_unbuffered_header &ui_print_footer &ui_config_link &ui_print_endpage &ui_subheading &ui_links_row &ui_hidden_javascript &ui_hidden_start &ui_hidden_end &ui_hidden_table_row_start &ui_hidden_table_row_end &ui_hidden_table_start &ui_hidden_table_end &ui_tabs_start &ui_tabs_end &ui_tabs_start_tab &ui_tabs_start_tabletab &ui_tabs_end_tab &ui_tabs_end_tabletab &ui_max_text_width &ui_radio_selector &ui_radio_selector_javascript &ui_grid_table &ui_radio_table &ui_up_down_arrows &ui_hr &ui_nav_link &ui_confirmation_form &js_disable_inputs &ui_page_flipper &ui_alert_box &js_checkbox_disable &js_redirect &get_module_name clear_time_locale reset_time_locale eval_as_unix_user get_userdb_string connect_userdb disconnect_userdb split_userdb_string uniquelc &list_combined_webmin_menu &list_modules_webmin_menu &list_combined_system_info &validate_ssl_connection shell_is_bash compare_version_numbers convert_to_json print_json ®ister_error_handler &call_error_handlers);
+@EXPORT = qw(&read_file &read_file_cached &read_file_cached_with_stat &write_file &html_escape "e_escape "e_javascript &tempname &transname &trunc &indexof &indexoflc &sysprint &check_ipaddress &check_ip6address &generate_icon &urlize &un_urlize &include ©data &ReadParseMime &ReadParse &read_fully &read_parse_mime_callback &read_parse_mime_javascript &PrintHeader &header &get_html_title &get_html_framed_title &get_html_status_line &popup_header &footer &popup_footer &load_theme_library &redirect &kill_byname &kill_byname_logged &find_byname &error &popup_error &error_setup &wait_for &fast_wait_for &has_command &make_date &file_chooser_button &popup_window_button &popup_window_link &read_acl &acl_filename &acl_check &get_miniserv_config &put_miniserv_config &restart_miniserv &reload_miniserv &check_os_support &http_download &complete_http_download &http_post &ftp_download &ftp_upload &no_proxy &open_socket &download_timeout &ftp_command &to_ipaddress &to_ip6address &to_hostname &icons_table &replace_file_line &read_file_lines &flush_file_lines &unflush_file_lines &unix_user_input &unix_group_input &hlink &user_chooser_button &group_chooser_button &foreign_check &foreign_exists &foreign_available &foreign_require &foreign_call &foreign_config &foreign_installed &foreign_defined &get_system_hostname &get_webmin_version &get_module_acl &get_group_module_acl &save_module_acl &save_group_module_acl &init_config &load_language &text_subs_ambiguous &text_subs &text &encode_base64 &decode_base64 &encode_base32 &decode_base32 &get_module_info &get_all_module_infos &list_themes &get_theme_info &list_languages &read_env_file &write_env_file &lock_file &unlock_file &test_lock &unlock_all_files &can_lock_file &webmin_log &additional_log &webmin_debug_log &system_logged &backquote_logged &backquote_with_timeout &backquote_command &kill_logged &rename_logged &rename_file &symlink_logged &symlink_file &link_file &make_dir &set_ownership_permissions &unlink_logged &unlink_file ©_source_dest &remote_session_name &remote_foreign_require &remote_foreign_call &remote_foreign_check &remote_foreign_config &remote_eval &remote_write &remote_read &remote_finished &remote_error_setup &remote_rpc_call &remote_multi_callback &remote_multi_callback_error &serialise_variable &unserialise_variable &other_groups &date_chooser_button &help_file &seed_random &disk_usage_kb &recursive_disk_usage &help_search_link &make_http_connection &read_http_connection &write_http_connection &close_http_connection &clean_environment &reset_environment &clean_language &progress_callback &switch_to_remote_user &switch_to_unix_user &create_user_config_dirs &create_missing_homedir &filter_javascript &resolve_links &simplify_path &same_file &flush_webmin_caches &list_usermods &available_usermods &get_available_module_infos &get_visible_module_infos &get_visible_modules_categories &is_under_directory &parse_http_url &check_clicks_function &load_entities_map &entities_to_ascii &get_product_name &get_charset &get_display_hostname &save_module_config &save_user_module_config &nice_size &get_perl_path &get_goto_module &select_all_link &select_invert_link &select_rows_link &check_pid_file &get_mod_lib &module_root_directory &list_mime_types &guess_mime_type &open_tempfile &close_tempfile &print_tempfile &is_selinux_enabled &get_clear_file_attributes &reset_file_attributes &cleanup_tempnames &open_lock_tempfile &END &month_to_number &number_to_month &get_rbac_module_acl &supports_rbac &supports_ipv6 &use_rbac_module_acl &execute_command &open_readfile &open_execute_command &translate_filename &translate_command ®ister_filename_callback ®ister_command_callback &capture_function_output &capture_function_output_tempfile &modules_chooser_button &substitute_template &running_in_zone &running_in_vserver &running_in_xen &running_in_openvz &list_categories &is_readonly_mode &command_as_user &list_osdn_mirrors &convert_osdn_url &get_current_dir &supports_users &supports_symlinks "e_path &get_windows_root &read_file_contents &write_file_contents &unix_crypt &split_quoted_string &write_to_http_cache &check_in_http_cache &supports_javascript &ui_link &ui_img &ui_table_start &ui_table_end &ui_table_row &ui_table_hr &ui_table_span &ui_columns_start &ui_columns_row &ui_columns_header &ui_checked_columns_row &ui_radio_columns_row &ui_columns_end &ui_columns_table &ui_form_columns_table &ui_form_start &ui_form_end &ui_textbox &ui_filebox &ui_bytesbox &ui_upload &ui_password &ui_hidden &ui_select &ui_multi_select &ui_multi_select_javascript &ui_radio &ui_yesno_radio &ui_checkbox &ui_oneradio &ui_textarea &ui_user_textbox &ui_group_textbox &ui_opt_textbox &ui_submit &ui_reset &ui_button &ui_date_input &ui_buttons_start &ui_buttons_end &ui_buttons_row &ui_buttons_hr &ui_post_header &ui_pre_footer &ui_print_header &ui_print_unbuffered_header &ui_print_footer &ui_config_link &ui_print_endpage &ui_subheading &ui_links_row &ui_hidden_javascript &ui_hidden_start &ui_hidden_end &ui_hidden_table_row_start &ui_hidden_table_row_end &ui_hidden_table_start &ui_hidden_table_end &ui_tabs_start &ui_tabs_end &ui_tabs_start_tab &ui_tabs_start_tabletab &ui_tabs_end_tab &ui_tabs_end_tabletab &ui_max_text_width &ui_radio_selector &ui_radio_selector_javascript &ui_grid_table &ui_radio_table &ui_up_down_arrows &ui_hr &ui_nav_link &ui_confirmation_form &js_disable_inputs &ui_page_flipper &ui_alert_box &js_checkbox_disable &js_redirect &get_module_name clear_time_locale reset_time_locale eval_as_unix_user get_userdb_string connect_userdb disconnect_userdb split_userdb_string uniquelc &list_combined_webmin_menu &list_modules_webmin_menu &list_combined_system_info &validate_ssl_connection shell_is_bash compare_version_numbers convert_to_json print_json ®ister_error_handler &call_error_handlers);
# Add global variables in web-lib.pl
push(@EXPORT, qw(&unique));
diff --git a/config-lib.pl b/config-lib.pl
index 925e6b8eb..a23dab0cc 100755
--- a/config-lib.pl
+++ b/config-lib.pl
@@ -29,7 +29,7 @@
# generate_config(&config, info-file, [module], [&can-config], [checkbox-name],
# [only-section])
-# Prints HTML for
+# Prints HTML for
sub generate_config
{
my ($configref, $file, $module, $canconfig, $cbox, $section) = @_;
@@ -232,6 +232,10 @@ foreach my $c (@info_order) {
$field = &ui_password($c, undef, $p[2] || 40, 0, $p[3]);
}
$label = "$label";
+ if (text_subs_ambiguous($ENV{'REQUEST_URI'})) {
+ $label = text_subs_ambiguous($ENV{'REQUEST_URI'}, $label);
+ }
+
print &ui_table_row($label, $field, 1, [ "width=30% nowrap" ]);
}
}
@@ -348,4 +352,3 @@ return @new_order;
}
1;
-
diff --git a/help.cgi b/help.cgi
index 3a9c514ab..d81291e66 100755
--- a/help.cgi
+++ b/help.cgi
@@ -25,6 +25,10 @@ open(HELP, $path) || &helperror(&text('help_efile', $path));
read(HELP, $help, $st[7]);
close(HELP);
+if (text_subs_ambiguous($ENV{'SCRIPT_NAME'})) {
+ $help = text_subs_ambiguous($ENV{'SCRIPT_NAME'}, $help);
+ }
+
# find and replace the section
if ($help =~ s/([^<]+)<\/header>//i) {
&popup_header($1);
@@ -99,4 +103,3 @@ print "$text{'error'}
\n";
print "
",@_,"
\n";
exit;
}
-
diff --git a/web-lib-funcs.pl b/web-lib-funcs.pl
index f75fdce52..e85233203 100755
--- a/web-lib-funcs.pl
+++ b/web-lib-funcs.pl
@@ -5066,9 +5066,94 @@ if (!$norefs) {
if (defined(&theme_load_language)) {
&theme_load_language(\%text, $_[0]);
}
+if (text_subs_ambiguous($_[0])) {
+ my %text_replaced = text_subs_ambiguous($_[0], 0, \%text);
+ return %text_replaced;
+ }
return %text;
}
+=head2 text_subs_ambiguous(module)
+
+Used to replace certain text strings that meet requirements from (meanwhile internal %modules)
+
+=item $module - Module name to trigger substitutions on
+
+=item $replacement - Actual string where to replace
+
+=item %text - hash reference (derived from language file) to run substitutions in.
+
+=cut
+sub text_subs_ambiguous
+{
+ my ($module, $replacement, $text_hashref) = @_;
+
+ my ($script_name) = ($module =~ /\?/ ? $module : $ENV{'SCRIPT_NAME'});
+
+ # Configurable options for certain modules/pages where hash's key is the mandatory module name, and value is an array of:
+ # 1. Text to replace from/to (required)
+ # 2. Other pages to run this replacement on (besides module name)
+ # 3. Module's executable reference, that provides the command output to test the string below
+ # 4. Searched string to test against the command output (if not set it will be equal to the replaced value)
+ my %modules = (
+ 'mysql' => [['MySQL', 'MariaDB'],
+ [
+ '/help.cgi',
+ '/config.cgi?mysql',
+ '/config.cgi?virtual-server',
+ '/virtual-server/wizard.cgi',
+ '/virtual-server/list_databases.cgi',
+ '/virtual-server/edit_domain.cgi',
+ '/virtual-server/edit_newmysqls.cgi'
+ ],
+ 'mysql'
+ ]);
+
+ # Check for extra pages to run replacements for
+ my @pages;
+ foreach my $_module (keys %modules) {
+ my $pages = $modules{$_module}[1];
+ if (grep {$_ eq $script_name} @$pages) {
+ push(@pages, $_module);
+ $module = $_module;
+ }
+ }
+
+ # Step 2. Call to run the replacement
+ if ($text_hashref) {
+ my %text_hashref_replaced = map { $_ => text_subs_ambiguous($module, $text_hashref->{$_}) } keys %{ $text_hashref };
+ return %text_hashref_replaced;
+ }
+
+ # Step 3. Test and replace all strings
+ if ($replacement) {
+ my $from = $modules{$module}[0][0];
+ my $to = $modules{$module}[0][1];
+ $replacement =~ s/$from/$to/g;
+ return $replacement;
+ }
+
+ # Step 1. Quickly test if we need to run replacement at all (if we do, respond time will be slightly
+ # slower than before, depending on the module
+ if (indexof($module, keys %modules) >= 0 || @pages) {
+ # Replace only when condition 3 is set
+ if ($modules{$module}[2]) {
+ read_file("$config_directory/$module/config", \%{ "$module" . '_conf' });
+ my $searched_string = $modules{$module}[3] || $modules{$module}[0][1];
+ if (backquote_command("\"${\"$module\". '_conf'}{$modules{$module}[2]}\" -V 2>&1") =~ /$searched_string/i) {
+ return 1;
+ }
+ }
+ # Replace in any case, when module name or page name matches
+ else {
+ return 1;
+ }
+ }
+ # Do not replace anything (as fast as before)
+ else {
+ }
+}
+
=head2 text_subs(string)
Used internally by load_language to expand $code substitutions in language
@@ -5291,6 +5376,10 @@ if ($rv{'longdesc'}) {
if (defined(&theme_get_module_info)) {
%rv = &theme_get_module_info(\%rv, $_[0], $_[1], $_[2]);
}
+if (text_subs_ambiguous($_[0])) {
+ my %rv_replaced = text_subs_ambiguous($_[0], 0, \%rv);
+ return %rv_replaced;
+ }
return %rv;
}