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 }