package handlers import ( "fmt" "net/url" "github.com/authelia/authelia/internal/middlewares" "github.com/authelia/authelia/internal/utils" ) type logoutBody struct { TargetURL string `json:"targetURL"` } type logoutResponseBody struct { SafeTargetURL bool `json:"safeTargetURL"` } // LogoutPost is the handler logging out the user attached to the given cookie. func LogoutPost(ctx *middlewares.AutheliaCtx) { body := logoutBody{} responseBody := logoutResponseBody{SafeTargetURL: false} ctx.Logger.Tracef("Attempting to decode body") err := ctx.ParseBody(&body) if err != nil { ctx.Error(fmt.Errorf("Unable to parse body during logout: %s", err), operationFailedMessage) } ctx.Logger.Tracef("Attempting to destroy session") err = ctx.Providers.SessionProvider.DestroySession(ctx.RequestCtx) if err != nil { ctx.Error(fmt.Errorf("Unable to destroy session during logout: %s", err), operationFailedMessage) } redirectionURL, err := url.Parse(body.TargetURL) if err == nil { responseBody.SafeTargetURL = utils.IsRedirectionSafe(*redirectionURL, ctx.Configuration.Session.Domain) } if body.TargetURL != "" { ctx.Logger.Debugf("Logout target url is %s, safe %t", body.TargetURL, responseBody.SafeTargetURL) } err = ctx.SetJSONBody(responseBody) if err != nil { ctx.Error(fmt.Errorf("Unable to set body during logout: %s", err), operationFailedMessage) } }