89 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			89 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|  | # 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 |