diff --git a/CHANGELOG.md b/CHANGELOG.md index 634a135..118ce9e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Change Log +## 24.3.1 + +* Fixed: added `ProjectAuthMethodId.PASSKEY`, so `project.updateAuthMethod` can enable passkeys +* Fixed: added `ProjectPolicyId.PASSKEY` and the `PolicyPasskey` model, so `getPolicy` and `listPolicies` return the passkey policy + ## 24.3.0 * Added: `account` passkey methods `listPasskeys`, `createPasskey`, `getPasskey`, `updatePasskey`, `deletePasskey` and `updatePasskeyVerification` diff --git a/appwrite/client.py b/appwrite/client.py index f1c96d6..df31c04 100644 --- a/appwrite/client.py +++ b/appwrite/client.py @@ -18,11 +18,11 @@ def __init__(self): self._endpoint = 'https://cloud.appwrite.io/v1' self._global_headers = { 'content-type': '', - 'user-agent': f'AppwritePythonSDK/24.3.0 ({platform.uname().system}; {platform.uname().version}; {platform.uname().machine})', + 'user-agent': f'AppwritePythonSDK/24.3.1 ({platform.uname().system}; {platform.uname().version}; {platform.uname().machine})', 'x-sdk-name': 'Python', 'x-sdk-platform': 'server', 'x-sdk-language': 'python', - 'x-sdk-version': '24.3.0', + 'x-sdk-version': '24.3.1', 'X-Appwrite-Response-Format': '2.0.0', } self._config = {} diff --git a/appwrite/enums/project_auth_method_id.py b/appwrite/enums/project_auth_method_id.py index 8ebb7fb..834fe51 100644 --- a/appwrite/enums/project_auth_method_id.py +++ b/appwrite/enums/project_auth_method_id.py @@ -9,3 +9,4 @@ class ProjectAuthMethodId(Enum): INVITES = "invites" JWT = "jwt" PHONE = "phone" + PASSKEY = "passkey" diff --git a/appwrite/enums/project_policy_id.py b/appwrite/enums/project_policy_id.py index a3f0643..cdb27f8 100644 --- a/appwrite/enums/project_policy_id.py +++ b/appwrite/enums/project_policy_id.py @@ -17,3 +17,4 @@ class ProjectPolicyId(Enum): DENY_DISPOSABLE_EMAIL = "deny-disposable-email" DENY_FREE_EMAIL = "deny-free-email" DENY_CORPORATE_EMAIL = "deny-corporate-email" + PASSKEY = "passkey" diff --git a/appwrite/models/__init__.py b/appwrite/models/__init__.py index 5acdce0..2b02e1a 100644 --- a/appwrite/models/__init__.py +++ b/appwrite/models/__init__.py @@ -190,6 +190,7 @@ from .policy_user_limit import PolicyUserLimit from .policy_membership_privacy import PolicyMembershipPrivacy from .policy_mfa_factors import PolicyMfaFactors +from .policy_passkey import PolicyPasskey from .platform_web import PlatformWeb from .platform_apple import PlatformApple from .platform_android import PlatformAndroid @@ -497,6 +498,7 @@ 'PolicyUserLimit', 'PolicyMembershipPrivacy', 'PolicyMfaFactors', + 'PolicyPasskey', 'PlatformWeb', 'PlatformApple', 'PlatformAndroid', diff --git a/appwrite/models/policy_list.py b/appwrite/models/policy_list.py index 79e8802..beeb5c9 100644 --- a/appwrite/models/policy_list.py +++ b/appwrite/models/policy_list.py @@ -17,6 +17,7 @@ from .policy_deny_disposable_email import PolicyDenyDisposableEmail from .policy_deny_free_email import PolicyDenyFreeEmail from .policy_deny_corporate_email import PolicyDenyCorporateEmail +from .policy_passkey import PolicyPasskey class PolicyList(AppwriteModel): @@ -27,7 +28,7 @@ class PolicyList(AppwriteModel): ---------- total : float Total number of policies in the given project. - policies : List[Union[PolicyPasswordDictionary, PolicyPasswordHistory, PolicyPasswordStrength, PolicyPasswordPersonalData, PolicySessionAlert, PolicySessionDuration, PolicySessionInvalidation, PolicySessionLimit, PolicyUserLimit, PolicyMembershipPrivacy, PolicyMfaFactors, PolicyDenyAliasedEmail, PolicyDenyDisposableEmail, PolicyDenyFreeEmail, PolicyDenyCorporateEmail]] + policies : List[Union[PolicyPasswordDictionary, PolicyPasswordHistory, PolicyPasswordStrength, PolicyPasswordPersonalData, PolicySessionAlert, PolicySessionDuration, PolicySessionInvalidation, PolicySessionLimit, PolicyUserLimit, PolicyMembershipPrivacy, PolicyMfaFactors, PolicyDenyAliasedEmail, PolicyDenyDisposableEmail, PolicyDenyFreeEmail, PolicyDenyCorporateEmail, PolicyPasskey]] List of policies. """ @@ -49,5 +50,6 @@ class PolicyList(AppwriteModel): PolicyDenyDisposableEmail, PolicyDenyFreeEmail, PolicyDenyCorporateEmail, + PolicyPasskey, ] ] = Field(..., alias='policies') diff --git a/appwrite/models/policy_passkey.py b/appwrite/models/policy_passkey.py new file mode 100644 index 0000000..7ec34d7 --- /dev/null +++ b/appwrite/models/policy_passkey.py @@ -0,0 +1,23 @@ +from typing import Any, Dict, List, Optional, Union, cast +from pydantic import Field, PrivateAttr + +from .base_model import AppwriteModel + + +class PolicyPasskey(AppwriteModel): + """ + Policy Passkey + + Attributes + ---------- + id : str + Policy ID. + rpid : str + Relying party ID passkeys are bound to. Empty until configured. + origins : List[Any] + Web origins passkeys work on, from the project's platforms on the relying party ID and a localhost web platform. Read-only. + """ + + id: str = Field(..., alias='$id') + rpid: str = Field(..., alias='rpId') + origins: List[Any] = Field(..., alias='origins') diff --git a/appwrite/services/project.py b/appwrite/services/project.py index 59a898c..84737c4 100644 --- a/appwrite/services/project.py +++ b/appwrite/services/project.py @@ -82,6 +82,7 @@ from ..models.policy_deny_disposable_email import PolicyDenyDisposableEmail from ..models.policy_deny_free_email import PolicyDenyFreeEmail from ..models.policy_deny_corporate_email import PolicyDenyCorporateEmail +from ..models.policy_passkey import PolicyPasskey from ..enums.project_protocol_id import ProjectProtocolId from ..enums.project_service_id import ProjectServiceId from ..enums.project_smtp_secure import ProjectSMTPSecure @@ -4913,6 +4914,7 @@ def get_policy( PolicyDenyDisposableEmail, PolicyDenyFreeEmail, PolicyDenyCorporateEmail, + PolicyPasskey, ]: """ Get a policy by its unique ID. This endpoint returns the current configuration for the requested project policy. @@ -4923,7 +4925,7 @@ def get_policy( Policy ID. Can be one of: password-dictionary, password-history, password-strength, password-personal-data, session-alert, session-duration, session-invalidation, session-limit, user-limit, membership-privacy, mfa-factors, deny-aliased-email, deny-disposable-email, deny-free-email, deny-corporate-email. Returns ------- - Union[PolicyPasswordDictionary, PolicyPasswordHistory, PolicyPasswordStrength, PolicyPasswordPersonalData, PolicySessionAlert, PolicySessionDuration, PolicySessionInvalidation, PolicySessionLimit, PolicyUserLimit, PolicyMembershipPrivacy, PolicyMfaFactors, PolicyDenyAliasedEmail, PolicyDenyDisposableEmail, PolicyDenyFreeEmail, PolicyDenyCorporateEmail] + Union[PolicyPasswordDictionary, PolicyPasswordHistory, PolicyPasswordStrength, PolicyPasswordPersonalData, PolicySessionAlert, PolicySessionDuration, PolicySessionInvalidation, PolicySessionLimit, PolicyUserLimit, PolicyMembershipPrivacy, PolicyMfaFactors, PolicyDenyAliasedEmail, PolicyDenyDisposableEmail, PolicyDenyFreeEmail, PolicyDenyCorporateEmail, PolicyPasskey] API response as one of the typed response models Raises @@ -4995,6 +4997,9 @@ def get_policy( if response.get('$id') == 'deny-corporate-email': return self._parse_response(response, model=PolicyDenyCorporateEmail) + if response.get('$id') == 'passkey': + return self._parse_response(response, model=PolicyPasskey) + raise AppwriteException('Unable to match response to any known model') def update_protocol( diff --git a/docs/examples/project/get-policy.md b/docs/examples/project/get-policy.md index 16caef1..90e7159 100644 --- a/docs/examples/project/get-policy.md +++ b/docs/examples/project/get-policy.md @@ -16,6 +16,7 @@ from appwrite.models import PolicyDenyAliasedEmail from appwrite.models import PolicyDenyDisposableEmail from appwrite.models import PolicyDenyFreeEmail from appwrite.models import PolicyDenyCorporateEmail +from appwrite.models import PolicyPasskey from typing import Union from appwrite.enums import ProjectPolicyId @@ -26,7 +27,7 @@ client.set_key('') # Your secret API key project = Project(client) -result: Union[PolicyPasswordDictionary, PolicyPasswordHistory, PolicyPasswordStrength, PolicyPasswordPersonalData, PolicySessionAlert, PolicySessionDuration, PolicySessionInvalidation, PolicySessionLimit, PolicyUserLimit, PolicyMembershipPrivacy, PolicyMfaFactors, PolicyDenyAliasedEmail, PolicyDenyDisposableEmail, PolicyDenyFreeEmail, PolicyDenyCorporateEmail] = project.get_policy( +result: Union[PolicyPasswordDictionary, PolicyPasswordHistory, PolicyPasswordStrength, PolicyPasswordPersonalData, PolicySessionAlert, PolicySessionDuration, PolicySessionInvalidation, PolicySessionLimit, PolicyUserLimit, PolicyMembershipPrivacy, PolicyMfaFactors, PolicyDenyAliasedEmail, PolicyDenyDisposableEmail, PolicyDenyFreeEmail, PolicyDenyCorporateEmail, PolicyPasskey] = project.get_policy( policy_id = ProjectPolicyId.PASSWORD_DICTIONARY ) diff --git a/pyproject.toml b/pyproject.toml index 75b5183..0698c71 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "appwrite" -version = "24.3.0" +version = "24.3.1" description = "Appwrite is an open-source self-hosted backend server that abstracts and simplifies complex and repetitive development tasks behind a very simple REST API" readme = "README.md" requires-python = ">=3.9" diff --git a/setup.py b/setup.py index ac9d806..cee81d4 100644 --- a/setup.py +++ b/setup.py @@ -8,7 +8,7 @@ setuptools.setup( name='appwrite', packages=setuptools.find_packages(), - version='24.3.0', + version='24.3.1', license='BSD-3-Clause', description='Appwrite is an open-source self-hosted backend server that abstracts and simplifies complex and repetitive development tasks behind a very simple REST API', long_description=long_description, @@ -18,7 +18,7 @@ maintainer='Appwrite Team', maintainer_email='team@appwrite.io', url='https://appwrite.io/support', - download_url='https://github.com/appwrite/sdk-for-python/archive/24.3.0.tar.gz', + download_url='https://github.com/appwrite/sdk-for-python/archive/24.3.1.tar.gz', install_requires=[ 'requests', 'pydantic>=2,<3',