mirror of
https://github.com/warmbly/warmbly.git
synced 2026-09-05 00:01:49 +00:00
52 lines
1.6 KiB
Go
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
|
|
}
|