diff --git a/ChangeLog b/ChangeLog index 4ac74c0c7..0f546a190 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2011-06-16 Ludovic Marcotte + + * UI/Contacts/UIxContactFolderActions.m (importLdifData:): + Fixed folded lines import and base64 encoded values. Patch + from bug #1251 + 2011-06-16 Wolfgang Sourdeau * Tools/SOGoToolRenameUser.m: new sogo-tool module that updates diff --git a/UI/Contacts/UIxContactFolderActions.m b/UI/Contacts/UIxContactFolderActions.m index cbac6a365..2dd503615 100644 --- a/UI/Contacts/UIxContactFolderActions.m +++ b/UI/Contacts/UIxContactFolderActions.m @@ -30,6 +30,7 @@ #import #import #import +#import #import #import @@ -154,30 +155,69 @@ for (i = 0; i < count; i++) { SOGoContactLDIFEntry *ldifEntry; - entry = [NSMutableDictionary dictionary]; + NSEnumerator *keyEnumerator; + NSMutableDictionary *encodedEntry; + encodedEntry = [NSMutableDictionary dictionary]; lines = [[ldifContacts objectAtIndex: i] componentsSeparatedByString: @"\n"]; + key = NULL; linesCount = [lines count]; for (j = 0; j < linesCount; j++) { - components = [[lines objectAtIndex: j] - componentsSeparatedByString: @": "]; + NSString *line; + line = [lines objectAtIndex: j]; + + /* skip embedded comment lines */ + if ([line hasPrefix: @"#"]) + { + key = NULL; + continue; + } + + /* handle continuation lines */ + if ([line hasPrefix: @" "]) + { + if (key != NULL) + { + value = [[encodedEntry valueForKey: key] + stringByAppendingString: [line substringFromIndex: 1]]; + [encodedEntry setValue: value forKey: key]; + } + continue; + } + + components = [line componentsSeparatedByString: @": "]; if ([components count] == 2) { - key = [components objectAtIndex: 0]; + key = [[components objectAtIndex: 0] lowercaseString]; value = [components objectAtIndex: 1]; if ([key length] == 0) key = @"dn"; - [entry setObject: value forKey: [key lowercaseString]]; + [encodedEntry setValue: value forKey: key]; } else { break; } } + + /* decode Base64-encoded attributes */ + entry = [NSMutableDictionary dictionary]; + keyEnumerator = [encodedEntry keyEnumerator]; + while ((key = [keyEnumerator nextObject])) + { + value = [encodedEntry valueForKey: key]; + if ([key hasSuffix: @":"]) + { + key = [key substringToIndex: [key length] - 1]; + value = [value stringByDecodingBase64]; + } + [entry setValue: value forKey: key]; + } + uid = [folder globallyUniqueObjectId]; ldifEntry = [SOGoContactLDIFEntry contactEntryWithName: uid withLDIFEntry: entry