diff --git a/controls/permissions/Permissions.sol b/controls/permissions/Permissions.sol index f123d36a2..cab353f00 100644 --- a/controls/permissions/Permissions.sol +++ b/controls/permissions/Permissions.sol @@ -31,7 +31,7 @@ contract Permissions { mapping (uint => uint) private voteCount; // checks if firts time network boot up has happened or not - bool networkBoot = false; + bool private networkBoot = false; // node permission events for new node propose event NodeProposed(string _enodeId); @@ -87,6 +87,12 @@ contract Permissions { /* public and external functions */ // view functions + // Get number of nodes + function getNetworkBootStatus() public view returns (bool) + { + return networkBoot; + } + // Get number of nodes function getNumberOfNodes() public view returns (uint) { @@ -134,9 +140,11 @@ contract Permissions { // state change functions // update the networ boot status as true - function updateNetworkBootStatus() external { + function updateNetworkBootStatus() external returns (bool) + { require (networkBoot == false, "Invalid call: Network boot up completed"); networkBoot = true; + return networkBoot; } // propose a new node to the network diff --git a/controls/permissions/abi/Permissions.abi b/controls/permissions/abi/Permissions.abi index 13e320086..e5ed3fe82 100644 --- a/controls/permissions/abi/Permissions.abi +++ b/controls/permissions/abi/Permissions.abi @@ -1 +1 @@ -[{"constant":true,"inputs":[{"name":"_enodeId","type":"string"}],"name":"getVoteCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_enodeId","type":"string"},{"name":"_voter","type":"address"}],"name":"getVoteStatus","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_enodeId","type":"string"}],"name":"approveNode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getNumberOfAccounts","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_enodeId","type":"string"}],"name":"getNodeStatus","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_enodeId","type":"string"}],"name":"deactivateNode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"updateNetworkBootStatus","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_enodeId","type":"string"}],"name":"proposeDeactivation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_enodeId","type":"string"}],"name":"blacklistNode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_enodeId","type":"string"},{"name":"_ipAddrPort","type":"string"},{"name":"_discPort","type":"string"},{"name":"_raftPort","type":"string"}],"name":"proposeNodeBlacklisting","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"getEnodeId","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"removeVoter","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":"_address","type":"address"},{"name":"_accountAccess","type":"uint8"}],"name":"updateAccountAccess","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_enodeId","type":"string"},{"name":"_ipAddrPort","type":"string"},{"name":"_discPort","type":"string"},{"name":"_raftPort","type":"string"}],"name":"proposeNode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"getAccountAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"addVoter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"}],"name":"NodeProposed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"},{"indexed":false,"name":"_ipAddrPort","type":"string"},{"indexed":false,"name":"_discPort","type":"string"},{"indexed":false,"name":"_raftPort","type":"string"}],"name":"NodeApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"},{"indexed":false,"name":"_accountAddress","type":"address"}],"name":"VoteNodeApproval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"}],"name":"NodePendingDeactivation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"},{"indexed":false,"name":"_ipAddrPort","type":"string"},{"indexed":false,"name":"_discPort","type":"string"},{"indexed":false,"name":"_raftPort","type":"string"}],"name":"NodeDeactivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"},{"indexed":false,"name":"_accountAddress","type":"address"}],"name":"VoteNodeDeactivation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"}],"name":"NodePendingBlacklist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"},{"indexed":false,"name":"_ipAddrPort","type":"string"},{"indexed":false,"name":"_discPort","type":"string"},{"indexed":false,"name":"_raftPort","type":"string"}],"name":"NodeBlacklisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"},{"indexed":false,"name":"_accountAddress","type":"address"}],"name":"VoteNodeBlacklist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_address","type":"address"},{"indexed":false,"name":"_access","type":"uint8"}],"name":"AccountAccessModified","type":"event"},{"anonymous":false,"inputs":[],"name":"NoVotingAccount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_address","type":"address"}],"name":"VoterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_address","type":"address"}],"name":"VoterRemoved","type":"event"}] \ No newline at end of file +[{"constant":true,"inputs":[{"name":"_enodeId","type":"string"}],"name":"getVoteCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_enodeId","type":"string"},{"name":"_voter","type":"address"}],"name":"getVoteStatus","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_enodeId","type":"string"}],"name":"approveNode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getNumberOfAccounts","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_enodeId","type":"string"}],"name":"getNodeStatus","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_enodeId","type":"string"}],"name":"deactivateNode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"updateNetworkBootStatus","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_enodeId","type":"string"}],"name":"proposeDeactivation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_enodeId","type":"string"}],"name":"blacklistNode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getNetworkBootStatus","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_enodeId","type":"string"},{"name":"_ipAddrPort","type":"string"},{"name":"_discPort","type":"string"},{"name":"_raftPort","type":"string"}],"name":"proposeNodeBlacklisting","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"getEnodeId","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"removeVoter","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":"_address","type":"address"},{"name":"_accountAccess","type":"uint8"}],"name":"updateAccountAccess","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_enodeId","type":"string"},{"name":"_ipAddrPort","type":"string"},{"name":"_discPort","type":"string"},{"name":"_raftPort","type":"string"}],"name":"proposeNode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"getAccountAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"addVoter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"}],"name":"NodeProposed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"},{"indexed":false,"name":"_ipAddrPort","type":"string"},{"indexed":false,"name":"_discPort","type":"string"},{"indexed":false,"name":"_raftPort","type":"string"}],"name":"NodeApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"},{"indexed":false,"name":"_accountAddress","type":"address"}],"name":"VoteNodeApproval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"}],"name":"NodePendingDeactivation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"},{"indexed":false,"name":"_ipAddrPort","type":"string"},{"indexed":false,"name":"_discPort","type":"string"},{"indexed":false,"name":"_raftPort","type":"string"}],"name":"NodeDeactivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"},{"indexed":false,"name":"_accountAddress","type":"address"}],"name":"VoteNodeDeactivation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"}],"name":"NodePendingBlacklist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"},{"indexed":false,"name":"_ipAddrPort","type":"string"},{"indexed":false,"name":"_discPort","type":"string"},{"indexed":false,"name":"_raftPort","type":"string"}],"name":"NodeBlacklisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_enodeId","type":"string"},{"indexed":false,"name":"_accountAddress","type":"address"}],"name":"VoteNodeBlacklist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_address","type":"address"},{"indexed":false,"name":"_access","type":"uint8"}],"name":"AccountAccessModified","type":"event"},{"anonymous":false,"inputs":[],"name":"NoVotingAccount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_address","type":"address"}],"name":"VoterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_address","type":"address"}],"name":"VoterRemoved","type":"event"}] \ No newline at end of file diff --git a/controls/permissions/abi/Permissions.bin-runtime b/controls/permissions/abi/Permissions.bin-runtime index 614273197..36e4da6ef 100644 --- a/controls/permissions/abi/Permissions.bin-runtime +++ b/controls/permissions/abi/Permissions.bin-runtime @@ -1 +1 @@ -6080604052600436106100f1576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063069953a7146100f65780630fdc21501461017357806321c6708814610214578063309e36ef1461024f578063397eeccb1461027a578063420c26de1461030557806344478e791461034057806347b8fe5714610357578063487363f91461039257806360514a5a146103cd578063769b24f21461045057806386c1ff68146104f6578063b81c806a14610539578063c6962b9914610564578063c7ab7ccf146105b4578063db4cf8e614610637578063f4ab9adf146106a4575b600080fd5b34801561010257600080fd5b5061015d600480360381019080803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506106e7565b6040518082815260200191505060405180910390f35b34801561017f57600080fd5b506101fa600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610870565b604051808215151515815260200191505060405180910390f35b34801561022057600080fd5b5061024d600480360381019080803590602001908201803590602001919091929391929390505050610a44565b005b34801561025b57600080fd5b50610264610ead565b6040518082815260200191505060405180910390f35b34801561028657600080fd5b506102e1600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050610eba565b604051808260068111156102f157fe5b60ff16815260200191505060405180910390f35b34801561031157600080fd5b5061033e60048036038101908080359060200190820180359060200191909192939192939050505061105d565b005b34801561034c57600080fd5b506103556114c6565b005b34801561036357600080fd5b50610390600480360381019080803590602001908201803590602001919091929391929390505050611594565b005b34801561039e57600080fd5b506103cb6004803603810190808035906020019082018035906020019190919293919293905050506119d9565b005b3480156103d957600080fd5b5061044e600480360381019080803590602001908201803590602001919091929391929390803590602001908201803590602001919091929391929390803590602001908201803590602001919091929391929390803590602001908201803590602001919091929391929390505050611e42565b005b34801561045c57600080fd5b5061047b60048036038101908080359060200190929190505050612346565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104bb5780820151818401526020810190506104a0565b50505050905090810190601f1680156104e85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561050257600080fd5b50610537600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061242c565b005b34801561054557600080fd5b5061054e612619565b6040518082815260200191505060405180910390f35b34801561057057600080fd5b506105b2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050612623565b005b3480156105c057600080fd5b506106356004803603810190808035906020019082018035906020019190919293919293908035906020019082018035906020019190919293919293908035906020019082018035906020019190919293919293908035906020019082018035906020019190919293919293905050506126a0565b005b34801561064357600080fd5b5061066260048036038101908080359060200190929190505050612ea5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156106b057600080fd5b506106e5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612f00565b005b600081600060016000836040516020018082805190602001908083835b6020831015156107295780518252602082019150602081019050602083039250610704565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b602083101515610792578051825260208201915060208101905060208303925061076d565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060001916600019168152602001908152602001600020541415151561084c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f456e6f6465206973206e6f7420696e20746865206c697374000000000000000081525060200191505060405180910390fd5b6005600061085985613060565b815260200190815260200160002054915050919050565b600082600060016000836040516020018082805190602001908083835b6020831015156108b2578051825260208201915060208101905060208303925061088d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310151561091b57805182526020820191506020810190506020830392506108f6565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206000191660001916815260200190815260200160002054141515156109d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f456e6f6465206973206e6f7420696e20746865206c697374000000000000000081525060200191505060405180910390fd5b600460006109e286613060565b815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1691505092915050565b6000806000809150600090505b600380549050811015610ae1573373ffffffffffffffffffffffffffffffffffffffff16600382815481101515610a8457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610ad45760019150610ae1565b8080600101915050610a51565b811515610b56576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4163636f756e742063616e206e6f7420766f746500000000000000000000000081525060200191505060405180910390fd5b60016006811115610b6357fe5b610b9e86868080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050610eba565b6006811115610ba957fe5b141515610c44576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f4e6f6465206e65656420746f20626520696e2050656e64696e67417070726f7681526020017f616c20737461747573000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b610c7f85858080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050613060565b9250600015156004600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141515610d5a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4e6f64652063616e206e6f7420646f75626c6520766f7465000000000000000081525060200191505060405180910390fd5b60016004600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060056000848152602001908152602001600020600081548092919060010191905055507fffbebd8cfb97304c3b16b9139a3f06e547af483cc4b5111bdbb66ccdf2aa43f385853360405180806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281038252858582818152602001925080828437820191505094505050505060405180910390a1610ea685858080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050613155565b5050505050565b6000600380549050905090565b600081600060016000836040516020018082805190602001908083835b602083101515610efc5780518252602082019150602081019050602083039250610ed7565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b602083101515610f655780518252602082019150602081019050602083039250610f40565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060001916600019168152602001908152602001600020541415151561101f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f456e6f6465206973206e6f7420696e20746865206c697374000000000000000081525060200191505060405180910390fd5b600061102a84613060565b81548110151561103657fe5b906000526020600020906005020160040160009054906101000a900460ff16915050919050565b6000806000809150600090505b6003805490508110156110fa573373ffffffffffffffffffffffffffffffffffffffff1660038281548110151561109d57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156110ed57600191506110fa565b808060010191505061106a565b81151561116f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4163636f756e742063616e206e6f7420766f746500000000000000000000000081525060200191505060405180910390fd5b6003600681111561117c57fe5b6111b786868080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050610eba565b60068111156111c257fe5b14151561125d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f4e6f6465206e65656420746f20626520696e2050656e64696e6744656163746981526020017f766174696f6e207374617475730000000000000000000000000000000000000081525060400191505060405180910390fd5b61129885858080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050613060565b9250600015156004600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141515611373576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4e6f64652063616e206e6f7420646f75626c6520766f7465000000000000000081525060200191505060405180910390fd5b60016004600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060056000848152602001908152602001600020600081548092919060010191905055507fa5243abad84fa64b3ca3ab0b45c7954a089a38bd40d0797fc3c0e8ee304229e185853360405180806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281038252858582818152602001925080828437820191505094505050505060405180910390a16114bf85858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506134a8565b5050505050565b60001515600660009054906101000a900460ff161515141515611577576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f496e76616c69642063616c6c3a204e6574776f726b20626f6f7420757020636f81526020017f6d706c657465640000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001600660006101000a81548160ff021916908315150217905550565b60008083838080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050600060016000836040516020018082805190602001908083835b60208310151561160957805182526020820191506020810190506020830392506115e4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b602083101515611672578051825260208201915060208101905060208303925061164d565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060001916600019168152602001908152602001600020541415151561172c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f456e6f6465206973206e6f7420696e20746865206c697374000000000000000081525060200191505060405180910390fd5b6117346137fb565b156119d2576002600681111561174657fe5b61178186868080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050610eba565b600681111561178c57fe5b141515611827576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4e6f6465206e65656420746f20626520696e20417070726f766564207374617481526020017f757300000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b61186285858080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050613060565b9250600360008481548110151561187557fe5b906000526020600020906005020160040160006101000a81548160ff021916908360068111156118a157fe5b0217905550600091505b6003805490508210156119675760006004600085815260200190815260200160002060006003858154811015156118de57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555081806001019250506118ab565b600060056000858152602001908152602001600020819055507f2b5689b33f48f1dcbda2084e130a9bee7b3bf14dc767ea74cbdf3e5fffb118e48585604051808060200182810382528484828181526020019250808284378201915050935050505060405180910390a15b5050505050565b6000806000809150600090505b600380549050811015611a76573373ffffffffffffffffffffffffffffffffffffffff16600382815481101515611a1957fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611a695760019150611a76565b80806001019150506119e6565b811515611aeb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4163636f756e742063616e206e6f7420766f746500000000000000000000000081525060200191505060405180910390fd5b60056006811115611af857fe5b611b3386868080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050610eba565b6006811115611b3e57fe5b141515611bd9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f4e6f6465206e65656420746f20626520696e2050656e64696e67426c61636b6c81526020017f697374696e67207374617475730000000000000000000000000000000000000081525060400191505060405180910390fd5b611c1485858080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050613060565b9250600015156004600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141515611cef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4e6f64652063616e206e6f7420646f75626c6520766f7465000000000000000081525060200191505060405180910390fd5b60016004600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060056000848152602001908152602001600020600081548092919060010191905055507fe5db3c593cd193882142dc86075a90f3b5075cbe3df4f433517393e29aa7327f85853360405180806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281038252858582818152602001925080828437820191505094505050505060405180910390a1611e3b85858080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050613847565b5050505050565b600080611e4d6137fb565b1561233a576000600160008c8c604051602001808383808284378201915050925050506040516020818303038152906040526040518082805190602001908083835b602083101515611eb45780518252602082019150602081019050602083039250611e8f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206000191660001916815260200190815260200160002054141515611f83576005600083815481101515611f1057fe5b906000526020600020906005020160040160006101000a81548160ff02191690836006811115611f3c57fe5b0217905550611f7c8a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050613060565b915061220e565b600260008154809291906001019190505550600254600160008c8c604051602001808383808284378201915050925050506040516020818303038152906040526040518082805190602001908083835b602083101515611ff85780518252602082019150602081019050602083039250611fd3565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206000191660001916815260200190815260200160002081905550600060a0604051908101604052808c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505081526020018a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200186868080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505081526020016005600681111561213a57fe5b815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190612184929190613b9a565b5060208201518160010190805190602001906121a1929190613b9a565b5060408201518160020190805190602001906121be929190613b9a565b5060608201518160030190805190602001906121db929190613b9a565b5060808201518160040160006101000a81548160ff0219169083600681111561220057fe5b021790555050505060025491505b600090505b6003805490508110156122cf57600060046000848152602001908152602001600020600060038481548110151561224657fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080600101915050612213565b600060056000848152602001908152602001600020819055507fb249ebebf429f1c79f3c9663998b3e22d45f242de6527c4a95e41d4d28115d748a8a604051808060200182810382528484828181526020019250808284378201915050935050505060405180910390a15b50505050505050505050565b6060600254821115156124135760008281548110151561236257fe5b90600052602060002090600502016000018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124075780601f106123dc57610100808354040283529160200191612407565b820191906000526020600020905b8154815290600101906020018083116123ea57829003601f168201915b50505050509050612427565b602060405190810160405280600081525090505b919050565b600080600091505b600380549050821015612614578273ffffffffffffffffffffffffffffffffffffffff1660038381548110151561246757fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612607576001820190505b600380549050811015612563576003818154811015156124d157fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660036001830381548110151561250e57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080806001019150506124b5565b6003808054905081548110151561257657fe5b9060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690557fa14a79af012d1756818f9bd59ccfc9ad185a71df86b9392d9059d9e6faf6d64483604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15b8180600101925050612434565b505050565b6000600254905090565b7f5c7c83802ef5601aed89f3f4e4ab42298ecf8ac3fe099adad5712fc65ba9676d8282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182600381111561268857fe5b60ff1681526020019250505060405180910390a15050565b600088888080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050600060016000836040516020018082805190602001908083835b60208310151561271457805182526020820191506020810190506020830392506126ef565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310151561277d5780518252602082019150602081019050602083039250612758565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206000191660001916815260200190815260200160002054141515612836576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f456e6f646520697320696e20746865206c69737400000000000000000000000081525060200191505060405180910390fd5b600660009054906101000a900460ff161515612ad657600260008154809291906001019190505550600254600160008c8c604051602001808383808284378201915050925050506040516020818303038152906040526040518082805190602001908083835b6020831015156128c1578051825260208201915060208101905060208303925061289c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206000191660001916815260200190815260200160002081905550600060a0604051908101604052808c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505081526020018a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200160026006811115612a0357fe5b815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190612a4d929190613b9a565b506020820151816001019080519060200190612a6a929190613b9a565b506040820151816002019080519060200190612a87929190613b9a565b506060820151816003019080519060200190612aa4929190613b9a565b5060808201518160040160006101000a81548160ff02191690836006811115612ac957fe5b0217905550505050612e99565b612ade6137fb565b15612e9857600260008154809291906001019190505550600254600160008c8c604051602001808383808284378201915050925050506040516020818303038152906040526040518082805190602001908083835b602083101515612b585780518252602082019150602081019050602083039250612b33565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206000191660001916815260200190815260200160002081905550600060a0604051908101604052808c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505081526020018a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200160016006811115612c9a57fe5b815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190612ce4929190613b9a565b506020820151816001019080519060200190612d01929190613b9a565b506040820151816002019080519060200190612d1e929190613b9a565b506060820151816003019080519060200190612d3b929190613b9a565b5060808201518160040160006101000a81548160ff02191690836006811115612d6057fe5b0217905550505050600091505b600380549050821015612e2b5760006004600060025481526020019081526020016000206000600385815481101515612da257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508180600101925050612d6d565b6000600560006002548152602001908152602001600020819055507faddedf3fcf588a85e0b0c3210c30da3f5597ae35221859f7e19427397a2ba80a8a8a604051808060200182810382528484828181526020019250808284378201915050935050505060405180910390a15b5b50505050505050505050565b600060038054905082111515612ef657600382815481101515612ec457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050612efb565b600090505b919050565b60008090505b600380549050811015612f92578173ffffffffffffffffffffffffffffffffffffffff16600382815481101515612f3957fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612f855761305c565b8080600101915050612f06565b60038290806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550507fa636f4a11e2d3ba7f89d042ecb0a6b886716e98cd49d8fd876ee0f73bced42b882604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15b5050565b60006001806000846040516020018082805190602001908083835b6020831015156130a0578051825260208201915060208101905060208303925061307b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310151561310957805182526020820191506020810190506020830392506130e4565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206000191660001916815260200190815260200160002054039050919050565b600061316082613060565b9050600260038054905081151561317357fe5b04600560008381526020019081526020016000205411156134a457600260008281548110151561319f57fe5b906000526020600020906005020160040160006101000a81548160ff021916908360068111156131cb57fe5b02179055507fc6d86deaa3b3cf7c374cfd405aae9f08571fce2bf6ccfe8f98a399cda8960a9860008281548110151561320057fe5b906000526020600020906005020160000160008381548110151561322057fe5b906000526020600020906005020160010160008481548110151561324057fe5b906000526020600020906005020160020160008581548110151561326057fe5b906000526020600020906005020160030160405180806020018060200180602001806020018581038552898181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156133065780601f106132db57610100808354040283529160200191613306565b820191906000526020600020905b8154815290600101906020018083116132e957829003601f168201915b50508581038452888181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156133895780601f1061335e57610100808354040283529160200191613389565b820191906000526020600020905b81548152906001019060200180831161336c57829003601f168201915b505085810383528781815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561340c5780601f106133e15761010080835404028352916020019161340c565b820191906000526020600020905b8154815290600101906020018083116133ef57829003601f168201915b505085810382528681815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561348f5780601f106134645761010080835404028352916020019161348f565b820191906000526020600020905b81548152906001019060200180831161347257829003601f168201915b50509850505050505050505060405180910390a15b5050565b60006134b382613060565b905060026003805490508115156134c657fe5b04600560008381526020019081526020016000205411156137f75760046000828154811015156134f257fe5b906000526020600020906005020160040160006101000a81548160ff0219169083600681111561351e57fe5b02179055507fd5fa0ecdea15b332dd0a270c65234bc4aee212edf2ed62eb2fd182ef55ca98a160008281548110151561355357fe5b906000526020600020906005020160000160008381548110151561357357fe5b906000526020600020906005020160010160008481548110151561359357fe5b90600052602060002090600502016002016000858154811015156135b357fe5b906000526020600020906005020160030160405180806020018060200180602001806020018581038552898181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156136595780601f1061362e57610100808354040283529160200191613659565b820191906000526020600020905b81548152906001019060200180831161363c57829003601f168201915b50508581038452888181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156136dc5780601f106136b1576101008083540402835291602001916136dc565b820191906000526020600020905b8154815290600101906020018083116136bf57829003601f168201915b505085810383528781815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561375f5780601f106137345761010080835404028352916020019161375f565b820191906000526020600020905b81548152906001019060200180831161374257829003601f168201915b50508581038252868181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156137e25780601f106137b7576101008083540402835291602001916137e2565b820191906000526020600020905b8154815290600101906020018083116137c557829003601f168201915b50509850505050505050505060405180910390a15b5050565b600080600380549050141561383f577f4b3dfc3b006eb0d5d60b3f275b4796aa31ed21a75d2e91fe750fc7549b426f6760405160405180910390a160009050613844565b600190505b90565b600061385282613060565b9050600260038054905081151561386557fe5b0460056000838152602001908152602001600020541115613b9657600660008281548110151561389157fe5b906000526020600020906005020160040160006101000a81548160ff021916908360068111156138bd57fe5b02179055507fe1b239bf9d5854aeca74dfeac25d6ce470230bdb5f0eec48713c4375becfe97e6000828154811015156138f257fe5b906000526020600020906005020160000160008381548110151561391257fe5b906000526020600020906005020160010160008481548110151561393257fe5b906000526020600020906005020160020160008581548110151561395257fe5b906000526020600020906005020160030160405180806020018060200180602001806020018581038552898181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156139f85780601f106139cd576101008083540402835291602001916139f8565b820191906000526020600020905b8154815290600101906020018083116139db57829003601f168201915b5050858103845288818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015613a7b5780601f10613a5057610100808354040283529160200191613a7b565b820191906000526020600020905b815481529060010190602001808311613a5e57829003601f168201915b5050858103835287818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015613afe5780601f10613ad357610100808354040283529160200191613afe565b820191906000526020600020905b815481529060010190602001808311613ae157829003601f168201915b5050858103825286818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015613b815780601f10613b5657610100808354040283529160200191613b81565b820191906000526020600020905b815481529060010190602001808311613b6457829003601f168201915b50509850505050505050505060405180910390a15b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613bdb57805160ff1916838001178555613c09565b82800160010185558215613c09579182015b82811115613c08578251825591602001919060010190613bed565b5b509050613c169190613c1a565b5090565b613c3c91905b80821115613c38576000816000905550600101613c20565b5090565b905600a165627a7a72305820d1df48a922a6ae0dd56065f375296f51d22b2c00328ea5329a9267c0247f6c2c0029 \ No newline at end of file +6080604052600436106100fc576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063069953a7146101015780630fdc21501461017e57806321c670881461021f578063309e36ef1461025a578063397eeccb14610285578063420c26de1461031057806344478e791461034b57806347b8fe571461037a578063487363f9146103b55780634cbfa82e146103f057806360514a5a1461041f578063769b24f2146104a257806386c1ff6814610548578063b81c806a1461058b578063c6962b99146105b6578063c7ab7ccf14610606578063db4cf8e614610689578063f4ab9adf146106f6575b600080fd5b34801561010d57600080fd5b50610168600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050610739565b6040518082815260200191505060405180910390f35b34801561018a57600080fd5b50610205600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506108c2565b604051808215151515815260200191505060405180910390f35b34801561022b57600080fd5b50610258600480360381019080803590602001908201803590602001919091929391929390505050610a96565b005b34801561026657600080fd5b5061026f610eff565b6040518082815260200191505060405180910390f35b34801561029157600080fd5b506102ec600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050610f0c565b604051808260068111156102fc57fe5b60ff16815260200191505060405180910390f35b34801561031c57600080fd5b506103496004803603810190808035906020019082018035906020019190919293919293905050506110af565b005b34801561035757600080fd5b50610360611518565b604051808215151515815260200191505060405180910390f35b34801561038657600080fd5b506103b36004803603810190808035906020019082018035906020019190919293919293905050506115fa565b005b3480156103c157600080fd5b506103ee600480360381019080803590602001908201803590602001919091929391929390505050611a3f565b005b3480156103fc57600080fd5b50610405611ea8565b604051808215151515815260200191505060405180910390f35b34801561042b57600080fd5b506104a0600480360381019080803590602001908201803590602001919091929391929390803590602001908201803590602001919091929391929390803590602001908201803590602001919091929391929390803590602001908201803590602001919091929391929390505050611ebf565b005b3480156104ae57600080fd5b506104cd600480360381019080803590602001909291905050506123c3565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561050d5780820151818401526020810190506104f2565b50505050905090810190601f16801561053a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561055457600080fd5b50610589600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506124a9565b005b34801561059757600080fd5b506105a0612696565b6040518082815260200191505060405180910390f35b3480156105c257600080fd5b50610604600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff1690602001909291905050506126a0565b005b34801561061257600080fd5b5061068760048036038101908080359060200190820180359060200191909192939192939080359060200190820180359060200191909192939192939080359060200190820180359060200191909192939192939080359060200190820180359060200191909192939192939050505061271d565b005b34801561069557600080fd5b506106b460048036038101908080359060200190929190505050612f22565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561070257600080fd5b50610737600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612f7d565b005b600081600060016000836040516020018082805190602001908083835b60208310151561077b5780518252602082019150602081019050602083039250610756565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b6020831015156107e457805182526020820191506020810190506020830392506107bf565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060001916600019168152602001908152602001600020541415151561089e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f456e6f6465206973206e6f7420696e20746865206c697374000000000000000081525060200191505060405180910390fd5b600560006108ab856130dd565b815260200190815260200160002054915050919050565b600082600060016000836040516020018082805190602001908083835b60208310151561090457805182526020820191506020810190506020830392506108df565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310151561096d5780518252602082019150602081019050602083039250610948565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020600019166000191681526020019081526020016000205414151515610a27576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f456e6f6465206973206e6f7420696e20746865206c697374000000000000000081525060200191505060405180910390fd5b60046000610a34866130dd565b815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1691505092915050565b6000806000809150600090505b600380549050811015610b33573373ffffffffffffffffffffffffffffffffffffffff16600382815481101515610ad657fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610b265760019150610b33565b8080600101915050610aa3565b811515610ba8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4163636f756e742063616e206e6f7420766f746500000000000000000000000081525060200191505060405180910390fd5b60016006811115610bb557fe5b610bf086868080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050610f0c565b6006811115610bfb57fe5b141515610c96576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f4e6f6465206e65656420746f20626520696e2050656e64696e67417070726f7681526020017f616c20737461747573000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b610cd185858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506130dd565b9250600015156004600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141515610dac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4e6f64652063616e206e6f7420646f75626c6520766f7465000000000000000081525060200191505060405180910390fd5b60016004600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060056000848152602001908152602001600020600081548092919060010191905055507fffbebd8cfb97304c3b16b9139a3f06e547af483cc4b5111bdbb66ccdf2aa43f385853360405180806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281038252858582818152602001925080828437820191505094505050505060405180910390a1610ef885858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506131d2565b5050505050565b6000600380549050905090565b600081600060016000836040516020018082805190602001908083835b602083101515610f4e5780518252602082019150602081019050602083039250610f29565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b602083101515610fb75780518252602082019150602081019050602083039250610f92565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020600019166000191681526020019081526020016000205414151515611071576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f456e6f6465206973206e6f7420696e20746865206c697374000000000000000081525060200191505060405180910390fd5b600061107c846130dd565b81548110151561108857fe5b906000526020600020906005020160040160009054906101000a900460ff16915050919050565b6000806000809150600090505b60038054905081101561114c573373ffffffffffffffffffffffffffffffffffffffff166003828154811015156110ef57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561113f576001915061114c565b80806001019150506110bc565b8115156111c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4163636f756e742063616e206e6f7420766f746500000000000000000000000081525060200191505060405180910390fd5b600360068111156111ce57fe5b61120986868080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050610f0c565b600681111561121457fe5b1415156112af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f4e6f6465206e65656420746f20626520696e2050656e64696e6744656163746981526020017f766174696f6e207374617475730000000000000000000000000000000000000081525060400191505060405180910390fd5b6112ea85858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506130dd565b9250600015156004600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151415156113c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4e6f64652063616e206e6f7420646f75626c6520766f7465000000000000000081525060200191505060405180910390fd5b60016004600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060056000848152602001908152602001600020600081548092919060010191905055507fa5243abad84fa64b3ca3ab0b45c7954a089a38bd40d0797fc3c0e8ee304229e185853360405180806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281038252858582818152602001925080828437820191505094505050505060405180910390a161151185858080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050613525565b5050505050565b6000801515600660009054906101000a900460ff1615151415156115ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f496e76616c69642063616c6c3a204e6574776f726b20626f6f7420757020636f81526020017f6d706c657465640000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001600660006101000a81548160ff021916908315150217905550600660009054906101000a900460ff16905090565b60008083838080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050600060016000836040516020018082805190602001908083835b60208310151561166f578051825260208201915060208101905060208303925061164a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b6020831015156116d857805182526020820191506020810190506020830392506116b3565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020600019166000191681526020019081526020016000205414151515611792576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f456e6f6465206973206e6f7420696e20746865206c697374000000000000000081525060200191505060405180910390fd5b61179a613878565b15611a3857600260068111156117ac57fe5b6117e786868080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050610f0c565b60068111156117f257fe5b14151561188d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4e6f6465206e65656420746f20626520696e20417070726f766564207374617481526020017f757300000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6118c885858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506130dd565b925060036000848154811015156118db57fe5b906000526020600020906005020160040160006101000a81548160ff0219169083600681111561190757fe5b0217905550600091505b6003805490508210156119cd57600060046000858152602001908152602001600020600060038581548110151561194457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508180600101925050611911565b600060056000858152602001908152602001600020819055507f2b5689b33f48f1dcbda2084e130a9bee7b3bf14dc767ea74cbdf3e5fffb118e48585604051808060200182810382528484828181526020019250808284378201915050935050505060405180910390a15b5050505050565b6000806000809150600090505b600380549050811015611adc573373ffffffffffffffffffffffffffffffffffffffff16600382815481101515611a7f57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611acf5760019150611adc565b8080600101915050611a4c565b811515611b51576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4163636f756e742063616e206e6f7420766f746500000000000000000000000081525060200191505060405180910390fd5b60056006811115611b5e57fe5b611b9986868080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050610f0c565b6006811115611ba457fe5b141515611c3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f4e6f6465206e65656420746f20626520696e2050656e64696e67426c61636b6c81526020017f697374696e67207374617475730000000000000000000000000000000000000081525060400191505060405180910390fd5b611c7a85858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506130dd565b9250600015156004600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141515611d55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4e6f64652063616e206e6f7420646f75626c6520766f7465000000000000000081525060200191505060405180910390fd5b60016004600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060056000848152602001908152602001600020600081548092919060010191905055507fe5db3c593cd193882142dc86075a90f3b5075cbe3df4f433517393e29aa7327f85853360405180806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281038252858582818152602001925080828437820191505094505050505060405180910390a1611ea185858080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506138c4565b5050505050565b6000600660009054906101000a900460ff16905090565b600080611eca613878565b156123b7576000600160008c8c604051602001808383808284378201915050925050506040516020818303038152906040526040518082805190602001908083835b602083101515611f315780518252602082019150602081019050602083039250611f0c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206000191660001916815260200190815260200160002054141515612000576005600083815481101515611f8d57fe5b906000526020600020906005020160040160006101000a81548160ff02191690836006811115611fb957fe5b0217905550611ff98a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050506130dd565b915061228b565b600260008154809291906001019190505550600254600160008c8c604051602001808383808284378201915050925050506040516020818303038152906040526040518082805190602001908083835b6020831015156120755780518252602082019150602081019050602083039250612050565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206000191660001916815260200190815260200160002081905550600060a0604051908101604052808c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505081526020018a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200186868080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050508152602001600560068111156121b757fe5b815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190612201929190613c17565b50602082015181600101908051906020019061221e929190613c17565b50604082015181600201908051906020019061223b929190613c17565b506060820151816003019080519060200190612258929190613c17565b5060808201518160040160006101000a81548160ff0219169083600681111561227d57fe5b021790555050505060025491505b600090505b60038054905081101561234c5760006004600084815260200190815260200160002060006003848154811015156122c357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080600101915050612290565b600060056000848152602001908152602001600020819055507fb249ebebf429f1c79f3c9663998b3e22d45f242de6527c4a95e41d4d28115d748a8a604051808060200182810382528484828181526020019250808284378201915050935050505060405180910390a15b50505050505050505050565b606060025482111515612490576000828154811015156123df57fe5b90600052602060002090600502016000018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124845780601f1061245957610100808354040283529160200191612484565b820191906000526020600020905b81548152906001019060200180831161246757829003601f168201915b505050505090506124a4565b602060405190810160405280600081525090505b919050565b600080600091505b600380549050821015612691578273ffffffffffffffffffffffffffffffffffffffff166003838154811015156124e457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612684576001820190505b6003805490508110156125e05760038181548110151561254e57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660036001830381548110151561258b57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508080600101915050612532565b600380805490508154811015156125f357fe5b9060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690557fa14a79af012d1756818f9bd59ccfc9ad185a71df86b9392d9059d9e6faf6d64483604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15b81806001019250506124b1565b505050565b6000600254905090565b7f5c7c83802ef5601aed89f3f4e4ab42298ecf8ac3fe099adad5712fc65ba9676d8282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182600381111561270557fe5b60ff1681526020019250505060405180910390a15050565b600088888080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050600060016000836040516020018082805190602001908083835b602083101515612791578051825260208201915060208101905060208303925061276c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b6020831015156127fa57805182526020820191506020810190506020830392506127d5565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060001916600019168152602001908152602001600020541415156128b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f456e6f646520697320696e20746865206c69737400000000000000000000000081525060200191505060405180910390fd5b600660009054906101000a900460ff161515612b5357600260008154809291906001019190505550600254600160008c8c604051602001808383808284378201915050925050506040516020818303038152906040526040518082805190602001908083835b60208310151561293e5780518252602082019150602081019050602083039250612919565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206000191660001916815260200190815260200160002081905550600060a0604051908101604052808c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505081526020018a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200160026006811115612a8057fe5b815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190612aca929190613c17565b506020820151816001019080519060200190612ae7929190613c17565b506040820151816002019080519060200190612b04929190613c17565b506060820151816003019080519060200190612b21929190613c17565b5060808201518160040160006101000a81548160ff02191690836006811115612b4657fe5b0217905550505050612f16565b612b5b613878565b15612f1557600260008154809291906001019190505550600254600160008c8c604051602001808383808284378201915050925050506040516020818303038152906040526040518082805190602001908083835b602083101515612bd55780518252602082019150602081019050602083039250612bb0565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206000191660001916815260200190815260200160002081905550600060a0604051908101604052808c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505081526020018a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050815260200160016006811115612d1757fe5b815250908060018154018082558091505090600182039060005260206000209060050201600090919290919091506000820151816000019080519060200190612d61929190613c17565b506020820151816001019080519060200190612d7e929190613c17565b506040820151816002019080519060200190612d9b929190613c17565b506060820151816003019080519060200190612db8929190613c17565b5060808201518160040160006101000a81548160ff02191690836006811115612ddd57fe5b0217905550505050600091505b600380549050821015612ea85760006004600060025481526020019081526020016000206000600385815481101515612e1f57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508180600101925050612dea565b6000600560006002548152602001908152602001600020819055507faddedf3fcf588a85e0b0c3210c30da3f5597ae35221859f7e19427397a2ba80a8a8a604051808060200182810382528484828181526020019250808284378201915050935050505060405180910390a15b5b50505050505050505050565b600060038054905082111515612f7357600382815481101515612f4157fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050612f78565b600090505b919050565b60008090505b60038054905081101561300f578173ffffffffffffffffffffffffffffffffffffffff16600382815481101515612fb657fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613002576130d9565b8080600101915050612f83565b60038290806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550507fa636f4a11e2d3ba7f89d042ecb0a6b886716e98cd49d8fd876ee0f73bced42b882604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15b5050565b60006001806000846040516020018082805190602001908083835b60208310151561311d57805182526020820191506020810190506020830392506130f8565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b6020831015156131865780518252602082019150602081019050602083039250613161565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206000191660001916815260200190815260200160002054039050919050565b60006131dd826130dd565b905060026003805490508115156131f057fe5b046005600083815260200190815260200160002054111561352157600260008281548110151561321c57fe5b906000526020600020906005020160040160006101000a81548160ff0219169083600681111561324857fe5b02179055507fc6d86deaa3b3cf7c374cfd405aae9f08571fce2bf6ccfe8f98a399cda8960a9860008281548110151561327d57fe5b906000526020600020906005020160000160008381548110151561329d57fe5b90600052602060002090600502016001016000848154811015156132bd57fe5b90600052602060002090600502016002016000858154811015156132dd57fe5b906000526020600020906005020160030160405180806020018060200180602001806020018581038552898181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156133835780601f1061335857610100808354040283529160200191613383565b820191906000526020600020905b81548152906001019060200180831161336657829003601f168201915b50508581038452888181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156134065780601f106133db57610100808354040283529160200191613406565b820191906000526020600020905b8154815290600101906020018083116133e957829003601f168201915b50508581038352878181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156134895780601f1061345e57610100808354040283529160200191613489565b820191906000526020600020905b81548152906001019060200180831161346c57829003601f168201915b505085810382528681815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561350c5780601f106134e15761010080835404028352916020019161350c565b820191906000526020600020905b8154815290600101906020018083116134ef57829003601f168201915b50509850505050505050505060405180910390a15b5050565b6000613530826130dd565b9050600260038054905081151561354357fe5b046005600083815260200190815260200160002054111561387457600460008281548110151561356f57fe5b906000526020600020906005020160040160006101000a81548160ff0219169083600681111561359b57fe5b02179055507fd5fa0ecdea15b332dd0a270c65234bc4aee212edf2ed62eb2fd182ef55ca98a16000828154811015156135d057fe5b90600052602060002090600502016000016000838154811015156135f057fe5b906000526020600020906005020160010160008481548110151561361057fe5b906000526020600020906005020160020160008581548110151561363057fe5b906000526020600020906005020160030160405180806020018060200180602001806020018581038552898181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156136d65780601f106136ab576101008083540402835291602001916136d6565b820191906000526020600020905b8154815290600101906020018083116136b957829003601f168201915b50508581038452888181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156137595780601f1061372e57610100808354040283529160200191613759565b820191906000526020600020905b81548152906001019060200180831161373c57829003601f168201915b50508581038352878181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156137dc5780601f106137b1576101008083540402835291602001916137dc565b820191906000526020600020905b8154815290600101906020018083116137bf57829003601f168201915b505085810382528681815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561385f5780601f106138345761010080835404028352916020019161385f565b820191906000526020600020905b81548152906001019060200180831161384257829003601f168201915b50509850505050505050505060405180910390a15b5050565b60008060038054905014156138bc577f4b3dfc3b006eb0d5d60b3f275b4796aa31ed21a75d2e91fe750fc7549b426f6760405160405180910390a1600090506138c1565b600190505b90565b60006138cf826130dd565b905060026003805490508115156138e257fe5b0460056000838152602001908152602001600020541115613c1357600660008281548110151561390e57fe5b906000526020600020906005020160040160006101000a81548160ff0219169083600681111561393a57fe5b02179055507fe1b239bf9d5854aeca74dfeac25d6ce470230bdb5f0eec48713c4375becfe97e60008281548110151561396f57fe5b906000526020600020906005020160000160008381548110151561398f57fe5b90600052602060002090600502016001016000848154811015156139af57fe5b90600052602060002090600502016002016000858154811015156139cf57fe5b90600052602060002090600502016003016040518080602001806020018060200180602001858103855289818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015613a755780601f10613a4a57610100808354040283529160200191613a75565b820191906000526020600020905b815481529060010190602001808311613a5857829003601f168201915b5050858103845288818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015613af85780601f10613acd57610100808354040283529160200191613af8565b820191906000526020600020905b815481529060010190602001808311613adb57829003601f168201915b5050858103835287818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015613b7b5780601f10613b5057610100808354040283529160200191613b7b565b820191906000526020600020905b815481529060010190602001808311613b5e57829003601f168201915b5050858103825286818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015613bfe5780601f10613bd357610100808354040283529160200191613bfe565b820191906000526020600020905b815481529060010190602001808311613be157829003601f168201915b50509850505050505050505060405180910390a15b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613c5857805160ff1916838001178555613c86565b82800160010185558215613c86579182015b82811115613c85578251825591602001919060010190613c6a565b5b509050613c939190613c97565b5090565b613cb991905b80821115613cb5576000816000905550600101613c9d565b5090565b905600a165627a7a723058208fabaa7b19bc91b1b576424d6ac1f39dade73f870d414009d8f8d545b37499580029 \ No newline at end of file diff --git a/controls/permissions/permissions.go b/controls/permissions/permissions.go index 27df9de9a..ac9d29e28 100644 --- a/controls/permissions/permissions.go +++ b/controls/permissions/permissions.go @@ -27,8 +27,6 @@ import ( const ( PERMISSIONED_CONFIG = "permissioned-nodes.json" BLACKLIST_CONFIG = "disallowed-nodes.json" - RAFT = "raft" - ISTANBUL = "istanbul" ) type NodeOperation uint8 @@ -52,12 +50,16 @@ func QuorumPermissioning(ctx *cli.Context, stack *node.Node ) error { log.Error ("Permissions not enabled for the network : ", "err" , err) return nil } - consensusEngine := ISTANBUL + isRaft := false if ctx.GlobalBool(utils.RaftModeFlag.Name) { - consensusEngine = RAFT - } + isRaft = true + } + + // Permissions initialization + err = permissionsInit(ctx, stack, e, stateReader, isRaft) + // Monitors node addition and decativation from network - manageNodePermissions(ctx, stack, e, stateReader, consensusEngine); + manageNodePermissions(ctx, stack, e, stateReader, isRaft); // Monitors account level persmissions update from smart contarct manageAccountPermissions(stack, stateReader); @@ -65,31 +67,49 @@ func QuorumPermissioning(ctx *cli.Context, stack *node.Node ) error { return nil } - -// Manages node addition and decavtivation from network -func manageNodePermissions(ctx *cli.Context, stack *node.Node, e *eth.Ethereum, stateReader *ethclient.Client, consensusEngine string) { +// This functions updates the initial values for the network +func permissionsInit(ctx *cli.Context, stack *node.Node, e *eth.Ethereum, stateReader *ethclient.Client, isRaft bool) error { // populate the initial list of nodes into the smart contract // from permissioned-nodes.json - populateNodesToContract(ctx, stack, e, stateReader) + populateStaticNodesToContract(ctx, stack, e, stateReader) + + // populate the account access for the genesis.json accounts. these + // accounts will have full access + // populateInitAccountAccess() + + + // call populates the node details from contract to KnownNodes + if err := populatePermissionedNodes (stack, stateReader, isRaft); err != nil { + return err + } + // call populates the account permissions based on past history + if err := populateAcctPermissions (stack, stateReader); err != nil { + return err + } + + return nil +} + +// Manages node addition and decavtivation from network +func manageNodePermissions(ctx *cli.Context, stack *node.Node, e *eth.Ethereum, stateReader *ethclient.Client, isRaft bool) { //monitor for new nodes addition via smart contract - go monitorNewNodeAdd(stack, stateReader, consensusEngine) + go monitorNewNodeAdd(stack, stateReader, isRaft) //monitor for nodes deletiin via smart contract - go monitorNodeDeactivation(stack, stateReader, consensusEngine) + go monitorNodeDeactivation(stack, stateReader, isRaft) //monitor for nodes blacklisting via smart contract - go monitorNodeBlacklisting(stack, stateReader, consensusEngine) + go monitorNodeBlacklisting(stack, stateReader, isRaft) } // This functions listens on the channel for new node approval via smart contract and // adds the same into permissioned-nodes.json -func monitorNewNodeAdd(stack *node.Node, stateReader *ethclient.Client, consensusEngine string) { +func monitorNewNodeAdd(stack *node.Node, stateReader *ethclient.Client, isRaft bool) { permissions, err := NewPermissionsFilterer(params.QuorumPermissionsContract, stateReader) if err != nil { log.Error ("failed to monitor new node add : ", "err" , err) } - datadir := stack.DataDir() ch := make(chan *PermissionsNodeApproved, 1) @@ -106,19 +126,18 @@ func monitorNewNodeAdd(stack *node.Node, stateReader *ethclient.Client, consensu for { select { case nodeAddEvent = <-ch: - updatePermissionedNodes(nodeAddEvent.EnodeId, nodeAddEvent.IpAddrPort, nodeAddEvent.DiscPort, nodeAddEvent.RaftPort, datadir, consensusEngine, NodeAdd) + updatePermissionedNodes(stack, nodeAddEvent.EnodeId, nodeAddEvent.IpAddrPort, nodeAddEvent.DiscPort, nodeAddEvent.RaftPort, isRaft, NodeAdd) } } } // This functions listens on the channel for new node approval via smart contract and // adds the same into permissioned-nodes.json -func monitorNodeDeactivation(stack *node.Node, stateReader *ethclient.Client, consensusEngine string) { +func monitorNodeDeactivation(stack *node.Node, stateReader *ethclient.Client, isRaft bool) { permissions, err := NewPermissionsFilterer(params.QuorumPermissionsContract, stateReader) if err != nil { log.Error ("Failed to monitor node delete: ", "err" , err) } - datadir := stack.DataDir() ch := make(chan *PermissionsNodeDeactivated) @@ -135,7 +154,7 @@ func monitorNodeDeactivation(stack *node.Node, stateReader *ethclient.Client, co for { select { case newNodeDeleteEvent = <-ch: - updatePermissionedNodes(newNodeDeleteEvent.EnodeId, newNodeDeleteEvent.IpAddrPort, newNodeDeleteEvent.DiscPort, newNodeDeleteEvent.RaftPort, datadir, consensusEngine, NodeDelete) + updatePermissionedNodes(stack, newNodeDeleteEvent.EnodeId, newNodeDeleteEvent.IpAddrPort, newNodeDeleteEvent.DiscPort, newNodeDeleteEvent.RaftPort, isRaft, NodeDelete) } } @@ -143,7 +162,7 @@ func monitorNodeDeactivation(stack *node.Node, stateReader *ethclient.Client, co // This function listnes on the channel for any node blacklisting event via smart contract // and adds the same disallowed-nodes.json -func monitorNodeBlacklisting(stack *node.Node, stateReader *ethclient.Client, consensusEngine string) { +func monitorNodeBlacklisting(stack *node.Node, stateReader *ethclient.Client, isRaft bool) { permissions, err := NewPermissionsFilterer(params.QuorumPermissionsContract, stateReader) if err != nil { log.Error ("failed to monitor new node add : ", "err" , err) @@ -163,59 +182,41 @@ func monitorNodeBlacklisting(stack *node.Node, stateReader *ethclient.Client, co for { select { case nodeBlacklistEvent = <-ch: - updateDisallowedNodes(nodeBlacklistEvent, stack, consensusEngine) + updateDisallowedNodes(nodeBlacklistEvent, stack, isRaft) } } } //this function populates the new node information into the permissioned-nodes.json file -func updatePermissionedNodes(enodeId , ipAddrPort, discPort, raftPort, dataDir, consensusEngine string, operation NodeOperation){ - log.Debug("updatePermissionedNodes", "DataDir", dataDir, "file", PERMISSIONED_CONFIG) +func updatePermissionedNodes(stack *node.Node, enodeId , ipAddrPort, discPort, raftPort string, isRaft bool, operation NodeOperation){ + newEnodeId := formatEnodeId(enodeId, ipAddrPort, discPort, raftPort, isRaft) + + //new logic to update the server KnownNodes variable for permissioning + server := stack.Server(); + newNode, err := discover.ParseNode(newEnodeId) - path := filepath.Join(dataDir, PERMISSIONED_CONFIG) - if _, err := os.Stat(path); err != nil { - log.Error("Read Error for permissioned-nodes.json file. This is because 'permissioned' flag is specified but no permissioned-nodes.json file is present.", "err", err) - return - } - // Load the nodes from the config file - blob, err := ioutil.ReadFile(path) if err != nil { - log.Error("updatePermissionedNodes: Failed to access permissioned-nodes.json", "err", err) - return + log.Error("updatePermissionedNodes: Node URL", "url", newEnodeId, "err", err) } - nodelist := []string{} - if err := json.Unmarshal(blob, &nodelist); err != nil { - log.Error("updatePermissionedNodes: Failed to load nodes list", "err", err) - return - } - newEnodeId := formatEnodeId(enodeId, ipAddrPort, discPort, raftPort, consensusEngine) - if (operation == NodeAdd){ - nodelist = append(nodelist, newEnodeId) + // Add the new enode id to server.KnownNodes + server.KnownNodes = append(server.KnownNodes, newNode) } else { + // delete the new enode id from server.KnownNodes index := 0 - for i, enodeId := range nodelist { - if (enodeId == newEnodeId){ + for i, node := range server.KnownNodes { + if (node.ID == newNode.ID){ index = i - break } } - nodelist = append(nodelist[:index], nodelist[index+1:]...) + server.KnownNodes = append (server.KnownNodes[:index], server.KnownNodes[index+1:]...) } - mu := sync.RWMutex{} - blob, _ = json.Marshal(nodelist) - - mu.Lock() - if err:= ioutil.WriteFile(path, blob, 0644); err!= nil{ - log.Error("updatePermissionedNodes: Error writing new node info to file", "err", err) - } - mu.Unlock() } //this function populates the new node information into the permissioned-nodes.json file -func updateDisallowedNodes(nodeBlacklistEvent *PermissionsNodeBlacklisted, stack *node.Node, consensusEngine string){ +func updateDisallowedNodes(nodeBlacklistEvent *PermissionsNodeBlacklisted, stack *node.Node, isRaft bool){ dataDir := stack.DataDir() log.Debug("updateDisallowedNodes", "DataDir", dataDir, "file", BLACKLIST_CONFIG) @@ -247,7 +248,7 @@ func updateDisallowedNodes(nodeBlacklistEvent *PermissionsNodeBlacklisted, stack } } - newEnodeId := formatEnodeId (nodeBlacklistEvent.EnodeId, nodeBlacklistEvent.IpAddrPort, nodeBlacklistEvent.DiscPort, nodeBlacklistEvent.RaftPort, consensusEngine ) + newEnodeId := formatEnodeId (nodeBlacklistEvent.EnodeId, nodeBlacklistEvent.IpAddrPort, nodeBlacklistEvent.DiscPort, nodeBlacklistEvent.RaftPort, isRaft ) nodelist = append(nodelist, newEnodeId) mu := sync.RWMutex{} blob, _ := json.Marshal(nodelist) @@ -258,19 +259,47 @@ func updateDisallowedNodes(nodeBlacklistEvent *PermissionsNodeBlacklisted, stack mu.Unlock() // Disconnect the peer if it is already connected - disconnectNode(stack, newEnodeId, consensusEngine) + disconnectNode(stack, newEnodeId, isRaft) } // Manages account level permissions update func manageAccountPermissions(stack *node.Node, stateReader *ethclient.Client) error { - //call populate nodes to populate the nodes into contract - if err := populateAcctPermissions (stack, stateReader); err != nil { - return err - } //monitor for nodes deletiin via smart contract go monitorAccountPermissions(stack, stateReader) return nil } +// populates the nodes list from permissioned-nodes.json into the permissions +// smart contract +func populatePermissionedNodes (stack *node.Node, stateReader *ethclient.Client, isRaft bool) error{ + permissions, err := NewPermissionsFilterer(params.QuorumPermissionsContract, stateReader) + if err != nil { + log.Error ("Failed to monitor node delete: ", "err" , err) + return err + } + + opts := &bind.FilterOpts{} + pastAddEvent, err := permissions.FilterNodeApproved(opts) + + recExists := true + for recExists { + recExists = pastAddEvent.Next() + if recExists { + updatePermissionedNodes(stack, pastAddEvent.Event.EnodeId, pastAddEvent.Event.IpAddrPort, pastAddEvent.Event.DiscPort, pastAddEvent.Event.RaftPort, isRaft, NodeAdd) + } + } + + opts = &bind.FilterOpts{} + pastDelEvent, err := permissions.FilterNodeDeactivated(opts) + + recExists = true + for recExists { + recExists = pastDelEvent.Next() + if recExists { + updatePermissionedNodes(stack, pastDelEvent.Event.EnodeId, pastDelEvent.Event.IpAddrPort, pastDelEvent.Event.DiscPort, pastDelEvent.Event.RaftPort, isRaft, NodeDelete) + } + } + return nil +} // populates the nodes list from permissioned-nodes.json into the permissions // smart contract @@ -323,8 +352,8 @@ func monitorAccountPermissions(stack *node.Node, stateReader *ethclient.Client) } // Disconnect the node from the network -func disconnectNode (stack *node.Node, enodeId, consensusEngine string){ - if consensusEngine == RAFT { +func disconnectNode (stack *node.Node, enodeId string, isRaft bool){ + if isRaft { var raftService *raft.RaftService if err := stack.Service(&raftService); err == nil { raftApi := raft.NewPublicRaftAPI(raftService) @@ -349,18 +378,17 @@ func disconnectNode (stack *node.Node, enodeId, consensusEngine string){ // helper function to format EnodeId // This will format the EnodeId and return -func formatEnodeId( enodeId , ipAddrPort, discPort, raftPort, consensusEngine string) string { +func formatEnodeId( enodeId , ipAddrPort, discPort, raftPort string, isRaft bool) string { newEnodeId := "enode://" + enodeId + "@" + ipAddrPort + "?discPort=" + discPort - if consensusEngine == RAFT { + if isRaft { newEnodeId += "&raftport=" + raftPort } return newEnodeId } //populates the nodes list from permissioned-nodes.json into the permissions //smart contract -func populateNodesToContract(ctx *cli.Context, stack *node.Node, e *eth.Ethereum, stateReader *ethclient.Client){ +func populateStaticNodesToContract(ctx *cli.Context, stack *node.Node, e *eth.Ethereum, stateReader *ethclient.Client){ - log.Info("SMK - inside populateNodesToContract @363") //Read the key file from key store. SHOULD WE MAKE IT CONFIG value key := getKeyFromKeyStore(ctx) @@ -382,45 +410,49 @@ func populateNodesToContract(ctx *cli.Context, stack *node.Node, e *eth.Ethereum TransactOpts: bind.TransactOpts{ From: auth.From, Signer: auth.Signer, - GasLimit: 3558096384, + GasLimit: 4700000, GasPrice: big.NewInt(0), }, } - datadir := ctx.GlobalString(utils.DataDirFlag.Name) - - nodes := p2p.ParsePermissionedNodes(datadir) - for _, node := range nodes { - enodeID := fmt.Sprintf("%x", node.ID[:]) - ipAddr := fmt.Sprintf("%v", node.IP) - port := fmt.Sprintf("%v", node.TCP) - discPort := fmt.Sprintf("%v", node.UDP) - raftPort := fmt.Sprintf("%v", node.RaftPort) - - ipAddrPort := ipAddr + ":" + port - - log.Info("SMK-values are : ", "enodeId", enodeID, "ipAddrPort", ipAddrPort, "discPort", discPort, "raftPort", raftPort) - - log.Trace("Adding node to permissions contract", "enodeID", enodeID) - - nonce := e.TxPool().Nonce(permissionsSession.TransactOpts.From) - permissionsSession.TransactOpts.Nonce = new(big.Int).SetUint64(nonce) - - tx, err := permissionsSession.ProposeNode(enodeID, ipAddrPort, discPort, raftPort) - if err != nil { - log.Warn("Failed to propose node", "err", err) - } - log.Debug("Transaction pending", "tx hash", tx.Hash()) - } - // update the network boot status to true - nonce := e.TxPool().Nonce(permissionsSession.TransactOpts.From) - permissionsSession.TransactOpts.Nonce = new(big.Int).SetUint64(nonce) - - tx, err := permissionsSession.UpdateNetworkBootStatus() + tx, err := permissionsSession.GetNetworkBootStatus() if err != nil { log.Warn("Failed to udpate network boot status ", "err", err) } - log.Debug("Transaction pending", "tx hash", tx.Hash()) + if tx != true { + datadir := ctx.GlobalString(utils.DataDirFlag.Name) + + nodes := p2p.ParsePermissionedNodes(datadir) + for _, node := range nodes { + + enodeID := node.ID.String() + ipAddr := node.IP.String() + port := fmt.Sprintf("%v", node.TCP) + discPort := fmt.Sprintf("%v", node.UDP) + raftPort := fmt.Sprintf("%v", node.RaftPort) + + ipAddrPort := ipAddr + ":" + port + + log.Trace("Adding node to permissions contract", "enodeID", enodeID) + + nonce := e.TxPool().Nonce(permissionsSession.TransactOpts.From) + permissionsSession.TransactOpts.Nonce = new(big.Int).SetUint64(nonce) + + tx, err := permissionsSession.ProposeNode(enodeID, ipAddrPort, discPort, raftPort) + if err != nil { + log.Warn("Failed to propose node", "err", err) + } + log.Debug("Transaction pending", "tx hash", tx.Hash()) + } + // update the network boot status to true + nonce := e.TxPool().Nonce(permissionsSession.TransactOpts.From) + permissionsSession.TransactOpts.Nonce = new(big.Int).SetUint64(nonce) + + _, err := permissionsSession.UpdateNetworkBootStatus() + if err != nil { + log.Warn("Failed to udpate network boot status ", "err", err) + } + } } //This functions reads the first file in key store directory, reads the key diff --git a/controls/permissions/permissions_binding.go b/controls/permissions/permissions_binding.go index 262a543e6..7347ccd21 100644 --- a/controls/permissions/permissions_binding.go +++ b/controls/permissions/permissions_binding.go @@ -16,7 +16,7 @@ import ( ) // PermissionsABI is the input ABI used to generate the binding from. -const PermissionsABI = "[{\"constant\":true,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"getVoteCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"},{\"name\":\"_voter\",\"type\":\"address\"}],\"name\":\"getVoteStatus\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"approveNode\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getNumberOfAccounts\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"getNodeStatus\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"deactivateNode\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"updateNetworkBootStatus\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"proposeDeactivation\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"blacklistNode\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"},{\"name\":\"_ipAddrPort\",\"type\":\"string\"},{\"name\":\"_discPort\",\"type\":\"string\"},{\"name\":\"_raftPort\",\"type\":\"string\"}],\"name\":\"proposeNodeBlacklisting\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getEnodeId\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"removeVoter\",\"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\":\"_address\",\"type\":\"address\"},{\"name\":\"_accountAccess\",\"type\":\"uint8\"}],\"name\":\"updateAccountAccess\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"},{\"name\":\"_ipAddrPort\",\"type\":\"string\"},{\"name\":\"_discPort\",\"type\":\"string\"},{\"name\":\"_raftPort\",\"type\":\"string\"}],\"name\":\"proposeNode\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getAccountAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"addVoter\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"NodeProposed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_ipAddrPort\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_discPort\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_raftPort\",\"type\":\"string\"}],\"name\":\"NodeApproved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_accountAddress\",\"type\":\"address\"}],\"name\":\"VoteNodeApproval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"NodePendingDeactivation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_ipAddrPort\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_discPort\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_raftPort\",\"type\":\"string\"}],\"name\":\"NodeDeactivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_accountAddress\",\"type\":\"address\"}],\"name\":\"VoteNodeDeactivation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"NodePendingBlacklist\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_ipAddrPort\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_discPort\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_raftPort\",\"type\":\"string\"}],\"name\":\"NodeBlacklisted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_accountAddress\",\"type\":\"address\"}],\"name\":\"VoteNodeBlacklist\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_address\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_access\",\"type\":\"uint8\"}],\"name\":\"AccountAccessModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"NoVotingAccount\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"VoterAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"VoterRemoved\",\"type\":\"event\"}]" +const PermissionsABI = "[{\"constant\":true,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"getVoteCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"},{\"name\":\"_voter\",\"type\":\"address\"}],\"name\":\"getVoteStatus\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"approveNode\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getNumberOfAccounts\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"getNodeStatus\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"deactivateNode\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"updateNetworkBootStatus\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"proposeDeactivation\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"blacklistNode\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getNetworkBootStatus\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"},{\"name\":\"_ipAddrPort\",\"type\":\"string\"},{\"name\":\"_discPort\",\"type\":\"string\"},{\"name\":\"_raftPort\",\"type\":\"string\"}],\"name\":\"proposeNodeBlacklisting\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getEnodeId\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"removeVoter\",\"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\":\"_address\",\"type\":\"address\"},{\"name\":\"_accountAccess\",\"type\":\"uint8\"}],\"name\":\"updateAccountAccess\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_enodeId\",\"type\":\"string\"},{\"name\":\"_ipAddrPort\",\"type\":\"string\"},{\"name\":\"_discPort\",\"type\":\"string\"},{\"name\":\"_raftPort\",\"type\":\"string\"}],\"name\":\"proposeNode\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getAccountAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"addVoter\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"NodeProposed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_ipAddrPort\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_discPort\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_raftPort\",\"type\":\"string\"}],\"name\":\"NodeApproved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_accountAddress\",\"type\":\"address\"}],\"name\":\"VoteNodeApproval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"NodePendingDeactivation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_ipAddrPort\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_discPort\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_raftPort\",\"type\":\"string\"}],\"name\":\"NodeDeactivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_accountAddress\",\"type\":\"address\"}],\"name\":\"VoteNodeDeactivation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"}],\"name\":\"NodePendingBlacklist\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_ipAddrPort\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_discPort\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_raftPort\",\"type\":\"string\"}],\"name\":\"NodeBlacklisted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_enodeId\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"_accountAddress\",\"type\":\"address\"}],\"name\":\"VoteNodeBlacklist\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_address\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_access\",\"type\":\"uint8\"}],\"name\":\"AccountAccessModified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"NoVotingAccount\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"VoterAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"VoterRemoved\",\"type\":\"event\"}]" // Permissions is an auto generated Go binding around an Ethereum contract. type Permissions struct { @@ -212,6 +212,32 @@ func (_Permissions *PermissionsCallerSession) GetEnodeId(_index *big.Int) (strin return _Permissions.Contract.GetEnodeId(&_Permissions.CallOpts, _index) } +// GetNetworkBootStatus is a free data retrieval call binding the contract method 0x4cbfa82e. +// +// Solidity: function getNetworkBootStatus() constant returns(bool) +func (_Permissions *PermissionsCaller) GetNetworkBootStatus(opts *bind.CallOpts) (bool, error) { + var ( + ret0 = new(bool) + ) + out := ret0 + err := _Permissions.contract.Call(opts, out, "getNetworkBootStatus") + return *ret0, err +} + +// GetNetworkBootStatus is a free data retrieval call binding the contract method 0x4cbfa82e. +// +// Solidity: function getNetworkBootStatus() constant returns(bool) +func (_Permissions *PermissionsSession) GetNetworkBootStatus() (bool, error) { + return _Permissions.Contract.GetNetworkBootStatus(&_Permissions.CallOpts) +} + +// GetNetworkBootStatus is a free data retrieval call binding the contract method 0x4cbfa82e. +// +// Solidity: function getNetworkBootStatus() constant returns(bool) +func (_Permissions *PermissionsCallerSession) GetNetworkBootStatus() (bool, error) { + return _Permissions.Contract.GetNetworkBootStatus(&_Permissions.CallOpts) +} + // GetNodeStatus is a free data retrieval call binding the contract method 0x397eeccb. // // Solidity: function getNodeStatus(_enodeId string) constant returns(uint8) @@ -533,21 +559,21 @@ func (_Permissions *PermissionsTransactorSession) UpdateAccountAccess(_address c // UpdateNetworkBootStatus is a paid mutator transaction binding the contract method 0x44478e79. // -// Solidity: function updateNetworkBootStatus() returns() +// Solidity: function updateNetworkBootStatus() returns(bool) func (_Permissions *PermissionsTransactor) UpdateNetworkBootStatus(opts *bind.TransactOpts) (*types.Transaction, error) { return _Permissions.contract.Transact(opts, "updateNetworkBootStatus") } // UpdateNetworkBootStatus is a paid mutator transaction binding the contract method 0x44478e79. // -// Solidity: function updateNetworkBootStatus() returns() +// Solidity: function updateNetworkBootStatus() returns(bool) func (_Permissions *PermissionsSession) UpdateNetworkBootStatus() (*types.Transaction, error) { return _Permissions.Contract.UpdateNetworkBootStatus(&_Permissions.TransactOpts) } // UpdateNetworkBootStatus is a paid mutator transaction binding the contract method 0x44478e79. // -// Solidity: function updateNetworkBootStatus() returns() +// Solidity: function updateNetworkBootStatus() returns(bool) func (_Permissions *PermissionsTransactorSession) UpdateNetworkBootStatus() (*types.Transaction, error) { return _Permissions.Contract.UpdateNetworkBootStatus(&_Permissions.TransactOpts) } diff --git a/p2p/permissions.go b/p2p/permissions.go index 8be666569..52eb4bcfb 100644 --- a/p2p/permissions.go +++ b/p2p/permissions.go @@ -18,11 +18,10 @@ const ( ) // check if a given node is permissioned to connect to the change -func isNodePermissioned(nodename string, currentNode string, datadir string, direction string) bool { +func isNodePermissioned(nodename string, currentNode string, datadir string, direction string, knownNodes []*discover.Node ) bool { var permissionedList []string - nodes := ParsePermissionedNodes(datadir) - for _, v := range nodes { + for _, v := range knownNodes { permissionedList = append(permissionedList, v.ID.String()) } diff --git a/p2p/server.go b/p2p/server.go index 9807565b9..3b1c742ef 100644 --- a/p2p/server.go +++ b/p2p/server.go @@ -861,7 +861,7 @@ func (srv *Server) setupConn(c *conn, flags connFlag, dialDest *discover.Node) e log.Trace("Node Permissioning", "Connection Direction", direction) } - if !isNodePermissioned(node, currentNode, srv.DataDir, direction) { + if !isNodePermissioned(node, currentNode, srv.DataDir, direction, srv.KnownNodes) { return nil } } else {