Statistics
| Branch: | Tag: | Revision:

root / Classes / EditPermissionsViewController.m @ e06c24cf

History | View | Annotate | Download (19 kB)

1
//
2
//  EditPermissionsViewController.m
3
//  pithos-ios
4
//
5
// Copyright 2011 GRNET S.A. All rights reserved.
6
//
7
// Redistribution and use in source and binary forms, with or
8
// without modification, are permitted provided that the following
9
// conditions are met:
10
// 
11
//   1. Redistributions of source code must retain the above
12
//      copyright notice, this list of conditions and the following
13
//      disclaimer.
14
// 
15
//   2. Redistributions in binary form must reproduce the above
16
//      copyright notice, this list of conditions and the following
17
//      disclaimer in the documentation and/or other materials
18
//      provided with the distribution.
19
// 
20
// THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
21
// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
24
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
27
// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
28
// AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
30
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31
// POSSIBILITY OF SUCH DAMAGE.
32
// 
33
// The views and conclusions contained in the software and
34
// documentation are those of the authors and should not be
35
// interpreted as representing official policies, either expressed
36
// or implied, of GRNET S.A.
37

    
38
#import "EditPermissionsViewController.h"
39
#import "AccountManager.h"
40
#import "UIViewController+Conveniences.h"
41
#import "FolderViewController.h"
42
#import "Folder.h"
43
#import "PithosUtilities.h"
44
#import "APICallback.h"
45

    
46
#define kUser 0
47
#define kPermissions 1
48
#define kSavePermissions 2
49
#define kRemovePermissions 3
50

    
51
@implementation EditPermissionsViewController
52

    
53
@synthesize account, container, object;
54
@synthesize user, readPermissionSelected, writePermissionSelected, permissions;
55
@synthesize oldPermissionsString;
56
@synthesize newPermissionsEntry, removePermissionsEnabled;
57
@synthesize folderViewController, objectIsFolder;
58

    
59
- (void)dealloc
60
{
61
    [super dealloc];
62
}
63

    
64
- (void)didReceiveMemoryWarning
65
{
66
    // Releases the view if it doesn't have a superview.
67
    [super didReceiveMemoryWarning];
68
    
69
    // Release any cached data, images, etc that aren't in use.
70
}
71

    
72
#pragma mark - View lifecycle
73

    
74
- (void)viewDidLoad
75
{
76
    [super viewDidLoad];
77
}
78

    
79
- (void)viewDidUnload
80
{
81
    [super viewDidUnload];
82
}
83

    
84
- (void)viewWillAppear:(BOOL)animated
85
{
86
    [super viewWillAppear:animated];
87
}
88

    
89
- (void)viewDidAppear:(BOOL)animated
90
{
91
    [super viewDidAppear:animated];
92
}
93

    
94
- (void)viewWillDisappear:(BOOL)animated
95
{
96
    [super viewWillDisappear:animated];
97
}
98

    
99
- (void)viewDidDisappear:(BOOL)animated
100
{
101
    [super viewDidDisappear:animated];
102
}
103

    
104
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
105
    return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) || (toInterfaceOrientation == UIInterfaceOrientationPortrait);
106
}
107

    
108
#pragma mark - Table view data source
109

    
110
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
111
{
112
    if (removePermissionsEnabled)
113
        return 4;
114
    else 
115
        return 3;
116
}
117

    
118
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
119
{
120
    if (section == kPermissions)
121
        return 2;
122
    else
123
        return 1;
124
}
125

    
126
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
127
{
128
    static NSString *CellIdentifier = @"Cell";
129
    
130
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
131
    if (cell == nil) {
132
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
133
    }
134
    
135
    if (indexPath.section == kUser) {
136
        UITextField *textField = nil;
137
        for (id subView in cell.contentView.subviews) {
138
            if ([subView isKindOfClass:[UITextField class]]) {
139
                textField = (UITextField *)subView;
140
            }
141
        }
142
        
143
        if (textField == nil) {
144
            CGRect bounds = [cell.contentView bounds];
145
            CGRect rect = CGRectInset(bounds, 10.0, 10.0);                        
146
            textField = [[UITextField alloc] initWithFrame:rect];
147
            [textField setFrame:rect];
148
        }
149
        
150
        [textField setClearButtonMode:UITextFieldViewModeWhileEditing];
151
        [textField setBackgroundColor:[UIColor clearColor]];
152
        [textField setOpaque:YES];
153
        [textField setAutocorrectionType:UITextAutocorrectionTypeNo];
154
        [textField setAutocapitalizationType:UITextAutocapitalizationTypeNone];
155
        [textField setDelegate:self];
156
        textField.placeholder = @"User";
157
        textField.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
158
        textField.text = self.user;
159
        
160
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
161
        [cell.contentView addSubview:textField];
162
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
163
    }
164
    else if (indexPath.section == kPermissions) {
165
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
166
        if (indexPath.row == 0) {
167
            cell.textLabel.text = @"Read";
168
            if (readPermissionSelected)
169
                cell.accessoryType = UITableViewCellAccessoryCheckmark;
170
            else
171
                cell.accessoryType = UITableViewCellAccessoryNone;
172
        }
173
        else {
174
            cell.textLabel.text = @"Write";
175
            if (writePermissionSelected)
176
                cell.accessoryType = UITableViewCellAccessoryCheckmark;
177
            else
178
                cell.accessoryType = UITableViewCellAccessoryNone;
179
        }
180
    } 
181
    else if (indexPath.section == kSavePermissions) {
182
        cell.textLabel.text = @"Save";
183
        cell.accessoryType = UITableViewCellAccessoryNone;
184
        cell.selectionStyle = UITableViewCellSelectionStyleBlue;
185
    }
186
    else if (indexPath.section == kRemovePermissions) {
187
        cell.textLabel.text = @"Remove";
188
        cell.accessoryType = UITableViewCellAccessoryNone;
189
        cell.selectionStyle = UITableViewCellSelectionStyleBlue;
190
    }
191
    
192
    return cell;
193
}
194

    
195
#pragma mark - Table view delegate
196

    
197
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
198
{    
199
    
200
    if (indexPath.section != kUser)
201
        [self.view endEditing:YES];
202
    
203
    NSString *newUserName;
204
    NSIndexPath *userCellIndexPath = [NSIndexPath indexPathForRow:0 inSection:kUser];
205
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:userCellIndexPath];
206
    UITextField *textField = [[cell.contentView subviews] objectAtIndex:0];
207
    newUserName = textField.text;
208
    if (![self userInputIsValid:newUserName]) {
209
        [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
210
        return;
211
    }
212
    
213
    if (indexPath.section == kPermissions) {
214
        UITableViewCell *readPermissionsCell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:kPermissions]];
215
        UITableViewCell *writePermissionsCell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:kPermissions]];
216

    
217
        if (indexPath.row == 0) {
218
            if (!readPermissionSelected) {
219
                readPermissionSelected = YES;
220
                if (writePermissionSelected) {
221
                    writePermissionSelected = FALSE;
222
                    writePermissionsCell.accessoryType = UITableViewCellAccessoryNone;
223
                }
224
                readPermissionsCell.accessoryType = UITableViewCellAccessoryCheckmark;
225
            }
226
        }
227
        else if (indexPath.row == 1) {
228
            if (!writePermissionSelected) {
229
                writePermissionSelected = YES;
230
                if (readPermissionSelected) {
231
                    readPermissionSelected = FALSE;
232
                    readPermissionsCell.accessoryType = UITableViewCellAccessoryNone;
233
                }
234
                writePermissionsCell.accessoryType = UITableViewCellAccessoryCheckmark;
235
            }
236
        }
237
    }
238
    else if (indexPath.section == kSavePermissions) {
239
        if (!readPermissionSelected && !writePermissionSelected) {
240
            [self alert:@"Cannot save permissions"  message:@"Please select permissions type"];
241
            [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
242
            return;
243
        }
244
        
245
        [self.permissions removeObjectForKey:self.user];
246
        if (readPermissionSelected) 
247
            [self.permissions setObject:@"read" forKey:newUserName];
248
        else if (writePermissionSelected)
249
            [self.permissions setObject:@"write" forKey:newUserName];
250
        
251
        self.user = newUserName;
252
        self.oldPermissionsString = object.sharing;
253
        object.sharing = [self buildPermissionsString];
254
        
255
        if (objectIsFolder && ![PithosUtilities isContentTypeDirectory:object.contentType]) {
256
            if (((UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) &&
257
                [folderViewController.parentFolderViewController.folder.objects objectForKey:object.name]) || 
258
                ((UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPad) &&
259
                 [folderViewController.folder.objects objectForKey:object.name])) {
260
                NSString *alertMessage = [NSString stringWithFormat:@"In order to apply the changes in '%@', the object at the same path must be replaced. Continue?",object.name];
261
                NSString *alertTitle = @"Apply changes";
262
                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:alertTitle
263
                                                                message:alertMessage
264
                                                               delegate:self
265
                                                      cancelButtonTitle:@"Cancel"
266
                                                      otherButtonTitles:@"OK", nil];
267
                [alert show];
268
                [alert release];
269
                return;
270
            } else {
271
                NSString *activityMessage = @"Applying permissions...";
272
                activityIndicatorView = [[ActivityIndicatorView alloc] initWithFrame:[ActivityIndicatorView frameForText:activityMessage] text:activityMessage];
273
                [activityIndicatorView addToView:self.view];
274
                
275
                object.name = object.fullPath;
276
                object.contentType = @"application/directory";
277
                object.data = [NSData data];
278
                [self createNewFolder];  
279
                return;
280
            }
281
        }
282
        
283
        NSString *activityMessage = @"Applying permissions...";
284
        activityIndicatorView = [[ActivityIndicatorView alloc] initWithFrame:[ActivityIndicatorView frameForText:activityMessage] text:activityMessage];
285
        
286
        [activityIndicatorView addToView:self.view];
287
        [[self.account.manager writeObjectMetadata:container object:object] 
288
         success:^(OpenStackRequest *request) {
289
             [activityIndicatorView removeFromSuperviewAndRelease];
290
             [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
291
             removePermissionsEnabled = YES;
292
             [self.tableView reloadData];
293
             if (objectIsFolder || (account.shared && ![oldPermissionsString isEqualToString:object.sharing])) {
294
                 if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
295
                     [self.folderViewController refreshButtonPressed:nil];
296
                 }
297
                 else {
298
                     self.folderViewController.needsRefreshing = YES;
299
                 }
300
             } 
301
         }
302
         failure:^(OpenStackRequest *request) {
303
             object.sharing = self.oldPermissionsString;
304
             readPermissionSelected = !readPermissionSelected;
305
             writePermissionSelected = !writePermissionSelected;
306
             
307
             if (readPermissionSelected)
308
                 [self.permissions setObject:@"read" forKey:user];
309
             else if (writePermissionSelected) 
310
                 [self.permissions setObject:@"write" forKey:user];
311
             
312
             [activityIndicatorView removeFromSuperviewAndRelease];
313
             [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
314
             [self.tableView reloadData];
315
             [self alert:@"There was a problem applying the permissions." request:request];
316
         }];
317
    } 
318
    else if (indexPath.section == kRemovePermissions) {
319
        NSString *activityMessage = @"Removing permissions...";            
320
        activityIndicatorView = [[ActivityIndicatorView alloc] initWithFrame:[ActivityIndicatorView frameForText:activityMessage] text:activityMessage];
321
        [activityIndicatorView addToView:self.view];
322
        
323
        [permissions removeObjectForKey:user];
324
        self.oldPermissionsString = object.sharing;
325
        object.sharing = [self buildPermissionsString];
326
        [[self.account.manager writeObjectMetadata:container object:object] 
327
         success:^(OpenStackRequest *request) {
328
             self.user = @"";
329
             self.readPermissionSelected = FALSE;
330
             self.writePermissionSelected = FALSE;
331
             removePermissionsEnabled = NO;
332
             [self.tableView reloadData];
333
             [activityIndicatorView removeFromSuperviewAndRelease];
334
             [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
335
             if (objectIsFolder || (account.shared && ![oldPermissionsString isEqualToString:object.sharing])) {
336
                 self.folderViewController.needsRefreshing = YES;
337
                 if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
338
                     [self.folderViewController refreshButtonPressed:nil];
339
                 else
340
                     self.folderViewController.refreshWhenAppeared = YES;
341
             }
342
         }
343
         failure:^(OpenStackRequest *request) {
344
             object.sharing = self.oldPermissionsString;
345
             if (readPermissionSelected)
346
                 [self.permissions setObject:@"read" forKey:user];
347
             else if (writePermissionSelected) 
348
                 [self.permissions setObject:@"write" forKey:user];
349
             
350
             [activityIndicatorView removeFromSuperviewAndRelease];
351
             [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
352
             [self.tableView reloadData];
353
             [self alert:@"There was a problem removing the permissions." request:request];
354
         }];
355
    }
356
}
357

    
358
#pragma mark - Textfield delegate
359

    
360

    
361
- (BOOL)textFieldShouldReturn:(UITextField *)textField
362
{
363
    [self userInputIsValid:textField.text];
364
    [textField resignFirstResponder];
365
    
366
    return YES;
367
}
368

    
369
#pragma mark - Alertview delegate
370

    
371
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
372
{
373
    if (buttonIndex == 1) {
374
        NSString *activityMessage = @"Applying permissions...";
375
                
376
        activityIndicatorView = [[ActivityIndicatorView alloc] initWithFrame:[ActivityIndicatorView frameForText:activityMessage] text:activityMessage];
377
        [activityIndicatorView addToView:self.view];
378
        
379
        object.name = object.fullPath;
380
        object.contentType = @"application/directory";
381
        object.data = [NSData data];
382
        [self createNewFolder];
383
    } else {
384
        [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];
385
    }
386
}
387

    
388
- (void)createNewFolder {
389
    [[self.account.manager writeObject:self.container object:object downloadProgressDelegate:nil]
390
     success:^(OpenStackRequest *request) {
391
         Folder *newFolder = [[Folder alloc] init];
392
         newFolder.name = [[object.name componentsSeparatedByString:@"/"] lastObject];
393
         newFolder.parent = folderViewController.folder;
394
         newFolder.sharing = folderViewController.folder.sharing;
395
         [folderViewController.folder.folders setObject:newFolder forKey:newFolder.name];
396
         [activityIndicatorView removeFromSuperviewAndRelease];
397
         [newFolder release];
398
         [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];
399
         removePermissionsEnabled = YES;
400
         [self.tableView reloadData];
401
         if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
402
             [self.folderViewController refreshButtonPressed:nil];
403
         }
404
         else {
405
             self.folderViewController.needsRefreshing = YES;
406
             self.folderViewController.refreshWhenAppeared = YES;
407
         }            
408
     }
409
     failure:^(OpenStackRequest *request) {
410
         object.sharing = self.oldPermissionsString;
411
         readPermissionSelected = !readPermissionSelected;
412
         writePermissionSelected = !writePermissionSelected;
413
         
414
         if (readPermissionSelected)
415
             [self.permissions setObject:@"read" forKey:user];
416
         else if (writePermissionSelected) 
417
             [self.permissions setObject:@"write" forKey:user];
418
         
419
         [activityIndicatorView removeFromSuperviewAndRelease];
420
         [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];
421
         [self.tableView reloadData];
422
         [self alert:@"There was a problem applying the permissions." request:request];                                    
423
     }];
424
}
425

    
426
#pragma mark - helper methods
427

    
428
- (NSString *)buildPermissionsString
429
{
430
    NSString *readPermissionsString = @"";
431
    NSString *writePermissionsString = @"";
432
    
433
    for (NSString *aUser in [permissions allKeys]) {
434
        if ([[permissions objectForKey:aUser] isEqual:@"read"]) {
435
            if ([readPermissionsString length] == 0)
436
                readPermissionsString = [NSString stringWithFormat:@"read=%@", aUser];
437
            else
438
                readPermissionsString = [NSString stringWithFormat:@"%@,%@", readPermissionsString ,aUser];
439
        }
440
        else if ([[permissions objectForKey:aUser] isEqual:@"write"]) {
441
            if ([writePermissionsString length] == 0)
442
                writePermissionsString = [NSString stringWithFormat:@"write=%@", aUser];
443
            else
444
                writePermissionsString = [NSString stringWithFormat:@"%@,%@", writePermissionsString, aUser];
445
        }
446
    }
447
    
448
    if ([writePermissionsString length] == 0)
449
        return readPermissionsString;
450
    else if ([readPermissionsString length] == 0)
451
        return writePermissionsString;
452
    else return [NSString stringWithFormat:@"%@;%@", readPermissionsString, writePermissionsString];
453
}
454

    
455
- (BOOL) userInputIsValid: (NSString *) input
456
{
457
    if ([input length] == 0
458
        || [[input stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length] == 0
459
        ) {
460
        [self alert:@"Invalid input" message:@"User name cannot be empty"];
461
        return NO;
462
    }
463
    else {
464
        NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"=,;"];
465
        if ([input rangeOfCharacterFromSet:set].location != NSNotFound) {
466
            [self alert:@"Invalid input" message:@"User name cannot contain '=', ',' or ';'"];
467
            return NO;
468
        }
469
        else {
470
            return YES;
471
        }
472
    }
473
    
474
    return YES;
475
}
476

    
477

    
478
@end