Skip to content
Closed
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
36 changes: 19 additions & 17 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [unreleased]

- Fixes session test cases failure due to dst [#554]

## [0.27.0] - 2024-12-30

- Added OAuth2Provider recipe
Expand Down Expand Up @@ -277,7 +279,7 @@ async def change_email(req: ChangeEmailBody, session: SessionContainer = Depends
# Update the email
await update_email_or_password(
session.get_recipe_user_id(),
email,
email,
)

# ...
Expand Down Expand Up @@ -360,7 +362,7 @@ from supertokens_python.types import RecipeUserId

def functions_override(original_implementation: RecipeInterface):
o_create_new_session = original_implementation.create_new_session

async def n_create_new_session(
user_id: str,
recipe_user_id: RecipeUserId,
Expand All @@ -377,7 +379,7 @@ def functions_override(original_implementation: RecipeInterface):
return await o_create_new_session(user_id, recipe_user_id, access_token_payload, session_data_in_database, disable_anti_csrf, tenant_id, user_context)

original_implementation.create_new_session = n_create_new_session

return original_implementation

session.init(override=session.InputOverrideConfig(functions=functions_override))
Expand All @@ -395,7 +397,7 @@ from supertokens_python.types import RecipeUserId

def functions_override(original_implementation: RecipeInterface):
o_create_new_session = original_implementation.create_new_session

async def n_create_new_session(
user_id: str,
recipe_user_id: RecipeUserId,
Expand All @@ -412,7 +414,7 @@ def functions_override(original_implementation: RecipeInterface):
return await o_create_new_session(user_id, recipe_user_id, access_token_payload, session_data_in_database, disable_anti_csrf, tenant_id, user_context)

original_implementation.create_new_session = n_create_new_session

return original_implementation

session.init(override=session.InputOverrideConfig(functions=functions_override))
Expand Down Expand Up @@ -632,7 +634,7 @@ thirdparty.init(
third_party_id="google",
# rest of the config
),

# Add the following line to make this provider available in non-public tenants by default
include_in_non_public_tenants_by_default=True
),
Expand All @@ -641,7 +643,7 @@ thirdparty.init(
third_party_id="github",
# rest of the config
),

# Add the following line to make this provider available in non-public tenants by default
include_in_non_public_tenants_by_default=True
),
Expand Down Expand Up @@ -733,7 +735,7 @@ for tenant in tenants_res.tenants:

- The way to get user information has changed:
- If you are using `get_users_by_email` from `thirdpartyemailpassword` recipe:

Before:
```python
from supertokens_python.recipe.thirdpartyemailpassword.syncio import get_users_by_email
Expand All @@ -745,20 +747,20 @@ for tenant in tenants_res.tenants:
```python
from supertokens_python.recipe.thirdparty.syncio import get_users_by_email as get_users_by_email_third_party
from supertokens_python.recipe.emailpassword.syncio import get_user_by_email as get_user_by_email_emailpassword

third_party_user_info = get_users_by_email_third_party("public", "[email protected]")

email_password_user_info = get_user_by_email_emailpassword("public", "[email protected]")

if email_password_user_info is not None:
print(email_password_user_info)

if len(third_party_user_info) > 0:
print(third_party_user_info)
```

- If you are using `get_user_id` from `thirdpartyemailpassword` recipe:

Before:
```python
from supertokens_python.recipe.thirdpartyemailpassword.syncio import get_user_by_id
Expand All @@ -783,9 +785,9 @@ for tenant in tenants_res.tenants:
else:
print(thirdparty_user)
```

- If you are using `get_users_by_email` from `thirdpartypasswordless` recipe:

Before:
```python
from supertokens_python.recipe.thirdpartypasswordless.syncio import get_users_by_email
Expand All @@ -797,20 +799,20 @@ for tenant in tenants_res.tenants:
```python
from supertokens_python.recipe.thirdparty.syncio import get_users_by_email as get_users_by_email_third_party
from supertokens_python.recipe.passwordless.syncio import get_user_by_email as get_user_by_email_passwordless

third_party_user_info = get_users_by_email_third_party("public", "[email protected]")

passwordless_user_info = get_user_by_email_passwordless("public", "[email protected]")

if passwordless_user_info is not None:
print(passwordless_user_info)

if len(third_party_user_info) > 0:
print(third_party_user_info)
```

- If you are using `get_user_id` from `thirdpartypasswordless` recipe:

Before:
```python
from supertokens_python.recipe.thirdpartypasswordless.syncio import get_user_by_id
Expand Down Expand Up @@ -1022,7 +1024,7 @@ With this update, verify_session will return a 401 error if it detects multiple
)
```

- In the session recipe, if there is an `UNAUTHORISED` or `TOKEN_THEFT_DETECTED` error, the session tokens are cleared in the response regardless of if you have provided your own `error_handlers` in `session.init`
- In the session recipe, if there is an `UNAUTHORISED` or `TOKEN_THEFT_DETECTED` error, the session tokens are cleared in the response regardless of if you have provided your own `error_handlers` in `session.init`

## [0.17.0] - 2023-11-14
- Fixes `create_reset_password_link` in the emailpassword recipe wherein we passed the `rid` instead of the token in the link
Expand Down
18 changes: 9 additions & 9 deletions tests/test_session.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
# under the License.

import asyncio
from datetime import datetime, timedelta
from datetime import datetime, timedelta, timezone
from typing import Any, Dict, List, Optional
from unittest.mock import MagicMock

Expand Down Expand Up @@ -664,13 +664,13 @@ async def test_token_cookie_expires(
if c.name == "sAccessToken": # 100 years (set by the SDK)
# some time must have elasped since the cookie was set. So less than current time
assert (
datetime.fromtimestamp(c.expires or 0) - timedelta(days=365.25 * 100)
< datetime.now()
datetime.fromtimestamp(c.expires or 0, tz=timezone.utc) - timedelta(days=365.25 * 100)
< datetime.now(tz=timezone.utc)
)
if c.name == "sRefreshToken": # 100 days (set by the core)
assert (
datetime.fromtimestamp(c.expires or 0) - timedelta(days=100)
< datetime.now()
datetime.fromtimestamp(c.expires or 0, tz=timezone.utc) - timedelta(days=100)
< datetime.now(tz=timezone.utc)
)

assert response.headers["anti-csrf"] != ""
Expand All @@ -694,13 +694,13 @@ async def test_token_cookie_expires(
if c.name == "sAccessToken": # 100 years (set by the SDK)
# some time must have elasped since the cookie was set. So less than current time
assert (
datetime.fromtimestamp(c.expires or 0) - timedelta(days=365.25 * 100)
< datetime.now()
datetime.fromtimestamp(c.expires or 0, tz=timezone.utc) - timedelta(days=365.25 * 100)
< datetime.now(tz=timezone.utc)
)
if c.name == "sRefreshToken": # 100 days (set by the core)
assert (
datetime.fromtimestamp(c.expires or 0) - timedelta(days=100)
< datetime.now()
datetime.fromtimestamp(c.expires or 0, tz=timezone.utc) - timedelta(days=100)
< datetime.now(tz=timezone.utc)
)

assert response.headers["anti-csrf"] != ""
Expand Down