X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=SoObjects%2FSOGo%2FSOGoFolder.m;h=a78d50740a1215711cac3a14350ab43c8ed83784;hb=12135039e8259dcfde7c4be1fdb1af787e06fe87;hp=5b6f5d2c28ab377a048e305a8c5b5ff83fa13f82;hpb=f64d5ee94f4fe26a50cec5bb09a81e71a78427c9;p=scalable-opengroupware.org diff --git a/SoObjects/SOGo/SOGoFolder.m b/SoObjects/SOGo/SOGoFolder.m index 5b6f5d2c..a78d5074 100644 --- a/SoObjects/SOGo/SOGoFolder.m +++ b/SoObjects/SOGo/SOGoFolder.m @@ -19,14 +19,14 @@ 02111-1307, USA. */ -#import -#import - #import +#import #import #import +#import #import +#import #import #import #import @@ -35,11 +35,14 @@ #import #import #import +#import #import #import #import +#import #import +#import "NSArray+Utilities.h" #import "NSString+Utilities.h" #import "SOGoPermissions.h" @@ -63,33 +66,38 @@ static NSString *defaultUserID = @""; NSStringFromClass([self superclass]), [super version]); } -+ (NSString *) globallyUniqueObjectId ++ (id) folderWithSubscriptionReference: (NSString *) reference + inContainer: (id) aContainer { - /* - 4C08AE1A-A808-11D8-AC5A-000393BBAFF6 - SOGo-Web-28273-18283-288182 - printf( "%x", *(int *) &f); - */ - static int pid = 0; - static int sequence = 0; - static float rndm = 0; - float f; - - if (pid == 0) - { /* break if we fork ;-) */ - pid = getpid(); - rndm = random(); - } - sequence++; - f = [[NSDate date] timeIntervalSince1970]; - return [NSString stringWithFormat:@"%0X-%0X-%0X-%0X", - pid, *(int *)&f, sequence++, random]; + id newFolder; + NSArray *elements, *pathElements; + NSString *ocsPath, *objectPath, *owner, *ocsName, *folderName; + + elements = [reference componentsSeparatedByString: @":"]; + owner = [elements objectAtIndex: 0]; + objectPath = [elements objectAtIndex: 1]; + pathElements = [objectPath componentsSeparatedByString: @"/"]; + if ([pathElements count] > 1) + ocsName = [pathElements objectAtIndex: 1]; + else + ocsName = @"personal"; + + ocsPath = [NSString stringWithFormat: @"/Users/%@/%@/%@", + owner, [pathElements objectAtIndex: 0], ocsName]; + folderName = [NSString stringWithFormat: @"%@_%@", owner, ocsName]; + newFolder = [[self alloc] initWithName: folderName + inContainer: aContainer]; + [newFolder setOCSPath: ocsPath]; + [newFolder setOwner: owner]; + + return newFolder; } - (id) init { if ((self = [super init])) { + displayName = nil; ocsPath = nil; ocsFolder = nil; aclCache = [NSMutableDictionary new]; @@ -103,6 +111,7 @@ static NSString *defaultUserID = @""; [ocsFolder release]; [ocsPath release]; [aclCache release]; + [displayName release]; [super dealloc]; } @@ -115,13 +124,12 @@ static NSString *defaultUserID = @""; - (void) setOCSPath: (NSString *) _path { - if ([ocsPath isEqualToString:_path]) - return; - - if (ocsPath) - [self warnWithFormat:@"GCS path is already set! '%@'", _path]; - - ASSIGNCOPY(ocsPath, _path); + if (![ocsPath isEqualToString:_path]) + { + if (ocsPath) + [self warnWithFormat: @"GCS path is already set! '%@'", _path]; + ASSIGN (ocsPath, _path); + } } - (NSString *) ocsPath @@ -134,10 +142,7 @@ static NSString *defaultUserID = @""; static GCSFolderManager *folderManager = nil; if (!folderManager) - { - folderManager = [GCSFolderManager defaultFolderManager]; - [folderManager setFolderNamePrefix: @"SOGo"]; - } + folderManager = [GCSFolderManager defaultFolderManager]; return folderManager; } @@ -149,9 +154,73 @@ static NSString *defaultUserID = @""; - (BOOL) folderIsMandatory { - [self subclassResponsibility: _cmd]; + return [nameInContainer isEqualToString: @"personal"]; +} - return NO; +- (void) _setDisplayNameFromRow: (NSDictionary *) row +{ + NSString *currentLogin, *ownerLogin; + NSDictionary *ownerIdentity; + + displayName + = [NSMutableString stringWithString: [row objectForKey: @"c_foldername"]]; + currentLogin = [[context activeUser] login]; + ownerLogin = [self ownerInContext: context]; + if (![currentLogin isEqualToString: ownerLogin]) + { + ownerIdentity = [[SOGoUser userWithLogin: ownerLogin roles: nil] + primaryIdentity]; + [displayName appendFormat: @" (%@ <%@>)", + [ownerIdentity objectForKey: @"fullName"], + [ownerIdentity objectForKey: @"email"]]; + } +} + +- (void) _fetchDisplayName +{ + GCSChannelManager *cm; + EOAdaptorChannel *fc; + NSURL *folderLocation; + NSString *sql; + NSArray *attrs; + NSDictionary *row; + + cm = [GCSChannelManager defaultChannelManager]; + folderLocation + = [[GCSFolderManager defaultFolderManager] folderInfoLocation]; + fc = [cm acquireOpenChannelForURL: folderLocation]; + if (fc) + { + sql + = [NSString stringWithFormat: (@"SELECT c_foldername FROM %@" + @" WHERE c_path = '%@'"), + [folderLocation gcsTableName], ocsPath]; + [fc evaluateExpressionX: sql]; + attrs = [fc describeResults: NO]; + row = [fc fetchAttributes: attrs withZone: NULL]; + if (row) + [self _setDisplayNameFromRow: row]; + [fc cancelFetch]; + [cm releaseChannel: fc]; + } +} + +- (void) setDisplayName: (NSString *) newDisplayName +{ + ASSIGN (displayName, newDisplayName); +} + +- (NSString *) displayName +{ + if (!displayName) + [self _fetchDisplayName]; + + return displayName; +} + +- (NSString *) davDisplayName +{ + return [self displayName]; } - (GCSFolder *) ocsFolder @@ -188,7 +257,9 @@ static NSString *defaultUserID = @""; { NSException *result; +// [self dieHard]; result = [[self folderManager] createFolderOfType: [self folderType] + withName: displayName atPath: ocsPath]; return (result == nil); @@ -196,7 +267,42 @@ static NSString *defaultUserID = @""; - (NSException *) delete { - return [[self folderManager] deleteFolderAtPath: ocsPath]; + NSException *error; + + if ([nameInContainer isEqualToString: @"personal"]) + error = [NSException exceptionWithHTTPStatus: 403 + reason: @"folder 'personal' cannot be deleted"]; + else + error = [[self folderManager] deleteFolderAtPath: ocsPath]; + + return error; +} + +- (void) renameTo: (NSString *) newName +{ + GCSChannelManager *cm; + EOAdaptorChannel *fc; + NSURL *folderLocation; + NSString *sql; + + [displayName release]; + displayName = nil; + + cm = [GCSChannelManager defaultChannelManager]; + folderLocation + = [[GCSFolderManager defaultFolderManager] folderInfoLocation]; + fc = [cm acquireOpenChannelForURL: folderLocation]; + if (fc) + { + sql + = [NSString stringWithFormat: (@"UPDATE %@ SET c_foldername = '%@'" + @" WHERE c_path = '%@'"), + [folderLocation gcsTableName], newName, ocsPath]; + [fc evaluateExpressionX: sql]; + [cm releaseChannel: fc]; +// sql = [sql stringByAppendingFormat:@" WHERE %@ = '%@'", +// uidColumnName, [self uid]]; + } } - (NSArray *) fetchContentObjectNames @@ -212,7 +318,7 @@ static NSString *defaultUserID = @""; } if ([records isKindOfClass: [NSException class]]) return records; - return [records valueForKey: @"c_name"]; + return [records objectsForKey: @"c_name"]; } - (BOOL) nameExistsInFolder: (NSString *) objectName @@ -470,7 +576,7 @@ static NSString *defaultUserID = @""; /* acls */ - (NSArray *) aclUsers { - return [self aclUsersForObjectAtPath: [self pathArrayToSoObject]]; + return [self aclUsersForObjectAtPath: [self pathArrayToSOGoObject]]; } - (NSArray *) aclsForUser: (NSString *) uid @@ -480,7 +586,7 @@ static NSString *defaultUserID = @""; acls = [NSMutableArray array]; ownAcls = [self aclsForUser: uid - forObjectAtPath: [self pathArrayToSoObject]]; + forObjectAtPath: [self pathArrayToSOGoObject]]; [acls addObjectsFromArray: ownAcls]; if ([container respondsToSelector: @selector (aclsForUser:)]) { @@ -503,13 +609,13 @@ static NSString *defaultUserID = @""; { return [self setRoles: roles forUser: uid - forObjectAtPath: [self pathArrayToSoObject]]; + forObjectAtPath: [self pathArrayToSOGoObject]]; } - (void) removeAclsForUsers: (NSArray *) users { return [self removeAclsForUsers: users - forObjectAtPath: [self pathArrayToSoObject]]; + forObjectAtPath: [self pathArrayToSOGoObject]]; } - (NSString *) defaultUserID