51 lines
1.1 KiB
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
|
|
}
|