From 00c96e2bab063214e992663e5b7280cf8b1df604 Mon Sep 17 00:00:00 2001 From: "amalraj.manigmail.com" Date: Thu, 28 Mar 2019 18:59:30 +0800 Subject: [PATCH] integrate permission contracts with geth - update cache from contract and events --- controls/permission/permission.go | 41 ++++++++++++++++++++++--------- core/quorum/api.go | 16 ++++++++++++ core/types/permissions_cache.go | 39 +++++++++++++++++++++++++++++ internal/web3ext/web3ext.go | 18 +++++++++++++- 4 files changed, 102 insertions(+), 12 deletions(-) diff --git a/controls/permission/permission.go b/controls/permission/permission.go index 234dee028..a4f05dd66 100644 --- a/controls/permission/permission.go +++ b/controls/permission/permission.go @@ -283,12 +283,11 @@ func (p *PermissionCtrl) updateRoleChange(orgId string, role string) { GasPrice: big.NewInt(0), }, } - if rs, err := permAcctSession.GetRoleDetails(orgId, role); err != nil { + if rs, err := permAcctSession.GetRoleDetails(role, orgId); err != nil { log.Error("AJ-failed to read role info ", "err", err) } else { - types.RoleInfoMap.UpsertRole(rs.RoleId, rs.RoleId, rs.Voter, int(rs.AccessType.Uint64()), rs.Active) + types.RoleInfoMap.UpsertRole(rs.OrgId, rs.RoleId, rs.Voter, int(rs.AccessType.Uint64()), rs.Active) } - } // Listens on the channel for new node deactivation via smart contract @@ -900,7 +899,7 @@ func (p *PermissionCtrl) monitorOrgActivation() { log.Info("Failed watchOrgActivated: %v", err) } for { - log.Info("AJ-new node approved waiting for events...") + log.Info("AJ-new org activated waiting for events...") select { case evt = <-ch: log.Info("AJ-OrgActivated", "node", evt.OrgId) @@ -923,7 +922,7 @@ func (p *PermissionCtrl) monitorNewOrgAdd() { log.Info("Failed WatchNodeApproved: %v", err) } for { - log.Info("AJ-new node approved waiting for events...") + log.Info("AJ-new org approved waiting for events...") select { case evt = <-ch: log.Info("AJ-newOrgApproved", "node", evt.OrgId) @@ -934,7 +933,7 @@ func (p *PermissionCtrl) monitorNewOrgAdd() { } func (p *PermissionCtrl) monitorOrgDeactivation() { - log.Info("AJ-new org added event monitor started...") + log.Info("AJ-new org suspended event monitor started...") ch := make(chan *pbind.OrgManagerOrgSuspended, 1) opts := &bind.WatchOpts{} @@ -944,15 +943,15 @@ func (p *PermissionCtrl) monitorOrgDeactivation() { _, err := p.permOrg.OrgManagerFilterer.WatchOrgSuspended(opts, ch) if err != nil { - log.Info("Failed WatchNodeApproved: %v", err) + log.Info("Failed WatchOrgSuspened: %v", err) } for { - log.Info("AJ-new org approved waiting for events...") + log.Info("AJ-new org suspended waiting for events...") select { case evt = <-ch: - log.Info("AJ-newOrgApproved", "node", evt.OrgId) + log.Info("AJ-newOrgSuspended", "node", evt.OrgId) p.updateOrgChange(evt.OrgId) - log.Info("AJ-newOrgApproved cached updated for ", "orgid", evt.OrgId) + log.Info("AJ-newOrgSuspended cached updated for ", "orgid", evt.OrgId) } } } @@ -984,12 +983,32 @@ func (p *PermissionCtrl) monitorNewRoleAdd() { select { case evt = <-ch: log.Info("AJ-newRoleCreated", "org", evt.OrgId, "role", evt.RoleId) - p.updateOrgChange(evt.OrgId) + p.updateRoleChange(evt.OrgId, evt.RoleId) log.Info("AJ-newRoleCreated cached updated for ", "orgid", evt.OrgId, "role", evt.RoleId) } } } func (p *PermissionCtrl) monitorNewRoleRemove() { + log.Info("AJ-new role remove event monitor started...") + ch := make(chan *pbind.RoleManagerRoleRevoked, 1) + opts := &bind.WatchOpts{} + var blockNumber uint64 = 1 + opts.Start = &blockNumber + var evt *pbind.RoleManagerRoleRevoked + + _, err := p.permRole.RoleManagerFilterer.WatchRoleRevoked(opts, ch) + if err != nil { + log.Info("Failed WatchRoleRemoved: %v", err) + } + for { + log.Info("AJ-new role removed waiting for events...") + select { + case evt = <-ch: + log.Info("AJ-newRoleRemoved", "org", evt.OrgId, "role", evt.RoleId) + p.updateRoleChange(evt.OrgId, evt.RoleId) + log.Info("AJ-newRoleRemoved cached updated for ", "orgid", evt.OrgId, "role", evt.RoleId) + } + } } diff --git a/core/quorum/api.go b/core/quorum/api.go index 5dc425496..bfa24ec11 100644 --- a/core/quorum/api.go +++ b/core/quorum/api.go @@ -270,6 +270,22 @@ func (s *QuorumControlsAPI) PermissionNodeList() []nodeStatus { return nodeStatArr } +func (s *QuorumControlsAPI) OrgList() []types.OrgInfo { + return types.OrgInfoMap.GetOrgList() +} + +func (s *QuorumControlsAPI) NodeList() []types.NodeInfo { + return types.NodeInfoMap.GetNodeList() +} + +func (s *QuorumControlsAPI) RoleList() []types.RoleInfo { + return types.RoleInfoMap.GetRoleList() +} + +func (s *QuorumControlsAPI) AcctList() []types.AccountInfo { + return types.AcctInfoMap.GetAcctList() +} + // Returns the list of permissioned accounts and access type of each func (s *QuorumControlsAPI) PermissionAccountList() []accountInfo { if !s.permEnabled { diff --git a/core/types/permissions_cache.go b/core/types/permissions_cache.go index 540a1a9a8..4caf1c4a2 100644 --- a/core/types/permissions_cache.go +++ b/core/types/permissions_cache.go @@ -208,6 +208,15 @@ func (o *OrgCache) Show() { log.Info("AJ-Org", "i", i, "key", k, "value", v) } } +func (o *OrgCache) GetOrgList() []OrgInfo { + var olist []OrgInfo + for _, k := range o.c.Keys() { + v, _ := o.c.Get(k) + vp := v.(*OrgInfo) + olist = append(olist, *vp) + } + return olist +} func (n *NodeCache) UpsertNode(orgId string, url string, status int) { defer n.mux.Unlock() @@ -251,6 +260,16 @@ func (o *NodeCache) Show() { } } +func (o *NodeCache) GetNodeList() []NodeInfo { + var olist []NodeInfo + for _, k := range o.c.Keys() { + v, _ := o.c.Get(k) + vp := v.(*NodeInfo) + olist = append(olist, *vp) + } + return olist +} + func (a *AcctCache) UpsertAccount(orgId string, role string, acct common.Address, orgAdmin bool, status int) { defer a.mux.Unlock() a.mux.Lock() @@ -293,6 +312,16 @@ func (o *AcctCache) Show() { } } +func (o *AcctCache) GetAcctList() []AccountInfo { + var olist []AccountInfo + for _, k := range o.c.Keys() { + v, _ := o.c.Get(k) + vp := v.(*AccountInfo) + olist = append(olist, *vp) + } + return olist +} + func (r *RoleCache) UpsertRole(orgId string, role string, voter bool, access int, active bool) { defer r.mux.Unlock() r.mux.Lock() @@ -324,6 +353,16 @@ func (r *RoleCache) Show() { } } +func (o *RoleCache) GetRoleList() []RoleInfo { + var olist []RoleInfo + for _, k := range o.c.Keys() { + v, _ := o.c.Get(k) + vp := v.(*RoleInfo) + olist = append(olist, *vp) + } + return olist +} + // Adds account access to the cache func AddAccountAccess(acctId common.Address, roleId string) { AcctMap.Add(acctId, &PermStruct{AcctId: acctId, roleId: roleId}) diff --git a/internal/web3ext/web3ext.go b/internal/web3ext/web3ext.go index 9629dd40a..23757c37f 100755 --- a/internal/web3ext/web3ext.go +++ b/internal/web3ext/web3ext.go @@ -833,7 +833,23 @@ web3._extend({ new web3._extend.Property({ name: 'voterList', getter: 'quorumNodeMgmt_voterList' - }), + }), + new web3._extend.Property({ + name: 'orgList', + getter: 'quorumNodeMgmt_orgList' + }), + new web3._extend.Property({ + name: 'nodeList', + getter: 'quorumNodeMgmt_nodeList' + }), + new web3._extend.Property({ + name: 'roleList', + getter: 'quorumNodeMgmt_roleList' + }), + new web3._extend.Property({ + name: 'acctList', + getter: 'quorumNodeMgmt_acctList' + }), ] }) `