webconf-audit 0.1.1__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 (425) hide show
  1. webconf_audit-0.1.1/.gitignore +27 -0
  2. webconf_audit-0.1.1/CHANGELOG.md +85 -0
  3. webconf_audit-0.1.1/PKG-INFO +12 -0
  4. webconf_audit-0.1.1/README.md +420 -0
  5. webconf_audit-0.1.1/pyproject.toml +88 -0
  6. webconf_audit-0.1.1/src/__init__.py +0 -0
  7. webconf_audit-0.1.1/src/webconf_audit/__init__.py +0 -0
  8. webconf_audit-0.1.1/src/webconf_audit/apache_module_names.py +64 -0
  9. webconf_audit-0.1.1/src/webconf_audit/assessment.py +1596 -0
  10. webconf_audit-0.1.1/src/webconf_audit/assessment_models.py +329 -0
  11. webconf_audit-0.1.1/src/webconf_audit/assessment_renderers.py +204 -0
  12. webconf_audit-0.1.1/src/webconf_audit/audit_policy.py +1755 -0
  13. webconf_audit-0.1.1/src/webconf_audit/baselines.py +368 -0
  14. webconf_audit-0.1.1/src/webconf_audit/cli/__init__.py +1652 -0
  15. webconf_audit-0.1.1/src/webconf_audit/cli/__main__.py +6 -0
  16. webconf_audit-0.1.1/src/webconf_audit/cli/coverage.py +462 -0
  17. webconf_audit-0.1.1/src/webconf_audit/coverage_ledger.py +2238 -0
  18. webconf_audit-0.1.1/src/webconf_audit/coverage_models.py +352 -0
  19. webconf_audit-0.1.1/src/webconf_audit/crosswalk_integrity.py +241 -0
  20. webconf_audit-0.1.1/src/webconf_audit/csp.py +60 -0
  21. webconf_audit-0.1.1/src/webconf_audit/csp_ast.py +520 -0
  22. webconf_audit-0.1.1/src/webconf_audit/data/__init__.py +1 -0
  23. webconf_audit-0.1.1/src/webconf_audit/data/control_source_coverage.yml +12229 -0
  24. webconf_audit-0.1.1/src/webconf_audit/execution_manifest.py +428 -0
  25. webconf_audit-0.1.1/src/webconf_audit/external/__init__.py +4 -0
  26. webconf_audit-0.1.1/src/webconf_audit/external/html_recon.py +137 -0
  27. webconf_audit-0.1.1/src/webconf_audit/external/recon/__init__.py +3346 -0
  28. webconf_audit-0.1.1/src/webconf_audit/external/recon/_cookie.py +74 -0
  29. webconf_audit-0.1.1/src/webconf_audit/external/recon/port_discovery.py +162 -0
  30. webconf_audit-0.1.1/src/webconf_audit/external/recon/tls_probe.py +874 -0
  31. webconf_audit-0.1.1/src/webconf_audit/external/rules/__init__.py +6 -0
  32. webconf_audit-0.1.1/src/webconf_audit/external/rules/_conditional.py +614 -0
  33. webconf_audit-0.1.1/src/webconf_audit/external/rules/_cookies.py +246 -0
  34. webconf_audit-0.1.1/src/webconf_audit/external/rules/_cors.py +112 -0
  35. webconf_audit-0.1.1/src/webconf_audit/external/rules/_disclosure.py +179 -0
  36. webconf_audit-0.1.1/src/webconf_audit/external/rules/_headers.py +813 -0
  37. webconf_audit-0.1.1/src/webconf_audit/external/rules/_helpers.py +288 -0
  38. webconf_audit-0.1.1/src/webconf_audit/external/rules/_https.py +277 -0
  39. webconf_audit-0.1.1/src/webconf_audit/external/rules/_methods.py +349 -0
  40. webconf_audit-0.1.1/src/webconf_audit/external/rules/_runner.py +563 -0
  41. webconf_audit-0.1.1/src/webconf_audit/external/rules/_sensitive_paths.py +107 -0
  42. webconf_audit-0.1.1/src/webconf_audit/external/rules/_tls.py +688 -0
  43. webconf_audit-0.1.1/src/webconf_audit/external/rules/iis_native_header_probe.py +105 -0
  44. webconf_audit-0.1.1/src/webconf_audit/external/rules/nginx_runtime_probes.py +178 -0
  45. webconf_audit-0.1.1/src/webconf_audit/external/rules/script_src_missing_sri.py +123 -0
  46. webconf_audit-0.1.1/src/webconf_audit/external/rules/tls_cert_probes.py +216 -0
  47. webconf_audit-0.1.1/src/webconf_audit/external/rules/tls_handshake_probes.py +232 -0
  48. webconf_audit-0.1.1/src/webconf_audit/external/rules/unknown_host_runtime_response.py +116 -0
  49. webconf_audit-0.1.1/src/webconf_audit/external/safe_probe_catalog.py +2568 -0
  50. webconf_audit-0.1.1/src/webconf_audit/external/tls_inventory.py +1088 -0
  51. webconf_audit-0.1.1/src/webconf_audit/finding_factory.py +51 -0
  52. webconf_audit-0.1.1/src/webconf_audit/fingerprints.py +168 -0
  53. webconf_audit-0.1.1/src/webconf_audit/header_policy.py +177 -0
  54. webconf_audit-0.1.1/src/webconf_audit/hsts_policy.py +54 -0
  55. webconf_audit-0.1.1/src/webconf_audit/local/__init__.py +0 -0
  56. webconf_audit-0.1.1/src/webconf_audit/local/apache/__init__.py +862 -0
  57. webconf_audit-0.1.1/src/webconf_audit/local/apache/authorization.py +1013 -0
  58. webconf_audit-0.1.1/src/webconf_audit/local/apache/effective.py +853 -0
  59. webconf_audit-0.1.1/src/webconf_audit/local/apache/htaccess.py +512 -0
  60. webconf_audit-0.1.1/src/webconf_audit/local/apache/include.py +301 -0
  61. webconf_audit-0.1.1/src/webconf_audit/local/apache/module_inventory.py +527 -0
  62. webconf_audit-0.1.1/src/webconf_audit/local/apache/parser/__init__.py +25 -0
  63. webconf_audit-0.1.1/src/webconf_audit/local/apache/parser/parser.py +396 -0
  64. webconf_audit-0.1.1/src/webconf_audit/local/apache/path_matching.py +68 -0
  65. webconf_audit-0.1.1/src/webconf_audit/local/apache/root_directory.py +107 -0
  66. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/__init__.py +1 -0
  67. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/_block_policy_utils.py +345 -0
  68. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/_log_policy_utils.py +296 -0
  69. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/_modsecurity_inventory_utils.py +234 -0
  70. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/_policy_semantics_utils.py +875 -0
  71. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/_redirect_scope_utils.py +190 -0
  72. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/_tls_policy_utils.py +250 -0
  73. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/_vhost_rejection_utils.py +219 -0
  74. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/allowoverride_all.py +230 -0
  75. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/allowoverride_not_none.py +149 -0
  76. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/backup_files_restricted.py +200 -0
  77. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/basic_auth_over_http.py +112 -0
  78. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/content_security_policy_missing_frame_ancestors.py +55 -0
  79. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/content_security_policy_missing_reporting_endpoint.py +54 -0
  80. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/context_sensitive_directive_utils.py +83 -0
  81. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/csp_value_review.py +135 -0
  82. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/custom_log_missing.py +85 -0
  83. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/custom_log_uses_default_format.py +94 -0
  84. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/default_content_probe.py +141 -0
  85. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/default_tls_vhost_not_rejecting_unknown_hosts.py +108 -0
  86. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/default_vhost_not_rejecting_unknown_hosts.py +195 -0
  87. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/directory_without_allowoverride.py +417 -0
  88. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/effective_directive_check.py +399 -0
  89. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/error_document_404_missing.py +75 -0
  90. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/error_document_500_missing.py +75 -0
  91. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/error_document_utils.py +42 -0
  92. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/error_log_missing.py +85 -0
  93. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/error_log_unsafe_destination.py +96 -0
  94. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/file_etag_inodes.py +105 -0
  95. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/generated_artifacts_restricted.py +126 -0
  96. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/hsts_header_policy.py +198 -0
  97. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/ht_files_restricted.py +118 -0
  98. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/htaccess_auth_without_require.py +102 -0
  99. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/htaccess_disables_security_headers.py +103 -0
  100. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/htaccess_enables_cgi.py +93 -0
  101. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/htaccess_enables_directory_listing.py +96 -0
  102. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/htaccess_overrides_security.py +109 -0
  103. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/htaccess_rewrite_without_limit.py +80 -0
  104. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/htaccess_rule_utils.py +42 -0
  105. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/htaccess_weakens_security.py +242 -0
  106. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/http_method_policy_unsafe.py +134 -0
  107. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/http_protocol_options_unsafe.py +98 -0
  108. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/http_to_https_redirect_missing.py +204 -0
  109. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/index_options_fancyindexing_enabled.py +72 -0
  110. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/index_options_scanhtmltitles_enabled.py +73 -0
  111. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/ip_based_requests_allowed.py +167 -0
  112. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/keepalive_disabled.py +56 -0
  113. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/keepalive_timeout_too_high.py +66 -0
  114. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/limit_request_body.py +172 -0
  115. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/limit_request_body_value_review.py +81 -0
  116. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/limit_request_field_size_too_high.py +63 -0
  117. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/limit_request_fields.py +169 -0
  118. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/limit_request_line_too_high.py +63 -0
  119. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/listen_requires_explicit_address.py +133 -0
  120. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/location_endpoint_utils.py +207 -0
  121. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/log_format_missing_fields.py +125 -0
  122. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/log_level_too_restrictive.py +109 -0
  123. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/max_keepalive_requests_too_low.py +63 -0
  124. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/missing_http_method_restrictions.py +158 -0
  125. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/missing_log_format.py +77 -0
  126. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/missing_permissions_policy_header.py +45 -0
  127. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/missing_referrer_policy_header.py +48 -0
  128. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/missing_x_frame_options_header.py +51 -0
  129. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/modsecurity_crs_not_configured.py +67 -0
  130. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/modsecurity_module_missing.py +63 -0
  131. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/options_execcgi_enabled.py +68 -0
  132. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/options_includes_enabled.py +71 -0
  133. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/options_indexes.py +71 -0
  134. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/options_multiviews_enabled.py +72 -0
  135. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/options_not_none_in_root_directory.py +258 -0
  136. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/os_root_access_not_denied.py +212 -0
  137. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/permissions_policy_runtime_quality.py +104 -0
  138. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/permissions_policy_unsafe.py +48 -0
  139. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/referrer_policy_unsafe.py +48 -0
  140. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/request_read_timeout_semantics.py +183 -0
  141. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/scope_phrase.py +25 -0
  142. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/security_header_utils.py +1000 -0
  143. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/sensitive_config_files_restricted.py +142 -0
  144. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/sensitive_path_environment_policy.py +104 -0
  145. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/server_directive_utils.py +109 -0
  146. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/server_info_exposed.py +78 -0
  147. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/server_signature_off.py +142 -0
  148. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/server_status_exposed.py +78 -0
  149. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/server_tokens_prod.py +164 -0
  150. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/sitewide_http_method_policy_missing.py +176 -0
  151. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/ssl_cipher_suite_missing.py +55 -0
  152. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/ssl_cipher_suite_weak.py +83 -0
  153. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/ssl_compression.py +55 -0
  154. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/ssl_honor_cipher_order.py +55 -0
  155. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/ssl_insecure_renegotiation.py +59 -0
  156. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/ssl_protocol_policy.py +190 -0
  157. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/ssl_proxy_peer_name_check_disabled.py +102 -0
  158. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/ssl_proxy_verify_disabled.py +98 -0
  159. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/ssl_session_cache_missing.py +56 -0
  160. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/ssl_session_cache_timeout.py +68 -0
  161. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/ssl_stapling_cache_missing.py +58 -0
  162. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/ssl_use_stapling.py +54 -0
  163. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/timeout_keepalive_default_policy.py +93 -0
  164. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/timeout_too_high.py +60 -0
  165. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/trace_enable_off.py +141 -0
  166. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/vcs_metadata_restricted.py +127 -0
  167. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/x_frame_options_unsafe.py +54 -0
  168. webconf_audit-0.1.1/src/webconf_audit/local/apache/rules_runner.py +171 -0
  169. webconf_audit-0.1.1/src/webconf_audit/local/iis/__init__.py +615 -0
  170. webconf_audit-0.1.1/src/webconf_audit/local/iis/_iis_schema/ASPNET_schema.xml +670 -0
  171. webconf_audit-0.1.1/src/webconf_audit/local/iis/_iis_schema/FX_schema.xml +443 -0
  172. webconf_audit-0.1.1/src/webconf_audit/local/iis/_iis_schema/IIS_schema.xml +1570 -0
  173. webconf_audit-0.1.1/src/webconf_audit/local/iis/_iis_schema/README.md +5 -0
  174. webconf_audit-0.1.1/src/webconf_audit/local/iis/_iis_schema/__init__.py +41 -0
  175. webconf_audit-0.1.1/src/webconf_audit/local/iis/discovery.py +323 -0
  176. webconf_audit-0.1.1/src/webconf_audit/local/iis/effective.py +656 -0
  177. webconf_audit-0.1.1/src/webconf_audit/local/iis/iis_defaults.py +167 -0
  178. webconf_audit-0.1.1/src/webconf_audit/local/iis/parser/__init__.py +23 -0
  179. webconf_audit-0.1.1/src/webconf_audit/local/iis/parser/parser.py +288 -0
  180. webconf_audit-0.1.1/src/webconf_audit/local/iis/registry.py +1704 -0
  181. webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/__init__.py +1 -0
  182. webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/anonymous_auth_enabled.py +236 -0
  183. webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/application_pool_policy.py +382 -0
  184. webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/asp_script_error_sent_to_browser.py +58 -0
  185. webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/auth_policy.py +799 -0
  186. webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/binding_without_host_header.py +100 -0
  187. webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/cgi_handler_enabled.py +124 -0
  188. webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/compilation_debug_enabled.py +66 -0
  189. webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/content_security_policy_missing_frame_ancestors.py +138 -0
  190. webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/content_security_policy_missing_reporting_endpoint.py +141 -0
  191. webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/custom_errors_off.py +79 -0
  192. webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/custom_headers_expose_server.py +79 -0
  193. webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/directory_browse_enabled.py +79 -0
  194. webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/forms_auth_require_ssl_missing.py +140 -0
  195. webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/handler_access_policy.py +146 -0
  196. webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/hsts_header_unsafe.py +126 -0
  197. webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/http_errors_detailed.py +79 -0
  198. webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/http_runtime_version_header_enabled.py +114 -0
  199. webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/logging_fields_review.py +133 -0
  200. webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/logging_not_configured.py +111 -0
  201. webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/max_allowed_content_length_missing.py +150 -0
  202. webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/missing_hsts_header.py +136 -0
  203. webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/redirect_scope_utils.py +37 -0
  204. webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/request_filtering_allow_double_escaping.py +88 -0
  205. webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/request_filtering_allow_high_bit.py +89 -0
  206. webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/request_filtering_policy.py +704 -0
  207. webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/rule_utils.py +219 -0
  208. webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/schannel_tls_policy.py +348 -0
  209. webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/session_state_cookieless.py +67 -0
  210. webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/ssl_not_required.py +118 -0
  211. webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/ssl_weak_cipher_strength.py +92 -0
  212. webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/system_web_policy.py +757 -0
  213. webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/trace_enabled.py +58 -0
  214. webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/webdav_module_enabled.py +112 -0
  215. webconf_audit-0.1.1/src/webconf_audit/local/iis/rules_runner.py +83 -0
  216. webconf_audit-0.1.1/src/webconf_audit/local/iis/schannel_defaults.py +126 -0
  217. webconf_audit-0.1.1/src/webconf_audit/local/iis/schannel_models.py +293 -0
  218. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/__init__.py +213 -0
  219. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/conditions.py +167 -0
  220. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/effective.py +665 -0
  221. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/include.py +402 -0
  222. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/parser/__init__.py +27 -0
  223. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/parser/parser.py +779 -0
  224. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/__init__.py +1 -0
  225. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/access_log_format_missing_fields.py +198 -0
  226. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/access_log_format_review.py +179 -0
  227. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/access_log_missing.py +122 -0
  228. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/auth_backend_policy.py +185 -0
  229. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/basic_auth_over_http.py +179 -0
  230. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/content_security_policy_missing_frame_ancestors.py +92 -0
  231. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/content_security_policy_missing_reporting_endpoint.py +166 -0
  232. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/content_security_policy_unsafe.py +107 -0
  233. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/dir_listing_enabled.py +104 -0
  234. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/directive_value_utils.py +96 -0
  235. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/error_log_missing.py +66 -0
  236. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/header_policy_parity.py +313 -0
  237. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/header_tuple_utils.py +125 -0
  238. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/idle_timeout_policy.py +199 -0
  239. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/max_connections_missing.py +74 -0
  240. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/max_request_size_missing.py +72 -0
  241. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/max_request_size_policy.py +169 -0
  242. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/missing_http_method_restrictions.py +92 -0
  243. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/missing_http_to_https_redirect.py +101 -0
  244. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/missing_strict_transport_security.py +96 -0
  245. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/missing_x_content_type_options.py +96 -0
  246. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/mod_cgi_enabled.py +82 -0
  247. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/mod_status_public.py +196 -0
  248. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/mod_webdav_enabled.py +64 -0
  249. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/redirect_scope_utils.py +91 -0
  250. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/rule_utils.py +138 -0
  251. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/sensitive_path_policy.py +228 -0
  252. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/server_tag_not_blank.py +137 -0
  253. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/ssl_compression.py +162 -0
  254. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/ssl_conf_cmd_utils.py +80 -0
  255. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/ssl_engine_not_enabled.py +197 -0
  256. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/ssl_honor_cipher_order_missing.py +159 -0
  257. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/ssl_insecure_renegotiation.py +188 -0
  258. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/ssl_pemfile_missing.py +63 -0
  259. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/ssl_protocol_policy.py +508 -0
  260. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/strict_transport_security_unsafe.py +177 -0
  261. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/url_access_deny_missing.py +241 -0
  262. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/weak_ssl_cipher_list.py +70 -0
  263. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/webdav_write_access_enabled.py +117 -0
  264. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/x_frame_options_unsafe.py +88 -0
  265. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules_runner.py +110 -0
  266. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/shell.py +51 -0
  267. webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/variables.py +234 -0
  268. webconf_audit-0.1.1/src/webconf_audit/local/load_context.py +58 -0
  269. webconf_audit-0.1.1/src/webconf_audit/local/nginx/__init__.py +438 -0
  270. webconf_audit-0.1.1/src/webconf_audit/local/nginx/access_control_semantics.py +558 -0
  271. webconf_audit-0.1.1/src/webconf_audit/local/nginx/assessments/__init__.py +5 -0
  272. webconf_audit-0.1.1/src/webconf_audit/local/nginx/assessments/logging.py +966 -0
  273. webconf_audit-0.1.1/src/webconf_audit/local/nginx/assessments/rate_limits.py +945 -0
  274. webconf_audit-0.1.1/src/webconf_audit/local/nginx/assessments/response_headers.py +1581 -0
  275. webconf_audit-0.1.1/src/webconf_audit/local/nginx/assessments/reverse_proxy_headers.py +807 -0
  276. webconf_audit-0.1.1/src/webconf_audit/local/nginx/assessments/sensitive_locations.py +1007 -0
  277. webconf_audit-0.1.1/src/webconf_audit/local/nginx/effective_scope.py +309 -0
  278. webconf_audit-0.1.1/src/webconf_audit/local/nginx/include.py +272 -0
  279. webconf_audit-0.1.1/src/webconf_audit/local/nginx/location_matcher.py +324 -0
  280. webconf_audit-0.1.1/src/webconf_audit/local/nginx/logging_semantics.py +618 -0
  281. webconf_audit-0.1.1/src/webconf_audit/local/nginx/parser/__init__.py +28 -0
  282. webconf_audit-0.1.1/src/webconf_audit/local/nginx/parser/ast.py +57 -0
  283. webconf_audit-0.1.1/src/webconf_audit/local/nginx/parser/parser.py +341 -0
  284. webconf_audit-0.1.1/src/webconf_audit/local/nginx/parser/tokens.py +28 -0
  285. webconf_audit-0.1.1/src/webconf_audit/local/nginx/proxy_headers.py +659 -0
  286. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rate_limit_semantics.py +787 -0
  287. webconf_audit-0.1.1/src/webconf_audit/local/nginx/response_header_semantics.py +398 -0
  288. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/__init__.py +1 -0
  289. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/_default_server_rejection_utils.py +25 -0
  290. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/_exposure_utils.py +55 -0
  291. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/_limit_utils.py +113 -0
  292. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/_proxy_tls_utils.py +88 -0
  293. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/_scope_utils.py +194 -0
  294. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/_value_utils.py +199 -0
  295. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/_variable_taint_utils.py +349 -0
  296. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/access_log_uses_default_format.py +102 -0
  297. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/alias_traversal_classic_pattern.py +82 -0
  298. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/alias_without_trailing_slash.py +61 -0
  299. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/allow_all_with_deny_all.py +56 -0
  300. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/auth_basic_over_http.py +140 -0
  301. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/autoindex_on.py +46 -0
  302. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/client_body_timeout_too_high.py +69 -0
  303. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/client_header_buffer_size_too_large.py +73 -0
  304. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/client_header_timeout_too_high.py +63 -0
  305. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/client_max_body_size_too_large.py +73 -0
  306. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/client_max_body_size_unlimited.py +68 -0
  307. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/content_security_policy_missing_frame_ancestors.py +96 -0
  308. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/content_security_policy_missing_reporting_endpoint.py +89 -0
  309. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/content_security_policy_unsafe.py +147 -0
  310. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/crlf_in_add_header.py +90 -0
  311. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/crlf_in_return.py +100 -0
  312. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/csp_value_review.py +106 -0
  313. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/default_server_not_rejecting_unknown_hosts.py +71 -0
  314. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/default_tls_server_not_rejecting_unknown_hosts.py +140 -0
  315. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/duplicate_listen.py +74 -0
  316. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/error_log_too_restrictive.py +64 -0
  317. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/executable_scripts_allowed_in_uploads.py +151 -0
  318. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/header_utils.py +86 -0
  319. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/hsts_header_unsafe.py +94 -0
  320. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/http3_alt_svc_review.py +274 -0
  321. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/http_method_policy_allows_unapproved.py +84 -0
  322. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/if_in_location.py +58 -0
  323. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/keepalive_timeout_too_high.py +63 -0
  324. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/large_client_header_buffers_too_large.py +89 -0
  325. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/large_client_header_buffers_too_restrictive.py +79 -0
  326. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/limit_conn_invalid_limit.py +48 -0
  327. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/limit_conn_zone_not_per_ip.py +53 -0
  328. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/limit_conn_zone_review.py +92 -0
  329. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/limit_req_unknown_zone.py +57 -0
  330. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/limit_req_zone_invalid_rate.py +51 -0
  331. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/limit_req_zone_not_per_ip.py +53 -0
  332. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/limit_req_zone_rate_review.py +80 -0
  333. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/log_format_missing_fields.py +322 -0
  334. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/merge_slashes_off.py +62 -0
  335. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_access_log.py +95 -0
  336. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_access_restrictions_on_sensitive_locations.py +140 -0
  337. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_allowed_methods_restriction_for_uploads.py +79 -0
  338. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_auth_basic_user_file.py +80 -0
  339. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_backup_file_deny.py +119 -0
  340. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_client_body_timeout.py +59 -0
  341. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_client_header_timeout.py +59 -0
  342. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_client_max_body_size.py +89 -0
  343. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_content_security_policy.py +131 -0
  344. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_error_log.py +108 -0
  345. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_generated_artifact_deny.py +145 -0
  346. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_hidden_files_deny.py +81 -0
  347. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_hsts_header.py +71 -0
  348. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_http2_on_tls_listener.py +97 -0
  349. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_http_method_restrictions.py +77 -0
  350. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_http_to_https_redirect.py +158 -0
  351. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_keepalive_timeout.py +59 -0
  352. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_limit_conn.py +91 -0
  353. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_limit_conn_zone.py +87 -0
  354. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_limit_req.py +91 -0
  355. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_limit_req_zone.py +59 -0
  356. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_log_format.py +88 -0
  357. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_permissions_policy.py +71 -0
  358. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_referrer_policy.py +71 -0
  359. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_send_timeout.py +59 -0
  360. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_server_name.py +60 -0
  361. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_ssl_certificate.py +63 -0
  362. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_ssl_certificate_key.py +70 -0
  363. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_ssl_ciphers.py +80 -0
  364. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_ssl_prefer_server_ciphers.py +91 -0
  365. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_ssl_protocols.py +72 -0
  366. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_x_content_type_options.py +72 -0
  367. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_x_frame_options.py +102 -0
  368. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_x_xss_protection.py +71 -0
  369. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/permissions_policy_unsafe.py +69 -0
  370. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/proxy_missing_source_ip_headers.py +223 -0
  371. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/proxy_pass_user_controlled_destination.py +98 -0
  372. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/proxy_set_header_host_spoofing.py +85 -0
  373. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/proxy_ssl_trusted_certificate_missing.py +76 -0
  374. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/proxy_ssl_verify_disabled.py +72 -0
  375. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/public_autoindex_rate_limit_policy_weak.py +246 -0
  376. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/referrer_policy_unsafe.py +73 -0
  377. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/send_timeout_too_high.py +63 -0
  378. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/sensitive_config_files_restricted.py +150 -0
  379. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/sensitive_location_missing_ip_filter.py +179 -0
  380. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/server_block_accepts_unknown_host.py +148 -0
  381. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/server_tokens_on.py +46 -0
  382. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/sitewide_http_method_policy_missing.py +310 -0
  383. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/ssl_ciphers_weak.py +134 -0
  384. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/ssl_conf_command_options.py +200 -0
  385. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/ssl_session_cache_missing.py +91 -0
  386. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/ssl_session_tickets_disabled.py +52 -0
  387. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/ssl_session_timeout_missing_or_invalid.py +100 -0
  388. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/ssl_stapling_disabled.py +126 -0
  389. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/ssl_stapling_missing_resolver.py +109 -0
  390. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/ssl_stapling_without_verify.py +104 -0
  391. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/tls_listener_utils.py +90 -0
  392. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/weak_ssl_protocols.py +119 -0
  393. webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules_runner.py +76 -0
  394. webconf_audit-0.1.1/src/webconf_audit/local/normalized.py +206 -0
  395. webconf_audit-0.1.1/src/webconf_audit/local/normalizers/__init__.py +91 -0
  396. webconf_audit-0.1.1/src/webconf_audit/local/normalizers/apache_normalizer.py +901 -0
  397. webconf_audit-0.1.1/src/webconf_audit/local/normalizers/iis_normalizer.py +559 -0
  398. webconf_audit-0.1.1/src/webconf_audit/local/normalizers/lighttpd_normalizer.py +676 -0
  399. webconf_audit-0.1.1/src/webconf_audit/local/normalizers/nginx_normalizer.py +505 -0
  400. webconf_audit-0.1.1/src/webconf_audit/local/rule_runner_utils.py +83 -0
  401. webconf_audit-0.1.1/src/webconf_audit/local/rules/__init__.py +1 -0
  402. webconf_audit-0.1.1/src/webconf_audit/local/rules/universal/__init__.py +1 -0
  403. webconf_audit-0.1.1/src/webconf_audit/local/rules/universal/directory_listing_enabled.py +60 -0
  404. webconf_audit-0.1.1/src/webconf_audit/local/rules/universal/listen_on_all_interfaces.py +82 -0
  405. webconf_audit-0.1.1/src/webconf_audit/local/rules/universal/missing_hsts.py +89 -0
  406. webconf_audit-0.1.1/src/webconf_audit/local/rules/universal/missing_security_header.py +378 -0
  407. webconf_audit-0.1.1/src/webconf_audit/local/rules/universal/server_identification_disclosed.py +69 -0
  408. webconf_audit-0.1.1/src/webconf_audit/local/rules/universal/tls_intent_without_config.py +120 -0
  409. webconf_audit-0.1.1/src/webconf_audit/local/rules/universal/tls_required_for_authenticated_routes.py +82 -0
  410. webconf_audit-0.1.1/src/webconf_audit/local/rules/universal/weak_tls_ciphers.py +87 -0
  411. webconf_audit-0.1.1/src/webconf_audit/local/rules/universal/weak_tls_protocol.py +70 -0
  412. webconf_audit-0.1.1/src/webconf_audit/local/sensitive_artifact_policy.py +67 -0
  413. webconf_audit-0.1.1/src/webconf_audit/local/universal_rules.py +53 -0
  414. webconf_audit-0.1.1/src/webconf_audit/models.py +171 -0
  415. webconf_audit-0.1.1/src/webconf_audit/openssl_conf_policy.py +56 -0
  416. webconf_audit-0.1.1/src/webconf_audit/policy_models.py +1578 -0
  417. webconf_audit-0.1.1/src/webconf_audit/report/__init__.py +1556 -0
  418. webconf_audit-0.1.1/src/webconf_audit/rule_registry.py +530 -0
  419. webconf_audit-0.1.1/src/webconf_audit/rule_severity.py +505 -0
  420. webconf_audit-0.1.1/src/webconf_audit/rule_standards.py +2153 -0
  421. webconf_audit-0.1.1/src/webconf_audit/standard_catalog.py +431 -0
  422. webconf_audit-0.1.1/src/webconf_audit/standards.py +591 -0
  423. webconf_audit-0.1.1/src/webconf_audit/suppressions.py +451 -0
  424. webconf_audit-0.1.1/src/webconf_audit/tls_cipher_policy.py +152 -0
  425. webconf_audit-0.1.1/uv.lock +719 -0
@@ -0,0 +1,27 @@
1
+ # Python
2
+ __pycache__/
3
+ *.pyc
4
+ src/*.egg-info/
5
+
6
+ # Virtual environments
7
+ .venv/
8
+
9
+ # Tooling caches
10
+ .pytest_cache/
11
+ .ruff_cache/
12
+ .mypy_cache/
13
+
14
+ # Editors and IDEs
15
+ .vscode/
16
+
17
+ # Local working directory and generated reports
18
+ /.lab/
19
+ /.tmp/
20
+ /.codex-tmp/
21
+ /.codex-docx-render*/
22
+ /tmpkd_ok9wt/
23
+ /demo/local_admin/reports/
24
+
25
+ # Office documents and temp files
26
+ /*.docx
27
+ /~$*.docx
@@ -0,0 +1,85 @@
1
+ # Changelog
2
+
3
+ All notable project changes are recorded here.
4
+
5
+ This project is still in the pre-1.0 stage. Public releases use `vX.Y.Z` Git
6
+ tags, and each released version must have a matching section in this file before
7
+ release artifacts are prepared.
8
+
9
+ ## [Unreleased]
10
+
11
+ ## [0.1.1] - 2026-06-16
12
+
13
+ - Add a schema-versioned packaged control-source coverage ledger, strict
14
+ registry reconciliation, deterministic Markdown/JSON views, additive
15
+ `coverage validate/show/export` commands, and release checks for document
16
+ and package-artifact drift without increasing any coverage numerator.
17
+ - Add deterministic offline crosswalk validation, canonical OWASP/ASVS/PCI
18
+ identifiers, and declared-versus-derived provenance in rule catalog and
19
+ report JSON; conservatively correct ASVS, OWASP Top 10:2025, and PCI DSS
20
+ coverage claims without changing detector behavior.
21
+ - Expand OpenAPI / Swagger external probes with common JSON schema paths and
22
+ map Swagger/OpenAPI exposure to ASVS v5.0.0-13.4.5 partial documentation
23
+ endpoint coverage.
24
+ - Expand dependency-manifest external probes with Java Maven/Gradle and
25
+ .NET/NuGet manifest paths, and map the rule to ASVS v5.0.0-13.4.6 partial
26
+ version-disclosure coverage.
27
+ - Add exposed Nginx, Apache HTTP Server, and Lighttpd configuration-file
28
+ probes to the external safe-probe catalog.
29
+ - Add policy-gated `nginx.response_headers` control assessments with shared
30
+ Nginx `add_header` / `add_header_inherit` semantics, a structured CSP AST,
31
+ and route-manifest evaluation for CSP, Referrer-Policy, HSTS,
32
+ `X-Content-Type-Options`, and COOP without changing canonical coverage
33
+ percentages.
34
+ - Add declared endpoint/SNI TLS inventory analysis with a dedicated
35
+ `analyze-tls-inventory` command, typed `external.tls_inventories` policy
36
+ input, bounded TLS observation records, and follow-up-04-compatible native
37
+ control assessment evidence without changing canonical coverage percentages.
38
+ - Correct the reviewed no-policy Nginx header edge cases called out by the
39
+ follow-up design: location or `if in location` header replacement can now
40
+ surface a missing CSP that was previously hidden, report-only CSP does not
41
+ satisfy enforcement, and multiple enforcing CSP headers use conjunction
42
+ semantics for unsafe-inline / unsafe-eval checks.
43
+ - Add application settings JSON exposure probes to the external safe-probe
44
+ catalog.
45
+ - Document the TLS source-coverage explanation across NIST, PCI DSS, ISO/IEC
46
+ 27002, and FSTEC mappings.
47
+ - Add JavaScript source map exposure probes to the external safe-probe catalog.
48
+ - Expand dependency-manifest external probes with Python, Ruby, Go, and Rust
49
+ project manifest and lockfile paths.
50
+ - Rework the project roadmap around source coverage from the pre-diploma
51
+ benchmark and relevance sources.
52
+ - Expand the external safe-probe catalog with additional environment-file,
53
+ database-dump, dependency-manifest, and archive path variants for existing
54
+ catalog-backed rules.
55
+ - Document the standards-mapping health snapshot after the `v0.1.0` tag and
56
+ pin the remaining mapping backlog to safe-probe catalog growth.
57
+ - Continue parser/effective-configuration precision work for the current
58
+ four-server scope.
59
+ - Continue standards mapping, safe external probe growth, report explanation
60
+ improvements, and release-readiness work.
61
+
62
+ ## [0.1.0] - 2026-06-05
63
+
64
+ ### Added
65
+
66
+ - Local static analyzers for Nginx, Apache HTTP Server, Lighttpd, and Microsoft
67
+ IIS.
68
+ - External safe probing for HTTP, HTTPS, TLS, certificate, redirect, cookie,
69
+ CORS, method, fingerprinting, and sensitive-path observations.
70
+ - Central rule registry with `list-rules`, rule metadata, standards mapping,
71
+ and profile-based severity calibration.
72
+ - Text and JSON reports with stable finding fingerprints, standards grouping,
73
+ and repeated-finding grouping.
74
+ - CI-oriented exit behavior through `--fail-on` and `--fail-on-new`.
75
+ - Suppression files with required reasons and expiry dates.
76
+ - Baseline creation and diff reporting for new, unchanged, resolved, and
77
+ suppressed findings.
78
+ - Repository CI, optional Docker-backed integration checks, and a repeatable
79
+ release check that builds and smoke-tests installed package artifacts.
80
+
81
+ ### Documented
82
+
83
+ - Current project status, architecture, roadmap, severity methodology,
84
+ standards coverage, CI integration, real-world-style fixture testing, and
85
+ release preparation boundaries.
@@ -0,0 +1,12 @@
1
+ Metadata-Version: 2.4
2
+ Name: webconf-audit
3
+ Version: 0.1.1
4
+ Summary: Web server configuration security audit tool
5
+ Requires-Python: >=3.10
6
+ Requires-Dist: click<9.0,>=8.1
7
+ Requires-Dist: cryptography<47,>=46.0.7
8
+ Requires-Dist: defusedxml<1.0,>=0.7
9
+ Requires-Dist: pydantic<3.0,>=2.12.5
10
+ Requires-Dist: pyopenssl<27,>=26.0.0
11
+ Requires-Dist: pyyaml<7,>=6.0.3
12
+ Requires-Dist: typer<1.0,>=0.24.1
@@ -0,0 +1,420 @@
1
+ # webconf-audit
2
+
3
+ A security auditing tool for web server configurations.
4
+
5
+ `webconf-audit` has two independent analysis modes:
6
+
7
+ - **Local** — static analysis of configuration files on the host that
8
+ runs the web server.
9
+ - **External** — black-box probing of a running web endpoint over the
10
+ network using observable HTTP, HTTPS, and TLS signals.
11
+
12
+ ## Supported servers
13
+
14
+ Local analysis covers four web servers:
15
+
16
+ - Nginx
17
+ - Apache HTTP Server
18
+ - Lighttpd
19
+ - Microsoft IIS
20
+
21
+ External probing is server-agnostic; a few checks are activated only
22
+ after fingerprinting identifies the underlying server (for example,
23
+ Apache `mod_status` exposure or IIS detailed error pages).
24
+
25
+ ## Installation
26
+
27
+ `webconf-audit` requires Python 3.10 or later.
28
+
29
+ ```bash
30
+ pip install .
31
+ ```
32
+
33
+ The package exposes a `webconf-audit` console entry point. Every
34
+ command is also available via `python -m webconf_audit.cli`.
35
+
36
+ ## Quick start
37
+
38
+ ### Local analysis
39
+
40
+ ```bash
41
+ webconf-audit analyze-nginx /etc/nginx/nginx.conf
42
+ webconf-audit analyze-apache /etc/apache2/httpd.conf
43
+ webconf-audit analyze-lighttpd /etc/lighttpd/lighttpd.conf
44
+ webconf-audit analyze-iis C:\inetpub\wwwroot\web.config
45
+ webconf-audit analyze-iis C:\inetpub\wwwroot\web.config --tls-registry schannel.json
46
+ ```
47
+
48
+ ### External analysis
49
+
50
+ ```bash
51
+ webconf-audit analyze-external https://example.com
52
+ webconf-audit analyze-external example.com --ports 80,443,8443
53
+ webconf-audit analyze-external example.com --no-scan-ports
54
+ ```
55
+
56
+ ### Output formats
57
+
58
+ Every `analyze-*` command supports text (default) and JSON output:
59
+
60
+ ```bash
61
+ webconf-audit analyze-nginx config.conf --format json
62
+ webconf-audit analyze-external example.com -f json
63
+ webconf-audit analyze-nginx config.conf --group-by standard
64
+ webconf-audit analyze-nginx config.conf --group-repeated
65
+ ```
66
+
67
+ The JSON envelope contains a generation timestamp, a summary, the
68
+ per-target results, the deduplicated findings list, repeated finding groups
69
+ under `finding_groups`, standards references under each finding and the
70
+ top-level `standards` summary, and the issues list. Schema version 1 also
71
+ adds top-level `schema_version` and `generator` fields so downstream tooling
72
+ can verify the report format, generator package name and version, and registry
73
+ revision. See [docs/report-format.md](docs/report-format.md) for the full JSON
74
+ contract.
75
+
76
+ When an explicit policy is supplied, JSON results also include additive
77
+ `result.metadata.audit_policy` and `result.metadata.rule_execution` entries.
78
+ See [docs/audit-policy.md](docs/audit-policy.md) and
79
+ [docs/report-format.md](docs/report-format.md).
80
+
81
+ Use `--group-repeated` with text output to collapse repeated findings that
82
+ share the same rule, severity, recommendation, and report grouping cause while
83
+ preserving each exact source location.
84
+
85
+ Use `--group-by standard` with text output to review findings by mapped
86
+ standards such as CWE, OWASP Top 10, and OWASP ASVS. Findings with no mapped
87
+ standard are grouped under `Unmapped`.
88
+
89
+ ### CI gating
90
+
91
+ Every `analyze-*` command can act as a CI gate with `--fail-on`:
92
+
93
+ ```bash
94
+ webconf-audit analyze-nginx nginx.conf --fail-on medium
95
+ webconf-audit analyze-external example.com --fail-on high --format json
96
+ ```
97
+
98
+ Exit codes in CI-gating mode:
99
+
100
+ - `0` - analysis completed and no findings at or above the selected severity
101
+ were found.
102
+ - `1` - analysis produced an execution or configuration error.
103
+ - `2` - analysis completed and at least one finding met the selected severity
104
+ threshold.
105
+
106
+ JSON findings include a stable `fingerprint` field that is designed for CI,
107
+ suppressions, and baseline/diff reporting.
108
+
109
+ When `--fail-on` is used, `.webconf-audit-ignore.yml` is read from the current
110
+ working directory if it exists. Suppressions require `rule_id`, either a
111
+ `fingerprint` or locator fields, a human-readable `reason`, and an `expires`
112
+ date. Expired suppressions stop hiding findings and are reported as analysis
113
+ issues.
114
+
115
+ ```yaml
116
+ suppressions:
117
+ - rule_id: nginx.server_tokens_on
118
+ source: nginx.conf
119
+ line: 12
120
+ reason: Accepted for staging until the shared image is rebuilt.
121
+ expires: 2026-12-31
122
+ ```
123
+
124
+ Use `--suppressions <path>` to point at a non-default suppression file. Full CI
125
+ examples are available in [docs/ci-integration.md](docs/ci-integration.md).
126
+
127
+ ### Baseline and diff mode
128
+
129
+ Use `--write-baseline` to capture the current accepted finding set:
130
+
131
+ ```bash
132
+ webconf-audit analyze-nginx nginx.conf --write-baseline webconf-audit-baseline.json
133
+ ```
134
+
135
+ Use `--baseline` to compare a later run against that known state. Text output
136
+ shows a short diff summary, and JSON output includes `new_findings`,
137
+ `unchanged_findings`, `resolved_findings`, and `suppressed_findings`.
138
+
139
+ ```bash
140
+ webconf-audit analyze-nginx nginx.conf --baseline webconf-audit-baseline.json
141
+ ```
142
+
143
+ CI can block only new debt with `--fail-on-new` while leaving existing baseline
144
+ findings unchanged:
145
+
146
+ ```bash
147
+ webconf-audit analyze-nginx nginx.conf --baseline webconf-audit-baseline.json --fail-on-new medium
148
+ ```
149
+
150
+ ### Explicit audit policy
151
+
152
+ Policies are always opt-in and must be passed explicitly:
153
+
154
+ ```bash
155
+ webconf-audit policy validate --policy .webconf-audit-policy.yml
156
+ webconf-audit policy show --policy .webconf-audit-policy.yml --mode local --server-type nginx --target /etc/nginx/nginx.conf
157
+ webconf-audit analyze-nginx /etc/nginx/nginx.conf --policy .webconf-audit-policy.yml
158
+ ```
159
+
160
+ Policies request evidence review scope and opt-in rule tags, but they do not
161
+ hide findings or raise coverage percentages by themselves.
162
+
163
+ ### Control assessment
164
+
165
+ Assessment is a separate step that consumes a versioned analysis report with
166
+ embedded resolved policy and rule-execution metadata:
167
+
168
+ ```bash
169
+ webconf-audit analyze-nginx nginx.conf --policy .webconf-audit-policy.yml --format json > analysis.json
170
+ webconf-audit assess --report analysis.json
171
+ webconf-audit assess --report analysis.json --format json
172
+ webconf-audit assess --report analysis.json --fail-on fail,indeterminate
173
+ ```
174
+
175
+ `assess` produces a conservative evidence report for resolved policy controls.
176
+ It does not emit a compliance percentage or certification claim, and a
177
+ zero-finding run does not automatically become `pass`.
178
+
179
+ Assessment exit codes:
180
+
181
+ - `0` - assessment was produced and no requested gate status was present.
182
+ - `1` - the report, ledger, policy verification, or output path could not be
183
+ trusted.
184
+ - `2` - invalid CLI usage.
185
+ - `3` - assessment was produced successfully and a requested `--fail-on`
186
+ status was present.
187
+
188
+ Use `--policy` with `assess` only to verify that the supplied policy resolves
189
+ to the same embedded hashes as the original analysis report. See
190
+ [docs/control-assessment.md](docs/control-assessment.md).
191
+
192
+ ## Local analysis pipeline
193
+
194
+ Each local analyzer:
195
+
196
+ 1. Reads the main configuration file passed on the command line.
197
+ 2. Resolves includes or rebuilds the inheritance chain.
198
+ 3. Builds an effective configuration where the server model
199
+ requires it.
200
+ 4. Runs server-specific rules over the parsed/effective form.
201
+ 5. Runs universal rules over a normalized representation shared by
202
+ all four servers.
203
+ 6. Returns a structured result with findings, technical issues, and
204
+ source metadata.
205
+
206
+ What each analyzer handles:
207
+
208
+ - **Nginx** — tokenizer, parser, `include` resolution with glob
209
+ support and cycle detection, AST traversal, source-location
210
+ tracking on every directive.
211
+ - **Apache** — `Include` and `IncludeOptional` resolution,
212
+ `.htaccess` discovery from `Directory` blocks and `DocumentRoot`,
213
+ `AllowOverride` filtering, per-`VirtualHost` analysis contexts,
214
+ `Location` and `LocationMatch` layering, header merge semantics.
215
+ - **Lighttpd** — variable expansion, `include` resolution,
216
+ `include_shell` handling (skipped with a warning by default, with
217
+ explicit opt-in execution via `--execute-shell`),
218
+ conditional blocks such as `$HTTP["host"] == "..."`, optional
219
+ per-host targeted analysis via `--host`.
220
+ - **IIS** — safe XML parsing through `defusedxml`, three-level
221
+ inheritance chain `machine.config` → `applicationHost.config`
222
+ → `web.config`, `<add>` / `<remove>` / `<clear>` collection
223
+ semantics, `<location>` inheritance, `--machine-config` option for
224
+ explicit base config selection, and Windows SChannel TLS registry
225
+ enrichment by default on Windows hosts. Use `--tls-registry <path>`
226
+ for a JSON export from the target IIS server or `--no-tls-registry`
227
+ to disable live registry enrichment.
228
+
229
+ Each finding records severity, description, remediation hint, and a
230
+ source reference: file and line for text configurations, file and XML
231
+ path for IIS, observable endpoint or header for external mode.
232
+
233
+ ## External analysis
234
+
235
+ External mode probes a target without access to its configuration. It
236
+ performs:
237
+
238
+ - Port discovery for bare-host targets (default ports: 80, 443, 8080,
239
+ 8443, 8000, 8888, 3000, 5000, 9443; can be overridden with
240
+ `--ports` or disabled with `--no-scan-ports`).
241
+ - HTTP and HTTPS probing with `HEAD` → `GET` fallback plus a separate
242
+ `OPTIONS` flow.
243
+ - TLS enrichment: negotiated protocol and cipher, supported TLS
244
+ versions, certificate chain completeness, SAN extraction.
245
+ - Server fingerprinting from response headers, default error pages,
246
+ and reactions to deliberately malformed requests.
247
+ - Sensitive-path probing for paths such as `/.git/HEAD`, `/.env`,
248
+ `/.htaccess`, `/phpinfo.php`, `/web.config`, `/robots.txt`,
249
+ `/sitemap.xml`.
250
+ - Redirect chain analysis: loops, scheme switches, off-domain hops.
251
+
252
+ External rules cover HTTPS availability and HSTS, common security
253
+ headers, server identification, cookies, CORS, HTTP methods,
254
+ sensitive paths, TLS protocol versions, and certificate validity.
255
+
256
+ ## Rule catalog
257
+
258
+ The rule catalog is browsable through the CLI:
259
+
260
+ ```bash
261
+ webconf-audit list-rules
262
+ webconf-audit list-rules --category local --server-type nginx
263
+ webconf-audit list-rules --severity high --tag tls
264
+ webconf-audit list-rules --format json
265
+ ```
266
+
267
+ Filters: `--category` (`local`, `external`, `universal`),
268
+ `--server-type` (`nginx`, `apache`, `lighttpd`, `iis`),
269
+ `--severity` (`critical`, `high`, `medium`, `low`, `info`),
270
+ `--tag`.
271
+
272
+ Use `--format json` to get a machine-readable inventory with the full
273
+ `RuleMeta` payload (rule_id, severity, category, server_type,
274
+ input_kind, tags, severity_profile, standards, order, etc.). The full
275
+ inventory and the standards mapping plan live in
276
+ [docs/rule-coverage.md](docs/rule-coverage.md). Severity calibration is
277
+ documented in [docs/severity-methodology.md](docs/severity-methodology.md).
278
+ Each standard reference includes additive `origin` and `derived_from` fields,
279
+ so independently reviewed mappings can be distinguished from automatic
280
+ edition alignments.
281
+
282
+ ## Control-source coverage ledger
283
+
284
+ The counted coverage snapshot is stored in the versioned package file
285
+ `src/webconf_audit/data/control_source_coverage.yml`. It records stable source
286
+ and item IDs, applicability, grouped requirements, evidence limitations,
287
+ registry claims, exclusions, and review provenance. The ledger describes
288
+ implemented scanner evidence within the documented scope; it is not a claim
289
+ of certification or target compliance.
290
+
291
+ Explicit audit policies are a separate layer on top of the ledger. They can
292
+ select sources and request opt-in evidence, but they do not change the counted
293
+ coverage snapshot on their own. Per-target status belongs to the separate
294
+ assessment artifact, not to the coverage percentages shown here.
295
+
296
+ Validate or inspect the shipped ledger with:
297
+
298
+ ```bash
299
+ webconf-audit coverage validate
300
+ webconf-audit coverage validate --format json
301
+ webconf-audit coverage reconcile --check
302
+ webconf-audit coverage reconcile --check --format json
303
+ webconf-audit coverage reconcile --write
304
+ webconf-audit coverage show --source owasp-asvs-5.0.0
305
+ webconf-audit coverage show --status partial --format json
306
+ webconf-audit coverage export --format markdown
307
+ ```
308
+
309
+ Custom local ledgers can be supplied with `--ledger PATH`. Exports refuse to
310
+ overwrite an existing file unless `--force` is given. The `reconcile`
311
+ maintainer command checks or atomically rewrites the tracked coverage
312
+ documents from the packaged ledger. The generated human-readable view remains available at
313
+ [docs/control-source-coverage-tracker.md](docs/control-source-coverage-tracker.md);
314
+ the methodology and headline summary are documented in
315
+ [docs/benchmarks-covering.md](docs/benchmarks-covering.md).
316
+
317
+ The catalog currently contains 473 rules:
318
+
319
+ | Category | Rules |
320
+ |----------|------:|
321
+ | Local — Nginx | 96 |
322
+ | Local — Apache | 88 |
323
+ | Local — Lighttpd | 50 |
324
+ | Local — IIS | 53 |
325
+ | Universal (local) | 14 |
326
+ | External | 172 |
327
+
328
+ Ten rules in the inventory above are opt-in `policy-review` rules.
329
+ They are excluded from default `analyze-*` runs and surfaced only when
330
+ `--enable-policy-review` is passed. See
331
+ [docs/rule-coverage.md](docs/rule-coverage.md#documented-scope-limits)
332
+ for the rationale.
333
+
334
+ ## Reporting
335
+
336
+ Results are aggregated into a `ReportData` structure with a summary by
337
+ severity, analysis mode, server type, and mapped standards. Two output
338
+ formatters are available:
339
+
340
+ - `TextFormatter` — human-readable command-line output.
341
+ - `JsonFormatter` — machine-readable output suitable for downstream
342
+ tooling.
343
+
344
+ Universal rule findings are deduplicated when a more specific
345
+ server-specific rule has already reported the same issue at the same
346
+ location.
347
+
348
+ ## Project status
349
+
350
+ The post-practice project baseline is recorded in
351
+ [docs/project-status.md](docs/project-status.md). It summarizes the current
352
+ implemented scope, validation status, known boundaries, and the next
353
+ graduation-project work items.
354
+
355
+ User-visible changes are tracked in [CHANGELOG.md](CHANGELOG.md). Release
356
+ preparation, versioning, tag rules, and package smoke checks are documented in
357
+ [docs/release.md](docs/release.md).
358
+
359
+ ## Demo
360
+
361
+ A working local-analysis demo with reproducible Docker-based syntax
362
+ checks is provided in `demo/local_admin/`. See
363
+ [demo/local_admin/README.md](demo/local_admin/README.md) for the
364
+ full walkthrough.
365
+
366
+ A separate defensive validation dataset with public-source-derived config
367
+ fixtures lives in [demo/real_world_configs/](demo/real_world_configs/).
368
+ Security-focused known-bad/known-good fixture testing is documented in
369
+ [docs/testing-real-world-configs.md](docs/testing-real-world-configs.md).
370
+
371
+ ## Roadmap
372
+
373
+ The current development plan is tracked in
374
+ [docs/roadmap.md](docs/roadmap.md).
375
+
376
+ Near-term work is focused on parser/effective-configuration precision,
377
+ standards-driven coverage, safe external probe growth, false-positive
378
+ reduction, and release preparation. New server-family support should be planned
379
+ separately after the current four-server core is stable.
380
+
381
+ ## Development
382
+
383
+ Install the development dependency group:
384
+
385
+ ```bash
386
+ uv sync --group dev --locked
387
+ ```
388
+
389
+ Run the same fast checks as the pull-request CI workflow:
390
+
391
+ ```bash
392
+ uv run --locked ruff check .
393
+ uv run --locked python -m compileall -q src
394
+ uv run --locked pytest tests --ignore=tests/integration_external --ignore=tests/integration_local --ignore=tests/integration_rule_coverage --ignore=tests/integration_real_world_cross_mode -q
395
+ uv run --locked webconf-audit list-rules
396
+ uv run --locked interrogate -c pyproject.toml
397
+ ```
398
+
399
+ The `interrogate` check enforces a 40% docstring coverage floor over
400
+ `src/` with sensible exclusions (private / dunder / nested helpers).
401
+ The threshold reflects the project's "default to no comments, only
402
+ explain non-obvious WHY" convention while still requiring docstrings
403
+ on module entries, data models, and the public API surface.
404
+
405
+ Run the Docker-backed integration slice when Docker Engine is available:
406
+
407
+ ```bash
408
+ uv run --locked pytest tests/integration_external tests/integration_local tests/integration_rule_coverage -q
409
+ ```
410
+
411
+ Run the release check before preparing a public package artifact:
412
+
413
+ ```bash
414
+ uv run --locked python scripts/release_check.py
415
+ ```
416
+
417
+ The release check builds wheel and source distribution artifacts, installs the
418
+ wheel into a clean virtual environment, verifies the installed console entry
419
+ point, and runs a small installed-package smoke test. See
420
+ [docs/release.md](docs/release.md) for the full checklist.
@@ -0,0 +1,88 @@
1
+ [project]
2
+ name = "webconf-audit"
3
+ version = "0.1.1"
4
+ description = "Web server configuration security audit tool"
5
+ requires-python = ">=3.10"
6
+ dependencies = [
7
+ # In the absence of a dedicated oldest-supported CI job, keep the
8
+ # lower bounds aligned with the dependency set exercised by the
9
+ # current test environment. Cap the next major so SemVer breakage
10
+ # does not silently land via a fresh `pip install`.
11
+ "click>=8.1,<9.0",
12
+ "defusedxml>=0.7,<1.0",
13
+ "cryptography>=46.0.7,<47",
14
+ "pydantic>=2.12.5,<3.0",
15
+ "pyOpenSSL>=26.0.0,<27",
16
+ "PyYAML>=6.0.3,<7",
17
+ "typer>=0.24.1,<1.0",
18
+ ]
19
+
20
+ [project.scripts]
21
+ webconf-audit = "webconf_audit.cli:app"
22
+
23
+ [build-system]
24
+ requires = ["hatchling>=1.28,<2"]
25
+ build-backend = "hatchling.build"
26
+
27
+ [tool.hatch.build.targets.wheel]
28
+ packages = ["src/webconf_audit"]
29
+
30
+ [tool.hatch.build.targets.sdist]
31
+ include = [
32
+ "/src",
33
+ "/README.md",
34
+ "/CHANGELOG.md",
35
+ "/LICENSE",
36
+ "/pyproject.toml",
37
+ "/uv.lock",
38
+ ]
39
+
40
+ [dependency-groups]
41
+ dev = [
42
+ "interrogate>=1.7.0,<2",
43
+ "pytest>=9.0.3,<10",
44
+ "ruff>=0.15.12,<1",
45
+ ]
46
+
47
+ [tool.ruff]
48
+ line-length = 100
49
+ exclude = [".tmp"]
50
+
51
+ [tool.pytest.ini_options]
52
+ testpaths = ["tests"]
53
+ cache_dir = ".tmp/pytest-cache"
54
+ norecursedirs = [
55
+ ".git",
56
+ ".venv",
57
+ ".tmp",
58
+ "pytest-run-*",
59
+ "pytest-tmp-*",
60
+ ]
61
+
62
+ # Docstring coverage. The 40% floor reflects the project convention
63
+ # "Default to writing no comments. Only add one when the WHY is
64
+ # non-obvious." Public API surfaces, data models, and module-level
65
+ # docstrings are documented; small internal helpers with
66
+ # self-documenting names are intentionally left bare. The exclusions
67
+ # below skip categories where docstrings add noise rather than value
68
+ # (private/dunder methods, nested helpers, overloaded stubs).
69
+ [tool.interrogate]
70
+ fail-under = 40
71
+ ignore-init-method = true
72
+ ignore-init-module = true
73
+ ignore-magic = true
74
+ ignore-private = true
75
+ ignore-semiprivate = true
76
+ ignore-nested-functions = true
77
+ ignore-nested-classes = true
78
+ ignore-overloaded-functions = true
79
+ ignore-property-decorators = true
80
+ ignore-property-setters = true
81
+ exclude = [
82
+ "tests",
83
+ ".tmp",
84
+ ".venv",
85
+ ".codex-tmp",
86
+ ".codex-docx-render*",
87
+ "tmpkd_ok9wt",
88
+ ]
File without changes
File without changes