/
user.go
131 lines (101 loc) · 2.53 KB
/
user.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
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
121
122
123
124
125
126
127
128
129
130
131
// Copyright 2012 - 2014 Alex Palaistras. All rights reserved.
// Use of this source code is governed by the MIT License, the
// full text of which can be found in the LICENSE file.
// Package user contains functionality for querying, adding and removing
// users, or consumers of services provided by modules via RPC.
package user
import (
"crypto/rand"
"crypto/sha1"
"database/sql"
"fmt"
"io"
_ "github.com/mattn/go-sqlite3"
)
var db *sql.DB
type User struct {
// Contains private or unexported fields.
Id int
Authkey string
}
func Get(id int) (*User, error) {
user := new(User)
query := `SELECT id, authkey FROM users WHERE id = ?`
error := db.QueryRow(query, id).Scan(&user.Id, &user.Authkey)
if error != nil {
return nil, fmt.Errorf("User with id '%d' not found.", id)
}
return user, nil
}
func Save() (*User, error) {
// Generate random SHA1 authkey.
buf := sha1.New()
_, error := io.CopyN(buf, rand.Reader, 20)
if error != nil {
return nil, error
}
auth := fmt.Sprintf("%x", buf.Sum(nil))
// Create user.
query := `INSERT INTO users (authkey) VALUES (?)`
result, error := db.Exec(query, auth)
if error != nil {
return nil, error
}
var id int64
if id, error = result.LastInsertId(); error != nil {
return nil, error
}
var user = &User{
int(id),
auth,
}
return user, nil
}
func Remove(id int) (bool, error) {
var exists int
// Check if user already exists.
query := `SELECT id FROM users WHERE id = ?`
db.QueryRow(query, id).Scan(&exists)
if exists == 0 {
return false, fmt.Errorf("User does not exist")
}
// Delete user.
query = `DELETE FROM users WHERE id = ?`
_, error := db.Exec(query, id)
if error != nil {
return false, error
}
// Delete user options.
query = `DELETE FROM user_conf WHERE user_id = ?`
_, error = db.Exec(query, id)
if error != nil {
return false, error
}
return true, nil
}
func List() ([]User, error) {
// Execute query.
rows, error := db.Query(`SELECT id, authkey FROM users ORDER BY id ASC`)
if error != nil {
return nil, fmt.Errorf("Error fetching user list: %s", error)
}
users := make([]User, 0)
for i := 0; rows.Next(); i++ {
user := User{}
rows.Scan(&user.Id, &user.Authkey)
users = append(users, user)
}
if error = rows.Err(); error != nil {
return nil, error
}
return users, nil
}
func Setup(datadir, filename string) error {
var error error
// Connect to system database.
db, error = sql.Open("sqlite3", datadir+"/"+filename)
if error != nil {
return fmt.Errorf("Error initializing database: %s\n", error)
}
return nil
}