[corlib] Fixes security tests failures
[mono.git] / mcs / class / System.Security / System.Security.Cryptography.Xml / XmlDsigXsltTransform.cs
index eea892a045f4404aeb445fc2c25a4e345daa3ea4..d039bf16730b0ec0dfde53f6aeb7d047353e9c5e 100644 (file)
@@ -5,56 +5,76 @@
 //
 // Author:
 //     Sebastien Pouliot (spouliot@motus.com)
+//     Atsushi Enomoto (atsushi@ximian.com)
 //
 // (C) 2002, 2003 Motus Technologies Inc. (http://www.motus.com)
+// (C) 2004 Novell Inc.
+//
+
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
 using System.IO;
 using System.Xml;
 using System.Xml.Xsl;
 
-namespace System.Security.Cryptography.Xml { 
+namespace System.Security.Cryptography.Xml 
+{
 
-       [MonoTODO]
-       public class XmlDsigXsltTransform : Transform {
+       public class XmlDsigXsltTransform : Transform 
+       {
 
-               private Type[] input;
-               private Type[] output;
+               private Type [] input;
+               private Type [] output;
                private bool comments;
                private XmlNodeList xnl;
-               private CryptoStream cs;
+               private XmlDocument inputDoc;
 
-               public XmlDsigXsltTransform () : this (false) {}
+               public XmlDsigXsltTransform () : this (false)
+               {
+               }
 
                public XmlDsigXsltTransform (bool includeComments) 
                {
                        comments = includeComments;
-                       Algorithm = "http://www.w3.org/TR/1999/REC-xslt-19991116";
+                       Algorithm = XmlSignature.AlgorithmNamespaces.XmlDsigXsltTransform;
                }
 
-               public override Type[] InputTypes {
+               public override Type [] InputTypes {
                        get {
                                if (input == null) {
-                                       lock (this) {
-                                               // this way the result is cached if called multiple time
-                                               input = new Type [3];
-                                               input[0] = typeof (System.IO.Stream);
-                                               input[1] = typeof (System.Xml.XmlDocument);
-                                               input[2] = typeof (System.Xml.XmlNodeList);
-                                       }
+                                       input = new Type [3];
+                                       input [0] = typeof (System.IO.Stream);
+                                       input [1] = typeof (System.Xml.XmlDocument);
+                                       input [2] = typeof (System.Xml.XmlNodeList);
                                }
                                return input;
                        }
                }
 
-               public override Type[] OutputTypes {
+               public override Type [] OutputTypes {
                        get {
                                if (output == null) {
-                                       lock (this) {
-                                               // this way the result is cached if called multiple time
-                                               output = new Type [1];
-                                               output[0] = typeof (System.IO.Stream);
-                                       }
+                                       output = new Type [1];
+                                       output [0] = typeof (System.IO.Stream);
                                }
                                return output;
                        }
@@ -65,15 +85,35 @@ namespace System.Security.Cryptography.Xml {
                        return xnl;
                }
 
-               [MonoTODO("Missing some action - see InvalidXslt test")]
                public override object GetOutput () 
                {
-                       return (object) cs;
+                       if (xnl == null)
+                               throw new ArgumentNullException ("LoadInnerXml before transformation.");
+
+                       XmlResolver resolver = GetResolver ();
+
+                       XslTransform xsl = new XslTransform ();
+                       XmlDocument doc = new XmlDocument ();
+                       doc.XmlResolver = resolver;
+                       foreach (XmlNode n in xnl)
+                               doc.AppendChild (doc.ImportNode (n, true));
+                       xsl.Load (doc, resolver);
+
+                       if (inputDoc == null)
+                               throw new ArgumentNullException ("LoadInput before transformation.");
+
+                       MemoryStream stream = new MemoryStream ();
+                       // only possible output: Stream
+                       xsl.XmlResolver = resolver;
+                       xsl.Transform (inputDoc, null, stream);
+
+                       stream.Seek (0, SeekOrigin.Begin);
+                       return stream;
                }
 
                public override object GetOutput (Type type) 
                {
-                       if (type != Type.GetType ("System.IO.Stream"))
+                       if (type != typeof (Stream))
                                throw new ArgumentException ("type");
                        return GetOutput ();
                }
@@ -85,37 +125,31 @@ namespace System.Security.Cryptography.Xml {
                        xnl = nodeList;
                }
 
-               [MonoTODO()]
                public override void LoadInput (object obj) 
                {
-                       XslTransform xsl = new XslTransform ();
-                       XmlDocument doc = new XmlDocument ();
-                       doc.XmlResolver = GetResolver ();
-                       Stream stream = null;
-
                        // possible input: Stream, XmlDocument, and XmlNodeList
-                       if (obj is Stream) {
-                               doc.Load (obj as Stream);
-                               xsl.Load (doc);
-                       }
-                       else if (obj is XmlDocument) {
-                               xsl.Load (obj as XmlDocument);
-                       }
-                       else if (obj is XmlNodeList) {
-                               // Is it valid operation?
+                       Stream s = (obj as Stream);
+                       if (s != null) {
+                               inputDoc = new XmlDocument ();
+                               inputDoc.XmlResolver = GetResolver ();
+//                             inputDoc.Load (obj as Stream);
+                               inputDoc.Load (new XmlSignatureStreamReader (new StreamReader (s)));
+                               return;
                        }
 
-                       if (xnl != null) {
-                               stream = new MemoryStream ();
-                               // only possible output: Stream
-                               xsl.Transform (doc, null, stream);
+                       XmlDocument xd = (obj as XmlDocument);
+                       if (xd != null) {
+                               inputDoc = xd;
+                               return;
                        }
 
-                       if (stream != null)
-                               cs = new CryptoStream (stream, new FromBase64Transform (), CryptoStreamMode.Read);
-                       else
-                               cs = null;
-                       // note: there is no default are other types won't throw an exception
+                       XmlNodeList nl = (obj as XmlNodeList);
+                       if (nl != null) {
+                               inputDoc = new XmlDocument ();
+                               inputDoc.XmlResolver = GetResolver ();
+                               for (int i = 0; i < nl.Count; i++)
+                                       inputDoc.AppendChild (inputDoc.ImportNode (nl [i], true));
+                       }
                }
        }
 }