tina4-python 0.2.22__tar.gz → 0.2.24__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 (46) hide show
  1. {tina4_python-0.2.22 → tina4_python-0.2.24}/PKG-INFO +1 -1
  2. {tina4_python-0.2.22 → tina4_python-0.2.24}/pyproject.toml +1 -1
  3. tina4_python-0.2.24/tina4_python/.env +6 -0
  4. tina4_python-0.2.24/tina4_python/MiddleWare.py +71 -0
  5. tina4_python-0.2.24/tina4_python/Request.py +18 -0
  6. tina4_python-0.2.24/tina4_python/Response.py +94 -0
  7. {tina4_python-0.2.22 → tina4_python-0.2.24}/tina4_python/Router.py +83 -28
  8. {tina4_python-0.2.22 → tina4_python-0.2.24}/tina4_python/Webserver.py +1 -1
  9. tina4_python-0.2.24/tina4_python/secrets/domain.cert +21 -0
  10. tina4_python-0.2.24/tina4_python/secrets/private.key +30 -0
  11. tina4_python-0.2.24/tina4_python/secrets/public.key +9 -0
  12. tina4_python-0.2.22/tina4_python/Request.py +0 -25
  13. tina4_python-0.2.22/tina4_python/Response.py +0 -77
  14. {tina4_python-0.2.22 → tina4_python-0.2.24}/README.md +0 -0
  15. {tina4_python-0.2.22 → tina4_python-0.2.24}/tina4_python/Auth.py +0 -0
  16. {tina4_python-0.2.22 → tina4_python-0.2.24}/tina4_python/Constant.py +0 -0
  17. {tina4_python-0.2.22 → tina4_python-0.2.24}/tina4_python/Database.py +0 -0
  18. {tina4_python-0.2.22 → tina4_python-0.2.24}/tina4_python/DatabaseResult.py +0 -0
  19. {tina4_python-0.2.22 → tina4_python-0.2.24}/tina4_python/Debug.py +0 -0
  20. {tina4_python-0.2.22 → tina4_python-0.2.24}/tina4_python/Env.py +0 -0
  21. {tina4_python-0.2.22 → tina4_python-0.2.24}/tina4_python/Localization.py +0 -0
  22. {tina4_python-0.2.22 → tina4_python-0.2.24}/tina4_python/Messages.py +0 -0
  23. {tina4_python-0.2.22 → tina4_python-0.2.24}/tina4_python/Migration.py +0 -0
  24. {tina4_python-0.2.22 → tina4_python-0.2.24}/tina4_python/Session.py +0 -0
  25. {tina4_python-0.2.22 → tina4_python-0.2.24}/tina4_python/ShellColors.py +0 -0
  26. {tina4_python-0.2.22 → tina4_python-0.2.24}/tina4_python/Swagger.py +0 -0
  27. {tina4_python-0.2.22 → tina4_python-0.2.24}/tina4_python/Template.py +0 -0
  28. {tina4_python-0.2.22 → tina4_python-0.2.24}/tina4_python/__init__.py +0 -0
  29. {tina4_python-0.2.22 → tina4_python-0.2.24}/tina4_python/messages.pot +0 -0
  30. {tina4_python-0.2.22 → tina4_python-0.2.24}/tina4_python/public/css/readme.md +0 -0
  31. {tina4_python-0.2.22 → tina4_python-0.2.24}/tina4_python/public/favicon.ico +0 -0
  32. {tina4_python-0.2.22 → tina4_python-0.2.24}/tina4_python/public/images/403.png +0 -0
  33. {tina4_python-0.2.22 → tina4_python-0.2.24}/tina4_python/public/images/404.png +0 -0
  34. {tina4_python-0.2.22 → tina4_python-0.2.24}/tina4_python/public/images/logo.png +0 -0
  35. {tina4_python-0.2.22 → tina4_python-0.2.24}/tina4_python/public/images/readme.md +0 -0
  36. {tina4_python-0.2.22 → tina4_python-0.2.24}/tina4_python/public/js/readme.md +0 -0
  37. {tina4_python-0.2.22 → tina4_python-0.2.24}/tina4_python/public/js/tina4helper.js +0 -0
  38. {tina4_python-0.2.22 → tina4_python-0.2.24}/tina4_python/public/swagger/index.html +0 -0
  39. {tina4_python-0.2.22 → tina4_python-0.2.24}/tina4_python/public/swagger/oauth2-redirect.html +0 -0
  40. {tina4_python-0.2.22 → tina4_python-0.2.24}/tina4_python/templates/errors/403.twig +0 -0
  41. {tina4_python-0.2.22 → tina4_python-0.2.24}/tina4_python/templates/errors/404.twig +0 -0
  42. {tina4_python-0.2.22 → tina4_python-0.2.24}/tina4_python/templates/readme.md +0 -0
  43. {tina4_python-0.2.22 → tina4_python-0.2.24}/tina4_python/translations/en/LC_MESSAGES/messages.mo +0 -0
  44. {tina4_python-0.2.22 → tina4_python-0.2.24}/tina4_python/translations/en/LC_MESSAGES/messages.po +0 -0
  45. {tina4_python-0.2.22 → tina4_python-0.2.24}/tina4_python/translations/fr/LC_MESSAGES/messages.mo +0 -0
  46. {tina4_python-0.2.22 → tina4_python-0.2.24}/tina4_python/translations/fr/LC_MESSAGES/messages.po +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tina4-python
3
- Version: 0.2.22
3
+ Version: 0.2.24
4
4
  Summary: Tina4Python - This is not another framework for Python
5
5
  Author: Andre van Zuydam
6
6
  Author-email: andrevanzuydam@gmail.com
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "tina4-python"
3
- version = "0.2.22"
3
+ version = "0.2.24"
4
4
  description = "Tina4Python - This is not another framework for Python"
5
5
  authors = ["Andre van Zuydam <andrevanzuydam@gmail.com>"]
6
6
  readme = "README.md"
@@ -0,0 +1,6 @@
1
+ # Project Settings
2
+ PROJECT_NAME="My Project"
3
+ VERSION=1.0.0
4
+ TINA4_LANGUAGE=en
5
+ TINA4_SECRET=ABCDEF
6
+ TINA4_DEBUG_LEVEL=[TINA4_LOG_ALL]
@@ -0,0 +1,71 @@
1
+
2
+
3
+ class MiddleWare:
4
+ def __init__(self, middleware_class):
5
+ """
6
+
7
+ :param middleware_class:
8
+ """
9
+ self.before_methods = []
10
+ self.after_methods = []
11
+ self.any_methods = []
12
+ self.middleware_class = middleware_class
13
+
14
+ self.methods_list = [method for method in vars(middleware_class) if callable(
15
+ getattr(middleware_class, method)) and not method.startswith("__")]
16
+
17
+ for method in self.methods_list:
18
+ if method.startswith("before"):
19
+ self.before_methods.append(method)
20
+ elif method.startswith("after"):
21
+ self.after_methods.append(method)
22
+ else:
23
+ self.any_methods.append(method)
24
+
25
+ def call_before_methods(self, request, response):
26
+ """
27
+ Call before methods
28
+ :param request:
29
+ :param response:
30
+ :return:
31
+ """
32
+ for method in self.before_methods:
33
+ method = getattr(self.middleware_class, method)
34
+ request, response = method(request, response)
35
+ return request, response
36
+
37
+ def call_after_methods(self, request, response):
38
+ """
39
+ Call after methods
40
+ :param request:
41
+ :param response:
42
+ :return:
43
+ """
44
+ for method in self.after_methods:
45
+ method = getattr(self.middleware_class, method)
46
+ request, response = method(request, response)
47
+ return request, response
48
+
49
+ def call_any_methods(self, request, response):
50
+ """
51
+ Call any methods
52
+ :param request:
53
+ :param response:
54
+ :return:
55
+ """
56
+ for method in self.any_methods:
57
+ method = getattr(self.middleware_class, method)
58
+ request, response = method(request, response)
59
+ return request, response
60
+
61
+ def call_direct_method(self, request, response, method_name):
62
+ """
63
+ Call direct methods
64
+ :param request:
65
+ :param response:
66
+ :param method_name:
67
+ :return:
68
+ """
69
+ method = getattr(self.middleware_class, method_name)
70
+ request, response = method(request, response)
71
+ return request, response
@@ -0,0 +1,18 @@
1
+ #
2
+ # Tina4 - This is not a 4ramework.
3
+ # Copy-right 2007 - current Tina4
4
+ # License: MIT https://opensource.org/licenses/MIT
5
+ #
6
+ # flake8: noqa: E501
7
+ import inspect
8
+
9
+ request = None
10
+ body = None
11
+ params = {}
12
+ headers = {}
13
+ cookies = {}
14
+ url = None
15
+ session = None
16
+ files = {}
17
+ raw_data = None
18
+ raw_content = None
@@ -0,0 +1,94 @@
1
+ #
2
+ # Tina4 - This is not a 4ramework.
3
+ # Copy-right 2007 - current Tina4
4
+ # License: MIT https://opensource.org/licenses/MIT
5
+ #
6
+ # flake8: noqa: E501
7
+ import json
8
+ import inspect
9
+ from types import ModuleType
10
+ from tina4_python import Constant
11
+ from tina4_python import DatabaseResult
12
+ from tina4_python.Debug import Debug
13
+
14
+ headers = {}
15
+ content = ""
16
+ http_code = Constant.HTTP_OK
17
+ content_type = Constant.TEXT_HTML
18
+
19
+ class Response:
20
+ def __init__(self, content_in=None, http_code_in=None, content_type_in=None,
21
+ headers_in=None):
22
+ global headers
23
+ global content
24
+ global http_code
25
+ global content_type
26
+
27
+ if content is not None:
28
+ content_in = content + content_in
29
+
30
+ if (not isinstance(content_in, bool) and not isinstance(content_in, object)
31
+ and not isinstance(content_in,bytes)
32
+ and not isinstance(content_in, str)
33
+ and not isinstance(content_in, list) and inspect.isclass(type(content_in))):
34
+ content_in = dict(content_in)
35
+
36
+ # check if database result
37
+ if type(content_in) is DatabaseResult.DatabaseResult:
38
+ content_type = Constant.APPLICATION_JSON
39
+ content_in = content_in.to_json()
40
+
41
+ # convert the dictionary or list into JSON
42
+ if not isinstance(content_in, bool) and type(content_in) is dict or type(content_in) is list:
43
+ content_in = json.dumps(content_in)
44
+ content_type = Constant.APPLICATION_JSON
45
+
46
+ if isinstance(content_in, bool):
47
+ if content_in:
48
+ content_in = "True"
49
+ else:
50
+ content_in = "False"
51
+
52
+ if isinstance(content_in, ModuleType):
53
+ content_in = json.dumps({"error": "Cannot decode object of type " + str(type(content_in))})
54
+ content_type = Constant.APPLICATION_JSON
55
+
56
+ self.headers = headers_in if headers_in is not None else headers
57
+ self.content = content_in if content_in is not None else content
58
+ self.http_code = http_code_in if http_code_in is not None else http_code
59
+ self.content_type = content_type_in if content_type_in is not None else content_type
60
+ headers = self.headers
61
+ http_code = self.http_code
62
+ content_type = self.content_type
63
+ content = self.content
64
+
65
+ @staticmethod
66
+ def redirect(redirect_url):
67
+ """
68
+ Redirects a request to redirect_url
69
+ :param redirect_url:
70
+ :return:
71
+ """
72
+ global headers
73
+ global content
74
+ global http_code
75
+ global content_type
76
+ headers = {}
77
+ http_code = Constant.HTTP_REDIRECT
78
+ headers["Location"] = redirect_url
79
+ content = ""
80
+ content_type = Constant.TEXT_HTML
81
+ return Response("", http_code, content_type, headers)
82
+
83
+ @staticmethod
84
+ def add_header(key, value):
85
+ """
86
+ Adds a header for the response
87
+ :param key:
88
+ :param value:
89
+ :return:
90
+ """
91
+ global headers
92
+ headers[key] = value
93
+
94
+
@@ -13,9 +13,10 @@ import io
13
13
  import tina4_python
14
14
  from tina4_python import Constant
15
15
  from tina4_python.Debug import Debug
16
+ from tina4_python import Response
16
17
  from tina4_python import Request
17
- from tina4_python.Response import Response
18
18
  from tina4_python.Template import Template
19
+ from tina4_python.MiddleWare import MiddleWare
19
20
 
20
21
 
21
22
  class Router:
@@ -59,18 +60,27 @@ class Router:
59
60
  # Renders the URL and returns the content
60
61
  @staticmethod
61
62
  async def get_result(url, method, request, headers, session):
63
+ global Request
64
+ global Response
65
+
66
+ Response.headers = {}
67
+ Response.content = ""
68
+ Response.http_code = Constant.HTTP_OK
69
+ result = None
70
+
62
71
  Debug("Root Path " + tina4_python.root_path + " " + url, method, Constant.TINA4_LOG_DEBUG)
63
72
  tina4_python.tina4_current_request["url"] = url
64
73
  tina4_python.tina4_current_request["headers"] = headers
65
74
 
66
75
  # we can add other methods later but right now we validate posts
67
- if method in [Constant.TINA4_GET, Constant.TINA4_POST, Constant.TINA4_PUT, Constant.TINA4_PATCH, Constant.TINA4_DELETE]:
76
+ if method in [Constant.TINA4_GET, Constant.TINA4_POST, Constant.TINA4_PUT, Constant.TINA4_PATCH,
77
+ Constant.TINA4_DELETE]:
68
78
  content_type = "text/html"
69
79
  if "content-type" in headers:
70
80
  content_type = headers["content-type"]
71
81
 
72
82
  if content_type == "application/json":
73
- content = {"error": "403 - Forbidden", "data": {"server": {"url": url}}};
83
+ content = {"error": "403 - Forbidden", "data": {"server": {"url": url}}}
74
84
  else:
75
85
  content = Template.render_twig_template(
76
86
  "errors/403.twig", {"server": {"url": url}})
@@ -93,14 +103,11 @@ class Router:
93
103
  validated = True
94
104
 
95
105
  if not validated and method != Constant.TINA4_GET:
96
- return Response(content, Constant.HTTP_FORBIDDEN, Constant.TEXT_HTML)
106
+ return Response.Response(content, Constant.HTTP_FORBIDDEN, Constant.TEXT_HTML)
97
107
  else:
98
108
  if request["body"] is not None and "formToken" in request["body"]:
99
109
  del request["body"]["formToken"]
100
110
 
101
- # default response
102
- result = Response("", Constant.HTTP_NOT_FOUND, Constant.TEXT_HTML)
103
-
104
111
  # split URL and extract query string
105
112
  url_parts = url.split('?')
106
113
  url = url_parts[0]
@@ -111,7 +118,7 @@ class Router:
111
118
  if os.path.isfile(static_file):
112
119
  mime_type = mimetypes.guess_type(url)[0]
113
120
  with open(static_file, 'rb') as file:
114
- return Response(file.read(), Constant.HTTP_OK, mime_type)
121
+ return Response.Response(file.read(), Constant.HTTP_OK, mime_type)
115
122
 
116
123
  old_stdout = None
117
124
  for route in tina4_python.tina4_routes.values():
@@ -119,15 +126,16 @@ class Router:
119
126
  continue
120
127
  Debug("Matching route " + route['route'] + " to " + url, Constant.TINA4_LOG_DEBUG)
121
128
  if Router.match(url, route['route']):
122
- if "swagger" in route and route["swagger"] is not None and "secure" in route["swagger"]:
129
+ if "swagger" in route and route["swagger"] is not None and "secure" in route["swagger"]:
123
130
  if route["swagger"]["secure"] and not validated:
124
- return Response(content, Constant.HTTP_FORBIDDEN, Constant.TEXT_HTML)
131
+ return Response.Response(content, Constant.HTTP_FORBIDDEN, Constant.TEXT_HTML)
125
132
 
126
133
  router_response = route["callback"]
127
134
 
128
135
  # Add the inline variables & construct a Request variable
129
136
  request["params"].update(Router.variables)
130
137
 
138
+
131
139
  Request.request = request # Add the request object
132
140
  Request.headers = headers # Add the headers
133
141
  Request.params = request["params"]
@@ -140,31 +148,53 @@ class Router:
140
148
 
141
149
  tina4_python.tina4_current_request = Request
142
150
 
143
- old_stdout = sys.stdout # Memorize the default stdout stream
151
+ old_stdout = sys.stdout # Memorize the default stdout stream
144
152
  sys.stdout = buffer = io.StringIO()
145
- result = await router_response(request=Request, response=Response)
146
153
 
147
- if "cache" in route and route["cache"] is not None:
148
- if not route["cache"]["cached"]:
149
- result.headers["Cache-Control"] = "max-age=1, must-revalidate"
150
- result.headers["Pragma"] = "no-cache"
151
- result.headers["Clear-Site-Data"] = "cache"
154
+ if "middleware" in route:
155
+ middleware_runner = MiddleWare(route["middleware"]["class"])
156
+
157
+ if "methods" in route["middleware"]:
158
+ for method in route["middleware"]["methods"]:
159
+ Request, Response = middleware_runner.call_direct_method(Request, Response, method)
152
160
  else:
153
- result.headers["Cache-Control"] = "max-age="+str(route["cache"]["max_age"])+", must-revalidate"
154
- result.headers["Pragma"] = "cache"
155
- else:
156
- result.headers["Cache-Control"] = "max-age=-1, must-revalidate"
157
- result.headers["Pragma"] = "cache"
161
+ Request, Response = middleware_runner.call_before_methods(Request, Response)
162
+ Request, Response = middleware_runner.call_any_methods(Request, Response)
163
+
164
+ result = await router_response(request=Request, response=Response.Response)
158
165
 
166
+ if "middleware" in route:
167
+ middleware_runner = MiddleWare(route["middleware"]["class"])
168
+
169
+ if "methods" in route["middleware"]:
170
+ for method in route["middleware"]["methods"]:
171
+ Request, result = middleware_runner.call_direct_method(Request, result, method)
172
+ else:
173
+ Request, result = middleware_runner.call_after_methods(Request, result)
174
+ Request, result = middleware_runner.call_any_methods(Request, result)
175
+
176
+ if result is not None:
177
+ if "cache" in route and route["cache"] is not None:
178
+ if not route["cache"]["cached"]:
179
+ result.headers["Cache-Control"] = "max-age=1, must-revalidate"
180
+ result.headers["Pragma"] = "no-cache"
181
+ result.headers["Clear-Site-Data"] = "cache"
182
+ else:
183
+ result.headers["Cache-Control"] = "max-age=" + str(
184
+ route["cache"]["max_age"]) + ", must-revalidate"
185
+ result.headers["Pragma"] = "cache"
186
+ else:
187
+ result.headers["Cache-Control"] = "max-age=-1, must-revalidate"
188
+ result.headers["Pragma"] = "cache"
159
189
 
160
190
  break
161
191
 
162
192
  if result is None:
163
193
  sys.stdout = old_stdout
164
194
  try:
165
- return Response(json.loads(buffer.getvalue()), Constant.HTTP_OK, Constant.APPLICATION_JSON)
195
+ return Response.Response(json.loads(buffer.getvalue()), Constant.HTTP_OK, Constant.APPLICATION_JSON)
166
196
  except:
167
- return Response(buffer.getvalue(), Constant.HTTP_OK, Constant.TEXT_HTML)
197
+ return Response.Response(buffer.getvalue(), Constant.HTTP_OK, Constant.TEXT_HTML)
168
198
 
169
199
  # If no route is matched, serve 404
170
200
  if result.http_code == Constant.HTTP_NOT_FOUND:
@@ -184,12 +214,12 @@ class Router:
184
214
  result.headers["Pragma"] = "no-cache"
185
215
  content = Template.render_twig_template(twig_file, {"request": tina4_python.tina4_current_request})
186
216
  if content != "":
187
- return Response(content, Constant.HTTP_OK, Constant.TEXT_HTML, result.headers)
217
+ return Response.Response(content, Constant.HTTP_OK, Constant.TEXT_HTML, result.headers)
188
218
 
189
219
  if result.http_code == Constant.HTTP_NOT_FOUND:
190
220
  content = Template.render_twig_template(
191
221
  "errors/404.twig", {"server": {"url": url}})
192
- return Response(content, Constant.HTTP_NOT_FOUND, Constant.TEXT_HTML)
222
+ return Response.Response(content, Constant.HTTP_NOT_FOUND, Constant.TEXT_HTML)
193
223
 
194
224
  return result
195
225
 
@@ -209,7 +239,8 @@ class Router:
209
239
  def add(method, route, callback):
210
240
  Debug("Adding a route: " + route, Constant.TINA4_LOG_DEBUG)
211
241
  if not callback in tina4_python.tina4_routes:
212
- tina4_python.tina4_routes[callback] = {"route": route, "callback": callback, "method": method, "swagger": None, "cached": False}
242
+ tina4_python.tina4_routes[callback] = {"route": route, "callback": callback, "method": method,
243
+ "swagger": None, "cached": False}
213
244
  else:
214
245
  tina4_python.tina4_routes[callback]["route"] = route
215
246
  tina4_python.tina4_routes[callback]["callback"] = callback
@@ -227,6 +258,7 @@ def get(path: str):
227
258
  :param arguments:
228
259
  :return:
229
260
  """
261
+
230
262
  def actual_get(callback):
231
263
  route_paths = path.split('|')
232
264
  for route_path in route_paths:
@@ -242,6 +274,7 @@ def post(path):
242
274
  :param path:
243
275
  :return:
244
276
  """
277
+
245
278
  def actual_post(callback):
246
279
  route_paths = path.split('|')
247
280
  for route_path in route_paths:
@@ -257,6 +290,7 @@ def put(path):
257
290
  :param path:
258
291
  :return:
259
292
  """
293
+
260
294
  def actual_put(callback):
261
295
  route_paths = path.split('|')
262
296
  for route_path in route_paths:
@@ -272,6 +306,7 @@ def patch(path):
272
306
  :param path:
273
307
  :return:
274
308
  """
309
+
275
310
  def actual_patch(callback):
276
311
  route_paths = path.split('|')
277
312
  for route_path in route_paths:
@@ -287,6 +322,7 @@ def delete(path):
287
322
  :param path:
288
323
  :return:
289
324
  """
325
+
290
326
  def actual_delete(callback):
291
327
  route_paths = path.split('|')
292
328
  for route_path in route_paths:
@@ -295,6 +331,7 @@ def delete(path):
295
331
 
296
332
  return actual_delete
297
333
 
334
+
298
335
  def cached(is_cached, max_age=60):
299
336
  """
300
337
  Sets whether the route is cached or not
@@ -302,10 +339,28 @@ def cached(is_cached, max_age=60):
302
339
  :param max_age:
303
340
  :return:
304
341
  """
342
+
305
343
  def actual_cached(callback):
306
344
  if callback not in tina4_python.tina4_routes:
307
345
  tina4_python.tina4_routes[callback] = {}
308
346
  tina4_python.tina4_routes[callback]["cache"] = {"cached": is_cached, "max_age": max_age}
309
347
  return callback
310
348
 
311
- return actual_cached
349
+ return actual_cached
350
+
351
+
352
+ def middleware(middleware, specific_methods=[]):
353
+ """
354
+ Sets middleware for the route and methods that need to be called
355
+ :param middleware:
356
+ :param specific_methods:
357
+ :return:
358
+ """
359
+
360
+ def actual_middleware(callback):
361
+ if callback not in tina4_python.tina4_routes:
362
+ tina4_python.tina4_routes[callback] = {}
363
+ tina4_python.tina4_routes[callback]["middleware"] = {"class": middleware, "methods": specific_methods}
364
+ return callback
365
+
366
+ return actual_middleware
@@ -125,7 +125,7 @@ class Webserver:
125
125
  "Origin, X-Requested-With, Content-Type, Accept, Authorization", headers)
126
126
  self.send_header("Access-Control-Allow-Credentials", "True", headers)
127
127
  self.send_header("Content-Type", response.content_type, headers)
128
- self.send_header("Content-Length", str(len(response.content)), headers)
128
+ # self.send_header("Content-Length", str(len(response.content)), headers)
129
129
  self.send_header("Connection", "Keep-Alive", headers)
130
130
  self.send_header("Keep-Alive", "timeout=5, max=30", headers)
131
131
 
@@ -0,0 +1,21 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDYDCCAkigAwIBAgIUJjBSwd6Q0OCzupqeXqQ7hO8tFNYwDQYJKoZIhvcNAQEL
3
+ BQAwXDELMAkGA1UEBhMCWkExFTATBgNVBAgMDFdFU1RFUk4gQ0FQRTESMBAGA1UE
4
+ BwwJQ0FQRSBUT1dOMQ4wDAYDVQQKDAVUaW5hNDESMBAGA1UEAwwJbG9jYWxob3N0
5
+ MCAXDTI0MDcyNzA4MjQxNVoYDzIyOTgwNTExMDgyNDE1WjBcMQswCQYDVQQGEwJa
6
+ QTEVMBMGA1UECAwMV0VTVEVSTiBDQVBFMRIwEAYDVQQHDAlDQVBFIFRPV04xDjAM
7
+ BgNVBAoMBVRpbmE0MRIwEAYDVQQDDAlsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEB
8
+ AQUAA4IBDwAwggEKAoIBAQDto8HrQp5L2dFwgutTfct8BxRxfQ+9O4kHyWzhzeO4
9
+ WvLeDqyAA46HsPcb8Ku6hW+SWht9REToALr4hKXCFxUo6KP9KBNkrA0fZsjQM5SP
10
+ Cc197WAL3AG3XpzqN13bOiphVeqLSqAPCZEitd6YQ8IdBHgNX/+JrC8t7KFBzyVx
11
+ nCnTfO5ixdaeKQZhFMcIFrxelm1gBZ0ClgmcCdkIveIMNWpo1a61fiU33Bm5717m
12
+ jy4ncgoL8Q6Vy9KtidmdmXIYbkcf6uEYXvGkyjODUzvF3tbzvMIoMJts0XD52ZQh
13
+ vHq9qaQlB4T69IVkdvS8hCYftPcympOjzpMrojzxQhJZAgMBAAGjGDAWMBQGA1Ud
14
+ EQQNMAuCCWxvY2FsaG9zdDANBgkqhkiG9w0BAQsFAAOCAQEAuaVKMhmsgPso9Vrm
15
+ 4emZscFanrzV7W7pXbFxO1wK/XxWQRrxRS40e5SBeDUYJmoVcC9CojbtYSZ0vav2
16
+ CHENA3LPPLi703Z5fe8TxiU64PssJe6IyZ7FveaTiCQ4TdsPPEsq+hoMpXykj/GL
17
+ 7holeO6xY2KvrKgEBXOPuniTvPQLJKalfmiHNBg2pEkJeNly9mK/jQQ1kYFz1FaK
18
+ DgNt6DWlTitsx4s85ryKcpYR3jljacPpuPOWiAlNw47jOefTFhBFR9oXxxvAEPRC
19
+ xnc1hXhxsnOzcFuNDAxSa3uW2bZpcEeoJxscjNUqeu/Lk1tFQWLsliJuqKxMBRcD
20
+ qqZ75Q==
21
+ -----END CERTIFICATE-----
@@ -0,0 +1,30 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ Proc-Type: 4,ENCRYPTED
3
+ DEK-Info: AES-256-CBC,C9FC3C8CF276DF95D130298E7F6844AB
4
+
5
+ 9aa638h4jOTIypRhQLDEzB7MTAs9AupUFYttF8T+eJ32EeNB+0FQNfD8r6CEZeMf
6
+ vp64suhWxlJhHRnpKogg9K8ioig36Fy+0Ung/va0ysozb1LZ2ct2QHcCIsyJypzC
7
+ wPe+iEx8GR0zCL88fU//xIlb/SAxAEnFYFW44IpHQMjzZ2PJ7cJswlA80l4Ualc4
8
+ RwTz0ZmEGWUE6CxoSCck26xDn57yH+pm76D98AS78TwgEBKbK8VtC12+Xp4LvP/H
9
+ lgDrcTekTWd/zUfGaL1q3kMIQ1Az4xIDQuxjVcsKsRyTvtHjS1G7AQUPBXc2N6Tm
10
+ zMHUkZR/niqvNZjyyNlaTdQoAdHAswxQKS+NQHegbP3+l8fGFlSG6AVYGl+ALInt
11
+ 8DeoYuaZhgRLTEGA+Dkw5TNFgdTqnaZgrXE1AflffYGBX4Q6ddW+rUfJ6s/RHmcj
12
+ eM9rCaFijSTJNupGe3uQJrmtgsAmBhotzYnswkQJwTk+HP0lvf+A7t72OfmBJsqx
13
+ MYdIi4hPKKai3s/Gbu9e/vS7/vYVPNaJAGJ5NJwqa518nxdb2Es/9Lnx7ts9J7lw
14
+ c15xjASh7gQsJojdEbOaaIUCqqi4BQX/koa4V3zPJ5KtZ3qqYzlw1NEOX63IAKLh
15
+ GN3pDiIuYc1by/6HSFDaY1gSx+ZRyn5Ie+4DuFS8W/PVdkE+kPKHCSdQifJ2E9ym
16
+ c2lYA0leKfH5z4SBv9TphwwTtsS8anHTvWyPy1jLHyH81FSr2u13bu0GiY+Q9Q9V
17
+ YJqXM/5M8w8+Nu9pcXDZbrcw2jb3gG1EYHVdXXMM3j/V/fhFmvixng5DDr4ghPNn
18
+ jAH9fX5UD289XzmYzXOhSRW7ovxv3jlFbKxT/Yj2pZwA8FWHG2IVsdHFK/VrjxG8
19
+ QRexMEYjE7gSzgJymc7ML1WgnY1ZFphD/6P5DBt0wWL+23EJ++OCHyVFzS5f4f3Z
20
+ YrJ51iIvyJB33Dq5xdT+peq+rBO9skwlfrn3M/WrD6fmE7sB71CDdNvL0c9yfjJO
21
+ MqxYcRzyClYl5bEB10zEShDMWS5uvJJl93Av+k8ZKm0kE2NXyL+HlaADp1zXzJ8E
22
+ G54LZLOlsJHebATRFLpxJ6lT6N7AUHCH0f0SnyyH+epxbbUlH1uB76beSeLypCw2
23
+ DyQg/aOP3FfuQG8mKmIECZ8qqXtDv3tM9hu/rvzEUkYOUfXi3xpVaRxA2nre9SAB
24
+ 7ZVDQv6QWDBHr+6F30znzZEhDqgas+s6MqG5zuEWSmWVja5Fv9JV/mPD8ZUZX5++
25
+ ZYguplD7Ht9sqw3fyrMk7WbSsFEYr2jrHc3lmVAK8g+wmNjJwKCBiR3cmoPFReEF
26
+ B6PZ+cTka1sOrDDz19bsy31yLac2u6o4pg+1yv1iGP4y2VsOyLE3vz3Pvl3i0PP/
27
+ C18loanx66f2sIps7HjcFk8eElhs/tAJ+tANOluhlzSlZhrmRuwXCFd7k+wOB8iI
28
+ +pnud/XlZU3invJYi9IHfwNw1dE9dPjchHIXb75py+vpLhkDzWSMEpGlTx8MpTwe
29
+ O4mb4azV8J0vFCq+hvvpHIG7on+NlFYWqjSdBgImo74eSDFTYDtYji5/D3MJQaxw
30
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,9 @@
1
+ -----BEGIN PUBLIC KEY-----
2
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7aPB60KeS9nRcILrU33L
3
+ fAcUcX0PvTuJB8ls4c3juFry3g6sgAOOh7D3G/CruoVvklobfURE6AC6+ISlwhcV
4
+ KOij/SgTZKwNH2bI0DOUjwnNfe1gC9wBt16c6jdd2zoqYVXqi0qgDwmRIrXemEPC
5
+ HQR4DV//iawvLeyhQc8lcZwp03zuYsXWnikGYRTHCBa8XpZtYAWdApYJnAnZCL3i
6
+ DDVqaNWutX4lN9wZue9e5o8uJ3IKC/EOlcvSrYnZnZlyGG5HH+rhGF7xpMozg1M7
7
+ xd7W87zCKDCbbNFw+dmUIbx6vamkJQeE+vSFZHb0vIQmH7T3MpqTo86TK6I88UIS
8
+ WQIDAQAB
9
+ -----END PUBLIC KEY-----
@@ -1,25 +0,0 @@
1
- #
2
- # Tina4 - This is not a 4ramework.
3
- # Copy-right 2007 - current Tina4
4
- # License: MIT https://opensource.org/licenses/MIT
5
- #
6
- # flake8: noqa: E501
7
- class Request:
8
- """
9
- Request object to store parameters, headers, etc.
10
- """
11
-
12
- def __init__(self, body=None, params=None, headers=None, request=None, raw_data=None, raw_request=None, raw_content=None):
13
- self.body = body if body is not None else None
14
- self.params = params if params is not None else {}
15
- self.headers = headers if headers is not None else {}
16
- self.request = request if request is not None else {}
17
- self.cookies = {}
18
- self.cookies = {}
19
- self.url = None
20
- self.session = None
21
- self.files = {}
22
- self.raw_data = raw_data if raw_data is not None else None
23
- self.raw_request = raw_request if raw_request is not None else None
24
- self.raw_content = raw_content if raw_content is not None else None
25
-
@@ -1,77 +0,0 @@
1
- #
2
- # Tina4 - This is not a 4ramework.
3
- # Copy-right 2007 - current Tina4
4
- # License: MIT https://opensource.org/licenses/MIT
5
- #
6
- # flake8: noqa: E501
7
- import json
8
- import inspect
9
- from types import ModuleType
10
- from tina4_python import Constant
11
- from tina4_python import DatabaseResult
12
- from tina4_python.Debug import Debug
13
-
14
-
15
- class Response:
16
- """
17
- response object for router
18
- :param content
19
- :param http_code
20
- :param content_type
21
- :param headers
22
- """
23
-
24
- def __init__(self, content, http_code=Constant.HTTP_OK, content_type=Constant.TEXT_HTML, headers=None):
25
- self.headers = headers if headers is not None else {}
26
-
27
- if content is None:
28
- content = ""
29
- # try to make content into a dictionary
30
- elif not isinstance(content, bool) and not isinstance(content, object) and not isinstance(content, bytes) and not isinstance(content, str) and not isinstance(content, list) and inspect.isclass(type(content)):
31
- content = dict(content)
32
-
33
- # check if database result
34
- if type(content) is DatabaseResult.DatabaseResult:
35
- content_type = Constant.APPLICATION_JSON
36
- content = content.to_json()
37
-
38
- # convert the dictionary or list into JSON
39
- if not isinstance(content, bool) and type(content) is dict or type(content) is list:
40
- content = json.dumps(content)
41
- content_type = Constant.APPLICATION_JSON
42
-
43
- if isinstance(content, bool):
44
- if content:
45
- content = "True"
46
- else:
47
- content = "False"
48
-
49
- if isinstance(content, ModuleType):
50
- content = json.dumps({"error": "Cannot decode object of type "+str(type(content))})
51
- content_type = Constant.APPLICATION_JSON
52
-
53
- self.content = content
54
- self.http_code = http_code
55
- self.content_type = content_type
56
-
57
-
58
- @staticmethod
59
- def redirect(redirect_url):
60
- """
61
- Redirects a request to redirect_url
62
- :param redirect_url:
63
- :return:
64
- """
65
- headers = {}
66
- http_code = Constant.HTTP_REDIRECT
67
- headers["Location"] = redirect_url
68
- return Response("", http_code=http_code, headers=headers)
69
-
70
- def add_header(self, key, value):
71
- """
72
- Adds a header for the response
73
- :param key:
74
- :param value:
75
- :return:
76
- """
77
- self.headers[key] = value
File without changes