@@ -27,6 +27,18 @@ import cStringIO
28import hashlib
28import hashlib
30+from searx import logger
31+logger = logger.getChild('webapp')
34+ from pygments import highlight
35+ from pygments.lexers import get_lexer_by_name
36+ from pygments.formatters import HtmlFormatter
38+ logger.critical("cannot import dependency: pygments")
30from datetime import datetime, timedelta
42from datetime import datetime, timedelta
31from urllib import urlencode
43from urllib import urlencode
32from werkzeug.contrib.fixers import ProxyFix
44from werkzeug.contrib.fixers import ProxyFix
@@ -51,18 +63,8 @@ from searx.https_rewrite import https_url_rewrite
51from searx.search import Search
63from searx.search import Search
52from searx.query import Query
64from searx.query import Query
53from searx.autocomplete import searx_bang, backends as autocomplete_backends
65from searx.autocomplete import searx_bang, backends as autocomplete_backends
54−from searx import logger
66+from searx.plugins import plugins
56− from pygments import highlight
57− from pygments.lexers import get_lexer_by_name
58− from pygments.formatters import HtmlFormatter
60− logger.critical("cannot import dependency: pygments")
65−logger = logger.getChild('webapp')
67static_path, templates_path, themes =\
69static_path, templates_path, themes =\
68 get_themes(settings['themes_path']
70 get_themes(settings['themes_path']
@@ -303,6 +305,23 @@ def render(template_name, override_theme=None, **kwargs):
303 '{}/{}'.format(kwargs['theme'], template_name), **kwargs)
305 '{}/{}'.format(kwargs['theme'], template_name), **kwargs)
310+ # merge GET, POST vars
311+ request.form = dict(request.form.items())
312+ for k, v in request.args:
313+ if k not in request.form:
316+ request.user_plugins = []
317+ allowed_plugins = request.cookies.get('allowed_plugins', '').split(',')
318+ disabled_plugins = request.cookies.get('disabled_plugins', '').split(',')
319+ for plugin in plugins:
320+ if ((plugin.default_on and plugin.id not in disabled_plugins)
321+ or plugin.id in allowed_plugins):
322+ request.user_plugins.append(plugin)
306@app.route('/search', methods=['GET', 'POST'])
325@app.route('/search', methods=['GET', 'POST'])
307@app.route('/', methods=['GET', 'POST'])
326@app.route('/', methods=['GET', 'POST'])
308def index():
327def index():
@@ -323,8 +342,10 @@ def index():
323 'index.html',
342 'index.html',
326− search.results, search.suggestions,\
345+ if plugins.call('pre_search', request, locals()):
327− search.answers, search.infoboxes = search.search(request)
346+ search.search(request)
348+ plugins.call('post_search', request, locals())
329 for result in search.results:
350 for result in search.results:
@@ -487,11 +508,11 @@ def preferences():
487 blocked_engines = get_blocked_engines(engines, request.cookies)
508 blocked_engines = get_blocked_engines(engines, request.cookies)
488 else: # on save
509 else: # on save
489 selected_categories = []
510 selected_categories = []
511+ post_disabled_plugins = []
490 locale = None
512 locale = None
491 autocomplete = ''
513 autocomplete = ''
492 method = 'POST'
514 method = 'POST'
493 safesearch = '1'
515 safesearch = '1'
495 for pd_name, pd in request.form.items():
516 for pd_name, pd in request.form.items():
496 if pd_name.startswith('category_'):
517 if pd_name.startswith('category_'):
497 category = pd_name[9:]
518 category = pd_name[9:]
@@ -514,14 +535,34 @@ def preferences():
514 safesearch = pd
535 safesearch = pd
515 elif pd_name.startswith('engine_'):
536 elif pd_name.startswith('engine_'):
516 if pd_name.find('__') > -1:
537 if pd_name.find('__') > -1:
538+ # TODO fix underscore vs space
539+ engine_name, category = [x.replace('_', ' ') for x in
517− engine_name, category = pd_name.replace('engine_', '', 1).split('__', 1)
540+ pd_name.replace('engine_', '', 1).split('__', 1)]
518 if engine_name in engines and category in engines[engine_name].categories:
541 if engine_name in engines and category in engines[engine_name].categories:
519 blocked_engines.append((engine_name, category))
542 blocked_engines.append((engine_name, category))
520 elif pd_name == 'theme':
543 elif pd_name == 'theme':
521 theme = pd if pd in themes else default_theme
544 theme = pd if pd in themes else default_theme
545+ elif pd_name.startswith('plugin_'):
546+ plugin_id = pd_name.replace('plugin_', '', 1)
547+ if not any(plugin.id == plugin_id for plugin in plugins):
549+ post_disabled_plugins.append(plugin_id)
523 resp.set_cookie(pd_name, pd, max_age=cookie_max_age)
551 resp.set_cookie(pd_name, pd, max_age=cookie_max_age)
553+ disabled_plugins = []
554+ allowed_plugins = []
555+ for plugin in plugins:
556+ if plugin.default_on:
557+ if plugin.id in post_disabled_plugins:
558+ disabled_plugins.append(plugin.id)
559+ elif plugin.id not in post_disabled_plugins:
560+ allowed_plugins.append(plugin.id)
562+ resp.set_cookie('disabled_plugins', ','.join(disabled_plugins), max_age=cookie_max_age)
564+ resp.set_cookie('allowed_plugins', ','.join(allowed_plugins), max_age=cookie_max_age)
525 resp.set_cookie(
566 resp.set_cookie(
526 'blocked_engines', ','.join('__'.join(e) for e in blocked_engines),
567 'blocked_engines', ','.join('__'.join(e) for e in blocked_engines),
527 max_age=cookie_max_age
568 max_age=cookie_max_age
@@ -571,6 +612,8 @@ def preferences():
571 autocomplete_backends=autocomplete_backends,
612 autocomplete_backends=autocomplete_backends,
572 shortcuts={y: x for x, y in engine_shortcuts.items()},
613 shortcuts={y: x for x, y in engine_shortcuts.items()},
573 themes=themes,
614 themes=themes,
616+ allowed_plugins=[plugin.id for plugin in request.user_plugins],
574 theme=get_current_theme_name())
617 theme=get_current_theme_name())