mirror of
https://github.com/zulip/zulip.git
synced 2025-11-04 22:13:26 +00:00
panels: Show a banner for users with legacy desktop apps.
Users who are using ZulipDesktop or haven't managed to auto-update to ZulipElectron should be strongly encouraged to upgrade. We'll likely want to move to something even stricter that blocks loading the app at all, but this is a good start.
This commit is contained in:
@@ -20,7 +20,9 @@ const get_step = function ($process) {
|
|||||||
exports.initialize = function () {
|
exports.initialize = function () {
|
||||||
// if email has not been set up and the user is the admin, display a warning
|
// if email has not been set up and the user is the admin, display a warning
|
||||||
// to tell them to set up an email server.
|
// to tell them to set up an email server.
|
||||||
if (page_params.warn_no_email === true && page_params.is_admin) {
|
if (page_params.insecure_desktop_app) {
|
||||||
|
exports.open($("[data-process='insecure-desktop-app']"));
|
||||||
|
} else if (page_params.warn_no_email === true && page_params.is_admin) {
|
||||||
exports.open($("[data-process='email-server']"));
|
exports.open($("[data-process='email-server']"));
|
||||||
} else {
|
} else {
|
||||||
exports.open($("[data-process='notifications']"));
|
exports.open($("[data-process='notifications']"));
|
||||||
|
|||||||
@@ -26,6 +26,16 @@
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div data-process="insecure-desktop-app" class="alert alert-info red">
|
||||||
|
<span class="close" data-dismiss="alert" aria-label="{{ _('Close') }}">×</span>
|
||||||
|
<div data-step="1">
|
||||||
|
You are using an old, insecure version of the Zulip
|
||||||
|
desktop app that cannot auto-update.
|
||||||
|
<a class="alert-link" href="https://zulipchat.com/apps" target="_blank">
|
||||||
|
Download the latest version.
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="header">
|
<div class="header">
|
||||||
<nav class="header-main rightside-userlist" id="top_navbar">
|
<nav class="header-main rightside-userlist" id="top_navbar">
|
||||||
|
|||||||
@@ -91,3 +91,13 @@ class CompatibilityTest(ZulipTestCase):
|
|||||||
self.assert_json_error(result, "Client is too old")
|
self.assert_json_error(result, "Client is too old")
|
||||||
else:
|
else:
|
||||||
assert False # nocoverage
|
assert False # nocoverage
|
||||||
|
|
||||||
|
def test_insecure_desktop_app(self) -> None:
|
||||||
|
from zerver.views.compatibility import is_outdated_desktop_app
|
||||||
|
|
||||||
|
self.assertTrue(is_outdated_desktop_app('ZulipDesktop/0.5.2 (Mac)'))
|
||||||
|
self.assertTrue(is_outdated_desktop_app('ZulipElectron/2.3.82 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Zulip/2.3.82 Chrome/61.0.3163.100 Electron/2.0.9 Safari/537.36'))
|
||||||
|
self.assertFalse(is_outdated_desktop_app('ZulipElectron/4.0.0 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Zulip/4.0.3 Chrome/66.0.3359.181 Electron/3.1.10 Safari/537.36'))
|
||||||
|
self.assertFalse(is_outdated_desktop_app('ZulipElectron/4.0.3 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Zulip/4.0.3 Chrome/66.0.3359.181 Electron/3.1.10 Safari/537.36'))
|
||||||
|
|
||||||
|
self.assertFalse(is_outdated_desktop_app('Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'))
|
||||||
|
|||||||
@@ -91,6 +91,7 @@ class HomeTest(ZulipTestCase):
|
|||||||
"high_contrast_mode",
|
"high_contrast_mode",
|
||||||
"hotspots",
|
"hotspots",
|
||||||
"initial_servertime",
|
"initial_servertime",
|
||||||
|
"insecure_desktop_app",
|
||||||
"is_admin",
|
"is_admin",
|
||||||
"is_guest",
|
"is_guest",
|
||||||
"jitsi_server_url",
|
"jitsi_server_url",
|
||||||
|
|||||||
@@ -87,3 +87,17 @@ def check_global_compatibility(request: HttpRequest) -> HttpResponse:
|
|||||||
and version_lt(user_agent['version'], android_min_app_version)):
|
and version_lt(user_agent['version'], android_min_app_version)):
|
||||||
return json_error(legacy_compatibility_error_message)
|
return json_error(legacy_compatibility_error_message)
|
||||||
return json_success()
|
return json_success()
|
||||||
|
|
||||||
|
def is_outdated_desktop_app(user_agent_str: str) -> bool:
|
||||||
|
user_agent = parse_user_agent(user_agent_str)
|
||||||
|
if user_agent['name'] == 'ZulipDesktop':
|
||||||
|
# The deprecated QT/webkit based desktop app, last updated in ~2016.
|
||||||
|
return True
|
||||||
|
|
||||||
|
if user_agent['name'] == 'ZulipElectron' and version_lt(user_agent['version'], '4.0.0'):
|
||||||
|
# Versions of the modern Electron-based Zulip desktop app with
|
||||||
|
# known security issues. Versions before 2.3.82 won't
|
||||||
|
# auto-update; we may want a special notice to distinguish
|
||||||
|
# those from modern releases.
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ from zerver.lib.streams import access_stream_by_name
|
|||||||
from zerver.lib.subdomains import get_subdomain
|
from zerver.lib.subdomains import get_subdomain
|
||||||
from zerver.lib.users import compute_show_invites_and_add_streams
|
from zerver.lib.users import compute_show_invites_and_add_streams
|
||||||
from zerver.lib.utils import statsd, generate_random_token
|
from zerver.lib.utils import statsd, generate_random_token
|
||||||
|
from zerver.views.compatibility import is_outdated_desktop_app
|
||||||
from two_factor.utils import default_device
|
from two_factor.utils import default_device
|
||||||
|
|
||||||
import calendar
|
import calendar
|
||||||
@@ -227,6 +228,7 @@ def home_real(request: HttpRequest) -> HttpResponse:
|
|||||||
debug_mode = settings.DEBUG,
|
debug_mode = settings.DEBUG,
|
||||||
test_suite = settings.TEST_SUITE,
|
test_suite = settings.TEST_SUITE,
|
||||||
poll_timeout = settings.POLL_TIMEOUT,
|
poll_timeout = settings.POLL_TIMEOUT,
|
||||||
|
insecure_desktop_app = is_outdated_desktop_app(request.META["HTTP_USER_AGENT"]),
|
||||||
login_page = settings.HOME_NOT_LOGGED_IN,
|
login_page = settings.HOME_NOT_LOGGED_IN,
|
||||||
root_domain_uri = settings.ROOT_DOMAIN_URI,
|
root_domain_uri = settings.ROOT_DOMAIN_URI,
|
||||||
max_file_upload_size = settings.MAX_FILE_UPLOAD_SIZE,
|
max_file_upload_size = settings.MAX_FILE_UPLOAD_SIZE,
|
||||||
|
|||||||
Reference in New Issue
Block a user