this repo has no description
1package state 2 3import ( 4 "database/sql" 5 "path" 6 7 sqladapter "github.com/Blank-Xu/sql-adapter" 8 "github.com/casbin/casbin/v2" 9 "github.com/casbin/casbin/v2/model" 10) 11 12const ( 13 Model = ` 14[request_definition] 15r = sub, dom, obj, act 16 17[policy_definition] 18p = sub, dom, obj, act 19 20[role_definition] 21g = _, _, _ 22 23[policy_effect] 24e = some(where (p.eft == allow)) 25 26[matchers] 27m = (r.act == p.act && r.dom == p.dom && keyMatch2(r.obj, p.obj) && g(r.sub, p.sub, r.dom)) 28` 29) 30 31type Enforcer struct { 32 E *casbin.SyncedEnforcer 33 domain string 34} 35 36func keyMatch2(key1 string, key2 string) bool { 37 matched, _ := path.Match(key2, key1) 38 return matched 39} 40 41func NewEnforcer(domain string) (*Enforcer, error) { 42 m, err := model.NewModelFromString(Model) 43 if err != nil { 44 return nil, err 45 } 46 47 // TODO: conf this 48 db, err := sql.Open("sqlite3", "appview.db") 49 if err != nil { 50 return nil, err 51 } 52 53 a, err := sqladapter.NewAdapter(db, "sqlite3", "acl") 54 if err != nil { 55 return nil, err 56 } 57 58 e, err := casbin.NewSyncedEnforcer(m, a) 59 if err != nil { 60 return nil, err 61 } 62 63 e.EnableAutoSave(true) 64 e.AddFunction("keyMatch2", keyMatch2Func) 65 66 // Add policies with patterns 67 _, err = e.AddPolicies([][]string{ 68 {"server:owner", domain, domain, "server:invite"}, 69 {"server:owner", domain, domain, "repo:create"}, 70 {"server:owner", domain, domain, "repo:delete"}, // priveledged operation, delete any repo in domain 71 {"server:member", domain, domain, "repo:create"}, // priveledged operation, delete any repo in domain 72 }) 73 if err != nil { 74 return nil, err 75 } 76 77 return &Enforcer{e, domain}, nil 78} 79 80func (e *Enforcer) AddOwner(owner string) error { 81 _, err := e.E.AddGroupingPolicy(owner, "server:owner", e.domain) 82 return err 83} 84 85func (e *Enforcer) AddMember(member string) error { 86 _, err := e.E.AddGroupingPolicy(member, "server:member", e.domain) 87 return err 88} 89 90func (e *Enforcer) AddRepo(member, domain, repo string) error { 91 _, err := e.E.AddPolicies([][]string{ 92 {member, e.domain, repo, "repo:push"}, 93 {member, e.domain, repo, "repo:owner"}, 94 {member, e.domain, repo, "repo:invite"}, 95 {member, e.domain, repo, "repo:delete"}, 96 }) 97 return err 98} 99 100// keyMatch2Func is a wrapper for keyMatch2 to make it compatible with Casbin 101func keyMatch2Func(args ...interface{}) (interface{}, error) { 102 name1 := args[0].(string) 103 name2 := args[1].(string) 104 105 return keyMatch2(name1, name2), nil 106}