aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/db/auth.go
diff options
context:
space:
mode:
authorJP Appel <jeanpierre.appel01@gmail.com>2024-10-15 23:56:50 -0400
committerJP Appel <jeanpierre.appel01@gmail.com>2024-10-15 23:57:30 -0400
commitbd6f2159931b5877922efed11f7ea9c54b172379 (patch)
tree12bca5fbf677a0d0146686128cdcb39800536206 /db/auth.go
parent9b6e79c40b98d8e36e4b7f5e1cc6f6a9f0feabbc (diff)
Add authentication middlewaredashboard
Diffstat (limited to 'db/auth.go')
-rw-r--r--db/auth.go80
1 files changed, 80 insertions, 0 deletions
diff --git a/db/auth.go b/db/auth.go
new file mode 100644
index 0000000..e2bac38
--- /dev/null
+++ b/db/auth.go
@@ -0,0 +1,80 @@
+package db
+
+import (
+ "crypto/subtle"
+ "database/sql"
+)
+
+type AuthProvider interface {
+ SaltedHash(username string) [32]byte
+ Salt(username string) [16]byte
+ UserExists(username string) bool
+}
+
+type DBAuthProvider struct {
+ db *sql.DB
+}
+
+func NewDBAuthProvider(db *sql.DB) AuthProvider {
+ provider := new(DBAuthProvider)
+ provider.db = db
+
+ return provider
+}
+
+func (dbAuth DBAuthProvider) Close() {
+ dbAuth.db.Close()
+}
+
+func (dbAuth DBAuthProvider) SaltedHash(username string) [32]byte {
+ row := dbAuth.db.QueryRow(`
+ SELECT saltedhash FROM users WHERE username = ?
+ `, username)
+
+ buf := make([]byte, 32)
+ should_copy := 1
+
+ saltedHash := [32]byte{0}
+
+ err := row.Scan(&buf)
+ if err != nil {
+ should_copy = 0
+ }
+
+ subtle.ConstantTimeCopy(should_copy, saltedHash[:], buf[:32])
+
+ return saltedHash
+}
+
+func (dbAuth DBAuthProvider) Salt(username string) [16]byte {
+ row := dbAuth.db.QueryRow(`
+ SELECT salt FROM users WHERE username = ?
+ `, username)
+
+ buf := make([]byte, 16)
+ should_copy := 1
+
+ salt := [16]byte{0}
+
+ err := row.Scan(&buf)
+ if err != nil {
+ should_copy = 0
+ }
+
+ subtle.ConstantTimeCopy(should_copy, salt[:], buf[:16])
+
+ return salt
+}
+
+func (dbAuth DBAuthProvider) UserExists(username string) bool {
+ row := dbAuth.db.QueryRow(`
+ SELECT 1 FROM users WHERE username = ?
+ `, username)
+
+ err := row.Scan(new(int))
+ if err != nil {
+ return false
+ }
+
+ return true
+}