commit
5e0c7ae4f2
214
ChangeLog
214
ChangeLog
|
@ -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
19
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)
|
||||
------------------
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
@ -69,22 +70,7 @@ BootstrapNSUserDefaults ()
|
|||
}
|
||||
|
||||
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;
|
||||
|
@ -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"];
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
[words addObject:v];
|
||||
/* 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])
|
||||
{
|
||||
[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
|
||||
{
|
||||
|
|
|
@ -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 = [[NSString alloc] initWithData: credsData
|
||||
encoding: NSUTF8StringEncoding];
|
||||
[creds autorelease];
|
||||
creds = [creds stringByTrimmingCharactersInSet:
|
||||
[NSCharacterSet newlineCharacterSet]];
|
||||
[NSCharacterSet characterSetWithCharactersInString: @"\r\n"]];
|
||||
}
|
||||
|
||||
if (max > 0)
|
||||
|
|
|
@ -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 = [[NSString alloc] initWithData: credsData
|
||||
encoding: NSUTF8StringEncoding];
|
||||
[creds autorelease];
|
||||
creds = [creds stringByTrimmingCharactersInSet:
|
||||
[NSCharacterSet newlineCharacterSet]];
|
||||
[NSCharacterSet characterSetWithCharactersInString: @"\r\n"]];
|
||||
|
||||
r = [creds rangeOfString: @":"];
|
||||
authname = [creds substringToIndex: r.location];
|
||||
authpwd = [creds substringFromIndex: r.location+1];
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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" = "Електронна пошта";
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
|
@ -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"]);
|
||||
|
|
|
@ -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"));
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -17,16 +17,18 @@ 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;
|
||||
}
|
||||
|
||||
if ($("replyTo")) {
|
||||
var replyTo = $("replyTo").value;
|
||||
if (!replyTo.blank() && !emailRE.test(replyTo)) {
|
||||
showAlertDialog(_("Please specify a valid reply-to address."));
|
||||
sendForm = false;
|
||||
}
|
||||
}
|
||||
|
||||
if ($("dayStartTime")) {
|
||||
var start = $("dayStartTime");
|
||||
|
@ -205,6 +207,7 @@ function initPreferences() {
|
|||
$("contactsCategoryDelete").observe("click", onContactsCategoryDelete);
|
||||
}
|
||||
|
||||
if ($("replyPlacementList"))
|
||||
onReplyPlacementListChange();
|
||||
|
||||
var button = $("addDefaultEmailAddresses");
|
||||
|
@ -216,6 +219,7 @@ function initPreferences() {
|
|||
button.observe("click", onChangePasswordClick);
|
||||
|
||||
initSieveFilters();
|
||||
if ($('mailOptionsView'))
|
||||
initMailAccounts();
|
||||
|
||||
button = $("enableVacationEndDate");
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue