Ignore invalid companion auth shapes (#1405)
This commit is contained in:
@@ -64,11 +64,16 @@ def find_admin_user() -> str | None:
|
|||||||
auth_path = os.path.join("data", "auth.json")
|
auth_path = os.path.join("data", "auth.json")
|
||||||
try:
|
try:
|
||||||
with open(auth_path, "r", encoding="utf-8") as f:
|
with open(auth_path, "r", encoding="utf-8") as f:
|
||||||
users = (json.load(f) or {}).get("users", {})
|
data = json.load(f)
|
||||||
except (OSError, json.JSONDecodeError):
|
except (OSError, json.JSONDecodeError):
|
||||||
return None
|
return None
|
||||||
|
if not isinstance(data, dict):
|
||||||
|
return None
|
||||||
|
users = data.get("users") or {}
|
||||||
|
if not isinstance(users, dict):
|
||||||
|
return None
|
||||||
for uname, udata in users.items():
|
for uname, udata in users.items():
|
||||||
if udata.get("is_admin") is True:
|
if isinstance(udata, dict) and udata.get("is_admin") is True:
|
||||||
return uname
|
return uname
|
||||||
return next(iter(users), None)
|
return next(iter(users), None)
|
||||||
|
|
||||||
|
|||||||
@@ -102,6 +102,16 @@ def test_pairing_payload_shape():
|
|||||||
assert p == {"v": 1, "host": "192.168.1.9", "port": 7000, "token": "ody_x"}
|
assert p == {"v": 1, "host": "192.168.1.9", "port": 7000, "token": "ody_x"}
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("payload", ["[]", '{"users": []}'])
|
||||||
|
def test_find_admin_user_ignores_invalid_auth_shape(tmp_path, monkeypatch, payload):
|
||||||
|
data_dir = tmp_path / "data"
|
||||||
|
data_dir.mkdir()
|
||||||
|
(data_dir / "auth.json").write_text(payload)
|
||||||
|
monkeypatch.chdir(tmp_path)
|
||||||
|
|
||||||
|
assert P.find_admin_user() is None
|
||||||
|
|
||||||
|
|
||||||
# --- admin-only gate: a bearer/non-admin caller is rejected ----------------
|
# --- admin-only gate: a bearer/non-admin caller is rejected ----------------
|
||||||
|
|
||||||
def _admin_mgr(is_admin):
|
def _admin_mgr(is_admin):
|
||||||
|
|||||||
Reference in New Issue
Block a user