Blob Blame History Raw
Backport of upstream patch from subversion revision 50583 to fix https://jira.zarafa.com/browse/ZCP-12148

--- zarafa-7.1.14/inetmapi/ECVMIMEUtils.cpp				2015-10-20 11:13:43.000000000 +0200
+++ zarafa-7.1.14/inetmapi/ECVMIMEUtils.cpp.spooler-expand_groups	2016-11-28 22:46:59.000000000 +0100
@@ -112,7 +112,7 @@
  * This function takes a MAPI table, reads all items from it, expands any groups and adds all expanded recipients into the passed
  * recipient table. Group expansion is recursive.
  */
-HRESULT ECVMIMESender::HrAddRecipsFromTable(LPADRBOOK lpAdrBook, IMAPITable *lpTable, vmime::mailboxList &recipients, std::set<std::wstring> &setGroups, std::set<std::wstring> &setRecips, bool bAllowEveryone)
+HRESULT ECVMIMESender::HrAddRecipsFromTable(LPADRBOOK lpAdrBook, IMAPITable *lpTable, vmime::mailboxList &recipients, std::set<std::wstring> &setGroups, std::set<std::wstring> &setRecips, bool bAllowEveryone, bool bAlwaysExpandDistrList)
 {
 	HRESULT hr = hrSuccess;
 	LPSRowSet lpRowSet = NULL;
@@ -125,14 +125,10 @@
 	// Get all recipients from the group
 	for (ULONG i = 0; i < lpRowSet->cRows; i++) {
 		LPSPropValue lpPropObjectType = PpropFindProp( lpRowSet->aRow[i].lpProps, lpRowSet->aRow[i].cValues, PR_OBJECT_TYPE);
+		bool bAddrFetchSuccess = HrGetAddress(lpAdrBook, lpRowSet->aRow[i].lpProps, lpRowSet->aRow[i].cValues, PR_ENTRYID, PR_DISPLAY_NAME_W, PR_ADDRTYPE_W, PR_EMAIL_ADDRESS_W, strName, strType, strEmail) == hrSuccess;
 		
-		if(lpPropObjectType == NULL || lpPropObjectType->Value.ul == MAPI_MAILUSER) {
-			// Normal recipient
-			if (HrGetAddress(lpAdrBook, lpRowSet->aRow[i].lpProps, lpRowSet->aRow[i].cValues,
-							 PR_ENTRYID, PR_DISPLAY_NAME_W, PR_ADDRTYPE_W, PR_EMAIL_ADDRESS_W,
-							 strName, strType, strEmail) == hrSuccess)
-			{
-
+		if (bAddrFetchSuccess && (lpPropObjectType == NULL || lpPropObjectType->Value.ul == MAPI_MAILUSER || (lpPropObjectType->Value.ul == MAPI_DISTLIST && !bAlwaysExpandDistrList))) {
+			if (bAddrFetchSuccess) {
 				if(!strEmail.empty() && setRecips.find(strEmail) == setRecips.end()) {
 					recipients.appendMailbox(vmime::create<vmime::mailbox>(convert_to<string>(strEmail)));
 					setRecips.insert(strEmail);
@@ -263,7 +259,7 @@
 	if(hr != hrSuccess)
 		goto exit;
 
-	hr = HrAddRecipsFromTable(lpAdrBook, lpTable, recipients, setGroups, setRecips, bAllowEveryone);
+	hr = HrAddRecipsFromTable(lpAdrBook, lpTable, recipients, setGroups, setRecips, bAllowEveryone, true);
 	if(hr != hrSuccess)
 		goto exit;
 	
@@ -283,7 +279,7 @@
 	return hr;
 }
 
-HRESULT ECVMIMESender::HrMakeRecipientsList(LPADRBOOK lpAdrBook, LPMESSAGE lpMessage, vmime::ref<vmime::message> vmMessage, vmime::mailboxList &recipients, bool bAllowEveryone)
+HRESULT ECVMIMESender::HrMakeRecipientsList(LPADRBOOK lpAdrBook, LPMESSAGE lpMessage, vmime::ref<vmime::message> vmMessage, vmime::mailboxList &recipients, bool bAllowEveryone, bool bAlwaysExpandDistrList)
 {
 	HRESULT hr = hrSuccess;
 	SRestriction sRestriction;
@@ -320,7 +316,7 @@
 			goto exit;
 	}
 
-	hr = HrAddRecipsFromTable(lpAdrBook, lpRTable, recipients, setGroups, setRecips, bAllowEveryone);
+	hr = HrAddRecipsFromTable(lpAdrBook, lpRTable, recipients, setGroups, setRecips, bAllowEveryone, true);
 	if (hr != hrSuccess)
 		goto exit;
 	
@@ -338,7 +334,7 @@
 // This function does not catch the vmime exception
 // it should be handled by the calling party.
 
-HRESULT ECVMIMESender::sendMail(LPADRBOOK lpAdrBook, LPMESSAGE lpMessage, vmime::ref<vmime::message> vmMessage, bool bAllowEveryone)
+HRESULT ECVMIMESender::sendMail(LPADRBOOK lpAdrBook, LPMESSAGE lpMessage, vmime::ref<vmime::message> vmMessage, bool bAllowEveryone, bool bAlwaysExpandDistrList)
 {
 	HRESULT hr = hrSuccess;
 	vmime::mailbox expeditor;
@@ -386,7 +382,7 @@
 			goto exit;
 		}
 
-		hr = HrMakeRecipientsList(lpAdrBook, lpMessage, vmMessage, recipients, bAllowEveryone);
+		hr = HrMakeRecipientsList(lpAdrBook, lpMessage, vmMessage, recipients, bAllowEveryone, bAlwaysExpandDistrList);
 		if (hr != hrSuccess)
 			goto exit;
 
--- zarafa-7.1.14/inetmapi/ECVMIMEUtils.h				2015-10-20 11:13:43.000000000 +0200
+++ zarafa-7.1.14/inetmapi/ECVMIMEUtils.h.spooler-expand_groups		2016-11-28 22:51:24.000000000 +0100
@@ -55,15 +55,15 @@
 {
 private:
 
-	HRESULT HrMakeRecipientsList(LPADRBOOK lpAdrBook, LPMESSAGE lpMessage, vmime::ref<vmime::message> vmMessage, vmime::mailboxList &recipients, bool bAllowEveryone);
+	HRESULT HrMakeRecipientsList(LPADRBOOK lpAdrBook, LPMESSAGE lpMessage, vmime::ref<vmime::message> vmMessage, vmime::mailboxList &recipients, bool bAllowEveryone, bool bAlwaysExpandDistrList);
 	HRESULT HrExpandGroup(LPADRBOOK lpAdrBook, LPSPropValue lpGroupName, LPSPropValue lpGroupEntryID, vmime::mailboxList &recipients, std::set<std::wstring> &setGroups, std::set<std::wstring> &setRecips, bool bAllowEveryone);
-	HRESULT HrAddRecipsFromTable(LPADRBOOK lpAdrBook, IMAPITable *lpTable, vmime::mailboxList &recipients, std::set<std::wstring> &setGroups, std::set<std::wstring> &setRecips, bool bAllowEveryone);
+	HRESULT HrAddRecipsFromTable(LPADRBOOK lpAdrBook, IMAPITable *lpTable, vmime::mailboxList &recipients, std::set<std::wstring> &setGroups, std::set<std::wstring> &setRecips, bool bAllowEveryone, bool bAlwaysExpandDistrList);
 
 public:
 	ECVMIMESender(ECLogger *newlpLogger, std::string strSMTPHost, int port);
 	virtual	~ECVMIMESender();
 
-	HRESULT sendMail(LPADRBOOK lpAdrBook, LPMESSAGE lpMessage, vmime::ref<vmime::message> vmMessage, bool bAllowEveryone);
+	HRESULT sendMail(LPADRBOOK lpAdrBook, LPMESSAGE lpMessage, vmime::ref<vmime::message> vmMessage, bool bAllowEveryone, bool bAlwaysExpandDistrList);
 };
 
 #endif
--- zarafa-7.1.14/inetmapi/inetmapi.cpp					2015-10-20 11:13:43.000000000 +0200
+++ zarafa-7.1.14/inetmapi/inetmapi.cpp.spooler-expand_groups		2016-11-28 22:50:04.000000000 +0100
@@ -331,7 +331,7 @@
 		goto exit;
 	}
 	
-	hr = mailer->sendMail(lpAddrBook, lpMessage, vmMessage, sopt.allow_send_to_everyone);
+	hr = mailer->sendMail(lpAddrBook, lpMessage, vmMessage, sopt.allow_send_to_everyone, sopt.always_expand_distr_list);
 
 exit:
 	delete mToVM;
--- zarafa-7.1.14/inetmapi/options.h					2015-10-20 11:13:43.000000000 +0200
+++ zarafa-7.1.14/inetmapi/options.h.spooler-expand_groups		2016-11-28 22:55:44.000000000 +0100
@@ -68,6 +68,7 @@
 	char *charset_upgrade;
 	bool allow_send_to_everyone;
 	bool enable_dsn;				/**< Enable SMTP Delivery Status Notifications */
+	bool always_expand_distr_list;
 } sending_options;
 
 void INETMAPI_API imopt_default_delivery_options(delivery_options *dopt);
--- zarafa-7.1.14/spooler/mailer.cpp					2015-10-20 11:13:43.000000000 +0200
+++ zarafa-7.1.14/spooler/mailer.cpp.spooler-expand_groups		2016-11-28 22:54:38.000000000 +0100
@@ -2178,6 +2178,8 @@
 	// Enable SMTP Delivery Status Notifications
 	sopt.enable_dsn = parseBool(g_lpConfig->GetSetting("enable_dsn"));
 
+	sopt.always_expand_distr_list = parseBool(g_lpConfig->GetSetting("expand_groups"));
+
 	// Init plugin system
 	hr = pyMapiPluginFactory.Init(g_lpConfig, g_lpLogger);
 	if (hr != hrSuccess) {
@@ -2427,7 +2429,7 @@
 		 */
 	}
 
-	if(parseBool(g_lpConfig->GetSetting("expand_groups"))) {
+	if (sopt.always_expand_distr_list) {
 		// Expand recipients with ADDRTYPE=ZARAFA to multiple ADDRTYPE=SMTP recipients
 		hr = ExpandRecipients(lpAddrBook, lpMessage);
 		if(hr != hrSuccess)
@@ -2438,7 +2440,7 @@
 	if (hr != hrSuccess)
 		g_lpLogger->Log(EC_LOGLEVEL_WARNING, "Unable to rewrite recipients");
 
-	if(parseBool(g_lpConfig->GetSetting("expand_groups"))) {
+	if (sopt.always_expand_distr_list) {
 		// Only touch recips if we're expanding groups; the rationale is here that the user
 		// has typed a recipient twice if we have duplicates and expand_groups = no, so that's
 		// what the user wanted apparently. What's more, duplicate recips are filtered for RCPT TO