Skip to content

Commit e6f8149

Browse files
committed
Store everything in XDG_CONFIG_HOME, add status command
1 parent acf2a5e commit e6f8149

4 files changed

Lines changed: 76 additions & 5 deletions

File tree

auth/auth.go

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,13 @@ import (
1313
"golang.org/x/crypto/nacl/secretbox"
1414
"golang.org/x/crypto/openpgp"
1515

16+
"github.com/emersion/hydroxide/config"
1617
"github.com/emersion/hydroxide/protonmail"
1718
)
1819

19-
const authFile = "auth.json"
20+
func authFilePath() (string, error) {
21+
return config.Path("auth.json")
22+
}
2023

2124
type CachedAuth struct {
2225
protonmail.Auth
@@ -26,7 +29,11 @@ type CachedAuth struct {
2629
}
2730

2831
func readCachedAuths() (map[string]string, error) {
29-
f, err := os.Open(authFile)
32+
p, err := authFilePath()
33+
if err != nil {
34+
return nil, err
35+
}
36+
f, err := os.Open(p)
3037
if os.IsNotExist(err) {
3138
return nil, nil
3239
} else if err != nil {
@@ -40,7 +47,11 @@ func readCachedAuths() (map[string]string, error) {
4047
}
4148

4249
func saveAuths(auths map[string]string) error {
43-
f, err := os.Create(authFile)
50+
p, err := authFilePath()
51+
if err != nil {
52+
return err
53+
}
54+
f, err := os.Create(p)
4455
if err != nil {
4556
return err
4657
}
@@ -123,6 +134,19 @@ func authenticate(c *protonmail.Client, cachedAuth *CachedAuth, username string)
123134
return c.Unlock(auth, cachedAuth.MailboxPassword)
124135
}
125136

137+
func ListUsernames() ([]string, error) {
138+
auths, err := readCachedAuths()
139+
if err != nil {
140+
return nil, err
141+
}
142+
143+
l := make([]string, 0, len(auths))
144+
for username, _ := range auths {
145+
l = append(l, username)
146+
}
147+
return l, nil
148+
}
149+
126150
func GeneratePassword() (secretKey *[32]byte, password string, err error) {
127151
var key [32]byte
128152
if _, err = io.ReadFull(rand.Reader, key[:]); err != nil {

cmd/hydroxide/hydroxide.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,20 @@ func main() {
138138
}
139139

140140
fmt.Println("Bridge password:", bridgePassword)
141+
case "status":
142+
usernames, err := auth.ListUsernames()
143+
if err != nil {
144+
log.Fatal(err)
145+
}
146+
147+
if len(usernames) == 0 {
148+
fmt.Printf("No logged in user.\n")
149+
} else {
150+
fmt.Printf("%v logged in user(s):\n", len(usernames))
151+
for _, u := range usernames {
152+
fmt.Printf("- %v\n", u)
153+
}
154+
}
141155
case "smtp":
142156
port := os.Getenv("PORT")
143157
if port == "" {

config/config.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package config
2+
3+
import (
4+
"errors"
5+
"os"
6+
"path/filepath"
7+
)
8+
9+
func Path(filename string) (string, error) {
10+
configHome := os.Getenv("XDG_CONFIG_HOME")
11+
if configHome == "" {
12+
home := os.Getenv("HOME")
13+
if home == "" {
14+
return "", errors.New("HOME not set")
15+
}
16+
configHome = filepath.Join(home, ".config")
17+
}
18+
19+
p := filepath.Join(configHome, "hydroxide", filename)
20+
21+
dirname, _ := filepath.Split(p)
22+
if err := os.MkdirAll(dirname, 0700); err != nil {
23+
return "", err
24+
}
25+
26+
return p, nil
27+
}

imap/database/user.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66

77
"github.com/boltdb/bolt"
88

9+
"github.com/emersion/hydroxide/config"
910
"github.com/emersion/hydroxide/protonmail"
1011
)
1112

@@ -223,8 +224,13 @@ func (u *User) Close() error {
223224
return u.db.Close()
224225
}
225226

226-
func Open(path string) (*User, error) {
227-
db, err := bolt.Open(path, 0700, nil)
227+
func Open(filename string) (*User, error) {
228+
p, err := config.Path(filename)
229+
if err != nil {
230+
return nil, err
231+
}
232+
233+
db, err := bolt.Open(p, 0700, nil)
228234
if err != nil {
229235
return nil, err
230236
}

0 commit comments

Comments
 (0)