Ejemplo n.º 1
0
        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());
        }
Ejemplo n.º 2
0
        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);
            }
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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);
        }