diff --git a/searx/engines/bing_images.py b/searx/engines/bing_images.py index 9d1c22f5a..b8c61c151 100644 --- a/searx/engines/bing_images.py +++ b/searx/engines/bing_images.py @@ -21,12 +21,18 @@ import re # engine dependent config categories = ['images'] paging = True +safesearch = True # search-url base_url = 'https://www.bing.com/' search_string = 'images/search?{query}&count=10&first={offset}' thumb_url = "http://ts1.mm.bing.net/th?id={ihk}" +# safesearch definitions +safesearch_types = {2: 'STRICT', + 1: 'DEMOTE', + 0: 'OFF'} + # do search-request def request(query, params): @@ -43,7 +49,8 @@ def request(query, params): offset=offset) params['cookies']['SRCHHPGUSR'] = \ - 'NEWWND=0&NRSLT=-1&SRCHLANG=' + language.split('-')[0] + 'NEWWND=0&NRSLT=-1&SRCHLANG=' + language.split('-')[0] +\ + '&ADLT=' + safesearch_types.get(params['safesearch'], 'DEMOTE') params['url'] = base_url + search_path diff --git a/searx/engines/blekko_images.py b/searx/engines/blekko_images.py index 2bae9c35e..2e7ec904f 100644 --- a/searx/engines/blekko_images.py +++ b/searx/engines/blekko_images.py @@ -14,11 +14,17 @@ from urllib import urlencode # engine dependent config categories = ['images'] paging = True +safesearch = True # search-url base_url = 'https://blekko.com' search_url = '/api/images?{query}&c={c}' +# safesearch definitions +safesearch_types = {2: '1', + 1: '', + 0: '0'} + # do search-request def request(query, params): @@ -31,6 +37,12 @@ def request(query, params): if params['pageno'] != 1: params['url'] += '&page={pageno}'.format(pageno=(params['pageno']-1)) + # let Blekko know we wan't have profiling + params['cookies']['tag_lesslogging'] = '1' + + # parse safesearch argument + params['cookies']['safesearch'] = safesearch_types.get(params['safesearch'], '') + return params diff --git a/searx/engines/google_images.py b/searx/engines/google_images.py index 092ae6639..1c0e62f5c 100644 --- a/searx/engines/google_images.py +++ b/searx/engines/google_images.py @@ -15,18 +15,25 @@ from json import loads # engine dependent config categories = ['images'] paging = True +safesearch = True # search-url url = 'https://ajax.googleapis.com/' -search_url = url + 'ajax/services/search/images?v=1.0&start={offset}&rsz=large&safe=off&filter=off&{query}' +search_url = url + 'ajax/services/search/images?v=1.0&start={offset}&rsz=large&safe={safesearch}&filter=off&{query}' # do search-request def request(query, params): offset = (params['pageno'] - 1) * 8 + if params['safesearch'] == 0: + safesearch = 'off' + else: + safesearch = 'on' + params['url'] = search_url.format(query=urlencode({'q': query}), - offset=offset) + offset=offset, + safesearch=safesearch) return params diff --git a/searx/search.py b/searx/search.py index 1b16ee02f..79a8ae0a9 100644 --- a/searx/search.py +++ b/searx/search.py @@ -457,6 +457,11 @@ class Search(object): request_params['started'] = time() request_params['pageno'] = self.pageno request_params['language'] = self.lang + try: + # 0 = None, 1 = Moderate, 2 = Strict + request_params['safesearch'] = int(request.cookies.get('safesearch', 1)) + except ValueError: + request_params['safesearch'] = 1 # update request parameters dependent on # search-engine (contained in engines folder) diff --git a/searx/templates/courgette/preferences.html b/searx/templates/courgette/preferences.html index 198bc7ead..18406672c 100644 --- a/searx/templates/courgette/preferences.html +++ b/searx/templates/courgette/preferences.html @@ -59,6 +59,16 @@

+
+ {{ _('SafeSearch') }} +

+ +

+
{{ _('Themes') }}

diff --git a/searx/templates/default/preferences.html b/searx/templates/default/preferences.html index 112849c3d..8ac6a895c 100644 --- a/searx/templates/default/preferences.html +++ b/searx/templates/default/preferences.html @@ -60,6 +60,16 @@

+
+ {{ _('SafeSearch') }} +

+ +

+
{{ _('Themes') }}

diff --git a/searx/templates/oscar/preferences.html b/searx/templates/oscar/preferences.html index 41656463c..ecb483ebb 100644 --- a/searx/templates/oscar/preferences.html +++ b/searx/templates/oscar/preferences.html @@ -87,6 +87,17 @@ {{ _('Change how forms are submited, learn more about request methods') }} +

+ +
+ +
+ {{ _('Filter explicite content') }} +
diff --git a/searx/tests/engines/test_bing_images.py b/searx/tests/engines/test_bing_images.py index 59c134623..a1d96b06e 100644 --- a/searx/tests/engines/test_bing_images.py +++ b/searx/tests/engines/test_bing_images.py @@ -12,6 +12,7 @@ class TestBingImagesEngine(SearxTestCase): dicto = defaultdict(dict) dicto['pageno'] = 1 dicto['language'] = 'fr_FR' + dicto['safesearch'] = 1 params = bing_images.request(query, dicto) self.assertTrue('url' in params) self.assertTrue(query in params['url']) diff --git a/searx/tests/engines/test_blekko_images.py b/searx/tests/engines/test_blekko_images.py index 6a5388aae..793fadbad 100644 --- a/searx/tests/engines/test_blekko_images.py +++ b/searx/tests/engines/test_blekko_images.py @@ -10,6 +10,7 @@ class TestBlekkoImagesEngine(SearxTestCase): query = 'test_query' dicto = defaultdict(dict) dicto['pageno'] = 0 + dicto['safesearch'] = 1 params = blekko_images.request(query, dicto) self.assertTrue('url' in params) self.assertTrue(query in params['url']) diff --git a/searx/webapp.py b/searx/webapp.py index 253e50486..861f3aa29 100644 --- a/searx/webapp.py +++ b/searx/webapp.py @@ -267,6 +267,8 @@ def render(template_name, override_theme=None, **kwargs): kwargs['method'] = request.cookies.get('method', 'POST') + kwargs['safesearch'] = request.cookies.get('safesearch', '1') + # override url_for function in templates kwargs['url_for'] = url_for_theme @@ -471,6 +473,8 @@ def preferences(): locale = None autocomplete = '' method = 'POST' + safesearch = '1' + for pd_name, pd in request.form.items(): if pd_name.startswith('category_'): category = pd_name[9:] @@ -489,6 +493,8 @@ def preferences(): 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) @@ -530,6 +536,8 @@ def preferences(): 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)