From d2a636f75d24953f5094ea97ab54a8a4353a65ff Mon Sep 17 00:00:00 2001 From: Adam Tauber Date: Mon, 13 Apr 2015 00:30:12 +0200 Subject: [mod] https rewrite pluginification --- searx/plugins/__init__.py | 9 +- searx/plugins/https_rewrite.py | 227 +++ searx/plugins/https_rules/00README | 17 + searx/plugins/https_rules/Bing.xml | 56 + searx/plugins/https_rules/Dailymotion.xml | 69 + searx/plugins/https_rules/Deviantart.xml | 53 + searx/plugins/https_rules/DuckDuckGo.xml | 38 + searx/plugins/https_rules/Flickr.xml | 44 + searx/plugins/https_rules/Github-Pages.xml | 11 + searx/plugins/https_rules/Github.xml | 94 + searx/plugins/https_rules/Google-mismatches.xml | 26 + searx/plugins/https_rules/Google.org.xml | 14 + searx/plugins/https_rules/GoogleAPIs.xml | 143 ++ searx/plugins/https_rules/GoogleCanada.xml | 6 + searx/plugins/https_rules/GoogleImages.xml | 65 + searx/plugins/https_rules/GoogleMainSearch.xml | 78 + searx/plugins/https_rules/GoogleMaps.xml | 67 + searx/plugins/https_rules/GoogleMelange.xml | 6 + searx/plugins/https_rules/GoogleSearch.xml | 135 ++ searx/plugins/https_rules/GoogleServices.xml | 345 ++++ searx/plugins/https_rules/GoogleShopping.xml | 28 + searx/plugins/https_rules/GoogleSorry.xml | 7 + searx/plugins/https_rules/GoogleTranslate.xml | 8 + searx/plugins/https_rules/GoogleVideos.xml | 83 + searx/plugins/https_rules/GoogleWatchBlog.xml | 17 + searx/plugins/https_rules/Google_App_Engine.xml | 21 + searx/plugins/https_rules/Googleplex.com.xml | 16 + searx/plugins/https_rules/OpenStreetMap.xml | 15 + searx/plugins/https_rules/Rawgithub.com.xml | 14 + searx/plugins/https_rules/Soundcloud.xml | 101 + searx/plugins/https_rules/ThePirateBay.xml | 36 + searx/plugins/https_rules/Torproject.xml | 18 + searx/plugins/https_rules/Twitter.xml | 169 ++ searx/plugins/https_rules/Vimeo.xml | 75 + searx/plugins/https_rules/WikiLeaks.xml | 13 + searx/plugins/https_rules/Wikimedia.xml | 107 + searx/plugins/https_rules/Yahoo.xml | 2450 +++++++++++++++++++++++ searx/plugins/https_rules/YouTube.xml | 46 + 38 files changed, 4724 insertions(+), 3 deletions(-) create mode 100644 searx/plugins/https_rewrite.py create mode 100644 searx/plugins/https_rules/00README create mode 100644 searx/plugins/https_rules/Bing.xml create mode 100644 searx/plugins/https_rules/Dailymotion.xml create mode 100644 searx/plugins/https_rules/Deviantart.xml create mode 100644 searx/plugins/https_rules/DuckDuckGo.xml create mode 100644 searx/plugins/https_rules/Flickr.xml create mode 100644 searx/plugins/https_rules/Github-Pages.xml create mode 100644 searx/plugins/https_rules/Github.xml create mode 100644 searx/plugins/https_rules/Google-mismatches.xml create mode 100644 searx/plugins/https_rules/Google.org.xml create mode 100644 searx/plugins/https_rules/GoogleAPIs.xml create mode 100644 searx/plugins/https_rules/GoogleCanada.xml create mode 100644 searx/plugins/https_rules/GoogleImages.xml create mode 100644 searx/plugins/https_rules/GoogleMainSearch.xml create mode 100644 searx/plugins/https_rules/GoogleMaps.xml create mode 100644 searx/plugins/https_rules/GoogleMelange.xml create mode 100644 searx/plugins/https_rules/GoogleSearch.xml create mode 100644 searx/plugins/https_rules/GoogleServices.xml create mode 100644 searx/plugins/https_rules/GoogleShopping.xml create mode 100644 searx/plugins/https_rules/GoogleSorry.xml create mode 100644 searx/plugins/https_rules/GoogleTranslate.xml create mode 100644 searx/plugins/https_rules/GoogleVideos.xml create mode 100644 searx/plugins/https_rules/GoogleWatchBlog.xml create mode 100644 searx/plugins/https_rules/Google_App_Engine.xml create mode 100644 searx/plugins/https_rules/Googleplex.com.xml create mode 100644 searx/plugins/https_rules/OpenStreetMap.xml create mode 100644 searx/plugins/https_rules/Rawgithub.com.xml create mode 100644 searx/plugins/https_rules/Soundcloud.xml create mode 100644 searx/plugins/https_rules/ThePirateBay.xml create mode 100644 searx/plugins/https_rules/Torproject.xml create mode 100644 searx/plugins/https_rules/Twitter.xml create mode 100644 searx/plugins/https_rules/Vimeo.xml create mode 100644 searx/plugins/https_rules/WikiLeaks.xml create mode 100644 searx/plugins/https_rules/Wikimedia.xml create mode 100644 searx/plugins/https_rules/Yahoo.xml create mode 100644 searx/plugins/https_rules/YouTube.xml (limited to 'searx/plugins') diff --git a/searx/plugins/__init__.py b/searx/plugins/__init__.py index a8e400c93..5ac3f447c 100644 --- a/searx/plugins/__init__.py +++ b/searx/plugins/__init__.py @@ -14,13 +14,15 @@ along with searx. If not, see < http://www.gnu.org/licenses/ >. (C) 2015 by Adam Tauber, ''' -from searx.plugins import (self_ip, - search_on_category_select) -from searx import logger from sys import exit +from searx import logger logger = logger.getChild('plugins') +from searx.plugins import (https_rewrite, + self_ip, + search_on_category_select) + required_attrs = (('name', str), ('description', str), ('default_on', bool)) @@ -68,5 +70,6 @@ class PluginStore(): plugins = PluginStore() +plugins.register(https_rewrite) plugins.register(self_ip) plugins.register(search_on_category_select) diff --git a/searx/plugins/https_rewrite.py b/searx/plugins/https_rewrite.py new file mode 100644 index 000000000..409b122e6 --- /dev/null +++ b/searx/plugins/https_rewrite.py @@ -0,0 +1,227 @@ +''' +searx is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +searx is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with searx. If not, see < http://www.gnu.org/licenses/ >. + +(C) 2013- by Adam Tauber, +''' + +import re +from urlparse import urlparse +from lxml import etree +from os import listdir, environ +from os.path import isfile, isdir, join +from searx.plugins import logger +from flask.ext.babel import gettext +from searx import searx_dir + + +name = "HTTPS rewrite" +description = gettext('Rewrite HTTP links to HTTPS if possible') +default_on = True + +if 'SEARX_HTTPS_REWRITE_PATH' in environ: + rules_path = environ['SEARX_rules_path'] +else: + rules_path = join(searx_dir, 'plugins/https_rules') + +logger = logger.getChild("https_rewrite") + +# https://gitweb.torproject.org/\ +# pde/https-everywhere.git/tree/4.0:/src/chrome/content/rules + +# HTTPS rewrite rules +https_rules = [] + + +# load single ruleset from a xml file +def load_single_https_ruleset(rules_path): + ruleset = () + + # init parser + parser = etree.XMLParser() + + # load and parse xml-file + try: + tree = etree.parse(rules_path, parser) + except: + # TODO, error message + return () + + # get root node + root = tree.getroot() + + # check if root is a node with the name ruleset + # TODO improve parsing + if root.tag != 'ruleset': + return () + + # check if rule is deactivated by default + if root.attrib.get('default_off'): + return () + + # check if rule does only work for specific platforms + if root.attrib.get('platform'): + return () + + hosts = [] + rules = [] + exclusions = [] + + # parse childs from ruleset + for ruleset in root: + # this child define a target + if ruleset.tag == 'target': + # check if required tags available + if not ruleset.attrib.get('host'): + continue + + # convert host-rule to valid regex + host = ruleset.attrib.get('host')\ + .replace('.', '\.').replace('*', '.*') + + # append to host list + hosts.append(host) + + # this child define a rule + elif ruleset.tag == 'rule': + # check if required tags available + if not ruleset.attrib.get('from')\ + or not ruleset.attrib.get('to'): + continue + + # TODO hack, which convert a javascript regex group + # into a valid python regex group + rule_from = ruleset.attrib['from'].replace('$', '\\') + if rule_from.endswith('\\'): + rule_from = rule_from[:-1]+'$' + rule_to = ruleset.attrib['to'].replace('$', '\\') + if rule_to.endswith('\\'): + rule_to = rule_to[:-1]+'$' + + # TODO, not working yet because of the hack above, + # currently doing that in webapp.py + # rule_from_rgx = re.compile(rule_from, re.I) + + # append rule + try: + rules.append((re.compile(rule_from, re.I | re.U), rule_to)) + except: + # TODO log regex error + continue + + # this child define an exclusion + elif ruleset.tag == 'exclusion': + # check if required tags available + if not ruleset.attrib.get('pattern'): + continue + + exclusion_rgx = re.compile(ruleset.attrib.get('pattern')) + + # append exclusion + exclusions.append(exclusion_rgx) + + # convert list of possible hosts to a simple regex + # TODO compress regex to improve performance + try: + target_hosts = re.compile('^(' + '|'.join(hosts) + ')', re.I | re.U) + except: + return () + + # return ruleset + return (target_hosts, rules, exclusions) + + +# load all https rewrite rules +def load_https_rules(rules_path): + # check if directory exists + if not isdir(rules_path): + logger.error("directory not found: '" + rules_path + "'") + return + + # search all xml files which are stored in the https rule directory + xml_files = [join(rules_path, f) + for f in listdir(rules_path) + if isfile(join(rules_path, f)) and f[-4:] == '.xml'] + + # load xml-files + for ruleset_file in xml_files: + # calculate rewrite-rules + ruleset = load_single_https_ruleset(ruleset_file) + + # skip if no ruleset returned + if not ruleset: + continue + + # append ruleset + https_rules.append(ruleset) + + logger.info('{n} rules loaded'.format(n=len(https_rules))) + + +def https_url_rewrite(result): + skip_https_rewrite = False + # check if HTTPS rewrite is possible + for target, rules, exclusions in https_rules: + + # check if target regex match with url + if target.match(result['parsed_url'].netloc): + # process exclusions + for exclusion in exclusions: + # check if exclusion match with url + if exclusion.match(result['url']): + skip_https_rewrite = True + break + + # skip https rewrite if required + if skip_https_rewrite: + break + + # process rules + for rule in rules: + try: + new_result_url = rule[0].sub(rule[1], result['url']) + except: + break + + # parse new url + new_parsed_url = urlparse(new_result_url) + + # continiue if nothing was rewritten + if result['url'] == new_result_url: + continue + + # get domainname from result + # TODO, does only work correct with TLD's like + # asdf.com, not for asdf.com.de + # TODO, using publicsuffix instead of this rewrite rule + old_result_domainname = '.'.join( + result['parsed_url'].hostname.split('.')[-2:]) + new_result_domainname = '.'.join( + new_parsed_url.hostname.split('.')[-2:]) + + # check if rewritten hostname is the same, + # to protect against wrong or malicious rewrite rules + if old_result_domainname == new_result_domainname: + # set new url + result['url'] = new_result_url + + # target has matched, do not search over the other rules + break + return result + + +def on_result(request, ctx): + result = ctx['result'] + if result['parsed_url'].scheme == 'http': + https_url_rewrite(result) + return True diff --git a/searx/plugins/https_rules/00README b/searx/plugins/https_rules/00README new file mode 100644 index 000000000..fcd8a7724 --- /dev/null +++ b/searx/plugins/https_rules/00README @@ -0,0 +1,17 @@ + diff --git a/searx/plugins/https_rules/Bing.xml b/searx/plugins/https_rules/Bing.xml new file mode 100644 index 000000000..8b403f108 --- /dev/null +++ b/searx/plugins/https_rules/Bing.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + diff --git a/searx/plugins/https_rules/Dailymotion.xml b/searx/plugins/https_rules/Dailymotion.xml new file mode 100644 index 000000000..743100cb7 --- /dev/null +++ b/searx/plugins/https_rules/Dailymotion.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/searx/plugins/https_rules/Deviantart.xml b/searx/plugins/https_rules/Deviantart.xml new file mode 100644 index 000000000..7830fc20f --- /dev/null +++ b/searx/plugins/https_rules/Deviantart.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/searx/plugins/https_rules/DuckDuckGo.xml b/searx/plugins/https_rules/DuckDuckGo.xml new file mode 100644 index 000000000..173a9ad9f --- /dev/null +++ b/searx/plugins/https_rules/DuckDuckGo.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/searx/plugins/https_rules/Flickr.xml b/searx/plugins/https_rules/Flickr.xml new file mode 100644 index 000000000..85c6e8065 --- /dev/null +++ b/searx/plugins/https_rules/Flickr.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/searx/plugins/https_rules/Github-Pages.xml b/searx/plugins/https_rules/Github-Pages.xml new file mode 100644 index 000000000..d3be58a4c --- /dev/null +++ b/searx/plugins/https_rules/Github-Pages.xml @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/searx/plugins/https_rules/Github.xml b/searx/plugins/https_rules/Github.xml new file mode 100644 index 000000000..a9a3a1e53 --- /dev/null +++ b/searx/plugins/https_rules/Github.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/searx/plugins/https_rules/Google-mismatches.xml b/searx/plugins/https_rules/Google-mismatches.xml new file mode 100644 index 000000000..de9d3eb18 --- /dev/null +++ b/searx/plugins/https_rules/Google-mismatches.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + diff --git a/searx/plugins/https_rules/Google.org.xml b/searx/plugins/https_rules/Google.org.xml new file mode 100644 index 000000000..d6cc47881 --- /dev/null +++ b/searx/plugins/https_rules/Google.org.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/searx/plugins/https_rules/GoogleAPIs.xml b/searx/plugins/https_rules/GoogleAPIs.xml new file mode 100644 index 000000000..85a5a8081 --- /dev/null +++ b/searx/plugins/https_rules/GoogleAPIs.xml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/searx/plugins/https_rules/GoogleCanada.xml b/searx/plugins/https_rules/GoogleCanada.xml new file mode 100644 index 000000000..d5eefe816 --- /dev/null +++ b/searx/plugins/https_rules/GoogleCanada.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/searx/plugins/https_rules/GoogleImages.xml b/searx/plugins/https_rules/GoogleImages.xml new file mode 100644 index 000000000..0112001e0 --- /dev/null +++ b/searx/plugins/https_rules/GoogleImages.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/searx/plugins/https_rules/GoogleMainSearch.xml b/searx/plugins/https_rules/GoogleMainSearch.xml new file mode 100644 index 000000000..df504d90c --- /dev/null +++ b/searx/plugins/https_rules/GoogleMainSearch.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/searx/plugins/https_rules/GoogleMaps.xml b/searx/plugins/https_rules/GoogleMaps.xml new file mode 100644 index 000000000..0f82c5267 --- /dev/null +++ b/searx/plugins/https_rules/GoogleMaps.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/searx/plugins/https_rules/GoogleMelange.xml b/searx/plugins/https_rules/GoogleMelange.xml new file mode 100644 index 000000000..ec23cd45f --- /dev/null +++ b/searx/plugins/https_rules/GoogleMelange.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/searx/plugins/https_rules/GoogleSearch.xml b/searx/plugins/https_rules/GoogleSearch.xml new file mode 100644 index 000000000..66b7ffdb0 --- /dev/null +++ b/searx/plugins/https_rules/GoogleSearch.xml @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/searx/plugins/https_rules/GoogleServices.xml b/searx/plugins/https_rules/GoogleServices.xml new file mode 100644 index 000000000..704646b53 --- /dev/null +++ b/searx/plugins/https_rules/GoogleServices.xml @@ -0,0 +1,345 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/searx/plugins/https_rules/GoogleShopping.xml b/searx/plugins/https_rules/GoogleShopping.xml new file mode 100644 index 000000000..6ba69a91d --- /dev/null +++ b/searx/plugins/https_rules/GoogleShopping.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/searx/plugins/https_rules/GoogleSorry.xml b/searx/plugins/https_rules/GoogleSorry.xml new file mode 100644 index 000000000..72a19210d --- /dev/null +++ b/searx/plugins/https_rules/GoogleSorry.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/searx/plugins/https_rules/GoogleTranslate.xml b/searx/plugins/https_rules/GoogleTranslate.xml new file mode 100644 index 000000000..a004025ae --- /dev/null +++ b/searx/plugins/https_rules/GoogleTranslate.xml @@ -0,0 +1,8 @@ + + + + + + + diff --git a/searx/plugins/https_rules/GoogleVideos.xml b/searx/plugins/https_rules/GoogleVideos.xml new file mode 100644 index 000000000..a5e88fcf0 --- /dev/null +++ b/searx/plugins/https_rules/GoogleVideos.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/searx/plugins/https_rules/GoogleWatchBlog.xml b/searx/plugins/https_rules/GoogleWatchBlog.xml new file mode 100644 index 000000000..afec70c97 --- /dev/null +++ b/searx/plugins/https_rules/GoogleWatchBlog.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/searx/plugins/https_rules/Google_App_Engine.xml b/searx/plugins/https_rules/Google_App_Engine.xml new file mode 100644 index 000000000..851e051d1 --- /dev/null +++ b/searx/plugins/https_rules/Google_App_Engine.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/searx/plugins/https_rules/Googleplex.com.xml b/searx/plugins/https_rules/Googleplex.com.xml new file mode 100644 index 000000000..7ddbb5ba9 --- /dev/null +++ b/searx/plugins/https_rules/Googleplex.com.xml @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/searx/plugins/https_rules/OpenStreetMap.xml b/searx/plugins/https_rules/OpenStreetMap.xml new file mode 100644 index 000000000..58a661823 --- /dev/null +++ b/searx/plugins/https_rules/OpenStreetMap.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/searx/plugins/https_rules/Rawgithub.com.xml b/searx/plugins/https_rules/Rawgithub.com.xml new file mode 100644 index 000000000..3868f332a --- /dev/null +++ b/searx/plugins/https_rules/Rawgithub.com.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/searx/plugins/https_rules/Soundcloud.xml b/searx/plugins/https_rules/Soundcloud.xml new file mode 100644 index 000000000..6958e8cbc --- /dev/null +++ b/searx/plugins/https_rules/Soundcloud.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/searx/plugins/https_rules/ThePirateBay.xml b/searx/plugins/https_rules/ThePirateBay.xml new file mode 100644 index 000000000..010387b6b --- /dev/null +++ b/searx/plugins/https_rules/ThePirateBay.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/searx/plugins/https_rules/Torproject.xml b/searx/plugins/https_rules/Torproject.xml new file mode 100644 index 000000000..69269af7e --- /dev/null +++ b/searx/plugins/https_rules/Torproject.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + diff --git a/searx/plugins/https_rules/Twitter.xml b/searx/plugins/https_rules/Twitter.xml new file mode 100644 index 000000000..3285f44e0 --- /dev/null +++ b/searx/plugins/https_rules/Twitter.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/searx/plugins/https_rules/Vimeo.xml b/searx/plugins/https_rules/Vimeo.xml new file mode 100644 index 000000000..f2a3e5764 --- /dev/null +++ b/searx/plugins/https_rules/Vimeo.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/searx/plugins/https_rules/WikiLeaks.xml b/searx/plugins/https_rules/WikiLeaks.xml new file mode 100644 index 000000000..977709d2d --- /dev/null +++ b/searx/plugins/https_rules/WikiLeaks.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/searx/plugins/https_rules/Wikimedia.xml b/searx/plugins/https_rules/Wikimedia.xml new file mode 100644 index 000000000..9f25831a2 --- /dev/null +++ b/searx/plugins/https_rules/Wikimedia.xml @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/searx/plugins/https_rules/Yahoo.xml b/searx/plugins/https_rules/Yahoo.xml new file mode 100644 index 000000000..33548c4ab --- /dev/null +++ b/searx/plugins/https_rules/Yahoo.xml @@ -0,0 +1,2450 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/searx/plugins/https_rules/YouTube.xml b/searx/plugins/https_rules/YouTube.xml new file mode 100644 index 000000000..bddc2a5f3 --- /dev/null +++ b/searx/plugins/https_rules/YouTube.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3