diff --git a/ChangeLog b/ChangeLog index 1c09f87eb..4480cca42 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2007-10-10 Ludovic Marcotte + + * We now send advisory emails when folders + are created / deleted. + + * Fixed the sending of advisory emails upon + ACL changes on folders. + + 2007-10-10 Ludovic Marcotte * UI/Scheduler/UIxComponentEditor.m diff --git a/SoObjects/Mailer/SOGoMailFolder.m b/SoObjects/Mailer/SOGoMailFolder.m index babd5684f..b73b62a52 100644 --- a/SoObjects/Mailer/SOGoMailFolder.m +++ b/SoObjects/Mailer/SOGoMailFolder.m @@ -585,7 +585,7 @@ static BOOL useAltNamespace = NO; return userPath; } -- (NSString *) httpURLForAdvisoryToUser: (NSString *) uid; +- (NSString *) httpURLForAdvisoryToUser: (NSString *) uid { SOGoUser *user; NSString *otherUsersPath, *url; @@ -609,7 +609,7 @@ static BOOL useAltNamespace = NO; return url; } -- (NSString *) resourceURLForAdvisoryToUser: (NSString *) uid; +- (NSString *) resourceURLForAdvisoryToUser: (NSString *) uid { NSURL *selfURL, *userURL; diff --git a/SoObjects/SOGo/SOGoFolder.m b/SoObjects/SOGo/SOGoFolder.m index db7256ef7..671f76434 100644 --- a/SoObjects/SOGo/SOGoFolder.m +++ b/SoObjects/SOGo/SOGoFolder.m @@ -31,6 +31,7 @@ #import #import #import +#import #import #import #import @@ -41,6 +42,7 @@ #import #import #import +#import #import "NSArray+Utilities.h" #import "NSString+Utilities.h" @@ -255,15 +257,35 @@ static NSString *defaultUserID = @""; return @""; } +- (void) sendFolderAdvisoryTemplate: (NSString *) template +{ + NSString *language, *pageName; + SOGoUser *user; + SOGoFolderAdvisory *page; + WOApplication *app; + + user = [SOGoUser userWithLogin: [[context activeUser] login] roles: nil]; + language = [user language]; + pageName = [NSString stringWithFormat: @"SOGoFolder%@%@Advisory", + language, template]; + + app = [WOApplication application]; + page = [app pageWithName: pageName inContext: context]; + [page setFolderObject: self]; + [page setRecipientUID: [[context activeUser] login]]; + [page send]; +} + - (BOOL) create { NSException *result; -// [self dieHard]; result = [[self folderManager] createFolderOfType: [self folderType] withName: displayName atPath: ocsPath]; + if (!result) [self sendFolderAdvisoryTemplate: @"Addition"]; + return (result == nil); } @@ -271,12 +293,17 @@ static NSString *defaultUserID = @""; { NSException *error; + // We just fetch our displayName since our table will use it! + [self displayName]; + if ([nameInContainer isEqualToString: @"personal"]) error = [NSException exceptionWithHTTPStatus: 403 reason: @"folder 'personal' cannot be deleted"]; else error = [[self folderManager] deleteFolderAtPath: ocsPath]; + if (!error) [self sendFolderAdvisoryTemplate: @"Removal"]; + return error; } diff --git a/UI/SOGoUI/GNUmakefile b/UI/SOGoUI/GNUmakefile index 034e2764c..492823221 100644 --- a/UI/SOGoUI/GNUmakefile +++ b/UI/SOGoUI/GNUmakefile @@ -27,8 +27,8 @@ libSOGoUI_OBJC_FILES += \ SOGoAptFormatter.m \ SOGoJSStringFormatter.m \ WOContext+UIx.m \ - \ - SOGoACLAdvisory.m + SOGoACLAdvisory.m \ + SOGoFolderAdvisory.m # make diff --git a/UI/SOGoUI/SOGoACLAdvisory.m b/UI/SOGoUI/SOGoACLAdvisory.m index 12c2be31b..327b40268 100644 --- a/UI/SOGoUI/SOGoACLAdvisory.m +++ b/UI/SOGoUI/SOGoACLAdvisory.m @@ -126,7 +126,7 @@ - (NSString *) aclMethod { [self subclassResponsibility: _cmd]; - + return nil; } @@ -211,19 +211,25 @@ @end @implementation SOGoACLEnglishAdditionAdvisory +- (NSString *) aclMethod { return @"add"; } @end @implementation SOGoACLEnglishRemovalAdvisory +- (NSString *) aclMethod { return @"remove"; } @end @implementation SOGoACLFrenchAdditionAdvisory +- (NSString *) aclMethod { return @"add"; } @end @implementation SOGoACLFrenchRemovalAdvisory +- (NSString *) aclMethod { return @"remove"; } @end @implementation SOGoACLGermanAdditionAdvisory +- (NSString *) aclMethod { return @"add"; } @end @implementation SOGoACLGermanRemovalAdvisory +- (NSString *) aclMethod { return @"remove"; } @end diff --git a/UI/SOGoUI/SOGoFolderAdvisory.h b/UI/SOGoUI/SOGoFolderAdvisory.h new file mode 100644 index 000000000..3485d4c6a --- /dev/null +++ b/UI/SOGoUI/SOGoFolderAdvisory.h @@ -0,0 +1,68 @@ +/* SOGoFolderAdvisory.h - this file is part of SOGo + * + * Copyright (C) 2007 Inverse groupe conseil + * + * Author: Ludovic Marcotte + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef SOGOFOLDERADVISORY_H +#define SOGOFOLDERADVISORY_H + +#import "UIxComponent.h" +#import "../../SoObjects/SOGo/SOGoFolder.h" + +@interface SOGoFolderAdvisory : UIxComponent +{ + NSString *recipientUID; + SOGoFolder *folderObject; + BOOL isSubject; + BOOL isBody; +} + +- (void) setFolderObject: (SOGoFolder *) theFolder; +- (void) setRecipientUID: (NSString *) newRecipientUID; +- (void) send; + +- (BOOL) isSubject; +- (BOOL) isBody; + +- (NSString *) subject; +- (NSString *) body; +- (NSString *) folderMethod; + +@end + +@interface SOGoFolderEnglishAdditionAdvisory : SOGoFolderAdvisory +@end + +@interface SOGoFolderEnglishRemovalAdvisory : SOGoFolderAdvisory +@end + +@interface SOGoFolderFrenchAdditionAdvisory : SOGoFolderAdvisory +@end + +@interface SOGoFolderFrenchRemovalAdvisory : SOGoFolderAdvisory +@end + +@interface SOGoFolderGermanAdditionAdvisory : SOGoFolderAdvisory +@end + +@interface SOGoFolderGermanRemovalAdvisory : SOGoFolderAdvisory +@end + +#endif /* SOGOFOLDERADVISORY_H */ diff --git a/UI/SOGoUI/SOGoFolderAdvisory.m b/UI/SOGoUI/SOGoFolderAdvisory.m new file mode 100644 index 000000000..28870f8c8 --- /dev/null +++ b/UI/SOGoUI/SOGoFolderAdvisory.m @@ -0,0 +1,227 @@ +/* SOGoFolderAdvisory.m - this file is part of SOGo + * + * Copyright (C) 2007 Inverse groupe conseil + * + * Author: Ludovic Marcotte + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#import +#import +#import +#import +#import + +#import +#import +#import +#import +#import + +#import "SOGoFolderAdvisory.h" + +@implementation SOGoFolderAdvisory + +- (id) init +{ + if ((self = [super init])) + { + recipientUID = nil; + folderObject = nil; + isSubject = NO; + isBody = NO; + } + + return self; +} + +- (void) dealloc +{ + [recipientUID release]; + [folderObject release]; + [super dealloc]; +} + +- (void) setFolderObject: (SOGoFolder *) theFolder +{ + ASSIGN(folderObject, theFolder); +} + +- (void) setRecipientUID: (NSString *) newRecipientUID +{ + ASSIGN (recipientUID, newRecipientUID); +} + +- (BOOL) isSubject +{ + return isSubject; +} + +- (BOOL) isBody +{ + return isBody; +} + +- (NSString *) displayName +{ + return [folderObject displayName]; +} + +- (NSString *) httpFolderURL +{ + NSMutableString *url; + +#warning the url returned by SOGoMail may be empty, we need to handle that + url = [NSMutableString stringWithString: [[folderObject soURL] absoluteString]]; + + if (![url hasSuffix: @"/"]) + [url appendString: @"/"]; + + return url; +} + +- (NSString *) subject +{ + NSString *subject; + + isSubject = YES; + subject = [[self generateResponse] contentAsString]; + isSubject = NO; + + return [subject stringByTrimmingSpaces]; +} + +- (NSString *) body +{ + NSString *body; + + isBody = YES; + body = [[self generateResponse] contentAsString]; + isBody = NO; + + return [body stringByTrimmingSpaces]; +} + +- (NSString *) folderMethod +{ + [self subclassResponsibility: _cmd]; + + return nil; +} + +- (NGMimeBodyPart *) _textPart +{ + NGMutableHashMap *headerMap; + NGMimeBodyPart *part; + NSData *body; + + headerMap = [NGMutableHashMap hashMapWithCapacity: 1]; + [headerMap setObject: @"text/plain; charset=utf-8" forKey: @"content-type"]; + + part = [NGMimeBodyPart bodyPartWithHeader: headerMap]; + body = [[self body] dataUsingEncoding: NSUTF8StringEncoding]; + [part setBody: [self body]]; + + return part; +} + +- (NGMimeBodyPart *) _sogoNotificationPart +{ + NGMutableHashMap *headerMap; + NGMimeBodyPart *part; + NSData *body; + + /* calendar part */ + headerMap = [NGMutableHashMap hashMapWithCapacity: 1]; + [headerMap setObject: [NSString stringWithFormat: + @"%@; method=%@; type=%@; charset=%@", + @"application/x-sogo-notification", + [self folderMethod], [folderObject folderType], + @"utf-8"] + forKey: @"content-type"]; + + part = [NGMimeBodyPart bodyPartWithHeader: headerMap]; + body = [[self httpFolderURL] dataUsingEncoding: NSUTF8StringEncoding]; + [part setBody: body]; + + return part; +} + +- (void) send +{ + NSString *recipient, *date; + NGMutableHashMap *headerMap; + NGMimeMessage *message; + NGMimeMultipartBody *body; + SOGoUser *activeUser; + NSDictionary *identity; + NSString *from, *fullMail; + + activeUser = [context activeUser]; + identity = [activeUser primaryIdentity]; + from = [identity objectForKey: @"email"]; + fullMail = [NSString stringWithFormat: @"%@ <%@>", + [identity objectForKey: @"fullName"], from]; + + recipient = [[LDAPUserManager sharedUserManager] + getFullEmailForUID: recipientUID]; + + headerMap = [NGMutableHashMap hashMapWithCapacity: 5]; + [headerMap setObject: @"multipart/alternative" forKey: @"content-type"]; + [headerMap setObject: fullMail forKey: @"From"]; + [headerMap setObject: recipient forKey: @"To"]; + date = [[NSCalendarDate date] rfc822DateString]; + [headerMap setObject: date forKey: @"Date"]; + [headerMap setObject: [self subject] forKey: @"Subject"]; + message = [NGMimeMessage messageWithHeader: headerMap]; + + body = [[NGMimeMultipartBody alloc] initWithPart: message]; + [body addBodyPart: [self _textPart]]; + [body addBodyPart: [self _sogoNotificationPart]]; + [message setBody: body]; + [body release]; + + [[SOGoMailer sharedMailer] sendMimePart: message + toRecipients: [NSArray arrayWithObject: recipient] + sender: from]; +} + +@end + +@implementation SOGoFolderEnglishAdditionAdvisory +- (NSString *) folderMethod { return @"add"; } +@end + +@implementation SOGoFolderEnglishRemovalAdvisory +- (NSString *) folderMethod { return @"remove"; } +@end + +@implementation SOGoFolderFrenchAdditionAdvisory +- (NSString *) folderMethod { return @"add"; } +@end + +@implementation SOGoFolderFrenchRemovalAdvisory +- (NSString *) folderMethod { return @"remove"; } +@end + +@implementation SOGoFolderGermanAdditionAdvisory +- (NSString *) folderMethod { return @"add"; } +@end + +@implementation SOGoFolderGermanRemovalAdvisory +- (NSString *) folderMethod { return @"remove"; } +@end diff --git a/UI/Templates/SOGoFolderEnglishAdditionAdvisory.wox b/UI/Templates/SOGoFolderEnglishAdditionAdvisory.wox new file mode 100644 index 000000000..f02d5b07e --- /dev/null +++ b/UI/Templates/SOGoFolderEnglishAdditionAdvisory.wox @@ -0,0 +1,22 @@ + + + + + + has been created + + + +The folder has been created. + +You can access this resource remotely by using the following URL: + + + + + diff --git a/UI/Templates/SOGoFolderEnglishRemovalAdvisory.wox b/UI/Templates/SOGoFolderEnglishRemovalAdvisory.wox new file mode 100644 index 000000000..467c92635 --- /dev/null +++ b/UI/Templates/SOGoFolderEnglishRemovalAdvisory.wox @@ -0,0 +1,22 @@ + + + + + + has been deleted + + + +The folder has been deleted. + +The following URL is now no longer active: + + + + + diff --git a/UI/Templates/SOGoFolderFrenchAdditionAdvisory.wox b/UI/Templates/SOGoFolderFrenchAdditionAdvisory.wox new file mode 100644 index 000000000..1bd57f06a --- /dev/null +++ b/UI/Templates/SOGoFolderFrenchAdditionAdvisory.wox @@ -0,0 +1,22 @@ + + + + + + a été créé + + + +Le dossier a été créé. + +Vous pouvez accèder à distance à ce dossier avec le lien suivant: + + + + + diff --git a/UI/Templates/SOGoFolderFrenchRemovalAdvisory.wox b/UI/Templates/SOGoFolderFrenchRemovalAdvisory.wox new file mode 100644 index 000000000..4789a02a5 --- /dev/null +++ b/UI/Templates/SOGoFolderFrenchRemovalAdvisory.wox @@ -0,0 +1,22 @@ + + + + + + a été supprimé + + + +Le dossier a été supprimé. + +Le lien suivant n'est plus actif: + + + + + diff --git a/UI/Templates/SOGoFolderGermanAdditionAdvisory.wox b/UI/Templates/SOGoFolderGermanAdditionAdvisory.wox new file mode 100644 index 000000000..f02d5b07e --- /dev/null +++ b/UI/Templates/SOGoFolderGermanAdditionAdvisory.wox @@ -0,0 +1,22 @@ + + + + + + has been created + + + +The folder has been created. + +You can access this resource remotely by using the following URL: + + + + + diff --git a/UI/Templates/SOGoFolderGermanRemovalAdvisory.wox b/UI/Templates/SOGoFolderGermanRemovalAdvisory.wox new file mode 100644 index 000000000..467c92635 --- /dev/null +++ b/UI/Templates/SOGoFolderGermanRemovalAdvisory.wox @@ -0,0 +1,22 @@ + + + + + + has been deleted + + + +The folder has been deleted. + +The following URL is now no longer active: + + + + +