plain 0.11.0__tar.gz → 0.12.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.
Files changed (147) hide show
  1. {plain-0.11.0 → plain-0.12.0}/PKG-INFO +1 -1
  2. {plain-0.11.0 → plain-0.12.0}/plain/preflight/__init__.py +1 -2
  3. plain-0.11.0/plain/preflight/security/base.py → plain-0.12.0/plain/preflight/security.py +30 -37
  4. {plain-0.11.0 → plain-0.12.0}/pyproject.toml +1 -1
  5. plain-0.11.0/plain/preflight/security/csrf.py +0 -36
  6. plain-0.11.0/plain/utils/__init__.py +0 -0
  7. {plain-0.11.0 → plain-0.12.0}/LICENSE +0 -0
  8. {plain-0.11.0 → plain-0.12.0}/README.md +0 -0
  9. {plain-0.11.0 → plain-0.12.0}/plain/README.md +0 -0
  10. {plain-0.11.0 → plain-0.12.0}/plain/__main__.py +0 -0
  11. {plain-0.11.0 → plain-0.12.0}/plain/assets/README.md +0 -0
  12. {plain-0.11.0 → plain-0.12.0}/plain/assets/__init__.py +0 -0
  13. {plain-0.11.0 → plain-0.12.0}/plain/assets/compile.py +0 -0
  14. {plain-0.11.0 → plain-0.12.0}/plain/assets/finders.py +0 -0
  15. {plain-0.11.0 → plain-0.12.0}/plain/assets/fingerprints.py +0 -0
  16. {plain-0.11.0 → plain-0.12.0}/plain/assets/urls.py +0 -0
  17. {plain-0.11.0 → plain-0.12.0}/plain/assets/views.py +0 -0
  18. {plain-0.11.0 → plain-0.12.0}/plain/cli/README.md +0 -0
  19. {plain-0.11.0 → plain-0.12.0}/plain/cli/__init__.py +0 -0
  20. {plain-0.11.0 → plain-0.12.0}/plain/cli/cli.py +0 -0
  21. {plain-0.11.0 → plain-0.12.0}/plain/cli/formatting.py +0 -0
  22. {plain-0.11.0 → plain-0.12.0}/plain/cli/packages.py +0 -0
  23. {plain-0.11.0 → plain-0.12.0}/plain/cli/print.py +0 -0
  24. {plain-0.11.0 → plain-0.12.0}/plain/cli/startup.py +0 -0
  25. {plain-0.11.0 → plain-0.12.0}/plain/csrf/README.md +0 -0
  26. {plain-0.11.0 → plain-0.12.0}/plain/csrf/middleware.py +0 -0
  27. {plain-0.11.0 → plain-0.12.0}/plain/csrf/views.py +0 -0
  28. {plain-0.11.0 → plain-0.12.0}/plain/debug.py +0 -0
  29. {plain-0.11.0 → plain-0.12.0}/plain/exceptions.py +0 -0
  30. {plain-0.11.0 → plain-0.12.0}/plain/forms/README.md +0 -0
  31. {plain-0.11.0 → plain-0.12.0}/plain/forms/__init__.py +0 -0
  32. {plain-0.11.0 → plain-0.12.0}/plain/forms/boundfield.py +0 -0
  33. {plain-0.11.0 → plain-0.12.0}/plain/forms/exceptions.py +0 -0
  34. {plain-0.11.0 → plain-0.12.0}/plain/forms/fields.py +0 -0
  35. {plain-0.11.0 → plain-0.12.0}/plain/forms/forms.py +0 -0
  36. {plain-0.11.0 → plain-0.12.0}/plain/http/README.md +0 -0
  37. {plain-0.11.0 → plain-0.12.0}/plain/http/__init__.py +0 -0
  38. {plain-0.11.0 → plain-0.12.0}/plain/http/cookie.py +0 -0
  39. {plain-0.11.0 → plain-0.12.0}/plain/http/multipartparser.py +0 -0
  40. {plain-0.11.0 → plain-0.12.0}/plain/http/request.py +0 -0
  41. {plain-0.11.0 → plain-0.12.0}/plain/http/response.py +0 -0
  42. {plain-0.11.0 → plain-0.12.0}/plain/internal/__init__.py +0 -0
  43. {plain-0.11.0 → plain-0.12.0}/plain/internal/files/README.md +0 -0
  44. {plain-0.11.0 → plain-0.12.0}/plain/internal/files/__init__.py +0 -0
  45. {plain-0.11.0 → plain-0.12.0}/plain/internal/files/base.py +0 -0
  46. {plain-0.11.0 → plain-0.12.0}/plain/internal/files/locks.py +0 -0
  47. {plain-0.11.0 → plain-0.12.0}/plain/internal/files/move.py +0 -0
  48. {plain-0.11.0 → plain-0.12.0}/plain/internal/files/temp.py +0 -0
  49. {plain-0.11.0 → plain-0.12.0}/plain/internal/files/uploadedfile.py +0 -0
  50. {plain-0.11.0 → plain-0.12.0}/plain/internal/files/uploadhandler.py +0 -0
  51. {plain-0.11.0 → plain-0.12.0}/plain/internal/files/utils.py +0 -0
  52. {plain-0.11.0 → plain-0.12.0}/plain/internal/handlers/__init__.py +0 -0
  53. {plain-0.11.0 → plain-0.12.0}/plain/internal/handlers/base.py +0 -0
  54. {plain-0.11.0 → plain-0.12.0}/plain/internal/handlers/exception.py +0 -0
  55. {plain-0.11.0 → plain-0.12.0}/plain/internal/handlers/wsgi.py +0 -0
  56. {plain-0.11.0 → plain-0.12.0}/plain/internal/middleware/__init__.py +0 -0
  57. {plain-0.11.0 → plain-0.12.0}/plain/internal/middleware/headers.py +0 -0
  58. {plain-0.11.0 → plain-0.12.0}/plain/internal/middleware/https.py +0 -0
  59. {plain-0.11.0 → plain-0.12.0}/plain/internal/middleware/slash.py +0 -0
  60. {plain-0.11.0 → plain-0.12.0}/plain/json.py +0 -0
  61. {plain-0.11.0 → plain-0.12.0}/plain/logs/README.md +0 -0
  62. {plain-0.11.0 → plain-0.12.0}/plain/logs/__init__.py +0 -0
  63. {plain-0.11.0 → plain-0.12.0}/plain/logs/configure.py +0 -0
  64. {plain-0.11.0 → plain-0.12.0}/plain/logs/loggers.py +0 -0
  65. {plain-0.11.0 → plain-0.12.0}/plain/logs/utils.py +0 -0
  66. {plain-0.11.0 → plain-0.12.0}/plain/packages/README.md +0 -0
  67. {plain-0.11.0 → plain-0.12.0}/plain/packages/__init__.py +0 -0
  68. {plain-0.11.0 → plain-0.12.0}/plain/packages/config.py +0 -0
  69. {plain-0.11.0 → plain-0.12.0}/plain/packages/registry.py +0 -0
  70. {plain-0.11.0 → plain-0.12.0}/plain/paginator.py +0 -0
  71. {plain-0.11.0 → plain-0.12.0}/plain/preflight/README.md +0 -0
  72. {plain-0.11.0 → plain-0.12.0}/plain/preflight/files.py +0 -0
  73. {plain-0.11.0 → plain-0.12.0}/plain/preflight/messages.py +0 -0
  74. {plain-0.11.0 → plain-0.12.0}/plain/preflight/registry.py +0 -0
  75. {plain-0.11.0 → plain-0.12.0}/plain/preflight/urls.py +0 -0
  76. {plain-0.11.0 → plain-0.12.0}/plain/runtime/README.md +0 -0
  77. {plain-0.11.0 → plain-0.12.0}/plain/runtime/__init__.py +0 -0
  78. {plain-0.11.0 → plain-0.12.0}/plain/runtime/global_settings.py +0 -0
  79. {plain-0.11.0 → plain-0.12.0}/plain/runtime/user_settings.py +0 -0
  80. {plain-0.11.0 → plain-0.12.0}/plain/signals/README.md +0 -0
  81. {plain-0.11.0 → plain-0.12.0}/plain/signals/__init__.py +0 -0
  82. {plain-0.11.0 → plain-0.12.0}/plain/signals/dispatch/__init__.py +0 -0
  83. {plain-0.11.0 → plain-0.12.0}/plain/signals/dispatch/dispatcher.py +0 -0
  84. {plain-0.11.0 → plain-0.12.0}/plain/signals/dispatch/license.txt +0 -0
  85. {plain-0.11.0 → plain-0.12.0}/plain/signing.py +0 -0
  86. {plain-0.11.0 → plain-0.12.0}/plain/templates/README.md +0 -0
  87. {plain-0.11.0 → plain-0.12.0}/plain/templates/__init__.py +0 -0
  88. {plain-0.11.0 → plain-0.12.0}/plain/templates/core.py +0 -0
  89. {plain-0.11.0 → plain-0.12.0}/plain/templates/jinja/README.md +0 -0
  90. {plain-0.11.0 → plain-0.12.0}/plain/templates/jinja/__init__.py +0 -0
  91. {plain-0.11.0 → plain-0.12.0}/plain/templates/jinja/defaults.py +0 -0
  92. {plain-0.11.0 → plain-0.12.0}/plain/templates/jinja/extensions.py +0 -0
  93. {plain-0.11.0 → plain-0.12.0}/plain/templates/jinja/filters.py +0 -0
  94. {plain-0.11.0 → plain-0.12.0}/plain/templates/jinja/globals.py +0 -0
  95. {plain-0.11.0 → plain-0.12.0}/plain/test/README.md +0 -0
  96. {plain-0.11.0 → plain-0.12.0}/plain/test/__init__.py +0 -0
  97. {plain-0.11.0 → plain-0.12.0}/plain/test/client.py +0 -0
  98. {plain-0.11.0 → plain-0.12.0}/plain/urls/README.md +0 -0
  99. {plain-0.11.0 → plain-0.12.0}/plain/urls/__init__.py +0 -0
  100. {plain-0.11.0 → plain-0.12.0}/plain/urls/base.py +0 -0
  101. {plain-0.11.0 → plain-0.12.0}/plain/urls/conf.py +0 -0
  102. {plain-0.11.0 → plain-0.12.0}/plain/urls/converters.py +0 -0
  103. {plain-0.11.0 → plain-0.12.0}/plain/urls/exceptions.py +0 -0
  104. {plain-0.11.0 → plain-0.12.0}/plain/urls/resolvers.py +0 -0
  105. {plain-0.11.0 → plain-0.12.0}/plain/utils/README.md +0 -0
  106. {plain-0.11.0/plain/preflight/security → plain-0.12.0/plain/utils}/__init__.py +0 -0
  107. {plain-0.11.0 → plain-0.12.0}/plain/utils/_os.py +0 -0
  108. {plain-0.11.0 → plain-0.12.0}/plain/utils/cache.py +0 -0
  109. {plain-0.11.0 → plain-0.12.0}/plain/utils/connection.py +0 -0
  110. {plain-0.11.0 → plain-0.12.0}/plain/utils/crypto.py +0 -0
  111. {plain-0.11.0 → plain-0.12.0}/plain/utils/datastructures.py +0 -0
  112. {plain-0.11.0 → plain-0.12.0}/plain/utils/dateformat.py +0 -0
  113. {plain-0.11.0 → plain-0.12.0}/plain/utils/dateparse.py +0 -0
  114. {plain-0.11.0 → plain-0.12.0}/plain/utils/dates.py +0 -0
  115. {plain-0.11.0 → plain-0.12.0}/plain/utils/deconstruct.py +0 -0
  116. {plain-0.11.0 → plain-0.12.0}/plain/utils/decorators.py +0 -0
  117. {plain-0.11.0 → plain-0.12.0}/plain/utils/deprecation.py +0 -0
  118. {plain-0.11.0 → plain-0.12.0}/plain/utils/duration.py +0 -0
  119. {plain-0.11.0 → plain-0.12.0}/plain/utils/email.py +0 -0
  120. {plain-0.11.0 → plain-0.12.0}/plain/utils/encoding.py +0 -0
  121. {plain-0.11.0 → plain-0.12.0}/plain/utils/functional.py +0 -0
  122. {plain-0.11.0 → plain-0.12.0}/plain/utils/hashable.py +0 -0
  123. {plain-0.11.0 → plain-0.12.0}/plain/utils/html.py +0 -0
  124. {plain-0.11.0 → plain-0.12.0}/plain/utils/http.py +0 -0
  125. {plain-0.11.0 → plain-0.12.0}/plain/utils/inspect.py +0 -0
  126. {plain-0.11.0 → plain-0.12.0}/plain/utils/ipv6.py +0 -0
  127. {plain-0.11.0 → plain-0.12.0}/plain/utils/itercompat.py +0 -0
  128. {plain-0.11.0 → plain-0.12.0}/plain/utils/module_loading.py +0 -0
  129. {plain-0.11.0 → plain-0.12.0}/plain/utils/regex_helper.py +0 -0
  130. {plain-0.11.0 → plain-0.12.0}/plain/utils/safestring.py +0 -0
  131. {plain-0.11.0 → plain-0.12.0}/plain/utils/termcolors.py +0 -0
  132. {plain-0.11.0 → plain-0.12.0}/plain/utils/text.py +0 -0
  133. {plain-0.11.0 → plain-0.12.0}/plain/utils/timesince.py +0 -0
  134. {plain-0.11.0 → plain-0.12.0}/plain/utils/timezone.py +0 -0
  135. {plain-0.11.0 → plain-0.12.0}/plain/utils/tree.py +0 -0
  136. {plain-0.11.0 → plain-0.12.0}/plain/validators.py +0 -0
  137. {plain-0.11.0 → plain-0.12.0}/plain/views/README.md +0 -0
  138. {plain-0.11.0 → plain-0.12.0}/plain/views/__init__.py +0 -0
  139. {plain-0.11.0 → plain-0.12.0}/plain/views/base.py +0 -0
  140. {plain-0.11.0 → plain-0.12.0}/plain/views/csrf.py +0 -0
  141. {plain-0.11.0 → plain-0.12.0}/plain/views/errors.py +0 -0
  142. {plain-0.11.0 → plain-0.12.0}/plain/views/exceptions.py +0 -0
  143. {plain-0.11.0 → plain-0.12.0}/plain/views/forms.py +0 -0
  144. {plain-0.11.0 → plain-0.12.0}/plain/views/objects.py +0 -0
  145. {plain-0.11.0 → plain-0.12.0}/plain/views/redirect.py +0 -0
  146. {plain-0.11.0 → plain-0.12.0}/plain/views/templates.py +0 -0
  147. {plain-0.11.0 → plain-0.12.0}/plain/wsgi.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: plain
3
- Version: 0.11.0
3
+ Version: 0.12.0
4
4
  Summary: A web framework for building products with Python.
5
5
  Author: Dave Gaeddert
6
6
  Author-email: dave.gaeddert@dropseed.dev
@@ -15,8 +15,7 @@ from .registry import register, run_checks
15
15
 
16
16
  # Import these to force registration of checks
17
17
  import plain.preflight.files # NOQA isort:skip
18
- import plain.preflight.security.base # NOQA isort:skip
19
- import plain.preflight.security.csrf # NOQA isort:skip
18
+ import plain.preflight.security # NOQA isort:skip
20
19
  import plain.preflight.urls # NOQA isort:skip
21
20
 
22
21
 
@@ -16,40 +16,6 @@ SECRET_KEY_WARNING_MSG = (
16
16
  f"vulnerable to attack."
17
17
  )
18
18
 
19
- # TODO
20
- W001 = Warning(
21
- "You do not have 'plain.middleware.https.HttpsRedirectMiddleware' "
22
- "in your MIDDLEWARE so the SECURE_HSTS_SECONDS, "
23
- "SECURE_CONTENT_TYPE_NOSNIFF, SECURE_REFERRER_POLICY, "
24
- "SECURE_CROSS_ORIGIN_OPENER_POLICY, and HTTPS_REDIRECT_ENABLED settings will "
25
- "have no effect.",
26
- id="security.W001",
27
- )
28
-
29
- W008 = Warning(
30
- "Your HTTPS_REDIRECT_ENABLED setting is not set to True. "
31
- "Unless your site should be available over both SSL and non-SSL "
32
- "connections, you may want to either set this setting True "
33
- "or configure a load balancer or reverse-proxy server "
34
- "to redirect all connections to HTTPS.",
35
- id="security.W008",
36
- )
37
-
38
- W009 = Warning(
39
- SECRET_KEY_WARNING_MSG % "SECRET_KEY",
40
- id="security.W009",
41
- )
42
-
43
- W018 = Warning(
44
- "You should not have DEBUG set to True in deployment.",
45
- id="security.W018",
46
- )
47
-
48
- W020 = Warning(
49
- "ALLOWED_HOSTS must not be empty in deployment.",
50
- id="security.W020",
51
- )
52
-
53
19
  W025 = Warning(SECRET_KEY_WARNING_MSG, id="security.W025")
54
20
 
55
21
 
@@ -69,7 +35,16 @@ def check_secret_key(package_configs, **kwargs):
69
35
  passed_check = False
70
36
  else:
71
37
  passed_check = _check_secret_key(secret_key)
72
- return [] if passed_check else [W009]
38
+ return (
39
+ []
40
+ if passed_check
41
+ else [
42
+ Warning(
43
+ SECRET_KEY_WARNING_MSG % "SECRET_KEY",
44
+ id="security.W009",
45
+ )
46
+ ]
47
+ )
73
48
 
74
49
 
75
50
  @register(deploy=True)
@@ -91,9 +66,27 @@ def check_secret_key_fallbacks(package_configs, **kwargs):
91
66
  @register(deploy=True)
92
67
  def check_debug(package_configs, **kwargs):
93
68
  passed_check = not settings.DEBUG
94
- return [] if passed_check else [W018]
69
+ return (
70
+ []
71
+ if passed_check
72
+ else [
73
+ Warning(
74
+ "You should not have DEBUG set to True in deployment.",
75
+ id="security.W018",
76
+ )
77
+ ]
78
+ )
95
79
 
96
80
 
97
81
  @register(deploy=True)
98
82
  def check_allowed_hosts(package_configs, **kwargs):
99
- return [] if settings.ALLOWED_HOSTS else [W020]
83
+ return (
84
+ []
85
+ if settings.ALLOWED_HOSTS
86
+ else [
87
+ Warning(
88
+ "ALLOWED_HOSTS must not be empty in deployment.",
89
+ id="security.W020",
90
+ )
91
+ ]
92
+ )
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "plain"
3
- version = "0.11.0"
3
+ version = "0.12.0"
4
4
  description = "A web framework for building products with Python."
5
5
  authors = ["Dave Gaeddert <dave.gaeddert@dropseed.dev>"]
6
6
  readme = "README.md"
@@ -1,36 +0,0 @@
1
- from plain.runtime import settings
2
-
3
- from .. import Warning, register
4
-
5
- W003 = Warning(
6
- "You don't appear to be using Plain's built-in "
7
- "cross-site request forgery protection via the middleware "
8
- "('plain.csrf.middleware.CsrfViewMiddleware' is not in your "
9
- "MIDDLEWARE). Enabling the middleware is the safest approach "
10
- "to ensure you don't leave any holes.",
11
- id="security.W003",
12
- )
13
-
14
- W016 = Warning(
15
- "You have 'plain.csrf.middleware.CsrfViewMiddleware' in your "
16
- "MIDDLEWARE, but you have not set CSRF_COOKIE_SECURE to True. "
17
- "Using a secure-only CSRF cookie makes it more difficult for network "
18
- "traffic sniffers to steal the CSRF token.",
19
- id="security.W016",
20
- )
21
-
22
-
23
- def _csrf_middleware():
24
- return "plain.csrf.middleware.CsrfViewMiddleware" in settings.MIDDLEWARE
25
-
26
-
27
- @register(deploy=True)
28
- def check_csrf_middleware(package_configs, **kwargs):
29
- passed_check = _csrf_middleware()
30
- return [] if passed_check else [W003]
31
-
32
-
33
- @register(deploy=True)
34
- def check_csrf_cookie_secure(package_configs, **kwargs):
35
- passed_check = not _csrf_middleware() or settings.CSRF_COOKIE_SECURE is True
36
- return [] if passed_check else [W016]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes