Merge to 2.0.4b

maint-2.1.1 SOGo-2.0.4b
Francis Lachapelle 2013-02-04 14:24:46 -05:00
commit 5e0c7ae4f2
39 changed files with 474 additions and 139 deletions

214
ChangeLog
View File

@ -1,3 +1,186 @@
commit 6913502810ec21479889c4ecf0a393de5ede2635
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Mon Feb 4 14:22:37 2013 -0500
Bump version to 2.0.4b
M NEWS
M Version
commit 24971070f6f7e94629ff7bfc142d8194f7a19296
Author: Jean Raby <jraby@inverse.ca>
Date: Mon Feb 4 14:03:28 2013 -0500
Updated NEWS
M NEWS
commit 3d90e3a5393ff45b4915a1c915edd4c24b21763c
Author: Jean Raby <jraby@inverse.ca>
Date: Mon Feb 4 13:55:53 2013 -0500
Bump userkey length from 64 to 160 bytes
Allows for much longer username@domain:password strings.
Fixes #2212
To bump it further, the database schema will have to be updated
to allow a longer c_value (currently 255 chars)
M SoObjects/SOGo/SOGoWebAuthenticator.m
commit b5fdaa78cd5268aa9de49020e6fd2b71b8de7279
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Mon Feb 4 08:58:37 2013 -0500
Add missing strings to mail module
The two columns names of the contacts pane were missing. They have
been copied from the contact module.
M UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings
M UI/MailerUI/Catalan.lproj/Localizable.strings
M UI/MailerUI/Czech.lproj/Localizable.strings
M UI/MailerUI/Danish.lproj/Localizable.strings
M UI/MailerUI/Dutch.lproj/Localizable.strings
M UI/MailerUI/English.lproj/Localizable.strings
M UI/MailerUI/Finnish.lproj/Localizable.strings
M UI/MailerUI/French.lproj/Localizable.strings
M UI/MailerUI/German.lproj/Localizable.strings
M UI/MailerUI/Hungarian.lproj/Localizable.strings
M UI/MailerUI/Icelandic.lproj/Localizable.strings
M UI/MailerUI/Italian.lproj/Localizable.strings
M UI/MailerUI/NorwegianBokmal.lproj/Localizable.strings
M UI/MailerUI/NorwegianNynorsk.lproj/Localizable.strings
M UI/MailerUI/Polish.lproj/Localizable.strings
M UI/MailerUI/Russian.lproj/Localizable.strings
M UI/MailerUI/Slovak.lproj/Localizable.strings
M UI/MailerUI/SpanishArgentina.lproj/Localizable.strings
M UI/MailerUI/SpanishSpain.lproj/Localizable.strings
M UI/MailerUI/Swedish.lproj/Localizable.strings
M UI/MailerUI/Ukrainian.lproj/Localizable.strings
M UI/MailerUI/Welsh.lproj/Localizable.strings
commit f94adb54736bdad858e85f5b87743f1d29b1e1e0
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Sun Feb 3 20:42:20 2013 -0500
Update NEWS file
M NEWS
commit e34ba5689cb2d816c6b353485ea274c95ba8983a
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Sun Feb 3 20:40:06 2013 -0500
Fix saving prefs with disabled mail module
M UI/WebServerResources/UIxPreferences.js
commit a4bd966cc0c3429261747384dc746ec5f71423de
Author: Jean Raby <jraby@inverse.ca>
Date: Fri Feb 1 16:26:01 2013 -0500
Revisit option handling
Really fix #2166
The previous fix (46b53b3) was wrong since SOPE was able to override
the 'final' config with its defaults.
This now uses a new approach using a volatile domain and a reordering
of the search list :
* NSArgumentDomain (command line arguments)
* sogodRuntimeDomain (config from all config files)
* GSPrimaryDomain
* NSGlobalDomain
* GSConfigDomain
* (languages)
* NSRegistrationDomain (SOPE loads its defaults in this one)
M SoObjects/SOGo/SOGoSystemDefaults.m
commit ecc36c9025b4b2717f5ce169b622648ccf02f410
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Fri Feb 1 14:47:37 2013 -0500
Fix classification menu in component editor
M NEWS
M UI/WebServerResources/UIxComponentEditor.js
M UI/WebServerResources/generic.js
commit 716daf027de29bc72ffb84368291c191c49fa1e2
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Fri Feb 1 14:46:05 2013 -0500
Fix link to ACL editor for any authenticated user
M UI/WebServerResources/UIxAclEditor.js
commit 0b7c32510bc8653cc2ec32758f5215b14125e849
Author: Jean Raby <jraby@inverse.ca>
Date: Fri Feb 1 10:40:59 2013 -0500
news file update for 2.0.4b
M NEWS
commit 225a28258f1b33e594172b7ca61c8751f6c5e4f9
Author: Jean Raby <jraby@inverse.ca>
Date: Thu Jan 31 16:44:14 2013 -0500
Read credential files using dataWithContentsOfFile
Again, to cope with older gnusteps which don't have
stringWithContentsOfFile:encoding:error:
M Tools/SOGoToolExpireAutoReply.m
M Tools/SOGoToolUserPreferences.m
commit e01b190e5775fd98c5a7b0739c1eac0bc8a4c70f
Author: Jean Raby <jraby@inverse.ca>
Date: Thu Jan 31 15:42:48 2013 -0500
Fixup handling NSArgumentDomain arguments
would fix #2216
M Tools/SOGoTool.m
commit cd7d41026230e1a645f1153b3ebe134547b5b2d7
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Thu Jan 31 13:55:57 2013 -0500
Fix tooltips in contacts list
M UI/Templates/ContactsUI/UIxContactFoldersView.wox
D UI/Templates/ContactsUI/UIxContactsListView.wox
M UI/WebServerResources/ContactsUI.js
commit 4bcf90c693797985b2f36cd5986d0a821141c756
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Thu Jan 31 09:44:29 2013 -0500
Fix "Send Anyway" string wrt localizable strings
M UI/WebServerResources/UIxMailEditor.js
commit 0408415c61f572ab859c58f44c1d5a028b3fbef7
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Wed Jan 30 15:47:20 2013 -0500
Remove control characters before returning JSON
M SoObjects/SOGo/NSString+Utilities.m
commit 3ea94940c28e314a7904b98f171f95c5620b3382
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Wed Jan 30 08:52:32 2013 -0500
Update ChangeLog
M ChangeLog
commit 321675ba99288b036677242ada3bfb0cb945970c
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Wed Jan 30 08:51:10 2013 -0500
@ -152,6 +335,37 @@ Date: Fri Jan 25 10:21:28 2013 -0500
M SoObjects/Appointments/SOGoAppointmentFolder.m
commit 46b53b31fd417e6349304609920e36fb9869f9e3
Author: Jean Raby <jraby@inverse.ca>
Date: Thu Jan 24 22:43:38 2013 -0500
Fix order of precedence for options
Fixes #2066 and #2166
Enforce the following order of precedence for options, first match wins:
1. Command line arguments
2. .GNUstepDefaults
3. /etc/sogo/{debconf,sogo}.conf
4. SOGoDefaults.plist
M SoObjects/SOGo/SOGoSystemDefaults.m
commit 6093c4dd2e9095e0288992fe92ccb1b93fb9435a
Author: Jean Raby <jraby@inverse.ca>
Date: Thu Jan 24 20:37:30 2013 -0500
Axe handling of sogo 0.9 gnustep domain migration
M SoObjects/SOGo/SOGoSystemDefaults.m
commit 61ded01171806595da1c03b686a5bd1dc5cd45ed
Author: Jean Raby <jraby@inverse.ca>
Date: Thu Jan 24 20:35:03 2013 -0500
whitespace - tabkill
M SoObjects/SOGo/SOGoSystemDefaults.m
commit 9ed53cbab3365d3d2e0a9d2c1dc8a6141d185f0f
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Thu Jan 24 18:50:20 2013 -0500

19
NEWS
View File

@ -1,3 +1,22 @@
2.0.4b (2013-02-04)
------------------
Bug fixes
- Fixed order of precedence for options (#2166)
The following order is enforced - first match wins
1. Command line arguments
2. .GNUstepDefaults
3. /etc/sogo/{debconf,sogo}.conf
4. SOGoDefaults.plist
- fixed handling of LDAP DN containing special characters (#2152, #2207)
- fixed handling of credential files for older GNUsteps (#2216)
- fixed display of messages with control characters (#2079, #2177)
- fixed tooltips in contacts list (#2211)
- fixed classification menu in component editor (#2223)
- fixed link to ACL editor for 'any authenticated user' (#2222, #2224)
- fixed saving preferences when mail module is disabled
- fixed handling for long credential strings (#2212)
2.0.4a (2013-01-30)
------------------

View File

@ -260,7 +260,6 @@ static int cssEscapingCount;
[representation replaceString: @"\\" withString: @"\\\\"];
[representation replaceString: @"\"" withString: @"\\\""];
[representation replaceString: @"/" withString: @"\\/"];
[representation replaceString: @"\b" withString: @"\\b"];
[representation replaceString: @"\f" withString: @"\\f"];
[representation replaceString: @"\n" withString: @"\\n"];
[representation replaceString: @"\r" withString: @"\\r"];
@ -271,7 +270,33 @@ static int cssEscapingCount;
- (NSString *) jsonRepresentation
{
return [self doubleQuotedString];
static char thisCharCode[28];
static NSString *controlCharString = nil;
static NSCharacterSet *controlCharSet = nil;
NSString *cleanedString;
int i;
if (!controlCharSet)
{
// Create an array of chars for all control characters between 0x00 and 0x1F,
// apart from \t, \n, \f and \r (0x08, 0x09, 0x0A, 0x0C and 0x0D)
for (i = 0x00; i <= 0x08; i++) {
thisCharCode[i] = i;
}
thisCharCode[9] = 0x0B;
for (i = 0x0E; i <= 0x1F; i++) {
thisCharCode[i - 4] = i;
}
controlCharString = [NSString stringWithCString: thisCharCode length: 28];
controlCharSet = [NSCharacterSet characterSetWithCharactersInString: controlCharString];
[controlCharSet retain];
}
// Escape double quotes and remove control characters
cleanedString = [[[self doubleQuotedString] componentsSeparatedByCharactersInSet: controlCharSet]
componentsJoinedByString: @""];
return cleanedString;
}
- (void) _setupCSSEscaping

View File

@ -29,6 +29,7 @@
#import <Foundation/NSBundle.h>
#import <Foundation/NSFileManager.h>
#import <Foundation/NSFileManager.h>
#import <Foundation/NSDictionary.h>
#import <Foundation/NSUserDefaults.h>
#import <NGExtensions/NSObject+Logs.h>
@ -62,29 +63,14 @@ BootstrapNSUserDefaults ()
if (handle)
{
SOGoNSUserDefaultsBootstrap = dlsym (handle,
"SOGoNSUserDefaultsBootstrap");
"SOGoNSUserDefaultsBootstrap");
if (SOGoNSUserDefaultsBootstrap)
SOGoNSUserDefaultsBootstrap ();
SOGoNSUserDefaultsBootstrap ();
}
}
static void
_migrateSOGo09Configuration (NSUserDefaults *ud, NSObject *logger)
{
NSDictionary *domain;
domain = [ud persistentDomainForName: @"sogod-0.9"];
if ([domain count])
{
[logger logWithFormat: @"migrating user defaults from sogod-0.9"];
[ud setPersistentDomain: domain forName: @"sogod"];
[ud removePersistentDomainForName: @"sogod-0.9"];
[ud synchronize];
}
}
static void
_injectConfigurationFromFile (NSUserDefaults *ud,
_injectConfigurationFromFile (NSMutableDictionary *defaultsDict,
NSString *filename, NSObject *logger)
{
NSDictionary *newConfig, *fileAttrs;
@ -94,14 +80,14 @@ _injectConfigurationFromFile (NSUserDefaults *ud,
if ([fm fileExistsAtPath: filename])
{
fileAttrs = [fm fileAttributesAtPath: filename
traverseLink: YES];
traverseLink: YES];
if (![fileAttrs objectForKey: @"NSFileSize"])
{
[logger errorWithFormat:
@"Can't get file attributes from '%@'",
filename];
@"Can't get file attributes from '%@'",
filename];
exit(1);
}
}
if ([[fileAttrs objectForKey: @"NSFileSize"] intValue] == 0 )
{
[logger warnWithFormat:
@ -112,7 +98,7 @@ _injectConfigurationFromFile (NSUserDefaults *ud,
{
newConfig = [NSDictionary dictionaryWithContentsOfFile: filename];
if (newConfig)
[ud registerDefaults: newConfig];
[defaultsDict addEntriesFromDictionary: newConfig];
else
{
[logger errorWithFormat:
@ -126,6 +112,35 @@ _injectConfigurationFromFile (NSUserDefaults *ud,
+ (void) prepareUserDefaults
{
/* Load settings from configuration files and
* enforce the following order of precedence.
* First match wins
* 1. Command line arguments
* 2. .GNUstepDefaults
* 3. /etc/sogo/{debconf,sogo}.conf
* 4. SOGoDefaults.plist
*
* The default standardUserDefaults search list is as follows:
* GSPrimaryDomain
* NSArgumentDomain (command line arguments)
* applicationDomain (sogod)
* NSGlobalDomain
* GSConfigDomain
* (languages)
* NSRegistrationDomain
*
* We'll end up with this search list:
* NSArgumentDomain (command line arguments)
* sogodRuntimeDomain (config from all config files)
* GSPrimaryDomain
* NSGlobalDomain
* GSConfigDomain
* (languages)
* NSRegistrationDomain (SOPE loads its defaults in this one)
*/
NSDictionary *sogodDomain;
NSMutableDictionary *configFromFiles;
NSUserDefaults *ud;
SOGoStartupLogger *logger;
NSBundle *bundle;
@ -136,28 +151,41 @@ _injectConfigurationFromFile (NSUserDefaults *ud,
logger = [SOGoStartupLogger sharedLogger];
/* we load the configuration from the standard user default files */
/* Load the configuration from the standard user default files */
ud = [NSUserDefaults standardUserDefaults];
/* if "sogod" does not exist, maybe "sogod-0.9" still exists from an old
configuration */
if (![[ud persistentDomainForName: @"sogod"] count])
_migrateSOGo09Configuration (ud, logger);
/* reregister defaults from domain "sogod" into default domain, for
non-sogod processes */
[ud addSuiteNamed: @"sogod"];
/* we populate the configuration with the values from SOGoDefaults.plist */
/* Populate configFromFiles with default values from SOGoDefaults.plist */
configFromFiles = [NSMutableDictionary dictionaryWithCapacity:0];
bundle = [NSBundle bundleForClass: self];
filename = [bundle pathForResource: @"SOGoDefaults" ofType: @"plist"];
if (filename)
_injectConfigurationFromFile (ud, filename, logger);
_injectConfigurationFromFile (configFromFiles, filename, logger);
/* fill the possibly missing values with the configuration stored
in "/etc" */
/* Fill/Override configFromFiles values with configuration stored
* in "/etc" */
for (count = 0; count < sizeof(confFiles)/sizeof(confFiles[0]); count++)
_injectConfigurationFromFile (ud, confFiles[count], logger);
_injectConfigurationFromFile (configFromFiles, confFiles[count], logger);
/* This dance is required to let other appplications (sogo-tool) use
* options from the sogod domain while preserving the order of precedence
* - remove the 'sogod' domain from the user defaults search list
* - Load the content of the sogod domain into configFromFiles
* Thereby overriding values from the config files loaded above
*/
[ud removeSuiteNamed: @"sogod"];
sogodDomain = [ud persistentDomainForName: @"sogod"];
if ([sogodDomain count])
[configFromFiles addEntriesFromDictionary: sogodDomain];
/* Add a volatile domain containing the config to the search list.
* The domain is added at the very front of the search list
*/
[ud setVolatileDomain: configFromFiles
forName: @"sogodRuntimeDomain"];
[ud addSuiteNamed: @"sogodRuntimeDomain"];
/* NSArgumentsDomain goes back in front of the search list */
[ud addSuiteNamed: @"NSArgumentDomain"];
/* issue a warning if WOApplicationRedirectURL is used */
redirectURL = [ud stringForKey: @"WOApplicationRedirectURL"];

View File

@ -55,6 +55,12 @@
#endif
#import "SOGoWebAuthenticator.h"
#define COOKIE_SESSIONKEY_LEN 16
/* the key b64 encoded key XORed with the cookie value
* must fit in the database field which is 255 char long at the moment
*/
#define COOKIE_USERKEY_LEN 160
@implementation SOGoWebAuthenticator
+ (id) sharedSOGoWebAuthenticator
@ -369,8 +375,8 @@
// In memcached, the session key will be associated to the user's password
// which will be XOR'ed with the user key.
//
sessionKey = [SOGoSession generateKeyForLength: 16];
userKey = [SOGoSession generateKeyForLength: 64];
sessionKey = [SOGoSession generateKeyForLength: COOKIE_SESSIONKEY_LEN];
userKey = [SOGoSession generateKeyForLength: COOKIE_USERKEY_LEN];
NSString *value = [NSString stringWithFormat: @"%@:%@", username, password];
securedPassword = [SOGoSession securedValue: value usingKey: userKey];

View File

@ -77,15 +77,17 @@
- (void) setSanitizedArguments: (NSArray *) newArguments
{
NSString *argPair, *argsString, *k, *v;
NSDictionary *cliArguments;
NSArray *keys, *wordsWP;
int i;
argsString = [newArguments componentsJoinedByString:@" "];
NSArray *keys;
NSDictionary *cliArguments;
NSMutableArray *mutArguments;
NSString *kArg, *k, *v;
NSUInteger kArgPos;
/* Remove NSArgumentDomain -key value from the arguments */
mutArguments = [NSMutableArray arrayWithArray: newArguments];
/* Remove NSArgumentDomain '-key value' from the arguments */
cliArguments = [[NSUserDefaults standardUserDefaults]
volatileDomainForName:NSArgumentDomain];
keys = [cliArguments allKeys];
@ -93,27 +95,33 @@
{
k = [keys objectAtIndex: i];
v = [cliArguments objectForKey:k];
argPair = [NSString stringWithFormat:@"-%@ %@", k, v];
argsString = [argsString stringByReplacingOccurrencesOfString: argPair
withString: @""];
}
if ([argsString length])
{
/* dance to compact whitespace */
NSMutableArray *words = [NSMutableArray array];
wordsWP = [argsString componentsSeparatedByCharactersInSet:
[NSCharacterSet whitespaceCharacterSet]];
for (i=0; i < [wordsWP count]; i++)
{
v = [wordsWP objectAtIndex: i];
if([v length] > 1)
/* -p will be 'p' in NSArgumentDomain */
kArg = [NSString stringWithFormat:@"-%@", k];
kArgPos = [mutArguments indexOfObject: kArg];
if (kArgPos != NSNotFound)
{
/* Remove arguments at kArgPos+1 and kArgPos
* if their sequence matches that of the ArgumentDomain data: -k v
*/
if (kArgPos < ([mutArguments count] - 1) &&
[[mutArguments objectAtIndex: kArgPos+1] isEqualToString: v])
{
[words addObject:v];
[mutArguments removeObjectAtIndex: kArgPos+1];
[mutArguments removeObjectAtIndex: kArgPos];
}
else
{
/* this should not happen unless the argument is the last one */
[mutArguments removeObjectAtIndex: kArgPos];
}
}
argsString = [words componentsJoinedByString:@" "];
ASSIGN (sanitizedArguments, [argsString componentsSeparatedByString:@" "]);
}
if ([mutArguments count])
{
ASSIGN (sanitizedArguments, mutArguments);
}
else
{

View File

@ -180,7 +180,7 @@
- (BOOL) run
{
NSError *err;
NSData *credsData;
NSRange r;
NSString *creds, *credsFile, *authname, *authpwd;
BOOL rc;
@ -195,15 +195,17 @@
credsFile = [[NSUserDefaults standardUserDefaults] stringForKey: @"p"];
if (credsFile)
{
creds = [NSString stringWithContentsOfFile: credsFile
encoding: NSUTF8StringEncoding
error: &err];
if (!creds)
credsData = [NSData dataWithContentsOfFile: credsFile];
if (credsData == nil)
{
NSLog(@"Error reading credential file '%@': %@", credsFile, err);
NSLog(@"Error reading credential file '%@'", credsFile);
return NO;
}
creds = [creds stringByTrimmingCharactersInSet:
[NSCharacterSet newlineCharacterSet]];
creds = [[NSString alloc] initWithData: credsData
encoding: NSUTF8StringEncoding];
[creds autorelease];
creds = [creds stringByTrimmingCharactersInSet:
[NSCharacterSet characterSetWithCharactersInString: @"\r\n"]];
}
if (max > 0)

View File

@ -109,25 +109,30 @@ typedef enum
[theKey caseInsensitiveCompare: @"Vacation"] == NSOrderedSame)
{
/* credentials file handling */
NSData *credsData;
NSRange r;
NSString *credsFile, *creds, *authname, *authpwd;
authname = nil;
authpwd = nil;
credsFile = [[NSUserDefaults standardUserDefaults] stringForKey: @"p"];
if (credsFile)
{
/* TODO: add back support for user:pwd here? */
creds = [NSString stringWithContentsOfFile: credsFile
encoding: NSUTF8StringEncoding
error: NULL];
if (creds == nil)
credsData = [NSData dataWithContentsOfFile: credsFile];
if (credsData == nil)
{
NSLog(@"Error reading credential file '%@'", credsFile);
return NO;
}
creds = [creds stringByTrimmingCharactersInSet:
[NSCharacterSet newlineCharacterSet]];
creds = [[NSString alloc] initWithData: credsData
encoding: NSUTF8StringEncoding];
[creds autorelease];
creds = [creds stringByTrimmingCharactersInSet:
[NSCharacterSet characterSetWithCharactersInString: @"\r\n"]];
r = [creds rangeOfString: @":"];
authname = [creds substringToIndex: r.location];
authpwd = [creds substringFromIndex: r.location+1];

View File

@ -291,3 +291,6 @@
"cannot send message: (smtp) all recipients discarded" = "Não é possível enviar a mensagem: todos os destinatários são inválidos.";
"cannot send message (smtp) - recipients discarded:" = "Não é possível enviar a mensagem. Os seguintes endereços estão inválidos:";
"cannot send message: (smtp) error when connecting" = "Não é possível enviar a mensagem: erro ao conectar ao servidor SMTP.";
"Name" = "Nome";
"Email" = "Email";

View File

@ -291,3 +291,6 @@
"cannot send message: (smtp) all recipients discarded" = "No s'ha pogut enviar el missatge: tots els destinataris són incorrectes.";
"cannot send message (smtp) - recipients discarded:" = "No s'ha pogut enviar el missatge. Les següents adreces són incorrectes:";
"cannot send message: (smtp) error when connecting" = "No s'ha pogut enviar el missatge. Error al connectar amb el servidor SMTP.";
"Name" = "Nom";
"Email" = "Correu electrònic";

View File

@ -291,3 +291,6 @@
"cannot send message: (smtp) all recipients discarded" = "Zprávu nelze odeslat: adresy všech příjemců jsou neplatné.";
"cannot send message (smtp) - recipients discarded:" = "Zprávu nelze odeslat: následující adresy jsou neplatné:";
"cannot send message: (smtp) error when connecting" = "Zprávu nelze odeslat: při spojení se SMTP serverem došlo k chybě.";
"Name" = "Jméno";
"Email" = "E-mail";

View File

@ -293,3 +293,6 @@ Bemærk:. Denne kvittering anerkender kun, at budskabet blev vist på modtageren
"cannot send message: (smtp) all recipients discarded" = "Kan ikke sende besked: alle modtagere er ugyldige.";
"cannot send message (smtp) - recipients discarded:" = "Kan ikke sende besked. Følgende adresser er ugyldige:";
"cannot send message: (smtp) error when connecting" = "Kan ikke sende besked: Fejl ved oprettelse til SMTP-server.";
"Name" = "Navn";
"Email" = "E-mail";

View File

@ -291,3 +291,6 @@
"cannot send message: (smtp) all recipients discarded" = "Kan bericht niet sturen: alle ontvangers zijn ongeldig.";
"cannot send message (smtp) - recipients discarded:" = "Kan bericht niet sturen: de volgende adressen zijn ongeldig:";
"cannot send message: (smtp) error when connecting" = "Kan bericht niet sturen: fout bij verbinden met de SMTP server.";
"Name" = "Naam";
"Email" = "E-mail";

View File

@ -259,7 +259,6 @@
"Please select only one message to print." = "Please select only one message to print.";
"The message you have selected doesn't exist anymore." = "The message you have selected doesn't exist anymore.";
"The folder with name \"%{0}\" could not be created."
= "The folder with name \"%{0}\" could not be created.";
"This folder could not be renamed to \"%{0}\"."
@ -291,3 +290,7 @@
"cannot send message: (smtp) all recipients discarded" = "Cannot send message: all recipients are invalid.";
"cannot send message (smtp) - recipients discarded:" = "Cannot send message. The following addresses are invalid:";
"cannot send message: (smtp) error when connecting" = "Cannot send message: error when connecting to the SMTP server.";
/* Contacts list in mail editor */
"Email" = "Email";
"Name" = "Name";

View File

@ -291,3 +291,6 @@
"cannot send message: (smtp) all recipients discarded" = "Viestiä ei voi lähettää: kaikki vastaanottajat ovat virheellisiä.";
"cannot send message (smtp) - recipients discarded:" = "Viestiä ei voi lähettää: seuraavat osoitteet ovat virheellisiä:";
"cannot send message: (smtp) error when connecting" = "Viestiä ei voi lähettää: virhe yhdistettäessä SMTP -palvelimeen.";
"Name" = "Nimi";
"Email" = "Sähköposti";

View File

@ -291,3 +291,6 @@
"cannot send message: (smtp) all recipients discarded" = "Le message n'a pas pu être envoyé car aucune adresse n'est valide.";
"cannot send message (smtp) - recipients discarded:" = "Le message n'a pas pu être envoyé car les adresses suivantes sont invalides :";
"cannot send message: (smtp) error when connecting" = "Le message n'a pas pu être envoyé: une erreur est survenue en tentant de rejoindre le serveur SMTP.";
"Name" = "Identité";
"Email" = "Adresse électronique";

View File

@ -291,3 +291,6 @@
"cannot send message: (smtp) all recipients discarded" = "Kann Nachricht nicht versenden: Alle Empfänger sind ungültig.";
"cannot send message (smtp) - recipients discarded:" = "Kann Nachricht nicht versenden: Die folgenden Addressen sind ungültig:";
"cannot send message: (smtp) error when connecting" = "Kann Nachricht nicht versenden: Fehler beim Verbinden mit dem SMTP-Server.";
"Name" = "Name";
"Email" = "E-Mail";

View File

@ -291,3 +291,6 @@
"cannot send message: (smtp) all recipients discarded" = "Az üzenetet nem lehetett elküldeni: az összes címzett érvénytelen.";
"cannot send message (smtp) - recipients discarded:" = "Az üzenetet nem lehetett elküldeni: az alábbi címzettek érvénytelenek:";
"cannot send message: (smtp) error when connecting" = "Az üzenetet nem lehetett elküldeni: hiba az SMTP kiszolgálóhoz történő csatlakozáskor.";
"Name" = "Név";
"Email" = "Email";

View File

@ -289,3 +289,6 @@
"cannot send message: (smtp) all recipients discarded" = "Ekki var hægt að senda tölvubréfið: enginn gildur móttakandi.";
"cannot send message (smtp) - recipients discarded:" = "Ekki var hægt að senda tölvubréfið: Eftirfarandi móttakendur eru ógildir:";
"cannot send message: (smtp) error when connecting" = "Ekki var hægt að senda tölvubréfið: ekki tókst að tengjast SMTP póstþjóni.";
"Name" = "Nafn";
"Email" = "Tölvupóstur";

View File

@ -291,3 +291,6 @@
"cannot send message: (smtp) all recipients discarded" = "Impossibile inviare il messaggio: tutti i destinatari non sono validi.";
"cannot send message (smtp) - recipients discarded:" = "Impossibile inviare il messaggio. Il seguente indirizzo non è valido:";
"cannot send message: (smtp) error when connecting" = "Impossibile inviare il messaggio: si è verificato un errore durante la connessione al server SMTP.";
"Name" = "Nome";
"Email" = "Email";

View File

@ -291,3 +291,6 @@
"cannot send message: (smtp) all recipients discarded" = "Kan ikke sende melding: alle mottakeradresser er ugyldige.";
"cannot send message (smtp) - recipients discarded:" = "Kan ikke sende melding. Følgende mottakeradresser er ugyldige:";
"cannot send message: (smtp) error when connecting" = "Kan ikke sende melding: problem med å prate med SMTP-tjener.";
"Name" = "Navn";
"Email" = "E-post";

View File

@ -289,3 +289,6 @@
"cannot send message: (smtp) all recipients discarded" = "Cannot send message: all recipients are invalid.";
"cannot send message (smtp) - recipients discarded:" = "Cannot send message. The following addresses are invalid:";
"cannot send message: (smtp) error when connecting" = "Cannot send message: error when connecting to the SMTP server.";
"Name" = "Navn";
"Email" = "E-post";

View File

@ -291,3 +291,6 @@
"cannot send message: (smtp) all recipients discarded" = "Nie można wysłać wiadomości - wszyscy odbiorcy zostali odrzuceni.";
"cannot send message (smtp) - recipients discarded:" = "Nie można wysłać wiadomości - poniźsi odbiorcy zostali odrzuceni:";
"cannot send message: (smtp) error when connecting" = "Nie można wysłać wiadomości - błąd połączenia z serwerem SMTP";
"Name" = "Nazwa";
"Email" = "E-mail";

View File

@ -291,3 +291,6 @@
"cannot send message: (smtp) all recipients discarded" = "Не удается отправить сообщение: всем получателям, все получатели являются недействительными.";
"cannot send message (smtp) - recipients discarded:" = "Не удается отправить сообщение. Следующие адреса неверны:";
"cannot send message: (smtp) error when connecting" = "Не удается отправить сообщение: ошибка при соединении с сервером SMTP.";
"Name" = "ПолноеИмя";
"Email" = "Email";

View File

@ -291,3 +291,6 @@
"cannot send message: (smtp) all recipients discarded" = "Správa sa nedá odoslať: žiadny príjemca nie je platný.";
"cannot send message (smtp) - recipients discarded:" = "Správa sa nedá odoslať: Nasledujúci príjemcovia nemajú platnú adresu:";
"cannot send message: (smtp) error when connecting" = "Správa sa nedá odoslať: chyba pri pripájaní na SMTP server.";
"Name" = "Meno";
"Email" = "Email";

View File

@ -291,3 +291,6 @@
"cannot send message: (smtp) all recipients discarded" = "No se puede enviar el mensaje: (smtp) todos los destinatarios han sido descartados";
"cannot send message (smtp) - recipients discarded:" = "No se puede enviar el mensaje: (smtp) destinatarios descartados:";
"cannot send message: (smtp) error when connecting" = "No se puede enviar el mensaje: (smtp) error de conexión";
"Name" = "Nombre Completo";
"Email" = "Correo";

View File

@ -291,3 +291,6 @@
"cannot send message: (smtp) all recipients discarded" = "No se puede enviar el mensaje: (smtp) todos los destinatarios han sido descartados";
"cannot send message (smtp) - recipients discarded:" = "No se puede enviar el mensaje: (smtp) destinatarios descartados:";
"cannot send message: (smtp) error when connecting" = "No se puede enviar el mensaje: (smtp) error de conexión";
"Name" = "Nombre Completo";
"Email" = "Correo";

View File

@ -289,3 +289,6 @@
"cannot send message: (smtp) all recipients discarded" = "Meddelandet kan inte skickas: alla mottagaradresserna är felaktiga.";
"cannot send message (smtp) - recipients discarded:" = "Meddelandet kan inte skickas. Följande mottagaradresser är felaktiga:";
"cannot send message: (smtp) error when connecting" = "Meddelandet kan inte skickas: ett fel uppstod i uppkopplingen mot SMTP servern.";
"Name" = "Namn";
"Email" = "E-post";

View File

@ -291,3 +291,6 @@
"cannot send message: (smtp) all recipients discarded" = "Помилка під час відправлення повідомлення: некоректні адреси всіх отримувачів.";
"cannot send message (smtp) - recipients discarded:" = "Помила під час відправлення повідомлення: такі адреси некоректні:";
"cannot send message: (smtp) error when connecting" = "Помилка під час відправлення повідомлення: SMTP-сервер не відповідає.";
"Name" = "Ім’я";
"Email" = "Електронна пошта";

View File

@ -289,3 +289,6 @@
"cannot send message: (smtp) all recipients discarded" = "Cannot send message: all recipients are invalid.";
"cannot send message (smtp) - recipients discarded:" = "Cannot send message. The following addresses are invalid:";
"cannot send message: (smtp) error when connecting" = "Cannot send message: error when connecting to the SMTP server.";
"Name" = "Enw";
"Email" = "Ebost";

View File

@ -152,8 +152,8 @@
var:categories="currentContact.c_categories"
var:id="currentContact.c_name"
var:contactname="currentContact.c_cn">
<td class="displayName"><var:string value="currentContact.c_cn" const:escapeHTML="YES" /></td>
<td><var:string value="currentContact.c_mail"/></td>
<td class="displayName" var:title="currentContact.c_cn"><var:string value="currentContact.c_cn" const:escapeHTML="YES" /></td>
<td var:title="currentContact.c_mail"><var:string value="currentContact.c_mail"/></td>
<td><var:string value="currentContact.c_screenname"/></td>
<td><var:string value="currentContact.c_o"/></td>
<td><var:string value="currentContact.c_telephonenumber"/></td>

View File

@ -1,42 +0,0 @@
<?xml version='1.0' standalone='yes'?>
<!DOCTYPE container>
<container
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:label="OGo:label"
xmlns:rsrc="OGo:url">
<table id="contactsList" cellspacing="0">
<thead>
<tr class="tableview">
<!-- localize -->
<td class="tbtv_headercell sortableTableHeader" id="nameHeader"
><var:string label:value="Name"
/></td
><td class="tbtv_headercell sortableTableHeader" id="mailHeader"
><var:string label:value="Email"/></td
><td class="tbtv_headercell sortableTableHeader" id="screenNameHeader"
><var:string label:value="Screen Name" /></td
><td class="tbtv_headercell sortableTableHeader" id="orgHeader"
><var:string label:value="Organization" /></td
><td class="tbtv_headercell sortableTableHeader" id="phoneHeader"
><var:string label:value="Preferred Phone" /></td
></tr>
</thead>
<tbody id="contactsListTbody">
<var:foreach list="contactInfos" item="currentContact">
<tr var:class="currentContactClasses"
var:categories="currentContact.c_categories"
var:id="currentContact.c_name"
var:contactname="currentContact.c_cn">
<td class="displayName"><var:string value="currentContact.c_cn" const:escapeHTML="YES" /></td>
<td><var:string value="currentContact.c_mail"/></td>
<td><var:string value="currentContact.c_screenname"/></td>
<td><var:string value="currentContact.c_o"/></td>
<td><var:string value="currentContact.c_telephonenumber"/></td>
</tr>
</var:foreach>
</tbody>
</table>
</container>

View File

@ -77,7 +77,9 @@ function contactsListCallback(http) {
row.setAttribute("contactname", contact["c_cn"]);
var cells = row.getElementsByTagName("TD");
$(cells[0]).update(contact["c_cn"]);
cells[0].title = contact["c_cn"];
$(cells[1]).update(contact["c_mail"]);
cells[1].title = contact["c_mail"];
if (fullView) {
$(cells[2]).update(contact["c_screenname"]);
$(cells[3]).update(contact["c_o"]);

View File

@ -178,7 +178,7 @@ function openRightsForUserID(userID) {
function openRightsForUser(button) {
var nodes = $("userList").getSelectedRows();
if (nodes.length > 0)
openRightsForUserID(nodes[0].getAttribute("id").unescapeHTML());
openRightsForUserID(nodes[0].id.unescapeHTML());
return false;
}
@ -198,7 +198,7 @@ function onAclLoadHandler() {
if (input) {
defaultUserID = $("defaultUserID").value;
var userNode = nodeForUser(_("Any Authenticated User"),
defaultUserID);
defaultUserID.escapeHTML());
userNode.addClassName("any-user");
userNode.setAttribute("title",
_("Any user not listed above"));

View File

@ -200,9 +200,7 @@ function onComponentEditorLoad(event) {
if (tmp) {
var menuItems = tmp.childNodesWithTag("li");
for (var i = 0; i < menuItems.length; i++)
menuItems[i].on("mousedown",
onMenuSetClassification.bindAsEventListener(menuItems[i]),
false);
menuItems[i].on("mousedown", onMenuSetClassification);
}
tmp = $("replyList");

View File

@ -121,7 +121,7 @@ function onValidate(onSuccess) {
showAlertDialog(_("error_missingrecipients"));
}
else if (document.pageform.subject.value == "") {
showConfirmDialog(_("Warning"), _("error_missingsubject"), onValidateDone.bind(this, onSuccess), null, _("Send anyway"), _("Cancel"));
showConfirmDialog(_("Warning"), _("error_missingsubject"), onValidateDone.bind(this, onSuccess), null, _("Send Anyway"), _("Cancel"));
}
else {
onValidateDone(onSuccess);

View File

@ -17,15 +17,17 @@ function savePreferences(sender) {
serializeContactsCategories();
}
if (mailCustomFromEnabled && !emailRE.test($("email").value)) {
if (typeof mailCustomFromEnabled !== "undefined" && !emailRE.test($("email").value)) {
showAlertDialog(_("Please specify a valid sender address."));
sendForm = false;
}
var replyTo = $("replyTo").value;
if (!replyTo.blank() && !emailRE.test(replyTo)) {
showAlertDialog(_("Please specify a valid reply-to address."));
sendForm = false;
if ($("replyTo")) {
var replyTo = $("replyTo").value;
if (!replyTo.blank() && !emailRE.test(replyTo)) {
showAlertDialog(_("Please specify a valid reply-to address."));
sendForm = false;
}
}
if ($("dayStartTime")) {
@ -205,7 +207,8 @@ function initPreferences() {
$("contactsCategoryDelete").observe("click", onContactsCategoryDelete);
}
onReplyPlacementListChange();
if ($("replyPlacementList"))
onReplyPlacementListChange();
var button = $("addDefaultEmailAddresses");
if (button)
@ -216,7 +219,8 @@ function initPreferences() {
button.observe("click", onChangePasswordClick);
initSieveFilters();
initMailAccounts();
if ($('mailOptionsView'))
initMailAccounts();
button = $("enableVacationEndDate");
if (button) {

View File

@ -1238,7 +1238,7 @@ function popupToolbarMenu(node, menuId) {
visibility: "visible" });
document.currentPopupMenu = popup;
$(document.body).observe("mouseup", onBodyClickMenuHandler);
$(document.body).on("mouseup", onBodyClickMenuHandler);
}
/* contact selector */

View File

@ -4,4 +4,4 @@
MAJOR_VERSION=2
MINOR_VERSION=0
SUBMINOR_VERSION=4a
SUBMINOR_VERSION=4b