fix(api): валидировать {namespace} во всех эндпоинтах (было только в POST) + регрессионные тесты

This commit is contained in:
Repinoid
2026-10-11 20:26:30 +03:00
parent 4c24c6351c
commit 6b9f397746
4 changed files with 125 additions and 17 deletions
+28
View File
@@ -62,3 +62,31 @@ func errResp(msg string) map[string]string {
func pathVar(r *http.Request, key string) string {
return mux.Vars(r)[key]
}
// defaultNamespace — namespace, когда в пути он не задан.
const defaultNamespace = "default"
// namespaceFromPath возвращает {namespace} из URL (пусто → "default").
func namespaceFromPath(r *http.Request) string {
ns := pathVar(r, "namespace")
if ns == "" {
ns = defaultNamespace
}
return ns
}
// requireNamespace — namespace из URL + его валидация. При невалидном значении
// отвечает 400 и возвращает ok=false (вызывающий обязан выйти).
//
// Зачем единая точка: раньше проверка была ТОЛЬКО в CreateIoTDevice, а
// GET/DELETE/PATCH/telemetry пропускали любой namespace дальше (тест 2026-10-11:
// `GET /v1/namespaces/bad_ns/iot/devices` → 200, а чтение телеметрии с таким ns
// падало уже в хранилище с 500). Валидируем на входе у всех — единообразный 400.
func requireNamespace(w http.ResponseWriter, r *http.Request) (string, bool) {
ns := namespaceFromPath(r)
if msg := validateIdentifier(ns, "namespace", 56); msg != "" {
writeJSON(w, http.StatusBadRequest, errResp(msg))
return "", false
}
return ns, true
}