// Token: 0x060007B0 RID: 1968 RVA: 0x00036FC0 File Offset: 0x000351C0 internal static bool IsSelfForwardedEvent(MeetingMessage mtgMessage, MailboxSession session) { if (mtgMessage == null || mtgMessage.IsExternalMessage) { return(false); } Participant participant = null; if (OldMessageDeletion.IsSenderSame(mtgMessage.Sender, session, out participant)) { string text = (string)Utils.SafeGetProperty(mtgMessage, MessageItemSchema.ReceivedRepresentingEmailAddress, string.Empty); if (text.Equals(session.MailboxOwner.LegacyDn, StringComparison.OrdinalIgnoreCase)) { return(true); } } return(false); }
// Token: 0x06000783 RID: 1923 RVA: 0x0003546C File Offset: 0x0003366C private static bool ShouldIgnoreMessage(MailboxSession itemStore, StoreObjectId folderId, MeetingMessage mtgMessage) { foreach (DefaultFolderType defaultFolderType in CalendarAssistant.FoldersToIgnore) { StoreObjectId defaultFolderId = itemStore.GetDefaultFolderId(defaultFolderType); if (defaultFolderId != null && defaultFolderId.Equals(folderId)) { return(true); } } StoreObjectId defaultFolderId2 = itemStore.GetDefaultFolderId(DefaultFolderType.DeletedItems); if (defaultFolderId2 != null && defaultFolderId2.Equals(folderId) && mtgMessage != null && mtgMessage is MeetingRequest) { return(!OldMessageDeletion.IsSelfForwardedEvent(mtgMessage, itemStore)); } return(CalendarAssistant.IsDumpsterFolder(itemStore, folderId)); }
// Token: 0x060007BC RID: 1980 RVA: 0x00037DC8 File Offset: 0x00035FC8 public static void CleanUp(MailboxSession mailboxSession, MeetingMessage item, CalendarItemBase originalCalItem, Trace tracer, out bool fullUpdateDeleted) { fullUpdateDeleted = false; byte[] valueOrDefault = item.GetValueOrDefault <byte[]>(CalendarItemBaseSchema.GlobalObjectId, null); if (valueOrDefault == null) { return; } int valueOrDefault2 = item.GetValueOrDefault <int>(CalendarItemBaseSchema.AppointmentSequenceNumber, -1); if (valueOrDefault2 == -1) { return; } OldMessageDeletion.LatestItemInfo latestInfo; latestInfo.LatestSequenceNumber = -1; List <VersionedId> oldMeetingMessages = RUMOldMessageDeletion.GetOldMeetingMessages(mailboxSession, item, valueOrDefault, valueOrDefault2, out latestInfo); if (oldMeetingMessages == null && latestInfo.LatestSequenceNumber >= valueOrDefault2) { RUMOldMessageDeletion.MarkMeetingMessageAsOld(item, tracer); fullUpdateDeleted = false; return; } if (oldMeetingMessages != null && oldMeetingMessages.Count > 0) { foreach (VersionedId storeId in oldMeetingMessages) { using (MeetingMessage meetingMessage = MeetingMessage.Bind(mailboxSession, storeId)) { RUMOldMessageDeletion.MarkMeetingMessageAsOld(meetingMessage, tracer); } } } MeetingRequest meetingRequest = item as MeetingRequest; if (meetingRequest != null) { OldMessageDeletion.ApplyRollingHighlight(meetingRequest, item.InternetMessageId, originalCalItem, latestInfo); } fullUpdateDeleted = latestInfo.FullUpdateDeleted; }
// Token: 0x060007B3 RID: 1971 RVA: 0x0003708C File Offset: 0x0003528C private void QueryAndDeleteMatchingItems(MailboxSession itemStore, MeetingMessage item, CalendarItemBase originalCalendarItem, byte[] itemGloblObjectId, string internetMessageId, string sentRepresenting, int itemSequenceNumber, ref OldMessageDeletion.LatestItemInfo latestInfo) { try { List <VersionedId> list = this.QueryMatchingItems(itemStore, item, itemGloblObjectId, sentRepresenting, itemSequenceNumber, ref latestInfo); if (item is MeetingRequest && itemSequenceNumber >= latestInfo.LatestSequenceNumber) { OldMessageDeletion.ApplyRollingHighlight((MeetingRequest)item, internetMessageId, originalCalendarItem, latestInfo); } if (list != null && list.Count != 0) { StoreId[] array = list.ToArray(); OldMessageDeletion.Tracer.TraceDebug <object, ArrayTracer <StoreId> >((long)this.GetHashCode(), "{0}: Deleting message: {1}", TraceContext.Get(), new ArrayTracer <StoreId>(array)); CalendarAssistant.TracerPfd.TracePfd <int, object, ArrayTracer <StoreId> >((long)this.GetHashCode(), "PFD IWC {0} {1}: Deleting message: {2}", 29847, TraceContext.Get(), new ArrayTracer <StoreId>(array)); AggregateOperationResult aggregateOperationResult = itemStore.Delete(DeleteItemFlags.MoveToDeletedItems, array); OldMessageDeletion.Tracer.TraceDebug <object, OperationResult>((long)this.GetHashCode(), "{0}: Deleting items returned: {1}", TraceContext.Get(), aggregateOperationResult.OperationResult); CalendarAssistantPerformanceCounters.MeetingMessagesDeleted.IncrementBy((long)list.Count); } } catch (ObjectNotFoundException arg) { OldMessageDeletion.Tracer.TraceDebug <object, ObjectNotFoundException>((long)this.GetHashCode(), "{0}: Stopped OMD because we encountered an exception: {1}", TraceContext.Get(), arg); } }
// Token: 0x06000793 RID: 1939 RVA: 0x00035B83 File Offset: 0x00033D83 private static bool IsAutoAcceptanceProcessingRequired(MailboxSession session, MeetingMessage mtgMessage, CalendarItemBase calendarItem) { return(calendarItem != null && mtgMessage is MeetingRequest && !calendarItem.IsOrganizer() && calendarItem.ResponseType != ResponseType.Accept && (session.IsGroupMailbox() || OldMessageDeletion.IsSelfForwardedEvent(mtgMessage, session))); }
// Token: 0x060007BD RID: 1981 RVA: 0x00037EC4 File Offset: 0x000360C4 private static List <VersionedId> GetOldMeetingMessages(MailboxSession mailboxSession, MeetingMessage item, byte[] globalObjectId, int rumSequenceNumber, out OldMessageDeletion.LatestItemInfo latestItemInfo) { SortBy[] array = new SortBy[2]; latestItemInfo.FullUpdateDeleted = false; latestItemInfo.RollingHighlight = (int)Utils.SafeGetProperty(item, CalendarItemBaseSchema.ChangeHighlight, 0); latestItemInfo.LatestOldStartTime = ExDateTime.MinValue; latestItemInfo.LatestOldEndTime = ExDateTime.MinValue; latestItemInfo.LatestOldLocationStr = string.Empty; latestItemInfo.LatestSequenceNumber = -1; latestItemInfo.LatestItemId = item.Id; latestItemInfo.LatestClientSubmitTime = (ExDateTime)Utils.SafeGetProperty(item, ItemSchema.SentTime, ExDateTime.MinValue); ExDateTime valueOrDefault = item.GetValueOrDefault <ExDateTime>(CalendarItemBaseSchema.OwnerCriticalChangeTime, ExDateTime.MinValue); VersionedId id = item.Id; array[0] = new SortBy(CalendarItemBaseSchema.GlobalObjectId, SortOrder.Ascending); array[1] = new SortBy(CalendarItemBaseSchema.AppointmentSequenceNumber, SortOrder.Descending); ComparisonFilter seekFilter = new ComparisonFilter(ComparisonOperator.Equal, CalendarItemBaseSchema.GlobalObjectId, globalObjectId); List <VersionedId> list = new List <VersionedId>(); using (Folder folder = Folder.Bind(mailboxSession, item.ParentId)) { using (QueryResult queryResult = folder.ItemQuery(ItemQueryType.None, null, array, OldMessageDeletion.OMDColumnsToQuery)) { queryResult.SeekToCondition(SeekReference.OriginBeginning, seekFilter); bool flag = true; while (flag) { IStorePropertyBag[] propertyBags = queryResult.GetPropertyBags(25); if (propertyBags.Length <= 1) { break; } foreach (IStorePropertyBag storePropertyBag in propertyBags) { string valueOrDefault2 = storePropertyBag.GetValueOrDefault <string>(OldMessageDeletion.OMDColumnsToQuery[0], null); if (!string.IsNullOrEmpty(valueOrDefault2) && (ObjectClass.IsMeetingRequest(valueOrDefault2) || ObjectClass.IsMeetingCancellation(valueOrDefault2))) { byte[] valueOrDefault3 = storePropertyBag.GetValueOrDefault <byte[]>(OldMessageDeletion.OMDColumnsToQuery[2], null); if (!OldMessageDeletion.GlobalObjectIdMatches(globalObjectId, valueOrDefault3)) { flag = false; break; } VersionedId valueOrDefault4 = storePropertyBag.GetValueOrDefault <VersionedId>(OldMessageDeletion.OMDColumnsToQuery[1], null); if (valueOrDefault4 != null && !id.Equals(valueOrDefault4)) { int valueOrDefault5 = storePropertyBag.GetValueOrDefault <int>(OldMessageDeletion.OMDColumnsToQuery[3], -1); if (valueOrDefault5 != -1) { if (valueOrDefault5 > rumSequenceNumber) { latestItemInfo.LatestSequenceNumber = valueOrDefault5; return(null); } if (valueOrDefault5 == rumSequenceNumber) { ExDateTime valueOrDefault6 = storePropertyBag.GetValueOrDefault <ExDateTime>(OldMessageDeletion.OMDColumnsToQuery[8], ExDateTime.MinValue); if (valueOrDefault6 > valueOrDefault) { latestItemInfo.LatestSequenceNumber = valueOrDefault5; return(null); } } if (latestItemInfo.LatestSequenceNumber == -1) { ExDateTime valueOrDefault7 = storePropertyBag.GetValueOrDefault <ExDateTime>(OldMessageDeletion.OMDColumnsToQuery[9], ExDateTime.MinValue); if (valueOrDefault7 != ExDateTime.MinValue) { latestItemInfo.LatestOldStartTime = valueOrDefault7; } ExDateTime valueOrDefault8 = storePropertyBag.GetValueOrDefault <ExDateTime>(OldMessageDeletion.OMDColumnsToQuery[10], ExDateTime.MinValue); if (valueOrDefault7 != ExDateTime.MinValue) { latestItemInfo.LatestOldEndTime = valueOrDefault8; } string valueOrDefault9 = storePropertyBag.GetValueOrDefault <string>(OldMessageDeletion.OMDColumnsToQuery[11], null); if (!string.IsNullOrEmpty(valueOrDefault9)) { latestItemInfo.LatestOldLocationStr = valueOrDefault9; } } latestItemInfo.RollingHighlight |= storePropertyBag.GetValueOrDefault <int>(OldMessageDeletion.OMDColumnsToQuery[4], 0); MeetingMessageType valueOrDefault10 = storePropertyBag.GetValueOrDefault <MeetingMessageType>(OldMessageDeletion.OMDColumnsToQuery[13], MeetingMessageType.None); latestItemInfo.FullUpdateDeleted |= (valueOrDefault10 == MeetingMessageType.FullUpdate || valueOrDefault10 == MeetingMessageType.NewMeetingRequest); list.Add(valueOrDefault4); } } } } } } } return(list); }
// Token: 0x060007B4 RID: 1972 RVA: 0x000371A0 File Offset: 0x000353A0 private List <VersionedId> QueryMatchingItems(MailboxSession itemStore, MeetingMessage item, byte[] itemGlobalObjId, string sentRepresenting, int itemSequenceNumber, ref OldMessageDeletion.LatestItemInfo latestInfo) { ExDateTime utcNow = ExDateTime.UtcNow; List <VersionedId> list = new List <VersionedId>(); bool flag = true; bool flag2 = (bool)Utils.SafeGetProperty(item, MessageItemSchema.MapiHasAttachment, false); bool flag3 = item.Body != null && item.Body.Size > 0L; bool flag4 = item is MeetingRequest; bool flag5 = item is MeetingResponse; bool flag6 = item is MeetingCancellation; SortBy[] sortColumns = new SortBy[] { new SortBy(CalendarItemBaseSchema.GlobalObjectId, SortOrder.Ascending), new SortBy(StoreObjectSchema.ItemClass, SortOrder.Descending) }; ComparisonFilter seekFilter = new ComparisonFilter(ComparisonOperator.Equal, CalendarItemBaseSchema.GlobalObjectId, itemGlobalObjId); using (Folder folder = Folder.Bind(itemStore, item.ParentId)) { using (QueryResult queryResult = folder.ItemQuery(ItemQueryType.None, null, sortColumns, OldMessageDeletion.OMDColumnsToQuery)) { queryResult.SeekToCondition(SeekReference.OriginBeginning, seekFilter); while (flag) { object[][] rows = queryResult.GetRows(25); if (rows.Length < 1) { break; } ExDateTime itemOwnerChangeTime = (ExDateTime)Utils.SafeGetProperty(item, CalendarItemBaseSchema.OwnerCriticalChangeTime, utcNow); foreach (object[] array in rows) { string text = array[0] as string; if (!string.IsNullOrEmpty(text)) { if (!itemStore.IsGroupMailbox()) { if ((flag4 || flag6) && !ObjectClass.IsMeetingRequest(text) && !ObjectClass.IsMeetingCancellation(text)) { flag = false; break; } if (flag5 && !ObjectClass.IsMeetingResponse(text)) { goto IL_186; } } byte[] rowGlobalObjectId = (array[2] is byte[]) ? (array[2] as byte[]) : null; if (!OldMessageDeletion.GlobalObjectIdMatches(itemGlobalObjId, rowGlobalObjectId)) { flag = false; break; } this.DetermineIfWeDelete(list, item, array, itemOwnerChangeTime, sentRepresenting, itemSequenceNumber, ref latestInfo, ref flag2, ref flag3); } IL_186 :; } } } } return(list); }
// Token: 0x060007B2 RID: 1970 RVA: 0x00037067 File Offset: 0x00035267 private static bool IsSelfForwardedEventAndAccepted(MeetingMessage mtgMessage, MailboxSession session, CalendarItemBase calendarItem) { return(calendarItem != null && mtgMessage is MeetingRequest && (OldMessageDeletion.IsSelfForwardedEvent(mtgMessage, session) && calendarItem.ResponseType == ResponseType.Accept)); }
// 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); } } }
// Token: 0x060007AE RID: 1966 RVA: 0x00036C68 File Offset: 0x00034E68 private void DeleteOldMessages(MailboxSession itemStore, MeetingMessage item, CalendarItemBase originalCalItem, out bool fullUpdateDeleted) { fullUpdateDeleted = false; string text = (string)Utils.SafeGetProperty(item, ItemSchema.InternetMessageId, "<null>"); if (item is MeetingRequest || item is MeetingCancellation) { bool flag = (bool)Utils.SafeGetProperty(item, MeetingMessageSchema.HijackedMeeting, false); if (flag) { CalendarAssistantLog.LogEntry(itemStore, "Message {0} has been hijacked, skipping deletion of old messages.", new object[] { text }); return; } } int num = (int)Utils.SafeGetProperty(item, CalendarItemBaseSchema.AppointmentSequenceNumber, -1); if (num < 0) { OldMessageDeletion.Tracer.TraceError <object, string>((long)this.GetHashCode(), "{0}: Message does not have a sequence number, skipping {1}", TraceContext.Get(), text); CalendarAssistantLog.LogEntry(itemStore, "Message does not have a sequence number, skipping {0}", new object[] { text }); return; } if (OldMessageDeletion.ShouldIgnoreFolder(itemStore, item.ParentId)) { return; } string text2 = (string)Utils.SafeGetProperty(item, MessageItemSchema.ReceivedRepresentingEmailAddress, string.Empty); string text3 = (string)Utils.SafeGetProperty(item, CalendarItemBaseSchema.OrganizerEmailAddress, string.Empty); byte[] array = (byte[])Utils.SafeGetProperty(item, CalendarItemBaseSchema.GlobalObjectId, null); if (array == null) { OldMessageDeletion.Tracer.TraceError <object, string>((long)this.GetHashCode(), "{0}: Message {1} does not have a globalObjectId, skipping the message.", TraceContext.Get(), text); CalendarAssistantLog.LogEntry(itemStore, "Message {0} does not have a globalObjectId, skipping the message.", new object[] { text }); return; } OldMessageDeletion.Tracer.TraceDebug <object, string, string>((long)item.GetHashCode(), "{0}: Received representing={1} sent representing={2}", TraceContext.Get(), text2, text3); CalendarAssistant.TracerPfd.TracePfd((long)item.GetHashCode(), "PFD IWC {0} {1}: Received representing={2} sent representing={3}", new object[] { 22679, TraceContext.Get(), text2, text3 }); if (!itemStore.IsGroupMailbox() && string.Compare(text2, text3, true) == 0) { Participant participant = null; if (!OldMessageDeletion.IsSenderSame(item.Sender, itemStore, out participant)) { return; } AggregateOperationResult aggregateOperationResult = itemStore.Delete(DeleteItemFlags.MoveToDeletedItems, new StoreId[] { item.Id }); OldMessageDeletion.Tracer.TraceDebug <object, string, OperationResult>((long)this.GetHashCode(), "{0}: Moving the item {1} to the Deleted Items folder returned:{2}", TraceContext.Get(), text, aggregateOperationResult.OperationResult); return; } else { if (item.IsRepairUpdateMessage) { RUMOldMessageDeletion.CleanUp(itemStore, item, originalCalItem, OldMessageDeletion.Tracer, out fullUpdateDeleted); return; } OldMessageDeletion.LatestItemInfo latestItemInfo; latestItemInfo.FullUpdateDeleted = fullUpdateDeleted; latestItemInfo.RollingHighlight = (int)Utils.SafeGetProperty(item, CalendarItemBaseSchema.ChangeHighlight, 0); latestItemInfo.LatestOldStartTime = ExDateTime.MinValue; latestItemInfo.LatestOldEndTime = ExDateTime.MinValue; latestItemInfo.LatestOldLocationStr = string.Empty; latestItemInfo.LatestSequenceNumber = -1; latestItemInfo.LatestItemId = item.Id; latestItemInfo.LatestClientSubmitTime = (ExDateTime)Utils.SafeGetProperty(item, ItemSchema.SentTime, ExDateTime.MinValue); this.QueryAndDeleteMatchingItems(itemStore, item, originalCalItem, array, text, text3, num, ref latestItemInfo); fullUpdateDeleted = latestItemInfo.FullUpdateDeleted; return; } }