|
|
|
|
|
|
|
|
import enum |
|
|
import enum |
|
|
import secrets |
|
|
import secrets |
|
|
from datetime import UTC, datetime, timedelta |
|
|
from datetime import UTC, datetime, timedelta |
|
|
from typing import Any, Optional, cast |
|
|
|
|
|
|
|
|
from typing import Any, Optional |
|
|
|
|
|
|
|
|
from werkzeug.exceptions import NotFound, Unauthorized |
|
|
from werkzeug.exceptions import NotFound, Unauthorized |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if account.password is None or not compare_password(password, account.password, account.password_salt): |
|
|
if account.password is None or not compare_password(password, account.password, account.password_salt): |
|
|
raise AccountPasswordError("Invalid email or password.") |
|
|
raise AccountPasswordError("Invalid email or password.") |
|
|
|
|
|
|
|
|
return cast(Account, account) |
|
|
|
|
|
|
|
|
return account |
|
|
|
|
|
|
|
|
@classmethod |
|
|
@classmethod |
|
|
def login(cls, account: Account) -> str: |
|
|
def login(cls, account: Account) -> str: |