1package rbac
2
3import (
4 "fmt"
5 "slices"
6 "strings"
7)
8
9func (e *Enforcer) getDomainsForUser(did string, keepFunc func(string) bool, stripFunc func(string) string) ([]string, error) {
10 domains, err := e.E.GetDomainsForUser(did)
11 if err != nil {
12 return nil, err
13 }
14
15 n := 0
16 for _, x := range domains {
17 if keepFunc(x) {
18 domains[n] = stripFunc(x)
19 n++
20 }
21 }
22 domains = domains[:n]
23
24 return domains, nil
25}
26
27func (e *Enforcer) addOwner(domain, owner string) error {
28 _, err := e.E.AddGroupingPolicy(owner, "server:owner", domain)
29 return err
30}
31
32func (e *Enforcer) removeOwner(domain, owner string) error {
33 _, err := e.E.RemoveGroupingPolicy(owner, "server:owner", domain)
34 return err
35}
36
37func (e *Enforcer) addMember(domain, member string) error {
38 _, err := e.E.AddGroupingPolicy(member, "server:member", domain)
39 return err
40}
41
42func (e *Enforcer) removeMember(domain, member string) error {
43 _, err := e.E.RemoveGroupingPolicy(member, "server:member", domain)
44 return err
45}
46
47func (e *Enforcer) isRole(user, role, domain string) (bool, error) {
48 roles, err := e.E.GetImplicitRolesForUser(user, domain)
49 if err != nil {
50 return false, err
51 }
52 if slices.Contains(roles, role) {
53 return true, nil
54 }
55 return false, nil
56}
57
58func (e *Enforcer) isInviteAllowed(user, domain string) (bool, error) {
59 return e.E.Enforce(user, domain, domain, "server:invite")
60}
61
62func checkRepoFormat(repo string) error {
63 // sanity check, repo must be of the form ownerDid/repo
64 if parts := strings.SplitN(repo, "/", 2); !strings.HasPrefix(parts[0], "did:") {
65 return fmt.Errorf("invalid repo: %s", repo)
66 }
67
68 return nil
69}
70
71const spindlePrefix = "spindle:"
72
73func intoSpindle(domain string) string {
74 if !isSpindle(domain) {
75 return spindlePrefix + domain
76 }
77 return domain
78}
79
80func unSpindle(domain string) string {
81 if !isSpindle(domain) {
82 return domain
83 }
84 return strings.TrimPrefix(domain, spindlePrefix)
85}
86
87func isSpindle(domain string) bool {
88 return strings.HasPrefix(domain, spindlePrefix)
89}
90
91func isNotSpindle(domain string) bool {
92 return !isSpindle(domain)
93}