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>