Permalink
Browse files

Adding XEP-0016 - privacy lists

  • Loading branch information...
1 parent aa2e3d1 commit 28c3e77a07f097cf15187e0bd808dd6711b4dc35 @robbiehanson committed May 22, 2012
Showing with 1,238 additions and 0 deletions.
  1. +229 −0 Extensions/XEP-0016/XMPPPrivacy.h
  2. +1,009 −0 Extensions/XEP-0016/XMPPPrivacy.m
@@ -0,0 +1,229 @@
+#import <Foundation/Foundation.h>
+#import "XMPPModule.h"
+
+#if TARGET_OS_IPHONE
+ #import "DDXML.h"
+#endif
+
+@class XMPPIQ;
+
+extern NSString *const XMPPPrivacyErrorDomain;
+
+typedef enum XMPPPrivacyErrorCode
+{
+ XMPPPrivacyQueryTimeout, // No response from server
+ XMPPPrivacyDisconnect, // XMPP disconnection
+
+} XMPPPrivacyErrorCode;
+
+
+
+@interface XMPPPrivacy : XMPPModule
+{
+ BOOL autoRetrievePrivacyListNames;
+ BOOL autoRetrievePrivacyListItems;
+ BOOL autoClearPrivacyListInfo;
+
+ NSMutableDictionary *privacyDict;
+ NSString *activeListName;
+ NSString *defaultListName;
+
+ NSMutableDictionary *pendingQueries;
+}
+
+/**
+ * Whether or not the module should automatically retrieve the privacy list names.
+ * If this property is enabled, then the list is automatically fetched when the client signs in.
+ *
+ * The default value is YES.
+**/
+@property (readwrite, assign) BOOL autoRetrievePrivacyListNames;
+
+/**
+ * Whether or not the module should automatically retrieve the privacy list rules.
+ * If this property is enabled, then the rules for each privacy list are automatically fetched.
+ *
+ * In other words, if the privacy list names are fetched (either automatically, or via retrieveListNames),
+ * then the module will automatically fetch the associated rules.
+ * It will also update the set of rules if we receive a "privacy list push"
+ * from the server that another resource has changed one of the privacy lists.
+ *
+ * The default value is YES.
+**/
+@property (readwrite, assign) BOOL autoRetrievePrivacyListItems;
+
+/**
+ * Whether the module should automatically clear the privacy list info when the client disconnects.
+ *
+ * As per the XEP, if there are multiple resources signed in for the user,
+ * and one resource makes changes to a privacy list, all other resources are "pushed" a notification.
+ * However, if our client is disconnected when another resource makes the changes,
+ * then the only way we can find out about the changes are to redownload the privacy lists.
+ *
+ * It is recommended to clear the privacy list to assure we have the correct info.
+ * However, there may be specific situations in which an xmpp client can be sure the privacy list won't change.
+ *
+ * The default value is YES.
+**/
+@property (readwrite, assign) BOOL autoClearPrivacyListInfo;
+
+/**
+ * Manual fetch of list names and rules, and manual control over when to clear stored info.
+**/
+- (void)retrieveListNames;
+- (void)retrieveListWithName:(NSString *)privacyListName;
+- (void)clearPrivacyListInfo;
+
+/**
+ * Returns the privacy list names.
+ * This is an array of strings.
+**/
+- (NSArray *)listNames;
+
+/**
+ * Returns the privacy list rules/items for the given list name.
+ *
+ * The result is an array or privacy items (NSXMLElement's).
+ * The array is sorted according to order, where the item with the smallest 'order' is first in the array.
+**/
+- (NSArray *)listWithName:(NSString *)privacyListName;
+
+/**
+ * Returns information about the active list.
+ * If there is no active list, the methods return nil.
+ *
+ * The activeList method is a convenience method for [modPriv listWithName:[modPriv activeListName]]
+**/
+- (NSString *)activeListName;
+- (NSArray *)activeList;
+
+/**
+ * Returns information about the default list.
+ * If there is no default list, the methods return nil.
+ *
+ * The defaultList method is a convenience method for [modPriv listWithName:[modPriv defaultListName]]
+**/
+- (NSString *)defaultListName;
+- (NSArray *)defaultList;
+
+/**
+ * Changes the client's active privacy list to the list with the given name.
+ * The privacy list name must match the name of an existing privacy list.
+ *
+ * To decline the use of an active list simply pass nil to this method.
+ *
+ * Once the server has acknowledged the change,
+ * the delegate method xmppPrivacy:didSetActiveListName: will be invoked.
+ * If the server is unable to process the change (e.g. invalid list name),
+ * the delegate method xmppPrivacy:didNotSetActiveListName:error: will be invoked.
+ *
+ * The methods activeListName and activeList will update after the server acknowledges the change.
+**/
+- (void)setActiveListName:(NSString *)privacyListName;
+
+/**
+ * Changes the client's default privacy list to the list with the given name.
+ * The privacy list name must match the name of an existing privacy list.
+ *
+ * To decline the use of a default list simply pass nil to this method.
+ *
+ * Once the server has acknowledged the change,
+ * the delegate method xmppPrivacy:didSetDefaultListName: will be invoked.
+ * If the server is unable to process the change (e.g. invalid list name, in use by another resource),
+ * the delegate method xmppPrivacy:didNotSetDefaultListName:error: will be invoked.
+ *
+ * The methods defaultListName and defaultList will update after the server acknowledges the change.
+**/
+- (void)setDefaultListName:(NSString *)privacyListName;
+
+/**
+ * Adds/Edits/Removes a privacy list with the given name.
+ * The given array should contain only privacy items (NSXMLElement's).
+ *
+ * To remove a privacy list, invoke this method will a nil or empty items parameter.
+**/
+- (void)setListWithName:(NSString *)privacyListName items:(NSArray *)items;
+
+/**
+ * The following are convenience methods to create privacy item rules.
+ * A quick refresher from the XEP-0016 documentation is provided below.
+ *
+ * The 'type' attribute is OPTIONAL, and must be one of: jid|group|subscription
+ *
+ * If the 'type' is 'jid', then the 'value' must contain a valid JID.
+ * JIDs are to be matched in the following order:
+ *
+ * - <user@domain/resource> (only that resource matches)
+ * - <user@domain> (any resource matches)
+ * - <domain/resource> (only that resource matches)
+ * - <domain> (the domain itself matches, as does any user@domain or domain/resource)
+ *
+ * If the 'type' is 'group', then the 'value' should contain the name of a group in the user's roster.
+ *
+ * If the 'type' is 'subscription', then the 'value' must be one of: both|to|from|none
+ *
+ * The 'action' attribute is MANDATORY and must be one of: allow|deny
+ *
+ * The 'order' attribute is MANDATORY and must be a non-negative integer that is unique among all items in the list.
+ * List items are processed by the server according to the 'order' attribute in ascending order. (0 before 1, etc)
+ * Once the server matches a privacy item in the list, it obeys the item and ceases processing.
+ *
+ * The privacy item may contain one or more child elements that specify more granular blocking control:
+ *
+ * - <message/> (blocks incoming message stanzas)
+ * - <iq/> (blocks incoming IQ stanzas)
+ * - <presence-in/> (blocks incoming presence notifications)
+ * - <presence-out/> (blocks outgoing presence notifications)
+**/
++ (NSXMLElement *)privacyItemWithAction:(NSString *)action order:(NSUInteger)order;
++ (NSXMLElement *)privacyItemWithType:(NSString *)type
+ value:(NSString *)value
+ action:(NSString *)action
+ order:(NSUInteger)order;
+
++ (void)blockIQs:(NSXMLElement *)privacyItem;
++ (void)blockMessages:(NSXMLElement *)privacyItem;
++ (void)blockPresenceIn:(NSXMLElement *)privacyItem;
++ (void)blockPresenceOut:(NSXMLElement *)privacyItem;
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark -
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@protocol XMPPPrivacyDelegate
+@optional
+
+/**
+ * The following delegate methods correspond almost exactly with the action methods of the class.
+ * There are a few possible ways in which an action could fail:
+ *
+ * 1. We receive an error response from the server.
+ * 2. We receive no response from the server, and the query times out.
+ * 3. We get disconnected before we receive the response.
+ *
+ * In case number 1, the error will be an XMPPIQ of type='error'.
+ *
+ * In case number 2 or 3, the error will be an NSError
+ * with domain=XMPPPrivacyErrorDomain and code from the XMPPPrivacyErrorCode enumeration.
+**/
+
+- (void)xmppPrivacy:(XMPPPrivacy *)sender didReceiveListNames:(NSArray *)listNames;
+- (void)xmppPrivacy:(XMPPPrivacy *)sender didNotReceiveListNamesDueToError:(id)error;
+
+- (void)xmppPrivacy:(XMPPPrivacy *)sender didReceiveListWithName:(NSString *)name items:(NSArray *)items;
+- (void)xmppPrivacy:(XMPPPrivacy *)sender didNotReceiveListWithName:(NSString *)name error:(id)error;
+
+- (void)xmppPrivacy:(XMPPPrivacy *)sender didReceivePushWithListName:(NSString *)name;
+
+- (void)xmppPrivacy:(XMPPPrivacy *)sender didSetActiveListName:(NSString *)name;
+- (void)xmppPrivacy:(XMPPPrivacy *)sender didNotSetActiveListName:(NSString *)name error:(id)error;
+
+- (void)xmppPrivacy:(XMPPPrivacy *)sender didSetDefaultListName:(NSString *)name;
+- (void)xmppPrivacy:(XMPPPrivacy *)sender didNotSetDefaultListName:(NSString *)name error:(id)error;
+
+- (void)xmppPrivacy:(XMPPPrivacy *)sender didSetListWithName:(NSString *)name;
+- (void)xmppPrivacy:(XMPPPrivacy *)sender didNotSetListWithName:(NSString *)name error:(id)error;
+
+@end
Oops, something went wrong.

0 comments on commit 28c3e77

Please sign in to comment.