summaryrefslogtreecommitdiff
path: root/searx/plugins/tor_check.py
blob: 7d50bbcb5d15d42e28b003c76660d486f99ffbb3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# 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 the
user searches for ``tor-check``.  It fetches the tor exit node list from
https://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 re
from flask_babel import gettext
from httpx import HTTPError
from searx.network import get

default_on = False

name = 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