Skip to content

Commit 76bc9b1

Browse files
author
gabino
committed
refactor: change sensitive fields to SecretStr for enhanced security in ApiKey, LoginToken, Otp, and Session classes
1 parent f81c8bf commit 76bc9b1

File tree

8 files changed

+22
-11
lines changed

8 files changed

+22
-11
lines changed

cuenca/resources/api_keys.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from typing import ClassVar, Optional, cast
33

44
from cuenca_validations.types import ApiKeyQuery, ApiKeyUpdateRequest
5-
from pydantic import ConfigDict
5+
from pydantic import ConfigDict, SecretStr
66

77
from ..http import Session, session as global_session
88
from .base import Creatable, Queryable, Retrievable, Updateable
@@ -12,7 +12,7 @@ class ApiKey(Creatable, Queryable, Retrievable, Updateable):
1212
_resource: ClassVar = 'api_keys'
1313
_query_params: ClassVar = ApiKeyQuery
1414

15-
secret: str
15+
secret: SecretStr
1616
deactivated_at: Optional[dt.datetime] = None
1717
user_id: Optional[str] = None
1818
model_config = ConfigDict(

cuenca/resources/login_tokens.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11
from typing import ClassVar, cast
22

3-
from pydantic import ConfigDict
3+
from pydantic import ConfigDict, SecretStr
44

55
from ..http import Session, session as global_session
66
from .base import Creatable
77

88

9+
# mypy: disable-error-code=override
910
class LoginToken(Creatable):
1011
_resource: ClassVar = 'login_tokens'
12+
13+
# Override the `id` field to be a `SecretStr`
14+
# To ensure sensitive data is not exposed in logs.
15+
id: SecretStr # type: ignore
16+
1117
model_config = ConfigDict(
1218
json_schema_extra={'example': {'id': 'LTNEUInh69SuKXXmK95sROwQ'}}
1319
)

cuenca/resources/otps.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
from typing import ClassVar, cast
22

3-
from pydantic import ConfigDict
3+
from pydantic import ConfigDict, SecretStr
44

55
from ..http import Session, session as global_session
66
from .base import Creatable
77

88

99
class Otp(Creatable):
1010
_resource: ClassVar = 'otps'
11-
secret: str
11+
secret: SecretStr
1212
model_config = ConfigDict(
1313
json_schema_extra={
1414
'example': {

cuenca/resources/sessions.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,19 @@
22
from typing import ClassVar, Optional, cast
33

44
from cuenca_validations.types import AnyUrlString, SessionRequest, SessionType
5-
from pydantic import ConfigDict
5+
from pydantic import ConfigDict, SecretStr
66

77
from .. import http
88
from .base import Creatable, Queryable, Retrievable
99

1010

11+
# mypy: disable-error-code=override
1112
class Session(Creatable, Retrievable, Queryable):
1213
_resource: ClassVar = 'sessions'
1314

14-
id: str
15+
# Override the `id` field to be a `SecretStr`
16+
# To ensure sensitive data is not exposed in logs.
17+
id: SecretStr = None # type: ignore
1518
created_at: dt.datetime
1619
user_id: str
1720
platform_id: str

tests/resources/test_api_keys.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def test_api_keys_retrieve():
1818
id_key = 'AKMPSxy2UeSKqU1J6spDNwqA'
1919
api_key: ApiKey = ApiKey.retrieve(id_key)
2020
assert api_key.id == id_key
21-
assert api_key.secret == '********'
21+
assert api_key.secret.get_secret_value() == '********'
2222

2323

2424
@pytest.mark.vcr

tests/resources/test_login_tokens.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,5 @@ def test_login_token(session):
2020
UserLogin.create('222222', session=session)
2121
login_token = LoginToken.create(session=session)
2222
session.headers.pop('X-Cuenca-LoginId')
23-
session.configure(login_token=login_token.id)
23+
session.configure(login_token=login_token.id.get_secret_value())
2424
Transfer.count(session=session)

tests/resources/test_otps.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,4 @@ def test_otps(session):
2525
session.configure(login_token=login_token.id)
2626
otp = Otp.create()
2727
assert otp
28-
assert isinstance(otp.secret, str)
28+
assert isinstance(otp.secret.get_secret_value(), str)

tests/resources/test_sessions.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ def test_session_create(curp_validation_request: dict, user_request: dict):
3636
assert user_session.failure_url == failure_url
3737

3838
ephimeral_cuenca_session = cuenca.http.Session()
39-
ephimeral_cuenca_session.configure(session_token=user_session.id)
39+
ephimeral_cuenca_session.configure(
40+
session_token=user_session.id.get_secret_value()
41+
)
4042
user = User.update(user.id, email_address='manu@example.com')
4143
assert user.email_address == 'manu@example.com'

0 commit comments

Comments
 (0)