Esempio n. 1
0
        // Token: 0x06000560 RID: 1376 RVA: 0x00028EBC File Offset: 0x000270BC
        protected void InternalCallService <BaseResponseMessageType>(Func <BaseResponseMessageType> delegateServiceCall, Action <BaseResponseMessageType> responseProcessor, Func <Exception, Exception> exceptionHandler, Func <bool> authorizationHandler, Action <Uri> urlRedirectionHandler)
        {
            int       num = 0;
            DateTime  t   = DateTime.UtcNow.Add(this.TotalRetryTimeWindow);
            Exception threadException;
            Exception ex;
            Exception ex2;

            for (;;)
            {
                ex = null;
                threadException = null;
                ex2             = null;
                bool flag  = false;
                bool flag2 = false;
                bool flag3 = false;
                if (this.ServiceBinding != null)
                {
                    ServiceBindingType serviceBinding = this.ServiceBinding;
                    serviceBinding.UserAgent = string.Format("{0}{1}=MRM&{2}={3}&{4}={5}&{6}={7}", new object[]
                    {
                        ElcEwsClientHelper.GetOAuthUserAgent("ElcClient"),
                        "S",
                        "BI",
                        DateTime.UtcNow.Ticks.ToString(),
                        "R",
                        num.ToString(),
                        "RT",
                        DateTime.UtcNow.Ticks.ToString()
                    });
                }
                try
                {
                    BaseResponseMessageType response = default(BaseResponseMessageType);
                    bool flag4 = false;
                    Thread thread = new Thread(delegate()
                    {
                        try
                        {
                            response = delegateServiceCall();
                        }
                        catch (Exception threadException)
                        {
                            threadException = threadException;
                        }
                    });
                    thread.Start();
                    while (!flag4)
                    {
                        if (this.AbortTokenForTasks.IsCancellationRequested)
                        {
                            throw new ExportException(ExportErrorType.StopRequested);
                        }
                        flag4 = thread.Join(5000);
                    }
                    if (!flag4)
                    {
                        thread.Abort();
                    }
                    if (threadException != null)
                    {
                        throw threadException;
                    }
                    if (responseProcessor != null)
                    {
                        responseProcessor(response);
                    }
                }
                catch (RetryException ex3)
                {
                    ex   = ex3.InnerException;
                    flag = true;
                    if (ex3.ResetRetryCounter)
                    {
                        Tracer.TraceError("ElcBaseServiceClient.InternalCallService: Resetting retry in RetryException.", new object[0]);
                        flag2 = true;
                    }
                }
                catch (ExportException ex4)
                {
                    ex = ex4;
                    if (ex4.ErrorType == ExportErrorType.Unauthorized)
                    {
                        flag3 = true;
                    }
                }
                catch (WebException ex5)
                {
                    ex = ex5;
                    if (ex5.Status == WebExceptionStatus.TrustFailure)
                    {
                        Tracer.TraceError("ElcBaseServiceClient.InternalCallService: Unable to establish trust on exception. No retry.", new object[0]);
                        flag = false;
                    }
                    else if (ex5.Status == WebExceptionStatus.ConnectFailure)
                    {
                        SocketException ex6 = ex5.InnerException as SocketException;
                        flag = (ex6 == null || ex6.SocketErrorCode != SocketError.ConnectionRefused);
                        Tracer.TraceError("ElcBaseServiceClient.InternalCallService: Connect failure. Retry: {0}.", new object[]
                        {
                            flag
                        });
                    }
                    else if (ex5.Status == WebExceptionStatus.NameResolutionFailure)
                    {
                        Tracer.TraceError("ElcBaseServiceClient.InternalCallService: DNS look up failure. No retry.", new object[0]);
                        flag = false;
                    }
                    else
                    {
                        HttpWebResponse httpWebResponse = ex5.Response as HttpWebResponse;
                        flag = true;
                        if (httpWebResponse != null)
                        {
                            HttpStatusCode statusCode = httpWebResponse.StatusCode;
                            switch (statusCode)
                            {
                            case HttpStatusCode.MovedPermanently:
                            case HttpStatusCode.Found:
                                break;

                            default:
                                if (statusCode != HttpStatusCode.TemporaryRedirect)
                                {
                                    if (statusCode == HttpStatusCode.Unauthorized)
                                    {
                                        Tracer.TraceError("ElcBaseServiceClient.InternalCallService: HTTP 401 unauthorized", new object[0]);
                                        flag  = false;
                                        flag3 = true;
                                        ex    = new ExportException(ExportErrorType.Unauthorized, ex5);
                                        goto IL_352;
                                    }
                                    goto IL_352;
                                }
                                break;
                            }
                            string text = httpWebResponse.Headers[HttpResponseHeader.Location];
                            Tracer.TraceInformation("ElcBaseServiceClient.InternalCallService: HTTP redirection to {0}", new object[]
                            {
                                text
                            });
                            ex   = new ExportException(ExportErrorType.UnexpectedWebServiceUrlRedirection, ex5);
                            flag = false;
                            if (Uri.IsWellFormedUriString(text, UriKind.Absolute))
                            {
                                Uri uri = new Uri(text);
                                if (uri.Scheme == Uri.UriSchemeHttps && urlRedirectionHandler != null)
                                {
                                    this.ServiceEndpoint = uri;
                                    urlRedirectionHandler(uri);
                                    ex    = null;
                                    flag  = true;
                                    flag2 = true;
                                    Tracer.TraceError("ElcBaseServiceClient.InternalCallService: Resetting retry during HTTP redirection.", new object[0]);
                                }
                            }
                        }
                    }
                    IL_352 :;
                }
                catch (SoapException ex7)
                {
                    if (ex7.Code != null && ex7.Code.Name == "ErrorAccessDenied")
                    {
                        flag  = false;
                        flag3 = true;
                        ex    = new ExportException(ExportErrorType.Unauthorized, ex7);
                    }
                    else
                    {
                        ex   = ex7;
                        flag = false;
                        if (ex7.Code != null && ElcBaseServiceClient <ServiceBindingType, FunctionalInterfaceType> .IsTransientError(ex7.Code.Name))
                        {
                            flag = true;
                        }
                    }
                }
                catch (TimeoutException ex8)
                {
                    ex   = ex8;
                    flag = true;
                }
                catch (InvalidOperationException ex9)
                {
                    ex   = ex9;
                    flag = true;
                }
                if (ex != null)
                {
                    if (exceptionHandler != null)
                    {
                        Tracer.TraceError("ElcBaseServiceClient.InternalCallService: Exception handler is handling exception : {0}", new object[]
                        {
                            ex
                        });
                        ex2 = exceptionHandler(ex);
                        Tracer.TraceError("ElcBaseServiceClient.InternalCallService: Exception after being handled : {0}", new object[]
                        {
                            ex2
                        });
                    }
                    else
                    {
                        ex2 = new ExportException(ExportErrorType.ExchangeWebServiceCallFailed, ex);
                    }
                }
                if (flag && !flag2)
                {
                    int num2 = this.GetRetryWaitTime(num);
                    Tracer.TraceError("ElcBaseServiceClient.InternalCallService: Retry after {0} milliseconds on exception : {1}", new object[]
                    {
                        num2,
                        ex
                    });
                    while (num2 > 0 && t > DateTime.UtcNow)
                    {
                        Thread.Sleep((num2 > 5000) ? 5000 : num2);
                        num2 -= 5000;
                        if (this.AbortTokenForTasks.IsCancellationRequested)
                        {
                            goto Block_8;
                        }
                    }
                }
                if (flag3)
                {
                    Tracer.TraceInformation("ElcBaseServiceClient.InternalCallService: Unauthorized", new object[0]);
                    if (authorizationHandler == null || !authorizationHandler())
                    {
                        goto IL_4BE;
                    }
                    flag = true;
                }
                if (flag2)
                {
                    num = 0;
                }
                else
                {
                    num++;
                }
                if (!flag || !(t > DateTime.UtcNow))
                {
                    goto IL_4DF;
                }
            }
Block_8:
            throw new ExportException(ExportErrorType.StopRequested);
IL_4BE:
            throw ex;
IL_4DF:
            if (ex2 != null)
            {
                Tracer.TraceError("ElcBaseServiceClient.InternalCallService: Exception thrown after all possible actions: {0}", new object[]
                {
                    ex2
                });
                throw ex2;
            }
        }
 // Token: 0x06000563 RID: 1379 RVA: 0x000294DE File Offset: 0x000276DE
 public ElcEwsCallingContext(ADUser user, bool isCrossPremise)
 {
     this.user           = user;
     this.isCrossPremise = isCrossPremise;
     this.userAgent      = ElcEwsClientHelper.GetOAuthUserAgent("ElcClient");
 }
        // Token: 0x0600059B RID: 1435 RVA: 0x0002B16C File Offset: 0x0002936C
        public static Uri DiscoverCloudArchiveEwsUrl(ADUser user)
        {
            Uri    result = null;
            string text   = null;
            string domain = user.ArchiveDomain.Domain;
            Uri    uri    = null;
            EndPointDiscoveryInfo endPointDiscoveryInfo;
            bool flag = RemoteDiscoveryEndPoint.TryGetDiscoveryEndPoint(OrganizationId.ForestWideOrgId, domain, null, null, null, out uri, out endPointDiscoveryInfo);

            if (endPointDiscoveryInfo != null && endPointDiscoveryInfo.Status != EndPointDiscoveryInfo.DiscoveryStatus.Success)
            {
                ElcEwsClientHelper.Tracer.TraceDebug <SmtpAddress, EndPointDiscoveryInfo.DiscoveryStatus, string>(0L, "Getting autodiscover url for {0} encountered problem with status {1}. {2}", user.PrimarySmtpAddress, endPointDiscoveryInfo.Status, endPointDiscoveryInfo.Message);
            }
            if (!flag || uri == null)
            {
                ElcEwsClientHelper.Tracer.TraceError <SmtpAddress>(0L, "Failed to get autodiscover URL for {0}.", user.PrimarySmtpAddress);
                return(null);
            }
            SmtpAddress      archiveAddress = new SmtpAddress(SmtpProxyAddress.EncapsulateExchangeGuid(domain, user.ArchiveGuid));
            Guid             value          = Guid.NewGuid();
            OAuthCredentials oauthCredentialsForAppActAsToken = OAuthCredentials.GetOAuthCredentialsForAppActAsToken(OrganizationId.ForestWideOrgId, user, domain);

            oauthCredentialsForAppActAsToken.ClientRequestId = new Guid?(value);
            AutodiscoverService service = new AutodiscoverService(EwsWsSecurityUrl.FixForAnonymous(uri), 4)
            {
                Credentials     = new OAuthCredentials(oauthCredentialsForAppActAsToken),
                PreAuthenticate = true,
                UserAgent       = ElcEwsClientHelper.GetOAuthUserAgent("ElcAutoDiscoverClient")
            };

            service.ClientRequestId       = value.ToString();
            service.ReturnClientRequestId = true;
            try
            {
                ServicePointManager.ServerCertificateValidationCallback = (RemoteCertificateValidationCallback)Delegate.Combine(ServicePointManager.ServerCertificateValidationCallback, new RemoteCertificateValidationCallback(ElcEwsClientHelper.CertificateErrorHandler));
                GetUserSettingsResponse response = null;
                Exception arg   = null;
                bool      flag2 = ElcEwsClientHelper.ExecuteEwsCall(delegate
                {
                    response = service.GetUserSettings(archiveAddress.ToString(), new UserSettingName[]
                    {
                        58
                    });
                }, out arg);
                if (flag2)
                {
                    if (response.ErrorCode == null)
                    {
                        if (!response.TryGetSettingValue <string>(58, ref text) || string.IsNullOrEmpty(text))
                        {
                            ElcEwsClientHelper.Tracer.TraceError <SmtpAddress, SmtpAddress>(0L, "Sucessfully called autodiscover, but did not retrieve a url for {0}/{1}.", user.PrimarySmtpAddress, archiveAddress);
                        }
                    }
                    else
                    {
                        ElcEwsClientHelper.Tracer.TraceError(0L, "Unable to autodiscover EWS endpoint for {0}/{1}, error code: {2}, message {3}.", new object[]
                        {
                            user.PrimarySmtpAddress,
                            archiveAddress,
                            response.ErrorCode,
                            response.ErrorMessage
                        });
                    }
                }
                else
                {
                    ElcEwsClientHelper.Tracer.TraceError <SmtpAddress, SmtpAddress, Exception>(0L, "Unable to autodiscover EWS endpoint for {0}/{1}, exception {2}.", user.PrimarySmtpAddress, archiveAddress, arg);
                }
            }
            finally
            {
                ServicePointManager.ServerCertificateValidationCallback = (RemoteCertificateValidationCallback)Delegate.Remove(ServicePointManager.ServerCertificateValidationCallback, new RemoteCertificateValidationCallback(ElcEwsClientHelper.CertificateErrorHandler));
            }
            if (!string.IsNullOrEmpty(text))
            {
                result = new Uri(text);
            }
            return(result);
        }