summary refs log tree commit diff
path: root/synapse/crypto
diff options
context:
space:
mode:
authorMark Haines <mark.haines@matrix.org>2015-04-27 18:29:32 +0100
committerMark Haines <mark.haines@matrix.org>2015-04-27 18:29:32 +0100
commitf8b865264a02e263d9b37ac3d9d8bea2e874ed55 (patch)
treeadc8b964febfad000b5cd1caa19c2a5793a709f8 /synapse/crypto
parentAdd config for setting the perspective servers (diff)
parentMerge pull request #132 from matrix-org/observer_and_locks (diff)
downloadsynapse-f8b865264a02e263d9b37ac3d9d8bea2e874ed55.tar.xz
Merge branch 'develop' into key_distribution
Conflicts:
	synapse/crypto/keyring.py
Diffstat (limited to 'synapse/crypto')
-rw-r--r--synapse/crypto/keyring.py20
1 files changed, 20 insertions, 0 deletions
diff --git a/synapse/crypto/keyring.py b/synapse/crypto/keyring.py

index f7ae227916..0d24aa7ac2 100644 --- a/synapse/crypto/keyring.py +++ b/synapse/crypto/keyring.py
@@ -26,6 +26,8 @@ from synapse.api.errors import SynapseError, Codes from synapse.util.retryutils import get_retry_limiter +from synapse.util.async import create_observer + from OpenSSL import crypto import urllib @@ -45,6 +47,8 @@ class Keyring(object): self.perspective_servers = self.config.perspectives self.hs = hs + self.key_downloads = {} + @defer.inlineCallbacks def verify_json_for_server(self, server_name, json_object): logger.debug("Verifying for %s", server_name) @@ -103,6 +107,22 @@ class Keyring(object): defer.returnValue(cached[0]) return + download = self.key_downloads.get(server_name) + + if download is None: + download = self._get_server_verify_key_impl(server_name, key_ids) + self.key_downloads[server_name] = download + + @download.addBoth + def callback(ret): + del self.key_downloads[server_name] + return ret + + r = yield create_observer(download) + defer.returnValue(r) + + @defer.inlineCallbacks + def _get_server_verify_key_impl(self, server_name, key_ids): keys = None for perspective_name, perspective_keys in self.perspective_servers.items(): try: