.oO SearXNG Developer Documentation Oo.
Loading...
Searching...
No Matches
searx.preferences.Preferences Class Reference

Public Member Functions

 __init__ (self, List[str] themes, List[str] categories, Dict[str, Engine] engines, Iterable[Plugin] plugins, Optional[ClientPref] client=None)
 
 get_as_url_params (self)
 
 parse_encoded_data (self, str input_data)
 
 parse_dict (self, Dict[str, str] input_data)
 
 parse_form (self, Dict[str, str] input_data)
 
 get_value (self, str user_setting_name)
 
 save (self, flask.Response resp)
 
 validate_token (self, engine)
 

Public Attributes

 engines
 
 plugins
 
 tokens
 
 client
 

Detailed Description

Validates and saves preferences to cookies

Definition at line 373 of file preferences.py.

Constructor & Destructor Documentation

◆ __init__()

searx.preferences.Preferences.__init__ ( self,
List[str] themes,
List[str] categories,
Dict[str, Engine] engines,
Iterable[Plugin] plugins,
Optional[ClientPref] client = None )

Definition at line 376 of file preferences.py.

383 ):
384
385 super().__init__()
386
387 self.key_value_settings: Dict[str, Setting] = {
388 # fmt: off
389 'categories': MultipleChoiceSetting(
390 ['general'],
391 locked=is_locked('categories'),
392 choices=categories + ['none']
393 ),
394 'language': SearchLanguageSetting(
395 settings['search']['default_lang'],
396 locked=is_locked('language'),
397 choices=settings['search']['languages'] + ['']
398 ),
399 'locale': EnumStringSetting(
400 settings['ui']['default_locale'],
401 locked=is_locked('locale'),
402 choices=list(LOCALE_NAMES.keys()) + ['']
403 ),
404 'autocomplete': EnumStringSetting(
405 settings['search']['autocomplete'],
406 locked=is_locked('autocomplete'),
407 choices=list(autocomplete.backends.keys()) + ['']
408 ),
409 'image_proxy': BooleanSetting(
410 settings['server']['image_proxy'],
411 locked=is_locked('image_proxy')
412 ),
413 'method': EnumStringSetting(
414 settings['server']['method'],
415 locked=is_locked('method'),
416 choices=('GET', 'POST')
417 ),
418 'safesearch': MapSetting(
419 settings['search']['safe_search'],
420 locked=is_locked('safesearch'),
421 map={
422 '0': 0,
423 '1': 1,
424 '2': 2
425 }
426 ),
427 'theme': EnumStringSetting(
428 settings['ui']['default_theme'],
429 locked=is_locked('theme'),
430 choices=themes
431 ),
432 'results_on_new_tab': BooleanSetting(
433 settings['ui']['results_on_new_tab'],
434 locked=is_locked('results_on_new_tab')
435 ),
436 'doi_resolver': MultipleChoiceSetting(
437 [settings['default_doi_resolver'], ],
438 locked=is_locked('doi_resolver'),
439 choices=DOI_RESOLVERS
440 ),
441 'simple_style': EnumStringSetting(
442 settings['ui']['theme_args']['simple_style'],
443 locked=is_locked('simple_style'),
444 choices=['', 'auto', 'light', 'dark']
445 ),
446 'center_alignment': BooleanSetting(
447 settings['ui']['center_alignment'],
448 locked=is_locked('center_alignment')
449 ),
450 'advanced_search': BooleanSetting(
451 settings['ui']['advanced_search'],
452 locked=is_locked('advanced_search')
453 ),
454 'query_in_title': BooleanSetting(
455 settings['ui']['query_in_title'],
456 locked=is_locked('query_in_title')
457 ),
458 'infinite_scroll': BooleanSetting(
459 settings['ui']['infinite_scroll'],
460 locked=is_locked('infinite_scroll')
461 ),
462 'search_on_category_select': BooleanSetting(
463 settings['ui']['search_on_category_select'],
464 locked=is_locked('search_on_category_select')
465 ),
466 'hotkeys': EnumStringSetting(
467 settings['ui']['hotkeys'],
468 choices=['default', 'vim']
469 ),
470 # fmt: on
471 }
472
473 self.engines = EnginesSetting('engines', engines=engines.values())
474 self.plugins = PluginsSetting('plugins', plugins=plugins)
475 self.tokens = SetSetting('tokens')
476 self.client = client or ClientPref()
477 self.unknown_params: Dict[str, str] = {}
478

References searx.preferences.Preferences.__init__().

Referenced by searx.preferences.Preferences.__init__().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Member Function Documentation

◆ get_as_url_params()

searx.preferences.Preferences.get_as_url_params ( self)
Return preferences as URL parameters

Definition at line 479 of file preferences.py.

479 def get_as_url_params(self):
480 """Return preferences as URL parameters"""
481 settings_kv = {}
482 for k, v in self.key_value_settings.items():
483 if v.locked:
484 continue
485 if isinstance(v, MultipleChoiceSetting):
486 settings_kv[k] = ','.join(v.get_value())
487 else:
488 settings_kv[k] = v.get_value()
489
490 settings_kv['disabled_engines'] = ','.join(self.engines.disabled)
491 settings_kv['enabled_engines'] = ','.join(self.engines.enabled)
492
493 settings_kv['disabled_plugins'] = ','.join(self.plugins.disabled)
494 settings_kv['enabled_plugins'] = ','.join(self.plugins.enabled)
495
496 settings_kv['tokens'] = ','.join(self.tokens.values)
497
498 return urlsafe_b64encode(compress(urlencode(settings_kv).encode())).decode()
499

References searx.preferences.Preferences.engines, searx.search.checker.background.CheckerOk.engines, searx.preferences.Preferences.plugins, searx.enginelib.Engine.tokens, and searx.preferences.Preferences.tokens.

◆ get_value()

searx.preferences.Preferences.get_value ( self,
str user_setting_name )
Returns the value for ``user_setting_name``

Definition at line 556 of file preferences.py.

556 def get_value(self, user_setting_name: str):
557 """Returns the value for ``user_setting_name``"""
558 ret_val = None
559 if user_setting_name in self.key_value_settings:
560 ret_val = self.key_value_settings[user_setting_name].get_value()
561 if user_setting_name in self.unknown_params:
562 ret_val = self.unknown_params[user_setting_name]
563 return ret_val
564

References searx.preferences.Preferences.get_value().

Referenced by searx.preferences.Preferences.get_value().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ parse_dict()

searx.preferences.Preferences.parse_dict ( self,
Dict[str, str] input_data )
parse preferences from request (``flask.request.form``)

Definition at line 508 of file preferences.py.

508 def parse_dict(self, input_data: Dict[str, str]):
509 """parse preferences from request (``flask.request.form``)"""
510 for user_setting_name, user_setting in input_data.items():
511 if user_setting_name in self.key_value_settings:
512 if self.key_value_settings[user_setting_name].locked:
513 continue
514 self.key_value_settings[user_setting_name].parse(user_setting)
515 elif user_setting_name == 'disabled_engines':
516 self.engines.parse_cookie(input_data.get('disabled_engines', ''), input_data.get('enabled_engines', ''))
517 elif user_setting_name == 'disabled_plugins':
518 self.plugins.parse_cookie(input_data.get('disabled_plugins', ''), input_data.get('enabled_plugins', ''))
519 elif user_setting_name == 'tokens':
520 self.tokens.parse(user_setting)
521 elif not any(
522 user_setting_name.startswith(x) for x in ['enabled_', 'disabled_', 'engine_', 'category_', 'plugin_']
523 ):
524 self.unknown_params[user_setting_name] = user_setting
525

References searx.preferences.Preferences.engines, searx.search.checker.background.CheckerOk.engines, searx.preferences.Preferences.plugins, searx.enginelib.Engine.tokens, and searx.preferences.Preferences.tokens.

Referenced by searx.preferences.Preferences.parse_encoded_data().

+ Here is the caller graph for this function:

◆ parse_encoded_data()

searx.preferences.Preferences.parse_encoded_data ( self,
str input_data )
parse (base64) preferences from request (``flask.request.form['preferences']``)

Definition at line 500 of file preferences.py.

500 def parse_encoded_data(self, input_data: str):
501 """parse (base64) preferences from request (``flask.request.form['preferences']``)"""
502 bin_data = decompress(urlsafe_b64decode(input_data))
503 dict_data = {}
504 for x, y in parse_qs(bin_data.decode('ascii'), keep_blank_values=True).items():
505 dict_data[x] = y[0]
506 self.parse_dict(dict_data)
507

References searx.preferences.Preferences.parse_dict().

+ Here is the call graph for this function:

◆ parse_form()

searx.preferences.Preferences.parse_form ( self,
Dict[str, str] input_data )
Parse formular (``<input>``) data from a ``flask.request.form``

Definition at line 526 of file preferences.py.

526 def parse_form(self, input_data: Dict[str, str]):
527 """Parse formular (``<input>``) data from a ``flask.request.form``"""
528 disabled_engines = []
529 enabled_categories = []
530 disabled_plugins = []
531
532 # boolean preferences are not sent by the form if they're false,
533 # so we have to add them as false manually if they're not sent (then they would be true)
534 for key, setting in self.key_value_settings.items():
535 if key not in input_data.keys() and isinstance(setting, BooleanSetting):
536 input_data[key] = 'False'
537
538 for user_setting_name, user_setting in input_data.items():
539 if user_setting_name in self.key_value_settings:
540 self.key_value_settings[user_setting_name].parse(user_setting)
541 elif user_setting_name.startswith('engine_'):
542 disabled_engines.append(user_setting_name)
543 elif user_setting_name.startswith('category_'):
544 enabled_categories.append(user_setting_name[len('category_') :])
545 elif user_setting_name.startswith('plugin_'):
546 disabled_plugins.append(user_setting_name)
547 elif user_setting_name == 'tokens':
548 self.tokens.parse_form(user_setting)
549 else:
550 self.unknown_params[user_setting_name] = user_setting
551 self.key_value_settings['categories'].parse_form(enabled_categories)
552 self.engines.parse_form(disabled_engines)
553 self.plugins.parse_form(disabled_plugins)
554

References searx.preferences.Preferences.engines, searx.search.checker.background.CheckerOk.engines, searx.preferences.Preferences.parse_form(), searx.preferences.Preferences.plugins, searx.enginelib.Engine.tokens, and searx.preferences.Preferences.tokens.

Referenced by searx.preferences.Preferences.parse_form().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ save()

searx.preferences.Preferences.save ( self,
flask.Response resp )
Save cookie in the HTTP response object

Definition at line 565 of file preferences.py.

565 def save(self, resp: flask.Response):
566 """Save cookie in the HTTP response object"""
567 for user_setting_name, user_setting in self.key_value_settings.items():
568 # pylint: disable=unnecessary-dict-index-lookup
569 if self.key_value_settings[user_setting_name].locked:
570 continue
571 user_setting.save(user_setting_name, resp)
572 self.engines.save(resp)
573 self.plugins.save(resp)
574 self.tokens.save('tokens', resp)
575 for k, v in self.unknown_params.items():
576 resp.set_cookie(k, v, max_age=COOKIE_MAX_AGE)
577 return resp
578

References searx.preferences.Preferences.engines, searx.search.checker.background.CheckerOk.engines, searx.preferences.Preferences.plugins, searx.preferences.Preferences.save(), searx.enginelib.Engine.tokens, and searx.preferences.Preferences.tokens.

Referenced by searx.preferences.Preferences.save().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ validate_token()

searx.preferences.Preferences.validate_token ( self,
engine )

Definition at line 579 of file preferences.py.

579 def validate_token(self, engine):
580 valid = True
581 if hasattr(engine, 'tokens') and engine.tokens:
582 valid = False
583 for token in self.tokens.values:
584 if token in engine.tokens:
585 valid = True
586 break
587
588 return valid
589
590

References searx.enginelib.Engine.tokens, and searx.preferences.Preferences.tokens.

Member Data Documentation

◆ client

searx.preferences.Preferences.client

Definition at line 476 of file preferences.py.

◆ engines

◆ plugins

◆ tokens


The documentation for this class was generated from the following file: