From 2ba0f5d4e456ca453b956090f98adfbc421fff2f Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Thu, 17 Dec 2020 15:20:43 +1100 Subject: [PATCH 1/9] Remove unused files --- Session/Meta/Signal-Bridging-Header.h | 1 - .../Cells/AttachmentUploadView.m | 23 ---- .../Cells/MediaUploadView.swift | 15 --- Session/Signal/GiphyAPI.swift | 1 + .../Signal/OWSDeviceProvisioningURLParser.h | 17 --- .../Signal/OWSDeviceProvisioningURLParser.m | 45 ------- Signal.xcodeproj/project.pbxproj | 62 ---------- SignalUtilitiesKit/Meta/SignalUtilitiesKit.h | 4 - SignalUtilitiesKit/NSError+MessageSending.h | 17 --- SignalUtilitiesKit/NSError+MessageSending.m | 61 ---------- SignalUtilitiesKit/OWSChunkedOutputStream.h | 25 ---- SignalUtilitiesKit/OWSChunkedOutputStream.m | 97 --------------- SignalUtilitiesKit/OWSContactsOutputStream.h | 27 ----- SignalUtilitiesKit/OWSContactsOutputStream.m | 80 ------------- SignalUtilitiesKit/OWSGroupsOutputStream.h | 18 --- SignalUtilitiesKit/OWSGroupsOutputStream.m | 61 ---------- SignalUtilitiesKit/OWSHTTPSecurityPolicy.h | 17 --- SignalUtilitiesKit/OWSHTTPSecurityPolicy.m | 106 ----------------- SignalUtilitiesKit/OWSOperation.m | 17 --- SignalUtilitiesKit/OWSUploadOperation.h | 27 ----- SignalUtilitiesKit/OWSUploadOperation.m | 110 ------------------ .../SSKMessageSenderJobRecord.h | 29 ----- .../SSKMessageSenderJobRecord.m | 51 -------- .../UI/SharingThreadPickerViewController.m | 35 ------ 24 files changed, 1 insertion(+), 945 deletions(-) delete mode 100644 Session/Signal/OWSDeviceProvisioningURLParser.h delete mode 100644 Session/Signal/OWSDeviceProvisioningURLParser.m delete mode 100644 SignalUtilitiesKit/NSError+MessageSending.h delete mode 100644 SignalUtilitiesKit/NSError+MessageSending.m delete mode 100644 SignalUtilitiesKit/OWSChunkedOutputStream.h delete mode 100644 SignalUtilitiesKit/OWSChunkedOutputStream.m delete mode 100644 SignalUtilitiesKit/OWSContactsOutputStream.h delete mode 100644 SignalUtilitiesKit/OWSContactsOutputStream.m delete mode 100644 SignalUtilitiesKit/OWSGroupsOutputStream.h delete mode 100644 SignalUtilitiesKit/OWSGroupsOutputStream.m delete mode 100644 SignalUtilitiesKit/OWSHTTPSecurityPolicy.h delete mode 100644 SignalUtilitiesKit/OWSHTTPSecurityPolicy.m delete mode 100644 SignalUtilitiesKit/OWSUploadOperation.h delete mode 100644 SignalUtilitiesKit/OWSUploadOperation.m delete mode 100644 SignalUtilitiesKit/SSKMessageSenderJobRecord.h delete mode 100644 SignalUtilitiesKit/SSKMessageSenderJobRecord.m diff --git a/Session/Meta/Signal-Bridging-Header.h b/Session/Meta/Signal-Bridging-Header.h index 279565e34..1d91d3eaa 100644 --- a/Session/Meta/Signal-Bridging-Header.h +++ b/Session/Meta/Signal-Bridging-Header.h @@ -69,7 +69,6 @@ #import #import #import -#import #import #import #import diff --git a/Session/Signal/ConversationView/Cells/AttachmentUploadView.m b/Session/Signal/ConversationView/Cells/AttachmentUploadView.m index bb951f800..1be1ec462 100644 --- a/Session/Signal/ConversationView/Cells/AttachmentUploadView.m +++ b/Session/Signal/ConversationView/Cells/AttachmentUploadView.m @@ -8,7 +8,6 @@ #import #import #import -#import #import NS_ASSUME_NONNULL_BEGIN @@ -42,11 +41,6 @@ NS_ASSUME_NONNULL_BEGIN [self createContents]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(attachmentUploadProgress:) - name:kAttachmentUploadProgressNotification - object:nil]; - _isAttachmentReady = self.attachment.isUploaded; [self ensureViewState]; @@ -119,23 +113,6 @@ NS_ASSUME_NONNULL_BEGIN self.progressLabel.hidden = !isUploading; } -- (void)attachmentUploadProgress:(NSNotification *)notification -{ - NSDictionary *userinfo = [notification userInfo]; - double progress = [[userinfo objectForKey:kAttachmentUploadProgressKey] doubleValue]; - NSString *attachmentID = [userinfo objectForKey:kAttachmentUploadAttachmentIDKey]; - if ([self.attachment.uniqueId isEqual:attachmentID]) { - if (!isnan(progress)) { - [self.progressView setProgress:(CGFloat)progress]; - self.lastProgress = (CGFloat)progress; - self.isAttachmentReady = self.attachment.isUploaded; - } else { - OWSFailDebug(@"Invalid attachment progress."); - self.isAttachmentReady = YES; - } - } -} - @end NS_ASSUME_NONNULL_END diff --git a/Session/Signal/ConversationView/Cells/MediaUploadView.swift b/Session/Signal/ConversationView/Cells/MediaUploadView.swift index 1e13ae255..57064617a 100644 --- a/Session/Signal/ConversationView/Cells/MediaUploadView.swift +++ b/Session/Signal/ConversationView/Cells/MediaUploadView.swift @@ -26,21 +26,6 @@ public class MediaUploadView: UIView { layer.addSublayer(shapeLayer1) layer.addSublayer(shapeLayer2) - - NotificationCenter.default.addObserver(forName: NSNotification.Name.attachmentUploadProgress, object: nil, queue: nil) { [weak self] notification in - guard let strongSelf = self else { return } - guard let notificationAttachmentId = notification.userInfo?[kAttachmentUploadAttachmentIDKey] as? String else { - return - } - guard notificationAttachmentId == strongSelf.attachmentId else { - return - } - guard let progress = notification.userInfo?[kAttachmentUploadProgressKey] as? NSNumber else { - return - } - strongSelf.lastProgress = CGFloat(progress.floatValue) - strongSelf.updateLayers() - } } @available(*, unavailable, message: "use other init() instead.") diff --git a/Session/Signal/GiphyAPI.swift b/Session/Signal/GiphyAPI.swift index 4692ca98a..3b151462e 100644 --- a/Session/Signal/GiphyAPI.swift +++ b/Session/Signal/GiphyAPI.swift @@ -2,6 +2,7 @@ // Copyright (c) 2019 Open Whisper Systems. All rights reserved. // +import AFNetworking import Foundation import PromiseKit import CoreServices diff --git a/Session/Signal/OWSDeviceProvisioningURLParser.h b/Session/Signal/OWSDeviceProvisioningURLParser.h deleted file mode 100644 index 22758bbc8..000000000 --- a/Session/Signal/OWSDeviceProvisioningURLParser.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. -// - -NS_ASSUME_NONNULL_BEGIN - -@interface OWSDeviceProvisioningURLParser : NSObject - -@property (readonly, getter=isValid) BOOL valid; -@property (nonatomic, readonly, nullable) NSString *ephemeralDeviceId; -@property (nonatomic, readonly, nullable) NSData *publicKey; - -- (instancetype)initWithProvisioningURL:(NSString *)provisioningURL; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Session/Signal/OWSDeviceProvisioningURLParser.m b/Session/Signal/OWSDeviceProvisioningURLParser.m deleted file mode 100644 index 832e847d3..000000000 --- a/Session/Signal/OWSDeviceProvisioningURLParser.m +++ /dev/null @@ -1,45 +0,0 @@ -// -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. -// - -#import "OWSDeviceProvisioningURLParser.h" -#import -#import - -NS_ASSUME_NONNULL_BEGIN - -NSString *const OWSQueryItemNameEphemeralDeviceIdKey = @"uuid"; -NSString *const OWSQueryItemNameEncodedPublicKeyKey = @"pub_key"; - -@implementation OWSDeviceProvisioningURLParser - -- (instancetype)initWithProvisioningURL:(NSString *)provisioningURL -{ - self = [super init]; - if (!self) { - return self; - } - - NSURLComponents *components = [NSURLComponents componentsWithString:provisioningURL]; - for (NSURLQueryItem *queryItem in [components queryItems]) { - if ([queryItem.name isEqualToString:OWSQueryItemNameEphemeralDeviceIdKey]) { - _ephemeralDeviceId = queryItem.value; - } else if ([queryItem.name isEqualToString:OWSQueryItemNameEncodedPublicKeyKey]) { - NSString *encodedPublicKey = queryItem.value; - @try { - _publicKey = [[NSData dataFromBase64String:encodedPublicKey] throws_removeKeyType]; - } @catch (NSException *exception) { - OWSFailDebug(@"exception: %@", exception); - } - } else { - OWSLogWarn(@"Unkown query item in provisioning string: %@", queryItem.name); - } - } - - _valid = _ephemeralDeviceId && _publicKey; - return self; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index 258d07ee6..5171dfac9 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -125,7 +125,6 @@ 455A16DE1F1FEA0000F86704 /* MetalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 455A16DC1F1FEA0000F86704 /* MetalKit.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; 457F671B20746193000EABCD /* QuotedReplyPreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = 457F671A20746193000EABCD /* QuotedReplyPreview.swift */; }; 45847E871E4283C30080EAB3 /* Intents.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 45847E861E4283C30080EAB3 /* Intents.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 458E38371D668EBF0094BD24 /* OWSDeviceProvisioningURLParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 458E38361D668EBF0094BD24 /* OWSDeviceProvisioningURLParser.m */; }; 45A2F005204473A3002E978A /* NewMessage.aifc in Resources */ = {isa = PBXBuildFile; fileRef = 45A2F004204473A3002E978A /* NewMessage.aifc */; }; 45A663C51F92EC760027B59E /* GroupTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45A663C41F92EC760027B59E /* GroupTableViewCell.swift */; }; 45A6DAD61EBBF85500893231 /* ReminderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45A6DAD51EBBF85500893231 /* ReminderView.swift */; }; @@ -462,45 +461,34 @@ C33FDC2F255A581F00E217F9 /* OWSSyncManagerProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDA75255A57FB00E217F9 /* OWSSyncManagerProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDC39255A581F00E217F9 /* OWSRecordTranscriptJob.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA7F255A57FC00E217F9 /* OWSRecordTranscriptJob.m */; }; C33FDC45255A581F00E217F9 /* AppVersion.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA8B255A57FD00E217F9 /* AppVersion.m */; }; - C33FDC4F255A582000E217F9 /* OWSChunkedOutputStream.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDA95255A57FE00E217F9 /* OWSChunkedOutputStream.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDC50255A582000E217F9 /* OWSDispatch.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDA96255A57FE00E217F9 /* OWSDispatch.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDC52255A582000E217F9 /* RotateSignedKeyOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA98255A57FE00E217F9 /* RotateSignedKeyOperation.swift */; }; C33FDC53255A582000E217F9 /* OutageDetection.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA99255A57FE00E217F9 /* OutageDetection.swift */; }; - C33FDC57255A582000E217F9 /* OWSContactsOutputStream.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDA9D255A57FF00E217F9 /* OWSContactsOutputStream.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDC58255A582000E217F9 /* ReverseDispatchQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA9E255A57FF00E217F9 /* ReverseDispatchQueue.swift */; }; C33FDC61255A582000E217F9 /* OWSPrimaryStorage+SignedPreKeyStore.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAA7255A57FF00E217F9 /* OWSPrimaryStorage+SignedPreKeyStore.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDC64255A582000E217F9 /* NSObject+Casting.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAAA255A580000E217F9 /* NSObject+Casting.m */; }; C33FDC71255A582000E217F9 /* OWSFailedMessagesJob.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAB7255A580100E217F9 /* OWSFailedMessagesJob.m */; }; - C33FDC75255A582000E217F9 /* OWSGroupsOutputStream.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDABB255A580100E217F9 /* OWSGroupsOutputStream.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDC78255A582000E217F9 /* TSConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDABE255A580100E217F9 /* TSConstants.m */; }; C33FDC7B255A582000E217F9 /* NSSet+Functional.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAC1255A580100E217F9 /* NSSet+Functional.m */; }; C33FDC7D255A582000E217F9 /* OWSDispatch.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAC3255A580200E217F9 /* OWSDispatch.m */; }; C33FDC89255A582000E217F9 /* OWSAttachmentDownloads.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDACF255A580300E217F9 /* OWSAttachmentDownloads.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDC92255A582000E217F9 /* OWSGroupsOutputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAD8255A580300E217F9 /* OWSGroupsOutputStream.m */; }; C33FDC95255A582000E217F9 /* OWSFailedMessagesJob.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDADB255A580400E217F9 /* OWSFailedMessagesJob.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDC96255A582000E217F9 /* NSObject+Casting.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDADC255A580400E217F9 /* NSObject+Casting.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDC98255A582000E217F9 /* SwiftSingletons.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDADE255A580400E217F9 /* SwiftSingletons.swift */; }; C33FDC99255A582000E217F9 /* PublicChatManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDADF255A580400E217F9 /* PublicChatManager.swift */; }; C33FDC9A255A582000E217F9 /* ByteParser.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAE0255A580400E217F9 /* ByteParser.m */; }; C33FDCA2255A582000E217F9 /* OWSMessageUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAE8255A580500E217F9 /* OWSMessageUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDCA3255A582000E217F9 /* SSKMessageSenderJobRecord.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAE9255A580500E217F9 /* SSKMessageSenderJobRecord.m */; }; - C33FDCA7255A582000E217F9 /* SSKMessageSenderJobRecord.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAED255A580500E217F9 /* SSKMessageSenderJobRecord.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDCAD255A582000E217F9 /* OWSPrimaryStorage+SessionStore.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAF3255A580500E217F9 /* OWSPrimaryStorage+SessionStore.m */; }; C33FDCB1255A582000E217F9 /* OWSPrimaryStorage+SignedPreKeyStore.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDAF7255A580600E217F9 /* OWSPrimaryStorage+SignedPreKeyStore.m */; }; C33FDCBD255A582000E217F9 /* OWSPrimaryStorage+SessionStore.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB03255A580700E217F9 /* OWSPrimaryStorage+SessionStore.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDCC3255A582000E217F9 /* NSError+MessageSending.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB09255A580700E217F9 /* NSError+MessageSending.m */; }; C33FDCC7255A582000E217F9 /* NSArray+OWS.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB0D255A580800E217F9 /* NSArray+OWS.m */; }; - C33FDCC8255A582000E217F9 /* NSError+MessageSending.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB0E255A580800E217F9 /* NSError+MessageSending.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDCD1255A582000E217F9 /* FunctionalUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB17255A580800E217F9 /* FunctionalUtil.m */; }; C33FDCD3255A582000E217F9 /* GroupUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB19255A580900E217F9 /* GroupUtilities.swift */; }; C33FDCFA255A582000E217F9 /* SignalIOSProto.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB40255A580C00E217F9 /* SignalIOSProto.swift */; }; - C33FDCFE255A582000E217F9 /* OWSContactsOutputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB44255A580C00E217F9 /* OWSContactsOutputStream.m */; }; C33FDD01255A582000E217F9 /* OWSPrimaryStorage+PreKeyStore.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB47255A580C00E217F9 /* OWSPrimaryStorage+PreKeyStore.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDD03255A582000E217F9 /* WeakTimer.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB49255A580C00E217F9 /* WeakTimer.swift */; }; - C33FDD05255A582000E217F9 /* OWSChunkedOutputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB4B255A580C00E217F9 /* OWSChunkedOutputStream.m */; }; C33FDD06255A582000E217F9 /* AppVersion.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB4C255A580D00E217F9 /* AppVersion.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDD0A255A582000E217F9 /* OWSPrimaryStorage+PreKeyStore.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB50255A580D00E217F9 /* OWSPrimaryStorage+PreKeyStore.m */; }; - C33FDD0C255A582000E217F9 /* OWSHTTPSecurityPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB52255A580D00E217F9 /* OWSHTTPSecurityPolicy.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDD0D255A582000E217F9 /* PreKeyBundle+jsonDict.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDB53255A580D00E217F9 /* PreKeyBundle+jsonDict.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDD0F255A582000E217F9 /* TSInvalidIdentityKeySendingErrorMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB55255A580D00E217F9 /* TSInvalidIdentityKeySendingErrorMessage.m */; }; C33FDD12255A582000E217F9 /* OWSPrimaryStorage+Loki.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB58255A580E00E217F9 /* OWSPrimaryStorage+Loki.m */; }; @@ -525,11 +513,9 @@ C33FDD6E255A582000E217F9 /* NSURLSessionDataTask+StatusCode.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBB4255A581600E217F9 /* NSURLSessionDataTask+StatusCode.m */; }; C33FDD74255A582000E217F9 /* OWSPrimaryStorage+keyFromIntLong.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBBA255A581600E217F9 /* OWSPrimaryStorage+keyFromIntLong.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDD75255A582000E217F9 /* OWSPrimaryStorage+Loki.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBBB255A581600E217F9 /* OWSPrimaryStorage+Loki.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDD79255A582000E217F9 /* OWSHTTPSecurityPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBBF255A581700E217F9 /* OWSHTTPSecurityPolicy.m */; }; C33FDD7C255A582000E217F9 /* SSKAsserts.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBC2255A581700E217F9 /* SSKAsserts.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDD83255A582000E217F9 /* CreatePreKeysOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBC9255A581700E217F9 /* CreatePreKeysOperation.swift */; }; C33FDD8D255A582000E217F9 /* OWSSignalAddress.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBD3255A581800E217F9 /* OWSSignalAddress.swift */; }; - C33FDD90255A582000E217F9 /* OWSUploadOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBD6255A581900E217F9 /* OWSUploadOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDD91255A582000E217F9 /* OWSMessageUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBD7255A581900E217F9 /* OWSMessageUtils.m */; }; C33FDD92255A582000E217F9 /* SignalIOS.pb.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDBD8255A581900E217F9 /* SignalIOS.pb.swift */; }; C33FDDA9255A582000E217F9 /* TSStorageKeys.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDBEF255A581B00E217F9 /* TSStorageKeys.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -545,7 +531,6 @@ C33FDDCD255A582000E217F9 /* OWSAttachmentDownloads.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDC13255A581E00E217F9 /* OWSAttachmentDownloads.m */; }; C33FDDD0255A582000E217F9 /* FunctionalUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDC16255A581E00E217F9 /* FunctionalUtil.h */; settings = {ATTRIBUTES = (Public, ); }; }; C33FDDD3255A582000E217F9 /* OWSQueues.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDC19255A581F00E217F9 /* OWSQueues.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C33FDDD8255A582000E217F9 /* OWSUploadOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDC1E255A581F00E217F9 /* OWSUploadOperation.m */; }; C33FDDD9255A582000E217F9 /* LokiSessionRestorationImplementation.swift in Sources */ = {isa = PBXBuildFile; fileRef = C33FDC1F255A581F00E217F9 /* LokiSessionRestorationImplementation.swift */; }; C33FDEF8255A656D00E217F9 /* Promise+Delaying.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3C2A5D32553860900C340D1 /* Promise+Delaying.swift */; }; C3402FE52559036600EA6424 /* SessionUIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C331FF1B2558F9D300070591 /* SessionUIKit.framework */; }; @@ -1224,8 +1209,6 @@ 455A16DC1F1FEA0000F86704 /* MetalKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MetalKit.framework; path = System/Library/Frameworks/MetalKit.framework; sourceTree = SDKROOT; }; 457F671A20746193000EABCD /* QuotedReplyPreview.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuotedReplyPreview.swift; sourceTree = ""; }; 45847E861E4283C30080EAB3 /* Intents.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Intents.framework; path = System/Library/Frameworks/Intents.framework; sourceTree = SDKROOT; }; - 458E38351D668EBF0094BD24 /* OWSDeviceProvisioningURLParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSDeviceProvisioningURLParser.h; sourceTree = ""; }; - 458E38361D668EBF0094BD24 /* OWSDeviceProvisioningURLParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSDeviceProvisioningURLParser.m; sourceTree = ""; }; 45A2F004204473A3002E978A /* NewMessage.aifc */ = {isa = PBXFileReference; lastKnownFileType = file; name = NewMessage.aifc; path = Session/Meta/AudioFiles/NewMessage.aifc; sourceTree = SOURCE_ROOT; }; 45A663C41F92EC760027B59E /* GroupTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupTableViewCell.swift; sourceTree = ""; }; 45A6DAD51EBBF85500893231 /* ReminderView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReminderView.swift; sourceTree = ""; }; @@ -1480,12 +1463,10 @@ C33FDA8C255A57FD00E217F9 /* OpenGroupPoller.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenGroupPoller.swift; sourceTree = ""; }; C33FDA8E255A57FD00E217F9 /* OWSFileSystem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSFileSystem.m; sourceTree = ""; }; C33FDA90255A57FD00E217F9 /* TSYapDatabaseObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSYapDatabaseObject.m; sourceTree = ""; }; - C33FDA95255A57FE00E217F9 /* OWSChunkedOutputStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSChunkedOutputStream.h; sourceTree = ""; }; C33FDA96255A57FE00E217F9 /* OWSDispatch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSDispatch.h; sourceTree = ""; }; C33FDA97255A57FE00E217F9 /* TSIncomingMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSIncomingMessage.m; sourceTree = ""; }; C33FDA98255A57FE00E217F9 /* RotateSignedKeyOperation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RotateSignedKeyOperation.swift; sourceTree = ""; }; C33FDA99255A57FE00E217F9 /* OutageDetection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OutageDetection.swift; sourceTree = ""; }; - C33FDA9D255A57FF00E217F9 /* OWSContactsOutputStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSContactsOutputStream.h; sourceTree = ""; }; C33FDA9E255A57FF00E217F9 /* ReverseDispatchQueue.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReverseDispatchQueue.swift; sourceTree = ""; }; C33FDAA0255A57FF00E217F9 /* OWSRecipientIdentity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSRecipientIdentity.h; sourceTree = ""; }; C33FDAA1255A57FF00E217F9 /* TSYapDatabaseObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSYapDatabaseObject.h; sourceTree = ""; }; @@ -1497,7 +1478,6 @@ C33FDAB7255A580100E217F9 /* OWSFailedMessagesJob.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSFailedMessagesJob.m; sourceTree = ""; }; C33FDAB8255A580100E217F9 /* NSArray+Functional.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSArray+Functional.m"; sourceTree = ""; }; C33FDAB9255A580100E217F9 /* OWSStorage+Subclass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "OWSStorage+Subclass.h"; sourceTree = ""; }; - C33FDABB255A580100E217F9 /* OWSGroupsOutputStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSGroupsOutputStream.h; sourceTree = ""; }; C33FDABD255A580100E217F9 /* OWSOutgoingReceiptManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSOutgoingReceiptManager.h; sourceTree = ""; }; C33FDABE255A580100E217F9 /* TSConstants.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSConstants.m; sourceTree = ""; }; C33FDAC0255A580100E217F9 /* OWSIncomingMessageFinder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSIncomingMessageFinder.h; sourceTree = ""; }; @@ -1509,7 +1489,6 @@ C33FDACF255A580300E217F9 /* OWSAttachmentDownloads.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSAttachmentDownloads.h; sourceTree = ""; }; C33FDAD3255A580300E217F9 /* TSThread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSThread.h; sourceTree = ""; }; C33FDAD5255A580300E217F9 /* TSQuotedMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSQuotedMessage.h; sourceTree = ""; }; - C33FDAD8255A580300E217F9 /* OWSGroupsOutputStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSGroupsOutputStream.m; sourceTree = ""; }; C33FDAD9255A580300E217F9 /* OWSDisappearingMessagesConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSDisappearingMessagesConfiguration.h; sourceTree = ""; }; C33FDADA255A580400E217F9 /* OWSDisappearingConfigurationUpdateInfoMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSDisappearingConfigurationUpdateInfoMessage.h; sourceTree = ""; }; C33FDADB255A580400E217F9 /* OWSFailedMessagesJob.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSFailedMessagesJob.h; sourceTree = ""; }; @@ -1523,10 +1502,8 @@ C33FDAE6255A580400E217F9 /* TSInteraction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSInteraction.h; sourceTree = ""; }; C33FDAE7255A580500E217F9 /* TSErrorMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSErrorMessage.m; sourceTree = ""; }; C33FDAE8255A580500E217F9 /* OWSMessageUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSMessageUtils.h; sourceTree = ""; }; - C33FDAE9255A580500E217F9 /* SSKMessageSenderJobRecord.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SSKMessageSenderJobRecord.m; sourceTree = ""; }; C33FDAEA255A580500E217F9 /* OWSBackupFragment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSBackupFragment.h; sourceTree = ""; }; C33FDAEC255A580500E217F9 /* SignalRecipient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SignalRecipient.h; sourceTree = ""; }; - C33FDAED255A580500E217F9 /* SSKMessageSenderJobRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SSKMessageSenderJobRecord.h; sourceTree = ""; }; C33FDAEF255A580500E217F9 /* NSData+Image.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSData+Image.m"; sourceTree = ""; }; C33FDAF1255A580500E217F9 /* OWSThumbnailService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OWSThumbnailService.swift; sourceTree = ""; }; C33FDAF2255A580500E217F9 /* ProxiedContentDownloader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProxiedContentDownloader.swift; sourceTree = ""; }; @@ -1541,10 +1518,8 @@ C33FDB01255A580700E217F9 /* AppReadiness.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppReadiness.h; sourceTree = ""; }; C33FDB03255A580700E217F9 /* OWSPrimaryStorage+SessionStore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "OWSPrimaryStorage+SessionStore.h"; sourceTree = ""; }; C33FDB07255A580700E217F9 /* OWSBackupFragment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSBackupFragment.m; sourceTree = ""; }; - C33FDB09255A580700E217F9 /* NSError+MessageSending.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSError+MessageSending.m"; sourceTree = ""; }; C33FDB0A255A580700E217F9 /* TSGroupModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSGroupModel.h; sourceTree = ""; }; C33FDB0D255A580800E217F9 /* NSArray+OWS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSArray+OWS.m"; sourceTree = ""; }; - C33FDB0E255A580800E217F9 /* NSError+MessageSending.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSError+MessageSending.h"; sourceTree = ""; }; C33FDB12255A580800E217F9 /* NSString+SSK.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+SSK.h"; sourceTree = ""; }; C33FDB14255A580800E217F9 /* OWSMath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSMath.h; sourceTree = ""; }; C33FDB17255A580800E217F9 /* FunctionalUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FunctionalUtil.m; sourceTree = ""; }; @@ -1568,18 +1543,15 @@ C33FDB40255A580C00E217F9 /* SignalIOSProto.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SignalIOSProto.swift; sourceTree = ""; }; C33FDB41255A580C00E217F9 /* MIMETypeUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MIMETypeUtil.m; sourceTree = ""; }; C33FDB43255A580C00E217F9 /* YapDatabaseConnection+OWS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "YapDatabaseConnection+OWS.m"; sourceTree = ""; }; - C33FDB44255A580C00E217F9 /* OWSContactsOutputStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSContactsOutputStream.m; sourceTree = ""; }; C33FDB45255A580C00E217F9 /* NSString+SSK.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+SSK.m"; sourceTree = ""; }; C33FDB46255A580C00E217F9 /* TSDatabaseView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSDatabaseView.m; sourceTree = ""; }; C33FDB47255A580C00E217F9 /* OWSPrimaryStorage+PreKeyStore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "OWSPrimaryStorage+PreKeyStore.h"; sourceTree = ""; }; C33FDB48255A580C00E217F9 /* TSOutgoingMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSOutgoingMessage.h; sourceTree = ""; }; C33FDB49255A580C00E217F9 /* WeakTimer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WeakTimer.swift; sourceTree = ""; }; - C33FDB4B255A580C00E217F9 /* OWSChunkedOutputStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSChunkedOutputStream.m; sourceTree = ""; }; C33FDB4C255A580D00E217F9 /* AppVersion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppVersion.h; sourceTree = ""; }; C33FDB4F255A580D00E217F9 /* SSKJobRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SSKJobRecord.h; sourceTree = ""; }; C33FDB50255A580D00E217F9 /* OWSPrimaryStorage+PreKeyStore.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "OWSPrimaryStorage+PreKeyStore.m"; sourceTree = ""; }; C33FDB51255A580D00E217F9 /* NSUserDefaults+OWS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSUserDefaults+OWS.h"; sourceTree = ""; }; - C33FDB52255A580D00E217F9 /* OWSHTTPSecurityPolicy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSHTTPSecurityPolicy.h; sourceTree = ""; }; C33FDB53255A580D00E217F9 /* PreKeyBundle+jsonDict.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "PreKeyBundle+jsonDict.h"; sourceTree = ""; }; C33FDB54255A580D00E217F9 /* DataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataSource.h; sourceTree = ""; }; C33FDB55255A580D00E217F9 /* TSInvalidIdentityKeySendingErrorMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSInvalidIdentityKeySendingErrorMessage.m; sourceTree = ""; }; @@ -1643,14 +1615,12 @@ C33FDBBA255A581600E217F9 /* OWSPrimaryStorage+keyFromIntLong.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "OWSPrimaryStorage+keyFromIntLong.h"; sourceTree = ""; }; C33FDBBB255A581600E217F9 /* OWSPrimaryStorage+Loki.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "OWSPrimaryStorage+Loki.h"; sourceTree = ""; }; C33FDBBC255A581600E217F9 /* SSKKeychainStorage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSKKeychainStorage.swift; sourceTree = ""; }; - C33FDBBF255A581700E217F9 /* OWSHTTPSecurityPolicy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSHTTPSecurityPolicy.m; sourceTree = ""; }; C33FDBC1255A581700E217F9 /* General.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = General.swift; sourceTree = ""; }; C33FDBC2255A581700E217F9 /* SSKAsserts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SSKAsserts.h; sourceTree = ""; }; C33FDBC9255A581700E217F9 /* CreatePreKeysOperation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CreatePreKeysOperation.swift; sourceTree = ""; }; C33FDBCA255A581700E217F9 /* LKGroupUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LKGroupUtilities.h; sourceTree = ""; }; C33FDBCB255A581800E217F9 /* TSInvalidIdentityKeyReceivingErrorMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TSInvalidIdentityKeyReceivingErrorMessage.m; sourceTree = ""; }; C33FDBD3255A581800E217F9 /* OWSSignalAddress.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OWSSignalAddress.swift; sourceTree = ""; }; - C33FDBD6255A581900E217F9 /* OWSUploadOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSUploadOperation.h; sourceTree = ""; }; C33FDBD7255A581900E217F9 /* OWSMessageUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSMessageUtils.m; sourceTree = ""; }; C33FDBD8255A581900E217F9 /* SignalIOS.pb.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SignalIOS.pb.swift; sourceTree = ""; }; C33FDBDD255A581900E217F9 /* OWSDisappearingMessagesJob.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSDisappearingMessagesJob.m; sourceTree = ""; }; @@ -1680,7 +1650,6 @@ C33FDC18255A581F00E217F9 /* TSAttachmentPointer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TSAttachmentPointer.h; sourceTree = ""; }; C33FDC19255A581F00E217F9 /* OWSQueues.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSQueues.h; sourceTree = ""; }; C33FDC1B255A581F00E217F9 /* OWSBackgroundTask.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSBackgroundTask.m; sourceTree = ""; }; - C33FDC1E255A581F00E217F9 /* OWSUploadOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSUploadOperation.m; sourceTree = ""; }; C33FDC1F255A581F00E217F9 /* LokiSessionRestorationImplementation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LokiSessionRestorationImplementation.swift; sourceTree = ""; }; C3471ECA2555356A00297E91 /* MessageSender+Encryption.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MessageSender+Encryption.swift"; sourceTree = ""; }; C3471F4B25553AB000297E91 /* MessageReceiver+Decryption.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MessageReceiver+Decryption.swift"; sourceTree = ""; }; @@ -2380,8 +2349,6 @@ 4CEB78C72178EBAB00F315D2 /* OWSSessionResetJobRecord.h */, 4CEB78C82178EBAB00F315D2 /* OWSSessionResetJobRecord.m */, 451166BF1FD86B98000739BA /* AccountManager.swift */, - 458E38351D668EBF0094BD24 /* OWSDeviceProvisioningURLParser.h */, - 458E38361D668EBF0094BD24 /* OWSDeviceProvisioningURLParser.m */, 4CB5F26820F7D060004D1B42 /* MessageActions.swift */, 451A13B01E13DED2000A50FD /* AppNotifications.swift */, 450DF2081E0DD2C6003D14BE /* UserNotificationsAdaptee.swift */, @@ -3011,15 +2978,9 @@ C33FDBC9255A581700E217F9 /* CreatePreKeysOperation.swift */, C33FDB69255A580F00E217F9 /* FeatureFlags.swift */, C33FDB87255A581100E217F9 /* JobQueue.swift */, - C33FDB0E255A580800E217F9 /* NSError+MessageSending.h */, - C33FDB09255A580700E217F9 /* NSError+MessageSending.m */, C33FDA99255A57FE00E217F9 /* OutageDetection.swift */, C33FDACF255A580300E217F9 /* OWSAttachmentDownloads.h */, C33FDC13255A581E00E217F9 /* OWSAttachmentDownloads.m */, - C33FDA95255A57FE00E217F9 /* OWSChunkedOutputStream.h */, - C33FDB4B255A580C00E217F9 /* OWSChunkedOutputStream.m */, - C33FDA9D255A57FF00E217F9 /* OWSContactsOutputStream.h */, - C33FDB44255A580C00E217F9 /* OWSContactsOutputStream.m */, C33FDA96255A57FE00E217F9 /* OWSDispatch.h */, C33FDAC3255A580200E217F9 /* OWSDispatch.m */, C33FDBF9255A581C00E217F9 /* OWSError.h */, @@ -3028,10 +2989,6 @@ C33FDB59255A580E00E217F9 /* OWSFailedAttachmentDownloadsJob.m */, C33FDADB255A580400E217F9 /* OWSFailedMessagesJob.h */, C33FDAB7255A580100E217F9 /* OWSFailedMessagesJob.m */, - C33FDABB255A580100E217F9 /* OWSGroupsOutputStream.h */, - C33FDAD8255A580300E217F9 /* OWSGroupsOutputStream.m */, - C33FDB52255A580D00E217F9 /* OWSHTTPSecurityPolicy.h */, - C33FDBBF255A581700E217F9 /* OWSHTTPSecurityPolicy.m */, C33FDBA1255A581400E217F9 /* OWSOperation.h */, C33FDB78255A581000E217F9 /* OWSOperation.m */, C33FDC19255A581F00E217F9 /* OWSQueues.h */, @@ -3040,8 +2997,6 @@ C33FDBD3255A581800E217F9 /* OWSSignalAddress.swift */, C33FDA75255A57FB00E217F9 /* OWSSyncManagerProtocol.h */, C33FDB5A255A580E00E217F9 /* OWSUDManager.swift */, - C33FDBD6255A581900E217F9 /* OWSUploadOperation.h */, - C33FDC1E255A581F00E217F9 /* OWSUploadOperation.m */, C33FDB53255A580D00E217F9 /* PreKeyBundle+jsonDict.h */, C33FDB93255A581200E217F9 /* PreKeyBundle+jsonDict.m */, C33FDB64255A580E00E217F9 /* PreKeyRefreshOperation.swift */, @@ -3051,8 +3006,6 @@ C33FDC06255A581D00E217F9 /* SignalAccount.m */, C33FDBD8255A581900E217F9 /* SignalIOS.pb.swift */, C33FDB40255A580C00E217F9 /* SignalIOSProto.swift */, - C33FDAED255A580500E217F9 /* SSKMessageSenderJobRecord.h */, - C33FDAE9255A580500E217F9 /* SSKMessageSenderJobRecord.m */, C33FDC12255A581E00E217F9 /* TSConstants.h */, C33FDABE255A580100E217F9 /* TSConstants.m */, C33FDB6D255A580F00E217F9 /* TSPreKeyManager.h */, @@ -3965,8 +3918,6 @@ C38EF35D255B6DCC007E1867 /* OWSNavigationController.h in Headers */, C38EF249255B6D67007E1867 /* UIColor+OWS.h in Headers */, C38EF216255B6D3B007E1867 /* Theme.h in Headers */, - C33FDD0C255A582000E217F9 /* OWSHTTPSecurityPolicy.h in Headers */, - C33FDC57255A582000E217F9 /* OWSContactsOutputStream.h in Headers */, C33FDCBD255A582000E217F9 /* OWSPrimaryStorage+SessionStore.h in Headers */, C38EF3F0255B6DF7007E1867 /* ThreadViewHelper.h in Headers */, C38EF274255B6D7A007E1867 /* OWSResaveCollectionDBMigration.h in Headers */, @@ -3976,18 +3927,14 @@ C38EF277255B6D7A007E1867 /* OWSDatabaseMigration.h in Headers */, C38EF3F5255B6DF7007E1867 /* OWSTextField.h in Headers */, C38EF275255B6D7A007E1867 /* OWSDatabaseMigrationRunner.h in Headers */, - C33FDCA7255A582000E217F9 /* SSKMessageSenderJobRecord.h in Headers */, C38EF366255B6DCC007E1867 /* ScreenLockViewController.h in Headers */, C38EF35B255B6DCC007E1867 /* SelectThreadViewController.h in Headers */, C33FDDD3255A582000E217F9 /* OWSQueues.h in Headers */, C33FDC96255A582000E217F9 /* NSObject+Casting.h in Headers */, - C33FDC75255A582000E217F9 /* OWSGroupsOutputStream.h in Headers */, C33FDDB3255A582000E217F9 /* OWSError.h in Headers */, - C33FDCC8255A582000E217F9 /* NSError+MessageSending.h in Headers */, C38EF403255B6DF7007E1867 /* ContactCellView.h in Headers */, C33FDD68255A582000E217F9 /* SignalAccount.h in Headers */, C38EF35E255B6DCC007E1867 /* OWSViewController.h in Headers */, - C33FDC4F255A582000E217F9 /* OWSChunkedOutputStream.h in Headers */, C37F5396255B95BD002AEA92 /* OWSAnyTouchGestureRecognizer.h in Headers */, C38EF404255B6DF7007E1867 /* ContactTableViewCell.h in Headers */, C33FDDB2255A582000E217F9 /* NSArray+OWS.h in Headers */, @@ -4003,7 +3950,6 @@ C33FD9AF255A548A00E217F9 /* SignalUtilitiesKit.h in Headers */, C33FDC50255A582000E217F9 /* OWSDispatch.h in Headers */, C33FDD06255A582000E217F9 /* AppVersion.h in Headers */, - C33FDD90255A582000E217F9 /* OWSUploadOperation.h in Headers */, C33FDD27255A582000E217F9 /* TSPreKeyManager.h in Headers */, C33FDD5A255A582000E217F9 /* TSStorageHeaders.h in Headers */, C33FDCA2255A582000E217F9 /* OWSMessageUtils.h in Headers */, @@ -4957,7 +4903,6 @@ C38EF317255B6DBF007E1867 /* DisplayableText.swift in Sources */, C38EF30F255B6DBF007E1867 /* AppPreferences.swift in Sources */, C33FDD45255A582000E217F9 /* Storage+SessionManagement.swift in Sources */, - C33FDCA3255A582000E217F9 /* SSKMessageSenderJobRecord.m in Sources */, C38EF3C3255B6DE7007E1867 /* ImageEditorTextItem.swift in Sources */, C33FDC7D255A582000E217F9 /* OWSDispatch.m in Sources */, C38EF247255B6D67007E1867 /* NSAttributedString+OWS.m in Sources */, @@ -4970,7 +4915,6 @@ C38EF320255B6DBF007E1867 /* OWSScrubbingLogFormatter.m in Sources */, C38EF39B255B6DDA007E1867 /* ThreadViewModel.swift in Sources */, C38EF2A5255B6D93007E1867 /* Identicon+ObjC.swift in Sources */, - C33FDD79255A582000E217F9 /* OWSHTTPSecurityPolicy.m in Sources */, C38EF273255B6D7A007E1867 /* OWSDatabaseMigrationRunner.m in Sources */, C33FDD12255A582000E217F9 /* OWSPrimaryStorage+Loki.m in Sources */, C3D9E40C25676C100040E4F3 /* Storage+Conformances.swift in Sources */, @@ -5033,9 +4977,7 @@ C38EF276255B6D7A007E1867 /* OWSDatabaseMigration.m in Sources */, C38EF370255B6DCC007E1867 /* OWSNavigationController.m in Sources */, C38EF24E255B6D67007E1867 /* Collection+OWS.swift in Sources */, - C33FDD05255A582000E217F9 /* OWSChunkedOutputStream.m in Sources */, C33FDCFA255A582000E217F9 /* SignalIOSProto.swift in Sources */, - C33FDCC3255A582000E217F9 /* NSError+MessageSending.m in Sources */, C33FDD13255A582000E217F9 /* OWSFailedAttachmentDownloadsJob.m in Sources */, C38EF24D255B6D67007E1867 /* UIView+OWS.swift in Sources */, C33FDD4D255A582000E217F9 /* PreKeyBundle+jsonDict.m in Sources */, @@ -5085,7 +5027,6 @@ C38EF3B9255B6DE7007E1867 /* ImageEditorPinchGestureRecognizer.swift in Sources */, C33FDC98255A582000E217F9 /* SwiftSingletons.swift in Sources */, C33FDC27255A581F00E217F9 /* YapDatabase+Promise.swift in Sources */, - C33FDCFE255A582000E217F9 /* OWSContactsOutputStream.m in Sources */, C33FDCD3255A582000E217F9 /* GroupUtilities.swift in Sources */, C38EF326255B6DBF007E1867 /* ConversationStyle.swift in Sources */, C38EF3B8255B6DE7007E1867 /* ImageEditorTextViewController.swift in Sources */, @@ -5096,11 +5037,9 @@ C38EF359255B6DCC007E1867 /* SheetViewController.swift in Sources */, C33FDCAD255A582000E217F9 /* OWSPrimaryStorage+SessionStore.m in Sources */, C38EF386255B6DD2007E1867 /* AttachmentApprovalInputAccessoryView.swift in Sources */, - C33FDC92255A582000E217F9 /* OWSGroupsOutputStream.m in Sources */, C38EF28E255B6D86007E1867 /* SignalKeyingStorage.m in Sources */, B8C2B2C82563685C00551B4D /* CircleView.swift in Sources */, C38EF331255B6DBF007E1867 /* UIGestureRecognizer+OWS.swift in Sources */, - C33FDDD8255A582000E217F9 /* OWSUploadOperation.m in Sources */, C33FDDC5255A582000E217F9 /* OWSError.m in Sources */, C38EF38D255B6DD2007E1867 /* AttachmentCaptionViewController.swift in Sources */, C38EF31C255B6DBF007E1867 /* Searcher.swift in Sources */, @@ -5476,7 +5415,6 @@ C331FFF32558FF0300070591 /* PathStatusView.swift in Sources */, 4CC1ECFB211A553000CC13BE /* AppUpdateNag.swift in Sources */, 34B6A903218B3F63007C4606 /* TypingIndicatorView.swift in Sources */, - 458E38371D668EBF0094BD24 /* OWSDeviceProvisioningURLParser.m in Sources */, 34B6A905218B4C91007C4606 /* TypingIndicatorInteraction.swift in Sources */, 2400888E239F30A600305217 /* SessionRestorationView.swift in Sources */, B886B4A72398B23E00211ABE /* QRCodeVC.swift in Sources */, diff --git a/SignalUtilitiesKit/Meta/SignalUtilitiesKit.h b/SignalUtilitiesKit/Meta/SignalUtilitiesKit.h index 1d8cb1e42..56dda12db 100644 --- a/SignalUtilitiesKit/Meta/SignalUtilitiesKit.h +++ b/SignalUtilitiesKit/Meta/SignalUtilitiesKit.h @@ -13,14 +13,12 @@ FOUNDATION_EXPORT const unsigned char SignalUtilitiesKitVersionString[]; #import #import #import -#import #import #import #import #import #import #import -#import #import #import #import @@ -34,7 +32,6 @@ FOUNDATION_EXPORT const unsigned char SignalUtilitiesKitVersionString[]; #import #import #import -#import #import #import #import @@ -42,7 +39,6 @@ FOUNDATION_EXPORT const unsigned char SignalUtilitiesKitVersionString[]; #import #import #import -#import #import #import #import diff --git a/SignalUtilitiesKit/NSError+MessageSending.h b/SignalUtilitiesKit/NSError+MessageSending.h deleted file mode 100644 index 804c512c9..000000000 --- a/SignalUtilitiesKit/NSError+MessageSending.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface NSError (MessageSending) - -@property (nonatomic) BOOL isRetryable; -@property (nonatomic) BOOL isFatal; -@property (nonatomic) BOOL shouldBeIgnoredForGroups; - -@end - -NS_ASSUME_NONNULL_END diff --git a/SignalUtilitiesKit/NSError+MessageSending.m b/SignalUtilitiesKit/NSError+MessageSending.m deleted file mode 100644 index 04f84e03a..000000000 --- a/SignalUtilitiesKit/NSError+MessageSending.m +++ /dev/null @@ -1,61 +0,0 @@ -// -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. -// - -#import "NSError+MessageSending.h" -#import - -NS_ASSUME_NONNULL_BEGIN - -static void *kNSError_MessageSender_IsRetryable = &kNSError_MessageSender_IsRetryable; -static void *kNSError_MessageSender_ShouldBeIgnoredForGroups = &kNSError_MessageSender_ShouldBeIgnoredForGroups; -static void *kNSError_MessageSender_IsFatal = &kNSError_MessageSender_IsFatal; - -// isRetryable and isFatal are opposites but not redundant. -// -// If a group message send fails, the send will be retried if any of the errors were retryable UNLESS -// any of the errors were fatal. Fatal errors trump retryable errors. -@implementation NSError (MessageSending) - -- (BOOL)isRetryable -{ - NSNumber *value = objc_getAssociatedObject(self, kNSError_MessageSender_IsRetryable); - // This value should always be set for all errors by the time OWSSendMessageOperation - // queries it's value. If not, default to retrying in production. - return value ? [value boolValue] : YES; -} - -- (void)setIsRetryable:(BOOL)value -{ - objc_setAssociatedObject(self, kNSError_MessageSender_IsRetryable, @(value), OBJC_ASSOCIATION_COPY); -} - -- (BOOL)shouldBeIgnoredForGroups -{ - NSNumber *value = objc_getAssociatedObject(self, kNSError_MessageSender_ShouldBeIgnoredForGroups); - // This value will NOT always be set for all errors by the time we query it's value. - // Default to NOT ignoring. - return value ? [value boolValue] : NO; -} - -- (void)setShouldBeIgnoredForGroups:(BOOL)value -{ - objc_setAssociatedObject(self, kNSError_MessageSender_ShouldBeIgnoredForGroups, @(value), OBJC_ASSOCIATION_COPY); -} - -- (BOOL)isFatal -{ - NSNumber *value = objc_getAssociatedObject(self, kNSError_MessageSender_IsFatal); - // This value will NOT always be set for all errors by the time we query it's value. - // Default to NOT fatal. - return value ? [value boolValue] : NO; -} - -- (void)setIsFatal:(BOOL)value -{ - objc_setAssociatedObject(self, kNSError_MessageSender_IsFatal, @(value), OBJC_ASSOCIATION_COPY); -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/SignalUtilitiesKit/OWSChunkedOutputStream.h b/SignalUtilitiesKit/OWSChunkedOutputStream.h deleted file mode 100644 index 9e82dadcf..000000000 --- a/SignalUtilitiesKit/OWSChunkedOutputStream.h +++ /dev/null @@ -1,25 +0,0 @@ -// -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface OWSChunkedOutputStream : NSObject - -// Indicates whether any write failed. -@property (nonatomic, readonly) BOOL hasError; - -- (instancetype)init NS_UNAVAILABLE; - -- (instancetype)initWithOutputStream:(NSOutputStream *)outputStream; - -// Returns NO on error. -- (BOOL)writeData:(NSData *)data; -- (BOOL)writeUInt32:(UInt32)value; -- (BOOL)writeVariableLengthUInt32:(UInt32)value; - -@end - -NS_ASSUME_NONNULL_END diff --git a/SignalUtilitiesKit/OWSChunkedOutputStream.m b/SignalUtilitiesKit/OWSChunkedOutputStream.m deleted file mode 100644 index 10baabf8a..000000000 --- a/SignalUtilitiesKit/OWSChunkedOutputStream.m +++ /dev/null @@ -1,97 +0,0 @@ -// -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. -// - -#import "OWSChunkedOutputStream.h" -#import -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface OWSChunkedOutputStream () - -@property (nonatomic, readonly) NSOutputStream *outputStream; -@property (nonatomic) BOOL hasError; - -@end - -#pragma mark - - -@implementation OWSChunkedOutputStream - -- (instancetype)initWithOutputStream:(NSOutputStream *)outputStream -{ - if (self = [super init]) { - OWSAssertDebug(outputStream); - _outputStream = outputStream; - } - - return self; -} - -- (BOOL)writeByte:(uint8_t)value -{ - NSInteger written = [self.outputStream write:&value maxLength:sizeof(value)]; - if (written != sizeof(value)) { - OWSFailDebug(@"could not write to output stream."); - self.hasError = YES; - return NO; - } - return YES; -} - -- (BOOL)writeData:(NSData *)data -{ - OWSAssertDebug(data); - - if (data.length < 1) { - return YES; - } - - while (YES) { - NSInteger written = [self.outputStream write:data.bytes maxLength:data.length]; - if (written < 1) { - OWSFailDebug(@"could not write to output stream."); - self.hasError = YES; - return NO; - } - if (written < data.length) { - data = [data subdataWithRange:NSMakeRange(written, data.length - written)]; - } else { - return YES; - } - } - return YES; -} - -- (BOOL)writeUInt32:(UInt32)value { - NSData *data = [[NSData alloc] initWithBytes:&value length:sizeof(value)]; - // Both Android and desktop seem to like this better - const char *bytes = data.bytes; - char *reversedBytes = malloc(sizeof(char) * data.length); - int i = data.length - 1; - for (int j = 0; j < data.length; j++) { - reversedBytes[i] = bytes[j]; - i = i - 1; - } - NSData *reversedData = [NSData dataWithBytes:reversedBytes length:data.length]; - return [self writeData:reversedData]; -} - -- (BOOL)writeVariableLengthUInt32:(UInt32)value -{ - while (YES) { - if (value <= 0x7F) { - return [self writeByte:value]; - } else { - if (![self writeByte:((value & 0x7F) | 0x80)]) { - return NO; - } - value >>= 7; - } - } -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/SignalUtilitiesKit/OWSContactsOutputStream.h b/SignalUtilitiesKit/OWSContactsOutputStream.h deleted file mode 100644 index 2bb74029c..000000000 --- a/SignalUtilitiesKit/OWSContactsOutputStream.h +++ /dev/null @@ -1,27 +0,0 @@ -// -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -@class OWSDisappearingMessagesConfiguration; -@class OWSRecipientIdentity; -@class SignalAccount; - -@protocol ContactsManagerProtocol; - -@interface OWSContactsOutputStream : OWSChunkedOutputStream - -- (void)writeSignalAccount:(SignalAccount *)signalAccount - recipientIdentity:(nullable OWSRecipientIdentity *)recipientIdentity - profileKeyData:(nullable NSData *)profileKeyData - contactsManager:(id)contactsManager - conversationColorName:(NSString *)conversationColorName -disappearingMessagesConfiguration:(nullable OWSDisappearingMessagesConfiguration *)disappearingMessagesConfiguration; - - -@end - -NS_ASSUME_NONNULL_END diff --git a/SignalUtilitiesKit/OWSContactsOutputStream.m b/SignalUtilitiesKit/OWSContactsOutputStream.m deleted file mode 100644 index 30eea5a3b..000000000 --- a/SignalUtilitiesKit/OWSContactsOutputStream.m +++ /dev/null @@ -1,80 +0,0 @@ -// -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. -// - -#import "OWSContactsOutputStream.h" -#import "MIMETypeUtil.h" -#import "NSData+keyVersionByte.h" -#import "OWSBlockingManager.h" -#import "OWSDisappearingMessagesConfiguration.h" -#import "OWSRecipientIdentity.h" -#import "SignalAccount.h" -#import "TSContactThread.h" -#import -#import -#import - -NS_ASSUME_NONNULL_BEGIN - -@implementation OWSContactsOutputStream - -- (void)writeSignalAccount:(SignalAccount *)signalAccount - recipientIdentity:(nullable OWSRecipientIdentity *)recipientIdentity - profileKeyData:(nullable NSData *)profileKeyData - contactsManager:(id)contactsManager - conversationColorName:(NSString *)conversationColorName -disappearingMessagesConfiguration:(nullable OWSDisappearingMessagesConfiguration *)disappearingMessagesConfiguration -{ - OWSAssertDebug(signalAccount); - OWSAssertDebug(contactsManager); - - SNProtoContactDetailsBuilder *contactBuilder = - [SNProtoContactDetails builderWithNumber:signalAccount.recipientId]; - [contactBuilder setName:[LKUserDisplayNameUtilities getPrivateChatDisplayNameFor:signalAccount.recipientId] ?: signalAccount.recipientId]; - [contactBuilder setColor:conversationColorName]; - - if (recipientIdentity != nil) { - SNProtoVerified *_Nullable verified = BuildVerifiedProtoWithRecipientId(recipientIdentity.recipientId, - [recipientIdentity.identityKey prependKeyType], - recipientIdentity.verificationState, - 0); - if (!verified) { - OWSLogError(@"could not build protobuf."); - return; - } - contactBuilder.verified = verified; - } - - if (profileKeyData) { - OWSAssertDebug(profileKeyData.length == kAES256_KeyByteLength); - [contactBuilder setProfileKey:profileKeyData]; - } - - // Always ensure the "expire timer" property is set so that desktop - // can easily distinguish between a modern client declaring "off" vs a - // legacy client "not specifying". - [contactBuilder setExpireTimer:0]; - - if (disappearingMessagesConfiguration && disappearingMessagesConfiguration.isEnabled) { - [contactBuilder setExpireTimer:disappearingMessagesConfiguration.durationSeconds]; - } - - if ([OWSBlockingManager.sharedManager isRecipientIdBlocked:signalAccount.recipientId]) { - [contactBuilder setBlocked:YES]; - } - - NSError *error; - NSData *_Nullable contactData = [contactBuilder buildSerializedDataAndReturnError:&error]; - if (error || !contactData) { - OWSFailDebug(@"could not serialize protobuf: %@", error); - return; - } - - uint32_t contactDataLength = (uint32_t)contactData.length; - [self writeUInt32:contactDataLength]; - [self writeData:contactData]; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/SignalUtilitiesKit/OWSGroupsOutputStream.h b/SignalUtilitiesKit/OWSGroupsOutputStream.h deleted file mode 100644 index fc0036105..000000000 --- a/SignalUtilitiesKit/OWSGroupsOutputStream.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -@class TSGroupThread; -@class YapDatabaseReadTransaction; - -@interface OWSGroupsOutputStream : OWSChunkedOutputStream - -- (void)writeGroup:(TSGroupThread *)groupThread transaction:(YapDatabaseReadTransaction *)transaction; - -@end - -NS_ASSUME_NONNULL_END diff --git a/SignalUtilitiesKit/OWSGroupsOutputStream.m b/SignalUtilitiesKit/OWSGroupsOutputStream.m deleted file mode 100644 index 2cd2877b6..000000000 --- a/SignalUtilitiesKit/OWSGroupsOutputStream.m +++ /dev/null @@ -1,61 +0,0 @@ -// -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. -// - -#import "OWSGroupsOutputStream.h" -#import "MIMETypeUtil.h" -#import "OWSBlockingManager.h" -#import "OWSDisappearingMessagesConfiguration.h" -#import "TSGroupModel.h" -#import "TSGroupThread.h" -#import - -NS_ASSUME_NONNULL_BEGIN - -@implementation OWSGroupsOutputStream - -- (void)writeGroup:(TSGroupThread *)groupThread transaction:(YapDatabaseReadTransaction *)transaction -{ - OWSAssertDebug(groupThread); - OWSAssertDebug(transaction); - - TSGroupModel *group = groupThread.groupModel; - OWSAssertDebug(group); - - SNProtoGroupDetailsBuilder *groupBuilder = [SNProtoGroupDetails builderWithId:group.groupId]; - [groupBuilder setName:group.groupName]; - [groupBuilder setMembers:group.groupMemberIds]; - [groupBuilder setAdmins:group.groupAdminIds]; - - if ([OWSBlockingManager.sharedManager isGroupIdBlocked:group.groupId]) { - [groupBuilder setBlocked:YES]; - } - - OWSDisappearingMessagesConfiguration *_Nullable disappearingMessagesConfiguration = - [OWSDisappearingMessagesConfiguration fetchObjectWithUniqueID:groupThread.uniqueId transaction:transaction]; - - if (disappearingMessagesConfiguration && disappearingMessagesConfiguration.isEnabled) { - [groupBuilder setExpireTimer:disappearingMessagesConfiguration.durationSeconds]; - } else { - // Rather than *not* set the field, we expicitly set it to 0 so desktop - // can easily distinguish between a modern client declaring "off" vs a - // legacy client "not specifying". - [groupBuilder setExpireTimer:0]; - } - - NSError *error; - NSData *_Nullable groupData = [groupBuilder buildSerializedDataAndReturnError:&error]; - if (error || !groupData) { - OWSFailDebug(@"could not serialize protobuf: %@", error); - return; - } - - uint32_t groupDataLength = (uint32_t)groupData.length; - - [self writeUInt32:groupDataLength]; - [self writeData:groupData]; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/SignalUtilitiesKit/OWSHTTPSecurityPolicy.h b/SignalUtilitiesKit/OWSHTTPSecurityPolicy.h deleted file mode 100644 index 2980c6112..000000000 --- a/SignalUtilitiesKit/OWSHTTPSecurityPolicy.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// Copyright (c) 2019 Open Whisper Systems. All rights reserved. -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -extern NSData *SSKTextSecureServiceCertificateData(void); - -@interface OWSHTTPSecurityPolicy : AFSecurityPolicy - -+ (instancetype)sharedPolicy; - -@end - -NS_ASSUME_NONNULL_END diff --git a/SignalUtilitiesKit/OWSHTTPSecurityPolicy.m b/SignalUtilitiesKit/OWSHTTPSecurityPolicy.m deleted file mode 100644 index 951a53bed..000000000 --- a/SignalUtilitiesKit/OWSHTTPSecurityPolicy.m +++ /dev/null @@ -1,106 +0,0 @@ -// -// Copyright (c) 2019 Open Whisper Systems. All rights reserved. -// - -#import "OWSHTTPSecurityPolicy.h" -#import -#import - -NS_ASSUME_NONNULL_BEGIN - -@implementation OWSHTTPSecurityPolicy - -+ (instancetype)sharedPolicy { - static OWSHTTPSecurityPolicy *httpSecurityPolicy = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - httpSecurityPolicy = [[self alloc] initWithOWSPolicy]; - }); - return httpSecurityPolicy; -} - -- (instancetype)initWithOWSPolicy { - self = [[super class] defaultPolicy]; - - if (self) { - self.pinnedCertificates = [NSSet setWithArray:@[ - [self.class certificateDataForService:@"textsecure"] - ]]; - } - - return self; -} - -+ (NSData *)dataFromCertificateFileForService:(NSString *)service -{ - NSBundle *bundle = [NSBundle bundleForClass:self.class]; - NSString *path = [bundle pathForResource:service ofType:@"cer"]; - - if (![[NSFileManager defaultManager] fileExistsAtPath:path]) { - OWSFail(@"Missing signing certificate for service %@", service); - } - - NSData *data = [NSData dataWithContentsOfFile:path]; - OWSAssert(data.length > 0); - - return data; -} - -+ (NSData *)certificateDataForService:(NSString *)service { - SecCertificateRef certRef = [self certificateForService:service]; - return (__bridge_transfer NSData *)SecCertificateCopyData(certRef); -} - -+ (SecCertificateRef)certificateForService:(NSString *)service -{ - NSData *certificateData = [self dataFromCertificateFileForService:service]; - return SecCertificateCreateWithData(NULL, (__bridge CFDataRef)(certificateData)); -} - -- (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust forDomain:(nullable NSString *)domain -{ - NSMutableArray *policies = [NSMutableArray array]; - [policies addObject:(__bridge_transfer id)SecPolicyCreateSSL(true, (__bridge CFStringRef)domain)]; - - if (SecTrustSetPolicies(serverTrust, (__bridge CFArrayRef)policies) != errSecSuccess) { - OWSLogError(@"The trust policy couldn't be set."); - return NO; - } - - NSMutableArray *pinnedCertificates = [NSMutableArray array]; - for (NSData *certificateData in self.pinnedCertificates) { - [pinnedCertificates - addObject:(__bridge_transfer id)SecCertificateCreateWithData(NULL, (__bridge CFDataRef)certificateData)]; - } - - if (SecTrustSetAnchorCertificates(serverTrust, (__bridge CFArrayRef)pinnedCertificates) != errSecSuccess) { - OWSLogError(@"The anchor certificates couldn't be set."); - return NO; - } - - if (!AFServerTrustIsValid(serverTrust)) { - return NO; - } - - return YES; -} - -static BOOL AFServerTrustIsValid(SecTrustRef serverTrust) { - BOOL isValid = NO; - SecTrustResultType result; - __Require_noErr_Quiet(SecTrustEvaluate(serverTrust, &result), _out); - - isValid = (result == kSecTrustResultUnspecified); - -_out: - return isValid; -} - -NSData *SSKTextSecureServiceCertificateData() -{ - return [OWSHTTPSecurityPolicy dataFromCertificateFileForService:@"textsecure"]; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/SignalUtilitiesKit/OWSOperation.m b/SignalUtilitiesKit/OWSOperation.m index 8cbd5f6e9..3b7df2079 100644 --- a/SignalUtilitiesKit/OWSOperation.m +++ b/SignalUtilitiesKit/OWSOperation.m @@ -3,7 +3,6 @@ // #import "OWSOperation.h" -#import "NSError+MessageSending.h" #import "OWSBackgroundTask.h" #import "OWSError.h" #import @@ -166,24 +165,8 @@ NSString *const OWSOperationKeyIsFinished = @"isFinished"; - (void)reportError:(NSError *)error { - OWSLogDebug(@"reportError: %@, fatal?: %d, retryable?: %d, remainingRetries: %lu", - error, - error.isFatal, - error.isRetryable, - (unsigned long)self.remainingRetries); - [self didReportError:error]; - if (error.isFatal) { - [self failOperationWithError:error]; - return; - } - - if (!error.isRetryable) { - [self failOperationWithError:error]; - return; - } - if (self.remainingRetries == 0) { [self failOperationWithError:error]; return; diff --git a/SignalUtilitiesKit/OWSUploadOperation.h b/SignalUtilitiesKit/OWSUploadOperation.h deleted file mode 100644 index 6cb97e439..000000000 --- a/SignalUtilitiesKit/OWSUploadOperation.h +++ /dev/null @@ -1,27 +0,0 @@ -// -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -@class TSOutgoingMessage; -@class YapDatabaseConnection; - -extern NSString *const kAttachmentUploadProgressNotification; -extern NSString *const kAttachmentUploadProgressKey; -extern NSString *const kAttachmentUploadAttachmentIDKey; - -@interface OWSUploadOperation : OWSOperation - -@property (nullable, readonly) NSError *lastError; - -- (instancetype)init NS_UNAVAILABLE; -- (instancetype)initWithAttachmentId:(NSString *)attachmentId - threadID:(NSString *)threadID - dbConnection:(YapDatabaseConnection *)dbConnection NS_DESIGNATED_INITIALIZER; - -@end - -NS_ASSUME_NONNULL_END diff --git a/SignalUtilitiesKit/OWSUploadOperation.m b/SignalUtilitiesKit/OWSUploadOperation.m deleted file mode 100644 index cdb16a6f1..000000000 --- a/SignalUtilitiesKit/OWSUploadOperation.m +++ /dev/null @@ -1,110 +0,0 @@ -// -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. -// - -#import "OWSUploadOperation.h" -#import "MIMETypeUtil.h" -#import "NSError+MessageSending.h" -#import "NSNotificationCenter+OWS.h" -#import "OWSDispatch.h" -#import "OWSError.h" -#import "OWSOperation.h" -#import -#import "SSKEnvironment.h" -#import "TSAttachmentStream.h" - -#import -#import -#import - -NS_ASSUME_NONNULL_BEGIN - -NSString *const kAttachmentUploadProgressNotification = @"kAttachmentUploadProgressNotification"; -NSString *const kAttachmentUploadProgressKey = @"kAttachmentUploadProgressKey"; -NSString *const kAttachmentUploadAttachmentIDKey = @"kAttachmentUploadAttachmentIDKey"; - -// Use a slightly non-zero value to ensure that the progress -// indicator shows up as quickly as possible. -static const CGFloat kAttachmentUploadProgressTheta = 0.001f; - -@interface OWSUploadOperation () - -@property (readonly, nonatomic) NSString *attachmentId; -@property (readonly, nonatomic) NSString *threadID; -@property (readonly, nonatomic) YapDatabaseConnection *dbConnection; - -@end - -#pragma mark - - -@implementation OWSUploadOperation - -- (instancetype)initWithAttachmentId:(NSString *)attachmentId - threadID:(NSString *)threadID - dbConnection:(YapDatabaseConnection *)dbConnection -{ - self = [super init]; - if (!self) { - return self; - } - - self.remainingRetries = 4; - - _attachmentId = attachmentId; - _threadID = threadID; - _dbConnection = dbConnection; - - return self; -} - -- (void)run -{ - __block TSAttachmentStream *attachmentStream; - [self.dbConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { - attachmentStream = [TSAttachmentStream fetchObjectWithUniqueID:self.attachmentId transaction:transaction]; - }]; - - if (!attachmentStream) { - NSError *error = OWSErrorMakeFailedToSendOutgoingMessageError(); - // Not finding a local attachment is a terminal failure - error.isRetryable = NO; - [self reportError:error]; - return; - } - - if (attachmentStream.isUploaded) { - OWSLogDebug(@"Attachment previously uploaded."); - [self reportSuccess]; - return; - } - - [self fireNotificationWithProgress:0]; - - SNOpenGroup *publicChat = [LKStorage.shared getOpenGroupForThreadID:self.threadID]; - NSString *server = (publicChat != nil) ? publicChat.server : SNFileServerAPI.server; - - [[SNFileServerAPI uploadAttachment:attachmentStream withID:self.attachmentId toServer:server] - .thenOn(dispatch_get_main_queue(), ^() { - [self reportSuccess]; - }) - .catchOn(dispatch_get_main_queue(), ^(NSError *error) { - [self reportError:error]; - }) retainUntilComplete]; -} - -- (void)fireNotificationWithProgress:(CGFloat)aProgress -{ - NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; - - CGFloat progress = MAX(kAttachmentUploadProgressTheta, aProgress); - [notificationCenter postNotificationNameAsync:kAttachmentUploadProgressNotification - object:nil - userInfo:@{ - kAttachmentUploadProgressKey : @(progress), - kAttachmentUploadAttachmentIDKey : self.attachmentId - }]; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/SignalUtilitiesKit/SSKMessageSenderJobRecord.h b/SignalUtilitiesKit/SSKMessageSenderJobRecord.h deleted file mode 100644 index 75d831ce3..000000000 --- a/SignalUtilitiesKit/SSKMessageSenderJobRecord.h +++ /dev/null @@ -1,29 +0,0 @@ -// -// Copyright (c) 2018 Open Whisper Systems. All rights reserved. -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -@class TSOutgoingMessage; - -@interface SSKMessageSenderJobRecord : SSKJobRecord - -@property (nonatomic, readonly, nullable) NSString *messageId; -@property (nonatomic, readonly, nullable) NSString *threadId; -@property (nonatomic, readonly, nullable) TSOutgoingMessage *invisibleMessage; -@property (nonatomic, readonly) BOOL removeMessageAfterSending; - -- (nullable instancetype)initWithMessage:(TSOutgoingMessage *)message - removeMessageAfterSending:(BOOL)removeMessageAfterSending - label:(NSString *)label - error:(NSError **)outError NS_DESIGNATED_INITIALIZER; - -- (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER; - -- (instancetype)initWithLabel:(nullable NSString *)label NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/SignalUtilitiesKit/SSKMessageSenderJobRecord.m b/SignalUtilitiesKit/SSKMessageSenderJobRecord.m deleted file mode 100644 index d7d92a480..000000000 --- a/SignalUtilitiesKit/SSKMessageSenderJobRecord.m +++ /dev/null @@ -1,51 +0,0 @@ -// -// Copyright (c) 2019 Open Whisper Systems. All rights reserved. -// - -#import "SSKMessageSenderJobRecord.h" -#import "TSOutgoingMessage.h" - -NS_ASSUME_NONNULL_BEGIN - -@implementation SSKMessageSenderJobRecord - -#pragma mark - -- (nullable instancetype)initWithCoder:(NSCoder *)coder -{ - return [super initWithCoder:coder]; -} - -- (nullable instancetype)initWithMessage:(TSOutgoingMessage *)message - removeMessageAfterSending:(BOOL)removeMessageAfterSending - label:(NSString *)label - error:(NSError **)outError; -{ - self = [super initWithLabel:label]; - if (!self) { - return self; - } - - if (message.shouldBeSaved) { - _messageId = message.uniqueId; - if (_messageId == nil) { - *outError = [NSError errorWithDomain:SSKJobRecordErrorDomain - code:JobRecordError_AssertionError - userInfo:@{ NSDebugDescriptionErrorKey : @"messageId wasn't set" }]; - return nil; - } - _invisibleMessage = nil; - } else { - _messageId = nil; - _invisibleMessage = message; - } - - _removeMessageAfterSending = removeMessageAfterSending; - _threadId = message.uniqueThreadId; - - return self; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/SignalUtilitiesKit/UI/SharingThreadPickerViewController.m b/SignalUtilitiesKit/UI/SharingThreadPickerViewController.m index ea8332eb6..9145c5b5f 100644 --- a/SignalUtilitiesKit/UI/SharingThreadPickerViewController.m +++ b/SignalUtilitiesKit/UI/SharingThreadPickerViewController.m @@ -71,11 +71,6 @@ typedef void (^SendMessageBlock)(SendCompletionBlock completion); - (void)viewDidLoad { [super viewDidLoad]; - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(attachmentUploadProgress:) - name:kAttachmentUploadProgressNotification - object:nil]; // Loki: Customize title UILabel *titleLabel = [UILabel new]; @@ -457,36 +452,6 @@ typedef void (^SendMessageBlock)(SendCompletionBlock completion); }]; } -- (void)attachmentUploadProgress:(NSNotification *)notification -{ - OWSLogDebug(@"upload progress."); - OWSAssertIsOnMainThread(); - - if (!self.outgoingMessage) { - OWSLogDebug(@"Ignoring upload progress until there is an outgoing message."); - return; - } - - // TODO: Support multi-image messages. - NSString *_Nullable attachmentRecordId = self.outgoingMessage.attachmentIds.firstObject; - if (!attachmentRecordId) { - OWSLogDebug(@"Ignoring upload progress until outgoing message has an attachment record id"); - return; - } - - NSDictionary *userinfo = [notification userInfo]; - float progress = [[userinfo objectForKey:kAttachmentUploadProgressKey] floatValue]; - NSString *attachmentID = [userinfo objectForKey:kAttachmentUploadAttachmentIDKey]; - - if ([attachmentRecordId isEqual:attachmentID]) { - if (!isnan(progress)) { - // This is where we'd set progress if we could - } else { - OWSFailDebug(@"Invalid attachment progress."); - } - } -} - @end NS_ASSUME_NONNULL_END From 6b0909b41bc72ef4acfd5acbf433352824a1fe95 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Thu, 17 Dec 2020 16:09:49 +1100 Subject: [PATCH 2/9] Create contact model --- SessionMessagingKit/Contacts/Contact.swift | 42 ++++++++++++++++++++++ Signal.xcodeproj/project.pbxproj | 12 +++++++ 2 files changed, 54 insertions(+) create mode 100644 SessionMessagingKit/Contacts/Contact.swift diff --git a/SessionMessagingKit/Contacts/Contact.swift b/SessionMessagingKit/Contacts/Contact.swift new file mode 100644 index 000000000..b70609e8f --- /dev/null +++ b/SessionMessagingKit/Contacts/Contact.swift @@ -0,0 +1,42 @@ + +@objc(SNContact) +public class Contact : NSObject, NSCoding { // NSObject/NSCoding conformance is needed for YapDatabase compatibility + public let sessionID: String + /// The display name of the contact. + public var displayName: String? + /// The URL from which to fetch the contact's profile picture. + public var profilePictureURL: String? + /// The file name of the contact's profile picture on local storage. + public var profilePictureFileName: String? + /// The key with which the profile picture is encrypted. + public var profilePictureEncryptionKey: OWSAES256Key? + /// The ID of the thread associated with this contact. + public var threadID: String? + + public init(sessionID: String) { + self.sessionID = sessionID + super.init() + } + + private override init() { preconditionFailure("Use init(sessionID:) instead.") } + + // MARK: Coding + public required init?(coder: NSCoder) { + guard let sessionID = coder.decodeObject(forKey: "sessionID") as! String? else { return nil } + self.sessionID = sessionID + if let displayName = coder.decodeObject(forKey: "displayName") as! String? { self.displayName = displayName } + if let profilePictureURL = coder.decodeObject(forKey: "profilePictureURL") as! String? { self.profilePictureURL = profilePictureURL } + if let profilePictureFileName = coder.decodeObject(forKey: "profilePictureFileName") as! String? { self.profilePictureFileName = profilePictureFileName } + if let profilePictureEncryptionKey = coder.decodeObject(forKey: "profilePictureEncryptionKey") as! OWSAES256Key? { self.profilePictureEncryptionKey = profilePictureEncryptionKey } + if let threadID = coder.decodeObject(forKey: "threadID") as! String? { self.threadID = threadID } + } + + public func encode(with coder: NSCoder) { + coder.encode(sessionID, forKey: "sessionID") + coder.encode(displayName, forKey: "displayName") + coder.encode(profilePictureURL, forKey: "profilePictureURL") + coder.encode(profilePictureFileName, forKey: "profilePictureFileName") + coder.encode(profilePictureEncryptionKey, forKey: "profilePictureEncryptionKey") + coder.encode(threadID, forKey: "threadID") + } +} diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index 5171dfac9..ea3086152 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -282,6 +282,7 @@ B894D0752339EDCF00B4D94D /* NukeDataModal.swift in Sources */ = {isa = PBXBuildFile; fileRef = B894D0742339EDCF00B4D94D /* NukeDataModal.swift */; }; B8A14D702589CE9000E70D57 /* KeyPairMigrationSuccessSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8A14D6F2589CE9000E70D57 /* KeyPairMigrationSuccessSheet.swift */; }; B8B26C8F234D629C004ED98C /* MentionCandidateSelectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8B26C8E234D629C004ED98C /* MentionCandidateSelectionView.swift */; }; + B8B32021258B1A650020074B /* Contact.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8B32020258B1A650020074B /* Contact.swift */; }; B8BB82A5238F627000BA5194 /* HomeVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8BB82A4238F627000BA5194 /* HomeVC.swift */; }; B8BC00C0257D90E30032E807 /* General.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8BC00BF257D90E30032E807 /* General.swift */; }; B8C2B2C82563685C00551B4D /* CircleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8C2B2C72563685C00551B4D /* CircleView.swift */; }; @@ -1375,6 +1376,7 @@ B894D0742339EDCF00B4D94D /* NukeDataModal.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NukeDataModal.swift; sourceTree = ""; }; B8A14D6F2589CE9000E70D57 /* KeyPairMigrationSuccessSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyPairMigrationSuccessSheet.swift; sourceTree = ""; }; B8B26C8E234D629C004ED98C /* MentionCandidateSelectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MentionCandidateSelectionView.swift; sourceTree = ""; }; + B8B32020258B1A650020074B /* Contact.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Contact.swift; sourceTree = ""; }; B8B5BCEB2394D869003823C9 /* Button.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Button.swift; sourceTree = ""; }; B8BB829F238F322400BA5194 /* Colors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Colors.swift; sourceTree = ""; }; B8BB82A1238F356100BA5194 /* Values.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Values.swift; sourceTree = ""; }; @@ -2546,6 +2548,14 @@ path = ..; sourceTree = ""; }; + B8B3201F258B1A540020074B /* Contacts */ = { + isa = PBXGroup; + children = ( + B8B32020258B1A650020074B /* Contact.swift */, + ); + path = Contacts; + sourceTree = ""; + }; B8CCF63B239757C10091D419 /* Components */ = { isa = PBXGroup; children = ( @@ -3478,6 +3488,7 @@ C32C5BB9256DC7C4003C73A2 /* To Do */, C3BBE0752554CDA60050F1E3 /* Configuration.swift */, C3BBE07F2554CDD70050F1E3 /* Storage.swift */, + B8B3201F258B1A540020074B /* Contacts */, C32C5BCB256DC818003C73A2 /* Database */, C300A5BB2554AFFB00555489 /* Messages */, C32C59AF256DB31A003C73A2 /* Threads */, @@ -5149,6 +5160,7 @@ C32C5BDD256DC88D003C73A2 /* OWSReadReceiptManager.m in Sources */, C3D9E3BF25676AD70040E4F3 /* TSAttachmentStream.m in Sources */, C3C2A7562553A3AB00C340D1 /* VisibleMessage+Quote.swift in Sources */, + B8B32021258B1A650020074B /* Contact.swift in Sources */, C32C5C89256DD0D2003C73A2 /* Storage+Jobs.swift in Sources */, C300A5FC2554B0A000555489 /* MessageReceiver.swift in Sources */, C32C5A76256DBBCF003C73A2 /* SignalAttachment.swift in Sources */, From 9b3f71172bc0e4c55ffc791f1386183abeeb6037 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Thu, 17 Dec 2020 16:32:39 +1100 Subject: [PATCH 3/9] Implement contact storage --- .../Database/Storage+Contacts.swift | 18 ++++++++++++++++++ .../VisibleMessage+Contact.swift | 2 +- Signal.xcodeproj/project.pbxproj | 4 ++++ 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 SessionMessagingKit/Database/Storage+Contacts.swift diff --git a/SessionMessagingKit/Database/Storage+Contacts.swift b/SessionMessagingKit/Database/Storage+Contacts.swift new file mode 100644 index 000000000..5c124e602 --- /dev/null +++ b/SessionMessagingKit/Database/Storage+Contacts.swift @@ -0,0 +1,18 @@ +import SessionProtocolKit + +extension Storage { + + private static let contactCollection = "LokiContactCollection" + + public func getContact(with sessionID: String) -> Contact? { + var result: Contact? + Storage.read { transaction in + result = transaction.object(forKey: sessionID, inCollection: Storage.contactCollection) as? Contact + } + return result + } + + public func setContact(_ contact: Contact, using transaction: Any) { + (transaction as! YapDatabaseReadWriteTransaction).setObject(contact, forKey: contact.sessionID, inCollection: Storage.contactCollection) + } +} diff --git a/SessionMessagingKit/Messages/Visible Messages/VisibleMessage+Contact.swift b/SessionMessagingKit/Messages/Visible Messages/VisibleMessage+Contact.swift index d89865981..2a6105447 100644 --- a/SessionMessagingKit/Messages/Visible Messages/VisibleMessage+Contact.swift +++ b/SessionMessagingKit/Messages/Visible Messages/VisibleMessage+Contact.swift @@ -1,7 +1,7 @@ public extension VisibleMessage { - @objc(SNContact) + @objc(SNMessageContact) class Contact : NSObject, NSCoding { public required init?(coder: NSCoder) { } diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index ea3086152..124a60b50 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -283,6 +283,7 @@ B8A14D702589CE9000E70D57 /* KeyPairMigrationSuccessSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8A14D6F2589CE9000E70D57 /* KeyPairMigrationSuccessSheet.swift */; }; B8B26C8F234D629C004ED98C /* MentionCandidateSelectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8B26C8E234D629C004ED98C /* MentionCandidateSelectionView.swift */; }; B8B32021258B1A650020074B /* Contact.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8B32020258B1A650020074B /* Contact.swift */; }; + B8B32033258B235D0020074B /* Storage+Contacts.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8B32032258B235D0020074B /* Storage+Contacts.swift */; }; B8BB82A5238F627000BA5194 /* HomeVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8BB82A4238F627000BA5194 /* HomeVC.swift */; }; B8BC00C0257D90E30032E807 /* General.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8BC00BF257D90E30032E807 /* General.swift */; }; B8C2B2C82563685C00551B4D /* CircleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8C2B2C72563685C00551B4D /* CircleView.swift */; }; @@ -1377,6 +1378,7 @@ B8A14D6F2589CE9000E70D57 /* KeyPairMigrationSuccessSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyPairMigrationSuccessSheet.swift; sourceTree = ""; }; B8B26C8E234D629C004ED98C /* MentionCandidateSelectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MentionCandidateSelectionView.swift; sourceTree = ""; }; B8B32020258B1A650020074B /* Contact.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Contact.swift; sourceTree = ""; }; + B8B32032258B235D0020074B /* Storage+Contacts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Storage+Contacts.swift"; sourceTree = ""; }; B8B5BCEB2394D869003823C9 /* Button.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Button.swift; sourceTree = ""; }; B8BB829F238F322400BA5194 /* Colors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Colors.swift; sourceTree = ""; }; B8BB82A1238F356100BA5194 /* Values.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Values.swift; sourceTree = ""; }; @@ -2857,6 +2859,7 @@ C33FDAB9255A580100E217F9 /* OWSStorage+Subclass.h */, C33FDAB1255A580000E217F9 /* OWSStorage.m */, B8D8F1372566120F0092EF10 /* Storage+ClosedGroups.swift */, + B8B32032258B235D0020074B /* Storage+Contacts.swift */, B8D8F17625661AFA0092EF10 /* Storage+Jobs.swift */, B8D8F19225661BF80092EF10 /* Storage+Messaging.swift */, B8D8F18825661BA50092EF10 /* Storage+OpenGroups.swift */, @@ -5208,6 +5211,7 @@ B8856CEE256F1054001CE70E /* OWSAudioPlayer.m in Sources */, C32C5EDC256DF501003C73A2 /* YapDatabaseConnection+OWS.m in Sources */, C3BBE0762554CDA60050F1E3 /* Configuration.swift in Sources */, + B8B32033258B235D0020074B /* Storage+Contacts.swift in Sources */, B8856D69256F141F001CE70E /* OWSWindowManager.m in Sources */, C32C5F5F256DFD90003C73A2 /* TSInvalidIdentityKeyErrorMessage.m in Sources */, C3D9E3BE25676AD70040E4F3 /* TSAttachmentPointer.m in Sources */, From 9901f04dc337358901d23bbc50069eb92d81a4a9 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Fri, 18 Dec 2020 09:47:18 +1100 Subject: [PATCH 4/9] Implement contacts migration --- SessionMessagingKit/Contacts/Contact.swift | 20 +++++++ .../Database/Storage+Contacts.swift | 11 ++++ Signal.xcodeproj/project.pbxproj | 4 ++ .../Migration/ContactsMigration.swift | 57 +++++++++++++++++++ .../Migration/OWSDatabaseMigrationRunner.m | 4 +- SignalUtilitiesKit/Meta/SignalUtilitiesKit.h | 1 + 6 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 SignalUtilitiesKit/Database/Migration/ContactsMigration.swift diff --git a/SessionMessagingKit/Contacts/Contact.swift b/SessionMessagingKit/Contacts/Contact.swift index b70609e8f..c7ef87541 100644 --- a/SessionMessagingKit/Contacts/Contact.swift +++ b/SessionMessagingKit/Contacts/Contact.swift @@ -39,4 +39,24 @@ public class Contact : NSObject, NSCoding { // NSObject/NSCoding conformance is coder.encode(profilePictureEncryptionKey, forKey: "profilePictureEncryptionKey") coder.encode(threadID, forKey: "threadID") } + + // MARK: Equality + override public func isEqual(_ other: Any?) -> Bool { + guard let other = other as? Contact else { return false } + return sessionID == other.sessionID + } + + // MARK: Hashing + override public var hash: Int { // Override NSObject.hash and not Hashable.hashValue or Hashable.hash(into:) + return sessionID.hash + } + + // MARK: Description + override public var description: String { + if let displayName = displayName { + return displayName + } else { + return sessionID + } + } } diff --git a/SessionMessagingKit/Database/Storage+Contacts.swift b/SessionMessagingKit/Database/Storage+Contacts.swift index 5c124e602..7d6404e51 100644 --- a/SessionMessagingKit/Database/Storage+Contacts.swift +++ b/SessionMessagingKit/Database/Storage+Contacts.swift @@ -15,4 +15,15 @@ extension Storage { public func setContact(_ contact: Contact, using transaction: Any) { (transaction as! YapDatabaseReadWriteTransaction).setObject(contact, forKey: contact.sessionID, inCollection: Storage.contactCollection) } + + public func getAllContacts() -> Set { + var result: Set = [] + Storage.read { transaction in + transaction.enumerateRows(inCollection: Storage.contactCollection) { _, object, _, _ in + guard let contact = object as? Contact else { return } + result.insert(contact) + } + } + return result + } } diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index 124a60b50..4bb9eace2 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -284,6 +284,7 @@ B8B26C8F234D629C004ED98C /* MentionCandidateSelectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8B26C8E234D629C004ED98C /* MentionCandidateSelectionView.swift */; }; B8B32021258B1A650020074B /* Contact.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8B32020258B1A650020074B /* Contact.swift */; }; B8B32033258B235D0020074B /* Storage+Contacts.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8B32032258B235D0020074B /* Storage+Contacts.swift */; }; + B8B3204E258C15C80020074B /* ContactsMigration.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8B32044258C117C0020074B /* ContactsMigration.swift */; }; B8BB82A5238F627000BA5194 /* HomeVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8BB82A4238F627000BA5194 /* HomeVC.swift */; }; B8BC00C0257D90E30032E807 /* General.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8BC00BF257D90E30032E807 /* General.swift */; }; B8C2B2C82563685C00551B4D /* CircleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8C2B2C72563685C00551B4D /* CircleView.swift */; }; @@ -1379,6 +1380,7 @@ B8B26C8E234D629C004ED98C /* MentionCandidateSelectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MentionCandidateSelectionView.swift; sourceTree = ""; }; B8B32020258B1A650020074B /* Contact.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Contact.swift; sourceTree = ""; }; B8B32032258B235D0020074B /* Storage+Contacts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Storage+Contacts.swift"; sourceTree = ""; }; + B8B32044258C117C0020074B /* ContactsMigration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactsMigration.swift; sourceTree = ""; }; B8B5BCEB2394D869003823C9 /* Button.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Button.swift; sourceTree = ""; }; B8BB829F238F322400BA5194 /* Colors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Colors.swift; sourceTree = ""; }; B8BB82A1238F356100BA5194 /* Values.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Values.swift; sourceTree = ""; }; @@ -3073,6 +3075,7 @@ C379DCE82567330E0002D4EB /* Migration */ = { isa = PBXGroup; children = ( + B8B32044258C117C0020074B /* ContactsMigration.swift */, C38EF271255B6D79007E1867 /* OWSDatabaseMigration.h */, C38EF270255B6D79007E1867 /* OWSDatabaseMigration.m */, C38EF26F255B6D79007E1867 /* OWSDatabaseMigrationRunner.h */, @@ -5037,6 +5040,7 @@ C38EF3F2255B6DF7007E1867 /* DisappearingTimerConfigurationView.swift in Sources */, C38EF3F9255B6DF7007E1867 /* OWSLayerView.swift in Sources */, C33FDD03255A582000E217F9 /* WeakTimer.swift in Sources */, + B8B3204E258C15C80020074B /* ContactsMigration.swift in Sources */, C33FDD41255A582000E217F9 /* JobQueue.swift in Sources */, C38EF3B9255B6DE7007E1867 /* ImageEditorPinchGestureRecognizer.swift in Sources */, C33FDC98255A582000E217F9 /* SwiftSingletons.swift in Sources */, diff --git a/SignalUtilitiesKit/Database/Migration/ContactsMigration.swift b/SignalUtilitiesKit/Database/Migration/ContactsMigration.swift new file mode 100644 index 000000000..43fe4497f --- /dev/null +++ b/SignalUtilitiesKit/Database/Migration/ContactsMigration.swift @@ -0,0 +1,57 @@ + +@objc(SNContactsMigration) +public class ContactsMigration : OWSDatabaseMigration { + + @objc + class func migrationId() -> String { + return "004" + } + + override public func runUp(completion: @escaping OWSDatabaseMigrationCompletion) { + self.doMigrationAsync(completion: completion) + } + + private func doMigrationAsync(completion: @escaping OWSDatabaseMigrationCompletion) { + var contacts: Set = [] + Storage.write(with: { transaction in + // One-on-one chats + TSContactThread.enumerateCollectionObjects(with: transaction) { object, _ in + guard let thread = object as? TSContactThread else { return } + let sessionID = thread.contactIdentifier() + let contact = Contact(sessionID: sessionID) + if let profile = OWSUserProfile.fetch(uniqueId: sessionID, transaction: transaction) { + contact.displayName = profile.profileName + contact.profilePictureURL = profile.avatarUrlPath + contact.profilePictureFileName = profile.avatarFileName + contact.profilePictureEncryptionKey = profile.profileKey + } + contact.threadID = thread.uniqueId + contacts.insert(contact) + } + // Closed groups + TSGroupThread.enumerateCollectionObjects(with: transaction) { object, _ in + guard let thread = object as? TSGroupThread, thread.usesSharedSenderKeys else { return } + let memberSessionIDs = thread.groupModel.groupMemberIds + memberSessionIDs.forEach { memberSessionID in + guard !contacts.contains(where: { $0.sessionID == memberSessionID }) else { return } + let contact = Contact(sessionID: memberSessionID) + if let profile = OWSUserProfile.fetch(uniqueId: memberSessionID, transaction: transaction) { + contact.displayName = profile.profileName + contact.profilePictureURL = profile.avatarUrlPath + contact.profilePictureFileName = profile.avatarFileName + contact.profilePictureEncryptionKey = profile.profileKey + } + // At this point we know we don't have a one-on-one thread with this contact + contacts.insert(contact) + } + } + // Save + contacts.forEach { contact in + Storage.shared.setContact(contact, using: transaction) + } + self.save(with: transaction) // Intentionally capture self + }, completion: { + completion() + }) + } +} diff --git a/SignalUtilitiesKit/Database/Migration/OWSDatabaseMigrationRunner.m b/SignalUtilitiesKit/Database/Migration/OWSDatabaseMigrationRunner.m index 14a981e03..fd8ea2d2c 100644 --- a/SignalUtilitiesKit/Database/Migration/OWSDatabaseMigrationRunner.m +++ b/SignalUtilitiesKit/Database/Migration/OWSDatabaseMigrationRunner.m @@ -25,7 +25,9 @@ NS_ASSUME_NONNULL_BEGIN // This should all migrations which do NOT qualify as safeBlockingMigrations: - (NSArray *)allMigrations { - return @[]; + return @[ + [SNContactsMigration new] + ]; } - (void)assumeAllExistingMigrationsRun diff --git a/SignalUtilitiesKit/Meta/SignalUtilitiesKit.h b/SignalUtilitiesKit/Meta/SignalUtilitiesKit.h index 56dda12db..691dacfdb 100644 --- a/SignalUtilitiesKit/Meta/SignalUtilitiesKit.h +++ b/SignalUtilitiesKit/Meta/SignalUtilitiesKit.h @@ -16,6 +16,7 @@ FOUNDATION_EXPORT const unsigned char SignalUtilitiesKitVersionString[]; #import #import #import +#import #import #import #import From ef2bdf724e491224f4caee8f59f95aa348cd88a1 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Fri, 18 Dec 2020 09:49:32 +1100 Subject: [PATCH 5/9] Debug --- .../Database/Migration/ContactsMigration.swift | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/SignalUtilitiesKit/Database/Migration/ContactsMigration.swift b/SignalUtilitiesKit/Database/Migration/ContactsMigration.swift index 43fe4497f..7ee63dc93 100644 --- a/SignalUtilitiesKit/Database/Migration/ContactsMigration.swift +++ b/SignalUtilitiesKit/Database/Migration/ContactsMigration.swift @@ -4,7 +4,7 @@ public class ContactsMigration : OWSDatabaseMigration { @objc class func migrationId() -> String { - return "004" + return "005" } override public func runUp(completion: @escaping OWSDatabaseMigrationCompletion) { @@ -19,7 +19,13 @@ public class ContactsMigration : OWSDatabaseMigration { guard let thread = object as? TSContactThread else { return } let sessionID = thread.contactIdentifier() let contact = Contact(sessionID: sessionID) - if let profile = OWSUserProfile.fetch(uniqueId: sessionID, transaction: transaction) { + var profileOrNil: OWSUserProfile? = nil + if sessionID == getUserHexEncodedPublicKey() { + profileOrNil = OWSProfileManager.shared().getLocalUserProfile(with: transaction) + } else if let profile = OWSUserProfile.fetch(uniqueId: sessionID, transaction: transaction) { + profileOrNil = profile + } + if let profile = profileOrNil { contact.displayName = profile.profileName contact.profilePictureURL = profile.avatarUrlPath contact.profilePictureFileName = profile.avatarFileName From 0f01ac20ad135aabbed3f49e8f4dd6427257c067 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Fri, 18 Dec 2020 10:35:16 +1100 Subject: [PATCH 6/9] Start integrating contact model --- SessionMessagingKit/Contacts/Contact.swift | 19 ++++++++++++++++++ .../MessageReceiver+Handling.swift | 20 +++++++++++-------- Signal.xcodeproj/project.pbxproj | 16 +++++++-------- 3 files changed, 39 insertions(+), 16 deletions(-) diff --git a/SessionMessagingKit/Contacts/Contact.swift b/SessionMessagingKit/Contacts/Contact.swift index c7ef87541..f29e74c7f 100644 --- a/SessionMessagingKit/Contacts/Contact.swift +++ b/SessionMessagingKit/Contacts/Contact.swift @@ -3,6 +3,8 @@ public class Contact : NSObject, NSCoding { // NSObject/NSCoding conformance is needed for YapDatabase compatibility public let sessionID: String /// The display name of the contact. + /// + /// - Note: In open groups use `openGroupDisplayName`. public var displayName: String? /// The URL from which to fetch the contact's profile picture. public var profilePictureURL: String? @@ -13,6 +15,16 @@ public class Contact : NSObject, NSCoding { // NSObject/NSCoding conformance is /// The ID of the thread associated with this contact. public var threadID: String? + /// In open groups, where it's more likely that multiple users have the same name, we display a bit of the Session ID after + /// a user's display name for added context. + public var openGroupDisplayName: String? { + guard let displayName = displayName else { return nil } + let endIndex = sessionID.endIndex + let cutoffIndex = sessionID.index(endIndex, offsetBy: -8) + return "\(displayName) (...\(sessionID[cutoffIndex.. Date: Fri, 18 Dec 2020 15:17:23 +1100 Subject: [PATCH 7/9] Clean up SnodeAPI --- .../Sending & Receiving/Pollers/Poller.swift | 4 +- SessionSnodeKit/SnodeAPI.swift | 158 ++++++++++-------- 2 files changed, 92 insertions(+), 70 deletions(-) diff --git a/SessionMessagingKit/Sending & Receiving/Pollers/Poller.swift b/SessionMessagingKit/Sending & Receiving/Pollers/Poller.swift index dc0a2610c..6c338c0c4 100644 --- a/SessionMessagingKit/Sending & Receiving/Pollers/Poller.swift +++ b/SessionMessagingKit/Sending & Receiving/Pollers/Poller.swift @@ -45,7 +45,7 @@ public final class Poller : NSObject { // MARK: Private API private func setUpPolling() { guard isPolling else { return } - let _ = SnodeAPI.getSwarm(for: getUserHexEncodedPublicKey(), isForcedReload: true).then2 { [weak self] _ -> Promise in + let _ = SnodeAPI.getSwarm(for: getUserHexEncodedPublicKey()).then2 { [weak self] _ -> Promise in guard let strongSelf = self else { return Promise { $0.fulfill(()) } } strongSelf.usedSnodes.removeAll() let (promise, seal) = Promise.pending() @@ -109,7 +109,7 @@ public final class Poller : NSObject { if strongSelf.pollCount == Poller.maxPollCount { throw Error.pollLimitReached } else { - return withDelay(Poller.pollInterval, completionQueue: SnodeAPI.workQueue) { + return withDelay(Poller.pollInterval, completionQueue: DispatchQueue.main) { guard let strongSelf = self, strongSelf.isPolling else { return Promise { $0.fulfill(()) } } return strongSelf.poll(snode, seal: longTermSeal) } diff --git a/SessionSnodeKit/SnodeAPI.swift b/SessionSnodeKit/SnodeAPI.swift index f4527975b..eb0d8c312 100644 --- a/SessionSnodeKit/SnodeAPI.swift +++ b/SessionSnodeKit/SnodeAPI.swift @@ -3,7 +3,9 @@ import SessionUtilitiesKit @objc(SNSnodeAPI) public final class SnodeAPI : NSObject { - + private static var hasLoadedSnodePool = false + private static var loadedSwarms: Set = [] + /// - Note: Should only be accessed from `Threading.workQueue` to avoid race conditions. internal static var snodeFailureCount: [Snode:UInt] = [:] /// - Note: Should only be accessed from `Threading.workQueue` to avoid race conditions. @@ -11,12 +13,10 @@ public final class SnodeAPI : NSObject { /// - Note: Should only be accessed from `Threading.workQueue` to avoid race conditions. public static var swarmCache: [String:Set] = [:] - public static var workQueue: DispatchQueue { Threading.workQueue } // Just to make things fit with legacy code // MARK: Settings private static let maxRetryCount: UInt = 8 - private static let minimumSnodePoolCount = 64 - private static let minimumSwarmSnodeCount = 2 + private static let minimumSwarmSnodeCount = 3 private static let seedNodePool: Set = [ "https://storage.seed1.loki.network", "https://storage.seed3.loki.network", "https://public.loki.foundation" ] private static let snodeFailureThreshold = 3 private static let targetSwarmSnodeCount = 2 @@ -30,13 +30,13 @@ public final class SnodeAPI : NSObject { public enum Error : LocalizedError { case generic case clockOutOfSync - case randomSnodePoolUpdatingFailed + case snodePoolUpdatingFailed public var errorDescription: String? { switch self { case .generic: return "An error occurred." case .clockOutOfSync: return "Your clock is out of sync with the service node network." - case .randomSnodePoolUpdatingFailed: return "Failed to update random service node pool." + case .snodePoolUpdatingFailed: return "Failed to update random service node pool." } } } @@ -46,8 +46,68 @@ public final class SnodeAPI : NSObject { public typealias RawResponse = Any public typealias RawResponsePromise = Promise + // MARK: Snode Pool Interaction + private static func loadSnodePoolIfNeeded() { + guard !hasLoadedSnodePool else { return } + snodePool = SNSnodeKitConfiguration.shared.storage.getSnodePool() + hasLoadedSnodePool = true + } + + private static func setSnodePool(to newValue: Set, persist: Bool = true) { + #if DEBUG + dispatchPrecondition(condition: .onQueue(Threading.workQueue)) + #endif + snodePool = newValue + guard persist else { return } + SNSnodeKitConfiguration.shared.storage.writeSync { transaction in + SNSnodeKitConfiguration.shared.storage.setSnodePool(to: newValue, using: transaction) + } + } + + private static func dropSnodeFromSnodePool(_ snode: Snode) { + #if DEBUG + dispatchPrecondition(condition: .onQueue(Threading.workQueue)) + #endif + var snodePool = SnodeAPI.snodePool + snodePool.remove(snode) + setSnodePool(to: snodePool) + } + + @objc public static func clearSnodePool() { + snodePool.removeAll() + setSnodePool(to: []) + } + + // MARK: Swarm Interaction + private static func loadSwarmIfNeeded(for publicKey: String) { + guard !loadedSwarms.contains(publicKey) else { return } + swarmCache[publicKey] = SNSnodeKitConfiguration.shared.storage.getSwarm(for: publicKey) + loadedSwarms.insert(publicKey) + } + + private static func setSwarm(to newValue: Set, for publicKey: String, persist: Bool = true) { + #if DEBUG + dispatchPrecondition(condition: .onQueue(Threading.workQueue)) + #endif + swarmCache[publicKey] = newValue + guard persist else { return } + SNSnodeKitConfiguration.shared.storage.writeSync { transaction in + SNSnodeKitConfiguration.shared.storage.setSwarm(to: newValue, for: publicKey, using: transaction) + } + } + + public static func dropSnodeFromSwarmIfNeeded(_ snode: Snode, publicKey: String) { + #if DEBUG + dispatchPrecondition(condition: .onQueue(Threading.workQueue)) + #endif + let swarmOrNil = swarmCache[publicKey] + guard var swarm = swarmOrNil, let index = swarm.firstIndex(of: snode) else { return } + swarm.remove(at: index) + setSwarm(to: swarm, for: publicKey) + } + // MARK: Internal API - public static func invoke(_ method: Snode.Method, on snode: Snode, associatedWith publicKey: String, parameters: JSON) -> RawResponsePromise { + internal static func invoke(_ method: Snode.Method, on snode: Snode, associatedWith publicKey: String, parameters: JSON) -> RawResponsePromise { if useOnionRequests { return OnionRequestAPI.sendOnionRequest(to: snode, invoking: method, with: parameters, associatedWith: publicKey).map2 { $0 as Any } } else { @@ -58,14 +118,12 @@ public final class SnodeAPI : NSObject { } } } - + internal static func getRandomSnode() -> Promise { - if snodePool.count < minimumSnodePoolCount { - snodePool = SNSnodeKitConfiguration.shared.storage.getSnodePool() - } + loadSnodePoolIfNeeded() let now = Date() let isSnodePoolExpired = given(Storage.shared.getLastSnodePoolRefreshDate()) { now.timeIntervalSince($0) > 24 * 60 * 60 } ?? true - let isRefreshNeeded = (snodePool.count < minimumSnodePoolCount) || isSnodePoolExpired + let isRefreshNeeded = (snodePool.isEmpty || isSnodePoolExpired) if isRefreshNeeded { SNSnodeKitConfiguration.shared.storage.write { transaction in Storage.shared.setLastSnodePoolRefreshDate(to: now, using: transaction) @@ -86,28 +144,26 @@ public final class SnodeAPI : NSObject { Threading.workQueue.async { attempt(maxRetryCount: 4, recoveringOn: Threading.workQueue) { HTTP.execute(.post, url, parameters: parameters, useSSLURLSession: true).map2 { json -> Snode in - guard let intermediate = json["result"] as? JSON, let rawSnodes = intermediate["service_node_states"] as? [JSON] else { throw Error.randomSnodePoolUpdatingFailed } - snodePool = Set(rawSnodes.compactMap { rawSnode in + guard let intermediate = json["result"] as? JSON, let rawSnodes = intermediate["service_node_states"] as? [JSON] else { throw Error.snodePoolUpdatingFailed } + let snodePool: Set = Set(rawSnodes.compactMap { rawSnode in guard let address = rawSnode["public_ip"] as? String, let port = rawSnode["storage_port"] as? Int, let ed25519PublicKey = rawSnode["pubkey_ed25519"] as? String, let x25519PublicKey = rawSnode["pubkey_x25519"] as? String, address != "0.0.0.0" else { - SNLog("Failed to parse target from: \(rawSnode).") + SNLog("Failed to parse snode from: \(rawSnode).") return nil } return Snode(address: "https://\(address)", port: UInt16(port), publicKeySet: Snode.KeySet(ed25519Key: ed25519PublicKey, x25519Key: x25519PublicKey)) }) + setSnodePool(to: snodePool) // randomElement() uses the system's default random generator, which is cryptographically secure if !snodePool.isEmpty { return snodePool.randomElement()! } else { - throw Error.randomSnodePoolUpdatingFailed + throw Error.snodePoolUpdatingFailed } } }.done2 { snode in + SNLog("Successfully updated snode pool.") seal.fulfill(snode) - SNSnodeKitConfiguration.shared.storage.writeSync { transaction in - SNLog("Persisting snode pool to database.") - SNSnodeKitConfiguration.shared.storage.setSnodePool(to: SnodeAPI.snodePool, using: transaction) - } }.catch2 { error in SNLog("Failed to contact seed node at: \(target).") seal.reject(error) @@ -122,50 +178,15 @@ public final class SnodeAPI : NSObject { } } - internal static func dropSnodeFromSnodePool(_ snode: Snode) { - #if DEBUG - dispatchPrecondition(condition: .onQueue(Threading.workQueue)) - #endif - var snodePool = SnodeAPI.snodePool - snodePool.remove(snode) - SnodeAPI.snodePool = snodePool - SNSnodeKitConfiguration.shared.storage.writeSync { transaction in - SNSnodeKitConfiguration.shared.storage.setSnodePool(to: snodePool, using: transaction) - } - } - // MARK: Public API - @objc public static func clearSnodePool() { - snodePool.removeAll() - SNSnodeKitConfiguration.shared.storage.writeSync { transaction in - SNSnodeKitConfiguration.shared.storage.setSnodePool(to: [], using: transaction) - } - } - - public static func dropSnodeFromSwarmIfNeeded(_ snode: Snode, publicKey: String) { - #if DEBUG - dispatchPrecondition(condition: .onQueue(Threading.workQueue)) - #endif - let swarm = SnodeAPI.swarmCache[publicKey] - if var swarm = swarm, let index = swarm.firstIndex(of: snode) { - swarm.remove(at: index) - SnodeAPI.swarmCache[publicKey] = swarm - SNSnodeKitConfiguration.shared.storage.writeSync { transaction in - SNSnodeKitConfiguration.shared.storage.setSwarm(to: swarm, for: publicKey, using: transaction) - } - } - } - public static func getTargetSnodes(for publicKey: String) -> Promise<[Snode]> { // shuffled() uses the system's default random generator, which is cryptographically secure return getSwarm(for: publicKey).map2 { Array($0.shuffled().prefix(targetSwarmSnodeCount)) } } - public static func getSwarm(for publicKey: String, isForcedReload: Bool = false) -> Promise> { - if swarmCache[publicKey] == nil { - swarmCache[publicKey] = SNSnodeKitConfiguration.shared.storage.getSwarm(for: publicKey) - } - if let cachedSwarm = swarmCache[publicKey], cachedSwarm.count >= minimumSwarmSnodeCount && !isForcedReload { + public static func getSwarm(for publicKey: String) -> Promise> { + loadSwarmIfNeeded(for: publicKey) + if let cachedSwarm = swarmCache[publicKey], cachedSwarm.count >= minimumSwarmSnodeCount { return Promise> { $0.fulfill(cachedSwarm) } } else { SNLog("Getting swarm for: \((publicKey == SNSnodeKitConfiguration.shared.storage.getUserPublicKey()) ? "self" : publicKey).") @@ -176,23 +197,24 @@ public final class SnodeAPI : NSObject { } }.map2 { rawSnodes in let swarm = parseSnodes(from: rawSnodes) - swarmCache[publicKey] = swarm - SNSnodeKitConfiguration.shared.storage.writeSync { transaction in - SNSnodeKitConfiguration.shared.storage.setSwarm(to: swarm, for: publicKey, using: transaction) - } + setSwarm(to: swarm, for: publicKey) return swarm } } } - + public static func getRawMessages(from snode: Snode, associatedWith publicKey: String) -> RawResponsePromise { + let (promise, seal) = RawResponsePromise.pending() let storage = SNSnodeKitConfiguration.shared.storage - storage.writeSync { transaction in - storage.pruneLastMessageHashInfoIfExpired(for: snode, associatedWith: publicKey, using: transaction) + Threading.workQueue.async { + storage.writeSync { transaction in + storage.pruneLastMessageHashInfoIfExpired(for: snode, associatedWith: publicKey, using: transaction) + } + let lastHash = storage.getLastMessageHash(for: snode, associatedWith: publicKey) ?? "" + let parameters = [ "pubKey" : publicKey, "lastHash" : lastHash ] + invoke(.getMessages, on: snode, associatedWith: publicKey, parameters: parameters).done2 { seal.fulfill($0) }.catch2 { seal.reject($0) } } - let lastHash = storage.getLastMessageHash(for: snode, associatedWith: publicKey) ?? "" - let parameters = [ "pubKey" : publicKey, "lastHash" : lastHash ] - return invoke(.getMessages, on: snode, associatedWith: publicKey, parameters: parameters) + return promise } public static func getMessages(for publicKey: String) -> Promise> { From 6e673945c5f1bb028d703d24d48dbb3556a57d1c Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Fri, 18 Dec 2020 15:37:29 +1100 Subject: [PATCH 8/9] Re-organize files --- SessionUtilitiesKit/{ => Crypto}/AESGCM.swift | 0 .../{ => Crypto}/Data+SecureRandom.swift | 0 .../{ => Crypto}/DiffieHellman.swift | 0 .../{ => Crypto}/ECKeyPair+Hexadecimal.swift | 0 .../{ => Crypto}/Mnemonic.swift | 0 .../{ => Database}/OWSFileSystem.h | 0 .../{ => Database}/OWSFileSystem.m | 3 +- .../OWSPrimaryStorageProtocol.swift | 0 .../{ => Database}/SSKKeychainStorage.swift | 0 .../{ => Database}/Storage.swift | 0 .../{ => Database}/TSYapDatabaseObject.h | 0 .../{ => Database}/TSYapDatabaseObject.m | 0 .../{ => General}/AppContext.h | 0 .../{ => General}/AppContext.m | 0 .../{ => General}/Array+Description.swift | 0 .../{ => General}/BuildConfiguration.swift | 0 .../Dictionary+Description.swift | 0 .../{ => General}/General.swift | 0 .../{ => General}/LKUserDefaults.swift | 0 .../{ => General}/LRUCache.swift | 0 .../{ => General}/Logging.swift | 0 .../{ => General}/NSArray+Functional.h | 0 .../{ => General}/NSArray+Functional.m | 0 .../{ => General}/NSDate+Timestamp.h | 0 .../{ => General}/NSDate+Timestamp.mm | 0 .../{ => General}/NSNotificationCenter+OWS.h | 0 .../{ => General}/NSNotificationCenter+OWS.m | 0 .../NSRegularExpression+SSK.swift | 0 .../{ => General}/NSString+SSK.h | 0 .../{ => General}/NSString+SSK.m | 0 .../{ => General}/NSTimer+Proxying.h | 0 .../{ => General}/NSTimer+Proxying.m | 0 .../{ => General}/NSUserDefaults+OWS.h | 0 .../{ => General}/NSUserDefaults+OWS.m | 0 SessionUtilitiesKit/{ => General}/OWSMath.h | 0 .../{ => General}/String+SSK.swift | 0 .../{ => General}/String+Trimming.swift | 0 .../UIDevice+featureSupport.swift | 0 .../{ => General}/UIView+OWS.h | 0 .../{ => General}/UIView+OWS.m | 0 SessionUtilitiesKit/{ => General}/Weak.swift | 0 SessionUtilitiesKit/{ => Media}/DataSource.h | 0 SessionUtilitiesKit/{ => Media}/DataSource.m | 0 .../{ => Media}/MIMETypeUtil.h | 0 .../{ => Media}/MIMETypeUtil.m | 0 .../{ => Media}/NSData+Image.h | 0 .../{ => Media}/NSData+Image.m | 0 .../{ => Media}/OWSMediaUtils.swift | 0 SessionUtilitiesKit/{ => Media}/UIImage+OWS.h | 0 SessionUtilitiesKit/{ => Media}/UIImage+OWS.m | 0 .../{ => Messaging}/LKGroupUtilities.h | 0 .../{ => Messaging}/LKGroupUtilities.m | 0 .../{ => Networking}/ContentProxy.swift | 0 .../{ => Networking}/HTTP.swift | 0 .../{ => Networking}/JSON.swift | 0 .../ProxiedContentDownloader.swift | 0 .../{ => Networking}/TSRequest.h | 0 .../{ => Networking}/TSRequest.m | 0 .../AnyPromise+Conversion.swift | 0 .../{ => PromiseKit}/Promise+Delaying.swift | 0 .../{ => PromiseKit}/Promise+Retaining.swift | 3 +- .../{ => PromiseKit}/Promise+Retrying.swift | 0 Signal.xcodeproj/project.pbxproj | 190 +++++++++++------- 63 files changed, 124 insertions(+), 72 deletions(-) rename SessionUtilitiesKit/{ => Crypto}/AESGCM.swift (100%) rename SessionUtilitiesKit/{ => Crypto}/Data+SecureRandom.swift (100%) rename SessionUtilitiesKit/{ => Crypto}/DiffieHellman.swift (100%) rename SessionUtilitiesKit/{ => Crypto}/ECKeyPair+Hexadecimal.swift (100%) rename SessionUtilitiesKit/{ => Crypto}/Mnemonic.swift (100%) rename SessionUtilitiesKit/{ => Database}/OWSFileSystem.h (100%) rename SessionUtilitiesKit/{ => Database}/OWSFileSystem.m (98%) rename SessionUtilitiesKit/{ => Database}/OWSPrimaryStorageProtocol.swift (100%) rename SessionUtilitiesKit/{ => Database}/SSKKeychainStorage.swift (100%) rename SessionUtilitiesKit/{ => Database}/Storage.swift (100%) rename SessionUtilitiesKit/{ => Database}/TSYapDatabaseObject.h (100%) rename SessionUtilitiesKit/{ => Database}/TSYapDatabaseObject.m (100%) rename SessionUtilitiesKit/{ => General}/AppContext.h (100%) rename SessionUtilitiesKit/{ => General}/AppContext.m (100%) rename SessionUtilitiesKit/{ => General}/Array+Description.swift (100%) rename SessionUtilitiesKit/{ => General}/BuildConfiguration.swift (100%) rename SessionUtilitiesKit/{ => General}/Dictionary+Description.swift (100%) rename SessionUtilitiesKit/{ => General}/General.swift (100%) rename SessionUtilitiesKit/{ => General}/LKUserDefaults.swift (100%) rename SessionUtilitiesKit/{ => General}/LRUCache.swift (100%) rename SessionUtilitiesKit/{ => General}/Logging.swift (100%) rename SessionUtilitiesKit/{ => General}/NSArray+Functional.h (100%) rename SessionUtilitiesKit/{ => General}/NSArray+Functional.m (100%) rename SessionUtilitiesKit/{ => General}/NSDate+Timestamp.h (100%) rename SessionUtilitiesKit/{ => General}/NSDate+Timestamp.mm (100%) rename SessionUtilitiesKit/{ => General}/NSNotificationCenter+OWS.h (100%) rename SessionUtilitiesKit/{ => General}/NSNotificationCenter+OWS.m (100%) rename SessionUtilitiesKit/{ => General}/NSRegularExpression+SSK.swift (100%) rename SessionUtilitiesKit/{ => General}/NSString+SSK.h (100%) rename SessionUtilitiesKit/{ => General}/NSString+SSK.m (100%) rename SessionUtilitiesKit/{ => General}/NSTimer+Proxying.h (100%) rename SessionUtilitiesKit/{ => General}/NSTimer+Proxying.m (100%) rename SessionUtilitiesKit/{ => General}/NSUserDefaults+OWS.h (100%) rename SessionUtilitiesKit/{ => General}/NSUserDefaults+OWS.m (100%) rename SessionUtilitiesKit/{ => General}/OWSMath.h (100%) rename SessionUtilitiesKit/{ => General}/String+SSK.swift (100%) rename SessionUtilitiesKit/{ => General}/String+Trimming.swift (100%) rename SessionUtilitiesKit/{ => General}/UIDevice+featureSupport.swift (100%) rename SessionUtilitiesKit/{ => General}/UIView+OWS.h (100%) rename SessionUtilitiesKit/{ => General}/UIView+OWS.m (100%) rename SessionUtilitiesKit/{ => General}/Weak.swift (100%) rename SessionUtilitiesKit/{ => Media}/DataSource.h (100%) rename SessionUtilitiesKit/{ => Media}/DataSource.m (100%) rename SessionUtilitiesKit/{ => Media}/MIMETypeUtil.h (100%) rename SessionUtilitiesKit/{ => Media}/MIMETypeUtil.m (100%) rename SessionUtilitiesKit/{ => Media}/NSData+Image.h (100%) rename SessionUtilitiesKit/{ => Media}/NSData+Image.m (100%) rename SessionUtilitiesKit/{ => Media}/OWSMediaUtils.swift (100%) rename SessionUtilitiesKit/{ => Media}/UIImage+OWS.h (100%) rename SessionUtilitiesKit/{ => Media}/UIImage+OWS.m (100%) rename SessionUtilitiesKit/{ => Messaging}/LKGroupUtilities.h (100%) rename SessionUtilitiesKit/{ => Messaging}/LKGroupUtilities.m (100%) rename SessionUtilitiesKit/{ => Networking}/ContentProxy.swift (100%) rename SessionUtilitiesKit/{ => Networking}/HTTP.swift (100%) rename SessionUtilitiesKit/{ => Networking}/JSON.swift (100%) rename SessionUtilitiesKit/{ => Networking}/ProxiedContentDownloader.swift (100%) rename SessionUtilitiesKit/{ => Networking}/TSRequest.h (100%) rename SessionUtilitiesKit/{ => Networking}/TSRequest.m (100%) rename SessionUtilitiesKit/{ => PromiseKit}/AnyPromise+Conversion.swift (100%) rename SessionUtilitiesKit/{ => PromiseKit}/Promise+Delaying.swift (100%) rename SessionUtilitiesKit/{ => PromiseKit}/Promise+Retaining.swift (95%) rename SessionUtilitiesKit/{ => PromiseKit}/Promise+Retrying.swift (100%) diff --git a/SessionUtilitiesKit/AESGCM.swift b/SessionUtilitiesKit/Crypto/AESGCM.swift similarity index 100% rename from SessionUtilitiesKit/AESGCM.swift rename to SessionUtilitiesKit/Crypto/AESGCM.swift diff --git a/SessionUtilitiesKit/Data+SecureRandom.swift b/SessionUtilitiesKit/Crypto/Data+SecureRandom.swift similarity index 100% rename from SessionUtilitiesKit/Data+SecureRandom.swift rename to SessionUtilitiesKit/Crypto/Data+SecureRandom.swift diff --git a/SessionUtilitiesKit/DiffieHellman.swift b/SessionUtilitiesKit/Crypto/DiffieHellman.swift similarity index 100% rename from SessionUtilitiesKit/DiffieHellman.swift rename to SessionUtilitiesKit/Crypto/DiffieHellman.swift diff --git a/SessionUtilitiesKit/ECKeyPair+Hexadecimal.swift b/SessionUtilitiesKit/Crypto/ECKeyPair+Hexadecimal.swift similarity index 100% rename from SessionUtilitiesKit/ECKeyPair+Hexadecimal.swift rename to SessionUtilitiesKit/Crypto/ECKeyPair+Hexadecimal.swift diff --git a/SessionUtilitiesKit/Mnemonic.swift b/SessionUtilitiesKit/Crypto/Mnemonic.swift similarity index 100% rename from SessionUtilitiesKit/Mnemonic.swift rename to SessionUtilitiesKit/Crypto/Mnemonic.swift diff --git a/SessionUtilitiesKit/OWSFileSystem.h b/SessionUtilitiesKit/Database/OWSFileSystem.h similarity index 100% rename from SessionUtilitiesKit/OWSFileSystem.h rename to SessionUtilitiesKit/Database/OWSFileSystem.h diff --git a/SessionUtilitiesKit/OWSFileSystem.m b/SessionUtilitiesKit/Database/OWSFileSystem.m similarity index 98% rename from SessionUtilitiesKit/OWSFileSystem.m rename to SessionUtilitiesKit/Database/OWSFileSystem.m index 1534f7a0b..bd3eae2a1 100644 --- a/SessionUtilitiesKit/OWSFileSystem.m +++ b/SessionUtilitiesKit/Database/OWSFileSystem.m @@ -31,8 +31,7 @@ NS_ASSUME_NONNULL_BEGIN + (BOOL)protectFileOrFolderAtPath:(NSString *)path { - return - [self protectFileOrFolderAtPath:path fileProtectionType:NSFileProtectionCompleteUntilFirstUserAuthentication]; + return [self protectFileOrFolderAtPath:path fileProtectionType:NSFileProtectionCompleteUntilFirstUserAuthentication]; } + (BOOL)protectFileOrFolderAtPath:(NSString *)path fileProtectionType:(NSFileProtectionType)fileProtectionType diff --git a/SessionUtilitiesKit/OWSPrimaryStorageProtocol.swift b/SessionUtilitiesKit/Database/OWSPrimaryStorageProtocol.swift similarity index 100% rename from SessionUtilitiesKit/OWSPrimaryStorageProtocol.swift rename to SessionUtilitiesKit/Database/OWSPrimaryStorageProtocol.swift diff --git a/SessionUtilitiesKit/SSKKeychainStorage.swift b/SessionUtilitiesKit/Database/SSKKeychainStorage.swift similarity index 100% rename from SessionUtilitiesKit/SSKKeychainStorage.swift rename to SessionUtilitiesKit/Database/SSKKeychainStorage.swift diff --git a/SessionUtilitiesKit/Storage.swift b/SessionUtilitiesKit/Database/Storage.swift similarity index 100% rename from SessionUtilitiesKit/Storage.swift rename to SessionUtilitiesKit/Database/Storage.swift diff --git a/SessionUtilitiesKit/TSYapDatabaseObject.h b/SessionUtilitiesKit/Database/TSYapDatabaseObject.h similarity index 100% rename from SessionUtilitiesKit/TSYapDatabaseObject.h rename to SessionUtilitiesKit/Database/TSYapDatabaseObject.h diff --git a/SessionUtilitiesKit/TSYapDatabaseObject.m b/SessionUtilitiesKit/Database/TSYapDatabaseObject.m similarity index 100% rename from SessionUtilitiesKit/TSYapDatabaseObject.m rename to SessionUtilitiesKit/Database/TSYapDatabaseObject.m diff --git a/SessionUtilitiesKit/AppContext.h b/SessionUtilitiesKit/General/AppContext.h similarity index 100% rename from SessionUtilitiesKit/AppContext.h rename to SessionUtilitiesKit/General/AppContext.h diff --git a/SessionUtilitiesKit/AppContext.m b/SessionUtilitiesKit/General/AppContext.m similarity index 100% rename from SessionUtilitiesKit/AppContext.m rename to SessionUtilitiesKit/General/AppContext.m diff --git a/SessionUtilitiesKit/Array+Description.swift b/SessionUtilitiesKit/General/Array+Description.swift similarity index 100% rename from SessionUtilitiesKit/Array+Description.swift rename to SessionUtilitiesKit/General/Array+Description.swift diff --git a/SessionUtilitiesKit/BuildConfiguration.swift b/SessionUtilitiesKit/General/BuildConfiguration.swift similarity index 100% rename from SessionUtilitiesKit/BuildConfiguration.swift rename to SessionUtilitiesKit/General/BuildConfiguration.swift diff --git a/SessionUtilitiesKit/Dictionary+Description.swift b/SessionUtilitiesKit/General/Dictionary+Description.swift similarity index 100% rename from SessionUtilitiesKit/Dictionary+Description.swift rename to SessionUtilitiesKit/General/Dictionary+Description.swift diff --git a/SessionUtilitiesKit/General.swift b/SessionUtilitiesKit/General/General.swift similarity index 100% rename from SessionUtilitiesKit/General.swift rename to SessionUtilitiesKit/General/General.swift diff --git a/SessionUtilitiesKit/LKUserDefaults.swift b/SessionUtilitiesKit/General/LKUserDefaults.swift similarity index 100% rename from SessionUtilitiesKit/LKUserDefaults.swift rename to SessionUtilitiesKit/General/LKUserDefaults.swift diff --git a/SessionUtilitiesKit/LRUCache.swift b/SessionUtilitiesKit/General/LRUCache.swift similarity index 100% rename from SessionUtilitiesKit/LRUCache.swift rename to SessionUtilitiesKit/General/LRUCache.swift diff --git a/SessionUtilitiesKit/Logging.swift b/SessionUtilitiesKit/General/Logging.swift similarity index 100% rename from SessionUtilitiesKit/Logging.swift rename to SessionUtilitiesKit/General/Logging.swift diff --git a/SessionUtilitiesKit/NSArray+Functional.h b/SessionUtilitiesKit/General/NSArray+Functional.h similarity index 100% rename from SessionUtilitiesKit/NSArray+Functional.h rename to SessionUtilitiesKit/General/NSArray+Functional.h diff --git a/SessionUtilitiesKit/NSArray+Functional.m b/SessionUtilitiesKit/General/NSArray+Functional.m similarity index 100% rename from SessionUtilitiesKit/NSArray+Functional.m rename to SessionUtilitiesKit/General/NSArray+Functional.m diff --git a/SessionUtilitiesKit/NSDate+Timestamp.h b/SessionUtilitiesKit/General/NSDate+Timestamp.h similarity index 100% rename from SessionUtilitiesKit/NSDate+Timestamp.h rename to SessionUtilitiesKit/General/NSDate+Timestamp.h diff --git a/SessionUtilitiesKit/NSDate+Timestamp.mm b/SessionUtilitiesKit/General/NSDate+Timestamp.mm similarity index 100% rename from SessionUtilitiesKit/NSDate+Timestamp.mm rename to SessionUtilitiesKit/General/NSDate+Timestamp.mm diff --git a/SessionUtilitiesKit/NSNotificationCenter+OWS.h b/SessionUtilitiesKit/General/NSNotificationCenter+OWS.h similarity index 100% rename from SessionUtilitiesKit/NSNotificationCenter+OWS.h rename to SessionUtilitiesKit/General/NSNotificationCenter+OWS.h diff --git a/SessionUtilitiesKit/NSNotificationCenter+OWS.m b/SessionUtilitiesKit/General/NSNotificationCenter+OWS.m similarity index 100% rename from SessionUtilitiesKit/NSNotificationCenter+OWS.m rename to SessionUtilitiesKit/General/NSNotificationCenter+OWS.m diff --git a/SessionUtilitiesKit/NSRegularExpression+SSK.swift b/SessionUtilitiesKit/General/NSRegularExpression+SSK.swift similarity index 100% rename from SessionUtilitiesKit/NSRegularExpression+SSK.swift rename to SessionUtilitiesKit/General/NSRegularExpression+SSK.swift diff --git a/SessionUtilitiesKit/NSString+SSK.h b/SessionUtilitiesKit/General/NSString+SSK.h similarity index 100% rename from SessionUtilitiesKit/NSString+SSK.h rename to SessionUtilitiesKit/General/NSString+SSK.h diff --git a/SessionUtilitiesKit/NSString+SSK.m b/SessionUtilitiesKit/General/NSString+SSK.m similarity index 100% rename from SessionUtilitiesKit/NSString+SSK.m rename to SessionUtilitiesKit/General/NSString+SSK.m diff --git a/SessionUtilitiesKit/NSTimer+Proxying.h b/SessionUtilitiesKit/General/NSTimer+Proxying.h similarity index 100% rename from SessionUtilitiesKit/NSTimer+Proxying.h rename to SessionUtilitiesKit/General/NSTimer+Proxying.h diff --git a/SessionUtilitiesKit/NSTimer+Proxying.m b/SessionUtilitiesKit/General/NSTimer+Proxying.m similarity index 100% rename from SessionUtilitiesKit/NSTimer+Proxying.m rename to SessionUtilitiesKit/General/NSTimer+Proxying.m diff --git a/SessionUtilitiesKit/NSUserDefaults+OWS.h b/SessionUtilitiesKit/General/NSUserDefaults+OWS.h similarity index 100% rename from SessionUtilitiesKit/NSUserDefaults+OWS.h rename to SessionUtilitiesKit/General/NSUserDefaults+OWS.h diff --git a/SessionUtilitiesKit/NSUserDefaults+OWS.m b/SessionUtilitiesKit/General/NSUserDefaults+OWS.m similarity index 100% rename from SessionUtilitiesKit/NSUserDefaults+OWS.m rename to SessionUtilitiesKit/General/NSUserDefaults+OWS.m diff --git a/SessionUtilitiesKit/OWSMath.h b/SessionUtilitiesKit/General/OWSMath.h similarity index 100% rename from SessionUtilitiesKit/OWSMath.h rename to SessionUtilitiesKit/General/OWSMath.h diff --git a/SessionUtilitiesKit/String+SSK.swift b/SessionUtilitiesKit/General/String+SSK.swift similarity index 100% rename from SessionUtilitiesKit/String+SSK.swift rename to SessionUtilitiesKit/General/String+SSK.swift diff --git a/SessionUtilitiesKit/String+Trimming.swift b/SessionUtilitiesKit/General/String+Trimming.swift similarity index 100% rename from SessionUtilitiesKit/String+Trimming.swift rename to SessionUtilitiesKit/General/String+Trimming.swift diff --git a/SessionUtilitiesKit/UIDevice+featureSupport.swift b/SessionUtilitiesKit/General/UIDevice+featureSupport.swift similarity index 100% rename from SessionUtilitiesKit/UIDevice+featureSupport.swift rename to SessionUtilitiesKit/General/UIDevice+featureSupport.swift diff --git a/SessionUtilitiesKit/UIView+OWS.h b/SessionUtilitiesKit/General/UIView+OWS.h similarity index 100% rename from SessionUtilitiesKit/UIView+OWS.h rename to SessionUtilitiesKit/General/UIView+OWS.h diff --git a/SessionUtilitiesKit/UIView+OWS.m b/SessionUtilitiesKit/General/UIView+OWS.m similarity index 100% rename from SessionUtilitiesKit/UIView+OWS.m rename to SessionUtilitiesKit/General/UIView+OWS.m diff --git a/SessionUtilitiesKit/Weak.swift b/SessionUtilitiesKit/General/Weak.swift similarity index 100% rename from SessionUtilitiesKit/Weak.swift rename to SessionUtilitiesKit/General/Weak.swift diff --git a/SessionUtilitiesKit/DataSource.h b/SessionUtilitiesKit/Media/DataSource.h similarity index 100% rename from SessionUtilitiesKit/DataSource.h rename to SessionUtilitiesKit/Media/DataSource.h diff --git a/SessionUtilitiesKit/DataSource.m b/SessionUtilitiesKit/Media/DataSource.m similarity index 100% rename from SessionUtilitiesKit/DataSource.m rename to SessionUtilitiesKit/Media/DataSource.m diff --git a/SessionUtilitiesKit/MIMETypeUtil.h b/SessionUtilitiesKit/Media/MIMETypeUtil.h similarity index 100% rename from SessionUtilitiesKit/MIMETypeUtil.h rename to SessionUtilitiesKit/Media/MIMETypeUtil.h diff --git a/SessionUtilitiesKit/MIMETypeUtil.m b/SessionUtilitiesKit/Media/MIMETypeUtil.m similarity index 100% rename from SessionUtilitiesKit/MIMETypeUtil.m rename to SessionUtilitiesKit/Media/MIMETypeUtil.m diff --git a/SessionUtilitiesKit/NSData+Image.h b/SessionUtilitiesKit/Media/NSData+Image.h similarity index 100% rename from SessionUtilitiesKit/NSData+Image.h rename to SessionUtilitiesKit/Media/NSData+Image.h diff --git a/SessionUtilitiesKit/NSData+Image.m b/SessionUtilitiesKit/Media/NSData+Image.m similarity index 100% rename from SessionUtilitiesKit/NSData+Image.m rename to SessionUtilitiesKit/Media/NSData+Image.m diff --git a/SessionUtilitiesKit/OWSMediaUtils.swift b/SessionUtilitiesKit/Media/OWSMediaUtils.swift similarity index 100% rename from SessionUtilitiesKit/OWSMediaUtils.swift rename to SessionUtilitiesKit/Media/OWSMediaUtils.swift diff --git a/SessionUtilitiesKit/UIImage+OWS.h b/SessionUtilitiesKit/Media/UIImage+OWS.h similarity index 100% rename from SessionUtilitiesKit/UIImage+OWS.h rename to SessionUtilitiesKit/Media/UIImage+OWS.h diff --git a/SessionUtilitiesKit/UIImage+OWS.m b/SessionUtilitiesKit/Media/UIImage+OWS.m similarity index 100% rename from SessionUtilitiesKit/UIImage+OWS.m rename to SessionUtilitiesKit/Media/UIImage+OWS.m diff --git a/SessionUtilitiesKit/LKGroupUtilities.h b/SessionUtilitiesKit/Messaging/LKGroupUtilities.h similarity index 100% rename from SessionUtilitiesKit/LKGroupUtilities.h rename to SessionUtilitiesKit/Messaging/LKGroupUtilities.h diff --git a/SessionUtilitiesKit/LKGroupUtilities.m b/SessionUtilitiesKit/Messaging/LKGroupUtilities.m similarity index 100% rename from SessionUtilitiesKit/LKGroupUtilities.m rename to SessionUtilitiesKit/Messaging/LKGroupUtilities.m diff --git a/SessionUtilitiesKit/ContentProxy.swift b/SessionUtilitiesKit/Networking/ContentProxy.swift similarity index 100% rename from SessionUtilitiesKit/ContentProxy.swift rename to SessionUtilitiesKit/Networking/ContentProxy.swift diff --git a/SessionUtilitiesKit/HTTP.swift b/SessionUtilitiesKit/Networking/HTTP.swift similarity index 100% rename from SessionUtilitiesKit/HTTP.swift rename to SessionUtilitiesKit/Networking/HTTP.swift diff --git a/SessionUtilitiesKit/JSON.swift b/SessionUtilitiesKit/Networking/JSON.swift similarity index 100% rename from SessionUtilitiesKit/JSON.swift rename to SessionUtilitiesKit/Networking/JSON.swift diff --git a/SessionUtilitiesKit/ProxiedContentDownloader.swift b/SessionUtilitiesKit/Networking/ProxiedContentDownloader.swift similarity index 100% rename from SessionUtilitiesKit/ProxiedContentDownloader.swift rename to SessionUtilitiesKit/Networking/ProxiedContentDownloader.swift diff --git a/SessionUtilitiesKit/TSRequest.h b/SessionUtilitiesKit/Networking/TSRequest.h similarity index 100% rename from SessionUtilitiesKit/TSRequest.h rename to SessionUtilitiesKit/Networking/TSRequest.h diff --git a/SessionUtilitiesKit/TSRequest.m b/SessionUtilitiesKit/Networking/TSRequest.m similarity index 100% rename from SessionUtilitiesKit/TSRequest.m rename to SessionUtilitiesKit/Networking/TSRequest.m diff --git a/SessionUtilitiesKit/AnyPromise+Conversion.swift b/SessionUtilitiesKit/PromiseKit/AnyPromise+Conversion.swift similarity index 100% rename from SessionUtilitiesKit/AnyPromise+Conversion.swift rename to SessionUtilitiesKit/PromiseKit/AnyPromise+Conversion.swift diff --git a/SessionUtilitiesKit/Promise+Delaying.swift b/SessionUtilitiesKit/PromiseKit/Promise+Delaying.swift similarity index 100% rename from SessionUtilitiesKit/Promise+Delaying.swift rename to SessionUtilitiesKit/PromiseKit/Promise+Delaying.swift diff --git a/SessionUtilitiesKit/Promise+Retaining.swift b/SessionUtilitiesKit/PromiseKit/Promise+Retaining.swift similarity index 95% rename from SessionUtilitiesKit/Promise+Retaining.swift rename to SessionUtilitiesKit/PromiseKit/Promise+Retaining.swift index fc1ef5d90..cb7262521 100644 --- a/SessionUtilitiesKit/Promise+Retaining.swift +++ b/SessionUtilitiesKit/PromiseKit/Promise+Retaining.swift @@ -2,8 +2,7 @@ import PromiseKit public extension AnyPromise { - @objc - func retainUntilComplete() { + @objc func retainUntilComplete() { var retainCycle: AnyPromise? = self _ = self.ensure { assert(retainCycle != nil) diff --git a/SessionUtilitiesKit/Promise+Retrying.swift b/SessionUtilitiesKit/PromiseKit/Promise+Retrying.swift similarity index 100% rename from SessionUtilitiesKit/Promise+Retrying.swift rename to SessionUtilitiesKit/PromiseKit/Promise+Retrying.swift diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index e71887d37..cd70f99dd 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -877,7 +877,6 @@ C3D90A1125773888002C9DF5 /* Colors.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C39DD28724F3318C008590FC /* Colors.xcassets */; }; C3D90A5C25773A25002C9DF5 /* SessionUtilitiesKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3C2A679255388CC00C340D1 /* SessionUtilitiesKit.framework */; }; C3D90A7A25773A93002C9DF5 /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3F0A5EB255C970D007BE2A3 /* Configuration.swift */; }; - C3D90A8325774A68002C9DF5 /* OWSPrimaryStorageProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3D9E41E25676C870040E4F3 /* OWSPrimaryStorageProtocol.swift */; }; C3D9E35525675EE10040E4F3 /* MIMETypeUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDB41255A580C00E217F9 /* MIMETypeUtil.m */; }; C3D9E35E25675F640040E4F3 /* OWSFileSystem.m in Sources */ = {isa = PBXBuildFile; fileRef = C33FDA8E255A57FD00E217F9 /* OWSFileSystem.m */; }; C3D9E379256760340040E4F3 /* MIMETypeUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = C33FDAFC255A580600E217F9 /* MIMETypeUtil.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -1700,14 +1699,14 @@ C38EF226255B6D5D007E1867 /* ShareViewDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ShareViewDelegate.swift; path = SignalUtilitiesKit/Utilities/ShareViewDelegate.swift; sourceTree = SOURCE_ROOT; }; C38EF227255B6D5D007E1867 /* OWSVideoPlayer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = OWSVideoPlayer.swift; path = SignalUtilitiesKit/Utilities/OWSVideoPlayer.swift; sourceTree = SOURCE_ROOT; }; C38EF236255B6D65007E1867 /* UIViewController+OWS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIViewController+OWS.h"; path = "SignalUtilitiesKit/UI/UIViewController+OWS.h"; sourceTree = SOURCE_ROOT; }; - C38EF237255B6D65007E1867 /* UIDevice+featureSupport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIDevice+featureSupport.swift"; path = "SessionUtilitiesKit/UIDevice+featureSupport.swift"; sourceTree = SOURCE_ROOT; }; + C38EF237255B6D65007E1867 /* UIDevice+featureSupport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIDevice+featureSupport.swift"; path = "SessionUtilitiesKit/General/UIDevice+featureSupport.swift"; sourceTree = SOURCE_ROOT; }; C38EF238255B6D66007E1867 /* UIFont+OWS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIFont+OWS.m"; path = "SignalUtilitiesKit/UI/UIFont+OWS.m"; sourceTree = SOURCE_ROOT; }; C38EF239255B6D66007E1867 /* UIFont+OWS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIFont+OWS.h"; path = "SignalUtilitiesKit/UI/UIFont+OWS.h"; sourceTree = SOURCE_ROOT; }; C38EF23A255B6D66007E1867 /* NSAttributedString+OWS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSAttributedString+OWS.m"; path = "SignalUtilitiesKit/Utilities/NSAttributedString+OWS.m"; sourceTree = SOURCE_ROOT; }; C38EF23B255B6D66007E1867 /* UIViewController+OWS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIViewController+OWS.m"; path = "SignalUtilitiesKit/UI/UIViewController+OWS.m"; sourceTree = SOURCE_ROOT; }; C38EF23C255B6D66007E1867 /* UIColor+OWS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIColor+OWS.h"; path = "SignalUtilitiesKit/UI/UIColor+OWS.h"; sourceTree = SOURCE_ROOT; }; - C38EF23D255B6D66007E1867 /* UIView+OWS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIView+OWS.h"; path = "SessionUtilitiesKit/UIView+OWS.h"; sourceTree = SOURCE_ROOT; }; - C38EF23E255B6D66007E1867 /* UIView+OWS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIView+OWS.m"; path = "SessionUtilitiesKit/UIView+OWS.m"; sourceTree = SOURCE_ROOT; }; + C38EF23D255B6D66007E1867 /* UIView+OWS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIView+OWS.h"; path = "SessionUtilitiesKit/General/UIView+OWS.h"; sourceTree = SOURCE_ROOT; }; + C38EF23E255B6D66007E1867 /* UIView+OWS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIView+OWS.m"; path = "SessionUtilitiesKit/General/UIView+OWS.m"; sourceTree = SOURCE_ROOT; }; C38EF23F255B6D67007E1867 /* NSAttributedString+OWS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSAttributedString+OWS.h"; path = "SignalUtilitiesKit/Utilities/NSAttributedString+OWS.h"; sourceTree = SOURCE_ROOT; }; C38EF240255B6D67007E1867 /* UIView+OWS.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIView+OWS.swift"; path = "SignalUtilitiesKit/UI/UIView+OWS.swift"; sourceTree = SOURCE_ROOT; }; C38EF241255B6D67007E1867 /* Collection+OWS.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "Collection+OWS.swift"; path = "SignalUtilitiesKit/Utilities/Collection+OWS.swift"; sourceTree = SOURCE_ROOT; }; @@ -1747,7 +1746,7 @@ C38EF2E9255B6DBA007E1867 /* OWSUnreadIndicator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OWSUnreadIndicator.h; path = SignalUtilitiesKit/OWSUnreadIndicator.h; sourceTree = SOURCE_ROOT; }; C38EF2EC255B6DBA007E1867 /* ProximityMonitoringManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ProximityMonitoringManager.swift; path = SessionMessagingKit/Utilities/ProximityMonitoringManager.swift; sourceTree = SOURCE_ROOT; }; C38EF2ED255B6DBB007E1867 /* DisplayableText.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DisplayableText.swift; path = SignalUtilitiesKit/UI/DisplayableText.swift; sourceTree = SOURCE_ROOT; }; - C38EF2EF255B6DBB007E1867 /* Weak.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Weak.swift; path = SessionUtilitiesKit/Weak.swift; sourceTree = SOURCE_ROOT; }; + C38EF2EF255B6DBB007E1867 /* Weak.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Weak.swift; path = SessionUtilitiesKit/General/Weak.swift; sourceTree = SOURCE_ROOT; }; C38EF2F0255B6DBB007E1867 /* OWSAnyTouchGestureRecognizer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OWSAnyTouchGestureRecognizer.m; path = SignalUtilitiesKit/UI/OWSAnyTouchGestureRecognizer.m; sourceTree = SOURCE_ROOT; }; C38EF2F1255B6DBB007E1867 /* OWSPreferences.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OWSPreferences.h; path = SessionMessagingKit/Utilities/OWSPreferences.h; sourceTree = SOURCE_ROOT; }; C38EF2F2255B6DBC007E1867 /* Searcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Searcher.swift; path = SignalUtilitiesKit/Searcher.swift; sourceTree = SOURCE_ROOT; }; @@ -2554,6 +2553,117 @@ path = ..; sourceTree = ""; }; + B8A582AB258C64E800AFD84C /* Database */ = { + isa = PBXGroup; + children = ( + C33FDBAB255A581500E217F9 /* OWSFileSystem.h */, + C33FDA8E255A57FD00E217F9 /* OWSFileSystem.m */, + C3D9E41E25676C870040E4F3 /* OWSPrimaryStorageProtocol.swift */, + C33FDBBC255A581600E217F9 /* SSKKeychainStorage.swift */, + C33FDB36255A580B00E217F9 /* Storage.swift */, + C33FDAA1255A57FF00E217F9 /* TSYapDatabaseObject.h */, + C33FDA90255A57FD00E217F9 /* TSYapDatabaseObject.m */, + ); + path = Database; + sourceTree = ""; + }; + B8A582AC258C653C00AFD84C /* Crypto */ = { + isa = PBXGroup; + children = ( + C3C2A5D72553860B00C340D1 /* AESGCM.swift */, + C3C2ABD12553C6C900C340D1 /* Data+SecureRandom.swift */, + C3A71D662558A0170043A11F /* DiffieHellman.swift */, + C33FDA73255A57FA00E217F9 /* ECKeyPair+Hexadecimal.swift */, + C3A71F882558BA9F0043A11F /* Mnemonic.swift */, + ); + path = Crypto; + sourceTree = ""; + }; + B8A582AD258C655E00AFD84C /* PromiseKit */ = { + isa = PBXGroup; + children = ( + C3A721992558C1660043A11F /* AnyPromise+Conversion.swift */, + C3C2A5D32553860900C340D1 /* Promise+Delaying.swift */, + C3A7225D2558C38D0043A11F /* Promise+Retaining.swift */, + C3C2A5D62553860B00C340D1 /* Promise+Retrying.swift */, + ); + path = PromiseKit; + sourceTree = ""; + }; + B8A582AE258C65D000AFD84C /* Networking */ = { + isa = PBXGroup; + children = ( + C33FDB68255A580F00E217F9 /* ContentProxy.swift */, + C3C2A5BC255385EE00C340D1 /* HTTP.swift */, + C3C2A5D92553860B00C340D1 /* JSON.swift */, + C33FDAF2255A580500E217F9 /* ProxiedContentDownloader.swift */, + C352A3A42557B5F000338F3E /* TSRequest.h */, + C352A3A52557B60D00338F3E /* TSRequest.m */, + ); + path = Networking; + sourceTree = ""; + }; + B8A582AF258C665E00AFD84C /* Media */ = { + isa = PBXGroup; + children = ( + C33FDB54255A580D00E217F9 /* DataSource.h */, + C33FDBB6255A581600E217F9 /* DataSource.m */, + C33FDAFC255A580600E217F9 /* MIMETypeUtil.h */, + C33FDB41255A580C00E217F9 /* MIMETypeUtil.m */, + C33FDB29255A580A00E217F9 /* NSData+Image.h */, + C33FDAEF255A580500E217F9 /* NSData+Image.m */, + C33FDB22255A580900E217F9 /* OWSMediaUtils.swift */, + C33FDB1C255A580900E217F9 /* UIImage+OWS.h */, + C33FDB81255A581100E217F9 /* UIImage+OWS.m */, + ); + path = Media; + sourceTree = ""; + }; + B8A582B0258C66C900AFD84C /* General */ = { + isa = PBXGroup; + children = ( + C33FDB8A255A581200E217F9 /* AppContext.h */, + C33FDB85255A581100E217F9 /* AppContext.m */, + C3C2A5D12553860800C340D1 /* Array+Description.swift */, + C33FDAA8255A57FF00E217F9 /* BuildConfiguration.swift */, + C3C2A5D52553860A00C340D1 /* Dictionary+Description.swift */, + B8BC00BF257D90E30032E807 /* General.swift */, + C33FDB6B255A580F00E217F9 /* LKUserDefaults.swift */, + C3C2A5CE2553860700C340D1 /* Logging.swift */, + C33FDAFD255A580600E217F9 /* LRUCache.swift */, + C33FDB5C255A580E00E217F9 /* NSArray+Functional.h */, + C33FDAB8255A580100E217F9 /* NSArray+Functional.m */, + C300A6302554B68200555489 /* NSDate+Timestamp.h */, + C300A6312554B6D100555489 /* NSDate+Timestamp.mm */, + C33FDB3B255A580B00E217F9 /* NSNotificationCenter+OWS.h */, + C33FDB6C255A580F00E217F9 /* NSNotificationCenter+OWS.m */, + C33FDA7A255A57FB00E217F9 /* NSRegularExpression+SSK.swift */, + C33FDB12255A580800E217F9 /* NSString+SSK.h */, + C33FDB45255A580C00E217F9 /* NSString+SSK.m */, + C352A3762557859C00338F3E /* NSTimer+Proxying.h */, + C352A36C2557858D00338F3E /* NSTimer+Proxying.m */, + C33FDB51255A580D00E217F9 /* NSUserDefaults+OWS.h */, + C33FDB77255A581000E217F9 /* NSUserDefaults+OWS.m */, + C33FDB14255A580800E217F9 /* OWSMath.h */, + C33FDB3F255A580C00E217F9 /* String+SSK.swift */, + C3C2AC2D2553CBEB00C340D1 /* String+Trimming.swift */, + C38EF237255B6D65007E1867 /* UIDevice+featureSupport.swift */, + C38EF23D255B6D66007E1867 /* UIView+OWS.h */, + C38EF23E255B6D66007E1867 /* UIView+OWS.m */, + C38EF2EF255B6DBB007E1867 /* Weak.swift */, + ); + path = General; + sourceTree = ""; + }; + B8A582B9258C696200AFD84C /* Messaging */ = { + isa = PBXGroup; + children = ( + C33FDBCA255A581700E217F9 /* LKGroupUtilities.h */, + C33FDBE1255A581A00E217F9 /* LKGroupUtilities.m */, + ); + path = Messaging; + sourceTree = ""; + }; B8B3201F258B1A540020074B /* Contacts */ = { isa = PBXGroup; children = ( @@ -3413,69 +3523,14 @@ isa = PBXGroup; children = ( C3C2A68B255388D500C340D1 /* Meta */, - C3C2A5D72553860B00C340D1 /* AESGCM.swift */, - C3A721992558C1660043A11F /* AnyPromise+Conversion.swift */, - C33FDB8A255A581200E217F9 /* AppContext.h */, - C33FDB85255A581100E217F9 /* AppContext.m */, - C3C2A5D12553860800C340D1 /* Array+Description.swift */, - C33FDAA8255A57FF00E217F9 /* BuildConfiguration.swift */, + B8A582AC258C653C00AFD84C /* Crypto */, + B8A582AB258C64E800AFD84C /* Database */, + B8A582B0258C66C900AFD84C /* General */, + B8A582AF258C665E00AFD84C /* Media */, + B8A582B9258C696200AFD84C /* Messaging */, + B8A582AE258C65D000AFD84C /* Networking */, + B8A582AD258C655E00AFD84C /* PromiseKit */, C3D9E43025676D3D0040E4F3 /* Configuration.swift */, - C33FDB68255A580F00E217F9 /* ContentProxy.swift */, - C33FDB54255A580D00E217F9 /* DataSource.h */, - C33FDBB6255A581600E217F9 /* DataSource.m */, - C3C2ABD12553C6C900C340D1 /* Data+SecureRandom.swift */, - C3C2A5D52553860A00C340D1 /* Dictionary+Description.swift */, - C3A71D662558A0170043A11F /* DiffieHellman.swift */, - C33FDA73255A57FA00E217F9 /* ECKeyPair+Hexadecimal.swift */, - B8BC00BF257D90E30032E807 /* General.swift */, - C3C2A5BC255385EE00C340D1 /* HTTP.swift */, - C3C2A5D92553860B00C340D1 /* JSON.swift */, - C33FDBCA255A581700E217F9 /* LKGroupUtilities.h */, - C33FDBE1255A581A00E217F9 /* LKGroupUtilities.m */, - C33FDB6B255A580F00E217F9 /* LKUserDefaults.swift */, - C3C2A5CE2553860700C340D1 /* Logging.swift */, - C33FDAFD255A580600E217F9 /* LRUCache.swift */, - C33FDAFC255A580600E217F9 /* MIMETypeUtil.h */, - C33FDB41255A580C00E217F9 /* MIMETypeUtil.m */, - C3A71F882558BA9F0043A11F /* Mnemonic.swift */, - C33FDB5C255A580E00E217F9 /* NSArray+Functional.h */, - C33FDAB8255A580100E217F9 /* NSArray+Functional.m */, - C33FDB29255A580A00E217F9 /* NSData+Image.h */, - C33FDAEF255A580500E217F9 /* NSData+Image.m */, - C300A6302554B68200555489 /* NSDate+Timestamp.h */, - C300A6312554B6D100555489 /* NSDate+Timestamp.mm */, - C33FDB3B255A580B00E217F9 /* NSNotificationCenter+OWS.h */, - C33FDB6C255A580F00E217F9 /* NSNotificationCenter+OWS.m */, - C33FDA7A255A57FB00E217F9 /* NSRegularExpression+SSK.swift */, - C33FDB12255A580800E217F9 /* NSString+SSK.h */, - C33FDB45255A580C00E217F9 /* NSString+SSK.m */, - C352A3762557859C00338F3E /* NSTimer+Proxying.h */, - C352A36C2557858D00338F3E /* NSTimer+Proxying.m */, - C33FDB51255A580D00E217F9 /* NSUserDefaults+OWS.h */, - C33FDB77255A581000E217F9 /* NSUserDefaults+OWS.m */, - C33FDBAB255A581500E217F9 /* OWSFileSystem.h */, - C33FDA8E255A57FD00E217F9 /* OWSFileSystem.m */, - C33FDB14255A580800E217F9 /* OWSMath.h */, - C33FDB22255A580900E217F9 /* OWSMediaUtils.swift */, - C3D9E41E25676C870040E4F3 /* OWSPrimaryStorageProtocol.swift */, - C3C2A5D32553860900C340D1 /* Promise+Delaying.swift */, - C3A7225D2558C38D0043A11F /* Promise+Retaining.swift */, - C3C2A5D62553860B00C340D1 /* Promise+Retrying.swift */, - C33FDAF2255A580500E217F9 /* ProxiedContentDownloader.swift */, - C33FDBBC255A581600E217F9 /* SSKKeychainStorage.swift */, - C33FDB36255A580B00E217F9 /* Storage.swift */, - C33FDB3F255A580C00E217F9 /* String+SSK.swift */, - C3C2AC2D2553CBEB00C340D1 /* String+Trimming.swift */, - C352A3A42557B5F000338F3E /* TSRequest.h */, - C352A3A52557B60D00338F3E /* TSRequest.m */, - C33FDAA1255A57FF00E217F9 /* TSYapDatabaseObject.h */, - C33FDA90255A57FD00E217F9 /* TSYapDatabaseObject.m */, - C38EF237255B6D65007E1867 /* UIDevice+featureSupport.swift */, - C33FDB1C255A580900E217F9 /* UIImage+OWS.h */, - C33FDB81255A581100E217F9 /* UIImage+OWS.m */, - C38EF23D255B6D66007E1867 /* UIView+OWS.h */, - C38EF23E255B6D66007E1867 /* UIView+OWS.m */, - C38EF2EF255B6DBB007E1867 /* Weak.swift */, ); path = SessionUtilitiesKit; sourceTree = ""; @@ -4876,7 +4931,6 @@ 34480B361FD0929200BC14EF /* ShareAppExtensionContext.m in Sources */, 34641E1F2088DA6D00E2EDE5 /* SAEScreenLockViewController.m in Sources */, 3461284B1FD0B94000532771 /* SAELoadViewController.swift in Sources */, - C3D90A8325774A68002C9DF5 /* OWSPrimaryStorageProtocol.swift in Sources */, 347850571FD86544007B8332 /* SAEFailedViewController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; From ec2d784c205aa255816c75e110be3f6246e9a617 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Mon, 4 Jan 2021 10:36:18 +1100 Subject: [PATCH 9/9] Update contact model when legacy update methods are invoked --- SessionMessagingKit/Contacts/Contact.swift | 14 +++--- .../Database/Storage+Contacts.swift | 2 + SessionMessagingKit/To Do/OWSUserProfile.m | 49 +++++++++++++++++++ 3 files changed, 58 insertions(+), 7 deletions(-) diff --git a/SessionMessagingKit/Contacts/Contact.swift b/SessionMessagingKit/Contacts/Contact.swift index f29e74c7f..769a4c67e 100644 --- a/SessionMessagingKit/Contacts/Contact.swift +++ b/SessionMessagingKit/Contacts/Contact.swift @@ -1,19 +1,19 @@ @objc(SNContact) public class Contact : NSObject, NSCoding { // NSObject/NSCoding conformance is needed for YapDatabase compatibility - public let sessionID: String + @objc public let sessionID: String /// The display name of the contact. /// /// - Note: In open groups use `openGroupDisplayName`. - public var displayName: String? + @objc public var displayName: String? /// The URL from which to fetch the contact's profile picture. - public var profilePictureURL: String? + @objc public var profilePictureURL: String? /// The file name of the contact's profile picture on local storage. - public var profilePictureFileName: String? + @objc public var profilePictureFileName: String? /// The key with which the profile picture is encrypted. - public var profilePictureEncryptionKey: OWSAES256Key? + @objc public var profilePictureEncryptionKey: OWSAES256Key? /// The ID of the thread associated with this contact. - public var threadID: String? + @objc public var threadID: String? /// In open groups, where it's more likely that multiple users have the same name, we display a bit of the Session ID after /// a user's display name for added context. @@ -25,7 +25,7 @@ public class Contact : NSObject, NSCoding { // NSObject/NSCoding conformance is } // MARK: Initialization - public init(sessionID: String) { + @objc public init(sessionID: String) { self.sessionID = sessionID super.init() } diff --git a/SessionMessagingKit/Database/Storage+Contacts.swift b/SessionMessagingKit/Database/Storage+Contacts.swift index 7d6404e51..9a41ea138 100644 --- a/SessionMessagingKit/Database/Storage+Contacts.swift +++ b/SessionMessagingKit/Database/Storage+Contacts.swift @@ -4,6 +4,7 @@ extension Storage { private static let contactCollection = "LokiContactCollection" + @objc(getContactWithSessionID:) public func getContact(with sessionID: String) -> Contact? { var result: Contact? Storage.read { transaction in @@ -12,6 +13,7 @@ extension Storage { return result } + @objc(setContact:usingTransaction:) public func setContact(_ contact: Contact, using transaction: Any) { (transaction as! YapDatabaseReadWriteTransaction).setObject(contact, forKey: contact.sessionID, inCollection: Storage.contactCollection) } diff --git a/SessionMessagingKit/To Do/OWSUserProfile.m b/SessionMessagingKit/To Do/OWSUserProfile.m index 7e18a8d3b..0440d6cfa 100644 --- a/SessionMessagingKit/To Do/OWSUserProfile.m +++ b/SessionMessagingKit/To Do/OWSUserProfile.m @@ -13,6 +13,8 @@ #import #import #import +#import +#import NS_ASSUME_NONNULL_BEGIN @@ -117,6 +119,15 @@ NSString *const kLocalProfileUniqueId = @"kLocalProfileUniqueId"; #pragma mark - +- (NSString *)sessionID +{ + if ([self.recipientId isEqual:kLocalProfileUniqueId]) { + return OWSIdentityManager.sharedManager.identityKeyPair.hexEncodedPublicKey; + } else { + return self.recipientId; + } +} + - (nullable NSString *)avatarUrlPath { @synchronized(self) @@ -270,6 +281,12 @@ NSString *const kLocalProfileUniqueId = @"kLocalProfileUniqueId"; functionName:__PRETTY_FUNCTION__ transaction:transaction completion:completion]; + + SNContact *contact = [LKStorage.shared getContactWithSessionID:self.sessionID] ?: [[SNContact alloc] initWithSessionID:self.sessionID]; + contact.displayName = [profileName ows_stripped]; + contact.profilePictureURL = avatarUrlPath; + contact.profilePictureFileName = avatarFileName; + [LKStorage.shared setContact:contact usingTransaction:transaction]; } - (void)updateWithProfileName:(nullable NSString *)profileName @@ -288,6 +305,14 @@ NSString *const kLocalProfileUniqueId = @"kLocalProfileUniqueId"; functionName:__PRETTY_FUNCTION__ dbConnection:dbConnection completion:completion]; + + SNContact *contact = [LKStorage.shared getContactWithSessionID:self.sessionID] ?: [[SNContact alloc] initWithSessionID:self.sessionID]; + contact.displayName = [profileName ows_stripped]; + contact.profilePictureURL = avatarUrlPath; + contact.profilePictureFileName = avatarFileName; + [LKStorage writeSyncWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [LKStorage.shared setContact:contact usingTransaction:transaction]; + }]; } - (void)updateWithProfileName:(nullable NSString *)profileName @@ -302,6 +327,13 @@ NSString *const kLocalProfileUniqueId = @"kLocalProfileUniqueId"; functionName:__PRETTY_FUNCTION__ dbConnection:dbConnection completion:completion]; + + SNContact *contact = [LKStorage.shared getContactWithSessionID:self.sessionID] ?: [[SNContact alloc] initWithSessionID:self.sessionID]; + contact.displayName = [profileName ows_stripped]; + contact.profilePictureURL = avatarUrlPath; + [LKStorage writeSyncWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [LKStorage.shared setContact:contact usingTransaction:transaction]; + }]; } - (void)updateWithAvatarUrlPath:(nullable NSString *)avatarUrlPath @@ -318,6 +350,13 @@ NSString *const kLocalProfileUniqueId = @"kLocalProfileUniqueId"; functionName:__PRETTY_FUNCTION__ dbConnection:dbConnection completion:completion]; + + SNContact *contact = [LKStorage.shared getContactWithSessionID:self.sessionID] ?: [[SNContact alloc] initWithSessionID:self.sessionID]; + contact.profilePictureURL = avatarUrlPath; + contact.profilePictureFileName = avatarFileName; + [LKStorage writeSyncWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [LKStorage.shared setContact:contact usingTransaction:transaction]; + }]; } - (void)updateWithAvatarFileName:(nullable NSString *)avatarFileName @@ -330,6 +369,12 @@ NSString *const kLocalProfileUniqueId = @"kLocalProfileUniqueId"; functionName:__PRETTY_FUNCTION__ dbConnection:dbConnection completion:completion]; + + SNContact *contact = [LKStorage.shared getContactWithSessionID:self.sessionID] ?: [[SNContact alloc] initWithSessionID:self.sessionID]; + contact.profilePictureFileName = avatarFileName; + [LKStorage writeSyncWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [LKStorage.shared setContact:contact usingTransaction:transaction]; + }]; } - (void)clearWithProfileKey:(OWSAES256Key *)profileKey @@ -368,6 +413,10 @@ NSString *const kLocalProfileUniqueId = @"kLocalProfileUniqueId"; functionName:__PRETTY_FUNCTION__ transaction:transaction completion:completion]; + + SNContact *contact = [LKStorage.shared getContactWithSessionID:self.sessionID] ?: [[SNContact alloc] initWithSessionID:self.sessionID]; + contact.profilePictureEncryptionKey = profileKey; + [LKStorage.shared setContact:contact usingTransaction:transaction]; } #pragma mark - Database Connection Accessors