fix(api): валидировать {namespace} во всех эндпоинтах (было только в POST) + регрессионные тесты
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user