@@ -36,13 +36,26 @@ internal object CredentialStoreCognitoActions : CredentialStoreActions {
3636 legacyCredentialStore.deleteCredential()
3737 }
3838
39- // migrate device data
40- val lastAuthUserId = legacyCredentialStore.retrieveLastAuthUserId()
41- lastAuthUserId?.let {
42- val deviceMetaData = legacyCredentialStore.retrieveDeviceMetadata(lastAuthUserId)
39+ /*
40+ Migrate Device Metadata
41+ 1. We first need to get the list of userIds that contain device metadata on the device.
42+ 2. For each userId, we check to see if the current credential store has device metadata for that user.
43+ 3. If the current user does not have device metadata in the current store, migrate from legacy.
44+ This is a possibility because of a bug where we were previously attempting to migrate using an aliased
45+ userId lookup. This situation would happen if a user migrated, signed out, then signed back in. Upon
46+ signing back in, they would be granted new device metadata. Since that new metadata is what is
47+ associated with the refresh token, we do not want to overwrite it.
48+ 4. If the current user has device metadata in the current credential store, do not migrate from legacy.
49+ 5. Upon migration completion, we delete the legacy device metadata.
50+ */
51+ legacyCredentialStore.retrieveDeviceMetadataUserIdList().forEach { userId ->
52+ val deviceMetaData = legacyCredentialStore.retrieveDeviceMetadata(userId)
4353 if (deviceMetaData != DeviceMetadata .Empty ) {
44- credentialStore.saveDeviceMetadata(lastAuthUserId, deviceMetaData)
45- legacyCredentialStore.deleteDeviceKeyCredential(lastAuthUserId)
54+ credentialStore.retrieveDeviceMetadata(userId)
55+ if (credentialStore.retrieveDeviceMetadata(userId) == DeviceMetadata .Empty ) {
56+ credentialStore.saveDeviceMetadata(userId, deviceMetaData)
57+ }
58+ legacyCredentialStore.deleteDeviceKeyCredential(userId)
4659 }
4760 }
4861
0 commit comments