Summary
The wave-3 security fix (commit da0be238) for C-W3-5 (AiService SSRF) added ai_api_key and appointment_backend_api_key to SECRET_KEYS in SettingsService, but missed adding ai_model_url.
This meant that GET /api/settings (which is @NoAdminRequired) returned the admin-configured AI model URL (e.g. http://ollama:11434 or a cloud LLM endpoint) to every authenticated Nextcloud user — revealing internal infrastructure topology.
Fix
ai_model_url was added to SECRET_KEYS in commit 65f80614 (wave-9 follow-up, pushed to development 2026-05-28).
Scope
- File:
lib/Service/SettingsService.php — SECRET_KEYS constant
- Effect: non-admin callers of
GET /api/settings now receive "ai_model_url": "***" instead of the real URL
Tracked as C-W3-5 gap — the core SSRF guard on AiService::callAiModel (preventing actual exploitation) was shipped in wave-3; this closes the information-disclosure residual.
Summary
The wave-3 security fix (commit
da0be238) for C-W3-5 (AiService SSRF) addedai_api_keyandappointment_backend_api_keytoSECRET_KEYSinSettingsService, but missed addingai_model_url.This meant that
GET /api/settings(which is@NoAdminRequired) returned the admin-configured AI model URL (e.g.http://ollama:11434or a cloud LLM endpoint) to every authenticated Nextcloud user — revealing internal infrastructure topology.Fix
ai_model_urlwas added toSECRET_KEYSin commit65f80614(wave-9 follow-up, pushed todevelopment2026-05-28).Scope
lib/Service/SettingsService.php—SECRET_KEYSconstantGET /api/settingsnow receive"ai_model_url": "***"instead of the real URLTracked as C-W3-5 gap — the core SSRF guard on
AiService::callAiModel(preventing actual exploitation) was shipped in wave-3; this closes the information-disclosure residual.