Add methods for storing and retrieving the raw key json

This commit is contained in:
Mark Haines 2015-04-15 16:58:35 +01:00
parent 8d761134c2
commit a429515bdd
2 changed files with 59 additions and 3 deletions

View file

@ -118,3 +118,59 @@ class KeyStore(SQLBaseStore):
}, },
or_ignore=True, or_ignore=True,
) )
def store_server_keys_json(self, server_name, key_id, from_server,
ts_now_ms, ts_expires_ms, key_json_bytes):
"""Stores the JSON bytes for a set of keys from a server
The JSON should be signed by the originating server, the intermediate
server, and by this server. Updates the value for the
(server_name, key_id, from_server) triplet if one already existed.
Args:
server_name (str): The name of the server.
key_id (str): The identifer of the key this JSON is for.
from_server (str): The server this JSON was fetched from.
ts_now_ms (int): The time now in milliseconds.
ts_valid_until_ms (int): The time when this json stops being valid.
key_json (bytes): The encoded JSON.
"""
return self._simple_insert(
table="server_keys_json",
values={
"server_name": server_name,
"key_id": key_id,
"from_server": from_server,
"ts_added_ms": ts_now_ms,
"ts_valid_until_ms": ts_valid_until_ms,
"key_json": key_json_bytes,
},
or_replace=True,
)
def get_server_keys_json(self, server_keys):
"""Retrive the key json for a list of server_keys and key ids.
If no keys are found for a given server, key_id and source then
that server, key_id, and source triplet will be missing from the
returned dictionary. The JSON is returned as a byte array so that it
can be efficiently used in an HTTP response.
Args:
server_keys (list): List of (server_name, key_id, source) triplets.
Returns:
Dict mapping (server_name, key_id, source) triplets to dicts with
"ts_valid_until_ms" and "key_json" keys.
"""
def _get_server_keys_json_txn(txn):
results = {}
for server_name, key_id, from_server in server_keys:
rows = _simple_select_list_txn(
keyvalues={
"server_name": server_name,
"key_id": key_id,
"from_server": from_server,
},
retcols=("ts_valid_until_ms", "key_json"),
)
results[(server_name, key_id, from_server)] = rows
return results
return runInteraction(
"get_server_keys_json", _get_server_keys_json_txn
)

View file

@ -13,12 +13,12 @@
* limitations under the License. * limitations under the License.
*/ */
CREATE TABLE IF NOT EXISTS server_keys ( CREATE TABLE IF NOT EXISTS server_keys_json (
server_name TEXT, -- Server name. server_name TEXT, -- Server name.
key_id TEXT, -- Requested key id. key_id TEXT, -- Requested key id.
from_server TEXT, -- Which server the keys were fetched from. from_server TEXT, -- Which server the keys were fetched from.
ts_added_ms INTEGER, -- When the keys were fetched ts_added_ms INTEGER, -- When the keys were fetched
ts_expires_ms INTEGER, -- When this version of the keys exipires. ts_valid_until_ms INTEGER, -- When this version of the keys exipires.
key_json BLOB, -- JSON certificate for the remote server. key_json BLOB, -- JSON certificate for the remote server.
CONSTRAINT uniqueness UNIQUE (server_name, key_id) CONSTRAINT uniqueness UNIQUE (server_name, key_id, from_server)
); );