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