Skip to content

Commit 1f299c7

Browse files
committed
Merge to 2.2.10
Conflicts: NEWS Version
2 parents 74cfb90 + efff32e commit 1f299c7

File tree

588 files changed

+5349
-2545
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

588 files changed

+5349
-2545
lines changed

ActiveSync/NGVCard+ActiveSync.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ - (void) takeActiveSyncValues: (NSDictionary *) theValues
222222
[self setNote: o];
223223

224224
// Categories
225-
if ((o = [theValues objectForKey: @"Categories"]))
225+
if ((o = [theValues objectForKey: @"Categories"]) && [o length])
226226
[self setCategories: o];
227227

228228
// Birthday

ActiveSync/NSString+ActiveSync.m

Lines changed: 76 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,14 @@
3535
#include <Foundation/NSDate.h>
3636

3737
#include <SOGo/NSString+Utilities.h>
38+
#include <SOGo/NSData+Crypto.h>
3839

40+
#include <NGExtensions/NGBase64Coding.h>
3941
#include <NGExtensions/NSString+misc.h>
4042

43+
static NSArray *easCommandCodes = nil;
44+
static NSArray *easCommandParameters = nil;
45+
4146
@implementation NSString (ActiveSync)
4247

4348
- (NSString *) sanitizedServerIdWithType: (SOGoMicrosoftActiveSyncFolderType) folderType
@@ -61,9 +66,9 @@ - (NSString *) activeSyncRepresentationInContext: (WOContext *) context
6166
{
6267
NSString *s;
6368

64-
s = [self stringByEscapingHTMLString];
69+
s = [self safeString];
6570

66-
return [s safeString];
71+
return [s stringByEscapingHTMLString];
6772
}
6873

6974
- (int) activeSyncFolderType
@@ -134,11 +139,78 @@ - (NSCalendarDate *) calendarDate
134139

135140
- (NSString *) _valueForParameter: (NSString *) theParameter
136141
{
137-
NSArray *components;
142+
NSMutableArray *components;
138143
NSString *s;
139144
int i;
140145

141-
components = [[[self componentsSeparatedByString: @"?"] lastObject] componentsSeparatedByString: @"&"];
146+
components = [NSMutableArray arrayWithArray: [[[self componentsSeparatedByString: @"?"] lastObject] componentsSeparatedByString: @"&"]];
147+
148+
// We handle BASE64 encoded queryStrings. See http://msdn.microsoft.com/en-us/library/ee160227%28v=exchg.80%29.aspx for details.
149+
if ([components count] == 1)
150+
{
151+
NSString *deviceType, *parameterValue;
152+
NSData *queryString;
153+
154+
int cmd_code, deviceid_length, policy_length, devicetype_length, parameter_code, parameter_length, i;
155+
const char* qs_bytes;
156+
157+
queryString = [[components objectAtIndex: 0] dataByDecodingBase64];
158+
qs_bytes = (const char*)[queryString bytes];
159+
160+
if (!easCommandCodes)
161+
{
162+
easCommandCodes = [NSArray arrayWithObjects:@"Sync", @"SendMail", @"SmartForward", @"SmartReply", @"GetAttachment", @"na", @"na", @"na", @"na",
163+
@"FolderSync", @"FolderCreate", @"FolderDelete", @"FolderUpdate", @"MoveItems", @"GetItemEstimate", @"MeetingResponse",
164+
@"Search", @"Settings", @"Ping", @"ItemOperations", @"Provision", @"ResolveRecipients", @"ValidateCert", nil];
165+
RETAIN(easCommandCodes);
166+
}
167+
168+
if (!easCommandParameters)
169+
{
170+
easCommandParameters = [NSArray arrayWithObjects:@"AttachmentName", @"CollectionId", @"na", @"ItemId", @"LongId", @"na", @"Occurrence", @"Options", @"User", nil];
171+
RETAIN(easCommandParameters);
172+
}
173+
174+
// Command code, 1 byte, ie.: cmd=
175+
cmd_code = qs_bytes[1];
176+
[components addObject: [NSString stringWithFormat: @"cmd=%@", [easCommandCodes objectAtIndex: cmd_code]]];
177+
178+
// Device ID length and Device ID (variable)
179+
deviceid_length = qs_bytes[4];
180+
[components addObject: [NSString stringWithFormat: @"deviceId=%@", [[NSData encodeDataAsHexString: [queryString subdataWithRange: NSMakeRange(5, deviceid_length)]] uppercaseString]]];
181+
182+
// Device type length and type (variable)
183+
policy_length = qs_bytes[5+deviceid_length];
184+
devicetype_length = qs_bytes[5+deviceid_length+1+policy_length];
185+
deviceType = [[NSString alloc] initWithData: [queryString subdataWithRange: NSMakeRange(5+deviceid_length+1+policy_length+1, devicetype_length)]
186+
encoding: NSASCIIStringEncoding];
187+
AUTORELEASE(deviceType);
188+
189+
[components addObject: [NSString stringWithFormat: @"deviceType=%@", deviceType]];
190+
191+
// Command Parameters
192+
i = 5+deviceid_length+1+policy_length+1+devicetype_length;
193+
194+
while (i < [queryString length])
195+
{
196+
parameter_code = qs_bytes[i];
197+
parameter_length = qs_bytes[i+1];
198+
parameterValue = [[NSString alloc] initWithData: [queryString subdataWithRange: NSMakeRange(i+1+1, parameter_length)]
199+
encoding: NSASCIIStringEncoding];
200+
201+
AUTORELEASE(parameterValue);
202+
203+
// parameter_code 7 == Options
204+
// http://msdn.microsoft.com/en-us/library/ee237789(v=exchg.80).aspx
205+
if (parameter_code == 7)
206+
[components addObject: [NSString stringWithFormat: @"%@=%@", [easCommandParameters objectAtIndex: parameter_code],
207+
([parameterValue isEqualToString: @"\001"]) ? @"SaveInSent" : @"AcceptMultiPart"]];
208+
else
209+
[components addObject: [NSString stringWithFormat: @"%@=%@", [easCommandParameters objectAtIndex: parameter_code], parameterValue]];
210+
211+
i = i + 1 + 1 + parameter_length;
212+
}
213+
}
142214

143215
for (i = 0; i < [components count]; i++)
144216
{

0 commit comments

Comments
 (0)