aboutsummaryrefslogtreecommitdiff
path: root/http_handle_login.go
diff options
context:
space:
mode:
authorRunxi Yu <me@runxiyu.org>2025-02-13 08:46:43 +0800
committerRunxi Yu <me@runxiyu.org>2025-02-13 08:46:43 +0800
commit4d8c2f63ef5353d4dd5ef9fc65e0cd9b3142a413 (patch)
treea644c5ff3b5971e8bcd7bf90e9207e057c8ffff9 /http_handle_login.go
parentlogin: Implement password validation (diff)
downloadforge-4d8c2f63ef5353d4dd5ef9fc65e0cd9b3142a413.tar.gz
forge-4d8c2f63ef5353d4dd5ef9fc65e0cd9b3142a413.tar.zst
forge-4d8c2f63ef5353d4dd5ef9fc65e0cd9b3142a413.zip
login: Set cookie
Diffstat (limited to 'http_handle_login.go')
-rw-r--r--http_handle_login.go36
1 files changed, 36 insertions, 0 deletions
diff --git a/http_handle_login.go b/http_handle_login.go
index 9e859c2..6f98859 100644
--- a/http_handle_login.go
+++ b/http_handle_login.go
@@ -1,9 +1,12 @@
package main
import (
+ "crypto/rand"
+ "encoding/base64"
"errors"
"fmt"
"net/http"
+ "time"
"github.com/alexedwards/argon2id"
"github.com/jackc/pgx/v5"
@@ -53,4 +56,37 @@ func handle_login(w http.ResponseWriter, r *http.Request, params map[string]any)
return
}
+ cookie_value, err := random_urlsafe_string(16)
+ now := time.Now()
+ expiry := now.Add(time.Duration(config.HTTP.CookieExpiry) * time.Second)
+
+ cookie := http.Cookie{
+ Name: "session",
+ Value: cookie_value,
+ SameSite: http.SameSiteLaxMode,
+ HttpOnly: true,
+ Secure: false, // TODO
+ Expires: expiry,
+ Path: "/",
+ // TODO: Expire
+ }
+
+ http.SetCookie(w, &cookie)
+
+ _, err = database.Exec(r.Context(), "INSERT INTO sessions (user_id, session_id) VALUES ($1, $2)", user_id, cookie_value)
+ if err != nil {
+ fmt.Fprintln(w, "Error inserting session:", err.Error())
+ return
+ }
+
+ http.Redirect(w, r, "/", http.StatusSeeOther)
+}
+
+func random_urlsafe_string(sz int) (string, error) {
+ r := make([]byte, 3*sz)
+ _, err := rand.Read(r)
+ if err != nil {
+ return "", fmt.Errorf("error generating random string: %w", err)
+ }
+ return base64.RawURLEncoding.EncodeToString(r), nil
}