|
1 | | -import os |
2 | | - |
3 | | -from cryptojwt.jwe.jwe import JWE |
4 | | -from cryptojwt.jwe.utils import alg2keytype |
5 | | - |
6 | | -from idpyoidc.exception import MissingRequiredAttribute |
7 | | -from idpyoidc.util import rndstr |
8 | | - |
9 | | - |
10 | | -def request_object_encryption(msg, service_context, keyjar, **kwargs): |
11 | | - """ |
12 | | - Created an encrypted JSON Web token with *msg* as body. |
13 | | -
|
14 | | - :param msg: The mesaqg |
15 | | - :param service_context: |
16 | | - :param kwargs: |
17 | | - :return: |
18 | | - """ |
19 | | - try: |
20 | | - encalg = kwargs["request_object_encryption_alg"] |
21 | | - except KeyError: |
22 | | - try: |
23 | | - encalg = service_context.get_usage("request_object_encryption_alg") |
24 | | - except KeyError: |
25 | | - return msg |
26 | | - |
27 | | - if not encalg: |
28 | | - return msg |
29 | | - |
30 | | - try: |
31 | | - encenc = kwargs["request_object_encryption_enc"] |
32 | | - except KeyError: |
33 | | - try: |
34 | | - encenc = service_context.get_usage("request_object_encryption_enc") |
35 | | - except KeyError: |
36 | | - raise MissingRequiredAttribute("No request_object_encryption_enc specified") |
37 | | - |
38 | | - if not encenc: |
39 | | - raise MissingRequiredAttribute("No request_object_encryption_enc specified") |
40 | | - |
41 | | - _jwe = JWE(msg, alg=encalg, enc=encenc) |
42 | | - _kty = alg2keytype(encalg) |
43 | | - |
44 | | - try: |
45 | | - _kid = kwargs["enc_kid"] |
46 | | - except KeyError: |
47 | | - _kid = "" |
48 | | - |
49 | | - _target = kwargs.get("target", kwargs.get("recv", None)) |
50 | | - if _target is None: |
51 | | - raise MissingRequiredAttribute("No target specified") |
52 | | - |
53 | | - if _kid: |
54 | | - _keys = keyjar.get_encrypt_key(_kty, issuer_id=_target, kid=_kid) |
55 | | - _jwe["kid"] = _kid |
56 | | - else: |
57 | | - _keys = keyjar.get_encrypt_key(_kty, issuer_id=_target) |
58 | | - |
59 | | - return _jwe.encrypt(_keys) |
60 | | - |
61 | | - |
62 | | -def construct_request_uri(local_dir, base_path, **kwargs): |
63 | | - """ |
64 | | - Constructs a special redirect_uri to be used when communicating with |
65 | | - one OP. Each OP should get their own redirect_uris. |
66 | | -
|
67 | | - :param local_dir: Local directory in which to place the file |
68 | | - :param base_path: Base URL to start with |
69 | | - :param kwargs: |
70 | | - :return: 2-tuple with (filename, url) |
71 | | - """ |
72 | | - _filedir = local_dir |
73 | | - if not os.path.isdir(_filedir): |
74 | | - os.makedirs(_filedir) |
75 | | - _webpath = base_path |
76 | | - _name = rndstr(10) + ".jwt" |
77 | | - filename = os.path.join(_filedir, _name) |
78 | | - while os.path.exists(filename): |
79 | | - _name = rndstr(10) |
80 | | - filename = os.path.join(_filedir, _name) |
81 | | - if _webpath.endswith("/"): |
82 | | - _webname = f"{_webpath}{_name}" |
83 | | - else: |
84 | | - _webname = f"{_webpath}/{_name}" |
85 | | - return filename, _webname |
0 commit comments