| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 | # 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(                    "Could not download the list of Tor exit-nodes from: https://check.torproject.org/exit-addresses"                )            }            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 and it looks like you have this external IP address: {ip_address}".format(                        ip_address=ip_address                    )                )            }        else:            search.result_container.answers["tor"] = {                "answer": gettext(                    "You are not using Tor and you have this external IP address: {ip_address}".format(                        ip_address=ip_address                    )                )            }    return True
 |