fix: handle Proton account not validated case (#1842)
This commit is contained in:
parent
66d26a1193
commit
40ff4604c8
|
@ -121,3 +121,10 @@ class AccountAlreadyLinkedToAnotherUserException(LinkException):
|
||||||
class AccountIsUsingAliasAsEmail(LinkException):
|
class AccountIsUsingAliasAsEmail(LinkException):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__("Your account has an alias as it's email address")
|
super().__init__("Your account has an alias as it's email address")
|
||||||
|
|
||||||
|
|
||||||
|
class ProtonAccountNotVerified(LinkException):
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__(
|
||||||
|
"The Proton account you are trying to use has not been verified"
|
||||||
|
)
|
||||||
|
|
|
@ -7,11 +7,12 @@ from typing import Optional
|
||||||
|
|
||||||
from app.account_linking import SLPlan, SLPlanType
|
from app.account_linking import SLPlan, SLPlanType
|
||||||
from app.config import PROTON_EXTRA_HEADER_NAME, PROTON_EXTRA_HEADER_VALUE
|
from app.config import PROTON_EXTRA_HEADER_NAME, PROTON_EXTRA_HEADER_VALUE
|
||||||
|
from app.errors import ProtonAccountNotVerified
|
||||||
from app.log import LOG
|
from app.log import LOG
|
||||||
|
|
||||||
_APP_VERSION = "OauthClient_1.0.0"
|
_APP_VERSION = "OauthClient_1.0.0"
|
||||||
|
|
||||||
PROTON_ERROR_CODE_NOT_EXISTS = 2501
|
PROTON_ERROR_CODE_HV_NEEDED = 9001
|
||||||
|
|
||||||
PLAN_FREE = 1
|
PLAN_FREE = 1
|
||||||
PLAN_PREMIUM = 2
|
PLAN_PREMIUM = 2
|
||||||
|
@ -57,6 +58,15 @@ def convert_access_token(access_token_response: str) -> AccessCredentials:
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def handle_response_not_ok(status: int, body: dict, text: str) -> Exception:
|
||||||
|
if status == HTTPStatus.UNPROCESSABLE_ENTITY:
|
||||||
|
res_code = body.get("Code")
|
||||||
|
if res_code == PROTON_ERROR_CODE_HV_NEEDED:
|
||||||
|
return ProtonAccountNotVerified()
|
||||||
|
|
||||||
|
return Exception(f"Unexpected status code. Wanted 200 and got {status}: " + text)
|
||||||
|
|
||||||
|
|
||||||
class ProtonClient(ABC):
|
class ProtonClient(ABC):
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def get_user(self) -> Optional[UserInformation]:
|
def get_user(self) -> Optional[UserInformation]:
|
||||||
|
@ -124,11 +134,11 @@ class HttpProtonClient(ProtonClient):
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def __validate_response(res: Response) -> dict:
|
def __validate_response(res: Response) -> dict:
|
||||||
status = res.status_code
|
status = res.status_code
|
||||||
if status != HTTPStatus.OK:
|
|
||||||
raise Exception(
|
|
||||||
f"Unexpected status code. Wanted 200 and got {status}: " + res.text
|
|
||||||
)
|
|
||||||
as_json = res.json()
|
as_json = res.json()
|
||||||
|
if status != HTTPStatus.OK:
|
||||||
|
raise HttpProtonClient.__handle_response_not_ok(
|
||||||
|
status=status, body=as_json, text=res.text
|
||||||
|
)
|
||||||
res_code = as_json.get("Code")
|
res_code = as_json.get("Code")
|
||||||
if not res_code or res_code != 1000:
|
if not res_code or res_code != 1000:
|
||||||
raise Exception(
|
raise Exception(
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
import pytest
|
import pytest
|
||||||
|
from http import HTTPStatus
|
||||||
|
|
||||||
|
from app.errors import ProtonAccountNotVerified
|
||||||
from app.proton import proton_client
|
from app.proton import proton_client
|
||||||
|
|
||||||
|
|
||||||
|
@ -19,3 +21,30 @@ def test_convert_access_token_not_containing_invalid_length():
|
||||||
for case in cases:
|
for case in cases:
|
||||||
with pytest.raises(Exception):
|
with pytest.raises(Exception):
|
||||||
proton_client.convert_access_token(case)
|
proton_client.convert_access_token(case)
|
||||||
|
|
||||||
|
|
||||||
|
def test_handle_response_not_ok_account_not_verified():
|
||||||
|
res = proton_client.handle_response_not_ok(
|
||||||
|
status=HTTPStatus.UNPROCESSABLE_ENTITY,
|
||||||
|
body={"Code": proton_client.PROTON_ERROR_CODE_HV_NEEDED},
|
||||||
|
text="",
|
||||||
|
)
|
||||||
|
assert isinstance(res, ProtonAccountNotVerified)
|
||||||
|
|
||||||
|
|
||||||
|
def test_handle_response_unprocessable_entity_not_account_not_verified():
|
||||||
|
error_text = "some error text"
|
||||||
|
res = proton_client.handle_response_not_ok(
|
||||||
|
status=HTTPStatus.UNPROCESSABLE_ENTITY, body={"Code": 4567}, text=error_text
|
||||||
|
)
|
||||||
|
assert error_text in res.args[0]
|
||||||
|
|
||||||
|
|
||||||
|
def test_handle_response_not_ok_unknown_error():
|
||||||
|
error_text = "some error text"
|
||||||
|
res = proton_client.handle_response_not_ok(
|
||||||
|
status=123,
|
||||||
|
body={"Code": proton_client.PROTON_ERROR_CODE_HV_NEEDED},
|
||||||
|
text=error_text,
|
||||||
|
)
|
||||||
|
assert error_text in res.args[0]
|
||||||
|
|
Loading…
Reference in New Issue