on master help sign in
[enh] generate search url of saved preferences
commit38d6ba4066a474c1b13e7ccb6f9ea92b43702a4a authorAdam Tauber <asciimoo@gmail.com> dateMon 10 Jul 2017, 12:47 (9 years ago) parent36af8f9
3 files changed+37−5
searx/preferences.py+26−4 searx/templates/oscar/preferences.html+3 searx/webapp.py+8−1
searx/preferences.py+26−4
@@ -1,5 +1,6 @@
11from searx import settings, autocomplete
22from searx.languages import language_codes as languages
3+from searx.url_utils import urlencode
34
45
56COOKIE_MAX_AGE = 60 * 60 * 24 * 365 * 5 # 5 years
@@ -232,7 +233,7 @@ class PluginsSetting(SwitchableSetting):
232233
233234
234235class Preferences(object):
235− """Stores, validates and saves preferences to cookies"""
236+ """Validates and saves preferences to cookies"""
236237
237238 def __init__(self, themes, categories, engines, plugins):
238239 super(Preferences, self).__init__()
@@ -247,19 +248,40 @@ class Preferences(object):
247248 'image_proxy': MapSetting(settings['server']['image_proxy'],
248249 map={'': settings['server']['image_proxy'],
249250 '0': False,
250− '1': True}),
251+ '1': True,
252+ 'True': True,
253+ 'False': False}),
251254 'method': EnumStringSetting('POST', choices=('GET', 'POST')),
252255 'safesearch': MapSetting(settings['search']['safe_search'], map={'0': 0,
253256 '1': 1,
254257 '2': 2}),
255258 'theme': EnumStringSetting(settings['ui']['default_theme'], choices=themes),
256− 'results_on_new_tab': MapSetting(False, map={'0': False, '1': True})}
259+ 'results_on_new_tab': MapSetting(False, map={'0': False,
260+ '1': True,
261+ 'False': False,
262+ 'True': True})}
257263
258264 self.engines = EnginesSetting('engines', choices=engines)
259265 self.plugins = PluginsSetting('plugins', choices=plugins)
260266 self.unknown_params = {}
261267
262− def parse_cookies(self, input_data):
268+ def get_as_url_params(self):
269+ settings_kv = {}
270+ for k, v in self.key_value_settings.items():
271+ if isinstance(v, MultipleChoiceSetting):
272+ settings_kv[k] = ','.join(v.get_value())
273+ else:
274+ settings_kv[k] = v.get_value()
275+
276+ settings_kv['disabled_engines'] = ','.join(self.engines.disabled)
277+ settings_kv['enabled_engines'] = ','.join(self.engines.enabled)
278+
279+ settings_kv['disabled_plugins'] = ','.join(self.plugins.disabled)
280+ settings_kv['enabled_plugins'] = ','.join(self.plugins.enabled)
281+
282+ return urlencode(settings_kv)
283+
284+ def parse_dict(self, input_data):
263285 for user_setting_name, user_setting in input_data.items():
264286 if user_setting_name in self.key_value_settings:
265287 self.key_value_settings[user_setting_name].parse(user_setting)
searx/templates/oscar/preferences.html+3
@@ -283,6 +283,9 @@
283283 <br />
284284 {{ _("These cookies serve your sole convenience, we don't use these cookies to track you.") }}
285285 </p>
286+ <p style="margin:20px 0;">{{ _('Search URL of the currently saved preferences') }} <small class="text-muted">({{ _('Note: specifying custom settings in the search URL can reduce privacy by leaking data to the clicked result sites.') }})</small>:<br/>
287+ <input readonly="" class="form-control select-all-on-click cursor-text" type="url" value="{{ url_for('index', _external=True) }}?{{ preferences_url_params|e }}{% raw %}&amp;q=%s{% endraw %}">
288+ </p>
286289
287290 <input type="submit" class="btn btn-primary" value="{{ _('save') }}" />
288291 <a href="{{ url_for('index') }}"><div class="btn btn-default">{{ _('back') }}</div></a>
searx/webapp.py+8−1
@@ -392,7 +392,7 @@ def pre_request():
392392 preferences = Preferences(themes, list(categories.keys()), engines, plugins)
393393 request.preferences = preferences
394394 try:
395− preferences.parse_cookies(request.cookies)
395+ preferences.parse_dict(request.cookies)
396396 except:
397397 request.errors.append(gettext('Invalid settings, please edit your preferences'))
398398
@@ -402,6 +402,11 @@ def pre_request():
402402 for k, v in request.args.items():
403403 if k not in request.form:
404404 request.form[k] = v
405+ try:
406+ preferences.parse_dict(request.form)
407+ except Exception as e:
408+ logger.exception('invalid settings')
409+ request.errors.append(gettext('Invalid settings'))
405410
406411 # request.user_plugins
407412 request.user_plugins = []
@@ -685,6 +690,8 @@ def preferences():
685690 plugins=plugins,
686691 allowed_plugins=allowed_plugins,
687692 theme=get_current_theme_name(),
693+ preferences_url_params=request.preferences.get_as_url_params(),
694+ base_url=get_base_url(),
688695 preferences=True)
689696
690697