// Token: 0x060007AD RID: 1965 RVA: 0x00036BD8 File Offset: 0x00034DD8 internal void DeleteMessage(StoreSession itemStore, StoreObject item) { bool flag = false; string arg = null; if (item is MeetingForwardNotification) { flag = true; arg = ((MeetingMessage)item).Subject; } AggregateOperationResult aggregateOperationResult = itemStore.Delete(DeleteItemFlags.MoveToDeletedItems, new StoreId[] { item.Id }); if (aggregateOperationResult.OperationResult == OperationResult.Succeeded) { CalendarAssistantPerformanceCounters.MeetingMessagesDeleted.Increment(); if (flag) { string info = string.Format("MFN with subject {0} was moved to deleted items.", arg); MfnLog.LogEntry((MailboxSession)itemStore, info); return; } } else if (flag) { string info = string.Format("MFN with subject {0} failed to be moved to deleted items. Error = {1}", arg, aggregateOperationResult); MfnLog.LogEntry((MailboxSession)itemStore, info); } }
internal void CheckAndSubmitMfn(TransportMailItem originalMailItem) { if (!this.ShouldGenerateMfn()) { return; } using (MeetingRequest meetingRequest = MeetingRequest.Bind(this.item.Session, this.item.Item.Id)) { using (MeetingForwardNotification meetingForwardNotification = meetingRequest.CreateNotification()) { TransportMailItem transportMailItem = TransportMailItem.NewSideEffectMailItem(originalMailItem, this.submitter.OrganizationId, LatencyComponent.Agent, MailDirectionality.Originating, this.submitter.ExternalOrganizationId); transportMailItem.From = RoutingAddress.NullReversePath; if (this.TryCreateMfnSubjectAndBody(meetingForwardNotification)) { Stream stream = transportMailItem.OpenMimeWriteStream(); stream.Close(); this.CopyMfnRecipientsTo(meetingForwardNotification, transportMailItem); this.CopyMfnContentTo(meetingForwardNotification, transportMailItem); MailboxSession mailboxSession = this.item.Item.Session as MailboxSession; Participant participant = Participant.TryConvertTo(this.item.Sender, "SMTP", mailboxSession); if (participant == null) { participant = this.item.Sender; } if (mailboxSession != null) { MfnLog.LogEntry(mailboxSession, string.Format("Decorating MFN with the address - Name {0}, EmailAddress : {1}, RoutingType : {2}", participant.DisplayName, participant.EmailAddress, participant.RoutingType)); } Components.DsnGenerator.DecorateMfn(transportMailItem, participant.DisplayName, participant.EmailAddress); this.item.DecorateMessage(transportMailItem); this.item.ApplySecurityAttributesTo(transportMailItem); ClassificationUtils.PromoteStoreClassifications(transportMailItem.RootPart.Headers); this.submitter.StoreDriverSubmission.ThrowIfStopped(); transportMailItem.UpdateCachedHeaders(); this.submitter.SendMailItem(new SubmissionReadOnlyMailItem(transportMailItem, MailItemType.OtherMessage), null); } } } }
private bool ShouldGenerateMfn() { MessageItem messageItem = this.item.Item; MailboxSession mailboxSession = messageItem.Session as MailboxSession; if (mailboxSession == null) { TraceHelper.MeetingForwardNotificationTracer.TracePass(TraceHelper.MessageProbeActivityId, 0L, "Skipping MFN generation as the session is not a mailboxsession."); return(false); } if (!ObjectClass.IsMeetingRequest(messageItem.ClassName) && !ObjectClass.IsMeetingRequestSeries(messageItem.ClassName)) { TraceHelper.MeetingForwardNotificationTracer.TracePass <string>(TraceHelper.MessageProbeActivityId, 0L, "Not a meeting request {0} - skipping MFN generation.", messageItem.ClassName); return(false); } string text = null; bool result; try { string text2 = MfnSubmitter.SafeGetProperty <string>(messageItem, MessageItemSchema.ReceivedRepresentingEmailAddress, string.Empty); if (!string.IsNullOrEmpty(text2)) { text = string.Format("Skipping MFN generation as the update/forward was made by a delegate {0}. From: {1}, Sender {2}, Subject: {3}", new object[] { text2, messageItem.From, messageItem.Sender, messageItem.Subject ?? "<No subject found>" }); result = false; } else { int num = MfnSubmitter.SafeGetProperty <int>(messageItem, MeetingMessageSchema.AppointmentAuxiliaryFlags, 0); if ((num & 32) != 0) { text = string.Format("Skipping MFN generation for RUMs. From: {0}, Sender {1} , Subject: {2}", messageItem.From, messageItem.Sender, messageItem.Subject ?? "<No subject found>"); result = false; } else if (messageItem.IsResponseRequested && (num & 256) != 0) { text = string.Format("Skipping MFN generation for events added from group calendar. From: {0}, Sender {1} , Subject: {2}", messageItem.From, messageItem.Sender, messageItem.Subject ?? "<No subject found>"); result = false; } else { if ((num & 4) == 0) { if (mailboxSession.IsGroupMailbox()) { TraceHelper.MeetingForwardNotificationTracer.TracePass(TraceHelper.MessageProbeActivityId, 0L, "Skipping MFN generation as the meeting was created/updated on the group calendar. From: {0}, Sender {1}, Auxilliary Flags {2}, Subject {3}", new object[] { messageItem.From, messageItem.Sender, num, messageItem.Subject ?? "<No subject found>" }); return(false); } if (Participant.HasSameEmail(messageItem.From, messageItem.Sender, mailboxSession, true)) { TraceHelper.MeetingForwardNotificationTracer.TracePass(TraceHelper.MessageProbeActivityId, 0L, "Skipping MFN generation as the update was made by the organizer. From: {0}, Sender {1}, Auxilliary Flags {2}, Subject {3}", new object[] { messageItem.From, messageItem.Sender, num, messageItem.Subject ?? "<No subject found>" }); return(false); } bool?flag = this.IsDelegateOfOrganizer(); if (flag != null && flag.Value) { text = string.Format("Skipping MFN generation as the update was made by a delegate. From: {0}, Sender {1}. Auxilliary Flags {2}, Subject {3}", new object[] { messageItem.From, messageItem.Sender, num, messageItem.Subject ?? "<No subject found>" }); return(false); } } if (MeetingMessage.IsFromExternalParticipant(messageItem.From.RoutingType)) { text = string.Format("Skipping MFN generation as the organizer is external. From: {0}, RoutingType {1}, Sender {2}, Auxilliary Flags {3} Subject : {4}", new object[] { messageItem.From, messageItem.From.RoutingType, messageItem.Sender, num, messageItem.Subject ?? "<No subject found>" }); result = false; } else { text = string.Format("Generating MFN as the meeting was forwarded. From: {0}, RoutingType {1}, Sender {2}, Auxilliary Flags {3}, Subject {4}", new object[] { messageItem.From, messageItem.From.RoutingType, messageItem.Sender, num, messageItem.Subject ?? "<No subject found>" }); result = true; } } } } finally { if (text != null) { TraceHelper.MeetingForwardNotificationTracer.TracePass(TraceHelper.MessageProbeActivityId, 0L, text); MfnLog.LogEntry(mailboxSession, text); } } return(result); }
// Token: 0x060007AC RID: 1964 RVA: 0x00036880 File Offset: 0x00034A80 public void PerformCleanUp(MailboxSession itemStore, StoreObject item, CalendarConfiguration mailboxConfig, CalendarItemBase originalCalItem, IEnumerable <VersionedId> duplicates) { bool flag = false; if (mailboxConfig.RemoveOldMeetingMessages && !(item is MeetingForwardNotification)) { this.DeleteOldMessages(itemStore, (MeetingMessage)item, originalCalItem, out flag); } if (item is MeetingMessage) { bool flag2 = false; MeetingMessage meetingMessage = (MeetingMessage)item; if (meetingMessage.IsRepairUpdateMessage) { flag2 = (!flag || (!(meetingMessage is MeetingRequest) && !(meetingMessage is MeetingCancellation))); if (flag2) { meetingMessage.MarkAsOutOfDate(); meetingMessage.IsRead = true; try { int num = 3; ConflictResolutionResult saveResults; do { saveResults = meetingMessage.Save(SaveMode.ResolveConflicts); meetingMessage.Load(); num--; }while (num > 0 && !CalendarProcessing.CheckSaveResults(meetingMessage, saveResults, meetingMessage.InternetMessageId)); } catch (ObjectNotFoundException arg) { flag2 = false; OldMessageDeletion.Tracer.TraceWarning <object, ObjectNotFoundException>((long)this.GetHashCode(), "{0}: Tried to mark a RUM as Outdated, which does not exist anymore. Exception: {1}", TraceContext.Get(), arg); } } } if (!flag2 && item is MeetingForwardNotification) { bool flag3 = itemStore.IsGroupMailbox(); string text = null; flag2 = (mailboxConfig.RemoveForwardedMeetingNotifications || !meetingMessage.IsResponseRequested || flag3); if (!flag2) { Participant participant = null; flag2 = OldMessageDeletion.IsSenderSame(meetingMessage.From, itemStore, out participant); if (participant != null) { text = participant.EmailAddress; } } string text2; if (flag2) { text2 = string.Format("Deleting MFN message as it was forwarded by the organizer. ParticipantFromEmail: {0}, Message From: {1}, From RoutingType: {2}, Mailbox owner : {3}, Mailboxconfig.RemoveMFN setting {4}, IsResponseRequested {5}, Subject: {6}, IsGroupMailbox: {7} ", new object[] { text ?? "unspecified", meetingMessage.From, (meetingMessage.From != null) ? meetingMessage.From.RoutingType : "unspecified", itemStore.MailboxOwner.MailboxInfo.PrimarySmtpAddress.ToString(), mailboxConfig.RemoveForwardedMeetingNotifications, meetingMessage.IsResponseRequested, meetingMessage.Subject, flag3 }); } else { text2 = string.Format("Not deleting MFN message as it was forwarded by someone other than the organizer. ParticipantFromEmail {0}, Message From: {1}, From RoutingType: {2}, Mailbox owner : {3}, Mailboxconfig.RemoveMFN setting {4}, IsResponseRequested {5}, Subject: {6} ", new object[] { text ?? "unspecified", meetingMessage.From, (meetingMessage.From != null) ? meetingMessage.From.RoutingType : "unspecified", itemStore.MailboxOwner.MailboxInfo.PrimarySmtpAddress.ToString(), mailboxConfig.RemoveForwardedMeetingNotifications, meetingMessage.IsResponseRequested, meetingMessage.Subject }); } OldMessageDeletion.Tracer.TraceDebug((long)this.GetHashCode(), text2); MfnLog.LogEntry(itemStore, text2); } if (!flag2 && OldMessageDeletion.IsSelfForwardedEventAndAccepted(meetingMessage, itemStore, originalCalItem)) { flag2 = true; OldMessageDeletion.Tracer.TraceDebug((long)this.GetHashCode(), "{0}: Marked the meeting request for deletion as sent to self", new object[] { TraceContext.Get() }); } if (flag2) { this.DeleteMessage(itemStore, item); } } if (duplicates != null) { foreach (VersionedId versionedId in duplicates) { itemStore.Delete(DeleteItemFlags.MoveToDeletedItems, new StoreId[] { versionedId }); OldMessageDeletion.Tracer.TraceDebug <object, VersionedId>((long)this.GetHashCode(), "{0}: Deleted a duplicate item ID: {1}.", TraceContext.Get(), versionedId); } } }