Skip to content

Commit cd897d3

Browse files
initial commit
1 parent 360fa2e commit cd897d3

File tree

6 files changed

+36
-5
lines changed

6 files changed

+36
-5
lines changed

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

Lines changed: 11 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,16 @@ class UnregisterCheck(InputSchema):
5354
#
5455

5556

57+
class ApiKeyListQueryParams(RequestParameters):
58+
include_autogenerated: Annotated[
59+
bool,
60+
Field(
61+
description="If True, then the list includes autogenerated API keys. "
62+
"Otherwise, only user-created API keys are returned.",
63+
),
64+
] = False
65+
66+
5667
class ApiKeyCreateRequest(InputSchema):
5768
display_name: Annotated[str, Field(..., min_length=3)]
5869
expiration: Annotated[
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from typing import Literal, TypeAlias
2+
3+
API_KEY_AUTOGENERATED_PREFIX: TypeAlias = Literal["__auto_"]

services/director-v2/src/simcore_service_director_v2/modules/osparc_variables/_api_auth.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from uuid import uuid5
55

66
from fastapi import FastAPI
7+
from models_library.auth import API_KEY_AUTOGENERATED_PREFIX
78
from models_library.products import ProductName
89
from models_library.projects import ProjectID
910
from models_library.projects_nodes_io import NodeID
@@ -27,7 +28,7 @@ def create_unique_api_name_for(
2728
) -> str:
2829
# NOTE: The namespace chosen doesn't significantly impact the resulting UUID
2930
# as long as it's consistently used across the same context
30-
return f"__auto_{uuid5(uuid.NAMESPACE_DNS, f'{product_name}/{user_id}/{project_id}/{node_id}')}"
31+
return f"{API_KEY_AUTOGENERATED_PREFIX}{uuid5(uuid.NAMESPACE_DNS, f'{product_name}/{user_id}/{project_id}/{node_id}')}"
3132

3233

3334
async def create_user_api_key(

services/web/server/src/simcore_service_webserver/api_keys/_controller/rest.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
ApiKeyCreateRequest,
88
ApiKeyCreateResponse,
99
ApiKeyGet,
10+
ApiKeyListQueryParams,
1011
)
1112
from models_library.basic_types import IDStr
1213
from models_library.rest_base import StrictRequestParameters
@@ -15,6 +16,7 @@
1516
from servicelib.aiohttp.requests_validation import (
1617
parse_request_body_as,
1718
parse_request_path_parameters_as,
19+
parse_request_query_parameters_as,
1820
)
1921

2022
from ..._meta import API_VTAG
@@ -68,10 +70,15 @@ async def create_api_key(request: web.Request):
6870
@handle_plugin_requests_exceptions
6971
async def list_api_keys(request: web.Request):
7072
req_ctx = RequestContext.model_validate(request)
73+
74+
query_params: ApiKeyListQueryParams = parse_request_query_parameters_as(
75+
ApiKeyListQueryParams, request
76+
)
7177
api_keys = await _service.list_api_keys(
7278
request.app,
7379
user_id=req_ctx.user_id,
7480
product_name=req_ctx.product_name,
81+
include_autogenerated=query_params.include_autogenerated,
7582
)
7683
return envelope_json_response(
7784
TypeAdapter(list[ApiKeyGet]).validate_python(api_keys)

services/web/server/src/simcore_service_webserver/api_keys/_repository.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
import sqlalchemy as sa
55
from aiohttp import web
6+
from models_library.auth import API_KEY_AUTOGENERATED_PREFIX
67
from models_library.products import ProductName
78
from models_library.users import UserID
89
from simcore_postgres_database.models.api_keys import api_keys
@@ -160,12 +161,18 @@ async def list_api_keys(
160161
*,
161162
user_id: UserID,
162163
product_name: ProductName,
164+
include_autogenerated: bool = False,
163165
) -> list[ApiKey]:
164166
async with pass_or_acquire_connection(get_asyncpg_engine(app), connection) as conn:
165167
stmt = sa.select(api_keys.c.id, api_keys.c.display_name).where(
166168
(api_keys.c.user_id == user_id) & (api_keys.c.product_name == product_name)
167169
)
168170

171+
if not include_autogenerated:
172+
stmt = stmt.where(
173+
~api_keys.c.display_name.like(f"{API_KEY_AUTOGENERATED_PREFIX}%")
174+
)
175+
169176
result = await conn.stream(stmt)
170177
rows = [row async for row in result]
171178

services/web/server/src/simcore_service_webserver/api_keys/_service.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@
22

33
from aiohttp import web
44
from models_library.products import ProductName
5-
from models_library.rpc.webserver.auth.api_keys import (
6-
generate_api_key_and_secret,
7-
)
5+
from models_library.rpc.webserver.auth.api_keys import generate_api_key_and_secret
86
from models_library.users import UserID
97

108
from . import _repository
@@ -87,9 +85,13 @@ async def list_api_keys(
8785
*,
8886
product_name: ProductName,
8987
user_id: UserID,
88+
include_autogenerated: bool = False,
9089
) -> list[ApiKey]:
9190
api_keys: list[ApiKey] = await _repository.list_api_keys(
92-
app, user_id=user_id, product_name=product_name
91+
app,
92+
user_id=user_id,
93+
product_name=product_name,
94+
include_autogenerated=include_autogenerated,
9395
)
9496
return api_keys
9597

0 commit comments

Comments
 (0)