diff --git a/app/api/endpoints/mfa.py b/app/api/endpoints/mfa.py index 6bb917713..5faeedb11 100644 --- a/app/api/endpoints/mfa.py +++ b/app/api/endpoints/mfa.py @@ -22,9 +22,9 @@ from app.application.security.otp import OtpUtils from app.application.security.passkey import ( PasskeyChallengeStore, PassKeyHelper, - PasskeyService, PassKeyRegistrationOriginMismatchError, PassKeyRegistrationVerificationError, + PasskeyService, ) from app.application.security.token import verify_password from app.application.security.user import ( diff --git a/app/application/security/passkey.py b/app/application/security/passkey.py index 0efda7bdf..4ed937736 100644 --- a/app/application/security/passkey.py +++ b/app/application/security/passkey.py @@ -11,29 +11,26 @@ from typing import Any, Dict, List, Literal, Optional, Protocol, Tuple from urllib.parse import urlparse from webauthn import ( - generate_registration_options, - verify_registration_response, generate_authentication_options, + generate_registration_options, + options_to_json, verify_authentication_response, - options_to_json -) -from webauthn.helpers import ( - parse_registration_credential_json, - parse_authentication_credential_json -) -from webauthn.helpers.structs import ( - PublicKeyCredentialDescriptor, - AuthenticatorTransport, - UserVerificationRequirement, - ResidentKeyRequirement, - AuthenticatorSelectionCriteria + verify_registration_response, ) +from webauthn.helpers import parse_authentication_credential_json, parse_registration_credential_json from webauthn.helpers.cose import COSEAlgorithmIdentifier from webauthn.helpers.exceptions import InvalidRegistrationResponse +from webauthn.helpers.structs import ( + AuthenticatorSelectionCriteria, + AuthenticatorTransport, + PublicKeyCredentialDescriptor, + ResidentKeyRequirement, + UserVerificationRequirement, +) -from app.runtime.cache import TTLCache -from app.application.configuration import get_api_runtime_config_snapshot from app.adapters.cache.redis import RedisHelper +from app.application.configuration import get_api_runtime_config_snapshot +from app.runtime.cache import TTLCache from app.runtime.log import logger PASSKEY_CHALLENGE_TTL_SECONDS = 5 * 60 @@ -459,7 +456,7 @@ class PasskeyRepository(Protocol): def list(self) -> list[Any]: """列出全部启用凭证。""" - def list_by_user_id(self, user_id: int) -> list[Any]: + def list_by_user_id(self, user_id: int) -> List[Any]: """列出指定用户凭证。""" def get_by_credential_id(self, credential_id: str) -> Optional[Any]: @@ -486,7 +483,7 @@ class PasskeyService: """列出全部启用凭证。""" return self._repository.list() - def list_by_user_id(self, user_id: int) -> list[Any]: + def list_by_user_id(self, user_id: int) -> List[Any]: """列出指定用户凭证。""" return self._repository.list_by_user_id(user_id) diff --git a/app/startup/initializers/plugins.py b/app/startup/initializers/plugins.py index a428711e9..8d7e6e9dc 100644 --- a/app/startup/initializers/plugins.py +++ b/app/startup/initializers/plugins.py @@ -30,14 +30,14 @@ from app.application.plugin.identity import ( TrustedPluginSourceType, normalize_physical_plugin_id, ) +from app.application.plugin.install import PluginInstallCommand +from app.application.plugin.inventory import PluginCandidateInventoryReader +from app.application.plugin.lifecycle import PluginStartupLease from app.application.plugin.migration import ( PluginIdentityMigrationService, configure_plugin_identity_migration, get_plugin_identity_migration, ) -from app.application.plugin.install import PluginInstallCommand -from app.application.plugin.inventory import PluginCandidateInventoryReader -from app.application.plugin.lifecycle import PluginStartupLease from app.application.plugin.recovery import ( PluginInstallationRecoveryService, configure_plugin_installation_recovery, diff --git a/tests/fixtures/architecture/coverage-baseline.json b/tests/fixtures/architecture/coverage-baseline.json index 5bc27af01..a41d68151 100644 --- a/tests/fixtures/architecture/coverage-baseline.json +++ b/tests/fixtures/architecture/coverage-baseline.json @@ -1,8 +1,8 @@ { "application": { - "covered_lines": 9649, - "percent": 78.24, - "statements": 12333 + "covered_lines": 9966, + "percent": 78.61, + "statements": 12678 }, "domain": { "covered_lines": 3392, diff --git a/tests/fixtures/architecture/mypy-baseline.json b/tests/fixtures/architecture/mypy-baseline.json index 338f84127..81ad20cc1 100644 --- a/tests/fixtures/architecture/mypy-baseline.json +++ b/tests/fixtures/architecture/mypy-baseline.json @@ -956,7 +956,7 @@ "union-attr": 4 }, "app/api/endpoints/mfa.py": { - "attr-defined": 7, + "attr-defined": 6, "call-overload": 1, "index": 2, "misc": 17, @@ -1279,9 +1279,6 @@ "app/application/security/passkey.py": { "no-untyped-call": 1 }, - "app/application/security/passkeys.py": { - "valid-type": 2 - }, "app/application/security/token.py": { "no-any-return": 3, "operator": 1 diff --git a/tests/fixtures/architecture/ruff-baseline.json b/tests/fixtures/architecture/ruff-baseline.json index 25ad1a815..e0a61008d 100644 --- a/tests/fixtures/architecture/ruff-baseline.json +++ b/tests/fixtures/architecture/ruff-baseline.json @@ -354,9 +354,6 @@ "app/application/security/auth.py": { "I001": 1 }, - "app/application/security/passkey.py": { - "I001": 1 - }, "app/application/security/url.py": { "I001": 1 },