From 6d7e86eece852a525ac2ec3c191aca57712ac1a7 Mon Sep 17 00:00:00 2001 From: Markus Heiser Date: Tue, 11 Jan 2022 08:55:10 +0100 Subject: [fix] get_bang_url: handle ambiguous !!bangs without error An ambiguous bang like `!!d` raises an exception in function get_bang_url(). A bang is only unique when the bang_definition from get_bang_definition_and_ac() is a string / for a ambiguous bang the returned bang_definition is a dictionary. Reported-by: user prg at #searxng:matrix.org on 2022/01/11 Signed-off-by: Markus Heiser --- searx/external_bang.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'searx/external_bang.py') diff --git a/searx/external_bang.py b/searx/external_bang.py index f8e872693..ec5a46ed0 100644 --- a/searx/external_bang.py +++ b/searx/external_bang.py @@ -77,11 +77,14 @@ def get_bang_url(search_query, external_bangs_db=None): :param search_query: This is a search_query object which contains preferences and the submitted queries. :return: None if the bang was invalid, else a string of the redirect url. """ + ret_val = None + if external_bangs_db is None: external_bangs_db = EXTERNAL_BANGS if search_query.external_bang: bang_definition, _ = get_bang_definition_and_ac(external_bangs_db, search_query.external_bang) - return resolve_bang_definition(bang_definition, search_query.query)[0] if bang_definition else None + if bang_definition and isinstance(bang_definition, str): + ret_val = resolve_bang_definition(bang_definition, search_query.query)[0] - return None + return ret_val -- cgit v1.2.3 From 7cdd31440e621937550072c3f73e68f644554842 Mon Sep 17 00:00:00 2001 From: Markus Heiser Date: Wed, 12 Jan 2022 18:08:48 +0100 Subject: [fix] external bangs: don't overwrite Bangs in data trie Bangs with a `*` suffix (e.g. `!!d*`) overwrite Bangs with the same prefix (e.g. `!!d`) [1]. This can be avoid when a non printable character is used to tag a LEAF_KEY. [1] https://github.com/searxng/searxng/pull/740#issuecomment-1010411888 Signed-off-by: Markus Heiser --- searx/external_bang.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'searx/external_bang.py') diff --git a/searx/external_bang.py b/searx/external_bang.py index ec5a46ed0..a56737c73 100644 --- a/searx/external_bang.py +++ b/searx/external_bang.py @@ -2,6 +2,8 @@ from searx.data import EXTERNAL_BANGS +LEAF_KEY = chr(16) + def get_node(external_bangs_db, bang): node = external_bangs_db['trie'] @@ -26,8 +28,8 @@ def get_bang_definition_and_ac(external_bangs_db, bang): if k.startswith(after): bang_ac_list.append(before + k) elif isinstance(node, dict): - bang_definition = node.get('*') - bang_ac_list = [before + k for k in node.keys() if k != '*'] + bang_definition = node.get(LEAF_KEY) + bang_ac_list = [before + k for k in node.keys() if k != LEAF_KEY] elif isinstance(node, str): bang_definition = node bang_ac_list = [] -- cgit v1.2.3