From aec203718fb715a1914fbf6907d675fee3fd4fd6 Mon Sep 17 00:00:00 2001 From: Peter Grlica Date: Tue, 8 Dec 2020 13:00:19 +0100 Subject: [PATCH] Use superuser context on structure and data sync, options regenerated --- federation/service/processer_data.go | 3 +- federation/service/sync_worker_data.go | 4 +- federation/service/sync_worker_structure.go | 4 +- pkg/options/federation.gen.go | 43 +++++++++++++++++++ pkg/options/federation.yaml | 33 ++++++++++++++ .../200_federation/1000_access_control.yaml | 34 +++++++++++++++ system/service/role.go | 6 ++- 7 files changed, 121 insertions(+), 6 deletions(-) create mode 100644 pkg/options/federation.gen.go create mode 100644 pkg/options/federation.yaml create mode 100644 provision/200_federation/1000_access_control.yaml diff --git a/federation/service/processer_data.go b/federation/service/processer_data.go index 1b7f8f01e..67ba67e10 100644 --- a/federation/service/processer_data.go +++ b/federation/service/processer_data.go @@ -47,8 +47,7 @@ func (dp *dataProcesser) Process(ctx context.Context, payload []byte) (Processer }, nil } - // get the user that is tied to this node - ctx = auth.SetIdentityToContext(ctx, dp.User) + ctx = auth.SetSuperUserContext(ctx) for _, er := range o { dp.SyncService.mapper.Merge(&er.Values, dp.ModuleMappingValues, dp.ModuleMappings) diff --git a/federation/service/sync_worker_data.go b/federation/service/sync_worker_data.go index ffaf60229..a3d01dc12 100644 --- a/federation/service/sync_worker_data.go +++ b/federation/service/sync_worker_data.go @@ -7,6 +7,7 @@ import ( "time" "github.com/cortezaproject/corteza-server/federation/types" + "github.com/cortezaproject/corteza-server/pkg/auth" "go.uber.org/zap" ) @@ -159,10 +160,11 @@ func (w *syncWorkerData) Watch(ctx context.Context, delay time.Duration, limit i w.delay = delay w.limit = limit - // todo - get auth from the node ctx, cancel := context.WithCancel(ctx) defer cancel() + ctx = auth.SetSuperUserContext(ctx) + ticker := time.NewTicker(delay) w.PrepareForNodes(ctx, urls) diff --git a/federation/service/sync_worker_structure.go b/federation/service/sync_worker_structure.go index 76acb9a7d..e77feb301 100644 --- a/federation/service/sync_worker_structure.go +++ b/federation/service/sync_worker_structure.go @@ -7,6 +7,7 @@ import ( "time" "github.com/cortezaproject/corteza-server/federation/types" + "github.com/cortezaproject/corteza-server/pkg/auth" "github.com/davecgh/go-spew/spew" "go.uber.org/zap" ) @@ -103,10 +104,11 @@ func (w *syncWorkerStructure) Watch(ctx context.Context, delay time.Duration, li w.delay = delay w.limit = limit - // todo - get auth from the node ctx, cancel := context.WithCancel(ctx) defer cancel() + ctx = auth.SetSuperUserContext(ctx) + ticker := time.NewTicker(delay) w.PrepareForNodes(ctx, urls) diff --git a/pkg/options/federation.gen.go b/pkg/options/federation.gen.go new file mode 100644 index 000000000..2c58e108a --- /dev/null +++ b/pkg/options/federation.gen.go @@ -0,0 +1,43 @@ +package options + +// This file is auto-generated. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// Definitions file that controls how this file is generated: +// pkg/options/federation.yaml + +import ( + "time" +) + +type ( + FederationOpt struct { + Enabled bool `env:"FEDERATION_ENABLED"` + Label string `env:"FEDERATION_LABEL"` + Host string `env:"FEDERATION_HOST"` + StructureMonitorInterval time.Duration `env:"FEDERATION_SYNC_STRUCTURE_MONITOR_INTERVAL"` + StructurePageSize int `env:"FEDERATION_SYNC_STRUCTURE_PAGE_SIZE"` + DataMonitorInterval time.Duration `env:"FEDERATION_SYNC_DATA_MONITOR_INTERVAL"` + DataPageSize int `env:"FEDERATION_SYNC_DATA_PAGE_SIZE"` + } +) + +// Federation initializes and returns a FederationOpt with default values +func Federation() (o *FederationOpt) { + o = &FederationOpt{} + + fill(o) + + // Function that allows access to custom logic inside the parent function. + // The custom logic in the other file should be like: + // func (o *Federation) Defaults() {...} + func(o interface{}) { + if def, ok := o.(interface{ Defaults() }); ok { + def.Defaults() + } + }(o) + + return +} diff --git a/pkg/options/federation.yaml b/pkg/options/federation.yaml new file mode 100644 index 000000000..aa434f834 --- /dev/null +++ b/pkg/options/federation.yaml @@ -0,0 +1,33 @@ +name: federation + +imports: + - time + +props: + - name: Enabled + type: bool + env: FEDERATION_ENABLED + + - name: Label + type: string + env: FEDERATION_LABEL + + - name: Host + type: string + env: FEDERATION_HOST + + - name: StructureMonitorInterval + type: time.Duration + env: FEDERATION_SYNC_STRUCTURE_MONITOR_INTERVAL + + - name: StructurePageSize + type: int + env: FEDERATION_SYNC_STRUCTURE_PAGE_SIZE + + - name: DataMonitorInterval + type: time.Duration + env: FEDERATION_SYNC_DATA_MONITOR_INTERVAL + + - name: DataPageSize + type: int + env: FEDERATION_SYNC_DATA_PAGE_SIZE diff --git a/provision/200_federation/1000_access_control.yaml b/provision/200_federation/1000_access_control.yaml new file mode 100644 index 000000000..a30f8dd64 --- /dev/null +++ b/provision/200_federation/1000_access_control.yaml @@ -0,0 +1,34 @@ +allow: + admins: + federation: + - grant + - access + - pair + - settings.read + - settings.manage + - node.create + + federation:node: + - manage + - module.create + + federation:module: + - manage + - map + + federation: + federation: + - grant + - access + - pair + - settings.read + - settings.manage + - node.create + + federation:node: + - manage + - module.create + + federation:module: + - manage + - map diff --git a/system/service/role.go b/system/service/role.go index 12897e5d0..efec5f01b 100644 --- a/system/service/role.go +++ b/system/service/role.go @@ -2,6 +2,8 @@ package service import ( "context" + "strconv" + "github.com/cortezaproject/corteza-server/pkg/actionlog" "github.com/cortezaproject/corteza-server/pkg/errors" "github.com/cortezaproject/corteza-server/pkg/eventbus" @@ -11,7 +13,6 @@ import ( "github.com/cortezaproject/corteza-server/store" "github.com/cortezaproject/corteza-server/system/service/event" "github.com/cortezaproject/corteza-server/system/types" - "strconv" ) type ( @@ -214,7 +215,8 @@ func (svc role) FindByAny(ctx context.Context, identifier interface{}) (r *types return svc.With(ctx).FindByID(ID) } else { r, err = svc.With(ctx).FindByHandle(strIdentifier) - if err == nil && r.ID == 0 { + + if (err == nil && r.ID == 0) || errors.IsNotFound(err) { return svc.With(ctx).FindByName(strIdentifier) }