mirror of
https://github.com/opencloud-eu/opencloud.git
synced 2025-12-27 00:00:49 -05:00
55 lines
2.0 KiB
Go
55 lines
2.0 KiB
Go
package middleware
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/opencloud-eu/opencloud/pkg/log"
|
|
"github.com/opencloud-eu/opencloud/pkg/roles"
|
|
"github.com/opencloud-eu/opencloud/services/graph/pkg/errorcode"
|
|
settings "github.com/opencloud-eu/opencloud/services/settings/pkg/service/v0"
|
|
revactx "github.com/opencloud-eu/reva/v2/pkg/ctx"
|
|
)
|
|
|
|
// RequireAdmin middleware is used to require the user in context to be an admin / have account management permissions
|
|
func RequireAdmin(rm *roles.Manager, logger log.Logger) func(next http.Handler) http.Handler {
|
|
return func(next http.Handler) http.Handler {
|
|
l := logger.With().Str("middleware", "requireAdmin").Logger()
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
u, ok := revactx.ContextGetUser(r.Context())
|
|
if !ok {
|
|
errorcode.AccessDenied.Render(w, r, http.StatusUnauthorized, "Unauthorized")
|
|
return
|
|
}
|
|
if u.Id == nil || u.Id.OpaqueId == "" {
|
|
errorcode.InvalidRequest.Render(w, r, http.StatusBadRequest, "user is missing an id")
|
|
return
|
|
}
|
|
// get roles from context
|
|
roleIDs, ok := roles.ReadRoleIDsFromContext(r.Context())
|
|
if !ok {
|
|
l.Debug().Str("userid", u.Id.OpaqueId).Msg("No roles in context, contacting settings service")
|
|
var err error
|
|
roleIDs, err = rm.FindRoleIDsForUser(r.Context(), u.Id.OpaqueId)
|
|
if err != nil {
|
|
l.Error().Err(err).Str("userid", u.Id.OpaqueId).Msg("Failed to get roles for user")
|
|
errorcode.AccessDenied.Render(w, r, http.StatusUnauthorized, "Unauthorized")
|
|
return
|
|
}
|
|
if len(roleIDs) == 0 {
|
|
l.Error().Err(err).Str("userid", u.Id.OpaqueId).Msg("No roles assigned to user")
|
|
errorcode.AccessDenied.Render(w, r, http.StatusUnauthorized, "Unauthorized")
|
|
return
|
|
}
|
|
}
|
|
|
|
// check if permission is present in roles of the authenticated account
|
|
if rm.FindPermissionByID(r.Context(), roleIDs, settings.AccountManagementPermissionID) != nil {
|
|
next.ServeHTTP(w, r)
|
|
return
|
|
}
|
|
|
|
errorcode.AccessDenied.Render(w, r, http.StatusForbidden, "Forbidden")
|
|
})
|
|
}
|
|
}
|