Skip to content

Commit 0c93ee4

Browse files
authored
Merge pull request #81 from jschlyter/key_bundle_thread_safe
Make KeyBundle update() thread safe
2 parents 99f3780 + ed139d1 commit 0c93ee4

File tree

1 file changed

+28
-26
lines changed

1 file changed

+28
-26
lines changed

src/cryptojwt/key_bundle.py

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import json
44
import logging
55
import os
6+
import threading
67
import time
78
from datetime import datetime
89
from functools import cmp_to_key
@@ -507,34 +508,35 @@ def update(self):
507508
:return: True if update was ok or False if we encountered an error during update.
508509
"""
509510
if self.source:
510-
_old_keys = self._keys # just in case
511+
with threading.Lock():
512+
_old_keys = self._keys # just in case
511513

512-
# reread everything
513-
self._keys = []
514-
updated = None
514+
# reread everything
515+
self._keys = []
516+
updated = None
515517

516-
try:
517-
if self.local:
518-
if self.fileformat in ["jwks", "jwk"]:
519-
updated = self.do_local_jwk(self.source)
520-
elif self.fileformat == "der":
521-
updated = self.do_local_der(self.source, self.keytype, self.keyusage)
522-
elif self.remote:
523-
updated = self.do_remote()
524-
except Exception as err:
525-
LOGGER.error("Key bundle update failed: %s", err)
526-
self._keys = _old_keys # restore
527-
return False
528-
529-
if updated:
530-
now = time.time()
531-
for _key in _old_keys:
532-
if _key not in self._keys:
533-
if not _key.inactive_since: # If already marked don't mess
534-
_key.inactive_since = now
535-
self._keys.append(_key)
536-
else:
537-
self._keys = _old_keys
518+
try:
519+
if self.local:
520+
if self.fileformat in ["jwks", "jwk"]:
521+
updated = self.do_local_jwk(self.source)
522+
elif self.fileformat == "der":
523+
updated = self.do_local_der(self.source, self.keytype, self.keyusage)
524+
elif self.remote:
525+
updated = self.do_remote()
526+
except Exception as err:
527+
LOGGER.error("Key bundle update failed: %s", err)
528+
self._keys = _old_keys # restore
529+
return False
530+
531+
if updated:
532+
now = time.time()
533+
for _key in _old_keys:
534+
if _key not in self._keys:
535+
if not _key.inactive_since: # If already marked don't mess
536+
_key.inactive_since = now
537+
self._keys.append(_key)
538+
else:
539+
self._keys = _old_keys
538540

539541
return True
540542

0 commit comments

Comments
 (0)