From 4a079c0c156323902321e31df0b6c6e56c780683 Mon Sep 17 00:00:00 2001 From: pablohashescobar Date: Mon, 27 May 2024 13:25:54 +0530 Subject: [PATCH 1/2] dev: oauth exception handling --- .../plane/authentication/adapter/oauth.py | 50 ++++++++++++++----- .../authentication/provider/oauth/github.py | 28 ++++++++--- 2 files changed, 58 insertions(+), 20 deletions(-) diff --git a/apiserver/plane/authentication/adapter/oauth.py b/apiserver/plane/authentication/adapter/oauth.py index 60c2ea0c60e..a917c002aef 100644 --- a/apiserver/plane/authentication/adapter/oauth.py +++ b/apiserver/plane/authentication/adapter/oauth.py @@ -8,6 +8,10 @@ from plane.db.models import Account from .base import Adapter +from plane.authentication.adapter.error import ( + AuthenticationException, + AUTHENTICATION_ERROR_CODES, +) class OauthAdapter(Adapter): @@ -50,20 +54,42 @@ def authenticate(self): return self.complete_login_or_signup() def get_user_token(self, data, headers=None): - headers = headers or {} - response = requests.post( - self.get_token_url(), data=data, headers=headers - ) - response.raise_for_status() - return response.json() + try: + headers = headers or {} + response = requests.post( + self.get_token_url(), data=data, headers=headers + ) + response.raise_for_status() + return response.json() + except requests.RequestException: + code = ( + "GOOGLE_OAUTH_PROVIDER_ERROR" + if self.provider == "google" + else "GITHUB_OAUTH_PROVIDER_ERROR" + ) + raise AuthenticationException( + error_code=AUTHENTICATION_ERROR_CODES[code], + error_message=str(code), + ) def get_user_response(self): - headers = { - "Authorization": f"Bearer {self.token_data.get('access_token')}" - } - response = requests.get(self.get_user_info_url(), headers=headers) - response.raise_for_status() - return response.json() + try: + headers = { + "Authorization": f"Bearer {self.token_data.get('access_token')}" + } + response = requests.get(self.get_user_info_url(), headers=headers) + response.raise_for_status() + return response.json() + except requests.RequestException: + code = ( + "GOOGLE_OAUTH_PROVIDER_ERROR" + if self.provider == "google" + else "GITHUB_OAUTH_PROVIDER_ERROR" + ) + raise AuthenticationException( + error_code=AUTHENTICATION_ERROR_CODES[code], + error_message=str(code), + ) def set_user_data(self, data): self.user_data = data diff --git a/apiserver/plane/authentication/provider/oauth/github.py b/apiserver/plane/authentication/provider/oauth/github.py index 798863d8f56..edd99b1ba32 100644 --- a/apiserver/plane/authentication/provider/oauth/github.py +++ b/apiserver/plane/authentication/provider/oauth/github.py @@ -105,14 +105,26 @@ def set_token_data(self): ) def __get_email(self, headers): - # Github does not provide email in user response - emails_url = "https://api.github.com/user/emails" - emails_response = requests.get(emails_url, headers=headers).json() - email = next( - (email["email"] for email in emails_response if email["primary"]), - None, - ) - return email + try: + # Github does not provide email in user response + emails_url = "https://api.github.com/user/emails" + emails_response = requests.get(emails_url, headers=headers).json() + email = next( + ( + email["email"] + for email in emails_response + if email["primary"] + ), + None, + ) + return email + except requests.RequestException: + raise AuthenticationException( + error_code=AUTHENTICATION_ERROR_CODES[ + "GITHUB_OAUTH_PROVIDER_ERROR" + ], + error_message="GITHUB_OAUTH_PROVIDER_ERROR", + ) def set_user_data(self): user_info_response = self.get_user_response() From 10ba227a14be065d13a52acac306ef0dc27ba423 Mon Sep 17 00:00:00 2001 From: pablohashescobar Date: Tue, 28 May 2024 11:41:36 +0530 Subject: [PATCH 2/2] dev: reset password on deactivation --- apiserver/plane/app/views/user/base.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apiserver/plane/app/views/user/base.py b/apiserver/plane/app/views/user/base.py index 9a9cdde433d..de1559b0c6d 100644 --- a/apiserver/plane/app/views/user/base.py +++ b/apiserver/plane/app/views/user/base.py @@ -1,5 +1,5 @@ # Python imports -# import uuid +import uuid # Django imports from django.db.models import Case, Count, IntegerField, Q, When @@ -183,8 +183,8 @@ def deactivate(self, request): profile.save() # Reset password - # user.is_password_autoset = True - # user.set_password(uuid.uuid4().hex) + user.is_password_autoset = True + user.set_password(uuid.uuid4().hex) # Deactivate the user user.is_active = False