docs: полная документация v0.2.3 — архитектура, API, деплой, тестирование
Новые файлы: - doc/architecture/current-v0.2.3.md — актуальная архитектура - doc/api/endpoints-v0.2.3.md — полная документация REST API - doc/deployment-v0.2.3.md — инструкция деплоя v0.2.3 - doc/run-and-test.md — руководство по запуску и E2E тесту Обновлено: - doc/progress.md — секция документации - doc/thinking/2026-04-12.md — лог мышления
This commit is contained in:
@@ -31,6 +31,10 @@ type Handler struct {
|
||||
// IoTPG — хранилище IoT телеметрии (per-tenant Postgres). nil если IOT_PG_DSN не задан.
|
||||
IoTPG *iotpg.IoTPostgresStore
|
||||
Log *slog.Logger
|
||||
// BridgeUsername â username внÑÑÑеннего MQTT bridge (env MQTT_BRIDGE_USERNAME)
|
||||
BridgeUsername string
|
||||
// BridgePassword â паÑÐ¾Ð»Ñ bridge (env MQTT_BRIDGE_PASSWORD)
|
||||
BridgePassword string
|
||||
}
|
||||
|
||||
// writeJSON отправляет JSON-ответ с указанным статусом.
|
||||
|
||||
@@ -151,6 +151,18 @@ func (h *Handler) MQTTAuth(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
// Bridge â внÑÑÑенний MQTT bridge клиенÑ. ÐÑовеÑÑем ÑикÑиÑованнÑе credentials
|
||||
// до паÑÑинга namespace_deviceId.
|
||||
if h.BridgeUsername != "" && req.Username == h.BridgeUsername {
|
||||
if subtle.ConstantTimeCompare([]byte(h.BridgePassword), []byte(req.Password)) == 1 {
|
||||
writeJSON(w, http.StatusOK, mqttAuthResponse{Result: "allow"})
|
||||
return
|
||||
}
|
||||
writeJSON(w, http.StatusOK, mqttAuthResponse{Result: "deny"})
|
||||
return
|
||||
}
|
||||
|
||||
// Парсим username: "{namespace}_{deviceId}"
|
||||
// Namespace содержит только [a-z0-9-], первый "_" — разделитель.
|
||||
idx := strings.Index(req.Username, "_")
|
||||
@@ -427,6 +439,9 @@ func (h *Handler) MQTTAcl(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
// Bridge â внÑÑÑенний MQTT bridge клиенÑ. ÐÑовеÑÑем ÑикÑиÑованнÑе credentials
|
||||
// до паÑÑинга namespace_deviceId.
|
||||
// Парсим username → namespace + deviceId (формат: "{ns}_{deviceId}")
|
||||
// strings.Index находит ПЕРВЫЙ '_' — namespace содержит только дефисы
|
||||
idx := strings.Index(req.Username, "_")
|
||||
|
||||
Reference in New Issue
Block a user