aboutsummaryrefslogtreecommitdiff
path: root/cmd/web/middleware
diff options
context:
space:
mode:
authorSamuel Johnson <[email protected]>2025-11-24 13:53:18 -0500
committerSamuel Johnson <[email protected]>2025-11-24 13:53:18 -0500
commit368a462bc744d8e9084eacfaddeb9afcaf7f7133 (patch)
treec6e8f665d6cb9713b9226b10c4a341e60b8e91c2 /cmd/web/middleware
parent4d4419f51557bef6b64dca8635ed61616d262a9b (diff)
Add session management
Diffstat (limited to 'cmd/web/middleware')
-rw-r--r--cmd/web/middleware/auth.go81
1 files changed, 81 insertions, 0 deletions
diff --git a/cmd/web/middleware/auth.go b/cmd/web/middleware/auth.go
new file mode 100644
index 0000000..b53980a
--- /dev/null
+++ b/cmd/web/middleware/auth.go
@@ -0,0 +1,81 @@
+package middleware
+
+import (
+ "database/sql"
+ "log"
+ "net/http"
+ "time"
+)
+
+type AuthMiddleware struct {
+ Err *log.Logger
+ Db *sql.DB
+}
+
+func (auth *AuthMiddleware) Resolve(next http.HandlerFunc) http.HandlerFunc {
+ return http.HandlerFunc(
+ func (w http.ResponseWriter, r *http.Request) {
+ cookie, err := r.Cookie("paterissa_session_token")
+ if err != nil {
+ w.WriteHeader(401)
+ w.Write([]byte("Unauthorized"))
+ return
+ }
+
+ stmt, err := auth.Db.Prepare("SELECT * FROM cookies WHERE content = $1;")
+ if err != nil {
+ cookie = &http.Cookie{
+ Name: "paterissa_session_token",
+ Value: "",
+ Path: "/",
+ MaxAge: -1,
+ HttpOnly: true,
+ }
+ http.SetCookie(w, cookie)
+
+ w.Write([]byte("Unauthorized"))
+ auth.Err.Printf("Could not retrieve cookie from DB: %v\n", err)
+ return
+ }
+ defer stmt.Close()
+
+ var id int
+ var content string
+ var userId int
+ var expiration time.Time
+
+ row := stmt.QueryRow(cookie.Value)
+ err = row.Scan(&id, &content, &userId, &expiration)
+ if err != nil {
+ cookie = &http.Cookie{
+ Name: "paterissa_session_token",
+ Value: "",
+ Path: "/",
+ MaxAge: -1,
+ HttpOnly: true,
+ }
+ http.SetCookie(w, cookie)
+
+ w.Write([]byte("Unauthorized"))
+ auth.Err.Printf("Could not retrieve cookie from DB: %v\n", err)
+ return
+ }
+
+ if time.Now().After(expiration) {
+ cookie = &http.Cookie{
+ Name: "paterissa_session_token",
+ Value: "",
+ Path: "/",
+ MaxAge: -1,
+ HttpOnly: true,
+ }
+ http.SetCookie(w, cookie)
+
+ w.Write([]byte("Expired"))
+ return
+ }
+
+ next.ServeHTTP(w, r)
+ return
+ })
+}