mirror of
https://github.com/inverse-inc/sogo.git
synced 2026-04-03 12:28:51 +00:00
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:
30
ChangeLog
30
ChangeLog
@@ -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
3
NEWS
@@ -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)
|
||||
--------------------
|
||||
|
||||
@@ -7,7 +7,6 @@ SUBPROJECTS = \
|
||||
SOGo \
|
||||
Appointments \
|
||||
Contacts \
|
||||
Mailer \
|
||||
# Sieve \
|
||||
Mailer
|
||||
|
||||
include $(GNUSTEP_MAKEFILES)/aggregate.make
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -55,6 +55,9 @@
|
||||
- (id) freeBusyObject: (NSString *) _key
|
||||
inContext: (WOContext *) _ctx;
|
||||
|
||||
- (id) mailAccountsFolder: (NSString *) _key
|
||||
inContext: (WOContext *) _ctx;
|
||||
|
||||
@end
|
||||
|
||||
#endif /* __SOGo_SOGoUserFolder_H__ */
|
||||
|
||||
@@ -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
|
||||
@@ -1,3 +0,0 @@
|
||||
# compilation settings
|
||||
|
||||
ADDITIONAL_INCLUDE_DIRS += -I../Mailer
|
||||
@@ -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 */
|
||||
@@ -1,8 +0,0 @@
|
||||
# README for Sieve SoObjects
|
||||
|
||||
Class Overview
|
||||
==============
|
||||
|
||||
|
||||
Defaults
|
||||
========
|
||||
@@ -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__ */
|
||||
@@ -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 */
|
||||
@@ -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__ */
|
||||
@@ -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 */
|
||||
@@ -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__ */
|
||||
@@ -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 */
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -1,23 +0,0 @@
|
||||
{
|
||||
requires = ( MAIN, Mailer );
|
||||
|
||||
publicResources = (
|
||||
);
|
||||
|
||||
factories = {
|
||||
};
|
||||
|
||||
classes = {
|
||||
SOGoSieveBaseObject = {
|
||||
superclass = "SOGoObject";
|
||||
};
|
||||
|
||||
SOGoSieveScriptsFolder = {
|
||||
superclass = "SOGoSieveBaseObject";
|
||||
};
|
||||
|
||||
SOGoSieveScriptObject = {
|
||||
superclass = "SOGoSieveBaseObject";
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -36,8 +36,6 @@ MailerUI_OBJC_FILES += \
|
||||
# UIxMailReplyAction.m \
|
||||
# UIxMailForwardAction.m \
|
||||
# UIxFilterList.m \
|
||||
# \
|
||||
# UIxSieveEditor.m
|
||||
|
||||
MailerUI_RESOURCE_FILES += \
|
||||
Version \
|
||||
|
||||
@@ -40,7 +40,6 @@ Class Hierarchy
|
||||
UIxMailToolbar
|
||||
UIxMailTree
|
||||
UIxMailView
|
||||
UIxSieveEditor
|
||||
UIxMailSortableTableHeader
|
||||
UIxMailEditorAttach.m
|
||||
UIxMailFilterPanel
|
||||
|
||||
@@ -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 */
|
||||
@@ -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";
|
||||
// };
|
||||
// }
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user