diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index ed4c1390f2..61f1a36bff 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -514,7 +514,7 @@ 4C8A6DFC22E5499300469AE7 /* MediaZoomAnimationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C8A6DFB22E5499300469AE7 /* MediaZoomAnimationController.swift */; }; 4C8A6DFE22E54AFA00469AE7 /* MediaInteractiveDismiss.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C8A6DFD22E54AFA00469AE7 /* MediaInteractiveDismiss.swift */; }; 4C948FF72146EB4800349F0D /* BlockListCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C948FF62146EB4800349F0D /* BlockListCache.swift */; }; - 4C9B4F23225025F100DD5B9A /* OWS115GRDBMigration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C9B4F22225025F100DD5B9A /* OWS115GRDBMigration.swift */; }; + 4C9B4F23225025F100DD5B9A /* OWS1XXGRDBMigration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C9B4F22225025F100DD5B9A /* OWS1XXGRDBMigration.swift */; }; 4C9CA25D217E676900607C63 /* ZXingObjC.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C9CA25C217E676900607C63 /* ZXingObjC.framework */; }; 4CA46F4C219CCC630038ABDE /* CaptionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA46F4B219CCC630038ABDE /* CaptionView.swift */; }; 4CA46F4D219CFDAA0038ABDE /* GalleryRailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA46F49219C78050038ABDE /* GalleryRailView.swift */; }; @@ -523,6 +523,7 @@ 4CB5F26920F7D060004D1B42 /* MessageActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB5F26820F7D060004D1B42 /* MessageActions.swift */; }; 4CB93DC22180FF07004B9764 /* ProximityMonitoringManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB93DC12180FF07004B9764 /* ProximityMonitoringManager.swift */; }; 4CBBCA6321714B4500EEB37D /* OWS110SortIdMigration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CBBCA6221714B4500EEB37D /* OWS110SortIdMigration.swift */; }; + 4CBF6F7B230B03C000549FFC /* OWS115CleanupProfileAvatars.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CBF6F7A230B03C000549FFC /* OWS115CleanupProfileAvatars.swift */; }; 4CC0B59C20EC5F2E00CF6EE0 /* ConversationConfigurationSyncOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CC0B59B20EC5F2E00CF6EE0 /* ConversationConfigurationSyncOperation.swift */; }; 4CC1ECF9211A47CE00CC13BE /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4CC1ECF8211A47CD00CC13BE /* StoreKit.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; 4CC1ECFB211A553000CC13BE /* AppUpdateNag.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CC1ECFA211A553000CC13BE /* AppUpdateNag.swift */; }; @@ -1303,7 +1304,7 @@ 4C8A6DFB22E5499300469AE7 /* MediaZoomAnimationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaZoomAnimationController.swift; sourceTree = ""; }; 4C8A6DFD22E54AFA00469AE7 /* MediaInteractiveDismiss.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaInteractiveDismiss.swift; sourceTree = ""; }; 4C948FF62146EB4800349F0D /* BlockListCache.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockListCache.swift; sourceTree = ""; }; - 4C9B4F22225025F100DD5B9A /* OWS115GRDBMigration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OWS115GRDBMigration.swift; sourceTree = ""; }; + 4C9B4F22225025F100DD5B9A /* OWS1XXGRDBMigration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OWS1XXGRDBMigration.swift; sourceTree = ""; }; 4C9CA25C217E676900607C63 /* ZXingObjC.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ZXingObjC.framework; path = ThirdParty/Carthage/Build/iOS/ZXingObjC.framework; sourceTree = ""; }; 4CA46F49219C78050038ABDE /* GalleryRailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GalleryRailView.swift; sourceTree = ""; }; 4CA46F4B219CCC630038ABDE /* CaptionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaptionView.swift; sourceTree = ""; }; @@ -1312,6 +1313,7 @@ 4CB5F26820F7D060004D1B42 /* MessageActions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageActions.swift; sourceTree = ""; }; 4CB93DC12180FF07004B9764 /* ProximityMonitoringManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProximityMonitoringManager.swift; sourceTree = ""; }; 4CBBCA6221714B4500EEB37D /* OWS110SortIdMigration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OWS110SortIdMigration.swift; sourceTree = ""; }; + 4CBF6F7A230B03C000549FFC /* OWS115CleanupProfileAvatars.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OWS115CleanupProfileAvatars.swift; sourceTree = ""; }; 4CC0B59B20EC5F2E00CF6EE0 /* ConversationConfigurationSyncOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConversationConfigurationSyncOperation.swift; sourceTree = ""; }; 4CC1ECF8211A47CD00CC13BE /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; }; 4CC1ECFA211A553000CC13BE /* AppUpdateNag.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppUpdateNag.swift; sourceTree = ""; }; @@ -1855,7 +1857,8 @@ 34B6A908218B8824007C4606 /* OWS112TypingIndicatorsMigration.swift */, 4C7537882193779700DF5E37 /* OWS113MultiAttachmentMediaMessages.swift */, 34BEDB0A21C2FA3D007B0EAE /* OWS114RemoveDynamicInteractions.swift */, - 4C9B4F22225025F100DD5B9A /* OWS115GRDBMigration.swift */, + 4CBF6F7A230B03C000549FFC /* OWS115CleanupProfileAvatars.swift */, + 4C9B4F22225025F100DD5B9A /* OWS1XXGRDBMigration.swift */, 346129931FD1E30000532771 /* OWSDatabaseMigration.h */, 346129941FD1E30000532771 /* OWSDatabaseMigration.m */, 346129E51FD5C0C600532771 /* OWSDatabaseMigrationRunner.h */, @@ -3636,7 +3639,7 @@ 34AC0A1F211B39EA00997B47 /* AvatarImageView.swift in Sources */, 3466087220E550F400AFFE73 /* ConversationStyle.swift in Sources */, 3478506B1FD9B78A007B8332 /* NoopCallMessageHandler.swift in Sources */, - 4C9B4F23225025F100DD5B9A /* OWS115GRDBMigration.swift in Sources */, + 4C9B4F23225025F100DD5B9A /* OWS1XXGRDBMigration.swift in Sources */, 340872CA2239563500CB25B0 /* AttachmentApprovalViewController.swift in Sources */, 346129AD1FD1F34E00532771 /* ImageCache.swift in Sources */, 34D5872F208E2C4200D2255A /* OWS109OutgoingMessageState.m in Sources */, @@ -3663,6 +3666,7 @@ 454A965A1FD6017E008D2A0E /* SignalAttachment.swift in Sources */, 45BC829D1FD9C4B400011CF3 /* ShareViewDelegate.swift in Sources */, 3461295B1FD1D74C00532771 /* Environment.m in Sources */, + 4CBF6F7B230B03C000549FFC /* OWS115CleanupProfileAvatars.swift in Sources */, 346129D51FD20ADC00532771 /* UIViewController+OWS.m in Sources */, 34BBC851220B8EEF00857249 /* ImageEditorCanvasView.swift in Sources */, 347850691FD9B78A007B8332 /* AppSetup.m in Sources */, diff --git a/SignalMessaging/environment/migrations/OWS115CleanupProfileAvatars.swift b/SignalMessaging/environment/migrations/OWS115CleanupProfileAvatars.swift new file mode 100644 index 0000000000..1f83f1325c --- /dev/null +++ b/SignalMessaging/environment/migrations/OWS115CleanupProfileAvatars.swift @@ -0,0 +1,50 @@ +// +// Copyright (c) 2019 Open Whisper Systems. All rights reserved. +// + +import Foundation +import SignalServiceKit + +@objc +public class OWS115EnsureProfileAvatars: YDBDatabaseMigration { + + // MARK: - Dependencies + + // MARK: - + + // Increment a similar constant for each migration. + @objc + public override class var migrationId: String { + return "115" + } + + var fileManager: FileManager { + return FileManager.default + } + + override public func runUp(with transaction: YapDatabaseReadWriteTransaction) { + Bench(title: "\(self.logTag)") { + var profilesWithMissingAvatars: [String] = [] + OWSUserProfile.anyEnumerate(transaction: transaction.asAnyWrite) { profile, _ in + guard let filename = profile.avatarFileName else { + return + } + + let filepath = OWSUserProfile.profileAvatarFilepath(withFilename: filename) + guard !self.fileManager.fileExists(atPath: filepath) else { + return + } + profilesWithMissingAvatars.append(profile.uniqueId) + } + + for uniqueId in profilesWithMissingAvatars { + guard let profile = OWSUserProfile.anyFetch(uniqueId: uniqueId, transaction: transaction.asAnyRead) else { + owsFailDebug("profile was unexpectedly nil") + continue + } + Logger.info("removing reference to non-existant avatar file") + profile.update(withAvatarFileName: nil, transaction: transaction.asAnyWrite, completion: {}) + } + } + } +} diff --git a/SignalMessaging/environment/migrations/OWS115GRDBMigration.swift b/SignalMessaging/environment/migrations/OWS1XXGRDBMigration.swift similarity index 92% rename from SignalMessaging/environment/migrations/OWS115GRDBMigration.swift rename to SignalMessaging/environment/migrations/OWS1XXGRDBMigration.swift index d1875c9f1b..2f88d10f0f 100644 --- a/SignalMessaging/environment/migrations/OWS115GRDBMigration.swift +++ b/SignalMessaging/environment/migrations/OWS1XXGRDBMigration.swift @@ -7,12 +7,12 @@ import GRDBCipher import SignalServiceKit @objc -public class OWS115GRDBMigration: YDBDatabaseMigration { +public class OWS1XXGRDBMigration: YDBDatabaseMigration { // Increment a similar constant for each migration. @objc public override class var migrationId: String { - return "115" + return "1XX" } override public func runUp(completion: @escaping OWSDatabaseMigrationCompletion) { diff --git a/SignalMessaging/environment/migrations/OWSDatabaseMigrationRunner.m b/SignalMessaging/environment/migrations/OWSDatabaseMigrationRunner.m index 42b00f2b66..c1356a0a26 100644 --- a/SignalMessaging/environment/migrations/OWSDatabaseMigrationRunner.m +++ b/SignalMessaging/environment/migrations/OWSDatabaseMigrationRunner.m @@ -47,11 +47,12 @@ NS_ASSUME_NONNULL_BEGIN [[OWS111UDAttributesMigration alloc] init], [[OWS112TypingIndicatorsMigration alloc] init], [[OWS113MultiAttachmentMediaMessages alloc] init], - [[OWS114RemoveDynamicInteractions alloc] init] + [[OWS114RemoveDynamicInteractions alloc] init], + [OWS115EnsureProfileAvatars new] ]; if (SSKFeatureFlags.useGRDB) { - return [prodMigrations arrayByAddingObjectsFromArray:@ [[OWS115GRDBMigration new]]]; + return [prodMigrations arrayByAddingObjectsFromArray:@ [[OWS1XXGRDBMigration new]]]; } else { return prodMigrations; }