@@ -314,10 +314,10 @@ def from_dict(self, dictionary, **kwargs):
314314 self ._dict [key ] = val
315315 continue
316316
317- self ._add_value (skey , vtyp , key , val , _deser , null_allowed )
317+ self ._add_value (skey , vtyp , key , val , _deser , null_allowed , sformat = "dict" )
318318 return self
319319
320- def _add_value (self , skey , vtyp , key , val , _deser , null_allowed ):
320+ def _add_value (self , skey , vtyp , key , val , _deser , null_allowed , sformat = "urlencoded" ):
321321 """
322322 Main method for adding a value to the instance. Does all the
323323 checking on type of value and if among allowed values.
@@ -350,7 +350,7 @@ def _add_value(self, skey, vtyp, key, val, _deser, null_allowed):
350350 self ._dict [skey ] = [val ]
351351 elif _deser :
352352 try :
353- self ._dict [skey ] = _deser (val , sformat = "urlencoded" )
353+ self ._dict [skey ] = _deser (val , sformat = sformat )
354354 except Exception as exc :
355355 raise DecodeError (ERRTXT % (key , exc ))
356356 else :
@@ -402,16 +402,6 @@ def _add_value(self, skey, vtyp, key, val, _deser, null_allowed):
402402 except Exception as exc :
403403 raise DecodeError (ERRTXT % (key , exc ))
404404 else :
405- # if isinstance(val, str):
406- # self._dict[skey] = val
407- # elif isinstance(val, list):
408- # if len(val) == 1:
409- # self._dict[skey] = val[0]
410- # elif not len(val):
411- # pass
412- # else:
413- # raise TooManyValues(key)
414- # else:
415405 self ._dict [skey ] = val
416406 elif vtyp is int :
417407 try :
@@ -468,6 +458,28 @@ def to_jwt(self, key=None, algorithm="", lev=0, lifetime=0):
468458 _jws = JWS (self .to_json (lev ), alg = algorithm )
469459 return _jws .sign_compact (key )
470460
461+ def _gather_keys (self , keyjar , jwt , header , ** kwargs ):
462+ key = []
463+
464+ if keyjar :
465+ _keys = keyjar .get_jwt_verify_keys (jwt , ** kwargs )
466+ if not _keys :
467+ keyjar .update ()
468+ _keys = keyjar .get_jwt_verify_keys (jwt , ** kwargs )
469+ key .extend (_keys )
470+
471+ if "alg" in header and header ["alg" ] != "none" :
472+ if not key :
473+ if keyjar :
474+ keyjar .update ()
475+ key = keyjar .get_jwt_verify_keys (jwt , ** kwargs )
476+ if not key :
477+ raise MissingSigningKey ("alg=%s" % header ["alg" ])
478+ else :
479+ raise MissingSigningKey ("alg=%s" % header ["alg" ])
480+
481+ return key
482+
471483 def from_jwt (self , txt , keyjar , verify = True , ** kwargs ):
472484 """
473485 Given a signed and/or encrypted JWT, verify its correctness and then
@@ -515,7 +527,6 @@ def from_jwt(self, txt, keyjar, verify=True, **kwargs):
515527 jso = _jwt .payload ()
516528 _header = _jwt .headers
517529
518- key = []
519530 # if "sender" in kwargs:
520531 # key.extend(keyjar.get_verify_key(owner=kwargs["sender"]))
521532
@@ -524,21 +535,13 @@ def from_jwt(self, txt, keyjar, verify=True, **kwargs):
524535 if _header ["alg" ] == "none" :
525536 pass
526537 elif verify :
527- if keyjar :
528- key .extend (keyjar .get_jwt_verify_keys (_jwt , ** kwargs ))
538+ key = self ._gather_keys (keyjar , _jwt , _header , ** kwargs )
529539
530- if "alg" in _header and _header ["alg" ] != "none" :
531- if not key :
532- raise MissingSigningKey ("alg=%s" % _header ["alg" ])
540+ if not key :
541+ raise MissingSigningKey ("alg=%s" % _header ["alg" ])
533542
534543 logger .debug ("Found signing key." )
535- try :
536- _verifier .verify_compact (txt , key )
537- except NoSuitableSigningKeys :
538- if keyjar :
539- keyjar .update ()
540- key = keyjar .get_jwt_verify_keys (_jwt , ** kwargs )
541- _verifier .verify_compact (txt , key )
544+ _verifier .verify_compact (txt , key )
542545
543546 self .jws_header = _jwt .headers
544547 else :
@@ -850,8 +853,12 @@ def add_non_standard(msg1, msg2):
850853
851854
852855def list_serializer (vals , sformat = "urlencoded" , lev = 0 ):
853- if isinstance (vals , str ) or not isinstance (vals , list ):
856+ if isinstance (vals , str ) and sformat == "dict" :
857+ return [vals ]
858+
859+ if not isinstance (vals , list ):
854860 raise ValueError ("Expected list: %s" % vals )
861+
855862 if sformat == "urlencoded" :
856863 return " " .join (vals )
857864 else :
@@ -864,8 +871,11 @@ def list_deserializer(val, sformat="urlencoded"):
864871 return val .split (" " )
865872 elif isinstance (val , list ) and len (val ) == 1 :
866873 return val [0 ].split (" " )
867- else :
868- return val
874+ elif sformat == "dict" :
875+ if isinstance (val , str ):
876+ val = [val ]
877+
878+ return val
869879
870880
871881def sp_sep_list_serializer (vals , sformat = "urlencoded" , lev = 0 ):
0 commit comments