-
Gabriel Zachmann authoredGabriel Zachmann authored
revocationEndpoint.go 3.95 KiB
package revocation
import (
"time"
"github.com/gofiber/fiber/v2"
"github.com/jmoiron/sqlx"
"github.com/pkg/errors"
log "github.com/sirupsen/logrus"
"github.com/oidc-mytoken/api/v0"
"github.com/oidc-mytoken/server/internal/config"
"github.com/oidc-mytoken/server/internal/db"
"github.com/oidc-mytoken/server/internal/db/dbrepo/mytokenrepo/transfercoderepo"
"github.com/oidc-mytoken/server/internal/model"
"github.com/oidc-mytoken/server/internal/utils/errorfmt"
"github.com/oidc-mytoken/server/internal/utils/logger"
sharedModel "github.com/oidc-mytoken/server/shared/model"
"github.com/oidc-mytoken/server/shared/mytoken"
mytokenPkg "github.com/oidc-mytoken/server/shared/mytoken/pkg"
"github.com/oidc-mytoken/server/shared/utils"
)
// HandleRevoke handles requests to the revocation endpoint
func HandleRevoke(ctx *fiber.Ctx) error {
rlog := logger.GetRequestLogger(ctx)
rlog.Debug("Handle revocation request")
req := api.RevocationRequest{}
if err := ctx.BodyParser(&req); err != nil {
return model.ErrorToBadRequestErrorResponse(err).Send(ctx)
}
rlog.Trace("Parsed mytoken request")
clearCookie := false
if req.Token == "" {
req.Token = ctx.Cookies("mytoken")
clearCookie = true
}
errRes := revokeAnyToken(rlog, nil, req.Token, req.OIDCIssuer, req.Recursive)
if errRes != nil {
return errRes.Send(ctx)
}
if clearCookie {
return model.Response{
Status: fiber.StatusNoContent,
Cookies: []*fiber.Cookie{
{
Name: "mytoken",
Value: "",
Path: "/api",
Expires: time.Date(1970, 1, 1, 0, 0, 0, 0, time.UTC),
Secure: config.Get().Server.Secure,
HTTPOnly: true,
SameSite: "Strict",
},
},
}.Send(ctx)
}
return ctx.SendStatus(fiber.StatusNoContent)
}
func revokeAnyToken(
rlog log.Ext1FieldLogger, tx *sqlx.Tx, token, issuer string, recursive bool,
) (errRes *model.Response) {
if utils.IsJWT(token) { // normal Mytoken
return revokeMytoken(rlog, tx, token, issuer, recursive)
} else if len(token) == config.Get().Features.Polling.Len { // Transfer Code
return revokeTransferCode(rlog, tx, token, issuer)
} else { // Short Token
shortToken := transfercoderepo.ParseShortToken(token)