This commit is contained in:
giuseppenuc committed 2016-02-24 16:56:39 +01:00
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
+118
View File
@@ -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
+65
View File
@@ -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
+293
View File
@@ -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