diff options
| author | JP Appel <jeanpierre.appel01@gmail.com> | 2024-10-15 23:56:50 -0400 |
|---|---|---|
| committer | JP Appel <jeanpierre.appel01@gmail.com> | 2024-10-15 23:57:30 -0400 |
| commit | bd6f2159931b5877922efed11f7ea9c54b172379 (patch) | |
| tree | 12bca5fbf677a0d0146686128cdcb39800536206 /db/auth.go | |
| parent | 9b6e79c40b98d8e36e4b7f5e1cc6f6a9f0feabbc (diff) | |
Add authentication middlewaredashboard
Diffstat (limited to 'db/auth.go')
| -rw-r--r-- | db/auth.go | 80 |
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 +} |
