From ac87cbff814ee763d9fbcdda039257f769216743 Mon Sep 17 00:00:00 2001 From: Merci Jacob Date: Fri, 21 Nov 2025 21:56:45 +0200 Subject: [PATCH 01/10] feat(frontend/backend): alert end users when are potential upgrades available --- lib/framework.php | 1 + lib/version.php | 28 ++++++++++++++++++++++++++++ modules/account/setup.php | 4 ++-- modules/calendar/setup.php | 4 ++-- modules/core/functions.php | 1 + modules/core/output_modules.php | 15 +++++++++++++++ modules/core/setup.php | 6 +++--- modules/highlights/setup.php | 4 ++-- modules/history/setup.php | 2 +- modules/imap_folders/setup.php | 4 ++-- modules/keyboard_shortcuts/setup.php | 2 +- modules/nasa/setup.php | 2 +- modules/pgp/setup.php | 2 +- modules/profiles/setup.php | 2 +- modules/recover_settings/setup.php | 2 +- modules/sievefilters/setup.php | 4 ++-- modules/smtp/setup.php | 2 +- modules/tags/setup.php | 2 +- 18 files changed, 66 insertions(+), 21 deletions(-) create mode 100644 lib/version.php diff --git a/lib/framework.php b/lib/framework.php index d4a860016a..6c62b151b0 100644 --- a/lib/framework.php +++ b/lib/framework.php @@ -37,6 +37,7 @@ require APP_PATH.'lib/api.php'; require APP_PATH.'lib/webdav_formats.php'; require APP_PATH.'lib/js_libs.php'; +require APP_PATH.'lib/version.php'; require_once APP_PATH.'modules/core/functions.php'; diff --git a/lib/version.php b/lib/version.php new file mode 100644 index 0000000000..a905194428 --- /dev/null +++ b/lib/version.php @@ -0,0 +1,28 @@ +out('formatted_message_list', $messageList); } } + +class Hm_Output_version_upgrade_checker extends Hm_Output_Module { + protected function output() + { + // if (! CYPHT_NEED_UPGRADE) return ''; + + return ' + + '; + } +} diff --git a/modules/core/setup.php b/modules/core/setup.php index 9a43f790db..5c9844ed24 100644 --- a/modules/core/setup.php +++ b/modules/core/setup.php @@ -14,13 +14,13 @@ /* homepage */ setup_base_page('home'); add_handler('home', 'check_missing_passwords', true, 'core', 'load_user_data', 'after'); -add_output('home', 'home_heading', true, 'core', 'content_section_start', 'after'); +add_output('home', 'home_heading', true, 'core', 'version_upgrade_checker', 'after'); add_output('home', 'home_password_dialogs', true, 'core', 'home_heading', 'after'); /* servers page */ setup_base_page('servers'); add_handler('servers', 'reload_folder_cookie', true, 'core', 'save_user_data', 'after'); -add_output('servers', 'server_content_start', true, 'core', 'content_section_start', 'after'); +add_output('servers', 'server_content_start', true, 'core', 'version_upgrade_checker', 'after'); add_output('servers', 'server_config_stepper', true, 'core', 'server_content_start', 'after'); add_output('servers', 'server_config_stepper_end_part', true, 'core', 'server_config_stepper', 'after'); add_output('servers', 'server_config_stepper_accordion_end_part', true, 'core', 'server_config_stepper_end_part', 'after'); @@ -32,7 +32,7 @@ /* save settings */ setup_base_page('save'); add_handler('save', 'process_save_form', true, 'core', 'load_user_data', 'after'); -add_output('save', 'save_form', true, 'core', 'content_section_start', 'after'); +add_output('save', 'save_form', true, 'core', 'version_upgrade_checker', 'after'); /* settings */ setup_base_page('settings'); diff --git a/modules/highlights/setup.php b/modules/highlights/setup.php index fa341e5916..1db3e8775a 100644 --- a/modules/highlights/setup.php +++ b/modules/highlights/setup.php @@ -9,10 +9,10 @@ add_handler('highlights', 'load_feeds_from_config', true, 'feeds', 'load_user_data', 'after'); add_handler('highlights', 'highlight_process_form', true, 'highlights', 'language', 'after'); add_handler('highlights', 'highlight_page_data', true, 'highlights', 'highlight_process_form', 'after'); -add_output('highlights', 'highlight_config_page', true, 'highlights', 'content_section_start', 'after'); +add_output('highlights', 'highlight_config_page', true, 'highlights', 'version_upgrade_checker', 'after'); add_handler('message_list', 'highlight_list_data', true, 'highlights', 'load_user_data', 'after'); -add_output('message_list', 'highlight_css', true, 'highlights', 'content_section_start', 'before'); +add_output('message_list', 'highlight_css', true, 'highlights', 'version_upgrade_checker', 'before'); add_output('ajax_hm_folders', 'highlight_link', true, 'highlights', 'settings_save_link', 'after'); diff --git a/modules/history/setup.php b/modules/history/setup.php index 7423b65876..6aeb53efe9 100644 --- a/modules/history/setup.php +++ b/modules/history/setup.php @@ -5,7 +5,7 @@ setup_base_page('history', 'core'); add_handler('history', 'load_message_history', true, 'history', 'save_user_data', 'before'); -add_output('history', 'history_heading', true, 'history', 'content_section_start', 'after'); +add_output('history', 'history_heading', true, 'history', 'version_upgrade_checker', 'after'); add_output('history', 'history_content', true, 'history', 'history_heading', 'after'); add_output('history', 'history_footer', true, 'history', 'history_content', 'after'); diff --git a/modules/imap_folders/setup.php b/modules/imap_folders/setup.php index e803c2001f..16911a3721 100644 --- a/modules/imap_folders/setup.php +++ b/modules/imap_folders/setup.php @@ -16,7 +16,7 @@ setup_base_page('folders', 'core'); add_handler('folders', 'folders_server_id', true, 'imap_folders', 'load_user_data', 'after'); add_handler('folders', 'special_folders', true, 'imap_folders', 'folders_server_id', 'after'); -add_output('folders', 'folders_content_start', true, 'imap_folders', 'content_section_start', 'after'); +add_output('folders', 'folders_content_start', true, 'imap_folders', 'version_upgrade_checker', 'after'); add_output('folders', 'folders_server_select', true, 'imap_folders', 'folders_folder_subscription_button', 'after'); add_output('folders', 'folders_create_dialog', true, 'imap_folders', 'folders_server_select', 'after'); add_output('folders', 'folders_rename_dialog', true, 'imap_folders', 'folders_create_dialog', 'after'); @@ -79,7 +79,7 @@ add_handler('folders_subscription', 'folders_server_id', true, 'imap_folders', 'load_user_data', 'after'); add_handler('folders_subscription', 'special_folders', true, 'imap_folders', 'folders_server_id', 'after'); add_handler('folders_subscription', 'get_only_subscribed_folders_setting', true, 'imap_folders'); -add_output('folders_subscription', 'folders_subscription_content_start', true, 'imap_folders', 'content_section_start', 'after'); +add_output('folders_subscription', 'folders_subscription_content_start', true, 'imap_folders', 'version_upgrade_checker', 'after'); add_output('folders_subscription', 'folders_server_select', true, 'imap_folders', 'folders_subscription_content_start', 'after'); add_output('folders_subscription', 'folders_folder_subscription', true, 'imap_folders', 'folders_server_select', 'after'); diff --git a/modules/keyboard_shortcuts/setup.php b/modules/keyboard_shortcuts/setup.php index b690dafe90..62edb6510a 100644 --- a/modules/keyboard_shortcuts/setup.php +++ b/modules/keyboard_shortcuts/setup.php @@ -8,7 +8,7 @@ setup_base_page('shortcuts', 'core'); add_handler('shortcuts', 'load_edit_id', true, 'keyboard_shortcuts', 'load_keyboard_shortcuts', 'after'); add_handler('shortcuts', 'process_edit_shortcut', true, 'keyboard_shortcuts', 'load_edit_id', 'after'); -add_output('shortcuts', 'start_shortcuts_page', true, 'keyboard_shortcuts', 'content_section_start', 'after'); +add_output('shortcuts', 'start_shortcuts_page', true, 'keyboard_shortcuts', 'version_upgrade_checker', 'after'); add_output('shortcuts', 'shortcut_edit_form', true, 'keyboard_shortcuts', 'start_shortcuts_page', 'after'); add_output('shortcuts', 'shortcuts_content', true, 'keyboard_shortcuts', 'shortcut_edit_form', 'after'); diff --git a/modules/nasa/setup.php b/modules/nasa/setup.php index 36b76db271..5c8a7d8a51 100644 --- a/modules/nasa/setup.php +++ b/modules/nasa/setup.php @@ -8,7 +8,7 @@ /* APOD display */ setup_base_page('nasa_apod', 'core'); add_handler('nasa_apod', 'fetch_apod_content', true, 'nasa', 'http_headers', 'after'); -add_output('nasa_apod', 'apod_content', true, 'nasa', 'content_section_start', 'after'); +add_output('nasa_apod', 'apod_content', true, 'nasa', 'version_upgrade_checker', 'after'); /* folder list entry */ add_handler('ajax_hm_folders', 'nasa_folder_data', true, 'nasa', 'load_user_data', 'after'); diff --git a/modules/pgp/setup.php b/modules/pgp/setup.php index 1658f26a5c..510ea3c0f1 100644 --- a/modules/pgp/setup.php +++ b/modules/pgp/setup.php @@ -9,7 +9,7 @@ add_handler('pgp', 'pgp_delete_public_key', true, 'pgp', 'http_headers', 'after'); add_handler('pgp', 'pgp_import_public_key', true, 'pgp', 'pgp_delete_public_key', 'after'); add_handler('pgp', 'load_pgp_data', true, 'pgp', 'pgp_import_public_key', 'after'); -add_output('pgp', 'pgp_settings_start', true, 'pgp', 'content_section_start', 'after'); +add_output('pgp', 'pgp_settings_start', true, 'pgp', 'version_upgrade_checker', 'after'); add_output('pgp', 'pgp_settings_public_keys', true, 'pgp', 'pgp_settings_start', 'after'); add_output('pgp', 'pgp_settings_private_key', true, 'pgp', 'pgp_settings_public_keys', 'after'); add_output('pgp', 'pgp_settings_end', true, 'pgp', 'pgp_settings_private_key', 'after'); diff --git a/modules/profiles/setup.php b/modules/profiles/setup.php index ea8c0da243..9026f2418c 100644 --- a/modules/profiles/setup.php +++ b/modules/profiles/setup.php @@ -11,7 +11,7 @@ add_handler('profiles', 'profile_edit_data', true, 'profiles', 'profile_data', 'after'); add_handler('profiles', 'process_profile_delete', true, 'profiles', 'profile_data', 'after'); add_handler('profiles', 'process_profile_update', true, 'profiles', 'process_profile_delete', 'after'); -add_output('profiles', 'profile_edit_form', true, 'profiles', 'content_section_start', 'after'); +add_output('profiles', 'profile_edit_form', true, 'profiles', 'version_upgrade_checker', 'after'); add_output('profiles', 'profile_content', true, 'profiles', 'profile_edit_form', 'after'); add_handler('folders', 'load_default_server_from_profiles', true, 'profiles', 'folders_server_id', 'before'); diff --git a/modules/recover_settings/setup.php b/modules/recover_settings/setup.php index 752e46572d..22ad1b50a1 100644 --- a/modules/recover_settings/setup.php +++ b/modules/recover_settings/setup.php @@ -8,7 +8,7 @@ setup_base_page('recover_settings', 'core'); add_handler('recover_settings', 'reload_folder_cookie', true, 'core', 'save_user_data', 'after'); add_handler('recover_settings', 'process_recover_settings_form', true, 'recover_settings', 'load_user_data', 'after'); -add_output('recover_settings', 'recover_settings_page', true, 'recover_settings', 'content_section_start', 'after'); +add_output('recover_settings', 'recover_settings_page', true, 'recover_settings', 'version_upgrade_checker', 'after'); add_module_to_all_pages('handler', 'check_for_lost_settings', true, 'recover_settings', 'load_user_data', 'after'); add_handler('ajax_hm_folders', 'check_for_lost_settings', true, 'recover_settings', 'load_user_data', 'after'); diff --git a/modules/sievefilters/setup.php b/modules/sievefilters/setup.php index 7f22bdc6be..7b23ed81ef 100644 --- a/modules/sievefilters/setup.php +++ b/modules/sievefilters/setup.php @@ -18,7 +18,7 @@ add_handler('ajax_imap_debug', 'sieve_connect', true, 'imap', 'imap_connect', 'after'); // sieve filter -add_output('sieve_filters', 'sievefilters_settings_start', true, 'sievefilters', 'content_section_start', 'after'); +add_output('sieve_filters', 'sievefilters_settings_start', true, 'sievefilters', 'version_upgrade_checker', 'after'); add_output('ajax_hm_folders', 'sievefilters_settings_link', true, 'sievefilters', 'settings_menu_end', 'before'); setup_base_ajax_page('ajax_account_sieve_filters', 'core'); add_handler('ajax_account_sieve_filters', 'settings_load_imap', true, 'sievefilters', 'load_user_data', 'after'); @@ -28,7 +28,7 @@ add_output('ajax_account_sieve_filters', 'check_filter_status', true, 'sievefilters'); // block list -add_output('block_list', 'blocklist_settings_start', true, 'sievefilters', 'content_section_start', 'after'); +add_output('block_list', 'blocklist_settings_start', true, 'sievefilters', 'version_upgrade_checker', 'after'); setup_base_ajax_page('ajax_block_account_sieve_filters', 'core'); add_handler('ajax_block_account_sieve_filters', 'settings_load_imap', true, 'sievefilters', 'load_user_data', 'after'); add_handler('ajax_block_account_sieve_filters', 'load_behaviour', true, 'sievefilters', 'settings_load_imap', 'after'); diff --git a/modules/smtp/setup.php b/modules/smtp/setup.php index c7659a4c8a..60cd8f4c08 100644 --- a/modules/smtp/setup.php +++ b/modules/smtp/setup.php @@ -13,7 +13,7 @@ add_handler('compose', 'load_smtp_servers_from_config', true, 'smtp', 'load_smtp_reply_to_details', 'after'); add_handler('compose', 'add_smtp_servers_to_page_data', true, 'smtp', 'load_smtp_servers_from_config', 'after'); add_handler('compose', 'process_compose_form_submit', true, 'smtp', 'load_smtp_servers_from_config', 'after'); -add_output('compose', 'compose_title', true, 'smtp', 'content_section_start', 'after'); +add_output('compose', 'compose_title', true, 'smtp', 'version_upgrade_checker', 'after'); add_output('compose', 'compose_form_start', true, 'smtp', 'compose_title', 'after'); add_output('compose', 'compose_form_draft_list', true, 'smtp', 'compose_form_start', 'before'); add_output('compose', 'compose_form_content', true, 'smtp', 'compose_form_start', 'after'); diff --git a/modules/tags/setup.php b/modules/tags/setup.php index 03203ed5cd..8845578949 100644 --- a/modules/tags/setup.php +++ b/modules/tags/setup.php @@ -6,7 +6,7 @@ output_source('tags'); setup_base_page('tags'); -add_output('tags', 'tags_heading', true, 'core', 'content_section_start', 'after'); +add_output('tags', 'tags_heading', true, 'core', 'version_upgrade_checker', 'after'); add_output('tags', 'tags_tree', true, 'core', 'tags_heading', 'after'); add_output('tags', 'tags_form', true, 'core', 'tags_tree', 'after'); From 94ba7358e4c94e562010fc959d8bf8b5578925a5 Mon Sep 17 00:00:00 2001 From: Merci Jacob Date: Sat, 22 Nov 2025 20:39:46 +0200 Subject: [PATCH 02/10] refactor the version checker to fetch all releases from a remote (github) to ensure accuracy in the alerts TODO: - allow users to hide the alert for the session lifetime --- lib/version.php | 28 +++++++--------------- modules/advanced_search/setup.php | 2 +- modules/core/output_modules.php | 4 ++-- releases.json | 39 +++++++++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 23 deletions(-) create mode 100644 releases.json diff --git a/lib/version.php b/lib/version.php index a905194428..9e53ff11ae 100644 --- a/lib/version.php +++ b/lib/version.php @@ -1,28 +1,16 @@ - You are currently running Cypht version '.CYPHT_VERSION.'. A higher version is available. Please visit GitHub Releases for the full list of available versions. + You are currently running Cypht version '.CYPHT_VERSION.'. A higher version ('.CYPHT_LATEST_VERSION.') is available. '; diff --git a/releases.json b/releases.json new file mode 100644 index 0000000000..ef27b23262 --- /dev/null +++ b/releases.json @@ -0,0 +1,39 @@ +{ + "release": [ + { "version": "1.0.0-rc1", "type": "beta" }, + { "version": "1.0.0-rc2", "type": "beta" }, + { "version": "1.0.0-rc3", "type": "beta" }, + { "version": "1.0.0-rc4", "type": "beta" }, + { "version": "1.0.0-rc5", "type": "beta" }, + { "version": "1.0.0-rc6", "type": "beta" }, + { "version": "1.0.0-rc7", "type": "beta" }, + { "version": "1.0.0-rc8", "type": "beta" }, + { "version": "1.0.0", "type": "stable" }, + { "version": "1.1.0-rc1", "type": "beta" }, + { "version": "1.1.0-rc2", "type": "beta" }, + { "version": "1.1.0-rc3", "type": "beta" }, + { "version": "1.1.0-rc4", "type": "beta" }, + { "version": "1.1.0", "type": "stable" }, + { "version": "1.3.0-rc1", "type": "beta" }, + { "version": "1.3.0-rc2", "type": "beta" }, + { "version": "1.3.0-rc3", "type": "beta" }, + { "version": "1.3.0", "type": "stable" }, + { "version": "1.4.0", "type": "stable" }, + { "version": "1.4.1", "type": "stable" }, + { "version": "1.4.2", "type": "stable" }, + { "version": "1.4.3", "type": "stable" }, + { "version": "2.0.0", "type": "stable" }, + { "version": "2.0.1", "type": "stable" }, + { "version": "2.1.0", "type": "stable" }, + { "version": "1.4.4", "type": "stable" }, + { "version": "2.2.0", "type": "stable" }, + { "version": "2.3.0", "type": "stable" }, + { "version": "2.4.0", "type": "stable" }, + { "version": "1.4.5", "type": "stable" }, + { "version": "1.4.6", "type": "stable" }, + { "version": "2.4.1", "type": "stable" }, + { "version": "2.4.2", "type": "stable" }, + { "version": "2.5.0", "type": "stable" }, + { "version": "2.5.1", "type": "stable" } + ] +} \ No newline at end of file From 6a47daa52d1136814e6126c4f550523005799cba Mon Sep 17 00:00:00 2001 From: Merci Jacob Date: Sun, 23 Nov 2025 16:05:46 +0200 Subject: [PATCH 03/10] allow users to hide the alert for the session lifetime --- modules/core/output_modules.php | 2 +- modules/core/site.js | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/core/output_modules.php b/modules/core/output_modules.php index a7032e1ccc..da21776f96 100644 --- a/modules/core/output_modules.php +++ b/modules/core/output_modules.php @@ -2512,7 +2512,7 @@ protected function output() if (! CYPHT_NEED_UPGRADE) return ''; return ' -