summaryrefslogtreecommitdiff
path: root/searx
diff options
context:
space:
mode:
authorMarkus Heiser <markus.heiser@darmarIT.de>2022-07-19 07:39:46 +0200
committerGitHub <noreply@github.com>2022-07-19 07:39:46 +0200
commita983db022954b302f12640c7b3f5c3a6ce697101 (patch)
tree5269eefdc8740b33b2b45b2f5e74f56833483419 /searx
parent4d9772690751bde13f51712dcc1eac4c463dc506 (diff)
parent6d646129c3c5dd322acc166fe11a316884b523c6 (diff)
Merge pull request #1481 from Solirs/tor_check_plugin
feat: Add tor check plugin
Diffstat (limited to 'searx')
-rw-r--r--searx/plugins/tor_check.py88
-rw-r--r--searx/settings.yml1
2 files changed, 89 insertions, 0 deletions
diff --git a/searx/plugins/tor_check.py b/searx/plugins/tor_check.py
new file mode 100644
index 00000000..7d50bbcb
--- /dev/null
+++ b/searx/plugins/tor_check.py
@@ -0,0 +1,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
diff --git a/searx/settings.yml b/searx/settings.yml
index 2b12c833..21f0f20b 100644
--- a/searx/settings.yml
+++ b/searx/settings.yml
@@ -187,6 +187,7 @@ outgoing:
# - 'Hostname replace' # see hostname_replace configuration below
# - 'Open Access DOI rewrite'
# - 'Vim-like hotkeys'
+# - 'Tor check plugin'
# Configuration of the "Hostname replace" plugin:
#