forked from tangled.org/core
this repo has no description

simplify enforcer

Changed files
+42 -25
appview
+22 -18
appview/state/rbac.go
···
e = some(where (p.eft == allow))
[matchers]
-
m = (r.act == p.act && r.dom == p.dom && keyMatch2(r.obj, p.obj) && g(r.sub, p.sub, r.dom))
+
m = r.act == p.act && r.dom == p.dom && keyMatch2(r.obj, p.obj) && g(r.sub, p.sub, r.dom)
`
)
type Enforcer struct {
-
E *casbin.SyncedEnforcer
-
domain string
+
E *casbin.SyncedEnforcer
}
func keyMatch2(key1 string, key2 string) bool {
···
return matched
}
-
func NewEnforcer(domain string) (*Enforcer, error) {
+
func NewEnforcer() (*Enforcer, error) {
m, err := model.NewModelFromString(Model)
if err != nil {
return nil, err
···
e.EnableAutoSave(true)
e.AddFunction("keyMatch2", keyMatch2Func)
+
return &Enforcer{e}, nil
+
}
+
+
func (e *Enforcer) AddDomain(domain string) error {
// Add policies with patterns
-
_, err = e.AddPolicies([][]string{
+
_, err := e.E.AddPolicies([][]string{
{"server:owner", domain, domain, "server:invite"},
-
{"server:owner", domain, domain, "repo:create"},
-
{"server:owner", domain, domain, "repo:delete"}, // priveledged operation, delete any repo in domain
-
{"server:member", domain, domain, "repo:create"}, // priveledged operation, delete any repo in domain
+
{"server:member", domain, domain, "repo:create"},
})
if err != nil {
-
return nil, err
+
return err
}
-
return &Enforcer{e, domain}, nil
+
// all owners are also members
+
_, err = e.E.AddGroupingPolicy("server:owner", "server:member", domain)
+
return err
}
-
func (e *Enforcer) AddOwner(owner string) error {
-
_, err := e.E.AddGroupingPolicy(owner, "server:owner", e.domain)
+
func (e *Enforcer) AddOwner(domain, owner string) error {
+
_, err := e.E.AddGroupingPolicy(owner, "server:owner", domain)
return err
}
-
func (e *Enforcer) AddMember(member string) error {
-
_, err := e.E.AddGroupingPolicy(member, "server:member", e.domain)
+
func (e *Enforcer) AddMember(domain, member string) error {
+
_, err := e.E.AddGroupingPolicy(member, "server:member", domain)
return err
}
func (e *Enforcer) AddRepo(member, domain, repo string) error {
_, err := e.E.AddPolicies([][]string{
-
{member, e.domain, repo, "repo:push"},
-
{member, e.domain, repo, "repo:owner"},
-
{member, e.domain, repo, "repo:invite"},
-
{member, e.domain, repo, "repo:delete"},
+
{member, domain, repo, "repo:push"},
+
{member, domain, repo, "repo:owner"},
+
{member, domain, repo, "repo:invite"},
+
{member, domain, repo, "repo:delete"},
+
{"server:owner", domain, repo, "repo:delete"}, // server owner can delete any repo
})
return err
}
+20 -7
appview/state/state.go
···
)
type State struct {
-
Db *db.DB
-
Auth *auth.Auth
+
db *db.DB
+
auth *auth.Auth
+
enforcer *Enforcer
}
func Make() (*State, error) {
···
return nil, err
}
-
return &State{db, auth}, nil
+
enforcer, err := NewEnforcer()
+
if err != nil {
+
return nil, err
+
}
+
+
return &State{db, auth, enforcer}, nil
}
func (s *State) Login(w http.ResponseWriter, r *http.Request) {
···
w.Write([]byte("check success"))
// mark as registered
-
err = s.Db.Register(domain)
+
err = s.db.Register(domain)
if err != nil {
log.Println("failed to register domain", err)
http.Error(w, err.Error(), http.StatusInternalServerError)
}
// set permissions for this did as owner
-
_, did, err := s.Db.RegistrationStatus(domain)
+
_, did, err := s.db.RegistrationStatus(domain)
if err != nil {
log.Println("failed to register domain", err)
http.Error(w, err.Error(), http.StatusInternalServerError)
}
-
e, err := NewEnforcer(domain)
+
if err != nil {
+
log.Println("failed to setup owner of domain", err)
+
http.Error(w, err.Error(), http.StatusInternalServerError)
+
}
+
+
// add basic acls for this domain
+
err = s.enforcer.AddDomain(domain)
if err != nil {
log.Println("failed to setup owner of domain", err)
http.Error(w, err.Error(), http.StatusInternalServerError)
}
-
err = e.AddOwner(did)
+
// add this did as owner of this domain
+
err = s.enforcer.AddOwner(domain, did)
if err != nil {
log.Println("failed to setup owner of domain", err)
http.Error(w, err.Error(), http.StatusInternalServerError)