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) { }
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 }); }
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); }
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); }