diff --git a/ChangeLog b/ChangeLog index f7a3f9e0a..2cfe29694 100644 --- a/ChangeLog +++ b/ChangeLog @@ -8,6 +8,9 @@ 2010-08-19 Wolfgang Sourdeau + * Tools/sogo-ealarms-notify.m: new tool meant to be executed every + minute from cron for handling email alarms notifications. + * SoObjects/Appointments/SOGoEMailAlarmsManager.[hm]: new GCS aware singleton class for main email alarms operations on the db. diff --git a/Tools/SOGoEAlarmsNotifier.h b/Tools/SOGoEAlarmsNotifier.h new file mode 100644 index 000000000..8cd964d9f --- /dev/null +++ b/Tools/SOGoEAlarmsNotifier.h @@ -0,0 +1,36 @@ +/* SOGoEAlarmsNotifier.h - this file is part of SOGo + * + * Copyright (C) 2010 Inverse inc. + * + * Author: Wolfgang Sourdeau + * + * 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 SOGOEALARMSNOTIFIER_H +#define SOGOEALARMSNOTIFIER_H + +#import + +@interface SOGoEAlarmsNotifier : NSObject +{ +} + +- (BOOL) run; + +@end + +#endif /* SOGOEALARMSNOTIFIER_H */ diff --git a/Tools/SOGoEAlarmsNotifier.m b/Tools/SOGoEAlarmsNotifier.m new file mode 100644 index 000000000..4ef096f03 --- /dev/null +++ b/Tools/SOGoEAlarmsNotifier.m @@ -0,0 +1,186 @@ +/* SOGoEAlarmsNotifier.m - this file is part of SOGo + * + * Copyright (C) 2010 Inverse inc. + * + * Author: Wolfgang Sourdeau + * + * 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. + */ + +#include + +#import +#import +#import +#import + +#import +#import +#import +#import +#import + +#import +#import +#import + +#import +#import +#import +#import +#import +#import +#import +#import +#import + +#import "SOGoEAlarmsNotifier.h" + +@implementation SOGoEAlarmsNotifier + +- (NSString *) _messageID +{ + static int pid = 0; + static int sequence = 0; + NSString *messageID, *pGUID; + int timestamp; + + if (pid == 0) + pid = getpid(); + sequence++; + timestamp = (int) [[NSDate date] timeIntervalSince1970]; + pGUID = [[NSProcessInfo processInfo] globallyUniqueString]; + + messageID = [NSString stringWithFormat: @"<%0X-%0X-%0X-%0X@%u>", + pid, timestamp, sequence, random(), [pGUID hash]]; + + return [messageID lowercaseString]; +} + +- (NGMutableHashMap *) _headersForAlarm: (iCalAlarm *) alarm + withOwner: (SOGoUser *) owner +{ + NGMutableHashMap *headers; + NSString *dateString, *subject, *fullName, *email; + NSDictionary *identity; + + headers = [NGMutableHashMap hashMap]; + + subject = [[alarm summary] asQPSubjectString: @"utf-8"]; + [headers addObject: subject forKey: @"Subject"]; + dateString = [[NSCalendarDate date] rfc822DateString]; + [headers addObject: dateString forKey: @"Date"]; + [headers addObject: @"1.0" forKey: @"MIME-Version"]; + [headers addObject: @"SOGo Alarms Notifier/1.0" forKey: @"User-Agent"]; + [headers addObject: @"high" forKey: @"Importance"]; + [headers addObject: @"1" forKey: @"X-Priority"]; + [headers setObject: @"text/plain; charset=\"utf-8\"" forKey: @"Content-Type"]; + [headers setObject: @"quoted-printable" forKey: @"Content-Transfer-Encoding"]; + + identity = [owner primaryIdentity]; + fullName = [identity objectForKey: @"fullName"]; + if ([fullName length]) + email = [NSString stringWithFormat: @"%@ <%@>", fullName, + [identity objectForKey: @"email"]]; + else + email = [identity objectForKey: @"email"]; + [headers addObject: email forKey: @"From"]; + + return headers; +} + +- (void) _sendMessageWithHeaders: (NGMutableHashMap *) headers + content: (NSData *) content + toAttendee: (iCalPerson *) attendee + from: (NSString *) from + withMailer: (SOGoMailer *) mailer +{ + NGMimeMessage *message; + NSString *to; + + [headers setObject: [attendee mailAddress] forKey: @"To"]; + [headers setObject: [self _messageID] forKey: @"Message-Id"]; + message = [NGMimeMessage messageWithHeader: headers]; + [message setBody: content]; + to = [attendee rfc822Email]; + [mailer sendMimePart: message + toRecipients: [NSArray arrayWithObject: to] + sender: from]; +} + +- (void) _processAlarm: (iCalAlarm *) alarm + withOwner: (NSString *) ownerId +{ + NGMutableHashMap *headers; + NSArray *attendees; + NSData *content, *qpContent; + int count, max; + SOGoMailer *mailer; + NSString *from; + SOGoUser *owner; + + owner = [SOGoUser userWithLogin: ownerId]; + mailer = [SOGoMailer mailerWithDomainDefaults: [owner domainDefaults]]; + + headers = [self _headersForAlarm: alarm withOwner: owner]; + content = [[alarm comment] dataUsingEncoding: NSUTF8StringEncoding]; + qpContent = [content dataByEncodingQuotedPrintable]; + from = [[owner primaryIdentity] objectForKey: @"email"]; + + attendees = [alarm attendees]; + max = [attendees count]; + for (count = 0; count < max; count++) + [self _sendMessageWithHeaders: headers + content: qpContent + toAttendee: [attendees objectAtIndex: count] + from: from + withMailer: mailer]; +} + +- (BOOL) run +{ + SOGoEMailAlarmsManager *eaMgr; + NSCalendarDate *startDate, *toDate; + NSArray *alarms; + NSMutableArray *owners; + int count, max; + + [[SOGoProductLoader productLoader] + loadProducts: [NSArray arrayWithObject: @"Appointments.SOGo"]]; + + eaMgr = [NSClassFromString (@"SOGoEMailAlarmsManager") + sharedEMailAlarmsManager]; + + startDate = [NSCalendarDate calendarDate]; + toDate = [startDate addYear: 0 month: 0 day: 0 + hour: 0 minute: 0 + second: -[startDate secondOfMinute]]; + alarms = [eaMgr scheduledAlarmsFromDate: [toDate addYear: 0 month: 0 day: 0 + hour: 0 minute: -5 + second: 0] + toDate: toDate + withOwners: &owners]; + max = [alarms count]; + for (count = 0; count < max; count++) + [self _processAlarm: [alarms objectAtIndex: count] + withOwner: [owners objectAtIndex: count]]; + + [eaMgr deleteAlarmsUntilDate: toDate]; + + return YES; +} + +@end diff --git a/Tools/sogo-ealarms-notify.m b/Tools/sogo-ealarms-notify.m new file mode 100644 index 000000000..24580fbb0 --- /dev/null +++ b/Tools/sogo-ealarms-notify.m @@ -0,0 +1,66 @@ +/* sogo-ealarms-notify.m - this file is part of SOGo + * + * Copyright (C) 2010 Inverse inc. + * + * Author: Wolfgang Sourdeau + * + * 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 "SOGoEAlarmsNotifier.h" + +int +main (int argc, char **argv, char **env) +{ + NSAutoreleasePool *pool; + NSUserDefaults *ud; + SOGoEAlarmsNotifier *notifier; + int rc; + + rc = 0; + + pool = [NSAutoreleasePool new]; + + ud = [NSUserDefaults standardUserDefaults]; + [ud addSuiteNamed: @"sogod"]; + + if ([ud objectForKey: @"SOGoUserSources"]) + { + if ([ud objectForKey: @"SOGoEnableEMailAlarms"]) + { + notifier = [SOGoEAlarmsNotifier new]; + if (![notifier run]) + rc = -1; + [notifier release]; + } + else + NSLog (@"EMail alarms are disabled in the SOGo configuration."); + } + else + { + NSLog (@"No LDAP source is configured in the SOGo configuration of this" + @" account. Please make sure to use this tool under the same" + @" username as SOGo."); + rc = -1; + } + + [pool release]; + + return rc; +}