test(iot): юнит-тесты валидации идентификаторов и разбора DSN (P1-11)
- handler/devices_test.go: validateIdentifier (charset/лимиты, запрет _ + # /). - iotpg/dsn_test.go: replaceDSNDatabase (вкл. sslrootcert со слэшем, ошибка для key=value) + safeNamespaceRe. - gofmt для затронутых файлов. go test ./... зелёный.
This commit is contained in:
@@ -42,19 +42,19 @@ type iotDeviceUpdateRequest struct {
|
||||
// устройства (отдаётся один раз) и НИКОГДА при чтении — чтобы пароль не утекал
|
||||
// через GET и не хранился в логах/истории.
|
||||
type iotDeviceResponse struct {
|
||||
Name string `json:"name"`
|
||||
Namespace string `json:"namespace"`
|
||||
DeviceID string `json:"device_id"`
|
||||
Enabled bool `json:"enabled"`
|
||||
Phase string `json:"phase"`
|
||||
MQTTUsername string `json:"mqtt_username,omitempty"`
|
||||
MQTTPassword string `json:"mqtt_password,omitempty"`
|
||||
TopicPrefix string `json:"topic_prefix,omitempty"`
|
||||
Name string `json:"name"`
|
||||
Namespace string `json:"namespace"`
|
||||
DeviceID string `json:"device_id"`
|
||||
Enabled bool `json:"enabled"`
|
||||
Phase string `json:"phase"`
|
||||
MQTTUsername string `json:"mqtt_username,omitempty"`
|
||||
MQTTPassword string `json:"mqtt_password,omitempty"`
|
||||
TopicPrefix string `json:"topic_prefix,omitempty"`
|
||||
// TelemetryTopic — полный MQTT-топик телеметрии устройства «ns/telemetry/device».
|
||||
// Явное поле (в отличие от topic_prefix = «ns/»): Terraform должен знать
|
||||
// точный топик для публикации/подписки (ревью 2026-10-10).
|
||||
TelemetryTopic string `json:"telemetry_topic"`
|
||||
LastConnected string `json:"last_connected,omitempty"`
|
||||
TelemetryTopic string `json:"telemetry_topic"`
|
||||
LastConnected string `json:"last_connected,omitempty"`
|
||||
// Metadata — без omitempty: всегда присутствует в ответе. Пустой → «{}»,
|
||||
// иначе Terraform видел бы drift «{}» против null (ревью 2026-10-10).
|
||||
Metadata map[string]string `json:"metadata"`
|
||||
@@ -127,8 +127,8 @@ func hashPassword(plain string) (string, error) {
|
||||
// только [a-zA-Z0-9] и дефисы, не с дефиса. Исключает _, +, #, /, пробелы, юникод.
|
||||
// Причины запретов (ревью 2026-10-10):
|
||||
// - _ — username = «namespace_device_id»; _ делает его неоднозначным
|
||||
// (auth-запрос EMQX: namespace || '_' || device_id, LIMIT 1 без ORDER BY
|
||||
// → может сматчить чужое устройство);
|
||||
// (auth-запрос EMQX: namespace || '_' || device_id, LIMIT 1 без ORDER BY
|
||||
// → может сматчить чужое устройство);
|
||||
// - +/# — wildcard MQTT: в ACL-топике даст подписку/публикацию чужих топиков;
|
||||
// - / — ломает топик «ns/telemetry/device» (лишний уровень).
|
||||
var identRe = regexp.MustCompile(`^[a-zA-Z0-9][a-zA-Z0-9-]*$`)
|
||||
|
||||
Reference in New Issue
Block a user