- Update
This commit is contained in:
1 parent
d281d765ea
commit
5b074a5176
1261 files changed
+199158
-7303
No files matched your search
@@ -0,0 +1,19 @@
|
||||
#import "XMPPMessage.h"
|
||||
@class XMPPJID;
|
||||
|
||||
@interface XMPPMessage (XEP_0280)
|
||||
|
||||
- (NSXMLElement *)receivedMessageCarbon;
|
||||
- (NSXMLElement *)sentMessageCarbon;
|
||||
|
||||
- (BOOL)isMessageCarbon;
|
||||
- (BOOL)isReceivedMessageCarbon;
|
||||
- (BOOL)isSentMessageCarbon;
|
||||
- (BOOL)isTrustedMessageCarbon;
|
||||
- (BOOL)isTrustedMessageCarbonForMyJID:(XMPPJID *)jid;
|
||||
|
||||
- (XMPPMessage *)messageCarbonForwardedMessage;
|
||||
|
||||
- (void)addPrivateMessageCarbons;
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,118 @@
|
||||
#import "XMPPMessage+XEP_0280.h"
|
||||
#import "XMPPJID.h"
|
||||
#import "NSXMLElement+XMPP.h"
|
||||
#import "NSXMLElement+XEP_0297.h"
|
||||
|
||||
#if ! __has_feature(objc_arc)
|
||||
#warning This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC).
|
||||
#endif
|
||||
|
||||
#define XMLNS_XMPP_MESSAGE_CARBONS @"urn:xmpp:carbons:2"
|
||||
|
||||
@implementation XMPPMessage (XEP_0280)
|
||||
|
||||
- (NSXMLElement *)receivedMessageCarbon
|
||||
{
|
||||
return [self elementForName:@"received" xmlns:XMLNS_XMPP_MESSAGE_CARBONS];
|
||||
}
|
||||
|
||||
- (NSXMLElement *)sentMessageCarbon
|
||||
{
|
||||
return [self elementForName:@"sent" xmlns:XMLNS_XMPP_MESSAGE_CARBONS];
|
||||
}
|
||||
|
||||
|
||||
- (BOOL)isMessageCarbon
|
||||
{
|
||||
if([self isReceivedMessageCarbon] || [self isSentMessageCarbon])
|
||||
{
|
||||
return YES;
|
||||
}
|
||||
else
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
|
||||
- (BOOL)isReceivedMessageCarbon
|
||||
{
|
||||
if([self receivedMessageCarbon])
|
||||
{
|
||||
return YES;
|
||||
}
|
||||
else
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
|
||||
- (BOOL)isSentMessageCarbon
|
||||
{
|
||||
if([self sentMessageCarbon])
|
||||
{
|
||||
return YES;
|
||||
}
|
||||
else
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
|
||||
- (BOOL)isTrustedMessageCarbon
|
||||
{
|
||||
BOOL isTrustedMessageCarbon = NO;
|
||||
XMPPMessage *messageCarbonForwardedMessage = [self messageCarbonForwardedMessage];
|
||||
|
||||
if([self isSentMessageCarbon])
|
||||
{
|
||||
if([[self from] isEqualToJID:[messageCarbonForwardedMessage from] options:XMPPJIDCompareBare])
|
||||
{
|
||||
isTrustedMessageCarbon = YES;
|
||||
}
|
||||
|
||||
}
|
||||
else if([self isReceivedMessageCarbon])
|
||||
{
|
||||
if([[self from] isEqualToJID:[messageCarbonForwardedMessage to] options:XMPPJIDCompareBare])
|
||||
{
|
||||
isTrustedMessageCarbon = YES;
|
||||
}
|
||||
}
|
||||
|
||||
return isTrustedMessageCarbon;
|
||||
}
|
||||
|
||||
- (BOOL)isTrustedMessageCarbonForMyJID:(XMPPJID *)jid
|
||||
{
|
||||
if([self isTrustedMessageCarbon] && [[jid bareJID] isEqualToJID:self.from])
|
||||
{
|
||||
return YES;
|
||||
}
|
||||
else
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
|
||||
- (XMPPMessage *)messageCarbonForwardedMessage
|
||||
{
|
||||
NSXMLElement *carbon = nil;
|
||||
|
||||
if([self receivedMessageCarbon])
|
||||
{
|
||||
carbon = [self receivedMessageCarbon];
|
||||
}
|
||||
else if([self sentMessageCarbon])
|
||||
{
|
||||
carbon = [self sentMessageCarbon];
|
||||
}
|
||||
|
||||
return [carbon forwardedMessage];
|
||||
}
|
||||
|
||||
- (void)addPrivateMessageCarbons
|
||||
{
|
||||
[self addChild:[NSXMLElement elementWithName:@"private" xmlns:XMLNS_XMPP_MESSAGE_CARBONS]];
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,65 @@
|
||||
#import "XMPPModule.h"
|
||||
@class XMPPMessage;
|
||||
@class XMPPIDTracker;
|
||||
|
||||
#define _XMPP_MESSAGE_CARBONS_H
|
||||
|
||||
@interface XMPPMessageCarbons : XMPPModule
|
||||
{
|
||||
BOOL autoEnableMessageCarbons;
|
||||
BOOL allowsUntrustedMessageCarbons;
|
||||
BOOL messageCarbonsEnabled;
|
||||
|
||||
XMPPIDTracker *xmppIDTracker;
|
||||
}
|
||||
|
||||
/**
|
||||
* Wether or not to automatically enable Message Carbons.
|
||||
*
|
||||
* Default YES
|
||||
**/
|
||||
@property (assign) BOOL autoEnableMessageCarbons;
|
||||
|
||||
/**
|
||||
* Wether Message Carbons is currently enabled or not.
|
||||
*
|
||||
* @see enableMessageCarbons
|
||||
* @see disableMessageCarbons
|
||||
**/
|
||||
@property (assign, getter = isMessageCarbonsEnabled,readonly) BOOL messageCarbonsEnabled;
|
||||
|
||||
/**
|
||||
* Whether Message Carbons are validated before calling the delegate methods.
|
||||
*
|
||||
* @see xmppMessageCarbons:willReceiveMessage:outgoing:
|
||||
* @see xmppMessageCarbons:didReceiveMessage:outgoing:
|
||||
*
|
||||
* A Message Carbon is Trusted if:
|
||||
*
|
||||
* - It is from the Stream's Bare JID
|
||||
* - Sent Forward Messages are from the Stream's JID
|
||||
* - Received Forward Messages are to the Stream's JID
|
||||
*
|
||||
* Default is NO
|
||||
**/
|
||||
@property (assign) BOOL allowsUntrustedMessageCarbons;
|
||||
|
||||
/**
|
||||
* Enable Message Carbons
|
||||
**/
|
||||
- (void)enableMessageCarbons;
|
||||
|
||||
/**
|
||||
* Disable Message Carbons
|
||||
**/
|
||||
- (void)disableMessageCarbons;
|
||||
|
||||
@end
|
||||
|
||||
@protocol XMPPMessageCarbonsDelegate <NSObject>
|
||||
|
||||
- (void)xmppMessageCarbons:(XMPPMessageCarbons *)xmppMessageCarbons willReceiveMessage:(XMPPMessage *)message outgoing:(BOOL)isOutgoing;
|
||||
|
||||
- (void)xmppMessageCarbons:(XMPPMessageCarbons *)xmppMessageCarbons didReceiveMessage:(XMPPMessage *)message outgoing:(BOOL)isOutgoing;
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,293 @@
|
||||
#import "XMPPMessageCarbons.h"
|
||||
#import "XMPP.h"
|
||||
#import "XMPPFramework.h"
|
||||
#import "XMPPLogging.h"
|
||||
#import "XMPPIDTracker.h"
|
||||
#import "NSXMLElement+XEP_0297.h"
|
||||
#import "XMPPMessage+XEP_0280.h"
|
||||
#import "XMPPInternal.h"
|
||||
|
||||
#if ! __has_feature(objc_arc)
|
||||
#warning This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC).
|
||||
#endif
|
||||
|
||||
// Log levels: off, error, warn, info, verbose
|
||||
// Log flags: trace
|
||||
#if DEBUG
|
||||
static const int xmppLogLevel = XMPP_LOG_LEVEL_VERBOSE; // | XMPP_LOG_FLAG_TRACE;
|
||||
#else
|
||||
static const int xmppLogLevel = XMPP_LOG_LEVEL_WARN;
|
||||
#endif
|
||||
|
||||
|
||||
#define XMLNS_XMPP_MESSAGE_CARBONS @"urn:xmpp:carbons:2"
|
||||
|
||||
@implementation XMPPMessageCarbons
|
||||
|
||||
- (id)initWithDispatchQueue:(dispatch_queue_t)queue
|
||||
{
|
||||
if((self = [super initWithDispatchQueue:queue]))
|
||||
{
|
||||
autoEnableMessageCarbons = YES;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (BOOL)activate:(XMPPStream *)aXmppStream
|
||||
{
|
||||
XMPPLogTrace();
|
||||
|
||||
if ([super activate:aXmppStream])
|
||||
{
|
||||
XMPPLogVerbose(@"%@: Activated", THIS_FILE);
|
||||
|
||||
xmppIDTracker = [[XMPPIDTracker alloc] initWithDispatchQueue:moduleQueue];
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (void)deactivate
|
||||
{
|
||||
XMPPLogTrace();
|
||||
|
||||
dispatch_block_t block = ^{ @autoreleasepool {
|
||||
|
||||
[xmppIDTracker removeAllIDs];
|
||||
xmppIDTracker = nil;
|
||||
|
||||
}};
|
||||
|
||||
if (dispatch_get_specific(moduleQueueTag))
|
||||
block();
|
||||
else
|
||||
dispatch_sync(moduleQueue, block);
|
||||
|
||||
[super deactivate];
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
#pragma mark Properties
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
- (BOOL)autoEnableMessageCarbons
|
||||
{
|
||||
__block BOOL result = NO;
|
||||
|
||||
dispatch_block_t block = ^{
|
||||
result = autoEnableMessageCarbons;
|
||||
};
|
||||
|
||||
if (dispatch_get_specific(moduleQueueTag))
|
||||
block();
|
||||
else
|
||||
dispatch_sync(moduleQueue, block);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
- (void)setAutoEnableMessageCarbons:(BOOL)flag
|
||||
{
|
||||
dispatch_block_t block = ^{
|
||||
autoEnableMessageCarbons = flag;
|
||||
};
|
||||
|
||||
if (dispatch_get_specific(moduleQueueTag))
|
||||
block();
|
||||
else
|
||||
dispatch_async(moduleQueue, block);
|
||||
}
|
||||
|
||||
- (BOOL)isMessageCarbonsEnabled
|
||||
{
|
||||
__block BOOL result = NO;
|
||||
|
||||
dispatch_block_t block = ^{
|
||||
result = messageCarbonsEnabled;
|
||||
};
|
||||
|
||||
if (dispatch_get_specific(moduleQueueTag))
|
||||
block();
|
||||
else
|
||||
dispatch_sync(moduleQueue, block);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
- (BOOL)allowsUntrustedMessageCarbons
|
||||
{
|
||||
__block BOOL result = NO;
|
||||
|
||||
dispatch_block_t block = ^{
|
||||
result = allowsUntrustedMessageCarbons;
|
||||
};
|
||||
|
||||
if (dispatch_get_specific(moduleQueueTag))
|
||||
block();
|
||||
else
|
||||
dispatch_sync(moduleQueue, block);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
- (void)setAllowsUntrustedMessageCarbons:(BOOL)flag
|
||||
{
|
||||
dispatch_block_t block = ^{
|
||||
allowsUntrustedMessageCarbons = flag;
|
||||
};
|
||||
|
||||
if (dispatch_get_specific(moduleQueueTag))
|
||||
block();
|
||||
else
|
||||
dispatch_async(moduleQueue, block);
|
||||
}
|
||||
|
||||
- (void)enableMessageCarbons
|
||||
{
|
||||
dispatch_block_t block = ^{
|
||||
|
||||
if(!messageCarbonsEnabled && [xmppIDTracker numberOfIDs] == 0)
|
||||
{
|
||||
NSString *elementID = [XMPPStream generateUUID];
|
||||
XMPPIQ *iq = [XMPPIQ iqWithType:@"set" elementID:elementID];
|
||||
[iq setXmlns:@"jabber:client"];
|
||||
|
||||
NSXMLElement *enable = [NSXMLElement elementWithName:@"enable" xmlns:XMLNS_XMPP_MESSAGE_CARBONS];
|
||||
[iq addChild:enable];
|
||||
|
||||
[xmppIDTracker addElement:iq
|
||||
target:self
|
||||
selector:@selector(enableMessageCarbonsIQ:withInfo:)
|
||||
timeout:XMPPIDTrackerTimeoutNone];
|
||||
|
||||
[xmppStream sendElement:iq];
|
||||
}
|
||||
};
|
||||
|
||||
if (dispatch_get_specific(moduleQueueTag))
|
||||
block();
|
||||
else
|
||||
dispatch_sync(moduleQueue, block);
|
||||
}
|
||||
|
||||
- (void)disableMessageCarbons
|
||||
{
|
||||
dispatch_block_t block = ^{
|
||||
|
||||
if(messageCarbonsEnabled && [xmppIDTracker numberOfIDs] == 0)
|
||||
{
|
||||
NSString *elementID = [XMPPStream generateUUID];
|
||||
|
||||
XMPPIQ *iq = [XMPPIQ iqWithType:@"set" elementID:elementID];
|
||||
[iq setXmlns:@"jabber:client"];
|
||||
|
||||
NSXMLElement *enable = [NSXMLElement elementWithName:@"disable" xmlns:XMLNS_XMPP_MESSAGE_CARBONS];
|
||||
[iq addChild:enable];
|
||||
|
||||
[xmppIDTracker addElement:iq
|
||||
target:self
|
||||
selector:@selector(disableMessageCarbonsIQ:withInfo:)
|
||||
timeout:XMPPIDTrackerTimeoutNone];
|
||||
|
||||
[xmppStream sendElement:iq];
|
||||
}
|
||||
};
|
||||
|
||||
if (dispatch_get_specific(moduleQueueTag))
|
||||
block();
|
||||
else
|
||||
dispatch_sync(moduleQueue, block);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
#pragma mark XMPPStream Delegate
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender
|
||||
{
|
||||
XMPPLogTrace();
|
||||
|
||||
messageCarbonsEnabled = NO;
|
||||
|
||||
if(self.autoEnableMessageCarbons)
|
||||
{
|
||||
[self enableMessageCarbons];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)xmppStreamDidDisconnect:(XMPPStream *)sender withError:(NSError *)error
|
||||
{
|
||||
messageCarbonsEnabled = NO;
|
||||
}
|
||||
|
||||
- (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq
|
||||
{
|
||||
[xmppIDTracker invokeForID:[iq elementID] withObject:iq];
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
#pragma mark XMPPStream Delegate
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
- (void)enableMessageCarbonsIQ:(XMPPIQ *)iq withInfo:(XMPPBasicTrackingInfo *)trackerInfo
|
||||
{
|
||||
XMPPLogTrace();
|
||||
|
||||
if([iq isResultIQ])
|
||||
{
|
||||
messageCarbonsEnabled = YES;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)disableMessageCarbonsIQ:(XMPPIQ *)iq withInfo:(XMPPBasicTrackingInfo *)trackerInfo
|
||||
{
|
||||
XMPPLogTrace();
|
||||
|
||||
if([iq isResultIQ])
|
||||
{
|
||||
messageCarbonsEnabled = NO;
|
||||
}
|
||||
}
|
||||
|
||||
- (XMPPMessage *)xmppStream:(XMPPStream *)sender willReceiveMessage:(XMPPMessage *)message
|
||||
{
|
||||
XMPPLogTrace();
|
||||
|
||||
if([message isTrustedMessageCarbonForMyJID:sender.myJID] ||
|
||||
([message isMessageCarbon] && allowsUntrustedMessageCarbons))
|
||||
{
|
||||
BOOL outgoing = [message isSentMessageCarbon];
|
||||
|
||||
XMPPMessage *messageCarbonForwardedMessage = [message messageCarbonForwardedMessage];
|
||||
|
||||
[multicastDelegate xmppMessageCarbons:self
|
||||
willReceiveMessage:messageCarbonForwardedMessage
|
||||
outgoing:outgoing];
|
||||
}
|
||||
|
||||
return message;
|
||||
}
|
||||
|
||||
- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message
|
||||
{
|
||||
XMPPLogTrace();
|
||||
|
||||
if([message isTrustedMessageCarbonForMyJID:sender.myJID] ||
|
||||
([message isMessageCarbon] && allowsUntrustedMessageCarbons))
|
||||
{
|
||||
BOOL outgoing = [message isSentMessageCarbon];
|
||||
|
||||
XMPPMessage *messageCarbonForwardedMessage = [message messageCarbonForwardedMessage];
|
||||
|
||||
[multicastDelegate xmppMessageCarbons:self
|
||||
didReceiveMessage:messageCarbonForwardedMessage
|
||||
outgoing:outgoing];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
Reference in new issue
Block a user