Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# Change Log

## 24.3.0

* Added: `account` passkey methods `listPasskeys`, `createPasskey`, `getPasskey`, `updatePasskey`, `deletePasskey` and `updatePasskeyVerification`
* Added: `account.createPasskeyToken` and `account.updatePasskeyToken` for passkey sign-in
* Added: `users.listPasskeys`, `users.getPasskey`, `users.updatePasskey` and `users.deletePasskey`
* Added: `project.updatePasskeyPolicy` to configure passkey sign-in
* Added: `Passkey`, `PasskeyList`, `PasskeyChallenge` and `TokenSecret` models

## 24.2.0

* Added: optional `interval` parameter on `functions.create` and `functions.update` to run a function every N minutes
Expand Down
4 changes: 2 additions & 2 deletions appwrite/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@ def __init__(self):
self._endpoint = 'https://cloud.appwrite.io/v1'
self._global_headers = {
'content-type': '',
'user-agent': f'AppwritePythonSDK/24.2.0 ({platform.uname().system}; {platform.uname().version}; {platform.uname().machine})',
'user-agent': f'AppwritePythonSDK/24.3.0 ({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.2.0',
'x-sdk-version': '24.3.0',
'X-Appwrite-Response-Format': '2.0.0',
}
self._config = {}
Expand Down
8 changes: 8 additions & 0 deletions appwrite/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,10 @@
from .email_template import EmailTemplate
from .mfa_challenge import MfaChallenge
from .mfa_challenge_secret import MfaChallengeSecret
from .token_secret import TokenSecret
from .passkey import Passkey
from .passkey_challenge import PasskeyChallenge
from .passkey_list import PasskeyList
from .mfa_recovery_codes import MfaRecoveryCodes
from .mfa_type import MfaType
from .mfa_factors import MfaFactors
Expand Down Expand Up @@ -511,6 +515,10 @@
'EmailTemplate',
'MfaChallenge',
'MfaChallengeSecret',
'TokenSecret',
'Passkey',
'PasskeyChallenge',
'PasskeyList',
'MfaRecoveryCodes',
'MfaType',
'MfaFactors',
Expand Down
29 changes: 29 additions & 0 deletions appwrite/models/passkey.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from typing import Any, Dict, List, Optional, Union, cast
from pydantic import Field, PrivateAttr

from .base_model import AppwriteModel


class Passkey(AppwriteModel):
"""
Passkey

Attributes
----------
id : str
Passkey ID.
createdat : str
Passkey creation date in ISO 8601 format.
updatedat : str
Passkey update date in ISO 8601 format.
name : str
Passkey name.
accessedat : str
Most recent sign-in with this passkey in ISO 8601 format. Empty until the passkey is used to sign in.
"""

id: str = Field(..., alias='$id')
createdat: str = Field(..., alias='$createdAt')
updatedat: str = Field(..., alias='$updatedAt')
name: str = Field(..., alias='name')
accessedat: str = Field(..., alias='accessedAt')
29 changes: 29 additions & 0 deletions appwrite/models/passkey_challenge.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from typing import Any, Dict, List, Optional, Union, cast
from pydantic import Field, PrivateAttr

from .base_model import AppwriteModel


class PasskeyChallenge(AppwriteModel):
"""
Passkey Challenge

Attributes
----------
id : str
Challenge ID. When signing in, pass it back with the credential to receive a token.
createdat : str
Challenge creation date in ISO 8601 format.
passkeyid : str
ID of the passkey being registered. Empty for sign-in challenges.
expire : str
Challenge expiration date in ISO 8601 format.
publickey : Dict[str, Any]
WebAuthn options in JSON form. Pass them to `PublicKeyCredential.parseCreationOptionsFromJSON()` when registering, or `PublicKeyCredential.parseRequestOptionsFromJSON()` when signing in.
"""

id: str = Field(..., alias='$id')
createdat: str = Field(..., alias='$createdAt')
passkeyid: str = Field(..., alias='passkeyId')
expire: str = Field(..., alias='expire')
publickey: Dict[str, Any] = Field(..., alias='publicKey')
21 changes: 21 additions & 0 deletions appwrite/models/passkey_list.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
from typing import Any, Dict, List, Optional, Union, cast
from pydantic import Field, PrivateAttr

from .base_model import AppwriteModel
from .passkey import Passkey


class PasskeyList(AppwriteModel):
"""
Passkeys List

Attributes
----------
total : float
Total number of passkeys that matched your query.
passkeys : List[Passkey]
List of passkeys.
"""

total: float = Field(..., alias='total')
passkeys: List[Passkey] = Field(..., alias='passkeys')
32 changes: 32 additions & 0 deletions appwrite/models/token_secret.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
from typing import Any, Dict, List, Optional, Union, cast
from pydantic import Field, PrivateAttr

from .base_model import AppwriteModel


class TokenSecret(AppwriteModel):
"""
Token Secret

Attributes
----------
id : str
Token ID.
createdat : str
Token creation date in ISO 8601 format.
userid : str
User ID.
secret : str
Token secret key. Exchange it for a session with the create session endpoint.
expire : str
Token expiration date in ISO 8601 format.
phrase : str
Security phrase of a token. Empty if security phrase was not requested when creating a token. It includes randomly generated phrase which is also sent in the external resource such as email.
"""

id: str = Field(..., alias='$id')
createdat: str = Field(..., alias='$createdAt')
userid: str = Field(..., alias='userId')
secret: str = Field(..., alias='secret')
expire: str = Field(..., alias='expire')
phrase: str = Field(..., alias='phrase')
Loading
Loading