credsweeper 1.11.5__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 (176) hide show
  1. {credsweeper-1.11.5 → credsweeper-1.12.0}/PKG-INFO +1 -1
  2. credsweeper-1.12.0/credsweeper/__init__.py +27 -0
  3. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/__main__.py +141 -35
  4. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/app.py +11 -11
  5. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/common/keyword_pattern.py +13 -15
  6. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/common/morpheme_checklist.txt +2 -0
  7. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/config/config.py +3 -3
  8. credsweeper-1.12.0/credsweeper/credentials/__init__.py +0 -0
  9. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/credentials/augment_candidates.py +1 -1
  10. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/credentials/candidate.py +1 -1
  11. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/credentials/credential_manager.py +1 -1
  12. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/credentials/line_data.py +22 -2
  13. credsweeper-1.12.0/credsweeper/deep_scanner/__init__.py +0 -0
  14. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/abstract_scanner.py +3 -3
  15. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/byte_scanner.py +1 -1
  16. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/bzip2_scanner.py +2 -2
  17. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/deb_scanner.py +1 -1
  18. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/deep_scanner.py +3 -3
  19. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/docx_scanner.py +1 -1
  20. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/eml_scanner.py +1 -1
  21. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/encoder_scanner.py +1 -1
  22. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/gzip_scanner.py +2 -2
  23. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/html_scanner.py +1 -1
  24. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/jclass_scanner.py +1 -1
  25. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/jks_scanner.py +1 -1
  26. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/lang_scanner.py +1 -1
  27. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/lzma_scanner.py +2 -2
  28. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/mxfile_scanner.py +1 -1
  29. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/pdf_scanner.py +1 -1
  30. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/pkcs_scanner.py +2 -2
  31. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/pptx_scanner.py +1 -1
  32. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/rpm_scanner.py +1 -1
  33. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/tar_scanner.py +2 -2
  34. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/tmx_scanner.py +2 -2
  35. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/xlsx_scanner.py +2 -2
  36. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/xml_scanner.py +1 -1
  37. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/zip_scanner.py +2 -2
  38. credsweeper-1.12.0/credsweeper/file_handler/__init__.py +0 -0
  39. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/file_handler/abstract_provider.py +3 -4
  40. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/file_handler/byte_content_provider.py +1 -1
  41. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/file_handler/content_provider.py +1 -1
  42. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/file_handler/data_content_provider.py +1 -1
  43. credsweeper-1.12.0/credsweeper/file_handler/diff_content_provider.py +221 -0
  44. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/file_handler/file_path_extractor.py +2 -2
  45. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/file_handler/files_provider.py +4 -4
  46. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/file_handler/patches_provider.py +7 -8
  47. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/file_handler/text_content_provider.py +1 -1
  48. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/__init__.py +2 -3
  49. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/filter.py +5 -3
  50. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/group/__init__.py +0 -2
  51. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/group/general_keyword.py +2 -2
  52. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/group/general_pattern.py +2 -2
  53. credsweeper-1.12.0/credsweeper/filters/group/group.py +61 -0
  54. credsweeper-1.12.0/credsweeper/filters/group/password_keyword.py +19 -0
  55. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/group/token_pattern.py +3 -3
  56. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/group/url_credentials_group.py +8 -8
  57. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/group/weird_base36_token.py +3 -3
  58. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/group/weird_base64_token.py +3 -3
  59. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/line_git_binary_check.py +5 -4
  60. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/line_specific_key_check.py +6 -5
  61. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/line_uue_part_check.py +5 -4
  62. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_allowlist_check.py +6 -5
  63. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_array_dictionary_check.py +8 -6
  64. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_atlassian_token_check.py +6 -5
  65. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_azure_token_check.py +6 -5
  66. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_base32_data_check.py +8 -5
  67. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_base64_data_check.py +6 -5
  68. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_base64_encoded_pem_check.py +6 -5
  69. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_base64_key_check.py +6 -5
  70. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_base64_part_check.py +6 -5
  71. credsweeper-1.12.0/credsweeper/filters/value_basic_auth_check.py +37 -0
  72. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_blocklist_check.py +6 -4
  73. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_camel_case_check.py +6 -5
  74. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_couple_keyword_check.py +6 -4
  75. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_dictionary_keyword_check.py +6 -4
  76. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_discord_bot_check.py +6 -5
  77. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_entropy_base_check.py +6 -5
  78. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_file_path_check.py +8 -5
  79. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_github_check.py +5 -4
  80. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_grafana_check.py +6 -5
  81. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_grafana_service_check.py +5 -4
  82. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_hex_number_check.py +5 -4
  83. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_jfrog_token_check.py +6 -5
  84. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_json_web_key_check.py +6 -5
  85. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_json_web_token_check.py +6 -5
  86. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_last_word_check.py +6 -4
  87. credsweeper-1.11.5/credsweeper/filters/value_dictionary_value_length_check.py → credsweeper-1.12.0/credsweeper/filters/value_length_check.py +12 -6
  88. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_method_check.py +5 -4
  89. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_not_allowed_pattern_check.py +6 -5
  90. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_not_part_encoded_check.py +4 -4
  91. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_number_check.py +5 -4
  92. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_pattern_check.py +61 -41
  93. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_similarity_check.py +6 -4
  94. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_split_keyword_check.py +5 -4
  95. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_string_type_check.py +9 -7
  96. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_token_base_check.py +5 -4
  97. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_token_check.py +6 -5
  98. credsweeper-1.12.0/credsweeper/logger/__init__.py +0 -0
  99. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/logger/logger.py +1 -1
  100. credsweeper-1.12.0/credsweeper/ml_model/__init__.py +0 -0
  101. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/features/__init__.py +1 -0
  102. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/features/entropy_evaluation.py +1 -1
  103. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/features/feature.py +1 -1
  104. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/features/file_extension.py +1 -1
  105. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/features/has_html_tag.py +2 -2
  106. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/features/is_secret_numeric.py +1 -1
  107. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/features/length_of_attribute.py +1 -1
  108. credsweeper-1.12.0/credsweeper/ml_model/features/morpheme_dense.py +26 -0
  109. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/features/rule_name.py +1 -1
  110. credsweeper-1.12.0/credsweeper/ml_model/features/rule_severity.py +21 -0
  111. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/features/search_in_attribute.py +1 -1
  112. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/features/word_in.py +1 -1
  113. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/features/word_in_path.py +5 -2
  114. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/features/word_in_postamble.py +1 -1
  115. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/features/word_in_preamble.py +1 -1
  116. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/features/word_in_transition.py +1 -1
  117. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/features/word_in_value.py +1 -1
  118. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/features/word_in_variable.py +1 -1
  119. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/ml_config.json +130 -24
  120. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/ml_model.onnx +0 -0
  121. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/ml_validator.py +3 -2
  122. credsweeper-1.12.0/credsweeper/py.typed +0 -0
  123. credsweeper-1.12.0/credsweeper/rules/__init__.py +0 -0
  124. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/rules/config.yaml +116 -42
  125. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/rules/rule.py +4 -3
  126. credsweeper-1.12.0/credsweeper/scanner/__init__.py +0 -0
  127. credsweeper-1.12.0/credsweeper/scanner/scan_type/__init__.py +0 -0
  128. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/scanner/scan_type/multi_pattern.py +4 -4
  129. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/scanner/scan_type/pem_key_pattern.py +4 -4
  130. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/scanner/scan_type/scan_type.py +4 -4
  131. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/scanner/scan_type/single_pattern.py +4 -4
  132. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/scanner/scanner.py +12 -8
  133. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/secret/config.json +2 -2
  134. credsweeper-1.12.0/credsweeper/utils/__init__.py +0 -0
  135. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/utils/pem_key_detector.py +3 -3
  136. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/utils/util.py +3 -132
  137. credsweeper-1.11.5/credsweeper/__init__.py +0 -21
  138. credsweeper-1.11.5/credsweeper/config/__init__.py +0 -1
  139. credsweeper-1.11.5/credsweeper/credentials/__init__.py +0 -5
  140. credsweeper-1.11.5/credsweeper/deep_scanner/__init__.py +0 -1
  141. credsweeper-1.11.5/credsweeper/file_handler/__init__.py +0 -15
  142. credsweeper-1.11.5/credsweeper/file_handler/diff_content_provider.py +0 -91
  143. credsweeper-1.11.5/credsweeper/filters/group/group.py +0 -59
  144. credsweeper-1.11.5/credsweeper/filters/group/password_keyword.py +0 -18
  145. credsweeper-1.11.5/credsweeper/logger/__init__.py +0 -1
  146. credsweeper-1.11.5/credsweeper/ml_model/__init__.py +0 -1
  147. credsweeper-1.11.5/credsweeper/ml_model/features/morpheme_dense.py +0 -19
  148. credsweeper-1.11.5/credsweeper/rules/__init__.py +0 -1
  149. credsweeper-1.11.5/credsweeper/scanner/__init__.py +0 -1
  150. credsweeper-1.11.5/credsweeper/scanner/scan_type/__init__.py +0 -5
  151. credsweeper-1.11.5/credsweeper/utils/__init__.py +0 -1
  152. {credsweeper-1.11.5 → credsweeper-1.12.0}/.gitignore +0 -0
  153. {credsweeper-1.11.5 → credsweeper-1.12.0}/LICENSE +0 -0
  154. {credsweeper-1.11.5 → credsweeper-1.12.0}/README.md +0 -0
  155. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/common/__init__.py +0 -0
  156. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/common/constants.py +0 -0
  157. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/common/keyword_checklist.py +0 -0
  158. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/common/keyword_checklist.txt +0 -0
  159. /credsweeper-1.11.5/credsweeper/py.typed → /credsweeper-1.12.0/credsweeper/config/__init__.py +0 -0
  160. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/credentials/candidate_group_generator.py +0 -0
  161. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/credentials/candidate_key.py +0 -0
  162. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/patch_scanner.py +0 -0
  163. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/sqlite3_scanner.py +0 -0
  164. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/file_handler/analysis_target.py +0 -0
  165. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/file_handler/descriptor.py +0 -0
  166. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/file_handler/string_content_provider.py +0 -0
  167. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/file_handler/struct_content_provider.py +0 -0
  168. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_entropy_base32_check.py +0 -0
  169. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_entropy_base36_check.py +0 -0
  170. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_entropy_base64_check.py +0 -0
  171. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_token_base32_check.py +0 -0
  172. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_token_base36_check.py +0 -0
  173. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_token_base64_check.py +0 -0
  174. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/secret/log.yaml +0 -0
  175. {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/utils/hop_stat.py +0 -0
  176. {credsweeper-1.11.5 → 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.5
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
@@ -0,0 +1,27 @@
1
+ from credsweeper.app import CredSweeper
2
+ from credsweeper.common.constants import ThresholdPreset, Severity, Confidence
3
+ from credsweeper.file_handler.byte_content_provider import ByteContentProvider
4
+ from credsweeper.file_handler.content_provider import ContentProvider
5
+ from credsweeper.file_handler.data_content_provider import DataContentProvider
6
+ from credsweeper.file_handler.diff_content_provider import DiffContentProvider
7
+ from credsweeper.file_handler.string_content_provider import StringContentProvider
8
+ from credsweeper.file_handler.text_content_provider import TextContentProvider
9
+
10
+ from credsweeper.ml_model.ml_validator import MlValidator
11
+
12
+ __all__ = [
13
+ "ByteContentProvider", #
14
+ "Confidence", #
15
+ "ContentProvider", #
16
+ "CredSweeper", #
17
+ "DataContentProvider", #
18
+ "DiffContentProvider", #
19
+ "MlValidator", #
20
+ "Severity", #
21
+ "StringContentProvider", #
22
+ "TextContentProvider", #
23
+ "ThresholdPreset", #
24
+ "__version__"
25
+ ]
26
+
27
+ __version__ = "1.12.0"
@@ -5,16 +5,19 @@ import sys
5
5
  import time
6
6
  from argparse import ArgumentParser, ArgumentTypeError, Namespace, BooleanOptionalAction
7
7
  from pathlib import Path
8
- from typing import Any, Union, Dict
8
+ from typing import Any, Union, Dict, Tuple, Sequence
9
+
10
+ from git import Repo, Commit
9
11
 
10
12
  from credsweeper import __version__
11
13
  from credsweeper.app import APP_PATH, CredSweeper
12
14
  from credsweeper.common.constants import ThresholdPreset, Severity, RuleType, DiffRowType, ML_HUNK
13
15
  from credsweeper.file_handler.abstract_provider import AbstractProvider
16
+ from credsweeper.file_handler.byte_content_provider import ByteContentProvider
14
17
  from credsweeper.file_handler.files_provider import FilesProvider
15
18
  from credsweeper.file_handler.patches_provider import PatchesProvider
16
19
  from credsweeper.logger.logger import Logger
17
- from credsweeper.utils import Util
20
+ from credsweeper.utils.util import Util
18
21
 
19
22
  EXIT_SUCCESS = 0
20
23
  EXIT_FAILURE = 1
@@ -118,6 +121,11 @@ def get_arguments() -> Namespace:
118
121
  const="log.yaml",
119
122
  dest="export_log_config",
120
123
  metavar="PATH")
124
+ group.add_argument("--git", help="git repo to scan", dest="git", metavar="PATH")
125
+ parser.add_argument("--ref",
126
+ help="scan git repo from the ref, otherwise - all branches were scanned (slow)",
127
+ dest="ref",
128
+ type=str)
121
129
  parser.add_argument("--rules",
122
130
  help="path of rule config file (default: credsweeper/rules/config.yaml). "
123
131
  f"severity:{[i.value for i in Severity]} "
@@ -246,8 +254,8 @@ def get_arguments() -> Namespace:
246
254
  default=False)
247
255
  parser.add_argument("--log",
248
256
  "-l",
249
- help=f"provide logging level of {list(Logger.LEVELS.keys())}"
250
- f"(default: 'warning', case insensitive)",
257
+ help=(f"provide logging level of {list(Logger.LEVELS.keys())}"
258
+ f" (default: 'warning', case insensitive)"),
251
259
  default="warning",
252
260
  dest="log",
253
261
  metavar="LOG_LEVEL",
@@ -268,6 +276,39 @@ def get_arguments() -> Namespace:
268
276
  return parser.parse_args()
269
277
 
270
278
 
279
+ def get_credsweeper(args: Namespace) -> CredSweeper:
280
+ """Common function to create the instance"""
281
+ if args.denylist_path is not None:
282
+ denylist = [line for line in Util.read_file(args.denylist_path) if line]
283
+ else:
284
+ denylist = []
285
+ return CredSweeper(rule_path=args.rule_path,
286
+ config_path=args.config_path,
287
+ json_filename=args.json_filename,
288
+ xlsx_filename=args.xlsx_filename,
289
+ stdout=args.stdout,
290
+ color=args.color,
291
+ hashed=args.hashed,
292
+ subtext=args.subtext,
293
+ sort_output=args.sort_output,
294
+ use_filters=args.no_filters,
295
+ pool_count=args.jobs,
296
+ ml_batch_size=args.ml_batch_size,
297
+ ml_threshold=args.ml_threshold,
298
+ ml_config=args.ml_config,
299
+ ml_model=args.ml_model,
300
+ ml_providers=args.ml_providers,
301
+ find_by_ext=args.find_by_ext,
302
+ depth=args.depth,
303
+ doc=args.doc,
304
+ severity=args.severity,
305
+ size_limit=args.size_limit,
306
+ exclude_lines=denylist,
307
+ exclude_values=denylist,
308
+ thrifty=args.thrifty,
309
+ log_level=args.log)
310
+
311
+
271
312
  def scan(args: Namespace, content_provider: AbstractProvider) -> int:
272
313
  """Scan content_provider data, print results or save them to json_filename is not None
273
314
 
@@ -283,42 +324,101 @@ def scan(args: Namespace, content_provider: AbstractProvider) -> int:
283
324
 
284
325
  """
285
326
  try:
286
- if args.denylist_path is not None:
287
- denylist = [line for line in Util.read_file(args.denylist_path) if line]
288
- else:
289
- denylist = []
290
-
291
- credsweeper = CredSweeper(rule_path=args.rule_path,
292
- config_path=args.config_path,
293
- json_filename=args.json_filename,
294
- xlsx_filename=args.xlsx_filename,
295
- stdout=args.stdout,
296
- color=args.color,
297
- hashed=args.hashed,
298
- subtext=args.subtext,
299
- sort_output=args.sort_output,
300
- use_filters=args.no_filters,
301
- pool_count=args.jobs,
302
- ml_batch_size=args.ml_batch_size,
303
- ml_threshold=args.ml_threshold,
304
- ml_config=args.ml_config,
305
- ml_model=args.ml_model,
306
- ml_providers=args.ml_providers,
307
- find_by_ext=args.find_by_ext,
308
- depth=args.depth,
309
- doc=args.doc,
310
- severity=args.severity,
311
- size_limit=args.size_limit,
312
- exclude_lines=denylist,
313
- exclude_values=denylist,
314
- thrifty=args.thrifty,
315
- log_level=args.log)
327
+ credsweeper = get_credsweeper(args)
316
328
  return credsweeper.run(content_provider=content_provider)
317
329
  except Exception as exc:
318
330
  logger.critical(exc, exc_info=True)
331
+ logger.exception(exc)
319
332
  return -1
320
333
 
321
334
 
335
+ def get_commit_providers(commit: Commit, repo: Repo) -> Sequence[ByteContentProvider]:
336
+ """Process a commit and for providers"""
337
+ result = {}
338
+ ancestors = commit.parents or [repo.tree()]
339
+ for parent in ancestors:
340
+ for diff in parent.diff(commit):
341
+ # only result files
342
+ blob_b = diff.b_blob
343
+ if blob_b and blob_b.path not in result:
344
+ try:
345
+ result[blob_b.path] = ByteContentProvider(content=blob_b.data_stream.read(),
346
+ file_path=str(blob_b.path),
347
+ info=DiffRowType.ADDED.value)
348
+ except Exception as exc:
349
+ logger.warning(f"A submodule was not properly initialized or commit was removed: {exc}")
350
+ return list(result.values())
351
+
352
+
353
+ def drill(args: Namespace) -> Tuple[int, int]:
354
+ """Scan repository for branches and commits
355
+ Returns:
356
+ total credentials found
357
+ total scanned commits
358
+ """
359
+ total_credentials = 0
360
+ total_commits = 0
361
+ try:
362
+ # repo init first
363
+ repo = Repo(args.git)
364
+ if args.ref:
365
+ commits_sha1 = set(x.commit.hexsha for x in repo.refs if x.name == args.ref)
366
+ if not commits_sha1:
367
+ commits_sha1 = {args.ref} # single commit sha1 reference
368
+ else:
369
+ commits_sha1 = set(x.commit.hexsha for x in repo.refs
370
+ if x.name.startswith('origin/') or x.name.startswith('refs/heads/'))
371
+ logger.info(f"Git repository {args.git} with commits: {commits_sha1}")
372
+ # then - credsweeper
373
+ credsweeper = get_credsweeper(args)
374
+ # use flat iterations to avoid recursive limits
375
+ to_scan = list(commits_sha1)
376
+ # local speedup for already scanned commits - avoid file system interactive
377
+ scanned = set()
378
+ while to_scan:
379
+ commit_sha1 = to_scan.pop()
380
+ if commit_sha1 in scanned:
381
+ # the commit was scanned in this launch
382
+ continue
383
+ commit = repo.commit(commit_sha1)
384
+ if commit.parents:
385
+ # add parents anyway
386
+ to_scan.extend(x.hexsha for x in commit.parents)
387
+ # check whether the commit has been checked and the report is present
388
+ skip_already_scanned = False
389
+ if args.json_filename:
390
+ json_path = Path(args.json_filename)
391
+ json_path = json_path.with_suffix(f".{commit_sha1}{json_path.suffix}")
392
+ if json_path.exists():
393
+ skip_already_scanned = True
394
+ else:
395
+ credsweeper.json_filename = json_path
396
+ if args.xlsx_filename:
397
+ xlsx_path = Path(args.xlsx_filename)
398
+ xlsx_path = xlsx_path.with_suffix(f".{commit_sha1}{xlsx_path.suffix}")
399
+ if xlsx_path.exists():
400
+ skip_already_scanned = True
401
+ else:
402
+ credsweeper.xlsx_filename = xlsx_path
403
+ if skip_already_scanned:
404
+ logger.info("Skip already scanned commit: %s", commit_sha1)
405
+ continue
406
+ logger.info("Scan commit: %s", commit_sha1)
407
+ # prepare all files to scan in the commit with bytes->IO transformation to avoid a multiprocess issue
408
+ if providers := get_commit_providers(commit, repo):
409
+ credsweeper.credential_manager.candidates.clear()
410
+ credsweeper.scan(providers)
411
+ credsweeper.post_processing()
412
+ credsweeper.export_results()
413
+ total_credentials += credsweeper.credential_manager.len_credentials()
414
+ total_commits += 1
415
+ scanned.add(commit_sha1)
416
+ except Exception as exc:
417
+ logger.critical(exc, exc_info=True)
418
+ return -1, total_commits
419
+ return total_credentials, total_commits
420
+
421
+
322
422
  def main() -> int:
323
423
  """Main function"""
324
424
  result = EXIT_FAILURE
@@ -328,7 +428,7 @@ def main() -> int:
328
428
  if args.banner:
329
429
  print(f"CredSweeper {__version__} crc32:{check_integrity():08x}")
330
430
  Logger.init_logging(args.log, args.log_config_path)
331
- logger.info(f"Init CredSweeper object with arguments: {args}")
431
+ logger.info(f"Init CredSweeper object with arguments: {args} CWD: {os.getcwd()}")
332
432
  summary: Dict[str, int] = {}
333
433
  if args.path:
334
434
  logger.info(f"Run analyzer on path: {args.path}")
@@ -353,6 +453,12 @@ def main() -> int:
353
453
  result = EXIT_SUCCESS
354
454
  # collect number of all found credential to produce error code when necessary
355
455
  credentials_number = add_credentials_number + del_credentials_number
456
+ elif args.git:
457
+ logger.info(f"Run analyzer on GIT: {args.git}")
458
+ credentials_number, commits_number = drill(args)
459
+ summary[f"Detected Credentials in {args.git} for {commits_number} commits "] = credentials_number
460
+ if 0 <= credentials_number:
461
+ result = EXIT_SUCCESS
356
462
  elif args.export_config:
357
463
  logging.info(f"Exporting default config to file: {args.export_config}")
358
464
  config_dict = Util.json_load(APP_PATH / "secret" / "config.json")
@@ -11,18 +11,18 @@ from colorama import Style
11
11
  # Directory of credsweeper sources MUST be placed before imports to avoid circular import error
12
12
  APP_PATH = Path(__file__).resolve().parent
13
13
 
14
+ from credsweeper.scanner.scanner import Scanner
14
15
  from credsweeper.common.constants import Severity, ThresholdPreset, DiffRowType, DEFAULT_ENCODING
15
- from credsweeper.config import Config
16
- from credsweeper.credentials import Candidate, CredentialManager, CandidateKey
16
+ from credsweeper.config.config import Config
17
+ from credsweeper.credentials.candidate import Candidate
18
+ from credsweeper.credentials.candidate_key import CandidateKey
19
+ from credsweeper.credentials.credential_manager import CredentialManager
17
20
  from credsweeper.deep_scanner.deep_scanner import DeepScanner
18
21
  from credsweeper.file_handler.content_provider import ContentProvider
19
- from credsweeper.file_handler.diff_content_provider import DiffContentProvider
20
22
  from credsweeper.file_handler.file_path_extractor import FilePathExtractor
21
23
  from credsweeper.file_handler.abstract_provider import AbstractProvider
22
- from credsweeper.file_handler.text_content_provider import TextContentProvider
23
- from credsweeper.scanner import Scanner
24
24
  from credsweeper.ml_model.ml_validator import MlValidator
25
- from credsweeper.utils import Util
25
+ from credsweeper.utils.util import Util
26
26
 
27
27
  logger = logging.getLogger(__name__)
28
28
 
@@ -215,7 +215,7 @@ class CredSweeper:
215
215
  content_provider: path objects to scan
216
216
 
217
217
  """
218
- _empty_list: Sequence[Union[DiffContentProvider, TextContentProvider]] = []
218
+ _empty_list: Sequence[ContentProvider] = []
219
219
  file_extractors = content_provider.get_scannable_files(self.config) if content_provider else _empty_list
220
220
  if not file_extractors:
221
221
  logger.info(f"No scannable targets for {len(content_provider.paths)} paths")
@@ -229,7 +229,7 @@ class CredSweeper:
229
229
 
230
230
  # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
231
231
 
232
- def scan(self, content_providers: Sequence[Union[DiffContentProvider, TextContentProvider]]) -> None:
232
+ def scan(self, content_providers: Sequence[ContentProvider]) -> None:
233
233
  """Run scanning of files from an argument "content_providers".
234
234
 
235
235
  Args:
@@ -243,7 +243,7 @@ class CredSweeper:
243
243
 
244
244
  # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
245
245
 
246
- def __single_job_scan(self, content_providers: Sequence[Union[DiffContentProvider, TextContentProvider]]) -> None:
246
+ def __single_job_scan(self, content_providers: Sequence[ContentProvider]) -> None:
247
247
  """Performs scan in main thread"""
248
248
  logger.info(f"Scan for {len(content_providers)} providers")
249
249
  all_cred = self.files_scan(content_providers)
@@ -251,7 +251,7 @@ class CredSweeper:
251
251
 
252
252
  # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
253
253
 
254
- def __multi_jobs_scan(self, content_providers: Sequence[Union[DiffContentProvider, TextContentProvider]]) -> None:
254
+ def __multi_jobs_scan(self, content_providers: Sequence[ContentProvider]) -> None:
255
255
  """Performs scan with multiple jobs"""
256
256
  # use this separation to satisfy YAPF formatter
257
257
  yapfix = "%(asctime)s | %(levelname)s | %(processName)s:%(threadName)s | %(filename)s:%(lineno)s | %(message)s"
@@ -265,7 +265,7 @@ class CredSweeper:
265
265
  logger.info(f"Scan in {pool_count} processes for {len(content_providers)} providers")
266
266
  with multiprocessing.get_context("spawn").Pool(processes=pool_count,
267
267
  initializer=CredSweeper.pool_initializer,
268
- initargs=(log_kwargs, )) as pool:
268
+ initargs=(log_kwargs,)) as pool: # yapf: disable
269
269
  try:
270
270
  for scan_results in pool.imap_unordered(self.files_scan,
271
271
  (content_providers[x::pool_count] for x in range(pool_count))):
@@ -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
@@ -4,7 +4,7 @@ from typing import Dict, List, Optional, Set, Any
4
4
  from humanfriendly import parse_size
5
5
 
6
6
  from credsweeper.common.constants import Severity, DEFAULT_PATTERN_LEN
7
- from credsweeper.utils import Util
7
+ from credsweeper.utils.util import Util
8
8
 
9
9
 
10
10
  class Config:
@@ -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)
File without changes
@@ -1,6 +1,6 @@
1
1
  from typing import List
2
2
 
3
- from credsweeper.credentials import Candidate
3
+ from credsweeper.credentials.candidate import Candidate
4
4
 
5
5
 
6
6
  def augment_candidates(candidates: List[Candidate], new_candidates: List[Candidate]):
@@ -4,7 +4,7 @@ from json.encoder import py_encode_basestring_ascii
4
4
  from typing import Any, Dict, List, Optional
5
5
 
6
6
  from credsweeper.common.constants import Severity, Confidence
7
- from credsweeper.config import Config
7
+ from credsweeper.config.config import Config
8
8
  from credsweeper.credentials.line_data import LineData
9
9
 
10
10
 
@@ -2,7 +2,7 @@ import logging
2
2
  from multiprocessing import Manager
3
3
  from typing import List, Dict, Tuple
4
4
 
5
- from credsweeper.credentials import Candidate
5
+ from credsweeper.credentials.candidate import Candidate
6
6
  from credsweeper.credentials.candidate_group_generator import CandidateGroupGenerator, CandidateKey
7
7
 
8
8
  logger = logging.getLogger(__name__)
@@ -8,8 +8,8 @@ from typing import Any, Dict, Optional, Tuple
8
8
  from colorama import Fore, Style
9
9
 
10
10
  from credsweeper.common.constants import MAX_LINE_LENGTH, UTF_8, StartEnd, ML_HUNK
11
- from credsweeper.config import Config
12
- from credsweeper.utils import Util
11
+ from credsweeper.config.config import Config
12
+ from credsweeper.utils.util import Util
13
13
 
14
14
 
15
15
  class LineData:
@@ -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
@@ -6,9 +6,9 @@ from typing import List, Optional, Tuple, Any, Generator
6
6
 
7
7
  from credsweeper.common.constants import RECURSIVE_SCAN_LIMITATION, MIN_DATA_LEN, DEFAULT_ENCODING, UTF_8, \
8
8
  MIN_VALUE_LENGTH
9
- from credsweeper.config import Config
10
- from credsweeper.credentials import Candidate
9
+ from credsweeper.config.config import Config
11
10
  from credsweeper.credentials.augment_candidates import augment_candidates
11
+ from credsweeper.credentials.candidate import Candidate
12
12
  from credsweeper.file_handler.byte_content_provider import ByteContentProvider
13
13
  from credsweeper.file_handler.content_provider import ContentProvider
14
14
  from credsweeper.file_handler.data_content_provider import DataContentProvider
@@ -18,7 +18,7 @@ from credsweeper.file_handler.file_path_extractor import FilePathExtractor
18
18
  from credsweeper.file_handler.string_content_provider import StringContentProvider
19
19
  from credsweeper.file_handler.struct_content_provider import StructContentProvider
20
20
  from credsweeper.file_handler.text_content_provider import TextContentProvider
21
- from credsweeper.scanner import Scanner
21
+ from credsweeper.scanner.scanner import Scanner
22
22
 
23
23
  logger = logging.getLogger(__name__)
24
24
 
@@ -2,7 +2,7 @@ import logging
2
2
  from abc import ABC
3
3
  from typing import List, Optional
4
4
 
5
- from credsweeper.credentials import Candidate
5
+ from credsweeper.credentials.candidate import Candidate
6
6
  from credsweeper.file_handler.byte_content_provider import ByteContentProvider
7
7
  from credsweeper.file_handler.data_content_provider import DataContentProvider
8
8
  from .abstract_scanner import AbstractScanner
@@ -4,10 +4,10 @@ from abc import ABC
4
4
  from pathlib import Path
5
5
  from typing import List, Optional
6
6
 
7
- from credsweeper.credentials import Candidate
7
+ from credsweeper.credentials.candidate import Candidate
8
8
  from credsweeper.deep_scanner.abstract_scanner import AbstractScanner
9
9
  from credsweeper.file_handler.data_content_provider import DataContentProvider
10
- from credsweeper.utils import Util
10
+ from credsweeper.utils.util import Util
11
11
 
12
12
  logger = logging.getLogger(__name__)
13
13
 
@@ -4,7 +4,7 @@ from abc import ABC
4
4
  from typing import List, Optional, Generator, Tuple
5
5
 
6
6
  from credsweeper.common.constants import MIN_DATA_LEN, UTF_8
7
- from credsweeper.credentials import Candidate
7
+ from credsweeper.credentials.candidate import Candidate
8
8
  from credsweeper.deep_scanner.abstract_scanner import AbstractScanner
9
9
  from credsweeper.file_handler.data_content_provider import DataContentProvider
10
10
  from credsweeper.utils.util import Util
@@ -2,9 +2,9 @@ import logging
2
2
  from typing import List, Any, Tuple
3
3
 
4
4
  from credsweeper.common.constants import MIN_DATA_LEN
5
- from credsweeper.config import Config
6
- from credsweeper.scanner import Scanner
7
- from credsweeper.utils import Util
5
+ from credsweeper.config.config import Config
6
+ from credsweeper.scanner.scanner import Scanner
7
+ from credsweeper.utils.util import Util
8
8
  from .byte_scanner import ByteScanner
9
9
  from .bzip2_scanner import Bzip2Scanner
10
10
  from .deb_scanner import DebScanner
@@ -11,7 +11,7 @@ from docx.table import _Cell, Table
11
11
  from docx.text.paragraph import Paragraph
12
12
  from lxml.etree import _Element
13
13
 
14
- from credsweeper.credentials import Candidate
14
+ from credsweeper.credentials.candidate import Candidate
15
15
  from credsweeper.deep_scanner.abstract_scanner import AbstractScanner
16
16
  from credsweeper.file_handler.data_content_provider import DataContentProvider
17
17
  from credsweeper.file_handler.string_content_provider import StringContentProvider
@@ -3,7 +3,7 @@ import logging
3
3
  from abc import ABC
4
4
  from typing import List, Optional
5
5
 
6
- from credsweeper.credentials import Candidate
6
+ from credsweeper.credentials.candidate import Candidate
7
7
  from credsweeper.deep_scanner.abstract_scanner import AbstractScanner
8
8
  from credsweeper.file_handler.byte_content_provider import ByteContentProvider
9
9
  from credsweeper.file_handler.data_content_provider import DataContentProvider
@@ -2,7 +2,7 @@ import logging
2
2
  from abc import ABC
3
3
  from typing import List, Optional
4
4
 
5
- from credsweeper.credentials import Candidate
5
+ from credsweeper.credentials.candidate import Candidate
6
6
  from credsweeper.deep_scanner.abstract_scanner import AbstractScanner
7
7
  from credsweeper.file_handler.data_content_provider import DataContentProvider
8
8
 
@@ -5,10 +5,10 @@ from abc import ABC
5
5
  from pathlib import Path
6
6
  from typing import List, Optional
7
7
 
8
- from credsweeper.credentials import Candidate
8
+ from credsweeper.credentials.candidate import Candidate
9
9
  from credsweeper.deep_scanner.abstract_scanner import AbstractScanner
10
10
  from credsweeper.file_handler.data_content_provider import DataContentProvider
11
- from credsweeper.utils import Util
11
+ from credsweeper.utils.util import Util
12
12
 
13
13
  logger = logging.getLogger(__name__)
14
14
 
@@ -2,7 +2,7 @@ import logging
2
2
  from abc import ABC
3
3
  from typing import List, Optional
4
4
 
5
- from credsweeper.credentials import Candidate
5
+ from credsweeper.credentials.candidate import Candidate
6
6
  from credsweeper.deep_scanner.abstract_scanner import AbstractScanner
7
7
  from credsweeper.file_handler.data_content_provider import DataContentProvider
8
8
  from credsweeper.file_handler.string_content_provider import StringContentProvider
@@ -5,7 +5,7 @@ from abc import ABC
5
5
  from typing import List, Optional
6
6
 
7
7
  from credsweeper.common.constants import MIN_DATA_LEN, UTF_8
8
- from credsweeper.credentials import Candidate
8
+ from credsweeper.credentials.candidate import Candidate
9
9
  from credsweeper.deep_scanner.abstract_scanner import AbstractScanner
10
10
  from credsweeper.file_handler.data_content_provider import DataContentProvider
11
11
  from credsweeper.file_handler.struct_content_provider import StructContentProvider