Skip to content
This repository was archived by the owner on Jun 1, 2023. It is now read-only.

Commit a71ef56

Browse files
committed
Clean up.
Check signature/encryption algorithms, expected against found.
1 parent 4064032 commit a71ef56

File tree

4 files changed

+247
-126
lines changed

4 files changed

+247
-126
lines changed

src/oidcmsg/message.py

Lines changed: 43 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -228,10 +228,7 @@ def from_urlencoded(self, urlencoded, **kwargs):
228228
elif isinstance(val[0], typ):
229229
self._dict[key] = val[0]
230230
else:
231-
try:
232-
self._dict[key] = val[0]
233-
except KeyError:
234-
raise ParameterError(key)
231+
self._dict[key] = val[0]
235232
else:
236233
raise TooManyValues('{}'.format(key))
237234

@@ -405,40 +402,40 @@ def _add_value(self, skey, vtyp, key, val, _deser, null_allowed):
405402
val = _deser(val, sformat="dict")
406403
except Exception as exc:
407404
raise DecodeError(ERRTXT % (key, exc))
405+
else:
406+
# if isinstance(val, str):
407+
# self._dict[skey] = val
408+
# elif isinstance(val, list):
409+
# if len(val) == 1:
410+
# self._dict[skey] = val[0]
411+
# elif not len(val):
412+
# pass
413+
# else:
414+
# raise TooManyValues(key)
415+
# else:
416+
self._dict[skey] = val
408417
elif vtyp is int:
409418
try:
410419
self._dict[skey] = int(val)
411420
except (ValueError, TypeError):
412421
raise ValueError(
413422
'"{}", wrong type of value for "{}"'.format(val,
414423
skey))
415-
else:
416-
return
417424
elif vtyp is bool:
418425
raise ValueError(
419426
'"{}", wrong type of value for "{}"'.format(val, skey))
420427
elif vtyp != type(val):
421428
if vtyp == Message:
422429
if type(val) == dict or isinstance(val, str):
423430
self._dict[skey] = val
424-
return
425431
else:
426432
raise ValueError(
427433
'"{}", wrong type of value for "{}"'.format(
428434
val, skey))
429-
raise ValueError(
430-
'"{}", wrong type of value for "{}"'.format(val, skey))
431-
if isinstance(val, str):
432-
self._dict[skey] = val
433-
elif isinstance(val, list):
434-
if len(val) == 1:
435-
self._dict[skey] = val[0]
436-
elif not len(val):
437-
pass
438435
else:
439-
raise TooManyValues(key)
440-
else:
441-
self._dict[skey] = val
436+
raise ValueError(
437+
'"{}", wrong type of value for "{}"'.format(val,
438+
skey))
442439

443440
def to_json(self, lev=0, indent=None):
444441
"""
@@ -457,18 +454,12 @@ def from_json(self, txt, **kwargs):
457454
"""
458455
Convert from a JSON string to an instance of this class.
459456
460-
:param txt: The JSON string
457+
:param txt: The JSON string (a ``str``, ``bytes`` or ``bytearray``
458+
instance containing a JSON document)
461459
:param kwargs: extra keyword arguments
462460
:return: The instantiated instance
463461
"""
464-
try:
465-
_dict = json.loads(txt)
466-
except TypeError:
467-
try:
468-
_dict = json.loads(as_unicode(txt))
469-
except TypeError:
470-
raise FormatError('Wrong format')
471-
462+
_dict = json.loads(txt)
472463
return self.from_dict(_dict)
473464

474465
def to_jwt(self, key=None, algorithm="", lev=0, lifetime=0):
@@ -499,43 +490,42 @@ def from_jwt(self, txt, keyjar, verify=True, **kwargs):
499490
:return: A class instance
500491
"""
501492

502-
_jw = jwe_factory(txt)
503-
if _jw:
504-
logger.debug("JWE headers: {}".format(_jw.jwt.headers))
493+
_decryptor = jwe_factory(txt)
494+
if _decryptor:
495+
logger.debug("JWE headers: {}".format(_decryptor.jwt.headers))
505496

506497
if "encalg" in kwargs:
507-
if kwargs["encalg"] != _jw["alg"]:
498+
if not _decryptor.jwt.verify_header('alg', kwargs["encalg"]):
508499
raise WrongEncryptionAlgorithm("%s != %s" % (
509-
_jw["alg"], ["encalg"]))
500+
_decryptor.jwt.headers["alg"], ["encalg"]))
510501

511-
if kwargs["encenc"] != _jw["enc"]:
502+
if not _decryptor.jwt.verify_header('enc', kwargs["encenc"]):
512503
raise WrongEncryptionAlgorithm("%s != %s" % (
513-
_jw["enc"], kwargs["encenc"]))
504+
_decryptor.jwt.headers["enc"], kwargs["encenc"]))
514505

515506
dkeys = keyjar.get_decrypt_key(owner="")
516507
# if "sender" in kwargs:
517508
# dkeys.extend(keyjar.get_deccrypt_key(owner=kwargs["sender"]))
518509

519-
logger.debug('Decrypt class: {}'.format(_jw.__class__))
520-
_res = _jw.decrypt(txt, dkeys)
510+
logger.debug('Decrypt class: {}'.format(_decryptor.__class__))
511+
_res = _decryptor.decrypt(txt, dkeys)
521512
logger.debug('decrypted message:{}'.format(_res))
522513
if isinstance(_res, tuple):
523514
txt = as_unicode(_res[0])
524515
elif isinstance(_res, list) and len(_res) == 2:
525516
txt = as_unicode(_res[0])
526517
else:
527518
txt = as_unicode(_res)
528-
self.jwe_header = _jw.jwt.headers
519+
self.jwe_header = _decryptor.jwt.headers
529520

530-
_jw = jws_factory(txt)
531-
if _jw:
521+
_verifier = jws_factory(txt)
522+
if _verifier:
532523
if "sigalg" in kwargs:
533-
_alg = _jw.jwt.headers["alg"]
534-
if kwargs["sigalg"] != _alg:
524+
if not _verifier.jwt.verify_header("alg", kwargs["sigalg"]):
535525
raise WrongSigningAlgorithm("%s != %s" % (
536-
_alg, kwargs["sigalg"]))
526+
_verifier.jwt.headers["alg"], kwargs["sigalg"]))
537527
try:
538-
_jwt = _jw.jwt
528+
_jwt = _verifier.jwt
539529
jso = _jwt.payload()
540530
_header = _jwt.headers
541531

@@ -559,12 +549,12 @@ def from_jwt(self, txt, keyjar, verify=True, **kwargs):
559549

560550
logger.debug("Found signing key.")
561551
try:
562-
_jw.verify_compact(txt, key)
552+
_verifier.verify_compact(txt, key)
563553
except NoSuitableSigningKeys:
564554
if keyjar:
565555
update_keyjar(keyjar)
566556
key = keyjar.get_jwt_verify_keys(_jwt, **kwargs)
567-
_jw.verify_compact(txt, key)
557+
_verifier.verify_compact(txt, key)
568558
except Exception:
569559
raise
570560
else:
@@ -586,18 +576,19 @@ def __str__(self):
586576
def _type_check(self, typ, _allowed, val, na=False):
587577
if typ is str:
588578
if val not in _allowed:
589-
raise NotAllowedValue(val)
579+
return False
590580
elif typ is int:
591581
if val not in _allowed:
592-
raise NotAllowedValue(val)
582+
return False
593583
elif isinstance(typ, list):
594584
if isinstance(val, list):
595585
# _typ = typ[0]
596586
for item in val:
597587
if item not in _allowed:
598-
raise NotAllowedValue(val)
588+
return False
599589
elif val is None and na is False:
600-
raise NotAllowedValue(val)
590+
return False
591+
return True
601592

602593
def verify(self, **kwargs):
603594
"""
@@ -633,7 +624,8 @@ def verify(self, **kwargs):
633624
except KeyError:
634625
pass
635626
else:
636-
self._type_check(typ, _allowed_val, val, na)
627+
if not self._type_check(typ, _allowed_val, val, na):
628+
raise NotAllowedValue(val)
637629

638630
return True
639631

0 commit comments

Comments
 (0)