From 4b9958336c470a00933b2786c2105a25f95f7801 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Tue, 4 Nov 2014 13:50:10 -0500 Subject: [PATCH] Handle base64-encoded command parameters in EAS --- ActiveSync/NSString+ActiveSync.m | 44 +++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 7 deletions(-) diff --git a/ActiveSync/NSString+ActiveSync.m b/ActiveSync/NSString+ActiveSync.m index 2d6826b7f..1e5954b28 100644 --- a/ActiveSync/NSString+ActiveSync.m +++ b/ActiveSync/NSString+ActiveSync.m @@ -41,6 +41,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include static NSArray *easCommandCodes = nil; +static NSArray *easCommandParameters = nil; @implementation NSString (ActiveSync) @@ -147,10 +148,10 @@ static NSArray *easCommandCodes = nil; // 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) { - NSString *deviceType; + NSString *deviceType, *parameterValue; NSData *queryString; - int cmd_code, deviceid_length, policy_length, devicetype_length; + int cmd_code, deviceid_length, policy_length, devicetype_length, parameter_code, parameter_length, i; const char* qs_bytes; queryString = [[components objectAtIndex: 0] dataByDecodingBase64]; @@ -164,22 +165,51 @@ static NSArray *easCommandCodes = nil; RETAIN(easCommandCodes); } + if (!easCommandParameters) + { + easCommandParameters = [NSArray arrayWithObjects:@"AttachmentName", @"CollectionId", @"na", @"ItemId", @"LongId", @"na", @"Occurrence", @"Options", @"User", nil]; + RETAIN(easCommandParameters); + } + // Command code, 1 byte, ie.: cmd= cmd_code = qs_bytes[1]; - [components addObject:[NSString stringWithFormat: @"cmd=%@", [easCommandCodes objectAtIndex: cmd_code]]]; + [components addObject: [NSString stringWithFormat: @"cmd=%@", [easCommandCodes objectAtIndex: cmd_code]]]; // Device ID length and Device ID (variable) deviceid_length = qs_bytes[4]; - [components addObject:[NSString stringWithFormat: @"deviceId=%@", [[NSData encodeDataAsHexString:[queryString subdataWithRange:NSMakeRange(5, deviceid_length)]] uppercaseString]]]; + [components addObject: [NSString stringWithFormat: @"deviceId=%@", [[NSData encodeDataAsHexString: [queryString subdataWithRange: NSMakeRange(5, deviceid_length)]] uppercaseString]]]; // Device type length and type (variable) policy_length = qs_bytes[5+deviceid_length]; devicetype_length = qs_bytes[5+deviceid_length+1+policy_length]; - deviceType = [[NSString alloc] initWithData:[queryString subdataWithRange: NSMakeRange(5+deviceid_length+1+policy_length+1, devicetype_length)] - encoding:NSASCIIStringEncoding]; + deviceType = [[NSString alloc] initWithData: [queryString subdataWithRange: NSMakeRange(5+deviceid_length+1+policy_length+1, devicetype_length)] + encoding: NSASCIIStringEncoding]; AUTORELEASE(deviceType); - [components addObject:[NSString stringWithFormat: @"deviceType=%@", deviceType]]; + [components addObject: [NSString stringWithFormat: @"deviceType=%@", deviceType]]; + + // Command Parameters + i = 5+deviceid_length+1+policy_length+1+devicetype_length; + + while (i < [queryString length]) + { + parameter_code = qs_bytes[i]; + parameter_length = qs_bytes[i+1]; + parameterValue = [[NSString alloc] initWithData: [queryString subdataWithRange: NSMakeRange(i+1+1, parameter_length)] + encoding: NSASCIIStringEncoding]; + + AUTORELEASE(parameterValue); + + // parameter_code 7 == Options + // http://msdn.microsoft.com/en-us/library/ee237789(v=exchg.80).aspx + if (parameter_code == 7) + [components addObject: [NSString stringWithFormat: @"%@=%@", [easCommandParameters objectAtIndex: parameter_code], + ([parameterValue isEqualToString: @"\001"]) ? @"SaveInSent" : @"AcceptMultiPart"]]; + else + [components addObject: [NSString stringWithFormat: @"%@=%@", [easCommandParameters objectAtIndex: parameter_code], parameterValue]]; + + i = i + 1 + 1 + parameter_length; + } } for (i = 0; i < [components count]; i++)