pypomes-iam 0.1.9__tar.gz → 0.2.0__tar.gz

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.

Potentially problematic release.


This version of pypomes-iam might be problematic. Click here for more details.

@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pypomes_iam
3
- Version: 0.1.9
3
+ Version: 0.2.0
4
4
  Summary: A collection of Python pomes, penyeach (IAM modules)
5
5
  Project-URL: Homepage, https://github.com/TheWiseCoder/PyPomes-IAM
6
6
  Project-URL: Bug Tracker, https://github.com/TheWiseCoder/PyPomes-IAM/issues
@@ -6,7 +6,7 @@ build-backend = "hatchling.build"
6
6
 
7
7
  [project]
8
8
  name = "pypomes_iam"
9
- version = "0.1.9"
9
+ version = "0.2.0"
10
10
  authors = [
11
11
  { name="GT Nunes", email="wisecoder01@gmail.com" }
12
12
  ]
@@ -0,0 +1,176 @@
1
+ from flask import Response, redirect, request, jsonify
2
+ from logging import Logger
3
+ from typing import Any
4
+
5
+ from .common_pomes import (
6
+ _service_login, _service_logout,
7
+ _service_callback, _service_token, _log_init
8
+ )
9
+ from .jusbr_pomes import _jusbr_logger, _jusbr_registry
10
+ from .keycloak_pomes import _keycloak_logger, _keycloak_registry
11
+
12
+
13
+ # @flask_app.route(rule=<login_endpoint>, # JUSBR_LOGIN_ENDPOINT: /iam/jusbr:login
14
+ # methods=["GET"])
15
+ # @flask_app.route(rule=<login_endpoint>, # KEYCLOAK_LOGIN_ENDPOINT: /iam/keycloak:logout
16
+ # methods=["GET"])
17
+ def service_login() -> Response:
18
+ """
19
+ Entry point for the JusBR login service.
20
+
21
+ Redirect the request to the JusBR authentication page, with the appropriate parameters.
22
+
23
+ :return: the response from the redirect operation
24
+ """
25
+ logger: Logger
26
+ registry: dict[str, Any]
27
+ if request.endpoint == "jusbr-login":
28
+ logger = _jusbr_logger
29
+ registry = _jusbr_registry
30
+ else:
31
+ logger = _keycloak_logger
32
+ registry = _keycloak_registry
33
+
34
+ # log the request
35
+ if logger:
36
+ logger.debug(msg=_log_init(request=request))
37
+
38
+ # obtain the redirect URL
39
+ auth_url: str = _service_login(registry=registry,
40
+ args=request.args,
41
+ logger=logger)
42
+ # redirect the request
43
+ result: Response = redirect(location=auth_url)
44
+
45
+ # log the response
46
+ if logger:
47
+ logger.debug(msg=f"Response {result}")
48
+
49
+ return result
50
+
51
+
52
+ # @flask_app.route(rule=<logout_endpoint>, # JUSBR_LOGOUT_ENDPOINT: /iam/jusbr:logout
53
+ # methods=["GET"])
54
+ # @flask_app.route(rule=<login_endpoint>, # KEYCLOAK_LOGOUT_ENDPOINT: /iam/keycloak:logout
55
+ # methods=["GET"])
56
+ def service_logout() -> Response:
57
+ """
58
+ Entry point for the JusBR logout service.
59
+
60
+ Remove all data associating the user with JusBR from the registry.
61
+
62
+ :return: response *OK*
63
+ """
64
+ logger: Logger
65
+ registry: dict[str, Any]
66
+ if request.endpoint == "jusbr-logout":
67
+ logger = _jusbr_logger
68
+ registry = _jusbr_registry
69
+ else:
70
+ logger = _keycloak_logger
71
+ registry = _keycloak_registry
72
+
73
+ # log the request
74
+ if logger:
75
+ logger.debug(msg=_log_init(request=request))
76
+
77
+ # logout the user
78
+ _service_logout(registry=registry,
79
+ args=request.args,
80
+ logger=logger)
81
+
82
+ result: Response = Response(status=200)
83
+
84
+ # log the response
85
+ if logger:
86
+ logger.debug(msg=f"Response {result}")
87
+
88
+ return result
89
+
90
+
91
+ # @flask_app.route(rule=<callback_endpoint>, # JUSBR_CALLBACK_ENDPOINT: /iam/jusbr:callback
92
+ # methods=["GET", "POST"])
93
+ # @flask_app.route(rule=<callback_endpoint>, # KEYCLOAK_CALLBACK_ENDPOINT: /iam/keycloak:callback
94
+ # methods=["POST"])
95
+ def service_callback() -> Response:
96
+ """
97
+ Entry point for the callback from JusBR on authentication operation.
98
+
99
+ :return: the response containing the token, or *BAD REQUEST*
100
+ """
101
+ logger: Logger
102
+ registry: dict[str, Any]
103
+ if request.endpoint == "jusbr-callback":
104
+ logger = _jusbr_logger
105
+ registry = _jusbr_registry
106
+ else:
107
+ logger = _keycloak_logger
108
+ registry = _keycloak_registry
109
+
110
+ # log the request
111
+ if logger:
112
+ logger.debug(msg=_log_init(request=request))
113
+
114
+ # process the callback operation
115
+ errors: list[str] = []
116
+ token_data: tuple[str, str] = _service_callback(registry=registry,
117
+ args=request.args,
118
+ errors=errors,
119
+ logger=logger)
120
+ result: Response
121
+ if errors:
122
+ result = jsonify({"errors": "; ".join(errors)})
123
+ result.status_code = 400
124
+ else:
125
+ result = jsonify({
126
+ "user_id": token_data[0],
127
+ "access_token": token_data[1]})
128
+
129
+ # log the response
130
+ if logger:
131
+ logger.debug(msg=f"Response {result}")
132
+
133
+ return result
134
+
135
+
136
+ # @flask_app.route(rule=<token_endpoint>, # JUSBR_TOKEN_ENDPOINT: /iam/jusbr:get-token
137
+ # methods=["GET"])
138
+ # @flask_app.route(rule=<token_endpoint>, # JUSBR_TOKEN_ENDPOINT: /iam/jusbr:get-token
139
+ # methods=["GET"])
140
+ def service_token() -> Response:
141
+ """
142
+ Entry point for retrieving the JusBR token.
143
+
144
+ :return: the response containing the token, or *UNAUTHORIZED*
145
+ """
146
+ logger: Logger
147
+ registry: dict[str, Any]
148
+ if request.endpoint == "jusbr-token":
149
+ logger = _jusbr_logger
150
+ registry = _jusbr_registry
151
+ else:
152
+ logger = _keycloak_logger
153
+ registry = _keycloak_registry
154
+
155
+ # log the request
156
+ if logger:
157
+ logger.debug(msg=_log_init(request=request))
158
+
159
+ # retrieve the token
160
+ errors: list[str] = []
161
+ token: str = _service_token(registry=registry,
162
+ args=request.args,
163
+ errors=errors,
164
+ logger=logger)
165
+ result: Response
166
+ if token:
167
+ result = jsonify({"token": token})
168
+ else:
169
+ result = Response("; ".join(errors))
170
+ result.status_code = 401
171
+
172
+ # log the response
173
+ if logger:
174
+ logger.debug(msg=f"Response {result}")
175
+
176
+ return result
@@ -1,17 +1,13 @@
1
1
  from cachetools import FIFOCache
2
2
  from datetime import datetime
3
- from flask import Flask, Response, redirect, request, jsonify
3
+ from flask import Flask
4
4
  from logging import Logger
5
5
  from pypomes_core import (
6
6
  APP_PREFIX, TZ_LOCAL, env_get_int, env_get_str
7
7
  )
8
8
  from typing import Any, Final
9
9
 
10
- from .common_pomes import (
11
- _service_login, _service_logout,
12
- _service_callback, _service_token,
13
- _get_user_data, _log_init
14
- )
10
+ from .common_pomes import _service_token, _get_user_data
15
11
 
16
12
  JUSBR_CLIENT_ID: Final[str] = env_get_str(key=f"{APP_PREFIX}_JUSBR_CLIENT_ID")
17
13
  JUSBR_CLIENT_SECRET: Final[str] = env_get_str(key=f"{APP_PREFIX}_JUSBR_CLIENT_SECRET")
@@ -59,7 +55,7 @@ JUSBR_URL_AUTH_CALLBACK: Final[str] = env_get_str(key=f"{APP_PREFIX}_JUSBR_URL_A
59
55
  _jusbr_registry: dict[str, Any] | None = None
60
56
 
61
57
  # dafault logger
62
- _logger: Logger | None = None
58
+ _jusbr_logger: Logger | None = None
63
59
 
64
60
 
65
61
  def jusbr_setup(flask_app: Flask,
@@ -92,12 +88,13 @@ def jusbr_setup(flask_app: Flask,
92
88
  :param callback_url: URL for JusBR to callback on login
93
89
  :param logger: optional logger
94
90
  """
91
+ from .iam_pomes import service_login, service_logout, service_callback, service_token
92
+ global _jusbr_logger, _jusbr_registry
93
+
95
94
  # establish the logger
96
- global _logger
97
95
  _logger = logger
98
96
 
99
97
  # configure the JusBR registry
100
- global _jusbr_registry
101
98
  _jusbr_registry = {
102
99
  "client-id": client_id,
103
100
  "client-secret": client_secret,
@@ -110,11 +107,6 @@ def jusbr_setup(flask_app: Flask,
110
107
  }
111
108
 
112
109
  # establish the endpoints
113
- if token_endpoint:
114
- flask_app.add_url_rule(rule=token_endpoint,
115
- endpoint="jusbr-token",
116
- view_func=service_token,
117
- methods=["GET"])
118
110
  if login_endpoint:
119
111
  flask_app.add_url_rule(rule=login_endpoint,
120
112
  endpoint="jusbr-login",
@@ -130,136 +122,11 @@ def jusbr_setup(flask_app: Flask,
130
122
  endpoint="jusbr-callback",
131
123
  view_func=service_callback,
132
124
  methods=["GET", "POST"])
133
-
134
-
135
- # @flask_app.route(rule=<login_endpoint>, # JUSBR_LOGIN_ENDPOINT: /iam/jusbr:login
136
- # methods=["GET"])
137
- def service_login() -> Response:
138
- """
139
- Entry point for the JusBR login service.
140
-
141
- Redirect the request to the JusBR authentication page, with the appropriate parameters.
142
-
143
- :return: the response from the redirect operation
144
- """
145
- global _jusbr_registry
146
-
147
- # log the request
148
- if _logger:
149
- _logger.debug(msg=_log_init(request=request))
150
-
151
- # obtain the redirect URL
152
- auth_url: str = _service_login(registry=_jusbr_registry,
153
- args=request.args,
154
- logger=_logger)
155
- # redirect the request
156
- result: Response = redirect(location=auth_url)
157
-
158
- # log the response
159
- if _logger:
160
- _logger.debug(msg=f"Response {result}")
161
-
162
- return result
163
-
164
-
165
- # @flask_app.route(rule=<login_endpoint>, # JUSBR_LOGIN_ENDPOINT: /iam/jusbr:logout
166
- # methods=["GET"])
167
- def service_logout() -> Response:
168
- """
169
- Entry point for the JusBR logout service.
170
-
171
- Remove all data associating the user with JusBR from the registry.
172
-
173
- :return: response *OK*
174
- """
175
- global _jusbr_registry
176
-
177
- # log the request
178
- if _logger:
179
- _logger.debug(msg=_log_init(request=request))
180
-
181
- # logout the user
182
- _service_logout(registry=_jusbr_registry,
183
- args=request.args,
184
- logger=_logger)
185
-
186
- result: Response = Response(status=200)
187
-
188
- # log the response
189
- if _logger:
190
- _logger.debug(msg=f"Response {result}")
191
-
192
- return result
193
-
194
-
195
- # @flask_app.route(rule=<callback_endpoint>, # JUSBR_CALLBACK_ENDPOINT: /iam/jusbr:callback
196
- # methods=["GET", "POST"])
197
- def service_callback() -> Response:
198
- """
199
- Entry point for the callback from JusBR on authentication operation.
200
-
201
- :return: the response containing the token, or *BAD REQUEST*
202
- """
203
- global _jusbr_registry
204
-
205
- # log the request
206
- if _logger:
207
- _logger.debug(msg=_log_init(request=request))
208
-
209
- # process the callback operation
210
- errors: list[str] = []
211
- token_data: tuple[str, str] = _service_callback(registry=_jusbr_registry,
212
- args=request.args,
213
- errors=errors,
214
- logger=_logger)
215
- result: Response
216
- if errors:
217
- result = jsonify({"errors": "; ".join(errors)})
218
- result.status_code = 400
219
- else:
220
- result = jsonify({
221
- "user_id": token_data[0],
222
- "access_token": token_data[1]})
223
-
224
- # log the response
225
- if _logger:
226
- _logger.debug(msg=f"Response {result}")
227
-
228
- return result
229
-
230
-
231
- # @flask_app.route(rule=<token_endpoint>, # JUSBR_TOKEN_ENDPOINT: /iam/jusbr:get-token
232
- # methods=["GET"])
233
- def service_token() -> Response:
234
- """
235
- Entry point for retrieving the JusBR token.
236
-
237
- :return: the response containing the token, or *UNAUTHORIZED*
238
- """
239
- global _jusbr_registry
240
-
241
- # log the request
242
- if _logger:
243
- _logger.debug(msg=_log_init(request=request))
244
-
245
- # retrieve the token
246
- errors: list[str] = []
247
- token: str = _service_token(registry=_jusbr_registry,
248
- args=request.args,
249
- errors=errors,
250
- logger=_logger)
251
- result: Response
252
- if token:
253
- result = jsonify({"token": token})
254
- else:
255
- result = Response("; ".join(errors))
256
- result.status_code = 401
257
-
258
- # log the response
259
- if _logger:
260
- _logger.debug(msg=f"Response {result}")
261
-
262
- return result
125
+ if token_endpoint:
126
+ flask_app.add_url_rule(rule=token_endpoint,
127
+ endpoint="jusbr-token",
128
+ view_func=service_token,
129
+ methods=["GET"])
263
130
 
264
131
 
265
132
  def jusbr_get_token(user_id: str,
@@ -1,17 +1,13 @@
1
1
  from cachetools import FIFOCache
2
2
  from datetime import datetime
3
- from flask import Flask, Response, redirect, request, jsonify
3
+ from flask import Flask
4
4
  from logging import Logger
5
5
  from pypomes_core import (
6
6
  APP_PREFIX, TZ_LOCAL, env_get_int, env_get_str
7
7
  )
8
8
  from typing import Any, Final
9
9
 
10
- from .common_pomes import (
11
- _service_login, _service_logout,
12
- _service_callback, _service_token,
13
- _get_user_data, _log_init
14
- )
10
+ from .common_pomes import _service_token, _get_user_data
15
11
 
16
12
  KEYCLOAK_CLIENT_ID: Final[str] = env_get_str(key=f"{APP_PREFIX}_KEYCLOAK_CLIENT_ID")
17
13
  KEYCLOAK_CLIENT_SECRET: Final[str] = env_get_str(key=f"{APP_PREFIX}_KEYCLOAK_CLIENT_SECRET")
@@ -60,7 +56,7 @@ KEYCLOAK_URL_AUTH_CALLBACK: Final[str] = env_get_str(key=f"{APP_PREFIX}_KEYCLOAK
60
56
  _keycloak_registry: dict[str, Any] = {}
61
57
 
62
58
  # dafault logger
63
- _logger: Logger | None = None
59
+ _keycloak_logger: Logger | None = None
64
60
 
65
61
 
66
62
  def keycloak_setup(flask_app: Flask,
@@ -95,11 +91,11 @@ def keycloak_setup(flask_app: Flask,
95
91
  :param callback_url: URL for Keycloak to callback on login
96
92
  :param logger: optional logger
97
93
  """
98
- global _keycloak_registry
94
+ from .iam_pomes import service_login, service_logout, service_callback, service_token
95
+ global _keycloak_logger, _keycloak_registry
99
96
 
100
97
  # establish the logger
101
- global _logger
102
- _logger = logger
98
+ _keycloak_logger = logger
103
99
 
104
100
  # configure the JusBR registry
105
101
  _keycloak_registry = {
@@ -136,136 +132,6 @@ def keycloak_setup(flask_app: Flask,
136
132
  methods=["POST"])
137
133
 
138
134
 
139
- # @flask_app.route(rule=<login_endpoint>, # KEYCLOAK_LOGIN_ENDPOINT: /iam/keycloak:login
140
- # methods=["GET"])
141
- def service_login() -> Response:
142
- """
143
- Entry point for the Keycloak login service.
144
-
145
- Redirect the request to the Keycloak authentication page, with the appropriate parameters.
146
-
147
- :return: the response from the redirect operation
148
- """
149
- global _keycloak_registry
150
-
151
- # log the request
152
- if _logger:
153
- _logger.debug(msg=_log_init(request=request))
154
-
155
- # obtain the redirect URL
156
- auth_url: str = _service_login(registry=_keycloak_registry,
157
- args=request.args,
158
- logger=_logger)
159
- # redirect the request
160
- result: Response = redirect(location=auth_url)
161
-
162
- # log the response
163
- if _logger:
164
- _logger.debug(msg=f"Response {result}")
165
-
166
- return result
167
-
168
-
169
- # @flask_app.route(rule=<login_endpoint>, # KEYCLOAK_LOGIN_ENDPOINT: /iam/keycloak:logout
170
- # methods=["GET"])
171
- def service_logout() -> Response:
172
- """
173
- Entry point for the Keycloak logout service.
174
-
175
- Remove all data associating the user with Keycloak from the registry.
176
-
177
- :return: response *OK*
178
- """
179
- global _keycloak_registry
180
-
181
- # log the request
182
- if _logger:
183
- _logger.debug(msg=_log_init(request=request))
184
-
185
- # logout the user
186
- _service_logout(registry=_keycloak_registry,
187
- args=request.args,
188
- logger=_logger)
189
-
190
- result: Response = Response(status=200)
191
-
192
- # log the response
193
- if _logger:
194
- _logger.debug(msg=f"Response {result}")
195
-
196
- return result
197
-
198
-
199
- # @flask_app.route(rule=<callback_endpoint>, # KEYCLOAK_CALLBACK_ENDPOINT: /iam/keycloak:callback
200
- # methods=["POST"])
201
- def service_callback() -> Response:
202
- """
203
- Entry point for the callback from Keycloak on authentication operation.
204
-
205
- :return: the response containing the token, or *NOT AUTHORIZED*
206
- """
207
- global _keycloak_registry
208
-
209
- # log the request
210
- if _logger:
211
- _logger.debug(msg=_log_init(request=request))
212
-
213
- # process the callback operation
214
- errors: list[str] = []
215
- token_data: tuple[str, str] = _service_callback(registry=_keycloak_registry,
216
- args=request.args,
217
- errors=errors,
218
- logger=_logger)
219
- result: Response
220
- if errors:
221
- result = jsonify({"errors": "; ".join(errors)})
222
- result.status_code = 400
223
- else:
224
- result = jsonify({
225
- "user_id": token_data[0],
226
- "access_token": token_data[1]})
227
-
228
- # log the response
229
- if _logger:
230
- _logger.debug(msg=f"Response {result}")
231
-
232
- return result
233
-
234
-
235
- # @flask_app.route(rule=<token_endpoint>, # JUSBR_TOKEN_ENDPOINT: /iam/jusbr:get-token
236
- # methods=["GET"])
237
- def service_token() -> Response:
238
- """
239
- Entry point for retrieving the Keycloak token.
240
-
241
- :return: the response containing the token, or *UNAUTHORIZED*
242
- """
243
- global _keycloak_registry
244
-
245
- # log the request
246
- if _logger:
247
- _logger.debug(msg=_log_init(request=request))
248
-
249
- # retrieve the token
250
- errors: list[str] = []
251
- token: str = _service_token(registry=_keycloak_registry,
252
- args=request.args,
253
- errors=errors,
254
- logger=_logger)
255
- result: Response
256
- if token:
257
- result = jsonify({"token": token})
258
- else:
259
- result = Response("; ".join(errors))
260
- result.status_code = 401
261
-
262
- # log the response
263
- if _logger:
264
- _logger.debug(msg=f"Response {result}")
265
-
266
- return result
267
-
268
-
269
135
  def keycloak_get_token(user_id: str,
270
136
  errors: list[str] = None,
271
137
  logger: Logger = None) -> str:
File without changes
File without changes
File without changes