+ NSMutableArray *permissions = [NSMutableArray array];
+ if (translatedPermissions.count) {
+ for (ASIPithosSharingUser *translatedsSharingUser in translatedPermissions) {
+ if (translatedsSharingUser.group.length &&
+ [translatedsSharingUser.group rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:@" -_~,;"]].location != NSNotFound) {
+ NSAlert *alert = [[NSAlert alloc] init];
+ [alert setMessageText:@"Invalid Input"];
+ [alert setInformativeText:@"Group names cannot contain ' ', '-', '_', '~', ',' or ';'."];
+ [alert addButtonWithTitle:@"OK"];
+ [alert runModal];
+ return;
+ }
+ }
+ if (pithosAccountManager) {
+ NSMutableSet *allUsers = [NSMutableSet set];
+ for (ASIPithosSharingUser *translatedsSharingUser in translatedPermissions) {
+ if (translatedsSharingUser.name.length) {
+ [allUsers addObject:translatedsSharingUser.name];
+ }
+ }
+ [allUsers removeObject:@""];
+ [allUsers removeObject:@"*"];
+ if (allUsers.count) {
+ ASIPithosRequest *userCatalogRequest = [pithosAccountManager updateUserCatalogForDisplaynames:[allUsers 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 *inexistentUsers = [NSMutableArray array];
+ for (NSString *user in allUsers) {
+ if (![displaynameCatalog objectForKey:user]) {
+ [inexistentUsers addObject:user];
+ }
+ }
+ if (!inexistentUsers.count) {
+ // Create permissions.
+ for (ASIPithosSharingUser *translatedsSharingUser in translatedPermissions) {
+ if (translatedsSharingUser.name.length) {
+ ASIPithosSharingUser *sharingUser = [translatedsSharingUser copy];
+ if (![sharingUser.name isEqualToString:@"*"]) {
+ sharingUser.name = [displaynameCatalog objectForKey:sharingUser.name];
+ }
+ if (!sharingUser.permission) {
+ sharingUser.permission = @"read";
+ }
+ [permissions addObject:sharingUser];
+ }
+ }
+ } else {
+ NSAlert *alert = [[NSAlert alloc] init];
+ if (inexistentUsers.count == 1) {
+ [alert setMessageText:@"Invalid User"];
+ [alert setInformativeText:[NSString stringWithFormat:@"User '%@' doesn't exist.", [inexistentUsers objectAtIndex:0]]];
+ } else {
+ [alert setMessageText:@"Invalid Users"];
+ [alert setInformativeText:[NSString stringWithFormat:@"Users '%@' don't exist.", [inexistentUsers componentsJoinedByString:@"', '"]]];
+ }
+ [alert addButtonWithTitle:@"OK"];
+ [alert runModal];
+ return;
+ }
+ } else {
+ // 404. Since we don't translate to UUIDs, check for invalid chars.
+ BOOL valid = YES;
+ // Create permissions.
+ for (ASIPithosSharingUser *translatedsSharingUser in translatedPermissions) {
+ if (translatedsSharingUser.name.length &&
+ ([translatedsSharingUser.name rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:@" ~,;:"]].location != NSNotFound)) {
+ valid = NO;
+ break;
+ }
+ }
+ if (valid) {
+ for (ASIPithosSharingUser *translatedsSharingUser in translatedPermissions) {
+ if (translatedsSharingUser.name.length) {
+ ASIPithosSharingUser *sharingUser = [translatedsSharingUser copy];
+ if (!sharingUser.permission) {
+ sharingUser.permission = @"read";
+ }
+ [permissions addObject:sharingUser];
+ }
+ }
+ } else {
+ NSAlert *alert = [[NSAlert alloc] init];
+ [alert setMessageText:@"Invalid Input"];
+ [alert setInformativeText:@"Users cannot contain ' ', '~', ',', ';' or ':'."];
+ [alert addButtonWithTitle:@"OK"];
+ [alert runModal];
+ return;
+ }
+ }
+ } else {
+ for (ASIPithosSharingUser *translatedsSharingUser in translatedPermissions) {
+ if ([translatedsSharingUser.name isEqualToString:@"*"]) {
+ ASIPithosSharingUser *sharingUser = [translatedsSharingUser copy];
+ if (!sharingUser.permission) {
+ sharingUser.permission = @"read";
+ }
+ [permissions addObject:sharingUser];
+ }
+ }
+ }
+ } else {
+ for (ASIPithosSharingUser *translatedsSharingUser in translatedPermissions) {
+ if (translatedsSharingUser.name.length) {
+ ASIPithosSharingUser *sharingUser = [translatedsSharingUser copy];
+ if (!sharingUser.permission) {
+ sharingUser.permission = @"read";
+ }
+ [permissions addObject:sharingUser];
+ }
+ }
+ }
+ }
+ pithosObject.permissions = permissions;
+
+ self.applyMetadataObjectRequest = [ASIPithosObjectRequest updateObjectMetadataRequestWithPithos:pithosAccountManager.pithos
+ containerName:pithosContainer.name
+ objectName:pithosObject.name
+ contentEncoding:pithosObject.contentEncoding
+ contentDisposition:pithosObject.contentDisposition
+ manifest:pithosObject.manifest
+ sharing:(pithosObject.sharing ? pithosObject.sharing : @"")
+ isPublic:(isPublic ? ASIPithosObjectRequestPublicTrue : ASIPithosObjectRequestPublicFalse)
+ metadata:pithosObject.metadata
+ update:NO];