From b2d678f758610c4e7c829772f7b8ad3daef95868 Mon Sep 17 00:00:00 2001 From: Denis Arh Date: Mon, 9 Sep 2019 03:10:17 +0200 Subject: [PATCH] Add permissions.TestService Allows usage of permissons service w/o persistant backend --- internal/permissions/service.go | 16 ++++++++++++++-- internal/permissions/service_alt.go | 22 ++++++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/internal/permissions/service.go b/internal/permissions/service.go index 6a7e71903..855f2c2d3 100644 --- a/internal/permissions/service.go +++ b/internal/permissions/service.go @@ -106,15 +106,27 @@ func (svc *service) Grant(ctx context.Context, wl Whitelist, rules ...*Rule) (er svc.l.Lock() defer svc.l.Unlock() + if err = svc.checkRules(wl, rules...); err != nil { + return err + } + + svc.grant(rules...) + + return svc.flush(ctx) +} + +func (svc service) checkRules(wl Whitelist, rules ...*Rule) error { for _, r := range rules { if !wl.Check(r) { return errors.Errorf("invalid rule: '%s' on '%s'", r.Operation, r.Resource) } } - svc.rules = svc.rules.merge(rules...) + return nil +} - return svc.flush(ctx) +func (svc *service) grant(rules ...*Rule) { + svc.rules = svc.rules.merge(rules...) } // Watches for changes diff --git a/internal/permissions/service_alt.go b/internal/permissions/service_alt.go index 72a94a217..5dd4e1455 100644 --- a/internal/permissions/service_alt.go +++ b/internal/permissions/service_alt.go @@ -7,6 +7,9 @@ import ( type ( ServiceAllowAll struct{} ServiceDenyAll struct{} + TestService struct { + service + } ) func (ServiceAllowAll) Can(ctx context.Context, res Resource, op Operation, ff ...CheckAccessFunc) bool { @@ -32,3 +35,22 @@ func (ServiceDenyAll) Grant(ctx context.Context, wl Whitelist, rules ...*Rule) ( func (ServiceDenyAll) FindRulesByRoleID(roleID uint64) (rr RuleSet) { return } + +func (svc *TestService) Grant(ctx context.Context, wl Whitelist, rules ...*Rule) (err error) { + if err = svc.checkRules(wl, rules...); err != nil { + return err + } + + svc.grant(rules...) + return nil +} + +func (svc *TestService) ClearGrants() { + svc.rules = RuleSet{} +} + +func NewTestService() *TestService { + return &TestService{ + service: service{}, + } +}