diff --git a/smtp/parsers.go b/smtp/parsers.go index ed122f8..9072c02 100644 --- a/smtp/parsers.go +++ b/smtp/parsers.go @@ -23,15 +23,15 @@ import ( "regexp" ) -var ReversePath = regexp.MustCompile(fmt.Sprintf("(?:%v)|<>", path)) +var ReversePath = regexp.MustCompile(fmt.Sprintf("(?:%v)|<()>", path)) var ForwardPath = regexp.MustCompile(path) var Domain = regexp.MustCompile(fmt.Sprintf(".+@(%v)", domain)) // https://datatracker.ietf.org/doc/html/rfc5321#page-41 // Is this...legal, m'lord? (no, but ¯\_(ツ)_/¯) // ... -// Ok fine. TODO. Happy now? -var path = fmt.Sprintf("<(?:.*:)?(.+@%v)", domain) +// What? You want more? Nope. That is all you get. +var path = fmt.Sprintf("<(?:.*:)?(.+@%v)>", domain) var domain = fmt.Sprintf("%v(?:.%v)*", sub_domain, sub_domain) var sub_domain = fmt.Sprintf("%v(?:%v)?", let_dig, let_str) var let_str = fmt.Sprintf("%v*%v", let_dig_und, let_dig) diff --git a/smtp/parsers_test.go b/smtp/parsers_test.go new file mode 100644 index 0000000..da50fc2 --- /dev/null +++ b/smtp/parsers_test.go @@ -0,0 +1,93 @@ +/* diodemail - send-only smtp server + * Copyright (c) 2024 Gnarwhal + * + * This file is part of SSHare. + * + * SSHare is free software: you can redistribute it and/or modify it under the terms of + * the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * SSHare is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * SSHare. If not, see . + */ + +package smtp + +import ( + "testing" +) + +func TestPathPatterns(t *testing.T) { + var tests = []struct { + pattern string + matches bool + group string + } { + { + "", + true, "test@example.com", + }, + { + "", + true, "test@sub-domain.example.com", + }, + { + "<テスト@何か.com>", + true, "テスト@何か.com", + }, + { + "<@source-path.com:test@example.com>", + true, "test@example.com", + }, + { + "<@second-path.com,@source-path.com:test@example.com>", + true, "test@example.com", + }, + { + "", + false, "", + }, + { + "", + false, "", + }, + { + "<@nope>", + false, "", + }, + { + "", + false, "", + }, + { + "<>", + true, "", + }, + } + + for _, test := range tests { + t.Run(test.pattern, func(t *testing.T) { + match := ReversePath.FindStringSubmatch(test.pattern) + if match == nil { + if test.matches { + t.Errorf("unxpectedly did not match") + } + } else { + if !test.matches { + t.Errorf("unexpectedly matched: %v", match[0]) + } else if match[1] != test.group { + t.Errorf("got %v, expected %v", match[1], test.group) + } + } + }) + } +}