aboutsummaryrefslogtreecommitdiff
path: root/http_handle_login.go
diff options
context:
space:
mode:
authorRunxi Yu <me@runxiyu.org>2025-02-13 07:29:56 +0800
committerRunxi Yu <me@runxiyu.org>2025-02-13 07:29:56 +0800
commitdd6df3273922b61b41e0e3ec172c6c7db99cadc4 (patch)
treee754b25ed8cb646f381ca16e981bc6c77ed0007e /http_handle_login.go
parenthttp_handle_*.go: Use fmt.Fprintln, not w.Write (diff)
downloadforge-dd6df3273922b61b41e0e3ec172c6c7db99cadc4.tar.gz
forge-dd6df3273922b61b41e0e3ec172c6c7db99cadc4.tar.zst
forge-dd6df3273922b61b41e0e3ec172c6c7db99cadc4.zip
login: Implement password validation
Diffstat (limited to 'http_handle_login.go')
-rw-r--r--http_handle_login.go41
1 files changed, 39 insertions, 2 deletions
diff --git a/http_handle_login.go b/http_handle_login.go
index b60a71c..9e859c2 100644
--- a/http_handle_login.go
+++ b/http_handle_login.go
@@ -1,8 +1,12 @@
package main
import (
+ "errors"
"fmt"
"net/http"
+
+ "github.com/alexedwards/argon2id"
+ "github.com/jackc/pgx/v5"
)
func handle_login(w http.ResponseWriter, r *http.Request, params map[string]any) {
@@ -10,10 +14,43 @@ func handle_login(w http.ResponseWriter, r *http.Request, params map[string]any)
err := templates.ExecuteTemplate(w, "login", params)
if err != nil {
fmt.Fprintln(w, "Error rendering template:", err.Error())
+ }
+ return
+ }
+
+ var user_id int
+ username := r.PostFormValue("username")
+ password := r.PostFormValue("password")
+
+ var password_hash string
+ err := database.QueryRow(r.Context(), "SELECT id, password FROM users WHERE username = $1", username).Scan(&user_id, &password_hash)
+ if err != nil {
+ if errors.Is(err, pgx.ErrNoRows) {
+ params["login_error"] = "Unknown username"
+ err := templates.ExecuteTemplate(w, "login", params)
+ if err != nil {
+ fmt.Fprintln(w, "Error rendering template:", err.Error())
+ }
+ return
+ }
+ fmt.Fprintln(w, "Error querying user information:", err.Error())
+ return
+ }
+
+ match, err := argon2id.ComparePasswordAndHash(password, password_hash)
+ if err != nil {
+ fmt.Fprintln(w, "Error comparing password and hash:", err.Error())
+ return
+ }
+
+ if !match {
+ params["login_error"] = "Invalid password"
+ err := templates.ExecuteTemplate(w, "login", params)
+ if err != nil {
+ fmt.Fprintln(w, "Error rendering template:", err.Error())
return
}
+ return
}
- _ = r.PostFormValue("username")
- _ = r.PostFormValue("password")
}