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)
+ }
+ }
+ })
+ }
+}