on master help sign in
Merge pull request #1246 from Venca24/devel_hash

[enh] add plugin converting strings into hash digests

commit9b872871feed190eeb8cdc2f96c63d0eebbe9913 authorNoémi Ványi <kvch@users.noreply.github.com> dateSat 24 Oct 2020, 14:16 (6 years ago) parent5707fba3557705
4 files changed+111−1
AUTHORS.rst+1−1 searx/plugins/__init__.py+2 searx/plugins/hash_plugin.py+54 tests/unit/test_plugins.py+54
AUTHORS.rst+1−1
@@ -96,7 +96,7 @@ generally made searx better:
9696- Alice Ferrazzi @aliceinwire
9797- @LiquidLemon
9898- @dadosch
99−- @Venca24
99+- Václav Zouzalík @Venca24
100100- @ZEROF
101101- Ivan Skytte Jørgensen @isj-privacore
102102- @miicha
searx/plugins/__init__.py+2
@@ -28,6 +28,7 @@ from searx import logger, settings, static_path
2828logger = logger.getChild('plugins')
2929
3030from searx.plugins import (oa_doi_rewrite,
31+ hash_plugin,
3132 https_rewrite,
3233 infinite_scroll,
3334 self_info,
@@ -163,6 +164,7 @@ def sha_sum(filename):
163164
164165plugins = PluginStore()
165166plugins.register(oa_doi_rewrite)
167+plugins.register(hash_plugin)
166168plugins.register(https_rewrite)
167169plugins.register(infinite_scroll)
168170plugins.register(self_info)
searx/plugins/hash_plugin.pynew file+54
@@ -0,0 +1,54 @@
1+'''
2+searx is free software: you can redistribute it and/or modify
3+it under the terms of the GNU Affero General Public License as published by
4+the Free Software Foundation, either version 3 of the License, or
5+(at your option) any later version.
6+
7+searx is distributed in the hope that it will be useful,
8+but WITHOUT ANY WARRANTY; without even the implied warranty of
9+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10+GNU Affero General Public License for more details.
11+
12+You should have received a copy of the GNU Affero General Public License
13+along with searx. If not, see < http://www.gnu.org/licenses/ >.
14+
15+(C) 2015 by Adam Tauber, <asciimoo@gmail.com>
16+(C) 2018, 2020 by Vaclav Zouzalik
17+'''
18+
19+from flask_babel import gettext
20+import hashlib
21+import re
22+
23+name = "Hash plugin"
24+description = gettext("Converts strings to different hash digests.")
25+default_on = True
26+
27+parser_re = re.compile('(md5|sha1|sha224|sha256|sha384|sha512) (.*)', re.I)
28+
29+
30+def post_search(request, search):
31+ # process only on first page
32+ if search.search_query.pageno > 1:
33+ return True
34+ m = parser_re.match(search.search_query.query)
35+ if not m:
36+ # wrong query
37+ return True
38+
39+ function, string = m.groups()
40+ if string.strip().__len__() == 0:
41+ # end if the string is empty
42+ return True
43+
44+ # select hash function
45+ f = hashlib.new(function.lower())
46+
47+ # make digest from the given string
48+ f.update(string.encode('utf-8').strip())
49+ answer = function + " " + gettext('hash digest') + ": " + f.hexdigest()
50+
51+ # print result
52+ search.result_container.answers.clear()
53+ search.result_container.answers['hash'] = {'answer': answer}
54+ return True
tests/unit/test_plugins.py+54
@@ -83,3 +83,57 @@ class SelfIPTest(SearxTestCase):
8383 search = get_search_mock(query='What is my User-Agent?', pageno=2)
8484 store.call(store.plugins, 'post_search', request, search)
8585 self.assertFalse('user-agent' in search.result_container.answers)
86+
87+
88+class HashPluginTest(SearxTestCase):
89+
90+ def test_PluginStore_init(self):
91+ store = plugins.PluginStore()
92+ store.register(plugins.hash_plugin)
93+
94+ self.assertTrue(len(store.plugins) == 1)
95+
96+ request = Mock(remote_addr='127.0.0.1')
97+ request.headers.getlist.return_value = []
98+
99+ # MD5
100+ search = get_search_mock(query='md5 test', pageno=1)
101+ store.call(store.plugins, 'post_search', request, search)
102+ self.assertTrue('md5 hash digest: 098f6bcd4621d373cade4e832627b4f6'
103+ in search.result_container.answers['hash']['answer'])
104+
105+ search = get_search_mock(query=b'md5 test', pageno=2)
106+ store.call(store.plugins, 'post_search', request, search)
107+ self.assertFalse('hash' in search.result_container.answers)
108+
109+ # SHA1
110+ search = get_search_mock(query='sha1 test', pageno=1)
111+ store.call(store.plugins, 'post_search', request, search)
112+ self.assertTrue('sha1 hash digest: a94a8fe5ccb19ba61c4c0873d391e9879'
113+ '82fbbd3' in search.result_container.answers['hash']['answer'])
114+
115+ # SHA224
116+ search = get_search_mock(query='sha224 test', pageno=1)
117+ store.call(store.plugins, 'post_search', request, search)
118+ self.assertTrue('sha224 hash digest: 90a3ed9e32b2aaf4c61c410eb9254261'
119+ '19e1a9dc53d4286ade99a809' in search.result_container.answers['hash']['answer'])
120+
121+ # SHA256
122+ search = get_search_mock(query='sha256 test', pageno=1)
123+ store.call(store.plugins, 'post_search', request, search)
124+ self.assertTrue('sha256 hash digest: 9f86d081884c7d659a2feaa0c55ad015a'
125+ '3bf4f1b2b0b822cd15d6c15b0f00a08' in search.result_container.answers['hash']['answer'])
126+
127+ # SHA384
128+ search = get_search_mock(query='sha384 test', pageno=1)
129+ store.call(store.plugins, 'post_search', request, search)
130+ self.assertTrue('sha384 hash digest: 768412320f7b0aa5812fce428dc4706b3c'
131+ 'ae50e02a64caa16a782249bfe8efc4b7ef1ccb126255d196047dfedf1'
132+ '7a0a9' in search.result_container.answers['hash']['answer'])
133+
134+ # SHA512
135+ search = get_search_mock(query='sha512 test', pageno=1)
136+ store.call(store.plugins, 'post_search', request, search)
137+ self.assertTrue('sha512 hash digest: ee26b0dd4af7e749aa1a8ee3c10ae9923f6'
138+ '18980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5'
139+ 'fa9ad8e6f57f50028a8ff' in search.result_container.answers['hash']['answer'])