View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0002669 | SOGo | ActiveSync | public | 2014-03-20 19:55 | 2014-03-21 17:57 |
Reporter | tfu | Assigned To | ludovic | ||
Priority | normal | Severity | minor | Reproducibility | always |
Status | closed | Resolution | fixed | ||
Platform | [Client] Microsoft | OS | Windows | OS Version | 7 |
Product Version | 2.2.1 | ||||
Fixed in Version | 2.2.2 | ||||
Summary | 0002669: cannot send mails from a htc desire | ||||
Description | Trying to send mails from htc desire via activesync fails because the mail client on this (old) device sends mail as Content-Type: message/rfc822. For the error which occures see sogo.log (attached). With the hack in the attached patch the problem could be fixed. | ||||
Tags | No tags attached. | ||||
0001-htc-rfc822-mails.patch (2,667 bytes)
From 30cf92eb68eb00f89577a9d555f79bb3c78c65a9 Mon Sep 17 00:00:00 2001 From: root <root@example.com> Date: Thu, 20 Mar 2014 14:33:38 -0400 Subject: [PATCH] htc rfc822 mails --- ActiveSync/SOGoActiveSyncDispatcher.m | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/ActiveSync/SOGoActiveSyncDispatcher.m b/ActiveSync/SOGoActiveSyncDispatcher.m index 1143219..9ade60a 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher.m +++ b/ActiveSync/SOGoActiveSyncDispatcher.m @@ -1546,7 +1546,31 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [context setObject: deviceId forKey: @"DeviceId"]; [context setObject: [[theRequest uri] deviceType] forKey: @"DeviceType"]; - d = [[theRequest content] wbxml2xml]; + // htc desire z send mail with content-type message/rfc822 base64 encoded + if ([[theRequest headerForKey: @"content-type"] isEqualToString: @"message/rfc822"]) { + NSMutableString *myRFC822 = [NSMutableString string]; + NSMutableString *myRFC822_x = [NSMutableString string]; + + NSLog(@"tfu content %@ ", [theRequest contentAsString ]); + // tfu htc doesn't include date-header causing sogo to show null for the sent-date in sent-folder. Adding Date-Header here if not there + if ([ [theRequest contentAsString ] rangeOfString:@"Date:" options:NSCaseInsensitiveSearch].location == NSNotFound) { + NSLog(@"tfu no-date-header"); + [ myRFC822_x appendFormat: @"Date: %@\n%@", [[ NSDate date ] descriptionWithCalendarFormat: @"%a, %d %b %Y %H:%M:%S %z" timeZone: [NSTimeZone timeZoneWithName: @"GMT"] locale: nil ], [theRequest contentAsString ]]; + [ myRFC822 appendFormat: @"<?xml version=\"1.0\"?><!DOCTYPE ActiveSync PUBLIC \"-//MICROSOFT//DTD ActiveSync//EN\" \"http://www.microsoft.com/\"><SendMail xmlns=\"ComposeMail:\"><SaveInSentItems/><MIME>%@</MIME></SendMail>", [myRFC822_x stringByEncodingBase64]]; + } else { + NSLog(@"tfu date-header"); + [ myRFC822 appendFormat: @"<?xml version=\"1.0\"?><!DOCTYPE ActiveSync PUBLIC \"-//MICROSOFT//DTD ActiveSync//EN\" \"http://www.microsoft.com/\"><SendMail xmlns=\"ComposeMail:\"><SaveInSentItems/><MIME>%@</MIME></SendMail>", [[theRequest contentAsString ] stringByEncodingBase64]]; + } + + // tfu convert to wbxml and back to xml to ensure proper formating for further processing + d = [[[myRFC822 dataUsingEncoding: NSUTF8StringEncoding] xml2wbxml] wbxml2xml]; + + } + else + { + d = [[theRequest content] wbxml2xml]; + } + documentElement = nil; if (!d) -- 1.7.9.5 |
|
Does it work if you replace: d = [[[myRFC822 dataUsingEncoding: NSUTF8StringEncoding] xml2wbxml] wbxml2xml]; by: d = [myRFC822 dataUsingEncoding: NSASCIIStringEncoding] There shouldn't be any 8-bit characters in myRFC822 string, as the mail content is encoded in base64 and the rest is XML fluff. |
|
Yes it works: |
|
No... d = [myRFC822 dataUsingEncoding: NSASCIIStringEncoding]; and NOT: d = [[[myRFC822 dataUsingEncoding: NSASCIIStringEncoding] xml2wbxml] wbxml2xml]; Thanks! |
|
Yes it works. Thank You! |
|
Can you try the attached patch please? |
|
sendmail.patch (2,776 bytes)
diff --git a/ActiveSync/SOGoActiveSyncDispatcher.m b/ActiveSync/SOGoActiveSyncDispatcher.m index 1143219..f6ab9f5 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher.m +++ b/ActiveSync/SOGoActiveSyncDispatcher.m @@ -1546,15 +1546,50 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [context setObject: deviceId forKey: @"DeviceId"]; [context setObject: [[theRequest uri] deviceType] forKey: @"DeviceType"]; - d = [[theRequest content] wbxml2xml]; + cmdName = [[theRequest uri] command]; + + // + // If the MS-ASProtocolVersion header is set to "12.1", the body of the SendMail request is + // is a "message/rfc822" payload - otherwise, it's a WBXML blob. + // + if ([cmdName caseInsensitiveCompare: @"SendMail"] == NSOrderedSame && + [[theRequest headerForKey: @"content-type"] caseInsensitiveCompare: @"message/rfc822"] == NSOrderedSame) + { + NSMutableString *myRFC822; + + myRFC822 = [NSMutableString string]; + + if ([[theRequest contentAsString] rangeOfString: @"Date: " + options: NSCaseInsensitiveSearch].location == NSNotFound) + { + NSMutableString *myRFC822_x; + NSString *value; + + + value = [[NSDate date] descriptionWithCalendarFormat: @"%a, %d %b %Y %H:%M:%S %z" timeZone: [NSTimeZone timeZoneWithName: @"GMT"] locale: nil]; + myRFC822_x = [NSMutableString string]; + + [myRFC822_x appendFormat: @"Date: %@\n%@", value, [theRequest contentAsString]]; + [myRFC822 appendFormat: @"<?xml version=\"1.0\"?><!DOCTYPE ActiveSync PUBLIC \"-//MICROSOFT//DTD ActiveSync//EN\" \"http://www.microsoft.com/\"><SendMail xmlns=\"ComposeMail:\"><SaveInSentItems/><MIME>%@</MIME></SendMail>", [myRFC822_x stringByEncodingBase64]]; + } + else + { + [myRFC822 appendFormat: @"<?xml version=\"1.0\"?><!DOCTYPE ActiveSync PUBLIC \"-//MICROSOFT//DTD ActiveSync//EN\" \"http://www.microsoft.com/\"><SendMail xmlns=\"ComposeMail:\"><SaveInSentItems/><MIME>%@</MIME></SendMail>", [[theRequest contentAsString ] stringByEncodingBase64]]; + } + + d = [myRFC822 dataUsingEncoding: NSASCIIStringEncoding]; + } + else + { + d = [[theRequest content] wbxml2xml]; + } + documentElement = nil; if (!d) { // We check if it's a Ping command with no body. - // See http://msdn.microsoft.com/en-us/library/ee200913(v=exchg.80).aspx for details - cmdName = [[theRequest uri] command]; - + // See http://msdn.microsoft.com/en-us/library/ee200913(v=exchg.80).aspx for details if ([cmdName caseInsensitiveCompare: @"Ping"] != NSOrderedSame) return [NSException exceptionWithHTTPStatus: 500]; } |
|
Any chance you can test it rapidly? I would like to include the "sendmail.patch" in v2.2.2. Thanks, |
|
sendmail-cleaned.patch (2,386 bytes)
diff --git a/ActiveSync/SOGoActiveSyncDispatcher.m b/ActiveSync/SOGoActiveSyncDispatcher.m index 1143219..67fdc7e 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher.m +++ b/ActiveSync/SOGoActiveSyncDispatcher.m @@ -1546,15 +1546,45 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [context setObject: deviceId forKey: @"DeviceId"]; [context setObject: [[theRequest uri] deviceType] forKey: @"DeviceType"]; - d = [[theRequest content] wbxml2xml]; + cmdName = [[theRequest uri] command]; + + // + // If the MS-ASProtocolVersion header is set to "12.1", the body of the SendMail request is + // is a "message/rfc822" payload - otherwise, it's a WBXML blob. + // + if ([cmdName caseInsensitiveCompare: @"SendMail"] == NSOrderedSame && + [[theRequest headerForKey: @"content-type"] caseInsensitiveCompare: @"message/rfc822"] == NSOrderedSame) + { + NSString *s, *xml; + + if ([[theRequest contentAsString] rangeOfString: @"Date: " + options: NSCaseInsensitiveSearch].location == NSNotFound) + { + NSString *value; + + value = [[NSDate date] descriptionWithCalendarFormat: @"%a, %d %b %Y %H:%M:%S %z" timeZone: [NSTimeZone timeZoneWithName: @"GMT"] locale: nil]; + s = [NSString stringWithFormat: @"Date: %@\n%@", value, [theRequest contentAsString]]; + } + else + { + s = [theRequest contentAsString]; + } + + xml = [NSString stringWithFormat: @"<?xml version=\"1.0\"?><!DOCTYPE ActiveSync PUBLIC \"-//MICROSOFT//DTD ActiveSync//EN\" \"http://www.microsoft.com/\"><SendMail xmlns=\"ComposeMail:\"><SaveInSentItems/><MIME>%@</MIME></SendMail>", [s stringByEncodingBase64]]; + + d = [xml dataUsingEncoding: NSASCIIStringEncoding]; + } + else + { + d = [[theRequest content] wbxml2xml]; + } + documentElement = nil; if (!d) { // We check if it's a Ping command with no body. - // See http://msdn.microsoft.com/en-us/library/ee200913(v=exchg.80).aspx for details - cmdName = [[theRequest uri] command]; - + // See http://msdn.microsoft.com/en-us/library/ee200913(v=exchg.80).aspx for details if ([cmdName caseInsensitiveCompare: @"Ping"] != NSOrderedSame) return [NSException exceptionWithHTTPStatus: 500]; } |
|
Even better, try "sendmail-cleaned.patch". |
|
Your patch works after an additional fix - found that [[theRequest uri] command] returns always 'Unknown'. |
|
0001-_valueForParameter-fix.patch (856 bytes)
From 06a6b2752d76dca63dd75c0452c4771da43a577b Mon Sep 17 00:00:00 2001 From: root <root@example.com> Date: Fri, 21 Mar 2014 08:50:45 -0400 Subject: [PATCH] _valueForParameter fix --- ActiveSync/NSString+ActiveSync.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ActiveSync/NSString+ActiveSync.m b/ActiveSync/NSString+ActiveSync.m index 1c7a8ba..b1fba0f 100644 --- a/ActiveSync/NSString+ActiveSync.m +++ b/ActiveSync/NSString+ActiveSync.m @@ -139,7 +139,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NSString *s; int i; - components = [[[self componentsSeparatedByString: @"/"] lastObject] componentsSeparatedByString: @"&"]; + components = [[[self componentsSeparatedByString: @"?"] lastObject] componentsSeparatedByString: @"&"]; for (i = 0; i < [components count]; i++) { -- 1.7.9.5 |
|
That's obviously an "old bug"... thanks for spotting it. Can you try the latest patch? (sendmail-cleaned-1.patch). |
|
sendmail-cleaned-1.patch (2,953 bytes)
diff --git a/ActiveSync/NSString+ActiveSync.m b/ActiveSync/NSString+ActiveSync.m index 1c7a8ba..b1fba0f 100644 --- a/ActiveSync/NSString+ActiveSync.m +++ b/ActiveSync/NSString+ActiveSync.m @@ -139,7 +139,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NSString *s; int i; - components = [[[self componentsSeparatedByString: @"/"] lastObject] componentsSeparatedByString: @"&"]; + components = [[[self componentsSeparatedByString: @"?"] lastObject] componentsSeparatedByString: @"&"]; for (i = 0; i < [components count]; i++) { diff --git a/ActiveSync/SOGoActiveSyncDispatcher.m b/ActiveSync/SOGoActiveSyncDispatcher.m index 1143219..67fdc7e 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher.m +++ b/ActiveSync/SOGoActiveSyncDispatcher.m @@ -1546,15 +1546,45 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [context setObject: deviceId forKey: @"DeviceId"]; [context setObject: [[theRequest uri] deviceType] forKey: @"DeviceType"]; - d = [[theRequest content] wbxml2xml]; + cmdName = [[theRequest uri] command]; + + // + // If the MS-ASProtocolVersion header is set to "12.1", the body of the SendMail request is + // is a "message/rfc822" payload - otherwise, it's a WBXML blob. + // + if ([cmdName caseInsensitiveCompare: @"SendMail"] == NSOrderedSame && + [[theRequest headerForKey: @"content-type"] caseInsensitiveCompare: @"message/rfc822"] == NSOrderedSame) + { + NSString *s, *xml; + + if ([[theRequest contentAsString] rangeOfString: @"Date: " + options: NSCaseInsensitiveSearch].location == NSNotFound) + { + NSString *value; + + value = [[NSDate date] descriptionWithCalendarFormat: @"%a, %d %b %Y %H:%M:%S %z" timeZone: [NSTimeZone timeZoneWithName: @"GMT"] locale: nil]; + s = [NSString stringWithFormat: @"Date: %@\n%@", value, [theRequest contentAsString]]; + } + else + { + s = [theRequest contentAsString]; + } + + xml = [NSString stringWithFormat: @"<?xml version=\"1.0\"?><!DOCTYPE ActiveSync PUBLIC \"-//MICROSOFT//DTD ActiveSync//EN\" \"http://www.microsoft.com/\"><SendMail xmlns=\"ComposeMail:\"><SaveInSentItems/><MIME>%@</MIME></SendMail>", [s stringByEncodingBase64]]; + + d = [xml dataUsingEncoding: NSASCIIStringEncoding]; + } + else + { + d = [[theRequest content] wbxml2xml]; + } + documentElement = nil; if (!d) { // We check if it's a Ping command with no body. - // See http://msdn.microsoft.com/en-us/library/ee200913(v=exchg.80).aspx for details - cmdName = [[theRequest uri] command]; - + // See http://msdn.microsoft.com/en-us/library/ee200913(v=exchg.80).aspx for details if ([cmdName caseInsensitiveCompare: @"Ping"] != NSOrderedSame) return [NSException exceptionWithHTTPStatus: 500]; } |
|
https://github.com/inverse-inc/sogo/commit/b1436884192d4e8e1ee8e04266df0b676c503f61 |
|
Date Modified | Username | Field | Change |
---|---|---|---|
2014-03-20 19:55 | tfu | New Issue | |
2014-03-20 19:55 | tfu | File Added: sogo.log | |
2014-03-20 19:55 | tfu | File Added: sogo_506d_18db7d28_1.data | |
2014-03-20 19:55 | tfu | File Added: sogo_506d_18db7d28_2.data | |
2014-03-20 19:56 | tfu | File Added: 0001-htc-rfc822-mails.patch | |
2014-03-20 20:03 | ludovic | Note Added: 0006751 | |
2014-03-20 21:17 | tfu | Note Added: 0006752 | |
2014-03-20 21:20 | ludovic | Note Added: 0006753 | |
2014-03-20 22:15 | tfu | Note Added: 0006754 | |
2014-03-21 01:13 | ludovic | Note Added: 0006755 | |
2014-03-21 01:13 | ludovic | File Added: sendmail.patch | |
2014-03-21 12:33 | ludovic | Note Added: 0006757 | |
2014-03-21 12:49 | ludovic | File Added: sendmail-cleaned.patch | |
2014-03-21 12:49 | ludovic | Note Added: 0006758 | |
2014-03-21 12:52 | tfu | Note Added: 0006759 | |
2014-03-21 12:52 | tfu | File Added: 0001-_valueForParameter-fix.patch | |
2014-03-21 13:37 | ludovic | Note Added: 0006760 | |
2014-03-21 13:39 | ludovic | File Added: sendmail-cleaned-1.patch | |
2014-03-21 17:57 | ludovic | Note Added: 0006761 | |
2014-03-21 17:57 | ludovic | Status | new => closed |
2014-03-21 17:57 | ludovic | Assigned To | => ludovic |
2014-03-21 17:57 | ludovic | Resolution | open => fixed |
2014-03-21 17:57 | ludovic | Fixed in Version | => 2.2.2 |