Skip to content

Commit 12b3dcb

Browse files
authored
Merge branch 'master' into enh/cache-calls
2 parents 7159b73 + 1ce595e commit 12b3dcb

File tree

45 files changed

+436
-260
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+436
-260
lines changed

api/specs/web-server/_auth_api_keys.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
from typing import Annotated
22

3+
from _common import as_query
34
from fastapi import APIRouter, Depends, status
45
from models_library.api_schemas_webserver.auth import (
56
ApiKeyCreateRequest,
67
ApiKeyCreateResponse,
78
ApiKeyGet,
9+
ApiKeyListQueryParams,
810
)
911
from models_library.generics import Envelope
1012
from models_library.rest_error import EnvelopedError
@@ -39,7 +41,9 @@ async def create_api_key(_body: ApiKeyCreateRequest):
3941
response_model=Envelope[list[ApiKeyGet]],
4042
status_code=status.HTTP_200_OK,
4143
)
42-
async def list_api_keys():
44+
async def list_api_keys(
45+
_query: Annotated[as_query(ApiKeyListQueryParams), Depends()],
46+
):
4347
"""lists API keys by this user"""
4448

4549

packages/models-library/src/models_library/api_schemas_webserver/auth.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from typing import Annotated, Any
33

44
from models_library.basic_types import IDStr
5+
from models_library.rest_base import RequestParameters
56
from pydantic import AliasGenerator, ConfigDict, Field, HttpUrl, SecretStr
67
from pydantic.alias_generators import to_camel
78

@@ -53,6 +54,17 @@ class UnregisterCheck(InputSchema):
5354
#
5455

5556

57+
class ApiKeyListQueryParams(RequestParameters):
58+
include_autogenerated: Annotated[
59+
bool,
60+
Field(
61+
alias="includeAutogenerated",
62+
description="If True, then the list includes autogenerated API keys. "
63+
"Otherwise, only user-created API keys are returned.",
64+
),
65+
] = False
66+
67+
5668
class ApiKeyCreateRequest(InputSchema):
5769
display_name: Annotated[str, Field(..., min_length=3)]
5870
expiration: Annotated[
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from typing import Final
2+
3+
from models_library.rpc.webserver.auth.api_keys import generate_api_key_prefix
4+
5+
API_KEY_AUTOGENERATED_DISPLAY_NAME_PREFIX: Final[str] = "__auto_"
6+
API_KEY_AUTOGENERATED_KEY_PREFIX: Final[str] = generate_api_key_prefix(
7+
API_KEY_AUTOGENERATED_DISPLAY_NAME_PREFIX
8+
)

packages/models-library/src/models_library/rpc/webserver/auth/api_keys.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,12 @@
1616
_SECRET_LEN: Final = 20
1717

1818

19+
def generate_api_key_prefix(name: str) -> str:
20+
return _PUNCTUATION_REGEX.sub("_", name[:5])
21+
22+
1923
def generate_unique_api_key(name: str, length: int = _KEY_LEN) -> str:
20-
prefix = _PUNCTUATION_REGEX.sub("_", name[:5])
24+
prefix = generate_api_key_prefix(name)
2125
hashed = hashlib.sha256(name.encode()).hexdigest()
2226
return f"{prefix}_{hashed[:length]}"
2327

packages/service-library/src/servicelib/long_running_tasks/task.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from collections import deque
77
from contextlib import suppress
88
from datetime import datetime
9-
from typing import Any, Protocol
9+
from typing import Any, Protocol, TypeAlias
1010
from uuid import uuid4
1111

1212
from models_library.api_schemas_long_running_tasks.base import (
@@ -53,8 +53,8 @@ def _mark_task_to_remove_if_required(
5353
tasks_to_remove.append(task_id)
5454

5555

56-
TrackedTaskGroupDict = dict[TaskId, TrackedTask]
57-
TaskContext = dict[str, Any]
56+
TrackedTaskGroupDict: TypeAlias = dict[TaskId, TrackedTask]
57+
TaskContext: TypeAlias = dict[str, Any]
5858

5959

6060
class TasksManager:

services/api-server/src/simcore_service_api_server/api/dependencies/services.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from ..._service_programs import ProgramService
1313
from ..._service_solvers import SolverService
1414
from ..._service_studies import StudyService
15+
from ...services_http.webserver import AuthSession
1516
from ...services_rpc.catalog import CatalogService
1617
from ...services_rpc.wb_api_server import WbApiRpcClient
1718
from ...utils.client_base import BaseServiceClientApi

services/api-server/src/simcore_service_api_server/api/dependencies/webserver_http.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,16 @@
55
from cryptography.fernet import Fernet
66
from fastapi import Depends, FastAPI, HTTPException, status
77
from fastapi.requests import Request
8-
from servicelib.rest_constants import X_PRODUCT_NAME_HEADER
98

109
from ..._constants import MSG_BACKEND_SERVICE_UNAVAILABLE
1110
from ...core.settings import ApplicationSettings, WebServerSettings
1211
from ...services_http.webserver import AuthSession
1312
from .application import get_app, get_settings
14-
from .authentication import Identity, get_active_user_email, get_current_identity
13+
from .authentication import (
14+
Identity,
15+
get_active_user_email,
16+
get_current_identity,
17+
)
1518

1619

1720
def _get_settings(
@@ -68,14 +71,14 @@ def get_webserver_session(
6871
Lifetime of AuthSession wrapper is one request because it needs different session cookies
6972
Lifetime of embedded client is attached to the app lifetime
7073
"""
71-
product_header: dict[str, str] = {X_PRODUCT_NAME_HEADER: f"{identity.product_name}"}
72-
session = AuthSession.create(app, session_cookies, product_header)
74+
session = AuthSession.create(
75+
app,
76+
session_cookies=session_cookies,
77+
product_name=identity.product_name,
78+
user_id=identity.user_id,
79+
)
7380
assert isinstance(session, AuthSession) # nosec
7481
return session
7582

7683

77-
__all__: tuple[str, ...] = (
78-
"AuthSession",
79-
"get_session_cookie",
80-
"get_webserver_session",
81-
)
84+
__all__: tuple[str, ...] = ("AuthSession",)

0 commit comments

Comments
 (0)