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  }