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

This commit is contained in:
upstream-mirror
2026-09-18 01:22:23 +05:00
commit 7e385fc126
8391 changed files with 1766236 additions and 0 deletions

View 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
}