list

server

This is the main dovel repository, it has the Go code to run dovel SMTP server.

curl https://dovel.email/server.tar tar

1dc8f91

Author: b (git@mail.blmayer.dev)

Date: Tue Jul 18 00:04:50 2023 -0300

Parent: cf90e66

Fixed more bugs

Diff

cmd/dovel/backend.go

commit 1dc8f91bddb1ff1b313c0d3388ed8cb4453b3060
Author: b <git@mail.blmayer.dev>
Date:   Tue Jul 18 00:04:50 2023 -0300

    Fixed more bugs

diff --git a/cmd/dovel/backend.go b/cmd/dovel/backend.go
index 5b61426..f06c52f 100644
--- a/cmd/dovel/backend.go
+++ b/cmd/dovel/backend.go
@@ -7,6 +7,8 @@ import (
 	"net/mail"
 	"strings"
 
+	"blmayer.dev/x/vault"
+
 	"git.derelict.garden/dovel/email/interfaces"
 	"github.com/OfimaticSRL/parsemail"
 	"github.com/emersion/go-smtp"
@@ -17,12 +19,15 @@ type Session struct {
 	user     string
 	handlers map[string]interfaces.Mailer
 	from string
-	to   string
+	tos   []string
+	vault vault.Vault[interfaces.WebUser]
 }
 
 func (s Session) AuthPlain(username, password string) error {
 	println("connection sent", username, password)
-	// call vault
+	if s.vault.Validate(username, password) {
+		s.user = username
+	}
 	return nil
 }
 
@@ -34,46 +39,46 @@ func (s Session) Mail(from string, opts *smtp.MailOptions) error {
 
 func (s Session) Rcpt(to string) error {
 	println("Rcpt to:", to)
-	s.to = to
+	s.tos = append(s.tos, to)
 	return nil
 }
 
 func (s Session) Data(r io.Reader) error {
-	email, err := mail.ReadMessage(r)
-	if err != nil {
-		println("parse email", err.Error())
-		return err
-	}
-
 	from, err := mail.ParseAddress(s.from)
 	if err != nil {
 		println("parse address", err.Error())
 		return err
 	}
-	fromDomain := strings.Split(from, "@")[1]
-	tos, err := mail.ParseAddressList(s.to)
+	fromDomain := strings.Split(from.Address, "@")[1]
+	tos, err := mail.ParseAddressList(strings.Join(s.tos, ", "))
 	if err != nil {
 		println("parse addresslist", err.Error())
 		return err
 	}
 
+	email, err := parsemail.Parse(r)
+	if err != nil {
+		println("parse email", err)
+		return err
+	}
+	m := interfaces.ToEmail(email)
 	for _, to := range tos {
 		localdom := strings.Split(to.Address, "@")
 		if h, ok := s.handlers[localdom[1]]; ok {
-			err = h.Save(r)
+			err = h.Save(m)
 		} else {
-			if user == "" {
+			if s.user == "" {
 				return fmt.Errorf("needs auth")
 			}
 			h, ok = s.handlers[fromDomain]
 			if !ok {
 				return fmt.Errorf("from is wrong")
 			}
-			err = h.Send(r)
+			err = h.Send(m, interfaces.Opt{})
 		}
 		if err != nil {
 			println("handler error", err.Error())
-			return
+			return err
 		}
 	}
 
@@ -93,6 +98,6 @@ type backend struct {
 }
 
 func (b backend) NewSession(_ *smtp.Conn) (smtp.Session, error) {
-	return Session{handlers: b.Handlers}, nil
+	return Session{handlers: b.Handlers, tos:[]string{}}, nil
 }
 

cmd/dovel/main.go

commit 1dc8f91bddb1ff1b313c0d3388ed8cb4453b3060
Author: b <git@mail.blmayer.dev>
Date:   Tue Jul 18 00:04:50 2023 -0300

    Fixed more bugs

diff --git a/cmd/dovel/main.go b/cmd/dovel/main.go
index 560d97f..9f2b4d9 100644
--- a/cmd/dovel/main.go
+++ b/cmd/dovel/main.go
@@ -42,8 +42,12 @@ var (
 )
 
 func main() {
-	configPath := path.Join(os.UserConfigDir(), "dovel", "config.json")
-	configFile, err := os.Open(configPath)
+	configPath, err := os.UserConfigDir()
+	if err != nil {
+		println(err, "using ~/.config/dovel/config.json")
+		configPath = "~/.config"
+	}
+	configFile, err := os.Open(path.Join(configPath, "dovel", "config.json"))
 	if err != nil {
 		println("open config", err.Error(), ". Using defaults")
 		cfg = defaultConfig