adium 3710:3efb758fa810: Add support for supported characters in...

commits at adium.im commits at adium.im
Sun Mar 6 20:39:00 UTC 2011


details:	http://hg.adium.im/adium/rev/3efb758fa810
revision:	3710:3efb758fa810
author:		Marc Kalmes <mkalmes at mkalmes.net>
date:		Sun Mar 06 19:49:30 2011 +0100

Add support for supported characters in jabber id (fixes #13099)

- Add method allowedCharactersInNode
- Add method allowedCharactersInDomain
- Add method allowedCharactersInResource
- Change implementation of allowedCharacters to call new methods
- Change implementation of allowedCharactersForUIDs to call allowedCharacters and new methods
Subject: adium 3711:c4c9de82acac: Add caching for results of allowdCharacters-methods

details:	http://hg.adium.im/adium/rev/c4c9de82acac
revision:	3711:c4c9de82acac
author:		Marc Kalmes <mkalmes at mkalmes.net>
date:		Sun Mar 06 21:14:43 2011 +0100

Add caching for results of allowdCharacters-methods

diffs (249 lines):

diff -r 84dbacf63812 -r c4c9de82acac Plugins/Purple Service/ESJabberService.h
--- a/Plugins/Purple Service/ESJabberService.h	Sat Mar 05 22:53:18 2011 +0100
+++ b/Plugins/Purple Service/ESJabberService.h	Sun Mar 06 21:14:43 2011 +0100
@@ -20,6 +20,9 @@
 
 @interface ESJabberService : PurpleService {
 	AMPurpleJabberMoodTooltip *moodTooltip;
+	NSCharacterSet *charactersInNode;
+	NSCharacterSet *charactersInDomain;
+	NSCharacterSet *charactersInResource;
 }
 
 @end
diff -r 84dbacf63812 -r c4c9de82acac Plugins/Purple Service/ESJabberService.m
--- a/Plugins/Purple Service/ESJabberService.m	Sat Mar 05 22:53:18 2011 +0100
+++ b/Plugins/Purple Service/ESJabberService.m	Sun Mar 06 21:14:43 2011 +0100
@@ -23,6 +23,15 @@
 #import <AIUtilities/AICharacterSetAdditions.h>
 #import <libpurple/jabber.h>
 
+ at interface ESJabberService ()
+
+- (NSCharacterSet *)allowedCharactersInNode;
+- (NSCharacterSet *)allowedCharactersInDomain;
+- (NSCharacterSet *)allowedCharactersInResource;
+
+ at end
+
+
 @implementation ESJabberService
 
 - (id)init
@@ -39,6 +48,9 @@
 {
 	[adium.interfaceController unregisterContactListTooltipEntry:moodTooltip secondaryEntry:YES];
 	[moodTooltip release]; moodTooltip = nil;
+	[charactersInNode release]; charactersInNode = nil;
+	[charactersInDomain release]; charactersInDomain = nil;
+	[charactersInResource release]; charactersInResource = nil;
 	
 	[super dealloc];
 }
@@ -86,6 +98,168 @@
 }
 
 /*!
+ * @brief Allowed characters in node of jid
+ *
+ * Jabber IDs are of the form [<node>"@"]<domain>["/"<resource>]
+ *
+ * This method returns a character set valid for the node part of a jid.
+ */
+- (NSCharacterSet *)allowedCharactersInNode
+{
+	/*
+	 * Valid unicode characters in node
+	 * <node> ::= <conforming-char>[<conforming-char>]*
+	 * <conforming-char> ::= #x21 | [#x23-#x25] | [#x28-#x2E] |
+	 * [#x30-#x39] | #x3B | #x3D | #x3F |
+	 * [#x41-#x7E] | [#x80-#xD7FF] |
+	 * [#xE000-#xFFFD] | [#x10000-#x10FFFF]
+	 */
+
+	if (!charactersInNode) {
+		NSRange x0021;
+		x0021.location			= (unsigned int)'!';
+		x0021.length			= 1;
+
+		NSRange x0023_0025;
+		x0023_0025.location		= (unsigned int)'#';
+		x0023_0025.length		= 3;
+
+		NSRange x0028_002E;
+		x0028_002E.location		= (unsigned int)'(';
+		x0028_002E.length		= 7;
+
+		NSRange x0030_0039;
+		x0030_0039.location		= (unsigned int)'0';
+		x0030_0039.length		= 10;
+
+		NSRange x003B;
+		x003B.location			= (unsigned int)';';
+		x003B.length			= 1;
+
+		NSRange x003D;
+		x003D.location			= (unsigned int)'=';
+		x003D.length			= 1;
+
+		NSRange x003F;
+		x003F.location			= (unsigned int)'?';
+		x003F.length			= 1;
+
+		NSRange x0041_007E;
+		x0041_007E.location		= (unsigned int)'A';
+		x0041_007E.length		= 62;
+
+		NSRange x0080_D7FF;
+		x0080_D7FF.location		= (unsigned int)0x0080;
+		x0080_D7FF.length		= 55168;
+
+		NSRange xE000_FFFD;
+		xE000_FFFD.location		= (unsigned int)0xe000;
+		xE000_FFFD.length		= 8190;
+
+		NSRange x10000_10FFFF;
+		x10000_10FFFF.location	= (unsigned int)0x10000;
+		x10000_10FFFF.length	= 1048576;
+
+
+		NSMutableCharacterSet *allowedCharactersInNode = [[NSMutableCharacterSet alloc] init];
+		[allowedCharactersInNode addCharactersInRange:x0021];
+		[allowedCharactersInNode addCharactersInRange:x0023_0025];
+		[allowedCharactersInNode addCharactersInRange:x0028_002E];
+		[allowedCharactersInNode addCharactersInRange:x0030_0039];
+		[allowedCharactersInNode addCharactersInRange:x003B];
+		[allowedCharactersInNode addCharactersInRange:x003D];
+		[allowedCharactersInNode addCharactersInRange:x003F];
+		[allowedCharactersInNode addCharactersInRange:x0041_007E];
+		[allowedCharactersInNode addCharactersInRange:x0080_D7FF];
+		[allowedCharactersInNode addCharactersInRange:xE000_FFFD];
+		[allowedCharactersInNode addCharactersInRange:x10000_10FFFF];
+
+
+		charactersInNode = [allowedCharactersInNode immutableCopy];
+		[allowedCharactersInNode release];
+	}
+
+	return charactersInNode;
+}
+
+/*!
+ * @brief Allowed characters in domain of jid
+ *
+ * Jabber IDs are of the form [<node>"@"]<domain>["/"<resource>]
+ *
+ * This method returns a character set valid for the domain part of a jid.
+ */
+- (NSCharacterSet *)allowedCharactersInDomain
+{
+	/*
+	 * <domain> ::= <hname>["."<hname>]*
+	 * <hname> ::= <let>|<dig>[[<let>|<dig>|"-"]*<let>|<dig>]
+	 * <let> ::= [a-z] | [A-Z]
+	 * <dig> ::= [0-9]
+	 */
+
+	if (!charactersInDomain) {
+		NSRange lowerCaseLetters;
+		lowerCaseLetters.location	= (unsigned int)'a';
+		lowerCaseLetters.length		= 26;
+
+		NSRange upperCaseLatters;
+		upperCaseLatters.location	= (unsigned int)'A';
+		upperCaseLatters.length		= 26;
+
+		NSMutableCharacterSet *allowedCharactersInDomain = [[NSMutableCharacterSet alloc] init];
+		[allowedCharactersInDomain addCharactersInRange:lowerCaseLetters];
+		[allowedCharactersInDomain addCharactersInRange:upperCaseLatters];
+		[allowedCharactersInDomain addCharactersInString:@"-."];
+
+		charactersInDomain = [allowedCharactersInDomain immutableCopy];
+		[allowedCharactersInDomain release];
+	}
+
+	return charactersInDomain;
+}
+
+/*!
+ * @brief Allowed characters in resource of jid
+ *
+ * Jabber IDs are of the form [<node>"@"]<domain>["/"<resource>]
+ *
+ * This method returns a character set valid for the resource part of a jid.
+ */
+- (NSCharacterSet *)allowedCharactersInResource
+{
+	/*
+	 * <resource> ::= <any-char>[<any-char>]*
+	 * <any-char> ::= [#x20-#xD7FF] | [#xE000-#xFFFD] |
+	 * [#x10000-#x10FFFF]
+	 */
+
+	if (!charactersInResource) {
+		NSRange x0020_D7FF;
+		x0020_D7FF.location	= (unsigned int)0x0020;
+		x0020_D7FF.length	= 55264;
+
+		NSRange xE000_FFFD;
+		xE000_FFFD.location	= (unsigned int)0xe000;
+		xE000_FFFD.length	= 8190;
+
+		NSRange x10000_10FFFF;
+		x10000_10FFFF.location	= (unsigned int)0x10000;
+		x10000_10FFFF.length	= 1048576;
+
+		NSMutableCharacterSet *allowedCharactersInResource = [[NSMutableCharacterSet alloc] init];
+		[allowedCharactersInResource addCharactersInRange:x0020_D7FF];
+		[allowedCharactersInResource addCharactersInRange:xE000_FFFD];
+		[allowedCharactersInResource addCharactersInRange:x10000_10FFFF];
+
+		charactersInResource = [allowedCharactersInResource immutableCopy];
+		[allowedCharactersInResource release];
+	}
+
+	return charactersInResource;
+}
+
+/*!
  * @brief Allowed characters
  * 
  * Jabber IDs are generally of the form username at server.org
@@ -93,11 +267,16 @@
  * Some rare Jabber servers assign actual IDs with %. Allow this for transport names such as
  * username%hotmail.com at msn.blah.jabber.org as well.
  */
-- (NSCharacterSet *)allowedCharacters{
-	NSMutableCharacterSet	*allowedCharacters = [[NSCharacterSet alphanumericCharacterSet] mutableCopy];
+- (NSCharacterSet *)allowedCharacters
+{
+	NSMutableCharacterSet	*allowedCharacters = [[NSCharacterSet alloc] init];
+	NSCharacterSet			*nodeSet = [self allowedCharactersInNode];
+	NSCharacterSet			*domainSet = [self allowedCharactersInDomain];
 	NSCharacterSet			*returnSet;
 
-	[allowedCharacters addCharactersInString:@"._ at -()[]^%#|\\`="];
+	[allowedCharacters formUnionWithCharacterSet:nodeSet];
+	[allowedCharacters addCharactersInString:@"@"];
+	[allowedCharacters formUnionWithCharacterSet:domainSet];
 	returnSet = [allowedCharacters immutableCopy];
 	[allowedCharacters release];
 
@@ -109,11 +288,14 @@
  *
  * Same as allowedCharacters, but also allow / for specifying a resource.
  */
-- (NSCharacterSet *)allowedCharactersForUIDs{
-	NSMutableCharacterSet	*allowedCharacters = [[NSCharacterSet alphanumericCharacterSet] mutableCopy];
+- (NSCharacterSet *)allowedCharactersForUIDs
+{
+	NSMutableCharacterSet	*allowedCharacters = [[self allowedCharacters] mutableCopy];
+	NSCharacterSet			*resourceSet = [self allowedCharactersInResource];
 	NSCharacterSet			*returnSet;
 
-	[allowedCharacters addCharactersInString:@"._ at -()[]^%#|\\/+`="];
+	[allowedCharacters addCharactersInString:@"/"];
+	[allowedCharacters formUnionWithCharacterSet:resourceSet];
 	returnSet = [allowedCharacters immutableCopy];
 	[allowedCharacters release];
 	




More information about the commits mailing list