diff --git a/CHANGES.rst b/CHANGES.rst index 9e50d8e..5ff7548 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -158,3 +158,7 @@ Unreleased - Replace deprecated urllib3.Retry options v2 .. _Ɓukasz Rogowski: https://github.com/Rogalek + +- Explicitly handle 403 SENDER_ID_MISMATCH response + +.. _James Priebe: https://github.com/J-Priebe/ diff --git a/pyfcm/baseapi.py b/pyfcm/baseapi.py index 147050b..7178dd8 100644 --- a/pyfcm/baseapi.py +++ b/pyfcm/baseapi.py @@ -16,6 +16,7 @@ AuthenticationError, InvalidDataError, FCMError, + FCMSenderIdMismatchError, FCMServerError, FCMNotRegisteredError, ) @@ -185,12 +186,14 @@ def parse_response(self, response): Parses the json response sent back by the server and tries to get out the important return variables Returns: - dict: name (str) - uThe identifier of the message sent, in the format of projects/*/messages/{message_id} + dict: name (str) - The identifier of the message sent, in the format of projects/*/messages/{message_id} Raises: FCMServerError: FCM is temporary not available AuthenticationError: error authenticating the sender account InvalidDataError: data passed to FCM was incorrecly structured + FCMSenderIdMismatchError: the authenticated sender is different from the sender registered to the token + FCMNotRegisteredError: device token is missing, not registered, or invalid """ if response.status_code == 200: @@ -210,6 +213,10 @@ def parse_response(self, response): ) elif response.status_code == 400: raise InvalidDataError(response.text) + elif response.status_code == 403: + raise FCMSenderIdMismatchError( + "The authenticated sender ID is different from the sender ID for the registration token." + ) elif response.status_code == 404: raise FCMNotRegisteredError("Token not registered") else: diff --git a/pyfcm/errors.py b/pyfcm/errors.py index a186fa3..70ae23c 100644 --- a/pyfcm/errors.py +++ b/pyfcm/errors.py @@ -23,6 +23,15 @@ class FCMNotRegisteredError(FCMError): pass +class FCMSenderIdMismatchError(FCMError): + """ + Sender is not allowed for the given device tokens + https://firebase.google.com/docs/reference/fcm/rest/v1/ErrorCode + """ + + pass + + class FCMServerError(FCMError): """ Internal server error or timeout error on Firebase cloud messaging server diff --git a/pyfcm/fcm.py b/pyfcm/fcm.py index ca3f945..13647c9 100644 --- a/pyfcm/fcm.py +++ b/pyfcm/fcm.py @@ -41,13 +41,14 @@ def notify( timeout (int, optional): Set time limit for the request Returns: - dict: Response from FCM server (`multicast_id`, `success`, `failure`, `canonical_ids`, `results`) + dict: name (str) - The identifier of the message sent, in the format of projects/*/messages/{message_id} Raises: - AuthenticationError: If api_key is not set or provided or there is an error authenticating the sender. - FCMServerError: Internal server error or timeout error on Firebase cloud messaging server - InvalidDataError: Invalid data provided - InternalPackageError: Mostly from changes in the response of FCM, contact the project owner to resolve the issue + FCMServerError: FCM is temporary not available + AuthenticationError: error authenticating the sender account + InvalidDataError: data passed to FCM was incorrecly structured + FCMSenderIdMismatchError: the authenticated sender is different from the sender registered to the token + FCMNotRegisteredError: device token is missing, not registered, or invalid """ payload = self.parse_payload( fcm_token=fcm_token,