/
macaroons.go
87 lines (65 loc) · 1.43 KB
/
macaroons.go
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
package database
import (
"database/sql"
"encoding/hex"
"errors"
)
type Macaroon struct {
Id []byte
RootKey []byte
}
func parseMacaroon(rows *sql.Rows) (*Macaroon, error) {
var macaroon Macaroon
var id string
var rootKey string
err := scanRow(
rows,
map[string]interface{}{
"id": &id,
"rootKey": &rootKey,
},
)
if err != nil {
return nil, err
}
macaroon.Id, err = hex.DecodeString(id)
if err != nil {
return nil, err
}
macaroon.RootKey, err = hex.DecodeString(rootKey)
if err != nil {
return nil, err
}
return &macaroon, err
}
func (database *Database) QueryMacaroon(id []byte) (macaroon *Macaroon, err error) {
rows, err := database.db.Query("SELECT * FROM macaroons WHERE id = '" + hex.EncodeToString(id) + "'")
if err != nil {
return macaroon, err
}
defer rows.Close()
if rows.Next() {
macaroon, err = parseMacaroon(rows)
if err != nil {
return macaroon, err
}
} else {
return macaroon, errors.New("could not find Macaroon: " + hex.EncodeToString(id))
}
return macaroon, err
}
func (database *Database) CreateMacaroon(macaroon Macaroon) error {
insertStatement := "INSERT INTO macaroons (id, rootKey) VALUES (?, ?)"
statement, err := database.db.Prepare(insertStatement)
if err != nil {
return err
}
_, err = statement.Exec(
hex.EncodeToString(macaroon.Id),
hex.EncodeToString(macaroon.RootKey),
)
if err != nil {
return err
}
return statement.Close()
}