This is the main dovel repository, it has the Go code to run dovel SMTP server.
Author: blmayer (git@mail.blmayer.dev)
Date: Thu May 25 01:31:16 2023 -0300
Parent: 6a2353a
Added timezone support - Using vault package
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) }
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 -}
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,
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
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=
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>
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{}
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.
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 {
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>  +<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>
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>