credsweeper 1.11.6__tar.gz → 1.12.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of credsweeper might be problematic. Click here for more details.
- {credsweeper-1.11.6 → credsweeper-1.12.1}/PKG-INFO +1 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/__init__.py +1 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/common/keyword_pattern.py +13 -15
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/common/morpheme_checklist.txt +2 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/config/config.py +2 -2
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/credentials/line_data.py +20 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/__init__.py +1 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/filter.py +3 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/group/group.py +22 -31
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/group/password_keyword.py +7 -6
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/group/token_pattern.py +1 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/group/url_credentials_group.py +6 -6
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/group/weird_base36_token.py +1 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/group/weird_base64_token.py +1 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/line_git_binary_check.py +2 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/line_specific_key_check.py +2 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/line_uue_part_check.py +2 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_allowlist_check.py +2 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_array_dictionary_check.py +5 -3
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_atlassian_token_check.py +2 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_azure_token_check.py +2 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_base32_data_check.py +4 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_base64_data_check.py +2 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_base64_encoded_pem_check.py +2 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_base64_key_check.py +2 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_base64_part_check.py +2 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_basic_auth_check.py +2 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_blocklist_check.py +3 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_camel_case_check.py +2 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_couple_keyword_check.py +3 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_dictionary_keyword_check.py +3 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_discord_bot_check.py +2 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_entropy_base_check.py +2 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_file_path_check.py +3 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_github_check.py +2 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_grafana_check.py +2 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_grafana_service_check.py +2 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_hex_number_check.py +2 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_jfrog_token_check.py +2 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_json_web_key_check.py +2 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_json_web_token_check.py +2 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_last_word_check.py +3 -1
- credsweeper-1.11.6/credsweeper/filters/value_dictionary_value_length_check.py → credsweeper-1.12.1/credsweeper/filters/value_length_check.py +9 -3
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_method_check.py +2 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_not_allowed_pattern_check.py +2 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_not_part_encoded_check.py +1 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_number_check.py +2 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_pattern_check.py +58 -38
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_similarity_check.py +3 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_split_keyword_check.py +2 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_string_type_check.py +6 -4
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_token_base_check.py +2 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_token_check.py +3 -2
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/ml_model/features/__init__.py +1 -0
- credsweeper-1.12.1/credsweeper/ml_model/features/morpheme_dense.py +26 -0
- credsweeper-1.12.1/credsweeper/ml_model/features/rule_severity.py +21 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/ml_model/features/word_in_path.py +4 -1
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/ml_model/ml_config.json +130 -24
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/ml_model/ml_model.onnx +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/rules/config.yaml +107 -31
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/scanner/scanner.py +4 -3
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/secret/config.json +2 -2
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/utils/util.py +2 -0
- credsweeper-1.11.6/credsweeper/ml_model/features/morpheme_dense.py +0 -19
- {credsweeper-1.11.6 → credsweeper-1.12.1}/.gitignore +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/LICENSE +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/README.md +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/__main__.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/app.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/common/__init__.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/common/constants.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/common/keyword_checklist.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/common/keyword_checklist.txt +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/config/__init__.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/credentials/__init__.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/credentials/augment_candidates.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/credentials/candidate.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/credentials/candidate_group_generator.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/credentials/candidate_key.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/credentials/credential_manager.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/deep_scanner/__init__.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/deep_scanner/abstract_scanner.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/deep_scanner/byte_scanner.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/deep_scanner/bzip2_scanner.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/deep_scanner/deb_scanner.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/deep_scanner/deep_scanner.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/deep_scanner/docx_scanner.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/deep_scanner/eml_scanner.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/deep_scanner/encoder_scanner.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/deep_scanner/gzip_scanner.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/deep_scanner/html_scanner.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/deep_scanner/jclass_scanner.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/deep_scanner/jks_scanner.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/deep_scanner/lang_scanner.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/deep_scanner/lzma_scanner.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/deep_scanner/mxfile_scanner.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/deep_scanner/patch_scanner.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/deep_scanner/pdf_scanner.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/deep_scanner/pkcs_scanner.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/deep_scanner/pptx_scanner.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/deep_scanner/rpm_scanner.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/deep_scanner/sqlite3_scanner.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/deep_scanner/tar_scanner.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/deep_scanner/tmx_scanner.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/deep_scanner/xlsx_scanner.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/deep_scanner/xml_scanner.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/deep_scanner/zip_scanner.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/file_handler/__init__.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/file_handler/abstract_provider.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/file_handler/analysis_target.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/file_handler/byte_content_provider.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/file_handler/content_provider.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/file_handler/data_content_provider.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/file_handler/descriptor.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/file_handler/diff_content_provider.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/file_handler/file_path_extractor.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/file_handler/files_provider.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/file_handler/patches_provider.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/file_handler/string_content_provider.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/file_handler/struct_content_provider.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/file_handler/text_content_provider.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/group/__init__.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/group/general_keyword.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/group/general_pattern.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_entropy_base32_check.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_entropy_base36_check.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_entropy_base64_check.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_token_base32_check.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_token_base36_check.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_token_base64_check.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/logger/__init__.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/logger/logger.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/ml_model/__init__.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/ml_model/features/entropy_evaluation.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/ml_model/features/feature.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/ml_model/features/file_extension.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/ml_model/features/has_html_tag.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/ml_model/features/is_secret_numeric.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/ml_model/features/length_of_attribute.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/ml_model/features/rule_name.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/ml_model/features/search_in_attribute.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/ml_model/features/word_in.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/ml_model/features/word_in_postamble.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/ml_model/features/word_in_preamble.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/ml_model/features/word_in_transition.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/ml_model/features/word_in_value.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/ml_model/features/word_in_variable.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/ml_model/ml_validator.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/py.typed +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/rules/__init__.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/rules/rule.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/scanner/__init__.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/scanner/scan_type/__init__.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/scanner/scan_type/multi_pattern.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/scanner/scan_type/pem_key_pattern.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/scanner/scan_type/scan_type.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/scanner/scan_type/single_pattern.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/secret/log.yaml +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/utils/__init__.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/utils/hop_stat.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/utils/pem_key_detector.py +0 -0
- {credsweeper-1.11.6 → credsweeper-1.12.1}/pyproject.toml +0 -0
|
@@ -4,14 +4,12 @@ import re
|
|
|
4
4
|
class KeywordPattern:
|
|
5
5
|
"""Pattern set of keyword types"""
|
|
6
6
|
directive = r"(?P<directive>(?:(?:[#%]define|%global)(?:\s|\\t)|\bset))?"
|
|
7
|
-
key_left = r"(?:\\[nrt]|%[0-9a-f]{2}|\s)*" \
|
|
8
|
-
r"(?P<variable>(([
|
|
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, #
|
|
@@ -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)
|
|
@@ -137,6 +137,26 @@ class LineData:
|
|
|
137
137
|
|
|
138
138
|
def sanitize_value(self):
|
|
139
139
|
"""Clean found value from extra artifacts. Correct positions if changed."""
|
|
140
|
+
# process the quotation workaround before cached properties invocation
|
|
141
|
+
if not self.value_leftquote and not self.value_rightquote:
|
|
142
|
+
while self.value:
|
|
143
|
+
first_symbol_code = ord(self.value[0])
|
|
144
|
+
last_symbol_code = ord(self.value[-1])
|
|
145
|
+
if 0x2018 <= first_symbol_code <= 0x201B and 0x2018 <= last_symbol_code <= 0x201B:
|
|
146
|
+
self.value_leftquote = self.value_rightquote = "'"
|
|
147
|
+
self.value = self.value[:-1]
|
|
148
|
+
self.value_end -= 1
|
|
149
|
+
self.value = self.value[1:]
|
|
150
|
+
self.value_start += 1
|
|
151
|
+
elif 0x201C <= first_symbol_code <= 0x201F and 0x201C <= last_symbol_code <= 0x201F:
|
|
152
|
+
self.value_leftquote = self.value_rightquote = '"'
|
|
153
|
+
self.value = self.value[1:]
|
|
154
|
+
self.value_start += 1
|
|
155
|
+
self.value = self.value[:-1]
|
|
156
|
+
self.value_end -= 1
|
|
157
|
+
else:
|
|
158
|
+
break
|
|
159
|
+
|
|
140
160
|
if self.variable and self.value and not self.is_well_quoted_value:
|
|
141
161
|
# sanitize is actual step for keyword pattern only
|
|
142
162
|
_value = self.value
|
|
@@ -15,7 +15,6 @@ from credsweeper.filters.value_blocklist_check import ValueBlocklistCheck
|
|
|
15
15
|
from credsweeper.filters.value_camel_case_check import ValueCamelCaseCheck
|
|
16
16
|
from credsweeper.filters.value_couple_keyword_check import ValueCoupleKeywordCheck
|
|
17
17
|
from credsweeper.filters.value_dictionary_keyword_check import ValueDictionaryKeywordCheck
|
|
18
|
-
from credsweeper.filters.value_dictionary_value_length_check import ValueDictionaryValueLengthCheck
|
|
19
18
|
from credsweeper.filters.value_discord_bot_check import ValueDiscordBotCheck
|
|
20
19
|
from credsweeper.filters.value_entropy_base32_check import ValueEntropyBase32Check
|
|
21
20
|
from credsweeper.filters.value_entropy_base36_check import ValueEntropyBase36Check
|
|
@@ -29,6 +28,7 @@ from credsweeper.filters.value_jfrog_token_check import ValueJfrogTokenCheck
|
|
|
29
28
|
from credsweeper.filters.value_json_web_key_check import ValueJsonWebKeyCheck
|
|
30
29
|
from credsweeper.filters.value_json_web_token_check import ValueJsonWebTokenCheck
|
|
31
30
|
from credsweeper.filters.value_last_word_check import ValueLastWordCheck
|
|
31
|
+
from credsweeper.filters.value_length_check import ValueLengthCheck
|
|
32
32
|
from credsweeper.filters.value_method_check import ValueMethodCheck
|
|
33
33
|
from credsweeper.filters.value_not_allowed_pattern_check import ValueNotAllowedPatternCheck
|
|
34
34
|
from credsweeper.filters.value_not_part_encoded_check import ValueNotPartEncodedCheck
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
from abc import abstractmethod, ABC
|
|
2
|
+
from typing import Optional
|
|
2
3
|
|
|
3
4
|
from credsweeper.config.config import Config
|
|
4
5
|
from credsweeper.credentials.line_data import LineData
|
|
@@ -9,7 +10,8 @@ class Filter(ABC):
|
|
|
9
10
|
"""Base class for all filters that operates on 'line_data' objects."""
|
|
10
11
|
|
|
11
12
|
@abstractmethod
|
|
12
|
-
def __init__(self, config: Config, *args):
|
|
13
|
+
def __init__(self, config: Optional[Config], *args):
|
|
14
|
+
"""Config is optional for a filter"""
|
|
13
15
|
raise NotImplementedError()
|
|
14
16
|
|
|
15
17
|
@abstractmethod
|
|
@@ -24,12 +24,31 @@ class Group(ABC):
|
|
|
24
24
|
"""Abstract Group class"""
|
|
25
25
|
|
|
26
26
|
def __init__(self, config: Config, rule_type: GroupType = GroupType.DEFAULT) -> None:
|
|
27
|
+
"""Config is required for filter group"""
|
|
27
28
|
if rule_type == GroupType.KEYWORD:
|
|
28
|
-
self.
|
|
29
|
+
self.__filters = [ #
|
|
30
|
+
ValueAllowlistCheck(), #
|
|
31
|
+
ValueArrayDictionaryCheck(), #
|
|
32
|
+
ValueBlocklistCheck(), #
|
|
33
|
+
ValueCamelCaseCheck(), #
|
|
34
|
+
ValueFilePathCheck(), #
|
|
35
|
+
ValueHexNumberCheck(), #
|
|
36
|
+
ValueLastWordCheck(), #
|
|
37
|
+
ValueMethodCheck(), #
|
|
38
|
+
ValueSimilarityCheck(), #
|
|
39
|
+
ValueStringTypeCheck(check_for_literals=config.check_for_literals), #
|
|
40
|
+
ValueTokenCheck(), #
|
|
41
|
+
]
|
|
42
|
+
if not config.doc:
|
|
43
|
+
self.__filters.extend([ValuePatternCheck(), ValueNotAllowedPatternCheck()])
|
|
29
44
|
elif rule_type == GroupType.PATTERN:
|
|
30
|
-
self.
|
|
45
|
+
self.__filters = [ #
|
|
46
|
+
LineSpecificKeyCheck(), #
|
|
47
|
+
ValuePatternCheck(), #
|
|
48
|
+
]
|
|
31
49
|
else:
|
|
32
|
-
|
|
50
|
+
# GroupType.DEFAULT
|
|
51
|
+
self.__filters = []
|
|
33
52
|
|
|
34
53
|
@property
|
|
35
54
|
def filters(self) -> List[Filter]:
|
|
@@ -40,31 +59,3 @@ class Group(ABC):
|
|
|
40
59
|
def filters(self, filters: List[Filter]) -> None:
|
|
41
60
|
"""property setter"""
|
|
42
61
|
self.__filters = filters
|
|
43
|
-
|
|
44
|
-
@staticmethod
|
|
45
|
-
def get_keyword_base_filters(config: Config) -> List[Filter]:
|
|
46
|
-
"""returns base filters"""
|
|
47
|
-
filters = [ #
|
|
48
|
-
ValueAllowlistCheck(),
|
|
49
|
-
ValueArrayDictionaryCheck(),
|
|
50
|
-
ValueBlocklistCheck(),
|
|
51
|
-
ValueCamelCaseCheck(),
|
|
52
|
-
ValueFilePathCheck(),
|
|
53
|
-
ValueHexNumberCheck(),
|
|
54
|
-
ValueLastWordCheck(),
|
|
55
|
-
ValueMethodCheck(),
|
|
56
|
-
ValueSimilarityCheck(),
|
|
57
|
-
ValueStringTypeCheck(config),
|
|
58
|
-
ValueTokenCheck(),
|
|
59
|
-
]
|
|
60
|
-
if not config.doc:
|
|
61
|
-
filters.extend([ValuePatternCheck(pattern_len=config.pattern_len), ValueNotAllowedPatternCheck()])
|
|
62
|
-
return filters
|
|
63
|
-
|
|
64
|
-
@staticmethod
|
|
65
|
-
def get_pattern_base_filters(config: Config) -> List[Filter]:
|
|
66
|
-
"""return base filters for pattern"""
|
|
67
|
-
return [ #
|
|
68
|
-
LineSpecificKeyCheck(), #
|
|
69
|
-
ValuePatternCheck(pattern_len=config.pattern_len), #
|
|
70
|
-
]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from credsweeper.common.constants import GroupType
|
|
2
2
|
from credsweeper.config.config import Config
|
|
3
|
-
from credsweeper.filters import
|
|
3
|
+
from credsweeper.filters import ValueLengthCheck, LineGitBinaryCheck
|
|
4
4
|
from credsweeper.filters import ValueSplitKeywordCheck
|
|
5
5
|
from credsweeper.filters.group.group import Group
|
|
6
6
|
from credsweeper.filters.line_uue_part_check import LineUUEPartCheck
|
|
@@ -11,8 +11,9 @@ class PasswordKeyword(Group):
|
|
|
11
11
|
|
|
12
12
|
def __init__(self, config: Config) -> None:
|
|
13
13
|
super().__init__(config, GroupType.KEYWORD)
|
|
14
|
-
self.filters.extend(
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
14
|
+
self.filters.extend([
|
|
15
|
+
ValueLengthCheck(max_len=config.max_password_value_length),
|
|
16
|
+
ValueSplitKeywordCheck(),
|
|
17
|
+
LineGitBinaryCheck(),
|
|
18
|
+
LineUUEPartCheck()
|
|
19
|
+
])
|
{credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/group/url_credentials_group.py
RENAMED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
from credsweeper.common.constants import GroupType
|
|
2
2
|
from credsweeper.config.config import Config
|
|
3
3
|
from credsweeper.filters import (ValueAllowlistCheck, ValueArrayDictionaryCheck, ValueBlocklistCheck,
|
|
4
|
-
ValueCamelCaseCheck,
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
ValueCamelCaseCheck, ValueLengthCheck, ValueFilePathCheck, ValueLastWordCheck,
|
|
5
|
+
ValueMethodCheck, ValueNotAllowedPatternCheck, ValuePatternCheck, ValueStringTypeCheck,
|
|
6
|
+
ValueTokenCheck)
|
|
7
7
|
from credsweeper.filters.group.group import Group
|
|
8
8
|
|
|
9
9
|
|
|
@@ -25,9 +25,9 @@ class UrlCredentialsGroup(Group):
|
|
|
25
25
|
ValueFilePathCheck(),
|
|
26
26
|
ValueLastWordCheck(),
|
|
27
27
|
ValueMethodCheck(),
|
|
28
|
-
ValueStringTypeCheck(config),
|
|
28
|
+
ValueStringTypeCheck(check_for_literals=config.check_for_literals),
|
|
29
29
|
ValueNotAllowedPatternCheck(),
|
|
30
30
|
ValueTokenCheck(),
|
|
31
|
-
|
|
32
|
-
ValuePatternCheck(
|
|
31
|
+
ValueLengthCheck(max_len=config.max_url_cred_value_length),
|
|
32
|
+
ValuePatternCheck()
|
|
33
33
|
]
|
|
@@ -12,7 +12,7 @@ class WeirdBase36Token(Group):
|
|
|
12
12
|
super().__init__(config, GroupType.DEFAULT)
|
|
13
13
|
self.filters = [
|
|
14
14
|
ValueCoupleKeywordCheck(),
|
|
15
|
-
ValuePatternCheck(
|
|
15
|
+
ValuePatternCheck(),
|
|
16
16
|
ValueNumberCheck(),
|
|
17
17
|
ValueTokenBase36Check(),
|
|
18
18
|
ValueEntropyBase36Check()
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import base64
|
|
2
2
|
import contextlib
|
|
3
3
|
import re
|
|
4
|
+
from typing import Optional
|
|
4
5
|
|
|
5
6
|
from credsweeper.config.config import Config
|
|
6
7
|
from credsweeper.credentials.line_data import LineData
|
|
@@ -12,7 +13,7 @@ class LineGitBinaryCheck(Filter):
|
|
|
12
13
|
"""Checks that line is not a part of git binary patch"""
|
|
13
14
|
base85string = re.compile(r"^[A-Za-z][0-9A-Za-z!#$%&()*+;<=>?@^_`{|}~-]{6,65}$")
|
|
14
15
|
|
|
15
|
-
def __init__(self, config: Config = None) -> None:
|
|
16
|
+
def __init__(self, config: Optional[Config] = None) -> None:
|
|
16
17
|
pass
|
|
17
18
|
|
|
18
19
|
def run(self, line_data: LineData, target: AnalysisTarget) -> bool:
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import re
|
|
2
|
+
from typing import Optional
|
|
2
3
|
|
|
3
4
|
from credsweeper.common.constants import ML_HUNK
|
|
4
5
|
from credsweeper.config.config import Config
|
|
@@ -14,7 +15,7 @@ class LineSpecificKeyCheck(Filter):
|
|
|
14
15
|
NOT_ALLOWED = [r"example", r"\benc[\(\[]", r"\btrue\b", r"\bfalse\b"]
|
|
15
16
|
NOT_ALLOWED_PATTERN = re.compile(Util.get_regex_combine_or(NOT_ALLOWED), re.IGNORECASE)
|
|
16
17
|
|
|
17
|
-
def __init__(self, config: Config = None) -> None:
|
|
18
|
+
def __init__(self, config: Optional[Config] = None) -> None:
|
|
18
19
|
pass
|
|
19
20
|
|
|
20
21
|
def run(self, line_data: LineData, target: AnalysisTarget) -> bool:
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import re
|
|
2
|
+
from typing import Optional
|
|
2
3
|
|
|
3
4
|
from credsweeper.config.config import Config
|
|
4
5
|
from credsweeper.credentials.line_data import LineData
|
|
@@ -10,7 +11,7 @@ class LineUUEPartCheck(Filter):
|
|
|
10
11
|
"""Checks that line is not a part of UU encoding only for maximal line"""
|
|
11
12
|
uue_string = re.compile(r"^M[!-`]{60}$")
|
|
12
13
|
|
|
13
|
-
def __init__(self, config: Config = None) -> None:
|
|
14
|
+
def __init__(self, config: Optional[Config] = None) -> None:
|
|
14
15
|
pass
|
|
15
16
|
|
|
16
17
|
def run(self, line_data: LineData, target: AnalysisTarget) -> bool:
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import re
|
|
2
|
+
from typing import Optional
|
|
2
3
|
|
|
3
4
|
from credsweeper.config.config import Config
|
|
4
5
|
from credsweeper.credentials.line_data import LineData
|
|
@@ -40,7 +41,7 @@ class ValueAllowlistCheck(Filter):
|
|
|
40
41
|
|
|
41
42
|
ALLOWED_UNQUOTED_PATTERN = re.compile(Util.get_regex_combine_or(ALLOWED_UNQUOTED), flags=re.IGNORECASE)
|
|
42
43
|
|
|
43
|
-
def __init__(self, config: Config = None) -> None:
|
|
44
|
+
def __init__(self, config: Optional[Config] = None) -> None:
|
|
44
45
|
pass
|
|
45
46
|
|
|
46
47
|
def run(self, line_data: LineData, target: AnalysisTarget) -> bool:
|
{credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_array_dictionary_check.py
RENAMED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import re
|
|
2
|
+
from typing import Optional
|
|
2
3
|
|
|
3
4
|
from credsweeper.config.config import Config
|
|
4
5
|
from credsweeper.credentials.line_data import LineData
|
|
@@ -14,9 +15,9 @@ class ValueArrayDictionaryCheck(Filter):
|
|
|
14
15
|
`token = {'root'}` would be kept
|
|
15
16
|
"""
|
|
16
17
|
|
|
17
|
-
PATTERN = re.compile(r"\[
|
|
18
|
+
PATTERN = re.compile(r"\[['\"]?[^,]+['\"]?]")
|
|
18
19
|
|
|
19
|
-
def __init__(self, config: Config = None) -> None:
|
|
20
|
+
def __init__(self, config: Optional[Config] = None) -> None:
|
|
20
21
|
pass
|
|
21
22
|
|
|
22
23
|
def run(self, line_data: LineData, target: AnalysisTarget) -> bool:
|
|
@@ -32,11 +33,12 @@ class ValueArrayDictionaryCheck(Filter):
|
|
|
32
33
|
"""
|
|
33
34
|
if line_data.is_well_quoted_value:
|
|
34
35
|
return False
|
|
36
|
+
# not well quoted value
|
|
35
37
|
if line_data.wrap and "byte" in line_data.wrap.lower():
|
|
36
38
|
return False
|
|
37
39
|
if self.PATTERN.search(line_data.value):
|
|
38
40
|
return True
|
|
39
|
-
if line_data.wrap and
|
|
41
|
+
if line_data.wrap and (line_data.wrap.endswith('[') or line_data.wrap.endswith('(')):
|
|
40
42
|
return True
|
|
41
43
|
|
|
42
44
|
return False
|
{credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_atlassian_token_check.py
RENAMED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import binascii
|
|
2
2
|
import contextlib
|
|
3
|
+
from typing import Optional
|
|
3
4
|
|
|
4
5
|
from credsweeper.common.constants import LATIN_1, ASCII
|
|
5
6
|
from credsweeper.config.config import Config
|
|
@@ -12,7 +13,7 @@ from credsweeper.utils.util import Util
|
|
|
12
13
|
class ValueAtlassianTokenCheck(Filter):
|
|
13
14
|
"""Check that candidate have a known structure"""
|
|
14
15
|
|
|
15
|
-
def __init__(self, config: Config = None) -> None:
|
|
16
|
+
def __init__(self, config: Optional[Config] = None) -> None:
|
|
16
17
|
pass
|
|
17
18
|
|
|
18
19
|
def run(self, line_data: LineData, target: AnalysisTarget) -> bool:
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import contextlib
|
|
2
2
|
import json
|
|
3
|
+
from typing import Optional
|
|
3
4
|
|
|
4
5
|
from credsweeper.config.config import Config
|
|
5
6
|
from credsweeper.credentials.line_data import LineData
|
|
@@ -15,7 +16,7 @@ class ValueAzureTokenCheck(Filter):
|
|
|
15
16
|
https://learn.microsoft.com/en-us/azure/active-directory-b2c/access-tokens
|
|
16
17
|
"""
|
|
17
18
|
|
|
18
|
-
def __init__(self, config: Config = None) -> None:
|
|
19
|
+
def __init__(self, config: Optional[Config] = None) -> None:
|
|
19
20
|
pass
|
|
20
21
|
|
|
21
22
|
def run(self, line_data: LineData, target: AnalysisTarget) -> bool:
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import base64
|
|
2
2
|
import contextlib
|
|
3
3
|
import string
|
|
4
|
+
from typing import Optional
|
|
4
5
|
|
|
5
6
|
from credsweeper.config.config import Config
|
|
6
7
|
from credsweeper.credentials.line_data import LineData
|
|
@@ -14,7 +15,7 @@ class ValueBase32DataCheck(Filter):
|
|
|
14
15
|
Check that candidate is NOT an ascii encoded string with entropy check
|
|
15
16
|
"""
|
|
16
17
|
|
|
17
|
-
def __init__(self, config: Config = None) -> None:
|
|
18
|
+
def __init__(self, config: Optional[Config] = None) -> None:
|
|
18
19
|
pass
|
|
19
20
|
|
|
20
21
|
def run(self, line_data: LineData, target: AnalysisTarget) -> bool:
|
|
@@ -38,6 +39,8 @@ class ValueBase32DataCheck(Filter):
|
|
|
38
39
|
return True
|
|
39
40
|
# check whether decoded bytes have enough entropy
|
|
40
41
|
with contextlib.suppress(Exception):
|
|
42
|
+
if pad_remain := len(value) % 8:
|
|
43
|
+
value += '=' * (8 - pad_remain)
|
|
41
44
|
decoded = base64.b32decode(value)
|
|
42
45
|
return Util.is_ascii_entropy_validate(decoded)
|
|
43
46
|
return True
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import contextlib
|
|
2
2
|
import string
|
|
3
|
+
from typing import Optional
|
|
3
4
|
|
|
4
5
|
from credsweeper.config.config import Config
|
|
5
6
|
from credsweeper.credentials.line_data import LineData
|
|
@@ -13,7 +14,7 @@ class ValueBase64DataCheck(Filter):
|
|
|
13
14
|
Check that candidate is NOT an ascii encoded string with entropy check
|
|
14
15
|
"""
|
|
15
16
|
|
|
16
|
-
def __init__(self, config: Config = None) -> None:
|
|
17
|
+
def __init__(self, config: Optional[Config] = None) -> None:
|
|
17
18
|
pass
|
|
18
19
|
|
|
19
20
|
def run(self, line_data: LineData, target: AnalysisTarget) -> bool:
|
{credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_base64_encoded_pem_check.py
RENAMED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import contextlib
|
|
2
|
+
from typing import Optional
|
|
2
3
|
|
|
3
4
|
from credsweeper.common.constants import ASCII, PEM_BEGIN_PATTERN
|
|
4
5
|
from credsweeper.config.config import Config
|
|
@@ -12,7 +13,7 @@ from credsweeper.utils.util import Util
|
|
|
12
13
|
class ValueBase64EncodedPem(Filter):
|
|
13
14
|
"""Check that candidate contains base64 encoded pem private key"""
|
|
14
15
|
|
|
15
|
-
def __init__(self, config: Config = None) -> None:
|
|
16
|
+
def __init__(self, config: Optional[Config] = None) -> None:
|
|
16
17
|
self.config = config
|
|
17
18
|
|
|
18
19
|
def run(self, line_data: LineData, target: AnalysisTarget) -> bool:
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import contextlib
|
|
2
|
+
from typing import Optional
|
|
2
3
|
|
|
3
4
|
from credsweeper.config.config import Config
|
|
4
5
|
from credsweeper.credentials.line_data import LineData
|
|
@@ -12,7 +13,7 @@ class ValueBase64KeyCheck(Filter):
|
|
|
12
13
|
|
|
13
14
|
EXTRA_TRANS_TABLE = str.maketrans('', '', "\",'\\")
|
|
14
15
|
|
|
15
|
-
def __init__(self, config: Config = None) -> None:
|
|
16
|
+
def __init__(self, config: Optional[Config] = None) -> None:
|
|
16
17
|
self.config = config
|
|
17
18
|
|
|
18
19
|
def run(self, line_data: LineData, target: AnalysisTarget) -> bool:
|
|
@@ -2,6 +2,7 @@ import contextlib
|
|
|
2
2
|
import re
|
|
3
3
|
import statistics
|
|
4
4
|
from itertools import takewhile
|
|
5
|
+
from typing import Optional
|
|
5
6
|
|
|
6
7
|
from credsweeper.common.constants import Chars
|
|
7
8
|
from credsweeper.config.config import Config
|
|
@@ -20,7 +21,7 @@ class ValueBase64PartCheck(Filter):
|
|
|
20
21
|
base64_pattern = re.compile(r"^(\\{1,8}[0abfnrtv]|[0-9A-Za-z+/=]){1,4000}$")
|
|
21
22
|
base64_char_set = set(Chars.BASE64STDPAD_CHARS.value + '\\')
|
|
22
23
|
|
|
23
|
-
def __init__(self, config: Config = None) -> None:
|
|
24
|
+
def __init__(self, config: Optional[Config] = None) -> None:
|
|
24
25
|
pass
|
|
25
26
|
|
|
26
27
|
def run(self, line_data: LineData, target: AnalysisTarget) -> bool:
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import contextlib
|
|
2
|
+
from typing import Optional
|
|
2
3
|
|
|
3
4
|
from credsweeper.common.constants import DEFAULT_PATTERN_LEN, UTF_8
|
|
4
5
|
from credsweeper.config.config import Config
|
|
@@ -11,7 +12,7 @@ from credsweeper.utils.util import Util
|
|
|
11
12
|
class ValueBasicAuthCheck(Filter):
|
|
12
13
|
"""Check that candidate have a known structure"""
|
|
13
14
|
|
|
14
|
-
def __init__(self, config: Config = None) -> None:
|
|
15
|
+
def __init__(self, config: Optional[Config] = None) -> None:
|
|
15
16
|
pass
|
|
16
17
|
|
|
17
18
|
def run(self, line_data: LineData, target: AnalysisTarget) -> bool:
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
|
|
1
3
|
from credsweeper.config.config import Config
|
|
2
4
|
from credsweeper.credentials.line_data import LineData
|
|
3
5
|
from credsweeper.file_handler.analysis_target import AnalysisTarget
|
|
@@ -18,7 +20,7 @@ class ValueBlocklistCheck(Filter):
|
|
|
18
20
|
"undefined",
|
|
19
21
|
]
|
|
20
22
|
|
|
21
|
-
def __init__(self, config: Config = None) -> None:
|
|
23
|
+
def __init__(self, config: Optional[Config] = None) -> None:
|
|
22
24
|
pass
|
|
23
25
|
|
|
24
26
|
def run(self, line_data: LineData, target: AnalysisTarget) -> bool:
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import re
|
|
2
|
+
from typing import Optional
|
|
2
3
|
|
|
3
4
|
from credsweeper.common import static_keyword_checklist
|
|
4
5
|
from credsweeper.config.config import Config
|
|
@@ -14,7 +15,7 @@ class ValueCamelCaseCheck(Filter):
|
|
|
14
15
|
CAMEL_CASE = ["^([a-z]+([A-Z][a-z]+)+)$", "^([A-Z][a-z]+([A-Z][a-z]+)+)$"]
|
|
15
16
|
CAMEL_CASE_PATTERN = re.compile(Util.get_regex_combine_or(CAMEL_CASE))
|
|
16
17
|
|
|
17
|
-
def __init__(self, config: Config = None) -> None:
|
|
18
|
+
def __init__(self, config: Optional[Config] = None) -> None:
|
|
18
19
|
pass
|
|
19
20
|
|
|
20
21
|
def run(self, line_data: LineData, target: AnalysisTarget) -> bool:
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
|
|
1
3
|
from credsweeper.common import static_keyword_checklist
|
|
2
4
|
from credsweeper.config.config import Config
|
|
3
5
|
from credsweeper.credentials.line_data import LineData
|
|
@@ -8,7 +10,7 @@ from credsweeper.filters.filter import Filter
|
|
|
8
10
|
class ValueCoupleKeywordCheck(Filter):
|
|
9
11
|
"""Check value if TWO words from morphemes checklist exists in value"""
|
|
10
12
|
|
|
11
|
-
def __init__(self, config: Config = None, threshold=1) -> None:
|
|
13
|
+
def __init__(self, config: Optional[Config] = None, threshold=1) -> None:
|
|
12
14
|
# threshold - minimum morphemes number in a value
|
|
13
15
|
self.threshold = threshold
|
|
14
16
|
|
{credsweeper-1.11.6 → credsweeper-1.12.1}/credsweeper/filters/value_dictionary_keyword_check.py
RENAMED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
|
|
1
3
|
from credsweeper.common import static_keyword_checklist
|
|
2
4
|
from credsweeper.config.config import Config
|
|
3
5
|
from credsweeper.credentials.line_data import LineData
|
|
@@ -8,7 +10,7 @@ from credsweeper.filters.filter import Filter
|
|
|
8
10
|
class ValueDictionaryKeywordCheck(Filter):
|
|
9
11
|
"""Check that no word from dictionary present in the candidate value."""
|
|
10
12
|
|
|
11
|
-
def __init__(self, config: Config = None) -> None:
|
|
13
|
+
def __init__(self, config: Optional[Config] = None) -> None:
|
|
12
14
|
pass
|
|
13
15
|
|
|
14
16
|
def run(self, line_data: LineData, target: AnalysisTarget) -> bool:
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import contextlib
|
|
2
|
+
from typing import Optional
|
|
2
3
|
|
|
3
4
|
from credsweeper.config.config import Config
|
|
4
5
|
from credsweeper.credentials.line_data import LineData
|
|
@@ -11,7 +12,7 @@ from credsweeper.utils.util import Util
|
|
|
11
12
|
class ValueDiscordBotCheck(Filter):
|
|
12
13
|
"""Discord bot Token"""
|
|
13
14
|
|
|
14
|
-
def __init__(self, config: Config = None) -> None:
|
|
15
|
+
def __init__(self, config: Optional[Config] = None) -> None:
|
|
15
16
|
pass
|
|
16
17
|
|
|
17
18
|
def run(self, line_data: LineData, target: AnalysisTarget) -> bool:
|