credsweeper 1.11.6__tar.gz → 1.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 (162) hide show
  1. {credsweeper-1.11.6 → credsweeper-1.12.0}/PKG-INFO +1 -1
  2. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/__init__.py +1 -1
  3. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/common/keyword_pattern.py +13 -15
  4. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/common/morpheme_checklist.txt +2 -0
  5. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/config/config.py +2 -2
  6. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/credentials/line_data.py +20 -0
  7. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/__init__.py +1 -1
  8. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/filter.py +3 -1
  9. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/group/group.py +22 -31
  10. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/group/password_keyword.py +7 -6
  11. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/group/token_pattern.py +1 -1
  12. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/group/url_credentials_group.py +6 -6
  13. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/group/weird_base36_token.py +1 -1
  14. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/group/weird_base64_token.py +1 -1
  15. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/line_git_binary_check.py +2 -1
  16. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/line_specific_key_check.py +2 -1
  17. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/line_uue_part_check.py +2 -1
  18. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_allowlist_check.py +2 -1
  19. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_array_dictionary_check.py +5 -3
  20. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_atlassian_token_check.py +2 -1
  21. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_azure_token_check.py +2 -1
  22. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_base32_data_check.py +4 -1
  23. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_base64_data_check.py +2 -1
  24. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_base64_encoded_pem_check.py +2 -1
  25. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_base64_key_check.py +2 -1
  26. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_base64_part_check.py +2 -1
  27. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_basic_auth_check.py +2 -1
  28. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_blocklist_check.py +3 -1
  29. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_camel_case_check.py +2 -1
  30. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_couple_keyword_check.py +3 -1
  31. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_dictionary_keyword_check.py +3 -1
  32. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_discord_bot_check.py +2 -1
  33. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_entropy_base_check.py +2 -1
  34. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_file_path_check.py +3 -1
  35. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_github_check.py +2 -1
  36. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_grafana_check.py +2 -1
  37. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_grafana_service_check.py +2 -1
  38. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_hex_number_check.py +2 -1
  39. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_jfrog_token_check.py +2 -1
  40. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_json_web_key_check.py +2 -1
  41. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_json_web_token_check.py +2 -1
  42. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_last_word_check.py +3 -1
  43. credsweeper-1.11.6/credsweeper/filters/value_dictionary_value_length_check.py → credsweeper-1.12.0/credsweeper/filters/value_length_check.py +9 -3
  44. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_method_check.py +2 -1
  45. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_not_allowed_pattern_check.py +2 -1
  46. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_not_part_encoded_check.py +1 -1
  47. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_number_check.py +2 -1
  48. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_pattern_check.py +58 -38
  49. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_similarity_check.py +3 -1
  50. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_split_keyword_check.py +2 -1
  51. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_string_type_check.py +6 -4
  52. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_token_base_check.py +2 -1
  53. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_token_check.py +3 -2
  54. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/ml_model/features/__init__.py +1 -0
  55. credsweeper-1.12.0/credsweeper/ml_model/features/morpheme_dense.py +26 -0
  56. credsweeper-1.12.0/credsweeper/ml_model/features/rule_severity.py +21 -0
  57. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/ml_model/features/word_in_path.py +4 -1
  58. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/ml_model/ml_config.json +130 -24
  59. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/ml_model/ml_model.onnx +0 -0
  60. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/rules/config.yaml +50 -23
  61. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/scanner/scanner.py +4 -3
  62. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/secret/config.json +2 -2
  63. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/utils/util.py +2 -0
  64. credsweeper-1.11.6/credsweeper/ml_model/features/morpheme_dense.py +0 -19
  65. {credsweeper-1.11.6 → credsweeper-1.12.0}/.gitignore +0 -0
  66. {credsweeper-1.11.6 → credsweeper-1.12.0}/LICENSE +0 -0
  67. {credsweeper-1.11.6 → credsweeper-1.12.0}/README.md +0 -0
  68. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/__main__.py +0 -0
  69. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/app.py +0 -0
  70. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/common/__init__.py +0 -0
  71. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/common/constants.py +0 -0
  72. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/common/keyword_checklist.py +0 -0
  73. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/common/keyword_checklist.txt +0 -0
  74. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/config/__init__.py +0 -0
  75. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/credentials/__init__.py +0 -0
  76. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/credentials/augment_candidates.py +0 -0
  77. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/credentials/candidate.py +0 -0
  78. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/credentials/candidate_group_generator.py +0 -0
  79. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/credentials/candidate_key.py +0 -0
  80. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/credentials/credential_manager.py +0 -0
  81. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/deep_scanner/__init__.py +0 -0
  82. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/deep_scanner/abstract_scanner.py +0 -0
  83. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/deep_scanner/byte_scanner.py +0 -0
  84. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/deep_scanner/bzip2_scanner.py +0 -0
  85. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/deep_scanner/deb_scanner.py +0 -0
  86. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/deep_scanner/deep_scanner.py +0 -0
  87. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/deep_scanner/docx_scanner.py +0 -0
  88. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/deep_scanner/eml_scanner.py +0 -0
  89. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/deep_scanner/encoder_scanner.py +0 -0
  90. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/deep_scanner/gzip_scanner.py +0 -0
  91. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/deep_scanner/html_scanner.py +0 -0
  92. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/deep_scanner/jclass_scanner.py +0 -0
  93. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/deep_scanner/jks_scanner.py +0 -0
  94. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/deep_scanner/lang_scanner.py +0 -0
  95. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/deep_scanner/lzma_scanner.py +0 -0
  96. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/deep_scanner/mxfile_scanner.py +0 -0
  97. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/deep_scanner/patch_scanner.py +0 -0
  98. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/deep_scanner/pdf_scanner.py +0 -0
  99. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/deep_scanner/pkcs_scanner.py +0 -0
  100. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/deep_scanner/pptx_scanner.py +0 -0
  101. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/deep_scanner/rpm_scanner.py +0 -0
  102. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/deep_scanner/sqlite3_scanner.py +0 -0
  103. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/deep_scanner/tar_scanner.py +0 -0
  104. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/deep_scanner/tmx_scanner.py +0 -0
  105. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/deep_scanner/xlsx_scanner.py +0 -0
  106. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/deep_scanner/xml_scanner.py +0 -0
  107. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/deep_scanner/zip_scanner.py +0 -0
  108. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/file_handler/__init__.py +0 -0
  109. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/file_handler/abstract_provider.py +0 -0
  110. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/file_handler/analysis_target.py +0 -0
  111. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/file_handler/byte_content_provider.py +0 -0
  112. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/file_handler/content_provider.py +0 -0
  113. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/file_handler/data_content_provider.py +0 -0
  114. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/file_handler/descriptor.py +0 -0
  115. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/file_handler/diff_content_provider.py +0 -0
  116. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/file_handler/file_path_extractor.py +0 -0
  117. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/file_handler/files_provider.py +0 -0
  118. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/file_handler/patches_provider.py +0 -0
  119. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/file_handler/string_content_provider.py +0 -0
  120. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/file_handler/struct_content_provider.py +0 -0
  121. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/file_handler/text_content_provider.py +0 -0
  122. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/group/__init__.py +0 -0
  123. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/group/general_keyword.py +0 -0
  124. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/group/general_pattern.py +0 -0
  125. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_entropy_base32_check.py +0 -0
  126. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_entropy_base36_check.py +0 -0
  127. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_entropy_base64_check.py +0 -0
  128. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_token_base32_check.py +0 -0
  129. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_token_base36_check.py +0 -0
  130. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/filters/value_token_base64_check.py +0 -0
  131. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/logger/__init__.py +0 -0
  132. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/logger/logger.py +0 -0
  133. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/ml_model/__init__.py +0 -0
  134. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/ml_model/features/entropy_evaluation.py +0 -0
  135. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/ml_model/features/feature.py +0 -0
  136. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/ml_model/features/file_extension.py +0 -0
  137. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/ml_model/features/has_html_tag.py +0 -0
  138. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/ml_model/features/is_secret_numeric.py +0 -0
  139. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/ml_model/features/length_of_attribute.py +0 -0
  140. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/ml_model/features/rule_name.py +0 -0
  141. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/ml_model/features/search_in_attribute.py +0 -0
  142. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/ml_model/features/word_in.py +0 -0
  143. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/ml_model/features/word_in_postamble.py +0 -0
  144. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/ml_model/features/word_in_preamble.py +0 -0
  145. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/ml_model/features/word_in_transition.py +0 -0
  146. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/ml_model/features/word_in_value.py +0 -0
  147. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/ml_model/features/word_in_variable.py +0 -0
  148. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/ml_model/ml_validator.py +0 -0
  149. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/py.typed +0 -0
  150. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/rules/__init__.py +0 -0
  151. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/rules/rule.py +0 -0
  152. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/scanner/__init__.py +0 -0
  153. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/scanner/scan_type/__init__.py +0 -0
  154. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/scanner/scan_type/multi_pattern.py +0 -0
  155. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/scanner/scan_type/pem_key_pattern.py +0 -0
  156. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/scanner/scan_type/scan_type.py +0 -0
  157. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/scanner/scan_type/single_pattern.py +0 -0
  158. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/secret/log.yaml +0 -0
  159. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/utils/__init__.py +0 -0
  160. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/utils/hop_stat.py +0 -0
  161. {credsweeper-1.11.6 → credsweeper-1.12.0}/credsweeper/utils/pem_key_detector.py +0 -0
  162. {credsweeper-1.11.6 → credsweeper-1.12.0}/pyproject.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: credsweeper
3
- Version: 1.11.6
3
+ Version: 1.12.0
4
4
  Summary: Credential Sweeper
5
5
  Project-URL: Homepage, https://github.com/Samsung/CredSweeper
6
6
  Project-URL: Bug Tracker, https://github.com/Samsung/CredSweeper/issues
@@ -24,4 +24,4 @@ __all__ = [
24
24
  "__version__"
25
25
  ]
26
26
 
27
- __version__ = "1.11.6"
27
+ __version__ = "1.12.0"
@@ -4,14 +4,12 @@ import re
4
4
  class KeywordPattern:
5
5
  """Pattern set of keyword types"""
6
6
  directive = r"(?P<directive>(?:(?:[#%]define|%global)(?:\s|\\t)|\bset))?"
7
- key_left = r"(?:\\[nrt]|%[0-9a-f]{2}|\s)*" \
8
- r"(?P<variable>(([`'\"]{1,8}[^:='\"`}<>\\/&?]*|[^:='\"`}<>\s()\\/&?;,%]*)" \
9
- r"(?P<keyword>"
10
- # there will be inserted a keyword
11
- key_right = r")" \
12
- r"[^%:='\"`<>({?!&;\n]*" \
7
+ key_left = r"(?:\\[nrt]|(\\\\*u00|%)[0-9a-f]{2}|\s)*" \
8
+ r"(?P<variable>(([\"'`]{1,8}[^:=\"'`}<>\\/&?]*|[^:=\"'`}<>\s()\\/&?;,%]*)"
9
+ # keyword will be inserted here
10
+ key_right = r"[^%:=\"'`<>({?!&;\n]{0,80}" \
13
11
  r")" \
14
- r"(&(quot|apos);|%[0-9a-f]{2}|[`'\"])*" \
12
+ r"(&(quot|apos|#3[49]);|(\\\\*u00|%)[0-9a-f]{2}|[\"'`])*" \
15
13
  r")" # <variable>
16
14
  separator = r"(?(directive)|(\s|\\{1,8}[tnr])*\]?(\s|\\{1,8}[tnr])*)" \
17
15
  r"(?P<separator>:(\s[a-z]{3,9}[?]?\s)?=|:(?!:)|=(>|&gt;|(\\\\*u00|%)26gt;)|!==|!=|===|==|=~|=" \
@@ -19,7 +17,7 @@ class KeywordPattern:
19
17
  r"(\s|\\{1,8}[tnr])*"
20
18
  # might be curly, square or parenthesis with words before
21
19
  wrap = r"(?P<wrap>(" \
22
- r"(new(\s|\\{1,8}[tnr]|byte|char|string|\[\]){1,8})?" \
20
+ r"((\s|\\{1,8}[tnr]|new|byte|char|string|\[\]){1,8})?" \
23
21
  r"(?P<get>([_a-z][0-9a-z_.\[\]]*\.)get|(os\.)?getenv)?" \
24
22
  r"([0-9a-z_.]|::|-(>|&gt;))*" \
25
23
  r"\s*" \
@@ -28,22 +26,22 @@ class KeywordPattern:
28
26
  r"(?(get)('[^']+'|\"[^\"]+\")\s*,\s*|)" \
29
27
  r"([0-9a-z_]{1,32}\s*[:=]\s*)?" \
30
28
  r"){1,8})?"
31
- string_prefix = r"(((b|r|br|rb|u|f|rf|fr|l|@)(?=(\\*[`'\"])))?"
32
- left_quote = r"(?P<value_leftquote>((?P<esq>\\{1,8})?([`'\"]|&(quot|apos);)){1,4}))?"
29
+ string_prefix = r"(((b|r|br|rb|u|f|rf|fr|l|@)(?=(\\*[\"'`])))?"
30
+ left_quote = r"(?P<value_leftquote>((?P<esq>\\{1,8})?([\"'`]|&(quot|apos|#3[49]);)){1,4}))?"
33
31
  # Authentication scheme ( oauth | basic | bearer | apikey ) precedes to credential
34
32
  auth_keywords = r"(\s?(oauth|bot|basic|bearer|apikey|accesskey|ssws|ntlm)\s)?"
35
33
  value = r"(?P<value>" \
36
34
  r"(?(value_leftquote)" \
37
35
  r"(" \
38
36
  r"(?!(?P=value_leftquote))" \
39
- r"(?(esq)((?!(?P=esq)([`'\"]|&(quot|apos);)).)|((?!(?P=value_leftquote)).)))" \
37
+ r"(?(esq)((?!(?P=esq)([\"'`]|&(quot|apos|#3[49]);)).)|((?!(?P=value_leftquote)).)))" \
40
38
  r"|" \
41
- r"(?!&(quot|apos);)" \
42
- r"(\\{1,8}([ tnr]|[^\s`'\"])" \
39
+ r"(?!&(quot|apos|#3[49]);)" \
40
+ r"(\\{1,8}([ tnr]|[^\s\"'`])" \
43
41
  r"|" \
44
42
  r"(?P<url_esc>%[0-9a-f]{2})" \
45
43
  r"|" \
46
- r"(?(url_esc)[^\s`'\",;\\&]|[^\s`'\",;\\])" \
44
+ r"(?(url_esc)[^\s\"'`,;\\&]|[^\s\"'`,;\\])" \
47
45
  r")" \
48
46
  r"){4,8000}" \
49
47
  r"|" \
@@ -67,7 +65,7 @@ class KeywordPattern:
67
65
  expression = ''.join([ #
68
66
  cls.directive, #
69
67
  cls.key_left, #
70
- keyword, #
68
+ fr"(?P<keyword>{keyword})", # named group required
71
69
  cls.key_right, #
72
70
  cls.separator, #
73
71
  cls.wrap, #
@@ -797,6 +797,7 @@ kill
797
797
  kind
798
798
  kinesis
799
799
  kirk
800
+ know
800
801
  kris
801
802
  lab
802
803
  lag
@@ -1222,6 +1223,7 @@ run
1222
1223
  rxtx
1223
1224
  sabl
1224
1225
  sage
1226
+ salt
1225
1227
  same
1226
1228
  sampl
1227
1229
  sams
@@ -39,8 +39,8 @@ class Config:
39
39
  self.doc: bool = config["doc"]
40
40
  self.severity: Severity = Severity.get(config.get("severity"))
41
41
 
42
- self.min_keyword_value_length: int = int(config["min_keyword_value_length"])
43
- self.min_pattern_value_length: int = int(config["min_pattern_value_length"])
42
+ self.max_url_cred_value_length: int = int(config["max_url_cred_value_length"])
43
+ self.max_password_value_length: int = int(config["max_password_value_length"])
44
44
 
45
45
  # Trim exclude patterns from space like characters
46
46
  self.exclude_lines = set(line.strip() for line in self.exclude_lines)
@@ -137,6 +137,26 @@ class LineData:
137
137
 
138
138
  def sanitize_value(self):
139
139
  """Clean found value from extra artifacts. Correct positions if changed."""
140
+ # process the quotation workaround before cached properties invocation
141
+ if not self.value_leftquote and not self.value_rightquote:
142
+ while self.value:
143
+ first_symbol_code = ord(self.value[0])
144
+ last_symbol_code = ord(self.value[-1])
145
+ if 0x2018 <= first_symbol_code <= 0x201B and 0x2018 <= last_symbol_code <= 0x201B:
146
+ self.value_leftquote = self.value_rightquote = "'"
147
+ self.value = self.value[:-1]
148
+ self.value_end -= 1
149
+ self.value = self.value[1:]
150
+ self.value_start += 1
151
+ elif 0x201C <= first_symbol_code <= 0x201F and 0x201C <= last_symbol_code <= 0x201F:
152
+ self.value_leftquote = self.value_rightquote = '"'
153
+ self.value = self.value[1:]
154
+ self.value_start += 1
155
+ self.value = self.value[:-1]
156
+ self.value_end -= 1
157
+ else:
158
+ break
159
+
140
160
  if self.variable and self.value and not self.is_well_quoted_value:
141
161
  # sanitize is actual step for keyword pattern only
142
162
  _value = self.value
@@ -15,7 +15,6 @@ from credsweeper.filters.value_blocklist_check import ValueBlocklistCheck
15
15
  from credsweeper.filters.value_camel_case_check import ValueCamelCaseCheck
16
16
  from credsweeper.filters.value_couple_keyword_check import ValueCoupleKeywordCheck
17
17
  from credsweeper.filters.value_dictionary_keyword_check import ValueDictionaryKeywordCheck
18
- from credsweeper.filters.value_dictionary_value_length_check import ValueDictionaryValueLengthCheck
19
18
  from credsweeper.filters.value_discord_bot_check import ValueDiscordBotCheck
20
19
  from credsweeper.filters.value_entropy_base32_check import ValueEntropyBase32Check
21
20
  from credsweeper.filters.value_entropy_base36_check import ValueEntropyBase36Check
@@ -29,6 +28,7 @@ from credsweeper.filters.value_jfrog_token_check import ValueJfrogTokenCheck
29
28
  from credsweeper.filters.value_json_web_key_check import ValueJsonWebKeyCheck
30
29
  from credsweeper.filters.value_json_web_token_check import ValueJsonWebTokenCheck
31
30
  from credsweeper.filters.value_last_word_check import ValueLastWordCheck
31
+ from credsweeper.filters.value_length_check import ValueLengthCheck
32
32
  from credsweeper.filters.value_method_check import ValueMethodCheck
33
33
  from credsweeper.filters.value_not_allowed_pattern_check import ValueNotAllowedPatternCheck
34
34
  from credsweeper.filters.value_not_part_encoded_check import ValueNotPartEncodedCheck
@@ -1,4 +1,5 @@
1
1
  from abc import abstractmethod, ABC
2
+ from typing import Optional
2
3
 
3
4
  from credsweeper.config.config import Config
4
5
  from credsweeper.credentials.line_data import LineData
@@ -9,7 +10,8 @@ class Filter(ABC):
9
10
  """Base class for all filters that operates on 'line_data' objects."""
10
11
 
11
12
  @abstractmethod
12
- def __init__(self, config: Config, *args):
13
+ def __init__(self, config: Optional[Config], *args):
14
+ """Config is optional for a filter"""
13
15
  raise NotImplementedError()
14
16
 
15
17
  @abstractmethod
@@ -24,12 +24,31 @@ class Group(ABC):
24
24
  """Abstract Group class"""
25
25
 
26
26
  def __init__(self, config: Config, rule_type: GroupType = GroupType.DEFAULT) -> None:
27
+ """Config is required for filter group"""
27
28
  if rule_type == GroupType.KEYWORD:
28
- self.filters: List[Filter] = self.get_keyword_base_filters(config)
29
+ self.__filters = [ #
30
+ ValueAllowlistCheck(), #
31
+ ValueArrayDictionaryCheck(), #
32
+ ValueBlocklistCheck(), #
33
+ ValueCamelCaseCheck(), #
34
+ ValueFilePathCheck(), #
35
+ ValueHexNumberCheck(), #
36
+ ValueLastWordCheck(), #
37
+ ValueMethodCheck(), #
38
+ ValueSimilarityCheck(), #
39
+ ValueStringTypeCheck(check_for_literals=config.check_for_literals), #
40
+ ValueTokenCheck(), #
41
+ ]
42
+ if not config.doc:
43
+ self.__filters.extend([ValuePatternCheck(), ValueNotAllowedPatternCheck()])
29
44
  elif rule_type == GroupType.PATTERN:
30
- self.filters: List[Filter] = self.get_pattern_base_filters(config)
45
+ self.__filters = [ #
46
+ LineSpecificKeyCheck(), #
47
+ ValuePatternCheck(), #
48
+ ]
31
49
  else:
32
- self.filters: List[Filter] = []
50
+ # GroupType.DEFAULT
51
+ self.__filters = []
33
52
 
34
53
  @property
35
54
  def filters(self) -> List[Filter]:
@@ -40,31 +59,3 @@ class Group(ABC):
40
59
  def filters(self, filters: List[Filter]) -> None:
41
60
  """property setter"""
42
61
  self.__filters = filters
43
-
44
- @staticmethod
45
- def get_keyword_base_filters(config: Config) -> List[Filter]:
46
- """returns base filters"""
47
- filters = [ #
48
- ValueAllowlistCheck(),
49
- ValueArrayDictionaryCheck(),
50
- ValueBlocklistCheck(),
51
- ValueCamelCaseCheck(),
52
- ValueFilePathCheck(),
53
- ValueHexNumberCheck(),
54
- ValueLastWordCheck(),
55
- ValueMethodCheck(),
56
- ValueSimilarityCheck(),
57
- ValueStringTypeCheck(config),
58
- ValueTokenCheck(),
59
- ]
60
- if not config.doc:
61
- filters.extend([ValuePatternCheck(pattern_len=config.pattern_len), ValueNotAllowedPatternCheck()])
62
- return filters
63
-
64
- @staticmethod
65
- def get_pattern_base_filters(config: Config) -> List[Filter]:
66
- """return base filters for pattern"""
67
- return [ #
68
- LineSpecificKeyCheck(), #
69
- ValuePatternCheck(pattern_len=config.pattern_len), #
70
- ]
@@ -1,6 +1,6 @@
1
1
  from credsweeper.common.constants import GroupType
2
2
  from credsweeper.config.config import Config
3
- from credsweeper.filters import ValueDictionaryValueLengthCheck, LineGitBinaryCheck
3
+ from credsweeper.filters import ValueLengthCheck, LineGitBinaryCheck
4
4
  from credsweeper.filters import ValueSplitKeywordCheck
5
5
  from credsweeper.filters.group.group import Group
6
6
  from credsweeper.filters.line_uue_part_check import LineUUEPartCheck
@@ -11,8 +11,9 @@ class PasswordKeyword(Group):
11
11
 
12
12
  def __init__(self, config: Config) -> None:
13
13
  super().__init__(config, GroupType.KEYWORD)
14
- self.filters.extend(
15
- [ValueDictionaryValueLengthCheck(),
16
- ValueSplitKeywordCheck(),
17
- LineGitBinaryCheck(),
18
- LineUUEPartCheck()])
14
+ self.filters.extend([
15
+ ValueLengthCheck(max_len=config.max_password_value_length),
16
+ ValueSplitKeywordCheck(),
17
+ LineGitBinaryCheck(),
18
+ LineUUEPartCheck()
19
+ ])
@@ -13,5 +13,5 @@ class TokenPattern(Group):
13
13
  ValueCoupleKeywordCheck(),
14
14
  ValueNumberCheck(),
15
15
  ValueCamelCaseCheck(),
16
- ValuePatternCheck(pattern_len=config.pattern_len)
16
+ ValuePatternCheck(),
17
17
  ]
@@ -1,9 +1,9 @@
1
1
  from credsweeper.common.constants import GroupType
2
2
  from credsweeper.config.config import Config
3
3
  from credsweeper.filters import (ValueAllowlistCheck, ValueArrayDictionaryCheck, ValueBlocklistCheck,
4
- ValueCamelCaseCheck, ValueDictionaryValueLengthCheck, ValueFilePathCheck,
5
- ValueLastWordCheck, ValueMethodCheck, ValueNotAllowedPatternCheck, ValuePatternCheck,
6
- ValueStringTypeCheck, ValueTokenCheck)
4
+ ValueCamelCaseCheck, ValueLengthCheck, ValueFilePathCheck, ValueLastWordCheck,
5
+ ValueMethodCheck, ValueNotAllowedPatternCheck, ValuePatternCheck, ValueStringTypeCheck,
6
+ ValueTokenCheck)
7
7
  from credsweeper.filters.group.group import Group
8
8
 
9
9
 
@@ -25,9 +25,9 @@ class UrlCredentialsGroup(Group):
25
25
  ValueFilePathCheck(),
26
26
  ValueLastWordCheck(),
27
27
  ValueMethodCheck(),
28
- ValueStringTypeCheck(config),
28
+ ValueStringTypeCheck(check_for_literals=config.check_for_literals),
29
29
  ValueNotAllowedPatternCheck(),
30
30
  ValueTokenCheck(),
31
- ValueDictionaryValueLengthCheck(min_len=4, max_len=80),
32
- ValuePatternCheck(pattern_len=config.pattern_len)
31
+ ValueLengthCheck(max_len=config.max_url_cred_value_length),
32
+ ValuePatternCheck()
33
33
  ]
@@ -12,7 +12,7 @@ class WeirdBase36Token(Group):
12
12
  super().__init__(config, GroupType.DEFAULT)
13
13
  self.filters = [
14
14
  ValueCoupleKeywordCheck(),
15
- ValuePatternCheck(config),
15
+ ValuePatternCheck(),
16
16
  ValueNumberCheck(),
17
17
  ValueTokenBase36Check(),
18
18
  ValueEntropyBase36Check()
@@ -17,7 +17,7 @@ class WeirdBase64Token(Group):
17
17
  ValueBase64DataCheck(),
18
18
  ValueTokenBase64Check(),
19
19
  ValueEntropyBase64Check(),
20
- ValuePatternCheck(config),
20
+ ValuePatternCheck(),
21
21
  ValueNotPartEncodedCheck(),
22
22
  ValueBase64PartCheck(),
23
23
  ]
@@ -1,6 +1,7 @@
1
1
  import base64
2
2
  import contextlib
3
3
  import re
4
+ from typing import Optional
4
5
 
5
6
  from credsweeper.config.config import Config
6
7
  from credsweeper.credentials.line_data import LineData
@@ -12,7 +13,7 @@ class LineGitBinaryCheck(Filter):
12
13
  """Checks that line is not a part of git binary patch"""
13
14
  base85string = re.compile(r"^[A-Za-z][0-9A-Za-z!#$%&()*+;<=>?@^_`{|}~-]{6,65}$")
14
15
 
15
- def __init__(self, config: Config = None) -> None:
16
+ def __init__(self, config: Optional[Config] = None) -> None:
16
17
  pass
17
18
 
18
19
  def run(self, line_data: LineData, target: AnalysisTarget) -> bool:
@@ -1,4 +1,5 @@
1
1
  import re
2
+ from typing import Optional
2
3
 
3
4
  from credsweeper.common.constants import ML_HUNK
4
5
  from credsweeper.config.config import Config
@@ -14,7 +15,7 @@ class LineSpecificKeyCheck(Filter):
14
15
  NOT_ALLOWED = [r"example", r"\benc[\(\[]", r"\btrue\b", r"\bfalse\b"]
15
16
  NOT_ALLOWED_PATTERN = re.compile(Util.get_regex_combine_or(NOT_ALLOWED), re.IGNORECASE)
16
17
 
17
- def __init__(self, config: Config = None) -> None:
18
+ def __init__(self, config: Optional[Config] = None) -> None:
18
19
  pass
19
20
 
20
21
  def run(self, line_data: LineData, target: AnalysisTarget) -> bool:
@@ -1,4 +1,5 @@
1
1
  import re
2
+ from typing import Optional
2
3
 
3
4
  from credsweeper.config.config import Config
4
5
  from credsweeper.credentials.line_data import LineData
@@ -10,7 +11,7 @@ class LineUUEPartCheck(Filter):
10
11
  """Checks that line is not a part of UU encoding only for maximal line"""
11
12
  uue_string = re.compile(r"^M[!-`]{60}$")
12
13
 
13
- def __init__(self, config: Config = None) -> None:
14
+ def __init__(self, config: Optional[Config] = None) -> None:
14
15
  pass
15
16
 
16
17
  def run(self, line_data: LineData, target: AnalysisTarget) -> bool:
@@ -1,4 +1,5 @@
1
1
  import re
2
+ from typing import Optional
2
3
 
3
4
  from credsweeper.config.config import Config
4
5
  from credsweeper.credentials.line_data import LineData
@@ -40,7 +41,7 @@ class ValueAllowlistCheck(Filter):
40
41
 
41
42
  ALLOWED_UNQUOTED_PATTERN = re.compile(Util.get_regex_combine_or(ALLOWED_UNQUOTED), flags=re.IGNORECASE)
42
43
 
43
- def __init__(self, config: Config = None) -> None:
44
+ def __init__(self, config: Optional[Config] = None) -> None:
44
45
  pass
45
46
 
46
47
  def run(self, line_data: LineData, target: AnalysisTarget) -> bool:
@@ -1,4 +1,5 @@
1
1
  import re
2
+ from typing import Optional
2
3
 
3
4
  from credsweeper.config.config import Config
4
5
  from credsweeper.credentials.line_data import LineData
@@ -14,9 +15,9 @@ class ValueArrayDictionaryCheck(Filter):
14
15
  `token = {'root'}` would be kept
15
16
  """
16
17
 
17
- PATTERN = re.compile(r"\[('|\")?[^,]+('|\")?\]")
18
+ PATTERN = re.compile(r"\[['\"]?[^,]+['\"]?]")
18
19
 
19
- def __init__(self, config: Config = None) -> None:
20
+ def __init__(self, config: Optional[Config] = None) -> None:
20
21
  pass
21
22
 
22
23
  def run(self, line_data: LineData, target: AnalysisTarget) -> bool:
@@ -32,11 +33,12 @@ class ValueArrayDictionaryCheck(Filter):
32
33
  """
33
34
  if line_data.is_well_quoted_value:
34
35
  return False
36
+ # not well quoted value
35
37
  if line_data.wrap and "byte" in line_data.wrap.lower():
36
38
  return False
37
39
  if self.PATTERN.search(line_data.value):
38
40
  return True
39
- if line_data.wrap and not line_data.is_well_quoted_value and ('[' in line_data.wrap or '(' in line_data.wrap):
41
+ if line_data.wrap and (line_data.wrap.endswith('[') or line_data.wrap.endswith('(')):
40
42
  return True
41
43
 
42
44
  return False
@@ -1,5 +1,6 @@
1
1
  import binascii
2
2
  import contextlib
3
+ from typing import Optional
3
4
 
4
5
  from credsweeper.common.constants import LATIN_1, ASCII
5
6
  from credsweeper.config.config import Config
@@ -12,7 +13,7 @@ from credsweeper.utils.util import Util
12
13
  class ValueAtlassianTokenCheck(Filter):
13
14
  """Check that candidate have a known structure"""
14
15
 
15
- def __init__(self, config: Config = None) -> None:
16
+ def __init__(self, config: Optional[Config] = None) -> None:
16
17
  pass
17
18
 
18
19
  def run(self, line_data: LineData, target: AnalysisTarget) -> bool:
@@ -1,5 +1,6 @@
1
1
  import contextlib
2
2
  import json
3
+ from typing import Optional
3
4
 
4
5
  from credsweeper.config.config import Config
5
6
  from credsweeper.credentials.line_data import LineData
@@ -15,7 +16,7 @@ class ValueAzureTokenCheck(Filter):
15
16
  https://learn.microsoft.com/en-us/azure/active-directory-b2c/access-tokens
16
17
  """
17
18
 
18
- def __init__(self, config: Config = None) -> None:
19
+ def __init__(self, config: Optional[Config] = None) -> None:
19
20
  pass
20
21
 
21
22
  def run(self, line_data: LineData, target: AnalysisTarget) -> bool:
@@ -1,6 +1,7 @@
1
1
  import base64
2
2
  import contextlib
3
3
  import string
4
+ from typing import Optional
4
5
 
5
6
  from credsweeper.config.config import Config
6
7
  from credsweeper.credentials.line_data import LineData
@@ -14,7 +15,7 @@ class ValueBase32DataCheck(Filter):
14
15
  Check that candidate is NOT an ascii encoded string with entropy check
15
16
  """
16
17
 
17
- def __init__(self, config: Config = None) -> None:
18
+ def __init__(self, config: Optional[Config] = None) -> None:
18
19
  pass
19
20
 
20
21
  def run(self, line_data: LineData, target: AnalysisTarget) -> bool:
@@ -38,6 +39,8 @@ class ValueBase32DataCheck(Filter):
38
39
  return True
39
40
  # check whether decoded bytes have enough entropy
40
41
  with contextlib.suppress(Exception):
42
+ if pad_remain := len(value) % 8:
43
+ value += '=' * (8 - pad_remain)
41
44
  decoded = base64.b32decode(value)
42
45
  return Util.is_ascii_entropy_validate(decoded)
43
46
  return True
@@ -1,5 +1,6 @@
1
1
  import contextlib
2
2
  import string
3
+ from typing import Optional
3
4
 
4
5
  from credsweeper.config.config import Config
5
6
  from credsweeper.credentials.line_data import LineData
@@ -13,7 +14,7 @@ class ValueBase64DataCheck(Filter):
13
14
  Check that candidate is NOT an ascii encoded string with entropy check
14
15
  """
15
16
 
16
- def __init__(self, config: Config = None) -> None:
17
+ def __init__(self, config: Optional[Config] = None) -> None:
17
18
  pass
18
19
 
19
20
  def run(self, line_data: LineData, target: AnalysisTarget) -> bool:
@@ -1,4 +1,5 @@
1
1
  import contextlib
2
+ from typing import Optional
2
3
 
3
4
  from credsweeper.common.constants import ASCII, PEM_BEGIN_PATTERN
4
5
  from credsweeper.config.config import Config
@@ -12,7 +13,7 @@ from credsweeper.utils.util import Util
12
13
  class ValueBase64EncodedPem(Filter):
13
14
  """Check that candidate contains base64 encoded pem private key"""
14
15
 
15
- def __init__(self, config: Config = None) -> None:
16
+ def __init__(self, config: Optional[Config] = None) -> None:
16
17
  self.config = config
17
18
 
18
19
  def run(self, line_data: LineData, target: AnalysisTarget) -> bool:
@@ -1,4 +1,5 @@
1
1
  import contextlib
2
+ from typing import Optional
2
3
 
3
4
  from credsweeper.config.config import Config
4
5
  from credsweeper.credentials.line_data import LineData
@@ -12,7 +13,7 @@ class ValueBase64KeyCheck(Filter):
12
13
 
13
14
  EXTRA_TRANS_TABLE = str.maketrans('', '', "\",'\\")
14
15
 
15
- def __init__(self, config: Config = None) -> None:
16
+ def __init__(self, config: Optional[Config] = None) -> None:
16
17
  self.config = config
17
18
 
18
19
  def run(self, line_data: LineData, target: AnalysisTarget) -> bool:
@@ -2,6 +2,7 @@ import contextlib
2
2
  import re
3
3
  import statistics
4
4
  from itertools import takewhile
5
+ from typing import Optional
5
6
 
6
7
  from credsweeper.common.constants import Chars
7
8
  from credsweeper.config.config import Config
@@ -20,7 +21,7 @@ class ValueBase64PartCheck(Filter):
20
21
  base64_pattern = re.compile(r"^(\\{1,8}[0abfnrtv]|[0-9A-Za-z+/=]){1,4000}$")
21
22
  base64_char_set = set(Chars.BASE64STDPAD_CHARS.value + '\\')
22
23
 
23
- def __init__(self, config: Config = None) -> None:
24
+ def __init__(self, config: Optional[Config] = None) -> None:
24
25
  pass
25
26
 
26
27
  def run(self, line_data: LineData, target: AnalysisTarget) -> bool:
@@ -1,4 +1,5 @@
1
1
  import contextlib
2
+ from typing import Optional
2
3
 
3
4
  from credsweeper.common.constants import DEFAULT_PATTERN_LEN, UTF_8
4
5
  from credsweeper.config.config import Config
@@ -11,7 +12,7 @@ from credsweeper.utils.util import Util
11
12
  class ValueBasicAuthCheck(Filter):
12
13
  """Check that candidate have a known structure"""
13
14
 
14
- def __init__(self, config: Config = None) -> None:
15
+ def __init__(self, config: Optional[Config] = None) -> None:
15
16
  pass
16
17
 
17
18
  def run(self, line_data: LineData, target: AnalysisTarget) -> bool:
@@ -1,3 +1,5 @@
1
+ from typing import Optional
2
+
1
3
  from credsweeper.config.config import Config
2
4
  from credsweeper.credentials.line_data import LineData
3
5
  from credsweeper.file_handler.analysis_target import AnalysisTarget
@@ -18,7 +20,7 @@ class ValueBlocklistCheck(Filter):
18
20
  "undefined",
19
21
  ]
20
22
 
21
- def __init__(self, config: Config = None) -> None:
23
+ def __init__(self, config: Optional[Config] = None) -> None:
22
24
  pass
23
25
 
24
26
  def run(self, line_data: LineData, target: AnalysisTarget) -> bool:
@@ -1,4 +1,5 @@
1
1
  import re
2
+ from typing import Optional
2
3
 
3
4
  from credsweeper.common import static_keyword_checklist
4
5
  from credsweeper.config.config import Config
@@ -14,7 +15,7 @@ class ValueCamelCaseCheck(Filter):
14
15
  CAMEL_CASE = ["^([a-z]+([A-Z][a-z]+)+)$", "^([A-Z][a-z]+([A-Z][a-z]+)+)$"]
15
16
  CAMEL_CASE_PATTERN = re.compile(Util.get_regex_combine_or(CAMEL_CASE))
16
17
 
17
- def __init__(self, config: Config = None) -> None:
18
+ def __init__(self, config: Optional[Config] = None) -> None:
18
19
  pass
19
20
 
20
21
  def run(self, line_data: LineData, target: AnalysisTarget) -> bool:
@@ -1,3 +1,5 @@
1
+ from typing import Optional
2
+
1
3
  from credsweeper.common import static_keyword_checklist
2
4
  from credsweeper.config.config import Config
3
5
  from credsweeper.credentials.line_data import LineData
@@ -8,7 +10,7 @@ from credsweeper.filters.filter import Filter
8
10
  class ValueCoupleKeywordCheck(Filter):
9
11
  """Check value if TWO words from morphemes checklist exists in value"""
10
12
 
11
- def __init__(self, config: Config = None, threshold=1) -> None:
13
+ def __init__(self, config: Optional[Config] = None, threshold=1) -> None:
12
14
  # threshold - minimum morphemes number in a value
13
15
  self.threshold = threshold
14
16
 
@@ -1,3 +1,5 @@
1
+ from typing import Optional
2
+
1
3
  from credsweeper.common import static_keyword_checklist
2
4
  from credsweeper.config.config import Config
3
5
  from credsweeper.credentials.line_data import LineData
@@ -8,7 +10,7 @@ from credsweeper.filters.filter import Filter
8
10
  class ValueDictionaryKeywordCheck(Filter):
9
11
  """Check that no word from dictionary present in the candidate value."""
10
12
 
11
- def __init__(self, config: Config = None) -> None:
13
+ def __init__(self, config: Optional[Config] = None) -> None:
12
14
  pass
13
15
 
14
16
  def run(self, line_data: LineData, target: AnalysisTarget) -> bool:
@@ -1,4 +1,5 @@
1
1
  import contextlib
2
+ from typing import Optional
2
3
 
3
4
  from credsweeper.config.config import Config
4
5
  from credsweeper.credentials.line_data import LineData
@@ -11,7 +12,7 @@ from credsweeper.utils.util import Util
11
12
  class ValueDiscordBotCheck(Filter):
12
13
  """Discord bot Token"""
13
14
 
14
- def __init__(self, config: Config = None) -> None:
15
+ def __init__(self, config: Optional[Config] = None) -> None:
15
16
  pass
16
17
 
17
18
  def run(self, line_data: LineData, target: AnalysisTarget) -> bool: