compatibility: Add a compatibility check to api_get_server_settings.

This should make it convenient for the mobile app to present errors of
the form "Your Zulip app is not new enough for this Zulip server".
This commit is contained in:
Jack Zhang 2018-12-05 17:49:34 -08:00 committed by Tim Abbott
parent 8711fe7bae
commit be9b6a6dee
4 changed files with 23 additions and 7 deletions

View File

@ -1705,6 +1705,11 @@ paths:
type: boolean type: boolean
description: Whether mobile/push notifications are description: Whether mobile/push notifications are
enabled. enabled.
is_incompatible:
type: boolean
description: Whether the Zulip client that has sent a
request to this endpoint is deemed incompatible with
the server.
email_auth_enabled: email_auth_enabled:
type: boolean type: boolean
description: Setting for allowing users authenticate with description: Setting for allowing users authenticate with

View File

@ -1528,6 +1528,7 @@ class FetchAuthBackends(ZulipTestCase):
('password', check_bool), ('password', check_bool),
])), ])),
('email_auth_enabled', check_bool), ('email_auth_enabled', check_bool),
('is_incompatible', check_bool),
('require_email_format_usernames', check_bool), ('require_email_format_usernames', check_bool),
('realm_uri', check_string), ('realm_uri', check_string),
('zulip_version', check_string), ('zulip_version', check_string),
@ -1537,15 +1538,18 @@ class FetchAuthBackends(ZulipTestCase):
] + extra_fields) ] + extra_fields)
self.assert_on_error(checker("data", result.json())) self.assert_on_error(checker("data", result.json()))
result = self.client_get("/api/v1/server_settings", subdomain="") result = self.client_get("/api/v1/server_settings", subdomain="", HTTP_USER_AGENT="")
check_result(result)
result = self.client_get("/api/v1/server_settings", subdomain="", HTTP_USER_AGENT="ZulipInvalid")
self.assertTrue(result.json()["is_incompatible"])
with self.settings(ROOT_DOMAIN_LANDING_PAGE=False):
result = self.client_get("/api/v1/server_settings", subdomain="", HTTP_USER_AGENT="")
check_result(result) check_result(result)
with self.settings(ROOT_DOMAIN_LANDING_PAGE=False): with self.settings(ROOT_DOMAIN_LANDING_PAGE=False):
result = self.client_get("/api/v1/server_settings", subdomain="") result = self.client_get("/api/v1/server_settings", subdomain="zulip", HTTP_USER_AGENT="")
check_result(result)
with self.settings(ROOT_DOMAIN_LANDING_PAGE=False):
result = self.client_get("/api/v1/server_settings", subdomain="zulip")
check_result(result, [ check_result(result, [
('realm_name', check_string), ('realm_name', check_string),
('realm_description', check_string), ('realm_description', check_string),

View File

@ -31,6 +31,7 @@ from zerver.lib.push_notifications import push_notifications_enabled
from zerver.lib.request import REQ, has_request_variables, JsonableError from zerver.lib.request import REQ, has_request_variables, JsonableError
from zerver.lib.response import json_success, json_error from zerver.lib.response import json_success, json_error
from zerver.lib.subdomains import get_subdomain, is_subdomain_root_or_alias from zerver.lib.subdomains import get_subdomain, is_subdomain_root_or_alias
from zerver.lib.user_agent import parse_user_agent
from zerver.lib.users import get_api_key from zerver.lib.users import get_api_key
from zerver.lib.validator import validate_login_email from zerver.lib.validator import validate_login_email
from zerver.models import PreregistrationUser, UserProfile, remote_user_to_email, Realm, \ from zerver.models import PreregistrationUser, UserProfile, remote_user_to_email, Realm, \
@ -843,6 +844,10 @@ def api_get_auth_backends(request: HttpRequest) -> HttpResponse:
auth_backends['zulip_version'] = ZULIP_VERSION auth_backends['zulip_version'] = ZULIP_VERSION
return json_success(auth_backends) return json_success(auth_backends)
def check_server_incompatibility(request: HttpRequest) -> bool:
user_agent = parse_user_agent(request.META["HTTP_USER_AGENT"])
return user_agent['name'] == "ZulipInvalid"
@require_GET @require_GET
@csrf_exempt @csrf_exempt
def api_get_server_settings(request: HttpRequest) -> HttpResponse: def api_get_server_settings(request: HttpRequest) -> HttpResponse:
@ -850,6 +855,7 @@ def api_get_server_settings(request: HttpRequest) -> HttpResponse:
authentication_methods=get_auth_backends_data(request), authentication_methods=get_auth_backends_data(request),
zulip_version=ZULIP_VERSION, zulip_version=ZULIP_VERSION,
push_notifications_enabled=push_notifications_enabled(), push_notifications_enabled=push_notifications_enabled(),
is_incompatible=check_server_incompatibility(request),
) )
context = zulip_default_context(request) context = zulip_default_context(request)
# IMPORTANT NOTE: # IMPORTANT NOTE:

View File

@ -590,7 +590,8 @@ urls += [
urls += [ urls += [
# This json format view used by the mobile apps lists which # This json format view used by the mobile apps lists which
# authentication backends the server allows as well as details # authentication backends the server allows as well as details
# like the requested subdomains'd realm icon (if known). # like the requested subdomains'd realm icon (if known) and
# server-specific compatibility.
url(r'^api/v1/server_settings', zerver.views.auth.api_get_server_settings), url(r'^api/v1/server_settings', zerver.views.auth.api_get_server_settings),
# This is a deprecated old version of api/v1/server_settings that only returns auth backends. # This is a deprecated old version of api/v1/server_settings that only returns auth backends.
url(r'^api/v1/get_auth_backends', zerver.views.auth.api_get_auth_backends, url(r'^api/v1/get_auth_backends', zerver.views.auth.api_get_auth_backends,