Example #1
0
def autocompleter():
    """Return autocompleter results"""
    request_data = {}

    # select request method
    if request.method == 'POST':
        request_data = request.form
    else:
        request_data = request.args

    # set blocked engines
    blocked_engines = get_blocked_engines(engines, request.cookies)

    # parse query
    query = Query(request_data.get('q', '').encode('utf-8'), blocked_engines)
    query.parse_query()

    # check if search query is set
    if not query.getSearchQuery():
        return '', 400

    # get autocompleter
    completer = autocomplete_backends.get(
        request.cookies.get('autocomplete',
                            settings['search']['autocomplete']))

    # parse searx specific autocompleter results like !bang
    raw_results = searx_bang(query)

    # normal autocompletion results only appear if max 3 inner results returned
    if len(raw_results) <= 3 and completer:
        # get language from cookie
        language = request.cookies.get('language')
        if not language or language == 'all':
            language = 'en'
        else:
            language = language.split('_')[0]
        # run autocompletion
        raw_results.extend(completer(query.getSearchQuery(), language))

    # parse results (write :language and !engine back to result string)
    results = []
    for result in raw_results:
        query.changeSearchQuery(result)

        # add parsed result
        results.append(query.getFullQuery())

    # return autocompleter results
    if request_data.get('format') == 'x-suggestions':
        return Response(json.dumps([query.query, results]),
                        mimetype='application/json')

    return Response(json.dumps(results), mimetype='application/json')
Example #2
0
def autocompleter():
    """Return autocompleter results"""
    request_data = {}

    # select request method
    if request.method == 'POST':
        request_data = request.form
    else:
        request_data = request.args

    # set blocked engines
    blocked_engines = get_blocked_engines(engines, request.cookies)

    # parse query
    query = Query(request_data.get('q', '').encode('utf-8'), blocked_engines)
    query.parse_query()

    # check if search query is set
    if not query.getSearchQuery():
        return '', 400

    # get autocompleter
    completer = autocomplete_backends.get(request.cookies.get('autocomplete', settings['search']['autocomplete']))

    # parse searx specific autocompleter results like !bang
    raw_results = searx_bang(query)

    # normal autocompletion results only appear if max 3 inner results returned
    if len(raw_results) <= 3 and completer:
        # get language from cookie
        language = request.cookies.get('language')
        if not language or language == 'all':
            language = 'en'
        else:
            language = language.split('_')[0]
        # run autocompletion
        raw_results.extend(completer(query.getSearchQuery(), language))

    # parse results (write :language and !engine back to result string)
    results = []
    for result in raw_results:
        query.changeSearchQuery(result)

        # add parsed result
        results.append(query.getFullQuery())

    # return autocompleter results
    if request_data.get('format') == 'x-suggestions':
        return Response(json.dumps([query.query, results]),
                        mimetype='application/json')

    return Response(json.dumps(results),
                    mimetype='application/json')
Example #3
0
def autocompleter():
    """Return autocompleter results"""
    request_data = {}

    # select request method
    if request.method == "POST":
        request_data = request.form
    else:
        request_data = request.args

    # set blocked engines
    blocked_engines = get_blocked_engines(engines, request.cookies)

    # parse query
    query = Query(request_data.get("q", "").encode("utf-8"), blocked_engines)
    query.parse_query()

    # check if search query is set
    if not query.getSearchQuery():
        return "", 400

    # run autocompleter
    completer = autocomplete_backends.get(request.cookies.get("autocomplete", settings["search"]["autocomplete"]))

    # parse searx specific autocompleter results like !bang
    raw_results = searx_bang(query)

    # normal autocompletion results only appear if max 3 inner results returned
    if len(raw_results) <= 3 and completer:
        # run autocompletion
        raw_results.extend(completer(query.getSearchQuery()))

    # parse results (write :language and !engine back to result string)
    results = []
    for result in raw_results:
        query.changeSearchQuery(result)

        # add parsed result
        results.append(query.getFullQuery())

    # return autocompleter results
    if request_data.get("format") == "x-suggestions":
        return Response(json.dumps([query.query, results]), mimetype="application/json")

    return Response(json.dumps(results), mimetype="application/json")
Example #4
0
def preferences():
    """Render preferences page.

    Settings that are going to be saved as cookies."""
    lang = None
    image_proxy = request.cookies.get('image_proxy', settings['server'].get('image_proxy'))

    if request.cookies.get('language')\
       and request.cookies['language'] in (x[0] for x in language_codes):
        lang = request.cookies['language']

    blocked_engines = []

    resp = make_response(redirect(urljoin(settings['server']['base_url'], url_for('index'))))

    if request.method == 'GET':
        blocked_engines = get_blocked_engines(engines, request.cookies)
    else:  # on save
        selected_categories = []
        post_disabled_plugins = []
        locale = None
        autocomplete = ''
        method = 'POST'
        safesearch = settings['search']['safe_search']
        for pd_name, pd in request.form.items():
            if pd_name.startswith('category_'):
                category = pd_name[9:]
                if category not in categories:
                    continue
                selected_categories.append(category)
            elif pd_name == 'locale' and pd in settings['locales']:
                locale = pd
            elif pd_name == 'image_proxy':
                image_proxy = pd
            elif pd_name == 'autocomplete':
                autocomplete = pd
            elif pd_name == 'language' and (pd == 'all' or
                                            pd in (x[0] for
                                                   x in language_codes)):
                lang = pd
            elif pd_name == 'method':
                method = pd
            elif pd_name == 'safesearch':
                safesearch = pd
            elif pd_name.startswith('engine_'):
                if pd_name.find('__') > -1:
                    # TODO fix underscore vs space
                    engine_name, category = [x.replace('_', ' ') for x in
                                             pd_name.replace('engine_', '', 1).split('__', 1)]
                    if engine_name in engines and category in engines[engine_name].categories:
                        blocked_engines.append((engine_name, category))
            elif pd_name == 'theme':
                theme = pd if pd in themes else default_theme
            elif pd_name.startswith('plugin_'):
                plugin_id = pd_name.replace('plugin_', '', 1)
                if not any(plugin.id == plugin_id for plugin in plugins):
                    continue
                post_disabled_plugins.append(plugin_id)
            else:
                resp.set_cookie(pd_name, pd, max_age=cookie_max_age)

        disabled_plugins = []
        allowed_plugins = []
        for plugin in plugins:
            if plugin.default_on:
                if plugin.id in post_disabled_plugins:
                    disabled_plugins.append(plugin.id)
            elif plugin.id not in post_disabled_plugins:
                allowed_plugins.append(plugin.id)

        resp.set_cookie('disabled_plugins', ','.join(disabled_plugins), max_age=cookie_max_age)

        resp.set_cookie('allowed_plugins', ','.join(allowed_plugins), max_age=cookie_max_age)

        resp.set_cookie(
            'blocked_engines', ','.join('__'.join(e) for e in blocked_engines),
            max_age=cookie_max_age
        )

        if locale:
            resp.set_cookie(
                'locale', locale,
                max_age=cookie_max_age
            )

        if lang:
            resp.set_cookie(
                'language', lang,
                max_age=cookie_max_age
            )

        if selected_categories:
            # cookie max age: 4 weeks
            resp.set_cookie(
                'categories', ','.join(selected_categories),
                max_age=cookie_max_age
            )

            resp.set_cookie(
                'autocomplete', autocomplete,
                max_age=cookie_max_age
            )

        resp.set_cookie('method', method, max_age=cookie_max_age)

        resp.set_cookie('safesearch', str(safesearch), max_age=cookie_max_age)

        resp.set_cookie('image_proxy', image_proxy, max_age=cookie_max_age)

        resp.set_cookie('theme', theme, max_age=cookie_max_age)

        return resp

    # stats for preferences page
    stats = {}

    for c in categories:
        for e in categories[c]:
            stats[e.name] = {'time': None,
                             'warn_timeout': False,
                             'warn_time': False}
            if e.timeout > settings['outgoing']['request_timeout']:
                stats[e.name]['warn_timeout'] = True

    for engine_stat in get_engines_stats()[0][1]:
        stats[engine_stat.get('name')]['time'] = round(engine_stat.get('avg'), 3)
        if engine_stat.get('avg') > settings['outgoing']['request_timeout']:
            stats[engine_stat.get('name')]['warn_time'] = True
    # end of stats

    return render('preferences.html',
                  locales=settings['locales'],
                  current_locale=get_locale(),
                  current_language=lang or 'all',
                  image_proxy=image_proxy,
                  language_codes=language_codes,
                  engines_by_category=categories,
                  stats=stats,
                  blocked_engines=blocked_engines,
                  autocomplete_backends=autocomplete_backends,
                  shortcuts={y: x for x, y in engine_shortcuts.items()},
                  themes=themes,
                  plugins=plugins,
                  allowed_plugins=[plugin.id for plugin in request.user_plugins],
                  theme=get_current_theme_name())
Example #5
0
def render(template_name, override_theme=None, **kwargs):
    blocked_engines = get_blocked_engines(engines, request.cookies)

    autocomplete = request.cookies.get('autocomplete', settings['search']['autocomplete'])

    if autocomplete not in autocomplete_backends:
        autocomplete = None

    nonblocked_categories = set(category for engine_name in engines
                                for category in engines[engine_name].categories
                                if (engine_name, category) not in blocked_engines)

    if 'categories' not in kwargs:
        kwargs['categories'] = ['general']
        kwargs['categories'].extend(x for x in
                                    sorted(categories.keys())
                                    if x != 'general'
                                    and x in nonblocked_categories)

    if 'all_categories' not in kwargs:
        kwargs['all_categories'] = ['general']
        kwargs['all_categories'].extend(x for x in
                                        sorted(categories.keys())
                                        if x != 'general')

    if 'selected_categories' not in kwargs:
        kwargs['selected_categories'] = []
        for arg in request.args:
            if arg.startswith('category_'):
                c = arg.split('_', 1)[1]
                if c in categories:
                    kwargs['selected_categories'].append(c)

    if not kwargs['selected_categories']:
        cookie_categories = request.cookies.get('categories', '').split(',')
        for ccateg in cookie_categories:
            if ccateg in categories:
                kwargs['selected_categories'].append(ccateg)

    if not kwargs['selected_categories']:
        kwargs['selected_categories'] = ['general']

    if 'autocomplete' not in kwargs:
        kwargs['autocomplete'] = autocomplete

    if get_locale() in rtl_locales and 'rtl' not in kwargs:
        kwargs['rtl'] = True

    kwargs['searx_version'] = VERSION_STRING

    kwargs['method'] = request.cookies.get('method', 'POST')

    kwargs['safesearch'] = request.cookies.get('safesearch', str(settings['search']['safe_search']))

    # override url_for function in templates
    kwargs['url_for'] = url_for_theme

    kwargs['image_proxify'] = image_proxify

    kwargs['get_result_template'] = get_result_template

    kwargs['theme'] = get_current_theme_name(override=override_theme)

    kwargs['template_name'] = template_name

    kwargs['cookies'] = request.cookies

    kwargs['scripts'] = set()
    for plugin in request.user_plugins:
        for script in plugin.js_dependencies:
            kwargs['scripts'].add(script)

    kwargs['styles'] = set()
    for plugin in request.user_plugins:
        for css in plugin.css_dependencies:
            kwargs['styles'].add(css)

    return render_template(
        '{}/{}'.format(kwargs['theme'], template_name), **kwargs)
Example #6
0
def preferences():
    """Render preferences page.

    Settings that are going to be saved as cookies."""
    lang = None
    image_proxy = request.cookies.get('image_proxy',
                                      settings['server'].get('image_proxy'))

    if request.cookies.get('language')\
       and request.cookies['language'] in (x[0] for x in language_codes):
        lang = request.cookies['language']

    blocked_engines = []

    resp = make_response(
        redirect(urljoin(settings['server']['base_url'], url_for('index'))))

    if request.method == 'GET':
        blocked_engines = get_blocked_engines(engines, request.cookies)
    else:  # on save
        selected_categories = []
        post_disabled_plugins = []
        locale = None
        autocomplete = ''
        method = 'POST'
        safesearch = settings['search']['safe_search']
        for pd_name, pd in request.form.items():
            if pd_name.startswith('category_'):
                category = pd_name[9:]
                if category not in categories:
                    continue
                selected_categories.append(category)
            elif pd_name == 'locale' and pd in settings['locales']:
                locale = pd
            elif pd_name == 'image_proxy':
                image_proxy = pd
            elif pd_name == 'autocomplete':
                autocomplete = pd
            elif pd_name == 'language' and (pd == 'all' or pd
                                            in (x[0] for x in language_codes)):
                lang = pd
            elif pd_name == 'method':
                method = pd
            elif pd_name == 'safesearch':
                safesearch = pd
            elif pd_name.startswith('engine_'):
                if pd_name.find('__') > -1:
                    # TODO fix underscore vs space
                    engine_name, category = [
                        x.replace('_', ' ') for x in pd_name.replace(
                            'engine_', '', 1).split('__', 1)
                    ]
                    if engine_name in engines and category in engines[
                            engine_name].categories:
                        blocked_engines.append((engine_name, category))
            elif pd_name == 'theme':
                theme = pd if pd in themes else default_theme
            elif pd_name.startswith('plugin_'):
                plugin_id = pd_name.replace('plugin_', '', 1)
                if not any(plugin.id == plugin_id for plugin in plugins):
                    continue
                post_disabled_plugins.append(plugin_id)
            else:
                resp.set_cookie(pd_name, pd, max_age=cookie_max_age)

        disabled_plugins = []
        allowed_plugins = []
        for plugin in plugins:
            if plugin.default_on:
                if plugin.id in post_disabled_plugins:
                    disabled_plugins.append(plugin.id)
            elif plugin.id not in post_disabled_plugins:
                allowed_plugins.append(plugin.id)

        resp.set_cookie('disabled_plugins',
                        ','.join(disabled_plugins),
                        max_age=cookie_max_age)

        resp.set_cookie('allowed_plugins',
                        ','.join(allowed_plugins),
                        max_age=cookie_max_age)

        resp.set_cookie('blocked_engines',
                        ','.join('__'.join(e) for e in blocked_engines),
                        max_age=cookie_max_age)

        if locale:
            resp.set_cookie('locale', locale, max_age=cookie_max_age)

        if lang:
            resp.set_cookie('language', lang, max_age=cookie_max_age)

        if selected_categories:
            # cookie max age: 4 weeks
            resp.set_cookie('categories',
                            ','.join(selected_categories),
                            max_age=cookie_max_age)

            resp.set_cookie('autocomplete',
                            autocomplete,
                            max_age=cookie_max_age)

        resp.set_cookie('method', method, max_age=cookie_max_age)

        resp.set_cookie('safesearch', str(safesearch), max_age=cookie_max_age)

        resp.set_cookie('image_proxy', image_proxy, max_age=cookie_max_age)

        resp.set_cookie('theme', theme, max_age=cookie_max_age)

        return resp

    # stats for preferences page
    stats = {}

    for c in categories:
        for e in categories[c]:
            stats[e.name] = {
                'time': None,
                'warn_timeout': False,
                'warn_time': False
            }
            if e.timeout > settings['outgoing']['request_timeout']:
                stats[e.name]['warn_timeout'] = True

    for engine_stat in get_engines_stats()[0][1]:
        stats[engine_stat.get('name')]['time'] = round(engine_stat.get('avg'),
                                                       3)
        if engine_stat.get('avg') > settings['outgoing']['request_timeout']:
            stats[engine_stat.get('name')]['warn_time'] = True
    # end of stats

    return render(
        'preferences.html',
        locales=settings['locales'],
        current_locale=get_locale(),
        current_language=lang or 'all',
        image_proxy=image_proxy,
        language_codes=language_codes,
        engines_by_category=categories,
        stats=stats,
        blocked_engines=blocked_engines,
        autocomplete_backends=autocomplete_backends,
        shortcuts={y: x
                   for x, y in engine_shortcuts.items()},
        themes=themes,
        plugins=plugins,
        allowed_plugins=[plugin.id for plugin in request.user_plugins],
        theme=get_current_theme_name())
Example #7
0
def render(template_name, override_theme=None, **kwargs):
    blocked_engines = get_blocked_engines(engines, request.cookies)

    autocomplete = request.cookies.get('autocomplete',
                                       settings['search']['autocomplete'])

    if autocomplete not in autocomplete_backends:
        autocomplete = None

    nonblocked_categories = set(category for engine_name in engines
                                for category in engines[engine_name].categories
                                if (engine_name,
                                    category) not in blocked_engines)

    if 'categories' not in kwargs:
        kwargs['categories'] = ['general']
        kwargs['categories'].extend(
            x for x in sorted(categories.keys())
            if x != 'general' and x in nonblocked_categories)

    if 'all_categories' not in kwargs:
        kwargs['all_categories'] = ['general']
        kwargs['all_categories'].extend(x for x in sorted(categories.keys())
                                        if x != 'general')

    if 'selected_categories' not in kwargs:
        kwargs['selected_categories'] = []
        for arg in request.args:
            if arg.startswith('category_'):
                c = arg.split('_', 1)[1]
                if c in categories:
                    kwargs['selected_categories'].append(c)

    if not kwargs['selected_categories']:
        cookie_categories = request.cookies.get('categories', '').split(',')
        for ccateg in cookie_categories:
            if ccateg in categories:
                kwargs['selected_categories'].append(ccateg)

    if not kwargs['selected_categories']:
        kwargs['selected_categories'] = ['general']

    if 'autocomplete' not in kwargs:
        kwargs['autocomplete'] = autocomplete

    if get_locale() in rtl_locales and 'rtl' not in kwargs:
        kwargs['rtl'] = True

    kwargs['searx_version'] = VERSION_STRING

    kwargs['method'] = request.cookies.get('method', 'POST')

    kwargs['safesearch'] = request.cookies.get(
        'safesearch', str(settings['search']['safe_search']))

    # override url_for function in templates
    kwargs['url_for'] = url_for_theme

    kwargs['image_proxify'] = image_proxify

    kwargs['get_result_template'] = get_result_template

    kwargs['theme'] = get_current_theme_name(override=override_theme)

    kwargs['template_name'] = template_name

    kwargs['cookies'] = request.cookies

    kwargs['instance_name'] = settings['general']['instance_name']

    kwargs['scripts'] = set()
    for plugin in request.user_plugins:
        for script in plugin.js_dependencies:
            kwargs['scripts'].add(script)

    kwargs['styles'] = set()
    for plugin in request.user_plugins:
        for css in plugin.css_dependencies:
            kwargs['styles'].add(css)

    return render_template('{}/{}'.format(kwargs['theme'], template_name),
                           **kwargs)
Example #8
0
    def __init__(self, request):
        # init vars
        super(Search, self).__init__()
        self.query = None
        self.engines = []
        self.categories = []
        self.paging = False
        self.pageno = 1
        self.lang = 'all'

        # set blocked engines
        self.blocked_engines = get_blocked_engines(engines, request.cookies)

        self.results = []
        self.suggestions = set()
        self.answers = set()
        self.infoboxes = []
        self.request_data = {}

        # set specific language if set
        if request.cookies.get('language')\
           and request.cookies['language'] in (x[0] for x in language_codes):
            self.lang = request.cookies['language']

        # set request method
        if request.method == 'POST':
            self.request_data = request.form
        else:
            self.request_data = request.args

        # TODO better exceptions
        if not self.request_data.get('q'):
            raise Exception('noquery')

        # set pagenumber
        pageno_param = self.request_data.get('pageno', '1')
        if not pageno_param.isdigit() or int(pageno_param) < 1:
            raise Exception('wrong pagenumber')

        self.pageno = int(pageno_param)

        # parse query, if tags are set, which change
        # the serch engine or search-language
        query_obj = Query(self.request_data['q'], self.blocked_engines)
        query_obj.parse_query()

        # set query
        self.query = query_obj.getSearchQuery()

        # get last selected language in query, if possible
        # TODO support search with multible languages
        if len(query_obj.languages):
            self.lang = query_obj.languages[-1]

        self.engines = query_obj.engines

        self.categories = []

        # if engines are calculated from query,
        # set categories by using that informations
        if self.engines and query_obj.specific:
            self.categories = list(set(engine['category']
                                       for engine in self.engines))

        # otherwise, using defined categories to
        # calculate which engines should be used
        else:
            # set used categories
            for pd_name, pd in self.request_data.items():
                if pd_name.startswith('category_'):
                    category = pd_name[9:]

                    # if category is not found in list, skip
                    if category not in categories:
                        continue

                    if pd != 'off':
                        # add category to list
                        self.categories.append(category)
                    elif category in self.categories:
                        # remove category from list if property is set to 'off'
                        self.categories.remove(category)

            # if no category is specified for this search,
            # using user-defined default-configuration which
            # (is stored in cookie)
            if not self.categories:
                cookie_categories = request.cookies.get('categories', '')
                cookie_categories = cookie_categories.split(',')
                for ccateg in cookie_categories:
                    if ccateg in categories:
                        self.categories.append(ccateg)

            # if still no category is specified, using general
            # as default-category
            if not self.categories:
                self.categories = ['general']

            # using all engines for that search, which are
            # declared under the specific categories
            for categ in self.categories:
                self.engines.extend({'category': categ,
                                     'name': engine.name}
                                    for engine in categories[categ]
                                    if (engine.name, categ) not in self.blocked_engines)
Example #9
0
    def __init__(self, request):
        # init vars
        super(Search, self).__init__()
        self.query = None
        self.engines = []
        self.categories = []
        self.paging = False
        self.pageno = 1
        self.lang = 'all'

        # set blocked engines
        self.blocked_engines = get_blocked_engines(engines, request.cookies)

        self.result_container = ResultContainer()
        self.request_data = {}

        # set specific language if set
        if request.cookies.get('language')\
           and request.cookies['language'] in (x[0] for x in language_codes):
            self.lang = request.cookies['language']

        # set request method
        if request.method == 'POST':
            self.request_data = request.form
        else:
            self.request_data = request.args

        # TODO better exceptions
        if not self.request_data.get('q'):
            raise Exception('noquery')

        # set pagenumber
        pageno_param = self.request_data.get('pageno', '1')
        if not pageno_param.isdigit() or int(pageno_param) < 1:
            raise Exception('wrong pagenumber')

        self.pageno = int(pageno_param)

        # parse query, if tags are set, which change
        # the serch engine or search-language
        query_obj = Query(self.request_data['q'], self.blocked_engines)
        query_obj.parse_query()

        # set query
        self.query = query_obj.getSearchQuery()

        # get last selected language in query, if possible
        # TODO support search with multible languages
        if len(query_obj.languages):
            self.lang = query_obj.languages[-1]

        self.engines = query_obj.engines

        self.categories = []

        # if engines are calculated from query,
        # set categories by using that informations
        if self.engines and query_obj.specific:
            self.categories = list(
                set(engine['category'] for engine in self.engines))

        # otherwise, using defined categories to
        # calculate which engines should be used
        else:
            # set categories/engines
            load_default_categories = True
            for pd_name, pd in self.request_data.items():
                if pd_name == 'categories':
                    self.categories.extend(
                        categ for categ in map(unicode.strip, pd.split(','))
                        if categ in categories)
                elif pd_name == 'engines':
                    pd_engines = [{
                        'category': engines[engine].categories[0],
                        'name': engine
                    } for engine in map(unicode.strip, pd.split(','))
                                  if engine in engines]
                    if pd_engines:
                        self.engines.extend(pd_engines)
                        load_default_categories = False
                elif pd_name.startswith('category_'):
                    category = pd_name[9:]

                    # if category is not found in list, skip
                    if category not in categories:
                        continue

                    if pd != 'off':
                        # add category to list
                        self.categories.append(category)
                    elif category in self.categories:
                        # remove category from list if property is set to 'off'
                        self.categories.remove(category)

            if not load_default_categories:
                if not self.categories:
                    self.categories = list(
                        set(engine['category'] for engine in self.engines))
                return

            # if no category is specified for this search,
            # using user-defined default-configuration which
            # (is stored in cookie)
            if not self.categories:
                cookie_categories = request.cookies.get('categories', '')
                cookie_categories = cookie_categories.split(',')
                for ccateg in cookie_categories:
                    if ccateg in categories:
                        self.categories.append(ccateg)

            # if still no category is specified, using general
            # as default-category
            if not self.categories:
                self.categories = ['general']

            # using all engines for that search, which are
            # declared under the specific categories
            for categ in self.categories:
                self.engines.extend({
                    'category': categ,
                    'name': engine.name
                } for engine in categories[categ]
                                    if (engine.name,
                                        categ) not in self.blocked_engines)
Example #10
0
def preferences():
    """Render preferences page.

    Settings that are going to be saved as cookies."""
    lang = None
    image_proxy = request.cookies.get("image_proxy", settings["server"].get("image_proxy"))

    if request.cookies.get("language") and request.cookies["language"] in (x[0] for x in language_codes):
        lang = request.cookies["language"]

    blocked_engines = []

    resp = make_response(redirect(urljoin(settings["server"]["base_url"], url_for("index"))))

    if request.method == "GET":
        blocked_engines = get_blocked_engines(engines, request.cookies)
    else:  # on save
        selected_categories = []
        post_disabled_plugins = []
        locale = None
        autocomplete = ""
        method = "POST"
        safesearch = settings["search"]["safe_search"]
        for pd_name, pd in request.form.items():
            if pd_name.startswith("category_"):
                category = pd_name[9:]
                if category not in categories:
                    continue
                selected_categories.append(category)
            elif pd_name == "locale" and pd in settings["locales"]:
                locale = pd
            elif pd_name == "image_proxy":
                image_proxy = pd
            elif pd_name == "autocomplete":
                autocomplete = pd
            elif pd_name == "language" and (pd == "all" or pd in (x[0] for x in language_codes)):
                lang = pd
            elif pd_name == "method":
                method = pd
            elif pd_name == "safesearch":
                safesearch = pd
            elif pd_name.startswith("engine_"):
                if pd_name.find("__") > -1:
                    # TODO fix underscore vs space
                    engine_name, category = [
                        x.replace("_", " ") for x in pd_name.replace("engine_", "", 1).split("__", 1)
                    ]
                    if engine_name in engines and category in engines[engine_name].categories:
                        blocked_engines.append((engine_name, category))
            elif pd_name == "theme":
                theme = pd if pd in themes else default_theme
            elif pd_name.startswith("plugin_"):
                plugin_id = pd_name.replace("plugin_", "", 1)
                if not any(plugin.id == plugin_id for plugin in plugins):
                    continue
                post_disabled_plugins.append(plugin_id)
            else:
                resp.set_cookie(pd_name, pd, max_age=cookie_max_age)

        disabled_plugins = []
        allowed_plugins = []
        for plugin in plugins:
            if plugin.default_on:
                if plugin.id in post_disabled_plugins:
                    disabled_plugins.append(plugin.id)
            elif plugin.id not in post_disabled_plugins:
                allowed_plugins.append(plugin.id)

        resp.set_cookie("disabled_plugins", ",".join(disabled_plugins), max_age=cookie_max_age)

        resp.set_cookie("allowed_plugins", ",".join(allowed_plugins), max_age=cookie_max_age)

        resp.set_cookie("blocked_engines", ",".join("__".join(e) for e in blocked_engines), max_age=cookie_max_age)

        if locale:
            resp.set_cookie("locale", locale, max_age=cookie_max_age)

        if lang:
            resp.set_cookie("language", lang, max_age=cookie_max_age)

        if selected_categories:
            # cookie max age: 4 weeks
            resp.set_cookie("categories", ",".join(selected_categories), max_age=cookie_max_age)

            resp.set_cookie("autocomplete", autocomplete, max_age=cookie_max_age)

        resp.set_cookie("method", method, max_age=cookie_max_age)

        resp.set_cookie("safesearch", str(safesearch), max_age=cookie_max_age)

        resp.set_cookie("image_proxy", image_proxy, max_age=cookie_max_age)

        resp.set_cookie("theme", theme, max_age=cookie_max_age)

        return resp

    # stats for preferences page
    stats = {}

    for c in categories:
        for e in categories[c]:
            stats[e.name] = {"time": None, "warn_timeout": False, "warn_time": False}
            if e.timeout > settings["outgoing"]["request_timeout"]:
                stats[e.name]["warn_timeout"] = True

    for engine_stat in get_engines_stats()[0][1]:
        stats[engine_stat.get("name")]["time"] = round(engine_stat.get("avg"), 3)
        if engine_stat.get("avg") > settings["outgoing"]["request_timeout"]:
            stats[engine_stat.get("name")]["warn_time"] = True
    # end of stats

    return render(
        "preferences.html",
        locales=settings["locales"],
        current_locale=get_locale(),
        current_language=lang or "all",
        image_proxy=image_proxy,
        language_codes=language_codes,
        engines_by_category=categories,
        stats=stats,
        blocked_engines=blocked_engines,
        autocomplete_backends=autocomplete_backends,
        shortcuts={y: x for x, y in engine_shortcuts.items()},
        themes=themes,
        plugins=plugins,
        allowed_plugins=[plugin.id for plugin in request.user_plugins],
        theme=get_current_theme_name(),
    )
Example #11
0
def render(template_name, override_theme=None, **kwargs):
    blocked_engines = get_blocked_engines(engines, request.cookies)

    autocomplete = request.cookies.get("autocomplete", settings["search"]["autocomplete"])

    if autocomplete not in autocomplete_backends:
        autocomplete = None

    nonblocked_categories = set(
        category
        for engine_name in engines
        for category in engines[engine_name].categories
        if (engine_name, category) not in blocked_engines
    )

    if "categories" not in kwargs:
        kwargs["categories"] = ["general"]
        kwargs["categories"].extend(
            x for x in sorted(categories.keys()) if x != "general" and x in nonblocked_categories
        )

    if "all_categories" not in kwargs:
        kwargs["all_categories"] = ["general"]
        kwargs["all_categories"].extend(x for x in sorted(categories.keys()) if x != "general")

    if "selected_categories" not in kwargs:
        kwargs["selected_categories"] = []
        for arg in request.args:
            if arg.startswith("category_"):
                c = arg.split("_", 1)[1]
                if c in categories:
                    kwargs["selected_categories"].append(c)

    if not kwargs["selected_categories"]:
        cookie_categories = request.cookies.get("categories", "").split(",")
        for ccateg in cookie_categories:
            if ccateg in categories:
                kwargs["selected_categories"].append(ccateg)

    if not kwargs["selected_categories"]:
        kwargs["selected_categories"] = ["general"]

    if "autocomplete" not in kwargs:
        kwargs["autocomplete"] = autocomplete

    if get_locale() in rtl_locales and "rtl" not in kwargs:
        kwargs["rtl"] = True

    kwargs["searx_version"] = VERSION_STRING

    kwargs["method"] = request.cookies.get("method", "POST")

    kwargs["safesearch"] = request.cookies.get("safesearch", str(settings["search"]["safe_search"]))

    # override url_for function in templates
    kwargs["url_for"] = url_for_theme

    kwargs["image_proxify"] = image_proxify

    kwargs["get_result_template"] = get_result_template

    kwargs["theme"] = get_current_theme_name(override=override_theme)

    kwargs["template_name"] = template_name

    kwargs["cookies"] = request.cookies

    kwargs["instance_name"] = settings["general"]["instance_name"]

    kwargs["scripts"] = set()
    for plugin in request.user_plugins:
        for script in plugin.js_dependencies:
            kwargs["scripts"].add(script)

    kwargs["styles"] = set()
    for plugin in request.user_plugins:
        for css in plugin.css_dependencies:
            kwargs["styles"].add(css)

    return render_template("{}/{}".format(kwargs["theme"], template_name), **kwargs)
Example #12
0
def preferences():
    """Render preferences page.

    Settings that are going to be saved as cookies."""
    lang = None
    image_proxy = request.cookies.get('image_proxy', settings['server'].get('image_proxy'))

    if request.cookies.get('language')\
       and request.cookies['language'] in (x[0] for x in language_codes):
        lang = request.cookies['language']

    blocked_engines = []

    resp = make_response(redirect(url_for('index')))

    if request.method == 'GET':
        blocked_engines = get_blocked_engines(engines, request.cookies)
    else:  # on save
        selected_categories = []
        locale = None
        autocomplete = ''
        method = 'POST'
        safesearch = '1'

        for pd_name, pd in request.form.items():
            if pd_name.startswith('category_'):
                category = pd_name[9:]
                if category not in categories:
                    continue
                selected_categories.append(category)
            elif pd_name == 'locale' and pd in settings['locales']:
                locale = pd
            elif pd_name == 'image_proxy':
                image_proxy = pd
            elif pd_name == 'autocomplete':
                autocomplete = pd
            elif pd_name == 'language' and (pd == 'all' or
                                            pd in (x[0] for
                                                   x in language_codes)):
                lang = pd
            elif pd_name == 'method':
                method = pd
            elif pd_name == 'safesearch':
                safesearch = pd
            elif pd_name.startswith('engine_'):
                if pd_name.find('__') > -1:
                    engine_name, category = pd_name.replace('engine_', '', 1).split('__', 1)
                    if engine_name in engines and category in engines[engine_name].categories:
                        blocked_engines.append((engine_name, category))
            elif pd_name == 'theme':
                theme = pd if pd in themes else default_theme
            else:
                resp.set_cookie(pd_name, pd, max_age=cookie_max_age)

        resp.set_cookie(
            'blocked_engines', ','.join('__'.join(e) for e in blocked_engines),
            max_age=cookie_max_age
        )

        if locale:
            resp.set_cookie(
                'locale', locale,
                max_age=cookie_max_age
            )

        if lang:
            resp.set_cookie(
                'language', lang,
                max_age=cookie_max_age
            )

        if selected_categories:
            # cookie max age: 4 weeks
            resp.set_cookie(
                'categories', ','.join(selected_categories),
                max_age=cookie_max_age
            )

            resp.set_cookie(
                'autocomplete', autocomplete,
                max_age=cookie_max_age
            )

        resp.set_cookie('method', method, max_age=cookie_max_age)

        resp.set_cookie('safesearch', safesearch, max_age=cookie_max_age)

        resp.set_cookie('image_proxy', image_proxy, max_age=cookie_max_age)

        resp.set_cookie('theme', theme, max_age=cookie_max_age)

        return resp
    return render('preferences.html',
                  locales=settings['locales'],
                  current_locale=get_locale(),
                  current_language=lang or 'all',
                  image_proxy=image_proxy,
                  language_codes=language_codes,
                  categs=categories.items(),
                  blocked_engines=blocked_engines,
                  autocomplete_backends=autocomplete_backends,
                  shortcuts={y: x for x, y in engine_shortcuts.items()},
                  themes=themes,
                  theme=get_current_theme_name())