txt2stix 1.0.5__tar.gz → 1.0.7__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 (260) hide show
  1. {txt2stix-1.0.5 → txt2stix-1.0.7}/PKG-INFO +26 -1
  2. {txt2stix-1.0.5 → txt2stix-1.0.7}/README.md +25 -0
  3. {txt2stix-1.0.5 → txt2stix-1.0.7}/pyproject.toml +1 -1
  4. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/src/test_main.py +9 -0
  5. txt2stix-1.0.7/tests/src/test_retriever.py +124 -0
  6. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/ai_extractor/base.py +10 -0
  7. txt2stix-1.0.7/txt2stix/credential_checker.py +97 -0
  8. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/retriever.py +5 -5
  9. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/txt2stix.py +7 -1
  10. {txt2stix-1.0.5 → txt2stix-1.0.7}/.env.example +0 -0
  11. {txt2stix-1.0.5 → txt2stix-1.0.7}/.env.markdown +0 -0
  12. {txt2stix-1.0.5 → txt2stix-1.0.7}/.github/workflows/create-release.yml +0 -0
  13. {txt2stix-1.0.5 → txt2stix-1.0.7}/.github/workflows/run-tests.yml +0 -0
  14. {txt2stix-1.0.5 → txt2stix-1.0.7}/.gitignore +0 -0
  15. {txt2stix-1.0.5 → txt2stix-1.0.7}/LICENSE +0 -0
  16. {txt2stix-1.0.5 → txt2stix-1.0.7}/docs/README.md +0 -0
  17. {txt2stix-1.0.5 → txt2stix-1.0.7}/docs/stix-mapping.md +0 -0
  18. {txt2stix-1.0.5 → txt2stix-1.0.7}/docs/txt2stix.png +0 -0
  19. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/__init__.py +0 -0
  20. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/extractions/ai/config.yaml +0 -0
  21. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/extractions/lookup/config.yaml +0 -0
  22. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/extractions/pattern/config.yaml +0 -0
  23. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/helpers/mimetype_filename_extension_list.csv +0 -0
  24. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/helpers/stix_relationship_types.txt +0 -0
  25. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/helpers/tlds.txt +0 -0
  26. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/helpers/windows_registry_key_prefix.txt +0 -0
  27. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/lookups/_README.md +0 -0
  28. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/lookups/_generate_lookups.py +0 -0
  29. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/lookups/attack_pattern.txt +0 -0
  30. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/lookups/campaign.txt +0 -0
  31. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/lookups/country_iso3166_alpha2.txt +0 -0
  32. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/lookups/course_of_action.txt +0 -0
  33. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/lookups/disarm_id_v1_5.txt +0 -0
  34. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/lookups/disarm_name_v1_5.txt +0 -0
  35. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/lookups/extensions.txt +0 -0
  36. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/lookups/identity.txt +0 -0
  37. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/lookups/infrastructure.txt +0 -0
  38. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/lookups/intrusion_set.txt +0 -0
  39. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/lookups/malware.txt +0 -0
  40. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/lookups/mitre_atlas_id_v4_5_2.txt +0 -0
  41. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/lookups/mitre_atlas_name_v4_5_2.txt +0 -0
  42. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/lookups/mitre_attack_enterprise_aliases_v16_0.txt +0 -0
  43. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/lookups/mitre_attack_enterprise_id_v16_0.txt +0 -0
  44. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/lookups/mitre_attack_enterprise_name_v16_0.txt +0 -0
  45. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/lookups/mitre_attack_ics_aliases_v16_0.txt +0 -0
  46. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/lookups/mitre_attack_ics_id_v16_0.txt +0 -0
  47. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/lookups/mitre_attack_ics_name_v16_0.txt +0 -0
  48. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/lookups/mitre_attack_mobile_aliases_v16_0.txt +0 -0
  49. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/lookups/mitre_attack_mobile_id_v16_0.txt +0 -0
  50. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/lookups/mitre_attack_mobile_name_v16_0.txt +0 -0
  51. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/lookups/mitre_capec_id_v3_9.txt +0 -0
  52. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/lookups/mitre_capec_name_v3_9.txt +0 -0
  53. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/lookups/mitre_cwe_id_v4_15.txt +0 -0
  54. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/lookups/mitre_cwe_name_v4_15.txt +0 -0
  55. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/lookups/threat_actor.txt +0 -0
  56. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/lookups/tld.txt +0 -0
  57. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/lookups/tool.txt +0 -0
  58. {txt2stix-1.0.5 → txt2stix-1.0.7}/includes/tests/test_cases.yaml +0 -0
  59. {txt2stix-1.0.5 → txt2stix-1.0.7}/requirements.txt +0 -0
  60. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/README.md +0 -0
  61. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/ai_country.txt +0 -0
  62. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/ai_mitre_attack_enterprise.txt +0 -0
  63. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/ai_mitre_attack_ics.txt +0 -0
  64. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/ai_mitre_attack_mobile.txt +0 -0
  65. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/ai_mitre_capec.txt +0 -0
  66. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/ai_mitre_cwe.txt +0 -0
  67. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/all_cases.txt +0 -0
  68. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_autonomous_system_number.txt +0 -0
  69. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_bank_card_all.txt +0 -0
  70. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_bank_card_amex.txt +0 -0
  71. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_bank_card_diners.txt +0 -0
  72. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_bank_card_discover.txt +0 -0
  73. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_bank_card_jcb.txt +0 -0
  74. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_bank_card_mastercard.txt +0 -0
  75. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_bank_card_union_pay.txt +0 -0
  76. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_bank_card_visa.txt +0 -0
  77. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_country_alpha2.txt +0 -0
  78. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_cpe_uri.txt +0 -0
  79. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_cryptocurrency_btc_transaction.txt +0 -0
  80. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_cryptocurrency_btc_wallet.txt +0 -0
  81. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_cryptocurrency_eth_transaction.txt +0 -0
  82. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_cryptocurrency_eth_wallet.txt +0 -0
  83. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_cryptocurrency_xmr_transaction.txt +0 -0
  84. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_cryptocurrency_xmr_wallet.txt +0 -0
  85. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_cve_id.txt +0 -0
  86. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_directory_unix.txt +0 -0
  87. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_directory_unix_file.txt +0 -0
  88. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_directory_windows.txt +0 -0
  89. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_directory_windows_with_file.txt +0 -0
  90. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_disarm.txt +0 -0
  91. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_disarm_name.txt +0 -0
  92. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_domain_name_only.txt +0 -0
  93. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_domain_name_subdomain.txt +0 -0
  94. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_email_address.txt +0 -0
  95. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_file_hash_md5.txt +0 -0
  96. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_file_hash_sha_1.txt +0 -0
  97. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_file_hash_sha_224.txt +0 -0
  98. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_file_hash_sha_256.txt +0 -0
  99. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_file_hash_sha_384.txt +0 -0
  100. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_file_hash_sha_512.txt +0 -0
  101. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_file_name.txt +0 -0
  102. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_host_name.txt +0 -0
  103. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_host_name_file.txt +0 -0
  104. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_host_name_path.txt +0 -0
  105. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_host_name_subdomain.txt +0 -0
  106. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_host_name_url.txt +0 -0
  107. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_iban_number.txt +0 -0
  108. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_ipv4_address_cidr.txt +0 -0
  109. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_ipv4_address_only.txt +0 -0
  110. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_ipv4_address_port.txt +0 -0
  111. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_ipv6_address_cidr.txt +0 -0
  112. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_ipv6_address_only.txt +0 -0
  113. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_ipv6_address_port.txt +0 -0
  114. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_mac_address.txt +0 -0
  115. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_mitre_atlas.txt +0 -0
  116. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_mitre_atlas_name.txt +0 -0
  117. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_mitre_attack_enterprise.txt +0 -0
  118. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_mitre_attack_enterprise_aliases.txt +0 -0
  119. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_mitre_attack_enterprise_name.txt +0 -0
  120. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_mitre_attack_ics.txt +0 -0
  121. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_mitre_attack_ics_aliases.txt +0 -0
  122. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_mitre_attack_ics_name.txt +0 -0
  123. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_mitre_attack_mobile.txt +0 -0
  124. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_mitre_attack_mobile_aliases.txt +0 -0
  125. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_mitre_attack_mobile_name.txt +0 -0
  126. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_mitre_capec.txt +0 -0
  127. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_mitre_capec_name.txt +0 -0
  128. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_mitre_cwe.txt +0 -0
  129. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_mitre_cwe_name.txt +0 -0
  130. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_phone_number.txt +0 -0
  131. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_url.txt +0 -0
  132. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_url_file.txt +0 -0
  133. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_url_path.txt +0 -0
  134. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_user_agent.txt +0 -0
  135. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/generic_windows_registry_key.txt +0 -0
  136. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/lookup_attack_pattern.txt +0 -0
  137. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/lookup_campaign.txt +0 -0
  138. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/lookup_course_of_action.txt +0 -0
  139. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/lookup_identity.txt +0 -0
  140. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/lookup_infrastructure.txt +0 -0
  141. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/lookup_intrusion_set.txt +0 -0
  142. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/lookup_malware.txt +0 -0
  143. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/lookup_threat_actor.txt +0 -0
  144. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/extraction_types/lookup_tool.txt +0 -0
  145. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/manually_generated_reports/attack_flow_demo.txt +0 -0
  146. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/manually_generated_reports/attack_navigator_demo.txt +0 -0
  147. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/manually_generated_reports/basic_relationship.txt +0 -0
  148. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/manually_generated_reports/char_length_too_long.txt +0 -0
  149. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/manually_generated_reports/descriptive_for_ai_relationships_1.txt +0 -0
  150. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/manually_generated_reports/disarm_demo.txt +0 -0
  151. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/manually_generated_reports/embedded_img_ignore.txt +0 -0
  152. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/manually_generated_reports/embedded_link_ignore.txt +0 -0
  153. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/manually_generated_reports/ip1.txt +0 -0
  154. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/manually_generated_reports/ip2.txt +0 -0
  155. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/manually_generated_reports/known_whitelist_match.txt +0 -0
  156. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/manually_generated_reports/mitre_attack_enterprise_ai_demo.txt +0 -0
  157. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/manually_generated_reports/mitre_attack_enterprise_lookup_demo.txt +0 -0
  158. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/manually_generated_reports/mixed_extractions.txt +0 -0
  159. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/manually_generated_reports/not_security_content.txt +0 -0
  160. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/manually_generated_reports/test_ai_hash_error_with_stix2_lib.txt +0 -0
  161. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/manually_generated_reports/test_aliases.txt +0 -0
  162. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/manually_generated_reports/test_extraction_boundary.txt +0 -0
  163. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/manually_generated_reports/test_extraction_escapes.txt +0 -0
  164. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/real_intel_reports/APT28-Center-of-Storm-2017.txt +0 -0
  165. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/real_intel_reports/Bitdefender-Labs-Report-X-creat6958-en-EN.txt +0 -0
  166. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/real_intel_reports/FireEyeAPT39.txt +0 -0
  167. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/real_intel_reports/France_CERT_APT31_Pakdoor_TLPWHITE.txt +0 -0
  168. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/real_intel_reports/Group-IB_Ransomware_Uncovered_whitepaper_eng.txt +0 -0
  169. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/real_intel_reports/JOINT_CSA_HUNTING_RU_INTEL_SNAKE_MALWARE_20230509.txt +0 -0
  170. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/real_intel_reports/TA22-0126-QAKBOT-analysis-TLP-GREEN.txt +0 -0
  171. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/real_intel_reports/dinners_card.txt +0 -0
  172. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/real_intel_reports/mandiant-apt1.txt +0 -0
  173. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/data/real_intel_reports/mykings_report_final.txt +0 -0
  174. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/manual-tests/cases-ai-relationships.md +0 -0
  175. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/manual-tests/cases-extraction-type-ai.md +0 -0
  176. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/manual-tests/cases-extraction-type-lookup.md +0 -0
  177. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/manual-tests/cases-extraction-type-pattern.md +0 -0
  178. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/manual-tests/cases-standard-tests.md +0 -0
  179. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/scripts/generate_simple_extraction_test_cases_txt_files.py +0 -0
  180. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/src/__init__.py +0 -0
  181. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/src/test_attack_flow.py +0 -0
  182. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/src/test_bundler.py +0 -0
  183. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/src/test_extractors.py +0 -0
  184. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/src/test_indicator.py +0 -0
  185. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/src/test_lookups.py +0 -0
  186. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/src/test_run_txt2stix.py +0 -0
  187. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/src/test_utils.py +0 -0
  188. {txt2stix-1.0.5 → txt2stix-1.0.7}/tests/src/utils.py +0 -0
  189. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/__init__.py +0 -0
  190. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/ai_extractor/__init__.py +0 -0
  191. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/ai_extractor/anthropic.py +0 -0
  192. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/ai_extractor/deepseek.py +0 -0
  193. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/ai_extractor/gemini.py +0 -0
  194. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/ai_extractor/openai.py +0 -0
  195. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/ai_extractor/openrouter.py +0 -0
  196. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/ai_extractor/prompts.py +0 -0
  197. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/ai_extractor/utils.py +0 -0
  198. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/attack_flow.py +0 -0
  199. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/bundler.py +0 -0
  200. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/common.py +0 -0
  201. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/extractions.py +0 -0
  202. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/indicator.py +0 -0
  203. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/lookups.py +0 -0
  204. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/__init__.py +0 -0
  205. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/__init__.py +0 -0
  206. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/base_extractor.py +0 -0
  207. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/card/README.md +0 -0
  208. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/card/__init__.py +0 -0
  209. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/card/amex_card_extractor.py +0 -0
  210. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/card/diners_card_extractor.py +0 -0
  211. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/card/discover_card_extractor.py +0 -0
  212. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/card/jcb_card_extractor.py +0 -0
  213. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/card/master_card_extractor.py +0 -0
  214. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/card/union_card_extractor.py +0 -0
  215. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/card/visa_card_extractor.py +0 -0
  216. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/crypto/__init__.py +0 -0
  217. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/crypto/btc_extractor.py +0 -0
  218. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/directory/__init__.py +0 -0
  219. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/directory/unix_directory_extractor.py +0 -0
  220. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/directory/unix_file_path_extractor.py +0 -0
  221. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/directory/windows_directory_path_extractor.py +0 -0
  222. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/directory/windows_file_path_extractor.py +0 -0
  223. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/domain/__init__.py +0 -0
  224. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/domain/domain_extractor.py +0 -0
  225. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/domain/hostname_extractor.py +0 -0
  226. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/domain/sub_domain_extractor.py +0 -0
  227. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/hashes/__init__.py +0 -0
  228. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/hashes/md5_extractor.py +0 -0
  229. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/hashes/sha1_extractor.py +0 -0
  230. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/hashes/sha224_extractor.py +0 -0
  231. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/hashes/sha2_256_exactor.py +0 -0
  232. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/hashes/sha2_512_exactor.py +0 -0
  233. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/hashes/sha3_256_exactor.py +0 -0
  234. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/hashes/sha3_512_exactor.py +0 -0
  235. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/helper.py +0 -0
  236. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/ip/__init__.py +0 -0
  237. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/ip/ipv4_cidr_extractor.py +0 -0
  238. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/ip/ipv4_extractor.py +0 -0
  239. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/ip/ipv4_port_extractor.py +0 -0
  240. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/ip/ipv6_cidr_extractor.py +0 -0
  241. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/ip/ipv6_extractor.py +0 -0
  242. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/ip/ipv6_port_extractor.py +0 -0
  243. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/others/__init__.py +0 -0
  244. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/others/asn_extractor.py +0 -0
  245. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/others/cpe_extractor.py +0 -0
  246. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/others/cve_extractor.py +0 -0
  247. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/others/email_extractor.py +0 -0
  248. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/others/filename_extractor.py +0 -0
  249. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/others/iban_extractor.py +0 -0
  250. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/others/mac_address_extractor.py +0 -0
  251. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/others/phonenumber_extractor.py +0 -0
  252. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/others/user_agent_extractor.py +0 -0
  253. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/others/windows_registry_key_extractor.py +0 -0
  254. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/url/__init__.py +0 -0
  255. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/url/url_extractor.py +0 -0
  256. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/url/url_file_extractor.py +0 -0
  257. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/pattern/extractors/url/url_path_extractor.py +0 -0
  258. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/stix.py +0 -0
  259. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix/utils.py +0 -0
  260. {txt2stix-1.0.5 → txt2stix-1.0.7}/txt2stix.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: txt2stix
3
- Version: 1.0.5
3
+ Version: 1.0.7
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.5"
7
+ version = "1.0.7"
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()
@@ -0,0 +1,124 @@
1
+ import pytest
2
+ from txt2stix.retriever import retrieve_stix_objects
3
+
4
+
5
+ @pytest.fixture(scope="session")
6
+ def f():
7
+ return open("/tmp/ww2.txt", "w+")
8
+
9
+
10
+ @pytest.mark.parametrize(
11
+ ["stix_mapping", "kb_id", "expected_ids"],
12
+ [
13
+ (
14
+ "ctibutler-mitre-attack-enterprise-id",
15
+ "T1548",
16
+ ["attack-pattern--67720091-eee3-4d2d-ae16-8264567f6f5b"],
17
+ ),
18
+ (
19
+ "ctibutler-mitre-attack-mobile-id",
20
+ "S1095",
21
+ ["malware--24c8f6db-71e0-41ef-a1dc-83399a5b17e5"],
22
+ ),
23
+ (
24
+ "ctibutler-mitre-attack-ics-id",
25
+ "M0915",
26
+ ["course-of-action--2f0160b7-e982-49d7-9612-f19b810f1722"],
27
+ ),
28
+ (
29
+ "ctibutler-mitre-capec-id",
30
+ "CAPEC-1",
31
+ ["attack-pattern--92cdcd3d-d734-4442-afc3-4599f261498b"],
32
+ ),
33
+ (
34
+ "ctibutler-mitre-cwe-id",
35
+ "CWE-349",
36
+ ["weakness--b7ed8589-a9c7-586c-a3b6-873ae8f8a9c7"],
37
+ ),
38
+ (
39
+ "ctibutler-mitre-attack-enterprise-name",
40
+ "2015 Ukraine Electric Power Attack",
41
+ ["campaign--46421788-b6e1-4256-b351-f8beffd1afba"],
42
+ ),
43
+ (
44
+ "ctibutler-mitre-attack-enterprise-aliases",
45
+ "Operation Sharpshooter",
46
+ ["campaign--37764c78-2a99-46d1-a7ea-6454b9bf93a0"],
47
+ ),
48
+ (
49
+ "ctibutler-mitre-attack-mobile-name",
50
+ "Impair Defenses",
51
+ ["attack-pattern--20b0931a-8952-42ca-975f-775bad295f1a"],
52
+ ),
53
+ (
54
+ "ctibutler-mitre-attack-mobile-aliases",
55
+ "Storm-0875",
56
+ ["intrusion-set--44d37b89-a739-4810-9111-0d2617a8939b"],
57
+ ),
58
+ (
59
+ "ctibutler-mitre-attack-ics-name",
60
+ "Program Upload",
61
+ ["attack-pattern--3067b85e-271e-4bc5-81ad-ab1a81d411e3"],
62
+ ),
63
+ (
64
+ "ctibutler-mitre-attack-ics-aliases",
65
+ "BROMINE",
66
+ ["intrusion-set--1c63d4ec-0a75-4daa-b1df-0d11af3d3cc1"],
67
+ ),
68
+ (
69
+ "ctibutler-mitre-capec-name",
70
+ "Overflow Buffers",
71
+ ["attack-pattern--77e51461-7843-411c-a90e-852498957f76"],
72
+ ),
73
+ (
74
+ "ctibutler-mitre-cwe-name",
75
+ "Insufficient Encapsulation",
76
+ (
77
+ "weakness--46444370-fe00-5368-8d39-17fc39e4cacb",
78
+ "weakness--b0a3b7a9-fefa-5435-8336-4d2e019597f8",
79
+ ),
80
+ ),
81
+ (
82
+ "ctibutler-location",
83
+ "NG",
84
+ (
85
+ "location--6dbe266a-c149-5ba3-8b39-74f1b5063312",
86
+ ),
87
+ ),
88
+ (
89
+ "ctibutler-mitre-atlas-id",
90
+ "AML.T0050",
91
+ ["attack-pattern--eda10125-6f7d-479f-857a-19ef5d86a961"],
92
+ ),
93
+ (
94
+ "ctibutler-mitre-atlas-name",
95
+ "Defense Evasion",
96
+ ["x-mitre-tactic--c9cf0175-296e-4439-852d-afb870ed5e0c"],
97
+ ),
98
+ (
99
+ "ctibutler-disarm-id",
100
+ "T0131.001",
101
+ ["attack-pattern--db0a00c8-7913-5895-b0a2-a7378eaab591"],
102
+ ),
103
+ (
104
+ "ctibutler-disarm-name",
105
+ "Develop Narratives",
106
+ ["x-mitre-tactic--ec5943c5-cf40-59dd-a7ed-c2175fc9727a"],
107
+ ),
108
+ (
109
+ "vulmatch-cve-id",
110
+ "CVE-2025-7943",
111
+ ["vulnerability--e4390a73-9288-5fd4-aa54-6a9b906bb174"],
112
+ ),
113
+ (
114
+ "vulmatch-cpe-id",
115
+ "cpe:2.3:h:qualcomm:sd821:-:*:*:*:*:*:*:*",
116
+ ["software--0028c970-9268-5988-b941-f6bfc050300a"],
117
+ ),
118
+ ],
119
+ )
120
+ def test_retrieve_objects(stix_mapping, kb_id, expected_ids, f):
121
+ objects = retrieve_stix_objects(stix_mapping, kb_id)
122
+ assert objects != None
123
+ object_ids = {obj["id"] for obj in objects}
124
+ assert object_ids == set(expected_ids)
@@ -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