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:
Tim Abbott
2020-02-28 00:55:29 -08:00
parent 7db3d4560f
commit d79a7a8c35
6 changed files with 40 additions and 1 deletions

View File

@@ -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']"));

View File

@@ -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') }}">&times;</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">

View File

@@ -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'))

View File

@@ -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",

View File

@@ -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

View File

@@ -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,