Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 27 additions & 35 deletions src/idpyoidc/message/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ def set_defaults(self):
for key, val in self.c_default.items():
self._dict.setdefault(key, val)

def to_urlencoded(self, lev=0):
def to_urlencoded(self):
"""
Creates a string using the application/x-www-form-urlencoded format

Expand Down Expand Up @@ -114,21 +114,21 @@ def to_urlencoded(self, lev=0):
params.append((key, val.encode("utf-8")))
elif isinstance(val, list):
if _ser:
params.append((key, str(_ser(val, sformat="urlencoded", lev=lev))))
params.append((key, str(_ser(val, sformat="urlencoded"))))
else:
for item in val:
params.append((key, str(item).encode("utf-8")))
elif isinstance(val, Message):
try:
_val = json.dumps(_ser(val, sformat="dict", lev=lev + 1))
_val = json.dumps(_ser(val, sformat="dict"))
params.append((key, _val))
except TypeError:
params.append((key, val))
elif val is None:
params.append((key, val))
else:
try:
params.append((key, _ser(val, lev=lev)))
params.append((key, _ser(val)))
except Exception:
params.append((key, str(val)))

Expand All @@ -143,18 +143,17 @@ def to_urlencoded(self, lev=0):
_val.append((k, v))
return urlencode(_val)

def serialize(self, method="urlencoded", lev=0, **kwargs):
def serialize(self, method="urlencoded", **kwargs):
"""
Convert this instance to another representation. Which representation
is given by the choice of serialization method.

:param method: A serialization method. Presently 'urlencoded', 'json',
'jwt' and 'dict' is supported.
:param lev:
:param kwargs: Extra key word arguments
:return: THe content of this message serialized using a chosen method
"""
return getattr(self, "to_%s" % method)(lev=lev, **kwargs)
return getattr(self, "to_%s" % method)(**kwargs)

def deserialize(self, info, method="urlencoded", **kwargs):
"""
Expand Down Expand Up @@ -231,7 +230,7 @@ def from_urlencoded(self, urlencoded, **kwargs):

return self

def to_dict(self, lev=0):
def to_dict(self):
"""
Return a dictionary representation of the class

Expand All @@ -241,7 +240,6 @@ def to_dict(self, lev=0):
_spec = self.c_param

_res = {}
lev += 1
for key, val in self._dict.items():
try:
_ser = _spec[str(key)][2]
Expand All @@ -256,12 +254,12 @@ def to_dict(self, lev=0):
_ser = None

if _ser:
val = _ser(val, "dict", lev)
val = _ser(val, "dict")

if isinstance(val, Message):
_res[key] = val.to_dict(lev + 1)
_res[key] = val.to_dict()
elif isinstance(val, list) and isinstance(next(iter(val or []), None), Message):
_res[key] = [v.to_dict(lev) for v in val]
_res[key] = [v.to_dict() for v in val]
else:
_res[key] = val

Expand Down Expand Up @@ -418,18 +416,14 @@ def _add_value(self, skey, vtyp, key, val, _deser, null_allowed, sformat="urlenc
else:
raise ValueError('"{}", wrong type of value for "{}"'.format(val, skey))

def to_json(self, lev=0, indent=None):
def to_json(self, indent=None):
"""
Serialize the content of this instance into a JSON string.

:param lev:
:param indent: Number of spaces that should be used for indentation
:return:
"""
if lev:
return self.to_dict(lev + 1)
else:
return json.dumps(self.to_dict(1), indent=indent)
return json.dumps(self.to_dict(), indent=indent)

def from_json(self, txt, **kwargs):
"""
Expand All @@ -443,18 +437,17 @@ def from_json(self, txt, **kwargs):
_dict = json.loads(txt)
return self.from_dict(_dict)

def to_jwt(self, key=None, algorithm="", lev=0, lifetime=0):
def to_jwt(self, key=None, algorithm="", lifetime=0):
"""
Create a signed JWT representation of the class instance

:param key: The signing key
:param algorithm: The signature algorithm to use
:param lev:
:param lifetime: The lifetime of the JWS
:return: A signed JWT
"""

_jws = JWS(self.to_json(lev), alg=algorithm)
_jws = JWS(self.to_json(), alg=algorithm)
return _jws.sign_compact(key)

def _gather_keys(self, keyjar, jwt, header, **kwargs):
Expand Down Expand Up @@ -763,7 +756,7 @@ def update(self, item, **kwargs):
else:
raise ValueError("Can't update message using: '%s'" % (item,))

def to_jwe(self, keys, enc, alg, lev=0):
def to_jwe(self, keys, enc, alg):
"""
Place the information in this instance in a JSON object. Make that
JSON object the body of a JWT. Then encrypt that JWT using the
Expand All @@ -772,12 +765,11 @@ def to_jwe(self, keys, enc, alg, lev=0):
:param keys: list or KeyJar instance
:param enc: Content Encryption Algorithm
:param alg: Key Management Algorithm
:param lev: Used for JSON construction
:return: An encrypted JWT. If encryption failed an exception will be
raised.
"""

_jwe = JWE(self.to_json(lev), alg=alg, enc=enc)
_jwe = JWE(self.to_json(), alg=alg, enc=enc)
return _jwe.encrypt(keys)

def from_jwe(self, msg, keys):
Expand Down Expand Up @@ -861,7 +853,7 @@ def add_non_standard(msg1, msg2):
# =============================================================================


def list_serializer(vals, sformat="urlencoded", lev=0):
def list_serializer(vals, sformat="urlencoded"):
if isinstance(vals, str) and sformat == "dict":
return [vals]

Expand All @@ -887,7 +879,7 @@ def list_deserializer(val, sformat="urlencoded"):
return val


def sp_sep_list_serializer(vals, sformat="urlencoded", lev=0):
def sp_sep_list_serializer(vals, sformat="urlencoded"):
if isinstance(vals, str):
return vals
else:
Expand All @@ -903,7 +895,7 @@ def sp_sep_list_deserializer(val, sformat="urlencoded"):
return val


def json_serializer(obj, sformat="urlencoded", lev=0):
def json_serializer(obj, sformat="urlencoded"):
return json.dumps(obj)


Expand All @@ -921,20 +913,20 @@ def msg_deser(val, sformat="urlencoded"):
return Message().deserialize(val, sformat)


def msg_ser(inst, sformat, lev=0):
def msg_ser(inst, sformat):
if sformat in ["urlencoded", "json"]:
if isinstance(inst, dict):
if sformat == "json":
res = json.dumps(inst)
else:
res = urlencode([(k, v) for k, v in inst.items()])
elif isinstance(inst, Message):
res = inst.serialize(sformat, lev)
res = inst.serialize(sformat)
else:
res = inst
elif sformat == "dict":
if isinstance(inst, Message):
res = inst.serialize(sformat, lev)
res = inst.serialize(sformat)
elif isinstance(inst, dict):
res = inst
elif isinstance(inst, str): # Iff ID Token
Expand All @@ -947,7 +939,7 @@ def msg_ser(inst, sformat, lev=0):
return res


def msg_list_deser(val, sformat="urlencoded", lev=0):
def msg_list_deser(val, sformat="urlencoded"):
if isinstance(val, dict):
return [Message(**val)]

Expand All @@ -957,7 +949,7 @@ def msg_list_deser(val, sformat="urlencoded", lev=0):
return _res


def msg_list_ser(val, sformat="urlencoded", lev=0):
def msg_list_ser(val, sformat="urlencoded"):
_res = []
for v in val:
_res.append(msg_ser(v, sformat))
Expand Down Expand Up @@ -1004,11 +996,11 @@ def msg_list_ser(val, sformat="urlencoded", lev=0):
OPTIONAL_LIST_OF_MESSAGES = ([Message], False, msg_list_ser, msg_list_deser, False)


def any_ser(val, sformat="urlencoded", lev=0):
def any_ser(val, sformat="urlencoded"):
if isinstance(val, (str, int, bool)):
return val
elif isinstance(val, Message):
return msg_ser(val, sformat, lev)
return msg_ser(val, sformat)
elif isinstance(val, dict):
return json.dumps(val)
elif isinstance(val, list):
Expand All @@ -1017,7 +1009,7 @@ def any_ser(val, sformat="urlencoded", lev=0):
raise ValueError("Can't serialize this type of data")


def any_deser(val, sformat="urlencoded", lev=0):
def any_deser(val, sformat="urlencoded"):
if isinstance(val, dict):
return Message(**val)
elif isinstance(val, list):
Expand Down
39 changes: 18 additions & 21 deletions src/idpyoidc/message/oidc/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,11 +80,11 @@ def deserialize_from_one_of(val, msgtype, sformat):
raise FormatError("Unexpected format")


def json_ser(val, sformat=None, lev=0):
def json_ser(val, sformat=None):
return json.dumps(val)


def json_deser(val, sformat=None, lev=0):
def json_deser(val, sformat=None):
return json.loads(val)


Expand All @@ -108,14 +108,14 @@ def claims_deser(val, sformat="urlencoded"):
return deserialize_from_one_of(val, Claims, sformat)


def msg_ser_json(inst, sformat="json", lev=0):
def msg_ser_json(inst, sformat="json"):
# sformat = "json" always except when dict
if lev:
sformat = "dict"
# if lev:
# sformat = "dict"

if sformat == "dict":
if isinstance(inst, Message):
res = inst.serialize(sformat, lev)
res = inst.serialize(sformat)
elif isinstance(inst, dict):
res = inst
else:
Expand All @@ -125,18 +125,18 @@ def msg_ser_json(inst, sformat="json", lev=0):
if isinstance(inst, dict):
res = json.dumps(inst)
elif isinstance(inst, Message):
res = inst.serialize(sformat, lev)
res = inst.serialize(sformat)
else:
res = inst

return res


def msg_list_ser(insts, sformat, lev=0):
return [msg_ser(inst, sformat, lev) for inst in insts]
def msg_list_ser(insts, sformat):
return [msg_ser(inst, sformat) for inst in insts]


def claims_ser(val, sformat="urlencoded", lev=0):
def claims_ser(val, sformat="urlencoded"):
# everything in c_extension
if isinstance(val, str):
item = val
Expand All @@ -146,15 +146,12 @@ def claims_ser(val, sformat="urlencoded", lev=0):
item = val

if isinstance(item, Message):
return item.serialize(method=sformat, lev=lev + 1)
return item.serialize(method=sformat)

if sformat == "urlencoded":
res = urlencode(item)
elif sformat == "json":
if lev:
res = item
else:
res = json.dumps(item)
res = json.dumps(item)
elif sformat == "dict":
if isinstance(item, dict):
res = item
Expand Down Expand Up @@ -771,9 +768,9 @@ def pack(self, alg="", **kwargs):
else:
self.pack_init()

def to_jwt(self, key=None, algorithm="", lev=0, lifetime=0):
def to_jwt(self, key=None, algorithm="", lifetime=0):
self.pack(alg=algorithm, lifetime=lifetime)
return Message.to_jwt(self, key=key, algorithm=algorithm, lev=lev)
return Message.to_jwt(self, key=key, algorithm=algorithm)

def verify(self, **kwargs):
super(IdToken, self).verify(**kwargs)
Expand Down Expand Up @@ -1090,20 +1087,20 @@ def link_deser(val, sformat="urlencoded"):
return _l_deser(val, sformat)


def link_ser(inst, sformat, lev=0):
def link_ser(inst, sformat):
if sformat in ["urlencoded", "json"]:
if isinstance(inst, dict):
if sformat == "json":
res = json.dumps(inst)
else:
res = urlencode([(k, v) for k, v in inst.items()])
elif isinstance(inst, Link):
res = inst.serialize(sformat, lev)
res = inst.serialize(sformat)
else:
res = inst
elif sformat == "dict":
if isinstance(inst, Link):
res = inst.serialize(sformat, lev)
res = inst.serialize(sformat)
elif isinstance(inst, dict):
res = inst
elif isinstance(inst, str): # Iff ID Token
Expand All @@ -1116,7 +1113,7 @@ def link_ser(inst, sformat, lev=0):
return res


def link_list_ser(inst, sformat, lev=0):
def link_list_ser(inst, sformat):
if isinstance(inst, list):
return [link_ser(v, sformat) for v in inst]
else:
Expand Down
4 changes: 2 additions & 2 deletions tests/test_04_message.py
Original file line number Diff line number Diff line change
Expand Up @@ -336,15 +336,15 @@ def test_to_jwe(keytype, alg, enc):

def test_to_dict_with_message_obj():
content = Message(a={"a": {"foo": {"bar": [{"bat": []}]}}})
_dict = content.to_dict(lev=0)
_dict = content.to_dict()
content_fixture = {"a": {"a": {"foo": {"bar": [{"bat": []}]}}}}
assert _dict == content_fixture


def test_to_dict_with_raw_types():
msg = Message(c_default=[])
content_fixture = {"c_default": []}
_dict = msg.to_dict(lev=1)
_dict = msg.to_dict()
assert _dict == content_fixture


Expand Down