Skip to content

Commit

Permalink
OpenConceptLab/ocl_issues#1338 | user forgot password flow
Browse files Browse the repository at this point in the history
  • Loading branch information
snyaggarwal committed Aug 2, 2022
1 parent 8abcf5e commit b14e60a
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 23 deletions.
67 changes: 45 additions & 22 deletions core/common/services.py
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,9 @@ def get_token(self):
def mark_verified(self, **kwargs):
return self.user.mark_verified(**kwargs)

def update_password(self, password):
return self.user.update_password(password=password)


class DjangoAuthService(AbstractAuthService):
token_type = 'Token'
Expand Down Expand Up @@ -334,43 +337,63 @@ def create_user(data):

return response.json()

def mark_verified(self, **kwargs):
admin_headers = self.get_admin_headers()
def __get_all_users(self, headers=None):
response = requests.get(
settings.OIDC_SERVER_INTERNAL_URL + '/admin/realms/ocl/users',
verify=False,
headers=admin_headers
headers=headers or self.get_admin_headers()
)
return response.json()

def __get_user_info(self, headers=None):
users = self.__get_all_users(headers)
return next(user for user in users if user['username'] == self.username)

users = response.json()
user_info = get([user for user in users if user['username'] == self.username], '0')
oid_user_id = get(user_info, 'id')
def __get_user_id(self, headers=None):
user_info = self.__get_user_info(headers)
return get(user_info, 'id')

def mark_verified(self, **kwargs):
response = self.update_user(dict(emailVerified=True))
if response.status_code < 300:
return super().mark_verified(**kwargs)
return response.json()

def update_user(self, data):
admin_headers = self.get_admin_headers()
oid_user_id = self.__get_user_id(admin_headers)
if not oid_user_id:
raise Http404()

response = requests.put(
settings.OIDC_SERVER_INTERNAL_URL + f'/admin/realms/ocl/users/{oid_user_id}',
json=dict(emailVerified=True),
json=data,
verify=False,
headers=admin_headers
)
if response.status_code < 300:
return super().mark_verified(**kwargs)
return response.json()
return response

def reset_password(self, **kwargs):
# PUT /{realm}/users/{id}/disable-credential-types
# Body
# credentialTypes : < string > array
def update_password(self, password):
admin_headers = self.get_admin_headers()
oid_user_id = self.__get_user_id(admin_headers)
if not oid_user_id:
raise Http404()

# PUT /admin/realms/{realm}/users/{id}/reset-password
# {
# "type": "password",
# "temporary": false,
# "value": "my-new-password"
# }
requests.put(
settings.OIDC_SERVER_INTERNAL_URL + f'/admin/realms/ocl/users/{oid_user_id}/disable-credential-types',
json=['password'],
verify=False,
headers=admin_headers
)

pass
response = requests.put(
settings.OIDC_SERVER_INTERNAL_URL + f'/admin/realms/ocl/users/{oid_user_id}/reset-password',
json=dict(type='password', temporary=False, value=password),
verify=False,
headers=admin_headers
)
if response.status_code < 300:
return super().update_password(password)
return response.json()


class AuthService:
Expand Down
8 changes: 7 additions & 1 deletion core/users/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,13 @@ def put(self, request, *args, **kwargs): # pylint: disable=unused-argument
if not user:
return Response(status=status.HTTP_404_NOT_FOUND)

result = user.update_password(password=password)
try:
validate_password(password)
except ValidationError as ex:
return Response(dict(errors=ex.messages), status=status.HTTP_400_BAD_REQUEST)

service = AuthService.get(user=user)
result = service.update_password(password)
if get(result, 'errors'):
return Response(result, status=status.HTTP_400_BAD_REQUEST)

Expand Down

0 comments on commit b14e60a

Please sign in to comment.