37 lines
814 B
Go
37 lines
814 B
Go
package main
|
|
|
|
import (
|
|
"golang.org/x/crypto/bcrypt"
|
|
"database/sql"
|
|
"fmt"
|
|
"net/http"
|
|
)
|
|
|
|
func authenticateUser(db *sql.DB, username, password string) bool {
|
|
hashedPassword, ok := getPasswordForUser(db, username)
|
|
if ok {
|
|
err := bcrypt.CompareHashAndPassword(hashedPassword, []byte(password))
|
|
//TODO: print error message?
|
|
return err == nil
|
|
} else {
|
|
return false
|
|
}
|
|
}
|
|
|
|
func basicAuth(db *sql.DB) http.HandlerFunc {
|
|
return func(w http.ResponseWriter, r *http.Request) {
|
|
user, pass, ok := r.BasicAuth()
|
|
if !ok || !authenticateUser(db, user, pass) {
|
|
w.Header().Set("WWW-Authenticate", `Basic realm="dyndns"`)
|
|
w.WriteHeader(401)
|
|
w.Write([]byte("badauth"))
|
|
return
|
|
}
|
|
|
|
userdata, err := getDataForUser(db, user)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
}
|
|
handleRequest(w, r, userdata)
|
|
}
|
|
}
|