private int DeliverMailItem(MbxTransportMailItem mailItem, ulong sessionId)
        {
            int result = 0;

            TraceHelper.MessageProbeActivityId = mailItem.SystemProbeId;
            TraceHelper.StoreDriverDeliveryTracer.TracePass <string>(TraceHelper.MessageProbeActivityId, 0L, "Delivery: Processing started for MessageId {0}.", mailItem.InternetMessageId ?? "NULL");
            TimeSpan?retryInterval;

            using (MailItemDeliver mailItemDeliver = new MailItemDeliver(mailItem, sessionId))
            {
                try
                {
                    StoreDriverDeliveryDiagnostics.HangDetector[sessionId] = mailItemDeliver;
                    mailItemDeliver.DeliverToRecipients();
                }
                finally
                {
                    StoreDriverDeliveryDiagnostics.HangDetector.Remove(sessionId);
                }
                result        = mailItemDeliver.DeliveredRecipients;
                retryInterval = mailItemDeliver.RetryInterval;
            }
            AckDetails ackDetails = new AckDetails(StoreDriverDelivery.localHostName);

            ackDetails.AddEventData("MailboxDatabaseName", mailItem.DatabaseName);
            mailItem.AckMailItem(AckStatus.Success, SmtpResponse.NoopOk, ackDetails, retryInterval, StoreDriverDelivery.GenerateSessionSourceContext(sessionId, mailItem.SessionStartTime));
            TraceHelper.StoreDriverDeliveryTracer.TracePass <string>(TraceHelper.MessageProbeActivityId, 0L, "Delivery: Processing complete for MessageID {0}.", mailItem.InternetMessageId ?? "NULL");
            return(result);
        }
        public static IDeliveryProcessor Create(MailItemDeliver mailItemDeliver)
        {
            if (DeliveryProcessorFactory.InstanceBuilder != null)
            {
                return(DeliveryProcessorFactory.InstanceBuilder());
            }
            bool value = mailItemDeliver.Recipient.ExtendedProperties.GetValue <bool>("Microsoft.Exchange.Transport.MailboxTransport.RetryOnDuplicateDelivery ", false);

            if (value)
            {
                return(new RetryAgentMessageSubmissionProcessor(mailItemDeliver));
            }
            return(new DeliveryProcessorBase(mailItemDeliver));
        }
        public bool DetectHang(TimeSpan limit, out ulong sessionID, out MailItemDeliver mailItemDeliver)
        {
            bool            hang                = false;
            ulong           hangSessionID       = 0UL;
            MailItemDeliver hangMailItemDeliver = null;
            ExDateTime      utcNow              = ExDateTime.UtcNow;

            this.map.ForEach((MailItemDeliver perEntryMailItemDeliver) => !hang, delegate(ulong perEntrySessionID, MailItemDeliver perEntryMailItemDeliver)
            {
                if (default(ExDateTime) != perEntryMailItemDeliver.RecipientStartTime && limit < utcNow - perEntryMailItemDeliver.RecipientStartTime)
                {
                    hang                = true;
                    hangSessionID       = perEntrySessionID;
                    hangMailItemDeliver = perEntryMailItemDeliver;
                }
            });
            sessionID       = hangSessionID;
            mailItemDeliver = hangMailItemDeliver;
            return(hang);
        }
 internal static void UpdateDeliveryExceptionStatisticRecords(MessageStatus messageStatus, int lastOccurrencesPerException, int callstacksPerBucket, MailItemDeliver mailItemDeliver)
 {
     StoreDriverDeliveryDiagnostics.DeliveryOccurrenceRecord deliveryOccurrenceRecord = new StoreDriverDeliveryDiagnostics.DeliveryOccurrenceRecord(DateTime.UtcNow, mailItemDeliver.MbxTransportMailItem.DatabaseName, StoreDriverDelivery.MailboxServerFqdn, mailItemDeliver.MbxTransportMailItem.InternetMessageId, mailItemDeliver.Recipient.Email, mailItemDeliver.RecipientStartTime, mailItemDeliver.SessionId, mailItemDeliver.MbxTransportMailItem.MimeSize, mailItemDeliver.MbxTransportMailItem.MailItemRecipientCount, mailItemDeliver.MbxTransportMailItem.MimeSender, mailItemDeliver.MbxTransportMailItem.RoutingTimeStamp, mailItemDeliver.Stage);
     if (lastOccurrencesPerException > 0)
     {
         string key = StoreDriverDeliveryDiagnostics.GenerateExceptionKey(messageStatus);
         lock (StoreDriverDeliveryDiagnostics.deliveryExceptionStatisticRecords)
         {
             StoreDriverDeliveryDiagnostics.ExceptionStatisticRecord <StoreDriverDeliveryDiagnostics.DeliveryOccurrenceRecord> value;
             if (!StoreDriverDeliveryDiagnostics.deliveryExceptionStatisticRecords.TryGetValue(key, out value))
             {
                 value = default(StoreDriverDeliveryDiagnostics.ExceptionStatisticRecord <StoreDriverDeliveryDiagnostics.DeliveryOccurrenceRecord>);
                 value.LastOccurrences = new Queue <StoreDriverDeliveryDiagnostics.DeliveryOccurrenceRecord>(lastOccurrencesPerException);
             }
             if (value.LastOccurrences.Count == lastOccurrencesPerException)
             {
                 value.LastOccurrences.Dequeue();
             }
             value.LastOccurrences.Enqueue(deliveryOccurrenceRecord);
             value.CountSinceServiceStart++;
             StoreDriverDeliveryDiagnostics.deliveryExceptionStatisticRecords[key] = value;
         }
     }
     StoreDriverDeliveryDiagnostics.UpdateDeliveryExceptionCallstackRecords(messageStatus, callstacksPerBucket, deliveryOccurrenceRecord);
 }
        XElement IDiagnosable.GetDiagnosticInfo(DiagnosableParameters parameters)
        {
            bool     flag     = parameters.Argument.IndexOf("exceptions", StringComparison.OrdinalIgnoreCase) != -1;
            bool     flag2    = parameters.Argument.IndexOf("callstacks", StringComparison.OrdinalIgnoreCase) != -1;
            bool     flag3    = parameters.Argument.IndexOf("verbose", StringComparison.OrdinalIgnoreCase) != -1;
            bool     flag4    = flag3 || parameters.Argument.IndexOf("basic", StringComparison.OrdinalIgnoreCase) != -1;
            bool     flag5    = parameters.Argument.IndexOf("currentThreads", StringComparison.OrdinalIgnoreCase) != -1;
            bool     flag6    = flag4 || parameters.Argument.IndexOf("config", StringComparison.OrdinalIgnoreCase) != -1;
            bool     flag7    = !flag6 || parameters.Argument.IndexOf("help", StringComparison.OrdinalIgnoreCase) != -1;
            XElement xelement = new XElement(((IDiagnosable)this).GetDiagnosticComponentName());

            if (flag7)
            {
                xelement.Add(new XElement("help", "Supported arguments: config, basic, verbose, exceptions, callstacks, currentThreads, help."));
            }
            if (flag4)
            {
                xelement.Add(new XElement("deliveringThreads", StoreDriverDeliveryDiagnostics.deliveringThreads));
                xelement.Add(DeliveryThrottling.Instance.DeliveryServerDiagnostics);
                xelement.Add(DeliveryThrottling.Instance.DeliveryDatabaseDiagnostics);
                xelement.Add(DeliveryThrottling.Instance.DeliveryRecipientDiagnostics);
            }
            if (flag5 && StoreDriverDeliveryDiagnostics.HangDetector != null)
            {
                xelement.Add(StoreDriverDeliveryDiagnostics.HangDetector.GetDiagnosticInfo());
            }
            if (flag3)
            {
                XElement xelement2 = new XElement("HealthHistory");
                foreach (DatabaseHealthBreadcrumb databaseHealthBreadcrumb in ((IEnumerable <DatabaseHealthBreadcrumb>)StoreDriverDeliveryDiagnostics.healthHistory))
                {
                    xelement2.Add(databaseHealthBreadcrumb.GetDiagnosticInfo());
                }
                xelement.Add(xelement2);
                xelement.Add(MailItemDeliver.GetDiagnosticInfo());
                string content;
                using (StringWriter stringWriter = new StringWriter(new StringBuilder(1024)))
                {
                    MemoryTraceBuilder memoryTraceBuilder = StoreDriverDeliveryDiagnostics.TroubleshootingContext.MemoryTraceBuilder;
                    if (memoryTraceBuilder == null)
                    {
                        stringWriter.Write("No traces were flushed from any thread yet, or in-memory tracing is disabled.");
                    }
                    else
                    {
                        memoryTraceBuilder.Dump(stringWriter, true, true);
                    }
                    content = stringWriter.ToString();
                }
                xelement.Add(new XElement("tracing", content));
            }
            if (flag)
            {
                StoreDriverDeliveryDiagnostics.DumpExceptionStatistics(xelement);
            }
            if (flag2)
            {
                StoreDriverDeliveryDiagnostics.DumpExceptionCallstacks(xelement);
            }
            return(xelement);
        }
 internal StoreDriverDeliveryEventArgsImpl(MailItemDeliver mailItemDeliver)
 {
     this.mailItemDeliver = mailItemDeliver;
 }
 public RetryAgentMessageSubmissionProcessor(MailItemDeliver mailItemDeliver) : base(mailItemDeliver)
 {
     this.useDeliveryProcessorBase = false;
 }
 public MessageContext(Folder folder, MessageItem message, StoreSession session, ProxyAddress recipientAddress, ADRecipientCache <TransportMiniRecipient> recipientCache, long mimeSize, MailItemDeliver mailItemDeliver) : base(folder, message, session, recipientAddress, recipientCache, mimeSize, mailItemDeliver)
 {
 }
Exemple #9
0
        protected RuleEvaluationContext(Folder folder, MessageItem message, StoreSession session, ProxyAddress recipient, ADRecipientCache <TransportMiniRecipient> recipientCache, long mimeSize, MailItemDeliver mailItemDeliver) : base(folder, message, session, recipient, recipientCache, mimeSize, Microsoft.Exchange.Transport.MailboxRules.RuleConfig.Instance, ExTraceGlobals.MailboxRuleTracer)
        {
            MailboxSession mailboxSession = session as MailboxSession;

            this.initialFolder   = folder;
            this.mailItemDeliver = mailItemDeliver;
            if (mailboxSession != null)
            {
                object obj = mailboxSession.Mailbox.TryGetProperty(MailboxSchema.MailboxOofState);
                if (obj is PropertyError)
                {
                    this.IsOof = mailboxSession.IsMailboxOof();
                }
                else
                {
                    this.IsOof = (bool)obj;
                }
            }
            base.LimitChecker = new StoreDriverLimitChecker(this);
        }
Exemple #10
0
 public static RuleEvaluationContext Create(StoreDriverServer server, Folder folder, MessageItem message, StoreSession session, string recipientAddress, ADRecipientCache <TransportMiniRecipient> recipientCache, long mimeSize, bool processingTestMessage, bool shouldExecuteDisabledAndInErrorRules, MailItemDeliver mailItemDeliver)
 {
     return(new MessageContext(folder, message, session, new SmtpProxyAddress(recipientAddress, true), recipientCache, mimeSize, mailItemDeliver)
     {
         server = server,
         traceFormatter = new TraceFormatter(processingTestMessage),
         ShouldExecuteDisabledAndInErrorRules = shouldExecuteDisabledAndInErrorRules
     });
 }
 public DeliveryProcessorBase(MailItemDeliver mailItemDeliver)
 {
     this.mailItemDeliver = mailItemDeliver;
 }
        internal static AccessCheckResult CheckAccessForEmailDelivery(MailItemDeliver mailItemDeliver, Folder mailPublicFolder)
        {
            if (mailItemDeliver == null)
            {
                throw new ArgumentNullException("MailItemDeliver");
            }
            if (mailPublicFolder == null)
            {
                throw new ArgumentNullException("MailPublicFolder");
            }
            if (mailItemDeliver.ReplayItem == null)
            {
                MailPublicFolderPermissionHandler.Diag.TraceError(0L, "ReplayItem for the message appears to be null.");
                return(AccessCheckResult.NotAllowedInternalSystemError);
            }
            if (mailItemDeliver.ReplayItem.From == null)
            {
                MailPublicFolderPermissionHandler.Diag.TraceError(0L, "From attribute of the ReplayItem for the given message appears to be null.");
                return(AccessCheckResult.NotAllowedInternalSystemError);
            }
            AccessCheckResult     accessCheckResult = AccessCheckResult.NotAllowedAuthenticated;
            ClientSecurityContext context           = null;
            bool isAnonymous = false;
            ADRecipientCache <TransportMiniRecipient> recipientCache = mailItemDeliver.MbxTransportMailItem.ADRecipientCache;
            IRecipientSession recipientSession = (recipientCache != null) ? recipientCache.ADSession : null;

            if (recipientSession != null)
            {
                recipientSession = DirectorySessionFactory.Default.GetTenantOrRootOrgRecipientSession(ConsistencyMode.IgnoreInvalid, ADSessionSettings.FromOrganizationIdWithoutRbacScopesServiceOnly(recipientSession.SessionSettings.CurrentOrganizationId), 146, "CheckAccessForEmailDelivery", "f:\\15.00.1497\\sources\\dev\\MailboxTransport\\src\\MailboxTransportDelivery\\StoreDriver\\MailPublicFolderPermissionHandler.cs");
                try
                {
                    GrayException.MapAndReportGrayExceptions(delegate()
                    {
                        Participant from = mailItemDeliver.ReplayItem.From;
                        if (from.RoutingType != "EX")
                        {
                            MailPublicFolderPermissionHandler.Diag.TraceDebug(0L, "Determined the sent user as an anonymous entity");
                            isAnonymous = true;
                            context     = MailPublicFolderPermissionHandler.GetAnonymousClientSecurityContext();
                            MailPublicFolderPermissionHandler.Diag.TraceDebug(0L, "Constructed clientSecurityContext for anonymous user");
                        }
                        else
                        {
                            MailPublicFolderPermissionHandler.Diag.TraceDebug(0L, "Determined the sent user as an authorized entity");
                            byte[] valueOrDefault = from.GetValueOrDefault <byte[]>(ParticipantSchema.ParticipantSID);
                            SecurityIdentifier securityIdentifier = (valueOrDefault == null) ? null : new SecurityIdentifier(valueOrDefault, 0);
                            TransportMiniRecipient data           = recipientCache.FindAndCacheRecipient(ProxyAddress.Parse(mailItemDeliver.MbxTransportMailItem.From.ToString())).Data;
                            if (securityIdentifier == null)
                            {
                                context = MailPublicFolderPermissionHandler.GetUserClientSecurityContext(MailPublicFolderPermissionHandler.EveryoneSID, null);
                            }
                            else if (data == null)
                            {
                                context = MailPublicFolderPermissionHandler.GetUserClientSecurityContext(securityIdentifier, null);
                            }
                            else
                            {
                                context = MailPublicFolderPermissionHandler.GetUserClientSecurityContext(securityIdentifier, recipientSession.GetTokenSids((ADObjectId)data[ADObjectSchema.Id], AssignmentMethod.S4U));
                            }
                            MailPublicFolderPermissionHandler.Diag.TraceDebug(0L, "Constructed clientSecurityContext for user {0}.", new object[]
                            {
                                (data != null) ? data[ADRecipientSchema.PrimarySmtpAddress] : context.UserSid
                            });
                        }
                        if (MailPublicFolderPermissionHandler.CanPostItemsToPublicFolder(mailPublicFolder, context))
                        {
                            accessCheckResult = AccessCheckResult.Allowed;
                            return;
                        }
                        if (isAnonymous)
                        {
                            accessCheckResult = AccessCheckResult.NotAllowedAnonymous;
                        }
                    });
                }
                catch (GrayException ex)
                {
                    string arg = string.Empty;
                    if (ex.InnerException != null)
                    {
                        arg = ex.InnerException.Message;
                    }
                    accessCheckResult = AccessCheckResult.NotAllowedInternalSystemError;
                    MailPublicFolderPermissionHandler.Diag.TraceError <ClientSecurityContext, string>(0L, "Access check failed on ClientSecurityContext {0} with {1}.", context, arg);
                }
                finally
                {
                    if (context != null)
                    {
                        context.Dispose();
                        context = null;
                    }
                }
            }
            return(accessCheckResult);
        }
 public DeliveryItem(MailItemDeliver context)
 {
     this.context = context;
 }