From cbdc8435005be62888d8a762e2a8a8f7bb316036 Mon Sep 17 00:00:00 2001 From: Ilia Ross Date: Fri, 29 Sep 2023 03:24:14 +0300 Subject: [PATCH 01/11] Add theme switcher using hotkeys --- WebminCore.pm | 2 +- gray-theme/index.cgi | 1 + gray-theme/left.cgi | 2 +- gray-theme/right.cgi | 2 +- makedist.pl | 1 + switch_theme.cgi | 42 +++++++++++++++++++++++++++++++++ ui-lib.pl | 24 +++++++++++++++++++ unauthenticated/switch_theme.js | 28 ++++++++++++++++++++++ web-lib-funcs.pl | 7 ++++++ 9 files changed, 106 insertions(+), 3 deletions(-) create mode 100755 switch_theme.cgi create mode 100644 unauthenticated/switch_theme.js diff --git a/WebminCore.pm b/WebminCore.pm index 4f9418bae..728c8ebae 100644 --- a/WebminCore.pm +++ b/WebminCore.pm @@ -23,7 +23,7 @@ $main::export_to_caller = 1; # 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 html_unescape html_strip quote_escape quote_javascript tempname_dir tempname transname transname_timestamped trunc indexof indexoflc sysprint check_ipaddress check_ip6address generate_icon urlize un_urlize include copydata 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_module_preferences load_theme_library redirect kill_byname kill_byname_logged find_byname error error_stderr popup_error register_error_handler call_error_handlers 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_file 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_meta 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_webmin_version_release get_webmin_full_version get_module_acl get_group_module_acl save_module_acl save_group_module_acl init_config load_language_auto 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_locales list_languages safe_language read_env_file write_env_file lock_file unlock_file test_lock unlock_all_files can_lock_file webmin_log additional_log var_dump 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 make_dir_recursive set_ownership_permissions unlink_logged unlink_file copy_permissions_source_dest copy_source_dest move_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 read_help_file seed_random disk_usage_kb recursive_disk_usage help_search_link make_http_connection validate_ssl_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 eval_as_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 register_filename_callback register_command_callback capture_function_output capture_function_output_tempfile modules_chooser_button substitute_template substitute_pattern 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 quote_path get_windows_root read_file_contents write_file_contents read_file_contents_limit unix_crypt split_quoted_string write_to_http_cache check_in_http_cache supports_javascript get_module_name get_module_variable clear_time_locale reset_time_locale callers_package web_libs_package get_userdb_string connect_userdb disconnect_userdb split_userdb_string uniquelc list_combined_webmin_menu list_modules_webmin_menu module_to_menu_item list_combined_system_info shell_is_bash compare_version_numbers convert_to_json convert_from_json print_json get_referer_relative get_webmin_email_url get_webmin_browser_url trim ui_link ui_help ui_img ui_link_button 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_elements_wrapper 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_users_textbox ui_group_textbox ui_groups_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 ui_text_color ui_alert_box js_disable_inputs ui_page_flipper js_checkbox_disable js_redirect ui_webmin_link ui_line_break_double ui_page_refresh ui_details ui_div_row ui_space ui_newline ui_text_wrap ui_element_inline ui_paginations ui_hide_outside_of_viewport ui_read_file_contents_limit get_python_cmd get_buffer_size get_buffer_size_binary get_webprefix get_sub_ref_name setvar getvar delvar print_call_stack webmin_user_can_rpc webmin_user_login_mode webmin_user_is_admin webmin_user_is get_current_theme_info_cached miniserv_using_default_cert is_int float is_float parse_accepted_language get_default_system_locale get_http_redirect get_http_cookie create_wrapper); +@EXPORT = qw(read_file read_file_cached read_file_cached_with_stat write_file html_escape html_unescape html_strip quote_escape quote_javascript tempname_dir tempname transname transname_timestamped trunc indexof indexoflc sysprint check_ipaddress check_ip6address generate_icon urlize un_urlize include copydata 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_module_preferences load_theme_library redirect kill_byname kill_byname_logged find_byname error error_stderr popup_error register_error_handler call_error_handlers 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_file 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_meta 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_webmin_version_release get_webmin_full_version get_module_acl get_group_module_acl save_module_acl save_group_module_acl init_config load_language_auto 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_locales list_languages safe_language read_env_file write_env_file lock_file unlock_file test_lock unlock_all_files can_lock_file webmin_log additional_log var_dump 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 make_dir_recursive set_ownership_permissions unlink_logged unlink_file copy_permissions_source_dest copy_source_dest move_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 read_help_file seed_random disk_usage_kb recursive_disk_usage help_search_link make_http_connection validate_ssl_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 eval_as_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 register_filename_callback register_command_callback capture_function_output capture_function_output_tempfile modules_chooser_button substitute_template substitute_pattern 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 quote_path get_windows_root read_file_contents write_file_contents read_file_contents_limit unix_crypt split_quoted_string write_to_http_cache check_in_http_cache supports_javascript get_module_name get_module_variable clear_time_locale reset_time_locale callers_package web_libs_package get_userdb_string connect_userdb disconnect_userdb split_userdb_string uniquelc list_combined_webmin_menu list_modules_webmin_menu module_to_menu_item list_combined_system_info shell_is_bash compare_version_numbers convert_to_json convert_from_json print_json get_referer_relative get_webmin_email_url get_webmin_browser_url trim ui_link ui_help ui_img ui_link_button 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_elements_wrapper 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_users_textbox ui_group_textbox ui_groups_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_switch_theme_javascript ui_grid_table ui_radio_table ui_up_down_arrows ui_hr ui_nav_link ui_confirmation_form ui_text_color ui_alert_box js_disable_inputs ui_page_flipper js_checkbox_disable js_redirect ui_webmin_link ui_line_break_double ui_page_refresh ui_details ui_div_row ui_space ui_newline ui_text_wrap ui_element_inline ui_paginations ui_hide_outside_of_viewport ui_read_file_contents_limit get_python_cmd get_buffer_size get_buffer_size_binary get_webprefix get_sub_ref_name setvar getvar delvar print_call_stack webmin_user_can_rpc webmin_user_login_mode webmin_user_is_admin webmin_user_is get_current_theme_info_cached miniserv_using_default_cert is_int float is_float parse_accepted_language get_default_system_locale get_http_redirect get_http_cookie create_wrapper); # Add global variables in web-lib.pl push(@EXPORT, qw(&unique)); diff --git a/gray-theme/index.cgi b/gray-theme/index.cgi index 68af4e847..99695935e 100755 --- a/gray-theme/index.cgi +++ b/gray-theme/index.cgi @@ -96,6 +96,7 @@ if ($current_lang_info->{'rtl'} || $current_lang eq "ar") { # Page header print "\n"; print "\n"; +print &ui_switch_theme_javascript(); print "$title\n"; my $imgdir = "@{[&get_webprefix()]}/images"; my $prod = 'webmin'; diff --git a/gray-theme/left.cgi b/gray-theme/left.cgi index f4001070e..7e592a16e 100755 --- a/gray-theme/left.cgi +++ b/gray-theme/left.cgi @@ -84,7 +84,7 @@ if (@has > 1) { } print ""; } - +print &ui_switch_theme_javascript(); print "
\n"; print "
\n"; diff --git a/gray-theme/right.cgi b/gray-theme/right.cgi index a331c58b8..1a5de97e3 100755 --- a/gray-theme/right.cgi +++ b/gray-theme/right.cgi @@ -44,7 +44,7 @@ my @linkshtml = map { print "
\n"; print &ui_links_row(\@linkshtml); print "
\n"; - +print &ui_switch_theme_javascript(); if (foreign_available("server-manager")) { print ''; } diff --git a/makedist.pl b/makedist.pl index 5e0cb6153..eb977b2ef 100755 --- a/makedist.pl +++ b/makedist.pl @@ -60,6 +60,7 @@ $vers || usage(); "webmin-search-lib.pl", "WebminCore.pm", "record-login.pl", "record-logout.pl", "record-failed.pl", "robots.txt", "unauthenticated", "bin", "html-editor-lib.pl", + "switch_theme.cgi", ); if ($min) { # Only those required by others diff --git a/switch_theme.cgi b/switch_theme.cgi new file mode 100755 index 000000000..dfe3dc00a --- /dev/null +++ b/switch_theme.cgi @@ -0,0 +1,42 @@ +#!/usr/local/bin/perl +# switch_theme.cgi +# Change the theme for the current user if allowed + +BEGIN { push(@INC, "."); }; +use WebminCore; + +&init_config(); +&ReadParse(); +my $err = sub { + &PrintHeader(); + print("Cannot change theme : $_[0]\n"); + exit(1); + }; +# Check if allowed to change theme, +# otherwise throw an error +if (!&foreign_available('theme') && + !&foreign_available('change-user') && + !&foreign_available('webmin') && + !&foreign_available('acl')) { + &$err("You are not allowed to change themes!"); + } +# Check if the theme is known +&$err("Theme identification is not known!") + if (!$in{'theme'} || $in{'theme'} !~ /^[123]$/); +# Check if the remote user is known +&$err("Remote user is not known!") if (!$remote_user); +# Define the theme +my $themes = { + '1' => 'authentic-theme', + '2' => 'gray-theme', + '3' => '' }; +my $theme = $themes->{$in{'theme'}}; +# Change the theme +$gconfig{"theme_$remote_user"} = $theme; +&write_file("$config_directory/config", \%gconfig); +my %miniserv; +&get_miniserv_config(\%miniserv); +$miniserv{"preroot_$remote_user"} = $theme; +&put_miniserv_config(\%miniserv); +&restart_miniserv(); +&redirect(&get_webprefix() . "/"); diff --git a/ui-lib.pl b/ui-lib.pl index f0e87d261..d427dba16 100755 --- a/ui-lib.pl +++ b/ui-lib.pl @@ -2280,6 +2280,30 @@ for(var i=0; i\n"; +return $switch_script; +} + ####################### grid layout functions =head2 ui_grid_table(&elements, columns, [width-percent], [&tds], [tabletags], [title]) diff --git a/unauthenticated/switch_theme.js b/unauthenticated/switch_theme.js new file mode 100644 index 000000000..fc670ef41 --- /dev/null +++ b/unauthenticated/switch_theme.js @@ -0,0 +1,28 @@ +(function () { + let firstCombinationPressed = false; + document.addEventListener("keydown", function (event) { + // Check for Ctrl+Alt+Shift+0 + if (event.ctrlKey && event.altKey && event.keyCode === 84) { + firstCombinationPressed = true; + + // Set a timeout to reset the state after a short period (e.g., 1 seconds) + setTimeout(() => { + firstCombinationPressed = false; + }, 1000); + } + if (firstCombinationPressed && event.shiftKey && + (event.keyCode === 65 || event.keyCode === 71 || event.keyCode === 76)) { + const theme = + event.keyCode === 65 ? 1 : + event.keyCode === 71 ? 2 : + event.keyCode === 76 ? 3 : null; + firstCombinationPressed = false; + try { + top.document.documentElement.style.filter = 'grayscale(100%) blur(0.5px) brightness(0.75) opacity(0.5)'; + top.document.documentElement.style.cursor = 'wait'; + top.document.documentElement.style.pointerEvents = 'none'; + } catch (error) {} + top.location.href = __webmin_webprefix__ + "/switch_theme.cgi?theme=" + theme + ""; + } + }); +})(); diff --git a/web-lib-funcs.pl b/web-lib-funcs.pl index 3b43f9004..89c75527a 100755 --- a/web-lib-funcs.pl +++ b/web-lib-funcs.pl @@ -1119,6 +1119,7 @@ my $text = defined($tconfig{'cs_text'}) ? $tconfig{'cs_text'} : my $bgimage = defined($tconfig{'bgimage'}) ? "background=$tconfig{'bgimage'}" : ""; my $dir = $current_lang_info->{'dir'} ? "dir=\"$current_lang_info->{'dir'}\"" : ""; my $html_body = "\n"; +print &ui_switch_theme_javascript(); $html_body =~ s/\s+\>/>/g; print $html_body; print "\n"; @@ -4449,10 +4450,16 @@ Returns the version of Webmin currently being run, such as 1.450. =cut sub get_webmin_version { +my ($str) = @_; if (!$get_webmin_version) { $get_webmin_version = &read_file_contents("$root_directory/version"); $get_webmin_version =~ s/\r|\n//g; } +if ($str) { + my $get_webmin_version_str = $get_webmin_version; + $get_webmin_version_str =~ s/\.//g; + return $get_webmin_version_str; + } return $get_webmin_version; } From 5c54c614e3699291305929ca3b8ff28a9bf7f1c9 Mon Sep 17 00:00:00 2001 From: Ilia Ross Date: Fri, 29 Sep 2023 03:40:32 +0300 Subject: [PATCH 02/11] Fix comments to update hotkeys --- unauthenticated/switch_theme.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/unauthenticated/switch_theme.js b/unauthenticated/switch_theme.js index fc670ef41..8ac18b3c2 100644 --- a/unauthenticated/switch_theme.js +++ b/unauthenticated/switch_theme.js @@ -1,7 +1,7 @@ (function () { let firstCombinationPressed = false; document.addEventListener("keydown", function (event) { - // Check for Ctrl+Alt+Shift+0 + // Check for Ctrl+Alt+T or Control+Option+T if (event.ctrlKey && event.altKey && event.keyCode === 84) { firstCombinationPressed = true; @@ -13,8 +13,11 @@ if (firstCombinationPressed && event.shiftKey && (event.keyCode === 65 || event.keyCode === 71 || event.keyCode === 76)) { const theme = + // Shift + A : Authentic theme event.keyCode === 65 ? 1 : + // Shift + G : Gray theme event.keyCode === 71 ? 2 : + // Shift + L : Legacy theme. event.keyCode === 76 ? 3 : null; firstCombinationPressed = false; try { From 9a1e869a82596dcc8bf9cac79e40f705c8e1f41c Mon Sep 17 00:00:00 2001 From: Ilia Ross Date: Fri, 29 Sep 2023 12:56:23 +0300 Subject: [PATCH 03/11] Fix to only enable theme switcher in debug mode --- switch_theme.cgi | 3 +++ ui-lib.pl | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/switch_theme.cgi b/switch_theme.cgi index dfe3dc00a..57249c694 100755 --- a/switch_theme.cgi +++ b/switch_theme.cgi @@ -12,6 +12,9 @@ my $err = sub { print("Cannot change theme : $_[0]\n"); exit(1); }; +# Check if in debug mode +&$err("Debug mode is not enabled!") + if (!$gconfig{'error_stack'} && !$gconfig{'debug_enabled'}); # Check if allowed to change theme, # otherwise throw an error if (!&foreign_available('theme') && diff --git a/ui-lib.pl b/ui-lib.pl index d427dba16..cf20d407d 100755 --- a/ui-lib.pl +++ b/ui-lib.pl @@ -2299,7 +2299,8 @@ Hotkeys are: sub ui_switch_theme_javascript { return &theme_ui_switch_theme_javascript(@_) if (defined(&theme_ui_switch_theme_javascript)); -my $switch_script = ""; +return "" if (!$gconfig{'error_stack'} && !$gconfig{'debug_enabled'}); +my $switch_script = "\n"; $switch_script .= "\n"; return $switch_script; } From 3a099fabecd84188417d02d6e3b916846931798e Mon Sep 17 00:00:00 2001 From: Ilia Ross Date: Fri, 29 Sep 2023 15:32:07 +0300 Subject: [PATCH 04/11] Fix to consider stand alone option as well --- switch_theme.cgi | 4 +++- ui-lib.pl | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/switch_theme.cgi b/switch_theme.cgi index 57249c694..10c124c9a 100755 --- a/switch_theme.cgi +++ b/switch_theme.cgi @@ -14,7 +14,9 @@ my $err = sub { }; # Check if in debug mode &$err("Debug mode is not enabled!") - if (!$gconfig{'error_stack'} && !$gconfig{'debug_enabled'}); + if (!$gconfig{'error_stack'} && + !$gconfig{'debug_enabled'} && + !$gconfig{'debug_theme_switcher'}); # Check if allowed to change theme, # otherwise throw an error if (!&foreign_available('theme') && diff --git a/ui-lib.pl b/ui-lib.pl index cf20d407d..c72e3c95e 100755 --- a/ui-lib.pl +++ b/ui-lib.pl @@ -2299,7 +2299,7 @@ Hotkeys are: sub ui_switch_theme_javascript { return &theme_ui_switch_theme_javascript(@_) if (defined(&theme_ui_switch_theme_javascript)); -return "" if (!$gconfig{'error_stack'} && !$gconfig{'debug_enabled'}); +return "" if (!$gconfig{'error_stack'} && !$gconfig{'debug_enabled'} && !$gconfig{'debug_theme_switcher'}); my $switch_script = "\n"; $switch_script .= "\n"; return $switch_script; From 6b935f980c126ceeaa5266f324d80644611b2bee Mon Sep 17 00:00:00 2001 From: Ilia Ross Date: Sun, 1 Oct 2023 14:36:56 +0300 Subject: [PATCH 05/11] Fix to use ACL `modify_user` to change theme https://github.com/webmin/webmin/pull/2013#discussion_r1342020745 --- switch_theme.cgi | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/switch_theme.cgi b/switch_theme.cgi index 10c124c9a..eeed9efcd 100755 --- a/switch_theme.cgi +++ b/switch_theme.cgi @@ -37,11 +37,10 @@ my $themes = { '3' => '' }; my $theme = $themes->{$in{'theme'}}; # Change the theme -$gconfig{"theme_$remote_user"} = $theme; -&write_file("$config_directory/config", \%gconfig); -my %miniserv; -&get_miniserv_config(\%miniserv); -$miniserv{"preroot_$remote_user"} = $theme; -&put_miniserv_config(\%miniserv); +&foreign_require('acl'); +my @users = &acl::list_users(); +my ($user) = grep { $_->{'name'} eq $remote_user } @users; +$user->{'theme'} = $theme; +&acl::modify_user($user->{'name'}, $user); &restart_miniserv(); &redirect(&get_webprefix() . "/"); From 9d360f1c24d6d9b81c058b49f59036dc39aa298b Mon Sep 17 00:00:00 2001 From: Ilia Ross Date: Sun, 1 Oct 2023 21:34:50 +0300 Subject: [PATCH 06/11] Fix not to enable on `error_stack` option --- switch_theme.cgi | 3 +-- ui-lib.pl | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/switch_theme.cgi b/switch_theme.cgi index eeed9efcd..68d6ca4fe 100755 --- a/switch_theme.cgi +++ b/switch_theme.cgi @@ -14,8 +14,7 @@ my $err = sub { }; # Check if in debug mode &$err("Debug mode is not enabled!") - if (!$gconfig{'error_stack'} && - !$gconfig{'debug_enabled'} && + if (!$gconfig{'debug_enabled'} && !$gconfig{'debug_theme_switcher'}); # Check if allowed to change theme, # otherwise throw an error diff --git a/ui-lib.pl b/ui-lib.pl index c72e3c95e..ed009a962 100755 --- a/ui-lib.pl +++ b/ui-lib.pl @@ -2299,7 +2299,7 @@ Hotkeys are: sub ui_switch_theme_javascript { return &theme_ui_switch_theme_javascript(@_) if (defined(&theme_ui_switch_theme_javascript)); -return "" if (!$gconfig{'error_stack'} && !$gconfig{'debug_enabled'} && !$gconfig{'debug_theme_switcher'}); +return "" if (!$gconfig{'debug_enabled'} && !$gconfig{'debug_theme_switcher'}); my $switch_script = "\n"; $switch_script .= "\n"; return $switch_script; From 51bdd0d07e4a2097659c93e429d18fa0cf43e077 Mon Sep 17 00:00:00 2001 From: Ilia Ross Date: Mon, 2 Oct 2023 21:14:18 +0300 Subject: [PATCH 07/11] Fix to remove old Webmin repo in `sources.list` file https://github.com/webmin/webmin/issues/1969#issuecomment-1742141240 --- setup-repos-nightly.sh | 8 +++++++- setup-repos.sh | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/setup-repos-nightly.sh b/setup-repos-nightly.sh index 6251b6ad7..5d9e05358 100644 --- a/setup-repos-nightly.sh +++ b/setup-repos-nightly.sh @@ -3,7 +3,8 @@ # setup-repos-nightly.sh # Configures Webmin development repository for RHEL and Debian systems (derivatives) -webmin_download="https://download.webmin.com" +webmin_host="download.webmin.com" +webmin_download="https://$webmin_host" webmin_download_nightly="https://builds.webmin.dev" webmin_key="developers-key.asc" webmin_key_download="$webmin_download/$webmin_key" @@ -163,11 +164,16 @@ rpm) echo " .. done" ;; deb) + # Remove our keys + rm -f "/usr/share/keyrings/debian-$webmin_key_suffix.gpg" "/usr/share/keyrings/$repoid_debian_like-$webmin_key_suffix.gpg" # Install our keys echo " Installing Webmin key .." gpg --import $webmin_key 1>/dev/null 2>&1 cat $webmin_key | gpg --dearmor > "/usr/share/keyrings/$repoid_debian_like-$webmin_key_suffix.gpg" echo " .. done" + # Remove Webmin repo from sources.list + sources_list=$(grep -v "$webmin_host" /etc/apt/sources.list) + echo "$sources_list" > /etc/apt/sources.list # Create repo file echo " Setting up Webmin development repository .." echo "deb [signed-by=/usr/share/keyrings/$repoid_debian_like-$webmin_key_suffix.gpg] $webmin_download_nightly ./" >$debian_repo_file diff --git a/setup-repos.sh b/setup-repos.sh index d8cb64346..84d1d0d02 100755 --- a/setup-repos.sh +++ b/setup-repos.sh @@ -3,7 +3,8 @@ # setup-repos.sh # Configures Webmin repository for RHEL and Debian systems (derivatives) -webmin_download="https://download.webmin.com" +webmin_host="download.webmin.com" +webmin_download="https://$webmin_host" webmin_key="developers-key.asc" webmin_key_download="$webmin_download/$webmin_key" webmin_key_suffix="webmin-developers" @@ -159,11 +160,16 @@ rpm) echo " .. done" ;; deb) + # Remove our keys + rm -f "/usr/share/keyrings/debian-$webmin_key_suffix.gpg" "/usr/share/keyrings/$repoid_debian_like-$webmin_key_suffix.gpg" # Install our keys echo " Installing Webmin key .." gpg --import $webmin_key 1>/dev/null 2>&1 cat $webmin_key | gpg --dearmor > "/usr/share/keyrings/$repoid_debian_like-$webmin_key_suffix.gpg" echo " .. done" + # Remove Webmin repo from sources.list + sources_list=$(grep -v "$webmin_host" /etc/apt/sources.list) + echo "$sources_list" > /etc/apt/sources.list # Create repo file echo " Setting up Webmin repository .." echo "deb [signed-by=/usr/share/keyrings/$repoid_debian_like-$webmin_key_suffix.gpg] $webmin_download/download/newkey/repository stable contrib" >$debian_repo_file From e087bb718c828cc4075308e586366bbae39d4340 Mon Sep 17 00:00:00 2001 From: Ilia Ross Date: Tue, 3 Oct 2023 18:55:38 +0300 Subject: [PATCH 08/11] Add support for bullet list hotkey --- html-editor-lib.pl | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/html-editor-lib.pl b/html-editor-lib.pl index 6c00b0b6d..9abe0088e 100644 --- a/html-editor-lib.pl +++ b/html-editor-lib.pl @@ -277,24 +277,36 @@ my $html_editor_init_script = theme: 'snow' }); - // Google Mail editor like keybind for quoting + // Google Mail like key bind for creating bullet list (Ctrl+Shift+8) editor.keyboard.addBinding({ - key: '9', - shiftKey: true, - ctrlKey: !isMac, - metaKey: isMac, - format: ['blockquote'], + key: '8', + shiftKey: true, + ctrlKey: !isMac, + metaKey: isMac, }, function(range, context) { - this.quill.format('blockquote', false); + const currentFormat = this.quill.getFormat(range.index); + if (currentFormat.list === 'bullet') { + this.quill.format('list', false); + } else { + this.quill.format('list', 'bullet'); + } }); + + // Google Mail like key bind for creating blockquote (Ctrl+Shift+9) editor.keyboard.addBinding({ - key: '9', - shiftKey: true, - ctrlKey: !isMac, - metaKey: isMac, + key: '9', + shiftKey: true, + ctrlKey: !isMac, + metaKey: isMac, }, function(range, context) { - this.quill.format('blockquote', true); + const currentFormat = this.quill.getFormat(range.index); + if (currentFormat.blockquote) { + this.quill.format('blockquote', false); + } else { + this.quill.format('blockquote', true); + } }); + editor.on('text-change', function() { // This should most probably go to onSubmit event targ.value = editor.root.innerHTML + "
"; From 2c325b1ee41f9b1e2632e8d3750ab89f8ae4fb02 Mon Sep 17 00:00:00 2001 From: Ilia Ross Date: Tue, 3 Oct 2023 19:04:29 +0300 Subject: [PATCH 09/11] Add support for numbered list hotkey --- html-editor-lib.pl | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/html-editor-lib.pl b/html-editor-lib.pl index 9abe0088e..1b4e4b4fd 100644 --- a/html-editor-lib.pl +++ b/html-editor-lib.pl @@ -277,6 +277,21 @@ my $html_editor_init_script = theme: 'snow' }); + // Google Mail like key bind for creating numbered list (Ctrl+Shift+7) + editor.keyboard.addBinding({ + key: '7', + shiftKey: true, + ctrlKey: !isMac, + metaKey: isMac, + }, function(range, context) { + const currentFormat = this.quill.getFormat(range.index); + if (currentFormat.list === 'ordered') { + this.quill.format('list', false); + } else { + this.quill.format('list', 'ordered'); + } + }); + // Google Mail like key bind for creating bullet list (Ctrl+Shift+8) editor.keyboard.addBinding({ key: '8', From 5114308d0df57f65261b421c4385582b9e15a002 Mon Sep 17 00:00:00 2001 From: Ilia Ross Date: Wed, 4 Oct 2023 00:51:49 +0300 Subject: [PATCH 10/11] Fix to never double escape HTML in display --- ui-lib.pl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui-lib.pl b/ui-lib.pl index ed009a962..e2fe3b27e 100755 --- a/ui-lib.pl +++ b/ui-lib.pl @@ -2804,8 +2804,8 @@ if (defined(&theme_ui_details)) { my $rv; if (!$c->{'html'}) { - $c->{'title'} = &html_escape($c->{'title'}); - $c->{'content'} = &html_escape($c->{'content'}); + $c->{'title'} = &html_escape($c->{'title'}, 1); + $c->{'content'} = &html_escape($c->{'content'}, 1); } $c->{'class'} = " class=\"@{["e_escape($c->{'class'})]}\"" if($c->{'class'}); $o = ' open' if ($o); From 6ddde417287344cd97c252efac8a7620f08535b9 Mon Sep 17 00:00:00 2001 From: Ilia Ross Date: Wed, 4 Oct 2023 13:01:43 +0300 Subject: [PATCH 11/11] Revert "Wait a bit longer for DNS propogation" This reverts commit 45845b8ca60e654cce999e5b5d7a4f63b0f5fe8e. --- webmin/config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webmin/config b/webmin/config index f234f3653..f5633e845 100644 --- a/webmin/config +++ b/webmin/config @@ -5,6 +5,6 @@ updays=1 cron_mode=0 osdn=1 warn_days=7 -letsencrypt_dns_wait=30 +letsencrypt_dns_wait=10 letsencrypt_algo=rsa letsencrypt_reuse=1 \ No newline at end of file