Skip to content

Commit ec4f57a

Browse files
committed
fix: correct handling of secret values
1 parent 227474f commit ec4f57a

File tree

4 files changed

+21
-9
lines changed

4 files changed

+21
-9
lines changed

lib/charms/data_platform_libs/v1/data_interfaces.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -681,6 +681,8 @@ def extract_secrets(self, info: ValidationInfo):
681681

682682
if value and field_info.annotation == OptionalSecretBool:
683683
value = SecretBool(json.loads(value))
684+
elif value:
685+
value = SecretStr(value)
684686
setattr(self, field, value)
685687

686688
return self
@@ -789,6 +791,9 @@ def extract_secrets(self, info: ValidationInfo):
789791
value = secret.get_content().get(aliased_field)
790792
if value and field_info.annotation == OptionalSecretBool:
791793
value = SecretBool(json.loads(value))
794+
elif value:
795+
value = SecretStr(value)
796+
792797
setattr(self, field, value)
793798
return self
794799

tests/v1/integration/database-charm/src/charm.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from ops.main import main
2323
from ops.model import ActiveStatus, MaintenanceStatus
2424
from pydantic import Field, SecretStr
25+
from pydantic.types import _SecretBase
2526

2627
from charms.data_platform_libs.v1.data_interfaces import (
2728
DataContractV1,
@@ -316,6 +317,7 @@ def _on_get_relation_field(self, event: ActionEvent):
316317
model = self.database.interface.build_model(relation.id)
317318
for request in model.requests:
318319
value = getattr(request, event.params["field"].replace("-", "_"))
320+
value = value.get_secret_value() if issubclass(value.__class__, _SecretBase) else value
319321
event.set_results({"value": value if value else ""})
320322

321323
def _on_get_relation_self_side_field(self, event: ActionEvent):
@@ -325,6 +327,7 @@ def _on_get_relation_self_side_field(self, event: ActionEvent):
325327
model = self.database.interface.build_model(relation.id)
326328
for request in model.requests:
327329
value = getattr(request, event.params["field"].replace("-", "_"))
330+
value = value.get_secret_value() if issubclass(value.__class__, _SecretBase) else value
328331
event.set_results({"value": value if value else ""})
329332

330333
def _on_set_relation_field(self, event: ActionEvent):
@@ -377,6 +380,7 @@ def _on_get_peer_relation_field(self, event: ActionEvent):
377380
relation = self._peer_relation_unit.relations[0]
378381
model = self._peer_relation_unit.build_model(relation.id)
379382
value = getattr(model, event.params["field"].replace("-", "_"))
383+
value = value.get_secret_value() if issubclass(value.__class__, _SecretBase) else value
380384
event.set_results({"value": value if value else ""})
381385

382386
def _on_set_peer_relation_field(self, event: ActionEvent):

tests/v1/integration/dummy-database-charm/src/charm.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from ops.main import main
1919
from ops.model import ActiveStatus
2020
from pydantic import Field
21+
from pydantic.types import _SecretBase
2122

2223
from charms.data_platform_libs.v1.data_interfaces import (
2324
DataContractV1,
@@ -168,6 +169,7 @@ def _on_get_peer_secret(self, event: ActionEvent):
168169
repository = self.peer_relation_unit.repository(relation_bis.id)
169170
result = repository.get_secret_field(event.params["field"], event.params["group"])
170171

172+
result = result.get_secret_value() if issubclass(result.__class__, _SecretBase) else result
171173
event.set_results({event.params["field"]: result if result else ""})
172174

173175
def _on_set_peer_secret(self, event: ActionEvent):
@@ -222,6 +224,7 @@ def _on_get_peer_relation_field(self, event: ActionEvent):
222224
relation = self.peer_relation_unit.relations[0]
223225
model = self.peer_relation_unit.build_model(relation.id)
224226
value = getattr(model, event.params["field"].replace("-", "_"))
227+
value = value.get_secret_value() if issubclass(value.__class__, _SecretBase) else value
225228
event.set_results({"value": value if value else ""})
226229

227230

tests/v1/unit/test_data_interfaces.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1255,8 +1255,8 @@ def test_on_resource_created_secrets(self, _on_resource_created):
12551255
# using the requires charm library event.
12561256
event = _on_resource_created.call_args[0][0]
12571257
assert event.response.secret_user == secret.id
1258-
assert event.response.username == "test-username"
1259-
assert event.response.password == "test-password"
1258+
assert event.response.username.get_secret_value() == "test-username"
1259+
assert event.response.password.get_secret_value() == "test-password"
12601260

12611261
assert self.harness.charm.requirer.is_resource_created(
12621262
self.rel_id, event.response.request_id
@@ -1301,8 +1301,8 @@ def test_on_resource_created_secrets(self, _on_resource_created):
13011301
# using the requires charm library event.
13021302
event = _on_resource_created.call_args[0][0]
13031303
assert event.response.secret_user == secret2.id
1304-
assert event.response.username == "test-username-2"
1305-
assert event.response.password == "test-password-2"
1304+
assert event.response.username.get_secret_value() == "test-username-2"
1305+
assert event.response.password.get_secret_value() == "test-password-2"
13061306

13071307
assert self.harness.charm.requirer.is_resource_created(rel_id, event.response.request_id)
13081308
assert self.harness.charm.requirer.are_all_resources_created(rel_id)
@@ -1347,8 +1347,8 @@ def test_on_resource_entity_created_secrets(self, _on_resource_entity_created):
13471347
# Check that the entity-type, entity-name and entity-password are present in the relation.
13481348
event = _on_resource_entity_created.call_args[0][0]
13491349
assert event.response.secret_entity == secret.id
1350-
assert event.response.entity_name == "test-username"
1351-
assert event.response.entity_password == "test-password"
1350+
assert event.response.entity_name.get_secret_value() == "test-username"
1351+
assert event.response.entity_password.get_secret_value() == "test-password"
13521352

13531353
# Reset the mock call count.
13541354
_on_resource_entity_created.reset_mock()
@@ -1388,7 +1388,7 @@ def test_on_resource_entity_created_secrets(self, _on_resource_entity_created):
13881388
# Check that the entity-type and entity-name are present in the relation.
13891389
event = _on_resource_entity_created.call_args[0][0]
13901390
assert event.response.secret_entity == secret2.id
1391-
assert event.response.entity_name == "test-groupname"
1391+
assert event.response.entity_name.get_secret_value() == "test-groupname"
13921392
assert event.response.entity_password is None
13931393

13941394
def test_fetch_relation_data_secrets_fields(self):
@@ -1696,8 +1696,8 @@ def test_additional_fields_are_accessible(self, _on_resource_created):
16961696
# Check that the fields are present in the relation
16971697
# using the requires charm library.
16981698
assert event.response.tls.get_secret_value() is True
1699-
assert event.response.tls_ca == "deadbeef"
1700-
assert event.response.uris == "host1:port,host2:port"
1699+
assert event.response.tls_ca.get_secret_value() == "deadbeef"
1700+
assert event.response.uris.get_secret_value() == "host1:port,host2:port"
17011701
assert event.response.version == "1.0"
17021702

17031703
def test_assign_relation_alias(self):

0 commit comments

Comments
 (0)