Beispiel #1
0
 internal InvalidSharingRecipientsException(InvalidRecipient[] invalidRecipients, InvalidSharingRecipientsResolution resolution) : base(ServerStrings.InvalidSharingRecipientsException)
 {
     this.InvalidRecipients           = invalidRecipients;
     this.InvalidRecipientsResolution = resolution;
 }
        private void PerformInvitation()
        {
            Dictionary <SharingProvider, ValidRecipient[]> dictionary = new Dictionary <SharingProvider, ValidRecipient[]>();
            List <ValidRecipient> list = new List <ValidRecipient>();
            SharingProvider       fallbackSharingProvider = this.SharingContext.FallbackSharingProvider;

            using (FolderPermissionContext current = FolderPermissionContext.GetCurrent(this.MailboxSession, this.SharingContext))
            {
                bool flag = false;
                try
                {
                    foreach (KeyValuePair <SharingProvider, CheckRecipientsResults> keyValuePair in this.SharingContext.AvailableSharingProviders)
                    {
                        SharingProvider        key   = keyValuePair.Key;
                        CheckRecipientsResults value = keyValuePair.Value;
                        if (this.FallbackEnabled && key == fallbackSharingProvider)
                        {
                            if (value != null)
                            {
                                list.AddRange(value.ValidRecipients);
                            }
                        }
                        else if (value != null)
                        {
                            PerformInvitationResults performInvitationResults = key.PerformInvitation(this.MailboxSession, this.SharingContext, value.ValidRecipients, this.FrontEndLocator);
                            ExTraceGlobals.SharingTracer.TraceDebug <IExchangePrincipal, SharingProvider, PerformInvitationResults>((long)this.GetHashCode(), "{0}: Performed invitation by provider {1}. Result = {2}", this.MailboxSession.MailboxOwner, key, performInvitationResults);
                            if (performInvitationResults.Result == PerformInvitationResultType.Failed || performInvitationResults.Result == PerformInvitationResultType.PartiallySuccess)
                            {
                                if (!this.FallbackEnabled)
                                {
                                    StoreObjectId folderId = this.SharingContext.FolderId;
                                    InvalidSharingRecipientsResolution invalidSharingRecipientsResolution;
                                    if (!this.CanUseFallback)
                                    {
                                        invalidSharingRecipientsResolution = new InvalidSharingRecipientsResolution(folderId);
                                    }
                                    else
                                    {
                                        using (Folder folder = Folder.Bind(this.MailboxSession, folderId))
                                        {
                                            this.SharingContext.PopulateUrls(folder);
                                        }
                                        invalidSharingRecipientsResolution = new InvalidSharingRecipientsResolution(this.BrowseUrl, this.ICalUrl);
                                    }
                                    ExTraceGlobals.SharingTracer.TraceError <IExchangePrincipal, InvalidSharingRecipientsResolution>((long)this.GetHashCode(), "{0}: No fall back for these invalid recipients. Resolution = {1}", this.MailboxSession.MailboxOwner, invalidSharingRecipientsResolution);
                                    throw new InvalidSharingRecipientsException(performInvitationResults.FailedRecipients, invalidSharingRecipientsResolution);
                                }
                                ValidRecipient[] array = Array.ConvertAll <InvalidRecipient, ValidRecipient>(performInvitationResults.FailedRecipients, (InvalidRecipient invalidRecipient) => new ValidRecipient(invalidRecipient.SmtpAddress, null));
                                ExTraceGlobals.SharingTracer.TraceDebug <IExchangePrincipal, SharingProvider, int>((long)this.GetHashCode(), "{0}: Fall back on provider {1} for these {2} failed recipients.", this.MailboxSession.MailboxOwner, fallbackSharingProvider, array.Length);
                                list.AddRange(array);
                                dictionary.Add(key, performInvitationResults.SucceededRecipients);
                            }
                        }
                    }
                    if (this.FallbackEnabled)
                    {
                        foreach (KeyValuePair <SharingProvider, ValidRecipient[]> keyValuePair2 in dictionary)
                        {
                            SharingProvider  key2   = keyValuePair2.Key;
                            ValidRecipient[] value2 = keyValuePair2.Value;
                            this.SharingContext.AvailableSharingProviders[key2] = new CheckRecipientsResults(value2);
                        }
                        this.SharingContext.AvailableSharingProviders[fallbackSharingProvider] = new CheckRecipientsResults(list.ToArray());
                        PerformInvitationResults performInvitationResults2 = fallbackSharingProvider.PerformInvitation(this.MailboxSession, this.SharingContext, list.ToArray(), this.FrontEndLocator);
                        ExTraceGlobals.SharingTracer.TraceDebug <IExchangePrincipal, SharingProvider, PerformInvitationResults>((long)this.GetHashCode(), "{0}: Performed invitation by fallback provider {1}. Result = {2}", this.MailboxSession.MailboxOwner, fallbackSharingProvider, performInvitationResults2);
                        if (performInvitationResults2.Result == PerformInvitationResultType.Failed || performInvitationResults2.Result == PerformInvitationResultType.PartiallySuccess)
                        {
                            throw new InvalidOperationException("The fallback provider should never fail.");
                        }
                    }
                    flag = true;
                }
                finally
                {
                    if (!flag)
                    {
                        current.Disable();
                    }
                }
            }
        }