Monotone-Parent: c85488a496026efc268c07b0e8c84d1c1d1983d7

Monotone-Revision: 42e55c8292b29dad1cd5260453c22ca05fb07f6e

Monotone-Author: wsourdeau@inverse.ca
Monotone-Date: 2010-02-19T16:25:55
Monotone-Branch: ca.inverse.sogo
maint-2.0.2
Wolfgang Sourdeau 2010-02-19 16:25:55 +00:00
parent fb12309ed4
commit 24e065f45a
3 changed files with 63 additions and 20 deletions

View File

@ -1,5 +1,8 @@
2010-02-19 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* SoObjects/Mailer/SOGoMailAccount.m (-imapAclConformsToIMAPExt:)
now based on the server's capability string.
* UI/MailerUI/UIxMailFolderActions.m (-createFolderAction): we
check if the clientObject responds to "aboluteImap4Name",
otherwise the subscription is made to the folderName alone.

View File

@ -2236,7 +2236,28 @@ Index: sope-mime/NGImap4/NGImap4ResponseParser.m
- (BOOL)_parseACLResponseIntoHashMap:(NGMutableHashMap *)result_ {
/*
21 GETACL INBOX
@@ -1030,10 +1324,15 @@
@@ -734,6 +1028,7 @@
NSMutableArray *uids;
NSMutableArray *rights;
NSDictionary *result;
+ int length;
if (!_matchesString(self, "ACL "))
return NO;
@@ -750,6 +1045,12 @@
enumerator = [[acls componentsSeparatedByString:@" "] objectEnumerator];
while ((obj = [enumerator nextObject]) != nil) {
+ if ([obj characterAtIndex: 0] == '"') {
+ length = [obj length];
+ if ([obj characterAtIndex: length - 1] == '"') {
+ obj = [obj substringFromRange: NSMakeRange (1, length - 2)];
+ }
+ }
[uids addObject:obj];
obj = [enumerator nextObject];
[rights addObject:(obj != nil ? obj : (id)@"")];
@@ -1030,10 +1331,15 @@
_consume(self, 7);
if (_la(self, 0) == '"') {
@ -2254,7 +2275,7 @@ Index: sope-mime/NGImap4/NGImap4ResponseParser.m
else {
name = _parseUntil(self, ' ');
}
@@ -1073,51 +1372,6 @@
@@ -1073,51 +1379,6 @@
return YES;
}
@ -2306,7 +2327,7 @@ Index: sope-mime/NGImap4/NGImap4ResponseParser.m
- (id)_decodeQP:(id)_string headerField:(NSString *)_field {
if (![_string isNotNull])
return _string;
@@ -1185,7 +1439,7 @@
@@ -1185,7 +1446,7 @@
route = [self _parseQuotedStringOrNIL]; [self _consumeOptionalSpace];
mailbox = [self _parseQuotedStringOrNIL]; [self _consumeOptionalSpace];
host = [self _parseQuotedStringOrNIL]; [self _consumeOptionalSpace];
@ -2315,7 +2336,7 @@ Index: sope-mime/NGImap4/NGImap4ResponseParser.m
if (_la(self, 0) != ')') {
[self logWithFormat:@"WARNING: IMAP4 envelope "
@"address not properly closed (c0=%c,c1=%c): %@",
@@ -1197,6 +1451,7 @@
@@ -1197,6 +1458,7 @@
address = [[NGImap4EnvelopeAddress alloc] initWithPersonalName:pname
sourceRoute:route mailbox:mailbox
host:host];
@ -2323,7 +2344,7 @@ Index: sope-mime/NGImap4/NGImap4ResponseParser.m
return address;
}
@@ -1382,7 +1637,15 @@
@@ -1382,7 +1644,15 @@
#if 0
[self logWithFormat:@"PARSE KEY: %@", key];
#endif
@ -2340,7 +2361,7 @@ Index: sope-mime/NGImap4/NGImap4ResponseParser.m
NSDictionary *content;
if ((content = [self _parseBodyContent]) != nil)
@@ -1594,8 +1857,11 @@
@@ -1594,8 +1864,11 @@
if (_decode)
data = [data decodeQuotedPrintableValueOfMIMEHeaderField:nil];
@ -2354,7 +2375,7 @@ Index: sope-mime/NGImap4/NGImap4ResponseParser.m
}
else {
str = _parseUntil2(self, ' ', ')');
@@ -1620,13 +1886,35 @@
@@ -1620,13 +1893,35 @@
return str;
}
@ -2391,7 +2412,7 @@ Index: sope-mime/NGImap4/NGImap4ResponseParser.m
static NSDictionary *_parseBodyParameterList(NGImap4ResponseParser *self)
{
NSMutableDictionary *list;
@@ -1646,7 +1934,7 @@
@@ -1646,7 +1941,7 @@
_consumeIfMatch(self, ' ');
value = _parseBodyDecodeString(self, YES, YES);
@ -2400,7 +2421,7 @@ Index: sope-mime/NGImap4/NGImap4ResponseParser.m
}
_consumeIfMatch(self, ')');
}
@@ -1731,13 +2019,14 @@
@@ -1731,13 +2026,14 @@
static NSDictionary *_parseSingleBody(NGImap4ResponseParser *self,
BOOL isBodyStructure) {
NSString *type, *subtype, *bodyId, *description,
@ -2417,7 +2438,7 @@ Index: sope-mime/NGImap4/NGImap4ResponseParser.m
_consumeIfMatch(self, ' ');
parameterList = _parseBodyParameterList(self);
_consumeIfMatch(self, ' ');
@@ -1762,13 +2051,18 @@
@@ -1762,13 +2058,18 @@
_consumeIfMatch(self, ' ');
[dict setObject:_parseBodyString(self, YES) forKey:@"lines"];
}
@ -2439,7 +2460,7 @@ Index: sope-mime/NGImap4/NGImap4ResponseParser.m
_consumeIfMatch(self, ' ');
[dict setObject:_parseParenthesizedAddressList(self) forKey:@"from"];
_consumeIfMatch(self, ' ');
@@ -1783,14 +2077,20 @@
@@ -1783,14 +2084,20 @@
_consumeIfMatch(self, ' ');
[dict setObject:_parseParenthesizedAddressList(self) forKey:@"bcc"];
_consumeIfMatch(self, ' ');
@ -2463,7 +2484,7 @@ Index: sope-mime/NGImap4/NGImap4ResponseParser.m
}
}
@@ -1805,14 +2105,9 @@
@@ -1805,14 +2112,9 @@
forKey: @"disposition"];
if (_la(self, 0) != ')') {
_consume(self,1);
@ -2481,7 +2502,7 @@ Index: sope-mime/NGImap4/NGImap4ResponseParser.m
if (_la(self, 0) != ')') {
_consume(self,1);
[dict setObject: _parseBodyString(self, YES)
@@ -1829,6 +2124,7 @@
@@ -1829,6 +2131,7 @@
static NSDictionary *_parseMultipartBody(NGImap4ResponseParser *self,
BOOL isBodyStructure) {
NSMutableArray *parts;
@ -2489,7 +2510,7 @@ Index: sope-mime/NGImap4/NGImap4ResponseParser.m
NSString *kind;
NSMutableDictionary *dict;
@@ -1854,14 +2150,9 @@
@@ -1854,14 +2157,9 @@
forKey: @"disposition"];
if (_la(self, 0) != ')') {
_consume(self,1);
@ -2507,7 +2528,7 @@ Index: sope-mime/NGImap4/NGImap4ResponseParser.m
if (_la(self, 0) != ')') {
_consume(self,1);
[dict setObject: _parseBodyString(self, YES)
@@ -2170,6 +2461,21 @@
@@ -2170,6 +2468,21 @@
}
}
@ -2529,7 +2550,7 @@ Index: sope-mime/NGImap4/NGImap4ResponseParser.m
- (NSException *)exceptionForFailedMatch:(unsigned char)_match
got:(unsigned char)_avail
{
@@ -2225,9 +2531,9 @@
@@ -2225,9 +2538,9 @@
[s release];
if (c == '\n') {
@ -2545,7 +2566,13 @@ Index: sope-mime/NGImap4/ChangeLog
===================================================================
--- sope-mime/NGImap4/ChangeLog (revision 1664)
+++ sope-mime/NGImap4/ChangeLog (working copy)
@@ -1,3 +1,127 @@
@@ -1,3 +1,133 @@
+2010-02-19 Wolfgang Sourdeau <wsourdeau@inverse.ca>
+
+ * NGImap4ResponseParser.m (_parseACLResponseIntoHashMap:): user
+ ids enclosed in quotes are extracted from them, for servers not
+ following the standards properly.
+
+2010-02-18 Wolfgang Sourdeau <wsourdeau@inverse.ca>
+
+ * NGImap4ResponseParser.m (-parseResponseForTagId:exception:): the

View File

@ -197,13 +197,26 @@ static NSString *sieveScriptName = @"sogo";
return imapAclStyle;
}
/* see http://tools.ietf.org/id/draft-ietf-imapext-acl */
- (BOOL) imapAclConformsToIMAPExt
{
SOGoDomainDefaults *dd;
NGImap4Client *imapClient;
NSArray *capability;
int count, max;
BOOL conforms;
dd = [[context activeUser] domainDefaults];
conforms = NO;
return [dd imapAclConformsToIMAPExt];
imapClient = [[self imap4Connection] client];
capability = [[imapClient capability] objectForKey: @"capability"];
max = [capability count];
for (count = 0; !conforms && count < max; count++)
{
if ([[capability objectAtIndex: count] hasPrefix: @"acl2"])
conforms = YES;
}
return conforms;
}
- (BOOL) supportsQuotas