diff --git a/ChangeLog b/ChangeLog index 9145147ad..578da8c9d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,186 @@ +commit 6913502810ec21479889c4ecf0a393de5ede2635 +Author: Francis Lachapelle +Date: Mon Feb 4 14:22:37 2013 -0500 + + Bump version to 2.0.4b + +M NEWS +M Version + +commit 24971070f6f7e94629ff7bfc142d8194f7a19296 +Author: Jean Raby +Date: Mon Feb 4 14:03:28 2013 -0500 + + Updated NEWS + +M NEWS + +commit 3d90e3a5393ff45b4915a1c915edd4c24b21763c +Author: Jean Raby +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 +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 +Date: Sun Feb 3 20:42:20 2013 -0500 + + Update NEWS file + +M NEWS + +commit e34ba5689cb2d816c6b353485ea274c95ba8983a +Author: Francis Lachapelle +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 +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 +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 +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 +Date: Fri Feb 1 10:40:59 2013 -0500 + + news file update for 2.0.4b + +M NEWS + +commit 225a28258f1b33e594172b7ca61c8751f6c5e4f9 +Author: Jean Raby +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 +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 +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 +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 +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 +Date: Wed Jan 30 08:52:32 2013 -0500 + + Update ChangeLog + +M ChangeLog + commit 321675ba99288b036677242ada3bfb0cb945970c Author: Francis Lachapelle 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 +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 +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 +Date: Thu Jan 24 20:35:03 2013 -0500 + + whitespace - tabkill + +M SoObjects/SOGo/SOGoSystemDefaults.m + commit 9ed53cbab3365d3d2e0a9d2c1dc8a6141d185f0f Author: Francis Lachapelle Date: Thu Jan 24 18:50:20 2013 -0500 diff --git a/NEWS b/NEWS index 20a6ba973..4e8d5eb2f 100644 --- a/NEWS +++ b/NEWS @@ -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) ------------------ diff --git a/SoObjects/SOGo/NSString+Utilities.m b/SoObjects/SOGo/NSString+Utilities.m index 5a37812b3..768cae86f 100644 --- a/SoObjects/SOGo/NSString+Utilities.m +++ b/SoObjects/SOGo/NSString+Utilities.m @@ -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 diff --git a/SoObjects/SOGo/SOGoSystemDefaults.m b/SoObjects/SOGo/SOGoSystemDefaults.m index 31f96f02c..4f5c5651a 100644 --- a/SoObjects/SOGo/SOGoSystemDefaults.m +++ b/SoObjects/SOGo/SOGoSystemDefaults.m @@ -29,6 +29,7 @@ #import #import #import +#import #import #import @@ -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"]; diff --git a/SoObjects/SOGo/SOGoWebAuthenticator.m b/SoObjects/SOGo/SOGoWebAuthenticator.m index cfe2482f0..a4e722811 100644 --- a/SoObjects/SOGo/SOGoWebAuthenticator.m +++ b/SoObjects/SOGo/SOGoWebAuthenticator.m @@ -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]; diff --git a/Tools/SOGoTool.m b/Tools/SOGoTool.m index b3c5df7f8..99cbc2b3b 100644 --- a/Tools/SOGoTool.m +++ b/Tools/SOGoTool.m @@ -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 { diff --git a/Tools/SOGoToolExpireAutoReply.m b/Tools/SOGoToolExpireAutoReply.m index 08ae18487..5e65e6a82 100644 --- a/Tools/SOGoToolExpireAutoReply.m +++ b/Tools/SOGoToolExpireAutoReply.m @@ -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) diff --git a/Tools/SOGoToolUserPreferences.m b/Tools/SOGoToolUserPreferences.m index 7f5c6d99b..39118e777 100644 --- a/Tools/SOGoToolUserPreferences.m +++ b/Tools/SOGoToolUserPreferences.m @@ -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]; diff --git a/UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings b/UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings index 3a8455768..7ba9903a5 100644 --- a/UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings +++ b/UI/MailerUI/BrazilianPortuguese.lproj/Localizable.strings @@ -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"; diff --git a/UI/MailerUI/Catalan.lproj/Localizable.strings b/UI/MailerUI/Catalan.lproj/Localizable.strings index 49f1ae897..1543d6d5b 100644 --- a/UI/MailerUI/Catalan.lproj/Localizable.strings +++ b/UI/MailerUI/Catalan.lproj/Localizable.strings @@ -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"; diff --git a/UI/MailerUI/Czech.lproj/Localizable.strings b/UI/MailerUI/Czech.lproj/Localizable.strings index 0cef2d47d..79886fb13 100644 --- a/UI/MailerUI/Czech.lproj/Localizable.strings +++ b/UI/MailerUI/Czech.lproj/Localizable.strings @@ -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"; diff --git a/UI/MailerUI/Danish.lproj/Localizable.strings b/UI/MailerUI/Danish.lproj/Localizable.strings index cec59b50d..e6278659d 100644 --- a/UI/MailerUI/Danish.lproj/Localizable.strings +++ b/UI/MailerUI/Danish.lproj/Localizable.strings @@ -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"; diff --git a/UI/MailerUI/Dutch.lproj/Localizable.strings b/UI/MailerUI/Dutch.lproj/Localizable.strings index 26336acf6..6ec3c1358 100644 --- a/UI/MailerUI/Dutch.lproj/Localizable.strings +++ b/UI/MailerUI/Dutch.lproj/Localizable.strings @@ -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"; diff --git a/UI/MailerUI/English.lproj/Localizable.strings b/UI/MailerUI/English.lproj/Localizable.strings index 4ae64d679..418bd6a49 100644 --- a/UI/MailerUI/English.lproj/Localizable.strings +++ b/UI/MailerUI/English.lproj/Localizable.strings @@ -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"; diff --git a/UI/MailerUI/Finnish.lproj/Localizable.strings b/UI/MailerUI/Finnish.lproj/Localizable.strings index ab0da73b0..db4510da4 100644 --- a/UI/MailerUI/Finnish.lproj/Localizable.strings +++ b/UI/MailerUI/Finnish.lproj/Localizable.strings @@ -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"; diff --git a/UI/MailerUI/French.lproj/Localizable.strings b/UI/MailerUI/French.lproj/Localizable.strings index 83207bcef..98a47adbf 100644 --- a/UI/MailerUI/French.lproj/Localizable.strings +++ b/UI/MailerUI/French.lproj/Localizable.strings @@ -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"; diff --git a/UI/MailerUI/German.lproj/Localizable.strings b/UI/MailerUI/German.lproj/Localizable.strings index 2526f9ee7..a5bed3ef0 100644 --- a/UI/MailerUI/German.lproj/Localizable.strings +++ b/UI/MailerUI/German.lproj/Localizable.strings @@ -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"; diff --git a/UI/MailerUI/Hungarian.lproj/Localizable.strings b/UI/MailerUI/Hungarian.lproj/Localizable.strings index cdf547833..50234cbd5 100644 --- a/UI/MailerUI/Hungarian.lproj/Localizable.strings +++ b/UI/MailerUI/Hungarian.lproj/Localizable.strings @@ -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"; diff --git a/UI/MailerUI/Icelandic.lproj/Localizable.strings b/UI/MailerUI/Icelandic.lproj/Localizable.strings index 4021e1bd3..a6f949997 100644 --- a/UI/MailerUI/Icelandic.lproj/Localizable.strings +++ b/UI/MailerUI/Icelandic.lproj/Localizable.strings @@ -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"; diff --git a/UI/MailerUI/Italian.lproj/Localizable.strings b/UI/MailerUI/Italian.lproj/Localizable.strings index d59346bba..138c23a80 100644 --- a/UI/MailerUI/Italian.lproj/Localizable.strings +++ b/UI/MailerUI/Italian.lproj/Localizable.strings @@ -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"; diff --git a/UI/MailerUI/NorwegianBokmal.lproj/Localizable.strings b/UI/MailerUI/NorwegianBokmal.lproj/Localizable.strings index e4bb653c1..4b4aa2ada 100644 --- a/UI/MailerUI/NorwegianBokmal.lproj/Localizable.strings +++ b/UI/MailerUI/NorwegianBokmal.lproj/Localizable.strings @@ -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"; diff --git a/UI/MailerUI/NorwegianNynorsk.lproj/Localizable.strings b/UI/MailerUI/NorwegianNynorsk.lproj/Localizable.strings index 96e5dcfeb..78ed3e9ec 100644 --- a/UI/MailerUI/NorwegianNynorsk.lproj/Localizable.strings +++ b/UI/MailerUI/NorwegianNynorsk.lproj/Localizable.strings @@ -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"; diff --git a/UI/MailerUI/Polish.lproj/Localizable.strings b/UI/MailerUI/Polish.lproj/Localizable.strings index ec70ec4ac..532e9db38 100644 --- a/UI/MailerUI/Polish.lproj/Localizable.strings +++ b/UI/MailerUI/Polish.lproj/Localizable.strings @@ -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"; diff --git a/UI/MailerUI/Russian.lproj/Localizable.strings b/UI/MailerUI/Russian.lproj/Localizable.strings index e4410cf5d..b09c4ec0b 100644 --- a/UI/MailerUI/Russian.lproj/Localizable.strings +++ b/UI/MailerUI/Russian.lproj/Localizable.strings @@ -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"; diff --git a/UI/MailerUI/Slovak.lproj/Localizable.strings b/UI/MailerUI/Slovak.lproj/Localizable.strings index e5c19b951..e6baeee7b 100644 --- a/UI/MailerUI/Slovak.lproj/Localizable.strings +++ b/UI/MailerUI/Slovak.lproj/Localizable.strings @@ -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"; diff --git a/UI/MailerUI/SpanishArgentina.lproj/Localizable.strings b/UI/MailerUI/SpanishArgentina.lproj/Localizable.strings index 98f2bcb19..5166a2a7e 100644 --- a/UI/MailerUI/SpanishArgentina.lproj/Localizable.strings +++ b/UI/MailerUI/SpanishArgentina.lproj/Localizable.strings @@ -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"; diff --git a/UI/MailerUI/SpanishSpain.lproj/Localizable.strings b/UI/MailerUI/SpanishSpain.lproj/Localizable.strings index f7cfe8f7d..a07103840 100644 --- a/UI/MailerUI/SpanishSpain.lproj/Localizable.strings +++ b/UI/MailerUI/SpanishSpain.lproj/Localizable.strings @@ -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"; diff --git a/UI/MailerUI/Swedish.lproj/Localizable.strings b/UI/MailerUI/Swedish.lproj/Localizable.strings index 7ac70600d..d78d968ef 100644 --- a/UI/MailerUI/Swedish.lproj/Localizable.strings +++ b/UI/MailerUI/Swedish.lproj/Localizable.strings @@ -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"; diff --git a/UI/MailerUI/Ukrainian.lproj/Localizable.strings b/UI/MailerUI/Ukrainian.lproj/Localizable.strings index 905f2ea1d..86bf825cf 100644 --- a/UI/MailerUI/Ukrainian.lproj/Localizable.strings +++ b/UI/MailerUI/Ukrainian.lproj/Localizable.strings @@ -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" = "Електронна пошта"; diff --git a/UI/MailerUI/Welsh.lproj/Localizable.strings b/UI/MailerUI/Welsh.lproj/Localizable.strings index c42752a34..f30090f6a 100644 --- a/UI/MailerUI/Welsh.lproj/Localizable.strings +++ b/UI/MailerUI/Welsh.lproj/Localizable.strings @@ -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"; diff --git a/UI/Templates/ContactsUI/UIxContactFoldersView.wox b/UI/Templates/ContactsUI/UIxContactFoldersView.wox index 6e63c2d89..5bf6d92d9 100644 --- a/UI/Templates/ContactsUI/UIxContactFoldersView.wox +++ b/UI/Templates/ContactsUI/UIxContactFoldersView.wox @@ -152,8 +152,8 @@ var:categories="currentContact.c_categories" var:id="currentContact.c_name" var:contactname="currentContact.c_cn"> - - + + diff --git a/UI/Templates/ContactsUI/UIxContactsListView.wox b/UI/Templates/ContactsUI/UIxContactsListView.wox deleted file mode 100644 index 427917de5..000000000 --- a/UI/Templates/ContactsUI/UIxContactsListView.wox +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - -
-
diff --git a/UI/WebServerResources/ContactsUI.js b/UI/WebServerResources/ContactsUI.js index 07f967ef0..644f9c145 100644 --- a/UI/WebServerResources/ContactsUI.js +++ b/UI/WebServerResources/ContactsUI.js @@ -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"]); diff --git a/UI/WebServerResources/UIxAclEditor.js b/UI/WebServerResources/UIxAclEditor.js index 035e6ecee..b586c475d 100644 --- a/UI/WebServerResources/UIxAclEditor.js +++ b/UI/WebServerResources/UIxAclEditor.js @@ -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")); diff --git a/UI/WebServerResources/UIxComponentEditor.js b/UI/WebServerResources/UIxComponentEditor.js index 88c564eec..1077fc5f0 100644 --- a/UI/WebServerResources/UIxComponentEditor.js +++ b/UI/WebServerResources/UIxComponentEditor.js @@ -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"); diff --git a/UI/WebServerResources/UIxMailEditor.js b/UI/WebServerResources/UIxMailEditor.js index b027c98e3..cd9b918c3 100644 --- a/UI/WebServerResources/UIxMailEditor.js +++ b/UI/WebServerResources/UIxMailEditor.js @@ -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); diff --git a/UI/WebServerResources/UIxPreferences.js b/UI/WebServerResources/UIxPreferences.js index 73d69539e..7c902f6e5 100644 --- a/UI/WebServerResources/UIxPreferences.js +++ b/UI/WebServerResources/UIxPreferences.js @@ -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) { diff --git a/UI/WebServerResources/generic.js b/UI/WebServerResources/generic.js index 70c0e9e15..04b67c9fb 100644 --- a/UI/WebServerResources/generic.js +++ b/UI/WebServerResources/generic.js @@ -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 */ diff --git a/Version b/Version index 4c919a41e..0dc7bb82d 100644 --- a/Version +++ b/Version @@ -4,4 +4,4 @@ MAJOR_VERSION=2 MINOR_VERSION=0 -SUBMINOR_VERSION=4a +SUBMINOR_VERSION=4b