mirror of https://github.com/poanetwork/quorum.git
permissions: added functions for blacklisted node recovery.
This commit is contained in:
parent
bce6c1566d
commit
b74fc4d0c2
|
@ -44,6 +44,7 @@ const (
|
|||
NodeApproved
|
||||
NodeDeactivated
|
||||
NodeBlackListed
|
||||
NodeRecoveryInitiated
|
||||
)
|
||||
|
||||
type AcctStatus uint8
|
||||
|
|
|
@ -830,6 +830,30 @@ web3._extend({
|
|||
call: 'quorumPermission_updateAccountStatus',
|
||||
params: 4,
|
||||
inputFormatter: [null, web3._extend.formatters.inputAddressFormatter,null,web3._extend.formatters.inputTransactionFormatter]
|
||||
}),
|
||||
new web3._extend.Method({
|
||||
name: 'recoverBlackListedNode',
|
||||
call: 'quorumPermission_recoverBlackListedNode',
|
||||
params: 3,
|
||||
inputFormatter: [null, null, web3._extend.formatters.inputTransactionFormatter]
|
||||
}),
|
||||
new web3._extend.Method({
|
||||
name: 'approveBlackListedNodeRecovery',
|
||||
call: 'quorumPermission_approveBlackListedNodeRecovery',
|
||||
params: 3,
|
||||
inputFormatter: [null, null, web3._extend.formatters.inputTransactionFormatter]
|
||||
}),
|
||||
new web3._extend.Method({
|
||||
name: 'recoverBlackListedAccount',
|
||||
call: 'quorumPermission_recoverBlackListedAccount',
|
||||
params: 3,
|
||||
inputFormatter: [null, web3._extend.formatters.inputAddressFormatter, web3._extend.formatters.inputTransactionFormatter]
|
||||
}),
|
||||
new web3._extend.Method({
|
||||
name: 'approveBlackListedAccountRecovery',
|
||||
call: 'quorumPermission_approveBlackListedAccountRecovery',
|
||||
params: 3,
|
||||
inputFormatter: [null, web3._extend.formatters.inputAddressFormatter, web3._extend.formatters.inputTransactionFormatter]
|
||||
}),
|
||||
new web3._extend.Method({
|
||||
name: 'getOrgDetails',
|
||||
|
|
|
@ -42,6 +42,10 @@ const (
|
|||
AddAccountToOrg
|
||||
ChangeAccountRole
|
||||
UpdateAccountStatus
|
||||
InitiateNodeRecovery
|
||||
InitiateAccountRecovery
|
||||
ApproveNodeRecovery
|
||||
ApproveAccountRecovery
|
||||
)
|
||||
|
||||
// OrgKeyAction represents an action in cluster contract
|
||||
|
@ -474,6 +478,86 @@ func (q *QuorumControlsAPI) UpdateAccountStatus(orgId string, acct common.Addres
|
|||
return ExecSuccess.OpStatus()
|
||||
}
|
||||
|
||||
func (q *QuorumControlsAPI) RecoverBlackListedNode(orgId string, enodeId string, txa ethapi.SendTxArgs) (string, error) {
|
||||
pinterf, execStatus := q.initOp(txa)
|
||||
if execStatus != ExecSuccess {
|
||||
return execStatus.OpStatus()
|
||||
}
|
||||
args := txArgs{orgId: orgId, url: enodeId, txa: txa}
|
||||
|
||||
if execStatus := q.valRecoverNode(args, pinterf); execStatus != ExecSuccess {
|
||||
return execStatus.OpStatus()
|
||||
}
|
||||
tx, err := pinterf.StartBlacklistedNodeRecovery(args.orgId, args.url)
|
||||
if err != nil {
|
||||
log.Error("Failed to execute permission action", "action", InitiateNodeRecovery, "err", err)
|
||||
msg := fmt.Sprintf("failed to execute permissions action: %v", err)
|
||||
return ExecStatus{false, msg}.OpStatus()
|
||||
}
|
||||
log.Debug("executed permission action", "action", InitiateNodeRecovery, "tx", tx)
|
||||
return ExecSuccess.OpStatus()
|
||||
}
|
||||
|
||||
func (q *QuorumControlsAPI) ApproveBlackListedNodeRecovery(orgId string, enodeId string, txa ethapi.SendTxArgs) (string, error) {
|
||||
pinterf, execStatus := q.initOp(txa)
|
||||
if execStatus != ExecSuccess {
|
||||
return execStatus.OpStatus()
|
||||
}
|
||||
args := txArgs{orgId: orgId, url: enodeId, txa: txa}
|
||||
|
||||
if execStatus := q.valRecoverNode(args, pinterf); execStatus != ExecSuccess {
|
||||
return execStatus.OpStatus()
|
||||
}
|
||||
//tx, err := pinterf.ApproveNodeRecovery(args.orgId, args.url)
|
||||
//if err != nil {
|
||||
// log.Error("Failed to execute permission action", "action", ApproveNodeRecovery, "err", err)
|
||||
// msg := fmt.Sprintf("failed to execute permissions action: %v", err)
|
||||
// return ExecStatus{false, msg}.OpStatus()
|
||||
//}
|
||||
//log.Debug("executed permission action", "action", ApproveNodeRecovery, "tx", tx)
|
||||
return ExecSuccess.OpStatus()
|
||||
}
|
||||
|
||||
func (q *QuorumControlsAPI) RecoverBlackListedAccount(orgId string, acctId common.Address, txa ethapi.SendTxArgs) (string, error) {
|
||||
pinterf, execStatus := q.initOp(txa)
|
||||
if execStatus != ExecSuccess {
|
||||
return execStatus.OpStatus()
|
||||
}
|
||||
args := txArgs{orgId: orgId, acctId: acctId, txa: txa}
|
||||
|
||||
if execStatus := q.valRecoverAccount(args, pinterf); execStatus != ExecSuccess {
|
||||
return execStatus.OpStatus()
|
||||
}
|
||||
//tx, err := pinterf.RecoverBlacklistedAccount(args.orgId, args.acctId)
|
||||
//if err != nil {
|
||||
// log.Error("Failed to execute permission action", "action", InitiateAccountRecovery, "err", err)
|
||||
// msg := fmt.Sprintf("failed to execute permissions action: %v", err)
|
||||
// return ExecStatus{false, msg}.OpStatus()
|
||||
//}
|
||||
//log.Debug("executed permission action", "action", InitiateAccountRecovery, "tx", tx)
|
||||
return ExecSuccess.OpStatus()
|
||||
}
|
||||
|
||||
func (q *QuorumControlsAPI) ApproveBlackListedAccountRecovery(orgId string, acctId common.Address, txa ethapi.SendTxArgs) (string, error) {
|
||||
pinterf, execStatus := q.initOp(txa)
|
||||
if execStatus != ExecSuccess {
|
||||
return execStatus.OpStatus()
|
||||
}
|
||||
args := txArgs{orgId: orgId, acctId: acctId, txa: txa}
|
||||
|
||||
if execStatus := q.valRecoverAccount(args, pinterf); execStatus != ExecSuccess {
|
||||
return execStatus.OpStatus()
|
||||
}
|
||||
//tx, err := pinterf.ApproveAccountRecovery(args.orgId, args.acctId)
|
||||
//if err != nil {
|
||||
// log.Error("Failed to execute permission action", "action", ApproveAccountRecovery, "err", err)
|
||||
// msg := fmt.Sprintf("failed to execute permissions action: %v", err)
|
||||
// return ExecStatus{false, msg}.OpStatus()
|
||||
//}
|
||||
//log.Debug("executed permission action", "action", ApproveAccountRecovery, "tx", tx)
|
||||
return ExecSuccess.OpStatus()
|
||||
}
|
||||
|
||||
// check if the account is network admin
|
||||
func (q *QuorumControlsAPI) isNetworkAdmin(account common.Address) bool {
|
||||
ac := types.AcctInfoMap.GetAccount(account)
|
||||
|
@ -943,6 +1027,32 @@ func (q *QuorumControlsAPI) valUpdateAccountStatus(args txArgs, pinterf *pbind.P
|
|||
return ExecSuccess
|
||||
}
|
||||
|
||||
func (q *QuorumControlsAPI) valRecoverNode(args txArgs, pinterf *pbind.PermInterfaceSession) ExecStatus {
|
||||
// check if the caller is org admin
|
||||
if !q.isNetworkAdmin(args.txa.From) {
|
||||
return ErrNotNetworkAdmin
|
||||
}
|
||||
|
||||
if q.checkPendingOp(q.permCtrl.permConfig.NwAdminOrg, pinterf) {
|
||||
return ErrPendingApprovals
|
||||
}
|
||||
|
||||
return ExecSuccess
|
||||
}
|
||||
|
||||
func (q *QuorumControlsAPI) valRecoverAccount(args txArgs, pinterf *pbind.PermInterfaceSession) ExecStatus {
|
||||
// check if the caller is org admin
|
||||
if !q.isNetworkAdmin(args.txa.From) {
|
||||
return ErrNotNetworkAdmin
|
||||
}
|
||||
|
||||
if q.checkPendingOp(q.permCtrl.permConfig.NwAdminOrg, pinterf) {
|
||||
return ErrPendingApprovals
|
||||
}
|
||||
|
||||
return ExecSuccess
|
||||
}
|
||||
|
||||
// validateAccount validates the account and returns the wallet associated with that for signing the transaction
|
||||
func (q *QuorumControlsAPI) validateAccount(from common.Address) (accounts.Wallet, error) {
|
||||
acct := accounts.Account{Address: from}
|
||||
|
|
|
@ -28,7 +28,7 @@ var (
|
|||
)
|
||||
|
||||
// NodeManagerABI is the input ABI used to generate the binding from.
|
||||
const NodeManagerABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"},{\"name\":\"_orgId\",\"type\":\"string\"},{\"name\":\"_action\",\"type\":\"uint256\"}],\"name\":\"updateNodeStatus\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"enodeId\",\"type\":\"string\"}],\"name\":\"getNodeDetails\",\"outputs\":[{\"name\":\"_orgId\",\"type\":\"string\"},{\"name\":\"_enodeId\",\"type\":\"string\"},{\"name\":\"_nodeStatus\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"},{\"name\":\"_orgId\",\"type\":\"string\"}],\"name\":\"addOrgNode\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"},{\"name\":\"_orgId\",\"type\":\"string\"}],\"name\":\"approveNode\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_nodeIndex\",\"type\":\"uint256\"}],\"name\":\"getNodeDetailsFromIndex\",\"outputs\":[{\"name\":\"_orgId\",\"type\":\"string\"},{\"name\":\"_enodeId\",\"type\":\"string\"},{\"name\":\"_nodeStatus\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"},{\"name\":\"_orgId\",\"type\":\"string\"}],\"name\":\"addNode\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getNumberOfNodes\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"},{\"name\":\"_orgId\",\"type\":\"string\"}],\"name\":\"addAdminNode\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_permUpgradable\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_orgId\",\"type\":\"string\"}],\"name\":\"NodeProposed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_orgId\",\"type\":\"string\"}],\"name\":\"NodeApproved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_orgId\",\"type\":\"string\"}],\"name\":\"NodeDeactivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_orgId\",\"type\":\"string\"}],\"name\":\"NodeActivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_orgId\",\"type\":\"string\"}],\"name\":\"NodeBlacklisted\",\"type\":\"event\"}]"
|
||||
const NodeManagerABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"},{\"name\":\"_orgId\",\"type\":\"string\"},{\"name\":\"_action\",\"type\":\"uint256\"}],\"name\":\"updateNodeStatus\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"enodeId\",\"type\":\"string\"}],\"name\":\"getNodeDetails\",\"outputs\":[{\"name\":\"_orgId\",\"type\":\"string\"},{\"name\":\"_enodeId\",\"type\":\"string\"},{\"name\":\"_nodeStatus\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"},{\"name\":\"_orgId\",\"type\":\"string\"}],\"name\":\"addOrgNode\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"},{\"name\":\"_orgId\",\"type\":\"string\"}],\"name\":\"approveNode\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_nodeIndex\",\"type\":\"uint256\"}],\"name\":\"getNodeDetailsFromIndex\",\"outputs\":[{\"name\":\"_orgId\",\"type\":\"string\"},{\"name\":\"_enodeId\",\"type\":\"string\"},{\"name\":\"_nodeStatus\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"},{\"name\":\"_orgId\",\"type\":\"string\"}],\"name\":\"addNode\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getNumberOfNodes\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"},{\"name\":\"_orgId\",\"type\":\"string\"}],\"name\":\"addAdminNode\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_permUpgradable\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_orgId\",\"type\":\"string\"}],\"name\":\"NodeProposed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_orgId\",\"type\":\"string\"}],\"name\":\"NodeApproved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_orgId\",\"type\":\"string\"}],\"name\":\"NodeDeactivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_orgId\",\"type\":\"string\"}],\"name\":\"NodeActivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_orgId\",\"type\":\"string\"}],\"name\":\"NodeBlacklisted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_orgId\",\"type\":\"string\"}],\"name\":\"NodeRecoveryInitiated\",\"type\":\"event\"}]"
|
||||
|
||||
// NodeManager is an auto generated Go binding around an Ethereum contract.
|
||||
type NodeManager struct {
|
||||
|
@ -997,3 +997,126 @@ func (_NodeManager *NodeManagerFilterer) WatchNodeProposed(opts *bind.WatchOpts,
|
|||
}
|
||||
}), nil
|
||||
}
|
||||
|
||||
// NodeManagerNodeRecoveryInitiatedIterator is returned from FilterNodeRecoveryInitiated and is used to iterate over the raw logs and unpacked data for NodeRecoveryInitiated events raised by the NodeManager contract.
|
||||
type NodeManagerNodeRecoveryInitiatedIterator struct {
|
||||
Event *NodeManagerNodeRecoveryInitiated // Event containing the contract specifics and raw log
|
||||
|
||||
contract *bind.BoundContract // Generic contract to use for unpacking event data
|
||||
event string // Event name to use for unpacking event data
|
||||
|
||||
logs chan types.Log // Log channel receiving the found contract events
|
||||
sub ethereum.Subscription // Subscription for errors, completion and termination
|
||||
done bool // Whether the subscription completed delivering logs
|
||||
fail error // Occurred error to stop iteration
|
||||
}
|
||||
|
||||
// Next advances the iterator to the subsequent event, returning whether there
|
||||
// are any more events found. In case of a retrieval or parsing error, false is
|
||||
// returned and Error() can be queried for the exact failure.
|
||||
func (it *NodeManagerNodeRecoveryInitiatedIterator) Next() bool {
|
||||
// If the iterator failed, stop iterating
|
||||
if it.fail != nil {
|
||||
return false
|
||||
}
|
||||
// If the iterator completed, deliver directly whatever's available
|
||||
if it.done {
|
||||
select {
|
||||
case log := <-it.logs:
|
||||
it.Event = new(NodeManagerNodeRecoveryInitiated)
|
||||
if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
|
||||
it.fail = err
|
||||
return false
|
||||
}
|
||||
it.Event.Raw = log
|
||||
return true
|
||||
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
// Iterator still in progress, wait for either a data or an error event
|
||||
select {
|
||||
case log := <-it.logs:
|
||||
it.Event = new(NodeManagerNodeRecoveryInitiated)
|
||||
if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
|
||||
it.fail = err
|
||||
return false
|
||||
}
|
||||
it.Event.Raw = log
|
||||
return true
|
||||
|
||||
case err := <-it.sub.Err():
|
||||
it.done = true
|
||||
it.fail = err
|
||||
return it.Next()
|
||||
}
|
||||
}
|
||||
|
||||
// Error returns any retrieval or parsing error occurred during filtering.
|
||||
func (it *NodeManagerNodeRecoveryInitiatedIterator) Error() error {
|
||||
return it.fail
|
||||
}
|
||||
|
||||
// Close terminates the iteration process, releasing any pending underlying
|
||||
// resources.
|
||||
func (it *NodeManagerNodeRecoveryInitiatedIterator) Close() error {
|
||||
it.sub.Unsubscribe()
|
||||
return nil
|
||||
}
|
||||
|
||||
// NodeManagerNodeRecoveryInitiated represents a NodeRecoveryInitiated event raised by the NodeManager contract.
|
||||
type NodeManagerNodeRecoveryInitiated struct {
|
||||
EnodeId string
|
||||
OrgId string
|
||||
Raw types.Log // Blockchain specific contextual infos
|
||||
}
|
||||
|
||||
// FilterNodeRecoveryInitiated is a free log retrieval operation binding the contract event 0xfd385c618a1e89d01fb9a21780846793e282e8bc0b60caf6ccb3e422d543fbfb.
|
||||
//
|
||||
// Solidity: e NodeRecoveryInitiated(_enodeId string, _orgId string)
|
||||
func (_NodeManager *NodeManagerFilterer) FilterNodeRecoveryInitiated(opts *bind.FilterOpts) (*NodeManagerNodeRecoveryInitiatedIterator, error) {
|
||||
|
||||
logs, sub, err := _NodeManager.contract.FilterLogs(opts, "NodeRecoveryInitiated")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &NodeManagerNodeRecoveryInitiatedIterator{contract: _NodeManager.contract, event: "NodeRecoveryInitiated", logs: logs, sub: sub}, nil
|
||||
}
|
||||
|
||||
// WatchNodeRecoveryInitiated is a free log subscription operation binding the contract event 0xfd385c618a1e89d01fb9a21780846793e282e8bc0b60caf6ccb3e422d543fbfb.
|
||||
//
|
||||
// Solidity: e NodeRecoveryInitiated(_enodeId string, _orgId string)
|
||||
func (_NodeManager *NodeManagerFilterer) WatchNodeRecoveryInitiated(opts *bind.WatchOpts, sink chan<- *NodeManagerNodeRecoveryInitiated) (event.Subscription, error) {
|
||||
|
||||
logs, sub, err := _NodeManager.contract.WatchLogs(opts, "NodeRecoveryInitiated")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return event.NewSubscription(func(quit <-chan struct{}) error {
|
||||
defer sub.Unsubscribe()
|
||||
for {
|
||||
select {
|
||||
case log := <-logs:
|
||||
// New log arrived, parse the event and forward to the user
|
||||
event := new(NodeManagerNodeRecoveryInitiated)
|
||||
if err := _NodeManager.contract.UnpackLog(event, "NodeRecoveryInitiated", log); err != nil {
|
||||
return err
|
||||
}
|
||||
event.Raw = log
|
||||
|
||||
select {
|
||||
case sink <- event:
|
||||
case err := <-sub.Err():
|
||||
return err
|
||||
case <-quit:
|
||||
return nil
|
||||
}
|
||||
case err := <-sub.Err():
|
||||
return err
|
||||
case <-quit:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}), nil
|
||||
}
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -13,6 +13,8 @@ import "./PermissionsUpgradable.sol";
|
|||
2 - Active
|
||||
3 - Deactivated
|
||||
4 - Blacklisted
|
||||
5 - Blacklisted node recovery initiated. Once approved the node
|
||||
status will be updated to Active (2)
|
||||
Once the node is blacklisted no further activity on the node is
|
||||
possible.
|
||||
*/
|
||||
|
@ -45,6 +47,10 @@ contract NodeManager {
|
|||
// node permission events for node blacklist
|
||||
event NodeBlacklisted(string _enodeId, string _orgId);
|
||||
|
||||
// node permission events for initiating the recovery of blacklisted
|
||||
// node
|
||||
event NodeRecoveryInitiated(string _enodeId, string _orgId);
|
||||
|
||||
/** @notice confirms that the caller is the address of implementation
|
||||
contract
|
||||
*/
|
||||
|
@ -174,6 +180,8 @@ contract NodeManager {
|
|||
1 - Suspend the node
|
||||
2 - Revoke suspension of a suspended node
|
||||
3 - blacklist a node
|
||||
4 - initiate the recovery of a blacklisted node
|
||||
5 - blacklisted node recovery fully approved. mark to active
|
||||
*/
|
||||
function updateNodeStatus(string calldata _enodeId, string calldata _orgId, uint256 _action) external
|
||||
onlyImplementation
|
||||
|
@ -193,9 +201,14 @@ contract NodeManager {
|
|||
nodeList[_getNodeIndex(_enodeId)].status = 2;
|
||||
emit NodeActivated(_enodeId, _orgId);
|
||||
}
|
||||
else {
|
||||
else if (_action == 3) {
|
||||
nodeList[_getNodeIndex(_enodeId)].status = 4;
|
||||
emit NodeBlacklisted(_enodeId, _orgId);
|
||||
} else if (_action == 4) {
|
||||
// node should be in blacklisted state
|
||||
require(_getNodeStatus(_enodeId) == 4, "operation cannot be performed");
|
||||
nodeList[_getNodeIndex(_enodeId)].status = 5;
|
||||
emit NodeRecoveryInitiated(_enodeId, _orgId);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -409,6 +409,23 @@ contract PermissionsImplementation {
|
|||
nodeManager.updateNodeStatus(_enodeId, _orgId, _action);
|
||||
}
|
||||
|
||||
/** @notice function to initaite blacklisted nodes recovery. this can be
|
||||
invoked by an network admin account only
|
||||
* @param _orgId unique id of the organization to which the account belongs
|
||||
* @param _enodeId full enode id being dded to the org
|
||||
* @dev this function creates a voting record for other network admins to
|
||||
approve the operation. The recovery is complete only after majority voting
|
||||
*/
|
||||
function startBlacklistedNodeRecovery(string calldata _orgId, string calldata _enodeId,
|
||||
address _caller) external onlyInterface networkAdmin(_caller) {
|
||||
// update the node status as recovery initiated. action for this is 4
|
||||
nodeManager.updateNodeStatus(_enodeId, _orgId, 4);
|
||||
|
||||
// add a voting record with pending op of 5 which corresponds to blacklisted node
|
||||
// recovery
|
||||
voterManager.addVotingItem(adminOrg, _orgId, _enodeId, address(0), 5);
|
||||
}
|
||||
|
||||
/** @notice function to fetch network boot status
|
||||
* @return bool network boot status
|
||||
*/
|
||||
|
|
|
@ -199,6 +199,24 @@ contract PermissionsInterface {
|
|||
permImplementation.updateNodeStatus(_orgId, _enodeId, _action, msg.sender);
|
||||
}
|
||||
|
||||
/** @notice interface to initiate blacklisted node recovery
|
||||
* @param _orgId unique id of the organization to which the account belongs
|
||||
* @param _enodeId full enode id being dded to the org
|
||||
*/
|
||||
function startBlacklistedNodeRecovery(string calldata _orgId, string calldata _enodeId)
|
||||
external {
|
||||
permImplementation.startBlacklistedNodeRecovery(_orgId, _enodeId, msg.sender);
|
||||
}
|
||||
|
||||
/** @notice interface to approve blacklisted node recoevry
|
||||
* @param _orgId unique id of the organization to which the account belongs
|
||||
* @param _enodeId full enode id being dded to the org
|
||||
*/
|
||||
// function approveBlacklistedNodeRecovery(string calldata _orgId, string calldata _enodeId)
|
||||
// external {
|
||||
// permImplementation.approveBlacklistedNodeRecovery(_orgId, _enodeId, msg.sender);
|
||||
// }
|
||||
|
||||
/** @notice interface to fetch detail of any pending approval activities
|
||||
for network admin organization
|
||||
* @param _orgId unique id of the organization to which the account belongs
|
||||
|
|
|
@ -16,6 +16,7 @@ import "./PermissionsUpgradable.sol";
|
|||
2 - Org suspension activity
|
||||
3 - Revoke of org suspension
|
||||
4 - Assigning admin role for a new account
|
||||
5 - Blacklisted node recovery
|
||||
*/
|
||||
contract VoterManager {
|
||||
PermissionsUpgradable private permUpgradable;
|
||||
|
|
|
@ -1 +1 @@
|
|||
[{"constant":false,"inputs":[{"name":"_enodeId","type":"string"},{"name":"_orgId","type":"string"},{"name":"_action","type":"uint256"}],"name":"updateNodeStatus","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"enodeId","type":"string"}],"name":"getNodeDetails","outputs":[{"name":"_orgId","type":"string"},{"name":"_enodeId","type":"string"},{"name":"_nodeStatus","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_enodeId","type":"string"},{"name":"_orgId","type":"string"}],"name":"addOrgNode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_enodeId","type":"string"},{"name":"_orgId","type":"string"}],"name":"approveNode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_nodeIndex","type":"uint256"}],"name":"getNodeDetailsFromIndex","outputs":[{"name":"_orgId","type":"string"},{"name":"_enodeId","type":"string"},{"name":"_nodeStatus","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_enodeId","type":"string"},{"name":"_orgId","type":"string"}],"name":"addNode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getNumberOfNodes","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_enodeId","type":"string"},{"name":"_orgId","type":"string"}],"name":"addAdminNode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_permUpgradable","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"},{"indexed":false,"name":"_orgId","type":"string"}],"name":"NodeProposed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"},{"indexed":false,"name":"_orgId","type":"string"}],"name":"NodeApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"},{"indexed":false,"name":"_orgId","type":"string"}],"name":"NodeDeactivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"},{"indexed":false,"name":"_orgId","type":"string"}],"name":"NodeActivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"},{"indexed":false,"name":"_orgId","type":"string"}],"name":"NodeBlacklisted","type":"event"}]
|
||||
[{"constant":false,"inputs":[{"name":"_enodeId","type":"string"},{"name":"_orgId","type":"string"},{"name":"_action","type":"uint256"}],"name":"updateNodeStatus","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"enodeId","type":"string"}],"name":"getNodeDetails","outputs":[{"name":"_orgId","type":"string"},{"name":"_enodeId","type":"string"},{"name":"_nodeStatus","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_enodeId","type":"string"},{"name":"_orgId","type":"string"}],"name":"addOrgNode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_enodeId","type":"string"},{"name":"_orgId","type":"string"}],"name":"approveNode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_nodeIndex","type":"uint256"}],"name":"getNodeDetailsFromIndex","outputs":[{"name":"_orgId","type":"string"},{"name":"_enodeId","type":"string"},{"name":"_nodeStatus","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_enodeId","type":"string"},{"name":"_orgId","type":"string"}],"name":"addNode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getNumberOfNodes","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_enodeId","type":"string"},{"name":"_orgId","type":"string"}],"name":"addAdminNode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_permUpgradable","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"},{"indexed":false,"name":"_orgId","type":"string"}],"name":"NodeProposed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"},{"indexed":false,"name":"_orgId","type":"string"}],"name":"NodeApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"},{"indexed":false,"name":"_orgId","type":"string"}],"name":"NodeDeactivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"},{"indexed":false,"name":"_orgId","type":"string"}],"name":"NodeActivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"},{"indexed":false,"name":"_orgId","type":"string"}],"name":"NodeBlacklisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"},{"indexed":false,"name":"_orgId","type":"string"}],"name":"NodeRecoveryInitiated","type":"event"}]
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -366,12 +366,14 @@ func (p *PermissionCtrl) manageNodePermissions() {
|
|||
chNodeDeactivated := make(chan *pbind.NodeManagerNodeDeactivated, 1)
|
||||
chNodeActivated := make(chan *pbind.NodeManagerNodeActivated, 1)
|
||||
chNodeBlacklisted := make(chan *pbind.NodeManagerNodeBlacklisted)
|
||||
chNodeRecovery := make(chan *pbind.NodeManagerNodeRecoveryInitiated, 1)
|
||||
|
||||
var evtNodeApproved *pbind.NodeManagerNodeApproved
|
||||
var evtNodeProposed *pbind.NodeManagerNodeProposed
|
||||
var evtNodeDeactivated *pbind.NodeManagerNodeDeactivated
|
||||
var evtNodeActivated *pbind.NodeManagerNodeActivated
|
||||
var evtNodeBlacklisted *pbind.NodeManagerNodeBlacklisted
|
||||
var evtNodeRecovery *pbind.NodeManagerNodeRecoveryInitiated
|
||||
|
||||
opts := &bind.WatchOpts{}
|
||||
var blockNumber uint64 = 1
|
||||
|
@ -396,6 +398,10 @@ func (p *PermissionCtrl) manageNodePermissions() {
|
|||
log.Info("Failed NodeBlacklisting", "error", err)
|
||||
}
|
||||
|
||||
if _, err := p.permNode.NodeManagerFilterer.WatchNodeRecoveryInitiated(opts, chNodeRecovery); err != nil {
|
||||
log.Info("Failed NodeBlacklisting", "error", err)
|
||||
}
|
||||
|
||||
for {
|
||||
select {
|
||||
case evtNodeApproved = <-chNodeApproved:
|
||||
|
@ -417,6 +423,10 @@ func (p *PermissionCtrl) manageNodePermissions() {
|
|||
p.updatePermissionedNodes(evtNodeBlacklisted.EnodeId, NodeDelete)
|
||||
p.updateDisallowedNodes(evtNodeBlacklisted.EnodeId)
|
||||
types.NodeInfoMap.UpsertNode(evtNodeBlacklisted.OrgId, evtNodeBlacklisted.EnodeId, types.NodeBlackListed)
|
||||
|
||||
case evtNodeRecovery = <-chNodeRecovery:
|
||||
types.NodeInfoMap.UpsertNode(evtNodeRecovery.OrgId, evtNodeRecovery.EnodeId, types.NodeRecoveryInitiated)
|
||||
|
||||
case <-p.nodeChan:
|
||||
log.Info("quit node contract watch")
|
||||
return
|
||||
|
|
Loading…
Reference in New Issue