github.com/kisexp/xdchain@v0.0.0-20211206025815-490d6b732aa7/permission/v1/backend.go (about) 1 package v1 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 pb "github.com/kisexp/xdchain/permission/v1/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 *pb.AcctManagerAccountAccessModified) 21 chAccessRevoked := make(chan *pb.AcctManagerAccountAccessRevoked) 22 chStatusChanged := make(chan *pb.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 Contr watch") 59 return 60 } 61 } 62 }() 63 return nil 64 } 65 66 func (b *Backend) ManageRolePermissions() error { 67 chRoleCreated := make(chan *pb.RoleManagerRoleCreated, 1) 68 chRoleRevoked := make(chan *pb.RoleManagerRoleRevoked, 1) 69 70 opts := &bind.WatchOpts{} 71 var blockNumber uint64 = 1 72 opts.Start = &blockNumber 73 contract := b.Contr 74 75 if _, err := contract.PermRole.RoleManagerFilterer.WatchRoleCreated(opts, chRoleCreated); err != nil { 76 return fmt.Errorf("failed WatchRoleCreated: %v", err) 77 } 78 79 if _, err := contract.PermRole.RoleManagerFilterer.WatchRoleRevoked(opts, chRoleRevoked); err != nil { 80 return fmt.Errorf("failed WatchRoleRevoked: %v", err) 81 } 82 83 go func() { 84 stopChan, stopSubscription := ptype.SubscribeStopEvent() 85 defer stopSubscription.Unsubscribe() 86 for { 87 select { 88 case evtRoleCreated := <-chRoleCreated: 89 core.RoleInfoMap.UpsertRole(evtRoleCreated.OrgId, evtRoleCreated.RoleId, evtRoleCreated.IsVoter, evtRoleCreated.IsAdmin, core.AccessType(int(evtRoleCreated.BaseAccess.Uint64())), true) 90 91 case evtRoleRevoked := <-chRoleRevoked: 92 if r, _ := core.RoleInfoMap.GetRole(evtRoleRevoked.OrgId, evtRoleRevoked.RoleId); r != nil { 93 core.RoleInfoMap.UpsertRole(evtRoleRevoked.OrgId, evtRoleRevoked.RoleId, r.IsVoter, r.IsAdmin, r.Access, false) 94 } else { 95 log.Error("Revoke role - cache is missing role", "org", evtRoleRevoked.OrgId, "role", evtRoleRevoked.RoleId) 96 } 97 case <-stopChan: 98 log.Info("quit role Contr watch") 99 return 100 } 101 } 102 }() 103 return nil 104 } 105 106 func (b *Backend) ManageOrgPermissions() error { 107 chPendingApproval := make(chan *pb.OrgManagerOrgPendingApproval, 1) 108 chOrgApproved := make(chan *pb.OrgManagerOrgApproved, 1) 109 chOrgSuspended := make(chan *pb.OrgManagerOrgSuspended, 1) 110 chOrgReactivated := make(chan *pb.OrgManagerOrgSuspensionRevoked, 1) 111 112 opts := &bind.WatchOpts{} 113 var blockNumber uint64 = 1 114 opts.Start = &blockNumber 115 contract := b.Contr 116 117 if _, err := contract.PermOrg.OrgManagerFilterer.WatchOrgPendingApproval(opts, chPendingApproval); err != nil { 118 return fmt.Errorf("failed WatchOrgPendingApproval: %v", err) 119 } 120 121 if _, err := contract.PermOrg.OrgManagerFilterer.WatchOrgApproved(opts, chOrgApproved); err != nil { 122 return fmt.Errorf("failed WatchOrgApproved: %v", err) 123 } 124 125 if _, err := contract.PermOrg.OrgManagerFilterer.WatchOrgSuspended(opts, chOrgSuspended); err != nil { 126 return fmt.Errorf("failed WatchOrgSuspended: %v", err) 127 } 128 129 if _, err := contract.PermOrg.OrgManagerFilterer.WatchOrgSuspensionRevoked(opts, chOrgReactivated); err != nil { 130 return fmt.Errorf("failed WatchOrgSuspensionRevoked: %v", err) 131 } 132 133 go func() { 134 stopChan, stopSubscription := ptype.SubscribeStopEvent() 135 defer stopSubscription.Unsubscribe() 136 for { 137 select { 138 case evtPendingApproval := <-chPendingApproval: 139 core.OrgInfoMap.UpsertOrg(evtPendingApproval.OrgId, evtPendingApproval.PorgId, evtPendingApproval.UltParent, evtPendingApproval.Level, core.OrgStatus(evtPendingApproval.Status.Uint64())) 140 141 case evtOrgApproved := <-chOrgApproved: 142 core.OrgInfoMap.UpsertOrg(evtOrgApproved.OrgId, evtOrgApproved.PorgId, evtOrgApproved.UltParent, evtOrgApproved.Level, core.OrgApproved) 143 144 case evtOrgSuspended := <-chOrgSuspended: 145 core.OrgInfoMap.UpsertOrg(evtOrgSuspended.OrgId, evtOrgSuspended.PorgId, evtOrgSuspended.UltParent, evtOrgSuspended.Level, core.OrgSuspended) 146 147 case evtOrgReactivated := <-chOrgReactivated: 148 core.OrgInfoMap.UpsertOrg(evtOrgReactivated.OrgId, evtOrgReactivated.PorgId, evtOrgReactivated.UltParent, evtOrgReactivated.Level, core.OrgApproved) 149 case <-stopChan: 150 log.Info("quit org Contr watch") 151 return 152 } 153 } 154 }() 155 return nil 156 } 157 158 func (b *Backend) ManageNodePermissions() error { 159 chNodeApproved := make(chan *pb.NodeManagerNodeApproved, 1) 160 chNodeProposed := make(chan *pb.NodeManagerNodeProposed, 1) 161 chNodeDeactivated := make(chan *pb.NodeManagerNodeDeactivated, 1) 162 chNodeActivated := make(chan *pb.NodeManagerNodeActivated, 1) 163 chNodeBlacklisted := make(chan *pb.NodeManagerNodeBlacklisted) 164 chNodeRecoveryInit := make(chan *pb.NodeManagerNodeRecoveryInitiated, 1) 165 chNodeRecoveryDone := make(chan *pb.NodeManagerNodeRecoveryCompleted, 1) 166 167 opts := &bind.WatchOpts{} 168 var blockNumber uint64 = 1 169 opts.Start = &blockNumber 170 contract := b.Contr 171 172 if _, err := contract.PermNode.NodeManagerFilterer.WatchNodeApproved(opts, chNodeApproved); err != nil { 173 return fmt.Errorf("failed WatchNodeApproved: %v", err) 174 } 175 176 if _, err := contract.PermNode.NodeManagerFilterer.WatchNodeProposed(opts, chNodeProposed); err != nil { 177 return fmt.Errorf("failed WatchNodeProposed: %v", err) 178 } 179 180 if _, err := contract.PermNode.NodeManagerFilterer.WatchNodeDeactivated(opts, chNodeDeactivated); err != nil { 181 return fmt.Errorf("failed NodeDeactivated: %v", err) 182 } 183 if _, err := contract.PermNode.NodeManagerFilterer.WatchNodeActivated(opts, chNodeActivated); err != nil { 184 return fmt.Errorf("failed WatchNodeActivated: %v", err) 185 } 186 187 if _, err := contract.PermNode.NodeManagerFilterer.WatchNodeBlacklisted(opts, chNodeBlacklisted); err != nil { 188 return fmt.Errorf("failed NodeBlacklisting: %v", err) 189 } 190 191 if _, err := contract.PermNode.NodeManagerFilterer.WatchNodeRecoveryInitiated(opts, chNodeRecoveryInit); err != nil { 192 return fmt.Errorf("failed NodeRecoveryInitiated: %v", err) 193 } 194 195 if _, err := contract.PermNode.NodeManagerFilterer.WatchNodeRecoveryCompleted(opts, chNodeRecoveryDone); err != nil { 196 return fmt.Errorf("failed NodeRecoveryCompleted: %v", err) 197 } 198 199 go func() { 200 stopChan, stopSubscription := ptype.SubscribeStopEvent() 201 defer stopSubscription.Unsubscribe() 202 for { 203 select { 204 case evtNodeApproved := <-chNodeApproved: 205 err := ptype.UpdatePermissionedNodes(b.Ib.Node(), b.Ib.DataDir(), evtNodeApproved.EnodeId, ptype.NodeAdd, b.Ib.IsRaft()) 206 if err != nil { 207 log.Error("error updating permissioned-nodes.json", "err", err) 208 } 209 core.NodeInfoMap.UpsertNode(evtNodeApproved.OrgId, evtNodeApproved.EnodeId, core.NodeApproved) 210 211 case evtNodeProposed := <-chNodeProposed: 212 core.NodeInfoMap.UpsertNode(evtNodeProposed.OrgId, evtNodeProposed.EnodeId, core.NodePendingApproval) 213 214 case evtNodeDeactivated := <-chNodeDeactivated: 215 err := ptype.UpdatePermissionedNodes(b.Ib.Node(), b.Ib.DataDir(), evtNodeDeactivated.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, evtNodeDeactivated.EnodeId, core.NodeDeactivated) 220 221 case evtNodeActivated := <-chNodeActivated: 222 err := ptype.UpdatePermissionedNodes(b.Ib.Node(), b.Ib.DataDir(), evtNodeActivated.EnodeId, ptype.NodeAdd, b.Ib.IsRaft()) 223 if err != nil { 224 log.Error("error updating permissioned-nodes.json", "err", err) 225 } 226 core.NodeInfoMap.UpsertNode(evtNodeActivated.OrgId, evtNodeActivated.EnodeId, core.NodeApproved) 227 228 case evtNodeBlacklisted := <-chNodeBlacklisted: 229 core.NodeInfoMap.UpsertNode(evtNodeBlacklisted.OrgId, evtNodeBlacklisted.EnodeId, core.NodeBlackListed) 230 err := ptype.UpdateDisallowedNodes(b.Ib.DataDir(), evtNodeBlacklisted.EnodeId, ptype.NodeAdd) 231 log.Error("error updating disallowed-nodes.json", "err", err) 232 err = ptype.UpdatePermissionedNodes(b.Ib.Node(), b.Ib.DataDir(), evtNodeBlacklisted.EnodeId, ptype.NodeDelete, b.Ib.IsRaft()) 233 if err != nil { 234 log.Error("error updating permissioned-nodes.json", "err", err) 235 } 236 237 case evtNodeRecoveryInit := <-chNodeRecoveryInit: 238 core.NodeInfoMap.UpsertNode(evtNodeRecoveryInit.OrgId, evtNodeRecoveryInit.EnodeId, core.NodeRecoveryInitiated) 239 240 case evtNodeRecoveryDone := <-chNodeRecoveryDone: 241 core.NodeInfoMap.UpsertNode(evtNodeRecoveryDone.OrgId, evtNodeRecoveryDone.EnodeId, core.NodeApproved) 242 err := ptype.UpdateDisallowedNodes(b.Ib.DataDir(), evtNodeRecoveryDone.EnodeId, ptype.NodeDelete) 243 log.Error("error updating disallowed-nodes.json", "err", err) 244 err = ptype.UpdatePermissionedNodes(b.Ib.Node(), b.Ib.DataDir(), evtNodeRecoveryDone.EnodeId, ptype.NodeAdd, b.Ib.IsRaft()) 245 if err != nil { 246 log.Error("error updating permissioned-nodes.json", "err", err) 247 } 248 249 case <-stopChan: 250 log.Info("quit Node Contr watch") 251 return 252 } 253 } 254 }() 255 return nil 256 } 257 258 func (b *Backend) MonitorNetworkBootUp() error { 259 netWorkBootCh := make(chan *pb.PermImplPermissionsInitialized, 1) 260 261 opts := &bind.WatchOpts{} 262 var blockNumber uint64 = 1 263 opts.Start = &blockNumber 264 265 if _, err := b.Contr.PermImpl.PermImplFilterer.WatchPermissionsInitialized(opts, netWorkBootCh); err != nil { 266 return fmt.Errorf("failed WatchPermissionsInitialized: %v", err) 267 } 268 269 go func() { 270 stopChan, stopSubscription := ptype.SubscribeStopEvent() 271 defer stopSubscription.Unsubscribe() 272 for { 273 select { 274 case evtMetworkBootUpCompleted := <-netWorkBootCh: 275 if evtMetworkBootUpCompleted.NetworkBootStatus { 276 core.SetNetworkBootUpCompleted() 277 } 278 return 279 case <-stopChan: 280 log.Info("quit implementation contract network boot watch") 281 return 282 } 283 } 284 }() 285 return nil 286 } 287 288 func getInterfaceContractSession(permInterfaceInstance *pb.PermInterface, contractAddress common.Address, backend bind.ContractBackend) (*pb.PermInterfaceSession, error) { 289 if err := ptype.BindContract(&permInterfaceInstance, func() (interface{}, error) { return pb.NewPermInterface(contractAddress, backend) }); err != nil { 290 return nil, err 291 } 292 ps := &pb.PermInterfaceSession{ 293 Contract: permInterfaceInstance, 294 CallOpts: bind.CallOpts{ 295 Pending: true, 296 }, 297 } 298 return ps, nil 299 } 300 301 func getBackend(contractBackend ptype.ContractBackend) (*PermissionModelV1, error) { 302 backend := PermissionModelV1{ContractBackend: contractBackend} 303 ps, err := getInterfaceContractSession(backend.PermInterf, contractBackend.PermConfig.InterfAddress, contractBackend.EthClnt) 304 if err != nil { 305 return nil, err 306 } 307 backend.PermInterfSession = ps 308 return &backend, nil 309 } 310 311 func getBackendWithTransactOpts(contractBackend ptype.ContractBackend, transactOpts *bind.TransactOpts) (*PermissionModelV1, error) { 312 backend, err := getBackend(contractBackend) 313 if err != nil { 314 return nil, err 315 } 316 backend.PermInterfSession.TransactOpts = *transactOpts 317 318 return backend, nil 319 } 320 321 func (b *Backend) GetRoleService(transactOpts *bind.TransactOpts, roleBackend ptype.ContractBackend) (ptype.RoleService, error) { 322 backEnd, err := getBackendWithTransactOpts(roleBackend, transactOpts) 323 if err != nil { 324 return nil, err 325 } 326 return &Role{Backend: backEnd}, nil 327 328 } 329 330 func (b *Backend) GetOrgService(transactOpts *bind.TransactOpts, orgBackend ptype.ContractBackend) (ptype.OrgService, error) { 331 backEnd, err := getBackendWithTransactOpts(orgBackend, transactOpts) 332 if err != nil { 333 return nil, err 334 } 335 return &Org{Backend: backEnd}, nil 336 337 } 338 339 func (b *Backend) GetNodeService(transactOpts *bind.TransactOpts, nodeBackend ptype.ContractBackend) (ptype.NodeService, error) { 340 backEnd, err := getBackendWithTransactOpts(nodeBackend, transactOpts) 341 if err != nil { 342 return nil, err 343 } 344 return &Node{Backend: backEnd}, nil 345 346 } 347 348 func (b *Backend) GetAccountService(transactOpts *bind.TransactOpts, accountBackend ptype.ContractBackend) (ptype.AccountService, error) { 349 backEnd, err := getBackendWithTransactOpts(accountBackend, transactOpts) 350 if err != nil { 351 return nil, err 352 } 353 return &Account{Backend: backEnd}, nil 354 355 } 356 357 func (b *Backend) GetAuditService(auditBackend ptype.ContractBackend) (ptype.AuditService, error) { 358 backEnd, err := getBackend(auditBackend) 359 if err != nil { 360 return nil, err 361 } 362 return &Audit{Backend: backEnd}, nil 363 364 } 365 366 func (b *Backend) GetControlService(controlBackend ptype.ContractBackend) (ptype.ControlService, error) { 367 return &Control{}, nil 368 }