protected override void InternalProcessRecord() { bool flag; if ("Exchange Control Panel".Equals(base.Host.Name, StringComparison.OrdinalIgnoreCase)) { flag = ServerCache.Instance.InitializeIfNeeded(HostId.ECPApplicationPool); } else { flag = ServerCache.Instance.InitializeIfNeeded(HostId.PowershellApplicationPool); } if (!flag) { Utils.HandleError(this, "Cannot initialize AD configuration", CoreStrings.TrackingErrorFailedToInitialize, this.BypassDelegateChecking, false, ErrorCategory.ObjectNotFound, null); } DirectoryContext directoryContext = null; int num = 0; MessageTrackingReport messageTrackingReport = null; TrackingEventBudget trackingEventBudget = null; try { TrackingEventBudget.AcquireThread(); if (this.TraceLevel == TraceLevel.High) { CommonDiagnosticsLogTracer traceWriter = new CommonDiagnosticsLogTracer(); TraceWrapper.SearchLibraryTracer.Register(traceWriter); BaseTrace.CurrentThreadSettings.EnableTracing(); } if (base.ExchangeRunspaceConfig == null) { ExTraceGlobals.TaskTracer.TraceError((long)this.GetHashCode(), "Get-MessageTrackingReport permissions cannot be retrieved because the ExchangeRunspaceConfiguration is null"); base.WriteError(new TrackingSearchException(CoreStrings.TrackingSearchNotAuthorized), ErrorCategory.InvalidOperation, this.Identity); } ReportConstraints reportConstraints = new ReportConstraints(); SmtpAddress[] recipientPathFilter = null; if (base.Fields.Contains("RecipientPathFilter")) { recipientPathFilter = new SmtpAddress[] { this.RecipientPathFilter }; } reportConstraints.BypassDelegateChecking = this.BypassDelegateChecking; reportConstraints.DetailLevel = this.DetailLevel; reportConstraints.DoNotResolve = this.DoNotResolve; reportConstraints.RecipientPathFilter = recipientPathFilter; reportConstraints.Recipients = this.Recipients; reportConstraints.ReportTemplate = this.ReportTemplate; reportConstraints.ResultSize = this.ResultSize; reportConstraints.TrackingAsSender = this.Identity.IsSender; reportConstraints.Sender = SmtpAddress.Empty; ReportConstraints reportConstraints2 = reportConstraints; _DeliveryStatus? deliveryStatus = this.status; int?num2 = (deliveryStatus != null) ? new int?((int)deliveryStatus.GetValueOrDefault()) : null; reportConstraints2.Status = ((num2 != null) ? new DeliveryStatus?((DeliveryStatus)num2.GetValueOrDefault()) : null); reportConstraints.ReturnQueueEvents = this.ShouldReturnQueueEvents(); if (this.Identity.IsSender) { ADRecipient adrecipient = base.TenantGlobalCatalogSession.FindByExchangeGuid(this.Identity.UserGuid); if (adrecipient != null) { reportConstraints.Sender = adrecipient.PrimarySmtpAddress; } } MultiValuedProperty <CultureInfo> executingUserLanguages = base.ExchangeRunspaceConfig.ExecutingUserLanguages; CultureInfo clientCulture = (executingUserLanguages != null && executingUserLanguages.Count > 0) ? executingUserLanguages[0] : CultureInfo.InvariantCulture; ClientContext clientContext = null; ClientSecurityContext clientSecurityContext = null; bool flag2 = false; try { clientSecurityContext = Utils.GetSecurityContextForUser(base.ExchangeRunspaceConfig.SecurityAccessToken, base.ExchangeRunspaceConfig.DelegatedPrincipal, this.trackedUser.ADUser); clientContext = ClientContext.Create(clientSecurityContext, base.CurrentOrganizationId, null, null, clientCulture, null); OrganizationId currentOrganizationId = base.TenantGlobalCatalogSession.SessionSettings.CurrentOrganizationId; TrackingErrorCollection errors = new TrackingErrorCollection(); TimeSpan timeout = Utils.GetTimeout(this.BypassDelegateChecking); trackingEventBudget = new TrackingEventBudget(errors, timeout); directoryContext = new DirectoryContext(clientContext, currentOrganizationId, base.GlobalConfigSession, this.ConfigurationSession, base.TenantGlobalCatalogSession, trackingEventBudget, SearchMessageTrackingReport.GetDiagnosticsLevel(this.TraceLevel, base.Fields.IsModified("TraceLevel")), errors, false); directoryContext.Acquire(); flag2 = true; directoryContext.DiagnosticsContext.AddProperty(DiagnosticProperty.Task, Names <DeliveryReportsTask> .Map[1]); directoryContext.DiagnosticsContext.AddProperty(DiagnosticProperty.OpType, Names <OpType> .Map[0]); directoryContext.DiagnosticsContext.AddProperty(DiagnosticProperty.Mid, this.Identity.ToString()); directoryContext.DiagnosticsContext.AddProperty(DiagnosticProperty.Data1, Names <ReportTemplate> .Map[(int)this.ReportTemplate]); directoryContext.DiagnosticsContext.AddProperty(DiagnosticProperty.Usr, this.trackedUser.SmtpAddress.ToString()); if (this.BypassDelegateChecking) { ADObjectId adobjectId; if (base.TryGetExecutingUserId(out adobjectId)) { directoryContext.DiagnosticsContext.AddProperty(DiagnosticProperty.ExUser, adobjectId.Name); } else { ExTraceGlobals.TaskTracer.TraceDebug((long)this.GetHashCode(), "ExecutingUserId is null."); } } directoryContext.DiagnosticsContext.WriteEvent(); LogCache logCache = new LogCache(DateTime.MinValue, DateTime.MaxValue, directoryContext.TrackingBudget); this.getMessageTrackingReport = new GetMessageTrackingReportImpl(directoryContext, SearchScope.World, this.Identity.InternalMessageTrackingReportId, logCache, reportConstraints); MessageTrackingReport messageTrackingReport2 = this.getMessageTrackingReport.Execute(); MultiValuedProperty <CultureInfo> userLanguages; if (this.executingUser != null) { userLanguages = (this.executingUser[ADUserSchema.Languages] as MultiValuedProperty <CultureInfo>); } else { userLanguages = new MultiValuedProperty <CultureInfo>(Thread.CurrentThread.CurrentUICulture); } bool flag3 = false; if (messageTrackingReport2 == null) { base.WriteError(new TrackingExceptionNoResultsDueToLogsExpired(), ErrorCategory.ObjectNotFound, this.Identity); } else { if (messageTrackingReport2.HasHandedOffPaths && !this.Identity.IsSender) { flag3 = true; bool flag4 = this.TryGetReportForRecipientOrganization(directoryContext, logCache, reportConstraints, userLanguages, out messageTrackingReport2); if (flag4 && messageTrackingReport2 == null) { base.WriteError(new TrackingExceptionNoResultsDueToUntrackableMessagePath(), ErrorCategory.ObjectNotFound, this.Identity); } else if (!flag4) { base.WriteError(new TrackingExceptionNoResultsDueToLogsNotFound(), ErrorCategory.ObjectNotFound, this.Identity); } } messageTrackingReport = MessageTrackingReport.Create(this.ConfigurationSession, base.TenantGlobalCatalogSession, userLanguages, this.ReportTemplate == ReportTemplate.Summary, this.DetailLevel == MessageTrackingDetailLevel.Verbose, this.Identity.IsSender, messageTrackingReport2, this.DoNotResolve, this.getMessageTrackingReport.Errors.Errors.Count == 0); if (messageTrackingReport == null) { ExTraceGlobals.TaskTracer.TraceDebug <int>((long)this.GetHashCode(), "Report is null while internalReport is not null and has {0} events", (messageTrackingReport2.RecipientTrackingEvents == null) ? 0 : messageTrackingReport2.RecipientTrackingEvents.Length); base.WriteError(new TrackingExceptionNoResultsDueToLogsNotFound(), ErrorCategory.ObjectNotFound, this.Identity); } else { num = ((messageTrackingReport.RecipientTrackingEvents == null) ? 0 : messageTrackingReport.RecipientTrackingEvents.Length); messageTrackingReport = this.FilterReport(messageTrackingReport); if (messageTrackingReport == null && !flag3 && !this.Identity.IsSender) { bool flag5 = this.TryGetReportForRecipientOrganization(directoryContext, logCache, reportConstraints, executingUserLanguages, out messageTrackingReport2); if (!flag5) { base.WriteError(new TrackingExceptionNoResultsDueToLogsNotFound(), ErrorCategory.ObjectNotFound, this.Identity); } else if (flag5 && messageTrackingReport2 == null) { base.WriteError(new TrackingExceptionNoResultsDueToUntrackableMessagePath(), ErrorCategory.ObjectNotFound, this.Identity); } else { messageTrackingReport = MessageTrackingReport.Create(this.ConfigurationSession, base.TenantGlobalCatalogSession, userLanguages, this.ReportTemplate == ReportTemplate.Summary, this.DetailLevel == MessageTrackingDetailLevel.Verbose, this.Identity.IsSender, messageTrackingReport2, this.DoNotResolve, this.getMessageTrackingReport.Errors.Errors.Count == 0); messageTrackingReport = this.FilterReport(messageTrackingReport); if (messageTrackingReport == null) { base.WriteError(new TrackingExceptionNoResultsDueToUntrackableMessagePath(), ErrorCategory.ObjectNotFound, this.Identity); } } } if (messageTrackingReport != null) { if (base.NeedSuppressingPiiData) { Utils.RedactRecipientTrackingEvents(messageTrackingReport.RecipientTrackingEvents, this); } this.WriteResult(messageTrackingReport); } } } } catch (AuthzException) { base.WriteError(new TrackingSearchException(CoreStrings.TrackingSearchNotAuthorized), ErrorCategory.InvalidOperation, this.Identity); } finally { if (directoryContext != null && flag2) { directoryContext.Yield(); } if (clientContext != null) { clientContext.Dispose(); } if (clientSecurityContext != null) { clientSecurityContext.Dispose(); } } } catch (TrackingTransientException ex) { Utils.HandleTrackingException(directoryContext, ex, this, false, this.BypassDelegateChecking); } catch (TrackingFatalException ex2) { Utils.HandleTrackingException(directoryContext, ex2, this, false, this.BypassDelegateChecking); } catch (DataSourceOperationException ex3) { Utils.HandleError(this, ex3.ToString(), ex3.LocalizedString, this.BypassDelegateChecking, false, ErrorCategory.InvalidData, null); } catch (DataValidationException ex4) { Utils.HandleError(this, ex4.ToString(), ex4.LocalizedString, this.BypassDelegateChecking, false, ErrorCategory.InvalidData, null); } catch (TransientException ex5) { Utils.HandleError(this, ex5.ToString(), ex5.LocalizedString, this.BypassDelegateChecking, true, ErrorCategory.InvalidData, null); } finally { if ((this.BypassDelegateChecking || this.ReportTemplate == ReportTemplate.RecipientPath || messageTrackingReport == null || messageTrackingReport.RecipientTrackingEvents == null || messageTrackingReport.RecipientTrackingEvents.Length == 0) && this.getMessageTrackingReport != null) { Utils.WriteWarnings(this, directoryContext, this.BypassDelegateChecking, this.getMessageTrackingReport.Errors.Errors); } if (trackingEventBudget != null) { trackingEventBudget.Dispose(); } if (directoryContext != null) { directoryContext.DiagnosticsContext.AddProperty(DiagnosticProperty.Task, Names <DeliveryReportsTask> .Map[1]); directoryContext.DiagnosticsContext.AddProperty(DiagnosticProperty.OpType, Names <OpType> .Map[1]); directoryContext.DiagnosticsContext.AddProperty(DiagnosticProperty.Cnt, num); directoryContext.DiagnosticsContext.WriteEvent(); Utils.WriteDiagnostics(this, directoryContext.DiagnosticsContext, base.NeedSuppressingPiiData); } if (this.TraceLevel == TraceLevel.High) { TraceWrapper.SearchLibraryTracer.Unregister(); BaseTrace.CurrentThreadSettings.DisableTracing(); } TrackingEventBudget.ReleaseThread(); if (directoryContext == null || Utils.AreAnyErrorsLocalToThisForest(directoryContext.Errors.Errors)) { PerfCounterData.ResultCounter.AddFailure(); } else { PerfCounterData.ResultCounter.AddSuccess(); } if (ServerCache.Instance.HostId == HostId.ECPApplicationPool) { InfoWorkerMessageTrackingPerformanceCounters.MessageTrackingFailureRateTask.RawValue = (long)PerfCounterData.ResultCounter.FailurePercentage; } } }
protected override void InternalProcessRecord() { bool flag; if ("Exchange Control Panel".Equals(base.Host.Name, StringComparison.OrdinalIgnoreCase)) { flag = ServerCache.Instance.InitializeIfNeeded(HostId.ECPApplicationPool); } else { flag = ServerCache.Instance.InitializeIfNeeded(HostId.PowershellApplicationPool); } if (!flag) { Utils.HandleError(this, "Cannot initialize AD configuration", CoreStrings.TrackingErrorFailedToInitialize, this.BypassDelegateChecking, false, ErrorCategory.ObjectNotFound, null); } DirectoryContext directoryContext = null; int num = 0; TrackingEventBudget trackingEventBudget = null; bool flag2 = false; ClientContext clientContext = null; ClientSecurityContext clientSecurityContext = null; try { TrackingEventBudget.AcquireThread(); if (this.TraceLevel == TraceLevel.High) { CommonDiagnosticsLogTracer traceWriter = new CommonDiagnosticsLogTracer(); TraceWrapper.SearchLibraryTracer.Register(traceWriter); BaseTrace.CurrentThreadSettings.EnableTracing(); } if (base.ExchangeRunspaceConfig == null) { ExTraceGlobals.TaskTracer.TraceError((long)this.GetHashCode(), "Search-MessageTrackingReport permissions cannot be retrieved because the ExchangeRunspaceConfiguration is null"); this.HandleError("Search-MessageTrackingReport permissions cannot be retrieved because the ExchangeRunspaceConfiguration is null", CoreStrings.TrackingSearchNotAuthorized); } MultiValuedProperty <CultureInfo> executingUserLanguages = base.ExchangeRunspaceConfig.ExecutingUserLanguages; CultureInfo clientCulture = (executingUserLanguages != null && executingUserLanguages.Count > 0) ? executingUserLanguages[0] : CultureInfo.InvariantCulture; try { clientSecurityContext = Utils.GetSecurityContextForUser(base.ExchangeRunspaceConfig.SecurityAccessToken, base.ExchangeRunspaceConfig.DelegatedPrincipal, this.trackedMailbox.ADUser); clientContext = ClientContext.Create(clientSecurityContext, base.CurrentOrganizationId, null, null, clientCulture, null); OrganizationId currentOrganizationId = base.TenantGlobalCatalogSession.SessionSettings.CurrentOrganizationId; TrackingErrorCollection errors = new TrackingErrorCollection(); TimeSpan timeout = Utils.GetTimeout(this.BypassDelegateChecking); trackingEventBudget = new TrackingEventBudget(errors, timeout); directoryContext = new DirectoryContext(clientContext, base.TenantGlobalCatalogSession.SessionSettings.CurrentOrganizationId, base.GlobalConfigSession, this.ConfigurationSession, base.TenantGlobalCatalogSession, trackingEventBudget, SearchMessageTrackingReport.GetDiagnosticsLevel(this.TraceLevel, base.Fields.IsModified("TraceLevel")), errors, false); directoryContext.Acquire(); flag2 = true; directoryContext.DiagnosticsContext.AddProperty(DiagnosticProperty.Task, Names <DeliveryReportsTask> .Map[0]); directoryContext.DiagnosticsContext.AddProperty(DiagnosticProperty.OpType, Names <OpType> .Map[0]); directoryContext.DiagnosticsContext.AddProperty(DiagnosticProperty.Usr, this.trackedMailbox.SmtpAddress.ToString()); string value = Names <DeliveryReportsSource> .Map[this.IsOwaJumpOffPointRequest ? 0 : 1]; directoryContext.DiagnosticsContext.AddProperty(DiagnosticProperty.Src, value); if (this.BypassDelegateChecking) { ADObjectId adobjectId; if (base.TryGetExecutingUserId(out adobjectId)) { directoryContext.DiagnosticsContext.AddProperty(DiagnosticProperty.ExUser, adobjectId.Name); } else { ExTraceGlobals.TaskTracer.TraceDebug((long)this.GetHashCode(), "ExecutingUserId is null."); } } if (this.Sender != null) { directoryContext.DiagnosticsContext.AddProperty(DiagnosticProperty.Sender, this.Sender.ToString()); } if (this.MessageId != null) { directoryContext.DiagnosticsContext.AddProperty(DiagnosticProperty.Mid, this.MessageId.ToString()); } directoryContext.DiagnosticsContext.WriteEvent(); this.searchMessageTracking = new SearchMessageTrackingReportImpl(directoryContext, SearchScope.World, this.trackedMailbox, this.trackedSender, null, this.trackedRecipients, null, this.Subject, this.MessageId, this.ResultSize, false, false, true, false); this.searchMessageTracking.Execute(); } catch (AuthzException ex) { this.HandleError("AutzException occurred:" + ex.Message, CoreStrings.TrackingSearchNotAuthorized); } List <MessageTrackingSearchResult> list = this.searchMessageTracking.RunAuthorizationFilter(this.IsOwaJumpOffPointRequest, this.clientSubmitTime, this.storeItemSubject); if (list != null) { list = this.searchMessageTracking.FilterResultsBySubjectAndRecipients(list, executingUserLanguages); } num = (int)Math.Min(this.ResultSize.Value, 4096U); num = Math.Min(num, (list == null) ? 0 : list.Count); List <MessageTrackingSearchResult> list2 = new List <MessageTrackingSearchResult>(num); for (int i = 0; i < num; i++) { MessageTrackingSearchResult internalMessageTrackingSearchResult = list[i]; MessageTrackingSearchResult messageTrackingSearchResult = new MessageTrackingSearchResult(internalMessageTrackingSearchResult); if (!this.TrackingAsSender) { messageTrackingSearchResult.RecipientAddresses = new SmtpAddress[] { this.trackedMailbox.SmtpAddress }; messageTrackingSearchResult.RecipientDisplayNames = new string[] { this.trackedMailbox.DisplayName }; } list2.Add(messageTrackingSearchResult); } if (list2.Count == 0 && this.IsOwaJumpOffPointRequest) { if (this.searchMessageTracking.Errors.Errors.Count == 0) { this.HandleZeroResultsFromJumpOffPoint(); } } else { MessageTrackingSearchResult.FillDisplayNames(list2, base.TenantGlobalCatalogSession); directoryContext.DiagnosticsContext.AddProperty(DiagnosticProperty.Op, Names <Operations> .Map[7]); directoryContext.DiagnosticsContext.AddProperty(DiagnosticProperty.OpType, Names <OpType> .Map[0]); directoryContext.DiagnosticsContext.WriteEvent(); foreach (MessageTrackingSearchResult messageTrackingSearchResult2 in list2) { directoryContext.DiagnosticsContext.AddProperty(DiagnosticProperty.Time, messageTrackingSearchResult2.SubmittedDateTime); directoryContext.DiagnosticsContext.AddProperty(DiagnosticProperty.Mid, messageTrackingSearchResult2.MessageTrackingReportId.ToString()); directoryContext.DiagnosticsContext.WriteEvent(); this.WriteResult(messageTrackingSearchResult2); } directoryContext.DiagnosticsContext.AddProperty(DiagnosticProperty.Op, Names <Operations> .Map[7]); directoryContext.DiagnosticsContext.AddProperty(DiagnosticProperty.OpType, Names <OpType> .Map[1]); directoryContext.DiagnosticsContext.WriteEvent(); } } catch (TrackingTransientException ex2) { Utils.HandleTrackingException(directoryContext, ex2, this, !this.IsOwaJumpOffPointRequest, this.BypassDelegateChecking); } catch (TrackingFatalException ex3) { Utils.HandleTrackingException(directoryContext, ex3, this, !this.IsOwaJumpOffPointRequest, this.BypassDelegateChecking); } catch (DataSourceOperationException ex4) { Utils.HandleError(this, ex4.ToString(), ex4.LocalizedString, this.BypassDelegateChecking, false, ErrorCategory.InvalidData, null); } catch (DataValidationException ex5) { Utils.HandleError(this, ex5.ToString(), ex5.LocalizedString, this.BypassDelegateChecking, false, ErrorCategory.InvalidData, null); } catch (TransientException ex6) { Utils.HandleError(this, ex6.ToString(), ex6.LocalizedString, this.BypassDelegateChecking, true, ErrorCategory.InvalidData, null); } finally { if (directoryContext != null) { Utils.WriteWarnings(this, directoryContext, this.BypassDelegateChecking, directoryContext.Errors.Errors); } if (trackingEventBudget != null) { trackingEventBudget.Dispose(); } if (directoryContext != null) { directoryContext.DiagnosticsContext.AddProperty(DiagnosticProperty.Task, Names <DeliveryReportsTask> .Map[0]); directoryContext.DiagnosticsContext.AddProperty(DiagnosticProperty.OpType, Names <OpType> .Map[1]); directoryContext.DiagnosticsContext.AddProperty(DiagnosticProperty.Cnt, num); directoryContext.DiagnosticsContext.WriteEvent(); Utils.WriteDiagnostics(this, directoryContext.DiagnosticsContext, base.NeedSuppressingPiiData); if (flag2) { directoryContext.Yield(); } } if (this.TraceLevel == TraceLevel.High) { TraceWrapper.SearchLibraryTracer.Unregister(); BaseTrace.CurrentThreadSettings.DisableTracing(); } TrackingEventBudget.ReleaseThread(); if (directoryContext == null || Utils.AreAnyErrorsLocalToThisForest(directoryContext.Errors.Errors)) { PerfCounterData.ResultCounter.AddFailure(); } else if (!this.IsOwaJumpOffPointRequest) { PerfCounterData.ResultCounter.AddSuccess(); } if (ServerCache.Instance.HostId == HostId.ECPApplicationPool) { InfoWorkerMessageTrackingPerformanceCounters.MessageTrackingFailureRateTask.RawValue = (long)PerfCounterData.ResultCounter.FailurePercentage; } if (clientContext != null) { clientContext.Dispose(); } if (clientSecurityContext != null) { clientSecurityContext.Dispose(); } } }
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); }