From a4e786d03b84ff1fb70cd8ed3c2474f09df9edfe Mon Sep 17 00:00:00 2001 From: Repinoid Date: Tue, 6 Oct 2026 19:06:02 +0300 Subject: [PATCH] =?UTF-8?q?P0-3=20(=D1=87=D0=B0=D1=81=D1=82=D1=8C=202):=20?= =?UTF-8?q?=D0=BD=D0=B5=20=D0=BE=D1=82=D0=B4=D0=B0=D0=B2=D0=B0=D1=82=D1=8C?= =?UTF-8?q?=20=D0=BF=D0=B0=D1=80=D0=BE=D0=BB=D1=8C=20=D1=83=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=B9=D1=81=D1=82=D0=B2=D0=B0=20=D0=BF=D0=BE=D0=B2?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D0=BD=D0=BE=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7?= =?UTF-8?q?=20GET?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GetIoTDevice больше не возвращает mqtt_password (deviceToResponse получает ). Пароль остаётся доступен только один раз — при создании устройства. Хэширование паролей в БД + перевод EMQX на алгоритм хэша (часть 1) требует изменения emqx.conf и миграции — отдельным шагом. --- internal/service/api/handler/devices.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/internal/service/api/handler/devices.go b/internal/service/api/handler/devices.go index 9690398..be3094f 100644 --- a/internal/service/api/handler/devices.go +++ b/internal/service/api/handler/devices.go @@ -34,7 +34,9 @@ type iotDeviceUpdateRequest struct { Enabled *bool `json:"enabled"` } -// iotDeviceResponse — ответ API. MQTTPassword — только в GET по имени. +// iotDeviceResponse — ответ API. MQTTPassword заполняется ТОЛЬКО при создании +// устройства (отдаётся один раз) и НИКОГДА при чтении — чтобы пароль не утекал +// через GET и не хранился в логах/истории. type iotDeviceResponse struct { Name string `json:"name"` Namespace string `json:"namespace"` @@ -50,7 +52,8 @@ type iotDeviceResponse struct { } // deviceToResponse конвертирует устройство из БД в ответ API. -// password отдаётся только если непустая (передаётся явно из Get). +// password отдаётся только если непустая — только на создании, при чтении +// передаётся пустая строка (пароль повторно не показывается). func deviceToResponse(d *store.Device, password string) iotDeviceResponse { resp := iotDeviceResponse{ Name: d.Name, @@ -193,7 +196,7 @@ func (h *Handler) GetIoTDevice(w http.ResponseWriter, r *http.Request) { return } - writeJSON(w, http.StatusOK, deviceToResponse(device, device.MQTTPassword)) + writeJSON(w, http.StatusOK, deviceToResponse(device, "")) } // DeleteIoTDevice — DELETE /v1/namespaces/{ns}/iot/devices/{name}.