2009-06-30 Zoltan Varga <vargaz@gmail.com>
[mono.git] / mcs / class / corlib / System.Security / SecurityElement.cs
old mode 100755 (executable)
new mode 100644 (file)
index 28a49a1..7fd209b
@@ -7,7 +7,7 @@
 //     Sebastien Pouliot  <sebastien@ximian.com>
 //
 // (C) Ximian, Inc. http://www.ximian.com
-// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
+// Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
 
 using System.Globalization;
 using System.Collections;
+using System.Runtime.InteropServices;
 using System.Text;
 
 using Mono.Xml;
 
-namespace System.Security 
-{
+namespace System.Security {
+
+#if NET_2_0
+       [ComVisible (true)]
+#endif
        [Serializable]
        public sealed class SecurityElement 
        {
@@ -54,7 +58,7 @@ namespace System.Security
                                        throw new ArgumentException (Locale.GetText ("Invalid XML attribute value") + ": " + value);
 
                                _name = name;
-                               _value = value;
+                               _value = SecurityElement.Unescape (value);
                        }
 
                        public string Name {
@@ -91,8 +95,13 @@ namespace System.Security
                
                public SecurityElement (string tag, string text)
                {
-                       this.Tag = tag;
-                       this.Text = text;
+                       if (tag == null)
+                               throw new ArgumentNullException ("tag");
+                       if (!IsValidTag (tag))
+                               throw new ArgumentException (Locale.GetText ("Invalid XML string") + ": " + tag);
+                       this.tag = tag;
+
+                       Text = text;
                }
 
                // not a deep copy (childs are references)
@@ -125,7 +134,7 @@ namespace System.Security
                                return result;
                        }
 
-                       set {                           
+                       set {
                                if (value == null || value.Count == 0) {
                                        attributes.Clear ();
                                        return;
@@ -166,11 +175,10 @@ namespace System.Security
                        }
                        set {
                                if (value == null)
-                                       throw new ArgumentNullException ();
+                                       throw new ArgumentNullException ("Tag");
                                if (!IsValidTag (value))
                                        throw new ArgumentException (Locale.GetText ("Invalid XML string") + ": " + value);
-                               int colon = value.IndexOf (':');
-                               tag = colon < 0 ? value : value.Substring (colon + 1);
+                               tag = value;
                        }
                }
 
@@ -180,9 +188,13 @@ namespace System.Security
                        }
 
                        set {
-                               if (!IsValidText (value))
-                                       throw new ArgumentException (Locale.GetText ("Invalid XML string") + ": " + text);                              
-                               text = value;
+                               if (value != null) {
+                                       if (!IsValidText (value))
+                                               throw new ArgumentException (
+                                                       Locale.GetText ("Invalid XML string")
+                                                       + ": " + value);
+                               }
+                               text = Unescape (value);
                        }
                }
 
@@ -221,6 +233,7 @@ namespace System.Security
                }
 
 #if NET_2_0
+               [ComVisible (false)]
                public SecurityElement Copy ()
                {
                        return new SecurityElement (this);
@@ -277,7 +290,10 @@ namespace System.Security
                public static string Escape (string str)
                {
                        StringBuilder sb;
-                       
+
+                       if (str == null)
+                               return null;
+
                        if (str.IndexOfAny (invalid_chars) == -1)
                                return str;
 
@@ -300,8 +316,24 @@ namespace System.Security
                        return sb.ToString ();
                }
 
+               private static string Unescape (string str)
+               {
+                       StringBuilder sb;
+
+                       if (str == null)
+                               return null;
+
+                       sb = new StringBuilder (str);
+                       sb.Replace ("&lt;", "<");
+                       sb.Replace ("&gt;", ">");
+                       sb.Replace ("&amp;", "&");
+                       sb.Replace ("&quot;", "\"");
+                       sb.Replace ("&apos;", "'");
+                       return sb.ToString ();
+               }
+
 #if NET_2_0
-               public 
+               public
 #else
                internal
 #endif
@@ -309,13 +341,14 @@ namespace System.Security
                {
                        if (xml == null)
                                throw new ArgumentNullException ("xml");
+                       if (xml.Length == 0)
+                               throw new XmlSyntaxException (Locale.GetText ("Empty string."));
 
                        try {
                                SecurityParser sp = new SecurityParser ();
                                sp.LoadXml (xml);
                                return sp.ToXml ();
-                       }
-                       catch (Exception e) {
+                       } catch (Exception e) {
                                string msg = Locale.GetText ("Invalid XML.");
                                throw new XmlSyntaxException (msg, e);
                        }
@@ -331,16 +364,14 @@ namespace System.Security
                        return value != null && value.IndexOfAny (invalid_attr_value_chars) == -1;
                }
 
-               public static bool IsValidTag (string value)
+               public static bool IsValidTag (string tag)
                {
-                       return value != null && value.IndexOfAny (invalid_tag_chars) == -1;
+                       return tag != null && tag.IndexOfAny (invalid_tag_chars) == -1;
                }
 
-               public static bool IsValidText (string value)
+               public static bool IsValidText (string text)
                {
-                       if (value == null)
-                               return true;
-                       return value.IndexOfAny (invalid_text_chars) == -1;
+                       return text != null && text.IndexOfAny (invalid_text_chars) == -1;
                }
 
                public SecurityElement SearchForChildByTag (string tag) 
@@ -357,7 +388,7 @@ namespace System.Security
                                        return elem;
                        }
                        return null;
-               }                       
+               }
 
                public string SearchForTextOfTag (string tag) 
                {
@@ -376,7 +407,7 @@ namespace System.Security
                                        return result;
                        }
 
-                       return null;                    
+                       return null;
                }
                
                public override string ToString ()
@@ -388,20 +419,27 @@ namespace System.Security
                
                private void ToXml (ref StringBuilder s, int level)
                {
+#if ! NET_2_0
                        s.Append (' ', level * 3);
+#endif
                        s.Append ("<");
                        s.Append (tag);
                        
                        if (attributes != null) {
+#if NET_2_0
+                               s.Append (" ");
+#endif
                                for (int i=0; i < attributes.Count; i++) {
                                        SecurityAttribute sa = (SecurityAttribute) attributes [i];
+#if ! NET_2_0
                                        s.Append (" ");
                                        // all other attributes must align with the first one
                                        if (i != 0)
                                                s.Append (' ', (level * 3) + tag.Length + 1);
+#endif
                                        s.Append (sa.Name)
                                         .Append ("=\"")
-                                        .Append (sa.Value)
+                                        .Append (Escape (sa.Value))
                                         .Append ("\"");
                                        if (i != attributes.Count - 1)
                                                s.Append (Environment.NewLine);
@@ -412,13 +450,15 @@ namespace System.Security
                            (children == null || children.Count == 0))
                                s.Append ("/>").Append (Environment.NewLine);
                        else {
-                               s.Append (">").Append (text);
+                               s.Append (">").Append (Escape (text));
                                if (children != null) {
                                        s.Append (Environment.NewLine);
                                        foreach (SecurityElement child in children) {
                                                child.ToXml (ref s, level + 1);
                                        }
+#if ! NET_2_0
                                        s.Append (' ', level * 3);
+#endif
                                }
                                s.Append ("</")
                                 .Append (tag)