Validate settings.json keys on startup, closes #1816

Refs #1814
This commit is contained in:
Simon Willison 2022-09-19 16:46:39 -07:00
commit df851c117d
2 changed files with 22 additions and 2 deletions

View file

@ -292,6 +292,10 @@ class Datasette:
raise StartupError("config.json should be renamed to settings.json") raise StartupError("config.json should be renamed to settings.json")
if config_dir and (config_dir / "settings.json").exists() and not settings: if config_dir and (config_dir / "settings.json").exists() and not settings:
settings = json.loads((config_dir / "settings.json").read_text()) 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._settings = dict(DEFAULT_SETTINGS, **(settings or {}))
self.renderers = {} # File extension -> (renderer, can_render) functions self.renderers = {} # File extension -> (renderer, can_render) functions
self.version_note = version_note self.version_note = version_note

View file

@ -5,6 +5,7 @@ import pytest
from datasette.app import Datasette from datasette.app import Datasette
from datasette.cli import cli from datasette.cli import cli
from datasette.utils.sqlite import sqlite3 from datasette.utils.sqlite import sqlite3
from datasette.utils import StartupError
from .fixtures import TestClient as _TestClient from .fixtures import TestClient as _TestClient
from click.testing import CliRunner from click.testing import CliRunner
@ -27,9 +28,8 @@ body { margin-top: 3em}
@pytest.fixture(scope="session") @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") config_dir = tmp_path_factory.mktemp("config-dir")
plugins_dir = config_dir / "plugins" plugins_dir = config_dir / "plugins"
plugins_dir.mkdir() plugins_dir.mkdir()
(plugins_dir / "hooray.py").write_text(PLUGIN, "utf-8") (plugins_dir / "hooray.py").write_text(PLUGIN, "utf-8")
@ -77,7 +77,23 @@ def config_dir_client(tmp_path_factory):
), ),
"utf-8", "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) ds = Datasette([], config_dir=config_dir)
yield _TestClient(ds) yield _TestClient(ds)