@ -92,6 +92,7 @@ public final class MultiDeviceProtocol : NSObject {
}
}
// / S e e [ M u l t i D e v i c e M e s s a g e S e n d i n g ] ( h t t p s : / / g i t h u b . c o m / l o k i - p r o j e c t / s e s s i o n - p r o t o c o l - d o c s / w i k i / M u l t i - D e v i c e - M e s s a g e - S e n d i n g ) f o r m o r e i n f o r m a t i o n .
@objc ( sendMessageToDestinationAndLinkedDevices : in : )
public static func sendMessageToDestinationAndLinkedDevices ( _ messageSend : OWSMessageSend , in transaction : YapDatabaseReadTransaction ) {
let message = messageSend . message
@ -146,6 +147,7 @@ public final class MultiDeviceProtocol : NSObject {
return AnyPromise . from ( promise )
}
// / S e e [ A u t o - G e n e r a t e d F r i e n d R e q u e s t s ] ( h t t p s : / / g i t h u b . c o m / l o k i - p r o j e c t / s e s s i o n - p r o t o c o l - d o c s / w i k i / A u t o - G e n e r a t e d - F r i e n d - R e q u e s t s ) f o r m o r e i n f o r m a t i o n .
@objc ( getAutoGeneratedMultiDeviceFRMessageForHexEncodedPublicKey : in : )
public static func getAutoGeneratedMultiDeviceFRMessage ( for hexEncodedPublicKey : String , in transaction : YapDatabaseReadWriteTransaction ) -> FriendRequestMessage {
let thread = TSContactThread . getOrCreateThread ( withContactId : hexEncodedPublicKey , transaction : transaction )
@ -162,11 +164,13 @@ public final class MultiDeviceProtocol : NSObject {
return result
}
// / S e e [ A u t o - G e n e r a t e d F r i e n d R e q u e s t s ] ( h t t p s : / / g i t h u b . c o m / l o k i - p r o j e c t / s e s s i o n - p r o t o c o l - d o c s / w i k i / A u t o - G e n e r a t e d - F r i e n d - R e q u e s t s ) f o r m o r e i n f o r m a t i o n .
@objc ( getAutoGeneratedMultiDeviceFRMessageSendForHexEncodedPublicKey : in : )
public static func objc_getAutoGeneratedMultiDeviceFRMessageSend ( for hexEncodedPublicKey : String , in transaction : YapDatabaseReadWriteTransaction ) -> AnyPromise {
return AnyPromise . from ( getAutoGeneratedMultiDeviceFRMessageSend ( for : hexEncodedPublicKey , in : transaction ) )
}
// / S e e [ A u t o - G e n e r a t e d F r i e n d R e q u e s t s ] ( h t t p s : / / g i t h u b . c o m / l o k i - p r o j e c t / s e s s i o n - p r o t o c o l - d o c s / w i k i / A u t o - G e n e r a t e d - F r i e n d - R e q u e s t s ) f o r m o r e i n f o r m a t i o n .
public static func getAutoGeneratedMultiDeviceFRMessageSend ( for hexEncodedPublicKey : String , in transaction : YapDatabaseReadWriteTransaction , seal externalSeal : Resolver < Void > ? = nil ) -> Promise < OWSMessageSend > {
// W e d o n ' t u p d a t e f r i e n d r e q u e s t s t a t u s h e r e a s i t i s d o n e i n O W S M e s s a g e S e n d e r . s e n d M e s s a g e ( : )
let thread = TSContactThread . getOrCreateThread ( withContactId : hexEncodedPublicKey , transaction : transaction )
@ -235,15 +239,27 @@ public final class MultiDeviceProtocol : NSObject {
public static func handleUnlinkDeviceMessage ( _ dataMessage : SSKProtoDataMessage , wrappedIn envelope : SSKProtoEnvelope , using transaction : YapDatabaseReadWriteTransaction ) {
// T h e e n v e l o p e s o u r c e i s s e t d u r i n g U D d e c r y p t i o n
let hexEncodedPublicKey = envelope . source !
// C h e c k t h a t t h e r e q u e s t w a s s e n t b y o u r m a s t e r d e v i c e
guard let masterHexEncodedPublicKey = storage . getMasterHexEncodedPublicKey ( for : getUserHexEncodedPublicKey ( ) , in : transaction ) else { return }
let wasSentByMasterDevice = ( masterHexEncodedPublicKey = = hexEncodedPublicKey )
guard wasSentByMasterDevice else { return }
let deviceLinks = storage . getDeviceLinks ( for : hexEncodedPublicKey , in : transaction )
if ! deviceLinks . contains ( where : { $0 . master . hexEncodedPublicKey = = hexEncodedPublicKey && $0 . slave . hexEncodedPublicKey = = getUserHexEncodedPublicKey ( ) } ) {
// I g n o r e t h e r e q u e s t i f w e d o n ' t k n o w a b o u t t h e d e v i c e l i n k i n q u e s t i o n
let masterDeviceLinks = storage . getDeviceLinks ( for : masterHexEncodedPublicKey , in : transaction )
if ! masterDeviceLinks . contains ( where : {
$0 . master . hexEncodedPublicKey = = masterHexEncodedPublicKey && $0 . slave . hexEncodedPublicKey = = getUserHexEncodedPublicKey ( )
} ) {
return
}
LokiFileServerAPI . getDeviceLinks ( associatedWith : getUserHexEncodedPublicKey ( ) ) . done ( on : DispatchQueue . main ) { deviceLinks in
if deviceLinks . contains ( where : { $0 . master . hexEncodedPublicKey = = hexEncodedPublicKey && $0 . slave . hexEncodedPublicKey = = getUserHexEncodedPublicKey ( ) } ) {
LokiFileServerAPI . getDeviceLinks ( associatedWith : getUserHexEncodedPublicKey ( ) ) . done ( on : DispatchQueue . main ) { slaveDeviceLinks in
// C h e c k t h a t t h e d e v i c e l i n k I S p r e s e n t o n t h e f i l e s e r v e r .
// N o t e t h a t t h e d e v i c e l i n k a s s e e n f r o m t h e m a s t e r d e v i c e ' s p e r s p e c t i v e h a s b e e n d e l e t e d a t t h i s p o i n t , b u t t h e
// d e v i c e l i n k a s s e e n f r o m t h e s l a v e p e r s p e c t i v e h a s n ' t .
if slaveDeviceLinks . contains ( where : {
$0 . master . hexEncodedPublicKey = = masterHexEncodedPublicKey && $0 . slave . hexEncodedPublicKey = = getUserHexEncodedPublicKey ( )
} ) {
for deviceLink in slaveDeviceLinks { // I n t h e o r y t h e r e s h o u l d o n l y b e o n e
LokiFileServerAPI . removeDeviceLink ( deviceLink ) // A t t e m p t t o c l e a n u p o n t h e f i l e s e r v e r
}
UserDefaults . standard [ . wasUnlinked ] = true
NotificationCenter . default . post ( name : . dataNukeRequested , object : nil )
}