| 
									
										
										
										
											2023-01-29 18:51:13 +01:00
										 |  |  | # -*- coding: utf-8 -*- | 
					
						
							|  |  |  | # SPDX-License-Identifier: AGPL-3.0-or-later | 
					
						
							|  |  |  | # lint: pylint | 
					
						
							|  |  |  | """Exception types raised by SearXNG modules.
 | 
					
						
							|  |  |  | """
 | 
					
						
							| 
									
										
										
										
											2017-01-20 18:52:47 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-24 09:46:32 +01:00
										 |  |  | from typing import Optional, Union | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-20 18:52:47 +01:00
										 |  |  | class SearxException(Exception): | 
					
						
							| 
									
										
										
										
											2023-01-29 18:51:13 +01:00
										 |  |  |     """Base SearXNG exception.""" | 
					
						
							| 
									
										
										
										
											2017-01-20 18:52:47 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class SearxParameterException(SearxException): | 
					
						
							| 
									
										
										
										
											2023-09-15 09:53:03 +02:00
										 |  |  |     """Raised when query miss a required parameter""" | 
					
						
							| 
									
										
										
										
											2023-01-29 18:51:13 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-20 18:52:47 +01:00
										 |  |  |     def __init__(self, name, value): | 
					
						
							|  |  |  |         if value == '' or value is None: | 
					
						
							|  |  |  |             message = 'Empty ' + name + ' parameter' | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             message = 'Invalid value "' + value + '" for parameter ' + name | 
					
						
							| 
									
										
										
										
											2020-08-12 09:42:27 +02:00
										 |  |  |         super().__init__(message) | 
					
						
							| 
									
										
										
										
											2019-10-14 15:00:54 +02:00
										 |  |  |         self.message = message | 
					
						
							| 
									
										
										
										
											2017-01-20 18:52:47 +01:00
										 |  |  |         self.parameter_name = name | 
					
						
							|  |  |  |         self.parameter_value = value | 
					
						
							| 
									
										
										
										
											2020-11-03 15:29:59 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class SearxSettingsException(SearxException): | 
					
						
							| 
									
										
										
										
											2020-11-26 15:12:11 +01:00
										 |  |  |     """Error while loading the settings""" | 
					
						
							| 
									
										
										
										
											2020-11-03 15:29:59 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-24 09:46:32 +01:00
										 |  |  |     def __init__(self, message: Union[str, Exception], filename: Optional[str]): | 
					
						
							| 
									
										
										
										
											2020-11-03 15:29:59 +01:00
										 |  |  |         super().__init__(message) | 
					
						
							|  |  |  |         self.message = message | 
					
						
							|  |  |  |         self.filename = filename | 
					
						
							| 
									
										
										
										
											2020-11-26 15:12:11 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class SearxEngineException(SearxException): | 
					
						
							|  |  |  |     """Error inside an engine""" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class SearxXPathSyntaxException(SearxEngineException): | 
					
						
							|  |  |  |     """Syntax error in a XPATH""" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, xpath_spec, message): | 
					
						
							|  |  |  |         super().__init__(str(xpath_spec) + " " + message) | 
					
						
							|  |  |  |         self.message = message | 
					
						
							|  |  |  |         # str(xpath_spec) to deal with str and XPath instance | 
					
						
							|  |  |  |         self.xpath_str = str(xpath_spec) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class SearxEngineResponseException(SearxEngineException): | 
					
						
							|  |  |  |     """Impossible to parse the result of an engine""" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class SearxEngineAPIException(SearxEngineResponseException): | 
					
						
							|  |  |  |     """The website has returned an application error""" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-09 21:23:20 +01:00
										 |  |  | class SearxEngineAccessDeniedException(SearxEngineResponseException): | 
					
						
							|  |  |  |     """The website is blocking the access""" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-21 23:55:04 +01:00
										 |  |  |     SUSPEND_TIME_SETTING = "search.suspended_times.SearxEngineAccessDenied" | 
					
						
							| 
									
										
										
										
											2023-01-29 18:51:13 +01:00
										 |  |  |     """This settings contains the default suspended time (default 86400 sec / 1
 | 
					
						
							|  |  |  |     day)."""
 | 
					
						
							| 
									
										
										
										
											2022-11-21 23:55:04 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-28 11:24:14 +01:00
										 |  |  |     def __init__(self, suspended_time: int = None, message: str = 'Access denied'): | 
					
						
							| 
									
										
										
										
											2023-01-29 18:51:13 +01:00
										 |  |  |         """Generic exception to raise when an engine denies access to the results.
 | 
					
						
							| 
									
										
										
										
											2023-01-28 11:24:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-29 18:51:13 +01:00
										 |  |  |         :param suspended_time: How long the engine is going to be suspended in | 
					
						
							|  |  |  |             second. Defaults to None. | 
					
						
							|  |  |  |         :type suspended_time: int, None | 
					
						
							|  |  |  |         :param message: Internal message.  Defaults to ``Access denied`` | 
					
						
							|  |  |  |         :type message: str | 
					
						
							| 
									
										
										
										
											2023-01-28 11:24:14 +01:00
										 |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2022-11-21 23:55:04 +01:00
										 |  |  |         suspended_time = suspended_time or self._get_default_suspended_time() | 
					
						
							| 
									
										
										
										
											2020-12-09 21:23:20 +01:00
										 |  |  |         super().__init__(message + ', suspended_time=' + str(suspended_time)) | 
					
						
							|  |  |  |         self.suspended_time = suspended_time | 
					
						
							|  |  |  |         self.message = message | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-21 23:55:04 +01:00
										 |  |  |     def _get_default_suspended_time(self): | 
					
						
							| 
									
										
										
										
											2023-01-29 18:51:13 +01:00
										 |  |  |         from searx import get_setting  # pylint: disable=C0415 | 
					
						
							| 
									
										
										
										
											2022-11-21 23:55:04 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return get_setting(self.SUSPEND_TIME_SETTING) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-09 21:23:20 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | class SearxEngineCaptchaException(SearxEngineAccessDeniedException): | 
					
						
							| 
									
										
										
										
											2023-01-29 18:51:13 +01:00
										 |  |  |     """The website has returned a CAPTCHA.""" | 
					
						
							| 
									
										
										
										
											2020-12-09 21:23:20 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-21 23:55:04 +01:00
										 |  |  |     SUSPEND_TIME_SETTING = "search.suspended_times.SearxEngineCaptcha" | 
					
						
							| 
									
										
										
										
											2023-01-29 18:51:13 +01:00
										 |  |  |     """This settings contains the default suspended time (default 86400 sec / 1
 | 
					
						
							|  |  |  |     day)."""
 | 
					
						
							| 
									
										
										
										
											2022-11-21 23:55:04 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, suspended_time=None, message='CAPTCHA'): | 
					
						
							| 
									
										
										
										
											2020-12-09 21:23:20 +01:00
										 |  |  |         super().__init__(message=message, suspended_time=suspended_time) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class SearxEngineTooManyRequestsException(SearxEngineAccessDeniedException): | 
					
						
							|  |  |  |     """The website has returned a Too Many Request status code
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     By default, searx stops sending requests to this engine for 1 hour. | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-21 23:55:04 +01:00
										 |  |  |     SUSPEND_TIME_SETTING = "search.suspended_times.SearxEngineTooManyRequests" | 
					
						
							| 
									
										
										
										
											2023-01-29 18:51:13 +01:00
										 |  |  |     """This settings contains the default suspended time (default 3660 sec / 1
 | 
					
						
							|  |  |  |     hour)."""
 | 
					
						
							| 
									
										
										
										
											2022-11-21 23:55:04 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, suspended_time=None, message='Too many request'): | 
					
						
							| 
									
										
										
										
											2020-12-09 21:23:20 +01:00
										 |  |  |         super().__init__(message=message, suspended_time=suspended_time) | 
					
						
							| 
									
										
										
										
											2020-11-26 15:12:11 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class SearxEngineXPathException(SearxEngineResponseException): | 
					
						
							|  |  |  |     """Error while getting the result of an XPath expression""" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, xpath_spec, message): | 
					
						
							|  |  |  |         super().__init__(str(xpath_spec) + " " + message) | 
					
						
							|  |  |  |         self.message = message | 
					
						
							|  |  |  |         # str(xpath_spec) to deal with str and XPath instance | 
					
						
							|  |  |  |         self.xpath_str = str(xpath_spec) |