diff --git a/SoObjects/Mailer/SOGoDraftObject.m b/SoObjects/Mailer/SOGoDraftObject.m index 3ea17ca13..6c49c8fbc 100644 --- a/SoObjects/Mailer/SOGoDraftObject.m +++ b/SoObjects/Mailer/SOGoDraftObject.m @@ -1,5 +1,5 @@ /* - Copyright (C) 2007-2020 Inverse inc. + Copyright (C) 2007-2021 Inverse inc. Copyright (C) 2004-2005 SKYRIX Software AG This file is part of SOGo. @@ -685,37 +685,40 @@ static NSString *userAgent = nil; NSDictionary *identity; NSMutableArray *addrs; NSString *email; + SOGoMailAccount *account; int i; - /* Pick the first email matching one of the account's identities */ - addrs = [NSMutableArray array]; - if (_fromSentMailbox) - [self _addRecipients: [_envelope from] toArray: addrs]; - else - { - [self _addRecipients: [_envelope to] toArray: addrs]; - if ([addrs count] == 0) - [self _addRecipients: [_envelope cc] toArray: addrs]; - if ([addrs count] == 0) - [self _addRecipients: [_envelope bcc] toArray: addrs]; - } - identity = nil; - if ([addrs count]) + account = [[self container] mailAccountFolder]; + if (![account forceDefaultIdentity]) { - for (i = 0; !identity && i < [addrs count]; i++) + /* Pick the first email matching one of the account's identities */ + addrs = [NSMutableArray array]; + if (_fromSentMailbox) + [self _addRecipients: [_envelope from] toArray: addrs]; + else { - email = [addrs objectAtIndex: i]; - identity = [[[self container] mailAccountFolder] identityForEmail: email]; + [self _addRecipients: [_envelope to] toArray: addrs]; + [self _addRecipients: [_envelope cc] toArray: addrs]; + [self _addRecipients: [_envelope bcc] toArray: addrs]; } - if (identity) + + if ([addrs count]) { - [_info setObject: [self _emailFromIdentity: identity] forKey: @"from"]; + for (i = 0; !identity && i < [addrs count]; i++) + { + email = [addrs objectAtIndex: i]; + identity = [[[self container] mailAccountFolder] identityForEmail: email]; + } + if (identity) + { + [_info setObject: [self _emailFromIdentity: identity] forKey: @"from"]; + } } } if (!identity) { - identity = [[context activeUser] defaultIdentity]; + identity = [account defaultIdentity]; if (identity) [_info setObject: [self _emailFromIdentity: identity] forKey: @"from"]; } diff --git a/SoObjects/Mailer/SOGoMailAccount.h b/SoObjects/Mailer/SOGoMailAccount.h index 5bc43d8a9..1c229cd38 100644 --- a/SoObjects/Mailer/SOGoMailAccount.h +++ b/SoObjects/Mailer/SOGoMailAccount.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2009-2020 Inverse inc. + Copyright (C) 2009-2021 Inverse inc. This file is part of SOGo. @@ -88,6 +88,7 @@ typedef enum { - (NSArray *) identities; - (NSDictionary *) defaultIdentity; +- (BOOL) forceDefaultIdentity; - (NSDictionary *) identityForEmail: (NSString *) email; - (NSString *) signature; - (NSString *) encryption; diff --git a/SoObjects/Mailer/SOGoMailAccount.m b/SoObjects/Mailer/SOGoMailAccount.m index 2f6f6b544..8a8796e0d 100644 --- a/SoObjects/Mailer/SOGoMailAccount.m +++ b/SoObjects/Mailer/SOGoMailAccount.m @@ -1,5 +1,5 @@ /* - Copyright (C) 2007-2020 Inverse inc. + Copyright (C) 2007-2021 Inverse inc. This file is part of SOGo. @@ -694,6 +694,11 @@ static NSString *inboxFolderName = @"INBOX"; return defaultIdentity; // can be nil } +- (BOOL) forceDefaultIdentity +{ + return [[[self _mailAccount] objectForKey: @"forceDefaultIdentity"] boolValue]; +} + - (NSDictionary *) identityForEmail: (NSString *) email { NSDictionary *identity, *currentIdentity; diff --git a/SoObjects/SOGo/SOGoUser.m b/SoObjects/SOGo/SOGoUser.m index d9b13d2c4..966aa1176 100644 --- a/SoObjects/SOGo/SOGoUser.m +++ b/SoObjects/SOGo/SOGoUser.m @@ -1,5 +1,5 @@ /* - Copyright (C) 2006-2020 Inverse inc. + Copyright (C) 2006-2021 Inverse inc. This file is part of SOGo. @@ -884,6 +884,9 @@ [mailAccount setObject: identities forKey: @"identities"]; [identities release]; + if ([_defaults mailForceDefaultIdentity]) + [mailAccount setObject: [NSNumber numberWithBool: YES] forKey: @"forceDefaultIdentity"]; + // 6. Receipts if ([_defaults allowUserReceipt]) { diff --git a/SoObjects/SOGo/SOGoUserDefaults.h b/SoObjects/SOGo/SOGoUserDefaults.h index be811341b..1498416cd 100644 --- a/SoObjects/SOGo/SOGoUserDefaults.h +++ b/SoObjects/SOGo/SOGoUserDefaults.h @@ -1,6 +1,6 @@ /* SOGoUserDefaults.h - this file is part of SOGo * - * Copyright (C) 2011-2020 Inverse inc. + * Copyright (C) 2011-2021 Inverse inc. * * 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 @@ -185,6 +185,9 @@ extern NSString *SOGoWeekStartFirstFullWeek; - (void) setMailIdentities: (NSArray *) newIdentites; - (NSArray *) mailIdentities; +- (void) setMailForceDefaultIdentity: (BOOL) newValue; +- (BOOL) mailForceDefaultIdentity; + - (void) setAuxiliaryMailAccounts: (NSArray *) newAccounts; - (NSArray *) auxiliaryMailAccounts; diff --git a/SoObjects/SOGo/SOGoUserDefaults.m b/SoObjects/SOGo/SOGoUserDefaults.m index 32bb88623..ff31249a3 100644 --- a/SoObjects/SOGo/SOGoUserDefaults.m +++ b/SoObjects/SOGo/SOGoUserDefaults.m @@ -1,6 +1,6 @@ /* SOGoUserDefaults.m - this file is part of SOGo * - * Copyright (C) 2009-2020 Inverse inc. + * Copyright (C) 2009-2021 Inverse inc. * * 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 @@ -768,6 +768,16 @@ NSString *SOGoWeekStartFirstFullWeek = @"FirstFullWeek"; return [self arrayForKey: @"SOGoMailIdentities"]; } +- (void) setMailForceDefaultIdentity: (BOOL) newValue +{ + [self setBool: newValue forKey: @"SOGoMailForceDefaultIdentity"]; +} + +- (BOOL) mailForceDefaultIdentity +{ + return [self boolForKey: @"SOGoMailForceDefaultIdentity"]; +} + - (void) setAuxiliaryMailAccounts: (NSArray *) newAccounts { [self setObject: newAccounts forKey: @"AuxiliaryMailAccounts"]; diff --git a/UI/PreferencesUI/English.lproj/Localizable.strings b/UI/PreferencesUI/English.lproj/Localizable.strings index 27a5b94d9..edbb9cbbf 100644 --- a/UI/PreferencesUI/English.lproj/Localizable.strings +++ b/UI/PreferencesUI/English.lproj/Localizable.strings @@ -215,6 +215,7 @@ "Reply To Email" = "Reply To Email"; "Signature" = "Signature"; "Identities" = "Identities"; +"Always use the default identity when replying to messages" = "Always use the default identity when replying to messages"; "Default Identity" = "Default Identity"; "New Identity" = "New Identity"; "(Click to create)" = "(Click to create)"; diff --git a/UI/PreferencesUI/UIxJSONPreferences.m b/UI/PreferencesUI/UIxJSONPreferences.m index 025d48233..8648c64ed 100644 --- a/UI/PreferencesUI/UIxJSONPreferences.m +++ b/UI/PreferencesUI/UIxJSONPreferences.m @@ -1,6 +1,6 @@ /* UIxJSONPreferences.m - this file is part of SOGo * - * Copyright (C) 2007-2020 Inverse inc. + * Copyright (C) 2007-2021 Inverse inc. * * 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 @@ -441,6 +441,7 @@ static SoProduct *preferencesProduct = nil; [values removeObjectForKey: @"SOGoMailCertificate"]; [values removeObjectForKey: @"SOGoMailCertificateAlwaysSign"]; [values removeObjectForKey: @"SOGoMailCertificateAlwaysEncrypt"]; + [values removeObjectForKey: @"SOGoMailForceDefaultIdentity"]; // Add the domain's default vacation subject if user has not specified a custom subject vacationOptions = [defaults vacationOptions]; diff --git a/UI/PreferencesUI/UIxPreferences.m b/UI/PreferencesUI/UIxPreferences.m index 07184d001..b33e694b8 100644 --- a/UI/PreferencesUI/UIxPreferences.m +++ b/UI/PreferencesUI/UIxPreferences.m @@ -1,6 +1,6 @@ /* UIxPreferences.m - this file is part of SOGo * - * Copyright (C) 2007-2020 Inverse inc. + * Copyright (C) 2007-2021 Inverse inc. * * 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 @@ -1253,7 +1253,7 @@ static NSArray *reminderValues = nil; { knownKeys = [NSArray arrayWithObjects: @"id", @"name", @"serverName", @"port", @"userName", @"password", @"encryption", @"replyTo", - @"identities", @"mailboxes", + @"identities", @"mailboxes", @"forceDefaultIdentity", @"receipts", @"security", @"isNew", nil]; [knownKeys retain]; @@ -1307,6 +1307,10 @@ static NSArray *reminderValues = nil; identities = [account objectForKey: @"identities"]; if ([self _validateAccountIdentities: identities]) [target setObject: identities forKey: @"SOGoMailIdentities"]; + if ([[account objectForKey: @"forceDefaultIdentity"] boolValue]) + [target setObject: [NSNumber numberWithBool: YES] forKey: @"SOGoMailForceDefaultIdentity"]; + else if ([target objectForKey: @"SOGoMailforceDefaultIdentity"]) + [target removeObjectForKey: @"SOGoMailforceDefaultIdentity"]; [self _extractMainReceiptsPreferences: [account objectForKey: @"receipts"] inDictionary: target]; [self _extractMainSecurityPreferences: [account objectForKey: @"security"] inDictionary: target]; } @@ -1512,6 +1516,7 @@ static NSArray *reminderValues = nil; if ([accounts count] > 0) { // The first account is the main system account. The following mapping is required: + // - forceDefaultIdentity => SOGoMailForceDefaultIdentity // - receipts.receiptAction => SOGoMailReceiptAllow // - receipts.receiptNonRecipientAction => SOGoMailReceiptNonRecipientAction // - receipts.receiptOutsideDomainAction => SOGoMailReceiptOutsideDomainAction diff --git a/UI/Templates/PreferencesUI/UIxAccountEditor.wox b/UI/Templates/PreferencesUI/UIxAccountEditor.wox index eddfac80d..c562e32d7 100644 --- a/UI/Templates/PreferencesUI/UIxAccountEditor.wox +++ b/UI/Templates/PreferencesUI/UIxAccountEditor.wox @@ -97,6 +97,12 @@
+ diff --git a/UI/WebServerResources/js/Mailer/Account.service.js b/UI/WebServerResources/js/Mailer/Account.service.js index 7981c8956..babdfd2f3 100644 --- a/UI/WebServerResources/js/Mailer/Account.service.js +++ b/UI/WebServerResources/js/Mailer/Account.service.js @@ -480,7 +480,7 @@ * @return an object literal copy of the Account instance */ Account.prototype.$omit = function () { - var account = {}, identities = []; + var account = {}, identities = [], defaultIdentity = false; angular.forEach(this, function(value, key) { if (key != 'constructor' && key !='identities' && key[0] != '$') { @@ -491,9 +491,14 @@ _.forEach(this.identities, function (identity) { if (!identity.isReadOnly) identities.push(_.pick(identity, ['email', 'fullName', 'replyTo', 'signature', 'isDefault'])); + if (identity.isDefault) + defaultIdentity = identity; }); account.identities = identities; + if (!defaultIdentity || !account.forceDefaultIdentity) + delete account.forceDefaultIdentity; + return account; }; diff --git a/UI/WebServerResources/js/Preferences/AccountDialogController.js b/UI/WebServerResources/js/Preferences/AccountDialogController.js index 661f86612..51ca17278 100644 --- a/UI/WebServerResources/js/Preferences/AccountDialogController.js +++ b/UI/WebServerResources/js/Preferences/AccountDialogController.js @@ -74,6 +74,10 @@ } }; + this.hasDefaultIdentity = function() { + return _.findIndex(this.account.identities, function(identity) { return !!identity.isDefault; }) >= 0; + }; + this.setDefaultIdentity = function ($event, $index) { _.forEach(this.account.identities, function(identity, i) { if (i == $index)