From b05a15540e1dc2dfb8e4e25aa537b2a68e713844 Mon Sep 17 00:00:00 2001 From: sev Date: Sun, 29 Oct 2023 23:01:09 -0500 Subject: [PATCH 01/91] Check `public_instance` in simple theme Fix #2975 --- searx/templates/simple/base.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/searx/templates/simple/base.html b/searx/templates/simple/base.html index 3c6ed11c7..b7b1b35d3 100644 --- a/searx/templates/simple/base.html +++ b/searx/templates/simple/base.html @@ -17,7 +17,7 @@ {% else %} {% endif %} - {% if get_setting('server.limiter') %} + {% if get_setting('server.limiter') or get_setting('server.public_instance') %} {% endif %} {% block styles %}{% endblock %} From fd814aac863673047c46a9d80682415dae180969 Mon Sep 17 00:00:00 2001 From: Markus Heiser Date: Mon, 2 Oct 2023 16:36:07 +0200 Subject: [PATCH 02/91] [mod] isolation of botdetection from the limiter This patch was inspired by the discussion around PR-2882 [2]. The goals of this patch are: 1. Convert plugin searx.plugin.limiter to normal code [1] 2. isolation of botdetection from the limiter [2] 3. searx/{tools => botdetection}/config.py and drop searx.tools 4. in URL /config, 'limiter.enabled' is true only if the limiter is really enabled (Redis is available). This patch moves all the code that belongs to botdetection into namespace searx.botdetection and code that belongs to limiter is placed in namespace searx.limiter. Tthe limiter used to be a plugin at some point botdetection was added, it was not a plugin. The modularization of these two components was long overdue. With the clear modularization, the documentation could then also be organized according to the architecture. [1] https://github.com/searxng/searxng/pull/2882 [2] https://github.com/searxng/searxng/pull/2882#issuecomment-1741716891 To test: - check the app works without the limiter, check `/config` - check the app works with the limiter and with the token, check `/config` - make docs.live .. and read - http://0.0.0.0:8000/admin/searx.limiter.html - http://0.0.0.0:8000/src/searx.botdetection.html#botdetection Signed-off-by: Markus Heiser --- docs/admin/index.rst | 2 +- docs/admin/searx.limiter.rst | 17 +++ docs/admin/settings/settings_server.rst | 4 +- docs/conf.py | 5 +- docs/{admin => src}/searx.botdetection.rst | 14 ++- searx/botdetection/__init__.py | 47 +++----- searx/botdetection/_helpers.py | 6 +- searx/{tools => botdetection}/config.py | 0 searx/botdetection/http_accept.py | 2 +- searx/botdetection/http_accept_encoding.py | 2 +- searx/botdetection/http_accept_language.py | 2 +- searx/botdetection/http_connection.py | 2 +- searx/botdetection/http_user_agent.py | 2 +- searx/botdetection/ip_limit.py | 5 +- searx/botdetection/ip_lists.py | 2 +- searx/botdetection/link_token.py | 4 +- searx/{botdetection => }/limiter.py | 126 +++++++++++++++++---- searx/{botdetection => }/limiter.toml | 0 searx/plugins/limiter.py | 38 ------- searx/tools/__init__.py | 8 -- searx/webapp.py | 8 +- tests/unit/test_plugins.py | 9 +- 22 files changed, 180 insertions(+), 125 deletions(-) create mode 100644 docs/admin/searx.limiter.rst rename docs/{admin => src}/searx.botdetection.rst (86%) rename searx/{tools => botdetection}/config.py (100%) rename searx/{botdetection => }/limiter.py (52%) rename searx/{botdetection => }/limiter.toml (100%) delete mode 100644 searx/plugins/limiter.py delete mode 100644 searx/tools/__init__.py diff --git a/docs/admin/index.rst b/docs/admin/index.rst index f335f1631..606b51c22 100644 --- a/docs/admin/index.rst +++ b/docs/admin/index.rst @@ -15,7 +15,7 @@ Administrator documentation installation-apache update-searxng answer-captcha - searx.botdetection + searx.limiter api architecture plugins diff --git a/docs/admin/searx.limiter.rst b/docs/admin/searx.limiter.rst new file mode 100644 index 000000000..c23635571 --- /dev/null +++ b/docs/admin/searx.limiter.rst @@ -0,0 +1,17 @@ +.. _limiter: + +======= +Limiter +======= + +.. sidebar:: info + + The limiter requires a :ref:`Redis ` database. + +.. contents:: + :depth: 2 + :local: + :backlinks: entry + +.. automodule:: searx.limiter + :members: diff --git a/docs/admin/settings/settings_server.rst b/docs/admin/settings/settings_server.rst index e2b4cb67d..ba0c9484d 100644 --- a/docs/admin/settings/settings_server.rst +++ b/docs/admin/settings/settings_server.rst @@ -36,11 +36,9 @@ ``secret_key`` : ``$SEARXNG_SECRET`` Used for cryptography purpose. -.. _limiter: - ``limiter`` : Rate limit the number of request on the instance, block some bots. The - :ref:`limiter src` requires a :ref:`settings redis` database. + :ref:`limiter` requires a :ref:`settings redis` database. .. _image_proxy: diff --git a/docs/conf.py b/docs/conf.py index aa4905ef4..2ed85a800 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -2,6 +2,7 @@ # SPDX-License-Identifier: AGPL-3.0-or-later import sys, os +from pathlib import Path from pallets_sphinx_themes import ProjectLink from searx import get_setting @@ -13,7 +14,6 @@ project = 'SearXNG' copyright = 'SearXNG team' author = 'SearXNG team' release, version = VERSION_STRING, VERSION_STRING - SEARXNG_URL = get_setting('server.base_url') or 'https://example.org/searxng' ISSUE_URL = get_setting('brand.issue_url') DOCS_URL = get_setting('brand.docs_url') @@ -22,6 +22,9 @@ PRIVACYPOLICY_URL = get_setting('general.privacypolicy_url') CONTACT_URL = get_setting('general.contact_url') WIKI_URL = get_setting('brand.wiki_url') +SOURCEDIR = Path(__file__).parent.parent / "searx" +os.environ['SOURCEDIR'] = str(SOURCEDIR) + # hint: sphinx.ext.viewcode won't highlight when 'highlight_language' [1] is set # to string 'none' [2] # diff --git a/docs/admin/searx.botdetection.rst b/docs/src/searx.botdetection.rst similarity index 86% rename from docs/admin/searx.botdetection.rst rename to docs/src/searx.botdetection.rst index c89f1cd93..04cb81dfd 100644 --- a/docs/admin/searx.botdetection.rst +++ b/docs/src/searx.botdetection.rst @@ -12,8 +12,10 @@ Bot Detection .. automodule:: searx.botdetection :members: -.. automodule:: searx.botdetection.limiter - :members: +.. _botdetection ip_lists: + +IP lists +======== .. automodule:: searx.botdetection.ip_lists :members: @@ -50,3 +52,11 @@ Probe HTTP headers .. automodule:: searx.botdetection.http_user_agent :members: + +.. _botdetection config: + +Config +====== + +.. automodule:: searx.botdetection.config + :members: diff --git a/searx/botdetection/__init__.py b/searx/botdetection/__init__.py index 74f6c4263..d5716bcc8 100644 --- a/searx/botdetection/__init__.py +++ b/searx/botdetection/__init__.py @@ -2,43 +2,22 @@ # lint: pylint """.. _botdetection src: -The :ref:`limiter ` implements several methods to block bots: - -a. Analysis of the HTTP header in the request / can be easily bypassed. - -b. Block and pass lists in which IPs are listed / difficult to maintain, since - the IPs of bots are not all known and change over the time. - -c. Detection of bots based on the behavior of the requests and blocking and, if - necessary, unblocking of the IPs via a dynamically changeable IP block list. - -For dynamically changeable IP lists a Redis database is needed and for any kind -of IP list the determination of the IP of the client is essential. The IP of -the client is determined via the X-Forwarded-For_ HTTP header - -.. _X-Forwarded-For: - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For - -X-Forwarded-For -=============== - -.. attention:: - - A correct setup of the HTTP request headers ``X-Forwarded-For`` and - ``X-Real-IP`` is essential to be able to assign a request to an IP correctly: - - - `NGINX RequestHeader`_ - - `Apache RequestHeader`_ - -.. _NGINX RequestHeader: - https://docs.searxng.org/admin/installation-nginx.html#nginx-s-searxng-site -.. _Apache RequestHeader: - https://docs.searxng.org/admin/installation-apache.html#apache-s-searxng-site - -.. autofunction:: searx.botdetection.get_real_ip +Implementations used for bot detection. """ from ._helpers import dump_request from ._helpers import get_real_ip +from ._helpers import get_network from ._helpers import too_many_requests + +__all__ = ['dump_request', 'get_network', 'get_real_ip', 'too_many_requests'] + +redis_client = None +cfg = None + + +def init(_cfg, _redis_client): + global redis_client, cfg # pylint: disable=global-statement + redis_client = _redis_client + cfg = _cfg diff --git a/searx/botdetection/_helpers.py b/searx/botdetection/_helpers.py index f50250e8b..365067c24 100644 --- a/searx/botdetection/_helpers.py +++ b/searx/botdetection/_helpers.py @@ -13,8 +13,8 @@ from ipaddress import ( import flask import werkzeug -from searx.tools import config from searx import logger +from . import config logger = logger.getChild('botdetection') @@ -104,10 +104,10 @@ def get_real_ip(request: flask.Request) -> str: if not forwarded_for: _log_error_only_once("X-Forwarded-For header is not set!") else: - from .limiter import get_cfg # pylint: disable=import-outside-toplevel, cyclic-import + from . import cfg # pylint: disable=import-outside-toplevel, cyclic-import forwarded_for = [x.strip() for x in forwarded_for.split(',')] - x_for: int = get_cfg()['real_ip.x_for'] # type: ignore + x_for: int = cfg['real_ip.x_for'] # type: ignore forwarded_for = forwarded_for[-min(len(forwarded_for), x_for)] if not real_ip: diff --git a/searx/tools/config.py b/searx/botdetection/config.py similarity index 100% rename from searx/tools/config.py rename to searx/botdetection/config.py diff --git a/searx/botdetection/http_accept.py b/searx/botdetection/http_accept.py index b78a86278..b1f524593 100644 --- a/searx/botdetection/http_accept.py +++ b/searx/botdetection/http_accept.py @@ -24,7 +24,7 @@ from ipaddress import ( import flask import werkzeug -from searx.tools import config +from . import config from ._helpers import too_many_requests diff --git a/searx/botdetection/http_accept_encoding.py b/searx/botdetection/http_accept_encoding.py index 60718a4ca..e0c03cc73 100644 --- a/searx/botdetection/http_accept_encoding.py +++ b/searx/botdetection/http_accept_encoding.py @@ -25,7 +25,7 @@ from ipaddress import ( import flask import werkzeug -from searx.tools import config +from . import config from ._helpers import too_many_requests diff --git a/searx/botdetection/http_accept_language.py b/searx/botdetection/http_accept_language.py index 395d28bfd..aaef81cc4 100644 --- a/searx/botdetection/http_accept_language.py +++ b/searx/botdetection/http_accept_language.py @@ -21,7 +21,7 @@ from ipaddress import ( import flask import werkzeug -from searx.tools import config +from . import config from ._helpers import too_many_requests diff --git a/searx/botdetection/http_connection.py b/searx/botdetection/http_connection.py index ee0d80a23..a32877158 100644 --- a/searx/botdetection/http_connection.py +++ b/searx/botdetection/http_connection.py @@ -22,7 +22,7 @@ from ipaddress import ( import flask import werkzeug -from searx.tools import config +from . import config from ._helpers import too_many_requests diff --git a/searx/botdetection/http_user_agent.py b/searx/botdetection/http_user_agent.py index 17025f68b..e2e02a9bb 100644 --- a/searx/botdetection/http_user_agent.py +++ b/searx/botdetection/http_user_agent.py @@ -24,7 +24,7 @@ from ipaddress import ( import flask import werkzeug -from searx.tools import config +from . import config from ._helpers import too_many_requests diff --git a/searx/botdetection/ip_limit.py b/searx/botdetection/ip_limit.py index 5ff3c87ca..071978a33 100644 --- a/searx/botdetection/ip_limit.py +++ b/searx/botdetection/ip_limit.py @@ -13,8 +13,7 @@ and at least for a maximum of 10 minutes. The :py:obj:`.link_token` method can be used to investigate whether a request is *suspicious*. To activate the :py:obj:`.link_token` method in the -:py:obj:`.ip_limit` method add the following to your -``/etc/searxng/limiter.toml``: +:py:obj:`.ip_limit` method add the following configuration: .. code:: toml @@ -46,13 +45,13 @@ from ipaddress import ( import flask import werkzeug -from searx.tools import config from searx import settings from searx import redisdb from searx.redislib import incr_sliding_window, drop_counter from . import link_token +from . import config from ._helpers import ( too_many_requests, logger, diff --git a/searx/botdetection/ip_lists.py b/searx/botdetection/ip_lists.py index 456ef4365..5c904f4ae 100644 --- a/searx/botdetection/ip_lists.py +++ b/searx/botdetection/ip_lists.py @@ -33,7 +33,7 @@ from ipaddress import ( IPv6Address, ) -from searx.tools import config +from . import config from ._helpers import logger logger = logger.getChild('ip_limit') diff --git a/searx/botdetection/link_token.py b/searx/botdetection/link_token.py index 7ea15f5c2..dcfee33d9 100644 --- a/searx/botdetection/link_token.py +++ b/searx/botdetection/link_token.py @@ -99,15 +99,13 @@ def ping(request: flask.Request, token: str): The expire time of this ping-key is :py:obj:`PING_LIVE_TIME`. """ - from . import limiter # pylint: disable=import-outside-toplevel, cyclic-import + from . import redis_client, cfg # pylint: disable=import-outside-toplevel, cyclic-import - redis_client = redisdb.client() if not redis_client: return if not token_is_valid(token): return - cfg = limiter.get_cfg() real_ip = ip_address(get_real_ip(request)) network = get_network(real_ip, cfg) diff --git a/searx/botdetection/limiter.py b/searx/limiter.py similarity index 52% rename from searx/botdetection/limiter.py rename to searx/limiter.py index 9b3532f0d..b61292d70 100644 --- a/searx/botdetection/limiter.py +++ b/searx/limiter.py @@ -1,15 +1,6 @@ # SPDX-License-Identifier: AGPL-3.0-or-later # lint: pylint -""".. _limiter src: - -Limiter -======= - -.. sidebar:: info - - The limiter requires a :ref:`Redis ` database. - -Bot protection / IP rate limitation. The intention of rate limitation is to +"""Bot protection / IP rate limitation. The intention of rate limitation is to limit suspicious requests from an IP. The motivation behind this is the fact that SearXNG passes through requests from bots and is thus classified as a bot itself. As a result, the SearXNG engine then receives a CAPTCHA or is blocked @@ -17,7 +8,40 @@ by the search engine (the origin) in some other way. To avoid blocking, the requests from bots to SearXNG must also be blocked, this is the task of the limiter. To perform this task, the limiter uses the methods -from the :py:obj:`searx.botdetection`. +from the :ref:`botdetection`: + +- Analysis of the HTTP header in the request / :ref:`botdetection probe headers` + can be easily bypassed. + +- Block and pass lists in which IPs are listed / :ref:`botdetection ip_lists` + are hard to maintain, since the IPs of bots are not all known and change over + the time. + +- Detection & dynamically :ref:`botdetection rate limit` of bots based on the + behavior of the requests. For dynamically changeable IP lists a Redis + database is needed. + +The prerequisite for IP based methods is the correct determination of the IP of +the client. The IP of the client is determined via the X-Forwarded-For_ HTTP +header. + +.. attention:: + + A correct setup of the HTTP request headers ``X-Forwarded-For`` and + ``X-Real-IP`` is essential to be able to assign a request to an IP correctly: + + - `NGINX RequestHeader`_ + - `Apache RequestHeader`_ + +.. _X-Forwarded-For: + https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For +.. _NGINX RequestHeader: + https://docs.searxng.org/admin/installation-nginx.html#nginx-s-searxng-site +.. _Apache RequestHeader: + https://docs.searxng.org/admin/installation-apache.html#apache-s-searxng-site + +Enable Limiter +============== To enable the limiter activate: @@ -35,36 +59,72 @@ and set the redis-url connection. Check the value, it depends on your redis DB redis: url: unix:///usr/local/searxng-redis/run/redis.sock?db=0 + +Configure Limiter +================= + +The methods of :ref:`botdetection` the limiter uses are configured in a local +file ``/etc/searxng/limiter.toml``. The defaults are shown in limiter.toml_ / +Don't copy all values to your local configuration, just enable what you need by +overwriting the defaults. For instance to activate the ``link_token`` method in +the :ref:`botdetection.ip_limit` you only need to set this option to ``true``: + +.. code:: toml + + [botdetection.ip_limit] + link_token = true + +.. _limiter.toml: + +``limiter.toml`` +================ + +In this file the limiter finds the configuration of the :ref:`botdetection`: + +- :ref:`botdetection ip_lists` +- :ref:`botdetection rate limit` +- :ref:`botdetection probe headers` + +.. kernel-include:: $SOURCEDIR/limiter.toml + :code: toml + +Implementation +============== + """ from __future__ import annotations +import sys from pathlib import Path from ipaddress import ip_address import flask import werkzeug -from searx.tools import config -from searx import logger - -from . import ( +from searx import ( + logger, + redisdb, +) +from searx import botdetection +from searx.botdetection import ( + config, http_accept, http_accept_encoding, http_accept_language, http_user_agent, ip_limit, ip_lists, -) - -from ._helpers import ( get_network, get_real_ip, dump_request, ) -logger = logger.getChild('botdetection.limiter') +# the configuration are limiter.toml and "limiter" in settings.yml so, for +# coherency, the logger is "limiter" +logger = logger.getChild('limiter') CFG: config.Config = None # type: ignore +_INSTALLED = False LIMITER_CFG_SCHEMA = Path(__file__).parent / "limiter.toml" """Base configuration (schema) of the botdetection.""" @@ -143,3 +203,31 @@ def filter_request(request: flask.Request) -> werkzeug.Response | None: return val logger.debug(f"OK {network}: %s", dump_request(flask.request)) return None + + +def pre_request(): + """See :py:obj:`flask.Flask.before_request`""" + return filter_request(flask.request) + + +def is_installed(): + return _INSTALLED + + +def initialize(app: flask.Flask, settings): + """Instal the botlimiter aka limiter""" + global _INSTALLED # pylint: disable=global-statement + if not settings['server']['limiter'] and not settings['server']['public_instance']: + return + redis_client = redisdb.client() + if not redis_client: + logger.error( + "The limiter requires Redis, please consult the documentation: " + + "https://docs.searxng.org/admin/searx.botdetection.html#limiter" + ) + if settings['server']['public_instance']: + sys.exit(1) + return + botdetection.init(get_cfg(), redis_client) + app.before_request(pre_request) + _INSTALLED = True diff --git a/searx/botdetection/limiter.toml b/searx/limiter.toml similarity index 100% rename from searx/botdetection/limiter.toml rename to searx/limiter.toml diff --git a/searx/plugins/limiter.py b/searx/plugins/limiter.py deleted file mode 100644 index 24b14f3b4..000000000 --- a/searx/plugins/limiter.py +++ /dev/null @@ -1,38 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later -# lint: pylint -# pyright: basic -"""see :ref:`limiter src`""" - -import sys -import flask - -from searx import redisdb -from searx.plugins import logger -from searx.botdetection import limiter - -name = "Request limiter" -description = "Limit the number of request" -default_on = False -preference_section = 'service' - -logger = logger.getChild('limiter') - - -def pre_request(): - """See :ref:`flask.Flask.before_request`""" - return limiter.filter_request(flask.request) - - -def init(app: flask.Flask, settings) -> bool: - if not settings['server']['limiter'] and not settings['server']['public_instance']: - return False - if not redisdb.client(): - logger.error( - "The limiter requires Redis, please consult the documentation: " - + "https://docs.searxng.org/admin/searx.botdetection.html#limiter" - ) - if settings['server']['public_instance']: - sys.exit(1) - return False - app.before_request(pre_request) - return True diff --git a/searx/tools/__init__.py b/searx/tools/__init__.py deleted file mode 100644 index 08e6d982f..000000000 --- a/searx/tools/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later -# lint: pylint -""".. _tools src: - -A collection of *utilities* used by SearXNG, but without SearXNG specific -peculiarities. - -""" diff --git a/searx/webapp.py b/searx/webapp.py index 13a31d3e5..53ca96785 100755 --- a/searx/webapp.py +++ b/searx/webapp.py @@ -57,7 +57,9 @@ from searx import ( ) from searx import infopage -from searx.botdetection import limiter +from searx import limiter +from searx.botdetection import link_token + from searx.data import ENGINE_DESCRIPTIONS from searx.results import Timing from searx.settings_defaults import OUTPUT_FORMATS @@ -94,7 +96,6 @@ from searx.utils import ( from searx.version import VERSION_STRING, GIT_URL, GIT_BRANCH from searx.query import RawTextQuery from searx.plugins import Plugin, plugins, initialize as plugin_initialize -from searx.botdetection import link_token from searx.plugins.oa_doi_rewrite import get_doi_resolver from searx.preferences import ( Preferences, @@ -1288,7 +1289,7 @@ def config(): 'DOCS_URL': get_setting('brand.docs_url'), }, 'limiter': { - 'enabled': settings['server']['limiter'], + 'enabled': limiter.is_installed(), 'botdetection.ip_limit.link_token': _limiter_cfg.get('botdetection.ip_limit.link_token'), 'botdetection.ip_lists.pass_searxng_org': _limiter_cfg.get('botdetection.ip_lists.pass_searxng_org'), }, @@ -1322,6 +1323,7 @@ if not werkzeug_reloader or (werkzeug_reloader and os.environ.get("WERKZEUG_RUN_ redis_initialize() plugin_initialize(app) search_initialize(enable_checker=True, check_network=True, enable_metrics=settings['general']['enable_metrics']) + limiter.initialize(app, settings) def run(): diff --git a/tests/unit/test_plugins.py b/tests/unit/test_plugins.py index 0d555fdc0..90436266e 100644 --- a/tests/unit/test_plugins.py +++ b/tests/unit/test_plugins.py @@ -1,6 +1,11 @@ # -*- coding: utf-8 -*- -from searx import plugins +from searx import ( + plugins, + limiter, + botdetection, +) + from mock import Mock from tests import SearxTestCase @@ -46,6 +51,8 @@ class SelfIPTest(SearxTestCase): plugin = plugins.load_and_initialize_plugin('searx.plugins.self_info', False, (None, {})) store = plugins.PluginStore() store.register(plugin) + cfg = limiter.get_cfg() + botdetection.init(cfg, None) self.assertTrue(len(store.plugins) == 1) From d13a8f64534b2ba7883cabdae1d08ea68b7899c8 Mon Sep 17 00:00:00 2001 From: Markus Heiser Date: Mon, 2 Oct 2023 18:29:58 +0200 Subject: [PATCH 03/91] [mod] document server:public_instance & remove it out of the botdetection - the option server:public_instance lacks some documentation - the processing of this option belongs in the limiter and not in botdetection module Signed-off-by: Markus Heiser --- docs/admin/settings/settings_server.rst | 12 +++++++++++- searx/__init__.py | 3 ++- searx/botdetection/ip_limit.py | 3 +-- searx/limiter.py | 20 +++++++++++++++----- 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/docs/admin/settings/settings_server.rst b/docs/admin/settings/settings_server.rst index ba0c9484d..e4e66ee2f 100644 --- a/docs/admin/settings/settings_server.rst +++ b/docs/admin/settings/settings_server.rst @@ -12,6 +12,7 @@ bind_address: "127.0.0.1" secret_key: "ultrasecretkey" # change this! limiter: false + public_instance: false image_proxy: false default_http_headers: X-Content-Type-Options : nosniff @@ -20,7 +21,6 @@ X-Robots-Tag : noindex, nofollow Referrer-Policy : no-referrer - ``base_url`` : ``$SEARXNG_URL`` :ref:`buildenv ` The base URL where SearXNG is deployed. Used to create correct inbound links. If you change the value, don't forget to rebuild instance's environment @@ -40,6 +40,16 @@ Rate limit the number of request on the instance, block some bots. The :ref:`limiter` requires a :ref:`settings redis` database. +.. _public_instance: + +``public_instance`` : + + Setting that allows to enable features specifically for public instances (not + needed for local usage). By set to ``true`` the following features are + activated: + + - :py:obj:`searx.botdetection.link_token` in the :ref:`limiter` + .. _image_proxy: ``image_proxy`` : diff --git a/searx/__init__.py b/searx/__init__.py index f86052660..d611ef6a2 100644 --- a/searx/__init__.py +++ b/searx/__init__.py @@ -108,5 +108,6 @@ else: if settings['server']['public_instance']: logger.warning( "Be aware you have activated features intended only for public instances. " - + "This force the usage of the bot limiter and link_token plugins." + "This force the usage of the limiter and link_token / " + "see https://docs.searxng.org/admin/searx.limiter.html" ) diff --git a/searx/botdetection/ip_limit.py b/searx/botdetection/ip_limit.py index 071978a33..387e580ee 100644 --- a/searx/botdetection/ip_limit.py +++ b/searx/botdetection/ip_limit.py @@ -45,7 +45,6 @@ from ipaddress import ( import flask import werkzeug -from searx import settings from searx import redisdb from searx.redislib import incr_sliding_window, drop_counter @@ -109,7 +108,7 @@ def filter_request( if c > API_MAX: return too_many_requests(network, "too many request in API_WINDOW") - if settings['server']['public_instance'] or cfg['botdetection.ip_limit.link_token']: + if cfg['botdetection.ip_limit.link_token']: suspicious = link_token.is_suspicious(network, request, True) diff --git a/searx/limiter.py b/searx/limiter.py index b61292d70..fa7418922 100644 --- a/searx/limiter.py +++ b/searx/limiter.py @@ -211,23 +211,33 @@ def pre_request(): def is_installed(): + """Returns ``True`` if limiter is active and a redis DB is available.""" return _INSTALLED def initialize(app: flask.Flask, settings): - """Instal the botlimiter aka limiter""" + """Install the limiter""" global _INSTALLED # pylint: disable=global-statement - if not settings['server']['limiter'] and not settings['server']['public_instance']: + + if not (settings['server']['limiter'] or settings['server']['public_instance']): return + redis_client = redisdb.client() if not redis_client: logger.error( "The limiter requires Redis, please consult the documentation: " - + "https://docs.searxng.org/admin/searx.botdetection.html#limiter" + "https://docs.searxng.org/admin/searx.limiter.html" ) if settings['server']['public_instance']: sys.exit(1) return - botdetection.init(get_cfg(), redis_client) - app.before_request(pre_request) + _INSTALLED = True + + cfg = get_cfg() + if settings['server']['public_instance']: + # overwrite limiter.toml setting + cfg.set('botdetection.ip_limit.link_token', True) + + botdetection.init(cfg, redis_client) + app.before_request(pre_request) From b5a8ddfec8622fcd7ca008bf4024223038382af5 Mon Sep 17 00:00:00 2001 From: Markus Heiser Date: Wed, 1 Nov 2023 17:55:20 +0100 Subject: [PATCH 04/91] Revert "[fix] limit maximum page number of a search query to page 50." (#2979) This reverts commit 7e2e335dd1e06ea20496028abe58b3ad8b255662. --- searx/webadapter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/searx/webadapter.py b/searx/webadapter.py index 967ed4429..9fbb8ea3e 100644 --- a/searx/webadapter.py +++ b/searx/webadapter.py @@ -45,7 +45,7 @@ def validate_engineref_list( def parse_pageno(form: Dict[str, str]) -> int: pageno_param = form.get('pageno', '1') - if not pageno_param.isdigit() or int(pageno_param) < 1 or int(pageno_param) > 50: + if not pageno_param.isdigit() or int(pageno_param) < 1: raise SearxParameterException('pageno', pageno_param) return int(pageno_param) From baef837eb6f3a6d0a1e4bbe53c7083f3fbc39bef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Nov 2023 07:57:18 +0000 Subject: [PATCH 05/91] Bump linuxdoc from 20230827 to 20231020 Bumps [linuxdoc](https://github.com/return42/linuxdoc) from 20230827 to 20231020. - [Changelog](https://github.com/return42/linuxdoc/blob/master/CHANGELOG) - [Commits](https://github.com/return42/linuxdoc/commits) --- updated-dependencies: - dependency-name: linuxdoc dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index ec5818e7f..7d39f97ca 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -16,7 +16,7 @@ sphinxcontrib-programoutput==0.17 sphinx-autobuild==2021.3.14 sphinx-notfound-page==1.0.0 myst-parser==2.0.0 -linuxdoc==20230827 +linuxdoc==20231020 aiounittest==1.4.2 yamllint==1.32.0 wlc==1.13 From dd0ccd7904d452e83e19f74929bf327f3c3cb985 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Nov 2023 07:57:22 +0000 Subject: [PATCH 06/91] Bump selenium from 4.14.0 to 4.15.1 Bumps [selenium](https://github.com/SeleniumHQ/Selenium) from 4.14.0 to 4.15.1. - [Release notes](https://github.com/SeleniumHQ/Selenium/releases) - [Commits](https://github.com/SeleniumHQ/Selenium/commits) --- updated-dependencies: - dependency-name: selenium dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 7d39f97ca..6a2d00ac8 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -4,7 +4,7 @@ cov-core==1.15.0 black==22.12.0 pylint==3.0.2 splinter==0.19.0 -selenium==4.14.0 +selenium==4.15.1 twine==4.0.2 Pallets-Sphinx-Themes==2.1.1 Sphinx<=7.1.2; python_version == '3.8' From 96ccec1aa6507ef4d3dc05a08e01187f80080972 Mon Sep 17 00:00:00 2001 From: searxng-bot Date: Fri, 3 Nov 2023 07:07:48 +0000 Subject: [PATCH 07/91] [translations] update from Weblate acdcdace8 - 2023-11-01 - Ivan Gabaldon 31a1602a9 - 2023-10-29 - return42 a1d1070d3 - 2023-10-29 - return42 --- searx/translations/af/LC_MESSAGES/messages.mo | Bin 10753 -> 10753 bytes searx/translations/ar/LC_MESSAGES/messages.mo | Bin 21153 -> 21153 bytes searx/translations/bg/LC_MESSAGES/messages.mo | Bin 23480 -> 23480 bytes searx/translations/bn/LC_MESSAGES/messages.mo | Bin 26117 -> 26117 bytes searx/translations/bo/LC_MESSAGES/messages.mo | Bin 10405 -> 10405 bytes searx/translations/ca/LC_MESSAGES/messages.mo | Bin 17505 -> 17758 bytes searx/translations/ca/LC_MESSAGES/messages.po | 34 +++++++++--------- searx/translations/cs/LC_MESSAGES/messages.mo | Bin 18531 -> 18531 bytes searx/translations/cy/LC_MESSAGES/messages.mo | Bin 7974 -> 7974 bytes searx/translations/da/LC_MESSAGES/messages.mo | Bin 17876 -> 17876 bytes searx/translations/de/LC_MESSAGES/messages.mo | Bin 18604 -> 18604 bytes searx/translations/dv/LC_MESSAGES/messages.mo | Bin 1419 -> 1419 bytes .../el_GR/LC_MESSAGES/messages.mo | Bin 25227 -> 25227 bytes searx/translations/en/LC_MESSAGES/messages.mo | Bin 445 -> 445 bytes searx/translations/eo/LC_MESSAGES/messages.mo | Bin 16423 -> 16423 bytes searx/translations/es/LC_MESSAGES/messages.mo | Bin 18849 -> 18849 bytes searx/translations/et/LC_MESSAGES/messages.mo | Bin 13119 -> 13119 bytes searx/translations/eu/LC_MESSAGES/messages.mo | Bin 18393 -> 18393 bytes .../fa_IR/LC_MESSAGES/messages.mo | Bin 21038 -> 21038 bytes searx/translations/fi/LC_MESSAGES/messages.mo | Bin 18270 -> 18270 bytes .../translations/fil/LC_MESSAGES/messages.mo | Bin 15248 -> 15248 bytes searx/translations/fr/LC_MESSAGES/messages.mo | Bin 19046 -> 19046 bytes searx/translations/gl/LC_MESSAGES/messages.mo | Bin 18153 -> 18153 bytes searx/translations/he/LC_MESSAGES/messages.mo | Bin 17396 -> 17396 bytes searx/translations/hr/LC_MESSAGES/messages.mo | Bin 15515 -> 15515 bytes searx/translations/hu/LC_MESSAGES/messages.mo | Bin 17423 -> 17423 bytes searx/translations/ia/LC_MESSAGES/messages.mo | Bin 7507 -> 7507 bytes searx/translations/id/LC_MESSAGES/messages.mo | Bin 16886 -> 16886 bytes searx/translations/it/LC_MESSAGES/messages.mo | Bin 18560 -> 18560 bytes searx/translations/ja/LC_MESSAGES/messages.mo | Bin 20013 -> 20013 bytes searx/translations/ko/LC_MESSAGES/messages.mo | Bin 17401 -> 17401 bytes searx/translations/lt/LC_MESSAGES/messages.mo | Bin 16337 -> 16337 bytes searx/translations/lv/LC_MESSAGES/messages.mo | Bin 9906 -> 9906 bytes searx/translations/ml/LC_MESSAGES/messages.mo | Bin 1032 -> 1032 bytes searx/translations/ms/LC_MESSAGES/messages.mo | Bin 8268 -> 8268 bytes .../nb_NO/LC_MESSAGES/messages.mo | Bin 16794 -> 16794 bytes searx/translations/nl/LC_MESSAGES/messages.mo | Bin 17252 -> 17252 bytes searx/translations/oc/LC_MESSAGES/messages.mo | Bin 12071 -> 12071 bytes searx/translations/pa/LC_MESSAGES/messages.mo | Bin 433 -> 433 bytes .../translations/pap/LC_MESSAGES/messages.mo | Bin 2081 -> 2081 bytes searx/translations/pl/LC_MESSAGES/messages.mo | Bin 18702 -> 18702 bytes searx/translations/pt/LC_MESSAGES/messages.mo | Bin 17359 -> 17359 bytes .../pt_BR/LC_MESSAGES/messages.mo | Bin 18589 -> 18589 bytes searx/translations/ro/LC_MESSAGES/messages.mo | Bin 18851 -> 18883 bytes searx/translations/ro/LC_MESSAGES/messages.po | 18 +++++----- searx/translations/ru/LC_MESSAGES/messages.mo | Bin 23794 -> 23794 bytes searx/translations/si/LC_MESSAGES/messages.mo | Bin 6041 -> 6041 bytes searx/translations/sk/LC_MESSAGES/messages.mo | Bin 17403 -> 17403 bytes searx/translations/sl/LC_MESSAGES/messages.mo | Bin 15786 -> 15786 bytes searx/translations/sr/LC_MESSAGES/messages.mo | Bin 19695 -> 19695 bytes searx/translations/sv/LC_MESSAGES/messages.mo | Bin 17706 -> 17706 bytes .../translations/szl/LC_MESSAGES/messages.mo | Bin 15643 -> 15643 bytes searx/translations/ta/LC_MESSAGES/messages.mo | Bin 22039 -> 22039 bytes searx/translations/te/LC_MESSAGES/messages.mo | Bin 20241 -> 20241 bytes searx/translations/th/LC_MESSAGES/messages.mo | Bin 21222 -> 21222 bytes searx/translations/tr/LC_MESSAGES/messages.mo | Bin 18461 -> 18461 bytes searx/translations/uk/LC_MESSAGES/messages.mo | Bin 23685 -> 23685 bytes searx/translations/vi/LC_MESSAGES/messages.mo | Bin 16765 -> 16765 bytes .../zh_Hans_CN/LC_MESSAGES/messages.mo | Bin 17455 -> 17455 bytes .../zh_Hant_TW/LC_MESSAGES/messages.mo | Bin 17012 -> 17012 bytes 60 files changed, 26 insertions(+), 26 deletions(-) diff --git a/searx/translations/af/LC_MESSAGES/messages.mo b/searx/translations/af/LC_MESSAGES/messages.mo index 35cb244e985b7df0628aabd5e82bc829ba7ce897..9272ba6f78cb26ea09551d5eda4ff3ac60871d1e 100644 GIT binary patch delta 14 VcmZn+X$;vgQ;N}W^DL=!egG<11swnY delta 14 VcmZn+X$;vgQ;N}G^DL=!egG;`1snhX diff --git a/searx/translations/ar/LC_MESSAGES/messages.mo b/searx/translations/ar/LC_MESSAGES/messages.mo index b62545eca4ddfcbab208880ffce133df639d8266..38fe34d0100508a4e775facc447582ae0c3d6405 100644 GIT binary patch delta 16 XcmZ3ulyTuw#toiYjE0-Nw8Aw2HMRwc delta 16 XcmZ3ulyTuw#toiYj0T&%w8Aw2HLwMV diff --git a/searx/translations/bg/LC_MESSAGES/messages.mo b/searx/translations/bg/LC_MESSAGES/messages.mo index fb73efea4924642fe6138688050f74ef10abf9e7..c838deff4d8df9b403eefaae7f4d285a1680a88c 100644 GIT binary patch delta 16 Ycmdn7opHx@#toCS7!5a1)>1VD06mcgMF0Q* delta 16 Ycmdn7opHx@#toCS7!5X0)>1VD06mKaL;wH) diff --git a/searx/translations/bn/LC_MESSAGES/messages.mo b/searx/translations/bn/LC_MESSAGES/messages.mo index 3f27a26c2958d28eded9782105a1af84d947cbc2..1e68ac84bce0fe77c2a3c51c02619130010ca15c 100644 GIT binary patch delta 16 XcmZoY!`OO;al?*MBvzkH$4QJ4U*&W@EdDc;=g`Pr9{9_~*GZ_`gZ0v(y!7*@P>&h-0;c0Tr~x0KBL6#T;#)WqAD~h< zwX-oj@g^oc@|=OTxy@MLv3gy>S(s3=G)(u{O3|QL4#8IJ!%K7ySY2+ zXic|fpaRQ5Wp0FZG-_NqDkBxBj7+ojYWsXHdT9@#GO{K@K^@oI4)3CNv>mm;F4XPc zhw66#73fh^zb~xkFi8CZYUj^%=K^9SvL_Qpl4e$7f82@+Ao7_loU)!qo!MDb0GCla z{uYbyKej%Mo2FEkq5_(L%D^<#_$t)6AP&GLRLXy2pZ@`wKVm+nK+xtS>T+B~MgCvZ z0;znJ9>bofi6@{IoQ^uvIjB3b088+79E`_N0X#ru%ELRVqe(`!cfcII|LGJo;doT) zrl10vjT-PW_QhqW9qhF2`>oBWK#!rupFsyNqf-48Unf2dCV-l6F^5z}qG4`xx%>K}0jOr$}VX)-2a6>0)MD&pr+5jUYS@(b%5s0B7+JZ`}R+=hv` z1ND42YM#BQ=gpXiM^P-G73jO$SgE<){esr60NfOk-5y8|`x2dLNekbQm{HP1y% z!ds}o?xOHV*w5TM}zYJ!|>H-JLadpiy_!F1Gum8kc8 z4l0nBkWHD5s6d)g{jXpOUdQS90E=-lH<+S%3q7oF4pC^0N02wie2)A#clo2&sZWlZ z(h5`nJ`7?#?!=4e#TB`3ihqatp6o&G^f;#AH>lL##8OP*vl>}QVFCq3{1;TpPND9= zH@5v6wxxa>^Wo#g3sTqgiRNKB9HQzc^;5%)53^o6s^2oo=s+k6Tkxrl% z`X_4OeOqsn?=ILK)jkNd!(vnbQ&9`dveu%GrV(|Q-b7u#t*DG_N4+Hn^X>cp2@P#% zIEK26XHkLNwDpImvrXeXp2m@=36@x2v+b*}H|<}dF53fC>f0B%^QWVJTe497Mn@=c z?@T48;!4y}Y(fRF6}7V%YQhg~`{&q^`UP9RZPjN}scnbaP#08&GHiP`^0Q(JQ5lI$ zvJa-97M^7v)L;kdb8LMfY9|p?>R-3*+fWPazzw(uHLiT9dsH(}JAEE?ByS*HObiJi zVy?OcbItlKDn)luZ$&$9losxW`q}J{+F2zkLk*|}n^1RY6>9u?REFNi$MF+<6cdKK zfpy0uz5lrsbhbm0pKLP~({KSQfR)HtvmW(&oF-8>OK?>@40(IH0qb|w6Q4@Fmk^8(CuBBd#3hWDPhvzU8|AEh9 zDziH{2M6MD9EbPNkHwrv2EO+=`QJ?81P$33;QROrZb046o=>=`?t?m-0@Nj)i0L>5 zb@n0Kz66QEEXU4x#I~PD9pNQZ2D_HHnHyXZaTh9}LAP@_*5Xtw#lxrxJygoD1o?WJ zC8(XpP#HUnx}?WYM{@?1*-O|SZ=eGI!Ri_9W~Oz7f>K$CnqVYq!m-u~s2%=QR5m zcEwEWjU~2y7HZslR0e*A+R#$erHi7DWFxBI9weZM*-Jq?Jc2sYv+e_P2em-_825Q! z)D8+zXE+)a*kt?sr}lXRDl?1h^Hu1fz7`YkSE%(iVSl~2yD4aAXK*H7L%rYSV`CdS zv`T4T6ZC~@z2RD)x6zsH%Z>dy{c3#rqy_$P6|D_kC(yvNpw}M=g`Gf^uPF9vuLp_g zmHu$h3HwZyQ&sD$HdS>#C&*ua)!a~YdB#1DQ|)hvF6w{QGruA1i%l9ZC9WhtCvS*1 zKffryAUltLt;?NIIHw}$1VVLAxFJ~N9Y5a*c*i-FPF;0Fz&pyRuJ;E@`~hFMp)Qxd zTkd4W#pTEDW;u_t4Ekoz3xs_kuir}qjSV5nCa4scppUAb u?fIk8(O<>;Lea*uAqgZUy18s*x2(`WQ{#9Sve9{rY4WxdXpP<|3;hqaPD)1r delta 4517 zcmYM#3s6+o9mny*V|j{zfDnkfiXx~eh>9XAD3r=rF{vg#F)NQ`BQDJ@BvoQJc8Xe@ zr07y@UMADDsU}U@1WkqsrJZPPYGi6-5^b=yX4F=bm`4pY#4-K;yl18kOHH3=5tc5&2WYznCy%ZpXDTs{Q}pQ%T0Ss6LGu_#CETuWf$^$5KCI>q8h# z-6T84U=-CPjK_2whS^wYOwbfiSWd%(7>RGAI-aziMFsG0)WlbjHOwF?kmwP{jK)!@ zKuS^lYORe}LEVRwu^V&o9~jB{CMLz0I2sagJZ4}P&O;4Yg$k%0HSum-kB_5L_Z5!9 zpQIWSfiEF*n^#bQ9z~6R4@cs8EWzuzj`d9u+fa&jqXzuU)(={Li<;ndRO*gk0-i(# zbPmVhB~;*1tfKkGAx$O^)o+2d3U$gg7>uQ`l7h~518Si*)IvK@9lNYg<8bQFBY);F z|7oEUsD7tV3!OzbUO@GCr8}8PMVd?o>ZqrslYbRv(4d9qpdzkB9myIbyQUG9nJqXU zccI1|xBdmcMg3jWJX!1}5htSh6{9v(iaMIbsQK1rkpHO^HqoGzK84!B3#c8vYJJ0c z6ct!MDsyM7AEL&6jLOJ0)cCJ$J@Pi^c|5vlPeI+489@r_INNq8M@76CwZKx;?O%!N zSBnbtUR1wU>lXA=*L>Rf7sv}@!ZV$tO+}Jp@^J!Iq5=qRw1sAC0Ci>$p#s>B+HohA z;FGrgJ}TAcQ2~8|%D~sC@e$lajT?bEI0}{W3e@uz$oxT5Pk~^K4|O?qq9%R@r{RmJ z0RyOouAt8HI_hq?_-d8mZ8!y2qZZzQ%FrIvk?gbW`!S#TK}^v5f0}|)b`cfGm#6`W zywu}xBr5VbsP<~>9jHK8qQ=*w2U}1nejj0&mAad#9mf)d7S2Sa+KqaBW}pJC!s)mKbwoi_|Hp75cA*09MP1&vP?`9veST&f z`Cmta$!1ch#l;vx?dr49BPmPNrf}3nieQr=WJ4i4mBCE}VqAv;`Q6^HKd5 zp$n^n6twU%RL51Q$nHf=*o>O64K;!KyYNS-ejTXydJk&i7f?HW1vS18b(F_Z>kOba zc)=R{l!68fq0TTm$C-E}>H{(w^}GNz(L9X8rKrGGAa9~sg-UrVDxm#%559)FGwBog zX%8bK=%PMIXSd$}8x**2W>lWD@B+-HUWHM(5o6Jhx`Yp-Cg?={R_sN6H-3$)@d)~G zG*?{XA4LVwg?b%-g&N;xrag`Zbqf-$EdUH#97#5 z+do51_+QlJi!X5cr=S+d#8}KmeQ@$o3ss}Wt+e$fOr*Z0fc)!02MyZcepCQGs0IFD zeG7FoCsAkl1u8SHLMJ1!sMNcy6L1*yNvO+MjB!|F>#I>m>n|k#)fD#9pb5@fFQM8$ z!ZA3DgVSZZ3zhmN)B@i}{bsbI`aOeO8}oZi#w)0l-#}#|yvW&L5^BEmAO$_h#}PQ! z)|Xn>qEdT5YQX?1Lyy?@9mvmv=|pAZH@3YSZ{2d+{w5~z{FtquMr|ZGKtZYhmwgb< zcUTKV;S-pE8h8Lxum`o%e$TGu-zr5x!YT;AJpE<{WdM(q6 zbwr&1YzkVa8g*-zV;Mex9KU%L72pNb9r+wJ;h=2~>7IGt>r_paNNk8n+GE zvDuCa_z1?azBx@nk$;E^}66W%b;!O15W0;4ZVHIYwnin_Vcszm6;^#OS_i!#h z#6HwzEa&s6x1bVr6nCR8Wh-W3+kEn`RPD154j^lpmoXKu*!FKwXXjerq^=Z|v1O=* z?nYh4HFzIx#d5ranlHDEuOHSUA4hWlweizsK_^w0Xwa>^iaOgN)ECOdEQ&Y{m5D4= z>MBwFt5K=G%UX-tP$TLxKZK*P9W~!CQ2h^~j;uFGK|A;}YT|y|;T=?jAK3QGw*9JY zA4Hw4YoQZhqBRY*Ko+K9HfG=)9D{e-c0XzZ!JW3yg}PMFqEdelwevnyAV*OxdCbPwQ4yHjqz7~Y*a=DKTGou}@;hI&)i)Zp=lCQcX(W#_!teKTi8SX@E=^jYr0 znI%QVp>?_Gxev59_*yovZ?3EJws?GAkGu3%i`VDzwKV&@zOqJtL&MZY|8t?-u&{#e zt~^gn_w~Xz!d#2%z0I4tdy4uZLXQ?->~5X?2usiHj|yEa9~p{U*c;vu2>of{<71gF z(Bf_O1>9b@zaj9w=0HnB!1x;|cw3tN-au&kqO)P1P<_Sp(32I#X#vydakp*q`daC? N)qSfF2z^u$_#f9e^l1P9 diff --git a/searx/translations/ca/LC_MESSAGES/messages.po b/searx/translations/ca/LC_MESSAGES/messages.po index f71b59663..bf81ec615 100644 --- a/searx/translations/ca/LC_MESSAGES/messages.po +++ b/searx/translations/ca/LC_MESSAGES/messages.po @@ -19,8 +19,8 @@ msgstr "" "Project-Id-Version: searx\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2023-10-05 09:01+0000\n" -"PO-Revision-Date: 2023-10-26 15:37+0000\n" -"Last-Translator: quenty_occitania \n" +"PO-Revision-Date: 2023-11-02 11:13+0000\n" +"Last-Translator: Ivan Gabaldon \n" "Language-Team: Catalan \n" "Language: ca\n" @@ -109,7 +109,7 @@ msgstr "diccionaris" #. CATEGORY_GROUPS['LYRICS'] #: searx/searxng.msg msgid "lyrics" -msgstr "lletres" +msgstr "lletra" #. CATEGORY_GROUPS['PACKAGES'] #: searx/searxng.msg @@ -119,7 +119,7 @@ msgstr "paquets" #. CATEGORY_GROUPS['Q_A'] #: searx/searxng.msg msgid "q&a" -msgstr "questions i respostes" +msgstr "preguntes i respostes" #. CATEGORY_GROUPS['REPOS'] #: searx/searxng.msg @@ -199,7 +199,7 @@ msgstr "error de xarxa" #: searx/webutils.py:38 msgid "SSL error: certificate validation has failed" -msgstr "error SSL: la validació del certificat ha fallat" +msgstr "error de SSL: la validació del certificat ha fallat" #: searx/webutils.py:40 msgid "unexpected crash" @@ -207,7 +207,7 @@ msgstr "error inesperat" #: searx/webutils.py:47 msgid "HTTP error" -msgstr "error HTTP" +msgstr "error de HTTP" #: searx/webutils.py:48 msgid "HTTP connection error" @@ -223,7 +223,7 @@ msgstr "CAPTCHA" #: searx/webutils.py:56 msgid "too many requests" -msgstr "massa peticions" +msgstr "masses peticions" #: searx/webutils.py:57 msgid "access denied" @@ -239,11 +239,11 @@ msgstr "Suspès" #: searx/webutils.py:317 msgid "{minutes} minute(s) ago" -msgstr "fa {minutes} minuts" +msgstr "fa {minutes} minut(s)" #: searx/webutils.py:318 msgid "{hours} hour(s), {minutes} minute(s) ago" -msgstr "fa {hours} hores i {minutes} minuts" +msgstr "fa {hours} hores i {minutes} minut(s)" #: searx/answerers/random/answerer.py:73 msgid "Random value generator" @@ -279,23 +279,23 @@ msgstr "Canal" #: searx/engines/radio_browser.py:104 msgid "radio" -msgstr "" +msgstr "radio" #: searx/engines/radio_browser.py:106 msgid "bitrate" -msgstr "" +msgstr "tasa de bits" #: searx/engines/radio_browser.py:107 msgid "votes" -msgstr "" +msgstr "vots" #: searx/engines/radio_browser.py:108 msgid "clicks" -msgstr "" +msgstr "clics" #: searx/engines/seekr.py:194 searx/engines/zlibrary.py:129 msgid "Language" -msgstr "Idioma" +msgstr "Llengua" #: searx/engines/semantic_scholar.py:81 msgid "" @@ -843,7 +843,7 @@ msgstr "" #: searx/templates/simple/messages/no_results.html:6 msgid "Refresh the page." -msgstr "" +msgstr "Refresca la pestanya." #: searx/templates/simple/messages/no_results.html:7 msgid "Search for another query or select another category (above)." @@ -855,7 +855,7 @@ msgstr "" #: searx/templates/simple/messages/no_results.html:9 msgid "Switch to another instance:" -msgstr "" +msgstr "Canvia a una altra instància:" #: searx/templates/simple/preferences/answerers.html:4 #: searx/templates/simple/preferences/engines.html:17 @@ -1125,7 +1125,7 @@ msgstr "Canvia la llengua de la disposició" #: searx/templates/simple/result_templates/code.html:13 msgid "repo" -msgstr "repositoris" +msgstr "repositori" #: searx/templates/simple/result_templates/default.html:6 msgid "show media" diff --git a/searx/translations/cs/LC_MESSAGES/messages.mo b/searx/translations/cs/LC_MESSAGES/messages.mo index 46287bddd2b17b12a6bea1b7a5f43fad46876087..600e7169708609a8960082d3649840539994e5f4 100644 GIT binary patch delta 16 YcmaDnf${MK#tl2Q84Wk@(q1V806|O#3;+NC delta 16 YcmaDnf${MK#tl2Q84Wh?(q1V806|6v3jhEB diff --git a/searx/translations/cy/LC_MESSAGES/messages.mo b/searx/translations/cy/LC_MESSAGES/messages.mo index 1686ed5163e1b78d13a57f790fe5516c72fa7161..ee6cafbfdd80054c5d864a5031ca6fccac171340 100644 GIT binary patch delta 14 VcmZ2xx6E$CSrJCV&F4fSxBxCm1%m(p delta 14 VcmZ2xx6E$CSrJBq&F4fSxBxCg1%dzo diff --git a/searx/translations/da/LC_MESSAGES/messages.mo b/searx/translations/da/LC_MESSAGES/messages.mo index d39a8728b105d0a8f336ffac80163e84b2102e7c..f4b967a06a6fe2e7c24b1fc90b52ebc016585d66 100644 GIT binary patch delta 16 Xcmcc8&3L7oaf75bqv2*L?Ojp;HxdQ2 delta 16 Xcmcc8&3L7oaf75bqrqk=?Ojp;Hw*=` diff --git a/searx/translations/de/LC_MESSAGES/messages.mo b/searx/translations/de/LC_MESSAGES/messages.mo index accd87d22eaf3f16affc0b1e4a64b2e1efbb2b6f..44052285e80de927583f4bd1db1d136977e9f829 100644 GIT binary patch delta 16 XcmZ28k#WsL#tkLfjE0*_wasM#Hpm5~ delta 16 XcmZ28k#WsL#tkLfj0T%awasM#Ho^s@ diff --git a/searx/translations/dv/LC_MESSAGES/messages.mo b/searx/translations/dv/LC_MESSAGES/messages.mo index 32d735ca72011c0fa203eb8d5d927ee384d4f27c..5d8d6cd473ede49cd21290289adb289f4ea70f11 100644 GIT binary patch delta 14 VcmeC??&jX`h?&uF^JC@}i~uLF1vUTx delta 14 VcmeC??&jX`h?&t~^JC@}i~uL91vLNw diff --git a/searx/translations/el_GR/LC_MESSAGES/messages.mo b/searx/translations/el_GR/LC_MESSAGES/messages.mo index 5a8827f0c1c32dc5245858b5e55ce51a5a819603..fb8f26c03583b2130bdaeb0ed1b6663f3c7d1b0e 100644 GIT binary patch delta 16 XcmeA^%GiCBaf7rrqv2*5?R;|pG>ipn delta 16 XcmeA^%GiCBaf7rrqrqkw?R;|pG=>Fg diff --git a/searx/translations/en/LC_MESSAGES/messages.mo b/searx/translations/en/LC_MESSAGES/messages.mo index 481e5c5baf99733f5543cc04a9be9f11ca095962..5d8963fb62896c1c35cb40b2856eca7d84e845ea 100644 GIT binary patch delta 11 ScmdnXyq9^yE=FcUE(QP?=>sYN delta 11 ScmdnXyq9^yE=FbpE(QP?<^w4J diff --git a/searx/translations/eo/LC_MESSAGES/messages.mo b/searx/translations/eo/LC_MESSAGES/messages.mo index e808cfd5648a73b717445fc5239a6e17597132a7..a41251813dab228303cd31005077061d3b7b15da 100644 GIT binary patch delta 16 XcmZ49z_`4DaYLvEqv7T-jf>&{Gv)=! delta 16 XcmZ49z_`4DaYLvEqrv7djf>&{GvEct diff --git a/searx/translations/es/LC_MESSAGES/messages.mo b/searx/translations/es/LC_MESSAGES/messages.mo index a2a2f6c39e1afc8cd8fc3f9962c052f7eb97ce7a..cdcdb02d39b53edb5f5acc025bce07fa328f8f31 100644 GIT binary patch delta 16 XcmZ2DnQ`G{#tmiKjE0-bwYB5`HNXXn delta 16 XcmZ2DnQ`G{#tmiKj0T&_wYB5`HM#|g diff --git a/searx/translations/et/LC_MESSAGES/messages.mo b/searx/translations/et/LC_MESSAGES/messages.mo index 5b57b288c2dd4bb97519553ebe072dc94acfe517..9c70a733e4c9743515de9a9972f1a7030e5be712 100644 GIT binary patch delta 14 Vcmdm=wm)ryxFVzBW(h@gApk3i1d0Fv delta 14 Vcmdm=wm)ryxFVy$W(h@gApk3c1c?9u diff --git a/searx/translations/eu/LC_MESSAGES/messages.mo b/searx/translations/eu/LC_MESSAGES/messages.mo index 3348014699a8eefdf4348ad9d513c32816ee6ccd..fc35c2e908e0f5024dd128c93e1692233eb7400a 100644 GIT binary patch delta 16 XcmccF&v>(+aYMc~qv7TP?MxW}JIw|n delta 16 XcmccF&v>(+aYMc~qrv6^?MxW}JI4kg diff --git a/searx/translations/fa_IR/LC_MESSAGES/messages.mo b/searx/translations/fa_IR/LC_MESSAGES/messages.mo index b7a6a600341681a6723eec96976f010e4cb1330a..ad4ef74cee9e1db041f7e69f54587643f491d5ac 100644 GIT binary patch delta 16 YcmZ3tgmK*x#tq$?jE0+gG#6rSR&0AETiva*LMh0vE delta 14 WcmbPTIlFShW>rRm&0AETiva*LKn807 diff --git a/searx/translations/hu/LC_MESSAGES/messages.mo b/searx/translations/hu/LC_MESSAGES/messages.mo index 7fbf3fe229951b0d11d12e32c3b4096810fb372f..27cc68da87ae8bc69694e58abf20c37714538eac 100644 GIT binary patch delta 16 XcmeD0VC?T;-0(qz(Qxxe4LNB5ID-Z- delta 16 XcmeD0VC?T;-0(qz(O~mO4LNB5IDG~$ diff --git a/searx/translations/ia/LC_MESSAGES/messages.mo b/searx/translations/ia/LC_MESSAGES/messages.mo index c35df91e34c379a601eb58af41857672d7d11750..249fe721b28ac2e562b9b463cc8520d762125b10 100644 GIT binary patch delta 14 Vcmca?b=hh|lMtif=4PP_TmUbI1+xGE delta 14 Vcmca?b=hh|lMti9=4PP_TmUbC1+oAD diff --git a/searx/translations/id/LC_MESSAGES/messages.mo b/searx/translations/id/LC_MESSAGES/messages.mo index 755b9dc7f18d2b42d7f89c1e6805fb15937d1a78..7e5755c2ab6d0aa020c9ec581fe44b182823a461 100644 GIT binary patch delta 16 Xcmey?%=oRDal<_gM#IhbHN+(WLaheJ delta 16 Xcmey?%=oRDal<_gMuW}wHN+(WLZ=4C diff --git a/searx/translations/it/LC_MESSAGES/messages.mo b/searx/translations/it/LC_MESSAGES/messages.mo index 86b742ad11b74d9b8acc96a3f2826a4cda52d472..99f7f469d5d94279498d9739cf2221594cc5960b 100644 GIT binary patch delta 16 XcmZpe$k;HEaYLy#qv7TIsgCw diff --git a/searx/translations/ko/LC_MESSAGES/messages.mo b/searx/translations/ko/LC_MESSAGES/messages.mo index 16f99bde2048eba92a55749247b929fc0cbc1f1f..4732cd8cbce34d01dfbff00eb0a627abe13c8e3a 100644 GIT binary patch delta 16 Xcmey_&iJ#Pal=OqM#IgYG}xs9L`eqi delta 16 Xcmey_&iJ#Pal=OqMuW|tG}xs9L_-Gb diff --git a/searx/translations/lt/LC_MESSAGES/messages.mo b/searx/translations/lt/LC_MESSAGES/messages.mo index f43c0dc25b80e5b570f4e605b558751badf6ba4b..94dcd5e86afc24b0c49e80823e79f2dce258092c 100644 GIT binary patch delta 14 Vcmcauf3beU1~o>*%^TGeBmp<81{?qY delta 14 Vcmcauf3beU1~o>5%^TGeBmp<21{(kX diff --git a/searx/translations/lv/LC_MESSAGES/messages.mo b/searx/translations/lv/LC_MESSAGES/messages.mo index 3be183d7086bf764beaaeeb984a572c4421705ed..6f296764aea6beb7b6ee1c2bdb2c57d8b00d8a60 100644 GIT binary patch delta 14 VcmdnwyUBOMba6(*%`?QM_yH}|1sVVV delta 14 VcmdnwyUBOMba6(5%`?QM_yH}?1sMPU diff --git a/searx/translations/ml/LC_MESSAGES/messages.mo b/searx/translations/ml/LC_MESSAGES/messages.mo index 2a98e25394f70a51d639b5a17c252e35d725a510..a695930df9452256e402e038e371671e12632728 100644 GIT binary patch delta 14 VcmeC+=-}A!m5I@C^EW0TMgS(-1h@bI delta 14 VcmeC+=-}A!m5I?{^EW0TMgS(%1h)VH diff --git a/searx/translations/ms/LC_MESSAGES/messages.mo b/searx/translations/ms/LC_MESSAGES/messages.mo index 19052f444c7fb6b1e0f3f32e96b86198b34b9ea7..e221f847070ef0238a3ba199fe2afbd0d6fd1408 100644 GIT binary patch delta 14 WcmX@(aK>T7T2V&B&Fe(xaRC4^OaT7T2V%W&Fe(xaRC4^Mg`gc diff --git a/searx/translations/nb_NO/LC_MESSAGES/messages.mo b/searx/translations/nb_NO/LC_MESSAGES/messages.mo index f7d92b9f4d5850c40db5e4bb8d60d195464e842a..daa501897a690cd61591cb9b11d77a0272e91a13 100644 GIT binary patch delta 16 XcmbQ$%s8u=aRa+1qv2)_%}EjfE>;BH delta 16 XcmbQ$%s8u=aRa+1qrqkl%}EjfE>HyA diff --git a/searx/translations/nl/LC_MESSAGES/messages.mo b/searx/translations/nl/LC_MESSAGES/messages.mo index 0f4ad56cc942ca5b59e222e86c31c25e5fd82749..666dac0722f0686f7b9001a88bee50810b1f50ff 100644 GIT binary patch delta 16 XcmaFT#`vU-aYLpiqv7T(&0mrLJk$oH delta 16 XcmaFT#`vU-aYLpiqrv7Z&0mrLJkAEA diff --git a/searx/translations/oc/LC_MESSAGES/messages.mo b/searx/translations/oc/LC_MESSAGES/messages.mo index 570530f917a9cc9dab4bfc422ef4242205c78adb..6ab06279b8ff047eaca146e5667e6e40d0bbcab1 100644 GIT binary patch delta 14 VcmZ1;w>)kGmmH(vW^OqdK>#Ot1RekY delta 14 VcmZ1;w>)kGmmH(PW^OqdK>#On1RVeX diff --git a/searx/translations/pa/LC_MESSAGES/messages.mo b/searx/translations/pa/LC_MESSAGES/messages.mo index c0f358e4b40b2628aa1acff2d2adf63c36b4abda..d9720fe8c2d767889f001aac5192039aad1f52c2 100644 GIT binary patch delta 11 ScmdnUypegsI!0zgE(QP>u>%GG delta 11 ScmdnUypegsI!0y#E(QP>t^)-C diff --git a/searx/translations/pap/LC_MESSAGES/messages.mo b/searx/translations/pap/LC_MESSAGES/messages.mo index 10fe02ac1b996b2ec1e09f06f8a0a117c5644669..78b767305c0d06233718405c3c6b6a20f55aa949 100644 GIT binary patch delta 14 VcmZ1|uux#bT~(C5 diff --git a/searx/translations/pt/LC_MESSAGES/messages.mo b/searx/translations/pt/LC_MESSAGES/messages.mo index a66acf33c90404317a84dc274f54a3ea983ffc5b..8ad980954b314e3dcf894c9ed93f602cf4960fd0 100644 GIT binary patch delta 16 YcmX@#&Un6^al>Z~M#IftG;T`)06|CxZ~y=R delta 16 YcmX@#&Un6^al>Z~MuW{?G;T`)06{_rZvX%Q diff --git a/searx/translations/pt_BR/LC_MESSAGES/messages.mo b/searx/translations/pt_BR/LC_MESSAGES/messages.mo index 78d1fd7f30aca3bd1f752e87432dc9eb550124ae..6fdbec0dc3cd3831a6c6f579ecc797d2fa84e9ad 100644 GIT binary patch delta 16 XcmbO`k#X)s#tm)SjE0-rwZ&usHN6Fj delta 16 XcmbO`k#X)s#tm)Sj0T(AwZ&usHMa$c diff --git a/searx/translations/ro/LC_MESSAGES/messages.mo b/searx/translations/ro/LC_MESSAGES/messages.mo index 2620733469dc5da3a630fd8fb8b6b7a581364736..eb7daaa7f7061efcdcbf1712db8dba1af8f3d8f4 100644 GIT binary patch delta 4544 zcmYM$3s6->9LMnmc_|H&78DM=`q^l`|E6z!}!_Vb9VQ?|J^;XVO7AsRRPZ7 z*q|oEzt{j{dgDuBs{Q}3D8`szszWgWM_@0UYTN6vFZBjnZ^lsS>#fgY2=x{W#~m1f z`>@0q$9za(A`Nk|#spzC>c!dCJ5d2Nq6U5lqw#T6ARF;w+=B|_E6l~eQ15$txDLjV z)Qd3-mth9;o2?WyaR+w8BbbUOF$tr3x*f7mf!&B2xEycAYE%l}!({XkRTp%S7>pnP z4H(sbBgSDX7BautPoWHhX;rGqQ5|O4`eN%+)ByLRQrLu%_%te@7VLvNQGtJf8t)u3 zg*lIUFDBkK5gl!JUkY8ZKWdNjQ4@_rO*94d-VAFUcBkHejA`yeO|;fNe-<^-7WCk& zsP_+{GIJc&?_@mrSLy?pRfeD@4o5{CkJ^%KWH-!URA$DaCMd%zuoBh(8S5r2rM?9< zUMEIjK%)Cz3~FITO3zG8hH)vq0u znFFZ)pV|6h`}~+g!NY@7sMK`7$bB&uH9!(-Whq#T8K{XKN8O6`sDYnD1^hCm;~rGM z@2o#yJ@wP5O!zn;Ts-5b@;03=DK0CjjKpjI#wHNiq0 zh|5s@wxcF|3$@oDqt4I~EXK1qK=(hNuZIHgp;A_Z+Os*fy#ceS`>_bOq6R*VO63Jq zU=iFs^-ITon2lP<1l#Vj-i8Xe4x=0jiz)c<0aWTwA>R_y!{ZK^ftq+As$&hZjiv#W znN>*k%~Pla>_P?b1}?;}QD^05K9B0}LuI-ao$Dz)M&V{Wf&7?}^d5{e@LF7l?20*q z4`cTfz7=Z6>9`+tR94htKqi)+w48ldJa@=TnOy^gp#qIY1=<^RrqZll452;*193PiVTd2`+No}@)}eii%YX}UER^?ng*OGjfUPDWkVY4&+NGLB;$3YzF)RD@5U zPV;Ky$L!!g1#}dr;qRzJG$qrR-vY=8YDE=U?yuijm`c47HST8Anb?L36T4anvn};`66*hNHIR8mz%7xCPr$ z{pNe!@m8awd%2E+_NEo}L3taM@`G4}-{S&I&2{&D4XWR>s1)x)WpFP>V>{{-eF&Aw z)2R2m5G9`w6OZhgDI7%pmAVQV^g<14z$K^w??XLbfeNe%J-80F(!Hp^6W+&I{Knde z3Lq@cU2z}OxFr~dW34yjk$)YQTWC<^epIR-!#?;V>YD7d?!gG^Z=xnXhzjHwYNcna zA)Gk9mxN<512xV(>q694-|bM)#9yLT@FQx#zfl8(U+Qj60&2qk$ZnWo)C%XIR@R7- zxDu7Qr%)N&fEs5r_Qc(&vvCkLpVL7>DL!Q%bfN|{1@1ths6C5BWyXtoKOZ$g5o%?n zxC_T%3OLxsb9cbvG#IhhW-D5f>Pdr>UiAx2Wr9y{+!VYvXH)} z0JXw8)YjdD%E+Ubj?Kv57N!m3@Ca)BUy-$$z#;DUpb(>(-`ql>2i9Q%`ca2w4GzE) z7=^vKi#ok&s0njW?FGoWGo?5h7ok@E7AnvKs0a>22`m%kC3o)XYtAooi4bS71*q8tG2S_=3upKwz_o)6Wha0mLccRY9kP&VM zhM^WVVT9vOTuDO;4b|wumDmMaknEdn*c*RFr9N^bpIPjMIx~||TTzW#z+zNp8c_j1 zf_LK%RO$;#+^w4JP#90cZq&W*R_cD^hoC098kNH9Y`qLMQKfC4kD1h$*!l~o!?qn2 zKpSeD{iwh`Ms4*Gt8>a0&ZA!JI?DYEB?gs&o~ZT&s|R(cGB6kmZF@0l;HxkMCt(nl zS*K$t^_i$^UFX&vvy6fwTY>7(j5@vRP%GVJ-DTU~MO~{;Z2cr^3(lc#QRr3fFRvuj zxOvuM>p0Z7H(`SQ?43nHEAgWSzTdvE9+RoJU>F{-9>PA&?#ddc5Akyu4LMGvib0E9cFxzde7Dr>NFfUp;?r&TW-d ub1UnMD}41dRL#q&sBFEce{MiPZtK{rp}o6~tg5ZLz0x<&*V;HLDexaUsM$&Y delta 4531 zcmYM%2~bs49LMqVkVVA}P(*}$@>3GY;MkkHQ zimb_8GuL#UBdJZ9)l^Jrnp#;dE!1SIEm&FF_t!l$IgX!m?mf%@{LeWTd}Fm|<7$s{ zHa7f8!=D(BF-f?ot!n@O$%ru~f@&rv;6Ut#W9{=9crEpETVH`u)Elf%V!%7 z1BP&&%Gt(B+%?ne#07`xyyR3MFb4emq*@*Za4kEr(EIM=>7 zg1R5maX$8CezTr}CT_;|cocnj8hheZREM5j-M|V_15d;4%N=n-L)M$+U^(%?JyCw$3E0VLs1irLA5KkmSHFA<;a+30cxUE_WhHniPoYQ zUqH2g86;p#`-8_mZxCs?dv-ODeIBG9Xp#o_^W#A{Aihp4q zPUK^v=c`a#um%<2W>jWE$T*HUNI?yoQIVfSZN=Yi1JjW^rHPV|Uvl{)P23CBu@u=x zQ;y2a!${W6O4I_jq5{~3b$ASQR&M3V030{38FY(l+1k2*{(_WduYf&M@Rs%R8w2h^GBX7yqu^>hrwY*fZ_915B!*ESf2 z8fcVlaGQN!jEcMz6-WhYz@UA9A8O)7sCM-jg{x8HJ&T%f3#$Ki)V$7a3Q-jHq3-{y zsDV$RR(b|Czy;KvwxTAAA}v~B7i&*c`&86c4#X%Nj=H9|*!QKVapoZNIOYKgitHiO zDXvHUn)UpnfSU16`~r1&3et?Zb4BP-Z&QZeVB)X zaRn;y!x+u{<{b*9c)~Ww>hFGV=AbguhzjsoOu=nPGRz04+w&(Xunazb+L9Zv5({t_ z?nd=1^Sk5Kqpss}bhMJ^DCk4-5-R2UQ6HRRxBxq4xhY$Q>i8Hc#T!v8*@j(kH|o>; zIx3SNquT#~d@_uOXxTO6LuGV)Hu+bBVjgI~3ep4^azo1s!ZlF8v0MwpeZykm@E29UJe??x!1EqQ~_QEBoYqG(*1v^mRftq+fDv+b7 zm40gd8PzU=lXok|qQ<$yIuo_k<*0ezawup8r%(faiyGi}jKQ!Rcfzj7ZkT?k6_%hf zR*fC84wbn_P#If^8mAGv;wIGD*pHg;P1F`RAK4e@Py=2-4RjH;XO~c!Nxa_ea1CmL zRMg7+xF2&+0sn*=$HP(Agl(}K#vy-A8vkhgfU9Hfrm&L-Rj5dN@{>m${HU!Mh5TeS zcOe(V)T06lS(~f}Q7d~572t8}XE=}g*I0&Aa^1`{VYKf5n-tXX1M8Ql30qMs=*F)z z^fg}83a6p=ZZ0Z?i!c?JBEM6Z?HG^mqPFxrvNrQQ_D0{0ZvW93$NXj*g#@fZ9hzmB zfyc2kUPYbW&fG~&n1FijMb4Y?;~1QUTKO(ipf95`*o+GJ0W?|G#?tRWh1vCyPVX>`m#~#%8qQ*Ib3g8p_{!jE#4;#jRTCmSB z@~^{ifCoCQhfrU(_puIJu@>j$yZ5;TZ>Ap2Kl;UE9C~p#Zoy-y{&m9%8aJTMN=kv7 zfi%>@@=)_mC~(|8nal$(59+WDK7(Z4ti>cejY|C`WK44vb!LW-aJOPIY5}uRnW@GU zT!@QtJu3Cyk?vOAjuWVFawzCt|Aw6~Wt2P7AXEy6*m@yq&nMXDWtc|2!q%Ta9k%CD z0c=MFycZSNE2yo0*ZPswX`!HozhW3(#x{7xJ`XE&-?v8{s#uIbpMBmBHE=dYVm^jr zp>-@qQ7=MW>uI(gL;`cn0t)J|6t%+T)-|ZpycKnwLbl$FO8p6p!*5Wh`7&yyaid+m z)=bp6d8k`<3u*x~F<$p=j&1NDCi9{J+u|;36ZWEh2=xIvk2({bxO1~G9TiYRC^zQe z_|V}#X<;M%xtZCy-mF1+**WQc{, 2023. msgid "" msgstr "" -"Project-Id-Version: searx\n" +"Project-Id-Version: searx\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2023-10-05 09:01+0000\n" -"PO-Revision-Date: 2023-09-29 14:25+0000\n" -"Last-Translator: alextecplayz \n" +"PO-Revision-Date: 2023-10-30 00:33+0000\n" +"Last-Translator: return42 \n" +"Language-Team: Romanian \n" "Language: ro\n" -"Language-Team: Romanian " -"\n" -"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 " -"< 20)) ? 1 : 2;\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " +"20)) ? 1 : 2;\n" +"X-Generator: Weblate 5.1\n" "Generated-By: Babel 2.12.1\n" #. CONSTANT_NAMES['NO_SUBGROUPING'] @@ -278,7 +279,7 @@ msgstr "Canal" #: searx/engines/radio_browser.py:104 msgid "radio" -msgstr "" +msgstr "Dimineata" #: searx/engines/radio_browser.py:106 msgid "bitrate" @@ -1695,4 +1696,3 @@ msgstr "ascunde video" #~ "n-am găsit nici un rezultat. Folosiți" #~ " o altă interogare sau căutați în " #~ "mai multe categorii." - diff --git a/searx/translations/ru/LC_MESSAGES/messages.mo b/searx/translations/ru/LC_MESSAGES/messages.mo index f0eb57d7d5ab018c02481d022701dcbe52dcd865..a81781ec2a26c13c9901f0ae7c1ccbd4b06fddbc 100644 GIT binary patch delta 16 Ycmeyglkw9|#tn=*jE0+;bUqjW06wP%X#fBK delta 16 Ycmeyglkw9|#tn=*j0T&TbUqjW06w7xXaE2J diff --git a/searx/translations/si/LC_MESSAGES/messages.mo b/searx/translations/si/LC_MESSAGES/messages.mo index 46921aaa4c3bd45cbf583f26914eb60ac6ef89f7..1f8ce6a7698e28fbc039c85de524ace93ddc2c07 100644 GIT binary patch delta 14 VcmbQKKU05$3=gB>W?7yZZU7>K1O5O2 delta 14 VcmbQKKU05$3=gBhW?7yZZU7>E1N{I1 diff --git a/searx/translations/sk/LC_MESSAGES/messages.mo b/searx/translations/sk/LC_MESSAGES/messages.mo index adccc00d365fae01242a7a2a02098e6c7cd2d47d..5837d28e2e69cf8c05eac8510f65b57a68c4e480 100644 GIT binary patch delta 16 Xcmey}&iK2Xaf6j6qv2+2%>z;ZJhTQq delta 16 Xcmey}&iK2Xaf6j6qrqlt%>z;ZJgx>j diff --git a/searx/translations/sl/LC_MESSAGES/messages.mo b/searx/translations/sl/LC_MESSAGES/messages.mo index 27ed053bb90107fb851751e97c9cbf32ed39bcd3..15d9b8c3d2490357bbdd9308719bfa1bfe629173 100644 GIT binary patch delta 14 VcmZ2gy{dXcx*DV5<_t9_aR4vk1yle4 delta 14 VcmZ2gy{dXcx*DUw<_t9_aR4ve1ycY3 diff --git a/searx/translations/sr/LC_MESSAGES/messages.mo b/searx/translations/sr/LC_MESSAGES/messages.mo index 19cff6c0e3f59af01a4634842aa34a3e4ca22467..9851b70b986bf34d5c8988600179b441a1bd02e8 100644 GIT binary patch delta 16 YcmaDqlkxpb#tlwtjE0+?)z+v106l32O8@`> delta 16 YcmaDqlkxpb#tlwtj0T&X)z+v106k*{N&o-= diff --git a/searx/translations/sv/LC_MESSAGES/messages.mo b/searx/translations/sv/LC_MESSAGES/messages.mo index 6737d06734127b9b7d5cdb1119b6d8d0ccb2ca08..1056fd05b01cfacea60855ccc6bc55e405a0f6ab 100644 GIT binary patch delta 16 XcmZ40#ki`Aal Date: Wed, 27 Sep 2023 14:19:35 +0000 Subject: [PATCH 08/91] add a "copy" button to the "search-url" sidebar --- searx/static/themes/simple/src/js/main/results.js | 8 ++++++++ searx/static/themes/simple/src/less/style.less | 9 +++++++++ searx/templates/simple/elements/search_url.html | 1 + 3 files changed, 18 insertions(+) diff --git a/searx/static/themes/simple/src/js/main/results.js b/searx/static/themes/simple/src/js/main/results.js index 4eae58435..2309297df 100644 --- a/searx/static/themes/simple/src/js/main/results.js +++ b/searx/static/themes/simple/src/js/main/results.js @@ -16,6 +16,8 @@ } )); + d.querySelector('#search_url button#copy_url').style.display = "block"; + searxng.on('.btn-collapse', 'click', function () { var btnLabelCollapsed = this.getAttribute('data-btn-text-collapsed'); var btnLabelNotCollapsed = this.getAttribute('data-btn-text-not-collapsed'); @@ -41,6 +43,12 @@ } }); + searxng.on('#copy_url', 'click', function () { + var target = this.parentElement.querySelector('pre'); + navigator.clipboard.writeText(target.innerText); + this.innerText = this.dataset.copiedText; + }); + searxng.selectImage = function (resultElement) { /* eslint no-unused-vars: 0 */ if (resultElement) { diff --git a/searx/static/themes/simple/src/less/style.less b/searx/static/themes/simple/src/less/style.less index 8bb10bb06..87f747668 100644 --- a/searx/static/themes/simple/src/less/style.less +++ b/searx/static/themes/simple/src/less/style.less @@ -729,9 +729,18 @@ summary.title { #search_url { div.selectable_url { pre { + float: left; width: 200em; } } + + button#copy_url { + float: right; + padding: 0.4rem; + margin-left: 0.5rem; + border-radius: 0.3rem; + display: none; // will be shown by JS. + } } #links_on_top { diff --git a/searx/templates/simple/elements/search_url.html b/searx/templates/simple/elements/search_url.html index 9cc92b943..77c956dac 100644 --- a/searx/templates/simple/elements/search_url.html +++ b/searx/templates/simple/elements/search_url.html @@ -1,6 +1,7 @@