From 656807b77d393c5d6f67915eb7dce54f53812791 Mon Sep 17 00:00:00 2001 From: smizrahi Date: Mon, 3 Oct 2022 08:56:41 +0200 Subject: [PATCH] feat(password-recovery): Add password recovery with secret question or secondary email --- .gitignore | 3 + Documentation/SOGoInstallationGuide.asciidoc | 23 ++ SoObjects/SOGo/GNUmakefile | 10 +- SoObjects/SOGo/JWT.h | 39 +++ SoObjects/SOGo/JWT.m | 268 ++++++++++++++++++ SoObjects/SOGo/LDAPSource.m | 14 +- SoObjects/SOGo/NSDictionary+Utilities.m | 4 +- SoObjects/SOGo/SOGoConstants.h | 2 + SoObjects/SOGo/SOGoDefaults.plist | 3 + SoObjects/SOGo/SOGoEmptyAuthenticator.h | 45 +++ SoObjects/SOGo/SOGoEmptyAuthenticator.m | 51 ++++ SoObjects/SOGo/SOGoMailer.m | 6 +- SoObjects/SOGo/SOGoSource.h | 7 +- SoObjects/SOGo/SOGoSystemDefaults.h | 4 + SoObjects/SOGo/SOGoSystemDefaults.m | 30 ++ SoObjects/SOGo/SOGoUserDefaults.h | 18 ++ SoObjects/SOGo/SOGoUserDefaults.m | 48 ++++ SoObjects/SOGo/SOGoUserManager.h | 13 +- SoObjects/SOGo/SOGoUserManager.m | 219 +++++++++++++- SoObjects/SOGo/SQLSource.m | 10 +- UI/Common/English.lproj/Localizable.strings | 8 + UI/Common/French.lproj/Localizable.strings | 9 + UI/MainUI/English.lproj/Localizable.strings | 16 ++ UI/MainUI/French.lproj/Localizable.strings | 16 ++ UI/MainUI/SOGoRootPage.m | 259 ++++++++++++++++- UI/MainUI/product.plist | 20 ++ .../English.lproj/Localizable.strings | 10 +- .../French.lproj/Localizable.strings | 10 +- UI/PreferencesUI/UIxJSONPreferences.m | 12 + UI/PreferencesUI/UIxPreferences.m | 36 +++ UI/SOGoUI/UIxComponent.m | 7 +- .../ContactsUI/UIxContactEditorTemplate.wox | 2 +- UI/Templates/MainUI/SOGoRootPage.wox | 176 ++++++++---- UI/Templates/PreferencesUI/UIxPreferences.wox | 111 +++++--- UI/WebServerResources/js/Common.js | 2 +- UI/WebServerResources/js/Common.js.map | 2 +- .../js/Common/Authentication.service.js | 115 +++++++- .../js/Common/sgRippleClick.directive.js | 47 ++- .../js/Common/sgRippleClick.service.js | 25 ++ UI/WebServerResources/js/Main.js | 2 +- UI/WebServerResources/js/Main.js.map | 2 +- UI/WebServerResources/js/Main/Main.app.js | 157 +++++++++- UI/WebServerResources/js/Preferences.js.map | 2 +- .../js/Preferences.services.js | 2 +- .../js/Preferences.services.js.map | 2 +- .../js/Preferences/Preferences.service.js | 20 ++ .../js/Preferences/PreferencesController.js | 1 + 47 files changed, 1729 insertions(+), 159 deletions(-) create mode 100644 SoObjects/SOGo/JWT.h create mode 100644 SoObjects/SOGo/JWT.m create mode 100644 SoObjects/SOGo/SOGoEmptyAuthenticator.h create mode 100644 SoObjects/SOGo/SOGoEmptyAuthenticator.m create mode 100644 UI/WebServerResources/js/Common/sgRippleClick.service.js diff --git a/.gitignore b/.gitignore index a95898b81..cf95b233d 100644 --- a/.gitignore +++ b/.gitignore @@ -43,3 +43,6 @@ UI/WebServerResources/js/vendor/ckeditor/bender-runner.config.json UI/WebServerResources/js/vendor/ckeditor/plugins/onchange/docs UI/WebServerResources/js/vendor/ckeditor/plugins/scayt/*.md UI/WebServerResources/js/vendor/ckeditor/skins/n1theme/*.md + +# JS +UI/WebServerResources/js/*.map diff --git a/Documentation/SOGoInstallationGuide.asciidoc b/Documentation/SOGoInstallationGuide.asciidoc index 2412ca9d3..dc1e4ea04 100644 --- a/Documentation/SOGoInstallationGuide.asciidoc +++ b/Documentation/SOGoInstallationGuide.asciidoc @@ -786,6 +786,29 @@ Default value is `YES`, or enabled. authentication and global address books. Multiple sources can be specified as an array of dictionaries. +|S |SOGoPasswordRecovery +|Boolean enable password recovery with secret question or secondary e-mail. Only for database user source. + +|S |SOGoPasswordRecoveryDomains +|List of domains where password recovery is enabled. If empty, enabled for all domains + +|U |SOGoPasswordRecoveryMode +|User password recovery mode. Values can be `Disabled`, `SecretQuestion` or `SecondaryEmail`. + +|U |SOGoPasswordRecoveryQuestion +|User password recovery secret question. Values can be `SecretQuestion1`, `SecretQuestion2` or `SecretQuestion3`. + +|U |SOGoPasswordRecoveryQuestionAnswer +|User password recovery secret question answer when mode is `SecretQuestion`. + +|U |SOGoPasswordRecoverySecondaryEmail +|User password recovery e-mail when mode is `SecondaryEmail`. + +|S |SOGoJWTSecret +|JWT secret according to RFC-7519. Default value is `SOGo`. + + + |======================================================================= Authentication using LDAP diff --git a/SoObjects/SOGo/GNUmakefile b/SoObjects/SOGo/GNUmakefile index 199943fcb..e8ed39697 100644 --- a/SoObjects/SOGo/GNUmakefile +++ b/SoObjects/SOGo/GNUmakefile @@ -72,6 +72,7 @@ SOGo_HEADER_FILES = \ SOGoDAVAuthenticator.h \ SOGoProxyAuthenticator.h \ SOGoStaticAuthenticator.h \ + SOGoEmptyAuthenticator.h \ SOGoWebAuthenticator.h \ SOGoWebDAVAclManager.h \ SOGoWebDAVValue.h \ @@ -88,7 +89,9 @@ SOGo_HEADER_FILES = \ \ SOGoCredentialsFile.h \ SOGoTextTemplateFile.h \ - SOGoZipArchiver.h + SOGoZipArchiver.h \ + \ + JWT.h all:: @touch SOGoBuild.m @@ -154,6 +157,7 @@ SOGo_OBJC_FILES = \ SOGoDAVAuthenticator.m \ SOGoProxyAuthenticator.m \ SOGoStaticAuthenticator.m \ + SOGoEmptyAuthenticator.m \ SOGoWebAuthenticator.m \ SOGoWebDAVAclManager.m \ SOGoWebDAVValue.m \ @@ -170,7 +174,9 @@ SOGo_OBJC_FILES = \ \ SOGoCredentialsFile.m \ SOGoTextTemplateFile.m \ - SOGoZipArchiver.m + SOGoZipArchiver.m \ + \ + JWT.m SOGo_C_FILES += lmhash.c aes.c crypt_blowfish.c pkcs5_pbkdf2.c diff --git a/SoObjects/SOGo/JWT.h b/SoObjects/SOGo/JWT.h new file mode 100644 index 000000000..48aa001b0 --- /dev/null +++ b/SoObjects/SOGo/JWT.h @@ -0,0 +1,39 @@ +/* JWT.h - this file is part of SOGo + * + * Copyright (C) 2022 Alinto + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include + +#ifndef JWT_H +#define JWT_H + + +@interface JWT : NSObject +{ + @private + NSString *JWTSecret; +} + ++ (JWT *)sharedInstance; +- (NSString *) getJWTWithData: (NSDictionary *) data andValidity: (int)validitySec; +- (NSDictionary *) getDataWithJWT: (NSString *) JWTToken andValidity: (BOOL *)isValid isExpired: (BOOL *)isExpired; + +@end + +#endif /* JWT_H */ diff --git a/SoObjects/SOGo/JWT.m b/SoObjects/SOGo/JWT.m new file mode 100644 index 000000000..89dbac2a7 --- /dev/null +++ b/SoObjects/SOGo/JWT.m @@ -0,0 +1,268 @@ +/* JWT.m - this file is part of SOGo + * + * Copyright (C) 2022 Alinto + * + * This file is part of SOGo. + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#import "JWT.h" +#import +#import +#import +#import +#import +#import +#include +#include + +#define HS256_TOKEN_LENGH 43 + +static const NSString *kExpKey = @"exp"; +static const NSString *kAlgKey = @"alg"; +static const NSString *kTypKey = @"typ"; +static const NSString *kAlg = @"HS256"; +static const NSString *kTyp = @"JWT"; + +@implementation JWT + +- (id) init +{ + if ((self = [super init])) + { + self->JWTSecret = [[SOGoSystemDefaults sharedSystemDefaults] JWTSecret]; + } + + return self; +} + +- (void) dealloc +{ + [super dealloc]; +} + ++ (JWT *)sharedInstance +{ + static JWT *sharedInstance = nil; + + if (!sharedInstance) + { + sharedInstance = [[self alloc] init]; + [sharedInstance retain]; + } + + return sharedInstance; +} + +/** + * Encode base64 data + * @param data The input data + * @param length The input data length + * @return Data encoded in base64 + */ +- (NSString *) base64EncodeWithData: (NSData *)data length: (NSUInteger)length { + NSData *dataBase64; + dataBase64 = [GSMimeDocument encodeBase64: data]; + return [[ + [[NSString stringWithCString: [dataBase64 bytes] length: length] + stringByReplacingOccurrencesOfString:@"+" withString:@"-"] + stringByReplacingOccurrencesOfString:@"/" withString:@"_"] + stringByReplacingOccurrencesOfString:@"=" withString:@""]; +} + +/** + * Encode base64 string + * @param data The input string + * @param length The input data length + * @return Data encoded in base64 + */ +- (NSString *) base64EncodeWithString: (NSString *)data { + return [[ + [[GSMimeDocument encodeBase64String: data] + stringByReplacingOccurrencesOfString:@"+" withString:@"-"] + stringByReplacingOccurrencesOfString:@"/" withString:@"_"] + stringByReplacingOccurrencesOfString:@"=" withString:@""]; +} + +/** + * Decode base64 string + * @param data The base64 input string + * @return Decoded data + */ +- (NSDictionary *) base64DecodeWithString: (NSString *)data { + NSString *decodedData; + NSDictionary *output; + + output = nil; + decodedData = [GSMimeDocument decodeBase64String: data]; + if ([decodedData isJSONString]) { + output = (NSDictionary *)[decodedData objectFromJSONString]; + } + return output; +} + +/** + * Generate JWT Token encoded with HS256 algorithm + * @param dict The payload content + * @return A valid JWT token (header + payload + signature) + */ +- (NSString *) getHS256TokenForData: (NSDictionary *)dict withSecret: (NSString *)secret { + unsigned char hs256[HS256_TOKEN_LENGH] = {}; + NSString *headerBase64, *payloadBase64, *content, *token; + NSArray *sortedKeys; + NSMutableDictionary *sortedDict + + // Reorder dictionary keys + sortedKeys = [[dict allKeys] sortedArrayUsingSelector: @selector(compare:)]; + sortedDict = [NSMutableDictionary dictionary]; + for (NSString *key in sortedKeys) + [sortedDict setObject:[dict objectForKey: key] forKey: key]; + + headerBase64 = [self base64EncodeWithString: + [[NSDictionary dictionaryWithObjectsAndKeys:kAlg, kAlgKey, kTyp, kTypKey, nil] jsonRepresentation]]; + payloadBase64 = [self base64EncodeWithString: [sortedDict jsonRepresentation]]; + content = [NSString stringWithFormat: @"%@.%@", headerBase64, payloadBase64, nil]; + + HMAC(EVP_sha256(), + [secret UTF8String], [secret length], + [content UTF8String], [content length], + hs256, NULL); + + token = [self base64EncodeWithData: [NSData dataWithBytes:hs256 length: HS256_TOKEN_LENGH] length: HS256_TOKEN_LENGH]; + + return [NSString stringWithFormat: @"%@.%@", content, token, nil]; +} + +/** + * Generate JWT Token encoded with HS256 algorithm + * @param data The payload content + * @param validitySec Validity duration, in seconds + * @return A valid JWT token (header + payload + signature) + */ +- (NSString *)getJWTWithData: (NSDictionary *)data andValidity: (int)validitySec { + NSMutableDictionary *dict; + dict = [NSMutableDictionary dictionaryWithDictionary: data]; + [dict setObject:[NSString stringWithFormat:@"%.0f", ([[NSDate date] timeIntervalSince1970] + validitySec)] forKey: kExpKey]; + + return [self getHS256TokenForData: dict withSecret: self->JWTSecret]; +} + +/** + * Get JWT token data and check validity token + * @param JWTToken A JWT complete token (header + payload + signature) + * @param isValid Reference parameter - NO if token is invalid + * @param isExpired Reference parameter - YES if token is expired + * @return Payload content + */ +- (NSDictionary *)getDataWithJWT: (NSString *)JWTToken andValidity: (BOOL *)isValid isExpired: (BOOL *)isExpired { + NSArray *components, *reencodedComponents; + NSString *header, *payload, *reencodedJWTToken, *signature, *reencodedSignature; + NSDictionary *headerDict, *payloadDict; + NSTimeInterval tokenTime; + NSMutableDictionary *result; + + *isValid = YES; + *isExpired = NO; + result = nil; + components = [JWTToken componentsSeparatedByString:@"."]; + + if (3 != [components count]) { + // Invalid number of components + *isValid = NO; + return result; + } + + // Check header + /////////////// + header = (NSString *)[components objectAtIndex: 0]; + if (!header) { + // No header + *isValid = NO; + return result; + } + headerDict = [self base64DecodeWithString: header]; + if (!headerDict) { + // No header + *isValid = NO; + return result; + } + if (![headerDict objectForKey: kTypKey] || ![[headerDict objectForKey: kTypKey] isEqualToString: kTyp]) { + // Invalid type + *isValid = NO; + return result; + } + if (![headerDict objectForKey: kAlgKey] || ![[headerDict objectForKey: kAlgKey] isEqualToString: kAlg]) { + // Invalid algorithm + *isValid = NO; + return result; + } + + // Check payload + /////////////// + payload = (NSString *)[components objectAtIndex: 1]; + if (!payload) { + // No payload + *isValid = NO; + return result; + } + payloadDict = [self base64DecodeWithString: payload]; + if (!payloadDict) { + // No payload + *isValid = NO; + return result; + } + if (![payloadDict objectForKey: kExpKey]) { + // No expiration token + *isValid = NO; + return result; + } + // Check expiration + tokenTime = [[payloadDict objectForKey: kExpKey] doubleValue]; + if (0 != tokenTime) { // 0 for infinity validation + if ([[NSDate date] timeIntervalSince1970] > tokenTime) { + // Token expired + *isValid = NO; + *isExpired = YES; + return result; + } + } + + // Check signature + /////////////// + reencodedJWTToken = [self getHS256TokenForData: payloadDict withSecret: self->JWTSecret]; + reencodedComponents = [reencodedJWTToken componentsSeparatedByString:@"."]; + if (3 != [reencodedComponents count]) { + // Invalid number of reencoded components + *isValid = NO; + return result; + } + signature = (NSString *)[components objectAtIndex: 2]; + reencodedSignature = (NSString *)[reencodedComponents objectAtIndex: 2]; + if (![signature isEqualToString: reencodedSignature]) { + // Invalid signature + *isValid = NO; + return result; + } + + // All is OK ! + result = [NSMutableDictionary dictionaryWithDictionary: payloadDict]; + [result removeObjectForKey: kExpKey]; + + return result; +} + +@end \ No newline at end of file diff --git a/SoObjects/SOGo/LDAPSource.m b/SoObjects/SOGo/LDAPSource.m index f516292bf..28981e0c2 100644 --- a/SoObjects/SOGo/LDAPSource.m +++ b/SoObjects/SOGo/LDAPSource.m @@ -708,14 +708,20 @@ groupObjectClasses: (NSArray *) newGroupObjectClasses return didChange; } -// -// -// +/** + * Change a user's password. + * @param login the user's login name. + * @param oldPassword the previous password. + * @param newPassword the new password. + * @param perr will be set if the new password is not conform to the policy. + * @param passwordRecovery YES of this is password recovery, NO otherwise. If password recovery is set, old password won't be checked + * @return YES if the password was successfully changed. + */ - (BOOL) changePasswordForLogin: (NSString *) login oldPassword: (NSString *) oldPassword newPassword: (NSString *) newPassword + passwordRecovery: (BOOL) passwordRecovery perr: (SOGoPasswordPolicyError *) perr - { NGLdapConnection *bindConnection; NSString *userDN; diff --git a/SoObjects/SOGo/NSDictionary+Utilities.m b/SoObjects/SOGo/NSDictionary+Utilities.m index 78e447106..443297923 100644 --- a/SoObjects/SOGo/NSDictionary+Utilities.m +++ b/SoObjects/SOGo/NSDictionary+Utilities.m @@ -58,12 +58,12 @@ while ((currentKey = [keys nextObject])) { currentValue = [[self objectForKey: currentKey] jsonRepresentation]; - currentPair = [NSString stringWithFormat: @"%@: %@", + currentPair = [NSString stringWithFormat: @"%@:%@", [currentKey jsonRepresentation], currentValue]; [values addObject: currentPair]; } representation = [NSString stringWithFormat: @"{%@}", - [values componentsJoinedByString: @", "]]; + [values componentsJoinedByString: @","]]; return representation; } diff --git a/SoObjects/SOGo/SOGoConstants.h b/SoObjects/SOGo/SOGoConstants.h index c3b24a3b4..fdccd693d 100644 --- a/SoObjects/SOGo/SOGoConstants.h +++ b/SoObjects/SOGo/SOGoConstants.h @@ -36,6 +36,8 @@ typedef enum PolicyPasswordTooShort = 6, PolicyPasswordTooYoung = 7, PolicyPasswordInHistory = 8, + PolicyPasswordRecoveryFailed = 9, + PolicyPasswordRecoveryInvalidToken = 10, PolicyNoError = 65535, } SOGoPasswordPolicyError; diff --git a/SoObjects/SOGo/SOGoDefaults.plist b/SoObjects/SOGo/SOGoDefaults.plist index e7ab2119b..e14584f0b 100644 --- a/SoObjects/SOGo/SOGoDefaults.plist +++ b/SoObjects/SOGo/SOGoDefaults.plist @@ -195,4 +195,7 @@ }; SOGoSubscriptionFolderFormat = "%{FolderName} (%{UserName} <%{Email}>)"; + + SOGoPasswordRecoveryMode = "Disabled"; + SOGoPasswordRecoveryQuestion = "SecretQuestion1"; } diff --git a/SoObjects/SOGo/SOGoEmptyAuthenticator.h b/SoObjects/SOGo/SOGoEmptyAuthenticator.h new file mode 100644 index 000000000..a4bd84a78 --- /dev/null +++ b/SoObjects/SOGo/SOGoEmptyAuthenticator.h @@ -0,0 +1,45 @@ +/* SOGoEmptyAuthenticator.h - this file is part of SOGo + * + * Copyright (C) 2022 Alinto + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef SOGOEMPTYAUTHENTICATOR_H +#define SOGOEMPTYAUTHENTICATOR_H + + + +#import "SOGoAuthenticator.h" + +/* + SOGoEmptyAuthenticator + This class can be used to send message without SMTP authentication. + This is used to send technical message to users, e.g. for password recovery + +*/ + +@interface SOGoEmptyAuthenticator : NSObject +{ + +} + ++ (id) sharedSOGoEmptyAuthenticator; + +@end + +#endif /* SOGOEMPTYAUTHENTICATOR_H */ + diff --git a/SoObjects/SOGo/SOGoEmptyAuthenticator.m b/SoObjects/SOGo/SOGoEmptyAuthenticator.m new file mode 100644 index 000000000..5f31c1ad1 --- /dev/null +++ b/SoObjects/SOGo/SOGoEmptyAuthenticator.m @@ -0,0 +1,51 @@ +/* SOGoEmptyAuthenticator.m - this file is part of SOGo + * + * Copyright (C) 2022 Alinto + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#import + +#import "SOGoEmptyAuthenticator.h" + +@implementation SOGoEmptyAuthenticator + ++ (id) sharedSOGoEmptyAuthenticator +{ + static SOGoEmptyAuthenticator *auth = nil; + + if (!auth) + auth = [self new]; + + return auth; +} + +- (id) init +{ + if ((self = [super init])) + { + + } + return self; +} + +- (void) dealloc +{ + [super dealloc]; +} + +@end diff --git a/SoObjects/SOGo/SOGoMailer.m b/SoObjects/SOGo/SOGoMailer.m index 35177c738..ca4474dce 100644 --- a/SoObjects/SOGo/SOGoMailer.m +++ b/SoObjects/SOGo/SOGoMailer.m @@ -30,10 +30,10 @@ #import "NSString+Utilities.h" #import "SOGoStaticAuthenticator.h" +#import "SOGoEmptyAuthenticator.h" #import "SOGoSystemDefaults.h" #import "SOGoUser.h" #import "SOGoUserManager.h" - #import "SOGoMailer.h" // @@ -243,7 +243,7 @@ NS_DURING { [client connect]; - if ([authenticationType isEqualToString: @"plain"]) + if ([authenticationType isEqualToString: @"plain"] && ![authenticator isKindOfClass: [SOGoEmptyAuthenticator class]]) { /* XXX Allow static credentials by peeking at the classname */ if ([authenticator isKindOfClass: [SOGoStaticAuthenticator class]]) @@ -262,7 +262,7 @@ reason: @"cannot send message:" @" (smtp) authentication failure"]; } - else if (authenticationType) + else if (authenticationType && ![authenticator isKindOfClass: [SOGoEmptyAuthenticator class]]) result = [NSException exceptionWithHTTPStatus: 500 reason: @"cannot send message:" diff --git a/SoObjects/SOGo/SOGoSource.h b/SoObjects/SOGo/SOGoSource.h index 987ae5be8..f07b068d9 100644 --- a/SoObjects/SOGo/SOGoSource.h +++ b/SoObjects/SOGo/SOGoSource.h @@ -57,9 +57,10 @@ grace: (int *) _grace; - (BOOL) changePasswordForLogin: (NSString *) login - oldPassword: (NSString *) oldPassword - newPassword: (NSString *) newPassword - perr: (SOGoPasswordPolicyError *) perr; + oldPassword: (NSString *) oldPassword + newPassword: (NSString *) newPassword + passwordRecovery: (BOOL) passwordRecovery + perr: (SOGoPasswordPolicyError *) perr; - (NSDictionary *) lookupContactEntry: (NSString *) theID inDomain: (NSString *) domain; diff --git a/SoObjects/SOGo/SOGoSystemDefaults.h b/SoObjects/SOGo/SOGoSystemDefaults.h index 2ee15fdee..0c916b0c8 100644 --- a/SoObjects/SOGo/SOGoSystemDefaults.h +++ b/SoObjects/SOGo/SOGoSystemDefaults.h @@ -115,6 +115,10 @@ - (int) maximumPictureSize; - (BOOL) easSearchInBody; +- (BOOL) isPasswordRecoveryEnabled; +- (NSArray *) passwordRecoveryDomains; +- (NSString *) JWTSecret; + @end #endif /* SOGOSYSTEMDEFAULTS_H */ diff --git a/SoObjects/SOGo/SOGoSystemDefaults.m b/SoObjects/SOGo/SOGoSystemDefaults.m index eff1f0bc5..2fa260107 100644 --- a/SoObjects/SOGo/SOGoSystemDefaults.m +++ b/SoObjects/SOGo/SOGoSystemDefaults.m @@ -755,4 +755,34 @@ _injectConfigurationFromFile (NSMutableDictionary *defaultsDict, return v; } +- (BOOL) isPasswordRecoveryEnabled +{ + return [self boolForKey: @"SOGoPasswordRecovery"]; +} + +- (NSArray *) passwordRecoveryDomains +{ + static NSArray *passwordRecoveryDomains = nil; + + if (!passwordRecoveryDomains) + { + passwordRecoveryDomains = [self stringArrayForKey: @"SOGoPasswordRecoveryDomains"]; + [passwordRecoveryDomains retain]; + } + + return passwordRecoveryDomains; +} + +- (NSString *) JWTSecret +{ + NSString *secret; + + secret = [self stringForKey: @"SOGoJWTSecret"]; + + if (!secret) + secret = @"SOGo"; // Default secret + + return secret; +} + @end diff --git a/SoObjects/SOGo/SOGoUserDefaults.h b/SoObjects/SOGo/SOGoUserDefaults.h index 106b2660a..478f33c74 100644 --- a/SoObjects/SOGo/SOGoUserDefaults.h +++ b/SoObjects/SOGo/SOGoUserDefaults.h @@ -33,6 +33,14 @@ extern NSString *SOGoWeekStartJanuary1; extern NSString *SOGoWeekStartFirst4DayWeek; extern NSString *SOGoWeekStartFirstFullWeek; +extern NSString *SOGoPasswordRecoveryDisabled; +extern NSString *SOGoPasswordRecoveryQuestion; +extern NSString *SOGoPasswordRecoveryQuestion1; +extern NSString *SOGoPasswordRecoveryQuestion2; +extern NSString *SOGoPasswordRecoveryQuestion3; +extern NSString *SOGoPasswordRecoverySecondaryEmail; + + @interface SOGoUserDefaults : SOGoDefaultsSource { NSString *userLanguage; @@ -236,6 +244,16 @@ extern NSString *SOGoWeekStartFirstFullWeek; - (void) setContactsCategories: (NSArray *) newValues; - (NSArray *) contactsCategories; +/* Password recovery */ +- (void) setPasswordRecoveryMode: (NSString *) newValue; +- (NSString *) passwordRecoveryMode; +- (void) setPasswordRecoveryQuestion: (NSString *) newValue; +- (NSString *) passwordRecoveryQuestion; +- (void) setPasswordRecoveryQuestionAnswer: (NSString *) newValue; +- (NSString *) passwordRecoveryQuestionAnswer; +- (void) setPasswordRecoverySecondaryEmail: (NSString *) newValue; +- (NSString *) passwordRecoverySecondaryEmail; + @end #endif /* SOGOUSERDEFAULTS_H */ diff --git a/SoObjects/SOGo/SOGoUserDefaults.m b/SoObjects/SOGo/SOGoUserDefaults.m index ae9fab4ba..7eac80fae 100644 --- a/SoObjects/SOGo/SOGoUserDefaults.m +++ b/SoObjects/SOGo/SOGoUserDefaults.m @@ -39,6 +39,14 @@ NSString *SOGoWeekStartJanuary1 = @"January1"; NSString *SOGoWeekStartFirst4DayWeek = @"First4DayWeek"; NSString *SOGoWeekStartFirstFullWeek = @"FirstFullWeek"; +NSString *SOGoPasswordRecoveryDisabled = @"Disabled"; +NSString *SOGoPasswordRecoveryQuestion = @"SecretQuestion"; +NSString *SOGoPasswordRecoveryQuestion1 = @"SecretQuestion1"; +NSString *SOGoPasswordRecoveryQuestion2 = @"SecretQuestion2"; +NSString *SOGoPasswordRecoveryQuestion3 = @"SecretQuestion3"; +NSString *SOGoPasswordRecoverySecondaryEmail = @"SecondaryEmail"; + + @implementation SOGoUserDefaults + (NSString *) userProfileClassName @@ -941,4 +949,44 @@ NSString *SOGoWeekStartFirstFullWeek = @"FirstFullWeek"; return [self stringArrayForKey: @"SOGoContactsCategories"]; } +- (void) setPasswordRecoveryMode: (NSString *) newValue +{ + [self setObject: newValue forKey: @"SOGoPasswordRecoveryMode"]; +} + +- (NSString *) passwordRecoveryMode +{ + return [self stringForKey: @"SOGoPasswordRecoveryMode"]; +} + +- (void) setPasswordRecoveryQuestion: (NSString *) newValue +{ + [self setObject: newValue forKey: @"SOGoPasswordRecoveryQuestion"]; +} + +- (NSString *) passwordRecoveryQuestion +{ + return [self stringForKey: @"SOGoPasswordRecoveryQuestion"]; +} + +- (void) setPasswordRecoveryQuestionAnswer: (NSString *) newValue +{ + [self setObject: newValue forKey: @"SOGoPasswordRecoveryQuestionAnswer"]; +} + +- (NSString *) passwordRecoveryQuestionAnswer +{ + return [self stringForKey: @"SOGoPasswordRecoveryQuestionAnswer"]; +} + +- (void) setPasswordRecoverySecondaryEmail: (NSString *) newValue +{ + [self setObject: newValue forKey: @"SOGoPasswordRecoverySecondaryEmail"]; +} + +- (NSString *) passwordRecoverySecondaryEmail +{ + return [self stringForKey: @"SOGoPasswordRecoverySecondaryEmail"]; +} + @end diff --git a/SoObjects/SOGo/SOGoUserManager.h b/SoObjects/SOGo/SOGoUserManager.h index 39e121080..8feb79fe8 100644 --- a/SoObjects/SOGo/SOGoUserManager.h +++ b/SoObjects/SOGo/SOGoUserManager.h @@ -99,9 +99,16 @@ - (BOOL) changePasswordForLogin: (NSString *) login inDomain: (NSString *) domain - oldPassword: (NSString *) oldPassword - newPassword: (NSString *) newPassword - perr: (SOGoPasswordPolicyError *) perr; + oldPassword: (NSString *) oldPassword + newPassword: (NSString *) newPassword + passwordRecovery: (BOOL) passwordRecovery + token: (NSString *) token + perr: (SOGoPasswordPolicyError *) perr; +- (NSDictionary *) getPasswordRecoveryInfosForUsername: (NSString *) username domain:(NSString *) domain; +- (NSString *) generateAndSavePasswordRecoveryTokenWithUid: (NSString *) uid username: (NSString *) username domain:(NSString *) domain; +- (NSString *) getTokenAndCheckPasswordRecoveryDataForUsername: (NSString *) username domain:(NSString *) domain withData:(NSDictionary *) passwordRecoveryData; +- (NSString *) getPasswordRecoveryTokenFor: (NSString *) username domain:(NSString *) domain; +- (BOOL) isPasswordRecoveryTokenValidFor: (NSString *) token uid: (NSString *) uid; @end #endif /* SOGOUSERMANAGER_H */ diff --git a/SoObjects/SOGo/SOGoUserManager.m b/SoObjects/SOGo/SOGoUserManager.m index bebbc5705..77dcf1953 100644 --- a/SoObjects/SOGo/SOGoUserManager.m +++ b/SoObjects/SOGo/SOGoUserManager.m @@ -23,6 +23,8 @@ #import #import +#import + #import "NSArray+Utilities.h" #import "NSString+Utilities.h" #import "NSString+Crypto.h" @@ -32,9 +34,23 @@ #import "SOGoUserManager.h" #import "SOGoCache.h" #import "SOGoSource.h" +#import "SOGoUserDefaults.h" +#import "SOGoUserSettings.h" +#import "WOResourceManager+SOGo.h" +#import "JWT.h" static Class NSNullK; +static const int kJwtDurationS = 600; // 10 minutes +static const NSString *kUidKey = @"uid"; +static const NSString *kUsernameKey = @"username"; +static const NSString *kDomainKey = @"domain"; +static const NSString *kPasswordRecoveryTokenKey = @"passwordRecoveryToken"; +static const NSString *kModeKey = @"mode"; +static const NSString *kSecretQuestionKey = @"secretQuestion"; +static const NSString *kObfuscatedSecondaryEmailKey = @"obfuscatedSecondaryEmail"; + + @implementation SOGoUserManagerRegistry + (void) initialize @@ -453,7 +469,8 @@ static Class NSNullK; inDomain: (NSString *) domain oldPassword: (NSString *) oldPassword newPassword: (NSString *) newPassword - perr: (SOGoPasswordPolicyError *) perr + passwordRecovery: (BOOL) passwordRecovery + perr: (SOGoPasswordPolicyError *) perr { NSObject *sogoSource; NSString *currentID; @@ -472,6 +489,7 @@ static Class NSNullK; didChange = [sogoSource changePasswordForLogin: login oldPassword: oldPassword newPassword: newPassword + passwordRecovery: passwordRecovery perr: perr]; } @@ -740,25 +758,45 @@ static Class NSNullK; inDomain: (NSString *) domain oldPassword: (NSString *) oldPassword newPassword: (NSString *) newPassword + passwordRecovery: (BOOL) passwordRecovery + token: (NSString *) token perr: (SOGoPasswordPolicyError *) perr { - NSString *jsonUser, *userLogin; + NSString *jsonUser, *userLogin, *uid, *userToken; NSMutableDictionary *currentUser; BOOL didChange; SOGoSystemDefaults *sd; + NSDictionary *info; + SOGoUserSettings *us; jsonUser = [[SOGoCache sharedCache] userAttributesForLogin: login]; currentUser = [jsonUser objectFromJSONString]; if ([currentUser isKindOfClass: NSNullK]) currentUser = nil; + + // Check session id for password recovery + userToken = [self getPasswordRecoveryTokenFor: login domain: domain]; + info = [self contactInfosForUserWithUIDorEmail: login]; + uid = [info objectForKey: @"c_uid"]; - if ([self _sourceChangePasswordForLogin: login + if (passwordRecovery && (![userToken isEqualToString: token] || ![self isPasswordRecoveryTokenValidFor: userToken uid: uid])) { + didChange = NO; + *perr = PolicyPasswordRecoveryInvalidToken; + } else if ([self _sourceChangePasswordForLogin: login inDomain: domain oldPassword: oldPassword newPassword: newPassword + passwordRecovery: passwordRecovery perr: perr]) { + if (passwordRecovery) { + // Reset session id + us = [SOGoUserSettings settingsForUser: uid]; + [us removeObjectForKey: kPasswordRecoveryTokenKey]; + [us synchronize]; + } + didChange = YES; if (!currentUser) @@ -1283,4 +1321,179 @@ static Class NSNullK; return login; } +/** + * Get password reovery info for specific user (mode, secret question, obfuscated recovery email) + * @param username Username + * @param domain Domain + * @return User informations + */ +- (NSDictionary *) getPasswordRecoveryInfosForUsername: (NSString *) username domain:(NSString *) domain +{ + SOGoUserDefaults *userDefaults; + NSDictionary *info, *data; + SOGoSystemDefaults *sd; + NSString *uid, *suffix; + NSMutableString *obfuscatedSecondaryEmail; + NSInteger secondaryEmailLength = 0, obfuscatedSecondaryEmailLength = 0, i = 0; + + userDefaults = nil; + info = [self contactInfosForUserWithUIDorEmail: username]; + uid = [info objectForKey: @"c_uid"]; + + sd = [SOGoSystemDefaults sharedSystemDefaults]; + if ([sd enableDomainBasedUID] + && ![[info objectForKey: @"DomainLessLogin"] boolValue]) + { + suffix = [NSString stringWithFormat: @"@%@", domain]; + + // Don't add @domain suffix if it's already there + if (![uid hasSuffix: suffix]) + uid = [NSString stringWithFormat: @"%@%@", uid, suffix]; + + userDefaults = [SOGoUserDefaults defaultsForUser: uid + inDomain: domain]; + } else { + userDefaults = [SOGoUserDefaults defaultsForUser: uid + inDomain: nil]; + } + + if (nil != userDefaults && [[userDefaults passwordRecoveryMode] isEqualToString: SOGoPasswordRecoveryQuestion]) { + data = [NSDictionary dictionaryWithObjectsAndKeys: [userDefaults passwordRecoveryMode], kModeKey, + [userDefaults passwordRecoveryQuestion], kSecretQuestionKey, + nil]; + } else if (nil != userDefaults && [[userDefaults passwordRecoveryMode] isEqualToString: SOGoPasswordRecoverySecondaryEmail]) { + secondaryEmailLength = [[userDefaults passwordRecoverySecondaryEmail] length]; + // Obfuscate 80% of email. Compute nb character obfuscated + obfuscatedSecondaryEmailLength = (NSUInteger)(0.8 * secondaryEmailLength); + obfuscatedSecondaryEmail = [NSMutableString stringWithString: @"*"]; + for (i = 1 ; i < secondaryEmailLength ; i++) { + if (i < obfuscatedSecondaryEmailLength + && ![[[userDefaults passwordRecoverySecondaryEmail] substringWithRange:NSMakeRange(i, 1)] isEqualToString: @"@"]) { + [obfuscatedSecondaryEmail appendString: @"*"]; + } else { + [obfuscatedSecondaryEmail appendString: [[userDefaults passwordRecoverySecondaryEmail] substringWithRange:NSMakeRange(i, 1)]]; + } + } + + data = [NSDictionary dictionaryWithObjectsAndKeys: [userDefaults passwordRecoveryMode], kModeKey, obfuscatedSecondaryEmail, kObfuscatedSecondaryEmailKey, nil]; + } else { + data = [NSDictionary dictionaryWithObject: SOGoPasswordRecoveryDisabled forKey: kModeKey]; + } + + return data; +} + +/** + * (Email recovery) Generates and save in user pref the JWT token + * @param uid User id + * @param username Username + * @param domain Domain + * @return JWT Token + */ +- (NSString *) generateAndSavePasswordRecoveryTokenWithUid: (NSString *) uid username: (NSString *) username domain:(NSString *) domain +{ + NSString *jwtToken; + SOGoUserSettings *us; + + us = [SOGoUserSettings settingsForUser: uid]; + jwtToken = [[JWT sharedInstance] getJWTWithData: + [NSDictionary dictionaryWithObjectsAndKeys: uid, kUidKey, username, kUsernameKey, domain, kDomainKey, nil] + andValidity: kJwtDurationS]; + + [us setObject: jwtToken forKey: kPasswordRecoveryTokenKey]; + [us synchronize]; + + return jwtToken; +} + +/** + * (Secret Question) Check secret question answer, generates and save in user pref the JWT token + * @param username Username + * @param domain Domain + * @param passwordRecoveryData Password recovery data (answer, ...) + * @return JWT Token + */ +- (NSString *) getTokenAndCheckPasswordRecoveryDataForUsername: (NSString *) username domain:(NSString *) domain withData:(NSDictionary *) passwordRecoveryData +{ + NSString *mode, *questionKey, *answer, *uid, *suffix, *token; + SOGoUserDefaults *userDefaults; + SOGoSystemDefaults *sd; + NSDictionary *info; + + mode = [passwordRecoveryData objectForKey:@"mode"]; + questionKey = [passwordRecoveryData objectForKey:@"question"]; + answer = [[[passwordRecoveryData objectForKey:@"answer"] lowercaseString] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + + token = nil; + userDefaults = nil; + info = [self contactInfosForUserWithUIDorEmail: username]; + uid = [info objectForKey: @"c_uid"]; + sd = [SOGoSystemDefaults sharedSystemDefaults]; + if ([sd enableDomainBasedUID] + && ![[info objectForKey: @"DomainLessLogin"] boolValue]) + { + suffix = [NSString stringWithFormat: @"@%@", domain]; + + // Don't add @domain suffix if it's already there + if (![uid hasSuffix: suffix]) + uid = [NSString stringWithFormat: @"%@%@", uid, suffix]; + + userDefaults = [SOGoUserDefaults defaultsForUser: uid + inDomain: domain]; + } else { + userDefaults = [SOGoUserDefaults defaultsForUser: uid + inDomain: nil]; + } + + if ([sd isPasswordRecoveryEnabled] && nil != userDefaults && [[userDefaults passwordRecoveryMode] isEqualToString: mode]) { + if ([[userDefaults passwordRecoveryQuestion] isEqualToString: questionKey] + && [[[[userDefaults passwordRecoveryQuestionAnswer] lowercaseString] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] isEqualToString: answer]) { + token = [self generateAndSavePasswordRecoveryTokenWithUid: uid username: username domain: domain]; + } + } + + return token; +} + +/** + * Get token for username / domain stored in user pref + * @param username Username + * @param domain Domain + * @return JWT Token + */ +- (NSString *) getPasswordRecoveryTokenFor: (NSString *) username domain: (NSString *) domain +{ + NSString *uid; + NSDictionary *info; + SOGoUserSettings *us; + + info = [self contactInfosForUserWithUIDorEmail: username]; + uid = [info objectForKey: @"c_uid"]; + us = [SOGoUserSettings settingsForUser: uid]; + [us synchronize]; + + return [us stringForKey: kPasswordRecoveryTokenKey]; +} + +/** + * Check if JWT token is valid + * @param token Username + * @param uid User id + * @return True or False + */ +- (BOOL) isPasswordRecoveryTokenValidFor: (NSString *) token uid: (NSString *) uid { + BOOL isJWTValid, isJWTExpired, r; + NSDictionary *results; + + r = NO; + results = [[JWT sharedInstance] getDataWithJWT: token andValidity: &isJWTValid isExpired: &isJWTExpired]; + if (isJWTValid && !isJWTExpired + && [results objectForKey: kUidKey] + && [[results objectForKey: kUidKey] isEqualToString: uid]) { + r = YES; + } + + return r; +} + @end diff --git a/SoObjects/SOGo/SQLSource.m b/SoObjects/SOGo/SQLSource.m index 6d15b004b..8217fc5ab 100644 --- a/SoObjects/SOGo/SQLSource.m +++ b/SoObjects/SOGo/SQLSource.m @@ -317,7 +317,9 @@ row = [channel fetchAttributes: attrs withZone: NULL]; value = [row objectForKey: @"c_password"]; - rc = [self _isPassword: _pwd equalTo: value]; + if (_pwd != (id)[NSNull null]) { + rc = [self _isPassword: _pwd equalTo: value]; + } [channel cancelFetch]; } else @@ -338,11 +340,13 @@ * @param oldPassword the previous password. * @param newPassword the new password. * @param perr will be set if the new password is not conform to the policy. + * @param passwordRecovery YES of this is password recovery, NO otherwise. If password recovery is set, old password won't be checked * @return YES if the password was successfully changed. */ - (BOOL) changePasswordForLogin: (NSString *) login oldPassword: (NSString *) oldPassword newPassword: (NSString *) newPassword + passwordRecovery: (BOOL) passwordRecovery perr: (SOGoPasswordPolicyError *) perr { BOOL didChange, isOldPwdOk, isPolicyOk; @@ -362,7 +366,7 @@ // Verify current password isOldPwdOk = [self checkLogin:login password:oldPassword perr:perr expire:0 grace:0]; - if (isOldPwdOk) + if (isOldPwdOk || passwordRecovery) { if ([_userPasswordPolicy count]) { @@ -386,7 +390,7 @@ } } - if (isOldPwdOk && isPolicyOk) + if ((isOldPwdOk || passwordRecovery) && isPolicyOk) { // Encrypt new password NSString *encryptedPassword = [self _encryptPassword: newPassword]; diff --git a/UI/Common/English.lproj/Localizable.strings b/UI/Common/English.lproj/Localizable.strings index 5c80a2477..eb8f8fac0 100644 --- a/UI/Common/English.lproj/Localizable.strings +++ b/UI/Common/English.lproj/Localizable.strings @@ -222,3 +222,11 @@ /* Hotkey description to move forward in current view */ "Move forward" = "Move forward"; + +/* Password Recovery */ +"passwordRecovery_Disabled" = "Disabled"; +"passwordRecovery_SecretQuestion" = "Secret question"; +"passwordRecovery_SecretQuestion1" = "What is the name of your first pet ?"; +"passwordRecovery_SecretQuestion2" = "What was your first car ?"; +"passwordRecovery_SecretQuestion3" = "What is your favorite movie ?"; +"passwordRecovery_SecondaryEmail" = "Secondary E-mail"; diff --git a/UI/Common/French.lproj/Localizable.strings b/UI/Common/French.lproj/Localizable.strings index 783cf139c..8928385be 100644 --- a/UI/Common/French.lproj/Localizable.strings +++ b/UI/Common/French.lproj/Localizable.strings @@ -222,3 +222,12 @@ /* Hotkey description to move forward in current view */ "Move forward" = "Reculer"; + +/* Password Recovery */ +"passwordRecovery_Disabled" = "Désactivée"; +"passwordRecovery_SecretQuestion" = "Question secrète"; +"passwordRecovery_SecretQuestion1" = "Quel est le nom de votre premier animal de compagnie ?"; +"passwordRecovery_SecretQuestion2" = "Quelle était votre première voiture ?"; +"passwordRecovery_SecretQuestion3" = "Quel est votre film préféré ?"; +"passwordRecovery_SecondaryEmail" = "E-mail secondaire"; + diff --git a/UI/MainUI/English.lproj/Localizable.strings b/UI/MainUI/English.lproj/Localizable.strings index ac1d2d816..53b29c182 100644 --- a/UI/MainUI/English.lproj/Localizable.strings +++ b/UI/MainUI/English.lproj/Localizable.strings @@ -113,3 +113,19 @@ See this page for v "Close" = "Close"; "Missing search parameter" = "Missing search parameter"; "Missing type parameter" = "Missing type parameter"; + +/* Password Recovery */ +"Secondary e-mail" = "Secondary e-mail"; +"Answer" = "Answer"; +"Password lost" = "Password lost"; +"No password recovery method has been defined for this user" = "No password recovery method has been defined for this user"; +"Invalid secret question answer" = "Invalid secret question answer"; +"Next" = "Next"; +"Back" = "Back"; +"Please enter a new password below" = "Please enter a new password below"; +"A link will be sent to %{0}" = "A link will be sent to %{0}"; +"A password reset link has been sent, please check your recovery e-mail mailbox and click on the link" = "A password reset link has been sent, please check your recovery e-mail mailbox and click on the link"; +"Invalid configuration for email password recovery" = "Invalid configuration for email password recovery"; +"Password recovery email in error" = "Password recovery email in error"; +"Password reset" = "Password reset"; +"Hi %{0},\nThere was a request to change your password!\n\nIf you did not make this request then please ignore this email.\n\nOtherwise, please click this link to change your password: %{1}" = "Hi %{0},\nThere was a request to change your password!\n\nIf you did not make this request then please ignore this email.\n\nOtherwise, please click this link to change your password: %{1}"; \ No newline at end of file diff --git a/UI/MainUI/French.lproj/Localizable.strings b/UI/MainUI/French.lproj/Localizable.strings index aa65109e4..f3bcb16f2 100644 --- a/UI/MainUI/French.lproj/Localizable.strings +++ b/UI/MainUI/French.lproj/Localizable.strings @@ -110,3 +110,19 @@ "Close" = "Fermer"; "Missing search parameter" = "Paramètre de recherche manquant"; "Missing type parameter" = "Paramètre de type manquant"; + +/* Password Recovery */ +"Answer" = "Réponse"; +"Secondary e-mail" = "E-mail secondaire"; +"Password lost" = "Mot de passe perdu"; +"No password recovery method has been defined for this user" = "Aucune méthode de récupération de mot de passe n'a été définie pour cet utilisateur"; +"Invalid secret question answer" = "La réponse à la question secrète n'est pas valide"; +"Next" = "Suivant"; +"Back" = "Retour"; +"Please enter a new password below" = "Veuillez saisir un nouveau mot de passe ci-dessous"; +"A link will be sent to %{0}" = "Un lien va être envoyé à %{0}"; +"A password reset link has been sent, please check your recovery e-mail mailbox and click on the link" = "Un lien vous permettant de redéfinir votre mot de passe vous a été envoyé, veuillez vérifier votre boite e-mail de récupération"; +"Invalid configuration for email password recovery" = "Configuration invvalide pour la récupération de mot de passe par e-mail"; +"Password recovery email in error" = "Erreur lors de l'envoi de l'email de récupération"; +"Password reset" = "Réinitialisation de mot de passe"; +"Hi %{0},\nThere was a request to change your password!\n\nIf you did not make this request then please ignore this email.\n\nOtherwise, please click this link to change your password: %{1}" = "Bonjour %{0},\nUne demande de changement de mot de passe a été initiée.\n\nSi vous n'êtes pas à l'origine de cet e-mail, n'en tenez pas compte.\n\nSi vous en êtes bien à l'origine, veuillez cliquer sur le lien ci-dessous pour modifier votre mot de passe: %{1}"; \ No newline at end of file diff --git a/UI/MainUI/SOGoRootPage.m b/UI/MainUI/SOGoRootPage.m index 38a03d34b..ff37701e4 100644 --- a/UI/MainUI/SOGoRootPage.m +++ b/UI/MainUI/SOGoRootPage.m @@ -49,6 +49,8 @@ #import #import #import +#import +#import #if defined(MFA_CONFIG) #include @@ -56,6 +58,8 @@ #import "SOGoRootPage.h" +static const NSString *kJwtKey = @"jwt"; + @implementation SOGoRootPage - (id) init @@ -202,7 +206,6 @@ WOCookie *authCookie, *xsrfCookie; SOGoWebAuthenticator *auth; SOGoUserDefaults *ud; - SOGoUserSettings *us; SOGoUser *loggedInUser; NSDictionary *params; NSString *username, *password, *language, *domain, *remoteHost; @@ -626,6 +629,11 @@ return ([[self loginDomains] count] > 0); } +- (BOOL) hasPasswordRecovery +{ + return [[SOGoSystemDefaults sharedSystemDefaults] isPasswordRecoveryEnabled]; +} + - (void) setItem: (id) _item { ASSIGN (item, _item); @@ -671,7 +679,7 @@ - (WOResponse *) changePasswordAction { - NSString *username, *domain, *password, *newPassword, *value; + NSString *username, *domain, *password, *newPassword, *value, *token; WOCookie *authCookie, *xsrfCookie; NSDictionary *message; NSArray *creds; @@ -681,6 +689,7 @@ SOGoWebAuthenticator *auth; WOResponse *response; WORequest *request; + BOOL passwordRecovery; request = [context request]; message = [[request contentAsString] objectFromJSONString]; @@ -689,6 +698,7 @@ value = [[context request] cookieValueForKey: [auth cookieNameInContext: context]]; creds = nil; username = nil; + passwordRecovery = NO; if (value) { @@ -711,6 +721,12 @@ newPassword = [message objectForKey: @"newPassword"]; // overwrite the value from the session to compare the actual input password = [message objectForKey: @"oldPassword"]; + // get session id for password recovery + token = [message objectForKey: @"token"]; + // If no old password but sessionid set, this is password recovery mode + if ((!password || password == [NSNull null]) && token) { + passwordRecovery = YES; + } // Validate required parameters if (!username) @@ -718,7 +734,7 @@ response = [self responseWithStatus: 403 andString: @"Missing 'username' parameter"]; } - else if (!password) + else if (!password && !passwordRecovery) { response = [self responseWithStatus: 403 andString: @"Missing 'oldPassword' parameter"]; @@ -737,6 +753,8 @@ inDomain: domain oldPassword: password newPassword: newPassword + passwordRecovery: passwordRecovery + token: token perr: &error]) { if (creds) @@ -754,17 +772,19 @@ } response = [self responseWith204]; - authCookie = [auth cookieWithUsername: username - andPassword: newPassword - inContext: context]; - [response addCookie: authCookie]; + if (!passwordRecovery) { + authCookie = [auth cookieWithUsername: username + andPassword: newPassword + inContext: context]; + [response addCookie: authCookie]; - // We update the XSRF protection cookie - creds = [auth parseCredentials: [authCookie value]]; - xsrfCookie = [WOCookie cookieWithName: @"XSRF-TOKEN" - value: [[SOGoSession valueForSessionKey: [creds lastObject]] asSHA1String]]; - [xsrfCookie setPath: [NSString stringWithFormat: @"/%@/", [request applicationName]]]; - [response addCookie: xsrfCookie]; + // We update the XSRF protection cookie + creds = [auth parseCredentials: [authCookie value]]; + xsrfCookie = [WOCookie cookieWithName: @"XSRF-TOKEN" + value: [[SOGoSession valueForSessionKey: [creds lastObject]] asSHA1String]]; + [xsrfCookie setPath: [NSString stringWithFormat: @"/%@/", [request applicationName]]]; + [response addCookie: xsrfCookie]; + } } else response = [self _responseWithLDAPPolicyError: error]; @@ -773,6 +793,219 @@ return response; } +/** + * This action get password recovery data for specified user (mode, secret question, recovery email) + * @return Response + */ +- (WOResponse *) passwordRecoveryAction +{ + NSString *username, *domain; + NSDictionary *jsonData, *message; + WORequest *request; + SOGoUserManager *um; + + username = nil; + domain = nil; + request = [context request]; + + message = [[request contentAsString] objectFromJSONString]; + username = [message objectForKey: @"userName"]; + domain = [message objectForKey: @"domain"]; + um = [SOGoUserManager sharedUserManager]; + + + jsonData = [um getPasswordRecoveryInfosForUsername: username domain: domain]; + return [self responseWithStatus: 200 + andJSONRepresentation: jsonData]; +} + +/** + * This action generates JWT token and send password recovery mail + * Then the JWT token is passed and controlled to changePassword (when clicking on link) + * @return Response + */ +- (WOResponse *) passwordRecoveryEmailAction +{ + NSString *username, *domain, *mode, *uid, *mailDomain, *fromEmail, *toEmail, *jwtToken, *url, *mailContent; + NSDictionary *message, *info; + WORequest *request; + SOGoUserManager *um; + SOGoUserDefaults *userDefaults; + WOResponse *response; + SOGoDomainDefaults *dd; + SOGoUser *ownerUser; + SOGoMailer *mailer; + NSException *e; + + username = nil; + domain = nil; + request = [context request]; + message = [[request contentAsString] objectFromJSONString]; + username = [message objectForKey: @"userName"]; + domain = [message objectForKey: @"domain"]; + mailDomain = [message objectForKey: @"mailDomain"]; + mode = [message objectForKey: @"mode"]; + um = [SOGoUserManager sharedUserManager]; + jwtToken = [request formValueForKey:@"token"]; + + if (!mode && jwtToken) { + response = [self _standardDefaultAction]; + } else if ([mode isEqualToString: SOGoPasswordRecoverySecondaryEmail]) { + if (mailDomain && username) { + // Email recovery + + // Create email from + fromEmail = [NSString stringWithFormat:@"noreply@%@", mailDomain]; + + // Get password recovery email + info = [um contactInfosForUserWithUIDorEmail: username]; + uid = [info objectForKey: @"c_uid"]; + userDefaults = [SOGoUserDefaults defaultsForUser: uid + inDomain: domain]; + toEmail = [userDefaults passwordRecoverySecondaryEmail]; + + if (toEmail) { + // Generate token + jwtToken = [um generateAndSavePasswordRecoveryTokenWithUid: uid username: username domain: domain]; + + // Send mail + ownerUser = [SOGoUser userWithLogin: username]; + dd = [ownerUser domainDefaults]; + mailer = [SOGoMailer mailerWithDomainDefaults: dd]; + url = [NSString stringWithFormat:@"%@%@?token=%@" + , [[request headers] objectForKey:@"origin"] + , [request uri] + , jwtToken]; + + mailContent = [NSString stringWithFormat: @"Subject: %@\n\n%@" + , [self labelForKey: @"Password reset"] + , [self labelForKey: @"Hi %{0},\nThere was a request to change your password!\n\nIf you did not make this request then please ignore this email.\n\nOtherwise, please click this link to change your password: %{1}"]]; + // Replace message placeholders + mailContent = [mailContent stringByReplacingOccurrencesOfString: @"%{0}" withString: username]; + mailContent = [mailContent stringByReplacingOccurrencesOfString: @"%{1}" withString: url]; + e = [mailer sendMailData: [mailContent dataUsingEncoding: NSUTF8StringEncoding] + toRecipients: [NSArray arrayWithObjects: toEmail, nil] + sender: fromEmail + withAuthenticator: [SOGoEmptyAuthenticator sharedSOGoEmptyAuthenticator] + inContext: [self context]]; + + if (!e) { + response = [self responseWithStatus: 200 + andJSONRepresentation: nil]; + } else { + [self logWithFormat: @"Password recovery exception for user %@ : %@", uid, [e reason]]; + response = [self responseWithStatus: 403 + andString: @"Password recovery email in error"]; + } + } else { + [self logWithFormat: @"No recovery email found for password recovery for user %@", uid]; + response = [self responseWithStatus: 403 + andString: @"Invalid configuration for email password recovery"]; + } + } else { + [self logWithFormat: @"No user domain found for password recovery"]; + response = [self responseWithStatus: 403 + andString: @"Invalid configuration for email password recovery"]; + } + } + + return response; +} + +/** + * This action check secret question answer and generates JWT token. + * Then the JWT token is passed and controlled to changePassword + * @return Response + */ +- (WOResponse *) passwordRecoveryCheckAction +{ + NSString *username, *domain, *token, *mode; + NSDictionary *message; + WORequest *request; + SOGoUserManager *um; + WOResponse *response; + + username = nil; + domain = nil; + request = [context request]; + message = [[request contentAsString] objectFromJSONString]; + username = [message objectForKey: @"userName"]; + domain = [message objectForKey: @"domain"]; + mode = [message objectForKey: @"mode"]; + um = [SOGoUserManager sharedUserManager]; + + if ([mode isEqualToString: SOGoPasswordRecoveryQuestion]) { + // Secret question recovery + token = [um getTokenAndCheckPasswordRecoveryDataForUsername: username domain: domain withData: message]; + if (!token) { + response = [self responseWithStatus: 403 + andString: @"Invalid secret question answer"]; + } else { + response = [self responseWithStatus: 200 + andJSONRepresentation: [NSDictionary dictionaryWithObject: token forKey: kJwtKey]]; + } + } else { + response = [self responseWithStatus: 403 + andJSONRepresentation: nil]; + } + + return response; +} + +/** + * Check if password recovery is enabled for user domain + * @return Response + */ +- (WOResponse *) passwordRecoveryEnabledAction +{ + NSString *username, *domain, *domainName; + NSArray *usernameComponents, *passwordRecoveryDomains; + NSDictionary *message, *result; + WORequest *request; + + username = nil; + domain = nil; + domainName = nil; + result = nil; + request = [context request]; + + message = [[request contentAsString] objectFromJSONString]; + username = [message objectForKey: @"userName"]; + domain = [message objectForKey: @"domain"]; + if ([[SOGoSystemDefaults sharedSystemDefaults] + isPasswordRecoveryEnabled]) { + // If no domain, try to retrieve domain from username + if (nil != domain && domain != [NSNull null]) { + domainName = domain; + } else if (nil != username) { + usernameComponents = [username componentsSeparatedByString:@"@"]; // Split on @ and take right part + if (2 == [usernameComponents count]) { + domainName = [[usernameComponents objectAtIndex: 1] lowercaseString]; + } + } + + result = [NSDictionary dictionaryWithObject: domainName forKey: @"domain"]; + } + + passwordRecoveryDomains = [[SOGoSystemDefaults sharedSystemDefaults] + passwordRecoveryDomains]; + if (![[SOGoSystemDefaults sharedSystemDefaults] isPasswordRecoveryEnabled]) { + return [self responseWithStatus: 403 + andJSONRepresentation: nil]; + } else if (username && [NSNull null] != username && + domainName && passwordRecoveryDomains && + [passwordRecoveryDomains containsObject: domainName]) { + return [self responseWithStatus: 200 + andJSONRepresentation: result]; + } else if (username && [NSNull null] != username && !passwordRecoveryDomains) { + return [self responseWithStatus: 200 + andJSONRepresentation: result]; + } else { + return [self responseWithStatus: 403 + andJSONRepresentation: nil]; + } +} + - (BOOL) isTotpEnabled { #if defined(MFA_CONFIG) diff --git a/UI/MainUI/product.plist b/UI/MainUI/product.plist index 0d2f6fdcf..50f0d734d 100644 --- a/UI/MainUI/product.plist +++ b/UI/MainUI/product.plist @@ -173,6 +173,26 @@ pageName = "SOGoRootPage"; actionName = "changePassword"; }; + passwordRecovery = { + protectedBy = ""; + pageName = "SOGoRootPage"; + actionName = "passwordRecovery"; + }; + passwordRecoveryEmail = { + protectedBy = ""; + pageName = "SOGoRootPage"; + actionName = "passwordRecoveryEmail"; + }; + passwordRecoveryCheck = { + protectedBy = ""; + pageName = "SOGoRootPage"; + actionName = "passwordRecoveryCheck"; + }; + passwordRecoveryEnabled = { + protectedBy = ""; + pageName = "SOGoRootPage"; + actionName = "passwordRecoveryEnabled"; + }; loading = { protectedBy = ""; pageName = "UIxLoading"; diff --git a/UI/PreferencesUI/English.lproj/Localizable.strings b/UI/PreferencesUI/English.lproj/Localizable.strings index 472a7ddf4..2b40ceb36 100644 --- a/UI/PreferencesUI/English.lproj/Localizable.strings +++ b/UI/PreferencesUI/English.lproj/Localizable.strings @@ -489,4 +489,12 @@ /* External Sieve scripts */ "An external Sieve script is active" = "An external Sieve script is active"; "Sieve is a programming language that can be used for email filtering. If you let SOGo handle your filters, vacation and forward settings, your active script will be disabled." = "Sieve is a programming language that can be used for email filtering. If you let SOGo handle your filters, vacation and forward settings, your active script will be disabled."; -"Let SOGo handle everything" = "Let SOGo handle everything"; \ No newline at end of file +"Let SOGo handle everything" = "Let SOGo handle everything"; + +/* Password Recovery */ +"Password recovery mode" = "Password recovery"; +"Question" = "Question"; +"Secondary e-mail" = "Secondary e-mail"; +"Answer" = "Answer"; +"Password recovery" = "Password recovery"; +"Password change" = "Password change"; diff --git a/UI/PreferencesUI/French.lproj/Localizable.strings b/UI/PreferencesUI/French.lproj/Localizable.strings index 5131dee9c..b7fdca31f 100644 --- a/UI/PreferencesUI/French.lproj/Localizable.strings +++ b/UI/PreferencesUI/French.lproj/Localizable.strings @@ -489,4 +489,12 @@ /* External Sieve scripts */ "An external Sieve script is active" = "Un script Sieve externe est actif"; "Sieve is a programming language that can be used for email filtering. If you let SOGo handle your filters, vacation and forward settings, your active script will be disabled." = "Sieve est un langage de programmation qui peut être utilisé pour le filtrage des messages. Si vous laissez SOGo gérer vos filtres, votre message d'absence et vos paramètres de transfert, votre script actuel sera désactivé."; -"Let SOGo handle everything" = "Laissez SOGo s'occuper de tout"; \ No newline at end of file +"Let SOGo handle everything" = "Laissez SOGo s'occuper de tout"; + +/* Password Recovery */ +"Password recovery mode" = "Récupération de mot de passe"; +"Question" = "Question"; +"Answer" = "Réponse"; +"Secondary e-mail" = "E-mail secondaire"; +"Password recovery" = "Récupération de mot de passe"; +"Password change" = "Changement de mot de passe"; \ No newline at end of file diff --git a/UI/PreferencesUI/UIxJSONPreferences.m b/UI/PreferencesUI/UIxJSONPreferences.m index d97388a21..6a9dd6061 100644 --- a/UI/PreferencesUI/UIxJSONPreferences.m +++ b/UI/PreferencesUI/UIxJSONPreferences.m @@ -206,6 +206,18 @@ static SoProduct *preferencesProduct = nil; if (![[defaults source] objectForKey: @"SOGoCalendarDefaultReminder"]) [[defaults source] setObject: [defaults calendarDefaultReminder] forKey: @"SOGoCalendarDefaultReminder"]; + if (![[defaults source] objectForKey: @"SOGoPasswordRecoveryMode"]) + [[defaults source] setObject: [defaults passwordRecoveryMode] forKey: @"SOGoPasswordRecoveryMode"]; + + if (![[defaults source] objectForKey: @"SOGoPasswordRecoveryQuestion"]) + [[defaults source] setObject: [defaults passwordRecoveryQuestion] forKey: @"SOGoPasswordRecoveryQuestion"]; + + if (![[defaults source] objectForKey: @"SOGoPasswordRecoveryQuestionAnswer"]) + [[defaults source] setObject: [defaults passwordRecoveryQuestionAnswer] forKey: @"SOGoPasswordRecoveryQuestionAnswer"]; + + if (![[defaults source] objectForKey: @"SOGoPasswordRecoverySecondaryEmail"]) + [[defaults source] setObject: [defaults passwordRecoverySecondaryEmail] forKey: @"SOGoPasswordRecoverySecondaryEmail"]; + // Populate default calendar categories, based on the user's preferred language if (![[defaults source] objectForKey: @"SOGoCalendarCategories"]) { diff --git a/UI/PreferencesUI/UIxPreferences.m b/UI/PreferencesUI/UIxPreferences.m index 174596ab8..d48fd3b26 100644 --- a/UI/PreferencesUI/UIxPreferences.m +++ b/UI/PreferencesUI/UIxPreferences.m @@ -1638,4 +1638,40 @@ static NSArray *reminderValues = nil; return results; } +// Password recovery + +- (NSArray *) passwordRecoveryList +{ + return [NSArray arrayWithObjects: + SOGoPasswordRecoveryDisabled, + SOGoPasswordRecoveryQuestion, + SOGoPasswordRecoverySecondaryEmail, + nil]; +} + +- (NSArray *) passwordRecoveryQuestionList +{ + return [NSArray arrayWithObjects: + SOGoPasswordRecoveryQuestion1, + SOGoPasswordRecoveryQuestion2, + SOGoPasswordRecoveryQuestion3, + nil]; +} + +- (NSString *) itemPasswordRecoveryText +{ + return [self commonLabelForKey: [NSString stringWithFormat: @"passwordRecovery_%@", + item]]; +} + +- (BOOL) shouldDisplayPasswordRecovery +{ + return [[SOGoSystemDefaults sharedSystemDefaults] isPasswordRecoveryEnabled]; +} + +- (BOOL) shouldDisplayPasswordSection +{ + return [self shouldDisplayPasswordRecovery] || [self shouldDisplayPasswordChange]; +} + @end diff --git a/UI/SOGoUI/UIxComponent.m b/UI/SOGoUI/UIxComponent.m index eac316e5b..e0c0d810b 100644 --- a/UI/SOGoUI/UIxComponent.m +++ b/UI/SOGoUI/UIxComponent.m @@ -792,7 +792,12 @@ static SoProduct *commonProduct = nil; // needs to be created (or destroyed) during the session initialization if ([_actionName isEqualToString: @"connect"] || [_actionName isEqualToString: @"changePassword"] || - [_actionName isEqualToString: @"logoff"]) + [_actionName isEqualToString: @"logoff"] || + [_actionName isEqualToString: @"passwordRecovery"] || + [_actionName isEqualToString: @"passwordRecoveryEmail"] || + [_actionName isEqualToString: @"passwordRecoveryCheck"] || + [_actionName isEqualToString: @"passwordRecoveryEnabled"] + ) { return [super performActionNamed: _actionName]; } diff --git a/UI/Templates/ContactsUI/UIxContactEditorTemplate.wox b/UI/Templates/ContactsUI/UIxContactEditorTemplate.wox index 277f2f3b9..69bbe5a88 100644 --- a/UI/Templates/ContactsUI/UIxContactEditorTemplate.wox +++ b/UI/Templates/ContactsUI/UIxContactEditorTemplate.wox @@ -6,7 +6,7 @@ xmlns:label="OGo:label" xmlns:rsrc="OGo:url"> -
+
diff --git a/UI/Templates/MainUI/SOGoRootPage.wox b/UI/Templates/MainUI/SOGoRootPage.wox index 6539eddbd..43f5d13f4 100644 --- a/UI/Templates/MainUI/SOGoRootPage.wox +++ b/UI/Templates/MainUI/SOGoRootPage.wox @@ -41,72 +41,84 @@ - - - person - - - - - email - - - - -
- language - - - - - - - - - +
+ + + person + -
+ + + email + + + - - +
- domain + language - - + + + - +
-
- -
- - - + + + +
+ domain + + + + + + + + + +
+
+ +
+ + + +
+
+ + +
+
+ +
-
+
info - - arrow_forward - +
+ + arrow_forward + +
- +
- watch_later -
+ ng-switch-when="passwordchange"> + watch_later + vpn_key +
+
+ +
- + @@ -239,6 +255,59 @@
+ + +
+ vpn_key +
+
+
+ {{ app.passwordRecovery.passwordRecoveryQuestion }} + + + + +
+
+ {{ app.passwordRecovery.passwordRecoverySecondaryEmailText }} +
+
+
+ + + +
+ + + +
+
+ + + +
+
+
+
+
+ local_shipping +
+
+
+ +
+
+
+ + + +
+
+
+
+
@@ -277,6 +346,7 @@
+ diff --git a/UI/WebServerResources/js/Common.js b/UI/WebServerResources/js/Common.js index 484d2460b..fcdeb3df6 100644 --- a/UI/WebServerResources/js/Common.js +++ b/UI/WebServerResources/js/Common.js @@ -1,2 +1,2 @@ -function l(){var n,e,t=arguments[0],i=t,r=arguments;for(labels[t]?i=labels[t]:clabels[t]&&(i=clabels[t]),n=1,e=0;n');return s.on("load",function(){var e=i.get("$state");2"+e+"
");return e.find("a").attr("target","_blank"),t.trustAs("html",e.html())}}e.$inject=["$sce"],angular.module("SOGo.Common").filter("ensureTarget",e)}(),function(){"use strict";angular.module("SOGo.Common").filter("loc",function(){return l})}(),function(){"use strict";angular.module("SOGo.Common").filter("range",function(){return function(e){for(var t=[],n=0;n"):void 0}}e.$inject=["linkyFilter"],angular.module("SOGo.Common").filter("txt2html",e)}(),function(){"use strict";function e(t,n,e,i,r,o,s){var a=this;function c(e,t){if(t&&t.target.parentNode.classList.contains("md-secondary"))return!1;a.selectedUid==e.uid?a.selectedUid=null:(a.selectedUid=e.uid,(a.selectedUser=e).inactive||a.selectedUser.$rights())}a.users=r,a.folder=s,a.selectedUser=null,a.selectedUid=null,a.userToAdd="",a.searchText="",a.folderClassName=function(){return!!angular.isFunction(s.getClassName)&&s.getClassName("bg")},a.templateName=function(e){return"UIx"+(t[0].getElementById("UIxAnonymousUserRightsEditor")&&e.$isAnonymous()?"Anonymous":"")+"UserRightsEditor"},a.userFilter=function(e){return o.$filter(e,s.$acl.users,{dry:!0})},a.closeModal=function(){s.$acl.$resetUsersRights(),e.hide()},a.saveModal=function(){s.$acl.$saveUsersRights().then(function(){e.hide()},function(e,t){i.alert(l("Warning"),l("An error occured, please try again."))})},a.confirmChange=function(e){e=e.$confirmRights(a.folder);e&&(a.confirmation.showing=!0,a.confirmation.message=e)},a.removeUser=function(e){n(function(){s.$acl.$removeUser(e.uid)},500)},a.addUser=function(e){e&&s.$acl.$addUser(e).then(function(e){a.userToAdd="",a.searchText="",a.selectedUid=null,e&&c(e)})},a.toggleAllRights=function(e){s.$acl.$toggleAllRights(e)},a.selectUser=c,a.hasNoRight=function(e){return s.$acl.$hasNoRight(e)},a.showRights=function(e){return a.selectedUid==e.uid&&!e.inactive},a.confirmation={showing:!1,message:""}}e.$inject=["$document","$timeout","$mdDialog","Dialog","usersWithACL","User","folder"],angular.module("SOGo.Common").controller("AclController",e)}(),function(){"use strict";function e(e,t,n,i,r,o,s,a,c,u,d,h,m,g){var p=new m(h.baseURL(),h.activeUser());function f(e,t){var n;t.data&&t.data.message&&angular.isString(t.data.message)?n=t.data.message:t.status&&(n=t.statusText),n?a.show({template:["",'
',' error_outline'," "+l(n)+"","
","
"].join(""),hideDelay:5e3,position:d.toastPosition}):u.debug("untrap error")}this.$onInit=function(){t.isPopup=h.isPopup,t.activeUser=h.activeUser(),t.baseURL=h.baseURL(),t.leftIsClose=!c(d["gt-md"]),t.centerIsClose=!!o.centerIsClose&&!t.leftIsClose,t.currentDay=window.currentDay,n(function(){i(function(){r.get("../date").then(function(e){t.currentDay=e})},864e5)},1e3*window.currentDay.secondsBeforeTomorrow),t.$watch(function(){return c(d["gt-xs"])},function(e){t.isGtExtraSmall=e}),t.$watch(function(){return c(d["gt-md"])},function(e){(t.isGtMedium=e)&&(t.leftIsClose=!1)}),e.$on("http:Error",f),t.isPopup||(h.activeUser("path").calendar&&g.getAlarms(),h.activeUser("path").mail&&g.pollInbox())},t.toggleLeft=function(){t.isGtMedium?t.leftIsClose=!t.leftIsClose:(t.leftIsClose=!s("left").isOpen(),t.leftIsClose&&angular.element(o).triggerHandler("resize"),s("left").toggle().then(function(){u.debug("toggle left is done")}))},t.toggleRight=function(){s("right").toggle().then(function(){u.debug("toggle right is done")})},t.toggleCenter=function(e){t.centerIsClose=!t.centerIsClose,e&&e.save&&p.post(null,"saveListState",{state:t.centerIsClose?"collapse":"rise"})}}e.$inject=["$rootScope","$scope","$timeout","$interval","$http","$window","$mdSidenav","$mdToast","$mdMedia","$log","sgConstant","sgSettings","Resource","Preferences"],angular.module("SOGo.Common").controller("navController",e)}(),function(){"use strict";function s(e){this.folderId=e}s.factory=["$q","$timeout","sgSettings","Resource","User",function(e,t,n,i,r){return angular.extend(s,{$q:e,$timeout:t,$$resource:new i(n.activeUser("folderURL"),n.activeUser()),$User:r}),s}],angular.module("SOGo.Common").factory("Acl",s.factory),s.prototype.$users=function(t){var n,i=this,r=s.$q.defer();return this.users?(r.resolve(this.users),r.promise):(angular.isDefined(t)?s.$$resource.userResource(t):s.$$resource).fetch(this.folderId,"acls").then(function(e){return i.users=[],angular.forEach(e.users,function(e){(n=new s.$User(e)).canSubscribeUser=n.isSubscribed,n.wasSubscribed=n.isSubscribed,n.$rights=angular.bind(n,n.$acl,i.folderId,t),i.users.push(n)}),r.resolve(i.users),i.users},function(e){throw r.reject(l(e.statusText)),Error("No access to object")})},s.prototype.$addUser=function(e,t){var n=this,i=s.$q.defer(),r={uid:e.uid};return!e.uid||-1<_.indexOf(_.map(this.users,"uid"),e.uid)?i.resolve():(angular.isDefined(t)?s.$$resource.userResource(t):s.$$resource).fetch(this.folderId,"addUserInAcls",r).then(function(){e.wasSubscribed=!1,e.userClass=e.isGroup?"normal-group":"normal-user",e.$rights=angular.bind(e,e.$acl,n.folderId,t),n.users.push(e),i.resolve(e)},function(e,t){i.reject(l("An error occured, please try again."))}),i.promise},s.prototype.$removeUser=function(t,e){var n=this,i={uid:t},e=(angular.isDefined(e)?s.$$resource.userResource(e):s.$$resource).fetch(this.folderId,"removeUserFromAcls",i);return e.then(function(){var e=_.indexOf(_.map(n.users,"uid"),t);0<=e&&(n.users[e].$shadowRights=null,n.users.splice(e,1))})},s.prototype.$toggleAllRights=function(n){var i=!angular.isUndefined(_.find(_.values(n.rights),function(e){return 1!==e&&"Modifier"!==e}));_.forEach(n.rights,function(e,t){angular.isNumber(n.rights[t])?n.rights[t]=i?1:0:n.rights[t]=i?"Modifier":"None"})},s.prototype.$hasNoRight=function(e){e=_.find(e.rights,function(e,t){return angular.isNumber(e)?1===e:"None"!==e});return _.isUndefined(e)},s.prototype.$resetUsersRights=function(){angular.forEach(this.users,function(e){e.$resetRights()})},s.prototype.$saveUsersRights=function(e){var t=this,n=s.$q.defer(),i=s.$q.defer(),r={action:"saveUserRights"},o=[];return angular.forEach(this.users,function(e){e.$rightsAreDirty()&&o.push(e.$omit())}),o.length?(angular.isDefined(e)?s.$$resource.userResource(e):s.$$resource).save(this.folderId,o,r).then(function(){angular.forEach(t.users,function(e){e.$rightsAreDirty()&&(e.$shadowRights=angular.copy(e.rights))}),n.resolve()},n.reject):n.resolve(),o=[],angular.forEach(this.users,function(e){!e.wasSubscribed&&e.isSubscribed&&o.push(e.uid)}),o.length?(r={uids:o.join(",")},s.$$resource.fetch(this.folderId,"subscribeUsers",r).then(function(){angular.forEach(t.users,function(e){e.wasSubscribed=e.isSubscribed}),i.resolve()},i.reject)):i.resolve(),s.$q.all([n.promise,i.promise])}}(),function(){"use strict";angular.module("SOGo.Authentication",["ngCookies"]).constant("passwordPolicyConfig",{PolicyPasswordChangeUnsupported:-3,PolicyPasswordSystemUnknown:-2,PolicyPasswordUnknown:-1,PolicyPasswordExpired:0,PolicyAccountLocked:1,PolicyChangeAfterReset:2,PolicyPasswordModNotAllowed:3,PolicyMustSupplyOldPassword:4,PolicyInsufficientPasswordQuality:5,PolicyPasswordTooShort:6,PolicyPasswordTooYoung:7,PolicyPasswordInHistory:8,PolicyNoError:65535}).provider("Authentication",function(){function h(e,t){var n,i;return t&&(e+="@"+t),t=""+window.location.href,"/"==(e=ApplicationBaseURL+encodeURIComponent(e))[0]&&(i=(n=t.split("/"))[2],e=n[0]+"//"+i+e),t.startsWith(e)&&!t.endsWith("/logoff")?t:e}function e(c,u,s,d){return{login:function(e){var t,n=c.defer(),i=e.username,r=e.password,o=e.verificationCode,s=e.domain,a=e.rememberLogin?1:0;return e.loginSuffix&&!i.endsWith(e.loginSuffix)&&(i+=loginSuffix,s=!1),e.language&&"WONoSelectionString"!=e.language&&(t=e.language),u({method:"POST",url:"/SOGo/connect",data:{userName:i,password:r,verificationCode:o,domain:s,language:t,rememberLogin:a}}).then(function(e){var t=e.data;navigator&&!navigator.cookieEnabled?n.reject({error:l("cookiesNotEnabled")}):void 0!==t.totpMissingKey&&202==e.status?n.resolve({totpmissingkey:1}):void 0!==t.totpDisabled?n.resolve({cn:t.cn,url:h(i,s),totpdisabled:1}):void 0!==t.expire&&void 0!==t.grace?t.expire<0&&0','
',' ','

'," "," ",' '," ","
"," ",' '," "+l("Cancel")," ",' '," "+l("OK")," "," ","
",""].join(""),controller:o}),o.$inject=["scope","$mdDialog"],r.promise},e.$inject=["$q","$mdDialog"],angular.module("SOGo.Common").factory("Dialog",e)}(),function(){"use strict";angular.module("SOGo.Common").factory("Gravatar",function(){return function(e,t,n,i){var r,o=t,s=n;return e?(t||(o=48),"https://www.gravatar.com/avatar/"+(e=0<=(t=e.indexOf("<"))&&t<(r=e.indexOf(">",t))?e.substring(t+1,r):e).md5()+"?s="+o+"&d="+(n=s&&"none"!=s?n:i&&i.no_404?"mm":"404")):""}})}(),function(){"use strict";function a(e,t,n,i,r,o,s){angular.extend(this,{_http:e,_q:t,_window:n,_cookies:i,_path:r,_activeUser:o}),angular.extend(this,s),this._path=this._path.replace(/\/$/,"")}a.$factory=["$http","$q","$window","$cookies",function(i,r,o,s){return function(e,t,n){return new a(i,r,o,s,e,t,n)}}],angular.module("SOGo.Common").factory("Resource",a.$factory),a.prototype.encodeURL=function(e){var t=this,n=e;return angular.isArray(n)||(n=e.split("/")),_.map(n,function(e){return t._window.encodeURIComponent(e.toString())})},a.prototype.userResource=function(e){var t=_.compact(this._activeUser.folderURL.split("/"));return e&&t.splice(t.length-1,1,escape(e)),new a(this._http,this._q,this._window,this._cookies,"/"+t.join("/"),this._activeUser)},a.prototype.path=function(){var e=[this._path];return 0",' ','
',"
","
","
"," "," ",' '," {{keys[0].description}}",'
'," {{keys[0].lkey || hotkey}}","
","
","
","
",""].join(""),controller:t,locals:{hotkeys:e._hotkeys}}).finally(function(){e._cheatSheet=null}),t.$inject=["$scope","hotkeys"]},n}(this.$get=e).$inject=["$rootScope","$window"]})}(),function(){"use strict";function c(e){e&&this.init(e)}c.factory=["$q","$log","sgSettings","Resource",function(e,t,n,i){return angular.extend(c,{$q:e,$log:t,$$resource:new i(n.activeUser("folderURL"),n.activeUser()),$query:"",$users:[]}),c}],angular.module("SOGo.Common").factory("User",c.factory),c.$filter=function(e,s,a){var t=c.$$resource,n={search:e};if(a&&a.dry)a&&a.uid&&(t=c.$$resource.userResource(a.uid));else{if(!e)return c.$users.splice(0,c.$users.length),c.$q.when(c.$users);if(c.$query==e)return c.$q.when(c.$users);c.$query=e}return t.fetch(null,"usersSearch",n).then(function(e){function n(e){return this.uid==e.uid}var t,i,r,o;for(a?a.dry?o=[]:a.results&&(o=a.results):o=c.$users,t=s?_.filter(e.users,function(e){return!_.find(s,_.bind(n,e))}):e.users,i=o.length-1;0<=i;i--)r=o[i],_.find(t,_.bind(n,r))||o.splice(i,1);return _.forEach(t,function(e,t){_.isUndefined(_.find(o,_.bind(n,e)))&&(e=new c(e),o.splice(t,0,e))}),c.$log.debug(o),o})},c.prototype.init=function(e){angular.extend(this,e),this.$$shortFormat||(this.$$shortFormat=this.$shortFormat()),this.$$image||(this.$$image=this.image),this.$avatarIcon=this.$isGroup()||this.$isSpecial()?"group":"person",this.empty=" "},c.prototype.$fullname=function(){var e=this.cn||this.uid;return this.c_info&&(e+=" ("+this.c_info.split("\n").join("; ")+")"),e},c.prototype.$shortFormat=function(e){var t=this.$fullname(),n=this.c_email;return!(e&&!1===e.email)&&n&&t!=n&&(t+=" <"+n+">"),t},c.prototype.$acl=function(e,t){var n=this,i=c.$q.defer(),r={uid:this.uid};return this.$shadowRights?i.resolve(this.rights):(angular.isDefined(t)?c.$$resource.userResource(t):c.$$resource).fetch(e,"userRights",r).then(function(e){return n.rights=e,n.$shadowRights=angular.copy(e),i.resolve(e),e}),i.promise},c.prototype.$isGroup=function(){return this.isGroup||this.userClass&&"normal-group"==this.userClass},c.prototype.$isAnonymous=function(){return"anonymous"==this.uid},c.prototype.$isSpecial=function(){return this.userClass&&"public-user"==this.userClass},c.prototype.$confirmRights=function(e){var t=!1;return!this.$confirmation&&(_.some(_.values(this.rights))&&("anonymous"==this.uid?"AddressBook"==e.constructor.name?t=l('Potentially anyone on the Internet will be able to access your address book "%{0}", even if they do not have an account on this system. Is this information suitable for the public Internet?',e.name):"Calendar"==e.constructor.name&&(t=l('Potentially anyone on the Internet will be able to access your calendar "%{0}", even if they do not have an account on this system. Is this information suitable for the public Internet?',e.name)):"anyone"!=this.uid&&""!=this.uid||("AddressBook"==e.constructor.name?t=l('Any user with an account on this system will be able to access your address book "%{0}". Are you certain you trust them all?',e.name):"Calendar"==e.constructor.name?t=l('Any user with an account on this system will be able to access your calendar "%{0}". Are you certain you trust them all?',e.name):"Mailbox"==e.constructor.name&&(t=l('Any user with an account on this system will be able to access your mailbox "%{0}". Are you certain you trust them all?',e.name)))),this.$confirmation=t)},c.prototype.$rightsAreDirty=function(){return this.rights&&!_.isEqual(this.rights,this.$shadowRights)},c.prototype.$resetRights=function(e){var t=this;e?_.map(_.keys(this.rights),function(e){angular.isString(t.rights[e])?t.rights[e]="None":t.rights[e]=0}):this.$shadowRights&&(this.rights=angular.copy(this.$shadowRights))},c.prototype.$folders=function(e){var t=this,n=c.$q.defer(),e={type:e};return this.$$folders?n.resolve(this.$$folders):c.$$resource.userResource(this.uid).fetch(null,"foldersSearch",e).then(function(e){t.$$folders=e.folders,n.resolve(e.folders)}),n.promise},c.prototype.$omit=function(){var n={};return angular.forEach(this,function(e,t){"constructor"!=t&&"$"!=t[0]&&(n[t]=e)}),n},c.prototype.toString=function(){return"[User "+this.c_email+"]"}}(),function(){"use strict";function e(c,e,u){return{restrict:"A",scope:{autogrow:"=sgAutogrow"},link:function(e,t,n){var i,r,o,s,a;function l(){s=(s=i.value.encodeEntities()).replace(/\n/g,"
"),o.innerHTML=s+'
',o.style.visibility="hidden",o.style.display="block",i.style.height=Math.max(r,o.offsetHeight)+"px",o.style.visibility="visible",o.style.display="none"}e.autogrow&&(i=t[0],r=i.clientHeight,o=c[0].createElement("div"),s=null,o.classList.add("md-input"),o.classList.add("plain-text"),o.style.display="none",o.style.whiteSpace="pre-wrap",o.style.wordWrap="break-word",i.parentNode.appendChild(o),i.style.resize="none",i.style.overflow="hidden",t.on("keyup",u.debounce(l,200)),t.on("paste",u.debounce(l,0)),a=e.$watch(function(){return t[0].value},function(e){e&&(l(),a())}))}}}e.$inject=["$document","$timeout","$mdUtil"],angular.module("SOGo.Common").directive("sgAutogrow",e)}(),function(){"use strict";function e(e,t,r,n,o,s){var a,i;function l(){a.url=null,a.urlEmail=null,a.img.addClass("ng-hide"),a.genericImg.removeClass("ng-hide")}function c(){a.genericImg.addClass("ng-hide"),a.img.removeClass("ng-hide")}a=this,e.$on("$destroy",function(){i&&t.off("click",i)}),e.$watch(function(){return a.email},function(e,t){var n,i;e&&a.urlEmail!=e?(l(),o.defaults.SOGoGravatarEnabled&&(i=s(n=e,a.size,o.defaults.SOGoAlternateAvatar),r({method:"GET",url:i,cache:!0,headers:{Accept:"image/*"}}).then(function(){a.url||(a.url=i,a.urlEmail=n,c())},function(){l()}))):e||l()}),"sg-src"in t[0].attributes&&e.$watch(function(){return a.src},function(e){e&&(a.url=e,a.urlEmail=""+a.email,t.addClass("sg-avatar-image--zoomable"),i=function(){t.toggleClass("sg-avatar-image--zoom")},t.on("click",i),c())})}e.$inject=["$scope","$element","$http","$q","Preferences","Gravatar"],angular.module("SOGo.Common").directive("sgAvatarImage",function(){return{restrict:"AE",scope:{},bindToController:{size:"@",email:"=sgEmail",src:"=sgSrc"},transclude:!0,template:['
'," ",' ',' ',"
"].join(""),link:function(e,t,n,i){var r,o=t.find("img"),t=t.find("md-icon"),s=angular.element(t[0]),a=angular.element(t[1]);n.size&&(o.attr("width",n.size),o.attr("height",n.size),s.css("font-size",n.size+"px"),a.css("font-size",parseInt(.4*n.size)+"px"));angular.isDefined(n.ngDisabled)&&(r=e.$watch(n.ngDisabled,function(e){n.disabled&&a.css({display:"block"}),r()}));i.img=o,i.genericImg=s},controller:"sgAvatarImageController",controllerAs:"vm"}}).controller("sgAvatarImageController",e)}(),function(){"use strict";function e(e,l,c){return{link:function(e,t){var n=t[0].querySelector(".sg-button-toggle"),i=n.querySelector(".sg-icon-toggle"),r="md-rotate-180-ccw",o=t[0].querySelector(".sg-block-toggle"),s=!1;function a(){o.setAttribute("aria-hidden",!s),o.setAttribute("aria-expanded",s),s||(o.style.visibility="hidden")}n.classList.add("md-clickable"),angular.element(n).on("click",function(){(s=!s)?i.classList.add(r):i.classList.remove(r),s&&(o.style.visibility="visible"),c(function(){var e=s?o.scrollHeight:0;l(angular.element(o),{easing:"cubic-bezier(0.35, 0, 0.25, 1)",to:{height:e+"px"},duration:.75}).start().then(function(){a()})})}),a()}}}e.$inject=["$mdUtil","$animateCss","$$rAF"],angular.module("SOGo.Common").directive("sgBlockToggle",e)}(),function(){"use strict";function e(a,l,c,u){var d="sg-checked";return{restrict:"E",replace:!0,transclude:!0,require:"?ngModel",template:['
"].join(""),scope:{},require:["ngModel","sgTimePane","?^mdInputContainer"],controller:e,controllerAs:"ctrl",bindToController:!0,link:function(e,t,n,i){var r=i[0],o=i[1];if(i[2])throw Error("sg-timepicker should not be placed inside md-input-container.");o.configureNgModel(r,o)}}});var g=0;function e(e,t,n,i,r,o,s,a,l){var c;o(e),this.$element=e,this.$scope=t,this.dateUtil=n,this.$mdUtil=i,this.keyCode=r.KEY_CODE,this.$$rAF=s,this.timePaneElement=e[0].querySelector(".sg-time-pane"),this.ngModelCtrl=null,this.SELECTED_TIME_CLASS="sg-time-selected",this.FOCUSED_TIME_CLASS="md-focus",this.id=g++,this.displayTime=null,this.selectedTime=null,this.isInitialized=!1,t.hours=[],t.hours[0]=[],t.hours[0][0]=[],t.hours[0][1]=[],t.hours[1]=[],t.hours[1][0]=[],t.hours[1][1]=[];for(var u=0;u<6;u++)t.hours[0][0][u]={id:"tp-"+this.id+"-hour-"+u,displayName:u<10?"0"+u:""+u,selected:!1},t.hours[0][1][u]={id:"tp-"+this.id+"-hour-"+(u+6),displayName:u+6<10?"0"+(u+6):""+(u+6),selected:!1},t.hours[1][0][u]={id:"tp-"+this.id+"-hour-"+(u+12),displayName:""+(u+12),selected:!1},t.hours[1][1][u]={id:"tp-"+this.id+"-hour-"+(u+18),displayName:""+(u+18),selected:!1};for(t.min5=[],t.min5[0]=[],t.min5[1]=[],u=0;u<6;u++)t.min5[0][u]={id:"tp-"+this.id+"-minute5-"+(c=5*u),displayName:c<10?":0"+c:":"+c,selected:!0},t.min5[1][u]={id:"tp-"+this.id+"-minute5-"+(c+30),displayName:":"+(c+30),selected:!1};for(t.min1=[],u=0;u<12;u++){t.min1[u]=[];for(var d=0;d<5;d++)t.min1[u][d]={id:"tp-"+this.id+"-minute-"+(c=5*u+d),displayName:c<10?":0"+c:":"+c,selected:!0}}t.show5min=!0,t.getToggleBtnLbl=function(){return t.is5min()?">>":"<<"},t.toggleManual5min=function(){t.manual5min=!t.is5min()},t.is5min=function(){return!0===t.manual5min||!1===t.manual5min?t.manual5min:t.show5min},a.tabindex||e.attr("tabindex","-1");var h=this,m=(this.hourClickHandler=function(e){var t=new Date(h.displayTime);t.setHours(Number(e)),h.setNgModelValue(t,"hours")},t.hourClickHandler=this.hourClickHandler,this.minuteClickHandler=function(e){var e=e.substr(1),t=new Date(h.displayTime);t.setMinutes(Number(e)),h.setNgModelValue(t,"minutes")},t.minuteClickHandler=this.minuteClickHandler,angular.bind(this,this.handleKeyEvent));angular.element(document.body).on("keydown",m),t.$on("$destroy",function(){angular.element(document.body).off("keydown",m)})}e.$inject=["$element","$scope","$$mdDateUtil","$mdUtil","$mdConstant","$mdTheming","$$rAF","$attrs","$mdDateLocale"],e.prototype.configureNgModel=function(e,t){var n=this;n.ngModelCtrl=e,n.$mdUtil.nextTick(function(){n.isInitialized=!0}),e.$render=function(){var e=this.$viewValue;n.$mdUtil.nextTick(function(){n.changeSelectedTime(e,t)})}},e.prototype.changeSelectedTime=function(e,t){var n,i,r=this.selectedTime;this.selectedTime=e,this.displayTime=new Date(e),r&&(i=r.getHours(),(i=document.getElementById("tp-"+t.id+"-hour-"+i))&&(i.classList.remove(this.SELECTED_TIME_CLASS),i.setAttribute("aria-selected","false")),i=r.getMinutes(),(r=document.getElementById("tp-"+t.id+"-minute-"+i))&&(r.classList.remove(this.SELECTED_TIME_CLASS),r.setAttribute("aria-selected","false")),(r=document.getElementById("tp-"+t.id+"-minute5-"+i))&&(r.classList.remove(this.SELECTED_TIME_CLASS),r.setAttribute("aria-selected","false"))),e&&(i=e.getHours(),(r=document.getElementById("tp-"+t.id+"-hour-"+i))&&(r.classList.add(this.SELECTED_TIME_CLASS),r.setAttribute("aria-selected","true")),(i=e.getMinutes())%5==0?(t.$scope.show5min=!0,(n=document.getElementById("tp-"+t.id+"-minute5-"+i))&&(n.classList.add(this.SELECTED_TIME_CLASS),n.setAttribute("aria-selected","true"))):t.$scope.show5min=!1,(n=document.getElementById("tp-"+t.id+"-minute-"+i))&&(n.classList.add(this.SELECTED_TIME_CLASS),n.setAttribute("aria-selected","true")))},e.prototype.setNgModelValue=function(e,t){return this.$scope.$emit("sg-time-pane-change",{date:e,changed:t}),this.ngModelCtrl.$setViewValue(e),this.ngModelCtrl.$render(),e},e.prototype.handleKeyEvent=function(e){var t=this;this.$scope.$apply(function(){e.which==t.keyCode.ESCAPE||e.which==t.keyCode.TAB?(t.$scope.$emit("md-time-pane-close"),e.which==t.keyCode.TAB&&e.preventDefault()):e.which===t.keyCode.ENTER&&(t.setNgModelValue(t.displayTime,"enter"),e.preventDefault())})},e.prototype.focus=function(e,t){var e=e||this.selectedTime||this.today,n=this.timePaneElement.querySelector(".md-focus");n&&n.classList.remove(this.FOCUSED_TIME_CLASS),e&&(n=e.getHours(),(e=document.getElementById("tp-"+t.id+"-hour-"+n))&&(e.classList.add(this.FOCUSED_TIME_CLASS),e.focus()))}}(),function(){"use strict";function e(u,d,h){return{template:function(e,t){t=t.ariaLabel||t.mdPlaceholder;return['",'
",' ',' ','
',"
","
",'
','
','
',"
",'
',' ',"
","
"].join("")},require:["ngModel","sgTimepicker","?^mdInputContainer","?^form"],scope:{placeholder:"@mdPlaceholder"},controller:t,controllerAs:"ctrl",bindToController:!0,link:function(e,t,n,i){var r,o,s=i[0],a=i[1],l=i[2],c=i[3],i=u.parseAttributeBoolean(n.mdNoAsterisk);a.configureNgModel(s,l,h),l?((r=t[0].querySelector(".md-errors-spacer"))&&t.after(angular.element("
").append(r)),l.setHasPlaceholder(n.mdPlaceholder),l.input=t,l.element.addClass(m).toggleClass(g,"time"!==n.mdHideIcons&&"all"!==n.mdHideIcons),l.label?i||n.$observe("required",function(e){l.label.toggleClass("md-required",!!e)}):d.expect(t,"aria-label",n.mdPlaceholder),e.$watch(l.isErrorGetter||function(){return s.$invalid&&(s.$touched||c&&c.$submitted)},l.setInvalid)):c&&(o=e.$watch(function(){return c.$submitted},function(e){e&&(a.updateErrorState(),o())}))}}}angular.module("SOGo.Common").directive("sgTimepicker",e),e.$inject=["$mdUtil","$mdAria","inputDirective"];var i="sg-timepicker-invalid",l="sg-timepicker-open",m="_sg-timepicker-floating-label",g="_sg-timepicker-has-calendar-icon",c={MIN5:{GTXS:192,XS:311},MIN1:{GTXS:384,XS:474}},u={GTXS:530,XS:294},h=/ipad|iphone|ipod|android/i;function t(e,t,n,i,r,o,s,a,l,c,u){this.$window=i,this.dateLocale=a,this.dateUtil=l,this.$mdConstant=r,this.$mdUtil=s,this.$$rAF=c,this.$mdMedia=u,this.documentElement=angular.element(document.documentElement),this.ngModelCtrl=null,this.inputElement=t[0].querySelector("input"),this.ngInputElement=angular.element(this.inputElement),this.inputContainer=t[0].querySelector(".sg-timepicker-input-container"),this.timePane=t[0].querySelector(".sg-timepicker-time-pane"),this.timeButton=t[0].querySelector(".sg-timepicker-button"),this.inputMask=angular.element(t[0].querySelector(".sg-timepicker-input-mask-opaque")),this.$element=t,this.$attrs=n,this.$scope=e,this.time=null,this.isFocused=!1,this.isDisabled=!1,this.setDisabled(t[0].disabled||angular.isString(n.disabled)),this.isTimeOpen=!1,this.timePaneOpenedFrom=null,this.timePaneId="sg-time-pane"+s.nextUid(),this.bodyClickHandler=angular.bind(this,this.handleBodyClick),this.windowEventName=h.test(navigator.userAgent||navigator.vendor||window.opera)?"orientationchange":"resize",this.windowEventHandler=s.debounce(angular.bind(this,this.closeTimePane),100),this.windowBlurHandler=angular.bind(this,this.handleWindowBlur),this.leftMargin=20,this.topMargin=null,n.tabindex?(this.ngInputElement.attr("tabindex",n.tabindex),n.$set("tabindex",null)):n.$set("tabindex","-1"),o(t),o(angular.element(this.timePane));var d=this;e.$on("$destroy",function(){d.detachTimePane()}),n.mdIsOpen&&e.$watch("ctrl.isOpen",function(e){e?d.openTimePane({target:d.inputElement}):d.closeTimePane()})}t.$inject=["$scope","$element","$attrs","$window","$mdConstant","$mdTheming","$mdUtil","$mdDateLocale","$$mdDateUtil","$$rAF","$mdMedia"],t.prototype.$onInit=function(){this.installPropertyInterceptors(),this.attachChangeListeners(),this.attachInteractionListeners()},t.prototype.configureNgModel=function(e,t,n){this.ngModelCtrl=e,this.mdInputContainer=t,this.$attrs.$set("type","date");var i=this,t=(i.ngModelCtrl.$formatters.push(function(e){if(!e||e instanceof Date)return i.onExternalChange(e),e;throw Error("The ng-model for sg-timepicker must be a Date instance. Currently the model is a: "+typeof e)}),e.$viewChangeListeners.unshift(angular.bind(this,this.updateErrorState)),i.$mdUtil.getModelOption(e,"updateOn"));t&&this.ngInputElement.on(t,angular.bind(this.$element,this.$element.triggerHandler,t))},t.prototype.attachChangeListeners=function(){var i=this,e=(i.$scope.$on("sg-time-pane-change",function(e,t){var n=new Date(t.date);i.setModelValue(n),i.onExternalChange(n),"minutes"==t.changed&&i.closeTimePane()}),i.ngInputElement.on("input",angular.bind(i,i.resizeInputElement)),angular.isDefined(this.debounceInterval)?this.debounceInterval:500);i.ngInputElement.on("input",i.$mdUtil.debounce(i.handleInputEvent,e,i))},t.prototype.attachInteractionListeners=function(){var t=this,n=this.$scope,i=this.$mdConstant.KEY_CODE;t.ngInputElement.on("keydown",function(e){e.altKey&&e.keyCode==i.DOWN_ARROW&&(t.openTimePane(e),n.$digest())}),n.$on("md-time-close",function(){t.closeTimePane()})},t.prototype.installPropertyInterceptors=function(){var e,t=this;this.$attrs.ngDisabled&&(e=this.$scope.$parent)&&e.$watch(this.$attrs.ngDisabled,function(e){t.setDisabled(e)}),Object.defineProperty(this,"placeholder",{get:function(){return t.inputElement.placeholder},set:function(e){t.inputElement.placeholder=e||""}})},t.prototype.setDisabled=function(e){this.isDisabled=e,this.inputElement.disabled=e,this.timeButton&&(this.timeButton.disabled=e)},t.prototype.updateErrorState=function(e){var e=e||this.time,t=(this.clearErrorState(),this.dateUtil.isValidDate(e)||this.ngModelCtrl.$setValidity("valid",null===e),this.inputElement.value),n=this.dateLocale.parseTime(t);!this.isInputValid(t,n)&&this.ngModelCtrl.$valid&&this.ngModelCtrl.$setValidity("valid",null==e),angular.element(this.inputContainer).toggleClass(i,!this.ngModelCtrl.$valid)},t.prototype.isInputValid=function(e,t){return""===e||this.dateUtil.isValidDate(t)},t.prototype.clearErrorState=function(){this.inputContainer.classList.remove(i),["valid"].forEach(function(e){this.ngModelCtrl.$setValidity(e,!0)},this)},t.prototype.resizeInputElement=function(){this.inputElement.size=this.inputElement.value.length+3},t.prototype.handleInputEvent=function(e){var t=this.inputElement.value,n=t?this.dateLocale.parseTime(t):null;this.isInputValid(t,n)&&(t=new Date(this.time),n?(t.setHours(n.getHours()),t.setMinutes(n.getMinutes())):t=null,this.setModelValue(t),this.time=t),this.updateErrorState(n)},t.prototype.attachTimePane=function(){var e=this.timePane,t=document.body,n=(e.style.transform="",this.$element.addClass(l),angular.element(t).addClass("md-datepicker-is-showing"),this.inputContainer.getBoundingClientRect()),i=t.getBoundingClientRect(),r=((!this.topMargin||this.topMargin<0)&&(this.topMargin=(this.inputMask.parent().prop("clientHeight")-this.ngInputElement.prop("clientHeight"))/2),n.top-i.top-this.topMargin),o=n.left-i.left-this.leftMargin,s=i.top<0&&0===t.scrollTop?-i.top:document.body.scrollTop,t=i.left<0&&0===t.scrollLeft?-i.left:document.body.scrollLeft,i=s+this.$window.innerHeight,a=t+this.$window.innerWidth,n=(this.inputMask.css({position:"absolute",left:this.leftMargin+"px",top:this.topMargin+"px",width:n.width-1+"px",height:n.height-2+"px"}),this.$mdMedia("xs")?u.XS:u.GTXS),t=(a/g,">")},String.prototype._base64_keyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",String.prototype.base64encode=function(){for(var e,t,n,i,r,o,s="",a=0,l=this.utf8encode();a>2,i=(3&e)<<4|(e=l.charCodeAt(a++))>>4,r=(15&e)<<2|(t=l.charCodeAt(a++))>>6,o=63&t,isNaN(e)?r=o=64:isNaN(t)&&(o=64),s=s+this._base64_keyStr.charAt(n)+this._base64_keyStr.charAt(i)+this._base64_keyStr.charAt(r)+this._base64_keyStr.charAt(o);return s},String.prototype.base64decode=function(){for(var e,t,n,i,r,o,s="",a=0,l=""+this;a>2,t=(3&r)<<6|(o=this._base64_keyStr.indexOf(l.charAt(a++))),s+=String.fromCharCode(n<<2|i>>4),64!=r&&(s+=String.fromCharCode(e)),64!=o&&(s+=String.fromCharCode(t));return s},String.prototype.md5=function(){if(this.length){var e=this.toLowerCase();function a(e,t){return e<>>32-t}function l(e,t){var n=2147483648&e,i=2147483648&t,r=1073741824&e,o=1073741824&t,e=(1073741823&e)+(1073741823&t);return r&o?2147483648^e^n^i:r|o?1073741824&e?3221225472^e^n^i:1073741824^e^n^i:e^n^i}function t(e,t,n,i,r,o,s){return e=l(e,l(l(t&n|~t&i,r),s)),l(a(e,o),t)}function n(e,t,n,i,r,o,s){return e=l(e,l(l(t&i|n&~i,r),s)),l(a(e,o),t)}function i(e,t,n,i,r,o,s){return e=l(e,l(l(t^n^i,r),s)),l(a(e,o),t)}function r(e,t,n,i,r,o,s){return e=l(e,l(l(n^(t|~i),r),s)),l(a(e,o),t)}function o(e){for(var t="",n="",i=0;i<=3;i++)t+=(n="0"+(e>>>8*i&255).toString(16)).substr(n.length-2,2);return t}Array();for(var s,c,u,d,h=function(e){for(var t,n=e.length,i=16*(1+((i=n+8)-i%64)/64),r=Array(i-1),o=0,s=0;s>>29,r}(e=function(e){e=e.replace(/rn/g,"n");for(var t="",n=0;n>6|192))+String.fromCharCode(63&i|128):(t=(t+=String.fromCharCode(i>>12|224))+String.fromCharCode(i>>6&63|128))+String.fromCharCode(63&i|128)}return t}(e)),m=1732584193,g=4023233417,p=2562383102,f=271733878,y=0;y');return s.on("load",function(){var e=o.get("$state");2"+e+"
");return e.find("a").attr("target","_blank"),t.trustAs("html",e.html())}}e.$inject=["$sce"],angular.module("SOGo.Common").filter("ensureTarget",e)}(),function(){"use strict";angular.module("SOGo.Common").filter("loc",function(){return l})}(),function(){"use strict";angular.module("SOGo.Common").filter("range",function(){return function(e){for(var t=[],n=0;n"):void 0}}e.$inject=["linkyFilter"],angular.module("SOGo.Common").filter("txt2html",e)}(),function(){"use strict";function e(t,n,e,o,r,i,s){var a=this;function c(e,t){if(t&&t.target.parentNode.classList.contains("md-secondary"))return!1;a.selectedUid==e.uid?a.selectedUid=null:(a.selectedUid=e.uid,(a.selectedUser=e).inactive||a.selectedUser.$rights())}a.users=r,a.folder=s,a.selectedUser=null,a.selectedUid=null,a.userToAdd="",a.searchText="",a.folderClassName=function(){return!!angular.isFunction(s.getClassName)&&s.getClassName("bg")},a.templateName=function(e){return"UIx"+(t[0].getElementById("UIxAnonymousUserRightsEditor")&&e.$isAnonymous()?"Anonymous":"")+"UserRightsEditor"},a.userFilter=function(e){return i.$filter(e,s.$acl.users,{dry:!0})},a.closeModal=function(){s.$acl.$resetUsersRights(),e.hide()},a.saveModal=function(){s.$acl.$saveUsersRights().then(function(){e.hide()},function(e,t){o.alert(l("Warning"),l("An error occured, please try again."))})},a.confirmChange=function(e){e=e.$confirmRights(a.folder);e&&(a.confirmation.showing=!0,a.confirmation.message=e)},a.removeUser=function(e){n(function(){s.$acl.$removeUser(e.uid)},500)},a.addUser=function(e){e&&s.$acl.$addUser(e).then(function(e){a.userToAdd="",a.searchText="",a.selectedUid=null,e&&c(e)})},a.toggleAllRights=function(e){s.$acl.$toggleAllRights(e)},a.selectUser=c,a.hasNoRight=function(e){return s.$acl.$hasNoRight(e)},a.showRights=function(e){return a.selectedUid==e.uid&&!e.inactive},a.confirmation={showing:!1,message:""}}e.$inject=["$document","$timeout","$mdDialog","Dialog","usersWithACL","User","folder"],angular.module("SOGo.Common").controller("AclController",e)}(),function(){"use strict";function e(e,t,n,o,r,i,s,a,c,u,d,h,m,g){var p=new m(h.baseURL(),h.activeUser());function f(e,t){var n;t.data&&t.data.message&&angular.isString(t.data.message)?n=t.data.message:t.status&&(n=t.statusText),n?a.show({template:["",'
',' error_outline'," "+l(n)+"","
","
"].join(""),hideDelay:5e3,position:d.toastPosition}):u.debug("untrap error")}this.$onInit=function(){t.isPopup=h.isPopup,t.activeUser=h.activeUser(),t.baseURL=h.baseURL(),t.leftIsClose=!c(d["gt-md"]),t.centerIsClose=!!i.centerIsClose&&!t.leftIsClose,t.currentDay=window.currentDay,n(function(){o(function(){r.get("../date").then(function(e){t.currentDay=e})},864e5)},1e3*window.currentDay.secondsBeforeTomorrow),t.$watch(function(){return c(d["gt-xs"])},function(e){t.isGtExtraSmall=e}),t.$watch(function(){return c(d["gt-md"])},function(e){(t.isGtMedium=e)&&(t.leftIsClose=!1)}),e.$on("http:Error",f),t.isPopup||(h.activeUser("path").calendar&&g.getAlarms(),h.activeUser("path").mail&&g.pollInbox())},t.toggleLeft=function(){t.isGtMedium?t.leftIsClose=!t.leftIsClose:(t.leftIsClose=!s("left").isOpen(),t.leftIsClose&&angular.element(i).triggerHandler("resize"),s("left").toggle().then(function(){u.debug("toggle left is done")}))},t.toggleRight=function(){s("right").toggle().then(function(){u.debug("toggle right is done")})},t.toggleCenter=function(e){t.centerIsClose=!t.centerIsClose,e&&e.save&&p.post(null,"saveListState",{state:t.centerIsClose?"collapse":"rise"})}}e.$inject=["$rootScope","$scope","$timeout","$interval","$http","$window","$mdSidenav","$mdToast","$mdMedia","$log","sgConstant","sgSettings","Resource","Preferences"],angular.module("SOGo.Common").controller("navController",e)}(),function(){"use strict";function s(e){this.folderId=e}s.factory=["$q","$timeout","sgSettings","Resource","User",function(e,t,n,o,r){return angular.extend(s,{$q:e,$timeout:t,$$resource:new o(n.activeUser("folderURL"),n.activeUser()),$User:r}),s}],angular.module("SOGo.Common").factory("Acl",s.factory),s.prototype.$users=function(t){var n,o=this,r=s.$q.defer();return this.users?(r.resolve(this.users),r.promise):(angular.isDefined(t)?s.$$resource.userResource(t):s.$$resource).fetch(this.folderId,"acls").then(function(e){return o.users=[],angular.forEach(e.users,function(e){(n=new s.$User(e)).canSubscribeUser=n.isSubscribed,n.wasSubscribed=n.isSubscribed,n.$rights=angular.bind(n,n.$acl,o.folderId,t),o.users.push(n)}),r.resolve(o.users),o.users},function(e){throw r.reject(l(e.statusText)),Error("No access to object")})},s.prototype.$addUser=function(e,t){var n=this,o=s.$q.defer(),r={uid:e.uid};return!e.uid||-1<_.indexOf(_.map(this.users,"uid"),e.uid)?o.resolve():(angular.isDefined(t)?s.$$resource.userResource(t):s.$$resource).fetch(this.folderId,"addUserInAcls",r).then(function(){e.wasSubscribed=!1,e.userClass=e.isGroup?"normal-group":"normal-user",e.$rights=angular.bind(e,e.$acl,n.folderId,t),n.users.push(e),o.resolve(e)},function(e,t){o.reject(l("An error occured, please try again."))}),o.promise},s.prototype.$removeUser=function(t,e){var n=this,o={uid:t},e=(angular.isDefined(e)?s.$$resource.userResource(e):s.$$resource).fetch(this.folderId,"removeUserFromAcls",o);return e.then(function(){var e=_.indexOf(_.map(n.users,"uid"),t);0<=e&&(n.users[e].$shadowRights=null,n.users.splice(e,1))})},s.prototype.$toggleAllRights=function(n){var o=!angular.isUndefined(_.find(_.values(n.rights),function(e){return 1!==e&&"Modifier"!==e}));_.forEach(n.rights,function(e,t){angular.isNumber(n.rights[t])?n.rights[t]=o?1:0:n.rights[t]=o?"Modifier":"None"})},s.prototype.$hasNoRight=function(e){e=_.find(e.rights,function(e,t){return angular.isNumber(e)?1===e:"None"!==e});return _.isUndefined(e)},s.prototype.$resetUsersRights=function(){angular.forEach(this.users,function(e){e.$resetRights()})},s.prototype.$saveUsersRights=function(e){var t=this,n=s.$q.defer(),o=s.$q.defer(),r={action:"saveUserRights"},i=[];return angular.forEach(this.users,function(e){e.$rightsAreDirty()&&i.push(e.$omit())}),i.length?(angular.isDefined(e)?s.$$resource.userResource(e):s.$$resource).save(this.folderId,i,r).then(function(){angular.forEach(t.users,function(e){e.$rightsAreDirty()&&(e.$shadowRights=angular.copy(e.rights))}),n.resolve()},n.reject):n.resolve(),i=[],angular.forEach(this.users,function(e){!e.wasSubscribed&&e.isSubscribed&&i.push(e.uid)}),i.length?(r={uids:i.join(",")},s.$$resource.fetch(this.folderId,"subscribeUsers",r).then(function(){angular.forEach(t.users,function(e){e.wasSubscribed=e.isSubscribed}),o.resolve()},o.reject)):o.resolve(),s.$q.all([n.promise,o.promise])}}(),function(){"use strict";angular.module("SOGo.Authentication",["ngCookies"]).constant("passwordPolicyConfig",{PolicyPasswordChangeUnsupported:-3,PolicyPasswordSystemUnknown:-2,PolicyPasswordUnknown:-1,PolicyPasswordExpired:0,PolicyAccountLocked:1,PolicyChangeAfterReset:2,PolicyPasswordModNotAllowed:3,PolicyMustSupplyOldPassword:4,PolicyInsufficientPasswordQuality:5,PolicyPasswordTooShort:6,PolicyPasswordTooYoung:7,PolicyPasswordInHistory:8,PolicyPasswordRecoveryFailed:9,PolicyPasswordRecoveryInvalidToken:10,PolicyNoError:65535}).provider("Authentication",function(){function m(e,t){var n,o;return t&&(e+="@"+t),t=""+window.location.href,"/"==(e=ApplicationBaseURL+encodeURIComponent(e))[0]&&(o=(n=t.split("/"))[2],e=n[0]+"//"+o+e),t.startsWith(e)&&!t.endsWith("/logoff")?t:e}function e(c,u,d,h){return{login:function(e){var t,n=c.defer(),o=e.username,r=e.password,i=e.verificationCode,s=e.domain,a=e.rememberLogin?1:0;return e.loginSuffix&&!o.endsWith(e.loginSuffix)&&(o+=loginSuffix,s=!1),e.language&&"WONoSelectionString"!=e.language&&(t=e.language),u({method:"POST",url:"/SOGo/connect",data:{userName:o,password:r,verificationCode:i,domain:s,language:t,rememberLogin:a}}).then(function(e){var t=e.data;navigator&&!navigator.cookieEnabled?n.reject({error:l("cookiesNotEnabled")}):void 0!==t.totpMissingKey&&202==e.status?n.resolve({totpmissingkey:1}):void 0!==t.totpDisabled?n.resolve({cn:t.cn,url:m(o,s),totpdisabled:1}):void 0!==t.expire&&void 0!==t.grace?t.expire<0&&0','
',' ','

'," "," ",' '," ","
"," ",' '," "+l("Cancel")," ",' '," "+l("OK")," "," ","
",""].join(""),controller:i}),i.$inject=["scope","$mdDialog"],r.promise},e.$inject=["$q","$mdDialog"],angular.module("SOGo.Common").factory("Dialog",e)}(),function(){"use strict";angular.module("SOGo.Common").factory("Gravatar",function(){return function(e,t,n,o){var r,i=t,s=n;return e?(t||(i=48),"https://www.gravatar.com/avatar/"+(e=0<=(t=e.indexOf("<"))&&t<(r=e.indexOf(">",t))?e.substring(t+1,r):e).md5()+"?s="+i+"&d="+(n=s&&"none"!=s?n:o&&o.no_404?"mm":"404")):""}})}(),function(){"use strict";function a(e,t,n,o,r,i,s){angular.extend(this,{_http:e,_q:t,_window:n,_cookies:o,_path:r,_activeUser:i}),angular.extend(this,s),this._path=this._path.replace(/\/$/,"")}a.$factory=["$http","$q","$window","$cookies",function(o,r,i,s){return function(e,t,n){return new a(o,r,i,s,e,t,n)}}],angular.module("SOGo.Common").factory("Resource",a.$factory),a.prototype.encodeURL=function(e){var t=this,n=e;return angular.isArray(n)||(n=e.split("/")),_.map(n,function(e){return t._window.encodeURIComponent(e.toString())})},a.prototype.userResource=function(e){var t=_.compact(this._activeUser.folderURL.split("/"));return e&&t.splice(t.length-1,1,escape(e)),new a(this._http,this._q,this._window,this._cookies,"/"+t.join("/"),this._activeUser)},a.prototype.path=function(){var e=[this._path];return 0",' ','
',"
","
","
"," "," ",' '," {{keys[0].description}}",'
'," {{keys[0].lkey || hotkey}}","
","
","
","
",""].join(""),controller:t,locals:{hotkeys:e._hotkeys}}).finally(function(){e._cheatSheet=null}),t.$inject=["$scope","hotkeys"]},n}(this.$get=e).$inject=["$rootScope","$window"]})}(),function(){"use strict";function e(t,n){return function(e){n(function(){t.$broadcast("sgRippleDo",e)})}}e.$inject=["$rootScope","$timeout"],angular.module("SOGo.Common").factory("sgRippleClick",e)}(),function(){"use strict";function c(e){e&&this.init(e)}c.factory=["$q","$log","sgSettings","Resource",function(e,t,n,o){return angular.extend(c,{$q:e,$log:t,$$resource:new o(n.activeUser("folderURL"),n.activeUser()),$query:"",$users:[]}),c}],angular.module("SOGo.Common").factory("User",c.factory),c.$filter=function(e,s,a){var t=c.$$resource,n={search:e};if(a&&a.dry)a&&a.uid&&(t=c.$$resource.userResource(a.uid));else{if(!e)return c.$users.splice(0,c.$users.length),c.$q.when(c.$users);if(c.$query==e)return c.$q.when(c.$users);c.$query=e}return t.fetch(null,"usersSearch",n).then(function(e){function n(e){return this.uid==e.uid}var t,o,r,i;for(a?a.dry?i=[]:a.results&&(i=a.results):i=c.$users,t=s?_.filter(e.users,function(e){return!_.find(s,_.bind(n,e))}):e.users,o=i.length-1;0<=o;o--)r=i[o],_.find(t,_.bind(n,r))||i.splice(o,1);return _.forEach(t,function(e,t){_.isUndefined(_.find(i,_.bind(n,e)))&&(e=new c(e),i.splice(t,0,e))}),c.$log.debug(i),i})},c.prototype.init=function(e){angular.extend(this,e),this.$$shortFormat||(this.$$shortFormat=this.$shortFormat()),this.$$image||(this.$$image=this.image),this.$avatarIcon=this.$isGroup()||this.$isSpecial()?"group":"person",this.empty=" "},c.prototype.$fullname=function(){var e=this.cn||this.uid;return this.c_info&&(e+=" ("+this.c_info.split("\n").join("; ")+")"),e},c.prototype.$shortFormat=function(e){var t=this.$fullname(),n=this.c_email;return!(e&&!1===e.email)&&n&&t!=n&&(t+=" <"+n+">"),t},c.prototype.$acl=function(e,t){var n=this,o=c.$q.defer(),r={uid:this.uid};return this.$shadowRights?o.resolve(this.rights):(angular.isDefined(t)?c.$$resource.userResource(t):c.$$resource).fetch(e,"userRights",r).then(function(e){return n.rights=e,n.$shadowRights=angular.copy(e),o.resolve(e),e}),o.promise},c.prototype.$isGroup=function(){return this.isGroup||this.userClass&&"normal-group"==this.userClass},c.prototype.$isAnonymous=function(){return"anonymous"==this.uid},c.prototype.$isSpecial=function(){return this.userClass&&"public-user"==this.userClass},c.prototype.$confirmRights=function(e){var t=!1;return!this.$confirmation&&(_.some(_.values(this.rights))&&("anonymous"==this.uid?"AddressBook"==e.constructor.name?t=l('Potentially anyone on the Internet will be able to access your address book "%{0}", even if they do not have an account on this system. Is this information suitable for the public Internet?',e.name):"Calendar"==e.constructor.name&&(t=l('Potentially anyone on the Internet will be able to access your calendar "%{0}", even if they do not have an account on this system. Is this information suitable for the public Internet?',e.name)):"anyone"!=this.uid&&""!=this.uid||("AddressBook"==e.constructor.name?t=l('Any user with an account on this system will be able to access your address book "%{0}". Are you certain you trust them all?',e.name):"Calendar"==e.constructor.name?t=l('Any user with an account on this system will be able to access your calendar "%{0}". Are you certain you trust them all?',e.name):"Mailbox"==e.constructor.name&&(t=l('Any user with an account on this system will be able to access your mailbox "%{0}". Are you certain you trust them all?',e.name)))),this.$confirmation=t)},c.prototype.$rightsAreDirty=function(){return this.rights&&!_.isEqual(this.rights,this.$shadowRights)},c.prototype.$resetRights=function(e){var t=this;e?_.map(_.keys(this.rights),function(e){angular.isString(t.rights[e])?t.rights[e]="None":t.rights[e]=0}):this.$shadowRights&&(this.rights=angular.copy(this.$shadowRights))},c.prototype.$folders=function(e){var t=this,n=c.$q.defer(),e={type:e};return this.$$folders?n.resolve(this.$$folders):c.$$resource.userResource(this.uid).fetch(null,"foldersSearch",e).then(function(e){t.$$folders=e.folders,n.resolve(e.folders)}),n.promise},c.prototype.$omit=function(){var n={};return angular.forEach(this,function(e,t){"constructor"!=t&&"$"!=t[0]&&(n[t]=e)}),n},c.prototype.toString=function(){return"[User "+this.c_email+"]"}}(),function(){"use strict";function e(c,e,u){return{restrict:"A",scope:{autogrow:"=sgAutogrow"},link:function(e,t,n){var o,r,i,s,a;function l(){s=(s=o.value.encodeEntities()).replace(/\n/g,"
"),i.innerHTML=s+'
',i.style.visibility="hidden",i.style.display="block",o.style.height=Math.max(r,i.offsetHeight)+"px",i.style.visibility="visible",i.style.display="none"}e.autogrow&&(o=t[0],r=o.clientHeight,i=c[0].createElement("div"),s=null,i.classList.add("md-input"),i.classList.add("plain-text"),i.style.display="none",i.style.whiteSpace="pre-wrap",i.style.wordWrap="break-word",o.parentNode.appendChild(i),o.style.resize="none",o.style.overflow="hidden",t.on("keyup",u.debounce(l,200)),t.on("paste",u.debounce(l,0)),a=e.$watch(function(){return t[0].value},function(e){e&&(l(),a())}))}}}e.$inject=["$document","$timeout","$mdUtil"],angular.module("SOGo.Common").directive("sgAutogrow",e)}(),function(){"use strict";function e(e,t,r,n,i,s){var a,o;function l(){a.url=null,a.urlEmail=null,a.img.addClass("ng-hide"),a.genericImg.removeClass("ng-hide")}function c(){a.genericImg.addClass("ng-hide"),a.img.removeClass("ng-hide")}a=this,e.$on("$destroy",function(){o&&t.off("click",o)}),e.$watch(function(){return a.email},function(e,t){var n,o;e&&a.urlEmail!=e?(l(),i.defaults.SOGoGravatarEnabled&&(o=s(n=e,a.size,i.defaults.SOGoAlternateAvatar),r({method:"GET",url:o,cache:!0,headers:{Accept:"image/*"}}).then(function(){a.url||(a.url=o,a.urlEmail=n,c())},function(){l()}))):e||l()}),"sg-src"in t[0].attributes&&e.$watch(function(){return a.src},function(e){e&&(a.url=e,a.urlEmail=""+a.email,t.addClass("sg-avatar-image--zoomable"),o=function(){t.toggleClass("sg-avatar-image--zoom")},t.on("click",o),c())})}e.$inject=["$scope","$element","$http","$q","Preferences","Gravatar"],angular.module("SOGo.Common").directive("sgAvatarImage",function(){return{restrict:"AE",scope:{},bindToController:{size:"@",email:"=sgEmail",src:"=sgSrc"},transclude:!0,template:['
'," ",' ',' ',"
"].join(""),link:function(e,t,n,o){var r,i=t.find("img"),t=t.find("md-icon"),s=angular.element(t[0]),a=angular.element(t[1]);n.size&&(i.attr("width",n.size),i.attr("height",n.size),s.css("font-size",n.size+"px"),a.css("font-size",parseInt(.4*n.size)+"px"));angular.isDefined(n.ngDisabled)&&(r=e.$watch(n.ngDisabled,function(e){n.disabled&&a.css({display:"block"}),r()}));o.img=i,o.genericImg=s},controller:"sgAvatarImageController",controllerAs:"vm"}}).controller("sgAvatarImageController",e)}(),function(){"use strict";function e(e,l,c){return{link:function(e,t){var n=t[0].querySelector(".sg-button-toggle"),o=n.querySelector(".sg-icon-toggle"),r="md-rotate-180-ccw",i=t[0].querySelector(".sg-block-toggle"),s=!1;function a(){i.setAttribute("aria-hidden",!s),i.setAttribute("aria-expanded",s),s||(i.style.visibility="hidden")}n.classList.add("md-clickable"),angular.element(n).on("click",function(){(s=!s)?o.classList.add(r):o.classList.remove(r),s&&(i.style.visibility="visible"),c(function(){var e=s?i.scrollHeight:0;l(angular.element(i),{easing:"cubic-bezier(0.35, 0, 0.25, 1)",to:{height:e+"px"},duration:.75}).start().then(function(){a()})})}),a()}}}e.$inject=["$mdUtil","$animateCss","$$rAF"],angular.module("SOGo.Common").directive("sgBlockToggle",e)}(),function(){"use strict";function e(a,l,c,u){var d="sg-checked";return{restrict:"E",replace:!0,transclude:!0,require:"?ngModel",template:['
"].join(""),scope:{},require:["ngModel","sgTimePane","?^mdInputContainer"],controller:e,controllerAs:"ctrl",bindToController:!0,link:function(e,t,n,o){var r=o[0],i=o[1];if(o[2])throw Error("sg-timepicker should not be placed inside md-input-container.");i.configureNgModel(r,i)}}});var g=0;function e(e,t,n,o,r,i,s,a,l){var c;i(e),this.$element=e,this.$scope=t,this.dateUtil=n,this.$mdUtil=o,this.keyCode=r.KEY_CODE,this.$$rAF=s,this.timePaneElement=e[0].querySelector(".sg-time-pane"),this.ngModelCtrl=null,this.SELECTED_TIME_CLASS="sg-time-selected",this.FOCUSED_TIME_CLASS="md-focus",this.id=g++,this.displayTime=null,this.selectedTime=null,this.isInitialized=!1,t.hours=[],t.hours[0]=[],t.hours[0][0]=[],t.hours[0][1]=[],t.hours[1]=[],t.hours[1][0]=[],t.hours[1][1]=[];for(var u=0;u<6;u++)t.hours[0][0][u]={id:"tp-"+this.id+"-hour-"+u,displayName:u<10?"0"+u:""+u,selected:!1},t.hours[0][1][u]={id:"tp-"+this.id+"-hour-"+(u+6),displayName:u+6<10?"0"+(u+6):""+(u+6),selected:!1},t.hours[1][0][u]={id:"tp-"+this.id+"-hour-"+(u+12),displayName:""+(u+12),selected:!1},t.hours[1][1][u]={id:"tp-"+this.id+"-hour-"+(u+18),displayName:""+(u+18),selected:!1};for(t.min5=[],t.min5[0]=[],t.min5[1]=[],u=0;u<6;u++)t.min5[0][u]={id:"tp-"+this.id+"-minute5-"+(c=5*u),displayName:c<10?":0"+c:":"+c,selected:!0},t.min5[1][u]={id:"tp-"+this.id+"-minute5-"+(c+30),displayName:":"+(c+30),selected:!1};for(t.min1=[],u=0;u<12;u++){t.min1[u]=[];for(var d=0;d<5;d++)t.min1[u][d]={id:"tp-"+this.id+"-minute-"+(c=5*u+d),displayName:c<10?":0"+c:":"+c,selected:!0}}t.show5min=!0,t.getToggleBtnLbl=function(){return t.is5min()?">>":"<<"},t.toggleManual5min=function(){t.manual5min=!t.is5min()},t.is5min=function(){return!0===t.manual5min||!1===t.manual5min?t.manual5min:t.show5min},a.tabindex||e.attr("tabindex","-1");var h=this,m=(this.hourClickHandler=function(e){var t=new Date(h.displayTime);t.setHours(Number(e)),h.setNgModelValue(t,"hours")},t.hourClickHandler=this.hourClickHandler,this.minuteClickHandler=function(e){var e=e.substr(1),t=new Date(h.displayTime);t.setMinutes(Number(e)),h.setNgModelValue(t,"minutes")},t.minuteClickHandler=this.minuteClickHandler,angular.bind(this,this.handleKeyEvent));angular.element(document.body).on("keydown",m),t.$on("$destroy",function(){angular.element(document.body).off("keydown",m)})}e.$inject=["$element","$scope","$$mdDateUtil","$mdUtil","$mdConstant","$mdTheming","$$rAF","$attrs","$mdDateLocale"],e.prototype.configureNgModel=function(e,t){var n=this;n.ngModelCtrl=e,n.$mdUtil.nextTick(function(){n.isInitialized=!0}),e.$render=function(){var e=this.$viewValue;n.$mdUtil.nextTick(function(){n.changeSelectedTime(e,t)})}},e.prototype.changeSelectedTime=function(e,t){var n,o,r=this.selectedTime;this.selectedTime=e,this.displayTime=new Date(e),r&&(o=r.getHours(),(o=document.getElementById("tp-"+t.id+"-hour-"+o))&&(o.classList.remove(this.SELECTED_TIME_CLASS),o.setAttribute("aria-selected","false")),o=r.getMinutes(),(r=document.getElementById("tp-"+t.id+"-minute-"+o))&&(r.classList.remove(this.SELECTED_TIME_CLASS),r.setAttribute("aria-selected","false")),(r=document.getElementById("tp-"+t.id+"-minute5-"+o))&&(r.classList.remove(this.SELECTED_TIME_CLASS),r.setAttribute("aria-selected","false"))),e&&(o=e.getHours(),(r=document.getElementById("tp-"+t.id+"-hour-"+o))&&(r.classList.add(this.SELECTED_TIME_CLASS),r.setAttribute("aria-selected","true")),(o=e.getMinutes())%5==0?(t.$scope.show5min=!0,(n=document.getElementById("tp-"+t.id+"-minute5-"+o))&&(n.classList.add(this.SELECTED_TIME_CLASS),n.setAttribute("aria-selected","true"))):t.$scope.show5min=!1,(n=document.getElementById("tp-"+t.id+"-minute-"+o))&&(n.classList.add(this.SELECTED_TIME_CLASS),n.setAttribute("aria-selected","true")))},e.prototype.setNgModelValue=function(e,t){return this.$scope.$emit("sg-time-pane-change",{date:e,changed:t}),this.ngModelCtrl.$setViewValue(e),this.ngModelCtrl.$render(),e},e.prototype.handleKeyEvent=function(e){var t=this;this.$scope.$apply(function(){e.which==t.keyCode.ESCAPE||e.which==t.keyCode.TAB?(t.$scope.$emit("md-time-pane-close"),e.which==t.keyCode.TAB&&e.preventDefault()):e.which===t.keyCode.ENTER&&(t.setNgModelValue(t.displayTime,"enter"),e.preventDefault())})},e.prototype.focus=function(e,t){var e=e||this.selectedTime||this.today,n=this.timePaneElement.querySelector(".md-focus");n&&n.classList.remove(this.FOCUSED_TIME_CLASS),e&&(n=e.getHours(),(e=document.getElementById("tp-"+t.id+"-hour-"+n))&&(e.classList.add(this.FOCUSED_TIME_CLASS),e.focus()))}}(),function(){"use strict";function e(u,d,h){return{template:function(e,t){t=t.ariaLabel||t.mdPlaceholder;return['",'
",' ',' ','
',"
","
",'
','
','
',"
",'
',' ',"
","
"].join("")},require:["ngModel","sgTimepicker","?^mdInputContainer","?^form"],scope:{placeholder:"@mdPlaceholder"},controller:t,controllerAs:"ctrl",bindToController:!0,link:function(e,t,n,o){var r,i,s=o[0],a=o[1],l=o[2],c=o[3],o=u.parseAttributeBoolean(n.mdNoAsterisk);a.configureNgModel(s,l,h),l?((r=t[0].querySelector(".md-errors-spacer"))&&t.after(angular.element("
").append(r)),l.setHasPlaceholder(n.mdPlaceholder),l.input=t,l.element.addClass(m).toggleClass(g,"time"!==n.mdHideIcons&&"all"!==n.mdHideIcons),l.label?o||n.$observe("required",function(e){l.label.toggleClass("md-required",!!e)}):d.expect(t,"aria-label",n.mdPlaceholder),e.$watch(l.isErrorGetter||function(){return s.$invalid&&(s.$touched||c&&c.$submitted)},l.setInvalid)):c&&(i=e.$watch(function(){return c.$submitted},function(e){e&&(a.updateErrorState(),i())}))}}}angular.module("SOGo.Common").directive("sgTimepicker",e),e.$inject=["$mdUtil","$mdAria","inputDirective"];var o="sg-timepicker-invalid",l="sg-timepicker-open",m="_sg-timepicker-floating-label",g="_sg-timepicker-has-calendar-icon",c={MIN5:{GTXS:192,XS:311},MIN1:{GTXS:384,XS:474}},u={GTXS:530,XS:294},h=/ipad|iphone|ipod|android/i;function t(e,t,n,o,r,i,s,a,l,c,u){this.$window=o,this.dateLocale=a,this.dateUtil=l,this.$mdConstant=r,this.$mdUtil=s,this.$$rAF=c,this.$mdMedia=u,this.documentElement=angular.element(document.documentElement),this.ngModelCtrl=null,this.inputElement=t[0].querySelector("input"),this.ngInputElement=angular.element(this.inputElement),this.inputContainer=t[0].querySelector(".sg-timepicker-input-container"),this.timePane=t[0].querySelector(".sg-timepicker-time-pane"),this.timeButton=t[0].querySelector(".sg-timepicker-button"),this.inputMask=angular.element(t[0].querySelector(".sg-timepicker-input-mask-opaque")),this.$element=t,this.$attrs=n,this.$scope=e,this.time=null,this.isFocused=!1,this.isDisabled=!1,this.setDisabled(t[0].disabled||angular.isString(n.disabled)),this.isTimeOpen=!1,this.timePaneOpenedFrom=null,this.timePaneId="sg-time-pane"+s.nextUid(),this.bodyClickHandler=angular.bind(this,this.handleBodyClick),this.windowEventName=h.test(navigator.userAgent||navigator.vendor||window.opera)?"orientationchange":"resize",this.windowEventHandler=s.debounce(angular.bind(this,this.closeTimePane),100),this.windowBlurHandler=angular.bind(this,this.handleWindowBlur),this.leftMargin=20,this.topMargin=null,n.tabindex?(this.ngInputElement.attr("tabindex",n.tabindex),n.$set("tabindex",null)):n.$set("tabindex","-1"),i(t),i(angular.element(this.timePane));var d=this;e.$on("$destroy",function(){d.detachTimePane()}),n.mdIsOpen&&e.$watch("ctrl.isOpen",function(e){e?d.openTimePane({target:d.inputElement}):d.closeTimePane()})}t.$inject=["$scope","$element","$attrs","$window","$mdConstant","$mdTheming","$mdUtil","$mdDateLocale","$$mdDateUtil","$$rAF","$mdMedia"],t.prototype.$onInit=function(){this.installPropertyInterceptors(),this.attachChangeListeners(),this.attachInteractionListeners()},t.prototype.configureNgModel=function(e,t,n){this.ngModelCtrl=e,this.mdInputContainer=t,this.$attrs.$set("type","date");var o=this,t=(o.ngModelCtrl.$formatters.push(function(e){if(!e||e instanceof Date)return o.onExternalChange(e),e;throw Error("The ng-model for sg-timepicker must be a Date instance. Currently the model is a: "+typeof e)}),e.$viewChangeListeners.unshift(angular.bind(this,this.updateErrorState)),o.$mdUtil.getModelOption(e,"updateOn"));t&&this.ngInputElement.on(t,angular.bind(this.$element,this.$element.triggerHandler,t))},t.prototype.attachChangeListeners=function(){var o=this,e=(o.$scope.$on("sg-time-pane-change",function(e,t){var n=new Date(t.date);o.setModelValue(n),o.onExternalChange(n),"minutes"==t.changed&&o.closeTimePane()}),o.ngInputElement.on("input",angular.bind(o,o.resizeInputElement)),angular.isDefined(this.debounceInterval)?this.debounceInterval:500);o.ngInputElement.on("input",o.$mdUtil.debounce(o.handleInputEvent,e,o))},t.prototype.attachInteractionListeners=function(){var t=this,n=this.$scope,o=this.$mdConstant.KEY_CODE;t.ngInputElement.on("keydown",function(e){e.altKey&&e.keyCode==o.DOWN_ARROW&&(t.openTimePane(e),n.$digest())}),n.$on("md-time-close",function(){t.closeTimePane()})},t.prototype.installPropertyInterceptors=function(){var e,t=this;this.$attrs.ngDisabled&&(e=this.$scope.$parent)&&e.$watch(this.$attrs.ngDisabled,function(e){t.setDisabled(e)}),Object.defineProperty(this,"placeholder",{get:function(){return t.inputElement.placeholder},set:function(e){t.inputElement.placeholder=e||""}})},t.prototype.setDisabled=function(e){this.isDisabled=e,this.inputElement.disabled=e,this.timeButton&&(this.timeButton.disabled=e)},t.prototype.updateErrorState=function(e){var e=e||this.time,t=(this.clearErrorState(),this.dateUtil.isValidDate(e)||this.ngModelCtrl.$setValidity("valid",null===e),this.inputElement.value),n=this.dateLocale.parseTime(t);!this.isInputValid(t,n)&&this.ngModelCtrl.$valid&&this.ngModelCtrl.$setValidity("valid",null==e),angular.element(this.inputContainer).toggleClass(o,!this.ngModelCtrl.$valid)},t.prototype.isInputValid=function(e,t){return""===e||this.dateUtil.isValidDate(t)},t.prototype.clearErrorState=function(){this.inputContainer.classList.remove(o),["valid"].forEach(function(e){this.ngModelCtrl.$setValidity(e,!0)},this)},t.prototype.resizeInputElement=function(){this.inputElement.size=this.inputElement.value.length+3},t.prototype.handleInputEvent=function(e){var t=this.inputElement.value,n=t?this.dateLocale.parseTime(t):null;this.isInputValid(t,n)&&(t=new Date(this.time),n?(t.setHours(n.getHours()),t.setMinutes(n.getMinutes())):t=null,this.setModelValue(t),this.time=t),this.updateErrorState(n)},t.prototype.attachTimePane=function(){var e=this.timePane,t=document.body,n=(e.style.transform="",this.$element.addClass(l),angular.element(t).addClass("md-datepicker-is-showing"),this.inputContainer.getBoundingClientRect()),o=t.getBoundingClientRect(),r=((!this.topMargin||this.topMargin<0)&&(this.topMargin=(this.inputMask.parent().prop("clientHeight")-this.ngInputElement.prop("clientHeight"))/2),n.top-o.top-this.topMargin),i=n.left-o.left-this.leftMargin,s=o.top<0&&0===t.scrollTop?-o.top:document.body.scrollTop,t=o.left<0&&0===t.scrollLeft?-o.left:document.body.scrollLeft,o=s+this.$window.innerHeight,a=t+this.$window.innerWidth,n=(this.inputMask.css({position:"absolute",left:this.leftMargin+"px",top:this.topMargin+"px",width:n.width-1+"px",height:n.height-2+"px"}),this.$mdMedia("xs")?u.XS:u.GTXS),t=(a/g,">")},String.prototype._base64_keyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",String.prototype.base64encode=function(){for(var e,t,n,o,r,i,s="",a=0,l=this.utf8encode();a>2,o=(3&e)<<4|(e=l.charCodeAt(a++))>>4,r=(15&e)<<2|(t=l.charCodeAt(a++))>>6,i=63&t,isNaN(e)?r=i=64:isNaN(t)&&(i=64),s=s+this._base64_keyStr.charAt(n)+this._base64_keyStr.charAt(o)+this._base64_keyStr.charAt(r)+this._base64_keyStr.charAt(i);return s},String.prototype.base64decode=function(){for(var e,t,n,o,r,i,s="",a=0,l=""+this;a>2,t=(3&r)<<6|(i=this._base64_keyStr.indexOf(l.charAt(a++))),s+=String.fromCharCode(n<<2|o>>4),64!=r&&(s+=String.fromCharCode(e)),64!=i&&(s+=String.fromCharCode(t));return s},String.prototype.md5=function(){if(this.length){var e=this.toLowerCase();function a(e,t){return e<>>32-t}function l(e,t){var n=2147483648&e,o=2147483648&t,r=1073741824&e,i=1073741824&t,e=(1073741823&e)+(1073741823&t);return r&i?2147483648^e^n^o:r|i?1073741824&e?3221225472^e^n^o:1073741824^e^n^o:e^n^o}function t(e,t,n,o,r,i,s){return e=l(e,l(l(t&n|~t&o,r),s)),l(a(e,i),t)}function n(e,t,n,o,r,i,s){return e=l(e,l(l(t&o|n&~o,r),s)),l(a(e,i),t)}function o(e,t,n,o,r,i,s){return e=l(e,l(l(t^n^o,r),s)),l(a(e,i),t)}function r(e,t,n,o,r,i,s){return e=l(e,l(l(n^(t|~o),r),s)),l(a(e,i),t)}function i(e){for(var t="",n="",o=0;o<=3;o++)t+=(n="0"+(e>>>8*o&255).toString(16)).substr(n.length-2,2);return t}Array();for(var s,c,u,d,h=function(e){for(var t,n=e.length,o=16*(1+((o=n+8)-o%64)/64),r=Array(o-1),i=0,s=0;s>>29,r}(e=function(e){e=e.replace(/rn/g,"n");for(var t="",n=0;n>6|192))+String.fromCharCode(63&o|128):(t=(t+=String.fromCharCode(o>>12|224))+String.fromCharCode(o>>6&63|128))+String.fromCharCode(63&o|128)}return t}(e)),m=1732584193,g=4023233417,p=2562383102,f=271733878,y=0;y */ - sgRippleClick.$inject = ['$log', '$timeout']; - function sgRippleClick($log, $timeout) { + sgRippleClick.$inject = ['$log', '$timeout', '$rootScope']; + function sgRippleClick($log, $timeout, scope) { + + function rippleEffect(element, coordinates, container, content) { + // Show ripple + angular.element(container).css({ 'overflow': 'hidden', 'position': 'relative' }); + angular.element(content).css({ top: container.scrollTop + 'px' }); + + element.css({ + 'top': (coordinates.top - container.offsetTop + container.scrollTop) + 'px', + 'left': (coordinates.left - container.offsetLeft) + 'px', + 'height': '400vmin', + 'width': '400vmin' + }); + + // Show ripple content + content.classList.remove('ng-hide'); + } + + scope.$on('sgRippleDo', function (e, containerName) { + const container = document.getElementById(containerName); + container.classList.remove('ng-hide'); + rippleEffect( + angular.element(document.querySelector('sg-ripple')) + , { left: (window.innerWidth / 2), top: (window.innerHeight / 2) } + , container + , document.querySelector('sg-ripple-content') + ); + }); return { restrict: 'A', compile: compile }; + + function compile(tElement, tAttrs) { return function postLink(scope, element, attr) { @@ -90,26 +119,16 @@ } if (content.classList.contains('ng-hide')) { - // Show ripple - angular.element(container).css({ 'overflow': 'hidden', 'position': 'relative' }); - angular.element(content).css({ top: container.scrollTop + 'px' }); $timeout(function() { // Wait until next digest for CSS animation to work - ripple.css({ - 'top': (coordinates.top - container.offsetTop + container.scrollTop) + 'px', - 'left': (coordinates.left - container.offsetLeft) + 'px', - 'height': '400vmin', - 'width': '400vmin' - }); - // Show ripple content - content.classList.remove('ng-hide'); + rippleEffect(ripple, coordinates, container, content); }); } else { // Hide ripple layer ripple.css({ 'top': (coordinates.top - container.offsetTop + container.scrollTop) + 'px', - 'left': (coordinates.left - container.offsetLeft) + 'px', + 'left': (coordinates.left - container.offsetLeft) + 'px', 'height': '0px', 'width': '0px' }); diff --git a/UI/WebServerResources/js/Common/sgRippleClick.service.js b/UI/WebServerResources/js/Common/sgRippleClick.service.js new file mode 100644 index 000000000..925aa43ac --- /dev/null +++ b/UI/WebServerResources/js/Common/sgRippleClick.service.js @@ -0,0 +1,25 @@ +/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ + +(function() { + 'use strict'; + + /** + * sgFocus - A service to set the focus on the element associated to a specific string + * @memberof SOGo.Common + * @param {string} name - the string identifier of the element + * @see {@link SOGo.Common.sgRippleClick} + * @ngInject + */ + sgRippleClick.$inject = ['$rootScope', '$timeout']; + function sgRippleClick($rootScope, $timeout) { + return function (containerName) { + $timeout(function() { + $rootScope.$broadcast('sgRippleDo', containerName); + }); + }; + } + + angular + .module('SOGo.Common') + .factory('sgRippleClick', sgRippleClick); +})(); diff --git a/UI/WebServerResources/js/Main.js b/UI/WebServerResources/js/Main.js index f1b766ecc..bb7446f8f 100644 --- a/UI/WebServerResources/js/Main.js +++ b/UI/WebServerResources/js/Main.js @@ -1,2 +1,2 @@ -!function(){"use strict";function o(o,s,e,n,i,r,t){var a=this;this.$onInit=function(){this.creds={username:s.cookieUsername,password:null,domain:null,rememberLogin:angular.isDefined(s.cookieUsername)&&0{d.retrievePasswordRecoveryEnabled(),this.passwordRecovery.passwordRecoveryLinkTimer=null},2e3)},this.retrievePasswordRecoveryEnabled=function(){(this.creds.username||this.creds.domain)&&a.passwordRecoveryEnabled(this.creds.username,this.creds.domain).then(function(e){d.passwordRecovery.passwordRecoveryMailDomain=e,d.passwordRecovery.passwordRecoveryEnabled=!0},function(){d.passwordRecovery.passwordRecoveryEnabled=!1})}}e.$inject=["$scope","$window","$timeout","Dialog","$mdDialog","Authentication","sgFocus","sgRippleClick"],angular.module("SOGo.MainUI").controller("LoginController",e)}(); //# sourceMappingURL=Main.js.map \ No newline at end of file diff --git a/UI/WebServerResources/js/Main.js.map b/UI/WebServerResources/js/Main.js.map index 8ba156464..3dc679417 100644 --- a/UI/WebServerResources/js/Main.js.map +++ b/UI/WebServerResources/js/Main.js.map @@ -1 +1 @@ -{"version":3,"file":"Main.js","sources":["Main/Main.app.js"],"names":["LoginController","$scope","$window","$timeout","Dialog","$mdDialog","Authentication","focus","vm","this","$onInit","creds","username","cookieUsername","password","domain","rememberLogin","angular","isDefined","length","test","location","search","language","loginState","verificationCodePattern","passwords","newPassword","newPasswordConfirmation","oldPassword","showLogin","login","then","data","totpmissingkey","totpdisabled","cn","url","continueLogin","msg","value","string","error","errorMessage","grace","l","expire","Math","round","passwordexpired","restoreLogin","verificationCode","href","reload","showAbout","$event","AboutDialogController","closeDialog","hide","show","targetEvent","templateUrl","controller","controllerAs","$inject","changeLanguage","ApplicationBaseURL","canChangePassword","form","$setValidity","changePassword","module"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"Main.js","sources":["Main/Main.app.js"],"names":["angular","module","LoginController","$scope","$window","$timeout","Dialog","$mdDialog","Authentication","focus","rippleDo","vm","this","$onInit","creds","username","cookieUsername","password","domain","rememberLogin","isDefined","length","test","location","search","language","loginState","verificationCodePattern","passwords","newPassword","newPasswordConfirmation","oldPassword","passwordRecovery","passwordRecoveryEnabled","passwordRecoveryQuestionKey","passwordRecoveryQuestion","passwordRecoveryMode","passwordRecoveryQuestionAnswer","passwordRecoveryToken","passwordRecoveryLinkTimer","passwordRecoverySecondaryEmailText","passwordRecoveryMailDomain","showLogin","queryString","window","urlParams","URLSearchParams","let","token","get","pathname","indexOf","tokenArray","replace","split","info","JSON","parse","atob","retrievePasswordRecoveryEnabled","login","then","data","totpmissingkey","totpdisabled","cn","url","continueLogin","msg","value","string","error","errorMessage","grace","l","expire","Math","round","passwordexpired","restoreLogin","verificationCode","isInPasswordRecoveryMode","passwordRecoveryAbort","href","reload","showAbout","$event","AboutDialogController","closeDialog","hide","show","targetEvent","templateUrl","controller","controllerAs","$inject","changeLanguage","ApplicationBaseURL","hello","form","canChangePassword","$setValidity","changePassword","passwordRecoveryInfo","mode","secretQuestionLabel","secretQuestion","obfuscatedRecoveryEmail","passwordRecoveryEmail","passwordRecoveryCheck","usernameChanged","clearTimeout","setTimeout","mailDomain"],"mappings":"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"} \ No newline at end of file diff --git a/UI/WebServerResources/js/Main/Main.app.js b/UI/WebServerResources/js/Main/Main.app.js index 80da04bf6..14a6a321f 100644 --- a/UI/WebServerResources/js/Main/Main.app.js +++ b/UI/WebServerResources/js/Main/Main.app.js @@ -1,19 +1,19 @@ /* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* JavaScript for MainUI (SOGoRootPage) */ - (function() { 'use strict'; angular.module('SOGo.MainUI', ['SOGo.Common', 'SOGo.Authentication']); + const PASSWORD_RECOVERY_TIMER_MS = 2000; /** * @ngInject */ - LoginController.$inject = ['$scope', '$window', '$timeout', 'Dialog', '$mdDialog', 'Authentication', 'sgFocus']; - function LoginController($scope, $window, $timeout, Dialog, $mdDialog, Authentication, focus) { + LoginController.$inject = ['$scope', '$window', '$timeout', 'Dialog', '$mdDialog', 'Authentication', 'sgFocus', 'sgRippleClick']; + function LoginController($scope, $window, $timeout, Dialog, $mdDialog, Authentication, focus, rippleDo) { var vm = this; - this.$onInit = function() { + this.$onInit = function () { this.creds = { username: $window.cookieUsername, password: null, @@ -31,9 +31,53 @@ // Password policy - change expired password this.passwords = { newPassword: null, newPasswordConfirmation: null, oldPassword: null }; + // Password recovery + this.passwordRecovery = { + passwordRecoveryEnabled: false, + passwordRecoveryQuestionKey: null, + passwordRecoveryQuestion: null, + passwordRecoveryMode: null, + passwordRecoveryQuestionAnswer: null, + passwordRecoveryToken: null, + passwordRecoveryLinkTimer: null, + passwordRecoverySecondaryEmailText: null, + passwordRecoveryMailDomain: null + }; + // Show login once everything is initialized this.showLogin = false; - $timeout(function() { vm.showLogin = true; }, 100); + $timeout(function () { + vm.showLogin = true; + + const queryString = window.location.search; + const urlParams = new URLSearchParams(queryString); + let token = urlParams.get('token'); + + if (0 < window.location.pathname.indexOf("passwordRecoveryEmail") && token) { + token = token.replace(/\//g, ''); // remove trailing '/' + const tokenArray = token.split("."); + + // Retrieve info from token + if (3 === tokenArray.length) { + vm.passwordRecovery.passwordRecoveryToken = token; + const info = JSON.parse(atob(tokenArray[1])); + vm.creds.username = info.username; + vm.creds.domain = info.domain; + vm.passwordRecovery.passwordRecoveryToken = token; + vm.passwordRecovery.passwordRecoveryMode = "SecondaryEmail"; + vm.passwordRecovery.passwordRecoveryEnabled = true; + + vm.loginState = 'passwordchange'; + vm.showLogin = false; + rippleDo('loginContent'); + } + + } else { + vm.retrievePasswordRecoveryEnabled(); + } + }, 100); + + }; this.login = function() { @@ -98,7 +142,7 @@ vm.errorMessage = l('Your password is going to expire in %{0} %{1}.', value, string); } else if (msg.passwordexpired) { - vm.loginState = 'passwordexpired'; + vm.loginState = 'passwordchange'; vm.url = msg.url; } @@ -109,6 +153,9 @@ this.restoreLogin = function() { vm.loginState = false; delete vm.creds.verificationCode; + if (vm.isInPasswordRecoveryMode()) { + vm.passwordRecoveryAbort(); + } }; this.continueLogin = function() { @@ -138,6 +185,10 @@ $window.location.href = ApplicationBaseURL + 'login?language=' + this.creds.language; }; + this.hello = function (form) { + return !true; + } + this.canChangePassword = function(form) { if (this.passwords.newPasswordConfirmation && this.passwords.newPasswordConfirmation.length && this.passwords.newPassword != this.passwords.newPasswordConfirmation) { @@ -150,14 +201,15 @@ if (this.passwords.newPassword && this.passwords.newPassword.length > 0 && this.passwords.newPasswordConfirmation && this.passwords.newPasswordConfirmation.length && this.passwords.newPassword == this.passwords.newPasswordConfirmation && - this.passwords.oldPassword && this.passwords.oldPassword.length > 0) + ((this.isInPasswordRecoveryMode()) || + (!this.loginState && this.passwords.oldPassword && this.passwords.oldPassword.length > 0))) return true; return false; }; this.changePassword = function() { - Authentication.changePassword(this.creds.username, this.creds.domain, this.passwords.newPassword, this.passwords.oldPassword).then(function(data) { + Authentication.changePassword(this.creds.username, this.creds.domain, this.passwords.newPassword, this.passwords.oldPassword, this.passwordRecovery.passwordRecoveryToken).then(function(data) { vm.loginState = 'message'; vm.url = data.url; vm.errorMessage = l('The password was changed successfully.'); @@ -167,6 +219,95 @@ }); }; + this.passwordRecoveryInfo = function () { + vm.loginState = 'passwordrecovery'; + Authentication.passwordRecovery(this.creds.username, this.creds.domain).then(function (data) { + vm.passwordRecovery.passwordRecoveryMode = data.mode; + if ('SecretQuestion' === data.mode) { + vm.passwordRecovery.passwordRecoveryQuestion = data.secretQuestionLabel; + vm.passwordRecovery.passwordRecoveryQuestionKey = data.secretQuestion; + } else if ('SecondaryEmail' === data.mode) { + vm.passwordRecovery.passwordRecoverySecondaryEmailText = l("A link will be sent to %{0}", data.obfuscatedRecoveryEmail); + } else if ('Disabled' === data.mode) { + vm.loginState = 'error'; + vm.errorMessage = l('No password recovery method has been defined for this user'); + } + }, function (msg) { + vm.loginState = 'error'; + vm.errorMessage = msg; + }); + }; + + this.passwordRecoveryEmail = function () { + Authentication.passwordRecoveryEmail(this.creds.username, this.creds.domain + , this.passwordRecovery.passwordRecoveryMode + , this.passwordRecovery.passwordRecoveryMailDomain).then(function () { + vm.loginState = 'sendrecoverymail'; + }, function (msg) { + vm.loginState = 'error'; + vm.errorMessage = msg; + }); + }; + + this.passwordRecoveryCheck = function () { + Authentication.passwordRecoveryCheck(this.creds.username, this.creds.domain + , this.passwordRecovery.passwordRecoveryMode + , this.passwordRecovery.passwordRecoveryQuestionKey + , this.passwordRecovery.passwordRecoveryQuestionAnswer + , this.passwordRecovery.passwordRecoveryMailDomain).then(function (token) { + if ("SecretQuestion" == vm.passwordRecovery.passwordRecoveryMode) { + vm.passwordRecovery.passwordRecoveryToken = token; + vm.loginState = 'passwordchange'; + } else if ("SecondaryEmail" == vm.passwordRecovery.passwordRecoveryMode) { + vm.loginState = 'sendrecoverymail'; + } + }, function (msg) { + vm.loginState = 'error'; + vm.errorMessage = msg; + }); + }; + + this.isInPasswordRecoveryMode = function () { + return (("SecretQuestion" == this.passwordRecovery.passwordRecoveryMode || + "SecondaryEmail" == this.passwordRecovery.passwordRecoveryMode) && + this.passwordRecovery.passwordRecoveryToken) ? true : false; + }; + + this.passwordRecoveryAbort = function () { + this.passwords = { newPassword: null, newPasswordConfirmation: null, oldPassword: null }; + this.loginState = false; + this.passwordRecovery.passwordRecoveryEnabled = false; + this.passwordRecovery.passwordRecoveryQuestion = null; + this.passwordRecovery.passwordRecoveryMode = null; + this.passwordRecovery.passwordRecoveryQuestionAnswer = null; + this.passwordRecovery.passwordRecoveryToken = null; + this.passwordRecovery.passwordRecoverySecondaryEmailText = null; + this.passwordRecovery.passwordRecoveryMailDomain = null; + $window.location.href = vm.url; + }; + + this.usernameChanged = function () { + if (this.passwordRecovery.passwordRecoveryLinkTimer) { + clearTimeout(this.passwordRecovery.passwordRecoveryLinkTimer); + } + + this.passwordRecovery.passwordRecoveryLinkTimer = setTimeout(() => { + vm.retrievePasswordRecoveryEnabled(); + this.passwordRecovery.passwordRecoveryLinkTimer = null; + }, PASSWORD_RECOVERY_TIMER_MS); + }; + + this.retrievePasswordRecoveryEnabled = function () { + if (this.creds.username || this.creds.domain) { + Authentication.passwordRecoveryEnabled(this.creds.username, this.creds.domain).then(function (mailDomain) { + vm.passwordRecovery.passwordRecoveryMailDomain = mailDomain; + vm.passwordRecovery.passwordRecoveryEnabled = true; + }, function () { + vm.passwordRecovery.passwordRecoveryEnabled = false; + }); + } + }; + } angular diff --git a/UI/WebServerResources/js/Preferences.js.map b/UI/WebServerResources/js/Preferences.js.map index 30ec851f4..6a0379083 100644 --- a/UI/WebServerResources/js/Preferences.js.map +++ b/UI/WebServerResources/js/Preferences.js.map @@ -1 +1 @@ -{"version":3,"file":"Preferences.js","sources":["Preferences/Preferences.app.js","Preferences/AccountDialogController.js","Preferences/FiltersDialogController.js","Preferences/PreferencesController.js"],"names":["configure","$stateProvider","$urlServiceProvider","state","abstract","views","preferences","templateUrl","controller","controllerAs","url","module","rules","otherwise","runBlock","$window","$log","$transitions","$state","DebugEnabled","defaultErrorHandler","onError","to","transition","name","ignored","error","detail","go","angular","config","run","$inject","AccountDialogController","$timeout","$mdDialog","FileUploader","Dialog","Settings","defaults","account","accountId","mailCustomFromEnabled","vm","this","usesSSO","usesCASAuthentication","usesSAML2Authentication","_loadCertificate","security","hasCertificate","$certificate","then","crt","certificate","filterByExtension","item","isP12File","type","indexOf","test","form","certificateFilename","$setValidity","defaultPort","hostnameRE","emailRE","String","addressesSearchText","ckConfig","autoGrow_minHeight","toolbar","language","ckLocaleCode","encryption","uploader","activeUser","join","autoUpload","queueLimit","filters","fn","onAfterAddingFile","file","onSuccessItem","response","status","headers","clearQueue","_","assign","$$certificate","onErrorItem","alert","l","hasIdentities","filter","identities","isEditableIdentity","length","identity","isReadOnly","selectIdentity","index","selectedIdentity","hasDefaultIdentity","findIndex","isDefault","setDefaultIdentity","$event","$index","forEach","i","stopPropagation","canRemoveIdentity","removeIdentity","splice","addIdentity","firstReadonlyIndex","customFromIsReadonly","fullName","Math","max","showCkEditor","SOGoMailComposeMessageType","filterEmailAddresses","$query","defaultEmailAddresses","address","toLowerCase","importCertificate","queue","formData","password","certificatePassword","uploadItem","onBeforeUploadCertificate","removeCertificate","$removeCertificate","cancel","save","hide","FiltersDialogController","$scope","mailboxes","labels","validateForwardAddress","Preferences","sieveCapabilities","forwardEnabled","vacationEnabled","fieldLabels","subject","from","cc","to_or_cc","size","header","body","methodLabels","discard","keep","stop","redirect","reject","fileinto","addflag","methods","intersection","keys","numberOperatorLabels","under","over","textOperatorLabels","is","is_not","contains","contains_not","matches","matches_not","regex","regex_not","hasRulesAndActions","requirements","actions","match","push","every","a","invalid","method","action","argument","err","message","addMailFilterRule","event","field","operator","removeMailFilterRule","addMailFilterAction","removeMailFilterAction","PreferencesController","$q","$mdMedia","$mdSidenav","$mdToast","sgSettings","focus","User","Account","Authentication","Date","beginOfDay","_loadAllMailboxes","mail","id","$getMailboxes","allMailboxes","$flattenMailboxes","all","domain","domains","forwardConstraints","defaultAddresses","adr","split","Error","forwardConstraintsDomains","$onInit","passwords","newPassword","newPasswordConfirmation","oldPassword","timeZonesList","timeZonesSearchText","mailLabelKeyRE","RegExp","emailSeparatorKeys","SOGoMailAutoMarkAsReadMode","mailAutoMarkAsReadDelay","SOGoMailAutoMarkAsReadDelay","SOGoAlternateAvatar","$alternateAvatar","sieveVariablesCapability","hasActiveExternalSieveScripts","updateVacationDates","$valid","close","onLanguageChange","confirm","ok","quick","location","reload","onDesktopNotificationsChange","SOGoDesktopNotifications","authorizeNotifications","resetContactsCategories","SOGoContactsCategories","defaultContactsCategories","$setDirty","resetCalendarCategories","SOGoCalendarCategories","defaultCalendarCategories","SOGoCalendarCategoriesColorsValues","values","addCalendarCategory","resetCalendarCategoryValidity","removeCalendarCategory","addContactCategory","removeContactCategory","onMailAutoMarkAsReadDelay","addMailAccount","ev","AuxiliaryMailAccounts","isNew","email","receipts","receiptAction","receiptNonRecipientAction","receiptOutsideDomainAction","receiptAnyAction","show","targetEvent","locals","isArray","settings","Mail","ExpandedFolders","$omit","editMailAccount","data","cloneDeep","catch","noop","removeMailAccount","resetMailLabelValidity","addMailLabel","guid","SOGoMailLabelsColorsKeys","SOGoMailLabelsColorsValues","removeMailLabel","addMailFilter","active","SOGoMailLabelsColors","SOGoSieveFilters","editMailFilter","copy","removeMailFilter","onFiltersOrderChanged","_onFiltersOrderChanged","difference","Vacation","autoReplyEmailAddresses","addDefaultEmailAddresses","v","isDefined","union","userFilter","search","excludedUsers","minimumSearchLength","$filter","users","user","$$image","image","avatar","c_email","no_404","manageSieveScript","confirmChanges","target","$dirty","preventDefault","tagName","parentNode","href","options","addresses","sendForm","Forward","enabled","forwardAddress","uniq","value","$save","simple","textContent","position","hideDelay","$setPristine","canChangePassword","changePassword","title","finally","msg","timeZonesListFilter","toUpperCase","d","toggleVacationStartDate","toggleVacationEndDate","startDateEnabled","startDate","endDateEnabled","endDate","getTime","addDays","validateVacationEndDate","date","r","toggleVacationStartTime","startTimeEnabled","startTime","toggleVacationEndTime","endTimeEnabled","endTime"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"Preferences.js","sources":["Preferences/Preferences.app.js","Preferences/AccountDialogController.js","Preferences/FiltersDialogController.js","Preferences/PreferencesController.js"],"names":["configure","$stateProvider","$urlServiceProvider","state","abstract","views","preferences","templateUrl","controller","controllerAs","url","module","rules","otherwise","runBlock","$window","$log","$transitions","$state","DebugEnabled","defaultErrorHandler","onError","to","transition","name","ignored","error","detail","go","angular","config","run","$inject","AccountDialogController","$timeout","$mdDialog","FileUploader","Dialog","Settings","defaults","account","accountId","mailCustomFromEnabled","vm","this","usesSSO","usesCASAuthentication","usesSAML2Authentication","_loadCertificate","security","hasCertificate","$certificate","then","crt","certificate","filterByExtension","item","isP12File","type","indexOf","test","form","certificateFilename","$setValidity","defaultPort","hostnameRE","emailRE","String","addressesSearchText","ckConfig","autoGrow_minHeight","toolbar","language","ckLocaleCode","encryption","uploader","activeUser","join","autoUpload","queueLimit","filters","fn","onAfterAddingFile","file","onSuccessItem","response","status","headers","clearQueue","_","assign","$$certificate","onErrorItem","alert","l","hasIdentities","filter","identities","isEditableIdentity","length","identity","isReadOnly","selectIdentity","index","selectedIdentity","hasDefaultIdentity","findIndex","isDefault","setDefaultIdentity","$event","$index","forEach","i","stopPropagation","canRemoveIdentity","removeIdentity","splice","addIdentity","firstReadonlyIndex","customFromIsReadonly","fullName","Math","max","showCkEditor","SOGoMailComposeMessageType","filterEmailAddresses","$query","defaultEmailAddresses","address","toLowerCase","importCertificate","queue","formData","password","certificatePassword","uploadItem","onBeforeUploadCertificate","removeCertificate","$removeCertificate","cancel","save","hide","FiltersDialogController","$scope","mailboxes","labels","validateForwardAddress","Preferences","sieveCapabilities","forwardEnabled","vacationEnabled","fieldLabels","subject","from","cc","to_or_cc","size","header","body","methodLabels","discard","keep","stop","redirect","reject","fileinto","addflag","methods","intersection","keys","numberOperatorLabels","under","over","textOperatorLabels","is","is_not","contains","contains_not","matches","matches_not","regex","regex_not","hasRulesAndActions","requirements","actions","match","push","every","a","invalid","method","action","argument","err","message","addMailFilterRule","event","field","operator","removeMailFilterRule","addMailFilterAction","removeMailFilterAction","PreferencesController","$q","$mdMedia","$mdSidenav","$mdToast","sgSettings","focus","User","Account","Authentication","Date","beginOfDay","_loadAllMailboxes","mail","id","$getMailboxes","allMailboxes","$flattenMailboxes","all","domain","domains","forwardConstraints","defaultAddresses","adr","split","Error","forwardConstraintsDomains","$onInit","passwords","newPassword","newPasswordConfirmation","oldPassword","timeZonesList","timeZonesSearchText","mailLabelKeyRE","RegExp","emailSeparatorKeys","SOGoMailAutoMarkAsReadMode","mailAutoMarkAsReadDelay","SOGoMailAutoMarkAsReadDelay","SOGoAlternateAvatar","$alternateAvatar","sieveVariablesCapability","hasActiveExternalSieveScripts","updateVacationDates","$valid","close","onLanguageChange","confirm","ok","quick","location","reload","onDesktopNotificationsChange","SOGoDesktopNotifications","authorizeNotifications","resetContactsCategories","SOGoContactsCategories","defaultContactsCategories","$setDirty","resetCalendarCategories","SOGoCalendarCategories","defaultCalendarCategories","SOGoCalendarCategoriesColorsValues","values","addCalendarCategory","resetCalendarCategoryValidity","removeCalendarCategory","addContactCategory","removeContactCategory","onMailAutoMarkAsReadDelay","addMailAccount","ev","AuxiliaryMailAccounts","isNew","email","receipts","receiptAction","receiptNonRecipientAction","receiptOutsideDomainAction","receiptAnyAction","show","targetEvent","locals","isArray","settings","Mail","ExpandedFolders","$omit","editMailAccount","data","cloneDeep","catch","noop","removeMailAccount","resetMailLabelValidity","addMailLabel","guid","SOGoMailLabelsColorsKeys","SOGoMailLabelsColorsValues","removeMailLabel","addMailFilter","active","SOGoMailLabelsColors","SOGoSieveFilters","editMailFilter","copy","removeMailFilter","onFiltersOrderChanged","_onFiltersOrderChanged","difference","Vacation","autoReplyEmailAddresses","addDefaultEmailAddresses","v","isDefined","union","userFilter","search","excludedUsers","minimumSearchLength","$filter","users","user","$$image","image","avatar","c_email","no_404","manageSieveScript","confirmChanges","target","$dirty","preventDefault","tagName","parentNode","href","options","addresses","sendForm","Forward","enabled","forwardAddress","uniq","value","$save","simple","textContent","position","hideDelay","$setPristine","canChangePassword","changePassword","title","finally","msg","timeZonesListFilter","toUpperCase","d","toggleVacationStartDate","toggleVacationEndDate","startDateEnabled","startDate","endDateEnabled","endDate","getTime","addDays","validateVacationEndDate","date","r","toggleVacationStartTime","startTimeEnabled","startTime","toggleVacationEndTime","endTimeEnabled","endTime"],"mappings":"CAGA,wBAWE,SAASA,EAAUC,EAAgBC,GACjCD,EACGE,MAAM,cAAe,CACpBC,UAAU,EACVC,MAAO,CACLC,YAAa,CACXC,YAAa,mBACbC,WAAY,wBACZC,aAAc,UAInBN,MAAM,sBAAuB,CAC5BO,IAAK,WACLL,MAAO,CACLM,OAAQ,CACNJ,YAAa,8BAIlBJ,MAAM,wBAAyB,CAC9BO,IAAK,aACLL,MAAO,CACLM,OAAQ,CACNJ,YAAa,gCAIlBJ,MAAM,2BAA4B,CACjCO,IAAK,gBACLL,MAAO,CACLM,OAAQ,CACNJ,YAAa,mCAIlBJ,MAAM,qBAAsB,CAC3BO,IAAK,UACLL,MAAO,CACLM,OAAQ,CACNJ,YAAa,6BAMrBL,EAAoBU,MAAMC,UAAU,YAQtC,SAASC,EAASC,EAASC,EAAMC,EAAcC,GACxCH,EAAQI,cACXD,EAAOE,oBAAoB,cAG7BH,EAAaI,QAAQ,CAAEC,GAAI,kBAAoB,SAASC,GAC1B,eAAxBA,EAAWD,KAAKE,MACfD,EAAWE,YACdT,EAAKU,MAAM,uBAAyBH,EAAWD,KAAKE,KAAO,KAAOD,EAAWG,QAAQC,QACrFT,EAAOU,GAAG,CAAEzB,MAAO,mBAvEzB0B,QAAQlB,OAAO,qBAAsB,CAAC,YAAa,aAAc,oBAAqB,cAAe,gBAAiB,kBAAmB,sBAAuB,gBAC7JmB,OAAO9B,GACP+B,IAAIjB,GAKPd,EAAUgC,QAAU,CAAC,iBAAkB,uBAsDvClB,EAASkB,QAAU,CAAC,UAAW,OAAQ,eAAgB,UAhEzD,GCAA,wBAOE,SAASC,EAAwBC,EAAUnB,EAASoB,EAAWC,EAAcC,EAAQC,EAAUC,EAAUC,EAASC,EAAWC,GAC3H,IAAIC,EAAKC,KAAMC,EAAU9B,EAAQ+B,uBAAyB/B,EAAQgC,wBA0GlE,SAASC,IACHL,EAAGH,QAAQS,UAAYN,EAAGH,QAAQS,SAASC,gBAC7CP,EAAGH,QAAQW,eAAeC,KAAK,SAASC,GACtCV,EAAGW,YAAcD,GAChB,kBACMV,EAAGH,QAAQS,SAASC,iBAIjC,SAASK,EAAkBC,GACrBC,EAA0C,EAA9BD,EAAKE,KAAKC,QAAQ,WAAiB,eAAeC,KAAKJ,EAAKhC,MAE5E,OADAmB,EAAGkB,KAAKC,oBAAoBC,aAAa,aAAcN,GAChDA,EApHTb,KAAKoB,YAAc,IACnBpB,KAAKL,SAAWA,EAChBK,KAAKJ,QAAUA,EACfI,KAAKH,UAAYA,EACjBG,KAAKqB,WAAapB,GAAuB,EAAZJ,EAAgB,mDAAqD,IAClGG,KAAKsB,QAAUC,OAAOD,QACtBtB,KAAKwB,oBAAsB,GAC3BxB,KAAKyB,SAAW,CACdC,mBAAsB,GACtBC,QAAW,CAAC,CAAC,OAAQ,SAAU,IAAK,OACvB,OAAO,WAAW,IAAI,YACtB,UAAW,WACxBC,SAAUjC,EAASkC,cAGhB7B,KAAKJ,QAAQkC,WAEkB,OAA3B9B,KAAKJ,QAAQkC,aACpB9B,KAAKoB,YAAc,KAFnBpB,KAAKJ,QAAQkC,WAAa,OAI5B1B,IAEAJ,KAAK+B,SAAW,IAAIvC,EAAa,CAC/B1B,IAAK,CAAC4B,EAASsC,WAAW,aAAe,OAAQnC,EAAW,qBAAqBoC,KAAK,KACtFC,YAAY,EACZC,WAAY,EACZC,QAAS,CAAC,CAAExD,KAAM+B,EAAmB0B,GAAI1B,IACzC2B,kBAAmB,SAAS1B,GAC1Bb,EAAGmB,oBAAsBN,EAAK2B,KAAK3D,MAErC4D,cAAe,SAAS5B,EAAM6B,EAAUC,EAAQC,GAC9C3C,KAAK4C,aACLtD,EAAS,WACPuD,EAAEC,OAAO/C,EAAGH,QAAS,CAACS,SAAU,CAACC,gBAAgB,GAAOyC,cAAeN,MAEzErC,KAEF4C,YAAa,SAASpC,EAAM6B,EAAUC,EAAQC,GAC5ClD,EAAOwD,MAAMC,EAAE,SAAUA,EAAE,gFAI/BlD,KAAKmD,cAAgB,WACnB,OAA2E,EAApEN,EAAEO,OAAOpD,KAAKJ,QAAQyD,WAAYrD,KAAKsD,oBAAoBC,QAGpEvD,KAAKsD,mBAAqB,SAAUE,GAClC,OAAQA,EAASC,YAGnBzD,KAAK0D,eAAiB,SAAUC,GAC1B3D,KAAK4D,kBAAoBD,EAC3B3D,KAAK4D,iBAAmB,KAExB5D,KAAK4D,iBAAmBD,GAI5B3D,KAAK6D,mBAAqB,WACxB,OAAoG,GAA7FhB,EAAEiB,UAAU9D,KAAKJ,QAAQyD,WAAY,SAASG,GAAY,QAASA,EAASO,aAGrF/D,KAAKgE,mBAAqB,SAAUC,EAAQC,GAQ1C,OAPArB,EAAEsB,QAAQnE,KAAKJ,QAAQyD,WAAY,SAASG,EAAUY,GAChDA,GAAKF,EACPV,EAASO,WAAaP,EAASO,iBAExBP,EAASO,YAEpBE,EAAOI,mBACA,GAGTrE,KAAKsE,kBAAoB,SAAUX,GACjC,OAAQA,GAAS3D,KAAK4D,kBAAqB5D,KAAKmD,iBAGlDnD,KAAKuE,eAAiB,SAAUZ,GAC9B3D,KAAKJ,QAAQyD,WAAWmB,OAAOb,EAAO,GACtC3D,KAAK4D,iBAAmB,MAG1B5D,KAAKyE,YAAc,WACjB,IAAIC,EAAqB7B,EAAEiB,UAAU9D,KAAKJ,QAAQyD,WAAY,CAAEI,WAAY,IACxED,EAAW,GAEXkB,EAAqB,IACvBA,EAAqB1E,KAAKJ,QAAQyD,WAAWE,QAC3CvD,KAAK2E,yBACPnB,EAASoB,SAAW5E,KAAKJ,QAAQyD,WAAW,GAAGuB,UACjD5E,KAAKJ,QAAQyD,WAAWmB,OAAOK,KAAKC,IAAIJ,EAAoB,GAAI,EAAGlB,GACnExD,KAAK4D,iBAAmBc,GAG1B1E,KAAK+E,aAAe,SAAUb,GAC5B,OAAOlE,KAAK4D,kBAAoBM,GAAsD,QAA5ClE,KAAKL,SAASqF,4BAG1DhF,KAAKiF,qBAAuB,SAAUC,GACpC,OAAOrC,EAAEO,OAAOjF,EAAQgH,sBAAuB,SAAUC,GACvD,OAA8D,GAAvDA,EAAQC,cAActE,QAAQmE,EAAOG,kBAmBhDrF,KAAK2E,qBAAuB,WAC1B,QAAgB,EAAZ9E,KAEIC,GAGVE,KAAKsF,kBAAoB,WACvBtF,KAAK+B,SAASwD,MAAM,GAAGC,SAAW,CAAC,CAAEC,SAAUzF,KAAK0F,sBACpD1F,KAAK+B,SAAS4D,WAAW,IAG3B3F,KAAK4F,0BAA4B,SAAU3E,GACzCjB,KAAKiB,KAAOA,EACZjB,KAAK+B,SAASa,cAGhB5C,KAAK6F,kBAAoB,WACvB7F,KAAKJ,QAAQkG,sBAGf9F,KAAK+F,OAAS,WACZxG,EAAUwG,UAGZ/F,KAAKgG,KAAO,WACVzG,EAAU0G,QApJd5G,EAAwBD,QAAU,CAAC,WAAY,UAAW,YAAa,eAAgB,SAAU,aAAc,WAAY,UAAW,YAAa,yBAwJnJH,QACGlB,OAAO,sBACPH,WAAW,0BAA2ByB,GAhK3C,GCAA,wBAOE,SAAS6G,EAAwBC,EAAQhI,EAASoB,EAAWE,EAAQ2D,EAAQgD,EAAWC,EAAQC,EAAwBC,GACtH,IACIC,EAAoBrI,EAAQqI,kBAC5BC,EAAiBtI,EAAQsI,eACPtI,EAAQuI,gBAE9B1G,KAAKoD,OAASA,EACdpD,KAAKoG,UAAYA,EACjBpG,KAAKqG,OAASA,EAEdrG,KAAK2G,YAAc,CACjBC,QAAW1D,EAAE,WACb2D,KAAQ3D,EAAE,QACVxE,GAAMwE,EAAE,MACR4D,GAAM5D,EAAE,MACR6D,SAAY7D,EAAE,YACd8D,KAAQ9D,EAAE,aACV+D,OAAU/D,EAAE,YAG2B,EAArCsD,EAAkBzF,QAAQ,UAC5Bf,KAAK2G,YAAYO,KAAOhE,EAAE,SAE5BlD,KAAKmH,aAAe,CAClBC,QAAWlE,EAAE,uBACbmE,KAAQnE,EAAE,oBACVoE,KAAQpE,EAAE,iCAGRuD,IACFzG,KAAKmH,aAAaI,SAAWrE,EAAE,4BAKU,EAAvCsD,EAAkBzF,QAAQ,YAC5Bf,KAAKmH,aAAaK,OAAStE,EAAE,2BAEc,EAAzCsD,EAAkBzF,QAAQ,cAC5Bf,KAAKmH,aAAaM,SAAWvE,EAAE,0BAEa,EAA1CsD,EAAkBzF,QAAQ,eAAgE,EAA3CyF,EAAkBzF,QAAQ,iBAC3Ef,KAAKmH,aAAaO,QAAUxE,EAAE,0BAEhClD,KAAK2H,QAAU,CACb,WACA,UACA,OACA,OACA,UACA,WACA,UAEF3H,KAAK2H,QAAU9E,EAAE+E,aAAa5H,KAAK2H,QAAS9E,EAAEgF,KAAK7H,KAAKmH,eAExDnH,KAAK8H,qBAAuB,CAC1BC,MAAS7E,EAAE,YACX8E,KAAQ9E,EAAE,YAGZlD,KAAKiI,mBAAqB,CACxBC,GAAMhF,EAAE,MACRiF,OAAUjF,EAAE,UACZkF,SAAYlF,EAAE,YACdmF,aAAgBnF,EAAE,oBAClBoF,QAAWpF,EAAE,WACbqF,YAAerF,EAAE,oBAGuB,EAAtCsD,EAAkBzF,QAAQ,WAC5Bf,KAAKiI,mBAAmBO,MAAQtF,EAAE,iBAClClD,KAAKiI,mBAAmBQ,UAAYvF,EAAE,yBAGxClD,KAAK+F,OAAS,WACZxG,EAAUwG,UAGZ/F,KAAK0I,mBAAqB,WACxB,IAAIC,EAAe,CAAE3I,KAAKoD,OAAOwF,SAIjC,MAHyB,eAArB5I,KAAKoD,OAAOyF,OAEdF,EAAaG,KAAK9I,KAAKoD,OAAOpF,OACzB6E,EAAEkG,MAAMJ,EAAc,SAASK,GACpC,OAAOA,GAAgB,EAAXA,EAAEzF,UAIlBvD,KAAKgG,KAAO,SAAU/E,GAMpB,GAHAjB,KAAKiJ,SAAU,EAGXjJ,KAAKoD,OAAOwF,QACd,IACE/F,EAAEsB,QAAQtB,EAAEO,OAAOpD,KAAKoD,OAAOwF,QAAS,CAAEM,OAAU,aAAe,SAAUC,GAC3E7C,EAAuB6C,EAAOC,YAEhC,MAAOC,GAGP,OADArJ,KAAKiJ,QAAUI,EAAIC,SACZ,EAGX/J,EAAU0G,QAGZjG,KAAKuJ,kBAAoB,SAAUC,GAC5BxJ,KAAKoD,OAAOpF,QACfgC,KAAKoD,OAAOpF,MAAQ,IAEtBgC,KAAKoD,OAAOpF,MAAM8K,KAAK,CAAEW,MAAO,UAAWC,SAAU,cAGvD1J,KAAK2J,qBAAuB,SAAUhG,GACpC3D,KAAKoD,OAAOpF,MAAMwG,OAAOb,EAAO,IAGlC3D,KAAK4J,oBAAsB,SAAUJ,GAC9BxJ,KAAKoD,OAAOwF,UACf5I,KAAKoD,OAAOwF,QAAU,IAExB5I,KAAKoD,OAAOwF,QAAQE,KAAK,CAAEI,OAAQ,cAGrClJ,KAAK6J,uBAAyB,SAAUlG,GACtC3D,KAAKoD,OAAOwF,QAAQpE,OAAOb,EAAO,IAhItCuC,EAAwB9G,QAAU,CAAC,SAAU,UAAW,YAAa,SAAU,SAAU,YAAa,SAAU,yBAA0B,eAoI1IH,QACGlB,OAAO,sBACPH,WAAW,0BAA2BsI,GA5I3C,GCAA,wBAOE,SAAS4D,EAAsBC,EAAI5L,EAASG,EAAQ0L,EAAUC,EAAY1K,EAAW2K,EAAUC,EAAYC,EAAO3K,EAAQ4K,EAAMC,EAAS/D,EAAagE,GACpJ,IAAIxK,EAAKC,KAAMoG,EAAY,IAAY,IAAIoE,MAAOC,aAmMlD,SAASC,IACP,IAAI9K,EAEAwG,EAAU7C,QAGV4G,EAAWnI,WAAW,QAAQ2I,OAGhC/K,EAAU,IAAI0K,EAAQ,CAAEM,GAAI,KACpBC,gBAAgBrK,KAAK,WAI3B,IAHA,IAAIsK,EAAelL,EAAQmL,kBAAkB,CAACC,KAAK,IAC/CrH,GAAS,EACTJ,EAASuH,EAAavH,SACjBI,EAAQJ,GACf6C,EAAU0C,KAAKgC,EAAanH,MA0IpC,SAAS2C,EAAuBlB,GAC9B,IAA+B6F,EAE/BC,EAAU,GAEV,GAAiC,EAA7B/M,EAAQgN,mBAAwB,CAalC,GAVAC,EAAmBjN,EAAQgH,sBAC3BtC,EAAEsB,QAAQiH,EAAkB,SAASC,GAC/BJ,EAASI,EAAIC,MAAM,KAAK,GACxBL,GACFC,EAAQpC,KAAKmC,EAAO5F,iBAKxB4F,EAAS7F,EAAQkG,MAAM,KAAK,GAAGjG,cAC3B6F,EAAQnK,QAAQkK,GAAU,GAAmC,GAA9B9M,EAAQgN,mBACzC,MAAM,IAAII,MAAMrI,EAAE,+EAEf,GAA+B,GAA3BgI,EAAQnK,QAAQkK,IAA8C,GAA9B9M,EAAQgN,mBAC/C,MAAM,IAAII,MAAMrI,EAAE,+EAEf,GAAkC,GAA9B/E,EAAQgN,oBACmC,EAA3ChN,EAAQqN,0BAA0BjI,QAClCpF,EAAQqN,0BAA0BzK,QAAQkK,GAAU,EAC3D,MAAM,IAAIM,MAAMrI,EAAE,gEAAkE,IAAM+H,GAI9F,OAAO,EAzXTjL,KAAKyL,QAAU,WACbzL,KAAKtC,YAAc6I,EACnBvG,KAAK0L,UAAY,CAAEC,YAAa,KAAMC,wBAAyB,KAAMC,YAAa,MAClF7L,KAAK8L,cAAgB3N,EAAQ2N,cAC7B9L,KAAK+L,oBAAsB,GAC3B/L,KAAKwB,oBAAsB,GAC3BxB,KAAKgM,eAAiB,IAAIC,OAAO,gCACjCjM,KAAKkM,mBAAqB3F,EAAY5G,SAASuM,mBACQ,SAAnD3F,EAAY5G,SAASwM,2BACvBnM,KAAKoM,wBAA0BvH,KAAKC,IAAI,EAAG9E,KAAKtC,YAAYiC,SAAS0M,6BAErErM,KAAKoM,wBAA0B,EAG7B7F,EAAY5G,SAAS2M,sBACvBjC,EAAKkC,iBAAmBhG,EAAY5G,SAAS2M,qBAE3CnC,EAAWnI,WAAW,QAAQ2I,OAChC3K,KAAKwM,yBAA8E,GAAlDrO,EAAQqI,kBAAkBzF,QAAQ,aACnEf,KAAKtC,YAAY+O,iCAEnBzM,KAAK0M,uBAGP1M,KAAKhB,GAAK,SAASjB,EAAQkD,GACrBA,EAAK0L,SAEF3C,EAAS,UACZC,EAAW,QAAQ2C,QACrBtO,EAAOU,GAAG,eAAiBjB,KAI/BiC,KAAK6M,iBAAmB,SAAS5L,GAC3BA,EAAK0L,QACPlN,EAAOqN,QAAQ5J,EAAE,WACFA,EAAE,yCACF,CAAC6J,GAAI7J,EAAE,OAAQ6C,OAAQ7C,EAAE,QACvC1C,KAAK,WACJT,EAAGiG,KAAK/E,EAAM,CAAE+L,OAAO,IAAQxM,KAAK,WAClCrC,EAAQ8O,SAASC,QAAO,QAMhClN,KAAKmN,6BAA+B,WAC9BnN,KAAKtC,YAAYiC,SAASyN,0BAC5BpN,KAAKtC,YAAY2P,0BAGrBrN,KAAKsN,wBAA0B,SAASrM,GACtCjB,KAAKtC,YAAYiC,SAAS4N,uBAAyBpP,EAAQqP,0BAC3DvM,EAAKwM,aAGPzN,KAAK0N,wBAA0B,SAASzM,GACtCjB,KAAKtC,YAAYiC,SAASgO,uBAAyB9K,EAAEgF,KAAK1J,EAAQyP,2BAClE5N,KAAKtC,YAAYiC,SAASkO,mCAAqChL,EAAEiL,OAAO3P,EAAQyP,2BAChF3M,EAAKwM,aAGPzN,KAAK+N,oBAAsB,SAAS9M,GAClC,IAAImD,EAAIvB,EAAE9B,QAAQf,KAAKtC,YAAYiC,SAASgO,uBAAwBzK,EAAE,iBAClEkB,EAAI,IACNpE,KAAKtC,YAAYiC,SAASgO,uBAAuB7E,KAAK5F,EAAE,iBACxDlD,KAAKtC,YAAYiC,SAASkO,mCAAmC/E,KAAK,QAClE7H,EAAKwM,YACLrJ,EAAIpE,KAAKtC,YAAYiC,SAASgO,uBAAuBpK,OAAS,GAEhE6G,EAAM,oBAAsBhG,IAG9BpE,KAAKgO,8BAAgC,SAASrK,EAAO1C,GACnDA,EAAK,oBAAsB0C,GAAOxC,aAAa,aAAa,IAG9DnB,KAAKiO,uBAAyB,SAAStK,EAAO1C,GAC5CjB,KAAKtC,YAAYiC,SAASgO,uBAAuBnJ,OAAOb,EAAO,GAC/D3D,KAAKtC,YAAYiC,SAASkO,mCAAmCrJ,OAAOb,EAAO,GAC3E1C,EAAKwM,aAGPzN,KAAKkO,mBAAqB,SAASjN,GACjC,IAAImD,EAAIvB,EAAE9B,QAAQf,KAAKtC,YAAYiC,SAAS4N,uBAAwB,IAChEnJ,EAAI,IACNpE,KAAKtC,YAAYiC,SAAS4N,uBAAuBzE,KAAK,IACtD1E,EAAIpE,KAAKtC,YAAYiC,SAAS4N,uBAAuBhK,OAAS,GAEhE6G,EAAM,mBAAqBhG,GAC3BnD,EAAKwM,aAGPzN,KAAKmO,sBAAwB,SAASxK,EAAO1C,GAC3CjB,KAAKtC,YAAYiC,SAAS4N,uBAAuB/I,OAAOb,EAAO,GAC/D1C,EAAKwM,aAGPzN,KAAKoO,0BAA4B,WAC/BpO,KAAKtC,YAAYiC,SAAS0M,4BAA8BrM,KAAKoM,yBAG/DpM,KAAKqO,eAAiB,SAASC,EAAIrN,GACjC,IAEA0C,EAAQ3D,KAAKtC,YAAYiC,SAAS4O,sBAAsBhL,OACxD3D,EAAU,IAAI0K,EAAQ,CACpBM,GAAIjH,EACJ6K,OAAO,EACP5P,KAAM,GACNyE,WAAY,CACV,CACEuB,SAAU,GACV6J,MAAO,KAGXC,SAAU,CACRC,cAAe,SACfC,0BAA2B,SAC3BC,2BAA4B,SAC5BC,iBAAkB,YAItBvP,EAAUwP,KAAK,CACbnR,WAAY,0BACZC,aAAc,2BACdF,YAAa,0BACbqR,YAAaV,EACbW,OAAQ,CACNtP,SAAUK,KAAKtC,YAAYiC,SAC3BC,QAASA,EACTC,UAAW8D,EACX7D,sBAAuB3B,EAAQ2B,yBAEhCU,KAAK,WAEDvB,QAAQiQ,QAAQnP,EAAGrC,YAAYyR,SAASC,KAAKC,mBAChDtP,EAAGrC,YAAYyR,SAASC,KAAKC,gBAAkB,CAAC,OAElDtP,EAAGrC,YAAYyR,SAASC,KAAKC,gBAAgBvG,KAAK,IAAMnF,GACxD5D,EAAGrC,YAAYiC,SAAS4O,sBAAsBzF,KAAKlJ,EAAQ0P,SAE3DrO,EAAKwM,eAITzN,KAAKuP,gBAAkB,SAAS/F,EAAO7F,EAAO1C,GAC5C,IAEAuO,EAAO3M,EAAEC,OAAO,CAAE8H,GAAIjH,GAASd,EAAE4M,UAAUzP,KAAKtC,YAAYiC,SAAS4O,sBAAsB5K,KAC3F/D,EAAU,IAAI0K,EAAQkF,GACtBjQ,EAAUwP,KAAK,CACbnR,WAAY,0BACZC,aAAc,2BACdF,YAAa,uBAAyBgG,EACtCqL,YAAaxF,EACbyF,OAAQ,CACNtP,SAAUK,KAAKtC,YAAYiC,SAC3BC,QAASA,EACTC,UAAW8D,EACX7D,sBAAuB3B,EAAQ2B,yBAEhCU,KAAK,WACNT,EAAGrC,YAAYiC,SAAS4O,sBAAsB5K,GAAS/D,EAAQ0P,QAC/DrO,EAAKwM,cACJiC,MAAM7M,EAAE8M,OAGb3P,KAAK4P,kBAAoB,SAASjM,EAAO1C,GACvCjB,KAAKtC,YAAYiC,SAAS4O,sBAAsB/J,OAAOb,EAAO,GAC9D1C,EAAKwM,aAGPzN,KAAK6P,uBAAyB,SAASlM,EAAO1C,GAC5CA,EAAK,iBAAmB0C,GAAOxC,aAAa,aAAa,IAG3DnB,KAAK8P,aAAe,SAAS7O,GAET8O,OAClB/P,KAAKtC,YAAYiC,SAASqQ,yBAAyBlH,KAAK,SACxD9I,KAAKtC,YAAYiC,SAASsQ,2BAA2BnH,KAAK,CAAC,YAAa,SACxEsB,EAAM,cAAgBvH,EAAEmE,KAAKhH,KAAKtC,YAAYiC,SAASqQ,0BAA4B,IACnF/O,EAAKwM,aAGPzN,KAAKkQ,gBAAkB,SAASvM,EAAO1C,GACrCjB,KAAKtC,YAAYiC,SAASqQ,yBAAyBxL,OAAOb,EAAO,GACjE3D,KAAKtC,YAAYiC,SAASsQ,2BAA2BzL,OAAOb,EAAO,GACnE1C,EAAKwM,aAwBPzN,KAAKmQ,cAAgB,SAAS7B,EAAIrN,GAChC,IAAImC,EAAS,CAAEyF,MAAO,MAAOuH,OAAQ,GAErC1F,IACAnL,EAAUwP,KAAK,CACbpR,YAAa,wBACbC,WAAY,0BACZC,aAAc,eACdmR,YAAaV,EACbW,OAAQ,CACN7L,OAAQA,EACRgD,UAAWA,EACXC,OAAQrG,KAAKtC,YAAYiC,SAAS0Q,qBAClC/J,uBAAwBA,KAEzB9F,KAAK,WACDT,EAAGrC,YAAYiC,SAAS2Q,mBAC3BvQ,EAAGrC,YAAYiC,SAAS2Q,iBAAmB,IAC7CvQ,EAAGrC,YAAYiC,SAAS2Q,iBAAiBxH,KAAK1F,GAC9CnC,EAAKwM,eAITzN,KAAKuQ,eAAiB,SAASjC,EAAI3K,EAAO1C,GACxC,IAAImC,EAASnE,QAAQuR,KAAKxQ,KAAKtC,YAAYiC,SAAS2Q,iBAAiB3M,IAErE+G,IACAnL,EAAUwP,KAAK,CACbpR,YAAa,qBAAuBgG,EACpC/F,WAAY,0BACZC,aAAc,eACdmR,YAAa,KACbC,OAAQ,CACN7L,OAAQA,EACRgD,UAAWA,EACXC,OAAQrG,KAAKtC,YAAYiC,SAAS0Q,qBAClC/J,uBAAwBA,KAEzB9F,KAAK,WACNT,EAAGrC,YAAYiC,SAAS2Q,iBAAiB3M,GAASP,EAClDnC,EAAKwM,aAEC5K,EAAE8M,OAGZ3P,KAAKyQ,iBAAmB,SAAS9M,EAAO1C,GACtCjB,KAAKtC,YAAYiC,SAAS2Q,iBAAiB9L,OAAOb,EAAO,GACzD1C,EAAKwM,aAGPzN,KAAK0Q,sBAAwB,SAASzP,GAOpC,OALKjB,KAAK2Q,yBACR3Q,KAAK2Q,uBAAyB,SAAS7P,GACrCG,EAAKwM,cAGFzN,KAAK2Q,wBAGd3Q,KAAKiF,qBAAuB,SAAUC,GACpC,OAAOrC,EAAEO,OACPP,EAAE+N,WAAWzS,EAAQgH,sBACRnF,KAAKtC,YAAYiC,SAASkR,SAASC,yBAChD,SAAU1L,GACR,OAA8D,GAAvDA,EAAQC,cAActE,QAAQmE,EAAOG,kBAKlDrF,KAAK+Q,yBAA2B,SAAS9P,GACvC,IAAI+P,EAAI,GAEJ/R,QAAQgS,UAAUjR,KAAKtC,YAAYiC,SAASkR,SAASC,2BACvDE,EAAIhR,KAAKtC,YAAYiC,SAASkR,SAASC,yBAGzC9Q,KAAKtC,YAAYiC,SAASkR,SAASC,wBAA0BjO,EAAEqO,MAAM/S,EAAQgH,sBAAuB6L,GACpG/P,EAAKwM,aAGPzN,KAAKmR,WAAa,SAASC,EAAQC,GACjC,OAAKD,GAAUA,EAAO7N,OAAS4G,EAAWmH,sBACjC,GAEFjH,EAAKkH,QAAQH,EAAQC,GAAe7Q,KAAK,SAASgR,GAUvD,OARA3O,EAAEsB,QAAQqN,EAAO,SAASC,GACnBA,EAAKC,UACJD,EAAKE,MACPF,EAAKC,QAAUD,EAAKE,MAEpBF,EAAKC,QAAU3R,EAAGrC,YAAYkU,OAAOH,EAAKI,QAAS,GAAI,CAACC,QAAQ,OAG/DN,KAIXxR,KAAK+R,kBAAoB,SAAS9Q,GAChCjB,KAAKtC,YAAY+O,+BAA8B,GAC/CxL,EAAKwM,aAGPzN,KAAKgS,eAAiB,SAAS/N,EAAQhD,GACrC,IAAIgR,EAEJ,GAAIhR,EAAKiR,QAAUjR,EAAK0L,OAAQ,CAO9B,IALA1I,EAAOkO,iBACPlO,EAAOI,kBAGP4N,EAAShO,EAAOgO,OACS,KAAlBA,EAAOG,SACZH,EAASA,EAAOI,WAElB5S,EAAOqN,QAAQ5J,EAAE,mBACFA,EAAE,+DACF,CAAE6J,GAAI7J,EAAE,QAAS6C,OAAQ7C,EAAE,gBACzC1C,KAAK,WAEJT,EAAGiG,KAAK/E,EAAM,CAAE+L,OAAO,IAAQxM,KAAK,WAClCrC,EAAQ8O,SAAWgF,EAAOK,QAE3B,WAEDnU,EAAQ8O,SAAWgF,EAAOK,SAuChCtS,KAAKgG,KAAO,SAAS/E,EAAMsR,GACzB,IAAInO,EAAaoO,EAEjBC,GAAW,EAKX,GAAIzS,KAAKtC,YAAYiC,SAAS+S,SAAW1S,KAAKtC,YAAYiC,SAAS+S,QAAQC,SACvE3S,KAAKtC,YAAYiC,SAAS+S,QAAQE,eAAgB,CACpDJ,EAAYxS,KAAKtC,YAAYiC,SAAS+S,QAAQE,eAC9C,IACE,IAAKxO,EAAI,EAAGA,EAAIoO,EAAUjP,OAAQa,IAChCkC,EAAuBkM,EAAUpO,IAEnC,MAAOiF,GACP5J,EAAOwD,MAAMC,EAAE,SAAUmG,GACzBoJ,GAAW,GAgDf,OA3CIzS,KAAKtC,YAAYiC,SAASqQ,yBAAyBzM,QACnDvD,KAAKtC,YAAYiC,SAASsQ,2BAA2B1M,QACrDvD,KAAKtC,YAAYiC,SAASqQ,yBAAyBzM,QACnDV,EAAEgQ,KAAK7S,KAAKtC,YAAYiC,SAASqQ,0BAA0BzM,SAC7D9D,EAAOwD,MAAMC,EAAE,SAAUA,EAAE,wCAC3BL,EAAEsB,QAAQnE,KAAKtC,YAAYiC,SAASqQ,yBAA0B,SAAU8C,EAAO1O,EAAGyD,GAC5E5G,EAAK,iBAAmBmD,GAAG8N,SAC1BrK,EAAK9G,QAAQ+R,IAAU1O,IACK,EAA5ByD,EAAK9G,QAAQ+R,EAAO1O,EAAE,MACzBnD,EAAK,iBAAmBmD,GAAGjD,aAAa,aAAa,GACrDsR,GAAW,MAMbzS,KAAKtC,YAAYiC,SAASgO,uBAAuBpK,QACjDV,EAAEgQ,KAAK7S,KAAKtC,YAAYiC,SAASgO,wBAAwBpK,SAC3D9D,EAAOwD,MAAMC,EAAE,SAAUA,EAAE,gDAC3BL,EAAEsB,QAAQnE,KAAKtC,YAAYiC,SAASgO,uBAAwB,SAAUmF,EAAO1O,EAAGyD,GAC1E5G,EAAK,oBAAsBmD,GAAG8N,SAC7BrK,EAAK9G,QAAQ+R,IAAU1O,IACK,EAA5ByD,EAAK9G,QAAQ+R,EAAO1O,EAAE,MACzBnD,EAAK,oBAAsBmD,GAAGjD,aAAa,aAAa,GACxDsR,GAAW,MAMbzS,KAAKtC,YAAYiC,SAAS4N,uBAAuBhK,QACjDV,EAAEgQ,KAAK7S,KAAKtC,YAAYiC,SAAS4N,wBAAwBhK,SAC3D9D,EAAOwD,MAAMC,EAAE,SAAUA,EAAE,+CAC3BL,EAAEsB,QAAQnE,KAAKtC,YAAYiC,SAAS4N,uBAAwB,SAAUuF,EAAO1O,EAAGyD,GAC1E5G,EAAK,mBAAqBmD,GAAG8N,SAC5BrK,EAAK9G,QAAQ+R,IAAU1O,IACK,EAA5ByD,EAAK9G,QAAQ+R,EAAO1O,EAAE,MACzBnD,EAAK,mBAAqBmD,GAAGjD,aAAa,aAAa,GACvDsR,GAAW,MAKbA,EACKzS,KAAKtC,YAAYqV,QAAQvS,KAAK,SAASgP,GACvC+C,GAAYA,EAAQvF,QACvB9C,EAAS6E,KACP7E,EAAS8I,SACNC,YAAY/P,EAAE,sBACdgQ,SAAS,gBACTC,UAAU,MACflS,EAAKmS,kBAIJrJ,EAAGvC,OAAO,iBAGnBxH,KAAKqT,kBAAoB,SAASpS,GAChC,OAAIjB,KAAK0L,UAAUE,yBAA2B5L,KAAK0L,UAAUE,wBAAwBrI,QACjFvD,KAAK0L,UAAUC,aAAe3L,KAAK0L,UAAUE,yBAC/C3K,EAAK2K,wBAAwBzK,aAAa,uBAAuB,IAC1D,IAGPF,EAAK2K,wBAAwBzK,aAAa,uBAAuB,MAE/DnB,KAAK0L,UAAUC,aAAmD,EAApC3L,KAAK0L,UAAUC,YAAYpI,QACzDvD,KAAK0L,UAAUE,yBAA2B5L,KAAK0L,UAAUE,wBAAwBrI,QACjFvD,KAAK0L,UAAUC,aAAe3L,KAAK0L,UAAUE,yBAC7C5L,KAAK0L,UAAUG,aAAmD,EAApC7L,KAAK0L,UAAUG,YAAYtI,UAM/DvD,KAAKsT,eAAiB,WACpB/I,EAAe+I,eAAe,KAAM,KAAMtT,KAAK0L,UAAUC,YAAa3L,KAAK0L,UAAUG,aAAarL,KAAK,WACrG,IAAIyC,EAAQ1D,EAAU0D,MAAM,CAC1BsQ,MAAOrQ,EAAE,YACT+P,YAAa/P,EAAE,0CACf6J,GAAI7J,EAAE,QAER3D,EAAUwP,KAAM9L,GACbuQ,QAAQ,eAGV,SAASC,GACNxQ,EAAQ1D,EAAU0D,MAAM,CAC1BsQ,MAAOrQ,EAAE,YACT+P,YAAaQ,EACb1G,GAAI7J,EAAE,QAER3D,EAAUwP,KAAM9L,GACbuQ,QAAQ,iBAMfxT,KAAK0T,oBAAsB,SAAStQ,GAClC,OAAOP,EAAEO,OAAOpD,KAAK8L,cAAe,SAASgH,GAC3C,OAA4D,GAArDA,EAAMa,cAAc5S,QAAQqC,EAAOuQ,kBAI9C3T,KAAK0M,oBAAsB,WACzB,IAAIkH,EAAI5T,KAAKtC,YAAYiC,SAErBiU,GACAA,EAAE/C,UACF+C,EAAE/C,SAAS8B,UACb3S,KAAK6T,0BACL7T,KAAK8T,0BAIT9T,KAAK6T,wBAA0B,WAC7B,IAEA7C,EAAIhR,KAAKtC,YAAYiC,SAASkR,SAE1BG,EAAE+C,mBAEC/C,EAAEgD,YACLhD,EAAEgD,UAAY,IAAIxJ,MAEhBwG,EAAEiD,gBAAkBjD,EAAEkD,SAAWlD,EAAEgD,UAAUG,UAAYnD,EAAEkD,QAAQC,YACrEnD,EAAEgD,UAAY,IAAIxJ,KAAKwG,EAAEkD,QAAQC,WACjCnD,EAAEgD,UAAUI,SAAS,MAK3BpU,KAAK8T,sBAAwB,WAC3B,IAEA9C,EAAIhR,KAAKtC,YAAYiC,SAASkR,SAE1BG,EAAEiD,iBAECjD,EAAEkD,UACLlD,EAAEkD,QAAU,IAAI1J,MAEdwG,EAAE+C,kBAAoB/C,EAAEgD,WAAahD,EAAEkD,QAAQC,UAAYnD,EAAEgD,UAAUG,YACzEnD,EAAEkD,QAAU,IAAI1J,KAAKwG,EAAEgD,UAAUG,WACjCnD,EAAEkD,QAAQE,QAAQ,MAKxBpU,KAAKqU,wBAA0B,SAASC,GACtC,IAAIV,EAAI7T,EAAGrC,YAAYiC,SAAU4U,GAAI,EAWrC,OANIA,EAJAX,GACAA,EAAE/C,UACF+C,EAAE/C,SAAS8B,SACTiB,EAAE/C,SAASoD,gBACPL,EAAE/C,SAASkD,mBACXH,EAAE/C,SAASmD,WACZM,EAAKH,WAAaP,EAAE/C,SAASmD,UAAUG,UAIzCI,GAGTvU,KAAKwU,wBAA0B,WAC7B,IAEAxD,EAAIhR,KAAKtC,YAAYiC,SAASkR,SAE1BG,EAAEyD,mBAECzD,EAAE0D,YACL1D,EAAE0D,UAAY,IAAIlK,OAKxBxK,KAAK2U,sBAAwB,WAC3B,IAEA3D,EAAIhR,KAAKtC,YAAYiC,SAASkR,SAE1BG,EAAE4D,iBAEC5D,EAAE6D,UACL7D,EAAE6D,QAAU,IAAIrK,OAjlBxBV,EAAsB1K,QAAU,CAAC,KAAM,UAAW,SAAU,WAAY,aAAc,YAAa,WAAY,aAAc,UAAW,SAAU,OAAQ,UAAW,cAAe,kBAulBpLH,QACGlB,OAAO,sBACPH,WAAW,wBAAyBkM,GA/lBzC"} \ No newline at end of file diff --git a/UI/WebServerResources/js/Preferences.services.js b/UI/WebServerResources/js/Preferences.services.js index 3e5fac42a..f6c2513bb 100644 --- a/UI/WebServerResources/js/Preferences.services.js +++ b/UI/WebServerResources/js/Preferences.services.js @@ -1,2 +1,2 @@ -!function(){"use strict";function p(){var e,t,a,o,n=this;if(this.nextAlarm=null,this.nextInboxPoll=null,this.currentToast=p.$q.when(!0),this.lastUid=null,this.notifications={},this.defaults={},this.settings={Mail:{}},e=p.$document[0].getElementById("UserDefaults")){try{t=angular.fromJson(e.textContent||e.innerHTML)}catch(e){p.$log.error("Can't parse user's defaults: "+e.message),t={}}if(t.SOGoMailLabelsColorsKeys=[],t.SOGoMailLabelsColorsValues=[],_.forEach(t.SOGoMailLabelsColors,function(e,a){t.SOGoMailLabelsColorsKeys.push(a),t.SOGoMailLabelsColorsValues.push(e),"$"==a.charAt(0)&&(Object.defineProperty(t.SOGoMailLabelsColors,"_"+a,Object.getOwnPropertyDescriptor(t.SOGoMailLabelsColors,a)),delete t.SOGoMailLabelsColors[a])}),_.forEach(t.SOGoSieveFilters,function(e){_.forEach(e.actions,function(e){"addflag"==e.method&&"$"==e.argument.charAt(0)&&(e.argument="_"+e.argument)})}),t.SOGoRememberLastModule&&(t.SOGoLoginModule="Last"),t.SOGoMailAutoMarkAsReadDelay=parseInt(t.SOGoMailAutoMarkAsReadDelay)||0,t.SOGoMailAutoMarkAsReadEnabled=0<=t.SOGoMailAutoMarkAsReadDelay,0$/.exec(e),a=new p.$User({uid:a,cn:e[1],c_email:e[2]});return a.$$image||(a.$$image=n.avatar(a.c_email,32,{no_404:!0})),a}):t.Calendar.PreventInvitationsWhitelist=[]),angular.extend(n.settings,t)}}p.$factory=["$window","$document","$rootScope","$q","$timeout","$log","$state","$mdDateLocale","$mdToast","sgConstant","sgSettings","Gravatar","Resource","User",function(e,a,t,o,n,i,s,r,l,d,c,u,m,f){return angular.extend(p,{$window:e,$document:a,$rootScope:t,$q:o,$timeout:n,$log:i,$state:s,$mdDateLocaleProvider:r,$toast:l,$gravatar:u,$$resource:new m(c.activeUser("folderURL"),c.activeUser()),$resourcesURL:c.resourcesURL(),$User:f,$sgConstant:d}),new p}];try{angular.module("SOGo.PreferencesUI")}catch(e){angular.module("SOGo.PreferencesUI",["SOGo.Common"])}angular.module("SOGo.PreferencesUI").factory("Preferences",p.$factory),p.prototype.ready=function(){return p.$log.warn("Preferences.ready is deprecated -- access settings/defaults directly."),p.$q.when(!0)},p.prototype.avatar=function(e,a,t){var o=this.defaults.SOGoAlternateAvatar,e=this.defaults.SOGoGravatarEnabled?p.$gravatar(e,a,o,t):[p.$resourcesURL,"img","ic_person_grey_24px.svg"].join("/");return t&&t.dstObject&&t.dstAttr&&(t.dstObject[t.dstAttr]=e),e},p.prototype.hasActiveExternalSieveScripts=function(e){var a=this;if(void 0!==e)this.defaults.hasActiveExternalSieveScripts=e;else{if(void 0!==this.defaults.hasActiveExternalSieveScripts)return this.defaults.hasActiveExternalSieveScripts;this.defaults.hasActiveExternalSieveScripts=!1,p.$$resource.quietFetch("activeExternalSieveScripts").then(function(){a.defaults.hasActiveExternalSieveScripts=!0},function(e){if(a.defaults.hasActiveExternalSieveScripts=!1,404===e.status)return p.$q.resolve(!0)})}},p.prototype.supportsNotifications=function(){return"undefined"!=typeof Notification||(p.$log.warn("Notifications are not available for your browser."),!1)},p.prototype.authorizeNotifications=function(){this.supportsNotifications()&&Notification.requestPermission(function(e){return e})},p.prototype.createNotification=function(e,a,t){var o=this,n=_.pick(t,["body","icon"]);this.supportsNotifications()&&(n.tag=e,n.lang="",n.dir="auto",this.notifications[e]=new Notification(a,n),this.notifications[e].onclick=function(){t.onClick(),o.notifications[e].close()})},p.prototype.viewInboxMessage=function(e){p.$state.get("mail.account")?p.$state.go("mail.account.mailbox.message",{accountId:0,mailboxId:"INBOX",messageId:e}):p.$window.location=p.$$resource.path("Mail","view#!/Mail/0/INBOX/"+e)},p.prototype.pollInbox=function(){var e,u=this;function m(e,a,t,o){e.title=t,e.body=o,e.close=function(){a.hide("ok")}}return e={sortingAttributes:{sort:"arrival",asc:0,noHeaders:0,dry:1},filters:[{searchBy:"flags",searchInput:"unseen"}]},this.nextInboxPoll&&p.$timeout.cancel(this.nextInboxPoll),this.inboxSyncToken&&(e.syncToken=this.inboxSyncToken),m.$inject=["scope","$mdToast","title","body"],p.$$resource.post("Mail","0/folderINBOX/changes",e).then(function(e){if(e.syncToken&&(u.inboxSyncToken=e.syncToken,p.$log.debug("New syncToken is "+u.inboxSyncToken)),angular.isDefined(e.headers)&&0','
','
',' email','
',' ','
',"
","
",' ',l("View")," ","
","
",""].join(""),position:p.$sgConstant.toastPosition,hideDelay:5e3,controller:m,viewInboxMessage:u.viewInboxMessage},u.currentToast=u.currentToast.then(angular.bind(r,i))))}}).finally(function(){var e=u.defaults.SOGoRefreshViewCheck;e&&"manually"!=e&&(u.nextInboxPoll=p.$timeout(angular.bind(u,u.pollInbox),1e3*e.timeInterval()))})},p.prototype.getAlarms=function(){var n=this,e=new Date,e=Math.floor(e.getTime()/1e3);p.$$resource.fetch("Calendar","alarmslist?browserTime="+e).then(function(e){var a,t,o,e=e.alarms.sort(function(e,a){e=parseInt(e[2]);return parseInt(a[2])-e});0",'
','
','

{{ summary }}

','
'," ",' ',' ',' ',l("5 minutes")," ",' ',l("10 minutes")," ",' ',l("15 minutes")," ",' ',l("30 minutes")," ",' ',l("45 minutes")," ",' ',l("1 hour")," ",' ',l("1 day")," "," "," ",' ',l("Snooze")," ",' ',l("Close")," ","
","
","
",""].join(""),locals:{url:i},controller:n})}),n.$inject=["scope","url"]})},p.prototype.$save=function(){return p.$$resource.save("Preferences",this.$omit(!0)).then(function(e){return e})},p.prototype.$omit=function(t){var o={},a={};return angular.forEach(this,function(e,a){"constructor"!=a&&"$"!=a[0]&&(o[a]=t?angular.copy(e):e)}),delete o.defaults.locale,o.defaults.SOGoMailAutoMarkAsReadEnabled?"immediate"==o.defaults.SOGoMailAutoMarkAsReadMode&&(o.defaults.SOGoMailAutoMarkAsReadDelay=0):o.defaults.SOGoMailAutoMarkAsReadDelay=-1,delete o.defaults.SOGoMailAutoMarkAsReadEnabled,delete o.defaults.SOGoMailAutoMarkAsReadMode,o.defaults.SOGoMailLabelsColors={},_.forEach(o.defaults.SOGoMailLabelsColorsKeys,function(e,a){o.defaults.SOGoMailLabelsColors[e]=o.defaults.SOGoMailLabelsColorsValues[a]}),delete o.defaults.SOGoMailLabelsColorsKeys,delete o.defaults.SOGoMailLabelsColorsValues,_.forEach(o.defaults.SOGoSieveFilters,function(e){_.forEach(e.actions,function(e){"addflag"==e.method&&"_"==e.argument.charAt(0)&&"$"==e.argument.charAt(1)&&(e.argument=e.argument.substring(1))})}),_.forEach(o.defaults.AuxiliaryMailAccounts,function(e){var a=[];_.forEach(e.identities,function(e){e.isReadOnly||a.push(_.pick(e,["email","fullName","replyTo","signature","isDefault"]))}),e.identities=a}),o.defaults.SOGoMailComposeWindowEnabled||delete o.defaults.SOGoMailComposeWindow,delete o.defaults.SOGoMailComposeWindowEnabled,o.defaults.SOGoMailComposeFontSizeEnabled||(o.defaults.SOGoMailComposeFontSize=0),delete o.defaults.SOGoMailComposeFontSizeEnabled,o.defaults.Vacation&&(o.defaults.Vacation.startDateEnabled?o.defaults.Vacation.startDate=o.defaults.Vacation.startDate.getTime()/1e3:(delete o.defaults.Vacation.startDateEnabled,delete o.defaults.Vacation.startDate),o.defaults.Vacation.endDateEnabled?o.defaults.Vacation.endDate=o.defaults.Vacation.endDate.getTime()/1e3:(delete o.defaults.Vacation.endDateEnabled,delete o.defaults.Vacation.endDate),o.defaults.Vacation.startTimeEnabled?(o.defaults.Vacation.startTime=o.defaults.Vacation.startTime.format(this.$mdDateLocaleProvider,"%H:%M"),o.defaults.Vacation.endTimeEnabled?o.defaults.Vacation.endTime=o.defaults.Vacation.endTime.format(this.$mdDateLocaleProvider,"%H:%M"):(delete o.defaults.Vacation.endTimeEnabled,delete o.defaults.Vacation.endTime)):(delete o.defaults.Vacation.startTimeEnabled,delete o.defaults.Vacation.startTime,delete o.defaults.Vacation.endTimeEnabled,delete o.defaults.Vacation.endTime),o.defaults.Vacation.autoReplyEmailAddresses?o.defaults.Vacation.autoReplyEmailAddresses=_.compact(o.defaults.Vacation.autoReplyEmailAddresses):o.defaults.Vacation.autoReplyEmailAddresses=[]),o.defaults.Forward&&o.defaults.Forward.forwardAddress&&(o.defaults.Forward.forwardAddress=_.compact(o.defaults.Forward.forwardAddress)),o.defaults.SOGoCalendarCategoriesColors={},_.forEach(o.defaults.SOGoCalendarCategories,function(e,a){o.defaults.SOGoCalendarCategoriesColors[e]=o.defaults.SOGoCalendarCategoriesColorsValues[a]}),delete o.defaults.SOGoCalendarCategoriesColorsValues,o.settings.Calendar&&o.settings.Calendar.PreventInvitationsWhitelist&&(_.forEach(o.settings.Calendar.PreventInvitationsWhitelist,function(e){a[e.uid]=e.$shortFormat()}),o.settings.Calendar.PreventInvitationsWhitelist=a),o}}(); +!function(){"use strict";function p(){var e,t,a,o,n=this;if(this.nextAlarm=null,this.nextInboxPoll=null,this.currentToast=p.$q.when(!0),this.lastUid=null,this.notifications={},this.defaults={},this.settings={Mail:{}},e=p.$document[0].getElementById("UserDefaults")){try{t=angular.fromJson(e.textContent||e.innerHTML)}catch(e){p.$log.error("Can't parse user's defaults: "+e.message),t={}}if(t.SOGoMailLabelsColorsKeys=[],t.SOGoMailLabelsColorsValues=[],_.forEach(t.SOGoMailLabelsColors,function(e,a){t.SOGoMailLabelsColorsKeys.push(a),t.SOGoMailLabelsColorsValues.push(e),"$"==a.charAt(0)&&(Object.defineProperty(t.SOGoMailLabelsColors,"_"+a,Object.getOwnPropertyDescriptor(t.SOGoMailLabelsColors,a)),delete t.SOGoMailLabelsColors[a])}),_.forEach(t.SOGoSieveFilters,function(e){_.forEach(e.actions,function(e){"addflag"==e.method&&"$"==e.argument.charAt(0)&&(e.argument="_"+e.argument)})}),t.SOGoRememberLastModule&&(t.SOGoLoginModule="Last"),t.SOGoMailAutoMarkAsReadDelay=parseInt(t.SOGoMailAutoMarkAsReadDelay)||0,t.SOGoMailAutoMarkAsReadEnabled=0<=t.SOGoMailAutoMarkAsReadDelay,0$/.exec(e),a=new p.$User({uid:a,cn:e[1],c_email:e[2]});return a.$$image||(a.$$image=n.avatar(a.c_email,32,{no_404:!0})),a}):t.Calendar.PreventInvitationsWhitelist=[]),angular.extend(n.settings,t)}}p.$factory=["$window","$document","$rootScope","$q","$timeout","$log","$state","$mdDateLocale","$mdToast","sgConstant","sgSettings","Gravatar","Resource","User",function(e,a,t,o,n,i,s,r,l,d,c,u,m,f){return angular.extend(p,{$window:e,$document:a,$rootScope:t,$q:o,$timeout:n,$log:i,$state:s,$mdDateLocaleProvider:r,$toast:l,$gravatar:u,$$resource:new m(c.activeUser("folderURL"),c.activeUser()),$resourcesURL:c.resourcesURL(),$User:f,$sgConstant:d}),new p}];try{angular.module("SOGo.PreferencesUI")}catch(e){angular.module("SOGo.PreferencesUI",["SOGo.Common"])}angular.module("SOGo.PreferencesUI").factory("Preferences",p.$factory),p.prototype.ready=function(){return p.$log.warn("Preferences.ready is deprecated -- access settings/defaults directly."),p.$q.when(!0)},p.prototype.avatar=function(e,a,t){var o=this.defaults.SOGoAlternateAvatar,e=this.defaults.SOGoGravatarEnabled?p.$gravatar(e,a,o,t):[p.$resourcesURL,"img","ic_person_grey_24px.svg"].join("/");return t&&t.dstObject&&t.dstAttr&&(t.dstObject[t.dstAttr]=e),e},p.prototype.hasActiveExternalSieveScripts=function(e){var a=this;if(void 0!==e)this.defaults.hasActiveExternalSieveScripts=e;else{if(void 0!==this.defaults.hasActiveExternalSieveScripts)return this.defaults.hasActiveExternalSieveScripts;this.defaults.hasActiveExternalSieveScripts=!1,p.$$resource.quietFetch("activeExternalSieveScripts").then(function(){a.defaults.hasActiveExternalSieveScripts=!0},function(e){if(a.defaults.hasActiveExternalSieveScripts=!1,404===e.status)return p.$q.resolve(!0)})}},p.prototype.supportsNotifications=function(){return"undefined"!=typeof Notification||(p.$log.warn("Notifications are not available for your browser."),!1)},p.prototype.isItemSecretQuestion=function(){return"SecretQuestion"==this.defaults.SOGoPasswordRecoveryMode},p.prototype.isItemSecondaryEmail=function(){return"SecondaryEmail"==this.defaults.SOGoPasswordRecoveryMode},p.prototype.authorizeNotifications=function(){this.supportsNotifications()&&Notification.requestPermission(function(e){return e})},p.prototype.createNotification=function(e,a,t){var o=this,n=_.pick(t,["body","icon"]);this.supportsNotifications()&&(n.tag=e,n.lang="",n.dir="auto",this.notifications[e]=new Notification(a,n),this.notifications[e].onclick=function(){t.onClick(),o.notifications[e].close()})},p.prototype.viewInboxMessage=function(e){p.$state.get("mail.account")?p.$state.go("mail.account.mailbox.message",{accountId:0,mailboxId:"INBOX",messageId:e}):p.$window.location=p.$$resource.path("Mail","view#!/Mail/0/INBOX/"+e)},p.prototype.pollInbox=function(){var e,u=this;function m(e,a,t,o){e.title=t,e.body=o,e.close=function(){a.hide("ok")}}return e={sortingAttributes:{sort:"arrival",asc:0,noHeaders:0,dry:1},filters:[{searchBy:"flags",searchInput:"unseen"}]},this.nextInboxPoll&&p.$timeout.cancel(this.nextInboxPoll),this.inboxSyncToken&&(e.syncToken=this.inboxSyncToken),m.$inject=["scope","$mdToast","title","body"],p.$$resource.post("Mail","0/folderINBOX/changes",e).then(function(e){if(e.syncToken&&(u.inboxSyncToken=e.syncToken,p.$log.debug("New syncToken is "+u.inboxSyncToken)),angular.isDefined(e.headers)&&0','
','
',' email','
',' ','
',"
","
",' ',l("View")," ","
","
",""].join(""),position:p.$sgConstant.toastPosition,hideDelay:5e3,controller:m,viewInboxMessage:u.viewInboxMessage},u.currentToast=u.currentToast.then(angular.bind(r,i))))}}).finally(function(){var e=u.defaults.SOGoRefreshViewCheck;e&&"manually"!=e&&(u.nextInboxPoll=p.$timeout(angular.bind(u,u.pollInbox),1e3*e.timeInterval()))})},p.prototype.getAlarms=function(){var n=this,e=new Date,e=Math.floor(e.getTime()/1e3);p.$$resource.fetch("Calendar","alarmslist?browserTime="+e).then(function(e){var a,t,o,e=e.alarms.sort(function(e,a){e=parseInt(e[2]);return parseInt(a[2])-e});0",'
','
','

{{ summary }}

','
'," ",' ',' ',' ',l("5 minutes")," ",' ',l("10 minutes")," ",' ',l("15 minutes")," ",' ',l("30 minutes")," ",' ',l("45 minutes")," ",' ',l("1 hour")," ",' ',l("1 day")," "," "," ",' ',l("Snooze")," ",' ',l("Close")," ","
","
","
",""].join(""),locals:{url:i},controller:n})}),n.$inject=["scope","url"]})},p.prototype.$save=function(){return p.$$resource.save("Preferences",this.$omit(!0)).then(function(e){return e})},p.prototype.$omit=function(t){var o={},a={};return angular.forEach(this,function(e,a){"constructor"!=a&&"$"!=a[0]&&(o[a]=t?angular.copy(e):e)}),delete o.defaults.locale,o.defaults.SOGoMailAutoMarkAsReadEnabled?"immediate"==o.defaults.SOGoMailAutoMarkAsReadMode&&(o.defaults.SOGoMailAutoMarkAsReadDelay=0):o.defaults.SOGoMailAutoMarkAsReadDelay=-1,delete o.defaults.SOGoMailAutoMarkAsReadEnabled,delete o.defaults.SOGoMailAutoMarkAsReadMode,o.defaults.SOGoMailLabelsColors={},_.forEach(o.defaults.SOGoMailLabelsColorsKeys,function(e,a){o.defaults.SOGoMailLabelsColors[e]=o.defaults.SOGoMailLabelsColorsValues[a]}),delete o.defaults.SOGoMailLabelsColorsKeys,delete o.defaults.SOGoMailLabelsColorsValues,_.forEach(o.defaults.SOGoSieveFilters,function(e){_.forEach(e.actions,function(e){"addflag"==e.method&&"_"==e.argument.charAt(0)&&"$"==e.argument.charAt(1)&&(e.argument=e.argument.substring(1))})}),_.forEach(o.defaults.AuxiliaryMailAccounts,function(e){var a=[];_.forEach(e.identities,function(e){e.isReadOnly||a.push(_.pick(e,["email","fullName","replyTo","signature","isDefault"]))}),e.identities=a}),o.defaults.SOGoMailComposeWindowEnabled||delete o.defaults.SOGoMailComposeWindow,delete o.defaults.SOGoMailComposeWindowEnabled,o.defaults.SOGoMailComposeFontSizeEnabled||(o.defaults.SOGoMailComposeFontSize=0),delete o.defaults.SOGoMailComposeFontSizeEnabled,o.defaults.Vacation&&(o.defaults.Vacation.startDateEnabled?o.defaults.Vacation.startDate=o.defaults.Vacation.startDate.getTime()/1e3:(delete o.defaults.Vacation.startDateEnabled,delete o.defaults.Vacation.startDate),o.defaults.Vacation.endDateEnabled?o.defaults.Vacation.endDate=o.defaults.Vacation.endDate.getTime()/1e3:(delete o.defaults.Vacation.endDateEnabled,delete o.defaults.Vacation.endDate),o.defaults.Vacation.startTimeEnabled?(o.defaults.Vacation.startTime=o.defaults.Vacation.startTime.format(this.$mdDateLocaleProvider,"%H:%M"),o.defaults.Vacation.endTimeEnabled?o.defaults.Vacation.endTime=o.defaults.Vacation.endTime.format(this.$mdDateLocaleProvider,"%H:%M"):(delete o.defaults.Vacation.endTimeEnabled,delete o.defaults.Vacation.endTime)):(delete o.defaults.Vacation.startTimeEnabled,delete o.defaults.Vacation.startTime,delete o.defaults.Vacation.endTimeEnabled,delete o.defaults.Vacation.endTime),o.defaults.Vacation.autoReplyEmailAddresses?o.defaults.Vacation.autoReplyEmailAddresses=_.compact(o.defaults.Vacation.autoReplyEmailAddresses):o.defaults.Vacation.autoReplyEmailAddresses=[]),o.defaults.Forward&&o.defaults.Forward.forwardAddress&&(o.defaults.Forward.forwardAddress=_.compact(o.defaults.Forward.forwardAddress)),o.defaults.SOGoCalendarCategoriesColors={},_.forEach(o.defaults.SOGoCalendarCategories,function(e,a){o.defaults.SOGoCalendarCategoriesColors[e]=o.defaults.SOGoCalendarCategoriesColorsValues[a]}),delete o.defaults.SOGoCalendarCategoriesColorsValues,o.settings.Calendar&&o.settings.Calendar.PreventInvitationsWhitelist&&(_.forEach(o.settings.Calendar.PreventInvitationsWhitelist,function(e){a[e.uid]=e.$shortFormat()}),o.settings.Calendar.PreventInvitationsWhitelist=a),o}}(); //# sourceMappingURL=Preferences.services.js.map \ No newline at end of file diff --git a/UI/WebServerResources/js/Preferences.services.js.map b/UI/WebServerResources/js/Preferences.services.js.map index 73b1bda77..af570b080 100644 --- a/UI/WebServerResources/js/Preferences.services.js.map +++ b/UI/WebServerResources/js/Preferences.services.js.map @@ -1 +1 @@ -{"version":3,"file":"Preferences.services.js","sources":["Preferences/Preferences.service.js"],"names":["Preferences","settingsElement","data","time","reloadPromises","_this","this","nextAlarm","nextInboxPoll","currentToast","$q","when","lastUid","notifications","defaults","settings","Mail","defaultsElement","$document","getElementById","angular","fromJson","textContent","innerHTML","e","$log","error","message","SOGoMailLabelsColorsKeys","SOGoMailLabelsColorsValues","_","forEach","SOGoMailLabelsColors","value","key","push","charAt","Object","defineProperty","getOwnPropertyDescriptor","SOGoSieveFilters","filter","actions","action","method","argument","SOGoRememberLastModule","SOGoLoginModule","SOGoMailAutoMarkAsReadDelay","parseInt","SOGoMailAutoMarkAsReadEnabled","SOGoMailAutoMarkAsReadMode","SOGoMailAutoSave","SOGoMailComposeWindowEnabled","isDefined","SOGoMailComposeWindow","SOGoMailComposeFontSizeEnabled","SOGoMailComposeFontSize","window","CKEDITOR","config","fontSize_defaultLabel","addCss","AuxiliaryMailAccounts","mailAccount","isNaN","port","Vacation","startDate","Date","endDate","startTime","split","setHours","endTime","autoReplyEmailAddresses","isString","length","isUndefined","days","defaultEmailAddresses","slice","daysBetweenResponse","startDateEnabled","beginOfDay","addDays","endDateEnabled","getTime","startTimeEnabled","SOGoDayEndTime","setMinutes","endTimeEnabled","SOGoDayStartTime","Forward","forwardAddress","isArray","SOGoCalendarCategories","SOGoCalendarCategoriesColorsValues","SOGoCalendarCategoriesColors","SOGoContactsCategories","compact","emailSeparatorKeys","LocaleCode","ckLocaleCode","replace","toLowerCase","extend","$mdDateLocaleProvider","locale","firstDayOfWeek","SOGoFirstDayOfWeek","firstWeekOfYear","SOGoFirstWeekOfYear","weekNumberFormatter","weekNumber","l","msgCalendar","msgOpenCalendar","parseDate","dateString","SOGoShortDateFormat","NaN","formatDate","date","format","$dateFormat","parseTime","timeString","SOGoTimeFormat","formatTime","isDateComplete","trim","test","Calendar","ReloadWebCalendars","AutoReloadedWebCalendars","map","autoReload","id","calendarId","deferred","defer","$$resource","quietFetch","finally","resolve","promise","all","then","save","$omit","$rootScope","$emit","PreventInvitationsWhitelist","match","exec","user","$User","uid","cn","c_email","$$image","avatar","no_404","$factory","$window","$timeout","$state","$mdToast","sgConstant","Settings","Gravatar","Resource","User","$toast","$gravatar","activeUser","$resourcesURL","resourcesURL","$sgConstant","module","factory","prototype","ready","warn","email","size","options","alternate_avatar","SOGoAlternateAvatar","url","SOGoGravatarEnabled","join","dstObject","dstAttr","hasActiveExternalSieveScripts","response","status","supportsNotifications","Notification","authorizeNotifications","requestPermission","permission","createNotification","title","params","pick","tag","lang","dir","onclick","onClick","close","viewInboxMessage","get","go","accountId","mailboxId","messageId","location","path","pollInbox","toastController","scope","body","hide","sortingAttributes","sort","asc","noHeaders","dry","filters","searchBy","searchInput","cancel","inboxSyncToken","syncToken","$inject","post","debug","headers","uidHeaderIndex","indexOf","isReadHeaderIndex","fromHeaderIndex","subjectHeaderIndex","showToast","show","locals","i","toast","SOGoDesktopNotifications","href","name","icon","bind","template","position","toastPosition","hideDelay","controller","refreshViewCheck","SOGoRefreshViewCheck","timeInterval","getAlarms","now","browserTime","Math","floor","fetch","delay","f","alarms","a","b","x","next","pop","utc","alarmTime","showAlarm","today","day","asDate","period","AlarmController","summary","reminder","snooze","localizedStartDate","localizedEndDate","isAllDay","localizedStartTime","localizedEndTime","view","getDayString","$save","deep","preferences","whitelist","copy","substring","account","identities","identity","isReadOnly","$shortFormat"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"Preferences.services.js","sources":["Preferences/Preferences.service.js"],"names":["Preferences","settingsElement","data","time","reloadPromises","_this","this","nextAlarm","nextInboxPoll","currentToast","$q","when","lastUid","notifications","defaults","settings","Mail","defaultsElement","$document","getElementById","angular","fromJson","textContent","innerHTML","e","$log","error","message","SOGoMailLabelsColorsKeys","SOGoMailLabelsColorsValues","_","forEach","SOGoMailLabelsColors","value","key","push","charAt","Object","defineProperty","getOwnPropertyDescriptor","SOGoSieveFilters","filter","actions","action","method","argument","SOGoRememberLastModule","SOGoLoginModule","SOGoMailAutoMarkAsReadDelay","parseInt","SOGoMailAutoMarkAsReadEnabled","SOGoMailAutoMarkAsReadMode","SOGoMailAutoSave","SOGoMailComposeWindowEnabled","isDefined","SOGoMailComposeWindow","SOGoMailComposeFontSizeEnabled","SOGoMailComposeFontSize","window","CKEDITOR","config","fontSize_defaultLabel","addCss","AuxiliaryMailAccounts","mailAccount","isNaN","port","Vacation","startDate","Date","endDate","startTime","split","setHours","endTime","autoReplyEmailAddresses","isString","length","isUndefined","days","defaultEmailAddresses","slice","daysBetweenResponse","startDateEnabled","beginOfDay","addDays","endDateEnabled","getTime","startTimeEnabled","SOGoDayEndTime","setMinutes","endTimeEnabled","SOGoDayStartTime","Forward","forwardAddress","isArray","SOGoCalendarCategories","SOGoCalendarCategoriesColorsValues","SOGoCalendarCategoriesColors","SOGoContactsCategories","compact","emailSeparatorKeys","LocaleCode","ckLocaleCode","replace","toLowerCase","extend","$mdDateLocaleProvider","locale","firstDayOfWeek","SOGoFirstDayOfWeek","firstWeekOfYear","SOGoFirstWeekOfYear","weekNumberFormatter","weekNumber","l","msgCalendar","msgOpenCalendar","parseDate","dateString","SOGoShortDateFormat","NaN","formatDate","date","format","$dateFormat","parseTime","timeString","SOGoTimeFormat","formatTime","isDateComplete","trim","test","Calendar","ReloadWebCalendars","AutoReloadedWebCalendars","map","autoReload","id","calendarId","deferred","defer","$$resource","quietFetch","finally","resolve","promise","all","then","save","$omit","$rootScope","$emit","PreventInvitationsWhitelist","match","exec","user","$User","uid","cn","c_email","$$image","avatar","no_404","$factory","$window","$timeout","$state","$mdToast","sgConstant","Settings","Gravatar","Resource","User","$toast","$gravatar","activeUser","$resourcesURL","resourcesURL","$sgConstant","module","factory","prototype","ready","warn","email","size","options","alternate_avatar","SOGoAlternateAvatar","url","SOGoGravatarEnabled","join","dstObject","dstAttr","hasActiveExternalSieveScripts","response","status","supportsNotifications","Notification","isItemSecretQuestion","SOGoPasswordRecoveryMode","isItemSecondaryEmail","authorizeNotifications","requestPermission","permission","createNotification","title","params","pick","tag","lang","dir","onclick","onClick","close","viewInboxMessage","get","go","accountId","mailboxId","messageId","location","path","pollInbox","toastController","scope","body","hide","sortingAttributes","sort","asc","noHeaders","dry","filters","searchBy","searchInput","cancel","inboxSyncToken","syncToken","$inject","post","debug","headers","uidHeaderIndex","indexOf","isReadHeaderIndex","fromHeaderIndex","subjectHeaderIndex","showToast","show","locals","i","toast","SOGoDesktopNotifications","href","name","icon","bind","template","position","toastPosition","hideDelay","controller","refreshViewCheck","SOGoRefreshViewCheck","timeInterval","getAlarms","now","browserTime","Math","floor","fetch","delay","f","alarms","a","b","x","next","pop","utc","alarmTime","showAlarm","today","day","asDate","period","AlarmController","summary","reminder","snooze","localizedStartDate","localizedEndDate","isAllDay","localizedStartTime","localizedEndTime","view","getDayString","$save","deep","preferences","whitelist","copy","substring","account","identities","identity","isReadOnly","$shortFormat"],"mappings":"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"} \ No newline at end of file diff --git a/UI/WebServerResources/js/Preferences/Preferences.service.js b/UI/WebServerResources/js/Preferences/Preferences.service.js index e45dbd202..5f1e889b5 100644 --- a/UI/WebServerResources/js/Preferences/Preferences.service.js +++ b/UI/WebServerResources/js/Preferences/Preferences.service.js @@ -393,6 +393,26 @@ return true; }; + /** + * @function isItemSecretQuestion + * @memberof Preferences.prototype + * @desc Check if the customer pick the secret question for e-mail recovery + * @returns true if secret question is selected + */ + Preferences.prototype.isItemSecretQuestion = function() { + return "SecretQuestion" == this.defaults.SOGoPasswordRecoveryMode; + }; + + /** + * @function isItemSecondaryEmail + * @memberof Preferences.prototype + * @desc Check if the customer pick the email for password recovery + * @returns true if email is selected + */ + Preferences.prototype.isItemSecondaryEmail = function () { + return "SecondaryEmail" == this.defaults.SOGoPasswordRecoveryMode; + }; + /** * @function authorizeNotifications * @memberof Preferences.prototype diff --git a/UI/WebServerResources/js/Preferences/PreferencesController.js b/UI/WebServerResources/js/Preferences/PreferencesController.js index c8f34f7c0..746a8d613 100644 --- a/UI/WebServerResources/js/Preferences/PreferencesController.js +++ b/UI/WebServerResources/js/Preferences/PreferencesController.js @@ -55,6 +55,7 @@ }); }); }; + this.onDesktopNotificationsChange = function() { if (this.preferences.defaults.SOGoDesktopNotifications)