| 220 | } |
| 221 | |
| 222 | func (m *Modifier) fieldsToSign(h *textproto.Header) []string { |
| 223 | // Filter out duplicated fields from configs so they |
| 224 | // will not cause panic() in go-msgauth internals. |
| 225 | seen := make(map[string]struct{}) |
| 226 | |
| 227 | res := make([]string, 0, len(m.oversignHeader)+len(m.signHeader)) |
| 228 | for _, key := range m.oversignHeader { |
| 229 | if _, ok := seen[strings.ToLower(key)]; ok { |
| 230 | continue |
| 231 | } |
| 232 | seen[strings.ToLower(key)] = struct{}{} |
| 233 | |
| 234 | // Add to signing list once per each key use. |
| 235 | for field := h.FieldsByKey(key); field.Next(); { |
| 236 | res = append(res, key) |
| 237 | } |
| 238 | // And once more to "oversign" it. |
| 239 | res = append(res, key) |
| 240 | } |
| 241 | for _, key := range m.signHeader { |
| 242 | if _, ok := seen[strings.ToLower(key)]; ok { |
| 243 | continue |
| 244 | } |
| 245 | seen[strings.ToLower(key)] = struct{}{} |
| 246 | |
| 247 | // Add to signing list once per each key use. |
| 248 | for field := h.FieldsByKey(key); field.Next(); { |
| 249 | res = append(res, key) |
| 250 | } |
| 251 | } |
| 252 | return res |
| 253 | } |
| 254 | |
| 255 | type state struct { |
| 256 | m *Modifier |