E-mails, subdomains and names Harvester - OSINT
This report summarizes scanner evidence for laramies/theHarvester, a Python project with 17,886 GitHub stars. SynthScan examined 88,660 lines of code across 295 source files, recording 1849 pattern matches distributed across 16 syntactic categories. The legacy adjusted pattern signal is 20.7 (Elevated pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 1542 finding(s).
Are imports declared and package/API names verified? 124 finding(s).
Are wrappers, guards, and repeated structures necessary? 1666 finding(s).
Which changes need focused human review? 1849 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 1849 distinct pattern matches across 16 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. 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 configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| 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, tmp_path): | 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/runtime_helpers.py | 40 | def runtime_with_process_factory(process_factory: ProcessFactory) -> ApiRuntime: | CODE |
| LOW | tests/test_harvestview_log_level.py | 11 | def test_invalid_log_level_is_rejected_before_server_start(monkeypatch, capsys, option, value): | CODE |
| LOW | tests/test_harvestview_log_level.py | 29 | def test_valid_log_levels_remain_case_insensitive(monkeypatch, level, uppercase): | CODE |
| 1422 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/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 | 31 | 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/rapiddns.py | 35 | except Exception as error: | CODE |
| LOW | theHarvester/discovery/rapiddns.py | 84 | except Exception: | CODE |
| MEDIUM | theHarvester/discovery/rapiddns.py | 22 | def do_search(self) -> SourceExecutionReport | None: | 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 |
| LOW⚡ | theHarvester/discovery/githubcode.py | 204 | except Exception as e: | CODE |
| LOW⚡ | theHarvester/discovery/githubcode.py | 213 | except Exception as e: | CODE |
| LOW⚡ | theHarvester/discovery/githubcode.py | 221 | except Exception as e: | CODE |
| MEDIUM | theHarvester/discovery/githubcode.py | 209 | def get_emails(self): | CODE |
| MEDIUM | theHarvester/discovery/githubcode.py | 217 | def get_hostnames(self): | CODE |
| LOW | theHarvester/discovery/subdomainfinderc99.py | 67 | except Exception: | CODE |
| LOW | theHarvester/discovery/subdomainfinderc99.py | 84 | except Exception: | CODE |
| LOW | theHarvester/discovery/builtwith.py | 179 | except Exception: | CODE |
| 46 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/runtime_helpers.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_release_artifacts.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_hudsonrock.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_runtime_services.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_target_identity.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/saved_run_report.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/jsmon.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/hostname_comparison.py | 1 | CODE | |
| LOW | theHarvester/lib/target_identity.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/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 | |
| 15 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | theHarvester/theHarvester.py | 34 | except ModuleNotFoundError: | CODE |
| HIGH | theHarvester/theHarvester.py | 27 | except ModuleNotFoundError: | CODE |
| HIGH | theHarvester/discovery/dnssearch.py | 204 | except StopIteration: | CODE |
| HIGH | theHarvester/discovery/takeover.py | 144 | except ValueError: | CODE |
| HIGH | theHarvester/discovery/gitlabsearch.py | 163 | except Exception: | CODE |
| HIGH | theHarvester/lib/target_identity.py | 38 | except ValueError: | CODE |
| HIGH | theHarvester/lib/target_identity.py | 34 | except ValueError: | CODE |
| HIGH | theHarvester/lib/hostnames.py | 14 | except ValueError: | CODE |
| HIGH | theHarvester/lib/source_runner.py | 397 | except Exception: | CODE |
| HIGH | theHarvester/lib/source_runner.py | 430 | except Exception: | CODE |
| HIGH | theHarvester/lib/api/schedule_service.py | 329 | except TimeoutError: | CODE |
| HIGH | theHarvester/lib/api/run_projection.py | 99 | except ValueError: | CODE |
| HIGH | theHarvester/lib/api/run_models.py | 266 | except ValueError: | CODE |
| HIGH | theHarvester/lib/api/run_evidence.py | 278 | except ValueError: | CODE |
| 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 | tests/discovery/test_provider_session_lifecycle.py | 196 | CODE | |
| LOW | theHarvester/saved_run_report.py | 111 | CODE | |
| LOW | theHarvester/saved_run_report.py | 307 | 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/certspottersearch.py | 26 | CODE | |
| LOW | theHarvester/discovery/bevigil.py | 34 | CODE | |
| LOW | theHarvester/discovery/projectdiscovery.py | 29 | CODE | |
| LOW | theHarvester/discovery/leaklookup.py | 51 | 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/rapiddns.py | 22 | 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/jsmon.py | 30 | 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/hostname_comparison.py | 103 | 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 | 203 | CODE | |
| LOW | theHarvester/lib/source_runner.py | 303 | CODE | |
| LOW | theHarvester/lib/source_runner.py | 451 | CODE | |
| LOW | theHarvester/lib/source_runner.py | 473 | CODE | |
| LOW | theHarvester/lib/api/schedule_service.py | 121 | CODE | |
| LOW | theHarvester/lib/api/schedule_service.py | 169 | CODE | |
| LOW | theHarvester/lib/api/schedule_service.py | 332 | CODE | |
| LOW | theHarvester/lib/api/api.py | 28 | CODE | |
| LOW | theHarvester/lib/api/api.py | 32 | CODE | |
| LOW | theHarvester/lib/api/run_models.py | 530 | CODE | |
| LOW | theHarvester/lib/api/run_evidence.py | 70 | 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 | 9 | 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 | 8 | 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 | 8 | 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 | 11 | 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 | 7 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/waybackarchive.py | 8 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/leakix.py | 16 | 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 | 12 | 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 | 8 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/tombasearch.py | 8 | logger = logging.getLogger(__name__) | CODE |
| LOW | theHarvester/discovery/search_dehashed.py | 16 | 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 | 77 | 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 | 87 | 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 | 35 | {'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 | 64 | assert await search.get_emails() == {'user@example.com', 'admin@example.com'} | CODE |
| LOW⚡ | tests/discovery/test_search_dehashed.py | 64 | 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 | 2080 | expect(value_filter).to_have_attribute('placeholder', 'Filter values') | CODE |
| LOW | tests/e2e/test_harvestview.py | 2081 | expect(dns_filter).to_have_attribute('placeholder', 'Filter DNS') | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | theHarvester/lib/api/static/harvestview/app.js | 1042 | const endpoint = nodes.newRunForm.elements.vhost_endpoint.value.trim(); | CODE |
| CRITICAL | theHarvester/lib/api/static/harvestview/app.js | 1056 | 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 | 458 | 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 |