From f9137bfa6c1a8473a64accb3f2bc097230006f1cebe13de18b874f0674ecd5ee Mon Sep 17 00:00:00 2001 From: larssand Date: Tue, 30 Jun 2026 12:49:33 +0200 Subject: [PATCH] fix dash --- src/fgai/dashboard.py | 6 ++++-- tests/test_config.py | 6 ++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/fgai/dashboard.py b/src/fgai/dashboard.py index dc1d166..c2614a1 100644 --- a/src/fgai/dashboard.py +++ b/src/fgai/dashboard.py @@ -479,6 +479,7 @@ async function applySuggestedProfile(streamId) { graylog_mcp_url: config.graylog_mcp_url || '', graylog_query: config.graylog_query || '*', graylog_fetch_mode: config.graylog_fetch_mode || 'auto', + graylog_tls_verify: config.graylog_tls_verify !== false, graylog_range_seconds: config.graylog_range_seconds || 300, graylog_max_events_per_stream: config.graylog_max_events_per_stream || 5000, graylog_raw_sample_events: config.graylog_raw_sample_events || 5000, @@ -535,6 +536,7 @@ document.getElementById('settingsForm').addEventListener('submit', async event = values.llm_enabled = form.elements.llm_enabled.checked; values.profile_advisor_enabled = form.elements.profile_advisor_enabled.checked; values.threat_intel_enabled = form.elements.threat_intel_enabled.checked; + values.graylog_tls_verify = form.elements.graylog_tls_verify.checked; values.graylog_streams = [...document.querySelectorAll('.graylog-stream')].map(item => ({id:item.dataset.id, title:item.dataset.title, enabled:item.checked})); if (window.activeProfileStream) { let detectors={},fieldWeights={}; try { detectors=form.elements.profile_detectors.value.trim() ? JSON.parse(form.elements.profile_detectors.value) : {}; } catch { document.getElementById('settingsResult').textContent='Detector thresholds must be valid JSON.'; return; } try { fieldWeights=form.elements.profile_field_weights.value.trim() ? JSON.parse(form.elements.profile_field_weights.value) : {}; } catch { document.getElementById('settingsResult').textContent='Field weights must be valid JSON.'; return; } const entityFields=[...form.querySelectorAll('.profile-entity:checked')].map(item=>item.value); if (!entityFields.length) { document.getElementById('settingsResult').textContent='Select at least one Entity field for the active profile.'; return; } const profileTitle=window.activeProfileTitle || window.activeProfileStream; const profile={stream_id:window.activeProfileStream,name:form.elements.profile_name.value.trim() || `${profileTitle} profile`,entity_field:entityFields[0]||'',entity_fields:entityFields,timestamp_field:form.querySelector('[name="profile_timestamp"]:checked')?.value||'timestamp',categorical_fields:[...form.querySelectorAll('.profile-categorical:checked')].map(item=>item.value),numeric_fields:[...form.querySelectorAll('.profile-numeric:checked')].map(item=>item.value),detectors,field_weights:fieldWeights}; values.graylog_stream_profiles=[...(window.streamProfiles||[]).filter(item=>item.stream_id!==profile.stream_id),profile]; } const savedProfile = window.activeProfileStream ? ` Profile saved for ${window.activeProfileTitle || window.activeProfileStream}.` : ' No profile editor active, so profiles were not changed.'; @@ -599,7 +601,7 @@ def serve_dashboard(host: str, port: int, status_file: str, *, image_dir: str | if self.path == "/api/graylog/streams": config = config_store.read() try: - client = GraylogMcpClient(str(config.get("graylog_mcp_url", "")), str(config.get("graylog_mcp_token", ""))) + client = GraylogMcpClient(str(config.get("graylog_mcp_url", "")), str(config.get("graylog_mcp_token", "")), verify_tls=bool(config.get("graylog_tls_verify", True))) client.probe() result = client.call_tool("list_streams", {}) content = result.get("result", {}).get("content", []) @@ -624,7 +626,7 @@ def serve_dashboard(host: str, port: int, status_file: str, *, image_dir: str | stream_id = self.path.split("stream_id=", 1)[-1].split("&", 1)[0] config = config_store.read() try: - client = GraylogMcpClient(str(config.get("graylog_mcp_url", "")), str(config.get("graylog_mcp_token", ""))) + client = GraylogMcpClient(str(config.get("graylog_mcp_url", "")), str(config.get("graylog_mcp_token", "")), verify_tls=bool(config.get("graylog_tls_verify", True))) client.probe() result = client.call_tool("list_fields", {"streams": [stream_id]}) content = result.get("result", {}).get("content", []) diff --git a/tests/test_config.py b/tests/test_config.py index 78104ad..fff3171 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -38,6 +38,12 @@ class ConfigTests(unittest.TestCase): self.assertEqual(public["graylog_fetch_mode"], "aggregate") self.assertEqual(public["graylog_raw_sample_events"], 2500) + def test_graylog_tls_verify_can_be_disabled(self): + with tempfile.TemporaryDirectory() as directory: + store = ConfigStore(str(Path(directory) / "config.json")) + public = store.update({"graylog_tls_verify": False}) + self.assertFalse(public["graylog_tls_verify"]) + if __name__ == "__main__": unittest.main()