|
39 | 39 | class KeyStore(CacheInvalidationWorkerStore): |
40 | 40 | """Persistence for signature verification keys""" |
41 | 41 |
|
42 | | - @cached() |
43 | | - def _get_server_signature_key( |
44 | | - self, server_name_and_key_id: Tuple[str, str] |
45 | | - ) -> FetchKeyResult: |
46 | | - raise NotImplementedError() |
47 | | - |
48 | | - @cachedList( |
49 | | - cached_method_name="_get_server_signature_key", |
50 | | - list_name="server_name_and_key_ids", |
51 | | - ) |
52 | | - async def get_server_signature_keys( |
53 | | - self, server_name_and_key_ids: Iterable[Tuple[str, str]] |
54 | | - ) -> Dict[Tuple[str, str], FetchKeyResult]: |
55 | | - """ |
56 | | - Args: |
57 | | - server_name_and_key_ids: |
58 | | - iterable of (server_name, key-id) tuples to fetch keys for |
59 | | -
|
60 | | - Returns: |
61 | | - A map from (server_name, key_id) -> FetchKeyResult, or None if the |
62 | | - key is unknown |
63 | | - """ |
64 | | - keys = {} |
65 | | - |
66 | | - def _get_keys(txn: Cursor, batch: Tuple[Tuple[str, str], ...]) -> None: |
67 | | - """Processes a batch of keys to fetch, and adds the result to `keys`.""" |
68 | | - |
69 | | - # batch_iter always returns tuples so it's safe to do len(batch) |
70 | | - sql = """ |
71 | | - SELECT server_name, key_id, verify_key, ts_valid_until_ms |
72 | | - FROM server_signature_keys WHERE 1=0 |
73 | | - """ + " OR (server_name=? AND key_id=?)" * len( |
74 | | - batch |
75 | | - ) |
76 | | - |
77 | | - txn.execute(sql, tuple(itertools.chain.from_iterable(batch))) |
78 | | - |
79 | | - for row in txn: |
80 | | - server_name, key_id, key_bytes, ts_valid_until_ms = row |
81 | | - |
82 | | - if ts_valid_until_ms is None: |
83 | | - # Old keys may be stored with a ts_valid_until_ms of null, |
84 | | - # in which case we treat this as if it was set to `0`, i.e. |
85 | | - # it won't match key requests that define a minimum |
86 | | - # `ts_valid_until_ms`. |
87 | | - ts_valid_until_ms = 0 |
88 | | - |
89 | | - keys[(server_name, key_id)] = FetchKeyResult( |
90 | | - verify_key=decode_verify_key_bytes(key_id, bytes(key_bytes)), |
91 | | - valid_until_ts=ts_valid_until_ms, |
92 | | - ) |
93 | | - |
94 | | - def _txn(txn: Cursor) -> Dict[Tuple[str, str], FetchKeyResult]: |
95 | | - for batch in batch_iter(server_name_and_key_ids, 50): |
96 | | - _get_keys(txn, batch) |
97 | | - return keys |
98 | | - |
99 | | - return await self.db_pool.runInteraction("get_server_signature_keys", _txn) |
100 | | - |
101 | 42 | async def store_server_keys_response( |
102 | 43 | self, |
103 | 44 | server_name: str, |
@@ -173,9 +114,6 @@ def store_server_keys_response_txn(txn: LoggingTransaction) -> None: |
173 | 114 | self._invalidate_cache_and_stream( |
174 | 115 | txn, self.get_server_key_json_for_remote, (server_name, key_id) |
175 | 116 | ) |
176 | | - self._invalidate_cache_and_stream( |
177 | | - txn, self._get_server_signature_key, ((server_name, key_id),) |
178 | | - ) |
179 | 117 |
|
180 | 118 | await self.db_pool.runInteraction( |
181 | 119 | "store_server_keys_response", store_server_keys_response_txn |
|
0 commit comments