permissions: changed permissions cache to handle all suborg level attributes

This commit is contained in:
vsmk98 2019-04-09 17:52:06 +08:00
parent 6f7c413a90
commit 1cf69208d7
7 changed files with 130 additions and 103 deletions

File diff suppressed because one or more lines are too long

View File

@ -26,10 +26,10 @@ contract OrgManager {
uint private orgNum = 0;
// events related to Master Org add
event OrgApproved(string _orgId);
event OrgPendingApproval(string _orgId, uint _type);
event OrgSuspended(string _orgId);
event OrgSuspensionRevoked(string _orgId);
event OrgApproved(string _orgId, string _porgId, string _ultParent, uint _level, uint _status);
event OrgPendingApproval(string _orgId, string _porgId, string _ultParent, uint _level, uint _status);
event OrgSuspended(string _orgId, string _porgId, string _ultParent, uint _level);
event OrgSuspensionRevoked(string _orgId, string _porgId, string _ultParent, uint _level);
modifier onlyImpl
{
@ -59,7 +59,6 @@ contract OrgManager {
onlyImpl
{
addNewOrg("", _orgId, 1, 2);
emit OrgApproved(_orgId);
}
function addNewOrg(string memory _pOrg, string memory _orgId, uint _level, uint _status) internal
@ -98,6 +97,12 @@ contract OrgManager {
orgList[id].orgId = _orgId;
orgList[id].parentId = _pOrg;
orgList[id].status = _status;
if (_status == 1) {
emit OrgPendingApproval(_orgId, _pOrg, orgList[id].ultParent, orgList[id].level, 1);
}
else {
emit OrgApproved(_orgId, _pOrg, orgList[id].ultParent, orgList[id].level, 2);
}
}
function getNumberOfOrgs() public view returns (uint)
@ -123,7 +128,6 @@ contract OrgManager {
orgNotExists(_orgId)
{
addNewOrg("", _orgId, 1, 1);
emit OrgPendingApproval(_orgId, 1);
}
// function for adding a new master org
@ -132,7 +136,6 @@ contract OrgManager {
orgNotExists(string(abi.encodePacked(_pOrg, ".", _orgId)))
{
addNewOrg(_pOrg, _orgId, 2, 2);
emit OrgApproved(_orgId);
}
function updateOrg(string calldata _orgId, uint _status) external
@ -180,7 +183,7 @@ contract OrgManager {
require(checkOrgStatus(_orgId, 2) == true, "Org not in approved state");
uint id = getOrgIndex(_orgId);
orgList[id].status = 3;
emit OrgPendingApproval(_orgId, 3);
emit OrgPendingApproval(_orgId, orgList[id].parentId, orgList[id].ultParent, orgList[id].level, 3);
}
function revokeOrgSuspension(string memory _orgId) internal
@ -189,7 +192,7 @@ contract OrgManager {
require(checkOrgStatus(_orgId, 4) == true, "Org not in suspended state");
uint id = getOrgIndex(_orgId);
orgList[id].status = 5;
emit OrgPendingApproval(_orgId, 5);
emit OrgPendingApproval(_orgId, orgList[id].parentId, orgList[id].ultParent, orgList[id].level, 5);
}
function approveOrg(string calldata _orgId) external
@ -198,7 +201,7 @@ contract OrgManager {
require(checkOrgStatus(_orgId, 1) == true, "Nothing to approve");
uint id = getOrgIndex(_orgId);
orgList[id].status = 2;
emit OrgApproved(_orgId);
emit OrgApproved(_orgId, orgList[id].parentId, orgList[id].ultParent, orgList[id].level, 2);
}
function approveOrgSuspension(string memory _orgId) internal
@ -206,7 +209,7 @@ contract OrgManager {
require(checkOrgStatus(_orgId, 3) == true, "Nothing to approve");
uint id = getOrgIndex(_orgId);
orgList[id].status = 4;
emit OrgSuspended(_orgId);
emit OrgSuspended(_orgId, orgList[id].parentId, orgList[id].ultParent, orgList[id].level);
}
function approveOrgRevokeSuspension(string memory _orgId) internal
@ -214,7 +217,7 @@ contract OrgManager {
require(checkOrgStatus(_orgId, 5) == true, "Nothing to approve");
uint id = getOrgIndex(_orgId);
orgList[id].status = 2;
emit OrgSuspensionRevoked(_orgId);
emit OrgSuspensionRevoked(_orgId, orgList[id].parentId, orgList[id].ultParent, orgList[id].level);
}
function checkOrgStatus(string memory _orgId, uint _orgStatus) public view returns (bool){
@ -235,9 +238,9 @@ contract OrgManager {
}
// returns org and master org details based on org index
function getOrgInfo(uint _orgIndex) external view returns (string memory, string memory, uint, uint, string memory, uint, uint[] memory)
function getOrgInfo(uint _orgIndex) external view returns (string memory, string memory, string memory, uint, uint)
{
return (orgList[_orgIndex].parentId, orgList[_orgIndex].ultParent, orgList[_orgIndex].pindex, orgList[_orgIndex].level, orgList[_orgIndex].orgId, orgList[_orgIndex].status, orgList[_orgIndex].subOrgIndexList);
return (orgList[_orgIndex].orgId, orgList[_orgIndex].parentId, orgList[_orgIndex].ultParent, orgList[_orgIndex].level, orgList[_orgIndex].status);
}
function getSubOrgInfo(uint _orgIndex) external view returns (uint[] memory)

View File

@ -1 +1 @@
[{"constant":false,"inputs":[{"name":"_orgId","type":"string"},{"name":"_status","type":"uint256"}],"name":"updateOrg","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_orgId","type":"string"}],"name":"getOrgIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_orgId","type":"string"},{"name":"_status","type":"uint256"}],"name":"approveOrgStatusUpdate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_orgId","type":"string"}],"name":"getUltimateParent","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_orgIndex","type":"uint256"}],"name":"getSubOrgIndexLength","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_pOrg","type":"string"},{"name":"_orgId","type":"string"}],"name":"addSubOrg","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_pOrg","type":"string"},{"name":"_orgId","type":"string"}],"name":"checkNodeExists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_orgId","type":"string"}],"name":"addAdminOrg","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_orgIndex","type":"uint256"},{"name":"_subOrgIndex","type":"uint256"}],"name":"getSubOrgIndexLength","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_orgIndex","type":"uint256"}],"name":"getOrgInfo","outputs":[{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"string"},{"name":"","type":"uint256"},{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNumberOfOrgs","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_orgId","type":"string"},{"name":"_orgStatus","type":"uint256"}],"name":"checkOrgStatus","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_orgIndex","type":"uint256"}],"name":"getSubOrgInfo","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getImpl","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_orgId","type":"string"}],"name":"approveOrg","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_orgId","type":"string"}],"name":"addOrg","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_orgId","type":"string"}],"name":"getOrgStatus","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_orgId","type":"string"}],"name":"checkOrgExists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_permUpgradable","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_orgId","type":"string"}],"name":"OrgApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_orgId","type":"string"},{"indexed":false,"name":"_type","type":"uint256"}],"name":"OrgPendingApproval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_orgId","type":"string"}],"name":"OrgSuspended","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_orgId","type":"string"}],"name":"OrgSuspensionRevoked","type":"event"}]
[{"constant":false,"inputs":[{"name":"_orgId","type":"string"},{"name":"_status","type":"uint256"}],"name":"updateOrg","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_orgId","type":"string"}],"name":"getOrgIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_orgId","type":"string"},{"name":"_status","type":"uint256"}],"name":"approveOrgStatusUpdate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_orgId","type":"string"}],"name":"getUltimateParent","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_orgIndex","type":"uint256"}],"name":"getSubOrgIndexLength","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_pOrg","type":"string"},{"name":"_orgId","type":"string"}],"name":"addSubOrg","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_pOrg","type":"string"},{"name":"_orgId","type":"string"}],"name":"checkNodeExists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_orgId","type":"string"}],"name":"addAdminOrg","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_orgIndex","type":"uint256"},{"name":"_subOrgIndex","type":"uint256"}],"name":"getSubOrgIndexLength","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_orgIndex","type":"uint256"}],"name":"getOrgInfo","outputs":[{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"string"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNumberOfOrgs","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_orgId","type":"string"},{"name":"_orgStatus","type":"uint256"}],"name":"checkOrgStatus","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_orgIndex","type":"uint256"}],"name":"getSubOrgInfo","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getImpl","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_orgId","type":"string"}],"name":"approveOrg","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_orgId","type":"string"}],"name":"addOrg","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_orgId","type":"string"}],"name":"getOrgStatus","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_orgId","type":"string"}],"name":"checkOrgExists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_permUpgradable","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_orgId","type":"string"},{"indexed":false,"name":"_porgId","type":"string"},{"indexed":false,"name":"_ultParent","type":"string"},{"indexed":false,"name":"_level","type":"uint256"},{"indexed":false,"name":"_status","type":"uint256"}],"name":"OrgApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_orgId","type":"string"},{"indexed":false,"name":"_porgId","type":"string"},{"indexed":false,"name":"_ultParent","type":"string"},{"indexed":false,"name":"_level","type":"uint256"},{"indexed":false,"name":"_status","type":"uint256"}],"name":"OrgPendingApproval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_orgId","type":"string"},{"indexed":false,"name":"_porgId","type":"string"},{"indexed":false,"name":"_ultParent","type":"string"},{"indexed":false,"name":"_level","type":"uint256"}],"name":"OrgSuspended","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_orgId","type":"string"},{"indexed":false,"name":"_porgId","type":"string"},{"indexed":false,"name":"_ultParent","type":"string"},{"indexed":false,"name":"_level","type":"uint256"}],"name":"OrgSuspensionRevoked","type":"event"}]

View File

@ -251,16 +251,16 @@ func (p *PermissionCtrl) manageOrgPermissions() {
for {
select {
case evtPendingApproval = <-chPendingApproval:
types.OrgInfoMap.UpsertOrg(evtPendingApproval.OrgId, types.OrgStatus(evtPendingApproval.Type.Uint64()))
types.OrgInfoMap.UpsertOrg(evtPendingApproval.OrgId, evtPendingApproval.PorgId, evtPendingApproval.UltParent, evtPendingApproval.Level, types.OrgStatus(evtPendingApproval.Status.Uint64()))
case evtOrgApproved = <-chOrgApproved:
types.OrgInfoMap.UpsertOrg(evtOrgApproved.OrgId, types.OrgApproved)
types.OrgInfoMap.UpsertOrg(evtOrgApproved.OrgId, evtOrgApproved.PorgId, evtOrgApproved.UltParent, evtOrgApproved.Level, types.OrgApproved)
case evtOrgSuspended = <-chOrgSuspended:
types.OrgInfoMap.UpsertOrg(evtOrgSuspended.OrgId, types.OrgSuspended)
types.OrgInfoMap.UpsertOrg(evtOrgSuspended.OrgId, evtOrgSuspended.PorgId, evtOrgSuspended.UltParent, evtOrgSuspended.Level, types.OrgSuspended)
case evtOrgReactivated = <-chOrgReactivated:
types.OrgInfoMap.UpsertOrg(evtOrgReactivated.OrgId, types.OrgApproved)
types.OrgInfoMap.UpsertOrg(evtOrgReactivated.OrgId, evtOrgReactivated.PorgId, evtOrgReactivated.UltParent, evtOrgReactivated.Level, types.OrgApproved)
}
}
}
@ -562,7 +562,7 @@ func (p *PermissionCtrl) bootupNetwork(permInterfSession *pbind.PermInterfaceSes
return err
}
types.OrgInfoMap.UpsertOrg(p.permConfig.NwAdminOrg, 2)
types.OrgInfoMap.UpsertOrg(p.permConfig.NwAdminOrg, "", "", big.NewInt(1), types.OrgApproved)
types.RoleInfoMap.UpsertRole(p.permConfig.NwAdminOrg, p.permConfig.NwAdminRole, true, types.FullAccess, true)
// populate the initial node list from static-nodes.json
if err := p.populateStaticNodesToContract(permInterfSession); err != nil {
@ -654,11 +654,10 @@ func (p *PermissionCtrl) populateOrgsFromContract(auth *bind.TransactOpts) {
if numberOfOrgs, err := permOrgSession.GetNumberOfOrgs(); err == nil {
iOrgNum := numberOfOrgs.Uint64()
for k := uint64(0); k < iOrgNum; k++ {
if _, _, _, _, o, s, _, err := permOrgSession.GetOrgInfo(big.NewInt(int64(k))); err == nil {
types.OrgInfoMap.UpsertOrg(o, types.OrgStatus(int(s.Int64())))
if orgId, porgId, ultParent, level, status, err := permOrgSession.GetOrgInfo(big.NewInt(int64(k))); err == nil {
types.OrgInfoMap.UpsertOrg(orgId, porgId, ultParent, level, types.OrgStatus(int(status.Int64())))
}
}
}
}

View File

@ -15,6 +15,7 @@ import (
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/p2p/enode"
"math/big"
"strings"
)
//default gas limit to use if not passed in sendTxArgs
@ -215,9 +216,9 @@ func (s *QuorumControlsAPI) AddOrg(orgId string, url string, acct common.Address
return s.executePermAction(AddOrg, txArgs{orgId: orgId, url: url, acctId: acct, txa: txa})
}
//func (s *QuorumControlsAPI) AddSubOrg(porgId, orgId string, url string, acct common.Address, txa ethapi.SendTxArgs) ExecStatus {
// return s.executePermAction(AddSubOrg, txArgs{porgId: porgId, orgId: orgId, url: url, acctId: acct, txa: txa})
//}
func (s *QuorumControlsAPI) AddSubOrg(porgId, orgId string, url string, acct common.Address, txa ethapi.SendTxArgs) ExecStatus {
return s.executePermAction(AddSubOrg, txArgs{porgId: porgId, orgId: orgId, url: url, acctId: acct, txa: txa})
}
func (s *QuorumControlsAPI) ApproveOrg(orgId string, url string, acct common.Address, txa ethapi.SendTxArgs) ExecStatus {
return s.executePermAction(ApproveOrg, txArgs{orgId: orgId, url: url, acctId: acct, txa: txa})
@ -268,7 +269,7 @@ func (s *QuorumControlsAPI) isNetworkAdmin(account common.Address) bool {
func (s *QuorumControlsAPI) isOrgAdmin(account common.Address, orgId string) bool {
ac := types.AcctInfoMap.GetAccount(account)
return ac != nil && (ac.RoleId == s.permConfig.OrgAdminRole && ac.OrgId == orgId)
return ac != nil && (ac.RoleId == s.permConfig.OrgAdminRole && strings.Contains(orgId, ac.OrgId))
}
func (s *QuorumControlsAPI) checkOrgExists(orgId string) bool {
@ -407,38 +408,37 @@ func (s *QuorumControlsAPI) executePermAction(action PermAction, args txArgs) Ex
// check if anything pending approval
tx, err = pinterf.ApproveOrg(args.orgId, args.url, args.acctId)
//case AddSubOrg:
// // check if caller is network admin
// if !s.isNetworkAdmin(args.txa.From) {
// return ErrNotNetworkAdmin
// }
//
// // check if any previous op is pending approval for network admin
// if s.checkPendingOp(s.permConfig.NwAdminOrg, pinterf) {
// return ErrPendingApprovals
// }
// // check if org already exists
// if s.checkOrgExists(args.orgId) {
// return ErrOrgExists
// }
//
// // validate node id and
// _, err := enode.ParseV4(args.url)
// if err != nil {
// return ErrInvalidNode
// }
//
// // check if node already there
// if s.checkNodeExists(args.url) {
// return ErrNodePresent
// }
//
// // check if account is already part of another org
// if execStatus, er := s.checkOrgAdminExists(args.orgId, args.acctId); er != nil {
// return execStatus
// }
//
// tx, err = pinterf.AddOrg(args.orgId, args.url, args.acctId)
case AddSubOrg:
// check if caller is network admin
if !s.isOrgAdmin(args.txa.From, args.porgId) {
return ErrNotOrgAdmin
}
// check if org already exists
if s.checkOrgExists(args.orgId) {
return ErrOrgExists
}
// validate node id and
if len(args.url) != 0 {
_, err := enode.ParseV4(args.url)
if err != nil {
return ErrInvalidNode
}
// check if node already there
if s.checkNodeExists(args.url) {
return ErrNodePresent
}
}
// check if account is already part of another org
if (args.acctId != common.Address{}) {
if execStatus, er := s.checkOrgAdminExists(args.orgId, args.acctId); er != nil {
return execStatus
}
}
tx, err = pinterf.AddSubOrg(args.porgId, args.orgId, args.url, args.acctId)
case UpdateOrgStatus:
// check if called is network admin

View File

@ -3,6 +3,7 @@ package types
import (
"github.com/ethereum/go-ethereum/common"
"github.com/hashicorp/golang-lru"
"math/big"
"sync"
)
@ -26,8 +27,11 @@ const (
)
type OrgInfo struct {
OrgId string
Status OrgStatus
OrgId string
ParentOrgId string
UltimateParent string
Level *big.Int
Status OrgStatus
}
type NodeStatus uint8
@ -174,11 +178,17 @@ func SetDefaultAccess() {
DefaultAccess = ReadOnly
}
func (o *OrgCache) UpsertOrg(orgId string, status OrgStatus) {
func (o *OrgCache) UpsertOrg(orgId, parentOrg, ultimateParent string, level *big.Int, status OrgStatus) {
defer o.mux.Unlock()
o.mux.Lock()
key := OrgKey{OrgId: orgId}
o.c.Add(key, &OrgInfo{orgId, status})
var key OrgKey
if parentOrg == "" {
key = OrgKey{OrgId: orgId}
} else {
key = OrgKey{OrgId: orgId + "." + parentOrg}
}
o.c.Add(key, &OrgInfo{orgId, parentOrg, ultimateParent, level, status})
}
func (o *OrgCache) GetOrg(orgId string) *OrgInfo {

View File

@ -756,6 +756,12 @@ web3._extend({
call: 'quorumPermission_approveOrg',
params: 4,
inputFormatter: [null,null,web3._extend.formatters.inputAddressFormatter,web3._extend.formatters.inputTransactionFormatter]
}),
new web3._extend.Method({
name: 'addSubOrg',
call: 'quorumPermission_addSubOrg',
params: 5,
inputFormatter: [null,null,null,web3._extend.formatters.inputAddressFormatter,web3._extend.formatters.inputTransactionFormatter]
}),
new web3._extend.Method({
name: 'updateOrgStatus',