Add support for phone number + UUID to SignalAccount

This commit is contained in:
Nora Trapp 2019-06-21 18:07:28 -07:00
parent cc83e60eda
commit b03fac8bba
5 changed files with 107 additions and 25 deletions

View File

@ -8,6 +8,7 @@ NS_ASSUME_NONNULL_BEGIN
@class Contact;
@class SignalRecipient;
@class SignalServiceAddress;
@class YapDatabaseReadTransaction;
// This class represents a single valid Signal account.
@ -17,11 +18,15 @@ NS_ASSUME_NONNULL_BEGIN
// * For non-contacts, the contact property will be nil.
@interface SignalAccount : TSYapDatabaseObject
// An E164 value identifying the signal account.
//
// This is the key property of this class and it
// will always be non-null.
@property (nonatomic, readonly) NSString *recipientId;
/// An E164 value identifying the signal account.
@property (nullable, nonatomic, readonly) NSString *recipientPhoneNumber;
/// A UUID identifying the signal account.
@property (nullable, nonatomic, readonly) NSString *recipientUUID;
/// An address representing the signal account. This will be
/// the UUID, if defined, otherwise it will be the E164 number.
@property (nonatomic, readonly) SignalServiceAddress *recipientAddress;
// This property is optional and will not be set for
// non-contact account.
@ -39,7 +44,7 @@ NS_ASSUME_NONNULL_BEGIN
- (instancetype)initWithSignalRecipient:(SignalRecipient *)signalRecipient;
- (instancetype)initWithRecipientId:(NSString *)recipientId;
- (instancetype)initWithSignalServiceAddress:(SignalServiceAddress *)address;
// --- CODE GENERATION MARKER

View File

@ -7,13 +7,14 @@
#import "NSString+SSK.h"
#import "OWSPrimaryStorage.h"
#import "SignalRecipient.h"
#import <SignalServiceKit/SignalServiceKit-Swift.h>
NS_ASSUME_NONNULL_BEGIN
NSUInteger const SignalAccountSchemaVersion = 1;
@interface SignalAccount ()
@property (nonatomic) NSString *recipientId;
@property (nonatomic, readonly) NSUInteger accountSchemaVersion;
@end
#pragma mark -
@ -26,16 +27,41 @@ NS_ASSUME_NONNULL_BEGIN
return [self initWithRecipientId:signalRecipient.recipientId];
}
- (instancetype)initWithRecipientId:(NSString *)recipientId
- (instancetype)initWithSignalServiceAddress:(SignalServiceAddress *)serviceAddress
{
if (self = [super init]) {
OWSAssertDebug(recipientId.length > 0);
if (serviceAddress.isUUID) {
_recipientUUID = serviceAddress.stringIdentifier;
} else {
_recipientPhoneNumber = serviceAddress.stringIdentifier;
}
_recipientId = recipientId;
_accountSchemaVersion = SignalAccountSchemaVersion;
}
return self;
}
- (nullable instancetype)initWithCoder:(NSCoder *)coder
{
self = [super initWithCoder:coder];
if (!self) {
return self;
}
// Migrating from an everyone has a phone number world to a
// world in which we have UUIDs
if (_accountSchemaVersion == 0) {
// Rename recipientId to recipientPhoneNumber
_recipientPhoneNumber = [coder decodeObjectForKey:@"recipientId"];
OWSAssert(_recipientPhoneNumber != nil);
}
_accountSchemaVersion = SignalAccountSchemaVersion;
return self;
}
// --- CODE GENERATION MARKER
// This snippet is generated by /Scripts/sds_codegen/sds_generate.py. Do not manually edit it, instead run
@ -67,11 +93,6 @@ NS_ASSUME_NONNULL_BEGIN
// --- CODE GENERATION MARKER
- (nullable NSString *)uniqueId
{
return _recipientId;
}
- (nullable NSString *)contactFullName
{
return self.contact.fullName.filterStringForDisplay;
@ -82,6 +103,17 @@ NS_ASSUME_NONNULL_BEGIN
return _multipleAccountLabelText.filterStringForDisplay;
}
- (SignalServiceAddress *)recipientAddress
{
if (self.recipientUUID != nil) {
return [[SignalServiceAddress alloc] initWithUuidString:self.recipientUUID];
} else if (self.recipientPhoneNumber != nil) {
return [[SignalServiceAddress alloc] initWithPhoneNumber:self.recipientPhoneNumber];
} else {
OWSFail(@"unexpectedly have no address for SignalAccount, this should never happen.");
}
}
@end
NS_ASSUME_NONNULL_END

View File

@ -14,23 +14,60 @@ public class SignalServiceAddress: NSObject {
private let backingAddress: BackingStorage
@objc
public init(phoneNumber: String) {
self.backingAddress = .phoneNumber(phoneNumber)
public init?(phoneNumber: String) {
guard !phoneNumber.isEmpty else {
owsFailDebug("Unexpectedly initialized signal service address with invalid phone number")
return nil
}
backingAddress = .phoneNumber(phoneNumber)
}
@objc
public init(uuid: UUID) {
self.backingAddress = .uuid(uuid)
backingAddress = .uuid(uuid)
}
@objc
public init?(uuidString: String) {
guard let uuid = UUID(uuidString: uuidString) else {
owsFailDebug("Tried to intialize signal service address with invalid UUID")
return nil
}
backingAddress = .uuid(uuid)
}
@objc
public var stringIdentifier: String {
switch backingAddress {
case .phoneNumber(let phoneNumber):
return phoneNumber
case .uuid(let uuid):
return uuid.uuidString
}
}
@objc
public var isUUID: Bool {
guard case .uuid = backingAddress else {
return false
}
return true
}
@objc
public var isPhoneNumber: Bool {
guard case .phoneNumber = backingAddress else {
return false
}
return true
}
@objc
public var transitional_phoneNumber: String! {
switch backingAddress {
case .phoneNumber(let phoneNumber):
return phoneNumber
case .uuid:
guard case .phoneNumber(let phoneNumber) = backingAddress else {
owsFailDebug("transitional_phoneNumber was unexpectedly nil")
return nil
}
return phoneNumber
}
}

View File

@ -152,4 +152,12 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark -
@interface SignalAccount (SDS)
@property (nonatomic, readonly) NSUInteger accountSchemaVersion;
@end
#pragma mark -
NS_ASSUME_NONNULL_END

View File

@ -229,7 +229,7 @@ public class FullTextSearchFinder: NSObject {
}
return self.messageIndexer.index(message, transaction: transaction)
} else if let signalAccount = object as? SignalAccount {
return self.recipientIndexer.index(signalAccount.recipientId, transaction: transaction)
return self.recipientIndexer.index(signalAccount.recipientAddress.transitional_phoneNumber, transaction: transaction)
} else {
return nil
}