Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 8 additions & 5 deletions app.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import argparse
import copy
import hmac
import math
import os
import re
import shutil
Expand Down Expand Up @@ -227,7 +228,7 @@ def normalize_text_scale(value: Any) -> int:
"""Return a supported dashboard text scale percentage."""
try:
scale = int(value)
except (TypeError, ValueError):
except (TypeError, ValueError, OverflowError):
scale = TEXT_SCALE_DEFAULT
return max(TEXT_SCALE_MIN, min(TEXT_SCALE_MAX, scale))

Expand All @@ -236,7 +237,7 @@ def clamp_int_range(value: Any, default: int, minimum: int, maximum: int) -> int
"""Return an integer clamped to a safe inclusive range."""
try:
number = int(value)
except (TypeError, ValueError):
except (TypeError, ValueError, OverflowError):
number = default
return max(minimum, min(maximum, number))

Expand All @@ -254,7 +255,7 @@ def page_refresh_seconds(value: Any = None) -> int:
value = config.get("refresh", {}).get("auto_refresh_page_ms", 300000)
try:
seconds = int(value) // 1000
except (TypeError, ValueError):
except (TypeError, ValueError, OverflowError):
seconds = 300
return clamp_int_range(seconds, 300, 30, 3600)

Expand Down Expand Up @@ -295,6 +296,8 @@ def config_bool(value: Any, default: bool = False) -> bool:
return False
return default
if isinstance(value, (int, float)):
if not math.isfinite(value):
return default
return bool(value)
return default

Expand Down Expand Up @@ -481,7 +484,7 @@ def status_stale_after_seconds() -> int:
value = config.get("vibe", {}).get("stale_after_seconds", 900)
try:
return max(60, int(value))
except (TypeError, ValueError):
except (TypeError, ValueError, OverflowError):
return 900


Expand All @@ -491,7 +494,7 @@ def codex_session_file_limit(value: Any = None) -> int:
value = config.get("codex", {}).get("session_file_limit", 10)
try:
limit = int(value)
except (TypeError, ValueError):
except (TypeError, ValueError, OverflowError):
limit = 10
return max(1, min(100, limit))

Expand Down
20 changes: 20 additions & 0 deletions tests/test_vibe_status.py
Original file line number Diff line number Diff line change
Expand Up @@ -210,14 +210,20 @@ def test_normalize_text_scale_clamps_to_supported_range(self):
self.assertEqual(app.normalize_text_scale("10"), app.TEXT_SCALE_MIN)
self.assertEqual(app.normalize_text_scale("999"), app.TEXT_SCALE_MAX)
self.assertEqual(app.normalize_text_scale("bad-value"), app.TEXT_SCALE_DEFAULT)
self.assertEqual(app.normalize_text_scale(float("inf")), app.TEXT_SCALE_DEFAULT)
self.assertEqual(app.normalize_text_scale(float("nan")), app.TEXT_SCALE_DEFAULT)

def test_refresh_helpers_clamp_invalid_config_values(self):
self.assertEqual(app.refresh_interval_seconds("bad-value"), 300)
self.assertEqual(app.refresh_interval_seconds(5), 30)
self.assertEqual(app.refresh_interval_seconds(99999), 3600)
self.assertEqual(app.refresh_interval_seconds(float("inf")), 300)
self.assertEqual(app.refresh_interval_seconds(float("nan")), 300)
self.assertEqual(app.page_refresh_seconds("bad-value"), 300)
self.assertEqual(app.page_refresh_seconds(5000), 30)
self.assertEqual(app.page_refresh_seconds(99999999), 3600)
self.assertEqual(app.page_refresh_seconds(float("inf")), 300)
self.assertEqual(app.page_refresh_seconds(float("nan")), 300)

def test_server_helpers_clamp_invalid_config_values(self):
self.assertEqual(app.server_port_number("bad-value"), 8080)
Expand Down Expand Up @@ -261,6 +267,16 @@ def test_settings_html_exposes_stale_threshold(self):
self.assertIn('name="stale_after_seconds"', html)
self.assertIn("状态过期阈值", html)

def test_status_stale_after_seconds_rejects_non_finite_values(self):
original_config = app.config
try:
app.config = {"status": {"stale_after_seconds": float("inf")}}
self.assertEqual(app.status_stale_after_seconds(), 900)
app.config = {"status": {"stale_after_seconds": float("nan")}}
self.assertEqual(app.status_stale_after_seconds(), 900)
finally:
app.config = original_config

def test_settings_html_exposes_layout_mode(self):
html = app.generate_settings_html()

Expand Down Expand Up @@ -819,6 +835,8 @@ def test_codex_session_file_limit_clamps_invalid_values(self):
self.assertEqual(app.codex_session_file_limit("bad-value"), 10)
self.assertEqual(app.codex_session_file_limit(0), 1)
self.assertEqual(app.codex_session_file_limit(999), 100)
self.assertEqual(app.codex_session_file_limit(float("inf")), 10)
self.assertEqual(app.codex_session_file_limit(float("nan")), 10)

def test_percent_left_from_used_clamps_and_rejects_invalid_values(self):
self.assertEqual(app.percent_left_from_used(25), 75)
Expand Down Expand Up @@ -986,6 +1004,8 @@ def test_display_flags_parse_string_booleans(self):
self.assertFalse(app.display_flag(display, "show_credits"))
self.assertFalse(app.display_flag(display, "show_data_source"))
self.assertFalse(app.display_flag(display, "show_last_updated"))
self.assertFalse(app.config_bool(float("inf"), False))
self.assertFalse(app.config_bool(float("nan"), False))

def test_codex_enabled_flag_parses_string_booleans(self):
self.assertFalse(app.codex_enabled_flag("false"))
Expand Down
Loading