mirror of
https://github.com/ChuckBuilds/LEDMatrix.git
synced 2026-08-07 19:58:08 +00:00
fix(backup): address CodeRabbit and CodeQL findings on PR #439
- first_time_install.sh: verify chown/chmod succeed and the final owner/group/mode on config_secrets.json before reporting success; exit with a clear error otherwise instead of swallowing failures. - api_v3.py: replace the predictable .writetest probe with an exclusive NamedTemporaryFile to avoid a race with concurrent resolvers; log the preferred/fallback export path and OSError when falling back to the reinstall-deleted directory. - api_v3.py: mark a restore as failed when plugin reinstalls fail, even if file restoration itself succeeded, so the endpoint no longer reports HTTP 200 success on a partial restore. - api_v3.py: stringify plugin IDs before joining them into the error message so a malformed backup's non-string plugin_id can't raise a TypeError and mask the detailed response. - backup_manager.py / api_v3.py: stop putting raw exception text (originating from a user-controlled backup file) into restore results returned to the client; log full details server-side instead. Addresses the CodeQL "stack trace information exposure" alert. - test coverage: add a test for get_plugin_info() resolving a manifest id, and assert the disabled restore_wifi path also skips and omits ytm_auth.json.
This commit is contained in:
@@ -283,6 +283,10 @@ def test_restore_honors_options(project: Path, empty_project: Path, tmp_path: Pa
|
||||
assert result.plugins_to_install == []
|
||||
assert "secrets" in result.skipped
|
||||
assert "wifi" in result.skipped
|
||||
# ytm_auth rides on restore_wifi rather than its own flag -- disabling
|
||||
# wifi restore must not leave a stale session token behind.
|
||||
assert "ytm_auth" in result.skipped
|
||||
assert not (empty_project / "config" / "ytm_auth.json").exists()
|
||||
|
||||
|
||||
def test_restore_rejects_malicious_zip(empty_project: Path, tmp_path: Path) -> None:
|
||||
|
||||
@@ -75,6 +75,13 @@ def _ids(entry: Optional[Dict[str, Any]]) -> Optional[str]:
|
||||
|
||||
|
||||
class TestRegistryLookupByManifestId:
|
||||
def test_get_plugin_info_resolves_manifest_id(self, store: PluginStoreManager) -> None:
|
||||
"""get_plugin_info() delegates to the same lookup as get_registry_info()."""
|
||||
assert (
|
||||
_ids(store.get_plugin_info("ledmatrix-weather", fetch_latest_from_github=False))
|
||||
== "weather"
|
||||
)
|
||||
|
||||
def test_exact_registry_id_still_resolves(self, store: PluginStoreManager) -> None:
|
||||
assert _ids(store.get_registry_info("weather")) == "weather"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user