Skip to content

Commit 55c8bce

Browse files
fix env vars generation
1 parent 4cf8ef1 commit 55c8bce

File tree

2 files changed

+21
-47
lines changed

2 files changed

+21
-47
lines changed
Lines changed: 19 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1+
import logging
12
import uuid
23
from datetime import timedelta
34
from uuid import uuid5
45

5-
from aiocache import cached # type: ignore[import-untyped]
66
from fastapi import FastAPI
77
from models_library.products import ProductName
88
from models_library.projects import ProjectID
99
from models_library.projects_nodes_io import NodeID
10-
from models_library.rpc.webserver.auth.api_keys import ApiKeyGet
10+
from models_library.rpc.webserver.auth.api_keys import generate_unique_api_key
1111
from models_library.users import UserID
1212

1313
from ._api_auth_rpc import create_api_key as rpc_create_api_key
@@ -16,6 +16,9 @@
1616
_EXPIRATION_AUTO_KEYS = timedelta(weeks=4)
1717

1818

19+
_logger = logging.getLogger(__name__)
20+
21+
1922
def create_unique_api_name_for(
2023
product_name: ProductName,
2124
user_id: UserID,
@@ -27,50 +30,17 @@ def create_unique_api_name_for(
2730
return f"__auto_{uuid5(uuid.NAMESPACE_DNS, f'{product_name}/{user_id}/{project_id}/{node_id}')}"
2831

2932

30-
# NOTE: Uses caching to prevent multiple calls to the external service
31-
# when 'create_user_api_key' or 'create_user_api_secret' are invoked.
32-
def _cache_key(fct, *_, **kwargs):
33-
return f"{fct.__name__}_{kwargs['product_name']}_{kwargs['user_id']}_{kwargs['project_id']}_{kwargs['node_id']}"
34-
35-
36-
@cached(ttl=3, key_builder=_cache_key)
37-
async def _create_for(
38-
app: FastAPI,
39-
*,
40-
product_name: ProductName,
41-
user_id: UserID,
42-
project_id: ProjectID,
43-
node_id: NodeID,
44-
) -> ApiKeyGet:
45-
display_name = create_unique_api_name_for(
46-
product_name, user_id, project_id, node_id
47-
)
48-
return await rpc_create_api_key(
49-
app,
50-
user_id=user_id,
51-
product_name=product_name,
52-
display_name=display_name,
53-
expiration=_EXPIRATION_AUTO_KEYS,
54-
)
55-
56-
57-
async def create_user_api_key(
58-
app: FastAPI,
33+
async def compute_user_api_key(
34+
app: FastAPI, # pylint: disable=unused-argument
5935
product_name: ProductName,
6036
user_id: UserID,
6137
project_id: ProjectID,
6238
node_id: NodeID,
6339
) -> str:
64-
data = await _create_for(
65-
app,
66-
product_name=product_name,
67-
user_id=user_id,
68-
project_id=project_id,
69-
node_id=node_id,
40+
# NOTE: Given the display name, the API key is deterministically generated
41+
return generate_unique_api_key(
42+
create_unique_api_name_for(product_name, user_id, project_id, node_id)
7043
)
71-
assert data.api_key # nosec
72-
assert isinstance(data.api_key, str) # nosec
73-
return data.api_key
7444

7545

7646
async def create_user_api_secret(
@@ -80,12 +50,16 @@ async def create_user_api_secret(
8050
project_id: ProjectID,
8151
node_id: NodeID,
8252
) -> str:
83-
data = await _create_for(
53+
display_name = create_unique_api_name_for(
54+
product_name, user_id, project_id, node_id
55+
)
56+
_logger.debug("Creating API key for %s", display_name)
57+
data = await rpc_create_api_key(
8458
app,
85-
product_name=product_name,
8659
user_id=user_id,
87-
project_id=project_id,
88-
node_id=node_id,
60+
product_name=product_name,
61+
display_name=display_name,
62+
expiration=_EXPIRATION_AUTO_KEYS,
8963
)
9064
assert data.api_secret # nosec
9165
assert isinstance(data.api_secret, str) # nosec
@@ -109,7 +83,7 @@ async def delete_api_key_by_key(
10983

11084

11185
__all__: tuple[str, ...] = (
112-
"create_user_api_key",
86+
"compute_user_api_key",
11387
"create_user_api_secret",
11488
"delete_api_key_by_key",
11589
)

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
resolve_variables_from_context,
3333
)
3434
from ..db.repositories.services_environments import ServicesEnvironmentsRepository
35-
from ._api_auth import create_user_api_key, create_user_api_secret
35+
from ._api_auth import compute_user_api_key, create_user_api_secret
3636
from ._user import request_user_email, request_user_role
3737

3838
_logger = logging.getLogger(__name__)
@@ -130,7 +130,7 @@ def create(cls, app: FastAPI):
130130

131131
table.register_from_handler("OSPARC_VARIABLE_USER_EMAIL")(request_user_email)
132132
table.register_from_handler("OSPARC_VARIABLE_USER_ROLE")(request_user_role)
133-
table.register_from_handler("OSPARC_VARIABLE_API_KEY")(create_user_api_key)
133+
table.register_from_handler("OSPARC_VARIABLE_API_KEY")(compute_user_api_key)
134134
table.register_from_handler("OSPARC_VARIABLE_API_SECRET")(
135135
create_user_api_secret
136136
)

0 commit comments

Comments
 (0)