Monotone-Parent: ce0a852faf4ba22891a76c3c85731b7a32e2d14a
Monotone-Revision: 863c571be4782f1a0a91daa6a3747c901ac69aaa Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2010-08-20T01:40:07 Monotone-Branch: ca.inverse.sogomaint-2.0.2
parent
2f66264657
commit
3c426c52cf
|
@ -8,6 +8,9 @@
|
||||||
|
|
||||||
2010-08-19 Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
2010-08-19 Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||||
|
|
||||||
|
* 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
|
* SoObjects/Appointments/SOGoEMailAlarmsManager.[hm]: new GCS
|
||||||
aware singleton class for main email alarms operations on the db.
|
aware singleton class for main email alarms operations on the db.
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
/* SOGoEAlarmsNotifier.h - this file is part of SOGo
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Inverse inc.
|
||||||
|
*
|
||||||
|
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||||
|
*
|
||||||
|
* 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 <Foundation/NSObject.h>
|
||||||
|
|
||||||
|
@interface SOGoEAlarmsNotifier : NSObject
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL) run;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
#endif /* SOGOEALARMSNOTIFIER_H */
|
|
@ -0,0 +1,186 @@
|
||||||
|
/* SOGoEAlarmsNotifier.m - this file is part of SOGo
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Inverse inc.
|
||||||
|
*
|
||||||
|
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||||
|
*
|
||||||
|
* 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 <unistd.h>
|
||||||
|
|
||||||
|
#import <Foundation/NSArray.h>
|
||||||
|
#import <Foundation/NSCalendarDate.h>
|
||||||
|
#import <Foundation/NSProcessInfo.h>
|
||||||
|
#import <Foundation/NSString.h>
|
||||||
|
|
||||||
|
#import <NGExtensions/NGHashMap.h>
|
||||||
|
#import <NGExtensions/NGQuotedPrintableCoding.h>
|
||||||
|
#import <NGExtensions/NSObject+Logs.h>
|
||||||
|
#import <NGMail/NGMimeMessage.h>
|
||||||
|
#import <NGMime/NGMimeBodyPart.h>
|
||||||
|
|
||||||
|
#import <NGCards/iCalAlarm.h>
|
||||||
|
#import <NGCards/iCalEntityObject.h>
|
||||||
|
#import <NGCards/iCalPerson.h>
|
||||||
|
|
||||||
|
#import <SOGo/NSCalendarDate+SOGo.h>
|
||||||
|
#import <SOGo/NSString+Utilities.h>
|
||||||
|
#import <SOGo/SOGoDomainDefaults.h>
|
||||||
|
#import <SOGo/SOGoSystemDefaults.h>
|
||||||
|
#import <SOGo/SOGoMailer.h>
|
||||||
|
#import <SOGo/SOGoProductLoader.h>
|
||||||
|
#import <SOGo/SOGoUser.h>
|
||||||
|
#import <Appointments/iCalPerson+SOGo.h>
|
||||||
|
#import <Appointments/SOGoEMailAlarmsManager.h>
|
||||||
|
|
||||||
|
#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
|
|
@ -0,0 +1,66 @@
|
||||||
|
/* sogo-ealarms-notify.m - this file is part of SOGo
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Inverse inc.
|
||||||
|
*
|
||||||
|
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||||
|
*
|
||||||
|
* 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 <Foundation/NSAutoreleasePool.h>
|
||||||
|
#import <Foundation/NSUserDefaults.h>
|
||||||
|
|
||||||
|
#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;
|
||||||
|
}
|
Loading…
Reference in New Issue