fix: AI設定APIのテナント分離不備とAPIキー平文露出 #41
Labels
No labels
h1-request
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
joe/o2#41
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
概要
AI設定 API(
/api/ai-settings)にテナント分離の不備と API キーの平文露出があります。P5 の設定画面で UI から PUT が叩けるようになり、露出面が広がりました。問題
src/o2/services/ai_settings_service.py:14-19のget_settings()がselect(AISettings).first()で、テナントを絞らずに最初の1件を返すupdate_settings()も同じ設定を更新するため、GET/PUT /api/ai-settingsが他テナントの設定を読み書きし得るsrc/o2/api/ai_settings.py:52付近の「テナントスコープ検証」はpassのみの実質 no-opAISettingsResponse.api_key(src/o2/api/ai_settings.py:28)がsetting.api_keyをそのまま返すGETは read 権限のみのため、VIEWER でも平文キーを取得可能影響
対応方針
AISettingsService.get_settings(tenant_id)をテナントスコープに。AGENTS.md の「テナント固有設定がない場合は既定設定を返す」フォールバックを実装(DEFAULT_TENANT_IDの設定にフォールバック。無ければ既定を1件作成)update_settings(tenant_id, **kwargs)はテナント固有設定を upsertGET /api/ai-settingsのレスポンスから平文api_keyを排除し、has_api_key: boolを返す。PUTはapi_keyが指定されたときのみ更新(空文字/未指定なら既存維持)/ai-settings)をhas_api_key表示+「変更する場合のみ入力」に合わせる受け入れ条件
GETに平文 API キーが含まれない(has_api_keyのみ)PUTでキー未指定なら既存キーが保持されるtests/test_ai_settings.py/test_ai_settings_api.py/test_ai_tenant.pyが緑(テナント分離テストを追加)証拠
src/o2/services/ai_settings_service.py:14-19src/o2/api/ai_settings.py:28,52対応完了
AI設定 API のテナント分離と API キー露出を修正しました。main
a012933にマージ・push 済み。修正
AISettingsService.get_settings(tenant_id)/update_settings(tenant_id, ...)resolve_write_tenant起点で対象を統一(adminNoneは DEFAULT 行)AISettingsResponseからapi_keyを削除しhas_api_key: boolに。GET/PUT とも平文を返さないapi_key未指定(None)なら既存を保持。指定時のみ更新/ai-settingsとレガシー/settingsの両方で、空欄保存時はキーを送らない/「設定済み・未設定」を表示テスト
test_ai_settings_tenant_isolation.py、test_ai_settings.py/test_ai_settings_api.py/test_settings_page.py更新成果物
b92411a(本体)、c08e666(レガシー設定ページ)、5d0d279(重要バグ修正)→ maina012933残課題(別途)
AISettings.api_keyはDBに平文保存のまま(暗号化は別タスク)openapi.jsonが旧スキーマのまま(再生成が必要)AISettings.tenant_idに unique 制約が無い(並行時に重複行の可能性)api_key=""明示はクリア、None/未指定は保持本 Issue は完了につきクローズします。