mrok 0.1.5__py3-none-any.whl → 0.1.7__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. mrok/__init__.py +6 -0
  2. mrok/agent/__init__.py +0 -0
  3. mrok/agent/sidecar/__init__.py +3 -0
  4. mrok/agent/sidecar/app.py +30 -0
  5. mrok/agent/sidecar/main.py +27 -0
  6. mrok/agent/ziticorn.py +29 -0
  7. mrok/cli/__init__.py +3 -0
  8. mrok/cli/commands/__init__.py +7 -0
  9. mrok/cli/commands/admin/__init__.py +10 -0
  10. mrok/cli/commands/admin/bootstrap.py +58 -0
  11. mrok/cli/commands/admin/register/__init__.py +8 -0
  12. mrok/cli/commands/admin/register/extensions.py +46 -0
  13. mrok/cli/commands/admin/register/instances.py +60 -0
  14. mrok/cli/commands/admin/unregister/__init__.py +8 -0
  15. mrok/cli/commands/admin/unregister/extensions.py +33 -0
  16. mrok/cli/commands/admin/unregister/instances.py +34 -0
  17. mrok/cli/commands/admin/utils.py +23 -0
  18. mrok/cli/commands/agent/__init__.py +6 -0
  19. mrok/cli/commands/agent/run/__init__.py +7 -0
  20. mrok/cli/commands/agent/run/asgi.py +49 -0
  21. mrok/cli/commands/agent/run/sidecar.py +54 -0
  22. mrok/cli/commands/controller/__init__.py +7 -0
  23. mrok/cli/commands/controller/openapi.py +47 -0
  24. mrok/cli/commands/controller/run.py +87 -0
  25. mrok/cli/main.py +97 -0
  26. mrok/cli/rich.py +18 -0
  27. mrok/conf.py +32 -0
  28. mrok/controller/__init__.py +0 -0
  29. mrok/controller/app.py +62 -0
  30. mrok/controller/auth.py +87 -0
  31. mrok/controller/dependencies/__init__.py +4 -0
  32. mrok/controller/dependencies/conf.py +7 -0
  33. mrok/controller/dependencies/ziti.py +27 -0
  34. mrok/controller/openapi/__init__.py +3 -0
  35. mrok/controller/openapi/examples.py +44 -0
  36. mrok/controller/openapi/utils.py +35 -0
  37. mrok/controller/pagination.py +79 -0
  38. mrok/controller/routes.py +294 -0
  39. mrok/controller/schemas.py +67 -0
  40. mrok/errors.py +2 -0
  41. mrok/http/__init__.py +0 -0
  42. mrok/http/config.py +65 -0
  43. mrok/http/forwarder.py +299 -0
  44. mrok/http/lifespan.py +10 -0
  45. mrok/http/master.py +90 -0
  46. mrok/http/protocol.py +11 -0
  47. mrok/http/server.py +14 -0
  48. mrok/logging.py +76 -0
  49. mrok/ziti/__init__.py +15 -0
  50. mrok/ziti/api.py +467 -0
  51. mrok/ziti/bootstrap.py +71 -0
  52. mrok/ziti/constants.py +6 -0
  53. mrok/ziti/errors.py +25 -0
  54. mrok/ziti/identities.py +161 -0
  55. mrok/ziti/pki.py +52 -0
  56. mrok/ziti/services.py +87 -0
  57. {mrok-0.1.5.dist-info → mrok-0.1.7.dist-info}/METADATA +7 -9
  58. mrok-0.1.7.dist-info/RECORD +61 -0
  59. {mrok-0.1.5.dist-info → mrok-0.1.7.dist-info}/WHEEL +1 -2
  60. mrok-0.1.5.dist-info/RECORD +0 -6
  61. mrok-0.1.5.dist-info/top_level.txt +0 -1
  62. {mrok-0.1.5.dist-info → mrok-0.1.7.dist-info}/entry_points.txt +0 -0
  63. {mrok-0.1.5.dist-info → mrok-0.1.7.dist-info}/licenses/LICENSE.txt +0 -0
@@ -0,0 +1,161 @@
1
+ import logging
2
+ from typing import Any
3
+
4
+ import jwt
5
+
6
+ from mrok.ziti import pki
7
+ from mrok.ziti.api import TagsType, ZitiClientAPI, ZitiManagementAPI
8
+ from mrok.ziti.constants import MROK_SERVICE_TAG_NAME
9
+ from mrok.ziti.errors import (
10
+ ProxyIdentityAlreadyExistsError,
11
+ ServiceNotFoundError,
12
+ UserIdentityNotFoundError,
13
+ )
14
+
15
+ logger = logging.getLogger("mrok.ziti")
16
+
17
+
18
+ async def register_instance(
19
+ mgmt_api: ZitiManagementAPI,
20
+ client_api: ZitiClientAPI,
21
+ extension_id: str,
22
+ instance_id: str,
23
+ tags: TagsType | None = None,
24
+ ):
25
+ service_name = extension_id.lower()
26
+ tags = tags or {}
27
+ tags[MROK_SERVICE_TAG_NAME] = service_name
28
+ service = await mgmt_api.search_service(service_name)
29
+ if not service:
30
+ raise ServiceNotFoundError(f"A service with name `{extension_id}` does not exists.")
31
+
32
+ identity_name = f"{instance_id.lower()}.{service_name}"
33
+ service_policy_name = f"{identity_name}:bind"
34
+
35
+ identity = await mgmt_api.search_identity(identity_name)
36
+ if identity:
37
+ service_policy = await mgmt_api.search_service_policy(service_policy_name)
38
+ if service_policy:
39
+ await mgmt_api.delete_service_policy(service_policy["id"])
40
+ router_policy = await mgmt_api.search_router_policy(identity_name)
41
+ if router_policy:
42
+ await mgmt_api.delete_router_policy(router_policy["id"])
43
+ await mgmt_api.delete_identity(identity["id"])
44
+
45
+ identity_id = await mgmt_api.create_user_identity(identity_name, tags=tags)
46
+ identity = await mgmt_api.get_identity(identity_id)
47
+
48
+ identity_json = await _enroll_identity(
49
+ mgmt_api,
50
+ client_api,
51
+ identity_id,
52
+ identity,
53
+ mrok={
54
+ "identity": identity_name,
55
+ "extension": extension_id,
56
+ "instance": instance_id,
57
+ },
58
+ )
59
+
60
+ await mgmt_api.create_bind_service_policy(service_policy_name, service["id"], identity_id)
61
+ await mgmt_api.create_router_policy(identity_name, identity_id)
62
+
63
+ return identity, identity_json
64
+
65
+
66
+ async def unregister_instance(
67
+ mgmt_api: ZitiManagementAPI,
68
+ extension_id: str,
69
+ instance_id: str,
70
+ ):
71
+ service_name = extension_id.lower()
72
+ service = await mgmt_api.search_service(service_name)
73
+ if not service:
74
+ raise ServiceNotFoundError(f"A service with name `{extension_id}` does not exists.")
75
+
76
+ identity_name = f"{instance_id.lower()}.{service_name}"
77
+ service_policy_name = f"{identity_name}:bind"
78
+
79
+ identity = await mgmt_api.search_identity(identity_name)
80
+ if not identity:
81
+ raise UserIdentityNotFoundError(f"Instance `{instance_id}` not found.")
82
+
83
+ service_policy = await mgmt_api.search_service_policy(service_policy_name)
84
+ if service_policy:
85
+ await mgmt_api.delete_service_policy(service_policy["id"])
86
+ router_policy = await mgmt_api.search_router_policy(identity_name)
87
+ if router_policy:
88
+ await mgmt_api.delete_router_policy(router_policy["id"])
89
+ await mgmt_api.delete_identity(identity["id"])
90
+
91
+
92
+ async def enroll_proxy_identity(
93
+ mgmt_api: ZitiManagementAPI,
94
+ client_api: ZitiClientAPI,
95
+ identity_name: str,
96
+ tags: TagsType | None = None,
97
+ ):
98
+ identity = await mgmt_api.search_identity(identity_name)
99
+ if identity:
100
+ raise ProxyIdentityAlreadyExistsError(
101
+ f"A proxy identity with name `{identity_name}` already exists."
102
+ )
103
+ identity_id = await mgmt_api.create_device_identity(identity_name, tags=tags)
104
+ identity_json = await _enroll_identity(mgmt_api, client_api, identity_id)
105
+ logger.info(f"Enrolled proxy identity '{identity_name}'")
106
+
107
+ return identity_id, identity_json
108
+
109
+
110
+ async def _enroll_identity(
111
+ mgmt_api: ZitiManagementAPI,
112
+ client_api: ZitiClientAPI,
113
+ identity_id: str,
114
+ identity: dict[str, Any] | None = None,
115
+ mrok: dict[str, str] | None = None,
116
+ ):
117
+ if identity is None:
118
+ identity = await mgmt_api.get_identity(identity_id)
119
+
120
+ claims = _get_enroll_token_claims(identity)
121
+ pkey_pem, csr_pem = pki.generate_key_and_csr(identity_id)
122
+
123
+ enroll_response = await client_api.enroll_identity(claims["jti"], csr_pem)
124
+ certificate_pem = enroll_response["data"]["cert"]
125
+ ca_pem = await pki.get_ca_certificates(mgmt_api)
126
+
127
+ return _generate_identity_json(
128
+ client_api.base_url,
129
+ pkey_pem,
130
+ certificate_pem,
131
+ ca_pem,
132
+ mrok=mrok,
133
+ )
134
+
135
+
136
+ def _get_enroll_token_claims(identity: dict[str, Any]):
137
+ jwt_token = identity["enrollment"]["ott"]["jwt"]
138
+ return jwt.decode(jwt_token, algorithms=["RS256"], options={"verify_signature": False})
139
+
140
+
141
+ def _generate_identity_json(
142
+ ziti_api_url: str,
143
+ pkey_pem: str,
144
+ certificate_pem: str,
145
+ ca_pem: str,
146
+ mrok: dict | None = None,
147
+ ) -> dict[str, Any]:
148
+ identity = {
149
+ "ztAPI": ziti_api_url,
150
+ "ztAPIs": None,
151
+ "configTypes": None,
152
+ "id": {
153
+ "key": f"pem:{pkey_pem}",
154
+ "cert": f"pem:{certificate_pem}",
155
+ "ca": f"pem:{ca_pem}",
156
+ },
157
+ "enableHa": False,
158
+ }
159
+ if mrok:
160
+ identity["mrok"] = mrok
161
+ return identity
mrok/ziti/pki.py ADDED
@@ -0,0 +1,52 @@
1
+ import base64
2
+
3
+ from cryptography import x509
4
+ from cryptography.hazmat.primitives import hashes, serialization
5
+ from cryptography.hazmat.primitives.asymmetric import rsa
6
+ from cryptography.hazmat.primitives.serialization.pkcs7 import load_der_pkcs7_certificates
7
+ from cryptography.x509.oid import NameOID
8
+
9
+ from mrok.ziti.api import ZitiManagementAPI
10
+
11
+ _ca_certificates = None
12
+
13
+
14
+ async def get_ca_certificates(mgmt_api: ZitiManagementAPI) -> str:
15
+ global _ca_certificates
16
+ if not _ca_certificates:
17
+ cas_pkcs7 = await mgmt_api.fetch_ca_certificates()
18
+ pkcs7_bytes = base64.b64decode(cas_pkcs7)
19
+ pkcs7_certs = load_der_pkcs7_certificates(pkcs7_bytes)
20
+ ca_certificates = []
21
+ for cert in pkcs7_certs:
22
+ cert_pem = cert.public_bytes(serialization.Encoding.PEM)
23
+ ca_certificates.append(cert_pem.decode("utf-8"))
24
+ _ca_certificates = "\n".join(ca_certificates)
25
+ return _ca_certificates
26
+
27
+
28
+ def generate_key_and_csr(identity_id: str, key_size: int = 4096) -> tuple[str, str]:
29
+ private_key = rsa.generate_private_key(public_exponent=65537, key_size=key_size)
30
+ subject = x509.Name(
31
+ [
32
+ x509.NameAttribute(NameOID.COUNTRY_NAME, "CH"),
33
+ x509.NameAttribute(NameOID.ORGANIZATION_NAME, "SoftwareOne"),
34
+ x509.NameAttribute(NameOID.ORGANIZATIONAL_UNIT_NAME, "Marketplace Platform"),
35
+ x509.NameAttribute(NameOID.COMMON_NAME, identity_id),
36
+ ]
37
+ )
38
+ csr = (
39
+ x509.CertificateSigningRequestBuilder()
40
+ .subject_name(subject)
41
+ .sign(private_key, hashes.SHA256())
42
+ )
43
+
44
+ key_pem = private_key.private_bytes(
45
+ encoding=serialization.Encoding.PEM,
46
+ format=serialization.PrivateFormat.PKCS8,
47
+ encryption_algorithm=serialization.NoEncryption(),
48
+ ).decode()
49
+
50
+ csr_pem = csr.public_bytes(serialization.Encoding.PEM).decode()
51
+
52
+ return key_pem, csr_pem
mrok/ziti/services.py ADDED
@@ -0,0 +1,87 @@
1
+ import logging
2
+ from typing import Any
3
+
4
+ from mrok.conf import Settings
5
+ from mrok.ziti.api import TagsType, ZitiManagementAPI
6
+ from mrok.ziti.errors import (
7
+ ConfigTypeNotFoundError,
8
+ ProxyIdentityNotFoundError,
9
+ ServiceAlreadyRegisteredError,
10
+ ServiceNotFoundError,
11
+ )
12
+
13
+ logger = logging.getLogger(__name__)
14
+
15
+
16
+ async def register_extension(
17
+ settings: Settings, mgmt_api: ZitiManagementAPI, extension_id: str, tags: TagsType | None
18
+ ) -> dict[str, Any]:
19
+ service_name = extension_id.lower()
20
+ registered = False
21
+ proxy_identity = await mgmt_api.search_identity(settings.proxy.identity)
22
+ if not proxy_identity:
23
+ raise ProxyIdentityNotFoundError(
24
+ f"Identity for proxy `{settings.proxy.identity}` not found.",
25
+ )
26
+
27
+ config_type = await mgmt_api.search_config_type(f"{settings.proxy.mode}.proxy.v1")
28
+ if not config_type:
29
+ raise ConfigTypeNotFoundError(f"Config type `{settings.proxy.mode}.proxy.v1` not found.")
30
+
31
+ config = await mgmt_api.search_config(service_name)
32
+ if not config:
33
+ config_id = await mgmt_api.create_config(service_name, config_type["id"], tags=tags)
34
+ registered = True
35
+ else:
36
+ config_id = config["id"]
37
+ service = await mgmt_api.search_service(service_name)
38
+ if not service:
39
+ service_id = await mgmt_api.create_service(service_name, config_id, tags=tags)
40
+ service = await mgmt_api.get_service(service_id)
41
+ registered = True
42
+ else:
43
+ service_id = service["id"]
44
+ proxy_identity_id = proxy_identity["id"]
45
+ service_policy_name = f"{service_name}:{settings.proxy.identity}:dial"
46
+ dial_service_policy = await mgmt_api.search_service_policy(service_policy_name)
47
+ if not dial_service_policy:
48
+ await mgmt_api.create_dial_service_policy(
49
+ service_policy_name,
50
+ service_id,
51
+ proxy_identity_id,
52
+ tags=tags,
53
+ )
54
+ registered = True
55
+
56
+ router_policy = await mgmt_api.search_service_router_policy(service_name)
57
+ if not router_policy:
58
+ await mgmt_api.create_service_router_policy(service_name, service_id, tags=tags)
59
+ registered = True
60
+ if not registered:
61
+ raise ServiceAlreadyRegisteredError(f"Extension `{extension_id}` already registered.")
62
+ return service
63
+
64
+
65
+ async def unregister_extension(
66
+ settings: Settings, mgmt_api: ZitiManagementAPI, extension_id: str
67
+ ) -> None:
68
+ service_name = extension_id.lower()
69
+ service = await mgmt_api.search_service(service_name)
70
+ if not service:
71
+ raise ServiceNotFoundError(f"Extension `{extension_id}` not found.")
72
+
73
+ router_policy = await mgmt_api.search_service_router_policy(service_name)
74
+ if router_policy:
75
+ await mgmt_api.delete_service_router_policy(router_policy["id"])
76
+
77
+ service_policy_name = f"{service_name}:{settings.proxy.identity}:dial"
78
+
79
+ dial_service_policy = await mgmt_api.search_service_policy(service_policy_name)
80
+ if dial_service_policy:
81
+ await mgmt_api.delete_service_policy(dial_service_policy["id"])
82
+
83
+ config = await mgmt_api.search_config(service_name)
84
+ if config:
85
+ await mgmt_api.delete_config(config["id"])
86
+
87
+ await mgmt_api.delete_service(service["id"])
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mrok
3
- Version: 0.1.5
3
+ Version: 0.1.7
4
4
  Summary: MPT Extensions OpenZiti Orchestrator
5
5
  Author: SoftwareOne AG
6
6
  License: Apache License
@@ -204,16 +204,14 @@ License: Apache License
204
204
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
205
205
  See the License for the specific language governing permissions and
206
206
  limitations under the License.
207
-
208
- Requires-Python: <4,>=3.12
209
- Description-Content-Type: text/markdown
210
207
  License-File: LICENSE.txt
208
+ Requires-Python: <4,>=3.12
211
209
  Requires-Dist: cryptography<46.0.0,>=45.0.7
212
210
  Requires-Dist: dynaconf<4.0.0,>=3.2.11
213
211
  Requires-Dist: fastapi-pagination<0.15.0,>=0.14.1
214
- Requires-Dist: fastapi[standard]<0.117.0,>=0.116.1
212
+ Requires-Dist: fastapi[standard]<0.120.0,>=0.119.0
215
213
  Requires-Dist: gunicorn<24.0.0,>=23.0.0
216
- Requires-Dist: httptools<0.7.0,>=0.6.4
214
+ Requires-Dist: httptools<0.8.0,>=0.7.1
217
215
  Requires-Dist: httpx<0.29.0,>=0.28.1
218
216
  Requires-Dist: openziti<2.0.0,>=1.3.1
219
217
  Requires-Dist: pydantic<3.0.0,>=2.11.7
@@ -221,9 +219,9 @@ Requires-Dist: pyfiglet<2.0.0,>=1.0.4
221
219
  Requires-Dist: pyjwt<3.0.0,>=2.10.1
222
220
  Requires-Dist: pyyaml<7.0.0,>=6.0.2
223
221
  Requires-Dist: rich<15.0.0,>=14.1.0
224
- Requires-Dist: typer<0.17.0,>=0.16.1
225
- Requires-Dist: uvicorn-worker<0.4.0,>=0.3.0
226
- Dynamic: license-file
222
+ Requires-Dist: typer<0.20.0,>=0.19.2
223
+ Requires-Dist: uvicorn-worker<0.5.0,>=0.4.0
224
+ Description-Content-Type: text/markdown
227
225
 
228
226
  [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff) [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=softwareone-platform_mrok&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=softwareone-platform_mrok) [![Coverage](https://sonarcloud.io/api/project_badges/measure?project=softwareone-platform_mrok&metric=coverage)](https://sonarcloud.io/summary/new_code?id=softwareone-platform_mrok)
229
227
 
@@ -0,0 +1,61 @@
1
+ mrok/__init__.py,sha256=D1PUs3KtMCqG4bFLceVNG62L3RN53NS95uSCNXpgvzs,181
2
+ mrok/conf.py,sha256=iDMxJtorJWxK0mI-pGEi1TBd_064R-VLcWzHB4esUlE,661
3
+ mrok/errors.py,sha256=ruNMDFr2_0ezCGXuCG1OswCEv-bHOIzMMd02J_0ABcs,37
4
+ mrok/logging.py,sha256=4F5rviPK1-MWWMZuHfzNNQmGxg-emAPRdKz0PsWDSww,2261
5
+ mrok/agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ mrok/agent/ziticorn.py,sha256=sWtX7cyaIks8_Re3RmLlcgFPGOZ7-xBqdv6TZ50I1ac,765
7
+ mrok/agent/sidecar/__init__.py,sha256=DrjJGhqFyxsVODW06KI20Wpr6HsD2lD6qFCKUXc7GIE,59
8
+ mrok/agent/sidecar/app.py,sha256=QEfPdeFwlerxDbjAqUNtMsnslVUu2h4nCoOVCBFVsy0,992
9
+ mrok/agent/sidecar/main.py,sha256=6HVJRqtxNOKrCQ0XQhQdfWCfjzHJMgBn_zPqtLsIxWw,798
10
+ mrok/cli/__init__.py,sha256=mtFEa8IeS1x6Gm4dUYoSnAxyEzNqbUVSmWxtuZUMR84,61
11
+ mrok/cli/main.py,sha256=DFcYPwDskXi8SKAgEsuP4GMFzaniIf_6bZaSDWvYKDk,2724
12
+ mrok/cli/rich.py,sha256=P3Dyu8EArUR9_0j7DPK7LRx85TWdYdZ1SaJzD_S1ZCE,511
13
+ mrok/cli/commands/__init__.py,sha256=M6Sypb2vAh6qxQQJNIO9xop2DrD6zt6TEp8rbbD7LS0,114
14
+ mrok/cli/commands/admin/__init__.py,sha256=dc5oZVdcLzG0Jroq1eIzX3VslcgP58fBX8aWzZHKYF4,333
15
+ mrok/cli/commands/admin/bootstrap.py,sha256=iOnHctYajgcHrG_Idjn5Y7VVSaWYRIhdgqKSw9TWq9I,1680
16
+ mrok/cli/commands/admin/utils.py,sha256=yd6FWHqsyfgWu8ch9WX8Js18Hvlx7LdzwMHCaB1ExXU,645
17
+ mrok/cli/commands/admin/register/__init__.py,sha256=5Jb_bc2L47MEpQIrOcquzduTFWQ01Jd1U1MpqaR-Ekw,209
18
+ mrok/cli/commands/admin/register/extensions.py,sha256=nX2PUX8hmsWjyp2dGgge2YmkfeGgGXhqk7fwUx99o9o,1489
19
+ mrok/cli/commands/admin/register/instances.py,sha256=_9xpa4rZYmf7SZ58hx103EuEbA3o2FZYbAVmpT8oRhM,1930
20
+ mrok/cli/commands/admin/unregister/__init__.py,sha256=-GjjCPX1pISbWmJK6GpKO3ijGsDQb21URjU1hNu99O4,215
21
+ mrok/cli/commands/admin/unregister/extensions.py,sha256=AVBjHu-Zc7bUZ_YSbvEk41fKByvRl2Hggip1E2c11Mk,1020
22
+ mrok/cli/commands/admin/unregister/instances.py,sha256=UvMEDOw7FhZYz2AZci79sSVKfDxOS7d5GY5iCUtUZRM,1128
23
+ mrok/cli/commands/agent/__init__.py,sha256=Jr9RDSDdRPjbVJ7NhzgjRD-jtr5hD2vvKzDe7XsLnVo,140
24
+ mrok/cli/commands/agent/run/__init__.py,sha256=E_IJCl3BfMffqFASe8gzJwhhQgt5bQfjhuyekVwdEBA,164
25
+ mrok/cli/commands/agent/run/asgi.py,sha256=aqwu_h9WyCDI2Ts8D4zTvawCETNmcke7cX3zIUyRww4,1265
26
+ mrok/cli/commands/agent/run/sidecar.py,sha256=VC6o1Xw6XXB25xh5F2PyPsDe5Sii0cWLVLDrpNIC5hU,1490
27
+ mrok/cli/commands/controller/__init__.py,sha256=2xw-YVN0akiLiuGUU3XbYyZZ0ugOjQ6XhtTkzEKSmMA,161
28
+ mrok/cli/commands/controller/openapi.py,sha256=QLjVao9UkB2vBaGkFi_q_jrlg4Np4ldMRwDIJsrJ7A8,1175
29
+ mrok/cli/commands/controller/run.py,sha256=osyjssb81xNMYZLPb6dfPR4W_BQlCxKDfvl-BIhG_1A,2460
30
+ mrok/controller/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
+ mrok/controller/app.py,sha256=-GPOu7SV3kWDDzMhwvr7hK0oP8m-HWtMmtivpNUppEg,1635
32
+ mrok/controller/auth.py,sha256=Kg94W8yNMs6TvUmLRYv1QeUjDy4qlGZ-_6OHa4KH1zg,2648
33
+ mrok/controller/pagination.py,sha256=raYpYa34q8Ckl4BXBOEdpWlKkFj6z7e6QLWr2HT7dzI,2187
34
+ mrok/controller/routes.py,sha256=j-dLO4yLkUj-rdjnGhO2suvmR690-UdaNvokDZ7ZpF0,8670
35
+ mrok/controller/schemas.py,sha256=zk91PIJ0zncpBgs4bhU-n-76EWlRKo87r3VVx15JxPc,1320
36
+ mrok/controller/dependencies/__init__.py,sha256=voewk6gjkA0OarL6HFmfT_RLqBns0Fpl-VIqK5xVAEI,202
37
+ mrok/controller/dependencies/conf.py,sha256=2Pa8fxJHkZ29q6UL-w6hUP_wr7WnNELfw5LlzWg1Tec,162
38
+ mrok/controller/dependencies/ziti.py,sha256=fYoxeJb4s6p2_3gxbExbFSRabjpvp_gZMBb3ocXZV3Y,702
39
+ mrok/controller/openapi/__init__.py,sha256=U1dw45w76CcoQagyqg_FXdMuJF3qJZZM6wG8TeTe3Zo,101
40
+ mrok/controller/openapi/examples.py,sha256=ZI0BP7L6sI0z7Mq1I3uc2UrweGpzpPeGSIuf1bUKkgg,1419
41
+ mrok/controller/openapi/utils.py,sha256=Kn55ISAWlMJNwrJTum7iFrBvJvr81To76pCK8W-s79Q,1114
42
+ mrok/http/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
+ mrok/http/config.py,sha256=k8mjvD3ninJn-v1t-co-GSa3upm4b70bWyk3fwdcOh8,2161
44
+ mrok/http/forwarder.py,sha256=mo-Z8B8Zg6kdDX-lWEiptRv-9kJU9cEdmg6gt6eF0cc,11374
45
+ mrok/http/lifespan.py,sha256=9qevhD_5Y0f8fGTh2axdfWx7v1K4vnWtiUNyJLesOHE,262
46
+ mrok/http/master.py,sha256=o_0Sxe2XuTgVAwvBbWkYcO3HkCcfvYP4rgxcuIDPwXo,2426
47
+ mrok/http/protocol.py,sha256=ap8jbLUvgbAH81ZJZCBkQiYR7mkV_eL3rpfwEkoE8sU,392
48
+ mrok/http/server.py,sha256=Mj7C85fc-DXp-WTBWaOd7ag808oliLmFBH5bf-G2FHg,370
49
+ mrok/ziti/__init__.py,sha256=20OWMiexRhOovZOX19zlX87-V78QyWnEnSZfyAftUdE,263
50
+ mrok/ziti/api.py,sha256=vWu9XXptPCcuaoI0c0VM4QFd_vmh2ZgdmqQSzZ-kIPk,15700
51
+ mrok/ziti/bootstrap.py,sha256=pg-8tt2t2Xt-o85UZe2ixfEtX_6eDuK5gqaCbfuCD6Q,2522
52
+ mrok/ziti/constants.py,sha256=VO0LnsXZse2q4TW6HYqO6nrSQ8wX1673iEy-s9Y7jPU,192
53
+ mrok/ziti/errors.py,sha256=yYCbVDwktnR0AYduqtynIjo73K3HOhIrwA_vQimvEd4,368
54
+ mrok/ziti/identities.py,sha256=nVdXVeAGnW8slwy_X2N52vSDXbIF_TMD46751ajJpgE,5088
55
+ mrok/ziti/pki.py,sha256=-V3LDAtntYZ4C6IH2rqfAANxmzpOZ32Rd0MK_27YNME,1906
56
+ mrok/ziti/services.py,sha256=JnznLTHNZjgbFwnBtv7y2XIp4NiQxLVawwP9EfWdVuM,3208
57
+ mrok-0.1.7.dist-info/METADATA,sha256=Z0jLZf_ZJeUJ8pTe6xy64GDbToee3XDCX72HM242ZjU,15506
58
+ mrok-0.1.7.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
59
+ mrok-0.1.7.dist-info/entry_points.txt,sha256=tloXwvU1uJicBJR2h-8HoVclPgwJWDwuREMHN8Zq-nU,38
60
+ mrok-0.1.7.dist-info/licenses/LICENSE.txt,sha256=6PaICaoA3yNsZKLv5G6OKqSfLSoX7MakYqTDgJoTCBs,11346
61
+ mrok-0.1.7.dist-info/RECORD,,
@@ -1,5 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: hatchling 1.27.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
-
@@ -1,6 +0,0 @@
1
- mrok-0.1.5.dist-info/licenses/LICENSE.txt,sha256=6PaICaoA3yNsZKLv5G6OKqSfLSoX7MakYqTDgJoTCBs,11346
2
- mrok-0.1.5.dist-info/METADATA,sha256=zJ7pRHCP2V5bzmDybaox21a2jwLal0RGfI8H7RcNHLo,15537
3
- mrok-0.1.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
4
- mrok-0.1.5.dist-info/entry_points.txt,sha256=tloXwvU1uJicBJR2h-8HoVclPgwJWDwuREMHN8Zq-nU,38
5
- mrok-0.1.5.dist-info/top_level.txt,sha256=sNZMiNdOxFlZFRGJlEErzMWaCb2wTJXuQVeGigF66Us,5
6
- mrok-0.1.5.dist-info/RECORD,,
@@ -1 +0,0 @@
1
- mrok