| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 | # SPDX-License-Identifier: AGPL-3.0-or-later# lint: pylint"""A plugin to check if the ip address of the request is a TOR exit node if theuser searches for ``tor-check``.  It fetches the tor exit node list fromhttps://check.torproject.org/exit-addresses and parses all the IPs into a list,then checks if the user's IP address is in it.Enable in ``settings.yml``:.. code:: yaml  enabled_plugins:    ..    - 'Tor check plugin'"""import refrom flask_babel import gettextfrom httpx import HTTPErrorfrom searx.network import getdefault_on = Falsename = gettext("Tor check plugin")'''Translated name of the plugin'''description = gettext(    "This plugin checks if the address of the request is a TOR exit node, and"    " informs the user if it is, like check.torproject.org but from searxng.")'''Translated description of the plugin.'''preference_section = 'query''''The preference section where the plugin is shown.'''query_keywords = ['tor-check']'''Query keywords shown in the preferences.'''query_examples = '''''Query examples shown in the preferences.'''# Regex for exit node addresses in the list.reg = re.compile(r"(?<=ExitAddress )\S+")def post_search(request, search):    if search.search_query.pageno > 1:        return True    if search.search_query.query.lower() == "tor-check":        # Request the list of tor exit nodes.        try:            resp = get("https://check.torproject.org/exit-addresses")            node_list = re.findall(reg, resp.text)        except HTTPError:            # No answer, return error            search.result_container.answers["tor"] = {                "answer": gettext(                    "The TOR exit node list (https://check.torproject.org/exit-addresses) is unreachable."                )            }            return True        x_forwarded_for = request.headers.getlist("X-Forwarded-For")        if x_forwarded_for:            ip_address = x_forwarded_for[0]        else:            ip_address = request.remote_addr        if ip_address in node_list:            search.result_container.answers["tor"] = {                "answer": gettext(                    "You are using TOR. Your IP address seems to be: {ip_address}.".format(ip_address=ip_address)                )            }        else:            search.result_container.answers["tor"] = {                "answer": gettext(                    "You are not using TOR. Your IP address seems to be: {ip_address}.".format(ip_address=ip_address)                )            }    return True
 |