credsweeper 1.11.0__tar.gz → 1.11.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.

Files changed (153) hide show
  1. {credsweeper-1.11.0 → credsweeper-1.11.1}/PKG-INFO +1 -1
  2. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/__init__.py +1 -1
  3. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/deep_scanner/deep_scanner.py +5 -0
  4. credsweeper-1.11.1/credsweeper/deep_scanner/tmx_scanner.py +45 -0
  5. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/utils/util.py +16 -4
  6. {credsweeper-1.11.0 → credsweeper-1.11.1}/.gitignore +0 -0
  7. {credsweeper-1.11.0 → credsweeper-1.11.1}/LICENSE +0 -0
  8. {credsweeper-1.11.0 → credsweeper-1.11.1}/README.md +0 -0
  9. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/__main__.py +0 -0
  10. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/app.py +0 -0
  11. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/common/__init__.py +0 -0
  12. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/common/constants.py +0 -0
  13. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/common/keyword_checklist.py +0 -0
  14. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/common/keyword_checklist.txt +0 -0
  15. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/common/keyword_pattern.py +0 -0
  16. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/common/morpheme_checklist.txt +0 -0
  17. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/config/__init__.py +0 -0
  18. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/config/config.py +0 -0
  19. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/credentials/__init__.py +0 -0
  20. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/credentials/augment_candidates.py +0 -0
  21. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/credentials/candidate.py +0 -0
  22. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/credentials/candidate_group_generator.py +0 -0
  23. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/credentials/candidate_key.py +0 -0
  24. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/credentials/credential_manager.py +0 -0
  25. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/credentials/line_data.py +0 -0
  26. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/deep_scanner/__init__.py +0 -0
  27. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/deep_scanner/abstract_scanner.py +0 -0
  28. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/deep_scanner/byte_scanner.py +0 -0
  29. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/deep_scanner/bzip2_scanner.py +0 -0
  30. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/deep_scanner/docx_scanner.py +0 -0
  31. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/deep_scanner/eml_scanner.py +0 -0
  32. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/deep_scanner/encoder_scanner.py +0 -0
  33. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/deep_scanner/gzip_scanner.py +0 -0
  34. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/deep_scanner/html_scanner.py +0 -0
  35. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/deep_scanner/jks_scanner.py +0 -0
  36. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/deep_scanner/lang_scanner.py +0 -0
  37. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/deep_scanner/mxfile_scanner.py +0 -0
  38. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/deep_scanner/pdf_scanner.py +0 -0
  39. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/deep_scanner/pkcs12_scanner.py +0 -0
  40. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/deep_scanner/pptx_scanner.py +0 -0
  41. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/deep_scanner/tar_scanner.py +0 -0
  42. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/deep_scanner/xlsx_scanner.py +0 -0
  43. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/deep_scanner/xml_scanner.py +0 -0
  44. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/deep_scanner/zip_scanner.py +0 -0
  45. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/file_handler/__init__.py +0 -0
  46. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/file_handler/abstract_provider.py +0 -0
  47. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/file_handler/analysis_target.py +0 -0
  48. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/file_handler/byte_content_provider.py +0 -0
  49. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/file_handler/content_provider.py +0 -0
  50. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/file_handler/data_content_provider.py +0 -0
  51. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/file_handler/descriptor.py +0 -0
  52. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/file_handler/diff_content_provider.py +0 -0
  53. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/file_handler/file_path_extractor.py +0 -0
  54. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/file_handler/files_provider.py +0 -0
  55. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/file_handler/patches_provider.py +0 -0
  56. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/file_handler/string_content_provider.py +0 -0
  57. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/file_handler/struct_content_provider.py +0 -0
  58. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/file_handler/text_content_provider.py +0 -0
  59. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/__init__.py +0 -0
  60. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/filter.py +0 -0
  61. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/group/__init__.py +0 -0
  62. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/group/general_keyword.py +0 -0
  63. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/group/general_pattern.py +0 -0
  64. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/group/group.py +0 -0
  65. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/group/password_keyword.py +0 -0
  66. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/group/token_pattern.py +0 -0
  67. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/group/url_credentials_group.py +0 -0
  68. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/group/weird_base36_token.py +0 -0
  69. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/group/weird_base64_token.py +0 -0
  70. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/line_git_binary_check.py +0 -0
  71. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/line_specific_key_check.py +0 -0
  72. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/line_uue_part_check.py +0 -0
  73. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_allowlist_check.py +0 -0
  74. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_array_dictionary_check.py +0 -0
  75. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_atlassian_token_check.py +0 -0
  76. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_azure_token_check.py +0 -0
  77. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_base32_data_check.py +0 -0
  78. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_base64_data_check.py +0 -0
  79. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_base64_encoded_pem_check.py +0 -0
  80. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_base64_key_check.py +0 -0
  81. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_base64_part_check.py +0 -0
  82. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_blocklist_check.py +0 -0
  83. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_camel_case_check.py +0 -0
  84. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_couple_keyword_check.py +0 -0
  85. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_dictionary_keyword_check.py +0 -0
  86. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_dictionary_value_length_check.py +0 -0
  87. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_discord_bot_check.py +0 -0
  88. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_entropy_base32_check.py +0 -0
  89. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_entropy_base36_check.py +0 -0
  90. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_entropy_base64_check.py +0 -0
  91. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_file_path_check.py +0 -0
  92. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_first_word_check.py +0 -0
  93. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_github_check.py +0 -0
  94. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_grafana_check.py +0 -0
  95. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_grafana_service_check.py +0 -0
  96. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_hex_number_check.py +0 -0
  97. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_jfrog_token_check.py +0 -0
  98. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_json_web_token_check.py +0 -0
  99. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_last_word_check.py +0 -0
  100. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_method_check.py +0 -0
  101. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_not_allowed_pattern_check.py +0 -0
  102. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_not_part_encoded_check.py +0 -0
  103. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_number_check.py +0 -0
  104. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_pattern_check.py +0 -0
  105. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_similarity_check.py +0 -0
  106. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_split_keyword_check.py +0 -0
  107. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_string_type_check.py +0 -0
  108. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_token_base32_check.py +0 -0
  109. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_token_base36_check.py +0 -0
  110. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_token_base64_check.py +0 -0
  111. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_token_base_check.py +0 -0
  112. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/filters/value_token_check.py +0 -0
  113. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/logger/__init__.py +0 -0
  114. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/logger/logger.py +0 -0
  115. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/ml_model/__init__.py +0 -0
  116. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/ml_model/features/__init__.py +0 -0
  117. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/ml_model/features/entropy_evaluation.py +0 -0
  118. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/ml_model/features/feature.py +0 -0
  119. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/ml_model/features/file_extension.py +0 -0
  120. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/ml_model/features/has_html_tag.py +0 -0
  121. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/ml_model/features/is_secret_numeric.py +0 -0
  122. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/ml_model/features/length_of_attribute.py +0 -0
  123. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/ml_model/features/morpheme_dense.py +0 -0
  124. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/ml_model/features/rule_name.py +0 -0
  125. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/ml_model/features/search_in_attribute.py +0 -0
  126. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/ml_model/features/word_in.py +0 -0
  127. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/ml_model/features/word_in_path.py +0 -0
  128. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/ml_model/features/word_in_postamble.py +0 -0
  129. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/ml_model/features/word_in_preamble.py +0 -0
  130. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/ml_model/features/word_in_transition.py +0 -0
  131. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/ml_model/features/word_in_value.py +0 -0
  132. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/ml_model/features/word_in_variable.py +0 -0
  133. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/ml_model/ml_config.json +0 -0
  134. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/ml_model/ml_model.onnx +0 -0
  135. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/ml_model/ml_validator.py +0 -0
  136. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/py.typed +0 -0
  137. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/rules/__init__.py +0 -0
  138. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/rules/config.yaml +0 -0
  139. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/rules/rule.py +0 -0
  140. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/scanner/__init__.py +0 -0
  141. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/scanner/scan_type/__init__.py +0 -0
  142. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/scanner/scan_type/multi_pattern.py +0 -0
  143. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/scanner/scan_type/pem_key_pattern.py +0 -0
  144. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/scanner/scan_type/scan_type.py +0 -0
  145. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/scanner/scan_type/single_pattern.py +0 -0
  146. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/scanner/scanner.py +0 -0
  147. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/secret/config.json +0 -0
  148. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/secret/log.yaml +0 -0
  149. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/utils/__init__.py +0 -0
  150. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/utils/entropy_validator.py +0 -0
  151. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/utils/hop_stat.py +0 -0
  152. {credsweeper-1.11.0 → credsweeper-1.11.1}/credsweeper/utils/pem_key_detector.py +0 -0
  153. {credsweeper-1.11.0 → credsweeper-1.11.1}/pyproject.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: credsweeper
3
- Version: 1.11.0
3
+ Version: 1.11.1
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
@@ -18,4 +18,4 @@ __all__ = [
18
18
  '__version__'
19
19
  ]
20
20
 
21
- __version__ = "1.11.0"
21
+ __version__ = "1.11.1"
@@ -28,6 +28,7 @@ from .pdf_scanner import PdfScanner
28
28
  from .pkcs12_scanner import Pkcs12Scanner
29
29
  from .pptx_scanner import PptxScanner
30
30
  from .tar_scanner import TarScanner
31
+ from .tmx_scanner import TmxScanner
31
32
  from .xlsx_scanner import XlsxScanner
32
33
  from .xml_scanner import XmlScanner
33
34
  from .zip_scanner import ZipScanner
@@ -126,6 +127,10 @@ class DeepScanner(
126
127
  deep_scanners.append(MxfileScanner)
127
128
  deep_scanners.append(XmlScanner)
128
129
  fallback_scanners.append(ByteScanner)
130
+ elif Util.is_tmx(data):
131
+ deep_scanners.append(TmxScanner)
132
+ fallback_scanners.append(XmlScanner)
133
+ fallback_scanners.append(ByteScanner)
129
134
  else:
130
135
  deep_scanners.append(XmlScanner)
131
136
  fallback_scanners.append(ByteScanner)
@@ -0,0 +1,45 @@
1
+ import logging
2
+ from abc import ABC
3
+ from typing import List, Optional
4
+
5
+ from lxml import etree
6
+
7
+ from credsweeper.common.constants import MIN_DATA_LEN
8
+ from credsweeper.credentials 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.string_content_provider import StringContentProvider
12
+ from credsweeper.utils import Util
13
+
14
+ logger = logging.getLogger(__name__)
15
+
16
+
17
+ class TmxScanner(AbstractScanner, ABC):
18
+ """Realises tmX files scanning for values only. Image tags are skipped."""
19
+
20
+ def data_scan(
21
+ self, #
22
+ data_provider: DataContentProvider, #
23
+ depth: int, #
24
+ recursive_limit_size: int) -> Optional[List[Candidate]]:
25
+ """Tries to represent data as xml text and scan as text lines"""
26
+ try:
27
+ lines = []
28
+ # the format is always in single line xlm, so line numbers are not actual
29
+ tree = etree.fromstring(data_provider.data)
30
+ for element in tree.iter():
31
+ tag = Util.extract_element_data(element, "tag")
32
+ if "Image" in tag:
33
+ continue
34
+ text = Util.extract_element_data(element, "text")
35
+ if MIN_DATA_LEN > len(text):
36
+ continue
37
+ lines.append(text)
38
+ tmx_data_provider = StringContentProvider(lines=lines,
39
+ file_path=data_provider.file_path,
40
+ file_type=data_provider.file_type,
41
+ info=f"{data_provider.info}|TMX")
42
+ return self.scanner.scan(tmx_data_provider)
43
+ except Exception as exc:
44
+ logger.warning("Cannot processed tmX file %s %s", str(data_provider.file_path), str(exc))
45
+ return None
@@ -517,6 +517,18 @@ class Util:
517
517
  return True
518
518
  return False
519
519
 
520
+ @staticmethod
521
+ def is_tmx(data: Union[bytes, bytearray]) -> bool:
522
+ """Used to detect tm7,tm6,etc. (ThreadModeling) format."""
523
+ if isinstance(data, (bytes, bytearray)):
524
+ for opening_tag, closing_tag in [(b"<ThreatModel", b"</ThreatModel>"),
525
+ (b"<KnowledgeBase", b"</KnowledgeBase>")]:
526
+ opening_pos = data.find(opening_tag, 0, MAX_LINE_LENGTH)
527
+ if 0 <= opening_pos < data.find(closing_tag, opening_pos):
528
+ # opening and closing tags were found - suppose it is an HTML
529
+ return True
530
+ return False
531
+
520
532
  # A well-formed XML must start from < or a whitespace character
521
533
  XML_FIRST_BRACKET_PATTERN = re.compile(rb"^\s*<")
522
534
  XML_OPENING_TAG_PATTERN = re.compile(rb"<([0-9A-Za-z_]{1,256})")
@@ -583,14 +595,14 @@ class Util:
583
595
  line_nums = []
584
596
  tree = etree.fromstringlist(xml_lines)
585
597
  for element in tree.iter():
586
- tag = Util._extract_element_data(element, "tag")
587
- text = Util._extract_element_data(element, "text")
598
+ tag = Util.extract_element_data(element, "tag")
599
+ text = Util.extract_element_data(element, "text")
588
600
  lines.append(f"{tag} : {text}")
589
601
  line_nums.append(element.sourceline)
590
602
  return lines, line_nums
591
603
 
592
604
  @staticmethod
593
- def _extract_element_data(element, attr) -> str:
605
+ def extract_element_data(element: Any, attr: str) -> str:
594
606
  """Extract xml element data to string.
595
607
 
596
608
  Try to extract the xml data and strip() the string.
@@ -605,7 +617,7 @@ class Util:
605
617
  """
606
618
  element_attr: Any = getattr(element, attr)
607
619
  if element_attr is None or not isinstance(element_attr, str):
608
- return ""
620
+ return ''
609
621
  return str(element_attr).strip()
610
622
 
611
623
  @staticmethod
File without changes
File without changes
File without changes