| 
									
										
										
										
											2022-07-08 14:45:41 +02:00
										 |  |  | # SPDX-License-Identifier: AGPL-3.0-or-later | 
					
						
							|  |  |  | # lint: pylint | 
					
						
							| 
									
										
										
										
											2023-02-13 07:36:46 +01:00
										 |  |  | """A plugin to check if the ip address of the request is a Tor exit-node if the
 | 
					
						
							| 
									
										
										
										
											2022-07-08 14:45:41 +02:00
										 |  |  | 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( | 
					
						
							| 
									
										
										
										
											2023-02-13 07:36:46 +01:00
										 |  |  |     "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." | 
					
						
							| 
									
										
										
										
											2022-07-08 14:45:41 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | '''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( | 
					
						
							| 
									
										
										
										
											2023-02-17 12:48:25 +01:00
										 |  |  |                     "Could not download the list of Tor exit-nodes from: https://check.torproject.org/exit-addresses" | 
					
						
							| 
									
										
										
										
											2022-07-08 14:45:41 +02:00
										 |  |  |                 ) | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             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( | 
					
						
							| 
									
										
										
										
											2023-02-17 12:48:25 +01:00
										 |  |  |                     "You are using Tor and it looks like you have this external IP address: {ip_address}".format( | 
					
						
							| 
									
										
										
										
											2023-02-13 07:36:46 +01:00
										 |  |  |                         ip_address=ip_address | 
					
						
							|  |  |  |                     ) | 
					
						
							| 
									
										
										
										
											2022-07-08 14:45:41 +02:00
										 |  |  |                 ) | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             search.result_container.answers["tor"] = { | 
					
						
							|  |  |  |                 "answer": gettext( | 
					
						
							| 
									
										
										
										
											2023-02-17 12:48:25 +01:00
										 |  |  |                     "You are not using Tor and you have this external IP address: {ip_address}".format( | 
					
						
							| 
									
										
										
										
											2023-02-13 07:36:46 +01:00
										 |  |  |                         ip_address=ip_address | 
					
						
							|  |  |  |                     ) | 
					
						
							| 
									
										
										
										
											2022-07-08 14:45:41 +02:00
										 |  |  |                 ) | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return True |