From 373a66be3046bbb7deca20f08468cb5dea44eaf9 Mon Sep 17 00:00:00 2001 From: Nicolas Gelot Date: Thu, 28 Mar 2019 18:07:03 +0100 Subject: Fix locale and search language Locale and search language was always defined with english value. This patch inits the locale on `pre_request` in order to define the default value of locale and language preferences. Plus the `best_match` function provided by flask babel library did not work as expected. So the function `match_language` provided by searx is used to detect that the language from Accepted-Language header can be used in searx project. --- searx/preferences.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'searx/preferences.py') diff --git a/searx/preferences.py b/searx/preferences.py index acaa67f66..912e89c01 100644 --- a/searx/preferences.py +++ b/searx/preferences.py @@ -243,8 +243,8 @@ class Preferences(object): super(Preferences, self).__init__() self.key_value_settings = {'categories': MultipleChoiceSetting(['general'], choices=categories + ['none']), - 'language': SearchLanguageSetting(settings['search']['language'], - choices=LANGUAGE_CODES), + 'language': SearchLanguageSetting(settings['ui']['default_locale'], + choices=list(LANGUAGE_CODES) + ['']), 'locale': EnumStringSetting(settings['ui']['default_locale'], choices=list(settings['locales'].keys()) + ['']), 'autocomplete': EnumStringSetting(settings['search']['autocomplete'], -- cgit v1.2.3 From 99435381a84072b110c32004b2fb778af9b96f77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9mi=20V=C3=A1nyi?= Date: Sat, 1 Feb 2020 11:01:17 +0100 Subject: [enh] introduce private engines This PR adds a new setting to engines named `tokens`. It expects a list of tokens which lets searx validate if the request should be accepted or not. --- searx/preferences.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) (limited to 'searx/preferences.py') diff --git a/searx/preferences.py b/searx/preferences.py index 30a4252b0..6befdd6e1 100644 --- a/searx/preferences.py +++ b/searx/preferences.py @@ -104,6 +104,31 @@ class MultipleChoiceSetting(EnumStringSetting): resp.set_cookie(name, ','.join(self.value), max_age=COOKIE_MAX_AGE) +class SetSetting(Setting): + def _post_init(self): + if not hasattr(self, 'values'): + self.values = set() + + def get_value(self): + return ','.join(self.values) + + def parse(self, data): + if data == '': + self.values = set() + return + + elements = data.split(',') + for element in elements: + self.values.add(element) + + def parse_form(self, data): + elements = data.split(',') + self.values = set(elements) + + def save(self, name, resp): + resp.set_cookie(name, ','.join(self.values), max_age=COOKIE_MAX_AGE) + + class SearchLanguageSetting(EnumStringSetting): """Available choices may change, so user's value may not be in choices anymore""" @@ -272,6 +297,7 @@ class Preferences(object): self.engines = EnginesSetting('engines', choices=engines) self.plugins = PluginsSetting('plugins', choices=plugins) + self.tokens = SetSetting('tokens') self.unknown_params = {} def get_as_url_params(self): @@ -288,6 +314,8 @@ class Preferences(object): settings_kv['disabled_plugins'] = ','.join(self.plugins.disabled) settings_kv['enabled_plugins'] = ','.join(self.plugins.enabled) + settings_kv['tokens'] = ','.join(self.tokens.values) + return urlsafe_b64encode(compress(urlencode(settings_kv).encode('utf-8'))).decode('utf-8') def parse_encoded_data(self, input_data): @@ -307,6 +335,8 @@ class Preferences(object): elif user_setting_name == 'disabled_plugins': self.plugins.parse_cookie((input_data.get('disabled_plugins', ''), input_data.get('enabled_plugins', ''))) + elif user_setting_name == 'tokens': + self.tokens.parse(user_setting) elif not any(user_setting_name.startswith(x) for x in [ 'enabled_', 'disabled_', @@ -328,6 +358,8 @@ class Preferences(object): enabled_categories.append(user_setting_name[len('category_'):]) elif user_setting_name.startswith('plugin_'): disabled_plugins.append(user_setting_name) + elif user_setting_name == 'tokens': + self.tokens.parse_form(user_setting) else: self.unknown_params[user_setting_name] = user_setting self.key_value_settings['categories'].parse_form(enabled_categories) @@ -346,6 +378,18 @@ class Preferences(object): user_setting.save(user_setting_name, resp) self.engines.save(resp) self.plugins.save(resp) + self.tokens.save('tokens', resp) for k, v in self.unknown_params.items(): resp.set_cookie(k, v, max_age=COOKIE_MAX_AGE) return resp + + def validate_token(self, engine): + valid = True + if hasattr(engine, 'tokens') and engine.tokens: + valid = False + for token in self.tokens.values: + if token in engine.tokens: + valid = True + break + + return valid -- cgit v1.2.3 From 6df41728872934fe0e7f12c0a272d370f50d26a9 Mon Sep 17 00:00:00 2001 From: Adam Tauber Date: Tue, 18 Feb 2020 00:56:27 +0100 Subject: [fix] allow settin custom locale from settins.yml --- searx/preferences.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'searx/preferences.py') diff --git a/searx/preferences.py b/searx/preferences.py index 669232b12..37d4f13a8 100644 --- a/searx/preferences.py +++ b/searx/preferences.py @@ -11,7 +11,7 @@ if version[0] == '3': COOKIE_MAX_AGE = 60 * 60 * 24 * 365 * 5 # 5 years -LANGUAGE_CODES = [l[0] for l in languages] +LANGUAGE_CODES = [l[0].split('-')[0] for l in languages] LANGUAGE_CODES.append('all') DISABLED = 0 ENABLED = 1 -- cgit v1.2.3 From c0006cadf70f0ee457d881bbd4ec40e30b0acd8f Mon Sep 17 00:00:00 2001 From: Marc Abonce Seguin Date: Sun, 23 Feb 2020 02:03:42 -0700 Subject: fix default locale and language issues --- searx/preferences.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'searx/preferences.py') diff --git a/searx/preferences.py b/searx/preferences.py index 37d4f13a8..6e31aa187 100644 --- a/searx/preferences.py +++ b/searx/preferences.py @@ -4,6 +4,7 @@ from sys import version from searx import settings, autocomplete from searx.languages import language_codes as languages +from searx.utils import match_language from searx.url_utils import parse_qs, urlencode if version[0] == '3': @@ -11,7 +12,7 @@ if version[0] == '3': COOKIE_MAX_AGE = 60 * 60 * 24 * 365 * 5 # 5 years -LANGUAGE_CODES = [l[0].split('-')[0] for l in languages] +LANGUAGE_CODES = [l[0] for l in languages] LANGUAGE_CODES.append('all') DISABLED = 0 ENABLED = 1 @@ -132,6 +133,10 @@ class SetSetting(Setting): class SearchLanguageSetting(EnumStringSetting): """Available choices may change, so user's value may not be in choices anymore""" + def _validate_selection(self, selection): + if not match_language(selection, self.choices, fallback=None) and selection != "": + raise ValidationException('Invalid language code: "{0}"'.format(selection)) + def parse(self, data): if data not in self.choices and data != self.value: # hack to give some backwards compatibility with old language cookies @@ -268,7 +273,7 @@ class Preferences(object): super(Preferences, self).__init__() self.key_value_settings = {'categories': MultipleChoiceSetting(['general'], choices=categories + ['none']), - 'language': SearchLanguageSetting(settings['ui']['default_locale'], + 'language': SearchLanguageSetting(settings['search']['default_lang'], choices=list(LANGUAGE_CODES) + ['']), 'locale': EnumStringSetting(settings['ui']['default_locale'], choices=list(settings['locales'].keys()) + ['']), -- cgit v1.2.3