github.com/status-im/status-go@v1.1.0/protocol/messenger_keycard.go (about)

     1  package protocol
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/status-im/status-go/eth-node/types"
     7  	"github.com/status-im/status-go/multiaccounts/accounts"
     8  	"github.com/status-im/status-go/protocol/protobuf"
     9  )
    10  
    11  func (m *Messenger) prepareSyncKeycardsMessage(keyUID string) (message []*protobuf.SyncKeycard, err error) {
    12  	keycards, err := m.settings.GetKeycardsWithSameKeyUID(keyUID)
    13  	if err != nil {
    14  		return
    15  	}
    16  
    17  	for _, kc := range keycards {
    18  		syncKeycard := kc.ToSyncKeycard()
    19  		message = append(message, syncKeycard)
    20  	}
    21  
    22  	return
    23  }
    24  
    25  func (m *Messenger) dispatchKeycardActivity(keyUID string, keycardUID string, newKeycardUID string, accountAddresses []types.Address,
    26  	callback func(uint64) error) error {
    27  	clock, _ := m.getLastClockWithRelatedChat()
    28  
    29  	finalKeyUID := keyUID
    30  	if finalKeyUID == "" {
    31  		dbKeycard, err := m.settings.GetKeycardByKeycardUID(keycardUID)
    32  		if err != nil {
    33  			return err
    34  		}
    35  		finalKeyUID = dbKeycard.KeyUID
    36  	}
    37  
    38  	if err := callback(clock); err != nil {
    39  		return err
    40  	}
    41  
    42  	return m.resolveAndSyncKeypairOrJustWalletAccount(finalKeyUID, types.Address{}, clock, m.dispatchMessage)
    43  }
    44  
    45  // This function stores keycard to db and notifies paired devices about that if keycard with `KeycardUID` is not already stored.
    46  // Keycard position is fully maintained by the backend.
    47  // If keycard is already stored, this function updates `KeycardName` and adds accounts which are not already added, in this case
    48  // `KeycardLocked` and `Position` remains as they were, they won't be changed.
    49  func (m *Messenger) SaveOrUpdateKeycard(ctx context.Context, keycard *accounts.Keycard) (err error) {
    50  	dbKeycard, err := m.settings.GetKeycardByKeycardUID(keycard.KeycardUID)
    51  	if err != nil && err != accounts.ErrNoKeycardForPassedKeycardUID {
    52  		return err
    53  	}
    54  
    55  	if dbKeycard == nil {
    56  		position, err := m.settings.GetPositionForNextNewKeycard()
    57  		if err != nil {
    58  			return err
    59  		}
    60  		keycard.Position = position
    61  		keycard.KeycardLocked = false
    62  	} else {
    63  		keycard.Position = dbKeycard.Position
    64  		keycard.KeycardLocked = dbKeycard.KeycardLocked
    65  	}
    66  
    67  	return m.dispatchKeycardActivity(keycard.KeyUID, "", "", []types.Address{}, func(clock uint64) error {
    68  		return m.settings.SaveOrUpdateKeycard(*keycard, clock, true)
    69  	})
    70  }
    71  
    72  func (m *Messenger) SetKeycardName(ctx context.Context, keycardUID string, kpName string) error {
    73  	return m.dispatchKeycardActivity("", keycardUID, "", []types.Address{}, func(clock uint64) error {
    74  		return m.settings.SetKeycardName(keycardUID, kpName, clock)
    75  	})
    76  }
    77  
    78  func (m *Messenger) KeycardLocked(ctx context.Context, keycardUID string) error {
    79  	return m.dispatchKeycardActivity("", keycardUID, "", []types.Address{}, func(clock uint64) error {
    80  		return m.settings.KeycardLocked(keycardUID, clock)
    81  	})
    82  }
    83  
    84  func (m *Messenger) KeycardUnlocked(ctx context.Context, keycardUID string) error {
    85  	return m.dispatchKeycardActivity("", keycardUID, "", []types.Address{}, func(clock uint64) error {
    86  		return m.settings.KeycardUnlocked(keycardUID, clock)
    87  	})
    88  }
    89  
    90  func (m *Messenger) DeleteKeycardAccounts(ctx context.Context, keycardUID string, accountAddresses []types.Address) error {
    91  	return m.dispatchKeycardActivity("", keycardUID, "", accountAddresses, func(clock uint64) error {
    92  		return m.settings.DeleteKeycardAccounts(keycardUID, accountAddresses, clock)
    93  	})
    94  }
    95  
    96  func (m *Messenger) DeleteKeycard(ctx context.Context, keycardUID string) error {
    97  	return m.dispatchKeycardActivity("", keycardUID, "", []types.Address{}, func(clock uint64) error {
    98  		return m.settings.DeleteKeycard(keycardUID, clock)
    99  	})
   100  }
   101  
   102  func (m *Messenger) DeleteAllKeycardsWithKeyUID(ctx context.Context, keyUID string) error {
   103  	return m.dispatchKeycardActivity(keyUID, "", "", []types.Address{}, func(clock uint64) error {
   104  		return m.settings.DeleteAllKeycardsWithKeyUID(keyUID, clock)
   105  	})
   106  }
   107  
   108  func (m *Messenger) UpdateKeycardUID(ctx context.Context, oldKeycardUID string, newKeycardUID string) error {
   109  	return m.dispatchKeycardActivity("", oldKeycardUID, newKeycardUID, []types.Address{}, func(clock uint64) error {
   110  		return m.settings.UpdateKeycardUID(oldKeycardUID, newKeycardUID, clock)
   111  	})
   112  }