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.
- {credsweeper-1.11.5 → credsweeper-1.12.0}/PKG-INFO +1 -1
- credsweeper-1.12.0/credsweeper/__init__.py +27 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/__main__.py +141 -35
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/app.py +11 -11
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/common/keyword_pattern.py +13 -15
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/common/morpheme_checklist.txt +2 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/config/config.py +3 -3
- credsweeper-1.12.0/credsweeper/credentials/__init__.py +0 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/credentials/augment_candidates.py +1 -1
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/credentials/candidate.py +1 -1
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/credentials/credential_manager.py +1 -1
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/credentials/line_data.py +22 -2
- credsweeper-1.12.0/credsweeper/deep_scanner/__init__.py +0 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/abstract_scanner.py +3 -3
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/byte_scanner.py +1 -1
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/bzip2_scanner.py +2 -2
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/deb_scanner.py +1 -1
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/deep_scanner.py +3 -3
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/docx_scanner.py +1 -1
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/eml_scanner.py +1 -1
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/encoder_scanner.py +1 -1
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/gzip_scanner.py +2 -2
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/html_scanner.py +1 -1
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/jclass_scanner.py +1 -1
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/jks_scanner.py +1 -1
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/lang_scanner.py +1 -1
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/lzma_scanner.py +2 -2
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/mxfile_scanner.py +1 -1
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/pdf_scanner.py +1 -1
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/pkcs_scanner.py +2 -2
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/pptx_scanner.py +1 -1
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/rpm_scanner.py +1 -1
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/tar_scanner.py +2 -2
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/tmx_scanner.py +2 -2
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/xlsx_scanner.py +2 -2
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/xml_scanner.py +1 -1
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/zip_scanner.py +2 -2
- credsweeper-1.12.0/credsweeper/file_handler/__init__.py +0 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/file_handler/abstract_provider.py +3 -4
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/file_handler/byte_content_provider.py +1 -1
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/file_handler/content_provider.py +1 -1
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/file_handler/data_content_provider.py +1 -1
- credsweeper-1.12.0/credsweeper/file_handler/diff_content_provider.py +221 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/file_handler/file_path_extractor.py +2 -2
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/file_handler/files_provider.py +4 -4
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/file_handler/patches_provider.py +7 -8
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/file_handler/text_content_provider.py +1 -1
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/__init__.py +2 -3
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/filter.py +5 -3
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/group/__init__.py +0 -2
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/group/general_keyword.py +2 -2
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/group/general_pattern.py +2 -2
- credsweeper-1.12.0/credsweeper/filters/group/group.py +61 -0
- credsweeper-1.12.0/credsweeper/filters/group/password_keyword.py +19 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/group/token_pattern.py +3 -3
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/group/url_credentials_group.py +8 -8
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/group/weird_base36_token.py +3 -3
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/group/weird_base64_token.py +3 -3
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/line_git_binary_check.py +5 -4
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/line_specific_key_check.py +6 -5
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/line_uue_part_check.py +5 -4
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_allowlist_check.py +6 -5
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_array_dictionary_check.py +8 -6
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_atlassian_token_check.py +6 -5
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_azure_token_check.py +6 -5
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_base32_data_check.py +8 -5
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_base64_data_check.py +6 -5
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_base64_encoded_pem_check.py +6 -5
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_base64_key_check.py +6 -5
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_base64_part_check.py +6 -5
- credsweeper-1.12.0/credsweeper/filters/value_basic_auth_check.py +37 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_blocklist_check.py +6 -4
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_camel_case_check.py +6 -5
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_couple_keyword_check.py +6 -4
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_dictionary_keyword_check.py +6 -4
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_discord_bot_check.py +6 -5
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_entropy_base_check.py +6 -5
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_file_path_check.py +8 -5
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_github_check.py +5 -4
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_grafana_check.py +6 -5
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_grafana_service_check.py +5 -4
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_hex_number_check.py +5 -4
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_jfrog_token_check.py +6 -5
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_json_web_key_check.py +6 -5
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_json_web_token_check.py +6 -5
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_last_word_check.py +6 -4
- credsweeper-1.11.5/credsweeper/filters/value_dictionary_value_length_check.py → credsweeper-1.12.0/credsweeper/filters/value_length_check.py +12 -6
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_method_check.py +5 -4
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_not_allowed_pattern_check.py +6 -5
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_not_part_encoded_check.py +4 -4
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_number_check.py +5 -4
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_pattern_check.py +61 -41
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_similarity_check.py +6 -4
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_split_keyword_check.py +5 -4
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_string_type_check.py +9 -7
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_token_base_check.py +5 -4
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_token_check.py +6 -5
- credsweeper-1.12.0/credsweeper/logger/__init__.py +0 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/logger/logger.py +1 -1
- credsweeper-1.12.0/credsweeper/ml_model/__init__.py +0 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/features/__init__.py +1 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/features/entropy_evaluation.py +1 -1
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/features/feature.py +1 -1
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/features/file_extension.py +1 -1
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/features/has_html_tag.py +2 -2
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/features/is_secret_numeric.py +1 -1
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/features/length_of_attribute.py +1 -1
- credsweeper-1.12.0/credsweeper/ml_model/features/morpheme_dense.py +26 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/features/rule_name.py +1 -1
- credsweeper-1.12.0/credsweeper/ml_model/features/rule_severity.py +21 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/features/search_in_attribute.py +1 -1
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/features/word_in.py +1 -1
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/features/word_in_path.py +5 -2
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/features/word_in_postamble.py +1 -1
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/features/word_in_preamble.py +1 -1
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/features/word_in_transition.py +1 -1
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/features/word_in_value.py +1 -1
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/features/word_in_variable.py +1 -1
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/ml_config.json +130 -24
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/ml_model.onnx +0 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/ml_model/ml_validator.py +3 -2
- credsweeper-1.12.0/credsweeper/py.typed +0 -0
- credsweeper-1.12.0/credsweeper/rules/__init__.py +0 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/rules/config.yaml +116 -42
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/rules/rule.py +4 -3
- credsweeper-1.12.0/credsweeper/scanner/__init__.py +0 -0
- credsweeper-1.12.0/credsweeper/scanner/scan_type/__init__.py +0 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/scanner/scan_type/multi_pattern.py +4 -4
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/scanner/scan_type/pem_key_pattern.py +4 -4
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/scanner/scan_type/scan_type.py +4 -4
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/scanner/scan_type/single_pattern.py +4 -4
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/scanner/scanner.py +12 -8
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/secret/config.json +2 -2
- credsweeper-1.12.0/credsweeper/utils/__init__.py +0 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/utils/pem_key_detector.py +3 -3
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/utils/util.py +3 -132
- credsweeper-1.11.5/credsweeper/__init__.py +0 -21
- credsweeper-1.11.5/credsweeper/config/__init__.py +0 -1
- credsweeper-1.11.5/credsweeper/credentials/__init__.py +0 -5
- credsweeper-1.11.5/credsweeper/deep_scanner/__init__.py +0 -1
- credsweeper-1.11.5/credsweeper/file_handler/__init__.py +0 -15
- credsweeper-1.11.5/credsweeper/file_handler/diff_content_provider.py +0 -91
- credsweeper-1.11.5/credsweeper/filters/group/group.py +0 -59
- credsweeper-1.11.5/credsweeper/filters/group/password_keyword.py +0 -18
- credsweeper-1.11.5/credsweeper/logger/__init__.py +0 -1
- credsweeper-1.11.5/credsweeper/ml_model/__init__.py +0 -1
- credsweeper-1.11.5/credsweeper/ml_model/features/morpheme_dense.py +0 -19
- credsweeper-1.11.5/credsweeper/rules/__init__.py +0 -1
- credsweeper-1.11.5/credsweeper/scanner/__init__.py +0 -1
- credsweeper-1.11.5/credsweeper/scanner/scan_type/__init__.py +0 -5
- credsweeper-1.11.5/credsweeper/utils/__init__.py +0 -1
- {credsweeper-1.11.5 → credsweeper-1.12.0}/.gitignore +0 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/LICENSE +0 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/README.md +0 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/common/__init__.py +0 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/common/constants.py +0 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/common/keyword_checklist.py +0 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/common/keyword_checklist.txt +0 -0
- /credsweeper-1.11.5/credsweeper/py.typed → /credsweeper-1.12.0/credsweeper/config/__init__.py +0 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/credentials/candidate_group_generator.py +0 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/credentials/candidate_key.py +0 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/patch_scanner.py +0 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/deep_scanner/sqlite3_scanner.py +0 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/file_handler/analysis_target.py +0 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/file_handler/descriptor.py +0 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/file_handler/string_content_provider.py +0 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/file_handler/struct_content_provider.py +0 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_entropy_base32_check.py +0 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_entropy_base36_check.py +0 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_entropy_base64_check.py +0 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_token_base32_check.py +0 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_token_base36_check.py +0 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/filters/value_token_base64_check.py +0 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/secret/log.yaml +0 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/credsweeper/utils/hop_stat.py +0 -0
- {credsweeper-1.11.5 → credsweeper-1.12.0}/pyproject.toml +0 -0
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
|
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[
|
|
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[
|
|
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[
|
|
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[
|
|
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,
|
|
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>(([
|
|
9
|
-
|
|
10
|
-
|
|
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)
|
|
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)?=|:(?!:)|=(>|>|(\\\\*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"(
|
|
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_.]|::|-(>|>))*" \
|
|
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})?([
|
|
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)([
|
|
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
|
|
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, #
|
|
@@ -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.
|
|
43
|
-
self.
|
|
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
|
|
@@ -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
|
|
File without changes
|
|
@@ -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
|