Validate settings.json keys on startup, closes #1816

Refs #1814
pull/1835/head
Simon Willison 2022-09-19 16:46:39 -07:00
rodzic ddc999ad12
commit df851c117d
2 zmienionych plików z 22 dodań i 2 usunięć

Wyświetl plik

@ -292,6 +292,10 @@ class Datasette:
raise StartupError("config.json should be renamed to settings.json")
if config_dir and (config_dir / "settings.json").exists() and not settings:
settings = json.loads((config_dir / "settings.json").read_text())
# Validate those settings
for key in settings:
if key not in DEFAULT_SETTINGS:
raise StartupError("Invalid setting '{key}' in settings.json")
self._settings = dict(DEFAULT_SETTINGS, **(settings or {}))
self.renderers = {} # File extension -> (renderer, can_render) functions
self.version_note = version_note

Wyświetl plik

@ -5,6 +5,7 @@ import pytest
from datasette.app import Datasette
from datasette.cli import cli
from datasette.utils.sqlite import sqlite3
from datasette.utils import StartupError
from .fixtures import TestClient as _TestClient
from click.testing import CliRunner
@ -27,9 +28,8 @@ body { margin-top: 3em}
@pytest.fixture(scope="session")
def config_dir_client(tmp_path_factory):
def config_dir(tmp_path_factory):
config_dir = tmp_path_factory.mktemp("config-dir")
plugins_dir = config_dir / "plugins"
plugins_dir.mkdir()
(plugins_dir / "hooray.py").write_text(PLUGIN, "utf-8")
@ -77,7 +77,23 @@ def config_dir_client(tmp_path_factory):
),
"utf-8",
)
return config_dir
def test_invalid_settings(config_dir):
previous = (config_dir / "settings.json").read_text("utf-8")
(config_dir / "settings.json").write_text(
json.dumps({"invalid": "invalid-setting"}), "utf-8"
)
try:
with pytest.raises(StartupError):
ds = Datasette([], config_dir=config_dir)
finally:
(config_dir / "settings.json").write_text(previous, "utf-8")
@pytest.fixture(scope="session")
def config_dir_client(config_dir):
ds = Datasette([], config_dir=config_dir)
yield _TestClient(ds)