voidaccess 1.7.0__tar.gz → 1.7.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.
- {voidaccess-1.7.0/voidaccess.egg-info → voidaccess-1.7.1}/PKG-INFO +11 -5
- {voidaccess-1.7.0 → voidaccess-1.7.1}/README.md +10 -4
- {voidaccess-1.7.0 → voidaccess-1.7.1}/api/routes/actors.py +32 -3
- {voidaccess-1.7.0 → voidaccess-1.7.1}/api/routes/investigations.py +3147 -3472
- {voidaccess-1.7.0 → voidaccess-1.7.1}/api/routes/search.py +77 -55
- {voidaccess-1.7.0 → voidaccess-1.7.1}/crawler/spider.py +30 -4
- {voidaccess-1.7.0 → voidaccess-1.7.1}/db/queries.py +14 -4
- {voidaccess-1.7.0 → voidaccess-1.7.1}/export/ioc_package.py +1 -1
- {voidaccess-1.7.0 → voidaccess-1.7.1}/export/stix.py +54 -20
- {voidaccess-1.7.0 → voidaccess-1.7.1}/extractor/ner.py +136 -1
- {voidaccess-1.7.0 → voidaccess-1.7.1}/extractor/normalizer.py +91 -89
- {voidaccess-1.7.0 → voidaccess-1.7.1}/extractor/pipeline.py +65 -13
- {voidaccess-1.7.0 → voidaccess-1.7.1}/graph/__init__.py +2 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/graph/builder.py +8 -7
- {voidaccess-1.7.0 → voidaccess-1.7.1}/monitor/config.py +4 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/monitor/jobs.py +68 -11
- {voidaccess-1.7.0 → voidaccess-1.7.1}/monitor/scheduler.py +4 -6
- {voidaccess-1.7.0 → voidaccess-1.7.1}/pyproject.toml +1 -1
- voidaccess-1.7.1/tests/test_confidence_calibration.py +108 -0
- voidaccess-1.7.1/tests/test_graph_integration.py +141 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_monitor.py +11 -8
- voidaccess-1.7.1/tests/test_monitor_integration.py +150 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_regex_patterns.py +39 -44
- voidaccess-1.7.1/tests/test_stix_export.py +281 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/vector/__init__.py +2 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess/llm.py +87 -5
- {voidaccess-1.7.0 → voidaccess-1.7.1/voidaccess.egg-info}/PKG-INFO +11 -5
- {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess.egg-info/SOURCES.txt +3 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess_cli/__init__.py +1 -1
- {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess_cli/adapters/sqlite.py +95 -4
- voidaccess-1.7.0/tests/test_stix_export.py +0 -19
- {voidaccess-1.7.0 → voidaccess-1.7.1}/LICENSE +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/analysis/__init__.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/analysis/opsec.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/analysis/patterns.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/analysis/temporal.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/api/__init__.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/api/auth.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/api/main.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/api/routes/__init__.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/api/routes/admin.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/api/routes/auth.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/api/routes/entities.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/api/routes/export.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/api/routes/monitors.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/api/routes/settings.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/auth/__init__.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/auth/token_blacklist.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/config.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/crawler/__init__.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/crawler/dedup.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/crawler/frontier.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/crawler/utils.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/db/__init__.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/__init__.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/env.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0001_initial_schema.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0002_add_investigation_status_column.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0002_add_missing_tables.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0003_add_canonical_value_and_entity_links.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0004_add_page_posted_at.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0005_add_extraction_method.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0006_add_monitor_alerts.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0007_add_actor_style_profiles.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0008_add_users_table.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0009_add_investigation_id_to_relationships.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0010_add_composite_index_entity_relationships.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0011_add_page_extraction_cache.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0013_add_graph_status.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0015_add_progress_fields.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0016_backfill_graph_status.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0017_add_user_api_keys.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0018_add_user_id_to_investigations.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0019_add_content_safety_log.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0020_add_entity_source_tracking.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0021_add_search_engine_stats.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0022_add_actor_profiles.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0023_add_investigation_metadata.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/db/models.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/db/search_engine_stats.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/db/session.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/export/__init__.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/export/misp.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/export/sigma.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/export/snort_export.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/export/yara_export.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/extractor/__init__.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/extractor/llm_extract.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/extractor/regex_patterns.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/fingerprint/__init__.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/fingerprint/profiler.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/fingerprint/stylometry.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/graph/export.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/graph/model.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/graph/queries.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/graph/visualize.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/i18n/__init__.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/i18n/detect.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/i18n/query_expand.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/i18n/translate.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/monitor/__init__.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/monitor/_db.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/monitor/alerts.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/monitor/diff.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/scraper/__init__.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/scraper/scrape.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/scraper/scrape_js.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/search/__init__.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/search/circuit_breaker.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/search/query_builder.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/search/search.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/setup.cfg +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/__init__.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/actor_profiles.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/blockchain.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/cache.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/cisa.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/data/__init__.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/data/onion_seeds.json +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/dns_enrichment.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/domain_reputation.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/email_reputation.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/engines.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/enrichment.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/github_scraper.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/gitlab_scraper.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/hash_reputation.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/historical_intel.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/ip_reputation.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/paste_scraper.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/pastes.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/proxy_client.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/rss_scraper.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/seed_manager.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/seeds.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/shodan.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/telegram.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/virustotal.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_analysis_opsec.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_analysis_stylometry.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_analysis_temporal.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_api.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_api_monitors.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_blockchain.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_cli_proxy_config.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_config.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_crawler.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_db.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_dns_enrichment.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_domain_reputation.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_email_reputation.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_filter_e2e_manual.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_filter_parser_manual.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_fingerprint.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_github_scraper.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_gitlab_scraper.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_graph.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_hash_reputation.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_i18n.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_ip_reputation.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_llm.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_llm_utils.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_model_singleton.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_pagination.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_paste_scraper.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_proxy_client.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_rss_scraper.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_scrape_js.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_settings.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_snort_export.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_sources.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_sources_enrichment_new.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_vector.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_yara_export.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/utils/__init__.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/utils/async_utils.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/utils/content_safety.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/utils/defang.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/utils/encryption.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/utils/enrichment_cache.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/utils/ioc_freshness.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/utils/user_keys.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/vector/embedder.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/vector/model_singleton.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/vector/search.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/vector/store.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess/__init__.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess/config.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess/llm_utils.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess.egg-info/dependency_links.txt +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess.egg-info/entry_points.txt +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess.egg-info/requires.txt +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess.egg-info/top_level.txt +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess_cli/adapters/__init__.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess_cli/browser.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess_cli/commands/__init__.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess_cli/commands/actors.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess_cli/commands/configure.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess_cli/commands/enrich.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess_cli/commands/export.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess_cli/commands/investigate.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess_cli/commands/show.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess_cli/config.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess_cli/display.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess_cli/main.py +0 -0
- {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess_cli/tor_detect.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: voidaccess
|
|
3
|
-
Version: 1.7.
|
|
3
|
+
Version: 1.7.1
|
|
4
4
|
Summary: Dark web OSINT CLI — automated threat intelligence from query to report
|
|
5
5
|
Author: VoidAccess
|
|
6
6
|
License-Expression: MIT
|
|
@@ -104,7 +104,15 @@ Commercial threat intelligence platforms often charge prohibitive annual fees fo
|
|
|
104
104
|
|
|
105
105
|
---
|
|
106
106
|
|
|
107
|
-
## What's New in v1.7.
|
|
107
|
+
## What's New in v1.7.1
|
|
108
|
+
- STIX export now produces real bundles with entities and relationships again.
|
|
109
|
+
- Entity extraction on CVE/financial queries now returns the expected entity mix instead of collapsing to organization-name noise.
|
|
110
|
+
- Confidence scores now show multi-value spread that reflects source quality, extraction method, and corroboration.
|
|
111
|
+
- Entity readback now includes rows linked through `InvestigationEntityLink` and dedupes canonical collisions correctly.
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## What's New in the Previous Release
|
|
108
116
|
|
|
109
117
|
- **Dependency optional-extras split** — `sentence-transformers`, `torch`, `transformers`, `telethon`, and `playwright` are now optional extras: `voidaccess[nlp]`, `voidaccess[telegram]`, `voidaccess[js]`, and `voidaccess[all]`.
|
|
110
118
|
- **Optional clearnet ScrapingAnt integration** — paste sites and RSS feeds can now be routed through ScrapingAnt. Affects clearnet scraping only; Tor, `.onion`, GitHub, and GitLab traffic are never affected.
|
|
@@ -310,7 +318,7 @@ Export formats:
|
|
|
310
318
|
|
|
311
319
|
## Actor Intelligence
|
|
312
320
|
|
|
313
|
-
VoidAccess v1.7.
|
|
321
|
+
VoidAccess v1.7.1 persists actor profiles across investigations in `actor_profiles`, with linked aliases and infrastructure in `actor_aliases` and `actor_infrastructure`. Profiles are populated from threat actor, ransomware group, and handle entities, then enriched with co-occurring infrastructure and timeline events.
|
|
314
322
|
|
|
315
323
|
Cross-alias resolution scores five signals: shared infrastructure, shared PGP, string similarity, temporal co-activity, and co-investigation. Use `voidaccess actors` to list profiles, `voidaccess actor <handle>` for the full profile, `voidaccess actor <handle> --timeline` for chronology, and `voidaccess actor <handle> --note "text"` for analyst notes.
|
|
316
324
|
|
|
@@ -578,5 +586,3 @@ To report a security vulnerability, see [docs/SECURITY.md](docs/SECURITY.md).
|
|
|
578
586
|
MIT License. See [LICENSE](LICENSE) for details.
|
|
579
587
|
|
|
580
588
|
|
|
581
|
-
|
|
582
|
-
|
|
@@ -19,7 +19,15 @@ Commercial threat intelligence platforms often charge prohibitive annual fees fo
|
|
|
19
19
|
|
|
20
20
|
---
|
|
21
21
|
|
|
22
|
-
## What's New in v1.7.
|
|
22
|
+
## What's New in v1.7.1
|
|
23
|
+
- STIX export now produces real bundles with entities and relationships again.
|
|
24
|
+
- Entity extraction on CVE/financial queries now returns the expected entity mix instead of collapsing to organization-name noise.
|
|
25
|
+
- Confidence scores now show multi-value spread that reflects source quality, extraction method, and corroboration.
|
|
26
|
+
- Entity readback now includes rows linked through `InvestigationEntityLink` and dedupes canonical collisions correctly.
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## What's New in the Previous Release
|
|
23
31
|
|
|
24
32
|
- **Dependency optional-extras split** — `sentence-transformers`, `torch`, `transformers`, `telethon`, and `playwright` are now optional extras: `voidaccess[nlp]`, `voidaccess[telegram]`, `voidaccess[js]`, and `voidaccess[all]`.
|
|
25
33
|
- **Optional clearnet ScrapingAnt integration** — paste sites and RSS feeds can now be routed through ScrapingAnt. Affects clearnet scraping only; Tor, `.onion`, GitHub, and GitLab traffic are never affected.
|
|
@@ -225,7 +233,7 @@ Export formats:
|
|
|
225
233
|
|
|
226
234
|
## Actor Intelligence
|
|
227
235
|
|
|
228
|
-
VoidAccess v1.7.
|
|
236
|
+
VoidAccess v1.7.1 persists actor profiles across investigations in `actor_profiles`, with linked aliases and infrastructure in `actor_aliases` and `actor_infrastructure`. Profiles are populated from threat actor, ransomware group, and handle entities, then enriched with co-occurring infrastructure and timeline events.
|
|
229
237
|
|
|
230
238
|
Cross-alias resolution scores five signals: shared infrastructure, shared PGP, string similarity, temporal co-activity, and co-investigation. Use `voidaccess actors` to list profiles, `voidaccess actor <handle>` for the full profile, `voidaccess actor <handle> --timeline` for chronology, and `voidaccess actor <handle> --note "text"` for analyst notes.
|
|
231
239
|
|
|
@@ -493,5 +501,3 @@ To report a security vulnerability, see [docs/SECURITY.md](docs/SECURITY.md).
|
|
|
493
501
|
MIT License. See [LICENSE](LICENSE) for details.
|
|
494
502
|
|
|
495
503
|
|
|
496
|
-
|
|
497
|
-
|
|
@@ -17,6 +17,7 @@ from __future__ import annotations
|
|
|
17
17
|
|
|
18
18
|
import logging
|
|
19
19
|
import os
|
|
20
|
+
import uuid
|
|
20
21
|
from typing import Optional
|
|
21
22
|
|
|
22
23
|
from fastapi import APIRouter, Depends, HTTPException, Query
|
|
@@ -99,7 +100,7 @@ def _user_owned_investigation_ids_subq(session, user_id: int):
|
|
|
99
100
|
|
|
100
101
|
def _profile_accessible(session, profile_id: str, user_id: int) -> bool:
|
|
101
102
|
"""True when at least one investigation linked to the profile is owned by the user."""
|
|
102
|
-
from db.models import ActorAlias, ActorInfrastructure
|
|
103
|
+
from db.models import ActorAlias, ActorInfrastructure
|
|
103
104
|
|
|
104
105
|
inv_ids_subq = _user_owned_investigation_ids_subq(session, user_id)
|
|
105
106
|
alias_match = (
|
|
@@ -151,7 +152,6 @@ async def list_actors(
|
|
|
151
152
|
ActorProfile,
|
|
152
153
|
ActorAlias,
|
|
153
154
|
ActorInfrastructure,
|
|
154
|
-
Investigation,
|
|
155
155
|
)
|
|
156
156
|
|
|
157
157
|
try:
|
|
@@ -258,6 +258,35 @@ async def get_actor(
|
|
|
258
258
|
return profile
|
|
259
259
|
|
|
260
260
|
|
|
261
|
+
@router.get("/{node_id}/profile")
|
|
262
|
+
async def get_actor_profile_by_node(
|
|
263
|
+
node_id: str,
|
|
264
|
+
investigation_id: str = Query(..., description="Investigation ID"),
|
|
265
|
+
current_user: CurrentUser = Depends(get_current_user),
|
|
266
|
+
) -> dict:
|
|
267
|
+
"""Return the graph actor profile for a node inside one investigation."""
|
|
268
|
+
_db_required()
|
|
269
|
+
try:
|
|
270
|
+
inv_uuid = uuid.UUID(investigation_id)
|
|
271
|
+
except ValueError:
|
|
272
|
+
raise HTTPException(status_code=422, detail="Invalid investigation ID format")
|
|
273
|
+
from db.queries import get_investigation_by_id_or_run
|
|
274
|
+
from graph import build_graph_from_db_cached, get_actor_profile
|
|
275
|
+
|
|
276
|
+
with _session() as session:
|
|
277
|
+
inv = get_investigation_by_id_or_run(session, inv_uuid)
|
|
278
|
+
if inv is None:
|
|
279
|
+
raise HTTPException(status_code=404, detail="Investigation not found")
|
|
280
|
+
if str(inv.user_id) != str(current_user.user.id):
|
|
281
|
+
raise HTTPException(status_code=403, detail="Forbidden")
|
|
282
|
+
graph = build_graph_from_db_cached(investigation_id=inv.id)
|
|
283
|
+
|
|
284
|
+
profile = get_actor_profile(graph, node_id)
|
|
285
|
+
if not profile:
|
|
286
|
+
raise HTTPException(status_code=404, detail="Graph node not found")
|
|
287
|
+
return profile
|
|
288
|
+
|
|
289
|
+
|
|
261
290
|
@router.get("/{handle}/investigations")
|
|
262
291
|
async def get_actor_investigations(
|
|
263
292
|
handle: str,
|
|
@@ -732,4 +761,4 @@ def uuid_value(s):
|
|
|
732
761
|
import uuid as _uuid
|
|
733
762
|
return _uuid.UUID(str(s))
|
|
734
763
|
except (ValueError, TypeError):
|
|
735
|
-
return None
|
|
764
|
+
return None
|