summaryrefslogtreecommitdiffhomepage
path: root/src/dbx/users.go
diff options
context:
space:
mode:
authorThomas Voss <mail@thomasvoss.com> 2025-06-09 02:51:27 +0200
committerThomas Voss <mail@thomasvoss.com> 2025-06-09 02:51:27 +0200
commit52db1d03e5067de4ba77c3a12465149d268eb3d1 (patch)
tree96286b94957e2546a789cbdcad2677b6f03b0973 /src/dbx/users.go
parent09defec0a015e7ddb118bd453ea2925a5cb9d5dc (diff)
Begin migration towards SQLite
Diffstat (limited to 'src/dbx/users.go')
-rw-r--r--src/dbx/users.go64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/dbx/users.go b/src/dbx/users.go
new file mode 100644
index 0000000..a0712ee
--- /dev/null
+++ b/src/dbx/users.go
@@ -0,0 +1,64 @@
+package dbx
+
+import (
+ "database/sql"
+ "errors"
+
+ "golang.org/x/crypto/bcrypt"
+ "golang.org/x/text/unicode/norm"
+)
+
+type User struct {
+ Email string
+ Username string
+ Password string
+ AdminP bool
+}
+
+var LoginFailed = errors.New("No user with the given username and password")
+
+func CreateUser(user User) error {
+ user.Username = norm.NFC.String(user.Username)
+ user.Password = norm.NFC.String(user.Password)
+
+ hash, err := bcrypt.GenerateFromPassword([]byte(user.Password), 15)
+ if err != nil {
+ return err
+ }
+
+ _, err = DB.Exec(`
+ INSERT INTO users (
+ email,
+ username,
+ password,
+ adminp
+ ) VALUES (?, ?, ?, ?)
+ `, user.Email, user.Username, string(hash), user.AdminP)
+ return err
+}
+
+func Login(username, password string) (User, error) {
+ username = norm.NFC.String(username)
+ password = norm.NFC.String(password)
+
+ u := User{}
+ /* TODO: Pass a context here? */
+ err := DB.QueryRow(`SELECT * FROM users WHERE username = ?`, username).
+ Scan(&u.Email, &u.Username, &u.Password, &u.AdminP)
+
+ switch {
+ case errors.Is(err, sql.ErrNoRows):
+ return User{}, LoginFailed
+ case err != nil:
+ return User{}, err
+ }
+
+ err = bcrypt.CompareHashAndPassword([]byte(u.Password), []byte(password))
+ switch {
+ case errors.Is(err, bcrypt.ErrMismatchedHashAndPassword):
+ return User{}, LoginFailed
+ case err != nil:
+ return User{}, err
+ }
+ return u, nil
+}