97 lines
1.8 KiB
Go
97 lines
1.8 KiB
Go
|
package database
|
||
|
|
||
|
import log "github.com/cihub/seelog"
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"crypto/md5"
|
||
|
"errors"
|
||
|
"labix.org/v2/mgo"
|
||
|
"labix.org/v2/mgo/bson"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
user_coll = "users"
|
||
|
pass_salt = "ImperialLibSalt"
|
||
|
)
|
||
|
|
||
|
type User struct {
|
||
|
user db_user
|
||
|
err error
|
||
|
coll *mgo.Collection
|
||
|
}
|
||
|
|
||
|
type db_user struct {
|
||
|
User string
|
||
|
Pass []byte
|
||
|
Role string
|
||
|
}
|
||
|
|
||
|
func getUser(coll *mgo.Collection, name string) *User {
|
||
|
u := new(User)
|
||
|
if !validUserName(name) {
|
||
|
u.err = errors.New("Invalid username")
|
||
|
return u
|
||
|
}
|
||
|
|
||
|
u.coll = coll
|
||
|
err := u.coll.Find(bson.M{"user": name}).One(&u.user)
|
||
|
if err != nil {
|
||
|
log.Warn("Error on database checking user ", name, ": ", err)
|
||
|
u.err = errors.New("User not found")
|
||
|
return u
|
||
|
}
|
||
|
return u
|
||
|
}
|
||
|
|
||
|
func addUser(coll *mgo.Collection, name string, pass string) error {
|
||
|
if !validUserName(name) {
|
||
|
return errors.New("Invalid user name")
|
||
|
}
|
||
|
num, err := coll.Find(bson.M{"user": name}).Count()
|
||
|
if err != nil {
|
||
|
log.Error("Error on database checking user ", name, ": ", err)
|
||
|
return errors.New("An error happen on the database")
|
||
|
}
|
||
|
if num != 0 {
|
||
|
return errors.New("User name already exist")
|
||
|
}
|
||
|
|
||
|
var user db_user
|
||
|
user.Pass = md5Pass(pass)
|
||
|
user.User = name
|
||
|
user.Role = ""
|
||
|
return coll.Insert(user)
|
||
|
}
|
||
|
|
||
|
func validUserName(name string) bool {
|
||
|
return name != ""
|
||
|
}
|
||
|
|
||
|
func (u User) Valid(pass string) bool {
|
||
|
if u.err != nil {
|
||
|
return false
|
||
|
}
|
||
|
hash := md5Pass(pass)
|
||
|
return bytes.Compare(u.user.Pass, hash) == 0
|
||
|
}
|
||
|
|
||
|
func (u User) Role() string {
|
||
|
return u.user.Role
|
||
|
}
|
||
|
|
||
|
func (u *User) SetPassword(pass string) error {
|
||
|
if u.err != nil {
|
||
|
return u.err
|
||
|
}
|
||
|
hash := md5Pass(pass)
|
||
|
return u.coll.Update(bson.M{"user": u.user.User}, bson.M{"$set": bson.M{"pass": hash}})
|
||
|
}
|
||
|
|
||
|
// FIXME: use a proper salting algorithm
|
||
|
func md5Pass(pass string) []byte {
|
||
|
h := md5.New()
|
||
|
hash := h.Sum(([]byte)(pass_salt + pass))
|
||
|
return hash
|
||
|
}
|