private ApprovalEngine.ApprovalProcessResults HandleInitiationMessage(InitiationMessage initiationMessage) { if (initiationMessage.IsMapiInitiator) { if (!this.sender.Equals(this.recipient)) { return(ApprovalEngine.ApprovalProcessResults.Invalid); } } else if (string.Equals("ModeratedTransport", initiationMessage.ApprovalInitiator, StringComparison.OrdinalIgnoreCase)) { this.messageItem[MessageItemSchema.ApprovalApplicationId] = 1; HeaderList headers = this.message.MimeDocument.RootPart.Headers; TextHeader textHeader = headers.FindFirst("X-MS-Exchange-Organization-Moderation-Data") as TextHeader; string value; if (textHeader != null && textHeader.TryGetValue(out value) && !string.IsNullOrEmpty(value)) { this.messageItem[MessageItemSchema.ApprovalApplicationData] = value; } this.StampModeratedTransportExpiry(); } if (initiationMessage.DecisionMakers == null) { return(ApprovalEngine.ApprovalProcessResults.Invalid); } if (InitiationProcessor.CheckDuplicateInitiationAndUpdateIdIfNecessary(this.messageItem)) { return(ApprovalEngine.ApprovalProcessResults.DuplicateInitiation); } InitiationProcessor initiationProcessor = new InitiationProcessor(this.mbxTransportMailItem, initiationMessage, this.messageItem, this.requestCreate, this.recipient); return(initiationProcessor.PrepareApprovalRequestData()); }
private void SendApprovalRequest(ApprovalRequestWriter writer, ICollection <RoutingAddress> p1DecisionMakers, CultureInfo cultureInfo, string messageId, byte[] corelationBlob) { IList <RoutingAddress> decisionMakers = this.initiationMessage.DecisionMakers; byte[] conversationIndex = this.initiationMessageItem.ConversationIndex; (string)this.initiationMessage.Requestor; using (MessageItemApprovalRequest messageItemApprovalRequest = this.requestCreate(this.mbxTransportMailItem)) { messageItemApprovalRequest.SetSender(this.approvalRequestSender); foreach (RoutingAddress routingAddress in decisionMakers) { bool flag = p1DecisionMakers == null || p1DecisionMakers.Contains(routingAddress); messageItemApprovalRequest.AddRecipient(routingAddress, flag); InitiationProcessor.diag.TraceDebug <RoutingAddress, bool>(0L, "Added recipient '{0}' with promote to P1={1}.", routingAddress, flag); } CultureInfo cultureInfo2; if (!writer.WriteSubjectAndBody(messageItemApprovalRequest, cultureInfo, out cultureInfo2)) { InitiationProcessor.diag.TraceError <ApprovalRequestWriter>(0L, "Approval request body cannot be written with writer {0}", writer); } messageItemApprovalRequest.ApprovalRequestor = this.initiationMessage.Requestor; messageItemApprovalRequest.MessageItem[ItemSchema.NormalizedSubject] = this.initiationMessageItem.ConversationTopic; messageItemApprovalRequest.MessageItem.Importance = this.initiationMessageItem.Importance; messageItemApprovalRequest.MessageItem.References = InitiationProcessor.ConstructApprovalRequestReferences(this.initiationMessageItem); ConversationIndex o = ConversationIndex.CreateFromParent(conversationIndex); if (!ConversationIndex.Empty.Equals(o)) { messageItemApprovalRequest.MessageItem.ConversationIndex = o.ToByteArray(); } if (cultureInfo2 != null) { InitiationProcessor.diag.TraceDebug <CultureInfo>(0L, "Approval request written in {0}", cultureInfo2); messageItemApprovalRequest.MessageItem[MessageItemSchema.MessageLocaleId] = cultureInfo2.LCID; } foreach (Attachment attachment in this.initiationMessage.EmailMessage.Attachments) { messageItemApprovalRequest.AddAttachment(attachment, this.mbxTransportMailItem.ADRecipientCache.ADSession); } if (this.initiationMessage.EmailMessage.RootPart != null && this.initiationMessage.EmailMessage.RootPart.Headers != null) { HeaderList headers = this.initiationMessage.EmailMessage.RootPart.Headers; Header[] array = headers.FindAll("X-MS-Exchange-Inbox-Rules-Loop"); if (array != null && array.Length > 0) { string[] array2 = new string[array.Length]; for (int i = 0; i < array.Length; i++) { array2[i] = array[i].Value; } messageItemApprovalRequest.MessageItem.SafeSetProperty(MessageItemSchema.XLoop, array2); } } InitiationProcessor.AddVotingToApprovalRequest(messageItemApprovalRequest, this.initiationMessage.VotingActions, cultureInfo2); messageItemApprovalRequest.Send(messageId, corelationBlob, this.mbxTransportMailItem); } }
public ApprovalEngine.ProcessResult CreateAndSubmitApprovalRequests(int?messageLocaleId) { InitiationMessage initiationMessage; if (InitiationMessage.TryCreate(this.message, out initiationMessage)) { InitiationProcessor initiationProcessor = new InitiationProcessor(this.mbxTransportMailItem, initiationMessage, this.messageItem, this.requestCreate, this.recipient); return(initiationProcessor.CreateAndSubmitApprovalRequests(messageLocaleId)); } return(ApprovalEngine.ProcessResult.Invalid); }
internal static bool CheckDuplicateInitiationAndUpdateIdIfNecessary(MessageItem message) { message.Load(InitiationProcessor.PropertiesForUniquenessCheck); string internetMessageId = message.InternetMessageId; string text; if (!InitiationProcessor.TryGetIdentiferFromInitiationMessageId(internetMessageId, out text)) { return(false); } InitiationProcessor.diag.TraceDebug <string, string>(0L, "Find dup for init message messageid='{0}' identifier='{1}'.", internetMessageId, text); string text2 = message.TryGetProperty(MessageItemSchema.ApprovalRequestor) as string; string text3 = message.TryGetProperty(MessageItemSchema.ApprovalApplicationData) as string; MailboxSession session = (MailboxSession)message.Session; IStorePropertyBag[] array; try { array = AllItemsFolderHelper.FindItemsFromInternetId(session, text, InitiationProcessor.PropertiesForUniquenessCheck); } catch (ObjectNotFoundException arg) { InitiationProcessor.diag.TraceError <ObjectNotFoundException>(0L, "Exception - {0}", arg); return(false); } bool flag = false; bool flag2 = false; if (array != null && array.Length > 0) { InitiationProcessor.diag.TraceDebug <int, string>(0L, "Found {0} initiation messages with the message id. messageId={1}.", array.Length, text); for (int i = 0; i < array.Length; i++) { flag = true; string text4 = array[i].TryGetProperty(MessageItemSchema.ApprovalRequestor) as string; string text5 = array[i].TryGetProperty(MessageItemSchema.ApprovalApplicationData) as string; if (string.Equals(text4, text2, StringComparison.OrdinalIgnoreCase) && string.Equals(text5, text3, StringComparison.OrdinalIgnoreCase)) { flag2 = true; break; } InitiationProcessor.diag.TraceDebug(0L, "Matching message-id={0} unmatched data requestor={1} data={2} found: requestor={3} data={4}.", new object[] { text, text2, text3, text4, text5 }); } } InitiationProcessor.diag.TraceDebug <string, bool, bool>(0L, "'{0}' found={1}, duplicateInitiation = {2}", text, flag, flag2); if (!flag2) { if (flag) { message.InternetMessageId = Guid.NewGuid().ToString().Substring(0, 5) + "_" + internetMessageId; InitiationProcessor.diag.TraceDebug <string, string>(0L, "Rewriting from message id from {0} to {1}", internetMessageId, message.InternetMessageId); } else if (!flag) { message.InternetMessageId = text; } } return(flag2); }