Apply refinements to UD logic.

pull/1/head
Matthew Chen 7 years ago
parent 2541be1619
commit c5f4711595

@ -135,7 +135,8 @@ public class ProfileFetcherJob: NSObject {
Logger.error("getProfile: \(recipientId)") Logger.error("getProfile: \(recipientId)")
let udAccess = udManager.udAccess(forRecipientId: recipientId) let udAccess = udManager.udAccess(forRecipientId: recipientId,
requireSyncAccess: false)
return requestProfile(recipientId: recipientId, return requestProfile(recipientId: recipientId,
udAccess: udAccess, udAccess: udAccess,
canFailoverUDAuth: true) canFailoverUDAuth: true)

@ -593,7 +593,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
AnyPromise *sendPromise = [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { AnyPromise *sendPromise = [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) {
OWSUDAccess *_Nullable theirUDAccess; OWSUDAccess *_Nullable theirUDAccess;
if (senderCertificate != nil && selfUDAccess != nil) { if (senderCertificate != nil && selfUDAccess != nil) {
theirUDAccess = [self.udManager udAccessForRecipientId:recipient.recipientId]; theirUDAccess = [self.udManager udAccessForRecipientId:recipient.recipientId requireSyncAccess:YES];
} }
OWSMessageSend *messageSend = [[OWSMessageSend alloc] initWithMessage:message OWSMessageSend *messageSend = [[OWSMessageSend alloc] initWithMessage:message
@ -633,7 +633,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
OWSUDAccess *_Nullable selfUDAccess; OWSUDAccess *_Nullable selfUDAccess;
if (senderCertificate) { if (senderCertificate) {
selfUDAccess = [self.udManager udAccessForRecipientId:self.tsAccountManager.localNumber]; selfUDAccess = [self.udManager udAccessForRecipientId:self.tsAccountManager.localNumber requireSyncAccess:YES];
} }
void (^successHandler)(void) = ^() { void (^successHandler)(void) = ^() {

@ -79,7 +79,8 @@ public class OWSUDAccess: NSObject {
func udAccessKey(forRecipientId recipientId: RecipientIdentifier) -> SMKUDAccessKey? func udAccessKey(forRecipientId recipientId: RecipientIdentifier) -> SMKUDAccessKey?
@objc @objc
func udAccess(forRecipientId recipientId: RecipientIdentifier) -> OWSUDAccess? func udAccess(forRecipientId recipientId: RecipientIdentifier,
requireSyncAccess: Bool) -> OWSUDAccess?
// MARK: Sender Certificate // MARK: Sender Certificate
@ -152,13 +153,7 @@ public class OWSUDManagerImpl: NSObject, OWSUDManager {
@objc @objc
public func isUDEnabled() -> Bool { public func isUDEnabled() -> Bool {
// Only enable UD if UD is supported by all linked devices, return true
// so that sync messages can also be sent via UD.
guard let localNumber = tsAccountManager.localNumber() else {
return false
}
let ourAccessMode = unidentifiedAccessMode(forRecipientId: localNumber)
return ourAccessMode == .enabled || ourAccessMode == .unrestricted
} }
@objc @objc
@ -184,35 +179,44 @@ public class OWSUDManagerImpl: NSObject, OWSUDManager {
} }
private func unidentifiedAccessMode(forRecipientId recipientId: RecipientIdentifier, private func unidentifiedAccessMode(forRecipientId recipientId: RecipientIdentifier,
isLocalNumber: Bool,
transaction: YapDatabaseReadTransaction) -> UnidentifiedAccessMode { transaction: YapDatabaseReadTransaction) -> UnidentifiedAccessMode {
let defaultValue: UnidentifiedAccessMode = isLocalNumber ? .enabled : .unknown
guard let existingRawValue = transaction.object(forKey: recipientId, inCollection: kUnidentifiedAccessCollection) as? Int else { guard let existingRawValue = transaction.object(forKey: recipientId, inCollection: kUnidentifiedAccessCollection) as? Int else {
return .unknown return defaultValue
} }
guard let existingValue = UnidentifiedAccessMode(rawValue: existingRawValue) else { guard let existingValue = UnidentifiedAccessMode(rawValue: existingRawValue) else {
return .unknown return defaultValue
} }
return existingValue return existingValue
} }
@objc @objc
public func unidentifiedAccessMode(forRecipientId recipientId: RecipientIdentifier) -> UnidentifiedAccessMode { public func unidentifiedAccessMode(forRecipientId recipientId: RecipientIdentifier) -> UnidentifiedAccessMode {
var isLocalNumber = false
if let localNumber = tsAccountManager.localNumber() {
isLocalNumber = recipientId == localNumber
}
var mode: UnidentifiedAccessMode = .unknown var mode: UnidentifiedAccessMode = .unknown
dbConnection.read { (transaction) in dbConnection.read { (transaction) in
mode = self.unidentifiedAccessMode(forRecipientId: recipientId, transaction: transaction) mode = self.unidentifiedAccessMode(forRecipientId: recipientId, isLocalNumber: isLocalNumber, transaction: transaction)
} }
return mode return mode
} }
@objc @objc
public func setUnidentifiedAccessMode(_ mode: UnidentifiedAccessMode, recipientId: String) { public func setUnidentifiedAccessMode(_ mode: UnidentifiedAccessMode, recipientId: String) {
var isLocalNumber = false
if let localNumber = tsAccountManager.localNumber() { if let localNumber = tsAccountManager.localNumber() {
if recipientId == localNumber { if recipientId == localNumber {
Logger.info("Setting local UD access mode: \(string(forUnidentifiedAccessMode: mode))") Logger.info("Setting local UD access mode: \(string(forUnidentifiedAccessMode: mode))")
isLocalNumber = true
} }
} }
dbConnection.readWrite { (transaction) in dbConnection.readWrite { (transaction) in
let oldMode = self.unidentifiedAccessMode(forRecipientId: recipientId, transaction: transaction) let oldMode = self.unidentifiedAccessMode(forRecipientId: recipientId, isLocalNumber: isLocalNumber, transaction: transaction)
transaction.setObject(mode.rawValue as Int, forKey: recipientId, inCollection: self.kUnidentifiedAccessCollection) transaction.setObject(mode.rawValue as Int, forKey: recipientId, inCollection: self.kUnidentifiedAccessCollection)
@ -241,15 +245,16 @@ public class OWSUDManagerImpl: NSObject, OWSUDManager {
// Returns the UD access key for sending to a given recipient. // Returns the UD access key for sending to a given recipient.
@objc @objc
public func udAccess(forRecipientId recipientId: RecipientIdentifier) -> OWSUDAccess? { public func udAccess(forRecipientId recipientId: RecipientIdentifier,
// This check is currently redundant with the "send access key for local number" requireSyncAccess: Bool) -> OWSUDAccess? {
// check below, but behavior of isUDEnabled() may change.
guard isUDEnabled() else { guard isUDEnabled() else {
if isUDVerboseLoggingEnabled() { if isUDVerboseLoggingEnabled() {
Logger.info("UD Send disabled for \(recipientId), UD disabled.") Logger.info("UD Send disabled for \(recipientId), UD disabled.")
} }
return nil return nil
} }
if requireSyncAccess {
guard let localNumber = tsAccountManager.localNumber() else { guard let localNumber = tsAccountManager.localNumber() else {
if isUDVerboseLoggingEnabled() { if isUDVerboseLoggingEnabled() {
Logger.info("UD Send disabled for \(recipientId), no local number.") Logger.info("UD Send disabled for \(recipientId), no local number.")
@ -257,13 +262,16 @@ public class OWSUDManagerImpl: NSObject, OWSUDManager {
return nil return nil
} }
if localNumber != recipientId { if localNumber != recipientId {
guard udAccess(forRecipientId: localNumber) != nil else { let selfAccessMode = unidentifiedAccessMode(forRecipientId: localNumber)
guard selfAccessMode != .disabled else {
if isUDVerboseLoggingEnabled() { if isUDVerboseLoggingEnabled() {
Logger.info("UD Send disabled for \(recipientId), UD disabled for sync messages.") Logger.info("UD Send disabled for \(recipientId), UD disabled for sync messages.")
} }
return nil return nil
} }
} }
}
let accessMode = unidentifiedAccessMode(forRecipientId: recipientId) let accessMode = unidentifiedAccessMode(forRecipientId: recipientId)
if accessMode == .unrestricted { if accessMode == .unrestricted {
if let udAccessKey = udAccessKey(forRecipientId: recipientId) { if let udAccessKey = udAccessKey(forRecipientId: recipientId) {

Loading…
Cancel
Save