private bool ShouldProcessMessage(MailboxSession session, StoreDriverDeliveryEventArgsImpl argsImpl)
        {
            MessageItem messageItem = argsImpl.MessageItem;

            if (!StoreDriverConfig.Instance.IsGroupEscalationAgentEnabled)
            {
                GroupEscalationAgent.Tracer.TraceDebug((long)this.GetHashCode(), "GroupEscalationAgent.ShouldProcessMessage: skipping group message escalation as the feature is disabled via app config.");
                return(false);
            }
            if (!GroupEscalation.IsEscalationEnabled())
            {
                GroupEscalationAgent.Tracer.TraceDebug((long)this.GetHashCode(), "GroupEscalationAgent.ShouldProcessMessage: skipping group message escalation as the feature is disabled.");
                return(false);
            }
            if (session == null || !session.IsGroupMailbox())
            {
                GroupEscalationAgent.Tracer.TraceDebug((long)this.GetHashCode(), "GroupEscalationAgent.ShouldProcessMessage: skipping group message escalation as the session is not for a group mailbox.");
                return(false);
            }
            if (this.processedMessages.IsAlreadyProcessedForStage(messageItem.InternetMessageId, messageItem.SentTime, session.MailboxGuid, DeliveryStage.CreatedMessageEventHandled))
            {
                GroupEscalationAgent.Tracer.TraceDebug((long)this.GetHashCode(), "GroupEscalationAgent.ShouldProcessMessage: skipping group message escalation as it was already processed earlier.");
                return(false);
            }
            if (!ObjectClass.IsMessage(argsImpl.MessageClass, false) && !ObjectClass.IsMeetingMessage(argsImpl.MessageClass) && !ObjectClass.IsMeetingMessageSeries(argsImpl.MessageClass))
            {
                GroupEscalationAgent.Tracer.TraceDebug <string>((long)this.GetHashCode(), "GroupEscalationAgent.ShouldProcessMessage: ignoring messages that are not messages nor meeting messages. Message class {0}", argsImpl.MessageClass);
                return(false);
            }
            if (ObjectClass.IsMeetingForwardNotification(argsImpl.MessageClass) || ObjectClass.IsMeetingForwardNotificationSeries(argsImpl.MessageClass))
            {
                GroupEscalationAgent.Tracer.TraceDebug((long)this.GetHashCode(), "GroupEscalationAgent.ShouldProcessMessage: item class is meeting forward notification. Do not process.");
                return(false);
            }
            if (ObjectClass.IsMeetingResponse(argsImpl.MessageClass) || ObjectClass.IsMeetingResponseSeries(argsImpl.MessageClass))
            {
                GroupEscalationAgent.Tracer.TraceDebug((long)this.GetHashCode(), "GroupEscalationAgent.ShouldProcessMessage: item class is meeting response. Do not process.");
                return(false);
            }
            if (GroupEscalationAgent.IsEHAMigrationMeetingMessage(argsImpl.MailItem))
            {
                GroupEscalationAgent.Tracer.TraceDebug((long)this.GetHashCode(), "GroupEscalationAgent.ShouldProcessMessage: ignoring EHA migration messages.");
                return(false);
            }
            if (GroupEscalationAgent.IsRepairUpdateMessage(argsImpl.MessageItem))
            {
                GroupEscalationAgent.Tracer.TraceDebug((long)this.GetHashCode(), "GroupEscalationAgent.ShouldProcessMessage: ignoring RUM messages.");
                return(false);
            }
            if (GroupEscalationAgent.IsOofOrDsnMessage(argsImpl.MessageClass))
            {
                GroupEscalationAgent.Tracer.TraceDebug((long)this.GetHashCode(), "GroupEscalationAgent.ShouldProcessMessage: ignoring OOF or DSN messages.");
                return(false);
            }
            return(true);
        }
        public void OnPromotedMessageHandler(StoreDriverEventSource source, StoreDriverDeliveryEventArgs args)
        {
            if (args == null)
            {
                return;
            }
            StoreDriverDeliveryEventArgsImpl storeDriverDeliveryEventArgsImpl = (StoreDriverDeliveryEventArgsImpl)args;
            MailboxSession mailboxSession = storeDriverDeliveryEventArgsImpl.MailboxSession;
            string         messageClass   = storeDriverDeliveryEventArgsImpl.MessageClass;

            if (GroupEscalationAgent.ShouldBlockMessageForGroup(mailboxSession, messageClass))
            {
                storeDriverDeliveryEventArgsImpl.DeliverToFolder = mailboxSession.GetDefaultFolderId(DefaultFolderType.DeletedItems);
                GroupEscalationAgent.Tracer.TraceDebug <string>((long)this.GetHashCode(), "GroupEscalationAgent.OnPromotedMessageHandler: message is blocked. Its class is {0}", messageClass);
            }
        }
        public void OnCreatedMessageHandler(StoreDriverEventSource source, StoreDriverDeliveryEventArgs args)
        {
            StoreDriverDeliveryEventArgsImpl storeDriverDeliveryEventArgsImpl = (StoreDriverDeliveryEventArgsImpl)args;
            MessageItem          messageItem          = storeDriverDeliveryEventArgsImpl.MessageItem;
            MbxTransportMailItem mbxTransportMailItem = storeDriverDeliveryEventArgsImpl.MailItemDeliver.MbxTransportMailItem;

            if (messageItem == null || mbxTransportMailItem == null)
            {
                GroupEscalationAgent.Tracer.TraceError((long)this.GetHashCode(), "No message to process");
                return;
            }
            MailboxSession mailboxSession = messageItem.Session as MailboxSession;

            if (GroupEscalationAgent.ShouldGenerateIrmNdr(mailboxSession, messageItem, storeDriverDeliveryEventArgsImpl.MailboxOwner))
            {
                GroupEscalationAgent.Tracer.TraceDebug((long)this.GetHashCode(), "GroupEscalationAgent.ShouldProcessMessage: NDR the message since it's irm message sent to group");
                throw new SmtpResponseException(GroupEscalationAgent.IrmMessageDeliveryToGroupMailBoxError);
            }
            if (!this.ShouldProcessMessage(mailboxSession, storeDriverDeliveryEventArgsImpl))
            {
                return;
            }
            IGroupEscalationFlightInfo groupEscalationFlightInfo = new GroupEscalationFlightInfo(storeDriverDeliveryEventArgsImpl.MailboxOwner.GetContext(null));
            TransportGroupEscalation   transportGroupEscalation  = new TransportGroupEscalation(mbxTransportMailItem, XSOFactory.Default, groupEscalationFlightInfo, new MailboxUrls(mailboxSession.MailboxOwner, false));
            bool flag;

            if (transportGroupEscalation.EscalateItem(messageItem, mailboxSession, out flag, false))
            {
                GroupEscalationAgent.Tracer.TraceDebug <string>((long)this.GetHashCode(), "GroupEscalationAgent.EscalateItem: Escalation of message {0} from group mailbox successful", messageItem.InternetMessageId);
                this.processedMessages.AddMessageToProcessedList(messageItem.InternetMessageId, messageItem.SentTime, mailboxSession.MailboxGuid, DeliveryStage.CreatedMessageEventHandled);
                return;
            }
            GroupEscalationAgent.Tracer.TraceError <string, bool>((long)this.GetHashCode(), "GroupEscalationAgent.EscalateItem: Escalation of message {0} from group mailbox failed. IsTransientError: {1}", messageItem.InternetMessageId, flag);
            this.processedMessages.ClearMessageFromProcessedList(messageItem.InternetMessageId, messageItem.SentTime, mailboxSession.MailboxGuid);
            if (flag)
            {
                throw new SmtpResponseException(GroupEscalationAgent.EscalationFailedTransientError);
            }
            throw new SmtpResponseException(GroupEscalationAgent.EscalationFailedPermanentError);
        }
 private static bool ShouldBlockMessageForGroup(MailboxSession session, string messageClass)
 {
     return(session != null && session.IsGroupMailbox() && GroupEscalationAgent.IsOofOrDsnMessage(messageClass));
 }
 private static bool ShouldGenerateIrmNdr(MailboxSession session, MessageItem messageItem, MiniRecipient mailboxOwner)
 {
     return(session != null && session.IsGroupMailbox() && messageItem.IsRestricted && !GroupEscalationAgent.IsIrmEnabledGroup(mailboxOwner));
 }