merge of '11b16e47828dac92fd5fc6a0141e90ca854b7b89'

and 'c1d31c63186b0154a4c8aae294a6968d64136187'

Monotone-Parent: 11b16e47828dac92fd5fc6a0141e90ca854b7b89
Monotone-Parent: c1d31c63186b0154a4c8aae294a6968d64136187
Monotone-Revision: 9cd6cf883ffe8961708e6bdb5a8b3a3f439eebbf

Monotone-Author: wsourdeau@inverse.ca
Monotone-Date: 2009-10-10T18:40:15
Monotone-Branch: ca.inverse.sogo
This commit is contained in:
Wolfgang Sourdeau
2009-10-10 18:40:15 +00:00
25 changed files with 200 additions and 907 deletions

View File

@@ -13,18 +13,15 @@
* Main/SOGo.m (-init): released "rm" when no longer needed.
(-dispatchRequest:): simplified leak catching code.
2009-10-08 Wolfgang Sourdeau <wsourdeau@inverse.ca>
2009-10-08 Ludovic Marcotte <lmarcotte@inverse.ca>
* SoObjects/SOGo/LDAPSource.m (-_searchAttributes): we already
have knowledge of the LDAPContactInfoAttribute so we no longer
need to fetch it from the user defaults.
* SoObjects/Contacts/SOGoContactLDIFEntry.m
(-initWithName:withLDIFEntry:inContainer:): we no longer retain
"container" in order to avoid a leak.
(-vCard): we now use the "VCARD" profile, all in upper case. We
first resolve the full name using "c_cn", which is the special key
used by the LDAP sources to access the fullname attribute.
* Added filters support (Vacation and Forward) which
can be enabled using the SOGoVacationEnabled and
SOGoForwardEnabled defaults. One Sieve right now is
support and we assume the Sieve server is the same
as the IMAP server, running on port 2000.
* Cleaned up everything related to the old Sieve stuff
which was now useless with our new implementation.
2009-10-08 Francis Lachapelle <flachapelle@inverse.ca>
@@ -42,6 +39,17 @@
2009-10-08 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* SoObjects/SOGo/LDAPSource.m (-_searchAttributes): we already
have knowledge of the LDAPContactInfoAttribute so we no longer
need to fetch it from the user defaults.
* SoObjects/Contacts/SOGoContactLDIFEntry.m
(-initWithName:withLDIFEntry:inContainer:): we no longer retain
"container" in order to avoid a leak.
(-vCard): we now use the "VCARD" profile, all in upper case. We
first resolve the full name using "c_cn", which is the special key
used by the LDAP sources to access the fullname attribute.
* Tests/webdavlib.py (MailDAVMailQuery._initSort): now handles the
"order" attribute from the "ascending" parameter.

3
NEWS
View File

@@ -14,8 +14,9 @@
- added support for remote ICS subscriptions
- added support for ICS and vCard/LDIF import
- added support for event delegation (resend an invitation to someone else)
- added alpha support for checking and displaying signed messages
- added initial support for checking and displaying S/MIME signed messages
- added support SQL-based authentication sources and address books
- added support for Sieve filters (Vacation and Forward)
1.0-20090812 (1.0.4)
--------------------

View File

@@ -7,7 +7,6 @@ SUBPROJECTS = \
SOGo \
Appointments \
Contacts \
Mailer \
# Sieve \
Mailer
include $(GNUSTEP_MAKEFILES)/aggregate.make

View File

@@ -1,20 +1,21 @@
/*
Copyright (C) 2009 Inverse inc.
Copyright (C) 2004-2005 SKYRIX Software AG
This file is part of OpenGroupware.org.
This file is part of SOGo.
OGo is free software; you can redistribute it and/or modify it under
SOGo is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
OGo is distributed in the hope that it will be useful, but WITHOUT ANY
SOGo 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 Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with OGo; see the file COPYING. If not, write to the
License along with SOGo; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
@@ -52,6 +53,7 @@
- (void) setAccountName: (NSString *) newAccountName;
- (BOOL) supportsQuotas;
- (BOOL) updateFilters;
/* folder pathes */
@@ -68,7 +70,6 @@
- (NSString *) inboxFolderNameInContext: (id)_ctx;
- (NSString *) draftsFolderNameInContext: (id)_ctx;
// - (NSString *) sieveFolderNameInContext: (id)_ctx;
- (NSString *) sentFolderNameInContext: (id)_ctx;
- (NSString *) trashFolderNameInContext: (id)_ctx;

View File

@@ -15,7 +15,7 @@
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with OGo; see the file COPYING. If not, write to the
License along with SOGo; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
@@ -29,12 +29,14 @@
#import <NGObjWeb/SoHTTPAuthenticator.h>
#import <NGObjWeb/WORequest.h>
#import <NGObjWeb/WOContext+SoObjects.h>
#import <NGStreams/NGInternetSocketAddress.h>
#import <NGExtensions/NSNull+misc.h>
#import <NGExtensions/NSObject+Logs.h>
#import <NGExtensions/NSString+misc.h>
#import <NGImap4/NGImap4Connection.h>
#import <NGImap4/NGImap4Client.h>
#import <NGImap4/NGImap4Context.h>
#import <NGImap4/NGSieveClient.h>
#import <SoObjects/SOGo/NSArray+Utilities.h>
#import <SoObjects/SOGo/SOGoUser.h>
@@ -52,11 +54,12 @@
static NSArray *rootFolderNames = nil;
static NSString *inboxFolderName = @"INBOX";
static NSString *draftsFolderName = @"Drafts";
static NSString *sieveFolderName = @"Filters";
static NSString *sentFolderName = nil;
static NSString *trashFolderName = nil;
static NSString *sharedFolderName = @""; // TODO: add English default
static NSString *sharedFolderName = @""; // TODO: add English default
static NSString *otherUsersFolderName = @""; // TODO: add English default
static NSString *sieveScriptName = @"sogo";
static BOOL defaultShowSubscribedFoldersOnly = NO;
// this is temporary, until we allow users to manage their own accounts
static NSString *fallbackIMAP4Server = nil;
@@ -91,15 +94,10 @@ static NSString *fallbackIMAP4Server = nil;
NSLog(@"Note: using shared-folders name: '%@'", sharedFolderName);
NSLog(@"Note: using other-users-folders name: '%@'", otherUsersFolderName);
if ([ud boolForKey: @"SOGoEnableSieveFolder"])
rootFolderNames = [[NSArray alloc] initWithObjects:
draftsFolderName,
sieveFolderName,
nil];
else
rootFolderNames = [[NSArray alloc] initWithObjects:
draftsFolderName,
nil];
rootFolderNames = [[NSArray alloc] initWithObjects:
draftsFolderName,
nil];
if (!fallbackIMAP4Server)
{
@@ -206,6 +204,147 @@ static NSString *fallbackIMAP4Server = nil;
return [capability containsObject: @"quota"];
}
- (BOOL) updateFilters
{
NSMutableString *header, *script;
NGInternetSocketAddress *address;
NSDictionary *result, *values;
NSUserDefaults *ud;
NGSieveClient *client;
NSString *v;
BOOL b;
if (![[NSUserDefaults standardUserDefaults] boolForKey: @"SOGoVacationEnabled"] &&
![[NSUserDefaults standardUserDefaults] boolForKey: @"SOGoForwardEnabled"])
return YES;
ud = [[context activeUser] userDefaults];
b = NO;
header = [NSMutableString stringWithString: @"require ["];
script = [NSMutableString string];
// Right now, we handle Sieve filters here and only for vacation
// and forwards. Traditional filters support (for fileinto, for
// example) will be added later.
values = [ud objectForKey: @"Vacation"];
// We handle vacation messages.
// See http://ietfreport.isoc.org/idref/draft-ietf-sieve-vacation/
if (values && [[values objectForKey: @"enabled"] boolValue])
{
NSArray *addresses;
NSString *text;
BOOL ignore;
int days, i;
days = [[values objectForKey: @"daysBetweenResponse"] intValue];
addresses = [values objectForKey: @"autoReplyEmailAddresses"];
ignore = [[values objectForKey: @"ignoreLists"] boolValue];
text = [values objectForKey: @"autoReplyText"];
b = YES;
if (days == 0)
days = 7;
[header appendString: @"\"vacation\""];
// Skip mailing lists
if (ignore)
[script appendString: @"if allof ( not exists [\"list-help\", \"list-unsubscribe\", \"list-subscribe\", \"list-owner\", \"list-post\", \"list-archive\", \"list-id\", \"Mailing-List\"], not header :comparator \"i;ascii-casemap\" :is \"Precedence\" [\"list\", \"bulk\", \"junk\"], not header :comparator \"i;ascii-casemap\" :matches \"To\" \"Multiple recipients of*\" ) {"];
[script appendFormat: @"vacation :days %d :addresses [", days];
for (i = 0; i < [addresses count]; i++)
{
[script appendFormat: @"\"%@\"", [addresses objectAtIndex: i]];
if (i == [addresses count]-1)
[script appendString: @"] "];
else
[script appendString: @", "];
}
[script appendFormat: @"text:\r\n%@\r\n.\r\n;\r\n", text];
if (ignore)
[script appendString: @"}\r\n"];
}
// We handle mail forward
values = [ud objectForKey: @"Forward"];
if (values && [[values objectForKey: @"enabled"] boolValue])
{
b = YES;
v = [values objectForKey: @"forwardAddress"];
if (v && [v length] > 0)
[script appendFormat: @"redirect \"%@\";\r\n", v];
if ([[values objectForKey: @"keepCopy"] boolValue])
[script appendString: @"keep;\r\n"];
}
if ([header compare: @"require ["] != NSOrderedSame)
{
[header appendString: @"];\r\n"];
[script insertString: header atIndex: 0];
}
// We connect to our Sieve server and upload the script
address = [NGInternetSocketAddress addressWithPort: 2000
onHost: [[self imap4URL] host]];
client = [NGSieveClient clientWithAddress: address];
if (!client) {
[self errorWithFormat: @"Sieve connection failed on %@", [address description]];
return NO;
}
result = [client login: [[self imap4URL] user] password:[self imap4Password]];
if (![[result valueForKey:@"result"] boolValue]) {
[self errorWithFormat: @"Could not login '%@' (%@) on Sieve server: %@: %@",
[[self imap4URL] user], [self imap4Password], client, result];
[client closeConnection];
return NO;
}
// We delete the existing Sieve script
result = [client deleteScript: sieveScriptName];
if (![[result valueForKey:@"result"] boolValue]) {
[self logWithFormat:@"WARNING: Could not delete Sieve script - continuing...: %@", result];
}
// We put and activate the script only if we actually have a script
// that does something...
if (b)
{
result = [client putScript: sieveScriptName script: script];
if (![[result valueForKey:@"result"] boolValue]) {
[self errorWithFormat:@"Could not upload Sieve script: %@", result];
[client closeConnection];
return NO;
}
result = [client setActiveScript: sieveScriptName];
if (![[result valueForKey:@"result"] boolValue]) {
[self errorWithFormat:@"Could not enable Sieve script: %@", result];
[client closeConnection];
return NO;
}
}
return YES;
}
/* hierarchy */
- (SOGoMailAccount *) mailAccountFolder
@@ -408,11 +547,6 @@ static NSString *fallbackIMAP4Server = nil;
return folderName;
}
// - (NSString *) sieveFolderNameInContext: (id) _ctx
// {
// return sieveFolderName;
// }
- (NSString *) sentFolderNameInContext: (id)_ctx
{
NSString *folderName;

View File

@@ -55,6 +55,9 @@
- (id) freeBusyObject: (NSString *) _key
inContext: (WOContext *) _ctx;
- (id) mailAccountsFolder: (NSString *) _key
inContext: (WOContext *) _ctx;
@end
#endif /* __SOGo_SOGoUserFolder_H__ */

View File

@@ -1,21 +0,0 @@
# GNUstep makefile
include ../common.make
BUNDLE_NAME = Sieve
Sieve_PRINCIPAL_CLASS = SOGoSieveProduct
Sieve_OBJC_FILES += \
Product.m \
SOGoSieveBaseObject.m \
SOGoSieveScriptsFolder.m\
SOGoSieveScriptObject.m \
Sieve_RESOURCE_FILES += \
Version \
product.plist \
-include GNUmakefile.preamble
include $(GNUSTEP_MAKEFILES)/bundle.make
-include GNUmakefile.postamble

View File

@@ -1,3 +0,0 @@
# compilation settings
ADDITIONAL_INCLUDE_DIRS += -I../Mailer

View File

@@ -1,32 +0,0 @@
/*
Copyright (C) 2004 SKYRIX Software AG
This file is part of OpenGroupware.org.
OGo is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
OGo 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 Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with OGo; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
#import <Foundation/NSObject.h>
@interface SOGoSieveProduct : NSObject
{
}
@end
@implementation SOGoSieveProduct
@end /* SOGoSieveProduct */

View File

@@ -1,8 +0,0 @@
# README for Sieve SoObjects
Class Overview
==============
Defaults
========

View File

@@ -1,60 +0,0 @@
/*
Copyright (C) 2004-2005 SKYRIX Software AG
This file is part of OpenGroupware.org.
OGo is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
OGo 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 Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with OGo; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
#ifndef __Sieve_SOGoSieveBaseObject_H__
#define __Sieve_SOGoSieveBaseObject_H__
#include <SOGo/SOGoObject.h>
/*
SOGoSieveBaseObject
Common base class for Sieve SoObjects.
*/
@class NSString, NSArray, NSURL;
@class NGSieveClient;
@class NGImap4ConnectionManager;
@class SOGoMailAccount;
@interface SOGoSieveBaseObject : SOGoObject
{
NGSieveClient *sieveClient;
}
/* hierarchy */
- (SOGoMailAccount *)mailAccountFolder;
/* IMAP4 */
- (NGImap4ConnectionManager *)mailManager;
- (NSURL *)imap4URL;
- (NSString *)imap4Password;
- (void)flushMailCaches;
/* Sieve */
- (NGSieveClient *)sieveClient;
@end
#endif /* __Sieve_SOGoSieveBaseObject_H__ */

View File

@@ -1,117 +0,0 @@
/*
Copyright (C) 2004-2005 SKYRIX Software AG
This file is part of OpenGroupware.org.
OGo is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
OGo 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 Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with OGo; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
#include "SOGoSieveBaseObject.h"
#include <Mailer/SOGoMailManager.h>
#include <Mailer/SOGoMailAccount.h>
#include "common.h"
#include <NGImap4/NGSieveClient.h>
#include <NGObjWeb/SoObject+SoDAV.h>
#include <NGObjWeb/SoHTTPAuthenticator.h>
#include <NGExtensions/NSURL+misc.h>
@implementation SOGoSieveBaseObject
- (void)dealloc {
[self->sieveClient release];
[super dealloc];
}
/* hierarchy */
- (SOGoMailAccount *)mailAccountFolder {
if (![[self container] respondsToSelector:_cmd]) {
[self logWithFormat:@"WARNING: weird container of mailfolder: %@",
[self container]];
return nil;
}
return [[self container] mailAccountFolder];
}
/* IMAP4 */
- (NGImap4ConnectionManager *)mailManager {
return [[self mailAccountFolder] mailManager];
}
- (NSURL *)imap4URL {
return [[self mailAccountFolder] imap4URL];
}
- (NSString *)imap4Password {
return [[self mailAccountFolder] imap4Password];
}
- (void)flushMailCaches {
}
/* Sieve */
- (NGSieveClient *)sieveClient {
id res;
if (self->sieveClient != nil)
return self->sieveClient;
/* check container */
res = [self container];
if ([res respondsToSelector:_cmd]) {
if ((res = [res sieveClient]) != nil) {
self->sieveClient = [res retain];
return self->sieveClient;
}
}
/* create client */
self->sieveClient =
[[NGSieveClient alloc] initWithHost:[[self imap4URL] host]];
if (self->sieveClient == nil)
return nil;
/* login */
res = [self->sieveClient
login:[[self imap4URL] user]
password:[self imap4Password]];
if (![[res valueForKey:@"result"] boolValue]) {
[self logWithFormat:
@"ERROR: could not login '%@'(%@) into Sieve server: %@: %@",
[[self imap4URL] user], [self imap4Password],
self->sieveClient, res];
[self->sieveClient release]; self->sieveClient = nil;
return nil;
}
return self->sieveClient;
}
/* debugging */
- (NSString *)loggingPrefix {
/* improve perf ... */
return [NSString stringWithFormat:@"<0x%08X[%@]:%@>",
self, NSStringFromClass([self class]),
[self nameInContainer]];
}
@end /* SOGoSieveBaseObject */

View File

@@ -1,50 +0,0 @@
/*
Copyright (C) 2004-2005 SKYRIX Software AG
This file is part of OpenGroupware.org.
OGo is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
OGo 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 Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with OGo; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
#ifndef __Sieve_SOGoSieveScriptObject_H__
#define __Sieve_SOGoSieveScriptObject_H__
#include "SOGoSieveBaseObject.h"
/*
SOGoSieveScriptObject
Parent object: SOGoSieveScriptsFolder
Child objects: none
The SOGoSieveScriptObject represents a single sieve script on a Cyrus folder.
*/
@class NSData, NSString, NSException;
@interface SOGoSieveScriptObject : SOGoSieveBaseObject
{
}
/* content */
- (NSString *)contentAsString;
- (NSData *)content;
- (NSException *)writeContent:(id)_content;
@end
#endif /* __Sieve_SOGoSieveScriptObject_H__ */

View File

@@ -1,139 +0,0 @@
/*
Copyright (C) 2004-2005 SKYRIX Software AG
This file is part of OpenGroupware.org.
OGo is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
OGo 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 Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with OGo; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
#include "SOGoSieveScriptObject.h"
#include "SOGoSieveScriptsFolder.h"
#include "common.h"
#include <NGImap4/NGSieveClient.h>
@implementation SOGoSieveScriptObject
/* script */
- (NSString *)fetchScript {
NGSieveClient *client;
if ((client = [self sieveClient]) == nil)
return nil;
return [client getScript:[self nameInContainer]];
}
/* content */
- (NSString *)contentAsString {
return [self fetchScript];
}
- (NSData *)content {
return [[self contentAsString] dataUsingEncoding:NSUTF8StringEncoding];
}
- (NSException *)exceptionForFailedPutResult:(NSDictionary *)_result {
NSString *reason;
/* Note: valueForKey:@"reason" does not work?! */
reason = [(NSDictionary *)[_result valueForKey:@"RawResponse"]
objectForKey:@"reason"];
if (![reason isNotNull])
reason = @"Failed to upload Sieve script.";
return [NSException exceptionWithHTTPStatus:500 /* Server Error */
reason:reason];
}
- (NSException *)writeContent:(id)_content {
NGSieveClient *client;
NSDictionary *result;
if (_content == nil) {
return [NSException exceptionWithHTTPStatus:400 /* Bad Request */
reason:@"Missing content to write!"];
}
if ((client = [self sieveClient]) == nil) {
return [NSException exceptionWithHTTPStatus:500 /* Server Error */
reason:@"Failed to create NGSieveClient object"];
}
result = [client putScript:[self nameInContainer] script:_content];
if (![[result valueForKey:@"result"] boolValue])
return [self exceptionForFailedPutResult:result];
return nil; /* everything is great */
}
/* operations */
- (NSException *)delete {
NSDictionary *res;
NSString *r;
res = [[self sieveClient] deleteScript:[self nameInContainer]];
if ([[res valueForKey:@"result"] boolValue])
return nil;
// TODO: make it a debug log
[self logWithFormat:@"sieve delete failed: %@", res];
r = [@"Sieve delete failed: " stringByAppendingString:[res description]];
return [NSException exceptionWithHTTPStatus:500 /* Server Error */
reason:r];
}
- (NSException *)activate {
return [[self container] activateScript:[self nameInContainer]];
}
/* name lookup */
- (id)lookupName:(NSString *)_key inContext:(id)_ctx acquire:(BOOL)_flag {
id obj;
/* first check attributes directly bound to the object */
if ((obj = [super lookupName:_key inContext:_ctx acquire:NO]))
return obj;
/* return 404 to stop acquisition */
return [NSException exceptionWithHTTPStatus:404 /* Not Found */];
}
/* operations */
- (id)PUTAction:(id)_context {
NSException *e;
NSString *content;
content = [[(WOContext *)_context request] contentAsString];
if ((e = [self writeContent:content]))
return e;
return self;
}
/* message type */
- (NSString *)outlookMessageClass {
return @"IPM.Filter";
}
@end /* SOGoSieveScriptObject */

View File

@@ -1,50 +0,0 @@
/*
Copyright (C) 2004 SKYRIX Software AG
This file is part of OpenGroupware.org.
OGo is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
OGo 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 Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with OGo; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
#ifndef __Sieve_SOGoSieveScriptsFolder_H__
#define __Sieve_SOGoSieveScriptsFolder_H__
#include "SOGoSieveBaseObject.h"
/*
SOGoSieveScriptsFolder
Parent object: the SOGoMailAccount
Child objects: SOGoSieveScriptObject
The SOGoSieveScriptsFolder represents a list of sieve scripts on a Cyrus
server.
*/
@class NSString, NSException, NSDictionary;
@interface SOGoSieveScriptsFolder : SOGoSieveBaseObject
{
NSDictionary *listedScripts;
}
/* operations */
- (NSException *)activateScript:(NSString *)_name;
@end
#endif /* __Sieve_SOGoSieveScriptsFolder_H__ */

View File

@@ -1,98 +0,0 @@
/*
Copyright (C) 2004 SKYRIX Software AG
This file is part of OpenGroupware.org.
OGo is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
OGo 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 Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with OGo; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
#include "SOGoSieveScriptsFolder.h"
#include <NGImap4/NGSieveClient.h>
#include "common.h"
@implementation SOGoSieveScriptsFolder
- (void)dealloc {
[self->listedScripts release];
[super dealloc];
}
/* listing */
- (NSDictionary *)fetchScripts {
if (self->listedScripts != nil)
return self->listedScripts;
self->listedScripts = [[[self sieveClient] listScripts] copy];
return self->listedScripts;
}
/* standard methods */
- (NSArray *)toOneRelationshipKeys {
return [[self fetchScripts] allKeys];
}
/* operations */
- (NSException *)activateScript:(NSString *)_name {
NSDictionary *res;
NSString *r;
res = [[self sieveClient] setActiveScript:_name];
if ([[res valueForKey:@"result"] boolValue])
return nil;
// TODO: make it a debug log
[self logWithFormat:@"sieve activate failed: %@", res];
r = [@"Script activation failed: "
stringByAppendingString:[res description]];
return [NSException exceptionWithHTTPStatus:500 /* Server Error */
reason:r];
}
/* name lookup */
- (NSString *)lookupScript:(NSString *)_key inContext:(id)_ctx {
Class clazz;
clazz = NSClassFromString(@"SOGoSieveScriptObject");
return [[[clazz alloc] initWithName:_key inContainer:self] autorelease];
}
- (id)lookupName:(NSString *)_key inContext:(id)_ctx acquire:(BOOL)_flag {
id obj;
/* first check attributes directly bound to the object */
if ((obj = [super lookupName:_key inContext:_ctx acquire:NO]))
return obj;
/* lookup script */
if ((obj = [self lookupScript:_key inContext:_ctx]))
return obj;
/* return 404 to stop acquisition */
return [NSException exceptionWithHTTPStatus:404 /* Not Found */];
}
/* folder type */
- (NSString *)outlookFolderClass {
return @"IPF.Filter";
}
@end /* SOGoSieveScriptsFolder */

View File

@@ -1,7 +0,0 @@
# Version file
SUBMINOR_VERSION:=11
# v0.9.9 requires libNGMime v4.5.223
# v0.9.6 requires libNGMime v4.5.207
# v0.9.1 requires libNGMime v4.3.194

View File

@@ -1,36 +0,0 @@
/*
Copyright (C) 2002-2005 SKYRIX Software AG
This file is part of OpenGroupware.org.
OGo is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
OGo 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 Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with OGo; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
#import <Foundation/Foundation.h>
#import <Foundation/NSObjCRuntime.h>
#if NeXT_Foundation_LIBRARY || COCOA_Foundation_LIBRARY
# include <NGExtensions/NGObjectMacros.h>
# include <NGExtensions/NSString+Ext.h>
#endif
#include <NGExtensions/NGExtensions.h>
#include <NGObjWeb/NGObjWeb.h>
#include <NGObjWeb/SoObjects.h>
#include <NGImap4/NGImap4Client.h>
#warning importing common.h is baaad

View File

@@ -1,23 +0,0 @@
{
requires = ( MAIN, Mailer );
publicResources = (
);
factories = {
};
classes = {
SOGoSieveBaseObject = {
superclass = "SOGoObject";
};
SOGoSieveScriptsFolder = {
superclass = "SOGoSieveBaseObject";
};
SOGoSieveScriptObject = {
superclass = "SOGoSieveBaseObject";
};
};
}

View File

@@ -36,8 +36,6 @@ MailerUI_OBJC_FILES += \
# UIxMailReplyAction.m \
# UIxMailForwardAction.m \
# UIxFilterList.m \
# \
# UIxSieveEditor.m
MailerUI_RESOURCE_FILES += \
Version \

View File

@@ -40,7 +40,6 @@ Class Hierarchy
UIxMailToolbar
UIxMailTree
UIxMailView
UIxSieveEditor
UIxMailSortableTableHeader
UIxMailEditorAttach.m
UIxMailFilterPanel

View File

@@ -1,115 +0,0 @@
/*
Copyright (C) 2004 SKYRIX Software AG
This file is part of OpenGroupware.org.
OGo is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
OGo 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 Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with OGo; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
#include <SOGoUI/UIxComponent.h>
/*
UIxSieveEditor
An editor component which works on SOGoSieveScriptObject's.
*/
@class NSArray, NSString;
@interface UIxSieveEditor : UIxComponent
{
NSString *scriptName;
NSString *scriptText;
}
@end
#include <SoObjects/Sieve/SOGoSieveScriptObject.h>
#include "common.h"
@implementation UIxSieveEditor
- (void)dealloc {
[self->scriptText release];
[self->scriptName release];
[super dealloc];
}
/* accessors */
- (void)setScriptName:(NSString *)_value {
ASSIGNCOPY(self->scriptName, _value);
}
- (NSString *)scriptName {
return self->scriptName ? self->scriptName : @"";
}
- (void)setScriptText:(NSString *)_value {
ASSIGNCOPY(self->scriptText, _value);
}
- (NSString *)scriptText {
return [self->scriptText isNotNull] ? self->scriptText : @"";
}
- (NSString *)panelTitle {
return [self labelForKey:@"Edit Mail Filter"];
}
/* requests */
- (BOOL)shouldTakeValuesFromRequest:(WORequest *)_rq inContext:(WOContext*)_c {
return YES;
}
/* actions */
- (id)defaultAction {
return [self redirectToLocation:@"edit"];
}
- (id)editAction {
#if 0
[self logWithFormat:@"edit action, load content from: %@",
[self clientObject]];
#endif
[self setScriptName:[[self clientObject] nameInContainer]];
[self setScriptText:[[self clientObject] contentAsString]];
return self;
}
- (id)saveAction {
NSException *error;
NSString *text;
text = [self scriptText];
if ((error = [[self clientObject] writeContent:text]) != nil)
return error;
return self;
}
- (id)deleteAction {
NSException *error;
if ((error = [[self clientObject] delete]) != nil)
return error;
return nil;
}
@end /* UIxSieveEditor */

View File

@@ -1,5 +1,5 @@
{ /* -*-java-*- */
requires = ( MAIN, MainUI, CommonUI, Mailer, MailPartViewers ); /* , Sieve */
requires = ( MAIN, MainUI, CommonUI, Mailer, MailPartViewers );
publicResources = ("generic.js",
"UIxAppointmentEditor.js",
@@ -446,81 +446,6 @@
};
};
};
/* Sieve */
// SOGoSieveScriptsFolder = {
// slots = {
// toolbar = {
// protectedBy = "View";
// value = (
// (
// {
// link = "getMail";
// image = "tb-mail-getmail-flat-24x24.png";
// cssClass = "tbicon_getmail"; label = "Get Mail";
// },
// {
// link = "#"; // "compose"; // target = "_blank";
// onclick = "clickedNewFilter(this); return false";
// image = "tb-mail-write-flat-24x24.png";
// cssClass = "tbicon_compose"; label = "New Filter";
// },
// ),
// (
// { link = "#";
// cssClass = "tbicon_delete"; label = "Delete"; },
// ),
// );
// };
// };
// methods = {
// view = {
// protectedBy = "View";
// pageName = "UIxFilterList";
// };
// create = {
// protectedBy = "View";
// pageName = "UIxFilterList";
// actionName = "create";
// };
// };
// };
// SOGoSieveScriptObject = {
// slots = {
// toolbar = {
// protectedBy = "View";
// value = (
// ( { link = "#";
// onclick = "clickedEditorSave(this);return false;";
// image = "tb-mail-file-flat-24x24.png";
// cssClass = "tbicon_save"; label = "Save"; },
// { link = "#";
// onclick = "clickedEditorDelete(this);return false;";
// image = "tb-mail-delete-flat-24x24.png";
// cssClass = "tbicon_delete"; label = "Delete"; },
// )
// );
// };
// };
// methods = {
// edit = {
// protectedBy = "View";
// pageName = "UIxSieveEditor";
// actionName = "edit";
// };
// save = {
// protectedBy = "View";
// pageName = "UIxSieveEditor";
// actionName = "save";
// };
// delete = {
// protectedBy = "View";
// pageName = "UIxSieveEditor";
// actionName = "delete";
// };
// }
};
}

View File

@@ -32,7 +32,10 @@
#import <SoObjects/SOGo/NSArray+Utilities.h>
#import <SoObjects/SOGo/NSDictionary+Utilities.h>
#import <SoObjects/SOGo/NSString+Utilities.h>
#import <SoObjects/SOGo/SOGoUser.h>
#import <SoObjects/SOGo/SOGoUserFolder.h>
#import <SoObjects/Mailer/SOGoMailAccount.h>
#import "../../Main/SOGo.h"
#import "UIxPreferences.h"
@@ -901,7 +904,21 @@ static BOOL forwardEnabled = NO;
request = [context request];
if ([[request method] isEqualToString: @"POST"])
{
SOGoMailAccount *account;
id mailAccounts;
id folder;
[userDefaults synchronize];
mailAccounts = [[[context activeUser] mailAccounts] objectAtIndex: 0];
folder = [[self clientObject] mailAccountsFolder: @"Mail"
inContext: context];
account = [folder lookupName: [[mailAccounts objectForKey: @"name"] asCSSIdentifier]
inContext: context
acquire: NO];
[account updateFilters];
if (composeMessageTypeHasChanged)
// Due to a limitation of CKEDITOR, we reload the page when the user
// changes the composition mode to avoid Javascript errors.

View File

@@ -1,33 +0,0 @@
<?xml version='1.0' standalone='yes'?>
<var:component
xmlns="http://www.w3.org/1999/xhtml"
xmlns:var="http://www.skyrix.com/od/binding"
xmlns:const="http://www.skyrix.com/od/constant"
xmlns:uix="OGo:uix"
xmlns:rsrc="OGo:url"
xmlns:label="OGo:label"
className="UIxPageFrame"
title="panelTitle"
const:hideFolderTree="1"
>
<div id="compose_panel">
<div id="compose_subject">
<table border="0" width="100%">
<tr>
<td class="compose_label" width="15%">
<!-- TODO: localize -->
<var:string label:value="Scriptname"/>:
</td>
<td width="85%"><input name="scriptName"
id="compose_subject_input" type="text"
var:value="scriptName" /></td>
</tr>
</table>
</div>
<!-- separator line -->
<div id="compose_text">
<textarea name="scriptContent" var:value="scriptText" />
</div>
</div>
</var:component>