2025-02-02 08:20:51 +00:00
|
|
|
package core
|
|
|
|
|
|
|
|
import (
|
|
|
|
"database/sql"
|
|
|
|
"fmt"
|
|
|
|
|
|
|
|
"github.com/alexedwards/argon2id"
|
|
|
|
_ "github.com/mattn/go-sqlite3"
|
|
|
|
)
|
|
|
|
|
|
|
|
func SetPassword(db DB, password string) error {
|
|
|
|
hash, err := argon2id.CreateHash(password, argon2id.DefaultParams)
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("failed to hash password: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
_, err = db.Exec("insert into password (id, hash) values (1, ?)", hash)
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("failed to set password hash: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2025-02-06 14:33:39 +00:00
|
|
|
func HasPassword(db DB) (bool, error) {
|
|
|
|
var i int
|
|
|
|
err := db.QueryRow("select count(*) from password").Scan(&i)
|
|
|
|
if err != nil {
|
|
|
|
return false, err
|
|
|
|
}
|
|
|
|
return i > 0, nil
|
|
|
|
}
|
|
|
|
|
2025-02-02 08:20:51 +00:00
|
|
|
func CheckPassword(db DB, password string) (bool, error) {
|
|
|
|
var hash string
|
|
|
|
err := db.QueryRow("select hash from password limit 1").Scan(&hash)
|
|
|
|
if err != nil {
|
|
|
|
if err == sql.ErrNoRows {
|
|
|
|
return true, nil
|
|
|
|
}
|
|
|
|
return false, fmt.Errorf("failed to query password hash from database: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
match, err := argon2id.ComparePasswordAndHash(password, hash)
|
|
|
|
if err != nil {
|
|
|
|
return false, fmt.Errorf("failed to compare password and hash: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
return match, nil
|
|
|
|
}
|