-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdatabase.go
More file actions
120 lines (91 loc) · 1.94 KB
/
Copy pathdatabase.go
File metadata and controls
120 lines (91 loc) · 1.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package gemdrive
import (
//"fmt"
"encoding/json"
"errors"
"io/ioutil"
"log"
"path/filepath"
"sync"
)
type GemDriveDatabase struct {
Keys map[string]*KeyData `json:"keys"`
dbPath string
mutex *sync.Mutex
}
func NewGemDriveDatabase(dir string) (*GemDriveDatabase, error) {
dbPath := filepath.Join(dir, "gemdrive_db.json")
db := &GemDriveDatabase{
Keys: make(map[string]*KeyData),
dbPath: dbPath,
mutex: &sync.Mutex{},
}
dbJson, err := ioutil.ReadFile(dbPath)
if err == nil {
err = json.Unmarshal(dbJson, &db)
if err != nil {
log.Println(err)
}
}
_, err = db.GetMasterKey()
if err != nil {
masterKey, err := genRandomKey()
if err != nil {
log.Println(err)
}
masterKeyData := &KeyData{
Parent: "",
Privileges: map[string]string{
"/": "write",
},
}
db.SetKeyData(masterKey, masterKeyData)
publicKeyData := &KeyData{
Parent: masterKey,
Privileges: make(map[string]string),
}
db.SetKeyData("public", publicKeyData)
db.Persist()
}
return db, nil
}
func (db GemDriveDatabase) Persist() error {
saveJson(db, db.dbPath)
return nil
}
func (db *GemDriveDatabase) SetKeyData(key string, keyData *KeyData) {
db.mutex.Lock()
defer db.mutex.Unlock()
db.Keys[key] = keyData
db.Persist()
}
func (db *GemDriveDatabase) DeleteKeyData(key string) error {
db.mutex.Lock()
defer db.mutex.Unlock()
_, exists := db.Keys[key]
if !exists {
return errors.New("No such key")
}
delete(db.Keys, key)
db.Persist()
return nil
}
func (db *GemDriveDatabase) GetMasterKey() (string, error) {
db.mutex.Lock()
defer db.mutex.Unlock()
for key, keyData := range db.Keys {
if keyData.Parent == "" {
return key, nil
}
}
return "", errors.New("No master key")
}
func (db *GemDriveDatabase) GetKeyData(key string) (*KeyData, error) {
db.mutex.Lock()
defer db.mutex.Unlock()
keyData, exists := db.Keys[key]
if !exists {
return nil, errors.New("Invalid key")
}
return keyData, nil
}