From 3597c2eef16ee78304d52e2f681cad0881c84970 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 23 Jun 2016 11:20:40 -0400 Subject: [PATCH] (fix) handle base64 encoded EAS protocol version --- ActiveSync/NSString+ActiveSync.h | 1 + ActiveSync/NSString+ActiveSync.m | 21 +++++++++++++++++++++ ActiveSync/SOGoActiveSyncDispatcher.m | 6 ++++++ ActiveSync/SOGoMailObject+ActiveSync.m | 13 ++++++------- ActiveSync/iCalEvent+ActiveSync.m | 4 ++-- ActiveSync/iCalToDo+ActiveSync.m | 4 ++-- 6 files changed, 38 insertions(+), 11 deletions(-) diff --git a/ActiveSync/NSString+ActiveSync.h b/ActiveSync/NSString+ActiveSync.h index 70678ceaf..6386bec33 100644 --- a/ActiveSync/NSString+ActiveSync.h +++ b/ActiveSync/NSString+ActiveSync.h @@ -52,6 +52,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - (NSString *) itemid; - (BOOL) acceptsMultiPart; - (NSData *) convertHexStringToBytes; +- (NSString *) protocolVersion; @end diff --git a/ActiveSync/NSString+ActiveSync.m b/ActiveSync/NSString+ActiveSync.m index b744bfca2..7dc740505 100644 --- a/ActiveSync/NSString+ActiveSync.m +++ b/ActiveSync/NSString+ActiveSync.m @@ -135,6 +135,27 @@ static NSArray *easCommandParameters = nil; return o; } +- (NSString *) protocolVersion +{ + NSMutableArray *components; + + components = [NSMutableArray arrayWithArray: [[[self componentsSeparatedByString: @"?"] lastObject] componentsSeparatedByString: @"&"]]; + + // We handle BASE64 encoded queryStrings. See http://msdn.microsoft.com/en-us/library/ee160227%28v=exchg.80%29.aspx for details. + if ([components count] == 1) + { + NSData *queryString; + const char* qs_bytes; + + queryString = [[components objectAtIndex: 0] dataByDecodingBase64]; + qs_bytes = (const char*)[queryString bytes]; + + return [NSString stringWithFormat:@"%.1f", (float)((uint8_t)qs_bytes[0]/10)]; + } + + return nil; +} + - (NSString *) _valueForParameter: (NSString *) theParameter { NSMutableArray *components; diff --git a/ActiveSync/SOGoActiveSyncDispatcher.m b/ActiveSync/SOGoActiveSyncDispatcher.m index e10bd8f1f..e275aaad4 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher.m +++ b/ActiveSync/SOGoActiveSyncDispatcher.m @@ -3347,6 +3347,12 @@ void handle_eas_terminate(int signum) [context setObject: [[theRequest uri] deviceType] forKey: @"DeviceType"]; [context setObject: [[theRequest uri] attachmentName] forKey: @"AttachmentName"]; + // Save ASProtocolVersion to context + if ([[context request] headerForKey: @"MS-ASProtocolVersion"]) + [context setObject: [[context request] headerForKey: @"MS-ASProtocolVersion"] forKey: @"ASProtocolVersion"]; + else + [context setObject: [[theRequest uri] protocolVersion] forKey: @"ASProtocolVersion"]; + cmdName = [[theRequest uri] command]; // We make sure our cache table exists diff --git a/ActiveSync/SOGoMailObject+ActiveSync.m b/ActiveSync/SOGoMailObject+ActiveSync.m index 4e65fb32f..ac4976aaa 100644 --- a/ActiveSync/SOGoMailObject+ActiveSync.m +++ b/ActiveSync/SOGoMailObject+ActiveSync.m @@ -1003,7 +1003,7 @@ struct GlobalObjectId { [s appendFormat: @"%@", [globalObjId activeSyncRepresentationInContext: context]]; // We set the right message type - we must set AS version to 14.1 for this - if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"14.1"]) + if ([[context valueForKey: @"ASProtocolVersion"] floatValue] >= 14.1) [s appendFormat: @"%d", 1]; [s appendString: @""]; @@ -1169,7 +1169,7 @@ struct GlobalObjectId { truncated = 0; } - if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"]) + if ([[context valueForKey: @"ASProtocolVersion"] isEqualToString: @"2.5"]) { [s appendFormat: @"%@", content]; [s appendFormat: @"%d", truncated]; @@ -1204,7 +1204,7 @@ struct GlobalObjectId { { int i; - if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"]) + if ([[context valueForKey: @"ASProtocolVersion"] isEqualToString: @"2.5"]) [s appendString: @""]; else [s appendString: @""]; @@ -1219,12 +1219,12 @@ struct GlobalObjectId { // FileReference must be a unique identifier across the whole store. We use the following structure: // mail// // mail/INBOX/2 - if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"]) + if ([[context valueForKey: @"ASProtocolVersion"] isEqualToString: @"2.5"]) [s appendFormat: @"mail/%@/%@/%@", [[[self container] relativeImap4Name] stringByEscapingURL], [self nameInContainer], [value objectForKey: @"path"]]; else [s appendFormat: @"mail/%@/%@/%@", [[[self container] relativeImap4Name] stringByEscapingURL], [self nameInContainer], [value objectForKey: @"path"]]; - if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"]) + if ([[context valueForKey: @"ASProtocolVersion"] isEqualToString: @"2.5"]) { [s appendFormat: @"%d", 1]; [s appendFormat: @"%d", [[value objectForKey: @"size"] intValue]]; @@ -1267,8 +1267,7 @@ struct GlobalObjectId { [s appendFormat: @""]; } - if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"14.0"] || - [[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"14.1"]) + if ([[context valueForKey: @"ASProtocolVersion"] floatValue] >= 14.0) { id value; NSString *reference; diff --git a/ActiveSync/iCalEvent+ActiveSync.m b/ActiveSync/iCalEvent+ActiveSync.m index fee2f383d..7f0943360 100644 --- a/ActiveSync/iCalEvent+ActiveSync.m +++ b/ActiveSync/iCalEvent+ActiveSync.m @@ -244,7 +244,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // otherwise it'll prevent WP8 phones from sync'ing. See #3028 for details. o = [o activeSyncRepresentationInContext: context]; - if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"]) + if ([[context valueForKey: @"ASProtocolVersion"] isEqualToString: @"2.5"]) { [s appendFormat: @"%@", o]; [s appendString: @"0"]; @@ -487,7 +487,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. } // FIXME: merge with iCalToDo - if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"]) + if ([[context valueForKey: @"ASProtocolVersion"] isEqualToString: @"2.5"]) { if ((o = [theValues objectForKey: @"Body"])) [self setComment: o]; diff --git a/ActiveSync/iCalToDo+ActiveSync.m b/ActiveSync/iCalToDo+ActiveSync.m index e92728c88..fa610f987 100644 --- a/ActiveSync/iCalToDo+ActiveSync.m +++ b/ActiveSync/iCalToDo+ActiveSync.m @@ -127,7 +127,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // otherwise it'll prevent WP8 phones from sync'ing. See #3028 for details. o = [o activeSyncRepresentationInContext: context]; - if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"]) + if ([[context valueForKey: @"ASProtocolVersion"] isEqualToString: @"2.5"]) { [s appendFormat: @"%@", o]; [s appendString: @"0"]; @@ -161,7 +161,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [self setSummary: o]; // FIXME: merge with iCalEvent - if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"]) + if ([[context valueForKey: @"ASProtocolVersion"] isEqualToString: @"2.5"]) { if ((o = [theValues objectForKey: @"Body"])) [self setComment: o];