+ if (applyMetadataAccountRequest == nil) {
+ NSMutableDictionary *groups = [NSMutableDictionary dictionary];
+ if (translatedGroups.count) {
+ for (NSString *groupName in translatedGroups) {
+ if (!groupName.length ||
+ [groupName rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:@" -_~,;"]].location != NSNotFound) {
+ NSAlert *alert = [[NSAlert alloc] init];
+ [alert setMessageText:@"Invalid Input"];
+ [alert setInformativeText:@"Group names cannot be empty or contain ' ', '-', '_', '~', ',' or ';'."];
+ [alert addButtonWithTitle:@"OK"];
+ [alert runModal];
+ return;
+ }
+ }
+ if (pithosAccountManager) {
+ NSMutableSet *allGroupUsers = [NSMutableSet set];
+ for (NSMutableArray *groupUsers in [translatedGroups objectEnumerator]) {
+ [allGroupUsers addObjectsFromArray:groupUsers];
+ }
+ [allGroupUsers removeObject:@""];
+ [allGroupUsers removeObject:@"*"];
+ if (allGroupUsers.count) {
+ ASIPithosRequest *userCatalogRequest = [pithosAccountManager updateUserCatalogForForDisplaynames:[allGroupUsers allObjects]
+ UUIDs:nil];
+ if (userCatalogRequest.error || ((userCatalogRequest.responseStatusCode != 200) && (userCatalogRequest.responseStatusCode != 404))) {
+ return;
+ } else if (userCatalogRequest.responseStatusCode == 200) {
+ // Check if all users exist.
+ NSDictionary *displaynameCatalog = [userCatalogRequest displaynameCatalog];
+ NSMutableArray *inexistentGroupUsers = [NSMutableArray array];
+ for (NSString *groupUser in allGroupUsers) {
+ if (![displaynameCatalog objectForKey:groupUser]) {
+ [inexistentGroupUsers addObject:groupUser];
+ }
+ }
+ if (!inexistentGroupUsers.count) {
+ // Create groups.
+ for (NSString *groupName in translatedGroups) {
+ NSMutableArray *groupUsers = [NSMutableArray array];
+ for (NSString *groupUser in [translatedGroups objectForKey:groupName]) {
+ [groupUsers addObject:([groupUser isEqualToString:@"*"] ?
+ @"*" : [displaynameCatalog objectForKey:groupUser])];
+ }
+ [groups setObject:groupUsers forKey:groupName];
+ }
+ } else {
+ NSAlert *alert = [[NSAlert alloc] init];
+ if (inexistentGroupUsers.count == 1) {
+ [alert setMessageText:@"Invalid User"];
+ [alert setInformativeText:[NSString stringWithFormat:@"User '%@' doesn't exist.", [inexistentGroupUsers objectAtIndex:0]]];
+ } else {
+ [alert setMessageText:@"Invalid Users"];
+ [alert setInformativeText:[NSString stringWithFormat:@"Users '%@' don't exist.", [inexistentGroupUsers componentsJoinedByString:@"', '"]]];
+ }
+ [alert addButtonWithTitle:@"OK"];
+ [alert runModal];
+ return;
+ }
+ } else {
+ // 404. Since we don't translate to UUIDs, check for invalid chars.
+ BOOL valid = YES;
+ for (NSString *groupUser in allGroupUsers) {
+ if ([groupUser rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:@" ~,;:"]].location != NSNotFound) {
+ valid = NO;
+ break;
+ }
+ }
+ if (valid) {
+ [groups addEntriesFromDictionary:translatedGroups];
+ } else {
+ NSAlert *alert = [[NSAlert alloc] init];
+ [alert setMessageText:@"Invalid Input"];
+ [alert setInformativeText:@"Users cannot contain ' ', '~', ',', ';' or ':'."];
+ [alert addButtonWithTitle:@"OK"];
+ [alert runModal];
+ return;
+ }
+ }
+ } else {
+ for (NSString *groupName in translatedGroups) {
+ if ([[translatedGroups objectForKey:groupName] containsObject:@"*"]) {
+ [groups setObject:[NSMutableArray arrayWithObject:@"*"] forKey:groupName];
+ }
+ }
+ if (!groups.count) {
+ [groups setObject:[NSArray arrayWithObject:@""] forKey:@"group"];
+ }
+ }
+ } else {
+ [groups addEntriesFromDictionary:translatedGroups];
+ }
+ } else {
+ [groups setObject:[NSArray arrayWithObject:@""] forKey:@"group"];
+ }
+
+ applyMetadataAccountRequest = [ASIPithosAccountRequest updateAccountMetadataRequestWithPithos:pithos
+ groups:groups
+ metadata:pithosAccount.metadata
+ update:NO];
+ applyMetadataAccountRequest.delegate = self;
+ applyMetadataAccountRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
+ applyMetadataAccountRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
+ applyMetadataAccountRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys:
+ [NSNumber numberWithInteger:NSOperationQueuePriorityHigh], @"priority",
+ [NSNumber numberWithUnsignedInteger:10], @"retries",
+ NSStringFromSelector(@selector(accountMetadataRequestFinished:)), @"didFinishSelector",
+ NSStringFromSelector(@selector(accountMetadataRequestFailed:)), @"didFailSelector",
+ nil];
+ [[PithosUtilities prepareRequest:applyMetadataAccountRequest priority:NSOperationQueuePriorityHigh] startAsynchronous];
+ }
+ }
+}
+
+- (void)refreshInfo {
+ @synchronized(self) {
+ if (refreshMetadataAccountRequest == nil) {
+ refreshMetadataAccountRequest = [ASIPithosAccountRequest accountMetadataRequestWithPithos:pithos];
+ refreshMetadataAccountRequest.delegate = self;
+ refreshMetadataAccountRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
+ refreshMetadataAccountRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
+ refreshMetadataAccountRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys:
+ [NSNumber numberWithInteger:NSOperationQueuePriorityHigh], @"priority",
+ [NSNumber numberWithUnsignedInteger:10], @"retries",
+ NSStringFromSelector(@selector(accountMetadataRequestFinished:)), @"didFinishSelector",
+ NSStringFromSelector(@selector(accountMetadataRequestFailed:)), @"didFailSelector",
+ nil];
+ if (!sharingAccount)
+ refreshMetadataAccountRequest.downloadCache = [ASIDownloadCache sharedCache];
+ [[PithosUtilities prepareRequest:refreshMetadataAccountRequest priority:NSOperationQueuePriorityHigh] startAsynchronous];
+ }