mirror of
https://github.com/inverse-inc/sogo.git
synced 2026-06-27 12:54:17 +00:00
Merge to 2.2.1
This commit is contained in:
@@ -36,7 +36,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
- (NSString *) activeSyncRepresentationInContext: (WOContext *) context
|
||||
{
|
||||
return [self descriptionWithCalendarFormat: @"%Y-%m-%d-T%H:%M:%S.%FZ" timeZone: [NSTimeZone timeZoneWithName: @"GMT"] locale: nil];
|
||||
return [self descriptionWithCalendarFormat: @"%Y-%m-%dT%H:%M:%S.%FZ" timeZone: [NSTimeZone timeZoneWithName: @"GMT"] locale: nil];
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -571,24 +571,27 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
case ActiveSyncMailFolder:
|
||||
default:
|
||||
{
|
||||
NSMutableArray *addedOrChangedMessages;
|
||||
SOGoMailObject *mailObject;
|
||||
NSString *uid, *command;
|
||||
NSDictionary *aMessage;
|
||||
NSArray *allMessages;
|
||||
|
||||
int deleted_count;
|
||||
|
||||
allMessages = [theCollection syncTokenFieldsWithProperties: nil matchingSyncToken: theSyncKey fromDate: theFilterType];
|
||||
|
||||
addedOrChangedMessages = [NSMutableArray array];
|
||||
deleted_count = 0;
|
||||
|
||||
// Check for the WindowSize.
|
||||
// FIXME: we should eventually check for modseq and slice the maximum
|
||||
// amount of messages returned to ensure we don't have the same
|
||||
// modseq accross contiguous boundaries
|
||||
max = [allMessages count];
|
||||
if (max > theWindowSize)
|
||||
{
|
||||
max = theWindowSize;
|
||||
more_available = YES;
|
||||
}
|
||||
|
||||
// We first check the number of deleted messages we have
|
||||
// We do NOT honor the window size here as it seems to be
|
||||
// impossible to get the modseq of an expunged message so
|
||||
// we can't iterate in the list of deleted messages.
|
||||
for (i = 0; i < max; i++)
|
||||
{
|
||||
aMessage = [allMessages objectAtIndex: i];
|
||||
@@ -601,31 +604,53 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
[s appendString: @"<Delete xmlns=\"AirSync:\">"];
|
||||
[s appendFormat: @"<ServerId xmlns=\"AirSync:\">%@</ServerId>", uid];
|
||||
[s appendString: @"</Delete>"];
|
||||
deleted_count++;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ([command isEqualToString: @"added"])
|
||||
[s appendString: @"<Add xmlns=\"AirSync:\">"];
|
||||
else
|
||||
[s appendString: @"<Change xmlns=\"AirSync:\">"];
|
||||
|
||||
mailObject = [theCollection lookupName: uid
|
||||
inContext: context
|
||||
acquire: 0];
|
||||
|
||||
[s appendFormat: @"<ServerId xmlns=\"AirSync:\">%@</ServerId>", uid];
|
||||
[s appendString: @"<ApplicationData xmlns=\"AirSync:\">"];
|
||||
[s appendString: [mailObject activeSyncRepresentationInContext: context]];
|
||||
[s appendString: @"</ApplicationData>"];
|
||||
|
||||
if ([command isEqualToString: @"added"])
|
||||
[s appendString: @"</Add>"];
|
||||
else
|
||||
[s appendString: @"</Change>"];
|
||||
|
||||
[addedOrChangedMessages addObject: aMessage];
|
||||
}
|
||||
}
|
||||
|
||||
// We then "pad" with our added/changed messages. We ALWAYS
|
||||
// at least return one if available
|
||||
max = [addedOrChangedMessages count];
|
||||
|
||||
for (i = 0; i < max; i++)
|
||||
{
|
||||
aMessage = [addedOrChangedMessages objectAtIndex: i];
|
||||
|
||||
uid = [[[aMessage allKeys] lastObject] stringValue];
|
||||
command = [[aMessage allValues] lastObject];
|
||||
|
||||
if ([command isEqualToString: @"added"])
|
||||
[s appendString: @"<Add xmlns=\"AirSync:\">"];
|
||||
else
|
||||
[s appendString: @"<Change xmlns=\"AirSync:\">"];
|
||||
|
||||
mailObject = [theCollection lookupName: uid
|
||||
inContext: context
|
||||
acquire: 0];
|
||||
|
||||
[s appendFormat: @"<ServerId xmlns=\"AirSync:\">%@</ServerId>", uid];
|
||||
[s appendString: @"<ApplicationData xmlns=\"AirSync:\">"];
|
||||
[s appendString: [mailObject activeSyncRepresentationInContext: context]];
|
||||
[s appendString: @"</ApplicationData>"];
|
||||
|
||||
if ([command isEqualToString: @"added"])
|
||||
[s appendString: @"</Add>"];
|
||||
else
|
||||
[s appendString: @"</Change>"];
|
||||
|
||||
|
||||
// We check if we must stop padding
|
||||
if (i+1+deleted_count > theWindowSize)
|
||||
{
|
||||
more_available = YES;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
if (more_available)
|
||||
{
|
||||
|
||||
@@ -166,8 +166,8 @@ struct GlobalObjectId {
|
||||
- (NSString *) _emailAddressesFrom: (NSArray *) enveloppeAddresses
|
||||
{
|
||||
NGImap4EnvelopeAddress *address;
|
||||
NSString *email, *rc, *name;
|
||||
NSMutableArray *addresses;
|
||||
NSString *email, *rc;
|
||||
int i, max;
|
||||
|
||||
rc = nil;
|
||||
@@ -179,7 +179,8 @@ struct GlobalObjectId {
|
||||
for (i = 0; i < max; i++)
|
||||
{
|
||||
address = [enveloppeAddresses objectAtIndex: i];
|
||||
email = [NSString stringWithFormat: @"\"%@\" <%@>", [address personalName], [address baseEMail]];
|
||||
name = [address personalName];
|
||||
email = [NSString stringWithFormat: @"\"%@\" <%@>", (name ? name : [address baseEMail]), [address baseEMail]];
|
||||
|
||||
if (email)
|
||||
[addresses addObject: email];
|
||||
@@ -377,7 +378,7 @@ struct GlobalObjectId {
|
||||
// DateReceived
|
||||
value = [self date];
|
||||
if (value)
|
||||
[s appendFormat: @"<DateReceived xmlns=\"Email:\">%@</DateReceived>", [value activeSyncRepresentationWithoutSeparatorsInContext: context]];
|
||||
[s appendFormat: @"<DateReceived xmlns=\"Email:\">%@</DateReceived>", [value activeSyncRepresentationInContext: context]];
|
||||
|
||||
// DisplayTo
|
||||
[s appendFormat: @"<DisplayTo xmlns=\"Email:\">%@</DisplayTo>", [[context activeUser] login]];
|
||||
|
||||
@@ -1,3 +1,193 @@
|
||||
commit 23789b48bcdcbac738039d214a92cd0bb5aff9e4
|
||||
Author: Francis Lachapelle <flachapelle@inverse.ca>
|
||||
Date: Fri Mar 7 13:59:51 2014 -0500
|
||||
|
||||
Update Dutch translation
|
||||
|
||||
M NEWS
|
||||
M UI/MailPartViewers/Dutch.lproj/Localizable.strings
|
||||
M UI/PreferencesUI/Dutch.lproj/Localizable.strings
|
||||
M UI/Scheduler/Dutch.lproj/Localizable.strings
|
||||
|
||||
commit 142296f71e0e22eae76572e7ff23a3b00a2c076f
|
||||
Author: Francis Lachapelle <flachapelle@inverse.ca>
|
||||
Date: Fri Mar 7 10:53:17 2014 -0500
|
||||
|
||||
Preparation for release 2.2.1
|
||||
|
||||
M Documentation/SOGo Installation Guide.odt
|
||||
M Documentation/SOGo Mobile Devices Configuration.odt
|
||||
M Documentation/SOGo Mozilla Thunderbird Configuration.odt
|
||||
M Documentation/SOGo Native Microsoft Outlook Configuration.odt
|
||||
M NEWS
|
||||
M Version
|
||||
|
||||
commit 3bae2387d4e0efcfe88fd56fa743c70deb638ee8
|
||||
Author: Francis Lachapelle <flachapelle@inverse.ca>
|
||||
Date: Thu Mar 6 22:13:17 2014 -0500
|
||||
|
||||
Fix contact autocompletion when UID is a digit
|
||||
|
||||
M NEWS
|
||||
M UI/WebServerResources/SOGoAutoCompletion.js
|
||||
M UI/WebServerResources/generic.css
|
||||
|
||||
commit 6cecca6c4f0ffb6edea41f3ade3b7f90f92cdf81
|
||||
Author: Francis Lachapelle <flachapelle@inverse.ca>
|
||||
Date: Thu Mar 6 21:32:36 2014 -0500
|
||||
|
||||
Fix CSS id for string prefixed with a digit
|
||||
|
||||
When encoding a string as a CSS identifier, we must add an underscore if
|
||||
the strings starts with a digit.
|
||||
|
||||
M NEWS
|
||||
M SoObjects/Mailer/SOGoMailAccounts.m
|
||||
M SoObjects/SOGo/NSString+Utilities.m
|
||||
M UI/WebServerResources/JavascriptAPIExtensions.js
|
||||
|
||||
commit 28b1938bd972462be383ef612e38a93870ccff1b
|
||||
Author: Francis Lachapelle <flachapelle@inverse.ca>
|
||||
Date: Thu Mar 6 21:25:48 2014 -0500
|
||||
|
||||
Show folder name in dialog when renaming folder
|
||||
|
||||
M NEWS
|
||||
M UI/WebServerResources/MailerUI.js
|
||||
M UI/WebServerResources/generic.js
|
||||
|
||||
commit 31ace947cbf1fbbfa93a92ed0f028e5a56b8b0d1
|
||||
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
|
||||
Date: Thu Mar 6 14:16:08 2014 -0500
|
||||
|
||||
Fixed race condition when syncing huge amount of deleted messages using AS
|
||||
|
||||
M ActiveSync/SOGoActiveSyncDispatcher+Sync.m
|
||||
M NEWS
|
||||
M SoObjects/Mailer/SOGoMailFolder.m
|
||||
|
||||
commit 0cea36df2eebdcda55098fa0ae9416976a39a332
|
||||
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
|
||||
Date: Thu Mar 6 14:10:47 2014 -0500
|
||||
|
||||
Updated NEWS regarding previous commit
|
||||
|
||||
M NEWS
|
||||
|
||||
commit afd745232331267499592e18e5d0b857454d3cbd
|
||||
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
|
||||
Date: Thu Mar 6 14:05:59 2014 -0500
|
||||
|
||||
Fixed returned date format and fixing missing 'name part' in address
|
||||
|
||||
M ActiveSync/SOGoMailObject+ActiveSync.m
|
||||
|
||||
commit e4a21bcef5afb1245023d5561c0d60c183bfe623
|
||||
Author: Francis Lachapelle <flachapelle@inverse.ca>
|
||||
Date: Thu Mar 6 09:27:43 2014 -0500
|
||||
|
||||
Webmail: fix encoding of subfolder name
|
||||
|
||||
Fixes #2637
|
||||
|
||||
M NEWS
|
||||
M SoObjects/Mailer/SOGoMailFolder.m
|
||||
M UI/MailerUI/UIxMailFolderActions.m
|
||||
|
||||
commit 0c99323db3e5404301c249512b736d426bd41d09
|
||||
Author: Francis Lachapelle <flachapelle@inverse.ca>
|
||||
Date: Wed Mar 5 13:42:38 2014 -0500
|
||||
|
||||
Fix possible exception when retrieving reminder
|
||||
|
||||
Fixes #2624
|
||||
|
||||
M NEWS
|
||||
M UI/PreferencesUI/UIxPreferences.m
|
||||
|
||||
commit da208d5b4acd18aff399261cafc9d105c8f56e55
|
||||
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
|
||||
Date: Wed Mar 5 09:09:33 2014 -0500
|
||||
|
||||
Updated NEWS regarding previous commit
|
||||
|
||||
M NEWS
|
||||
|
||||
commit 158af711528027cd63a3c70708fab96eee41dd19
|
||||
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
|
||||
Date: Wed Mar 5 09:07:39 2014 -0500
|
||||
|
||||
Fix for bug #2609
|
||||
|
||||
M ActiveSync/NSDate+ActiveSync.m
|
||||
|
||||
commit 163bce39b5ab7afc060a5af9dfd7dafa632f7b61
|
||||
Author: Francis Lachapelle <flachapelle@inverse.ca>
|
||||
Date: Tue Mar 4 22:03:28 2014 -0500
|
||||
|
||||
Fix list sorting of events by calendar name
|
||||
|
||||
Fixes #2629
|
||||
|
||||
M NEWS
|
||||
M UI/Templates/SchedulerUI/UIxCalMainView.wox
|
||||
|
||||
commit 02c72fee6ad0bf8850de88ab65a01191ff351ecc
|
||||
Author: Francis Lachapelle <flachapelle@inverse.ca>
|
||||
Date: Tue Mar 4 21:32:57 2014 -0500
|
||||
|
||||
Fix unsubscription when renaming an IMAP folder
|
||||
|
||||
Fixes #2630
|
||||
|
||||
M NEWS
|
||||
M SoObjects/Mailer/SOGoMailFolder.m
|
||||
|
||||
commit 8bef84bded384cde99dd2ee7ebfe9ebbeeedf2e6
|
||||
Author: Francis Lachapelle <flachapelle@inverse.ca>
|
||||
Date: Tue Mar 4 09:22:00 2014 -0500
|
||||
|
||||
Update translations
|
||||
|
||||
M NEWS
|
||||
M UI/PreferencesUI/Czech.lproj/Localizable.strings
|
||||
M UI/PreferencesUI/Finnish.lproj/Localizable.strings
|
||||
M UI/PreferencesUI/Hungarian.lproj/Localizable.strings
|
||||
|
||||
commit 8db3b22eb9bde326d3892c88b5c1cb9bb0251170
|
||||
Author: Francis Lachapelle <flachapelle@inverse.ca>
|
||||
Date: Mon Mar 3 22:08:29 2014 -0500
|
||||
|
||||
Bump version to 2.2.0a
|
||||
|
||||
M Version
|
||||
|
||||
commit 1aabcf04b5d26471a62f97566bb3fd6911848f48
|
||||
Author: Francis Lachapelle <flachapelle@inverse.ca>
|
||||
Date: Mon Mar 3 22:07:24 2014 -0500
|
||||
|
||||
Fix sogo-tool operations on Sieve script
|
||||
|
||||
Fixes #2617
|
||||
|
||||
M NEWS
|
||||
M SoObjects/Mailer/SOGoMailAccount.h
|
||||
M SoObjects/Mailer/SOGoMailAccount.m
|
||||
M SoObjects/SOGo/SOGoSieveManager.h
|
||||
M SoObjects/SOGo/SOGoSieveManager.m
|
||||
M Tools/GNUmakefile.preamble
|
||||
M Tools/SOGoToolExpireAutoReply.m
|
||||
M Tools/SOGoToolUserPreferences.m
|
||||
|
||||
commit c6b227160c70db0fb892c2df1f5bb64caae45fc9
|
||||
Author: Francis Lachapelle <flachapelle@inverse.ca>
|
||||
Date: Mon Feb 24 16:53:46 2014 -0500
|
||||
|
||||
Update ChangeLog
|
||||
|
||||
M ChangeLog
|
||||
M NEWS
|
||||
|
||||
commit 5f2920db9b1c7fd89af8019d8a007bfddb20a742
|
||||
Author: Francis Lachapelle <flachapelle@inverse.ca>
|
||||
Date: Mon Feb 24 16:47:41 2014 -0500
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,3 +1,24 @@
|
||||
2.2.1 (2014-03-07)
|
||||
------------------
|
||||
|
||||
Enhancements
|
||||
- updated Czech, Dutch, Finnish, and Hungarian translations
|
||||
- show current folder name in prompt dialog when renaming a mail folder
|
||||
|
||||
Bug fixes
|
||||
- fixed an issue with ActiveSync when the number of messages in the mailbox was greater than the window-size specified by the client
|
||||
- fixed sogo-tool operations on Sieve script (#2617)
|
||||
- fixed unsubscription when renaming an IMAP folder (#2630)
|
||||
- fixed sorting of events list by calendar name (#2629)
|
||||
- fixed wrong date format leading to Android email syncing issues (#2609)
|
||||
- fixed possible exception when retrieving the default event reminder value (#2624)
|
||||
- fixed encoding of mail folder name when creating a subfolder (#2637)
|
||||
- fixed returned date format for email messages in Active Sync
|
||||
- fixed missing 'name part' in address for email messages in Active Sync
|
||||
- fixed race condition when syncing huge amount of deleted messages over Active Sync
|
||||
- fixed encoding of string as CSS identifier when the string starts with a digit
|
||||
- fixed auto-completion popupmenu when UID is a digit
|
||||
|
||||
2.2.0 (2014-02-24)
|
||||
------------------
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright (C) 2009-2013 Inverse inc.
|
||||
Copyright (C) 2009-2014 Inverse inc.
|
||||
Copyright (C) 2004-2005 SKYRIX Software AG
|
||||
|
||||
This file is part of SOGo.
|
||||
@@ -71,6 +71,8 @@ typedef enum {
|
||||
|
||||
- (id) getInboxQuota;
|
||||
- (BOOL) updateFilters;
|
||||
- (BOOL) updateFiltersWithUsername: (NSString *) theUsername
|
||||
andPassword: (NSString *) thePassword;
|
||||
|
||||
- (NSArray *) identities;
|
||||
- (NSString *) signature;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
Copyright (C) 2004-2005 SKYRIX Software AG
|
||||
Copyright (C) 2007-2013 Inverse inc.
|
||||
Copyright (C) 2007-2014 Inverse inc.
|
||||
|
||||
This file is part of SOGo.
|
||||
|
||||
@@ -306,12 +306,18 @@ static NSString *inboxFolderName = @"INBOX";
|
||||
}
|
||||
|
||||
- (BOOL) updateFilters
|
||||
{
|
||||
return [self updateFiltersWithUsername: nil andPassword: nil];
|
||||
}
|
||||
|
||||
- (BOOL) updateFiltersWithUsername: (NSString *) theUsername
|
||||
andPassword: (NSString *) thePassword
|
||||
{
|
||||
SOGoSieveManager *manager;
|
||||
|
||||
manager = [SOGoSieveManager sieveManagerForUser: [context activeUser]];
|
||||
|
||||
return [manager updateFiltersForAccount: self];
|
||||
return [manager updateFiltersForAccount: self withUsername: theUsername andPassword: thePassword];
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -78,20 +78,23 @@
|
||||
{
|
||||
id obj;
|
||||
NSArray *accounts;
|
||||
NSString *key;
|
||||
SOGoUser *user;
|
||||
int keyCount;
|
||||
|
||||
key = [_key fromCSSIdentifier];
|
||||
|
||||
/* first check attributes directly bound to the application */
|
||||
obj = [super lookupName:_key inContext:_ctx acquire:NO];
|
||||
obj = [super lookupName:key inContext:_ctx acquire:NO];
|
||||
if (!obj)
|
||||
{
|
||||
user = [SOGoUser userWithLogin: [self ownerInContext: nil]];
|
||||
accounts = [user mailAccounts];
|
||||
|
||||
keyCount = [_key intValue];
|
||||
if ([_key isEqualToString: [NSString stringWithFormat: @"%d", keyCount]]
|
||||
keyCount = [key intValue];
|
||||
if ([key isEqualToString: [NSString stringWithFormat: @"%d", keyCount]]
|
||||
&& keyCount > -1 && keyCount < [accounts count])
|
||||
obj = [SOGoMailAccount objectWithName: _key inContainer: self];
|
||||
obj = [SOGoMailAccount objectWithName: key inContainer: self];
|
||||
else
|
||||
obj = [NSException exceptionWithHTTPStatus: 404 /* Not Found */];
|
||||
}
|
||||
|
||||
@@ -44,6 +44,7 @@
|
||||
|
||||
#import <NGImap4/NGImap4Connection.h>
|
||||
#import <NGImap4/NGImap4Client.h>
|
||||
#import <NGImap4/NSString+Imap4.h>
|
||||
|
||||
#import <SOGo/DOMNode+SOGo.h>
|
||||
#import <SOGo/NSArray+Utilities.h>
|
||||
@@ -293,19 +294,19 @@ static NSString *defaultUserID = @"anyone";
|
||||
destURL = [[NSURL alloc] initWithScheme: [imap4URL scheme]
|
||||
host: [imap4URL host]
|
||||
path: [NSString stringWithFormat: @"%@%@",
|
||||
path, newName]];
|
||||
path, [newName stringByEncodingImap4FolderName]]];
|
||||
[destURL autorelease];
|
||||
error = [imap4 moveMailboxAtURL: imap4URL
|
||||
toURL: destURL];
|
||||
if (!error)
|
||||
{
|
||||
ASSIGN (imap4URL, nil);
|
||||
ASSIGN (nameInContainer,
|
||||
([NSString stringWithFormat: @"folder%@", [newName asCSSIdentifier]]));
|
||||
|
||||
// We unsubscribe to the old one, and subscribe back to the new one
|
||||
[client subscribe: [destURL path]];
|
||||
[client unsubscribe: [imap4URL path]];
|
||||
|
||||
ASSIGN (imap4URL, nil);
|
||||
ASSIGN (nameInContainer,
|
||||
([NSString stringWithFormat: @"folder%@", [newName asCSSIdentifier]]));
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -994,7 +995,7 @@ static NSString *defaultUserID = @"anyone";
|
||||
|
||||
if ([self imap4Connection])
|
||||
{
|
||||
error = [imap4 createMailbox: [self relativeImap4Name]
|
||||
error = [imap4 createMailbox: [[self relativeImap4Name] stringByEncodingImap4FolderName]
|
||||
atURL: [container imap4URL]];
|
||||
if (error)
|
||||
rc = NO;
|
||||
@@ -1939,8 +1940,11 @@ static NSString *defaultUserID = @"anyone";
|
||||
uid = [theId intValue];
|
||||
result = [[imap4 client] fetchModseqForUid: uid];
|
||||
modseq = [[[[result objectForKey: @"RawResponse"] objectForKey: @"fetch"] objectForKey: @"modseq"] intValue];
|
||||
|
||||
tag = [NSString stringWithFormat: @"%d-%d", uid, modseq-1];
|
||||
|
||||
if (modseq < 1)
|
||||
modseq = 1;
|
||||
|
||||
tag = [NSString stringWithFormat: @"%d-%d", uid, modseq];
|
||||
}
|
||||
|
||||
return tag;
|
||||
@@ -1998,7 +2002,7 @@ static NSString *defaultUserID = @"anyone";
|
||||
// Check updated items
|
||||
//
|
||||
//
|
||||
// . uid fetch 1:* (FLAGS) (changedsince 171)
|
||||
// . uid fetch 1:* (UID) (changedsince 171)
|
||||
//
|
||||
// To get the modseq of a specific message:
|
||||
//
|
||||
@@ -2100,11 +2104,14 @@ static NSString *defaultUserID = @"anyone";
|
||||
// We fetch deleted ones
|
||||
if (highestmodseq > 0)
|
||||
{
|
||||
id uid;
|
||||
|
||||
uids = [self fetchUIDsOfVanishedItems: highestmodseq];
|
||||
|
||||
for (i = 0; i < [uids count]; i++)
|
||||
{
|
||||
d = [NSDictionary dictionaryWithObject: @"deleted" forKey: [uids objectAtIndex: i]];
|
||||
uid = [uids objectAtIndex: i];
|
||||
d = [NSDictionary dictionaryWithObject: @"deleted" forKey: uid];
|
||||
[allTokens addObject: d];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -332,8 +332,7 @@ static NSCharacterSet *controlCharSet = nil;
|
||||
(cssEscapingCount + 1)
|
||||
* sizeof (unichar));
|
||||
for (count = 0; count < cssEscapingCount; count++)
|
||||
*(cssEscapingCharacters + count)
|
||||
= [[characters objectAtIndex: count] characterAtIndex: 0];
|
||||
*(cssEscapingCharacters + count) = [[characters objectAtIndex: count] characterAtIndex: 0];
|
||||
*(cssEscapingCharacters + cssEscapingCount) = 0;
|
||||
}
|
||||
|
||||
@@ -360,14 +359,20 @@ static NSCharacterSet *controlCharSet = nil;
|
||||
|
||||
cssIdentifier = [NSMutableString string];
|
||||
max = [self length];
|
||||
for (count = 0; count < max; count++)
|
||||
if (max > 0)
|
||||
{
|
||||
currentChar = [self characterAtIndex: count];
|
||||
idx = [self _cssCharacterIndex: currentChar];
|
||||
if (idx > -1)
|
||||
[cssIdentifier appendString: cssEscapingStrings[idx]];
|
||||
else
|
||||
[cssIdentifier appendFormat: @"%C", currentChar];
|
||||
if (isdigit([self characterAtIndex: 0]))
|
||||
// A CSS identifier can't start with a digit; we add an underscore
|
||||
[cssIdentifier appendString: @"_"];
|
||||
for (count = 0; count < max; count++)
|
||||
{
|
||||
currentChar = [self characterAtIndex: count];
|
||||
idx = [self _cssCharacterIndex: currentChar];
|
||||
if (idx > -1)
|
||||
[cssIdentifier appendString: cssEscapingStrings[idx]];
|
||||
else
|
||||
[cssIdentifier appendFormat: @"%C", currentChar];
|
||||
}
|
||||
}
|
||||
|
||||
return cssIdentifier;
|
||||
@@ -397,7 +402,17 @@ static NSCharacterSet *controlCharSet = nil;
|
||||
|
||||
newString = [NSMutableString string];
|
||||
max = [self length];
|
||||
for (count = 0; count < max - 2; count++)
|
||||
count = 0;
|
||||
if (max > 0
|
||||
&& [self characterAtIndex: 0] == '_'
|
||||
&& isdigit([self characterAtIndex: 1]))
|
||||
{
|
||||
/* If the identifier starts with an underscore followed by a digit,
|
||||
we remove the underscore */
|
||||
count = 1;
|
||||
}
|
||||
|
||||
for (; count < max - 2; count++)
|
||||
{
|
||||
currentChar = [self characterAtIndex: count];
|
||||
if (currentChar == '_')
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
/* SOGoSieveManager.h - this file is part of SOGo
|
||||
*
|
||||
* Copyright (C) 2010-2011 Inverse inc.
|
||||
* Copyright (C) 2010-2014 Inverse inc.
|
||||
*
|
||||
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
* Ludovic Marcotte <lmarcotte@inverse.ca>
|
||||
* Author: Inverse <info@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
|
||||
@@ -47,8 +46,14 @@
|
||||
- (NSString *) lastScriptError;
|
||||
|
||||
- (NGSieveClient *) clientForAccount: (SOGoMailAccount *) theAccount;
|
||||
- (NGSieveClient *) clientForAccount: (SOGoMailAccount *) theAccount
|
||||
withUsername: (NSString *) theUsername
|
||||
andPassword: (NSString *) thePassword;
|
||||
|
||||
- (BOOL) updateFiltersForAccount: (SOGoMailAccount *) theAccount;
|
||||
- (BOOL) updateFiltersForAccount: (SOGoMailAccount *) theAccount
|
||||
withUsername: (NSString *) theUsername
|
||||
andPassword: (NSString *) thePassword;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
/* SOGoSieveManager.m - this file is part of SOGo
|
||||
*
|
||||
* Copyright (C) 2010-2011 Inverse inc.
|
||||
* Copyright (C) 2010-2014 Inverse inc.
|
||||
*
|
||||
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
* Ludovic Marcotte <lmarcotte@inverse.ca>
|
||||
* Author: Inverse <info@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
|
||||
@@ -625,6 +624,16 @@ static NSString *sieveScriptName = @"sogo";
|
||||
//
|
||||
//
|
||||
- (NGSieveClient *) clientForAccount: (SOGoMailAccount *) theAccount
|
||||
{
|
||||
return [self clientForAccount: theAccount withUsername: nil andPassword: nil];
|
||||
}
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
- (NGSieveClient *) clientForAccount: (SOGoMailAccount *) theAccount
|
||||
withUsername: (NSString *) theUsername
|
||||
andPassword: (NSString *) thePassword
|
||||
{
|
||||
NSDictionary *result;
|
||||
NSString *login, *authname, *password;
|
||||
@@ -640,8 +649,16 @@ static NSString *sieveScriptName = @"sogo";
|
||||
|
||||
// Extract credentials from mail account
|
||||
login = [[theAccount imap4URL] user];
|
||||
authname = [[theAccount imap4URL] user];
|
||||
password = [theAccount imap4PasswordRenewed: NO];
|
||||
if (!theUsername && !thePassword)
|
||||
{
|
||||
authname = [[theAccount imap4URL] user];
|
||||
password = [theAccount imap4PasswordRenewed: NO];
|
||||
}
|
||||
else
|
||||
{
|
||||
authname = theUsername;
|
||||
password = thePassword;
|
||||
}
|
||||
|
||||
// We connect to our Sieve server and check capabilities, in order
|
||||
// to generate the right script, based on capabilities
|
||||
@@ -725,7 +742,7 @@ static NSString *sieveScriptName = @"sogo";
|
||||
return nil;
|
||||
}
|
||||
|
||||
if (![[result valueForKey:@"result"] boolValue]) {
|
||||
if (![[result valueForKey:@"result"] boolValue] && !theUsername && !thePassword) {
|
||||
NSLog(@"failure. Attempting with a renewed password (no authname supported)");
|
||||
password = [theAccount imap4PasswordRenewed: YES];
|
||||
result = [client login: login password: password];
|
||||
@@ -741,10 +758,23 @@ static NSString *sieveScriptName = @"sogo";
|
||||
return client;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
- (BOOL) updateFiltersForAccount: (SOGoMailAccount *) theAccount
|
||||
{
|
||||
return [self updateFiltersForAccount: theAccount
|
||||
withUsername: nil
|
||||
andPassword: nil];
|
||||
}
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
- (BOOL) updateFiltersForAccount: (SOGoMailAccount *) theAccount
|
||||
withUsername: (NSString *) theUsername
|
||||
andPassword: (NSString *) thePassword
|
||||
{
|
||||
NSMutableArray *req;
|
||||
NSMutableString *script, *header;
|
||||
@@ -762,7 +792,7 @@ static NSString *sieveScriptName = @"sogo";
|
||||
req = [NSMutableArray arrayWithCapacity: 15];
|
||||
ud = [user userDefaults];
|
||||
|
||||
client = [self clientForAccount: theAccount];
|
||||
client = [self clientForAccount: theAccount withUsername: theUsername andPassword: thePassword];
|
||||
if (!client)
|
||||
return NO;
|
||||
|
||||
@@ -888,7 +918,7 @@ static NSString *sieveScriptName = @"sogo";
|
||||
|
||||
// We put and activate the script only if we actually have a script
|
||||
// that does something...
|
||||
if (b)
|
||||
if (b && [script length])
|
||||
{
|
||||
result = [client putScript: sieveScriptName script: script];
|
||||
|
||||
|
||||
@@ -14,4 +14,4 @@ ADDITIONAL_LIB_DIRS += \
|
||||
-L../OGoContentStore/$(GNUSTEP_OBJ_DIR)/ -lOGoContentStore \
|
||||
-L../SOPE/GDLContentStore/$(GNUSTEP_OBJ_DIR)/ -lGDLContentStore \
|
||||
-L../SOPE/NGCards/$(GNUSTEP_OBJ_DIR)/ -lNGCards \
|
||||
-L/usr/local/lib -L/usr/lib -lEOControl -lNGStreams -lNGMime -lNGExtensions
|
||||
-L/usr/local/lib -L/usr/lib -lEOControl -lNGStreams -lNGMime -lNGExtensions -lNGObjWeb
|
||||
|
||||
@@ -36,13 +36,19 @@
|
||||
|
||||
#import <NGExtensions/NSNull+misc.h>
|
||||
|
||||
#import <NGObjWeb/WOContext+SoObjects.h>
|
||||
|
||||
#import <SOGo/NSString+Utilities.h>
|
||||
#import "SOGo/SOGoCredentialsFile.h"
|
||||
#import <SOGo/SOGoProductLoader.h>
|
||||
#import <SOGo/SOGoSieveManager.h>
|
||||
#import <SOGo/SOGoSystemDefaults.h>
|
||||
#import <SOGo/SOGoUser.h>
|
||||
#import <SOGo/SOGoUserDefaults.h>
|
||||
|
||||
#import <Mailer/SOGoMailAccounts.h>
|
||||
#import <Mailer/SOGoMailAccount.h>
|
||||
|
||||
#import "SOGoTool.h"
|
||||
|
||||
@interface SOGoToolExpireAutoReply : SOGoTool
|
||||
@@ -80,12 +86,10 @@
|
||||
{
|
||||
NSMutableDictionary *vacationOptions;
|
||||
SOGoUserDefaults *userDefaults;
|
||||
SOGoSieveManager *manager;
|
||||
SOGoUser *user;
|
||||
BOOL result;
|
||||
|
||||
user = [SOGoUser userWithLogin: theLogin];
|
||||
manager = [SOGoSieveManager sieveManagerForUser: user];
|
||||
userDefaults = [user userDefaults];
|
||||
vacationOptions = [[userDefaults vacationOptions] mutableCopy];
|
||||
[vacationOptions autorelease];
|
||||
@@ -96,10 +100,24 @@
|
||||
|
||||
if (result)
|
||||
{
|
||||
result = [manager updateFiltersForLogin: theLogin
|
||||
authname: theUsername
|
||||
password: thePassword
|
||||
account: nil];
|
||||
SOGoUserFolder *home;
|
||||
SOGoMailAccounts *folder;
|
||||
SOGoMailAccount *account;
|
||||
WOContext *localContext;
|
||||
Class SOGoMailAccounts_class;
|
||||
|
||||
[[SOGoProductLoader productLoader] loadProducts: [NSArray arrayWithObject: @"Mailer.SOGo"]];
|
||||
SOGoMailAccounts_class = NSClassFromString(@"SOGoMailAccounts");
|
||||
|
||||
localContext = [WOContext context];
|
||||
[localContext setActiveUser: user];
|
||||
|
||||
home = [user homeFolderInContext: localContext];
|
||||
folder = [SOGoMailAccounts_class objectWithName: @"Mail" inContainer: home];
|
||||
account = [folder lookupName: @"0" inContext: localContext acquire: NO];
|
||||
[account setContext: localContext];
|
||||
|
||||
result = [account updateFiltersWithUsername: theUsername andPassword: thePassword];
|
||||
if (!result)
|
||||
{
|
||||
// Can't update Sieve script -- Reactivate auto-reply
|
||||
|
||||
@@ -27,12 +27,18 @@
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSUserDefaults.h>
|
||||
|
||||
#import <NGObjWeb/WOContext+SoObjects.h>
|
||||
#import <NGObjWeb/WOApplication.h>
|
||||
|
||||
#import <SOGo/NSString+Utilities.h>
|
||||
#import <SOGo/SOGoProductLoader.h>
|
||||
#import "SOGo/SOGoCredentialsFile.h"
|
||||
#import <SOGo/SOGoUser.h>
|
||||
#import <SOGo/SOGoUserFolder.h>
|
||||
#import <SOGo/SOGoUserDefaults.h>
|
||||
#import <SOGo/SOGoUserSettings.h>
|
||||
#import <SOGo/SOGoSieveManager.h>
|
||||
#import <Mailer/SOGoMailAccounts.h>
|
||||
#import <Mailer/SOGoMailAccount.h>
|
||||
|
||||
#import "SOGoTool.h"
|
||||
|
||||
@@ -102,7 +108,6 @@ typedef enum
|
||||
// Vacation
|
||||
//
|
||||
- (BOOL) _updateSieveScripsForkey: (NSString *) theKey
|
||||
manager: (SOGoSieveManager *) theManager
|
||||
login: (NSString *) theLogin
|
||||
{
|
||||
if ([theKey caseInsensitiveCompare: @"Forward"] == NSOrderedSame ||
|
||||
@@ -126,11 +131,28 @@ typedef enum
|
||||
NSLog(@"To update Sieve scripts, you must provide the \"-p credentialFile\" parameter");
|
||||
return NO;
|
||||
}
|
||||
|
||||
return [theManager updateFiltersForLogin: theLogin
|
||||
authname: authname
|
||||
password: authpwd
|
||||
account: nil];
|
||||
|
||||
/* update sieve script */
|
||||
SOGoUser *user;
|
||||
SOGoUserFolder *home;
|
||||
SOGoMailAccounts *folder;
|
||||
SOGoMailAccount *account;
|
||||
WOContext *localContext;
|
||||
Class SOGoMailAccounts_class;
|
||||
|
||||
[[SOGoProductLoader productLoader] loadProducts: [NSArray arrayWithObject: @"Mailer.SOGo"]];
|
||||
SOGoMailAccounts_class = NSClassFromString(@"SOGoMailAccounts");
|
||||
|
||||
user = [SOGoUser userWithLogin: theLogin];
|
||||
localContext = [WOContext context];
|
||||
[localContext setActiveUser: user];
|
||||
|
||||
home = [user homeFolderInContext: localContext];
|
||||
folder = [SOGoMailAccounts_class objectWithName: @"Mail" inContainer: home];
|
||||
account = [folder lookupName: @"0" inContext: localContext acquire: NO];
|
||||
[account setContext: localContext];
|
||||
|
||||
return [account updateFiltersWithUsername: authname andPassword: authpwd];
|
||||
}
|
||||
|
||||
return YES;
|
||||
@@ -154,7 +176,6 @@ typedef enum
|
||||
if (max > 3)
|
||||
{
|
||||
SOGoDefaultsSource *source;
|
||||
SOGoSieveManager *manager;
|
||||
SOGoUser *user;
|
||||
|
||||
cmd = [self _cmdFromString: [sanitizedArguments objectAtIndex: 0]];
|
||||
@@ -164,7 +185,6 @@ typedef enum
|
||||
key = [sanitizedArguments objectAtIndex: 3];
|
||||
|
||||
user = [SOGoUser userWithLogin: userId];
|
||||
manager = [SOGoSieveManager sieveManagerForUser: user];
|
||||
|
||||
if ([type caseInsensitiveCompare: @"defaults"] == NSOrderedSame)
|
||||
source = [user userDefaults];
|
||||
@@ -254,7 +274,6 @@ typedef enum
|
||||
}
|
||||
|
||||
rc = [self _updateSieveScripsForkey: key
|
||||
manager: manager
|
||||
login: userId];
|
||||
if (rc)
|
||||
[source synchronize];
|
||||
@@ -266,7 +285,6 @@ typedef enum
|
||||
case UserPreferencesUnset:
|
||||
[source removeObjectForKey: key];
|
||||
rc = [self _updateSieveScripsForkey: key
|
||||
manager: manager
|
||||
login: userId];
|
||||
if (rc)
|
||||
[source synchronize];
|
||||
|
||||
@@ -12,6 +12,8 @@ publish_info_text = "De afzender stelt u op de hoogte van bijgevoegde afspraak."
|
||||
cancel_info_text = "Uw uitnodiging of de hele afspraak is vervallen..";
|
||||
request_info_no_attendee = "stelt een afspraak voor met de volgende deelnemers. U ontvangt deze mail als notificatie, u bent geen deelnemer.";
|
||||
Appointment = "afspraak";
|
||||
"Status Update" = "Statusupdate";
|
||||
was = "was";
|
||||
|
||||
Organizer = "Organisator";
|
||||
Time = "Tijd";
|
||||
|
||||
@@ -28,8 +28,11 @@
|
||||
#import <NGObjWeb/WOContext+SoObjects.h>
|
||||
#import <NGObjWeb/WOResponse.h>
|
||||
#import <NGObjWeb/WORequest.h>
|
||||
|
||||
#import <NGImap4/NGImap4Connection.h>
|
||||
#import <NGImap4/NGImap4Client.h>
|
||||
#import <NGImap4/NSString+Imap4.h>
|
||||
|
||||
#import <EOControl/EOQualifier.h>
|
||||
|
||||
#import <Mailer/SOGoMailAccount.h>
|
||||
@@ -60,6 +63,7 @@
|
||||
folderName = [[context request] formValueForKey: @"name"];
|
||||
if ([folderName length] > 0)
|
||||
{
|
||||
folderName = [folderName stringByEncodingImap4FolderName];
|
||||
newFolder
|
||||
= [co lookupName: [NSString stringWithFormat: @"folder%@", folderName]
|
||||
inContext: context
|
||||
|
||||
@@ -111,18 +111,22 @@
|
||||
"personalCalendar" = "Osobní kalendář";
|
||||
"firstCalendar" = "První kalendář";
|
||||
|
||||
"reminder_NONE" = "Bez připomenutí";
|
||||
"reminder_5_MINUTES_BEFORE" = "5 minut";
|
||||
"reminder_10_MINUTES_BEFORE" = "10 minut";
|
||||
"reminder_15_MINUTES_BEFORE" = "15 minut";
|
||||
"reminder_30_MINUTES_BEFORE" = "30 minut";
|
||||
"reminder_45_MINUTES_BEFORE" = "45 minut";
|
||||
"reminder_1_HOUR_BEFORE" = "1 hodina";
|
||||
"reminder_2_HOURS_BEFORE" = "2 hodiny";
|
||||
"reminder_5_HOURS_BEFORE"= "5 hodiny";
|
||||
"reminder_15_HOURS_BEFORE"= "15 hodin";
|
||||
"reminder_5_HOURS_BEFORE" = "5 hodiny";
|
||||
"reminder_15_HOURS_BEFORE" = "15 hodin";
|
||||
"reminder_1_DAY_BEFORE" = "1 den";
|
||||
"reminder_2_DAYS_BEFORE" = "2 dny";
|
||||
"reminder_1_WEEK_BEFORE" = "1 týden";
|
||||
|
||||
/* Mailer */
|
||||
"Labels" = "Značky";
|
||||
"Label" = "Označkovat";
|
||||
"Show subscribed mailboxes only" = "Ukázat pouze odebírané mailové schránky";
|
||||
"Sort messages by threads" = "Třídit zprávy podle souvislostí";
|
||||
@@ -240,59 +244,56 @@
|
||||
"Ask me" = "Zeptat se";
|
||||
|
||||
/* Filters - UIxPreferences */
|
||||
"Filters" = "Filters";
|
||||
"Active" = "Active";
|
||||
"Move Up" = "Move Up";
|
||||
"Move Down" = "Move Down";
|
||||
"Filters" = "Třídění";
|
||||
"Active" = "Aktivní";
|
||||
"Move Up" = "Posunout nahoru";
|
||||
"Move Down" = "Posunout dolů";
|
||||
|
||||
/* Filters - UIxFilterEditor */
|
||||
"Filter name:" = "Filter name:";
|
||||
"For incoming messages that" = "For incoming messages that";
|
||||
"match all of the following rules:" = "match all of the following rules:";
|
||||
"match any of the following rules:" = "match any of the following rules:";
|
||||
"match all messages" = "match all messages";
|
||||
"Perform these actions:" = "Perform these actions:";
|
||||
"Filter name:" = "Jméno filtru:";
|
||||
"For incoming messages that" = "Pro příchozí zprávy, které";
|
||||
"match all of the following rules:" = "vyhovují všem následujícím podmínkám:";
|
||||
"match any of the following rules:" = "vyhovují některé z následujících podmínek:";
|
||||
"match all messages" = "odpovídají všem zprávám";
|
||||
"Perform these actions:" = "Proveď tyto akce:";
|
||||
"Untitled Filter" = "Nepojmenovaný filtr";
|
||||
|
||||
"Subject" = "Subject";
|
||||
"From" = "From";
|
||||
"To" = "To";
|
||||
"Cc" = "Cc";
|
||||
"To or Cc" = "To or Cc";
|
||||
"Size (Kb)" = "Size (Kb)";
|
||||
"Header" = "Header";
|
||||
"Flag the message with:" = "Flag the message with:";
|
||||
"Discard the message" = "Discard the message";
|
||||
"File the message in:" = "File the message in:";
|
||||
"Keep the message" = "Keep the message";
|
||||
"Forward the message to:" = "Forward the message to:";
|
||||
"Send a reject message:" = "Send a reject message:";
|
||||
"Send a vacation message" = "Send a vacation message";
|
||||
"Stop processing filter rules" = "Stop processing filter rules";
|
||||
"Subject" = "Předmět";
|
||||
"From" = "Odesílatel";
|
||||
"To" = "Komu";
|
||||
"Cc" = "Kopie";
|
||||
"To or Cc" = "Komu nebo Kopie";
|
||||
"Size (Kb)" = "Velikost (Kb)";
|
||||
"Header" = "Hlavička";
|
||||
"Body" = "Tělo";
|
||||
"Flag the message with:" = "Označ zprávu jako:";
|
||||
"Discard the message" = "Odstraň zprávu";
|
||||
"File the message in:" = "Ulož zprávu do složky:";
|
||||
"Keep the message" = "Zprávu ponechej";
|
||||
"Forward the message to:" = "Přepošli zprávu na:";
|
||||
"Send a reject message:" = "Pošli zprávu s odmítnutím:";
|
||||
"Send a vacation message" = "Pošli odpověď v nepřítomnosti";
|
||||
"Stop processing filter rules" = "Ukonči zpracování";
|
||||
|
||||
"is under" = "is under";
|
||||
"is over" = "is over";
|
||||
"is" = "is";
|
||||
"is under" = "je menší než";
|
||||
"is over" = "je větší než";
|
||||
"is" = "je rovno";
|
||||
"is not" = "is not";
|
||||
"contains" = "contains";
|
||||
"does not contain" = "does not contain";
|
||||
"matches" = "matches";
|
||||
"does not match" = "does not match";
|
||||
"matches regex" = "matches regex";
|
||||
"does not match regex" = "does not match regex";
|
||||
"contains" = "obsahuje";
|
||||
"does not contain" = "neobsahuje";
|
||||
"matches" = "odpovídá";
|
||||
"does not match" = "neodpovídá";
|
||||
"matches regex" = "odpovídá regulárnímu výrazu";
|
||||
"does not match regex" = "neodpovídá regulárnímu výrazu";
|
||||
|
||||
"Seen" = "Seen";
|
||||
"Deleted" = "Deleted";
|
||||
"Answered" = "Answered";
|
||||
"Flagged" = "Flagged";
|
||||
"Junk" = "Junk";
|
||||
"Not Junk" = "Not Junk";
|
||||
"Label 1" = "Label 1";
|
||||
"Label 2" = "Label 2";
|
||||
"Label 3" = "Label 3";
|
||||
"Label 4" = "Label 4";
|
||||
"Label 5" = "Label 5";
|
||||
"Seen" = "Přečtené";
|
||||
"Deleted" = "Smazané";
|
||||
"Answered" = "Odpovězené";
|
||||
"Flagged" = "Oštítkované";
|
||||
"Junk" = "Nevyžádané";
|
||||
"Not Junk" = "Jako vyžádané";
|
||||
|
||||
/* Password policy */
|
||||
"The password was changed successfully." = "Heslo bylo úspěšně změněno.";
|
||||
"Password must not be empty." = "Heslo nesmí být prázdné.";
|
||||
"The passwords do not match. Please try again." = "Hesla se neshodují. Prosím zadejte je znovu.";
|
||||
@@ -305,4 +306,4 @@
|
||||
"Unhandled policy error: %{0}" = "Neošetřená chyba: %{0}";
|
||||
"Unhandled error response" = "Neošetřená chyba";
|
||||
"Password change is not supported." = "Změna hesla není podporována.";
|
||||
"Unhandled HTTP error code: %{0}" = "Neošetřený HTTP chybový kód: %{0}";
|
||||
"Unhandled HTTP error code: %{0}" = "Neošetřený HTTP chybový kód: %{0}";
|
||||
@@ -111,18 +111,22 @@
|
||||
"personalCalendar" = "Persoonlijke agenda";
|
||||
"firstCalendar" = "Eerste ingeschakelde agenda";
|
||||
|
||||
"reminder_NONE" = "Geen herinnering";
|
||||
"reminder_5_MINUTES_BEFORE" = "5 minuten";
|
||||
"reminder_10_MINUTES_BEFORE" = "10 minuten";
|
||||
"reminder_15_MINUTES_BEFORE" = "15 minuten";
|
||||
"reminder_30_MINUTES_BEFORE" = "30 minuten";
|
||||
"reminder_45_MINUTES_BEFORE" = "45 minuten van tevoren";
|
||||
"reminder_1_HOUR_BEFORE" = "1 uur";
|
||||
"reminder_2_HOURS_BEFORE" = "2 uren";
|
||||
"reminder_5_HOURS_BEFORE"= "5 uren";
|
||||
"reminder_15_HOURS_BEFORE"= "15 uren";
|
||||
"reminder_5_HOURS_BEFORE" = "5 uren";
|
||||
"reminder_15_HOURS_BEFORE" = "15 uren";
|
||||
"reminder_1_DAY_BEFORE" = "1 dag";
|
||||
"reminder_2_DAYS_BEFORE" = "2 dagen";
|
||||
"reminder_1_WEEK_BEFORE" = "1 week van tevoren";
|
||||
|
||||
/* Mailer */
|
||||
"Labels" = "Labels";
|
||||
"Label" = "Labelen";
|
||||
"Show subscribed mailboxes only" = "Toon alleen geabonneerde postvakken";
|
||||
"Sort messages by threads" = "Berichten sorteren op threads";
|
||||
@@ -261,6 +265,7 @@
|
||||
"To or Cc" = "aan of cc";
|
||||
"Size (Kb)" = "Grootte (Kb)";
|
||||
"Header" = "Header";
|
||||
"Body" = "Inhoud";
|
||||
"Flag the message with:" = "Markeer het bericht met:";
|
||||
"Discard the message" = "Het bericht verwijderen";
|
||||
"File the message in:" = "Verplaats het bericht naar:";
|
||||
@@ -287,12 +292,8 @@
|
||||
"Flagged" = "Gemarkeerd";
|
||||
"Junk" = "Junk";
|
||||
"Not Junk" = "Geen junk";
|
||||
"Label 1" = "Label 1";
|
||||
"Label 2" = "Label 2";
|
||||
"Label 3" = "Label 3";
|
||||
"Label 4" = "Label 4";
|
||||
"Label 5" = "Label 5";
|
||||
|
||||
/* Password policy */
|
||||
"The password was changed successfully." = "Het wachtwoord is met succes veranderd.";
|
||||
"Password must not be empty." = "Wachtwoord mag niet leeg zijn.";
|
||||
"The passwords do not match. Please try again." = "De wachtwoorden komen niet overeen. Probeer opnieuw.";
|
||||
@@ -305,4 +306,4 @@
|
||||
"Unhandled policy error: %{0}" = "Onverwerkte beleidsfout: %{0}";
|
||||
"Unhandled error response" = "Onverwerkte foutmelding";
|
||||
"Password change is not supported." = "Wachtwoordwijziging wordt niet ondersteund.";
|
||||
"Unhandled HTTP error code: %{0}" = "Onverwerkte HTTP-foutcode: %{0}";
|
||||
"Unhandled HTTP error code: %{0}" = "Onverwerkte HTTP-foutcode: %{0}";
|
||||
@@ -265,6 +265,7 @@
|
||||
"To or Cc" = "Kenelle tai Kopio";
|
||||
"Size (Kb)" = "Koko (Kb)";
|
||||
"Header" = "Otsikko";
|
||||
"Body" = "Runko";
|
||||
"Flag the message with:" = "Merkitse viesti:";
|
||||
"Discard the message" = "Hylkää viesti";
|
||||
"File the message in:" = "Arkistoi viesti:";
|
||||
|
||||
@@ -111,19 +111,23 @@
|
||||
"personalCalendar" = "Személyes naptár";
|
||||
"firstCalendar" = "Első engedélyezett naptár";
|
||||
|
||||
"reminder_5_MINUTES_BEFORE" = "5 perc";
|
||||
"reminder_NONE" = "Nincs emlékeztető";
|
||||
"reminder_5_MINUTES_BEFORE" = "5 perccel előtte";
|
||||
"reminder_10_MINUTES_BEFORE" = "10 perc";
|
||||
"reminder_15_MINUTES_BEFORE" = "15 perc";
|
||||
"reminder_15_MINUTES_BEFORE" = "15 perccel előtte";
|
||||
"reminder_30_MINUTES_BEFORE" = "30 perc";
|
||||
"reminder_1_HOUR_BEFORE" = "1 óra";
|
||||
"reminder_2_HOURS_BEFORE" = "2 óra";
|
||||
"reminder_5_HOURS_BEFORE"= "5 óra";
|
||||
"reminder_15_HOURS_BEFORE"= "15 óra";
|
||||
"reminder_1_DAY_BEFORE" = "1 nap";
|
||||
"reminder_2_DAYS_BEFORE" = "2 nap";
|
||||
"reminder_45_MINUTES_BEFORE" = "45 perccel előtte";
|
||||
"reminder_1_HOUR_BEFORE" = "1 órával előtte";
|
||||
"reminder_2_HOURS_BEFORE" = "2 órával előtte";
|
||||
"reminder_5_HOURS_BEFORE" = "5 órával előtte";
|
||||
"reminder_15_HOURS_BEFORE" = "15 órával előtte";
|
||||
"reminder_1_DAY_BEFORE" = "1 nappal előtte";
|
||||
"reminder_2_DAYS_BEFORE" = "2 nappal előtte";
|
||||
"reminder_1_WEEK_BEFORE" = "1 héttel előtte";
|
||||
|
||||
/* Mailer */
|
||||
"Label" = "Cimke";
|
||||
"Labels" = "Címkék";
|
||||
"Label" = "Címke";
|
||||
"Show subscribed mailboxes only" = "Csak azok a fiókok mutatása, amelyre feliratkozott";
|
||||
"Sort messages by threads" = "Üzenetek beszélgetések szerinti rendezése ";
|
||||
"Check for new mail:" = "Új üzenetek letöltése:";
|
||||
@@ -261,6 +265,7 @@
|
||||
"To or Cc" = "Címzett vagy másolat";
|
||||
"Size (Kb)" = "Méret (Kb)";
|
||||
"Header" = "Fejléc";
|
||||
"Body" = "Levéltörzs";
|
||||
"Flag the message with:" = "Üzenet címkézése ezzel:";
|
||||
"Discard the message" = "Üzenet eldobása";
|
||||
"File the message in:" = "Az üzenet alábbi mappába helyezése:";
|
||||
@@ -287,12 +292,8 @@
|
||||
"Flagged" = "Megcímkézett";
|
||||
"Junk" = "Szemét";
|
||||
"Not Junk" = "Nem szemét";
|
||||
"Label 1" = "Címke 1";
|
||||
"Label 2" = "Címke 2";
|
||||
"Label 3" = "Címke 3";
|
||||
"Label 4" = "Címke 4";
|
||||
"Label 5" = "Címke 5";
|
||||
|
||||
/* Password policy */
|
||||
"The password was changed successfully." = "A jelszó megváltoztatása sikeres.";
|
||||
"Password must not be empty." = "Jelszó nem lehet üres.";
|
||||
"The passwords do not match. Please try again." = "Jelszavak nem egyeznek meg. Kérem próbálja meg újra.";
|
||||
@@ -305,4 +306,4 @@
|
||||
"Unhandled policy error: %{0}" = "Nem kezelt szabályrendszer hiba: %{0}";
|
||||
"Unhandled error response" = "Nem kezelt hiba válasz";
|
||||
"Password change is not supported." = "Jelszó változtatása nem támogatott.";
|
||||
"Unhandled HTTP error code: %{0}" = "Nem kezelt HTTP hiba kód: %{0}";
|
||||
"Unhandled HTTP error code: %{0}" = "Nem kezelt HTTP hiba kód: %{0}";
|
||||
@@ -571,10 +571,13 @@ static NSArray *reminderValues = nil;
|
||||
int index;
|
||||
|
||||
value = [userDefaults calendarDefaultReminder];
|
||||
index = [reminderValues indexOfObject: value];
|
||||
if (value != nil)
|
||||
{
|
||||
index = [reminderValues indexOfObject: value];
|
||||
|
||||
if (index != NSNotFound)
|
||||
return [reminderItems objectAtIndex: index];
|
||||
if (index != NSNotFound)
|
||||
return [reminderItems objectAtIndex: index];
|
||||
}
|
||||
|
||||
return @"NONE";
|
||||
}
|
||||
|
||||
@@ -418,6 +418,7 @@ validate_endbeforestart = "Het einde is voor de begindatum.";
|
||||
|
||||
"eventDeleteConfirmation" = "Weet u zeker dat u de volgende afspraken wilt verwijderen?";
|
||||
"taskDeleteConfirmation" = "Weet u zeker dat u de volgende taken wilt verwijderen?";
|
||||
"Would you like to continue?" = "Wilt u doorgaan?";
|
||||
|
||||
"You cannot remove nor unsubscribe from your personal calendar."
|
||||
= "U kunt niet uw persoonlijke agenda verwijderen of opzeggen.";
|
||||
|
||||
@@ -165,7 +165,7 @@
|
||||
<td id="eventStartHeader" class="headerCell headerDateTime sortableTableHeader"><var:string label:value="Start"/></td>
|
||||
<td id="eventEndHeader" class="headerCell headerDateTime sortableTableHeader"><var:string label:value="End"/></td>
|
||||
<td id="eventLocationHeader" class="headerCell headerLocation sortableTableHeader"><var:string label:value="Location"/></td>
|
||||
<td id="calendarNameHeader" class="headerCell headerCalendarName sortableTableHeader"><var:string label:value="Calendar"/></td>
|
||||
<td id="eventCalendarNameHeader" class="headerCell headerCalendarName sortableTableHeader"><var:string label:value="Calendar"/></td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody><!-- events list --></tbody>
|
||||
|
||||
@@ -106,6 +106,10 @@ String.prototype.asCSSIdentifier = function() {
|
||||
newString = newString.replace(re, escapeds[i]);
|
||||
}
|
||||
|
||||
if (/^\d+/.test(newString)) {
|
||||
newString = '_' + newString;
|
||||
}
|
||||
|
||||
return newString;
|
||||
};
|
||||
|
||||
|
||||
@@ -2309,7 +2309,8 @@ function onMenuCreateFolderConfirm(event) {
|
||||
}
|
||||
|
||||
function onMenuRenameFolder(event) {
|
||||
showPromptDialog(_("Rename Folder..."), _("Enter the new name of your folder :"), onMenuRenameFolderConfirm);
|
||||
var folderName = document.menuTarget.down('.nodeName').childNodes[0].nodeValue;
|
||||
showPromptDialog(_("Rename Folder..."), _("Enter the new name of your folder :"), onMenuRenameFolderConfirm, folderName);
|
||||
}
|
||||
|
||||
function onMenuRenameFolderConfirm() {
|
||||
|
||||
@@ -167,10 +167,12 @@ var SOGoAutoCompletionInterface = {
|
||||
for (var i = 0; i < data.contacts.length; i++) {
|
||||
var contact = data.contacts[i];
|
||||
var completeEmail = contact["c_cn"];
|
||||
var uid = "" + contact[this.uidField];
|
||||
var c_name = "" + contact['c_name'];
|
||||
if (contact["c_mail"])
|
||||
completeEmail += " <" + contact["c_mail"] + ">";
|
||||
var node = new Element('li', { 'address': completeEmail,
|
||||
'uid': contact[this.uidField] });
|
||||
'uid': uid });
|
||||
var matchPosition = completeEmail.toLowerCase().indexOf(data.searchText.toLowerCase());
|
||||
if (matchPosition > -1) {
|
||||
var matchBefore = completeEmail.substring(0, matchPosition);
|
||||
@@ -184,7 +186,7 @@ var SOGoAutoCompletionInterface = {
|
||||
node.appendChild(document.createTextNode(completeEmail));
|
||||
}
|
||||
list.appendChild(node);
|
||||
if (contact['c_name'].endsWith (".vlf")) {
|
||||
if (c_name.endsWith(".vlf")) {
|
||||
// Keep track of list containers
|
||||
node.writeAttribute("container", contact['container']);
|
||||
}
|
||||
@@ -211,6 +213,7 @@ var SOGoAutoCompletionInterface = {
|
||||
this.menu.setStyle({ top: top + "px",
|
||||
left: offset[0] + "px",
|
||||
height: height,
|
||||
maxWidth: (window.width() - offset[0] - 12) + "px",
|
||||
visibility: "visible" });
|
||||
this.menu.scrollTop = 0;
|
||||
|
||||
@@ -225,8 +228,10 @@ var SOGoAutoCompletionInterface = {
|
||||
if (data.contacts.length == 1) {
|
||||
// Single result
|
||||
var contact = data.contacts[0];
|
||||
input.writeAttribute("uid", contact[this.uidField]);
|
||||
if (contact['c_name'].endsWith(".vlf")) {
|
||||
var uid = "" + contact[this.uidField];
|
||||
var c_name = "" + contact['c_name'];
|
||||
input.writeAttribute("uid", uid);
|
||||
if (c_name.endsWith(".vlf")) {
|
||||
this.writeAttribute("container", contact['container']);
|
||||
}
|
||||
var completeEmail = contact["c_cn"];
|
||||
|
||||
@@ -251,6 +251,8 @@ DIV.contactSelector DIV.contactList
|
||||
padding-bottom: .15em;
|
||||
margin: 0px;
|
||||
width: auto;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
cursor: pointer; }
|
||||
|
||||
|
||||
@@ -2157,7 +2157,10 @@ function _showPromptDialog(title, label, callback, defaultValue) {
|
||||
}
|
||||
if (Prototype.Browser.IE)
|
||||
jQuery('#bgDialogDiv').css('opacity', 0.4);
|
||||
jQuery(dialog).fadeIn('fast', function () { dialog.down("input").focus(); });
|
||||
jQuery(dialog).fadeIn('fast', function () {
|
||||
var input = dialog.down("input");
|
||||
input.selectText(0, input.value.length);
|
||||
});
|
||||
}
|
||||
|
||||
function showSelectDialog(title, label, options, button, callbackFcn, callbackArg, defaultValue) {
|
||||
|
||||
Reference in New Issue
Block a user