Skip to content

Commit b2726c1

Browse files
committed
Fallback to defaultSender when editing draft whose sender is not enabled
Close #10035
1 parent baabb1b commit b2726c1

File tree

6 files changed

+353
-140
lines changed

6 files changed

+353
-140
lines changed

src/common/api/common/utils/GroupUtils.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11
import type { GroupInfo, GroupMembership, User } from "../../entities/sys/TypeRefs.js"
22
import { GroupType } from "../TutanotaConstants"
3-
import { lang, Translation } from "../../../misc/LanguageViewModel.js"
43

54
export function getEnabledMailAddressesForGroupInfo(groupInfo: GroupInfo): string[] {
65
let aliases = groupInfo.mailAddressAliases.filter((alias) => alias.enabled).map((alias) => alias.mailAddress)
76
if (groupInfo.mailAddress) aliases.unshift(groupInfo.mailAddress)
87
return aliases
98
}
109

10+
export function isAliasEnabledForGroupInfo(groupInfo: GroupInfo, aliasAddress: string): boolean {
11+
return (
12+
(groupInfo.mailAddress && groupInfo.mailAddress === aliasAddress) ||
13+
(groupInfo.mailAddressAliases.find((alias) => alias.mailAddress === aliasAddress)?.enabled ?? false)
14+
)
15+
}
16+
1117
/**
1218
* Provides the memberships of the user with the given type. In case of area groups all groups are returned.
1319
*/

src/common/api/worker/facades/lazy/MailFacade.ts

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,6 @@ import {
110110
addressDomain,
111111
assertNotNull,
112112
byteLength,
113-
contains,
114113
defer,
115114
freshVersioned,
116115
getUrlDomain,
@@ -128,7 +127,7 @@ import {
128127
import { BlobFacade } from "./BlobFacade.js"
129128
import { assertWorkerOrNode, isApp, isDesktop } from "../../../common/Env.js"
130129
import { EntityClient } from "../../../common/EntityClient.js"
131-
import { getEnabledMailAddressesForGroupInfo, getUserGroupMemberships } from "../../../common/utils/GroupUtils.js"
130+
import { getUserGroupMemberships, isAliasEnabledForGroupInfo } from "../../../common/utils/GroupUtils.js"
132131
import { containsId, elementIdPart, getElementId, getLetId, isSameId, listIdPart, stringToCustomId } from "../../../common/utils/EntityUtils.js"
133132
import { htmlToText } from "../../../common/utils/IndexUtils.js"
134133
import { MailBodyTooLargeError } from "../../../common/error/MailBodyTooLargeError.js"
@@ -1027,13 +1026,13 @@ export class MailFacade {
10271026
return promiseFilter(getUserGroupMemberships(user, GroupType.Mail), (groupMembership) => {
10281027
return this.entityClient.load(GroupTypeRef, groupMembership.group).then((mailGroup) => {
10291028
if (mailGroup.user == null) {
1030-
return this.entityClient.load(GroupInfoTypeRef, groupMembership.groupInfo).then((mailGroupInfo) => {
1031-
return contains(getEnabledMailAddressesForGroupInfo(mailGroupInfo), mailAddress)
1032-
})
1029+
return this.entityClient
1030+
.load(GroupInfoTypeRef, groupMembership.groupInfo)
1031+
.then((mailGroupInfo) => isAliasEnabledForGroupInfo(mailGroupInfo, mailAddress))
10331032
} else if (isSameId(mailGroup.user, user._id)) {
1034-
return this.entityClient.load(GroupInfoTypeRef, user.userGroup.groupInfo).then((userGroupInfo) => {
1035-
return contains(getEnabledMailAddressesForGroupInfo(userGroupInfo), mailAddress)
1036-
})
1033+
return this.entityClient
1034+
.load(GroupInfoTypeRef, user.userGroup.groupInfo)
1035+
.then((userGroupInfo) => isAliasEnabledForGroupInfo(userGroupInfo, mailAddress))
10371036
} else {
10381037
// not supported
10391038
return false

src/common/mailFunctionality/SendMailModel.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ import {
4444
import Stream from "mithril/stream"
4545
import stream from "mithril/stream"
4646
import type { File as TutanotaFile } from "../../common/api/entities/tutanota/TypeRefs.js"
47-
import { checkAttachmentSize, getDefaultSender, getTemplateLanguages, isUserEmail, RecipientField } from "./SharedMailUtils.js"
47+
import { checkAttachmentSize, getDefaultSender, getTemplateLanguages, isAliasEnabledWithUser, isUserEmail, RecipientField } from "./SharedMailUtils.js"
4848
import { cloneInlineImages, InlineImages, revokeInlineImages } from "./inlineImagesUtils.js"
4949
import { RecipientsModel, ResolvableRecipient } from "../api/main/RecipientsModel.js"
5050
import { getAvailableLanguageCode, getSubstitutedLanguageCode, lang, Language, languages, MaybeTranslation, TranslationKey } from "../misc/LanguageViewModel.js"
@@ -590,7 +590,10 @@ export class SendMailModel {
590590
this.recipientsResolved.getAsync()
591591

592592
// .toLowerCase because all our aliases and accounts are lowercased on creation
593-
this.senderAddress = senderMailAddress?.toLowerCase() || this.getDefaultSender()
593+
this.senderAddress =
594+
senderMailAddress != null && isAliasEnabledWithUser(this.mailboxDetails, this.user().userGroupInfo, senderMailAddress)
595+
? senderMailAddress.toLowerCase()
596+
: this.getDefaultSender()
594597
this.confidential = confidential ?? !this.user().props.defaultUnconfidential
595598
this.attachments = []
596599

src/common/mailFunctionality/SharedMailUtils.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { assertMainOrNode } from "../api/common/Env.js"
22
import { CustomerPropertiesTypeRef, GroupInfo, User } from "../api/entities/sys/TypeRefs.js"
33
import { Contact, createContact, createContactMailAddress, Mail } from "../api/entities/tutanota/TypeRefs.js"
44
import { fullNameToFirstAndLastName, mailAddressToFirstAndLastName } from "../misc/parsing/MailAddressParser.js"
5-
import { assertNotNull, contains, neverNull, uint8ArrayToBase64 } from "@tutao/tutanota-utils"
5+
import { assertNotNull, neverNull, uint8ArrayToBase64 } from "@tutao/tutanota-utils"
66
import {
77
ALLOWED_IMAGE_FORMATS,
88
ContactAddressType,
@@ -16,7 +16,7 @@ import {
1616
TUTA_MAIL_ADDRESS_DOMAINS,
1717
} from "../api/common/TutanotaConstants.js"
1818
import { UserController } from "../api/main/UserController.js"
19-
import { getEnabledMailAddressesForGroupInfo, getGroupInfoDisplayName } from "../api/common/utils/GroupUtils.js"
19+
import { getEnabledMailAddressesForGroupInfo, getGroupInfoDisplayName, isAliasEnabledForGroupInfo } from "../api/common/utils/GroupUtils.js"
2020
import { lang, Language, TranslationKey } from "../misc/LanguageViewModel.js"
2121
import { MailboxDetail } from "./MailboxModel.js"
2222
import { LoginController } from "../api/main/LoginController.js"
@@ -99,13 +99,19 @@ export function getEnabledMailAddressesWithUser(mailboxDetail: MailboxDetail, us
9999
}
100100
}
101101

102+
export function isAliasEnabledWithUser(mailboxDetail: MailboxDetail, userGroupInfo: GroupInfo, aliasAddress: string): boolean {
103+
if (isUserMailbox(mailboxDetail)) {
104+
return isAliasEnabledForGroupInfo(userGroupInfo, aliasAddress)
105+
} else {
106+
return isAliasEnabledForGroupInfo(mailboxDetail.mailGroupInfo, aliasAddress)
107+
}
108+
}
109+
102110
/**
103111
* @return {string} default mail address
104112
*/
105113
export function getDefaultSenderFromUser({ props, userGroupInfo }: UserController): string {
106-
return props.defaultSender && contains(getEnabledMailAddressesForGroupInfo(userGroupInfo), props.defaultSender)
107-
? props.defaultSender
108-
: neverNull(userGroupInfo.mailAddress)
114+
return props.defaultSender && isAliasEnabledForGroupInfo(userGroupInfo, props.defaultSender) ? props.defaultSender : neverNull(userGroupInfo.mailAddress)
109115
}
110116

111117
export function isUserMailbox(mailboxDetails: MailboxDetail): boolean {
@@ -123,7 +129,7 @@ export function getDefaultSender(logins: LoginController, mailboxDetails: Mailbo
123129
export function isUserEmail(logins: LoginController, mailboxDetails: MailboxDetail, address: string): boolean {
124130
if (isUserMailbox(mailboxDetails)) {
125131
return (
126-
contains(getEnabledMailAddressesWithUser(mailboxDetails, logins.getUserController().userGroupInfo), address) ||
132+
isAliasEnabledWithUser(mailboxDetails, logins.getUserController().userGroupInfo, address) ||
127133
logins.getUserController().userGroupInfo.mailAddress === address
128134
)
129135
} else {

src/common/sharing/GroupSharingUtils.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { showProgressDialog } from "../gui/dialogs/ProgressDialog"
55
import type { GroupSharingTexts } from "./GroupGuiUtils"
66
import { getDefaultGroupName, getInvitationGroupType, getSharedGroupName } from "./GroupUtils"
77
import { PartialRecipient, Recipients } from "../api/common/recipients/Recipient"
8-
import { getDefaultSender, getEnabledMailAddressesWithUser, getSenderNameForUser } from "../mailFunctionality/SharedMailUtils.js"
8+
import { getDefaultSender, getSenderNameForUser, isAliasEnabledWithUser } from "../mailFunctionality/SharedMailUtils.js"
99

1010
export function sendShareNotificationEmail(sharedGroupInfo: GroupInfo, recipients: Array<PartialRecipient>, texts: GroupSharingTexts) {
1111
locator.mailboxModel.getUserMailboxDetails().then((mailboxDetails) => {
@@ -89,7 +89,7 @@ function _sendNotificationEmail(recipients: Recipients, subject: string, body: s
8989
usePlaceholderForInlineImages: false,
9090
}).html
9191
locator.mailboxModel.getUserMailboxDetails().then(async (mailboxDetails) => {
92-
const sender = getEnabledMailAddressesWithUser(mailboxDetails, locator.logins.getUserController().userGroupInfo).includes(senderMailAddress)
92+
const sender = isAliasEnabledWithUser(mailboxDetails, locator.logins.getUserController().userGroupInfo, senderMailAddress)
9393
? senderMailAddress
9494
: getDefaultSender(locator.logins, mailboxDetails)
9595

0 commit comments

Comments
 (0)