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 commit 321675ba99288b036677242ada3bfb0cb945970c
Author: Francis Lachapelle <flachapelle@inverse.ca> Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Wed Jan 30 08:51:10 2013 -0500 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 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 commit 9ed53cbab3365d3d2e0a9d2c1dc8a6141d185f0f
Author: Francis Lachapelle <flachapelle@inverse.ca> Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Thu Jan 24 18:50:20 2013 -0500 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) 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: @"\"" withString: @"\\\""];
[representation replaceString: @"/" withString: @"\\/"]; [representation replaceString: @"/" withString: @"\\/"];
[representation replaceString: @"\b" withString: @"\\b"];
[representation replaceString: @"\f" withString: @"\\f"]; [representation replaceString: @"\f" withString: @"\\f"];
[representation replaceString: @"\n" withString: @"\\n"]; [representation replaceString: @"\n" withString: @"\\n"];
[representation replaceString: @"\r" withString: @"\\r"]; [representation replaceString: @"\r" withString: @"\\r"];
@ -271,7 +270,33 @@ static int cssEscapingCount;
- (NSString *) jsonRepresentation - (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 - (void) _setupCSSEscaping

View File

@ -29,6 +29,7 @@
#import <Foundation/NSBundle.h> #import <Foundation/NSBundle.h>
#import <Foundation/NSFileManager.h> #import <Foundation/NSFileManager.h>
#import <Foundation/NSFileManager.h> #import <Foundation/NSFileManager.h>
#import <Foundation/NSDictionary.h>
#import <Foundation/NSUserDefaults.h> #import <Foundation/NSUserDefaults.h>
#import <NGExtensions/NSObject+Logs.h> #import <NGExtensions/NSObject+Logs.h>
@ -62,29 +63,14 @@ BootstrapNSUserDefaults ()
if (handle) if (handle)
{ {
SOGoNSUserDefaultsBootstrap = dlsym (handle, SOGoNSUserDefaultsBootstrap = dlsym (handle,
"SOGoNSUserDefaultsBootstrap"); "SOGoNSUserDefaultsBootstrap");
if (SOGoNSUserDefaultsBootstrap) if (SOGoNSUserDefaultsBootstrap)
SOGoNSUserDefaultsBootstrap (); SOGoNSUserDefaultsBootstrap ();
} }
} }
static void static void
_migrateSOGo09Configuration (NSUserDefaults *ud, NSObject *logger) _injectConfigurationFromFile (NSMutableDictionary *defaultsDict,
{
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,
NSString *filename, NSObject *logger) NSString *filename, NSObject *logger)
{ {
NSDictionary *newConfig, *fileAttrs; NSDictionary *newConfig, *fileAttrs;
@ -94,14 +80,14 @@ _injectConfigurationFromFile (NSUserDefaults *ud,
if ([fm fileExistsAtPath: filename]) if ([fm fileExistsAtPath: filename])
{ {
fileAttrs = [fm fileAttributesAtPath: filename fileAttrs = [fm fileAttributesAtPath: filename
traverseLink: YES]; traverseLink: YES];
if (![fileAttrs objectForKey: @"NSFileSize"]) if (![fileAttrs objectForKey: @"NSFileSize"])
{ {
[logger errorWithFormat: [logger errorWithFormat:
@"Can't get file attributes from '%@'", @"Can't get file attributes from '%@'",
filename]; filename];
exit(1); exit(1);
} }
if ([[fileAttrs objectForKey: @"NSFileSize"] intValue] == 0 ) if ([[fileAttrs objectForKey: @"NSFileSize"] intValue] == 0 )
{ {
[logger warnWithFormat: [logger warnWithFormat:
@ -112,7 +98,7 @@ _injectConfigurationFromFile (NSUserDefaults *ud,
{ {
newConfig = [NSDictionary dictionaryWithContentsOfFile: filename]; newConfig = [NSDictionary dictionaryWithContentsOfFile: filename];
if (newConfig) if (newConfig)
[ud registerDefaults: newConfig]; [defaultsDict addEntriesFromDictionary: newConfig];
else else
{ {
[logger errorWithFormat: [logger errorWithFormat:
@ -126,6 +112,35 @@ _injectConfigurationFromFile (NSUserDefaults *ud,
+ (void) prepareUserDefaults + (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; NSUserDefaults *ud;
SOGoStartupLogger *logger; SOGoStartupLogger *logger;
NSBundle *bundle; NSBundle *bundle;
@ -136,28 +151,41 @@ _injectConfigurationFromFile (NSUserDefaults *ud,
logger = [SOGoStartupLogger sharedLogger]; 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]; ud = [NSUserDefaults standardUserDefaults];
/* if "sogod" does not exist, maybe "sogod-0.9" still exists from an old /* Populate configFromFiles with default values from SOGoDefaults.plist */
configuration */ configFromFiles = [NSMutableDictionary dictionaryWithCapacity:0];
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 */
bundle = [NSBundle bundleForClass: self]; bundle = [NSBundle bundleForClass: self];
filename = [bundle pathForResource: @"SOGoDefaults" ofType: @"plist"]; filename = [bundle pathForResource: @"SOGoDefaults" ofType: @"plist"];
if (filename) if (filename)
_injectConfigurationFromFile (ud, filename, logger); _injectConfigurationFromFile (configFromFiles, filename, logger);
/* fill the possibly missing values with the configuration stored /* Fill/Override configFromFiles values with configuration stored
in "/etc" */ * in "/etc" */
for (count = 0; count < sizeof(confFiles)/sizeof(confFiles[0]); count++) 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 */ /* issue a warning if WOApplicationRedirectURL is used */
redirectURL = [ud stringForKey: @"WOApplicationRedirectURL"]; redirectURL = [ud stringForKey: @"WOApplicationRedirectURL"];

View File

@ -55,6 +55,12 @@
#endif #endif
#import "SOGoWebAuthenticator.h" #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 @implementation SOGoWebAuthenticator
+ (id) sharedSOGoWebAuthenticator + (id) sharedSOGoWebAuthenticator
@ -369,8 +375,8 @@
// In memcached, the session key will be associated to the user's password // In memcached, the session key will be associated to the user's password
// which will be XOR'ed with the user key. // which will be XOR'ed with the user key.
// //
sessionKey = [SOGoSession generateKeyForLength: 16]; sessionKey = [SOGoSession generateKeyForLength: COOKIE_SESSIONKEY_LEN];
userKey = [SOGoSession generateKeyForLength: 64]; userKey = [SOGoSession generateKeyForLength: COOKIE_USERKEY_LEN];
NSString *value = [NSString stringWithFormat: @"%@:%@", username, password]; NSString *value = [NSString stringWithFormat: @"%@:%@", username, password];
securedPassword = [SOGoSession securedValue: value usingKey: userKey]; securedPassword = [SOGoSession securedValue: value usingKey: userKey];

View File

@ -77,15 +77,17 @@
- (void) setSanitizedArguments: (NSArray *) newArguments - (void) setSanitizedArguments: (NSArray *) newArguments
{ {
NSString *argPair, *argsString, *k, *v;
NSDictionary *cliArguments;
NSArray *keys, *wordsWP;
int i; 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] cliArguments = [[NSUserDefaults standardUserDefaults]
volatileDomainForName:NSArgumentDomain]; volatileDomainForName:NSArgumentDomain];
keys = [cliArguments allKeys]; keys = [cliArguments allKeys];
@ -93,27 +95,33 @@
{ {
k = [keys objectAtIndex: i]; k = [keys objectAtIndex: i];
v = [cliArguments objectForKey:k]; 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 else
{ {

View File

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

View File

@ -109,25 +109,30 @@ typedef enum
[theKey caseInsensitiveCompare: @"Vacation"] == NSOrderedSame) [theKey caseInsensitiveCompare: @"Vacation"] == NSOrderedSame)
{ {
/* credentials file handling */ /* credentials file handling */
NSData *credsData;
NSRange r; NSRange r;
NSString *credsFile, *creds, *authname, *authpwd; NSString *credsFile, *creds, *authname, *authpwd;
authname = nil; authname = nil;
authpwd = nil; authpwd = nil;
credsFile = [[NSUserDefaults standardUserDefaults] stringForKey: @"p"]; credsFile = [[NSUserDefaults standardUserDefaults] stringForKey: @"p"];
if (credsFile) if (credsFile)
{ {
/* TODO: add back support for user:pwd here? */ /* TODO: add back support for user:pwd here? */
creds = [NSString stringWithContentsOfFile: credsFile credsData = [NSData dataWithContentsOfFile: credsFile];
encoding: NSUTF8StringEncoding if (credsData == nil)
error: NULL];
if (creds == nil)
{ {
NSLog(@"Error reading credential file '%@'", credsFile); NSLog(@"Error reading credential file '%@'", credsFile);
return NO; 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: @":"]; r = [creds rangeOfString: @":"];
authname = [creds substringToIndex: r.location]; authname = [creds substringToIndex: r.location];
authpwd = [creds substringFromIndex: r.location+1]; 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) 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) - 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."; "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) 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) - 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."; "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) 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) - 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ě."; "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) 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) - 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."; "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) 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) - 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."; "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."; "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 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."
= "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}\"." "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) 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) - 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."; "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) 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) - 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."; "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) 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) - 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."; "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) 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) - 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."; "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) 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) - 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."; "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) 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) - 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."; "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) 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) - 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."; "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) 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) - 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."; "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) 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) - 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."; "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) 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) - 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"; "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) all recipients discarded" = "Не удается отправить сообщение: всем получателям, все получатели являются недействительными.";
"cannot send message (smtp) - recipients discarded:" = "Не удается отправить сообщение. Следующие адреса неверны:"; "cannot send message (smtp) - recipients discarded:" = "Не удается отправить сообщение. Следующие адреса неверны:";
"cannot send message: (smtp) error when connecting" = "Не удается отправить сообщение: ошибка при соединении с сервером SMTP."; "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) 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) - 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."; "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) 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) - 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"; "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) 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) - 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"; "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) 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) - 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."; "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) all recipients discarded" = "Помилка під час відправлення повідомлення: некоректні адреси всіх отримувачів.";
"cannot send message (smtp) - recipients discarded:" = "Помила під час відправлення повідомлення: такі адреси некоректні:"; "cannot send message (smtp) - recipients discarded:" = "Помила під час відправлення повідомлення: такі адреси некоректні:";
"cannot send message: (smtp) error when connecting" = "Помилка під час відправлення повідомлення: SMTP-сервер не відповідає."; "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) 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) - 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."; "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:categories="currentContact.c_categories"
var:id="currentContact.c_name" var:id="currentContact.c_name"
var:contactname="currentContact.c_cn"> var:contactname="currentContact.c_cn">
<td class="displayName"><var:string value="currentContact.c_cn" const:escapeHTML="YES" /></td> <td class="displayName" var:title="currentContact.c_cn"><var:string value="currentContact.c_cn" const:escapeHTML="YES" /></td>
<td><var:string value="currentContact.c_mail"/></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_screenname"/></td>
<td><var:string value="currentContact.c_o"/></td> <td><var:string value="currentContact.c_o"/></td>
<td><var:string value="currentContact.c_telephonenumber"/></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"]); row.setAttribute("contactname", contact["c_cn"]);
var cells = row.getElementsByTagName("TD"); var cells = row.getElementsByTagName("TD");
$(cells[0]).update(contact["c_cn"]); $(cells[0]).update(contact["c_cn"]);
cells[0].title = contact["c_cn"];
$(cells[1]).update(contact["c_mail"]); $(cells[1]).update(contact["c_mail"]);
cells[1].title = contact["c_mail"];
if (fullView) { if (fullView) {
$(cells[2]).update(contact["c_screenname"]); $(cells[2]).update(contact["c_screenname"]);
$(cells[3]).update(contact["c_o"]); $(cells[3]).update(contact["c_o"]);

View File

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

View File

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

View File

@ -121,7 +121,7 @@ function onValidate(onSuccess) {
showAlertDialog(_("error_missingrecipients")); showAlertDialog(_("error_missingrecipients"));
} }
else if (document.pageform.subject.value == "") { 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 { else {
onValidateDone(onSuccess); onValidateDone(onSuccess);

View File

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

View File

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

View File

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