v0.1.35: whitelist имён атрибутов и для JSON-протокола (UnmarshalJSON)
This commit is contained in:
@@ -401,6 +401,47 @@ type QueueAttributes struct {
|
||||
RedriveAllowPolicy map[string]interface{} `json:"RedriveAllowPolicy"` // NOTE: not implemented
|
||||
}
|
||||
|
||||
// AttrNameWhitelist — имена атрибутов, допустимые в SetQueueAttributes/CreateQueue.
|
||||
// Используется для валидации в ОБОИХ протоколах:
|
||||
// - Query (form Attribute.N.Name) — в app/gosqs/queue_attributes.go;
|
||||
// - JSON — в UnmarshalJSON ниже (стандартный парсер молча отбрасывает
|
||||
// неизвестные поля, поэтому проверка выполняется вручную).
|
||||
// Policy/RedriveAllowPolicy — допустимы для совместимости, но не реализованы (no-op).
|
||||
var AttrNameWhitelist = map[string]bool{
|
||||
"DelaySeconds": true,
|
||||
"MaximumMessageSize": true,
|
||||
"MessageRetentionPeriod": true,
|
||||
"Policy": true,
|
||||
"ReceiveMessageWaitTimeSeconds": true,
|
||||
"VisibilityTimeout": true,
|
||||
"RedrivePolicy": true,
|
||||
"RedriveAllowPolicy": true,
|
||||
}
|
||||
|
||||
// UnmarshalJSON — строгая разборка QueueAttributes для JSON-протокола.
|
||||
//
|
||||
// Логическая схема:
|
||||
// 1. Разбираем тело в map[string]json.RawMessage, чтобы увидеть ВСЕ ключи.
|
||||
// 2. Каждый ключ проверяем по AttrNameWhitelist: неизвестное имя → ошибка
|
||||
// (раньше парсер молча отбрасывал чужие поля и SetQueueAttributes принимал
|
||||
// любой атрибут — «неверное имя атрибута принято» из нагрузочного теста).
|
||||
// 3. Разбираем штатно: все известные поля попадают в структуру, вложенный
|
||||
// RedrivePolicy использует собственный UnmarshalJSON.
|
||||
// Ошибка приводит к TransformRequest=false → InvalidParameterValue в handler.
|
||||
func (q *QueueAttributes) UnmarshalJSON(data []byte) error {
|
||||
var raw map[string]json.RawMessage
|
||||
if err := json.Unmarshal(data, &raw); err != nil {
|
||||
return err
|
||||
}
|
||||
for name := range raw {
|
||||
if !AttrNameWhitelist[name] {
|
||||
return fmt.Errorf("invalid attribute name: %s", name)
|
||||
}
|
||||
}
|
||||
type plain QueueAttributes
|
||||
return json.Unmarshal(data, (*plain)(q))
|
||||
}
|
||||
|
||||
type RedrivePolicy struct {
|
||||
MaxReceiveCount StringToInt `json:"maxReceiveCount"`
|
||||
DeadLetterTargetArn string `json:"deadLetterTargetArn"`
|
||||
|
||||
Reference in New Issue
Block a user