txt2stix 1.0.4__tar.gz → 1.0.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (259) hide show
  1. {txt2stix-1.0.4 → txt2stix-1.0.6}/.github/workflows/run-tests.yml +13 -10
  2. {txt2stix-1.0.4 → txt2stix-1.0.6}/PKG-INFO +26 -1
  3. {txt2stix-1.0.4 → txt2stix-1.0.6}/README.md +25 -0
  4. {txt2stix-1.0.4 → txt2stix-1.0.6}/pyproject.toml +1 -1
  5. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/src/test_main.py +9 -0
  6. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/ai_extractor/base.py +10 -0
  7. txt2stix-1.0.6/txt2stix/credential_checker.py +97 -0
  8. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/retriever.py +5 -5
  9. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/txt2stix.py +7 -1
  10. {txt2stix-1.0.4 → txt2stix-1.0.6}/.env.example +0 -0
  11. {txt2stix-1.0.4 → txt2stix-1.0.6}/.env.markdown +0 -0
  12. {txt2stix-1.0.4 → txt2stix-1.0.6}/.github/workflows/create-release.yml +0 -0
  13. {txt2stix-1.0.4 → txt2stix-1.0.6}/.gitignore +0 -0
  14. {txt2stix-1.0.4 → txt2stix-1.0.6}/LICENSE +0 -0
  15. {txt2stix-1.0.4 → txt2stix-1.0.6}/docs/README.md +0 -0
  16. {txt2stix-1.0.4 → txt2stix-1.0.6}/docs/stix-mapping.md +0 -0
  17. {txt2stix-1.0.4 → txt2stix-1.0.6}/docs/txt2stix.png +0 -0
  18. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/__init__.py +0 -0
  19. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/extractions/ai/config.yaml +0 -0
  20. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/extractions/lookup/config.yaml +0 -0
  21. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/extractions/pattern/config.yaml +0 -0
  22. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/helpers/mimetype_filename_extension_list.csv +0 -0
  23. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/helpers/stix_relationship_types.txt +0 -0
  24. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/helpers/tlds.txt +0 -0
  25. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/helpers/windows_registry_key_prefix.txt +0 -0
  26. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/lookups/_README.md +0 -0
  27. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/lookups/_generate_lookups.py +0 -0
  28. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/lookups/attack_pattern.txt +0 -0
  29. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/lookups/campaign.txt +0 -0
  30. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/lookups/country_iso3166_alpha2.txt +0 -0
  31. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/lookups/course_of_action.txt +0 -0
  32. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/lookups/disarm_id_v1_5.txt +0 -0
  33. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/lookups/disarm_name_v1_5.txt +0 -0
  34. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/lookups/extensions.txt +0 -0
  35. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/lookups/identity.txt +0 -0
  36. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/lookups/infrastructure.txt +0 -0
  37. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/lookups/intrusion_set.txt +0 -0
  38. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/lookups/malware.txt +0 -0
  39. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/lookups/mitre_atlas_id_v4_5_2.txt +0 -0
  40. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/lookups/mitre_atlas_name_v4_5_2.txt +0 -0
  41. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/lookups/mitre_attack_enterprise_aliases_v16_0.txt +0 -0
  42. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/lookups/mitre_attack_enterprise_id_v16_0.txt +0 -0
  43. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/lookups/mitre_attack_enterprise_name_v16_0.txt +0 -0
  44. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/lookups/mitre_attack_ics_aliases_v16_0.txt +0 -0
  45. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/lookups/mitre_attack_ics_id_v16_0.txt +0 -0
  46. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/lookups/mitre_attack_ics_name_v16_0.txt +0 -0
  47. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/lookups/mitre_attack_mobile_aliases_v16_0.txt +0 -0
  48. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/lookups/mitre_attack_mobile_id_v16_0.txt +0 -0
  49. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/lookups/mitre_attack_mobile_name_v16_0.txt +0 -0
  50. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/lookups/mitre_capec_id_v3_9.txt +0 -0
  51. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/lookups/mitre_capec_name_v3_9.txt +0 -0
  52. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/lookups/mitre_cwe_id_v4_15.txt +0 -0
  53. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/lookups/mitre_cwe_name_v4_15.txt +0 -0
  54. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/lookups/threat_actor.txt +0 -0
  55. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/lookups/tld.txt +0 -0
  56. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/lookups/tool.txt +0 -0
  57. {txt2stix-1.0.4 → txt2stix-1.0.6}/includes/tests/test_cases.yaml +0 -0
  58. {txt2stix-1.0.4 → txt2stix-1.0.6}/requirements.txt +0 -0
  59. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/README.md +0 -0
  60. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/ai_country.txt +0 -0
  61. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/ai_mitre_attack_enterprise.txt +0 -0
  62. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/ai_mitre_attack_ics.txt +0 -0
  63. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/ai_mitre_attack_mobile.txt +0 -0
  64. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/ai_mitre_capec.txt +0 -0
  65. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/ai_mitre_cwe.txt +0 -0
  66. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/all_cases.txt +0 -0
  67. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_autonomous_system_number.txt +0 -0
  68. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_bank_card_all.txt +0 -0
  69. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_bank_card_amex.txt +0 -0
  70. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_bank_card_diners.txt +0 -0
  71. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_bank_card_discover.txt +0 -0
  72. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_bank_card_jcb.txt +0 -0
  73. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_bank_card_mastercard.txt +0 -0
  74. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_bank_card_union_pay.txt +0 -0
  75. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_bank_card_visa.txt +0 -0
  76. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_country_alpha2.txt +0 -0
  77. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_cpe_uri.txt +0 -0
  78. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_cryptocurrency_btc_transaction.txt +0 -0
  79. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_cryptocurrency_btc_wallet.txt +0 -0
  80. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_cryptocurrency_eth_transaction.txt +0 -0
  81. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_cryptocurrency_eth_wallet.txt +0 -0
  82. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_cryptocurrency_xmr_transaction.txt +0 -0
  83. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_cryptocurrency_xmr_wallet.txt +0 -0
  84. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_cve_id.txt +0 -0
  85. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_directory_unix.txt +0 -0
  86. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_directory_unix_file.txt +0 -0
  87. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_directory_windows.txt +0 -0
  88. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_directory_windows_with_file.txt +0 -0
  89. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_disarm.txt +0 -0
  90. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_disarm_name.txt +0 -0
  91. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_domain_name_only.txt +0 -0
  92. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_domain_name_subdomain.txt +0 -0
  93. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_email_address.txt +0 -0
  94. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_file_hash_md5.txt +0 -0
  95. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_file_hash_sha_1.txt +0 -0
  96. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_file_hash_sha_224.txt +0 -0
  97. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_file_hash_sha_256.txt +0 -0
  98. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_file_hash_sha_384.txt +0 -0
  99. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_file_hash_sha_512.txt +0 -0
  100. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_file_name.txt +0 -0
  101. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_host_name.txt +0 -0
  102. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_host_name_file.txt +0 -0
  103. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_host_name_path.txt +0 -0
  104. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_host_name_subdomain.txt +0 -0
  105. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_host_name_url.txt +0 -0
  106. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_iban_number.txt +0 -0
  107. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_ipv4_address_cidr.txt +0 -0
  108. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_ipv4_address_only.txt +0 -0
  109. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_ipv4_address_port.txt +0 -0
  110. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_ipv6_address_cidr.txt +0 -0
  111. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_ipv6_address_only.txt +0 -0
  112. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_ipv6_address_port.txt +0 -0
  113. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_mac_address.txt +0 -0
  114. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_mitre_atlas.txt +0 -0
  115. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_mitre_atlas_name.txt +0 -0
  116. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_mitre_attack_enterprise.txt +0 -0
  117. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_mitre_attack_enterprise_aliases.txt +0 -0
  118. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_mitre_attack_enterprise_name.txt +0 -0
  119. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_mitre_attack_ics.txt +0 -0
  120. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_mitre_attack_ics_aliases.txt +0 -0
  121. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_mitre_attack_ics_name.txt +0 -0
  122. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_mitre_attack_mobile.txt +0 -0
  123. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_mitre_attack_mobile_aliases.txt +0 -0
  124. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_mitre_attack_mobile_name.txt +0 -0
  125. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_mitre_capec.txt +0 -0
  126. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_mitre_capec_name.txt +0 -0
  127. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_mitre_cwe.txt +0 -0
  128. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_mitre_cwe_name.txt +0 -0
  129. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_phone_number.txt +0 -0
  130. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_url.txt +0 -0
  131. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_url_file.txt +0 -0
  132. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_url_path.txt +0 -0
  133. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_user_agent.txt +0 -0
  134. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/generic_windows_registry_key.txt +0 -0
  135. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/lookup_attack_pattern.txt +0 -0
  136. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/lookup_campaign.txt +0 -0
  137. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/lookup_course_of_action.txt +0 -0
  138. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/lookup_identity.txt +0 -0
  139. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/lookup_infrastructure.txt +0 -0
  140. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/lookup_intrusion_set.txt +0 -0
  141. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/lookup_malware.txt +0 -0
  142. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/lookup_threat_actor.txt +0 -0
  143. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/extraction_types/lookup_tool.txt +0 -0
  144. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/manually_generated_reports/attack_flow_demo.txt +0 -0
  145. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/manually_generated_reports/attack_navigator_demo.txt +0 -0
  146. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/manually_generated_reports/basic_relationship.txt +0 -0
  147. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/manually_generated_reports/char_length_too_long.txt +0 -0
  148. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/manually_generated_reports/descriptive_for_ai_relationships_1.txt +0 -0
  149. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/manually_generated_reports/disarm_demo.txt +0 -0
  150. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/manually_generated_reports/embedded_img_ignore.txt +0 -0
  151. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/manually_generated_reports/embedded_link_ignore.txt +0 -0
  152. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/manually_generated_reports/ip1.txt +0 -0
  153. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/manually_generated_reports/ip2.txt +0 -0
  154. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/manually_generated_reports/known_whitelist_match.txt +0 -0
  155. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/manually_generated_reports/mitre_attack_enterprise_ai_demo.txt +0 -0
  156. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/manually_generated_reports/mitre_attack_enterprise_lookup_demo.txt +0 -0
  157. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/manually_generated_reports/mixed_extractions.txt +0 -0
  158. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/manually_generated_reports/not_security_content.txt +0 -0
  159. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/manually_generated_reports/test_ai_hash_error_with_stix2_lib.txt +0 -0
  160. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/manually_generated_reports/test_aliases.txt +0 -0
  161. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/manually_generated_reports/test_extraction_boundary.txt +0 -0
  162. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/manually_generated_reports/test_extraction_escapes.txt +0 -0
  163. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/real_intel_reports/APT28-Center-of-Storm-2017.txt +0 -0
  164. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/real_intel_reports/Bitdefender-Labs-Report-X-creat6958-en-EN.txt +0 -0
  165. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/real_intel_reports/FireEyeAPT39.txt +0 -0
  166. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/real_intel_reports/France_CERT_APT31_Pakdoor_TLPWHITE.txt +0 -0
  167. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/real_intel_reports/Group-IB_Ransomware_Uncovered_whitepaper_eng.txt +0 -0
  168. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/real_intel_reports/JOINT_CSA_HUNTING_RU_INTEL_SNAKE_MALWARE_20230509.txt +0 -0
  169. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/real_intel_reports/TA22-0126-QAKBOT-analysis-TLP-GREEN.txt +0 -0
  170. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/real_intel_reports/dinners_card.txt +0 -0
  171. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/real_intel_reports/mandiant-apt1.txt +0 -0
  172. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/data/real_intel_reports/mykings_report_final.txt +0 -0
  173. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/manual-tests/cases-ai-relationships.md +0 -0
  174. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/manual-tests/cases-extraction-type-ai.md +0 -0
  175. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/manual-tests/cases-extraction-type-lookup.md +0 -0
  176. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/manual-tests/cases-extraction-type-pattern.md +0 -0
  177. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/manual-tests/cases-standard-tests.md +0 -0
  178. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/scripts/generate_simple_extraction_test_cases_txt_files.py +0 -0
  179. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/src/__init__.py +0 -0
  180. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/src/test_attack_flow.py +0 -0
  181. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/src/test_bundler.py +0 -0
  182. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/src/test_extractors.py +0 -0
  183. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/src/test_indicator.py +0 -0
  184. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/src/test_lookups.py +0 -0
  185. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/src/test_run_txt2stix.py +0 -0
  186. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/src/test_utils.py +0 -0
  187. {txt2stix-1.0.4 → txt2stix-1.0.6}/tests/src/utils.py +0 -0
  188. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/__init__.py +0 -0
  189. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/ai_extractor/__init__.py +0 -0
  190. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/ai_extractor/anthropic.py +0 -0
  191. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/ai_extractor/deepseek.py +0 -0
  192. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/ai_extractor/gemini.py +0 -0
  193. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/ai_extractor/openai.py +0 -0
  194. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/ai_extractor/openrouter.py +0 -0
  195. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/ai_extractor/prompts.py +0 -0
  196. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/ai_extractor/utils.py +0 -0
  197. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/attack_flow.py +0 -0
  198. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/bundler.py +0 -0
  199. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/common.py +0 -0
  200. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/extractions.py +0 -0
  201. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/indicator.py +0 -0
  202. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/lookups.py +0 -0
  203. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/__init__.py +0 -0
  204. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/__init__.py +0 -0
  205. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/base_extractor.py +0 -0
  206. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/card/README.md +0 -0
  207. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/card/__init__.py +0 -0
  208. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/card/amex_card_extractor.py +0 -0
  209. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/card/diners_card_extractor.py +0 -0
  210. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/card/discover_card_extractor.py +0 -0
  211. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/card/jcb_card_extractor.py +0 -0
  212. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/card/master_card_extractor.py +0 -0
  213. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/card/union_card_extractor.py +0 -0
  214. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/card/visa_card_extractor.py +0 -0
  215. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/crypto/__init__.py +0 -0
  216. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/crypto/btc_extractor.py +0 -0
  217. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/directory/__init__.py +0 -0
  218. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/directory/unix_directory_extractor.py +0 -0
  219. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/directory/unix_file_path_extractor.py +0 -0
  220. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/directory/windows_directory_path_extractor.py +0 -0
  221. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/directory/windows_file_path_extractor.py +0 -0
  222. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/domain/__init__.py +0 -0
  223. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/domain/domain_extractor.py +0 -0
  224. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/domain/hostname_extractor.py +0 -0
  225. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/domain/sub_domain_extractor.py +0 -0
  226. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/hashes/__init__.py +0 -0
  227. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/hashes/md5_extractor.py +0 -0
  228. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/hashes/sha1_extractor.py +0 -0
  229. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/hashes/sha224_extractor.py +0 -0
  230. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/hashes/sha2_256_exactor.py +0 -0
  231. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/hashes/sha2_512_exactor.py +0 -0
  232. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/hashes/sha3_256_exactor.py +0 -0
  233. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/hashes/sha3_512_exactor.py +0 -0
  234. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/helper.py +0 -0
  235. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/ip/__init__.py +0 -0
  236. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/ip/ipv4_cidr_extractor.py +0 -0
  237. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/ip/ipv4_extractor.py +0 -0
  238. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/ip/ipv4_port_extractor.py +0 -0
  239. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/ip/ipv6_cidr_extractor.py +0 -0
  240. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/ip/ipv6_extractor.py +0 -0
  241. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/ip/ipv6_port_extractor.py +0 -0
  242. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/others/__init__.py +0 -0
  243. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/others/asn_extractor.py +0 -0
  244. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/others/cpe_extractor.py +0 -0
  245. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/others/cve_extractor.py +0 -0
  246. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/others/email_extractor.py +0 -0
  247. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/others/filename_extractor.py +0 -0
  248. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/others/iban_extractor.py +0 -0
  249. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/others/mac_address_extractor.py +0 -0
  250. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/others/phonenumber_extractor.py +0 -0
  251. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/others/user_agent_extractor.py +0 -0
  252. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/others/windows_registry_key_extractor.py +0 -0
  253. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/url/__init__.py +0 -0
  254. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/url/url_extractor.py +0 -0
  255. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/url/url_file_extractor.py +0 -0
  256. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/pattern/extractors/url/url_path_extractor.py +0 -0
  257. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/stix.py +0 -0
  258. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix/utils.py +0 -0
  259. {txt2stix-1.0.4 → txt2stix-1.0.6}/txt2stix.py +0 -0
@@ -1,15 +1,19 @@
1
1
  name: Run Tests
2
2
 
3
+ permissions:
4
+ contents: read
5
+
3
6
  on:
4
7
  push:
5
8
  branches:
6
9
  - main
7
10
  pull_request:
8
- permissions:
9
- contents: read
11
+ types:
12
+ - opened
13
+ - synchronize
10
14
 
11
15
  jobs:
12
- run-tests:
16
+ test-pipeline:
13
17
  runs-on: ubuntu-latest
14
18
  environment: txt2stix_tests
15
19
 
@@ -24,8 +28,8 @@ jobs:
24
28
  with:
25
29
  python-version: "3.11"
26
30
 
27
-
28
- - name: Set .env testing purpose
31
+ - name: Setup environment
32
+ id: setup_environment
29
33
  run: |
30
34
  echo > .env
31
35
  echo "CTIBUTLER_BASE_URL=${{ secrets.CTIBUTLER_BASE_URL }}" >> .env
@@ -34,31 +38,30 @@ jobs:
34
38
  echo "VULMATCH_API_KEY=${{ secrets.VULMATCH_API_KEY }}" >> .env
35
39
  echo "TEST_AI_MODEL=${{ secrets.TEST_AI_MODEL }}" >> .env
36
40
  echo "INPUT_TOKEN_LIMIT=1000" >> .env
37
-
38
41
  echo "OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY}}" >> .env
39
42
  echo "ANTHROPIC_API_KEY=${{ secrets.ANTHROPIC_API_KEY}}" >> .env
40
43
  echo "GOOGLE_API_KEY=${{ secrets.GOOGLE_API_KEY}}" >> .env
41
44
  echo "OPENROUTER_API_KEY=${{ secrets.OPENROUTER_API_KEY}}" >> .env
42
-
43
45
  echo "BIN_LIST_API_KEY=${{ secrets.BIN_LIST_API_KEY }}" >> .env
44
46
 
45
- - name: unit tests
46
- id: unit-test
47
+ - name: Unit tests
48
+ id: unit_tests
47
49
  run: |
48
50
  set -a;
49
51
  source .env;
50
52
  set +a;
51
53
  pip install -e .[tests]
52
-
53
54
  pytest --cov --cov-branch --cov-report=xml --junitxml=junit.xml -o junit_family=legacy
54
55
 
55
56
  - name: Upload coverage reports to Codecov
57
+ id: upload_unit_test_coverage
56
58
  if: ${{ !cancelled() }}
57
59
  uses: codecov/codecov-action@v5
58
60
  with:
59
61
  token: ${{ secrets.CODECOV_TOKEN }}
60
62
 
61
63
  - name: Upload test results to Codecov
64
+ id: upload_unit_test_results
62
65
  if: ${{ !cancelled() }}
63
66
  uses: codecov/test-results-action@v1
64
67
  with:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: txt2stix
3
- Version: 1.0.4
3
+ Version: 1.0.6
4
4
  Summary: txt2stix is a Python script that is designed to identify and extract IoCs and TTPs from text files, identify the relationships between them, convert them to STIX 2.1 objects, and output as a STIX 2.1 bundle.
5
5
  Project-URL: Homepage, https://github.com/muchdogesec/txt2stix
6
6
  Project-URL: Issues, https://github.com/muchdogesec/txt2stix/issues
@@ -111,6 +111,31 @@ cp .env.example .env
111
111
 
112
112
  To see more information about how to set the variables, and what they do, read the `.env.markdown` file.
113
113
 
114
+ Then test your configoration
115
+
116
+ ```shell
117
+ python3 txt2stix.py \
118
+ --check-credentials
119
+ ```
120
+
121
+ It will return a response to show what API keys are working
122
+
123
+ ```txt
124
+ ============= Service Statuses ===============
125
+ ctibutler : authorized ✔
126
+ vulmatch : authorized ✔
127
+ binlist : authorized ✔
128
+
129
+ LLMS:
130
+ openai : authorized ✔
131
+ deepseek : unsupported –
132
+ gemini : unsupported –
133
+ openrouter : unsupported –
134
+ anthropic : unsupported –
135
+ ```
136
+
137
+ Not all services need to be configured, if you have no intention of using them.
138
+
114
139
  ### Usage
115
140
 
116
141
  ```shell
@@ -67,6 +67,31 @@ cp .env.example .env
67
67
 
68
68
  To see more information about how to set the variables, and what they do, read the `.env.markdown` file.
69
69
 
70
+ Then test your configoration
71
+
72
+ ```shell
73
+ python3 txt2stix.py \
74
+ --check-credentials
75
+ ```
76
+
77
+ It will return a response to show what API keys are working
78
+
79
+ ```txt
80
+ ============= Service Statuses ===============
81
+ ctibutler : authorized ✔
82
+ vulmatch : authorized ✔
83
+ binlist : authorized ✔
84
+
85
+ LLMS:
86
+ openai : authorized ✔
87
+ deepseek : unsupported –
88
+ gemini : unsupported –
89
+ openrouter : unsupported –
90
+ anthropic : unsupported –
91
+ ```
92
+
93
+ Not all services need to be configured, if you have no intention of using them.
94
+
70
95
  ### Usage
71
96
 
72
97
  ```shell
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "txt2stix"
7
- version = "1.0.4"
7
+ version = "1.0.6"
8
8
  authors = [{ name = "dogesec" }]
9
9
  maintainers = [{ name = "dogesec" }]
10
10
  description = "txt2stix is a Python script that is designed to identify and extract IoCs and TTPs from text files, identify the relationships between them, convert them to STIX 2.1 objects, and output as a STIX 2.1 bundle."
@@ -349,3 +349,12 @@ def test_extract_relationships_with_ai():
349
349
 
350
350
  mock_ai_session.extract_relationships.side_effect = Exception
351
351
  assert extract_relationships_with_ai(mock_bundler, text, all_extracts, mock_ai_session) == None
352
+
353
+
354
+ def test_check_credentials(monkeypatch):
355
+ monkeypatch.setattr(sys, 'argv', [
356
+ "program",
357
+ "--check_credentials"
358
+ ])
359
+ with pytest.raises(SystemExit):
360
+ parse_args()
@@ -90,3 +90,13 @@ class BaseAIExtractor():
90
90
 
91
91
  def __hash__(self):
92
92
  return hash(self.extractor_name)
93
+
94
+ def check_credential(self):
95
+ try:
96
+ return "authorized" if self._check_credential() else "unauthorized"
97
+ except:
98
+ return "unknown"
99
+
100
+ def _check_credential(self):
101
+ self.llm.complete("say 'hi'")
102
+ return True
@@ -0,0 +1,97 @@
1
+ import argparse
2
+ import os
3
+ import random
4
+ from urllib.parse import urljoin
5
+ import requests
6
+ from stix2extensions.tools import creditcard2stix
7
+ from txt2stix.retriever import STIXObjectRetriever
8
+
9
+
10
+ def check_binlist():
11
+ card = str(random.randrange(432101, 456789))
12
+ api_key = os.getenv("BIN_LIST_API_KEY", "")
13
+ return "authorized" if creditcard2stix.get_bin_data(card, api_key) else "unauthorized"
14
+
15
+
16
+ def check_llms():
17
+ from txt2stix.txt2stix import parse_model
18
+
19
+ auth_info = dict()
20
+ for model_name in ["openai", "deepseek", "gemini", "openrouter", "anthropic"]:
21
+ try:
22
+ model = parse_model(model_name)
23
+ auth_info[model_name] = model.check_credential()
24
+ except argparse.ArgumentTypeError:
25
+ auth_info[model_name] = "unsupported"
26
+ except:
27
+ auth_info[model_name] = "unauthorized"
28
+ return auth_info
29
+
30
+
31
+ def check_ctibutler_vulmatch(service):
32
+ retriever = STIXObjectRetriever(service)
33
+ path = dict(
34
+ ctibutler="v1/location/versions/available/",
35
+ vulmatch="v1/cve/objects/vulnerability--f552f6f4-39da-48dc-8717-323772c99588/",
36
+ )[service]
37
+ try:
38
+ resp = retriever.session.get(urljoin(retriever.api_root, path))
39
+ match resp.status_code:
40
+ case 401 | 403:
41
+ return "unauthorized"
42
+ case 200:
43
+ return "authorized"
44
+ case _:
45
+ return "unknown"
46
+ except:
47
+ return "offline"
48
+
49
+ def check_btcscan():
50
+ url = "https://btcscan.org/api/blocks/tip/height"
51
+ try:
52
+ resp = requests.get(url)
53
+ match resp.status_code:
54
+ case 401 | 403:
55
+ return "unauthorized"
56
+ case 200:
57
+ return "authorized"
58
+ case _:
59
+ return "unknown"
60
+ except:
61
+ return "offline"
62
+
63
+ def check_statuses(test_llms=False):
64
+ statuses = dict(
65
+ ctibutler=check_ctibutler_vulmatch("ctibutler"),
66
+ vulmatch=check_ctibutler_vulmatch("vulmatch"),
67
+ binlist=check_binlist(),
68
+ btcscan=check_btcscan(),
69
+ )
70
+ if test_llms:
71
+ statuses.update(llms=check_llms())
72
+ return statuses
73
+
74
+
75
+ def format_statuses(status_dict):
76
+ def get_marker(status):
77
+ """Return a checkmark, cross, or dash based on status."""
78
+ match status.lower():
79
+ case "authorized":
80
+ return "✔"
81
+ case "unauthorized":
82
+ return "✖"
83
+ case "unknown" | "offline" | "unsupported":
84
+ return "–"
85
+ case _:
86
+ return "?"
87
+
88
+ print("============= Service Statuses ===============")
89
+ for key, value in status_dict.items():
90
+ if key == "llms" and isinstance(value, dict):
91
+ print(f"\n {key.upper()}:")
92
+ for llm_name, llm_status in value.items():
93
+ marker = get_marker(llm_status)
94
+ print(f" {llm_name:<12}: {llm_status:<15} {marker}")
95
+ else:
96
+ marker = get_marker(value)
97
+ print(f" {key:<12}: {value:<15} {marker}")
@@ -17,6 +17,10 @@ class STIXObjectRetriever:
17
17
  self.api_key = os.environ.get('VULMATCH_API_KEY')
18
18
  else:
19
19
  raise NotImplementedError("The type `%s` is not supported", host)
20
+ self.session = requests.Session()
21
+ self.session.headers.update({
22
+ "API-KEY": self.api_key,
23
+ })
20
24
 
21
25
  def get_attack_object(self, matrix, attack_id):
22
26
  endpoint = urljoin(self.api_root, f"v1/attack-{matrix}/objects/{attack_id}/")
@@ -48,14 +52,10 @@ class STIXObjectRetriever:
48
52
  return self._retrieve_objects(urljoin(self.api_root, f"v1/{type}/objects/?alias={alias}"))
49
53
 
50
54
  def _retrieve_objects(self, endpoint, key='objects'):
51
- s = requests.Session()
52
- s.headers.update({
53
- "API-KEY": self.api_key,
54
- })
55
55
  data = []
56
56
  page = 1
57
57
  while True:
58
- resp = s.get(endpoint, params=dict(page=page, page_size=50))
58
+ resp = self.session.get(endpoint, params=dict(page=page, page_size=50))
59
59
  resp.raise_for_status()
60
60
  d = resp.json()
61
61
  if len(d[key]) == 0:
@@ -13,7 +13,7 @@ import sys, os
13
13
  from pydantic import BaseModel
14
14
 
15
15
  from txt2stix.ai_extractor.utils import DescribesIncident
16
- from txt2stix import attack_flow
16
+ from txt2stix import attack_flow, credential_checker
17
17
 
18
18
 
19
19
  from .utils import RELATIONSHIP_TYPES, Txt2StixData, remove_links
@@ -135,6 +135,12 @@ def parse_args():
135
135
  all_extractors = extractions.parse_extraction_config(INCLUDES_PATH)
136
136
 
137
137
  parser = argparse.ArgumentParser(description="File Conversion Tool")
138
+ parser.add_argument('--check_credentials', "--check-credentials", action="store_true", help="Print the validity of the credentials and exit")
139
+ args, _ = parser.parse_known_args()
140
+ if args.check_credentials:
141
+ statuses = credential_checker.check_statuses(test_llms=True)
142
+ credential_checker.format_statuses(statuses)
143
+ sys.exit(0)
138
144
 
139
145
  inf_arg = parser.add_argument(
140
146
  "--input_file",
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes