credsweeper 1.13.1__tar.gz → 1.13.2__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.

Potentially problematic release.


This version of credsweeper might be problematic. Click here for more details.

Files changed (164) hide show
  1. {credsweeper-1.13.1 → credsweeper-1.13.2}/PKG-INFO +1 -1
  2. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/__init__.py +1 -1
  3. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/deep_scanner/abstract_scanner.py +1 -0
  4. credsweeper-1.13.2/credsweeper/deep_scanner/csv_scanner.py +71 -0
  5. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/deep_scanner/deep_scanner.py +6 -2
  6. {credsweeper-1.13.1 → credsweeper-1.13.2}/.gitignore +0 -0
  7. {credsweeper-1.13.1 → credsweeper-1.13.2}/LICENSE +0 -0
  8. {credsweeper-1.13.1 → credsweeper-1.13.2}/README.md +0 -0
  9. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/__main__.py +0 -0
  10. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/app.py +0 -0
  11. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/common/__init__.py +0 -0
  12. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/common/constants.py +0 -0
  13. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/common/keyword_checklist.py +0 -0
  14. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/common/keyword_checklist.txt +0 -0
  15. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/common/keyword_pattern.py +0 -0
  16. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/common/morpheme_checklist.txt +0 -0
  17. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/config/__init__.py +0 -0
  18. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/config/config.py +0 -0
  19. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/credentials/__init__.py +0 -0
  20. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/credentials/augment_candidates.py +0 -0
  21. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/credentials/candidate.py +0 -0
  22. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/credentials/candidate_group_generator.py +0 -0
  23. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/credentials/candidate_key.py +0 -0
  24. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/credentials/credential_manager.py +0 -0
  25. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/credentials/line_data.py +0 -0
  26. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/deep_scanner/__init__.py +0 -0
  27. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/deep_scanner/byte_scanner.py +0 -0
  28. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/deep_scanner/bzip2_scanner.py +0 -0
  29. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/deep_scanner/deb_scanner.py +0 -0
  30. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/deep_scanner/docx_scanner.py +0 -0
  31. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/deep_scanner/eml_scanner.py +0 -0
  32. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/deep_scanner/encoder_scanner.py +0 -0
  33. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/deep_scanner/gzip_scanner.py +0 -0
  34. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/deep_scanner/html_scanner.py +0 -0
  35. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/deep_scanner/jclass_scanner.py +0 -0
  36. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/deep_scanner/jks_scanner.py +0 -0
  37. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/deep_scanner/lang_scanner.py +0 -0
  38. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/deep_scanner/lzma_scanner.py +0 -0
  39. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/deep_scanner/mxfile_scanner.py +0 -0
  40. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/deep_scanner/patch_scanner.py +0 -0
  41. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/deep_scanner/pdf_scanner.py +0 -0
  42. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/deep_scanner/pkcs_scanner.py +0 -0
  43. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/deep_scanner/pptx_scanner.py +0 -0
  44. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/deep_scanner/rpm_scanner.py +0 -0
  45. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/deep_scanner/rtf_scanner.py +0 -0
  46. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/deep_scanner/sqlite3_scanner.py +0 -0
  47. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/deep_scanner/strings_scanner.py +0 -0
  48. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/deep_scanner/tar_scanner.py +0 -0
  49. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/deep_scanner/tmx_scanner.py +0 -0
  50. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/deep_scanner/xlsx_scanner.py +0 -0
  51. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/deep_scanner/xml_scanner.py +0 -0
  52. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/deep_scanner/zip_scanner.py +0 -0
  53. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/file_handler/__init__.py +0 -0
  54. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/file_handler/abstract_provider.py +0 -0
  55. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/file_handler/analysis_target.py +0 -0
  56. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/file_handler/byte_content_provider.py +0 -0
  57. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/file_handler/content_provider.py +0 -0
  58. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/file_handler/data_content_provider.py +0 -0
  59. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/file_handler/descriptor.py +0 -0
  60. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/file_handler/diff_content_provider.py +0 -0
  61. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/file_handler/file_path_extractor.py +0 -0
  62. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/file_handler/files_provider.py +0 -0
  63. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/file_handler/patches_provider.py +0 -0
  64. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/file_handler/string_content_provider.py +0 -0
  65. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/file_handler/struct_content_provider.py +0 -0
  66. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/file_handler/text_content_provider.py +0 -0
  67. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/__init__.py +0 -0
  68. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/filter.py +0 -0
  69. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/group/__init__.py +0 -0
  70. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/group/general_keyword.py +0 -0
  71. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/group/general_pattern.py +0 -0
  72. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/group/group.py +0 -0
  73. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/group/password_keyword.py +0 -0
  74. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/group/token_pattern.py +0 -0
  75. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/group/url_credentials_group.py +0 -0
  76. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/group/weird_base36_token.py +0 -0
  77. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/group/weird_base64_token.py +0 -0
  78. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/line_git_binary_check.py +0 -0
  79. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/line_specific_key_check.py +0 -0
  80. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/line_uue_part_check.py +0 -0
  81. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_allowlist_check.py +0 -0
  82. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_array_dictionary_check.py +0 -0
  83. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_atlassian_token_check.py +0 -0
  84. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_azure_token_check.py +0 -0
  85. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_base32_data_check.py +0 -0
  86. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_base64_data_check.py +0 -0
  87. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_base64_encoded_pem_check.py +0 -0
  88. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_base64_key_check.py +0 -0
  89. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_base64_part_check.py +0 -0
  90. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_basic_auth_check.py +0 -0
  91. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_blocklist_check.py +0 -0
  92. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_camel_case_check.py +0 -0
  93. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_dictionary_keyword_check.py +0 -0
  94. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_discord_bot_check.py +0 -0
  95. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_entropy_base32_check.py +0 -0
  96. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_entropy_base36_check.py +0 -0
  97. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_entropy_base64_check.py +0 -0
  98. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_entropy_base_check.py +0 -0
  99. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_file_path_check.py +0 -0
  100. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_github_check.py +0 -0
  101. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_grafana_check.py +0 -0
  102. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_grafana_service_check.py +0 -0
  103. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_hex_number_check.py +0 -0
  104. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_jfrog_token_check.py +0 -0
  105. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_json_web_key_check.py +0 -0
  106. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_json_web_token_check.py +0 -0
  107. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_last_word_check.py +0 -0
  108. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_length_check.py +0 -0
  109. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_method_check.py +0 -0
  110. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_morphemes_check.py +0 -0
  111. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_not_allowed_pattern_check.py +0 -0
  112. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_not_part_encoded_check.py +0 -0
  113. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_number_check.py +0 -0
  114. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_pattern_check.py +0 -0
  115. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_similarity_check.py +0 -0
  116. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_split_keyword_check.py +0 -0
  117. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_string_type_check.py +0 -0
  118. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_token_base32_check.py +0 -0
  119. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_token_base36_check.py +0 -0
  120. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_token_base64_check.py +0 -0
  121. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_token_base_check.py +0 -0
  122. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/filters/value_token_check.py +0 -0
  123. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/logger/__init__.py +0 -0
  124. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/logger/logger.py +0 -0
  125. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/ml_model/__init__.py +0 -0
  126. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/ml_model/features/__init__.py +0 -0
  127. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/ml_model/features/entropy_evaluation.py +0 -0
  128. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/ml_model/features/feature.py +0 -0
  129. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/ml_model/features/file_extension.py +0 -0
  130. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/ml_model/features/has_html_tag.py +0 -0
  131. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/ml_model/features/is_secret_numeric.py +0 -0
  132. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/ml_model/features/length_of_attribute.py +0 -0
  133. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/ml_model/features/morpheme_dense.py +0 -0
  134. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/ml_model/features/rule_name.py +0 -0
  135. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/ml_model/features/rule_severity.py +0 -0
  136. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/ml_model/features/search_in_attribute.py +0 -0
  137. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/ml_model/features/word_in.py +0 -0
  138. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/ml_model/features/word_in_path.py +0 -0
  139. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/ml_model/features/word_in_postamble.py +0 -0
  140. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/ml_model/features/word_in_preamble.py +0 -0
  141. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/ml_model/features/word_in_transition.py +0 -0
  142. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/ml_model/features/word_in_value.py +0 -0
  143. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/ml_model/features/word_in_variable.py +0 -0
  144. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/ml_model/ml_config.json +0 -0
  145. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/ml_model/ml_model.onnx +0 -0
  146. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/ml_model/ml_validator.py +0 -0
  147. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/py.typed +0 -0
  148. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/rules/__init__.py +0 -0
  149. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/rules/config.yaml +0 -0
  150. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/rules/rule.py +0 -0
  151. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/scanner/__init__.py +0 -0
  152. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/scanner/scan_type/__init__.py +0 -0
  153. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/scanner/scan_type/multi_pattern.py +0 -0
  154. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/scanner/scan_type/pem_key_pattern.py +0 -0
  155. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/scanner/scan_type/scan_type.py +0 -0
  156. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/scanner/scan_type/single_pattern.py +0 -0
  157. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/scanner/scanner.py +0 -0
  158. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/secret/config.json +0 -0
  159. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/secret/log.yaml +0 -0
  160. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/utils/__init__.py +0 -0
  161. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/utils/hop_stat.py +0 -0
  162. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/utils/pem_key_detector.py +0 -0
  163. {credsweeper-1.13.1 → credsweeper-1.13.2}/credsweeper/utils/util.py +0 -0
  164. {credsweeper-1.13.1 → credsweeper-1.13.2}/pyproject.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: credsweeper
3
- Version: 1.13.1
3
+ Version: 1.13.2
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.13.1"
27
+ __version__ = "1.13.2"
@@ -51,6 +51,7 @@ class AbstractScanner(ABC):
51
51
  @abstractmethod
52
52
  def get_deep_scanners(data: bytes, descriptor: Descriptor, depth: int) -> Tuple[List[Any], List[Any]]:
53
53
  """Returns possibly scan methods for the data depends on content and fallback scanners"""
54
+ raise NotImplementedError(__name__)
54
55
 
55
56
  # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
56
57
 
@@ -0,0 +1,71 @@
1
+ import csv
2
+ import io
3
+ import logging
4
+ from abc import ABC
5
+ from typing import List, Optional, Dict, Any
6
+
7
+ from credsweeper.common.constants import MAX_LINE_LENGTH
8
+ from credsweeper.credentials.candidate import Candidate
9
+ from credsweeper.deep_scanner.abstract_scanner import AbstractScanner
10
+ from credsweeper.file_handler.data_content_provider import DataContentProvider
11
+ from credsweeper.file_handler.struct_content_provider import StructContentProvider
12
+
13
+ logger = logging.getLogger(__name__)
14
+
15
+
16
+ class CsvScanner(AbstractScanner, ABC):
17
+ """Implements CSV scanning"""
18
+
19
+ sniffer = csv.Sniffer()
20
+ # do not use space as separator to avoid hallucinations
21
+ delimiters = ",;\t|\x1F"
22
+
23
+ @classmethod
24
+ def get_structure(cls, text: str) -> List[Dict[str, Any]]:
25
+ """Reads a text as CSV standard with guessed dialect"""
26
+ # windows style \r\n
27
+ first_line_end = text.find('\r', 0, MAX_LINE_LENGTH)
28
+ line_terminator = "\r\n"
29
+ if 0 > first_line_end:
30
+ # unix style \n
31
+ first_line_end = text.find('\n', 0, MAX_LINE_LENGTH)
32
+ line_terminator = "\n"
33
+ if 0 > first_line_end:
34
+ raise ValueError(f"No suitable line end found in {MAX_LINE_LENGTH} symbols")
35
+
36
+ first_line = text[:first_line_end]
37
+ dialect = cls.sniffer.sniff(first_line, delimiters=cls.delimiters)
38
+ rows = []
39
+ reader = csv.DictReader(io.StringIO(text),
40
+ delimiter=dialect.delimiter,
41
+ lineterminator=line_terminator,
42
+ strict=True)
43
+ # check the constant columns number for all rows
44
+ fields_number = sum(1 for x in reader.fieldnames if x is not None)
45
+ for row in reader:
46
+ if not isinstance(row, dict):
47
+ raise ValueError(f"ERROR: wrong row '{row}'")
48
+ if len(row) != fields_number or any(x is None for x in row.values()):
49
+ # None means no separator used
50
+ raise ValueError(f"Different columns number in row '{row}' - mismatch {fields_number}")
51
+ rows.append(row)
52
+ return rows
53
+
54
+ def data_scan(
55
+ self, #
56
+ data_provider: DataContentProvider, #
57
+ depth: int, #
58
+ recursive_limit_size: int) -> Optional[List[Candidate]]:
59
+ """Tries to scan each row as structure with column name in key"""
60
+ try:
61
+ if rows := self.get_structure(data_provider.text):
62
+ struct_content_provider = StructContentProvider(struct=rows,
63
+ file_path=data_provider.file_path,
64
+ file_type=data_provider.file_type,
65
+ info=f"{data_provider.info}|CSV")
66
+ new_limit = recursive_limit_size - sum(len(x) for x in rows)
67
+ struct_candidates = self.structure_scan(struct_content_provider, depth, new_limit)
68
+ return struct_candidates
69
+ except Exception as csv_exc:
70
+ logger.debug(f"{data_provider.file_path}:{csv_exc}")
71
+ return None
@@ -6,6 +6,7 @@ from credsweeper.scanner.scanner import Scanner
6
6
  from credsweeper.utils.util import Util
7
7
  from .byte_scanner import ByteScanner
8
8
  from .bzip2_scanner import Bzip2Scanner
9
+ from .csv_scanner import CsvScanner
9
10
  from .deb_scanner import DebScanner
10
11
  from .docx_scanner import DocxScanner
11
12
  from .eml_scanner import EmlScanner
@@ -39,6 +40,7 @@ class DeepScanner(
39
40
  ByteScanner, #
40
41
  Bzip2Scanner, #
41
42
  DocxScanner, #
43
+ CsvScanner, #
42
44
  EncoderScanner, #
43
45
  GzipScanner, #
44
46
  HtmlScanner, #
@@ -160,16 +162,18 @@ class DeepScanner(
160
162
  deep_scanners.append(EmlScanner)
161
163
  else:
162
164
  if 0 < depth:
163
- # formal patch looks like an eml
165
+ # a formal patch looks like an eml
164
166
  deep_scanners.append(PatchScanner)
165
167
  fallback_scanners.append(EmlScanner)
166
168
  fallback_scanners.append(ByteScanner)
167
169
  elif not Util.is_binary(data):
170
+ # keep ByteScanner first to apply real value position if possible
171
+ deep_scanners.append(ByteScanner)
168
172
  if 0 < depth:
169
173
  deep_scanners.append(PatchScanner)
170
174
  deep_scanners.append(EncoderScanner)
171
175
  deep_scanners.append(LangScanner)
172
- deep_scanners.append(ByteScanner)
176
+ deep_scanners.append(CsvScanner)
173
177
  else:
174
178
  if 0 < depth:
175
179
  deep_scanners.append(StringsScanner)
File without changes
File without changes
File without changes