aboutsummaryrefslogtreecommitdiff
path: root/service
diff options
context:
space:
mode:
authorr <r@freesoftwareextremist.com>2020-04-19 08:18:36 +0000
committerr <r@freesoftwareextremist.com>2020-04-19 08:18:36 +0000
commit55ed6a480ea049f789d778e4bae06ffa4d790ee1 (patch)
tree0c9e32e565c9a5bed27b018579f06573846ca511 /service
parent5abbadfa622e58a4951cf0b2f96fbf8094641be8 (diff)
downloadbloat-55ed6a480ea049f789d778e4bae06ffa4d790ee1.tar.gz
bloat-55ed6a480ea049f789d778e4bae06ffa4d790ee1.zip
Add single instance mode
Diffstat (limited to 'service')
-rw-r--r--service/service.go44
-rw-r--r--service/transport.go49
2 files changed, 61 insertions, 32 deletions
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)
}