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

1b48b61

Author: blmayer (bleemayer@gmail.com)

Date: Wed Sep 13 13:50:33 2023 -0300

Parent: aaa89b4

Revert "Removed link check. Use hard links"

This reverts commit aaa89b448a20a157f885a89aa9d15ab2577e1ec2.

Diff

cmd/dovel/backend.go

commit 1b48b61de19a6d050cb08e9c329d13b051ffad82
Author: blmayer <bleemayer@gmail.com>
Date:   Wed Sep 13 13:50:33 2023 -0300

    Revert "Removed link check. Use hard links"
    
    This reverts commit aaa89b448a20a157f885a89aa9d15ab2577e1ec2.

diff --git a/cmd/dovel/backend.go b/cmd/dovel/backend.go
index 029daf9..b18e60d 100644
--- a/cmd/dovel/backend.go
+++ b/cmd/dovel/backend.go
@@ -5,6 +5,7 @@ import (
 	"bytes"
 	"fmt"
 	"io"
+	"io/ioutil"
 	"net"
 	"net/mail"
 	"net/textproto"
@@ -77,7 +78,14 @@ func (s *Session) Data(raw io.Reader) error {
 	domain := strings.Split(from.Address, "@")[1]
 
 	h := path.Join(configPath, "hooks", "send-"+domain)
-	if _, err := os.Stat(h); err == nil {
+	if f, err := os.Lstat(h); err == nil {
+		if !f.Mode().IsRegular() {
+			h, err = os.Readlink(h)
+			if err != nil {
+				println(domain, "read link", err.Error())
+			}
+		}
+
 		err = s.Send(s.from, s.tos, strings.NewReader(string(cont)))
 		if err != nil {
 			println("send", err.Error())
@@ -102,9 +110,14 @@ func (s *Session) Data(raw io.Reader) error {
 		domain := strings.Split(toAddr.Address, "@")[1]
 
 		h := path.Join(configPath, "hooks", "receive-"+domain)
-		if _, err := os.Stat(h); err != nil {
+		if f, err := os.Lstat(h); err != nil {
 			println(domain, "receive error:", err.Error())
 			continue
+		} else if !f.Mode().IsRegular() {
+			h, err = os.Readlink(h)
+			if err != nil {
+				println(domain, "read link", err.Error())
+			}
 		}
 
 		c := exec.Command(h)
@@ -132,7 +145,7 @@ func (s *Session) Send(from string, tos []string, raw io.Reader) error {
 		return err
 	}
 
-	body, err := io.ReadAll(email.Body)
+	body, err := ioutil.ReadAll(email.Body)
 	if err != nil {
 		return err
 	}