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

63cc35b

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

Date: Tue Aug 15 16:09:05 2023 -0300

Parent: fd06d68

Fixed html listing

Diff

cmd/dovel/backend.go

commit 63cc35b4d421b78407fc81777c713f4b85049d77
Author: bryon <git@mail.blmayer.dev>
Date:   Tue Aug 15 16:09:05 2023 -0300

    Fixed html listing

diff --git a/cmd/dovel/backend.go b/cmd/dovel/backend.go
index 421a6f2..862cbb5 100644
--- a/cmd/dovel/backend.go
+++ b/cmd/dovel/backend.go
@@ -11,7 +11,7 @@ import (
 	"net/textproto"
 	"strings"
 
-	"blmayer.dev/x/vault"
+	"git.derelict.garden/bryon/vault"
 
 	"git.derelict.garden/dovel/email/model"
 	"git.derelict.garden/dovel/email/util/wkd"

go.mod

commit 63cc35b4d421b78407fc81777c713f4b85049d77
Author: bryon <git@mail.blmayer.dev>
Date:   Tue Aug 15 16:09:05 2023 -0300

    Fixed html listing

diff --git a/go.mod b/go.mod
index 872c6a9..eba4c70 100644
--- a/go.mod
+++ b/go.mod
@@ -3,18 +3,20 @@ module git.derelict.garden/dovel/email
 go 1.19
 
 require (
+	blmayer.dev/x/vault v0.2.0
 	git.derelict.garden/bryon/vault v0.3.0
 	github.com/OfimaticSRL/parsemail v0.0.0-20230215211201-e1c318cd177f
+	github.com/ProtonMail/gopenpgp/v2 v2.7.1
 	github.com/emersion/go-msgauth v0.6.6
 	github.com/emersion/go-smtp v0.16.0
 	github.com/go-git/go-git/v5 v5.6.0
+	github.com/tv42/zbase32 v0.0.0-20220222190657-f76a9fc892fa
 )
 
 require (
 	github.com/Microsoft/go-winio v0.6.0 // indirect
 	github.com/ProtonMail/go-crypto v0.0.0-20230321155629-9a39f2531310 // indirect
 	github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f // indirect
-	github.com/ProtonMail/gopenpgp/v2 v2.7.1 // indirect
 	github.com/acomagu/bufpipe v1.0.4 // indirect
 	github.com/cloudflare/circl v1.3.2 // indirect
 	github.com/emersion/go-sasl v0.0.0-20220912192320-0145f2c60ead // indirect
@@ -25,11 +27,9 @@ require (
 	github.com/pjbgf/sha1cd v0.3.0 // indirect
 	github.com/pkg/errors v0.9.1 // indirect
 	github.com/sergi/go-diff v1.3.1 // indirect
-	github.com/tv42/zbase32 v0.0.0-20220222190657-f76a9fc892fa // indirect
 	golang.org/x/crypto v0.7.0 // indirect
 	golang.org/x/net v0.8.0 // indirect
 	golang.org/x/sys v0.6.0 // indirect
 	golang.org/x/text v0.8.0 // indirect
-	golang.org/x/tools v0.6.0 // indirect
 	gopkg.in/warnings.v0 v0.1.2 // indirect
 )

go.sum

commit 63cc35b4d421b78407fc81777c713f4b85049d77
Author: bryon <git@mail.blmayer.dev>
Date:   Tue Aug 15 16:09:05 2023 -0300

    Fixed html listing

diff --git a/go.sum b/go.sum
index ceb8cbf..e53c191 100644
--- a/go.sum
+++ b/go.sum
@@ -1,13 +1,13 @@
 blmayer.dev/x/vault v0.2.0 h1:V7ZNHFIQ6GGlKvbM4is7W7/8eVwXLcFiPwREtt8gON8=
 blmayer.dev/x/vault v0.2.0/go.mod h1:zjgWrvJh6sVZcZKx2dvypvLVEpEoeoyVuYrvRVl5afM=
+git.derelict.garden/bryon/vault v0.3.0 h1:dEYpd1pafEb1KXr0U6ZrXgHlKgmMnPeDUt6VVFsp26A=
+git.derelict.garden/bryon/vault v0.3.0/go.mod h1:Y1ph8MkV0iGhbIzxOvy1Bb2D+nWFrMSDn/WWV7ahdtg=
 github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY=
 github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg=
 github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE=
 github.com/OfimaticSRL/parsemail v0.0.0-20230215211201-e1c318cd177f h1:gna0qZzrWwiOizWzu4bwQzsnANcDpc2OvYeDcagGIAc=
 github.com/OfimaticSRL/parsemail v0.0.0-20230215211201-e1c318cd177f/go.mod h1:MeyUFKQUXa5bD0bfy+wf3eMotz8NdY/VxXYOQkUuHFg=
 github.com/ProtonMail/go-crypto v0.0.0-20221026131551-cf6655e29de4/go.mod h1:UBYPn8k0D56RtnR8RFQMjmh4KrZzWJ5o7Z9SYjossQ8=
-github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 h1:wPbRQzjjwFc0ih8puEVAOFGELsn1zoIIYdxvML7mDxA=
-github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8/go.mod h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g=
 github.com/ProtonMail/go-crypto v0.0.0-20230321155629-9a39f2531310 h1:dGAdTcqheKrQ/TW76sAcmO2IorwXplUw2inPkOzykbw=
 github.com/ProtonMail/go-crypto v0.0.0-20230321155629-9a39f2531310/go.mod h1:8TI4H3IbrackdNgv+92dI+rhpCaLqM0IfpgCgenFvRE=
 github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f h1:tCbYj7/299ekTTXpdwKYF8eBlsYsDVoggDAuAjoK66k=
@@ -109,7 +109,6 @@ golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A=
 golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
 golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI=
-golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA=
 golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8=
 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
@@ -165,8 +164,7 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm
 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
 golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA=
-golang.org/x/tools v0.3.0 h1:SrNbZl6ECOS1qFzgTdQfWXZM9XBkiA6tkFrH9YSTPHM=
-golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k=
+golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM=
 golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

model/html/html.go

commit 63cc35b4d421b78407fc81777c713f4b85049d77
Author: bryon <git@mail.blmayer.dev>
Date:   Tue Aug 15 16:09:05 2023 -0300

    Fixed html listing

diff --git a/model/html/html.go b/model/html/html.go
index d145bab..0c24694 100644
--- a/model/html/html.go
+++ b/model/html/html.go
@@ -139,6 +139,7 @@ func (h HTMLHandler) Save(from, to string, r io.Reader) error {
 	}
 
 	htmlDir := path.Join(h.out, to, subj)
+	os.MkdirAll(htmlDir, os.ModeDir|0o700)
 	htmlName := fmt.Sprintf("%s:%s.html", from, date.Format(time.RFC3339))
 	file, err = os.Create(path.Join(htmlDir, htmlName))
 	if err != nil {
@@ -150,7 +151,6 @@ func (h HTMLHandler) Save(from, to string, r io.Reader) error {
 	}
 	file.Close()
 
-	// TODO: Update index and lists
 	dir, err := os.ReadDir(path.Join(h.out))
 	if err != nil {
 		fmt.Println("readDir error:", err.Error())
@@ -198,7 +198,7 @@ func (h HTMLHandler) Save(from, to string, r io.Reader) error {
 	}
 	file.Close()
 
-	dir, err = os.ReadDir(path.Join(h.out, subj))
+	dir, err = os.ReadDir(path.Join(h.out, to))
 	if err != nil {
 		fmt.Println("readDir error:", err.Error())
 		return err
@@ -235,7 +235,7 @@ func (h HTMLHandler) Save(from, to string, r io.Reader) error {
 		},
 	)
 
-	file, err = os.Create(path.Join(h.out, subj, "index.html"))
+	file, err = os.Create(path.Join(h.out, to, "index.html"))
 	if err != nil {
 		return err
 	}
@@ -243,5 +243,48 @@ func (h HTMLHandler) Save(from, to string, r io.Reader) error {
 	if err != nil {
 		return err
 	}
+	file.Close()
+
+	dir, err = os.ReadDir(path.Join(h.out, to, subj))
+	if err != nil {
+		fmt.Println("read subj dir error:", err.Error())
+		return err
+	}
+
+	threads = []struct {
+		Title   string
+		LastMod time.Time
+	}{}
+	for _, d := range dir {
+		info, err := d.Info()
+		if err != nil {
+			fmt.Println("dir info", err.Error())
+			continue
+		}
+		t := struct {
+			Title   string
+			LastMod time.Time
+		}{
+			Title:   d.Name(),
+			LastMod: info.ModTime(),
+		}
+
+		threads = append(threads, t)
+	}
+	sort.Slice(
+		threads,
+		func(i, j int) bool {
+			return threads[i].LastMod.Before(threads[j].LastMod)
+		},
+	)
+
+	file, err = os.Create(path.Join(h.out, to, subj, "index.html"))
+	if err != nil {
+		return err
+	}
+	err = h.mailsTpl.Execute(file, threads)
+	if err != nil {
+		return err
+	}
 	return file.Close()
 }