simpserver 0.2.1__tar.gz → 0.2.2.post1__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.
Files changed (21) hide show
  1. {simpserver-0.2.1 → simpserver-0.2.2.post1}/PKG-INFO +1 -1
  2. {simpserver-0.2.1 → simpserver-0.2.2.post1}/pyproject.toml +1 -1
  3. {simpserver-0.2.1 → simpserver-0.2.2.post1}/simpserver/exceptions.py +6 -0
  4. {simpserver-0.2.1 → simpserver-0.2.2.post1}/simpserver/router.py +24 -3
  5. {simpserver-0.2.1 → simpserver-0.2.2.post1}/simpserver.egg-info/PKG-INFO +1 -1
  6. {simpserver-0.2.1 → simpserver-0.2.2.post1}/tests/routes/login.py +4 -7
  7. {simpserver-0.2.1 → simpserver-0.2.2.post1}/tests/test.py +2 -1
  8. {simpserver-0.2.1 → simpserver-0.2.2.post1}/LICENSE +0 -0
  9. {simpserver-0.2.1 → simpserver-0.2.2.post1}/README.md +0 -0
  10. {simpserver-0.2.1 → simpserver-0.2.2.post1}/setup.cfg +0 -0
  11. {simpserver-0.2.1 → simpserver-0.2.2.post1}/simpserver/config.py +0 -0
  12. {simpserver-0.2.1 → simpserver-0.2.2.post1}/simpserver/database.py +0 -0
  13. {simpserver-0.2.1 → simpserver-0.2.2.post1}/simpserver/handler.py +0 -0
  14. {simpserver-0.2.1 → simpserver-0.2.2.post1}/simpserver.egg-info/SOURCES.txt +0 -0
  15. {simpserver-0.2.1 → simpserver-0.2.2.post1}/simpserver.egg-info/dependency_links.txt +0 -0
  16. {simpserver-0.2.1 → simpserver-0.2.2.post1}/simpserver.egg-info/requires.txt +0 -0
  17. {simpserver-0.2.1 → simpserver-0.2.2.post1}/simpserver.egg-info/top_level.txt +0 -0
  18. {simpserver-0.2.1 → simpserver-0.2.2.post1}/tests/config.py +0 -0
  19. {simpserver-0.2.1 → simpserver-0.2.2.post1}/tests/models.py +0 -0
  20. {simpserver-0.2.1 → simpserver-0.2.2.post1}/tests/routes/__init__.py +0 -0
  21. {simpserver-0.2.1 → simpserver-0.2.2.post1}/tests/routes/teste1.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: simpserver
3
- Version: 0.2.1
3
+ Version: 0.2.2.post1
4
4
  Summary: A simple solution to create servers http(s).
5
5
  Author-email: Manel <manelzaum@icloud.com>
6
6
  License-Expression: MIT
@@ -7,7 +7,7 @@ include = ["simpserver*", "tests*"]
7
7
 
8
8
  [project]
9
9
  name = "simpserver"
10
- version = "0.2.1"
10
+ version = "0.2.2.post1"
11
11
  dependencies = ["mariadb"]
12
12
  authors = [{ name="Manel", email="manelzaum@icloud.com" }]
13
13
  description = "A simple solution to create servers http(s)."
@@ -93,3 +93,9 @@ class AlreadyExistsInDatabaseError(APIError):
93
93
  def __init__(self, table_name: str) -> None:
94
94
  super().__init__(HTTPStatus.CONFLICT,
95
95
  {"message": f"Primary key already exists on {table_name}"})
96
+
97
+ class UnauthorizedError(APIError):
98
+ """When the acion needs a specific role of something like"""
99
+
100
+ def __init__(self) -> None:
101
+ super().__init__(HTTPStatus.UNAUTHORIZED, {"message": "Não autorizado."})
@@ -188,18 +188,39 @@ def ensure_exists_in_db_by_body(table: str, pk_name: str, body_key_pk_value: str
188
188
 
189
189
  return decorator
190
190
 
191
- def middleware():
191
+ def get_safe_kwargs(func: Callable, kwargs: dict) -> dict:
192
+ sig = inspect.signature(func)
193
+ params = sig.parameters
194
+
195
+ if any(
196
+ p.kind == inspect.Parameter.VAR_KEYWORD
197
+ for p in params.values()
198
+ ):
199
+ return kwargs
200
+
201
+ safe_kwargs = {key: value for key, value in kwargs.items() if key in sig.parameters.keys()}
202
+
203
+ return safe_kwargs
204
+
205
+ def middleware(*middleware_args, **middleware_kwargs):
192
206
  def decorator(func: RouteCallback):
193
207
  def wrapper(**kwargs) -> RouteCallbackReturn:
194
208
  from .config import user_configs
195
209
 
196
210
  login_check = user_configs.get("login_check_func", None)
197
211
 
198
- if not login_check: raise NotImplementedError
212
+ kwargs["user_info"] = safe_run(user_configs["get_user_info_func"], kwargs)
199
213
 
200
- if not login_check(**kwargs):
214
+ if not kwargs["user_info"]:
201
215
  raise InvalidTokenError()
202
216
 
217
+ if not login_check:
218
+ raise NotImplementedError
219
+
220
+ safe_kwargs = get_safe_kwargs(login_check, kwargs | middleware_kwargs)
221
+ if not login_check(*middleware_args, **safe_kwargs):
222
+ raise UnauthorizedError()
223
+
203
224
  return safe_run(func, kwargs)
204
225
 
205
226
  return wrapper
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: simpserver
3
- Version: 0.2.1
3
+ Version: 0.2.2.post1
4
4
  Summary: A simple solution to create servers http(s).
5
5
  Author-email: Manel <manelzaum@icloud.com>
6
6
  License-Expression: MIT
@@ -21,18 +21,15 @@ def login(cur: Cursor, body: dict) -> dict:
21
21
 
22
22
  if not row: raise CredentialsError()
23
23
 
24
- token = "".join(random.choices(token_character, k=2))
24
+ token = "".join(random.choices(token_characters, k=2))
25
25
 
26
26
  logins[row[0]] = token
27
27
 
28
28
  return {"token": token}
29
29
 
30
30
 
31
- @ensure_body_keys({"token": str})
32
- def login_check(**kwargs) -> bool:
33
- body = kwargs["body"]
34
-
35
- return body["token"] in logins.values()
31
+ def login_check(user_info: dict, roles: list = []) -> bool:
32
+ return not roles or user_info["role"] in roles
36
33
 
37
34
 
38
35
  def get_user_info(cur: Cursor, body: dict) -> dict | None:
@@ -42,6 +39,6 @@ def get_user_info(cur: Cursor, body: dict) -> dict | None:
42
39
 
43
40
  for id, token in logins.items():
44
41
  if passed_token == token:
45
- return UserModel.get_by_id(cur, id)
42
+ return UserModel.get_by_id(cur, id) | { "role": "User" }
46
43
 
47
44
  return None
@@ -2,7 +2,7 @@ from sys import argv
2
2
  from http import HTTPMethod
3
3
 
4
4
  from simpserver.handler import serve_api
5
- from simpserver.router import route
5
+ from simpserver.router import route, middleware
6
6
  import routes
7
7
 
8
8
  """
@@ -18,6 +18,7 @@ TODO:
18
18
  """
19
19
 
20
20
  @route("/test/<name:str>", HTTPMethod.GET)
21
+ @middleware(roles="User")
21
22
  def test(path_params: dict) -> dict:
22
23
  return path_params
23
24
 
File without changes
File without changes
File without changes