From 731a55b024f83d22a95782d00bfc6e8d9434c15b Mon Sep 17 00:00:00 2001 From: Open Date: Mon, 1 Jun 2026 04:26:22 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=9D=9E=E6=9C=89=E9=99=90?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=95=B0=E5=80=BC=E5=AF=BC=E8=87=B4=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E5=BC=82=E5=B8=B8=20(#86)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 13 ++++++++----- tests/test_vibe_status.py | 20 ++++++++++++++++++++ 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/app.py b/app.py index 3e382fd..57d6aa7 100644 --- a/app.py +++ b/app.py @@ -6,6 +6,7 @@ import argparse import copy import hmac +import math import os import re import shutil @@ -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)) @@ -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)) @@ -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) @@ -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 @@ -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 @@ -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)) diff --git a/tests/test_vibe_status.py b/tests/test_vibe_status.py index 76effe2..df740c1 100644 --- a/tests/test_vibe_status.py +++ b/tests/test_vibe_status.py @@ -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) @@ -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() @@ -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) @@ -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"))