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 } 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 } 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 }