From 55ed6a480ea049f789d778e4bae06ffa4d790ee1 Mon Sep 17 00:00:00 2001 From: r Date: Sun, 19 Apr 2020 08:18:36 +0000 Subject: Add single instance mode --- service/service.go | 44 ++++++++++++++++++++++++++++---------------- service/transport.go | 49 +++++++++++++++++++++++++++++++++---------------- 2 files changed, 61 insertions(+), 32 deletions(-) (limited to 'service') diff --git a/service/service.go b/service/service.go index be83bd0..02c55cb 100644 --- a/service/service.go +++ b/service/service.go @@ -35,6 +35,7 @@ type Service interface { ServeSearchPage(ctx context.Context, c *model.Client, q string, qType string, offset int) (err error) ServeUserSearchPage(ctx context.Context, c *model.Client, id string, q string, offset int) (err error) ServeSettingsPage(ctx context.Context, c *model.Client) (err error) + SingleInstance(ctx context.Context) (instance string, ok bool) NewSession(ctx context.Context, instance string) (redirectUrl string, sessionID string, err error) Signin(ctx context.Context, c *model.Client, sessionID string, code string) (token string, userID string, err error) @@ -62,14 +63,15 @@ type Service interface { } type service struct { - clientName string - clientScope string - clientWebsite string - customCSS string - postFormats []model.PostFormat - renderer renderer.Renderer - sessionRepo model.SessionRepo - appRepo model.AppRepo + clientName string + clientScope string + clientWebsite string + customCSS string + postFormats []model.PostFormat + renderer renderer.Renderer + sessionRepo model.SessionRepo + appRepo model.AppRepo + singleInstance string } func NewService(clientName string, @@ -80,16 +82,18 @@ func NewService(clientName string, renderer renderer.Renderer, sessionRepo model.SessionRepo, appRepo model.AppRepo, + singleInstance string, ) Service { return &service{ - clientName: clientName, - clientScope: clientScope, - clientWebsite: clientWebsite, - customCSS: customCSS, - postFormats: postFormats, - renderer: renderer, - sessionRepo: sessionRepo, - appRepo: appRepo, + clientName: clientName, + clientScope: clientScope, + clientWebsite: clientWebsite, + customCSS: customCSS, + postFormats: postFormats, + renderer: renderer, + sessionRepo: sessionRepo, + appRepo: appRepo, + singleInstance: singleInstance, } } @@ -622,6 +626,14 @@ func (svc *service) ServeSettingsPage(ctx context.Context, c *model.Client) (err return svc.renderer.Render(rCtx, c.Writer, renderer.SettingsPage, data) } +func (svc *service) SingleInstance(ctx context.Context) (instance string, ok bool) { + if len(svc.singleInstance) > 0 { + instance = svc.singleInstance + ok = true + } + return +} + func (svc *service) NewSession(ctx context.Context, instance string) ( redirectUrl string, sessionID string, err error) { diff --git a/service/transport.go b/service/transport.go index 69b28ec..f52cca0 100644 --- a/service/transport.go +++ b/service/transport.go @@ -14,12 +14,24 @@ import ( "github.com/gorilla/mux" ) +const ( + sessionExp = 365 * 24 * time.Hour +) + func newClient(w io.Writer) *model.Client { return &model.Client{ Writer: w, } } +func setSessionCookie(w http.ResponseWriter, sessionID string, exp time.Duration) { + http.SetCookie(w, &http.Cookie{ + Name: "session_id", + Value: sessionID, + Expires: time.Now().Add(exp), + }) +} + func newCtxWithSesion(req *http.Request) context.Context { ctx := context.Background() sessionID, err := req.Cookie("session_id") @@ -93,11 +105,25 @@ func NewHandler(s Service, staticDir string) http.Handler { signinPage := func(w http.ResponseWriter, req *http.Request) { c := newClient(w) ctx := context.Background() - err := s.ServeSigninPage(ctx, c) - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - s.ServeErrorPage(ctx, c, err) - return + instance, ok := s.SingleInstance(ctx) + if ok { + url, sessionID, err := s.NewSession(ctx, instance) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + s.ServeErrorPage(ctx, c, err) + return + } + + setSessionCookie(w, sessionID, sessionExp) + w.Header().Add("Location", url) + w.WriteHeader(http.StatusFound) + } else { + err := s.ServeSigninPage(ctx, c) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + s.ServeErrorPage(ctx, c, err) + return + } } } @@ -291,12 +317,7 @@ func NewHandler(s Service, staticDir string) http.Handler { return } - http.SetCookie(w, &http.Cookie{ - Name: "session_id", - Value: sessionID, - Expires: time.Now().Add(365 * 24 * time.Hour), - }) - + setSessionCookie(w, sessionID, sessionExp) w.Header().Add("Location", url) w.WriteHeader(http.StatusFound) } @@ -689,12 +710,8 @@ func NewHandler(s Service, staticDir string) http.Handler { ctx := newCtxWithSesionCSRF(req, req.FormValue("csrf_token")) s.Signout(ctx, c) - http.SetCookie(w, &http.Cookie{ - Name: "session_id", - Value: "", - Expires: time.Now(), - }) + setSessionCookie(w, "", 0) w.Header().Add("Location", "/") w.WriteHeader(http.StatusFound) } -- cgit v1.2.3