Files
warmbly/internal/api/handler/access.go
T

52 lines
1.6 KiB
Go

package handler
import (
"github.com/gin-gonic/gin"
"github.com/google/uuid"
"github.com/warmbly/warmbly/internal/api/middleware"
"github.com/warmbly/warmbly/internal/errx"
"github.com/warmbly/warmbly/internal/models"
)
// hasAccess is middleware.RequireAccess as an inline check, for a permission a
// handler needs only when an optional request field is present.
func (h *Handler) hasAccess(c *gin.Context, orgPerm models.OrganizationPermission, apiPerm uint64) *errx.Error {
switch middleware.GetAuthType(c) {
case middleware.AuthTypeAPIKey, middleware.AuthTypeOAuth:
if !models.HasAPIPermission(middleware.GetAPIKeyPermissions(c), apiPerm) {
return errx.New(errx.Forbidden, "insufficient API key permissions")
}
return nil
default:
if h.OrganizationService == nil {
return nil
}
userID, err := middleware.GetUserUUID(c)
if err != nil {
return errx.ErrUnauthorized
}
orgID := middleware.GetOrganizationID(c)
if orgID == nil {
return errx.ErrNoOrganization
}
has, xerr := h.OrganizationService.HasPermission(c.Request.Context(), *orgID, userID, orgPerm)
if xerr != nil {
return xerr
}
if !has {
return errx.ErrForbidden
}
return nil
}
}
// mailboxAllowed enforces an API key's mailbox allow-list on an account id
// taken from a request body, the way RequireAPIKeyEmailAccountParam does for
// a route parameter.
func mailboxAllowed(c *gin.Context, accountID uuid.UUID) *errx.Error {
if !middleware.APIKeyAllowsEmailAccount(c, accountID) {
return errx.New(errx.Forbidden, "email account is not allowed for this API key")
}
return nil
}