From f9da60675ed0a636955691be432d37676c68c973 Mon Sep 17 00:00:00 2001 From: pfvatterott Date: Tue, 28 Oct 2025 14:27:00 -0600 Subject: [PATCH 1/3] new-apis --- propelauth_flask/__init__.py | 188 +++++++++++++++++++++++++++++++---- 1 file changed, 171 insertions(+), 17 deletions(-) diff --git a/propelauth_flask/__init__.py b/propelauth_flask/__init__.py index 71fbbd0..66a93b7 100644 --- a/propelauth_flask/__init__.py +++ b/propelauth_flask/__init__.py @@ -269,16 +269,13 @@ def create_magic_link( self, email: str, redirect_to_url: Optional[str] = None, - expires_in_hours: Optional[str] = None, + expires_in_hours: Optional[int] = None, create_new_user_if_one_doesnt_exist: Optional[bool] = None, user_signup_query_parameters: Optional[Dict[str, Any]] = None, + expire_after_first_use: Optional[bool] = None ): return self.auth.create_magic_link( - email, - redirect_to_url, - expires_in_hours, - create_new_user_if_one_doesnt_exist, - user_signup_query_parameters, + email, redirect_to_url, expires_in_hours, create_new_user_if_one_doesnt_exist, user_signup_query_parameters, expire_after_first_use ) def create_access_token( @@ -460,13 +457,8 @@ def create_api_key( ): return self.auth.create_api_key(org_id, user_id, expires_at_seconds, metadata) - def update_api_key( - self, - api_key_id: str, - expires_at_seconds: Optional[str] = None, - metadata: Optional[Dict[str, Any]] = None, - ): - return self.auth.update_api_key(api_key_id, expires_at_seconds, metadata) + def update_api_key(self, api_key_id: str, expires_at_seconds: Optional[str] = None, metadata: Optional[Dict[str, Any]] = None, set_to_never_expire: Optional[bool] = None): + return self.auth.update_api_key(api_key_id, expires_at_seconds, metadata, set_to_never_expire) def delete_api_key(self, api_key_id: str): return self.auth.delete_api_key(api_key_id) @@ -508,6 +500,80 @@ def verify_step_up_totp_challenge( def verify_step_up_grant(self, action_type: str, user_id: str, grant: str) -> bool: return self.auth.verify_step_up_grant(action_type, user_id, grant) + + def fetch_user_mfa_methods(self, user_id: str): + return self.auth.fetch_user_mfa_methods(user_id) + + def invite_user_to_org_by_user_id( + self, user_id: str, org_id: str, role: str, additional_roles: List[str] = [] + ): + return self.auth.invite_user_to_org_by_user_id( + user_id, + org_id, + role, + additional_roles, + ) + + def validate_imported_api_key(self, api_key_token: str): + return self.auth.validate_imported_api_key(api_key_token) + + def fetch_api_key_usage( + self, + date: str, + org_id: Optional[str] = None, + user_id: Optional[str] = None, + api_key_id: Optional[str] = None + ): + return self.auth.fetch_api_key_usage( + date, org_id, user_id, api_key_id + ) + + def import_api_key( + self, + api_key_token: str, + org_id: Optional[str] = None, + user_id: Optional[str] = None, + expires_at_seconds: Optional[str] = None, + metadata: Optional[Dict[str, Any]] = None, + ): + return self.auth.import_api_key( + api_key_token, + org_id, + user_id, + expires_at_seconds, + metadata, + ) + + def send_sms_mfa_code( + self, + action_type: str, + user_id: str, + mfa_phone_id: str, + grant_type: StepUpMfaGrantType, + valid_for_seconds: int, + ): + return self.auth.send_sms_mfa_code( + action_type, + user_id, + mfa_phone_id, + grant_type, + valid_for_seconds + ) + + def verify_sms_challenge( + self, + challenge_id: str, + user_id: str, + code: str, + ): + return self.auth.verify_sms_challenge( + challenge_id, + user_id, + code + ) + + def fetch_employee_by_id(self, employee_id: str): + return self.auth.fetch_employee_by_id(employee_id) class FlaskAuthAsync(): @@ -672,12 +738,13 @@ async def create_magic_link( self, email: str, redirect_to_url: Optional[str] = None, - expires_in_hours: Optional[str] = None, + expires_in_hours: Optional[int] = None, create_new_user_if_one_doesnt_exist: Optional[bool] = None, user_signup_query_parameters: Optional[Dict[str, Any]] = None, + expire_after_first_use: Optional[bool] = None ): return await self.auth.create_magic_link( - email, redirect_to_url, expires_in_hours, create_new_user_if_one_doesnt_exist, user_signup_query_parameters + email, redirect_to_url, expires_in_hours, create_new_user_if_one_doesnt_exist, user_signup_query_parameters, expire_after_first_use ) async def create_access_token(self, user_id: str, duration_in_minutes: int, active_org_id: Optional[str] = None): @@ -824,8 +891,8 @@ async def create_api_key( ): return await self.auth.create_api_key(org_id, user_id, expires_at_seconds, metadata) - async def update_api_key(self, api_key_id: str, expires_at_seconds: Optional[str] = None, metadata: Optional[Dict[str, Any]] = None): - return await self.auth.update_api_key(api_key_id, expires_at_seconds, metadata) + async def update_api_key(self, api_key_id: str, expires_at_seconds: Optional[str] = None, metadata: Optional[Dict[str, Any]] = None, set_to_never_expire: Optional[bool] = None): + return await self.auth.update_api_key(api_key_id, expires_at_seconds, metadata, set_to_never_expire) async def delete_api_key(self, api_key_id: str): return await self.auth.delete_api_key(api_key_id) @@ -865,6 +932,93 @@ async def verify_step_up_totp_challenge( async def verify_step_up_grant(self, action_type: str, user_id: str, grant: str) -> bool: return await self.auth.verify_step_up_grant(action_type, user_id, grant) + + async def validate_imported_api_key(self, api_key_token: str): + return await self.auth.validate_imported_api_key( + api_key_token=api_key_token + ) + + async def fetch_api_key_usage( + self, + date: str, + org_id: Optional[str] = None, + user_id: Optional[str] = None, + api_key_id: Optional[str] = None + ): + return await self.auth.fetch_api_key_usage( + date, + org_id, + user_id, + api_key_id + ) + + async def import_api_key( + self, + api_key_token: str, + org_id: Optional[str] = None, + user_id: Optional[str] = None, + expires_at_seconds: Optional[str] = None, + metadata: Optional[Dict[str, Any]] = None, + ): + return await self.auth.import_api_key( + api_key_token, + org_id, + user_id, + expires_at_seconds, + metadata, + ) + + async def invite_user_to_org_by_user_id( + self, + user_id: str, + org_id: str, + role: str, + additional_roles: List[str] = [] + ): + return await self.auth.invite_user_to_org_by_user_id( + user_id, + org_id, + role, + additional_roles, + ) + + async def fetch_user_mfa_methods(self, user_id: str): + return await self.auth.fetch_user_mfa_methods( + user_id, + ) + + async def send_sms_mfa_code( + self, + action_type: str, + user_id: str, + mfa_phone_id: str, + grant_type: StepUpMfaGrantType, + valid_for_seconds: int, + ): + return await self.auth.send_sms_mfa_code( + action_type, + user_id, + mfa_phone_id, + grant_type, + valid_for_seconds + ) + + async def verify_sms_challenge( + self, + challenge_id: str, + user_id: str, + code: str, + ): + return await self.auth.verify_sms_challenge( + challenge_id, + user_id, + code + ) + + async def fetch_employee_by_id(self, employee_id: str): + return await self.auth.fetch_employee_by_id( + employee_id + ) def init_auth( auth_url: str, From 93c002b9ca415ad11e44bb31d276736b3d484aea Mon Sep 17 00:00:00 2001 From: pfvatterott Date: Fri, 31 Oct 2025 14:27:53 -0600 Subject: [PATCH 2/3] version bumps --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 64a3a59..6e3526b 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,7 @@ setup( name="propelauth-flask", - version="4.2.8", + version="4.2.9", description="A library for managing authentication in Flask", long_description=README, long_description_content_type="text/markdown", @@ -21,7 +21,7 @@ author="PropelAuth", author_email="support@propelauth.com", license="MIT", - install_requires=["flask<4", "propelauth-py==4.2.8", "requests", "httpx>=0.28.1"], + install_requires=["flask<4", "propelauth-py==4.2.9", "requests", "httpx>=0.28.1"], setup_requires=pytest_runner, tests_require=["pytest==4.4.1"], test_suite="tests", From 1bb1010d662c0a7855d573075674076560167101 Mon Sep 17 00:00:00 2001 From: pfvatterott Date: Fri, 31 Oct 2025 15:30:16 -0600 Subject: [PATCH 3/3] Update requirements.txt --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 6ed90d8..dfbe3f0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ flask<4 -propelauth-py==4.2.8 +propelauth-py==4.2.9 pytest requests-mock httpx