Formatted stuff #405
This commit is contained in:
		| @@ -40,15 +40,11 @@ class AuthServiceABC(ABC): | ||||
|         pass | ||||
|  | ||||
|     @abstractmethod | ||||
|     async def get_filtered_auth_users_async( | ||||
|         self, criteria: AuthUserSelectCriteria | ||||
|     ) -> AuthUserFilteredResultDTO: | ||||
|     async def get_filtered_auth_users_async(self, criteria: AuthUserSelectCriteria) -> AuthUserFilteredResultDTO: | ||||
|         pass | ||||
|  | ||||
|     @abstractmethod | ||||
|     async def get_auth_user_by_email_async( | ||||
|         self, email: str, with_password: bool = False | ||||
|     ) -> AuthUserDTO: | ||||
|     async def get_auth_user_by_email_async(self, email: str, with_password: bool = False) -> AuthUserDTO: | ||||
|         pass | ||||
|  | ||||
|     @abstractmethod | ||||
|   | ||||
| @@ -3,9 +3,7 @@ from abc import ABC, abstractmethod | ||||
|  | ||||
| class SelectCriteriaABC(ABC): | ||||
|     @abstractmethod | ||||
|     def __init__( | ||||
|         self, page_index: int, page_size: int, sort_direction: str, sort_column: str | ||||
|     ): | ||||
|     def __init__(self, page_index: int, page_size: int, sort_direction: str, sort_column: str): | ||||
|         self.page_index = page_index | ||||
|         self.page_size = page_size | ||||
|         self.sort_direction = sort_direction | ||||
|   | ||||
| @@ -57,9 +57,7 @@ class Api(Flask): | ||||
|         # Added async_mode see link below | ||||
|         # https://github.com/miguelgrinberg/Flask-SocketIO/discussions/1849 | ||||
|         # https://stackoverflow.com/questions/39370848/flask-socket-io-sometimes-client-calls-freeze-the-server | ||||
|         self._socketio = SocketIO( | ||||
|             self, cors_allowed_origins="*", path="/api/socket.io", async_mode="eventlet" | ||||
|         ) | ||||
|         self._socketio = SocketIO(self, cors_allowed_origins="*", path="/api/socket.io", async_mode="eventlet") | ||||
|         self._socketio.on_event("connect", self.on_connect) | ||||
|         self._socketio.on_event("disconnect", self.on_disconnect) | ||||
|  | ||||
| @@ -145,9 +143,7 @@ class Api(Flask): | ||||
|         data = request.get_data() | ||||
|         data = "" if len(data) == 0 else str(data.decode(encoding="utf-8")) | ||||
|  | ||||
|         text = textwrap.dedent( | ||||
|             f"Request: {request_id}:\n\tHeader:\n\t\t{headers}\n\tResponse: {data}" | ||||
|         ) | ||||
|         text = textwrap.dedent(f"Request: {request_id}:\n\tHeader:\n\t\t{headers}\n\tResponse: {data}") | ||||
|         self._logger.trace(__name__, text) | ||||
|  | ||||
|         return response | ||||
| @@ -162,9 +158,7 @@ class Api(Flask): | ||||
|         # from waitress import serve | ||||
|         # https://docs.pylonsproject.org/projects/waitress/en/stable/arguments.html | ||||
|         # serve(self, host=self._apt_settings.host, port=self._apt_settings.port, threads=10, connection_limit=1000, channel_timeout=10) | ||||
|         self._socket = eventlet.listen( | ||||
|             (self._api_settings.host, self._api_settings.port) | ||||
|         ) | ||||
|         self._socket = eventlet.listen((self._api_settings.host, self._api_settings.port)) | ||||
|         wsgi.server(self._socket, self, log_output=False) | ||||
|  | ||||
|     def stop(self): | ||||
|   | ||||
| @@ -26,21 +26,15 @@ class ApiModule(ModuleABC): | ||||
|     def __init__(self, dc: DiscordCollectionABC): | ||||
|         ModuleABC.__init__(self, dc, FeatureFlagsEnum.api_module) | ||||
|  | ||||
|     def configure_configuration( | ||||
|         self, config: ConfigurationABC, env: ApplicationEnvironmentABC | ||||
|     ): | ||||
|     def configure_configuration(self, config: ConfigurationABC, env: ApplicationEnvironmentABC): | ||||
|         cwd = env.working_directory | ||||
|         env.set_working_directory(os.path.dirname(os.path.realpath(__file__))) | ||||
|         config.add_json_file(f"config/apisettings.json", optional=False) | ||||
|         config.add_json_file( | ||||
|             f"config/apisettings.{env.environment_name}.json", optional=True | ||||
|         ) | ||||
|         config.add_json_file(f"config/apisettings.{env.environment_name}.json", optional=True) | ||||
|         config.add_json_file(f"config/apisettings.{env.host_name}.json", optional=True) | ||||
|         env.set_working_directory(cwd) | ||||
|  | ||||
|     def configure_services( | ||||
|         self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC | ||||
|     ): | ||||
|     def configure_services(self, services: ServiceCollectionABC, env: ApplicationEnvironmentABC): | ||||
|         services.add_singleton(EMailClientABC, EMailClient) | ||||
|  | ||||
|         services.add_singleton(ApiThread) | ||||
|   | ||||
| @@ -12,9 +12,7 @@ class AppApiExtension(ApplicationExtensionABC): | ||||
|         ApplicationExtensionABC.__init__(self) | ||||
|  | ||||
|     async def run(self, config: ConfigurationABC, services: ServiceProviderABC): | ||||
|         feature_flags: FeatureFlagsSettings = config.get_configuration( | ||||
|             FeatureFlagsSettings | ||||
|         ) | ||||
|         feature_flags: FeatureFlagsSettings = config.get_configuration(FeatureFlagsSettings) | ||||
|         if not feature_flags.get_flag(FeatureFlagsEnum.api_module): | ||||
|             return | ||||
|  | ||||
|   | ||||
| @@ -16,9 +16,7 @@ class AuthenticationSettings(ConfigurationModelABC): | ||||
|         self._issuer = "" if issuer is None else issuer | ||||
|         self._audience = "" if audience is None else audience | ||||
|         self._token_expire_time = 0 if token_expire_time is None else token_expire_time | ||||
|         self._refresh_token_expire_time = ( | ||||
|             0 if refresh_token_expire_time is None else refresh_token_expire_time | ||||
|         ) | ||||
|         self._refresh_token_expire_time = 0 if refresh_token_expire_time is None else refresh_token_expire_time | ||||
|  | ||||
|     @property | ||||
|     def secret_key(self) -> str: | ||||
|   | ||||
| @@ -70,9 +70,7 @@ class AuthController: | ||||
|  | ||||
|     @Route.post(f"{BasePath}/register") | ||||
|     async def register(self): | ||||
|         dto: AuthUserDTO = JSONProcessor.process( | ||||
|             AuthUserDTO, request.get_json(force=True, silent=True) | ||||
|         ) | ||||
|         dto: AuthUserDTO = JSONProcessor.process(AuthUserDTO, request.get_json(force=True, silent=True)) | ||||
|         self._auth_service.add_auth_user(dto) | ||||
|         return "", 200 | ||||
|  | ||||
| @@ -83,9 +81,7 @@ class AuthController: | ||||
|  | ||||
|     @Route.post(f"{BasePath}/login") | ||||
|     async def login(self) -> Response: | ||||
|         dto: AuthUserDTO = JSONProcessor.process( | ||||
|             AuthUserDTO, request.get_json(force=True, silent=True) | ||||
|         ) | ||||
|         dto: AuthUserDTO = JSONProcessor.process(AuthUserDTO, request.get_json(force=True, silent=True)) | ||||
|         result = await self._auth_service.login_async(dto) | ||||
|         return jsonify(result.to_dict()) | ||||
|  | ||||
| @@ -114,52 +110,40 @@ class AuthController: | ||||
|  | ||||
|     @Route.post(f"{BasePath}/reset-password") | ||||
|     async def reset_password(self): | ||||
|         dto: ResetPasswordDTO = JSONProcessor.process( | ||||
|             ResetPasswordDTO, request.get_json(force=True, silent=True) | ||||
|         ) | ||||
|         dto: ResetPasswordDTO = JSONProcessor.process(ResetPasswordDTO, request.get_json(force=True, silent=True)) | ||||
|         await self._auth_service.reset_password_async(dto) | ||||
|         return "", 200 | ||||
|  | ||||
|     @Route.post(f"{BasePath}/update-user") | ||||
|     @Route.authorize | ||||
|     async def update_user(self): | ||||
|         dto: UpdateAuthUserDTO = JSONProcessor.process( | ||||
|             UpdateAuthUserDTO, request.get_json(force=True, silent=True) | ||||
|         ) | ||||
|         dto: UpdateAuthUserDTO = JSONProcessor.process(UpdateAuthUserDTO, request.get_json(force=True, silent=True)) | ||||
|         await self._auth_service.update_user_async(dto) | ||||
|         return "", 200 | ||||
|  | ||||
|     @Route.post(f"{BasePath}/update-user-as-admin") | ||||
|     @Route.authorize(role=AuthRoleEnum.admin) | ||||
|     async def update_user_as_admin(self): | ||||
|         dto: UpdateAuthUserDTO = JSONProcessor.process( | ||||
|             UpdateAuthUserDTO, request.get_json(force=True, silent=True) | ||||
|         ) | ||||
|         dto: UpdateAuthUserDTO = JSONProcessor.process(UpdateAuthUserDTO, request.get_json(force=True, silent=True)) | ||||
|         await self._auth_service.update_user_as_admin_async(dto) | ||||
|         return "", 200 | ||||
|  | ||||
|     @Route.post(f"{BasePath}/refresh") | ||||
|     async def refresh(self) -> Response: | ||||
|         dto: TokenDTO = JSONProcessor.process( | ||||
|             TokenDTO, request.get_json(force=True, silent=True) | ||||
|         ) | ||||
|         dto: TokenDTO = JSONProcessor.process(TokenDTO, request.get_json(force=True, silent=True)) | ||||
|         result = await self._auth_service.refresh_async(dto) | ||||
|         return jsonify(result.to_dict()) | ||||
|  | ||||
|     @Route.post(f"{BasePath}/revoke") | ||||
|     async def revoke(self): | ||||
|         dto: TokenDTO = JSONProcessor.process( | ||||
|             TokenDTO, request.get_json(force=True, silent=True) | ||||
|         ) | ||||
|         dto: TokenDTO = JSONProcessor.process(TokenDTO, request.get_json(force=True, silent=True)) | ||||
|         await self._auth_service.revoke_async(dto) | ||||
|         return "", 200 | ||||
|  | ||||
|     @Route.post(f"{BasePath}/delete-user") | ||||
|     @Route.authorize(role=AuthRoleEnum.admin) | ||||
|     async def delete_user(self): | ||||
|         dto: AuthUserDTO = JSONProcessor.process( | ||||
|             AuthUserDTO, request.get_json(force=True, silent=True) | ||||
|         ) | ||||
|         dto: AuthUserDTO = JSONProcessor.process(AuthUserDTO, request.get_json(force=True, silent=True)) | ||||
|         await self._auth_service.delete_auth_user_async(dto) | ||||
|         return "", 200 | ||||
|  | ||||
|   | ||||
| @@ -13,9 +13,7 @@ class AuthUserSelectCriteria(SelectCriteriaABC): | ||||
|         email: str, | ||||
|         auth_role: int, | ||||
|     ): | ||||
|         SelectCriteriaABC.__init__( | ||||
|             self, page_index, page_size, sort_direction, sort_column | ||||
|         ) | ||||
|         SelectCriteriaABC.__init__(self, page_index, page_size, sort_direction, sort_column) | ||||
|  | ||||
|         self.first_name = first_name | ||||
|         self.last_name = last_name | ||||
|   | ||||
| @@ -10,8 +10,6 @@ class ServerSelectCriteria(SelectCriteriaABC): | ||||
|         sort_column: str, | ||||
|         name: str, | ||||
|     ): | ||||
|         SelectCriteriaABC.__init__( | ||||
|             self, page_index, page_size, sort_direction, sort_column | ||||
|         ) | ||||
|         SelectCriteriaABC.__init__(self, page_index, page_size, sort_direction, sort_column) | ||||
|  | ||||
|         self.name = name | ||||
|   | ||||
| @@ -11,9 +11,7 @@ class ErrorDTO(DtoABC): | ||||
|     def __init__(self, error_code: Optional[ServiceErrorCode], message: str): | ||||
|         DtoABC.__init__(self) | ||||
|  | ||||
|         self._error_code = ( | ||||
|             ServiceErrorCode.Unknown if error_code is None else error_code | ||||
|         ) | ||||
|         self._error_code = ServiceErrorCode.Unknown if error_code is None else error_code | ||||
|         self._message = message | ||||
|  | ||||
|     @property | ||||
|   | ||||
| @@ -34,9 +34,7 @@ class UpdateAuthUserDTO(DtoABC): | ||||
|     def from_dict(self, values: dict): | ||||
|         self._auth_user = AuthUserDTO().from_dict(values["authUser"]) | ||||
|         self._new_auth_user = AuthUserDTO().from_dict(values["newAuthUser"]) | ||||
|         self._change_password = ( | ||||
|             False if "changePassword" not in values else bool(values["changePassword"]) | ||||
|         ) | ||||
|         self._change_password = False if "changePassword" not in values else bool(values["changePassword"]) | ||||
|  | ||||
|     def to_dict(self) -> dict: | ||||
|         return { | ||||
|   | ||||
| @@ -65,9 +65,7 @@ class Route: | ||||
|         by_api_key=False, | ||||
|     ): | ||||
|         if f is None: | ||||
|             return functools.partial( | ||||
|                 cls.authorize, role=role, skip_in_dev=skip_in_dev, by_api_key=by_api_key | ||||
|             ) | ||||
|             return functools.partial(cls.authorize, role=role, skip_in_dev=skip_in_dev, by_api_key=by_api_key) | ||||
|  | ||||
|         @wraps(f) | ||||
|         async def decorator(*args, **kwargs): | ||||
| @@ -78,9 +76,7 @@ class Route: | ||||
|             api_key = None | ||||
|             if "Authorization" in request.headers: | ||||
|                 if " " not in request.headers.get("Authorization"): | ||||
|                     ex = ServiceException( | ||||
|                         ServiceErrorCode.Unauthorized, f"Token not set" | ||||
|                     ) | ||||
|                     ex = ServiceException(ServiceErrorCode.Unauthorized, f"Token not set") | ||||
|                     error = ErrorDTO(ex.error_code, ex.message) | ||||
|                     return jsonify(error.to_dict()), 401 | ||||
|  | ||||
| @@ -102,9 +98,7 @@ class Route: | ||||
|                     return jsonify(e), 500 | ||||
|  | ||||
|                 if not valid: | ||||
|                     ex = ServiceException( | ||||
|                         ServiceErrorCode.Unauthorized, f"API-Key invalid" | ||||
|                     ) | ||||
|                     ex = ServiceException(ServiceErrorCode.Unauthorized, f"API-Key invalid") | ||||
|                     error = ErrorDTO(ex.error_code, ex.message) | ||||
|                     return jsonify(error.to_dict()), 401 | ||||
|  | ||||
| @@ -116,9 +110,7 @@ class Route: | ||||
|                 return jsonify(error.to_dict()), 401 | ||||
|  | ||||
|             if cls._auth_users is None or cls._auth is None: | ||||
|                 ex = ServiceException( | ||||
|                     ServiceErrorCode.Unauthorized, f"Authorize is not initialized" | ||||
|                 ) | ||||
|                 ex = ServiceException(ServiceErrorCode.Unauthorized, f"Authorize is not initialized") | ||||
|                 error = ErrorDTO(ex.error_code, ex.message) | ||||
|                 return jsonify(error.to_dict()), 401 | ||||
|  | ||||
| @@ -140,9 +132,7 @@ class Route: | ||||
|                 return jsonify(error.to_dict()), 401 | ||||
|  | ||||
|             if role is not None and user.auth_role.value < role.value: | ||||
|                 ex = ServiceException( | ||||
|                     ServiceErrorCode.Unauthorized, f"Role {role} required" | ||||
|                 ) | ||||
|                 ex = ServiceException(ServiceErrorCode.Unauthorized, f"Role {role} required") | ||||
|                 error = ErrorDTO(ex.error_code, ex.message) | ||||
|                 return jsonify(error.to_dict()), 403 | ||||
|  | ||||
|   | ||||
| @@ -90,9 +90,7 @@ class AuthService(AuthServiceABC): | ||||
|  | ||||
|     def _get_api_key_str(self, api_key: ApiKey) -> str: | ||||
|         return hashlib.sha256( | ||||
|             f"{api_key.identifier}:{api_key.key}+{self._auth_settings.secret_key}".encode( | ||||
|                 "utf-8" | ||||
|             ) | ||||
|             f"{api_key.identifier}:{api_key.key}+{self._auth_settings.secret_key}".encode("utf-8") | ||||
|         ).hexdigest() | ||||
|  | ||||
|     def generate_token(self, user: AuthUser) -> str: | ||||
| @@ -101,8 +99,7 @@ class AuthService(AuthServiceABC): | ||||
|                 "user_id": user.id, | ||||
|                 "email": user.email, | ||||
|                 "role": user.auth_role.value, | ||||
|                 "exp": datetime.now(tz=timezone.utc) | ||||
|                 + timedelta(days=self._auth_settings.token_expire_time), | ||||
|                 "exp": datetime.now(tz=timezone.utc) + timedelta(days=self._auth_settings.token_expire_time), | ||||
|                 "iss": self._auth_settings.issuer, | ||||
|                 "aud": self._auth_settings.audience, | ||||
|             }, | ||||
| @@ -158,9 +155,7 @@ class AuthService(AuthServiceABC): | ||||
|     def _create_and_save_refresh_token(self, user: AuthUser) -> str: | ||||
|         token = str(uuid.uuid4()) | ||||
|         user.refresh_token = token | ||||
|         user.refresh_token_expire_time = datetime.now() + timedelta( | ||||
|             days=self._auth_settings.refresh_token_expire_time | ||||
|         ) | ||||
|         user.refresh_token_expire_time = datetime.now() + timedelta(days=self._auth_settings.refresh_token_expire_time) | ||||
|         self._auth_users.update_auth_user(user) | ||||
|         self._db.save_changes() | ||||
|         return token | ||||
| @@ -193,12 +188,8 @@ class AuthService(AuthServiceABC): | ||||
|  | ||||
|         self._send_link_mail( | ||||
|             user.email, | ||||
|             self._t.transform("api.auth.confirmation.subject").format( | ||||
|                 user.first_name, user.last_name | ||||
|             ), | ||||
|             self._t.transform("api.auth.confirmation.message").format( | ||||
|                 url, user.confirmation_id | ||||
|             ), | ||||
|             self._t.transform("api.auth.confirmation.subject").format(user.first_name, user.last_name), | ||||
|             self._t.transform("api.auth.confirmation.message").format(url, user.confirmation_id), | ||||
|         ) | ||||
|  | ||||
|     def _send_forgot_password_id_to_user(self, user: AuthUser): | ||||
| @@ -208,38 +199,28 @@ class AuthService(AuthServiceABC): | ||||
|  | ||||
|         self._send_link_mail( | ||||
|             user.email, | ||||
|             self._t.transform("api.auth.forgot_password.subject").format( | ||||
|                 user.first_name, user.last_name | ||||
|             ), | ||||
|             self._t.transform("api.auth.forgot_password.message").format( | ||||
|                 url, user.forgot_password_id | ||||
|             ), | ||||
|             self._t.transform("api.auth.forgot_password.subject").format(user.first_name, user.last_name), | ||||
|             self._t.transform("api.auth.forgot_password.message").format(url, user.forgot_password_id), | ||||
|         ) | ||||
|  | ||||
|     async def get_all_auth_users_async(self) -> List[AuthUserDTO]: | ||||
|         result = self._auth_users.get_all_auth_users().select(lambda x: AUT.to_dto(x)) | ||||
|         return List(AuthUserDTO, result) | ||||
|  | ||||
|     async def get_filtered_auth_users_async( | ||||
|         self, criteria: AuthUserSelectCriteria | ||||
|     ) -> AuthUserFilteredResultDTO: | ||||
|     async def get_filtered_auth_users_async(self, criteria: AuthUserSelectCriteria) -> AuthUserFilteredResultDTO: | ||||
|         users = self._auth_users.get_filtered_auth_users(criteria) | ||||
|         result = users.result.select(lambda x: AUT.to_dto(x)) | ||||
|  | ||||
|         return AuthUserFilteredResultDTO(List(AuthUserDTO, result), users.total_count) | ||||
|  | ||||
|     async def get_auth_user_by_email_async( | ||||
|         self, email: str, with_password: bool = False | ||||
|     ) -> AuthUserDTO: | ||||
|     async def get_auth_user_by_email_async(self, email: str, with_password: bool = False) -> AuthUserDTO: | ||||
|         try: | ||||
|             # todo: check if logged in user is admin then send mail | ||||
|             user = self._auth_users.get_auth_user_by_email(email) | ||||
|             return AUT.to_dto(user, password=user.password if with_password else None) | ||||
|         except Exception as e: | ||||
|             self._logger.error(__name__, f"AuthUser not found", e) | ||||
|             raise ServiceException( | ||||
|                 ServiceErrorCode.InvalidData, f"User not found {email}" | ||||
|             ) | ||||
|             raise ServiceException(ServiceErrorCode.InvalidData, f"User not found {email}") | ||||
|  | ||||
|     async def find_auth_user_by_email_async(self, email: str) -> Optional[AuthUser]: | ||||
|         user = self._auth_users.find_auth_user_by_email(email) | ||||
| @@ -257,22 +238,16 @@ class AuthService(AuthServiceABC): | ||||
|         user.password_salt = uuid.uuid4() | ||||
|         user.password = self._hash_sha256(user_dto.password, user.password_salt) | ||||
|         if not self._is_email_valid(user.email): | ||||
|             raise ServiceException( | ||||
|                 ServiceErrorCode.InvalidData, "Invalid E-Mail address" | ||||
|             ) | ||||
|             raise ServiceException(ServiceErrorCode.InvalidData, "Invalid E-Mail address") | ||||
|  | ||||
|         try: | ||||
|             user.confirmation_id = uuid.uuid4() | ||||
|             self._auth_users.add_auth_user(user) | ||||
|             self._send_confirmation_id_to_user(user) | ||||
|             self._db.save_changes() | ||||
|             self._logger.info( | ||||
|                 __name__, f"Added auth user with E-Mail: {user_dto.email}" | ||||
|             ) | ||||
|             self._logger.info(__name__, f"Added auth user with E-Mail: {user_dto.email}") | ||||
|         except Exception as e: | ||||
|             self._logger.error( | ||||
|                 __name__, f"Cannot add user with E-Mail {user_dto.email}", e | ||||
|             ) | ||||
|             self._logger.error(__name__, f"Cannot add user with E-Mail {user_dto.email}", e) | ||||
|             raise ServiceException(ServiceErrorCode.UnableToAdd, "Invalid E-Mail") | ||||
|  | ||||
|     async def add_auth_user_by_oauth_async(self, dto: OAuthDTO): | ||||
| @@ -288,20 +263,14 @@ class AuthService(AuthServiceABC): | ||||
|             db_user.first_name = dto.user.first_name | ||||
|             db_user.last_name = dto.user.last_name | ||||
|             db_user.password_salt = uuid.uuid4() | ||||
|             db_user.password = self._hash_sha256( | ||||
|                 dto.user.password, db_user.password_salt | ||||
|             ) | ||||
|             db_user.password = self._hash_sha256(dto.user.password, db_user.password_salt) | ||||
|             db_user.oauth_id = None | ||||
|             db_user.confirmation_id = uuid.uuid4() | ||||
|             self._send_confirmation_id_to_user(db_user) | ||||
|             self._auth_users.update_auth_user(db_user) | ||||
|             self._logger.info( | ||||
|                 __name__, f"Added auth user with E-Mail: {dto.user.email}" | ||||
|             ) | ||||
|             self._logger.info(__name__, f"Added auth user with E-Mail: {dto.user.email}") | ||||
|         except Exception as e: | ||||
|             self._logger.error( | ||||
|                 __name__, f"Cannot add user with E-Mail {dto.user.email}", e | ||||
|             ) | ||||
|             self._logger.error(__name__, f"Cannot add user with E-Mail {dto.user.email}", e) | ||||
|             raise ServiceException(ServiceErrorCode.UnableToAdd, "Invalid E-Mail") | ||||
|  | ||||
|         self._db.save_changes() | ||||
| @@ -311,16 +280,14 @@ class AuthService(AuthServiceABC): | ||||
|             raise ServiceException(ServiceErrorCode.InvalidData, f"User is empty") | ||||
|  | ||||
|         if update_user_dto.auth_user is None: | ||||
|             raise ServiceException( | ||||
|                 ServiceErrorCode.InvalidData, f"Existing user is empty" | ||||
|             ) | ||||
|             raise ServiceException(ServiceErrorCode.InvalidData, f"Existing user is empty") | ||||
|  | ||||
|         if update_user_dto.new_auth_user is None: | ||||
|             raise ServiceException(ServiceErrorCode.InvalidData, f"New user is empty") | ||||
|  | ||||
|         if not self._is_email_valid( | ||||
|             update_user_dto.auth_user.email | ||||
|         ) or not self._is_email_valid(update_user_dto.new_auth_user.email): | ||||
|         if not self._is_email_valid(update_user_dto.auth_user.email) or not self._is_email_valid( | ||||
|             update_user_dto.new_auth_user.email | ||||
|         ): | ||||
|             raise ServiceException(ServiceErrorCode.InvalidData, f"Invalid E-Mail") | ||||
|  | ||||
|         user = self._auth_users.find_auth_user_by_email(update_user_dto.auth_user.email) | ||||
| @@ -333,8 +300,7 @@ class AuthService(AuthServiceABC): | ||||
|         # update first name | ||||
|         if ( | ||||
|             update_user_dto.new_auth_user.first_name is not None | ||||
|             and update_user_dto.auth_user.first_name | ||||
|             != update_user_dto.new_auth_user.first_name | ||||
|             and update_user_dto.auth_user.first_name != update_user_dto.new_auth_user.first_name | ||||
|         ): | ||||
|             user.first_name = update_user_dto.new_auth_user.first_name | ||||
|  | ||||
| @@ -342,8 +308,7 @@ class AuthService(AuthServiceABC): | ||||
|         if ( | ||||
|             update_user_dto.new_auth_user.last_name is not None | ||||
|             and update_user_dto.new_auth_user.last_name != "" | ||||
|             and update_user_dto.auth_user.last_name | ||||
|             != update_user_dto.new_auth_user.last_name | ||||
|             and update_user_dto.auth_user.last_name != update_user_dto.new_auth_user.last_name | ||||
|         ): | ||||
|             user.last_name = update_user_dto.new_auth_user.last_name | ||||
|  | ||||
| @@ -353,33 +318,22 @@ class AuthService(AuthServiceABC): | ||||
|             and update_user_dto.new_auth_user.email != "" | ||||
|             and update_user_dto.auth_user.email != update_user_dto.new_auth_user.email | ||||
|         ): | ||||
|             user_by_new_e_mail = self._auth_users.find_auth_user_by_email( | ||||
|                 update_user_dto.new_auth_user.email | ||||
|             ) | ||||
|             user_by_new_e_mail = self._auth_users.find_auth_user_by_email(update_user_dto.new_auth_user.email) | ||||
|             if user_by_new_e_mail is not None: | ||||
|                 raise ServiceException( | ||||
|                     ServiceErrorCode.InvalidUser, "User already exists" | ||||
|                 ) | ||||
|                 raise ServiceException(ServiceErrorCode.InvalidUser, "User already exists") | ||||
|             user.email = update_user_dto.new_auth_user.email | ||||
|  | ||||
|         update_user_dto.auth_user.password = self._hash_sha256( | ||||
|             update_user_dto.auth_user.password, user.password_salt | ||||
|         ) | ||||
|         update_user_dto.auth_user.password = self._hash_sha256(update_user_dto.auth_user.password, user.password_salt) | ||||
|         if update_user_dto.auth_user.password != user.password: | ||||
|             raise ServiceException(ServiceErrorCode.InvalidUser, "Wrong password") | ||||
|  | ||||
|         # update password | ||||
|         if ( | ||||
|             update_user_dto.new_auth_user.password is not None | ||||
|             and self._hash_sha256( | ||||
|                 update_user_dto.new_auth_user.password, user.password_salt | ||||
|             ) | ||||
|             != user.password | ||||
|             and self._hash_sha256(update_user_dto.new_auth_user.password, user.password_salt) != user.password | ||||
|         ): | ||||
|             user.password_salt = uuid.uuid4() | ||||
|             user.password = self._hash_sha256( | ||||
|                 update_user_dto.new_auth_user.password, user.password_salt | ||||
|             ) | ||||
|             user.password = self._hash_sha256(update_user_dto.new_auth_user.password, user.password_salt) | ||||
|  | ||||
|         self._auth_users.update_auth_user(user) | ||||
|         self._db.save_changes() | ||||
| @@ -389,31 +343,23 @@ class AuthService(AuthServiceABC): | ||||
|             raise ServiceException(ServiceErrorCode.InvalidData, f"User is empty") | ||||
|  | ||||
|         if update_user_dto.auth_user is None: | ||||
|             raise ServiceException( | ||||
|                 ServiceErrorCode.InvalidData, f"Existing user is empty" | ||||
|             ) | ||||
|             raise ServiceException(ServiceErrorCode.InvalidData, f"Existing user is empty") | ||||
|  | ||||
|         if update_user_dto.new_auth_user is None: | ||||
|             raise ServiceException(ServiceErrorCode.InvalidData, f"New user is empty") | ||||
|  | ||||
|         if not self._is_email_valid( | ||||
|             update_user_dto.auth_user.email | ||||
|         ) or not self._is_email_valid(update_user_dto.new_auth_user.email): | ||||
|         if not self._is_email_valid(update_user_dto.auth_user.email) or not self._is_email_valid( | ||||
|             update_user_dto.new_auth_user.email | ||||
|         ): | ||||
|             raise ServiceException(ServiceErrorCode.InvalidData, f"Invalid E-Mail") | ||||
|  | ||||
|         user = self._auth_users.find_auth_user_by_email(update_user_dto.auth_user.email) | ||||
|         if user is None: | ||||
|             raise ServiceException(ServiceErrorCode.InvalidUser, "User not found") | ||||
|  | ||||
|         if ( | ||||
|             user.confirmation_id is not None | ||||
|             and update_user_dto.new_auth_user.is_confirmed | ||||
|         ): | ||||
|         if user.confirmation_id is not None and update_user_dto.new_auth_user.is_confirmed: | ||||
|             user.confirmation_id = None | ||||
|         elif ( | ||||
|             user.confirmation_id is None | ||||
|             and not update_user_dto.new_auth_user.is_confirmed | ||||
|         ): | ||||
|         elif user.confirmation_id is None and not update_user_dto.new_auth_user.is_confirmed: | ||||
|             user.confirmation_id = uuid.uuid4() | ||||
|         # else | ||||
|         #     raise ServiceException(ServiceErrorCode.InvalidUser, 'E-Mail not confirmed') | ||||
| @@ -421,8 +367,7 @@ class AuthService(AuthServiceABC): | ||||
|         # update first name | ||||
|         if ( | ||||
|             update_user_dto.new_auth_user.first_name is not None | ||||
|             and update_user_dto.auth_user.first_name | ||||
|             != update_user_dto.new_auth_user.first_name | ||||
|             and update_user_dto.auth_user.first_name != update_user_dto.new_auth_user.first_name | ||||
|         ): | ||||
|             user.first_name = update_user_dto.new_auth_user.first_name | ||||
|  | ||||
| @@ -430,8 +375,7 @@ class AuthService(AuthServiceABC): | ||||
|         if ( | ||||
|             update_user_dto.new_auth_user.last_name is not None | ||||
|             and update_user_dto.new_auth_user.last_name != "" | ||||
|             and update_user_dto.auth_user.last_name | ||||
|             != update_user_dto.new_auth_user.last_name | ||||
|             and update_user_dto.auth_user.last_name != update_user_dto.new_auth_user.last_name | ||||
|         ): | ||||
|             user.last_name = update_user_dto.new_auth_user.last_name | ||||
|  | ||||
| @@ -441,28 +385,19 @@ class AuthService(AuthServiceABC): | ||||
|             and update_user_dto.new_auth_user.email != "" | ||||
|             and update_user_dto.auth_user.email != update_user_dto.new_auth_user.email | ||||
|         ): | ||||
|             user_by_new_e_mail = self._auth_users.find_auth_user_by_email( | ||||
|                 update_user_dto.new_auth_user.email | ||||
|             ) | ||||
|             user_by_new_e_mail = self._auth_users.find_auth_user_by_email(update_user_dto.new_auth_user.email) | ||||
|             if user_by_new_e_mail is not None: | ||||
|                 raise ServiceException( | ||||
|                     ServiceErrorCode.InvalidUser, "User already exists" | ||||
|                 ) | ||||
|                 raise ServiceException(ServiceErrorCode.InvalidUser, "User already exists") | ||||
|             user.email = update_user_dto.new_auth_user.email | ||||
|  | ||||
|         # update password | ||||
|         if ( | ||||
|             update_user_dto.new_auth_user.password is not None | ||||
|             and update_user_dto.change_password | ||||
|             and user.password | ||||
|             != self._hash_sha256( | ||||
|                 update_user_dto.new_auth_user.password, user.password_salt | ||||
|             ) | ||||
|             and user.password != self._hash_sha256(update_user_dto.new_auth_user.password, user.password_salt) | ||||
|         ): | ||||
|             user.password_salt = uuid.uuid4() | ||||
|             user.password = self._hash_sha256( | ||||
|                 update_user_dto.new_auth_user.password, user.password_salt | ||||
|             ) | ||||
|             user.password = self._hash_sha256(update_user_dto.new_auth_user.password, user.password_salt) | ||||
|  | ||||
|         # update role | ||||
|         if ( | ||||
| @@ -481,9 +416,7 @@ class AuthService(AuthServiceABC): | ||||
|             self._db.save_changes() | ||||
|         except Exception as e: | ||||
|             self._logger.error(__name__, f"Cannot delete user", e) | ||||
|             raise ServiceException( | ||||
|                 ServiceErrorCode.UnableToDelete, f"Cannot delete user by mail {email}" | ||||
|             ) | ||||
|             raise ServiceException(ServiceErrorCode.UnableToDelete, f"Cannot delete user by mail {email}") | ||||
|  | ||||
|     async def delete_auth_user_async(self, user_dto: AuthUser): | ||||
|         try: | ||||
| @@ -567,9 +500,7 @@ class AuthService(AuthServiceABC): | ||||
|             if user.id in user_ids: | ||||
|                 continue | ||||
|  | ||||
|             self._auth_users.add_auth_user_user_rel( | ||||
|                 AuthUserUsersRelation(db_user, user) | ||||
|             ) | ||||
|             self._auth_users.add_auth_user_user_rel(AuthUserUsersRelation(db_user, user)) | ||||
|  | ||||
|         if db_user.confirmation_id is not None and not added_user: | ||||
|             raise ServiceException(ServiceErrorCode.Forbidden, "E-Mail not verified") | ||||
| @@ -599,19 +530,13 @@ class AuthService(AuthServiceABC): | ||||
|             ): | ||||
|                 raise ServiceException(ServiceErrorCode.InvalidData, "Token expired") | ||||
|  | ||||
|             return TokenDTO( | ||||
|                 self.generate_token(user), self._create_and_save_refresh_token(user) | ||||
|             ) | ||||
|             return TokenDTO(self.generate_token(user), self._create_and_save_refresh_token(user)) | ||||
|         except Exception as e: | ||||
|             self._logger.error(__name__, f"Refreshing token failed", e) | ||||
|             return TokenDTO("", "") | ||||
|  | ||||
|     async def revoke_async(self, token_dto: TokenDTO): | ||||
|         if ( | ||||
|             token_dto is None | ||||
|             or token_dto.token is None | ||||
|             or token_dto.refresh_token is None | ||||
|         ): | ||||
|         if token_dto is None or token_dto.token is None or token_dto.refresh_token is None: | ||||
|             raise ServiceException(ServiceErrorCode.InvalidData, "Token not set") | ||||
|  | ||||
|         try: | ||||
| @@ -664,9 +589,7 @@ class AuthService(AuthServiceABC): | ||||
|             ) | ||||
|  | ||||
|         if user.confirmation_id is not None: | ||||
|             raise ServiceException( | ||||
|                 ServiceErrorCode.InvalidUser, f"E-Mail not confirmed" | ||||
|             ) | ||||
|             raise ServiceException(ServiceErrorCode.InvalidUser, f"E-Mail not confirmed") | ||||
|  | ||||
|         if user.password is None or rp_dto.password == "": | ||||
|             raise ServiceException(ServiceErrorCode.InvalidData, f"Password not set") | ||||
|   | ||||
| @@ -53,17 +53,13 @@ class DiscordService: | ||||
|         if role != AuthRoleEnum.admin: | ||||
|             auth_user = self._auth_users.find_auth_user_by_email(token["email"]) | ||||
|             if auth_user is not None: | ||||
|                 user_ids = auth_user.users.select( | ||||
|                     lambda x: x.server is not None and x.server.id | ||||
|                 ) | ||||
|                 user_ids = auth_user.users.select(lambda x: x.server is not None and x.server.id) | ||||
|                 servers = servers.where(lambda x: x.id in user_ids) | ||||
|  | ||||
|         servers = List(ServerDTO, servers) | ||||
|         return servers.select(self._to_dto).where(lambda x: x.name != "") | ||||
|  | ||||
|     async def get_filtered_servers_async( | ||||
|         self, criteria: ServerSelectCriteria | ||||
|     ) -> ServerFilteredResultDTO: | ||||
|     async def get_filtered_servers_async(self, criteria: ServerSelectCriteria) -> ServerFilteredResultDTO: | ||||
|         token = self._auth.get_decoded_token_from_request() | ||||
|         if token is None or "email" not in token or "role" not in token: | ||||
|             raise ServiceException(ServiceErrorCode.InvalidData, "Token invalid") | ||||
| @@ -74,22 +70,15 @@ class DiscordService: | ||||
|         if role != AuthRoleEnum.admin: | ||||
|             auth_user = self._auth_users.find_auth_user_by_email(token["email"]) | ||||
|             if auth_user is not None: | ||||
|                 user_ids = auth_user.users.select( | ||||
|                     lambda x: x.server is not None and x.server.id | ||||
|                 ) | ||||
|                 filtered_result.result = filtered_result.result.where( | ||||
|                     lambda x: x.id in user_ids | ||||
|                 ) | ||||
|                 user_ids = auth_user.users.select(lambda x: x.server is not None and x.server.id) | ||||
|                 filtered_result.result = filtered_result.result.where(lambda x: x.id in user_ids) | ||||
|  | ||||
|         servers: List = filtered_result.result.select(self._to_dto).where( | ||||
|             lambda x: x.name != "" | ||||
|         ) | ||||
|         servers: List = filtered_result.result.select(self._to_dto).where(lambda x: x.name != "") | ||||
|         result = List(ServerDTO, servers) | ||||
|  | ||||
|         if criteria.name is not None and criteria.name != "": | ||||
|             result = result.where( | ||||
|                 lambda x: criteria.name.lower() in x.name.lower() | ||||
|                 or x.name.lower() == criteria.name.lower() | ||||
|                 lambda x: criteria.name.lower() in x.name.lower() or x.name.lower() == criteria.name.lower() | ||||
|             ) | ||||
|  | ||||
|         return ServerFilteredResultDTO(List(ServerDTO, result), servers.count()) | ||||
| @@ -98,7 +87,5 @@ class DiscordService: | ||||
|         server = self._servers.get_server_by_id(id) | ||||
|         guild = self._bot.get_guild(server.discord_id) | ||||
|  | ||||
|         server_dto = ServerTransformer.to_dto( | ||||
|             server, guild.name, guild.member_count, guild.icon | ||||
|         ) | ||||
|         server_dto = ServerTransformer.to_dto(server, guild.name, guild.member_count, guild.icon) | ||||
|         return server_dto | ||||
|   | ||||
| @@ -27,35 +27,27 @@ class AuthUserTransformer(TransformerABC): | ||||
|             None, | ||||
|             None, | ||||
|             datetime.now(), | ||||
|             AuthRoleEnum.normal | ||||
|             if dto.auth_role is None | ||||
|             else AuthRoleEnum(dto.auth_role), | ||||
|             AuthRoleEnum.normal if dto.auth_role is None else AuthRoleEnum(dto.auth_role), | ||||
|             auth_user_id=0 if dto.id is None else dto.id, | ||||
|         ) | ||||
|  | ||||
|     @staticmethod | ||||
|     @ServiceProviderABC.inject | ||||
|     def _is_technician( | ||||
|         user: User, bot: DiscordBotServiceABC, permissions: PermissionServiceABC | ||||
|     ): | ||||
|     def _is_technician(user: User, bot: DiscordBotServiceABC, permissions: PermissionServiceABC): | ||||
|         guild = bot.get_guild(user.server.discord_id) | ||||
|         member = guild.get_member(user.discord_id) | ||||
|         return permissions.is_member_technician(member) | ||||
|  | ||||
|     @staticmethod | ||||
|     @ServiceProviderABC.inject | ||||
|     def _is_admin( | ||||
|         user: User, bot: DiscordBotServiceABC, permissions: PermissionServiceABC | ||||
|     ): | ||||
|     def _is_admin(user: User, bot: DiscordBotServiceABC, permissions: PermissionServiceABC): | ||||
|         guild = bot.get_guild(user.server.discord_id) | ||||
|         member = guild.get_member(user.discord_id) | ||||
|         return permissions.is_member_admin(member) | ||||
|  | ||||
|     @staticmethod | ||||
|     @ServiceProviderABC.inject | ||||
|     def _is_moderator( | ||||
|         user: User, bot: DiscordBotServiceABC, permissions: PermissionServiceABC | ||||
|     ): | ||||
|     def _is_moderator(user: User, bot: DiscordBotServiceABC, permissions: PermissionServiceABC): | ||||
|         guild = bot.get_guild(user.server.discord_id) | ||||
|         member = guild.get_member(user.discord_id) | ||||
|         return permissions.is_member_moderator(member) | ||||
|   | ||||
| @@ -13,9 +13,7 @@ class ServerTransformer(TransformerABC): | ||||
|         return Server(dto.discord_id) | ||||
|  | ||||
|     @staticmethod | ||||
|     def to_dto( | ||||
|         db: Server, name: str, member_count: int, icon_url: Optional[discord.Asset] | ||||
|     ) -> ServerDTO: | ||||
|     def to_dto(db: Server, name: str, member_count: int, icon_url: Optional[discord.Asset]) -> ServerDTO: | ||||
|         return ServerDTO( | ||||
|             db.id, | ||||
|             db.discord_id, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user