perseus/account/login.go

51 lines
1.1 KiB
Go

package account
import (
"log"
"tildegit.org/andinus/perseus/password"
"tildegit.org/andinus/perseus/storage"
)
// Login takes in login details and returns an error. If error doesn't
// equal nil then consider login failed. It will also set the u.Token
// field.
func (u *User) Login(db *storage.DB) error {
// Acquire read lock on the database.
db.Mu.RLock()
// Get password for this user from the database.
stmt, err := db.Conn.Prepare("SELECT hash FROM accounts WHERE username = ?")
if err != nil {
log.Printf("account/login.go: %s\n",
"failed to prepare statement")
return err
}
defer stmt.Close()
var hash string
err = stmt.QueryRow(u.Username).Scan(&hash)
if err != nil {
log.Printf("account/login.go: %s\n",
"query failed")
return err
}
u.Hash = hash
// Check user's password.
err = password.Check(u.Password, u.Hash)
if err != nil {
log.Printf("account/login.go: %s%s\n",
"user login failed, username: ", u.Username)
return err
}
db.Mu.RUnlock()
err = u.addToken(db)
if err != nil {
log.Printf("account/login.go: %s\n",
"addtoken failed")
}
return err
}