private static SerializedSecurityContextType GetSecurityContext(OwaContext owaContext)
        {
            SecurityAccessToken securityAccessToken = new SecurityAccessToken();

            owaContext.LogonIdentity.ClientSecurityContext.SetSecurityAccessToken(securityAccessToken);
            return(new SerializedSecurityContextType
            {
                UserSid = securityAccessToken.UserSid,
                RestrictedGroupSids = ProxyToEwsEventHandler.SidStringAndAttributesConverter(securityAccessToken.RestrictedGroupSids),
                GroupSids = ProxyToEwsEventHandler.SidStringAndAttributesConverter(securityAccessToken.GroupSids),
                PrimarySmtpAddress = owaContext.LogonIdentity.CreateExchangePrincipal().MailboxInfo.PrimarySmtpAddress.ToString()
            });
        }
 private byte[] GetRequestSoapHeader(out int newContentLength)
 {
     ProxyToEwsEventHandler.StreamWrapper streamWrapper = new ProxyToEwsEventHandler.StreamWrapper(this.HttpContext.Request.InputStream);
     byte[] result;
     using (XmlReader xmlReader = XmlReader.Create(streamWrapper))
     {
         if (!xmlReader.ReadToFollowing("Envelope", "http://schemas.xmlsoap.org/soap/envelope/"))
         {
             throw new OwaInvalidRequestException("Invalid XML format for this request");
         }
         using (XmlWriter xmlWriter = XmlWriter.Create(streamWrapper.BufferStream, new XmlWriterSettings
         {
             OmitXmlDeclaration = true,
             Encoding = this.HttpContext.Request.ContentEncoding
         }))
         {
             xmlWriter.WriteStartElement("Header", "http://schemas.xmlsoap.org/soap/envelope/");
             SerializedSecurityContextType securityContext      = ProxyToEwsEventHandler.GetSecurityContext(base.OwaContext);
             RequestServerVersion          requestServerVersion = new RequestServerVersion();
             if ("12.1".Equals(this.HttpContext.Request.QueryString["rv"]))
             {
                 requestServerVersion.Version = ExchangeVersionType.Exchange2007_SP1;
             }
             else
             {
                 requestServerVersion.Version = ExchangeVersionType.Exchange2010_SP1;
             }
             TimeZoneDefinitionType timeZoneDefinitionType = new TimeZoneDefinitionType();
             timeZoneDefinitionType.Id = base.OwaContext.TimeZoneId;
             TimeZoneContextType timeZoneContextType = new TimeZoneContextType();
             timeZoneContextType.TimeZoneDefinition = timeZoneDefinitionType;
             ProxyToEwsEventHandler.securityContextSerializer.Serialize(xmlWriter, securityContext);
             ProxyToEwsEventHandler.ewsVersionSerializer.Serialize(xmlWriter, requestServerVersion);
             ProxyToEwsEventHandler.timeZoneContextSerializer.Serialize(xmlWriter, timeZoneContextType);
             xmlWriter.WriteEndElement();
             xmlWriter.Close();
             newContentLength = (int)((long)this.HttpContext.Request.ContentLength + streamWrapper.BufferStream.Position - this.HttpContext.Request.InputStream.Position);
             result           = streamWrapper.BufferStream.ToArray();
         }
     }
     return(result);
 }
        private IEnumerator <int> ProcessWebResponse(AsyncEnumerator ae, HttpWebResponse webResponse)
        {
            PerformanceCounterManager.AddEwsRequestResult(this.IsOkToProcess(webResponse));
            this.HttpContext.Response.ContentType = webResponse.ContentType;
            using (Stream responseInStream = webResponse.GetResponseStream())
            {
                AsyncResult asyncResult = ae.AddAsyncEnumerator((AsyncEnumerator ae1) => ProxyToEwsEventHandler.CopyStream(ae1, responseInStream, this.HttpContext.Response.OutputStream));
                yield return(1);

                asyncResult.End();
            }
            ae.End();
            yield break;
        }
        private IEnumerator <int> ProcessProxyRequest(AsyncEnumerator ae)
        {
            ExTraceGlobals.ProxyCallTracer.TraceDebug((long)this.GetHashCode(), "ProxyEventHandler.SendProxyRequest");
            base.DontWriteHeaders = true;
            int newContentLength = 0;

            byte[]         soapHeaderStuff      = this.GetRequestSoapHeader(out newContentLength);
            HttpWebRequest webRequest           = this.GetProxyRequest(newContentLength);
            WindowsImpersonationContext context = NetworkServiceImpersonator.Impersonate();

            try
            {
                ae.AddAsync <IAsyncResult>(webRequest.BeginGetRequestStream(ae.GetAsyncCallback(), null));
            }
            catch
            {
                context.Undo();
                context = null;
                throw;
            }
            finally
            {
                if (context != null)
                {
                    context.Undo();
                    context = null;
                }
            }
            yield return(1);

            Stream outStream = this.DoWebAction <Stream>(() => webRequest.EndGetRequestStream(ae.CompletedAsyncResults[0]));

            if (outStream == null)
            {
                ae.End();
            }
            else
            {
                using (outStream)
                {
                    ae.AddAsync <IAsyncResult>(outStream.BeginWrite(soapHeaderStuff, 0, soapHeaderStuff.Length, ae.GetAsyncCallback(), null));
                    yield return(1);

                    outStream.EndWrite(ae.CompletedAsyncResults[0]);
                    AsyncResult asyncResult = ae.AddAsyncEnumerator((AsyncEnumerator ae1) => ProxyToEwsEventHandler.CopyStream(ae1, this.HttpContext.Request.InputStream, outStream));
                    yield return(1);

                    asyncResult.End();
                }
                ae.AddAsync <IAsyncResult>(webRequest.BeginGetResponse(ae.GetAsyncCallback(), null));
                yield return(1);

                HttpWebResponse webResponse = this.DoWebAction <HttpWebResponse>(() => (HttpWebResponse)webRequest.EndGetResponse(ae.CompletedAsyncResults[0]));
                if (webResponse != null)
                {
                    using (webResponse)
                    {
                        ae.AddAsyncEnumerator((AsyncEnumerator ae1) => this.ProcessWebResponse(ae1, webResponse));
                        yield return(1);
                    }
                }
                ae.End();
            }
            yield break;
        }