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  }