4
4
import logging
5
5
import os
6
6
import time
7
+ from datetime import datetime
7
8
from functools import cmp_to_key
8
9
9
10
import requests
@@ -156,6 +157,7 @@ def __init__(
156
157
keys = None ,
157
158
source = "" ,
158
159
cache_time = 300 ,
160
+ error_holddown = 0 ,
159
161
fileformat = "jwks" ,
160
162
keytype = "RSA" ,
161
163
keyusage = None ,
@@ -188,6 +190,7 @@ def __init__(
188
190
self .remote = False
189
191
self .local = False
190
192
self .cache_time = cache_time
193
+ self .error_holddown = error_holddown
191
194
self .time_out = 0
192
195
self .etag = ""
193
196
self .source = None
@@ -198,6 +201,7 @@ def __init__(
198
201
self .last_updated = 0
199
202
self .last_remote = None # HTTP Date of last remote update
200
203
self .last_local = None # UNIX timestamp of last local update
204
+ self .last_error = None # UNIX timestamp of last error
201
205
202
206
if httpc :
203
207
self .httpc = httpc
@@ -365,6 +369,16 @@ def do_remote(self):
365
369
# if self.verify_ssl is not None:
366
370
# self.httpc_params["verify"] = self.verify_ssl
367
371
372
+ if self .last_error :
373
+ t = self .last_error + self .error_holddown
374
+ if time .time () < t :
375
+ LOGGER .warning (
376
+ "Not reading remote JWKS from %s (in error holddown until %s)" ,
377
+ self .source ,
378
+ datetime .fromtimestamp (t ),
379
+ )
380
+ return False
381
+
368
382
LOGGER .info ("Reading remote JWKS from %s" , self .source )
369
383
try :
370
384
LOGGER .debug ("KeyBundle fetch keys from: %s" , self .source )
@@ -390,6 +404,7 @@ def do_remote(self):
390
404
self .do_keys (self .imp_jwks ["keys" ])
391
405
except KeyError :
392
406
LOGGER .error ("No 'keys' keyword in JWKS" )
407
+ self .last_error = time .time ()
393
408
raise UpdateFailed (MALFORMED .format (self .source ))
394
409
395
410
if hasattr (_http_resp , "headers" ):
@@ -402,12 +417,13 @@ def do_remote(self):
402
417
403
418
else :
404
419
LOGGER .warning (
405
- "HTTP status %d reading remote JWKS from %s" ,
406
- _http_resp .status_code ,
407
- self .source ,
420
+ "HTTP status %d reading remote JWKS from %s" , _http_resp .status_code , self .source ,
408
421
)
422
+ self .last_error = time .time ()
409
423
raise UpdateFailed (REMOTE_FAILED .format (self .source , _http_resp .status_code ))
424
+
410
425
self .last_updated = time .time ()
426
+ self .last_error = None
411
427
return True
412
428
413
429
def _parse_remote_response (self , response ):
0 commit comments