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; }