Skip to content

Commit ec6e847

Browse files
committed
keyring updates
1 parent 4ffefb9 commit ec6e847

File tree

5 files changed

+28
-4
lines changed

5 files changed

+28
-4
lines changed

key-value/key-value-aio/src/key_value/aio/stores/keyring/store.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
"""Python keyring-based key-value store."""
22

3+
from key_value.shared.errors.key_value import ValueTooLargeError
34
from key_value.shared.utils.compound import compound_key
45
from key_value.shared.utils.managed_entry import ManagedEntry
56
from key_value.shared.utils.sanitization import HybridSanitizationStrategy, SanitizationStrategy
@@ -17,6 +18,8 @@
1718

1819
DEFAULT_KEYCHAIN_SERVICE = "py-key-value"
1920

21+
WINDOWS_MAX_VALUE_LENGTH = 2560 # bytes
22+
2023
MAX_KEY_COLLECTION_LENGTH = 256
2124
ALLOWED_KEY_COLLECTION_CHARACTERS: str = ALPHANUMERIC_CHARACTERS
2225

@@ -106,6 +109,10 @@ async def _put_managed_entry(self, *, key: str, collection: str, managed_entry:
106109
combo_key: str = compound_key(collection=sanitized_collection, key=sanitized_key)
107110

108111
json_str: str = self._serialization_adapter.dump_json(entry=managed_entry, key=key, collection=collection)
112+
encoded_json_bytes: bytes = json_str.encode(encoding="utf-8")
113+
114+
if len(encoded_json_bytes) > WINDOWS_MAX_VALUE_LENGTH:
115+
raise ValueTooLargeError(size=len(encoded_json_bytes), max_size=2560, collection=sanitized_collection, key=sanitized_key)
109116

110117
keyring.set_password(service_name=self._service_name, username=combo_key, password=json_str)
111118

key-value/key-value-aio/tests/stores/keyring/test_keyring.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ async def test_long_collection_name(self, store: KeyringStore, sanitizing_store:
5454
with pytest.raises(Exception): # noqa: B017, PT011
5555
await store.put(collection="test_collection" * 100, key="test_key", value={"test": "test"})
5656

57-
await sanitizing_store.put(collection="test_collection" * 100, key="test_key", value={"test": "test"})
58-
assert await sanitizing_store.get(collection="test_collection" * 100, key="test_key") == {"test": "test"}
57+
await sanitizing_store.put(collection="test_collection" * 50, key="test_key", value={"test": "test"})
58+
assert await sanitizing_store.get(collection="test_collection" * 50, key="test_key") == {"test": "test"}
5959

6060
@override
6161
async def test_long_key_name(self, store: KeyringStore, sanitizing_store: KeyringStore): # pyright: ignore[reportIncompatibleMethodOverride]

key-value/key-value-shared/src/key_value/shared/errors/key_value.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,13 @@ def __init__(self, ttl: Any, extra_info: ExtraInfoType | None = None):
3737

3838
class InvalidKeyError(KeyValueOperationError):
3939
"""Raised when a key is invalid (e.g., uses reserved prefixes)."""
40+
41+
42+
class ValueTooLargeError(KeyValueOperationError):
43+
"""Raised when a value is too large."""
44+
45+
def __init__(self, size: int, max_size: int, collection: str | None = None, key: str | None = None):
46+
super().__init__(
47+
message="Value size exceeds the maximum allowed size.",
48+
extra_info={"size": size, "max_size": max_size, "collection": collection or "default", "key": key},
49+
)

key-value/key-value-sync/src/key_value/sync/code_gen/stores/keyring/store.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
# DO NOT CHANGE! Change the original file instead.
44
"""Python keyring-based key-value store."""
55

6+
from key_value.shared.errors.key_value import ValueTooLargeError
67
from key_value.shared.utils.compound import compound_key
78
from key_value.shared.utils.managed_entry import ManagedEntry
89
from key_value.shared.utils.sanitization import HybridSanitizationStrategy, SanitizationStrategy
@@ -20,6 +21,8 @@
2021

2122
DEFAULT_KEYCHAIN_SERVICE = "py-key-value"
2223

24+
WINDOWS_MAX_VALUE_LENGTH = 2560 # bytes
25+
2326
MAX_KEY_COLLECTION_LENGTH = 256
2427
ALLOWED_KEY_COLLECTION_CHARACTERS: str = ALPHANUMERIC_CHARACTERS
2528

@@ -105,6 +108,10 @@ def _put_managed_entry(self, *, key: str, collection: str, managed_entry: Manage
105108
combo_key: str = compound_key(collection=sanitized_collection, key=sanitized_key)
106109

107110
json_str: str = self._serialization_adapter.dump_json(entry=managed_entry, key=key, collection=collection)
111+
encoded_json_bytes: bytes = json_str.encode(encoding="utf-8")
112+
113+
if len(encoded_json_bytes) > WINDOWS_MAX_VALUE_LENGTH:
114+
raise ValueTooLargeError(size=len(encoded_json_bytes), max_size=2560, collection=sanitized_collection, key=sanitized_key)
108115

109116
keyring.set_password(service_name=self._service_name, username=combo_key, password=json_str)
110117

key-value/key-value-sync/tests/code_gen/stores/keyring/test_keyring.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ def test_long_collection_name(self, store: KeyringStore, sanitizing_store: Elast
6161
with pytest.raises(Exception): # noqa: B017, PT011
6262
store.put(collection="test_collection" * 100, key="test_key", value={"test": "test"})
6363

64-
sanitizing_store.put(collection="test_collection" * 100, key="test_key", value={"test": "test"})
65-
assert sanitizing_store.get(collection="test_collection" * 100, key="test_key") == {"test": "test"}
64+
sanitizing_store.put(collection="test_collection" * 50, key="test_key", value={"test": "test"})
65+
assert sanitizing_store.get(collection="test_collection" * 50, key="test_key") == {"test": "test"}
6666

6767
@override
6868
def test_long_key_name(self, store: KeyringStore, sanitizing_store: KeyringStore): # pyright: ignore[reportIncompatibleMethodOverride]

0 commit comments

Comments
 (0)