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

1fbfe59

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

Date: Thu May 25 01:31:16 2023 -0300

Parent: 6a2353a

Added timezone support

- Using vault package

Diff

cmd/dovel/main.go

commit 1fbfe59fc12497bed1d24e1059f72859ed86141d
Author: blmayer <git@mail.blmayer.dev>
Date:   Thu May 25 01:31:16 2023 -0300

    Added timezone support
    
    - Using vault package

diff --git a/cmd/dovel/main.go b/cmd/dovel/main.go
index 7cbf1ca..20e2350 100644
--- a/cmd/dovel/main.go
+++ b/cmd/dovel/main.go
@@ -14,6 +14,8 @@ import (
 	"blmayer.dev/x/dovel/interfaces/file"
 	"blmayer.dev/x/dovel/interfaces/gwi"
 
+	"blmayer.dev/x/vault"
+
 	"github.com/emersion/go-smtp"
 )
 
@@ -53,7 +55,7 @@ func main() {
 		switch hand.Handler {
 		case "gwi":
 			// load gwi user file
-			v, err := NewPlainTextVault(path.Join(hand.Root, "users.json"))
+			v, err := vault.NewJSONPlainTextVault[interfaces.WebUser](path.Join(hand.Root, "users.json"))
 			if err != nil {
 				panic(err)
 			}
@@ -64,7 +66,7 @@ func main() {
 
 			b.Handlers[hand.Domain] = g
 		case "file":
-			v, err := NewPlainTextVault(path.Join(hand.Root, "users.json"))
+			v, err := vault.NewJSONPlainTextVault[interfaces.WebUser](path.Join(hand.Root, "users.json"))
 			if err != nil {
 				panic(err)
 			}

cmd/dovel/vault.go

commit 1fbfe59fc12497bed1d24e1059f72859ed86141d
Author: blmayer <git@mail.blmayer.dev>
Date:   Thu May 25 01:31:16 2023 -0300

    Added timezone support
    
    - Using vault package

diff --git a/cmd/dovel/vault.go b/cmd/dovel/vault.go
deleted file mode 100644
index fc9483b..0000000
--- a/cmd/dovel/vault.go
+++ /dev/null
@@ -1,73 +0,0 @@
-package main
-
-import (
-	"encoding/json"
-	"os"
-
-	"blmayer.dev/x/dovel/interfaces"
-)
-
-type plainTextUser struct {
-	Name     string
-	Mail     string
-	Password string
-	Config   any
-}
-
-func (u plainTextUser) Email() string {
-	return u.Mail
-}
-
-func (u plainTextUser) Login() string {
-	return u.Name
-}
-
-func (u plainTextUser) Pass() string {
-	return u.Password
-}
-
-func (u plainTextUser) Settings() any {
-	return u.Config
-}
-
-type plainTextVault struct {
-	Users []plainTextUser
-}
-
-func NewPlainTextVault(path string) (interfaces.Vault, error) {
-	s := plainTextVault{Users: []plainTextUser{}}
-
-	file, err := os.Open(path)
-	if err != nil {
-		return s, err
-	}
-	defer file.Close()
-
-	err = json.NewDecoder(file).Decode(&s.Users)
-	if err != nil {
-		return s, err
-	}
-
-	return s, nil
-}
-
-func (f plainTextVault) GetUser(login string) interfaces.User {
-	for _, u := range f.Users {
-		if u.Name == login {
-			return u
-		}
-	}
-	return nil
-}
-
-// Validate is not used here. Only here to fill the interface
-func (f plainTextVault) Validate(login, pass string) bool {
-	user := f.GetUser(login)
-	if user == nil {
-		return false
-	}
-	if user.Pass() != pass {
-		return false
-	}
-	return true
-}

cmd/dovel/web.go

commit 1fbfe59fc12497bed1d24e1059f72859ed86141d
Author: blmayer <git@mail.blmayer.dev>
Date:   Thu May 25 01:31:16 2023 -0300

    Added timezone support
    
    - Using vault package

diff --git a/cmd/dovel/web.go b/cmd/dovel/web.go
index 57d261a..fcd76be 100644
--- a/cmd/dovel/web.go
+++ b/cmd/dovel/web.go
@@ -9,12 +9,14 @@ import (
 	"time"
 
 	"blmayer.dev/x/dovel/interfaces"
+
+	"blmayer.dev/x/vault"
 )
 
 type webHandler struct {
 	assetsPath string
 	templates  *template.Template
-	vault      interfaces.Vault
+	vault      vault.Vault[interfaces.WebUser]
 	mailer     interfaces.Mailer
 }
 
@@ -36,7 +38,7 @@ func (h webHandler) indexHandler() http.HandlerFunc {
 			struct {
 				Query  url.Values
 				Mailer interfaces.Mailer
-				User   interfaces.User
+				User   interfaces.WebUser
 			}{
 				r.URL.Query(),
 				h.mailer,

go.mod

commit 1fbfe59fc12497bed1d24e1059f72859ed86141d
Author: blmayer <git@mail.blmayer.dev>
Date:   Thu May 25 01:31:16 2023 -0300

    Added timezone support
    
    - Using vault package

diff --git a/go.mod b/go.mod
index e90a2ab..b1cd6af 100644
--- a/go.mod
+++ b/go.mod
@@ -3,6 +3,7 @@ module blmayer.dev/x/dovel
 go 1.19
 
 require (
+	blmayer.dev/x/vault v0.2.0
 	github.com/OfimaticSRL/parsemail v0.0.0-20230215211201-e1c318cd177f
 	github.com/emersion/go-msgauth v0.6.6
 	github.com/emersion/go-smtp v0.16.0

go.sum

commit 1fbfe59fc12497bed1d24e1059f72859ed86141d
Author: blmayer <git@mail.blmayer.dev>
Date:   Thu May 25 01:31:16 2023 -0300

    Added timezone support
    
    - Using vault package

diff --git a/go.sum b/go.sum
index 5fd6b22..b2aa81f 100644
--- a/go.sum
+++ b/go.sum
@@ -1,3 +1,5 @@
+blmayer.dev/x/vault v0.2.0 h1:V7ZNHFIQ6GGlKvbM4is7W7/8eVwXLcFiPwREtt8gON8=
+blmayer.dev/x/vault v0.2.0/go.mod h1:zjgWrvJh6sVZcZKx2dvypvLVEpEoeoyVuYrvRVl5afM=
 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=

index.html

commit 1fbfe59fc12497bed1d24e1059f72859ed86141d
Author: blmayer <git@mail.blmayer.dev>
Date:   Thu May 25 01:31:16 2023 -0300

    Added timezone support
    
    - Using vault package

diff --git a/index.html b/index.html
index 98e0ae8..a25ccee 100644
--- a/index.html
+++ b/index.html
@@ -93,6 +93,7 @@ _  __  /_  __ \_ | / /  _ \_  /
 		<li><s>Support DKIM.</s></li>
 		<li><s>Multiple inboxes.</s></li>
 		<li><s>Support moving and deleting email on web.</s></li>
+		<li><s>Dark theme</s></li>
 		<li>PGP support.</li>
 		<li>Multiple users.</li>
 		<li>Implement mailing lists behaviour.</li>

interfaces/file/file.go

commit 1fbfe59fc12497bed1d24e1059f72859ed86141d
Author: blmayer <git@mail.blmayer.dev>
Date:   Thu May 25 01:31:16 2023 -0300

    Added timezone support
    
    - Using vault package

diff --git a/interfaces/file/file.go b/interfaces/file/file.go
index 9dfc7d4..40e2b74 100644
--- a/interfaces/file/file.go
+++ b/interfaces/file/file.go
@@ -22,6 +22,8 @@ import (
 	"blmayer.dev/x/dovel/config"
 	"blmayer.dev/x/dovel/interfaces"
 
+	"blmayer.dev/x/vault"
+
 	"github.com/OfimaticSRL/parsemail"
 	"github.com/emersion/go-msgauth/dkim"
 )
@@ -36,10 +38,10 @@ type FileHandler struct {
 	root       string
 	domain     string
 	privateKey crypto.Signer
-	vault      interfaces.Vault
+	vault      vault.Vault[interfaces.WebUser]
 }
 
-func NewFileHandler(c config.InboxConfig, v interfaces.Vault, fs map[string]any) (FileHandler, error) {
+func NewFileHandler(c config.InboxConfig, v vault.Vault[interfaces.WebUser], fs map[string]any) (FileHandler, error) {
 	f := FileHandler{root: c.Root, vault: v, domain: c.Domain}
 	if fs == nil {
 		fs = map[string]any{}

interfaces/gwi/gwi.go

commit 1fbfe59fc12497bed1d24e1059f72859ed86141d
Author: blmayer <git@mail.blmayer.dev>
Date:   Thu May 25 01:31:16 2023 -0300

    Added timezone support
    
    - Using vault package

diff --git a/interfaces/gwi/gwi.go b/interfaces/gwi/gwi.go
index a529625..b26e8c7 100644
--- a/interfaces/gwi/gwi.go
+++ b/interfaces/gwi/gwi.go
@@ -21,6 +21,9 @@ import (
 
 	"blmayer.dev/x/dovel/config"
 	"blmayer.dev/x/dovel/interfaces"
+
+	"blmayer.dev/x/vault"
+	
 	"github.com/OfimaticSRL/parsemail"
 	"github.com/emersion/go-msgauth/dkim"
 )
@@ -36,10 +39,10 @@ type GWIHandler struct {
 	Commands   map[string]func(email interfaces.Email) error
 	domain     string
 	privateKey crypto.Signer
-	vault      interfaces.Vault
+	vault      vault.Vault[interfaces.WebUser]
 }
 
-func NewGWIHandler(c config.InboxConfig, vault interfaces.Vault) (GWIHandler, error) {
+func NewGWIHandler(c config.InboxConfig, vault vault.Vault[interfaces.WebUser]) (GWIHandler, error) {
 	g := GWIHandler{root: c.Root, domain: c.Domain, vault: vault}
 	if c.DKIMKeyPath != "" {
 		key, err := ioutil.ReadFile(c.DKIMKeyPath)
@@ -118,10 +121,10 @@ func (g GWIHandler) Save(email interfaces.Email) error {
 
 	// notify owner
 	owner := g.vault.GetUser(user)
-	if owner == nil || owner.Email() == "" {
+	if owner.Name == "" {
 		return nil
 	}
-	email.To = []string{owner.Email()}
+	email.To = []string{owner.Email}
 	email.Body = fmt.Sprintf(
 		`You received an email with the subject %s.
 

interfaces/main.go

commit 1fbfe59fc12497bed1d24e1059f72859ed86141d
Author: blmayer <git@mail.blmayer.dev>
Date:   Thu May 25 01:31:16 2023 -0300

    Added timezone support
    
    - Using vault package

diff --git a/interfaces/main.go b/interfaces/main.go
index 3b58c3d..d618b6b 100644
--- a/interfaces/main.go
+++ b/interfaces/main.go
@@ -15,16 +15,24 @@ import (
 	"github.com/OfimaticSRL/parsemail"
 )
 
-type User interface {
-	Email() string
-	Login() string
-	Pass() string
-	Settings() any
+type tz struct {
+	Name string
+	Offset int
 }
 
-type Vault interface {
-	GetUser(login string) User
-	Validate(login, pass string) bool
+type WebUser struct {
+	Name string
+	Email string
+	Password string
+	TimeZone tz
+}
+
+func (w WebUser) Login() string {
+	return w.Name
+}
+
+func (w WebUser) Pass() string {
+	return w.Password
 }
 
 type File struct {

www/index.html

commit 1fbfe59fc12497bed1d24e1059f72859ed86141d
Author: blmayer <git@mail.blmayer.dev>
Date:   Thu May 25 01:31:16 2023 -0300

    Added timezone support
    
    - Using vault package

diff --git a/www/index.html b/www/index.html
index c91b2fe..00b8540 100644
--- a/www/index.html
+++ b/www/index.html
@@ -16,12 +16,14 @@ _  __  /_  __ \_ | / /  _ \_  /
 
 </pre>
 	</center>
-<a href=compose.html>compose</a>
+<a href=compose.html>compose</a>&emsp;
+<a href=logout.html>logout</a>
 
+{{$format := "02 Jan 2006 15:04:05"}}
 {{range (.Mailer.Mailboxes ".")}}
 <p>
-	<a href="inboxes.html?inbox={{.Title}}">{{.Title}}</a><br>
-	Updated: {{.LastMod.Format "Mon, 02 Jan 2006 15:04:05 MST"}}
+	<a href="inboxes.html?inbox={{.Title}}">{{.Title}}</a>
+	<small>{{(.LastMod.In $.User.TimeZone.Name $.User.TimeZone.Offset).Format $format}}</small>
 </p>
 {{end}}
 </body>

www/style-min.html

commit 1fbfe59fc12497bed1d24e1059f72859ed86141d
Author: blmayer <git@mail.blmayer.dev>
Date:   Thu May 25 01:31:16 2023 -0300

    Added timezone support
    
    - Using vault package

diff --git a/www/style-min.html b/www/style-min.html
index 1c4fa65..28b204d 100644
--- a/www/style-min.html
+++ b/www/style-min.html
@@ -11,6 +11,9 @@
 	a {
 		color: #888
 	}
+	small {
+		float: right;
+	}
 	input, textarea {
 		color: #888;
 		font-family: monospace;
@@ -27,5 +30,12 @@
 	pre {
 		white-space: pre-wrap;
 	}
+
+	@media (prefers-color-scheme: dark) {
+		body {
+			background-color: black;
+			color: white;
+		}
+	}
 </style>