fix: harden endpoints against malformed input (final-review findings)

- /api/repeaters: bad ?limit= falls back to 25 instead of crashing the handler
- repeaters.load(): tolerate a corrupted repeaters.json (JSONDecodeError -> [])
- tune_repeater/do_POST: catch TypeError so a null field yields {ok:false} not a reset
This commit is contained in:
2026-06-14 16:29:10 -04:00
parent e28dae2ba4
commit 5d48ad0bfe
3 changed files with 7 additions and 4 deletions
+1 -1
View File
@@ -196,7 +196,7 @@ class Radio:
def attempt(name, fn):
try:
fn(); steps[name] = True
except (CIVError, ValueError, OSError) as e:
except (CIVError, ValueError, TypeError, OSError) as e:
steps[name] = False; errors[name] = str(e)
attempt("freq", lambda: self.set_frequency(int(round(rec["output_mhz"] * 1e6))))
+1 -1
View File
@@ -72,7 +72,7 @@ def load(path):
try:
with open(path) as f:
data = json.load(f)
except FileNotFoundError:
except (FileNotFoundError, json.JSONDecodeError):
return []
return data if isinstance(data, list) else data.get("repeaters", [])
+5 -2
View File
@@ -90,7 +90,10 @@ class Handler(BaseHTTPRequestHandler):
from urllib.parse import urlparse, parse_qs
qs = parse_qs(urlparse(self.path).query)
q = qs.get("q", [""])[0]
limit = int(qs.get("limit", ["25"])[0])
try:
limit = int(qs.get("limit", ["25"])[0])
except ValueError:
limit = 25
recs = repeaters.search(repeaters.load(REPEATERS_JSON), q, limit)
self._json({"ok": True, "repeaters": recs})
else:
@@ -101,7 +104,7 @@ class Handler(BaseHTTPRequestHandler):
try:
body = json.loads(self.rfile.read(length) or b"{}")
self._json(apply_control(self.path, body))
except (CIVError, OSError, ValueError, KeyError) as e:
except (CIVError, OSError, ValueError, TypeError, KeyError) as e:
self._json({"ok": False, "error": str(e)}, 200)