@ -64,19 +64,21 @@ public final class FriendRequestProtocol : NSObject {
}
// MARK: - S e n d i n g
@objc ( acceptFriendRequest InThread : using : )
public static func acceptFriendRequest ( in thread : TSThread , using transaction : YapDatabaseReadWriteTransaction ) {
@objc ( acceptFriendRequest FromHexEncodedPublicKey : using : )
public static func acceptFriendRequest ( from hexEncodedPublicKey : String , using transaction : YapDatabaseReadWriteTransaction ) {
// A c c e p t a l l o u t s t a n d i n g f r i e n d r e q u e s t s a s s o c i a t e d w i t h t h i s u s e r a n d t r y t o e s t a b l i s h s e s s i o n s w i t h t h e
// s u b s e t o f t h e i r d e v i c e s t h a t h a v e n ' t s e n t a f r i e n d r e q u e s t .
guard let thread = thread as ? TSContactThread else { return }
guard ECKeyPair . isValidHexEncodedPublicKey ( candidate : hexEncodedPublicKey ) else {
assertionFailure ( " Invalid session ID \( hexEncodedPublicKey ) " )
return ;
}
let linkedDevices = LokiDatabaseUtilities . getLinkedDeviceHexEncodedPublicKeys ( for : thread . contactIdentifier ( ) , in : transaction )
let linkedDevices = LokiDatabaseUtilities . getLinkedDeviceHexEncodedPublicKeys ( for : hexEncodedPublicKey , in : transaction )
for device in linkedDevices {
let friendRequestStatus = storage . getFriendRequestStatus ( forContact : device , transaction : transaction )
if friendRequestStatus = = . requestReceived {
storage . setFriendRequestStatus ( . friends , forContact : device , transaction : transaction )
// TODO: D o w e n e e d t o p a s s i n ` t h r e a d ` h e r e ? I f n o t t h e n w e c a n r e s t r u c t u r e t h i s w h o l e f u n c t i o n t o t a k e i n a h e x e n c o d e d p u b l i c k e y i n s t e a d
sendFriendRequestAcceptanceMessage ( to : device , in : thread , using : transaction )
sendFriendRequestAcceptanceMessage ( to : device , using : transaction )
} else if friendRequestStatus = = . requestSent {
// W e s e n t a f r i e n d r e q u e s t t o t h i s d e v i c e b e f o r e , h o w c a n w e b e s u r e t h a t i t h a s n ' t e x p i r e d ?
} else if friendRequestStatus = = . none || friendRequestStatus = = . requestExpired {
@ -90,23 +92,36 @@ public final class FriendRequestProtocol : NSObject {
}
}
@objc ( sendFriendRequestAcceptanceMessageToHexEncodedPublicKey : in : using : )
public static func sendFriendRequestAcceptanceMessage ( to hexEncodedPublicKey : String , in thread : TSThread , using transaction : YapDatabaseReadWriteTransaction ) {
guard let thread = thread as ? TSContactThread else { return }
@objc ( sendFriendRequestAcceptanceMessageToHexEncodedPublicKey : using : )
public static func sendFriendRequestAcceptanceMessage ( to hexEncodedPublicKey : String , using transaction : YapDatabaseReadWriteTransaction ) {
guard ECKeyPair . isValidHexEncodedPublicKey ( candidate : hexEncodedPublicKey ) else {
assertionFailure ( " Invalid session ID \( hexEncodedPublicKey ) " )
return ;
}
// TODO: S h o u l d w e c r e a t e t h e t h r e a d s h e r e ? ?
guard let thread = TSContactThread . getWithContactId ( hexEncodedPublicKey , transaction : transaction ) else {
print ( " [Loki] Not going to send friend request acceptance message because thread does not exist for \( hexEncodedPublicKey ) " )
return
}
let ephemeralMessage = EphemeralMessage ( in : thread )
let messageSenderJobQueue = SSKEnvironment . shared . messageSenderJobQueue
messageSenderJobQueue . add ( message : ephemeralMessage , transaction : transaction )
}
@objc ( declineFriendRequestInThread : using : )
public static func declineFriendRequest ( in thread : TSThread , using transaction : YapDatabaseReadWriteTransaction ) {
guard let thread = thread as ? TSContactThread else { return }
let linkedDevices = LokiDatabaseUtilities . getLinkedDeviceHexEncodedPublicKeys ( for : thread . contactIdentifier ( ) , in : transaction )
@objc ( declineFriendRequestFromHexEncodedPublicKey : using : )
public static func declineFriendRequest ( from hexEncodedPublicKey : String , using transaction : YapDatabaseReadWriteTransaction ) {
guard ECKeyPair . isValidHexEncodedPublicKey ( candidate : hexEncodedPublicKey ) else {
assertionFailure ( " Invalid session ID \( hexEncodedPublicKey ) " )
return ;
}
let linkedDevices = LokiDatabaseUtilities . getLinkedDeviceHexEncodedPublicKeys ( for : hexEncodedPublicKey , in : transaction )
for device in linkedDevices {
let friendRequestStatus = storage . getFriendRequestStatus ( forContact : device , transaction : transaction )
assert ( friendRequestStatus != . friends , " Invalid state transition. Cannot decline a friend request from a device we're already friends with. hexEncodedPublicKey: \( device ) " )
// W e o n l y w a n t t o d e c l i n e a n y i n c o m i n g r e q u e s t s
assert ( friendRequestStatus != . friends , " Invalid state transition. Cannot decline a friend request from a device we're already friends with. Thread: \( thread . uniqueId ) - \( thread . contactIdentifier ( ) ) " )
if ( friendRequestStatus = = . requestReceived ) {
// D e l e t e t h e p r e k e y b u n d l e f o r t h e g i v e n c o n t a c t . T h i s e n s u r e s t h a t i f w e s e n d a
// n e w m e s s a g e a f t e r t h i s , i t r e s t a r t s t h e f r i e n d r e q u e s t p r o c e s s f r o m s c r a t c h .
@ -202,7 +217,7 @@ public final class FriendRequestProtocol : NSObject {
if let existingFriendRequestMessage = existingFriendRequestMessage {
existingFriendRequestMessage . saveFriendRequestStatus ( . accepted , with : transaction )
}
sendFriendRequestAcceptanceMessage ( to : hexEncodedPublicKey , in : thread , using : transaction )
sendFriendRequestAcceptanceMessage ( to : hexEncodedPublicKey , using : transaction )
} else if storage . getFriendRequestStatus ( forContact : hexEncodedPublicKey , transaction : transaction ) != . friends {
// C h e c k i n g t h a t t h e s e n d e r o f t h e m e s s a g e i s n ' t a l r e a d y a f r i e n d i s n e c e s s a r y b e c a u s e o t h e r w i s e
// t h e f o l l o w i n g s i t u a t i o n c a n o c c u r : A l i c e a n d B o b a r e f r i e n d s . B o b l o s e s h i s d a t a b a s e a n d h i s