push_notifs: Require ios_app_id on register at bouncer, too.

We'll need this information in order to properly direct APNs
notifications.  Happily, the Zulip server always sends it when
registering an APNs token; and it appears it always has done so
since the commit:

cddee49e7 Add support infrastructure for push notification bouncer service.

back in 2016.  So there's no compatibility issue from requiring it.
This commit is contained in:
Greg Price 2023-11-06 13:18:52 -08:00 committed by Tim Abbott
parent 9c2d53bcef
commit 1b2178f558
3 changed files with 33 additions and 0 deletions

View File

@ -27,6 +27,12 @@ format used by the Zulip server that they are interacting with.
Previously it defaulted to the server setting `ZULIP_IOS_APP_ID`, Previously it defaulted to the server setting `ZULIP_IOS_APP_ID`,
defaulting to "org.zulip.Zulip". defaulting to "org.zulip.Zulip".
* `POST /remotes/server/register`: The `ios_app_id` parameter is now
required when `kind` is 1, i.e. when registering an APNs token.
Previously it was ignored, and the push bouncer effectively
assumed its value was the server setting `APNS_TOPIC`,
defaulting to "org.zulip.Zulip".
**Feature level 222** **Feature level 222**
* [`GET /events`](/api/get-events): When a user is deactivated or * [`GET /events`](/api/get-events): When a user is deactivated or

View File

@ -500,6 +500,31 @@ class PushBouncerNotificationTest(BouncerTestCase):
401, 401,
) )
def test_register_require_ios_app_id(self) -> None:
endpoint = "/api/v1/remotes/push/register"
args = {"user_id": 11, "token": "1122"}
result = self.uuid_post(
self.server_uuid,
endpoint,
{**args, "token_kind": PushDeviceToken.APNS},
)
self.assert_json_error(result, "Missing ios_app_id")
result = self.uuid_post(
self.server_uuid,
endpoint,
{**args, "token_kind": PushDeviceToken.APNS, "ios_app_id": "example.app"},
)
self.assert_json_success(result)
result = self.uuid_post(
self.server_uuid,
endpoint,
{**args, "token_kind": PushDeviceToken.GCM},
)
self.assert_json_success(result)
def test_register_device_deduplication(self) -> None: def test_register_device_deduplication(self) -> None:
hamlet = self.example_user("hamlet") hamlet = self.example_user("hamlet")
token = "111222" token = "111222"

View File

@ -165,6 +165,8 @@ def register_remote_push_device(
ios_app_id: Optional[str] = REQ(default=None), ios_app_id: Optional[str] = REQ(default=None),
) -> HttpResponse: ) -> HttpResponse:
validate_bouncer_token_request(token, token_kind) validate_bouncer_token_request(token, token_kind)
if token_kind == RemotePushDeviceToken.APNS and ios_app_id is None:
raise JsonableError(_("Missing ios_app_id"))
if user_id is None and user_uuid is None: if user_id is None and user_uuid is None:
raise JsonableError(_("Missing user_id or user_uuid")) raise JsonableError(_("Missing user_id or user_uuid"))