Beispiel #1
0
        public void AfterSerialize(SoapMessage message)         //StreamOut
        {
            newStream.Position = 0;
            //Hack MemoryStream below because of XmlDocument bug closing stream
            byte []      tempBa    = new byte[newStream.Length];
            int          bytesRead = newStream.Read(tempBa, 0, (int)newStream.Length);
            MemoryStream ms        = new MemoryStream(tempBa);
            //BUG NOTE this closes the underlying stream on .NETcf
            XmlDocument xd = new XmlDocument();

            xd.Load(ms);             //MemoryStream will be closed now

            //OUTGOING

            //timestamp and routing
            SecConvHandler.TokenIssuerOut(xd);     //have to do body before signing
            HeadersHandler.AddHeaders(xd, message.Action, message.Url);
            XmlSigHandler.SignXml(xd);             //1st ... sign what you see
            XmlEncHandler.EncryptXml(xd);
            //SecConvHandler.ConversationOut(xd);
            //Trace

            //custom filters
            //should these happen before or after - BOTH!
            //should handle priorities of filters
            foreach (object oSof in OutputFilters)
            {
                SoapOutputFilter sof = (SoapOutputFilter)oSof;
                SoapEnvelope     se  = new SoapEnvelope();
                se.LoadXml(xd.OuterXml);
                se.Context = RequestSoapContext;
                sof.ProcessMessage(se);
                xd.LoadXml(se.OuterXml);                 //not performant
            }
            RequestSoapContext.Clear();
            OutputFilters.Clear();

            newStream.Position = 0;
            XmlTextWriter xtw = new XmlTextWriter(newStream, System.Text.Encoding.UTF8);

            xtw.Namespaces = true;
            xd.WriteTo(xtw);
            xtw.Flush();
            //xtw.Close();

            //these 2 lines have be called at a minimum
            newStream.Position = 0;
            Copy(newStream, oldStream);             //for next guy
            return;
        }
Beispiel #2
0
 //protected virtual bool CanProcessHeader(XmlElement header, SoapContext context);
 public abstract void ProcessMessage(SoapEnvelope envelope);
		//protected virtual bool CanProcessHeader(XmlElement header, SoapContext context);
		public abstract void ProcessMessage(SoapEnvelope envelope); 
		/*
		ChainStream
		BeforeSerial
		AfterSerial
		ChainStream
		BeforeDeserial
		AfterDeserial
		*/

		public void BeforeDeserialize(SoapMessage message) //StreamIn
		{
			Copy(oldStream, newStream);
			newStream.Position = 0;
			
			//Hack MemoryStream below because of XmlDocument bug closing stream
			byte [] tempBa = new byte[newStream.Length];
			int bytesRead = newStream.Read(tempBa, 0, (int) newStream.Length);
			MemoryStream ms = new MemoryStream(tempBa);
			//BUG NOTE this closes the underlying stream on .NETcf
			XmlDocument xd = new XmlDocument();
			xd.Load(ms); //MemoryStream will be closed now
			
			//INCOMING

			int xmlSigCnt = 0;
			XmlElement xmlSigElem = LameXpath.SelectSingleNode(xd, Elem.Signature, null, ref xmlSigCnt);
			int xmlEncCnt = 0;
			XmlElement xmlEncElem = LameXpath.SelectSingleNode(xd, Elem.EncryptedKey, null, ref xmlEncCnt);
			int xmlEncCnt2 = 0;
			XmlElement xmlEncElem2 = LameXpath.SelectSingleNode(xd, Elem.ReferenceList, null, ref xmlEncCnt2);
			//TODO make sure not 0
			xmlEncCnt = Math.Min(xmlEncCnt, xmlEncCnt2);

			if(xmlSigElem != null && (xmlEncElem != null || xmlEncElem2 != null))
			{
				if(xmlSigCnt <= xmlEncCnt)
				{
					//Signature then Encryption means encrypt 1st (Release)
					XmlSigHandler.VerifySig(xd);
					xd = XmlEncHandler.DecryptXml(xd);
				}
				else
				{
					//Encryption then Signature means sign 1st (TechPreview) sign what you see
					xd = XmlEncHandler.DecryptXml(xd);
					XmlSigHandler.VerifySig(xd);
				}
				HeadersHandler.CheckHeaders(xd); 
			}
			else //default to 2.0 Release
			{
				//Trace
				XmlSigHandler.VerifySig(xd); //used to be after for TP
				xd = XmlEncHandler.DecryptXml(xd);
				HeadersHandler.CheckHeaders(xd); 
				//timestamp and routing
			}

			//custom filters
			foreach(object oSif in InputFilters)
			{
				SoapInputFilter sif = (SoapInputFilter) oSif;
				SoapEnvelope se = new SoapEnvelope();
				se.LoadXml(xd.OuterXml);
				se.Context = ResponseSoapContext;
				sif.ProcessMessage(se);
				xd.LoadXml(se.OuterXml); //not performant
			}
			ResponseSoapContext.Clear();
			InputFilters.Clear();

			//newStream is too big now
			newStream.SetLength(0); //doing a new MemoryStream here was bad
			XmlTextWriter xtw = new XmlTextWriter(newStream, System.Text.Encoding.UTF8);
			xtw.Namespaces = true;
			xd.WriteTo(xtw);
			xtw.Flush();
			//xtw.Close();
			newStream.Position = 0;
			return;
		}
		public void AfterSerialize(SoapMessage message) //StreamOut
		{
			newStream.Position = 0;
			//Hack MemoryStream below because of XmlDocument bug closing stream
			byte [] tempBa = new byte[newStream.Length];
			int bytesRead = newStream.Read(tempBa, 0, (int) newStream.Length);
			MemoryStream ms = new MemoryStream(tempBa);
			//BUG NOTE this closes the underlying stream on .NETcf
			XmlDocument xd = new XmlDocument();
			xd.Load(ms); //MemoryStream will be closed now
			
			//OUTGOING
			
			//timestamp and routing
			SecConvHandler.TokenIssuerOut(xd); //have to do body before signing
			HeadersHandler.AddHeaders(xd, message.Action, message.Url); 
			XmlSigHandler.SignXml(xd); //1st ... sign what you see
			XmlEncHandler.EncryptXml(xd);
			//SecConvHandler.ConversationOut(xd);
			//Trace

			//custom filters
			//should these happen before or after - BOTH!
			//should handle priorities of filters
			foreach(object oSof in OutputFilters)
			{
				SoapOutputFilter sof = (SoapOutputFilter) oSof;
				SoapEnvelope se = new SoapEnvelope();
				se.LoadXml(xd.OuterXml);
				se.Context = RequestSoapContext;
				sof.ProcessMessage(se);
				xd.LoadXml(se.OuterXml); //not performant
			}
			RequestSoapContext.Clear();
			OutputFilters.Clear();
			
			newStream.Position = 0;
			XmlTextWriter xtw = new XmlTextWriter(newStream, System.Text.Encoding.UTF8);
			xtw.Namespaces = true;
			xd.WriteTo(xtw);
			xtw.Flush();
			//xtw.Close();

			//these 2 lines have be called at a minimum
			newStream.Position = 0;
			Copy(newStream, oldStream); //for next guy
			return;
		}
Beispiel #6
0
        /*
         * ChainStream
         * BeforeSerial
         * AfterSerial
         * ChainStream
         * BeforeDeserial
         * AfterDeserial
         */

        public void BeforeDeserialize(SoapMessage message)         //StreamIn
        {
            Copy(oldStream, newStream);
            newStream.Position = 0;

            //Hack MemoryStream below because of XmlDocument bug closing stream
            byte []      tempBa    = new byte[newStream.Length];
            int          bytesRead = newStream.Read(tempBa, 0, (int)newStream.Length);
            MemoryStream ms        = new MemoryStream(tempBa);
            //BUG NOTE this closes the underlying stream on .NETcf
            XmlDocument xd = new XmlDocument();

            xd.Load(ms);             //MemoryStream will be closed now

            //INCOMING

            int        xmlSigCnt   = 0;
            XmlElement xmlSigElem  = LameXpath.SelectSingleNode(xd, Elem.Signature, null, ref xmlSigCnt);
            int        xmlEncCnt   = 0;
            XmlElement xmlEncElem  = LameXpath.SelectSingleNode(xd, Elem.EncryptedKey, null, ref xmlEncCnt);
            int        xmlEncCnt2  = 0;
            XmlElement xmlEncElem2 = LameXpath.SelectSingleNode(xd, Elem.ReferenceList, null, ref xmlEncCnt2);

            //TODO make sure not 0
            xmlEncCnt = Math.Min(xmlEncCnt, xmlEncCnt2);

            if (xmlSigElem != null && (xmlEncElem != null || xmlEncElem2 != null))
            {
                if (xmlSigCnt <= xmlEncCnt)
                {
                    //Signature then Encryption means encrypt 1st (Release)
                    XmlSigHandler.VerifySig(xd);
                    xd = XmlEncHandler.DecryptXml(xd);
                }
                else
                {
                    //Encryption then Signature means sign 1st (TechPreview) sign what you see
                    xd = XmlEncHandler.DecryptXml(xd);
                    XmlSigHandler.VerifySig(xd);
                }
                HeadersHandler.CheckHeaders(xd);
            }
            else             //default to 2.0 Release
            {
                //Trace
                XmlSigHandler.VerifySig(xd);                 //used to be after for TP
                xd = XmlEncHandler.DecryptXml(xd);
                HeadersHandler.CheckHeaders(xd);
                //timestamp and routing
            }

            //custom filters
            foreach (object oSif in InputFilters)
            {
                SoapInputFilter sif = (SoapInputFilter)oSif;
                SoapEnvelope    se  = new SoapEnvelope();
                se.LoadXml(xd.OuterXml);
                se.Context = ResponseSoapContext;
                sif.ProcessMessage(se);
                xd.LoadXml(se.OuterXml);                 //not performant
            }
            ResponseSoapContext.Clear();
            InputFilters.Clear();

            //newStream is too big now
            newStream.SetLength(0);             //doing a new MemoryStream here was bad
            XmlTextWriter xtw = new XmlTextWriter(newStream, System.Text.Encoding.UTF8);

            xtw.Namespaces = true;
            xd.WriteTo(xtw);
            xtw.Flush();
            //xtw.Close();
            newStream.Position = 0;
            return;
        }