Merge pull request #1481 from Solirs/tor_check_plugin
feat: Add tor check plugin
This commit is contained in:
		
						commit
						a983db0229
					
				
							
								
								
									
										9
									
								
								docs/src/searx.plugins.tor_check.rst
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								docs/src/searx.plugins.tor_check.rst
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | ||||
| .. _tor check plugin: | ||||
| 
 | ||||
| ================ | ||||
| Tor check plugin | ||||
| ================ | ||||
| 
 | ||||
| .. automodule:: searx.plugins.tor_check | ||||
|   :members: | ||||
| 
 | ||||
							
								
								
									
										88
									
								
								searx/plugins/tor_check.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								searx/plugins/tor_check.py
									
									
									
									
									
										Normal file
									
								
							| @ -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 | ||||
| @ -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: | ||||
| # | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user