diff --git a/cmd/goddit/main.go b/cmd/goddit/main.go index d47b20e..aca7d8a 100644 --- a/cmd/goddit/main.go +++ b/cmd/goddit/main.go @@ -9,12 +9,19 @@ import ( ) func main() { - store, err := postgres.NewStore("postgres://postgres:secret@localhost/postgres?sslmode=disable") + dsn := "postgres://postgres:secret@localhost/postgres?sslmode=disable" + + store, err := postgres.NewStore(dsn) + if err != nil { + log.Fatal(err) + } + + sessions, err := web.NewSessionsManager(dsn) if err != nil { log.Fatal(err) } csrfKey := []byte("dmwij82jda92jf9a202na#d2.e3i!824") - h := web.NewHandler(store, csrfKey) + h := web.NewHandler(store, sessions, csrfKey) http.ListenAndServe(":3000", h) } diff --git a/go.mod b/go.mod index 6b8126a..7056015 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,8 @@ module git.snrd.de/Spaenny/goddit go 1.16 require ( + github.com/alexedwards/scs/postgresstore v0.0.0-20210822164020-33a92ced6c04 // indirect + github.com/alexedwards/scs/v2 v2.4.0 // indirect github.com/go-chi/chi v1.5.4 // indirect github.com/google/uuid v1.3.0 // direct github.com/gorilla/csrf v1.7.1 // indirect diff --git a/go.sum b/go.sum index 38fab2e..bb48cb2 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,7 @@ +github.com/alexedwards/scs/postgresstore v0.0.0-20210822164020-33a92ced6c04 h1:LDnHq6qDNQmLaYsC4jxMieUalD0HlGfGrqFXoeTdMaI= +github.com/alexedwards/scs/postgresstore v0.0.0-20210822164020-33a92ced6c04/go.mod h1:TDDdV/xnjj+/4zBQ9a2k+i2AbuAdY7SQjPUh5zoTZ3M= +github.com/alexedwards/scs/v2 v2.4.0 h1:XfnMamKnvp1muJVNr1WzikQTclopsBXWZtzz0NBjOK0= +github.com/alexedwards/scs/v2 v2.4.0/go.mod h1:ToaROZxyKukJKT/xLcVQAChi5k6+Pn1Gvmdl7h3RRj8= github.com/cespare/reflex v0.3.1 h1:N4Y/UmRrjwOkNT0oQQnYsdr6YBxvHqtSfPB4mqOyAKk= github.com/cespare/reflex v0.3.1/go.mod h1:I+0Pnu2W693i7Hv6ZZG76qHTY0mgUa7uCIfCtikXojE= github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= @@ -21,6 +25,7 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.4.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= diff --git a/migrations/2_create_sessions_table.down.sql b/migrations/2_create_sessions_table.down.sql new file mode 100644 index 0000000..54d1e93 --- /dev/null +++ b/migrations/2_create_sessions_table.down.sql @@ -0,0 +1 @@ +DROP TABLE sessions; \ No newline at end of file diff --git a/migrations/2_create_sessions_table.up.sql b/migrations/2_create_sessions_table.up.sql new file mode 100644 index 0000000..1ca7f67 --- /dev/null +++ b/migrations/2_create_sessions_table.up.sql @@ -0,0 +1,7 @@ +CREATE TABLE sessions ( + token TEXT PRIMARY KEY, + data BYTEA NOT NULL, + expiry TIMESTAMPTZ NOT NULL +); + +CREATE INDEX sessions_expiry_idx ON sessions (expiry); \ No newline at end of file diff --git a/web/comment_handler.go b/web/comment_handler.go index 1c495df..de2199c 100644 --- a/web/comment_handler.go +++ b/web/comment_handler.go @@ -4,12 +4,14 @@ import ( "net/http" "git.snrd.de/Spaenny/goddit" + "github.com/alexedwards/scs/v2" "github.com/go-chi/chi" "github.com/google/uuid" ) type CommentHandler struct { - store goddit.Store + store goddit.Store + sessions *scs.SessionManager } func (h *CommentHandler) Store() http.HandlerFunc { diff --git a/web/handler.go b/web/handler.go index ec8a70b..5209266 100644 --- a/web/handler.go +++ b/web/handler.go @@ -5,23 +5,26 @@ import ( "net/http" "git.snrd.de/Spaenny/goddit" + "github.com/alexedwards/scs/v2" "github.com/go-chi/chi" "github.com/go-chi/chi/middleware" "github.com/gorilla/csrf" ) -func NewHandler(store goddit.Store, csrfKey []byte) *Handler { +func NewHandler(store goddit.Store, sessions *scs.SessionManager, csrfKey []byte) *Handler { h := &Handler{ - Mux: chi.NewMux(), - store: store, + Mux: chi.NewMux(), + store: store, + sessions: sessions, } - threads := ThreadHandler{store: store} - posts := PostHandler{store: store} - comments := CommentHandler{store: store} + threads := ThreadHandler{store: store, sessions: sessions} + posts := PostHandler{store: store, sessions: sessions} + comments := CommentHandler{store: store, sessions: sessions} h.Use(middleware.Logger) h.Use(csrf.Protect(csrfKey, csrf.Secure(false))) + h.Use(sessions.LoadAndSave) h.Get("/", h.Home()) h.Route("/threads", func(r chi.Router) { @@ -44,7 +47,8 @@ func NewHandler(store goddit.Store, csrfKey []byte) *Handler { type Handler struct { *chi.Mux - store goddit.Store + store goddit.Store + sessions *scs.SessionManager } func (h *Handler) Home() http.HandlerFunc { diff --git a/web/post_handler.go b/web/post_handler.go index 4358021..870eb2f 100644 --- a/web/post_handler.go +++ b/web/post_handler.go @@ -5,13 +5,15 @@ import ( "net/http" "git.snrd.de/Spaenny/goddit" + "github.com/alexedwards/scs/v2" "github.com/go-chi/chi" "github.com/google/uuid" "github.com/gorilla/csrf" ) type PostHandler struct { - store goddit.Store + store goddit.Store + sessions *scs.SessionManager } func (h *PostHandler) Create() http.HandlerFunc { diff --git a/web/sessions.go b/web/sessions.go new file mode 100644 index 0000000..3add466 --- /dev/null +++ b/web/sessions.go @@ -0,0 +1,20 @@ +package web + +import ( + "database/sql" + + "github.com/alexedwards/scs/postgresstore" + "github.com/alexedwards/scs/v2" +) + +func NewSessionsManager(dataSourceName string) (*scs.SessionManager, error) { + db, err := sql.Open("postgres", dataSourceName) + if err != nil { + return nil, err + } + + sessions := scs.New() + sessions.Store = postgresstore.New(db) + + return sessions, nil +} diff --git a/web/thread_handler.go b/web/thread_handler.go index 9faa781..fd54c60 100644 --- a/web/thread_handler.go +++ b/web/thread_handler.go @@ -5,13 +5,15 @@ import ( "net/http" "git.snrd.de/Spaenny/goddit" + "github.com/alexedwards/scs/v2" "github.com/go-chi/chi" "github.com/google/uuid" "github.com/gorilla/csrf" ) type ThreadHandler struct { - store goddit.Store + store goddit.Store + sessions *scs.SessionManager } func (h *ThreadHandler) List() http.HandlerFunc {