E-mails, subdomains and names Harvester - OSINT
This report presents the forensic synthetic code analysis of laramies/theHarvester, a Python project with 17,224 GitHub stars. SynthScan v2.0 examined 84,044 lines of code across 278 source files, recording 1744 pattern matches distributed across 15 syntactic categories. The overall adjusted score of 20.1 places this repository in the Moderate AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 1744 distinct pattern matches across 15 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_hackertarget_apikey.py | 11 | def test_routes_include_subdomains_and_ips(self): | CODE |
| LOW | tests/test_hackertarget_apikey.py | 15 | async def test_do_search_with_apikey(self, monkeypatch): | CODE |
| LOW | tests/test_hackertarget_apikey.py | 55 | async def test_do_search_without_apikey(self, monkeypatch): | CODE |
| LOW | tests/test_hackertarget_apikey.py | 85 | async def test_http_failure_is_reported(self, monkeypatch, status, execution_status, stop_reason): | CODE |
| LOW | tests/test_hackertarget_apikey.py | 106 | async def test_empty_or_malformed_success_is_reported(self, monkeypatch, body: object): | CODE |
| LOW | tests/test_hackertarget_apikey.py | 126 | async def test_out_of_scope_rows_do_not_contribute_ips(self, monkeypatch): | CODE |
| LOW | tests/test_hackertarget_apikey.py | 146 | async def test_no_records_sentinel_is_a_valid_empty_result(self, monkeypatch): | CODE |
| LOW | tests/test_hackertarget_apikey.py | 172 | async def test_endpoint_failure_preserves_other_results(self, monkeypatch, failed_response, stop_reason): | CODE |
| LOW | tests/test_hackertarget_apikey.py | 192 | async def test_valid_empty_endpoint_makes_other_failure_partial(self, monkeypatch): | CODE |
| LOW | tests/test_hackertarget_apikey.py | 212 | async def test_malformed_rows_preserve_valid_results_as_partial(self, monkeypatch): | CODE |
| LOW | tests/test_hackertarget_apikey.py | 232 | async def test_hyphenated_domain_still_uses_reverse_dns(self, monkeypatch): | CODE |
| LOW | tests/test_hackertarget_apikey.py | 267 | async def test_address_query_does_not_trigger_real_time_reverse_dns(self, monkeypatch, target): | CODE |
| LOW | tests/test_hackertarget_apikey.py | 282 | async def test_cancellation_propagates(self, monkeypatch): | CODE |
| LOW | tests/test_screenshot.py | 41 | async def test_reachable_targets_reuses_one_session_and_bounds_empty_responses( | CODE |
| LOW | tests/test_screenshot.py | 65 | async def test_reachable_targets_retains_completed_http_error_responses( | CODE |
| LOW | tests/test_screenshot.py | 93 | async def test_reachable_targets_cancellation_closes_session_and_leaves_no_tasks( | CODE |
| LOW | tests/test_screenshot.py | 141 | async def test_capture_targets_reuses_one_browser_and_bounds_isolated_contexts( | CODE |
| LOW | tests/test_screenshot.py | 240 | async def test_capture_targets_closes_resources_after_each_failure_stage( | CODE |
| LOW | tests/test_screenshot.py | 305 | async def test_capture_targets_cancellation_closes_resources_and_leaves_no_tasks( | CODE |
| LOW | tests/test_screenshot.py | 359 | async def test_capture_cleanup_preserves_cancellation_and_attempts_every_resource( | CODE |
| LOW | tests/test_screenshot.py | 400 | def test_screenshot_output_separator_matches_platform( | CODE |
| LOW | tests/test_screenshot.py | 417 | def test_screenshot_path_uses_the_target_host_and_port(tmp_path: Path, target: str, filename: str) -> None: | CODE |
| LOW | tests/test_screenshot.py | 431 | async def test_visit_prefers_https_and_normalizes_the_target( | CODE |
| LOW | tests/test_screenshot.py | 457 | async def test_visit_falls_back_to_http_when_https_is_unreachable(monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW | tests/test_screenshot.py | 488 | async def test_take_screenshot_normalizes_the_target( | CODE |
| LOW | tests/test_screenshot.py | 517 | async def test_take_screenshot_can_name_the_artifact_for_the_authorized_subject( | CODE |
| LOW | tests/test_screenshot.py | 545 | async def test_screenshot_visit_uses_an_http_proxy(monkeypatch) -> None: | CODE |
| LOW | tests/test_screenshot.py | 567 | async def test_screenshot_capture_is_owner_only(tmp_path, monkeypatch) -> None: | CODE |
| LOW | tests/test_security.py | 15 | def test_api_does_not_enable_cross_origin_requests(self): | CODE |
| LOW | tests/test_security.py | 24 | def test_sanitize_for_xml_escapes_special_characters(self): | CODE |
| LOW | tests/test_security.py | 42 | def test_sanitize_for_xml_prevents_xml_entity_injection(self): | CODE |
| LOW | tests/test_security.py | 57 | def test_command_line_args_are_sanitized_in_xml_output(self): | CODE |
| LOW | tests/test_security.py | 84 | def test_api_does_not_expose_traceback_in_error_responses(self, client): | CODE |
| LOW | tests/test_security.py | 95 | def test_error_responses_do_not_leak_internal_paths(self, client, tmp_path, monkeypatch): | CODE |
| LOW | tests/test_security.py | 124 | def test_debug_mode_does_not_expose_sensitive_info(self, client, monkeypatch): | CODE |
| LOW⚡ | tests/test_security.py | 148 | def test_api_fails_closed_without_configured_api_key(self, client, monkeypatch): | CODE |
| LOW⚡ | tests/test_security.py | 156 | def test_api_key_can_be_read_from_a_docker_secret_file(self, client, tmp_path, monkeypatch): | CODE |
| LOW⚡ | tests/test_security.py | 166 | def test_api_rejects_missing_or_invalid_api_key(self, client, monkeypatch): | CODE |
| LOW⚡ | tests/test_security.py | 175 | def test_api_does_not_expose_internal_errors(self, monkeypatch): | CODE |
| LOW | tests/test_security.py | 197 | def test_sanitize_filename_removes_path_components(self): | CODE |
| LOW | tests/test_security.py | 222 | def test_sanitize_filename_removes_dangerous_characters(self): | CODE |
| LOW | tests/test_security.py | 247 | def test_sanitize_filename_prevents_hidden_files(self): | CODE |
| LOW | tests/test_security.py | 258 | def test_filename_sanitization_preserves_safe_filenames(self): | CODE |
| LOW | tests/test_security.py | 274 | def test_path_traversal_in_file_operations(self): | CODE |
| LOW | tests/test_security.py | 297 | def test_no_hardcoded_secrets_in_code(self): | CODE |
| LOW | tests/test_security.py | 329 | def test_sensitive_endpoints_require_validation(self, monkeypatch): | CODE |
| LOW | tests/conftest.py | 44 | def provider_contract_sources(request: pytest.FixtureRequest) -> tuple[str, ...]: | CODE |
| LOW | tests/conftest.py | 61 | def pytest_collection_modifyitems(config: pytest.Config, items: list[pytest.Item]) -> None: | CODE |
| LOW | tests/conftest.py | 140 | def _guarded_gethostbyname_ex(host: str) -> tuple[str, list[str], list[str]]: | CODE |
| LOW | tests/test_logging.py | 24 | def test_import_does_not_configure_application_logging() -> None: | CODE |
| LOW | tests/test_logging.py | 44 | def test_operator_output_uses_stdout_without_verbose_logging() -> None: | CODE |
| LOW | tests/test_logging.py | 58 | def test_diagnostics_use_stderr_only_when_verbose() -> None: | CODE |
| LOW | tests/test_logging.py | 77 | def test_verbose_logging_restores_the_package_level() -> None: | CODE |
| LOW | tests/test_logging.py | 98 | def test_verbose_logging_does_not_overwrite_a_later_host_level() -> None: | CODE |
| LOW | tests/test_logging.py | 116 | def test_verbose_enables_info_diagnostics(tmp_path: Path) -> None: | CODE |
| LOW | tests/test_logging.py | 149 | def test_operator_output_flushes_the_current_stdout(monkeypatch) -> None: | STRING |
| LOW | tests/test_logging.py | 169 | def test_cli_preserves_host_logging_unless_verbose_is_requested(tmp_path: Path) -> None: | STRING |
| LOW | tests/test_harness.py | 14 | def test_python_socket_network_is_blocked_by_default() -> None: | CODE |
| LOW | tests/test_harness.py | 31 | def test_http_client_cannot_escape_network_guard() -> None: | CODE |
| LOW | tests/test_harness.py | 36 | def test_loopback_network_remains_available(tmp_path: Path) -> None: | CODE |
| 1330 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | theHarvester/__main__.py | 2223 | def entry_point() -> None: | CODE |
| LOW | theHarvester/__main__.py | 685 | except Exception as error: | CODE |
| LOW | theHarvester/__main__.py | 804 | except Exception as error: | CODE |
| LOW | theHarvester/__main__.py | 855 | except Exception as error: | CODE |
| LOW | theHarvester/__main__.py | 1052 | except Exception as error: | CODE |
| LOW | theHarvester/__main__.py | 1245 | except Exception as error: | CODE |
| LOW | theHarvester/__main__.py | 1581 | except Exception as error: | CODE |
| LOW | theHarvester/__main__.py | 1746 | except Exception as ee: | CODE |
| LOW | theHarvester/__main__.py | 1803 | except Exception as init_error: | CODE |
| LOW | theHarvester/__main__.py | 1838 | except Exception as ip_error: | CODE |
| LOW | theHarvester/__main__.py | 1856 | except Exception as action_error: | CODE |
| LOW | theHarvester/__main__.py | 1941 | except Exception: | CODE |
| LOW | theHarvester/__main__.py | 2107 | except Exception as error: | CODE |
| LOW | theHarvester/__main__.py | 2230 | except Exception as error_entry_point: | CODE |
| LOW | theHarvester/screenshot/screenshot.py | 57 | except Exception as e: | CODE |
| LOW | theHarvester/screenshot/screenshot.py | 90 | except Exception as e: | CODE |
| LOW | theHarvester/screenshot/screenshot.py | 199 | except Exception as error: | CODE |
| MEDIUM | theHarvester/screenshot/screenshot.py | 47 | def verify_path(self) -> bool: | CODE |
| LOW | theHarvester/discovery/urlscan.py | 187 | except Exception as error: | CODE |
| LOW | theHarvester/discovery/fofa.py | 32 | except Exception as error: | CODE |
| LOW | theHarvester/discovery/fofa.py | 127 | except Exception: | CODE |
| MEDIUM | theHarvester/discovery/fofa.py | 29 | def _get_api_credentials(self) -> tuple[str, str]: | CODE |
| LOW | theHarvester/discovery/searchhunterhow.py | 102 | except Exception: | CODE |
| LOW | theHarvester/discovery/rocketreach.py | 94 | except Exception as e: | CODE |
| MEDIUM | theHarvester/discovery/rocketreach.py | 24 | def do_search(self) -> None: | CODE |
| LOW | theHarvester/discovery/certspottersearch.py | 121 | except Exception: | CODE |
| LOW | theHarvester/discovery/search_dnsdumpster.py | 35 | except Exception as error: | CODE |
| LOW | theHarvester/discovery/bevigil.py | 78 | except Exception: | CODE |
| LOW | theHarvester/discovery/censysearch.py | 94 | except Exception: | CODE |
| LOW | theHarvester/discovery/projectdiscovery.py | 23 | except Exception as error: | CODE |
| LOW | theHarvester/discovery/projectdiscovery.py | 89 | except Exception as error: | CODE |
| LOW | theHarvester/discovery/projectdiscovery.py | 94 | except Exception as error: | CODE |
| MEDIUM | theHarvester/discovery/projectdiscovery.py | 20 | def _get_api_key(self) -> str: | CODE |
| MEDIUM | theHarvester/discovery/projectdiscovery.py | 29 | def do_search(self) -> SourceExecutionReport | None: | CODE |
| LOW | theHarvester/discovery/mojeek.py | 25 | except Exception: | CODE |
| LOW | theHarvester/discovery/thc.py | 65 | except Exception as e: | CODE |
| LOW | theHarvester/discovery/shodanct.py | 29 | except Exception as error: | CODE |
| LOW | theHarvester/discovery/crtsh.py | 52 | except Exception as e: | CODE |
| LOW | theHarvester/discovery/fullhuntsearch.py | 121 | except Exception as error: | CODE |
| LOW | theHarvester/discovery/fullhuntsearch.py | 457 | except Exception as error: | CODE |
| LOW | theHarvester/discovery/virustotal.py | 69 | except Exception: | CODE |
| LOW | theHarvester/discovery/hudsonrocksearch.py | 59 | except Exception as e: | CODE |
| LOW | theHarvester/discovery/hudsonrocksearch.py | 135 | except Exception as e: | CODE |
| LOW | theHarvester/discovery/hudsonrocksearch.py | 184 | except Exception as e: | CODE |
| LOW | theHarvester/discovery/hudsonrocksearch.py | 211 | except Exception as e: | CODE |
| LOW | theHarvester/discovery/hudsonrocksearch.py | 289 | except Exception as e: | CODE |
| LOW | theHarvester/discovery/hudsonrocksearch.py | 337 | except Exception as e: | CODE |
| LOW | theHarvester/discovery/hudsonrocksearch.py | 422 | except Exception as e: | CODE |
| LOW | theHarvester/discovery/rapiddns.py | 69 | except Exception as e: | CODE |
| MEDIUM | theHarvester/discovery/rapiddns.py | 20 | def do_search(self): | CODE |
| LOW | theHarvester/discovery/baidusearch.py | 80 | except Exception: | CODE |
| LOW | theHarvester/discovery/dnssearch.py | 110 | except Exception: | CODE |
| LOW | theHarvester/discovery/dnssearch.py | 135 | except Exception as error: | CODE |
| LOW | theHarvester/discovery/securityscorecard.py | 146 | except Exception: | CODE |
| LOW | theHarvester/discovery/zoomeyesearch.py | 214 | except Exception: | CODE |
| LOW | theHarvester/discovery/githubcode.py | 55 | except Exception as e: | CODE |
| LOW | theHarvester/discovery/githubcode.py | 88 | except Exception as e: | CODE |
| LOW | theHarvester/discovery/githubcode.py | 104 | except Exception as e: | CODE |
| LOW | theHarvester/discovery/githubcode.py | 130 | except Exception as e: | CODE |
| LOW⚡ | theHarvester/discovery/githubcode.py | 197 | except Exception as e: | CODE |
| 55 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_screenshot.py | 1 | CODE | |
| LOW | tests/conftest.py | 1 | CODE | |
| LOW | tests/test_logging.py | 1 | CODE | |
| LOW | tests/test_harness.py | 1 | CODE | |
| LOW | tests/test_workflow_contract.py | 1 | CODE | |
| LOW | tests/test_no_hosts.py | 1 | CODE | |
| LOW | tests/test_readme.py | 1 | CODE | |
| LOW | tests/test_bravesearch.py | 1 | CODE | |
| LOW | tests/discovery/test_onyphe.py | 1 | CODE | |
| LOW | tests/discovery/test_urlscan.py | 1 | CODE | |
| LOW | tests/discovery/test_gitlabsearch.py | 1 | CODE | |
| LOW | tests/discovery/test_fofa.py | 1 | CODE | |
| LOW | tests/discovery/test_dnsdb.py | 1 | CODE | |
| LOW | tests/discovery/test_censys.py | 1 | CODE | |
| LOW | tests/discovery/test_thc.py | 12 | CODE | |
| LOW | tests/discovery/test_netlas.py | 1 | CODE | |
| LOW | tests/discovery/test_securitytrails.py | 1 | CODE | |
| LOW | tests/discovery/test_githubcode_contract.py | 1 | CODE | |
| LOW | tests/discovery/test_securityscorecard.py | 1 | CODE | |
| LOW | tests/discovery/test_whoisxml.py | 1 | CODE | |
| LOW | tests/discovery/test_sourcegraph.py | 1 | CODE | |
| LOW | tests/discovery/test_virustotal.py | 1 | CODE | |
| LOW | tests/lib/test_configuration_contract.py | 1 | CODE | |
| LOW | tests/lib/test_schedules.py | 1 | CODE | |
| LOW | tests/lib/test_recursive_dns.py | 1 | CODE | |
| LOW | tests/lib/test_core.py | 1 | CODE | |
| LOW | tests/lib/test_run_backend.py | 1 | CODE | |
| LOW | tests/lib/test_api_v1.py | 1 | CODE | |
| LOW | tests/lib/test_output.py | 1 | CODE | |
| LOW | tests/lib/test_harvestview_ui.py | 1 | CODE | |
| LOW | tests/lib/test_dns_consensus.py | 1 | CODE | |
| LOW | tests/lib/test_source_runner.py | 1 | CODE | |
| LOW | tests/lib/test_routeviews.py | 1 | CODE | |
| LOW | tests/e2e/conftest.py | 1 | CODE | |
| LOW | tests/e2e/test_harvestview.py | 1 | CODE | |
| LOW | theHarvester/source_yields.py | 1 | CODE | |
| LOW | theHarvester/discovery/virustotal.py | 1 | CODE | |
| LOW | theHarvester/discovery/baidusearch.py | 1 | CODE | |
| LOW | theHarvester/discovery/securityscorecard.py | 1 | CODE | |
| LOW | theHarvester/discovery/zoomeyesearch.py | 1 | CODE | |
| LOW | theHarvester/discovery/securitytrailssearch.py | 1 | CODE | |
| LOW | theHarvester/discovery/yahoosearch.py | 1 | CODE | |
| LOW | theHarvester/discovery/whoisxml.py | 1 | CODE | |
| LOW | theHarvester/discovery/takeover.py | 1 | CODE | |
| LOW | theHarvester/discovery/netlas.py | 1 | CODE | |
| LOW | theHarvester/lib/enumeration.py | 1 | CODE | |
| LOW | theHarvester/lib/network_evidence.py | 1 | CODE | |
| LOW | theHarvester/lib/cancellation.py | 1 | CODE | |
| LOW | theHarvester/lib/database.py | 45 | CODE | |
| LOW | theHarvester/lib/database.py | 73 | CODE | |
| LOW | theHarvester/lib/takeover_evidence.py | 1 | CODE | |
| LOW | theHarvester/lib/asn_attribution.py | 1 | CODE | |
| LOW | theHarvester/lib/recursive_dns.py | 1 | CODE | |
| LOW | theHarvester/lib/dns_consensus.py | 3 | CODE | |
| LOW | theHarvester/lib/result_values.py | 1 | CODE | |
| LOW | theHarvester/lib/shodan_evidence.py | 1 | CODE | |
| LOW | theHarvester/lib/source_runner.py | 1 | CODE | |
| LOW | theHarvester/lib/output.py | 1 | CODE | |
| LOW | theHarvester/lib/api/schedule_service.py | 1 | CODE | |
| LOW | theHarvester/lib/api/run_projection.py | 1 | CODE | |
| 8 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/discovery/test_thc.py | 117 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/discovery/test_thc.py | 119 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/discovery/test_thc.py | 155 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/discovery/test_thc.py | 157 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/discovery/test_thc.py | 329 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/discovery/test_thc.py | 331 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/discovery/test_thc.py | 376 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/discovery/test_thc.py | 378 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/discovery/test_thc.py | 401 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/discovery/test_thc.py | 403 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/discovery/test_thc.py | 443 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/discovery/test_thc.py | 445 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/discovery/test_thc.py | 483 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/discovery/test_thc.py | 485 | # ============================================================================= | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/discovery/test_commoncrawl.py | 11 | CODE | |
| LOW | tests/discovery/test_commoncrawl.py | 55 | CODE | |
| LOW | tests/discovery/test_commoncrawl.py | 20 | CODE | |
| LOW | tests/discovery/test_commoncrawl.py | 69 | CODE | |
| LOW | theHarvester/screenshot/screenshot.py | 218 | CODE | |
| LOW | theHarvester/screenshot/screenshot.py | 229 | CODE | |
| LOW | theHarvester/discovery/urlscan.py | 48 | CODE | |
| LOW | theHarvester/discovery/fofa.py | 38 | CODE | |
| LOW | theHarvester/discovery/searchhunterhow.py | 37 | CODE | |
| LOW | theHarvester/discovery/rocketreach.py | 24 | CODE | |
| LOW | theHarvester/discovery/certspottersearch.py | 26 | CODE | |
| LOW | theHarvester/discovery/bevigil.py | 34 | CODE | |
| LOW | theHarvester/discovery/projectdiscovery.py | 29 | CODE | |
| LOW | theHarvester/discovery/leaklookup.py | 48 | CODE | |
| LOW | theHarvester/discovery/thc.py | 29 | CODE | |
| LOW | theHarvester/discovery/crtsh.py | 18 | CODE | |
| LOW | theHarvester/discovery/fullhuntsearch.py | 424 | CODE | |
| LOW | theHarvester/discovery/virustotal.py | 24 | CODE | |
| LOW | theHarvester/discovery/virustotal.py | 77 | CODE | |
| LOW | theHarvester/discovery/hudsonrocksearch.py | 107 | CODE | |
| LOW | theHarvester/discovery/hudsonrocksearch.py | 217 | CODE | |
| LOW | theHarvester/discovery/hudsonrocksearch.py | 313 | CODE | |
| LOW | theHarvester/discovery/rapiddns.py | 20 | CODE | |
| LOW | theHarvester/discovery/securityscorecard.py | 76 | CODE | |
| LOW | theHarvester/discovery/zoomeyesearch.py | 133 | CODE | |
| LOW | theHarvester/discovery/githubcode.py | 138 | CODE | |
| LOW | theHarvester/discovery/criminalip.py | 194 | CODE | |
| LOW | theHarvester/discovery/hackertarget.py | 28 | CODE | |
| LOW | theHarvester/discovery/onyphe.py | 118 | CODE | |
| LOW | theHarvester/discovery/takeover.py | 48 | CODE | |
| LOW | theHarvester/discovery/waybackarchive.py | 59 | CODE | |
| LOW | theHarvester/discovery/waybackarchive.py | 108 | CODE | |
| LOW | theHarvester/discovery/gitlabsearch.py | 116 | CODE | |
| LOW | theHarvester/discovery/gitlabsearch.py | 187 | CODE | |
| LOW | theHarvester/lib/database.py | 425 | CODE | |
| LOW | theHarvester/lib/database.py | 1234 | CODE | |
| LOW | theHarvester/lib/recursive_dns.py | 92 | CODE | |
| LOW | theHarvester/lib/completed_result.py | 79 | CODE | |
| LOW | theHarvester/lib/completed_result.py | 524 | CODE | |
| LOW | theHarvester/lib/dns_consensus.py | 83 | CODE | |
| LOW | theHarvester/lib/source_runner.py | 201 | CODE | |
| LOW | theHarvester/lib/source_runner.py | 301 | CODE | |
| LOW | theHarvester/lib/source_runner.py | 449 | CODE | |
| LOW | theHarvester/lib/source_runner.py | 471 | CODE | |
| LOW | theHarvester/lib/api/schedule_service.py | 228 | CODE | |
| LOW | theHarvester/lib/api/schedule_service.py | 107 | CODE | |
| LOW | theHarvester/lib/api/schedule_service.py | 155 | CODE | |
| LOW | theHarvester/lib/api/run_models.py | 549 | CODE | |
| LOW | theHarvester/lib/api/run_evidence.py | 71 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | theHarvester/__main__.py | 90 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/screenshot/screenshot.py | 23 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/urlscan.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/rocketreach.py | 7 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/huntersearch.py | 8 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/certspottersearch.py | 7 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/otxsearch.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/search_dnsdumpster.py | 10 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/projectdiscovery.py | 7 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/leaklookup.py | 6 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/mojeek.py | 8 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/thc.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/shodanct.py | 6 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/crtsh.py | 7 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/fullhuntsearch.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/rapiddns.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/dnssearch.py | 22 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/githubcode.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/haveibeenpwned.py | 6 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/criminalip.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/robtex.py | 10 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/arquivo.py | 10 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/onyphe.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/subdomaincenter.py | 5 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/waybackarchive.py | 8 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/leakix.py | 8 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/sherlockeye.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/dnsdb.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/api_endpoints.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/shodan_internetdb.py | 10 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/pentesttools.py | 10 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/commoncrawl.py | 10 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/hibpverified.py | 6 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/tombasearch.py | 8 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/search_dehashed.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/gitlabsearch.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/windvane.py | 15 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/windvane.py | 233 | def set_api_key(self, api_key: str) -> None: | CODE |
| LOW | theHarvester/discovery/shodansearch.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/lib/database.py | 75 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/lib/__init__.py | 1 | __all__ = ['hostchecker'] | CODE |
| LOW | theHarvester/lib/core.py | 32 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/lib/virtual_host.py | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/lib/source_runner.py | 86 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/lib/api/schedule_store.py | 562 | async def set_dispatch_state(self, run_id: str, state: DispatchState, error: str | None = None) -> None: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_mojeek.py | 173 | assert await search.get_emails() == {'admin@example.com'} | CODE |
| LOW | tests/test_mojeek.py | 317 | assert await search.get_emails() == {'admin@example.com'} | CODE |
| LOW | tests/test_myparser.py | 14 | ('Example.COM.', {'admin@example.com', 'lead@sub.example.com', 'owner@www.example.com'}), | CODE |
| LOW | tests/discovery/test_intelxsearch.py | 116 | assert await search.get_emails() == ['admin@example.com'] | CODE |
| LOW | tests/discovery/test_duckduckgo.py | 67 | assert await search.get_emails() == {'admin@example.com'} | STRING |
| LOW | tests/discovery/test_search_dehashed.py | 34 | {'email': 'admin@example.com', 'ip_address': '2001:0db8::1', 'database_name': 'private-breach'} for _ in range(2 | CODE |
| LOW⚡ | tests/discovery/test_search_dehashed.py | 55 | assert await search.get_emails() == {'user@example.com', 'admin@example.com'} | CODE |
| LOW⚡ | tests/discovery/test_search_dehashed.py | 55 | assert await search.get_emails() == {'user@example.com', 'admin@example.com'} | CODE |
| LOW | tests/discovery/test_censys.py | 52 | 'parsed': {'subject': {'email_address': ['admin@example.com']}}, | CODE |
| LOW | tests/discovery/test_censys.py | 130 | assert await search.get_emails() == {'admin@example.com', 'ops@example.com'} | CODE |
| LOW | tests/discovery/test_rapiddns.py | 149 | return {'user@example.com'} | STRING |
| LOW⚡ | tests/discovery/test_rapiddns.py | 351 | assert rest_results[7] == ['user@example.com'] | STRING |
| LOW⚡ | tests/discovery/test_rapiddns.py | 358 | assert ('email', 'user@example.com') in completed_results[1].results | STRING |
| LOW⚡ | tests/discovery/test_rapiddns.py | 360 | ('dehashed', 'email', 'user@example.com'), | STRING |
| LOW | tests/discovery/test_zoomeyesearch.py | 33 | 'banner': 'admin@example.com', | CODE |
| LOW | tests/discovery/test_zoomeyesearch.py | 67 | assert await search.get_emails() == {'admin@example.com'} | CODE |
| LOW | tests/discovery/test_githubcode_contract.py | 114 | assert await search.get_emails() == {'admin@example.com'} | CODE |
| LOW | tests/discovery/test_brave.py | 93 | assert await search.get_emails() == {'admin@example.com'} | CODE |
| LOW | tests/discovery/test_builtwith.py | 27 | monkeypatch.setattr(builtwith.Core, 'builtwith_key', lambda: 'dummy-key') | CODE |
| LOW | tests/discovery/test_builtwith.py | 81 | 'Authorization': 'API dummy-key', | CODE |
| LOW | tests/discovery/test_builtwith.py | 97 | monkeypatch.setattr(builtwith.Core, 'builtwith_key', lambda: 'dummy-key') | CODE |
| LOW | tests/discovery/test_builtwith.py | 129 | monkeypatch.setattr(builtwith.Core, 'builtwith_key', lambda: 'dummy-key') | CODE |
| LOW | tests/discovery/test_builtwith.py | 181 | monkeypatch.setattr(builtwith.Core, 'builtwith_key', lambda: 'dummy-key') | CODE |
| LOW | tests/discovery/test_builtwith.py | 198 | monkeypatch.setattr(builtwith.Core, 'builtwith_key', lambda: 'dummy-key') | CODE |
| LOW | tests/discovery/test_builtwith.py | 242 | monkeypatch.setattr(builtwith.Core, 'builtwith_key', lambda: 'dummy-key') | CODE |
| LOW | tests/discovery/test_builtwith.py | 258 | monkeypatch.setattr(builtwith.Core, 'builtwith_key', lambda: 'dummy-key') | CODE |
| LOW | tests/discovery/test_yahoosearch.py | 43 | assert set(await search.get_emails()) == {'admin@example.com'} | CODE |
| LOW⚡ | tests/discovery/test_sherlockeye.py | 33 | monkeypatch.setattr(sherlockeye.Core, 'sherlockeye_key', lambda: 'dummy-key') | CODE |
| LOW | tests/discovery/test_sherlockeye.py | 44 | 'Authorization': 'Bearer dummy-key', | CODE |
| LOW | tests/discovery/test_sherlockeye.py | 84 | monkeypatch.setattr(sherlockeye.Core, 'sherlockeye_key', lambda: 'dummy-key') | CODE |
| LOW | tests/discovery/test_sherlockeye.py | 101 | 'email': 'user@example.com', | CODE |
| LOW⚡ | tests/discovery/test_sherlockeye.py | 130 | assert await search.get_emails() == {'user@example.com'} | CODE |
| LOW⚡ | tests/discovery/test_sherlockeye.py | 137 | monkeypatch.setattr(sherlockeye.Core, 'sherlockeye_key', lambda: 'dummy-key') | CODE |
| LOW | tests/discovery/test_sherlockeye.py | 159 | monkeypatch.setattr(sherlockeye.Core, 'sherlockeye_key', lambda: 'dummy-key') | CODE |
| LOW | tests/discovery/test_sherlockeye.py | 187 | monkeypatch.setattr(sherlockeye.Core, 'sherlockeye_key', lambda: 'dummy-key') | CODE |
| LOW | tests/discovery/test_sherlockeye.py | 202 | monkeypatch.setattr(sherlockeye.Core, 'sherlockeye_key', lambda: 'dummy-key') | CODE |
| LOW | tests/discovery/test_sherlockeye.py | 216 | monkeypatch.setattr(sherlockeye.Core, 'sherlockeye_key', lambda: 'dummy-key') | CODE |
| LOW | tests/discovery/test_sherlockeye.py | 238 | monkeypatch.setattr(sherlockeye.Core, 'sherlockeye_key', lambda: 'dummy-key') | CODE |
| LOW | tests/lib/test_completed_persistence.py | 1571 | ('example.com', 'admin@example.com', 'email', '2026-08-08', 'hunter'), | STRING |
| LOW | tests/lib/test_completed_persistence.py | 1595 | ('admin@example.com', 'email'), | STRING |
| LOW | tests/lib/test_completed_persistence.py | 1705 | await store.record_observations('example.com', ['admin@example.com'], 'email', 'hunter') | STRING |
| LOW | tests/lib/test_completed_persistence.py | 1719 | ('example.com', 'admin@example.com', 'email', 'hunter'), | STRING |
| LOW | tests/lib/test_completed_result.py | 94 | 'email': ['admin@example.com'], | CODE |
| LOW | tests/lib/test_completed_result.py | 117 | 'value': 'admin@example.com', | CODE |
| LOW | tests/e2e/test_harvestview.py | 1836 | expect(value_filter).to_have_attribute('placeholder', 'Filter values') | CODE |
| LOW | tests/e2e/test_harvestview.py | 1837 | expect(dns_filter).to_have_attribute('placeholder', 'Filter DNS') | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | theHarvester/lib/api/static/harvestview/app.js | 964 | const endpoint = nodes.newRunForm.elements.vhost_endpoint.value.trim(); | CODE |
| CRITICAL | theHarvester/lib/api/static/harvestview/app.js | 978 | const target = nodes.newRunForm.elements.target.value.trim(); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_main.py | 3647 | CODE | |
| MEDIUM | tests/discovery/test_censys.py | 202 | CODE | |
| MEDIUM | tests/discovery/test_brave.py | 137 | CODE | |
| MEDIUM | tests/lib/test_routeviews.py | 149 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | theHarvester/__main__.py | 1953 | # Define a default wordlist if none is specified | COMMENT |
| MEDIUM | theHarvester/__main__.py | 1959 | # Create a default simple API endpoint list | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | theHarvester/__main__.py | 1826 | # Check if the result is a string (error message) | COMMENT |
| LOW | theHarvester/__main__.py | 2017 | # Print results | COMMENT |
| LOW | theHarvester/discovery/api_endpoints.py | 883 | # Check if rate limited | COMMENT |
| LOW | theHarvester/discovery/api_endpoints.py | 892 | # Check if this is an interesting endpoint | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | theHarvester/discovery/api_endpoints.py | 158 | # Add comprehensive API paths categorized by functionality | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/e2e/test_harvestview.py | 351 | return buttonBox.top >= dialogBox.top && buttonBox.bottom <= dialogBox.bottom && buttonBox.bottom <= innerHeig | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .github/workflows/codeql-analysis.yml | 1 | # For most projects, this workflow file will not need changing; you simply need | COMMENT |
| LOW | .github/workflows/codeql-analysis.yml | 61 | # Prefix the list here with "+" to use these queries and those in the config file. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | theHarvester/lib/completed_result.py | 424 | CODE |