github.com/kisexp/xdchain@v0.0.0-20211206025815-490d6b732aa7/permission/v2/backend.go (about) 1 package v2 2 3 import ( 4 "fmt" 5 6 "github.com/kisexp/xdchain/accounts/abi/bind" 7 "github.com/kisexp/xdchain/common" 8 "github.com/kisexp/xdchain/log" 9 "github.com/kisexp/xdchain/permission/core" 10 ptype "github.com/kisexp/xdchain/permission/core/types" 11 eb "github.com/kisexp/xdchain/permission/v2/bind" 12 ) 13 14 type Backend struct { 15 Ib ptype.InterfaceBackend 16 Contr *Init 17 } 18 19 func (b *Backend) ManageAccountPermissions() error { 20 chAccessModified := make(chan *eb.AcctManagerAccountAccessModified) 21 chAccessRevoked := make(chan *eb.AcctManagerAccountAccessRevoked) 22 chStatusChanged := make(chan *eb.AcctManagerAccountStatusChanged) 23 24 opts := &bind.WatchOpts{} 25 var blockNumber uint64 = 1 26 opts.Start = &blockNumber 27 28 if _, err := b.Contr.PermAcct.AcctManagerFilterer.WatchAccountAccessModified(opts, chAccessModified); err != nil { 29 return fmt.Errorf("failed AccountAccessModified: %v", err) 30 } 31 32 if _, err := b.Contr.PermAcct.AcctManagerFilterer.WatchAccountAccessRevoked(opts, chAccessRevoked); err != nil { 33 return fmt.Errorf("failed AccountAccessRevoked: %v", err) 34 } 35 36 if _, err := b.Contr.PermAcct.AcctManagerFilterer.WatchAccountStatusChanged(opts, chStatusChanged); err != nil { 37 return fmt.Errorf("failed AccountStatusChanged: %v", err) 38 } 39 40 go func() { 41 stopChan, stopSubscription := ptype.SubscribeStopEvent() 42 defer stopSubscription.Unsubscribe() 43 for { 44 select { 45 case evtAccessModified := <-chAccessModified: 46 core.AcctInfoMap.UpsertAccount(evtAccessModified.OrgId, evtAccessModified.RoleId, evtAccessModified.Account, evtAccessModified.OrgAdmin, core.AcctStatus(int(evtAccessModified.Status.Uint64()))) 47 48 case evtAccessRevoked := <-chAccessRevoked: 49 core.AcctInfoMap.UpsertAccount(evtAccessRevoked.OrgId, evtAccessRevoked.RoleId, evtAccessRevoked.Account, evtAccessRevoked.OrgAdmin, core.AcctActive) 50 51 case evtStatusChanged := <-chStatusChanged: 52 if ac, err := core.AcctInfoMap.GetAccount(evtStatusChanged.Account); ac != nil { 53 core.AcctInfoMap.UpsertAccount(evtStatusChanged.OrgId, ac.RoleId, evtStatusChanged.Account, ac.IsOrgAdmin, core.AcctStatus(int(evtStatusChanged.Status.Uint64()))) 54 } else { 55 log.Info("error fetching account information", "err", err) 56 } 57 case <-stopChan: 58 log.Info("quit account contract watch") 59 return 60 } 61 } 62 }() 63 return nil 64 } 65 66 func (b *Backend) ManageRolePermissions() error { 67 chRoleCreated := make(chan *eb.RoleManagerRoleCreated, 1) 68 chRoleRevoked := make(chan *eb.RoleManagerRoleRevoked, 1) 69 70 opts := &bind.WatchOpts{} 71 var blockNumber uint64 = 1 72 opts.Start = &blockNumber 73 74 if _, err := b.Contr.PermRole.RoleManagerFilterer.WatchRoleCreated(opts, chRoleCreated); err != nil { 75 return fmt.Errorf("failed WatchRoleCreated: %v", err) 76 } 77 78 if _, err := b.Contr.PermRole.RoleManagerFilterer.WatchRoleRevoked(opts, chRoleRevoked); err != nil { 79 return fmt.Errorf("failed WatchRoleRevoked: %v", err) 80 } 81 82 go func() { 83 stopChan, stopSubscription := ptype.SubscribeStopEvent() 84 defer stopSubscription.Unsubscribe() 85 for { 86 select { 87 case evtRoleCreated := <-chRoleCreated: 88 core.RoleInfoMap.UpsertRole(evtRoleCreated.OrgId, evtRoleCreated.RoleId, evtRoleCreated.IsVoter, evtRoleCreated.IsAdmin, core.AccessType(int(evtRoleCreated.BaseAccess.Uint64())), true) 89 90 case evtRoleRevoked := <-chRoleRevoked: 91 if r, _ := core.RoleInfoMap.GetRole(evtRoleRevoked.OrgId, evtRoleRevoked.RoleId); r != nil { 92 core.RoleInfoMap.UpsertRole(evtRoleRevoked.OrgId, evtRoleRevoked.RoleId, r.IsVoter, r.IsAdmin, r.Access, false) 93 } else { 94 log.Error("Revoke role - cache is missing role", "org", evtRoleRevoked.OrgId, "role", evtRoleRevoked.RoleId) 95 } 96 case <-stopChan: 97 log.Info("quit role contract watch") 98 return 99 } 100 } 101 }() 102 return nil 103 } 104 105 func (b *Backend) ManageOrgPermissions() error { 106 chPendingApproval := make(chan *eb.OrgManagerOrgPendingApproval, 1) 107 chOrgApproved := make(chan *eb.OrgManagerOrgApproved, 1) 108 chOrgSuspended := make(chan *eb.OrgManagerOrgSuspended, 1) 109 chOrgReactivated := make(chan *eb.OrgManagerOrgSuspensionRevoked, 1) 110 111 opts := &bind.WatchOpts{} 112 var blockNumber uint64 = 1 113 opts.Start = &blockNumber 114 115 if _, err := b.Contr.PermOrg.OrgManagerFilterer.WatchOrgPendingApproval(opts, chPendingApproval); err != nil { 116 return fmt.Errorf("failed WatchOrgPendingApproval: %v", err) 117 } 118 119 if _, err := b.Contr.PermOrg.OrgManagerFilterer.WatchOrgApproved(opts, chOrgApproved); err != nil { 120 return fmt.Errorf("failed WatchOrgApproved: %v", err) 121 } 122 123 if _, err := b.Contr.PermOrg.OrgManagerFilterer.WatchOrgSuspended(opts, chOrgSuspended); err != nil { 124 return fmt.Errorf("failed WatchOrgSuspended: %v", err) 125 } 126 127 if _, err := b.Contr.PermOrg.OrgManagerFilterer.WatchOrgSuspensionRevoked(opts, chOrgReactivated); err != nil { 128 return fmt.Errorf("failed WatchOrgSuspensionRevoked: %v", err) 129 } 130 131 go func() { 132 stopChan, stopSubscription := ptype.SubscribeStopEvent() 133 defer stopSubscription.Unsubscribe() 134 for { 135 select { 136 case evtPendingApproval := <-chPendingApproval: 137 core.OrgInfoMap.UpsertOrg(evtPendingApproval.OrgId, evtPendingApproval.PorgId, evtPendingApproval.UltParent, evtPendingApproval.Level, core.OrgStatus(evtPendingApproval.Status.Uint64())) 138 139 case evtOrgApproved := <-chOrgApproved: 140 core.OrgInfoMap.UpsertOrg(evtOrgApproved.OrgId, evtOrgApproved.PorgId, evtOrgApproved.UltParent, evtOrgApproved.Level, core.OrgApproved) 141 142 case evtOrgSuspended := <-chOrgSuspended: 143 core.OrgInfoMap.UpsertOrg(evtOrgSuspended.OrgId, evtOrgSuspended.PorgId, evtOrgSuspended.UltParent, evtOrgSuspended.Level, core.OrgSuspended) 144 145 case evtOrgReactivated := <-chOrgReactivated: 146 core.OrgInfoMap.UpsertOrg(evtOrgReactivated.OrgId, evtOrgReactivated.PorgId, evtOrgReactivated.UltParent, evtOrgReactivated.Level, core.OrgApproved) 147 case <-stopChan: 148 log.Info("quit org contract watch") 149 return 150 } 151 } 152 }() 153 return nil 154 } 155 156 func (b *Backend) ManageNodePermissions() error { 157 chNodeApproved := make(chan *eb.NodeManagerNodeApproved, 1) 158 chNodeProposed := make(chan *eb.NodeManagerNodeProposed, 1) 159 chNodeDeactivated := make(chan *eb.NodeManagerNodeDeactivated, 1) 160 chNodeActivated := make(chan *eb.NodeManagerNodeActivated, 1) 161 chNodeBlacklisted := make(chan *eb.NodeManagerNodeBlacklisted) 162 chNodeRecoveryInit := make(chan *eb.NodeManagerNodeRecoveryInitiated, 1) 163 chNodeRecoveryDone := make(chan *eb.NodeManagerNodeRecoveryCompleted, 1) 164 165 opts := &bind.WatchOpts{} 166 var blockNumber uint64 = 1 167 opts.Start = &blockNumber 168 169 if _, err := b.Contr.PermNode.NodeManagerFilterer.WatchNodeApproved(opts, chNodeApproved); err != nil { 170 return fmt.Errorf("failed WatchNodeApproved: %v", err) 171 } 172 173 if _, err := b.Contr.PermNode.NodeManagerFilterer.WatchNodeProposed(opts, chNodeProposed); err != nil { 174 return fmt.Errorf("failed WatchNodeProposed: %v", err) 175 } 176 177 if _, err := b.Contr.PermNode.NodeManagerFilterer.WatchNodeDeactivated(opts, chNodeDeactivated); err != nil { 178 return fmt.Errorf("failed NodeDeactivated: %v", err) 179 } 180 if _, err := b.Contr.PermNode.NodeManagerFilterer.WatchNodeActivated(opts, chNodeActivated); err != nil { 181 return fmt.Errorf("failed WatchNodeActivated: %v", err) 182 } 183 184 if _, err := b.Contr.PermNode.NodeManagerFilterer.WatchNodeBlacklisted(opts, chNodeBlacklisted); err != nil { 185 return fmt.Errorf("failed NodeBlacklisting: %v", err) 186 } 187 188 if _, err := b.Contr.PermNode.NodeManagerFilterer.WatchNodeRecoveryInitiated(opts, chNodeRecoveryInit); err != nil { 189 return fmt.Errorf("failed NodeRecoveryInitiated: %v", err) 190 } 191 192 if _, err := b.Contr.PermNode.NodeManagerFilterer.WatchNodeRecoveryCompleted(opts, chNodeRecoveryDone); err != nil { 193 return fmt.Errorf("failed NodeRecoveryCompleted: %v", err) 194 } 195 196 go func() { 197 stopChan, stopSubscription := ptype.SubscribeStopEvent() 198 defer stopSubscription.Unsubscribe() 199 for { 200 select { 201 case evtNodeApproved := <-chNodeApproved: 202 enodeId := core.GetNodeUrl(evtNodeApproved.EnodeId, evtNodeApproved.Ip[:], evtNodeApproved.Port, evtNodeApproved.Raftport, b.Ib.IsRaft()) 203 err := ptype.UpdatePermissionedNodes(b.Ib.Node(), b.Ib.DataDir(), enodeId, ptype.NodeAdd, b.Ib.IsRaft()) 204 if err != nil { 205 log.Error("error updating permissioned-nodes.json", "err", err) 206 } 207 core.NodeInfoMap.UpsertNode(evtNodeApproved.OrgId, enodeId, core.NodeApproved) 208 209 case evtNodeProposed := <-chNodeProposed: 210 enodeId := core.GetNodeUrl(evtNodeProposed.EnodeId, evtNodeProposed.Ip[:], evtNodeProposed.Port, evtNodeProposed.Raftport, b.Ib.IsRaft()) 211 core.NodeInfoMap.UpsertNode(evtNodeProposed.OrgId, enodeId, core.NodePendingApproval) 212 213 case evtNodeDeactivated := <-chNodeDeactivated: 214 enodeId := core.GetNodeUrl(evtNodeDeactivated.EnodeId, evtNodeDeactivated.Ip[:], evtNodeDeactivated.Port, evtNodeDeactivated.Raftport, b.Ib.IsRaft()) 215 err := ptype.UpdatePermissionedNodes(b.Ib.Node(), b.Ib.DataDir(), enodeId, ptype.NodeDelete, b.Ib.IsRaft()) 216 if err != nil { 217 log.Error("error updating permissioned-nodes.json", "err", err) 218 } 219 core.NodeInfoMap.UpsertNode(evtNodeDeactivated.OrgId, enodeId, core.NodeDeactivated) 220 221 case evtNodeActivated := <-chNodeActivated: 222 enodeId := core.GetNodeUrl(evtNodeActivated.EnodeId, evtNodeActivated.Ip[:], evtNodeActivated.Port, evtNodeActivated.Raftport, b.Ib.IsRaft()) 223 err := ptype.UpdatePermissionedNodes(b.Ib.Node(), b.Ib.DataDir(), enodeId, ptype.NodeAdd, b.Ib.IsRaft()) 224 if err != nil { 225 log.Error("error updating permissioned-nodes.json", "err", err) 226 } 227 core.NodeInfoMap.UpsertNode(evtNodeActivated.OrgId, enodeId, core.NodeApproved) 228 229 case evtNodeBlacklisted := <-chNodeBlacklisted: 230 enodeId := core.GetNodeUrl(evtNodeBlacklisted.EnodeId, evtNodeBlacklisted.Ip[:], evtNodeBlacklisted.Port, evtNodeBlacklisted.Raftport, b.Ib.IsRaft()) 231 core.NodeInfoMap.UpsertNode(evtNodeBlacklisted.OrgId, enodeId, core.NodeBlackListed) 232 err := ptype.UpdateDisallowedNodes(b.Ib.DataDir(), enodeId, ptype.NodeAdd) 233 log.Error("error updating disallowed-nodes.json", "err", err) 234 err = ptype.UpdatePermissionedNodes(b.Ib.Node(), b.Ib.DataDir(), enodeId, ptype.NodeDelete, b.Ib.IsRaft()) 235 if err != nil { 236 log.Error("error updating permissioned-nodes.json", "err", err) 237 } 238 239 case evtNodeRecoveryInit := <-chNodeRecoveryInit: 240 enodeId := core.GetNodeUrl(evtNodeRecoveryInit.EnodeId, evtNodeRecoveryInit.Ip[:], evtNodeRecoveryInit.Port, evtNodeRecoveryInit.Raftport, b.Ib.IsRaft()) 241 core.NodeInfoMap.UpsertNode(evtNodeRecoveryInit.OrgId, enodeId, core.NodeRecoveryInitiated) 242 243 case evtNodeRecoveryDone := <-chNodeRecoveryDone: 244 enodeId := core.GetNodeUrl(evtNodeRecoveryDone.EnodeId, evtNodeRecoveryDone.Ip[:], evtNodeRecoveryDone.Port, evtNodeRecoveryDone.Raftport, b.Ib.IsRaft()) 245 core.NodeInfoMap.UpsertNode(evtNodeRecoveryDone.OrgId, enodeId, core.NodeApproved) 246 err := ptype.UpdateDisallowedNodes(b.Ib.DataDir(), enodeId, ptype.NodeDelete) 247 log.Error("error updating disallowed-nodes.json", "err", err) 248 err = ptype.UpdatePermissionedNodes(b.Ib.Node(), b.Ib.DataDir(), enodeId, ptype.NodeAdd, b.Ib.IsRaft()) 249 if err != nil { 250 log.Error("error updating permissioned-nodes.json", "err", err) 251 } 252 253 case <-stopChan: 254 log.Info("quit Node contract watch") 255 return 256 } 257 } 258 }() 259 return nil 260 } 261 func (b *Backend) MonitorNetworkBootUp() error { 262 return nil 263 } 264 265 func getBackend(contractBackend ptype.ContractBackend) (*PermissionModelV2, error) { 266 backend := PermissionModelV2{ContractBackend: contractBackend} 267 ps, err := getInterfaceContractSession(backend.PermInterf, contractBackend.PermConfig.InterfAddress, contractBackend.EthClnt) 268 if err != nil { 269 return nil, err 270 } 271 backend.PermInterfSession = ps 272 return &backend, nil 273 } 274 275 func getBackendWithTransactOpts(contractBackend ptype.ContractBackend, transactOpts *bind.TransactOpts) (*PermissionModelV2, error) { 276 backend, err := getBackend(contractBackend) 277 if err != nil { 278 return nil, err 279 } 280 backend.PermInterfSession.TransactOpts = *transactOpts 281 return backend, nil 282 } 283 284 func getInterfaceContractSession(permInterfaceInstance *eb.PermInterface, contractAddress common.Address, backend bind.ContractBackend) (*eb.PermInterfaceSession, error) { 285 if err := ptype.BindContract(&permInterfaceInstance, func() (interface{}, error) { return eb.NewPermInterface(contractAddress, backend) }); err != nil { 286 return nil, err 287 } 288 ps := &eb.PermInterfaceSession{ 289 Contract: permInterfaceInstance, 290 CallOpts: bind.CallOpts{ 291 Pending: true, 292 }, 293 } 294 return ps, nil 295 } 296 297 func (b *Backend) GetRoleService(transactOpts *bind.TransactOpts, roleBackend ptype.ContractBackend) (ptype.RoleService, error) { 298 299 backEnd, err := getBackendWithTransactOpts(roleBackend, transactOpts) 300 if err != nil { 301 return nil, err 302 } 303 return &Role{Backend: backEnd}, nil 304 305 } 306 307 func (b *Backend) GetOrgService(transactOpts *bind.TransactOpts, orgBackend ptype.ContractBackend) (ptype.OrgService, error) { 308 backEnd, err := getBackendWithTransactOpts(orgBackend, transactOpts) 309 if err != nil { 310 return nil, err 311 } 312 return &Org{Backend: backEnd}, nil 313 } 314 315 func (b *Backend) GetNodeService(transactOpts *bind.TransactOpts, nodeBackend ptype.ContractBackend) (ptype.NodeService, error) { 316 backEnd, err := getBackendWithTransactOpts(nodeBackend, transactOpts) 317 if err != nil { 318 return nil, err 319 } 320 return &Node{Backend: backEnd}, nil 321 } 322 323 func (b *Backend) GetAccountService(transactOpts *bind.TransactOpts, accountBackend ptype.ContractBackend) (ptype.AccountService, error) { 324 backEnd, err := getBackendWithTransactOpts(accountBackend, transactOpts) 325 if err != nil { 326 return nil, err 327 } 328 return &Account{Backend: backEnd}, nil 329 330 } 331 332 func (b *Backend) GetAuditService(auditBackend ptype.ContractBackend) (ptype.AuditService, error) { 333 backEnd, err := getBackend(auditBackend) 334 if err != nil { 335 return nil, err 336 } 337 return &Audit{Backend: backEnd}, nil 338 339 } 340 341 func (b *Backend) GetControlService(controlBackend ptype.ContractBackend) (ptype.ControlService, error) { 342 backEnd, err := getBackend(controlBackend) 343 if err != nil { 344 return nil, err 345 } 346 return &Control{Backend: backEnd}, nil 347 348 }