Fix: don't crash when engine or name is missing in settings.yml

SearXNG crashes if the engine or name fields are missing.
With this commit, the app displays an error in the log and keeps loading.

Close #1951
This commit is contained in:
Alexandre Flament 2022-12-04 23:43:59 +01:00
parent ffb72dfdf7
commit 269326063a
2 changed files with 31 additions and 2 deletions

View file

@ -106,8 +106,12 @@ def load_engine(engine_data: dict) -> Optional[Engine]:
- required attribute is not set :py:func:`is_missing_required_attributes` - required attribute is not set :py:func:`is_missing_required_attributes`
""" """
# pylint: disable=too-many-return-statements
engine_name = engine_data['name'] engine_name = engine_data.get('name')
if engine_name is None:
logger.error('An engine does not have a "name" field')
return None
if '_' in engine_name: if '_' in engine_name:
logger.error('Engine name contains underscore: "{}"'.format(engine_name)) logger.error('Engine name contains underscore: "{}"'.format(engine_name))
return None return None
@ -118,7 +122,10 @@ def load_engine(engine_data: dict) -> Optional[Engine]:
engine_data['name'] = engine_name engine_data['name'] = engine_name
# load_module # load_module
engine_module = engine_data['engine'] engine_module = engine_data.get('engine')
if engine_module is None:
logger.error('The "engine" field is missing for the engine named "{}"'.format(engine_name))
return None
try: try:
engine = load_module(engine_module + '.py', ENGINE_DIR) engine = load_module(engine_module + '.py', ENGINE_DIR)
except (SyntaxError, KeyboardInterrupt, SystemExit, SystemError, ImportError, RuntimeError): except (SyntaxError, KeyboardInterrupt, SystemExit, SystemError, ImportError, RuntimeError):

View file

@ -53,3 +53,25 @@ class TestEnginesInit(SearxTestCase):
self.assertIn('onions', engines.categories) self.assertIn('onions', engines.categories)
self.assertIn('http://engine1.onion', engines.engines['engine1'].search_url) self.assertIn('http://engine1.onion', engines.engines['engine1'].search_url)
self.assertEqual(engines.engines['engine1'].timeout, 120.0) self.assertEqual(engines.engines['engine1'].timeout, 120.0)
def test_missing_name_field(self):
settings['outgoing']['using_tor_proxy'] = False
engine_list = [
{'engine': 'dummy', 'shortcut': 'e1', 'categories': 'general'},
]
with self.assertLogs('searx.engines', level='ERROR') as cm:
engines.load_engines(engine_list)
self.assertEqual(len(engines.engines), 0)
self.assertEqual(cm.output, ['ERROR:searx.engines:An engine does not have a "name" field'])
def test_missing_engine_field(self):
settings['outgoing']['using_tor_proxy'] = False
engine_list = [
{'name': 'engine2', 'shortcut': 'e2', 'categories': 'onions'},
]
with self.assertLogs('searx.engines', level='ERROR') as cm:
engines.load_engines(engine_list)
self.assertEqual(len(engines.engines), 0)
self.assertEqual(
cm.output, ['ERROR:searx.engines:The "engine" field is missing for the engine named "engine2"']
)