From 9f705b2c83694446a653ed561feaba2ef5b3d3b0 Mon Sep 17 00:00:00 2001 From: Jyotiranjan Date: Thu, 14 Nov 2019 15:26:50 +0530 Subject: [PATCH] zbug-903:Problem with sendAs delegate rights and Save a copy of sent messages to my Sent folder resolving CR comments (cherry picked from commit 0cade97e83f3ba0ed7e197c217cb65a82f018d78) --- .../src/java/com/zimbra/soap/SoapEngine.java | 21 +++++++++++++++++++ .../com/zimbra/soap/ZimbraSoapContext.java | 4 ++++ 2 files changed, 25 insertions(+) diff --git a/store/src/java/com/zimbra/soap/SoapEngine.java b/store/src/java/com/zimbra/soap/SoapEngine.java index 1aedf18297b..f8782c8874a 100644 --- a/store/src/java/com/zimbra/soap/SoapEngine.java +++ b/store/src/java/com/zimbra/soap/SoapEngine.java @@ -31,6 +31,9 @@ import org.eclipse.jetty.continuation.ContinuationSupport; import com.google.common.base.Strings; +import com.zimbra.common.account.Key; +import com.zimbra.common.account.ProvisioningConstants; +import com.zimbra.common.account.Key.AccountBy; import com.zimbra.common.localconfig.LC; import com.zimbra.common.service.ServiceException; import com.zimbra.common.soap.Element; @@ -51,8 +54,10 @@ import com.zimbra.cs.account.Account; import com.zimbra.cs.account.AccountServiceException; import com.zimbra.cs.account.AccountServiceException.AuthFailedServiceException; +import com.zimbra.cs.account.accesscontrol.generated.RightConsts; import com.zimbra.cs.account.AuthToken; import com.zimbra.cs.account.GuestAccount; +import com.zimbra.cs.account.Identity; import com.zimbra.cs.account.Provisioning; import com.zimbra.cs.mailbox.Mailbox; import com.zimbra.cs.mailbox.MailboxManager; @@ -327,6 +332,22 @@ private Element dispatch(String path, Element envelope, Map cont Element ectxt = soapProto.getHeader(envelope, HeaderConstants.CONTEXT); try { zsc = new ZimbraSoapContext(ectxt, doc.getQName(), handler, context, soapProto); + if (doc.getName().equals("SendMsgRequest")) { + Element msgEle = doc.getElement(MailConstants.E_MSG); + String identityId = msgEle.getAttribute(MailConstants.A_IDENTITY_ID, null); + if (identityId != null) { + Identity identity = Provisioning.getInstance().get(DocumentHandler.getOperationContext(zsc, context) + .getAuthenticatedUser(), Key.IdentityBy.id, identityId); + if (identity != null && + !identity.getAttr(Provisioning.A_zimbraPrefIdentityName).equals(ProvisioningConstants.DEFAULT_IDENTITY_NAME) && + !StringUtil.isNullOrEmpty(identity.getAttr(Provisioning.A_zimbraPrefFromAddressType)) && + (identity.getAttr(Provisioning.A_zimbraPrefFromAddressType).equals(RightConsts.RT_sendAs) || + identity.getAttr(Provisioning.A_zimbraPrefFromAddressType).equals(RightConsts.RT_sendOnBehalfOf))) { + Account targetAccount = Provisioning.getInstance().get(AccountBy.name, identity.getAttr(Provisioning.A_zimbraPrefFromAddress)); + zsc.setmRequestedAccountId(targetAccount.getId()); + } + } + } } catch (ServiceException e) { return soapFaultEnv(soapProto, "unable to construct SOAP context", e); } diff --git a/store/src/java/com/zimbra/soap/ZimbraSoapContext.java b/store/src/java/com/zimbra/soap/ZimbraSoapContext.java index cf9495f9383..f617f1f6402 100644 --- a/store/src/java/com/zimbra/soap/ZimbraSoapContext.java +++ b/store/src/java/com/zimbra/soap/ZimbraSoapContext.java @@ -1065,4 +1065,8 @@ public boolean isAuthUserOnLocalhost() { public SoapProtocol getmResponseProtocol() { return mResponseProtocol; } + + public void setmRequestedAccountId(String mRequestedAccountId) { + this.mRequestedAccountId = mRequestedAccountId; + } }