ahmia_filter.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. # SPDX-License-Identifier: AGPL-3.0-or-later
  2. # pylint: disable=missing-module-docstring
  3. from __future__ import annotations
  4. import typing
  5. from hashlib import md5
  6. from flask_babel import gettext
  7. from searx.data import ahmia_blacklist_loader
  8. from searx import get_setting
  9. from searx.plugins import Plugin, PluginInfo
  10. if typing.TYPE_CHECKING:
  11. import flask
  12. from searx.search import SearchWithPlugins
  13. from searx.extended_types import SXNG_Request
  14. from searx.result_types import Result
  15. from searx.plugins import PluginCfg
  16. ahmia_blacklist: list = []
  17. class SXNGPlugin(Plugin):
  18. """Filter out onion results that appear in Ahmia's blacklist (See https://ahmia.fi/blacklist)."""
  19. id = "ahmia_filter"
  20. def __init__(self, plg_cfg: "PluginCfg") -> None:
  21. super().__init__(plg_cfg)
  22. self.info = PluginInfo(
  23. id=self.id,
  24. name=gettext("Ahmia blacklist"),
  25. description=gettext("Filter out onion results that appear in Ahmia's blacklist."),
  26. preference_section="general",
  27. )
  28. def on_result(
  29. self, request: "SXNG_Request", search: "SearchWithPlugins", result: Result
  30. ) -> bool: # pylint: disable=unused-argument
  31. if not getattr(result, "is_onion", False) or not getattr(result, "parsed_url", False):
  32. return True
  33. result_hash = md5(result["parsed_url"].hostname.encode()).hexdigest()
  34. return result_hash not in ahmia_blacklist
  35. def init(self, app: "flask.Flask") -> bool: # pylint: disable=unused-argument
  36. global ahmia_blacklist # pylint: disable=global-statement
  37. if not get_setting("outgoing.using_tor_proxy"):
  38. # disable the plugin
  39. return False
  40. ahmia_blacklist = ahmia_blacklist_loader()
  41. return True