mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-11-11 08:03:01 +03:00
* Add on-demand Frigate+ API key validation The Frigate+ settings page reported the API key as validated whenever it matched the expected format, without ever checking it with the server. - Clarify the status text to say the key matches the expected format - Add PlusApi.validate_key(), which requests a token from Frigate+ and reports the key as valid, invalid, unreachable, or not set; server errors and timeouts are not reported as an invalid key - Add an admin-only POST /plus/validate endpoint and regenerate the API spec - Add a "Validate with Frigate+" button that shows the result inline Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E4iDiZE2b3tVFVYyZrfZde * Validate Frigate+ key asynchronously and keep cached token on bad replies - Use aiohttp for the validation request so the endpoint awaits it instead of blocking a worker thread - Only replace the cached token when the reply has a string accessToken and numeric expires; otherwise report unreachable so an unexpected response can't break later Frigate+ requests - Test against a local aiohttp server, covering timeouts, connection failures, non-JSON replies and unusable token shapes Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E4iDiZE2b3tVFVYyZrfZde * Honor proxy settings when validating the Frigate+ key aiohttp ignores HTTP(S)_PROXY unless trust_env is set, so validation reported Frigate+ as unreachable on installs that need a proxy while other Frigate+ requests still worked. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E4iDiZE2b3tVFVYyZrfZde --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
52 lines
1.4 KiB
Python
52 lines
1.4 KiB
Python
"""Tests for the Frigate+ API endpoints."""
|
|
|
|
import unittest
|
|
from unittest.mock import patch
|
|
|
|
from frigate.models import Event
|
|
from frigate.plus import PlusKeyStatus
|
|
from frigate.test.http_api.base_http_test import AuthTestClient, BaseTestHttp
|
|
|
|
|
|
class TestHttpPlusValidate(BaseTestHttp):
|
|
def setUp(self):
|
|
super().setUp([Event])
|
|
|
|
def _validate(self, status: PlusKeyStatus) -> dict:
|
|
app = self.create_app()
|
|
|
|
with patch.object(
|
|
app.frigate_config.plus_api, "validate_key", return_value=status
|
|
):
|
|
with AuthTestClient(app) as client:
|
|
response = client.post("/plus/validate")
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
return response.json()
|
|
|
|
def test_a_valid_key(self):
|
|
self.assertEqual(
|
|
self._validate(PlusKeyStatus.valid), {"success": True, "status": "valid"}
|
|
)
|
|
|
|
def test_an_invalid_key(self):
|
|
self.assertEqual(
|
|
self._validate(PlusKeyStatus.invalid),
|
|
{"success": False, "status": "invalid"},
|
|
)
|
|
|
|
def test_viewers_cannot_validate(self):
|
|
app = self.create_app()
|
|
|
|
with AuthTestClient(app) as client:
|
|
response = client.post(
|
|
"/plus/validate",
|
|
headers={"remote-user": "viewer", "remote-role": "viewer"},
|
|
)
|
|
|
|
self.assertEqual(response.status_code, 403)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main(verbosity=2)
|