package proxyv2 import ( "context" "github.com/mitchellh/mapstructure" "goauthentik.io/internal/outpost/proxyv2/application" ) type WSProviderSubType string const ( WSProviderSubTypeLogout WSProviderSubType = "logout" ) type WSProviderMsg struct { SubType WSProviderSubType `mapstructure:"sub_type"` SessionID string `mapstructure:"session_id"` } func ParseWSProvider(args map[string]interface{}) (*WSProviderMsg, error) { msg := &WSProviderMsg{} err := mapstructure.Decode(args, &msg) if err != nil { return nil, err } return msg, nil } func (ps *ProxyServer) handleWSMessage(ctx context.Context, args map[string]interface{}) { msg, err := ParseWSProvider(args) if err != nil { ps.log.WithError(err).Warning("invalid provider-specific ws message") return } switch msg.SubType { case WSProviderSubTypeLogout: for _, p := range ps.apps { ps.log.WithField("provider", p.Host).Debug("Logging out") err := p.Logout(ctx, func(c application.Claims) bool { return c.Sid == msg.SessionID }) if err != nil { ps.log.WithField("provider", p.Host).WithError(err).Warning("failed to logout") } } default: ps.log.WithField("sub_type", msg.SubType).Warning("invalid sub_type") } }