-
Notifications
You must be signed in to change notification settings - Fork 23
/
user.go
136 lines (123 loc) · 3.71 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
132
133
134
135
136
package user
import (
"github.com/MG-RAST/Shock/shock-server/conf"
"github.com/MG-RAST/Shock/shock-server/db"
"github.com/MG-RAST/golib/go-uuid/uuid"
mgo "gopkg.in/mgo.v2"
"gopkg.in/mgo.v2/bson"
)
// Array of User
type Users []User
// User struct
type User struct {
Uuid string `bson:"uuid" json:"uuid"`
Username string `bson:"username" json:"username"`
Fullname string `bson:"fullname" json:"fullname"`
Email string `bson:"email" json:"email"`
Password string `bson:"password" json:"-"`
Admin bool `bson:"shock_admin" json:"shock_admin"`
}
// Initialize creates a copy of the mongodb connection and then uses that connection to
// create the Users collection in mongodb. Then, it ensures that there is a unique index
// on the uuid key and the username key in this collection, creating the indexes if necessary.
func Initialize() (err error) {
session := db.Connection.Session.Copy()
defer session.Close()
c := session.DB(conf.MONGODB_DATABASE).C("Users")
if err = c.EnsureIndex(mgo.Index{Key: []string{"uuid"}, Unique: true}); err != nil {
return err
}
if err = c.EnsureIndex(mgo.Index{Key: []string{"username"}, Unique: true}); err != nil {
return err
}
// Setting admin users based on config file. First, set all users to Admin = false
if _, err = c.UpdateAll(bson.M{}, bson.M{"$set": bson.M{"shock_admin": false}}); err != nil {
return err
}
// This config parameter contains a string that should be a comma-separated list of users that are Admins.
for _, v := range conf.AdminUsers {
if info, err := c.UpdateAll(bson.M{"username": v}, bson.M{"$set": bson.M{"shock_admin": true}}); err != nil {
if err != nil {
return err
} else if info.Updated == 0 {
if _, err := New(v, "", true); err != nil {
return err
}
}
}
}
return
}
func New(username string, password string, isAdmin bool) (u *User, err error) {
u = &User{Uuid: uuid.New(), Username: username, Password: password, Admin: isAdmin}
err = u.Save()
if err != nil {
u = nil
}
return
}
func FindByUuid(uuid string) (u *User, err error) {
session := db.Connection.Session.Copy()
defer session.Close()
c := session.DB(conf.MONGODB_DATABASE).C("Users")
u = &User{Uuid: uuid}
if err = c.Find(bson.M{"uuid": u.Uuid}).One(&u); err != nil {
return nil, err
}
return
}
func FindByUsernamePassword(username string, password string) (u *User, err error) {
session := db.Connection.Session.Copy()
defer session.Close()
c := session.DB(conf.MONGODB_DATABASE).C("Users")
u = &User{}
if err = c.Find(bson.M{"username": username, "password": password}).One(&u); err != nil {
return nil, err
}
return
}
func AdminGet(u *Users) (err error) {
session := db.Connection.Session.Copy()
defer session.Close()
c := session.DB(conf.MONGODB_DATABASE).C("Users")
err = c.Find(nil).All(u)
return
}
func (u *User) SetMongoInfo() (err error) {
if uu, admin, err := dbGetInfo(u.Username); err == nil {
u.Uuid = uu
u.Admin = admin
return nil
} else {
// this is a new user
u.Uuid = uuid.New()
// check if user is on admin list, if so set as true
for _, v := range conf.AdminUsers {
if v == u.Username {
u.Admin = true
break
}
}
if err := u.Save(); err != nil {
return err
}
}
return
}
func dbGetInfo(username string) (uuid string, admin bool, err error) {
session := db.Connection.Session.Copy()
defer session.Close()
c := session.DB(conf.MONGODB_DATABASE).C("Users")
u := User{}
if err = c.Find(bson.M{"username": username}).One(&u); err != nil {
return "", false, err
}
return u.Uuid, u.Admin, nil
}
func (u *User) Save() (err error) {
session := db.Connection.Session.Copy()
defer session.Close()
c := session.DB(conf.MONGODB_DATABASE).C("Users")
_, err = c.Upsert(bson.M{"uuid": u.Uuid}, &u)
return
}