(node config.Node)
| 316 | } |
| 317 | |
| 318 | func parseRejectDirective(node config.Node) (*exterrors.SMTPError, error) { |
| 319 | code := 554 |
| 320 | enchCode := exterrors.EnhancedCode{5, 7, 0} |
| 321 | msg := "Message rejected due to a local policy" |
| 322 | var err error |
| 323 | switch len(node.Args) { |
| 324 | case 3: |
| 325 | msg = node.Args[2] |
| 326 | if msg == "" { |
| 327 | return nil, config.NodeErr(node, "message can't be empty") |
| 328 | } |
| 329 | fallthrough |
| 330 | case 2: |
| 331 | enchCode, err = parseEnhancedCode(node.Args[1]) |
| 332 | if err != nil { |
| 333 | return nil, config.NodeErr(node, "%v", err) |
| 334 | } |
| 335 | if enchCode[0] != 4 && enchCode[0] != 5 { |
| 336 | return nil, config.NodeErr(node, "enhanced code should use either 4 or 5 as a first number") |
| 337 | } |
| 338 | fallthrough |
| 339 | case 1: |
| 340 | code, err = strconv.Atoi(node.Args[0]) |
| 341 | if err != nil { |
| 342 | return nil, config.NodeErr(node, "invalid error code integer: %v", err) |
| 343 | } |
| 344 | if (code/100) != 4 && (code/100) != 5 { |
| 345 | return nil, config.NodeErr(node, "error code should start with either 4 or 5") |
| 346 | } |
| 347 | case 0: |
| 348 | default: |
| 349 | return nil, config.NodeErr(node, "invalid count of arguments") |
| 350 | } |
| 351 | return &exterrors.SMTPError{ |
| 352 | Code: code, |
| 353 | EnhancedCode: enchCode, |
| 354 | Message: msg, |
| 355 | Reason: "reject directive used", |
| 356 | }, nil |
| 357 | } |
| 358 | |
| 359 | func parseEnhancedCode(s string) (exterrors.EnhancedCode, error) { |
| 360 | parts := strings.Split(s, ".") |
no test coverage detected