0.18.0

Итерация 14 плана аудита: API-консистентность — ошибки, IDOR-edge, валидация.

Added

  • Единый writeJSONError(w, code, msg) во всех handlers: формат {"error":"msg"}, Content-Type, X-API-Version
  • Helpers writeJSON, writeJSONStatus для единообразных JSON-ответов
  • Helpers nilSlice[T], nilPtrSlice[T] — list-эндпоинты всегда возвращают [] вместо null
  • Константа APIVersion = "1", заголовок X-API-Version во всех ответах
  • Ownership checks для cron/heartbeat/email: requireCronInAgent, requireHeartbeatInAgent, requireEmailInAgent
  • Store.CountAdmins(ctx) — метод интерфейса + реализации (SQLite, PG, Dual)
  • middleware/maxbody.go: JSON body size limit 10MB через http.MaxBytesReader
  • Валидация username: regex ^[a-zA-Z0-9_-]{3,32}$ в Create User и Update User
  • 17 unit-тестов в internal/server/handler/iter14_test.go

Changed

  • agentNameRegex: ^[a-zA-Z]+$^[\p{L}\p{N} _-]{1,64}$ — unicode, цифры, пробелы
  • SetAdmin: запрет на изменение собственного admin-флага; гарантия минимум одного админа (409 при последнем)
  • Все handlers переведены с http.Error/inline JSON на writeJSONError/writeJSON/writeJSONStatus
  • Cron Delete/Toggle: теперь проверяют agentID ownership (раньше.Delete не проверял agentID)
  • Heartbeat Delete/Toggle: теперь проверяют agentID ownership
  • Email Get/Update/Delete/Test: теперь проверяют agentID ownership
  • router.go: подключён middleware.MaxBodySize глобально