auth password forgot and change tested

This commit is contained in:
2024-12-01 15:08:59 +03:00
parent 288a393719
commit a4fd52c28a
17 changed files with 289 additions and 199 deletions

View File

@@ -21,6 +21,7 @@ from api_events.events.authentication import (
AuthenticationRefreshEventMethod,
AuthenticationChangePasswordEventMethod,
AuthenticationCreatePasswordEventMethod,
AuthenticationResetPasswordEventMethod,
AuthenticationDisconnectUserEventMethod,
AuthenticationLogoutEventMethod,
AuthenticationRefreshTokenEventMethod,
@@ -183,6 +184,7 @@ __all__ = [
"AuthenticationRefreshEventMethod",
"AuthenticationChangePasswordEventMethod",
"AuthenticationCreatePasswordEventMethod",
"AuthenticationResetPasswordEventMethod",
"AuthenticationDisconnectUserEventMethod",
"AuthenticationLogoutEventMethod",
"AuthenticationRefreshTokenEventMethod",

View File

@@ -46,6 +46,12 @@ class AccountRecordsListEventMethods(MethodToEvent):
completed=True, message="Update Build record", result=records
)
@classmethod
def account_records_list_flt_res_or_ten(cls):
"""
FLT-RES | FLT-TEN | FLT-OWN aidatları görür
"""
return
class AccountRecordsCreateEventMethods(MethodToEvent):

View File

@@ -433,8 +433,7 @@ class AuthenticationDisconnectUserEventMethods(MethodToEvent):
status_code=status.HTTP_202_ACCEPTED,
)
if already_tokens := get_object_via_user_uu_id(user_id=found_user.uu_id):
for key in already_tokens:
token_user = json.loads(redis_cli.get(key) or {})
for key, token_user in already_tokens.items():
redis_cli.delete(key)
selected_user = Users.filter_one(
Users.uu_id == token_user.get("uu_id"),

View File

@@ -1,4 +1,3 @@
import json
import typing
from typing import Union
@@ -36,7 +35,6 @@ from api_validations.validations_request import (
EmployeeSelection,
)
from api_services import (
password_is_changed_template,
change_your_password_template,
save_access_token_to_redis,
update_selected_to_redis,
@@ -66,13 +64,11 @@ class AuthenticationLoginEventMethods(MethodToEvent):
request: Request,
):
access_dict = Users.login_user_with_credentials(data=data, request=request)
found_user = access_dict.get("user", None)
if not found_user:
if not access_dict.get("user", None):
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid credentials"
)
access_object = access_dict.get("access_object")
if not access_object:
if not access_dict.get("access_object", None):
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="This User has no active role registered. Please contact your administrator.",
@@ -84,7 +80,7 @@ class AuthenticationLoginEventMethods(MethodToEvent):
"access_token": access_dict.get("access_token"),
"refresh_token": access_dict.get("refresher_token"),
"access_object": access_dict.get("access_object"),
"user": found_user.get_dict(),
"user": access_dict.get("user", None).get_dict(),
},
status_code=status.HTTP_200_OK,
)
@@ -263,7 +259,7 @@ class AuthenticationCheckTokenEventMethods(MethodToEvent):
}
@classmethod
def authentication_login_with_domain_and_creds(
def authentication_check_token_is_valid(
cls,
request,
):
@@ -329,28 +325,27 @@ class AuthenticationChangePasswordEventMethods(MethodToEvent):
def authentication_change_password(
cls,
data: ChangePassword,
token_dict: typing.Union[EmployeeSelection, OccupantSelection],
token_dict: Union[EmployeeTokenObject, OccupantTokenObject],
):
if token_dict.user_type == 1:
if found_user := Users.filter_one(
Users.uu_id == token_dict.person_uu_id,
).data:
if found_user.check_password(data.old_password):
found_user.set_password(data.new_password)
return JSONResponse(
content={
"completed": True,
"message": "Password is changed successfully",
},
status_code=status.HTTP_200_OK,
)
if found_user := Users.filter_one(
Users.id == token_dict.user_id,
).data:
if found_user.check_password(data.old_password):
found_user.create_password(found_user=found_user, password=data.new_password)
return JSONResponse(
content={
"completed": False,
"message": "Old password is not correct",
"completed": True,
"message": "Password is changed successfully",
},
status_code=status.HTTP_401_UNAUTHORIZED,
status_code=status.HTTP_200_OK,
)
return JSONResponse(
content={
"completed": False,
"message": "Old password is not correct",
},
status_code=status.HTTP_401_UNAUTHORIZED,
)
return JSONResponse(
content={"completed": False, "message": "Invalid data"},
status_code=status.HTTP_401_UNAUTHORIZED,
@@ -405,6 +400,56 @@ class AuthenticationCreatePasswordEventMethods(MethodToEvent):
)
class AuthenticationResetPasswordEventMethods(MethodToEvent):
event_type = "UPDATE"
__event_keys__ = {
"af9e121e-24bb-44ac-a616-471d5754360e": "authentication_reset_password",
}
@classmethod
def authentication_reset_password(
cls,
data: Forgot
):
from sqlalchemy import or_
found_user = Users.query.filter(
or_(
Users.email == str(data.access_key).lower(),
Users.phone_number == str(data.access_key).replace(" ", ""),
),
).first()
if not found_user:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="Given access key or domain is not matching with the any user record.",
)
reset_password_token = found_user.reset_password_token()
send_email_completed = send_email(
subject=f"Dear {found_user.user_tag}, a password reset request has been received.",
receivers=[str(found_user.email)],
html=change_your_password_template(
user_name=found_user.user_tag,
forgot_link=ApiStatic.forgot_link(forgot_key=reset_password_token),
),
)
if not send_email_completed:
raise found_user.raise_http_exception(
status_code=400,
message="Email can not be sent. Try again later"
)
return JSONResponse(
content={
"completed": True,
"message": "Password is created successfully",
"data": found_user.get_dict(),
},
status_code=status.HTTP_200_OK,
)
class AuthenticationDisconnectUserEventMethods(MethodToEvent):
event_type = "UPDATE"
@@ -432,12 +477,10 @@ class AuthenticationDisconnectUserEventMethods(MethodToEvent):
status_code=status.HTTP_202_ACCEPTED,
)
if already_tokens := get_object_via_user_uu_id(user_id=found_user.uu_id):
for key in already_tokens:
token_user = json.loads(redis_cli.get(key) or {})
for key, token_user in already_tokens.items():
redis_cli.delete(key)
selected_user = Users.filter_one(
Users.uu_id == token_user.get("uu_id"),
*Users.valid_record_args(Users),
)
selected_user.remove_refresher_token(
domain=data.domain, disconnect=True
@@ -493,13 +536,12 @@ class AuthenticationLogoutEventMethods(MethodToEvent):
status_code=status.HTTP_202_ACCEPTED,
)
token_users = get_object_via_user_uu_id(token_dict.user_uu_id)
for token_user in token_users:
if token_dict.domain == data.domain:
redis_cli.delete(token_user)
for token, token_user in token_users.items():
if token_user['domain'] == data.domain:
selected_user = Users.filter_one(
Users.uu_id == token_user.get("uu_id"),
*Users.valid_record_args(Users),
)
Users.uu_id == token_dict.user_uu_id,
).data
redis_cli.delete(token)
selected_user.remove_refresher_token(domain=data.domain)
# UserLogger.log_error(
# str(
@@ -720,6 +762,9 @@ AuthenticationChangePasswordEventMethod = AuthenticationChangePasswordEventMetho
AuthenticationCreatePasswordEventMethod = AuthenticationCreatePasswordEventMethods(
action=ActionsSchema(endpoint="/authentication/create_password")
)
AuthenticationResetPasswordEventMethod = AuthenticationResetPasswordEventMethods(
action=ActionsSchema(endpoint="/authentication/reset_password")
)
AuthenticationDisconnectUserEventMethod = AuthenticationDisconnectUserEventMethods(
action=ActionsSchema(endpoint="/authentication/disconnect")
)

View File

@@ -92,7 +92,6 @@ class ServiceBindOccupantEventMethods(MethodToEvent):
BuildParts.build_id == token_dict.selected_occupant.build_id,
BuildParts.active == True,
).data
print("occupants_build_part", occupants_build_part)
if not occupants_build_part:
return JSONResponse(
content={

View File

@@ -3,15 +3,15 @@ import typing
from fastapi import status
from fastapi.responses import JSONResponse
from api_configs import ApiStatic
from databases import MongoQueryIdentity, Users, Companies, People
from databases.no_sql_models.validations import DomainViaUser
from api_events.events.abstract_class import MethodToEvent, ActionsSchema
from api_objects.auth.token_objects import EmployeeTokenObject, OccupantTokenObject
from api_validations.core_response import AlchemyJsonResponse
from api_services.email.service import send_email
from api_services.templates.password_templates import change_your_password_template
from api_validations.validations_request import (
InsertUsers,
UpdateUsers,
@@ -87,6 +87,20 @@ class UserCreateEventMethods(MethodToEvent):
company_uuid=created_user.related_company,
)
mongo_query_identity.create_domain_via_user(payload=domain_via_user)
reset_password_token = created_user.reset_password_token()
send_email_completed = send_email(
subject=f"Dear {created_user.user_tag}, your password has been changed.",
receivers=[str(created_user.email)],
html=change_your_password_template(
user_name=created_user.user_tag,
forgot_link=ApiStatic.forgot_link(forgot_key=reset_password_token),
),
)
if not send_email_completed:
raise created_user.raise_http_exception(
status_code=400,
message="Email can not be sent. Try again later"
)
return JSONResponse(
content={
"completed": True,

View File

@@ -16,6 +16,7 @@ class AuthDefaultEventBlock(AddEventFunctionality):
{"function_code": "c90f3334-10c9-4181-b5ff-90d98a0287b2"},
{"function_code": "e3ca6e24-b9f8-4127-949c-3bfa364e3513"},
{"function_code": "c140cd5f-307f-4046-a93e-3ade032a57a7"},
{"function_code": "af9e121e-24bb-44ac-a616-471d5754360e"},
]
def __new__(cls, *args, **kwargs):