snapshot of https://github.com/cortezaproject/corteza.git (2024.9.x, 2026-09-18; blobs > 131072B omitted)
Some checks failed
SonarQube / SonarQube (push) Failing after 5m28s
E2e test on main branch push / server and client test (map[name:admin port:8080]) (push) Failing after 3m33s
Server and lib tests / Library test (js) (push) Failing after 1m36s
Server and lib tests / Library test (vue) (push) Successful in 2m24s
Server and lib tests / Web client test (admin) (push) Successful in 2m52s
Server and lib tests / Web client test (compose) (push) Successful in 3m23s
Server and lib tests / Web client test (discovery) (push) Successful in 2m49s
Server and lib tests / Web client test (one) (push) Successful in 2m52s
Server and lib tests / Web client test (privacy) (push) Successful in 2m44s
Server and lib tests / Web client test (reporter) (push) Successful in 2m56s
Server and lib tests / Web client test (workflow) (push) Successful in 3m0s
Server and lib tests / Server tests (push) Failing after 4m55s
E2e test on main branch push / notify-failure (push) Failing after 9s
Server and lib tests / Send matrix testing notification (push) Successful in 2s
Mark stale issues and pull requests / stale (push) Successful in 40s
Some checks failed
SonarQube / SonarQube (push) Failing after 5m28s
E2e test on main branch push / server and client test (map[name:admin port:8080]) (push) Failing after 3m33s
Server and lib tests / Library test (js) (push) Failing after 1m36s
Server and lib tests / Library test (vue) (push) Successful in 2m24s
Server and lib tests / Web client test (admin) (push) Successful in 2m52s
Server and lib tests / Web client test (compose) (push) Successful in 3m23s
Server and lib tests / Web client test (discovery) (push) Successful in 2m49s
Server and lib tests / Web client test (one) (push) Successful in 2m52s
Server and lib tests / Web client test (privacy) (push) Successful in 2m44s
Server and lib tests / Web client test (reporter) (push) Successful in 2m56s
Server and lib tests / Web client test (workflow) (push) Successful in 3m0s
Server and lib tests / Server tests (push) Failing after 4m55s
E2e test on main branch push / notify-failure (push) Failing after 9s
Server and lib tests / Send matrix testing notification (push) Successful in 2s
Mark stale issues and pull requests / stale (push) Successful in 40s
This commit is contained in:
96
server/pkg/rbac/func_expr.go
Normal file
96
server/pkg/rbac/func_expr.go
Normal file
@@ -0,0 +1,96 @@
|
||||
package rbac
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
|
||||
"github.com/PaesslerAG/gval"
|
||||
"github.com/cortezaproject/corteza/server/pkg/id"
|
||||
"github.com/spf13/cast"
|
||||
)
|
||||
|
||||
var (
|
||||
isAboveChecker = func(owner id.ID, user id.ID, paths ...string) bool {
|
||||
return gRBAC.orgTree.IsAbove(owner, user, paths...)
|
||||
}
|
||||
)
|
||||
|
||||
func AllFunctions() []gval.Language {
|
||||
return []gval.Language{
|
||||
gval.Function("isDescendantOf", isDescendantOf),
|
||||
|
||||
gval.Function("isDescendantOfW", isDescendantOfW),
|
||||
gval.Function("isDescendantOfC", isDescendantOfC),
|
||||
gval.Function("isDescendantOfR", isDescendantOfR),
|
||||
gval.Function("isDescendantOfU", isDescendantOfU),
|
||||
gval.Function("isDescendantOfD", isDescendantOfD),
|
||||
}
|
||||
}
|
||||
|
||||
func isDescendantOf(userID any, resourceOwner any, paths ...string) bool {
|
||||
if gRBAC == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
owners := toUint64Slice(resourceOwner)
|
||||
if len(owners) == 0 {
|
||||
return false
|
||||
}
|
||||
|
||||
user := id.MustNumID(cast.ToUint64(cast.ToString(userID)))
|
||||
if user.IsZero() {
|
||||
return false
|
||||
}
|
||||
|
||||
for _, owner := range owners {
|
||||
if isAboveChecker(id.MustNumID(owner), user, paths...) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func isDescendantOfR(userID any, resourceOwner any) bool {
|
||||
return isDescendantOf(userID, resourceOwner, "read")
|
||||
}
|
||||
|
||||
func isDescendantOfC(userID any, resourceOwner any) bool {
|
||||
return isDescendantOf(userID, resourceOwner, "create")
|
||||
}
|
||||
|
||||
func isDescendantOfW(userID any, resourceOwner any) bool {
|
||||
return isDescendantOf(userID, resourceOwner, "create", "update", "delete")
|
||||
}
|
||||
|
||||
func isDescendantOfU(userID any, resourceOwner any) bool {
|
||||
return isDescendantOf(userID, resourceOwner, "update")
|
||||
}
|
||||
|
||||
func isDescendantOfD(userID any, resourceOwner any) bool {
|
||||
return isDescendantOf(userID, resourceOwner, "delete")
|
||||
}
|
||||
|
||||
func toUint64Slice(v any) []uint64 {
|
||||
switch x := v.(type) {
|
||||
case uint64:
|
||||
return []uint64{x}
|
||||
case []uint64:
|
||||
return x
|
||||
case [1]uint64:
|
||||
return x[:]
|
||||
case [2]uint64:
|
||||
return x[:]
|
||||
case [3]uint64:
|
||||
return x[:]
|
||||
default:
|
||||
rv := reflect.ValueOf(v)
|
||||
if rv.Kind() == reflect.Array && rv.Type().Elem().Kind() == reflect.Uint64 {
|
||||
out := make([]uint64, rv.Len())
|
||||
for i := 0; i < rv.Len(); i++ {
|
||||
out[i] = rv.Index(i).Uint()
|
||||
}
|
||||
return out
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user