// 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);
            }
        }
예제 #2
0
 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);
             }
         }
     }
 }
예제 #3
0
        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);
                }
            }
        }