Files
aoc/backend/models/api.py
Tomas Kracmar d01e7801ed
All checks were successful
CI / lint-and-test (push) Successful in 51s
Release / build-and-push (push) Successful in 1m57s
security: v1.7.7 hardening release
- Add WEBHOOK_CLIENT_SECRET validation for Graph webhooks
- Add Redis-backed rate limiting (fetch/ask/write/default tiers)
- Validate LLM_BASE_URL to prevent SSRF (HTTPS only, block private IPs)
- Enforce non-wildcard CORS when AUTH_ENABLED=true
- Add Content-Security-Policy headers
- Fix audit middleware to use verified JWT claims via contextvars
- Cap bulk_tags updates to 10,000 documents
- Return generic error messages to clients (no internal detail leakage)
- Strict AlertCondition Pydantic model for alert rules
- Security warning on MCP stdio server startup
- Remove MongoDB/Redis host ports from docker-compose
- Remove mongo_query from /ask API response
2026-04-27 09:16:57 +02:00

112 lines
2.6 KiB
Python

from pydantic import BaseModel, ConfigDict
class EventItem(BaseModel):
id: str | None = None
timestamp: str | None = None
service: str | None = None
operation: str | None = None
result: str | None = None
actor_display: str | None = None
target_displays: list[str] | None = None
display_summary: str | None = None
display_category: str | None = None
dedupe_key: str | None = None
actor: dict | None = None
targets: list[dict] | None = None
raw: dict | None = None
raw_text: str | None = None
tags: list[str] | None = None
comments: list[dict] | None = None
model_config = ConfigDict(extra="allow")
class PaginatedEventResponse(BaseModel):
items: list[dict]
total: int
page_size: int
next_cursor: str | None = None
class FilterOptionsResponse(BaseModel):
services: list[str]
operations: list[str]
results: list[str]
actors: list[str]
actor_upns: list[str]
devices: list[str]
class FetchAuditLogsResponse(BaseModel):
stored_events: int
errors: list[str]
class SourceHealthResponse(BaseModel):
source: str
last_fetch_time: str | None = None
last_attempt_time: str | None = None
status: str
class TagsUpdateRequest(BaseModel):
tags: list[str]
class BulkTagsRequest(BaseModel):
tags: list[str]
mode: str = "append" # "append" or "replace"
class CommentAddRequest(BaseModel):
text: str
class AlertCondition(BaseModel):
field: str
op: str # eq, neq, contains, in, after_hours
value: str | list[str] | None = None
class AlertRuleResponse(BaseModel):
id: str | None = None
name: str
enabled: bool
severity: str
conditions: list[AlertCondition]
message: str
class AskRequest(BaseModel):
question: str
services: list[str] | None = None
actor: str | None = None
operation: str | None = None
result: str | None = None
start: str | None = None
end: str | None = None
include_tags: list[str] | None = None
exclude_tags: list[str] | None = None
async_mode: bool = False # enqueue async job instead of waiting
class AskEventRef(BaseModel):
id: str | None = None
timestamp: str | None = None
operation: str | None = None
actor_display: str | None = None
target_displays: list[str] | None = None
display_summary: str | None = None
service: str | None = None
result: str | None = None
class AskResponse(BaseModel):
answer: str
events: list[AskEventRef]
query_info: dict
llm_used: bool
llm_error: str | None = None
job_id: str | None = None