mirror of https://github.com/stashapp/stash.git
83 lines
2.1 KiB
Go
83 lines
2.1 KiB
Go
package session
|
|
|
|
import (
|
|
"context"
|
|
"encoding/gob"
|
|
"net/http"
|
|
|
|
"github.com/gorilla/securecookie"
|
|
"github.com/gorilla/sessions"
|
|
"github.com/stashapp/stash/pkg/logger"
|
|
"github.com/stashapp/stash/pkg/plugin/hook"
|
|
)
|
|
|
|
type VisitedPluginHook struct {
|
|
PluginID string
|
|
HookType hook.TriggerEnum
|
|
}
|
|
|
|
func init() {
|
|
gob.Register([]VisitedPluginHook{})
|
|
}
|
|
|
|
func (s *Store) VisitedPluginHandler() func(http.Handler) http.Handler {
|
|
return func(next http.Handler) http.Handler {
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
// get the visited plugins from the cookie and set in the context
|
|
session, err := s.sessionStore.Get(r, cookieName)
|
|
|
|
// ignore errors
|
|
if err == nil {
|
|
val := session.Values[visitedPluginHooksKey]
|
|
|
|
visitedPlugins, _ := val.([]VisitedPluginHook)
|
|
|
|
ctx := setVisitedPluginHooks(r.Context(), visitedPlugins)
|
|
r = r.WithContext(ctx)
|
|
}
|
|
|
|
next.ServeHTTP(w, r)
|
|
})
|
|
}
|
|
}
|
|
|
|
func GetVisitedPluginHooks(ctx context.Context) []VisitedPluginHook {
|
|
ctxVal := ctx.Value(contextVisitedPlugins)
|
|
if ctxVal != nil {
|
|
return ctxVal.([]VisitedPluginHook)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func AddVisitedPluginHook(ctx context.Context, pluginID string, hookType hook.TriggerEnum) context.Context {
|
|
curVal := GetVisitedPluginHooks(ctx)
|
|
curVal = append(curVal, VisitedPluginHook{PluginID: pluginID, HookType: hookType})
|
|
return setVisitedPluginHooks(ctx, curVal)
|
|
}
|
|
|
|
func setVisitedPluginHooks(ctx context.Context, visitedPlugins []VisitedPluginHook) context.Context {
|
|
return context.WithValue(ctx, contextVisitedPlugins, visitedPlugins)
|
|
}
|
|
|
|
func (s *Store) MakePluginCookie(ctx context.Context) *http.Cookie {
|
|
currentUser := GetCurrentUserID(ctx)
|
|
visitedPlugins := GetVisitedPluginHooks(ctx)
|
|
|
|
session := sessions.NewSession(s.sessionStore, cookieName)
|
|
if currentUser != nil {
|
|
session.Values[userIDKey] = *currentUser
|
|
}
|
|
|
|
session.Values[visitedPluginHooksKey] = visitedPlugins
|
|
|
|
encoded, err := securecookie.EncodeMulti(session.Name(), session.Values,
|
|
s.sessionStore.Codecs...)
|
|
if err != nil {
|
|
logger.Errorf("error creating session cookie: %s", err.Error())
|
|
return nil
|
|
}
|
|
|
|
return sessions.NewCookie(session.Name(), encoded, session.Options)
|
|
}
|