2004-08-17 Sebastien Pouliot <sebastien@ximian.com>
authorSebastien Pouliot <sebastien@ximian.com>
Tue, 17 Aug 2004 11:39:46 +0000 (11:39 -0000)
committerSebastien Pouliot <sebastien@ximian.com>
Tue, 17 Aug 2004 11:39:46 +0000 (11:39 -0000)
* IBuiltInPermission.cs: Added a new internal enum to store the index
of all corlib's permissions (as the index can changes in newer
versions of the framework, e.g. 2.0).
* SecurityAttribute.cs: Removed the validation when setting the Action
property to match MS implementation.
* UIPermission.cs: Update to use the common template. Completed TODOs
and now pass all unit tests.

svn path=/trunk/mcs/; revision=32425

mcs/class/corlib/System.Security.Permissions/ChangeLog
mcs/class/corlib/System.Security.Permissions/IBuiltInPermission.cs
mcs/class/corlib/System.Security.Permissions/SecurityAttribute.cs
mcs/class/corlib/System.Security.Permissions/UIPermission.cs

index 205de4d9c38c0e4ca3539bde9a46d4917cdadeaf..108ff9dafe23e1cd8efd928f75883c99111d85b9 100644 (file)
@@ -1,3 +1,13 @@
+2004-08-17  Sebastien Pouliot  <sebastien@ximian.com>
+
+       * IBuiltInPermission.cs: Added a new internal enum to store the index
+       of all corlib's permissions (as the index can changes in newer 
+       versions of the framework, e.g. 2.0).
+       * SecurityAttribute.cs: Removed the validation when setting the Action
+       property to match MS implementation.
+       * UIPermission.cs: Update to use the common template. Completed TODOs
+       and now pass all unit tests.
+
 2004-08-05  Sebastien Pouliot  <sebastien@ximian.com>
 
        * PrincipalPermission.cs: Added Equals/GetHashCode for NET_2_0.
index b80e25361de7cabeb264e0e03aa89d1ea81ccbde..f9f19a97e8684a688e0b23f7c5af2e8cb4052a4d 100755 (executable)
@@ -2,12 +2,9 @@
 // System.Security.Permissions.IBuiltInPermission.cs
 //
 // Author:
-//     Sebastien Pouliot <spouliot@motus.com>
+//     Sebastien Pouliot  <sebastien@ximian.com>
 //
 // Copyright (C) 2003 Motus Technologies (http://www.motus.com)
-//
-
-//
 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
@@ -36,4 +33,54 @@ namespace System.Security.Permissions {
        internal interface IBuiltInPermission {
                int GetTokenIndex ();
        }
+
+       // 1_1  2_0     Name
+       // 0    0       EnvironmentPermission
+       // 1    1       FileDialogPermission
+       // 2    2       FileIOPermission
+       // 3    3       IsolatedStorageFilePermission
+       // 4    4       ReflectionPermission
+       // 5    5       RegistryPermission
+       // 6    6       SecurityPermission
+       // 7    7       UIPermission
+       // 8    8       PrincipalPermission
+       // N/A  9       HostProtectionPermission (internal)
+       // 9    10      PublisherIdentityPermission
+       // 10   11      SiteIdentityPermission
+       // 11   12      StrongNameIdentityPermission
+       // 12   13      UrlIdentityPermission
+       // 13   14      ZoneIdentityPermission
+       // N/A  15      ???
+       // N/A  16      GacIdentityPermission
+       // N/A  17      KeyContainerPermission
+       // N/A  18      DataProtectionPermission
+
+       internal enum BuiltInToken {
+               Environment = 0,
+               FileDialog = 1,
+               FileIO = 2,
+               IsolatedStorageFile = 3,
+               Reflection = 4,
+               Registry = 5,
+               Security = 6,
+               UI = 7,
+               Principal = 8,
+#if !NET_2_0
+               PublisherIdentity = 9,
+               SiteIdentity = 10,
+               StrongNameIdentity = 11,
+               UrlIdentity = 12,
+               ZoneIdentity = 13,
+#else
+               HostProtection = 9,
+               PublisherIdentity = 10,
+               SiteIdentity = 11,
+               StrongNameIdentity = 12,
+               UrlIdentity = 13,
+               ZoneIdentity = 14,
+               GacIdentity = 16,
+               KeyContainer = 17,
+               DataProtection = 18,
+#endif
+       }
 }
index 01a8a0ebf8c01cde8d83ec4f1d0f34ba4028dfb3..d8f4492cc6788dc73a602368f8beb9cb0d3bae22 100644 (file)
@@ -32,9 +32,6 @@
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
-using System;
-using System.Security;
-
 namespace System.Security.Permissions {
        [System.AttributeUsage(
                System.AttributeTargets.Assembly 
@@ -73,11 +70,8 @@ namespace System.Security.Permissions {
                                return m_Action;
                        }
                        set {
-                               if (!SecurityAction.IsDefined(typeof(SecurityAction), value)) {
-                                       throw new System.ArgumentException();
-                               }
                                m_Action = value;
                        }
                }
-       } // public abstract class SecurityAttribute
-}  // namespace System.Security.Permissions
+       }
+}
index efb5f0ff98ce9335dd61cb88584672a8f24a3781..955ede71aedbc18a714961e81ce99da27205a6bb 100644 (file)
@@ -2,12 +2,9 @@
 // System.Security.Permissions.UIPermission.cs
 //
 // Author
-//     Sebastien Pouliot  <spouliot@motus.com>
+//     Sebastien Pouliot  <sebastien@ximian.com>
 //
 // Copyright (C) 2003 Motus Technologies. http://www.motus.com
-//
-
-//
 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
@@ -30,7 +27,6 @@
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
-using System;
 using System.Globalization;
 
 namespace System.Security.Permissions {
@@ -38,14 +34,16 @@ namespace System.Security.Permissions {
        [Serializable]
        public sealed class UIPermission : CodeAccessPermission, IUnrestrictedPermission, IBuiltInPermission {
 
-               private UIPermissionWindow _window;
-               private UIPermissionClipboard _clipboard;
+               private UIPermissionWindow _window;             // Note: this (looks like) but isn't a [Flags]
+               private UIPermissionClipboard _clipboard;       // Note: this (looks like) but isn't a [Flags]
+
+               private const int version = 1;
 
                // Constructors
 
                public UIPermission (PermissionState state) 
                {
-                       if (state == PermissionState.Unrestricted) {
+                       if (CheckPermissionState (state, true) == PermissionState.Unrestricted) {
                                _clipboard = UIPermissionClipboard.AllClipboard;
                                _window = UIPermissionWindow.AllWindows;
                        }
@@ -53,30 +51,45 @@ namespace System.Security.Permissions {
 
                public UIPermission (UIPermissionClipboard clipboardFlag) 
                {
-                       _clipboard = clipboardFlag;
+                       // reuse validation by the Clipboard property
+                       Clipboard = clipboardFlag;
                }
 
                public UIPermission (UIPermissionWindow windowFlag) 
                {
-                       _window = windowFlag;
+                       // reuse validation by the Window property
+                       Window = windowFlag;
                }
 
                public UIPermission (UIPermissionWindow windowFlag, UIPermissionClipboard clipboardFlag) 
                {
-                       _clipboard = clipboardFlag;
-                       _window = windowFlag;
+                       // reuse validation by the Clipboard and Window properties
+                       Clipboard = clipboardFlag;
+                       Window = windowFlag;
                }
 
                // Properties
 
                public UIPermissionClipboard Clipboard {
                        get { return _clipboard; }
-                       set { _clipboard = value; }
+                       set {
+                               if (!Enum.IsDefined (typeof (UIPermissionClipboard), value)) {
+                                       string msg = String.Format (Locale.GetText ("Invalid enum {0}"), value);
+                                       throw new ArgumentException (msg, "UIPermissionClipboard");
+                               }
+                               _clipboard = value;
+                       }
                }
 
                public UIPermissionWindow Window { 
                        get { return _window; }
-                       set { _window = value; }
+                       set {
+                               if (!Enum.IsDefined (typeof (UIPermissionWindow), value)) {
+                                       string msg = String.Format (Locale.GetText ("Invalid enum {0}"), value);
+                                       throw new ArgumentException (msg, "UIPermissionWindow");
+                               }
+                               _window = value;
+                       }
                }
 
                // Methods
@@ -88,46 +101,56 @@ namespace System.Security.Permissions {
 
                public override void FromXml (SecurityElement esd) 
                {
-                       if (esd == null)
-                               throw new ArgumentNullException (
-                                       Locale.GetText ("The argument is null."));
-                       
-                       if (esd.Attribute ("class") != GetType ().AssemblyQualifiedName)
-                               throw new ArgumentException (
-                                       Locale.GetText ("The argument is not valid"));
-
-                       if (esd.Attribute ("version") != "1")
-                               throw new ArgumentException (
-                                       Locale.GetText ("The argument is not valid"));
-                       
-                       if (esd.Attribute ("Unrestricted") == "true") {
+                       // General validation in CodeAccessPermission
+                       CheckSecurityElement (esd, "esd", version, version);
+                       // Note: we do not (yet) care about the return value 
+                       // as we only accept version 1 (min/max values)
+
+                       if (IsUnrestricted (esd)) {
                                _window = UIPermissionWindow.AllWindows;
                                _clipboard = UIPermissionClipboard.AllClipboard;
-
-                       // only 2 attributes: class and version
-                       } else if (esd.Attributes.Count == 2) {
-                               _window = UIPermissionWindow.NoWindows;
-                               _clipboard = UIPermissionClipboard.NoClipboard;
-
-                       } else {
-                               _window = (UIPermissionWindow) Enum.Parse (
-                                       typeof (UIPermissionWindow), esd.Attribute ("Window"));
-
-                               _clipboard = (UIPermissionClipboard) Enum.Parse (
-                                       typeof (UIPermissionClipboard), esd.Attribute ("Clipboard"));
+                       }
+                       else {
+                               string w = esd.Attribute ("Window");
+                               if (w == null)
+                                       _window = UIPermissionWindow.NoWindows;
+                               else
+                                       _window = (UIPermissionWindow) Enum.Parse (typeof (UIPermissionWindow), w);
+
+                               string c = esd.Attribute ("Clipboard");
+                               if (c == null)
+                                       _clipboard = UIPermissionClipboard.NoClipboard;
+                               else
+                                       _clipboard = (UIPermissionClipboard) Enum.Parse (typeof (UIPermissionClipboard), c);
                        }
                }
 
-               [MonoTODO]
                public override IPermission Intersect (IPermission target) 
                {
-                       return null;
+                       UIPermission uip = Cast (target);
+                       if (uip == null)
+                               return null;
+
+                       // there are not [Flags] so we can't use boolean operators
+                       UIPermissionWindow w = ((_window < uip._window) ? _window : uip._window);
+                       UIPermissionClipboard c = ((_clipboard < uip._clipboard) ? _clipboard : uip._clipboard);
+
+                       if (IsEmpty (w, c))
+                               return null;
+
+                       return new UIPermission (w, c);
                }
 
-               [MonoTODO]
                public override bool IsSubsetOf (IPermission target) 
                {
-                       return false;
+                       UIPermission uip = Cast (target);
+                       if (uip == null)
+                               return IsEmpty (_window, _clipboard);
+                       if (uip.IsUnrestricted ())
+                               return true;
+
+                       // there are not [Flags] so we can't use boolean operators
+                       return ((_window <= uip._window) && (_clipboard <= uip._clipboard));
                }
 
                public bool IsUnrestricted () 
@@ -138,37 +161,61 @@ namespace System.Security.Permissions {
 
                public override SecurityElement ToXml () 
                {
-                       SecurityElement e = new SecurityElement ("IPermission");
-                       e.AddAttribute ("class", GetType ().AssemblyQualifiedName);
-                       e.AddAttribute ("version", "1");
-
-                       if (_window == UIPermissionWindow.NoWindows && _clipboard == UIPermissionClipboard.NoClipboard)
-                               return e;
+                       SecurityElement e = Element (version);
 
                        if (_window == UIPermissionWindow.AllWindows && _clipboard == UIPermissionClipboard.AllClipboard) {
                                e.AddAttribute ("Unrestricted", "true");
-                               return e;
                        }
+                       else {
+                               if (_window != UIPermissionWindow.NoWindows)
+                                       e.AddAttribute ("Window", _window.ToString ());
 
-                       if (_window != UIPermissionWindow.NoWindows)
-                               e.AddAttribute ("Window", _window.ToString ());
-
-                       if (_clipboard != UIPermissionClipboard.NoClipboard)
-                               e.AddAttribute ("Clipboard", _clipboard.ToString ());
-
+                               if (_clipboard != UIPermissionClipboard.NoClipboard)
+                                       e.AddAttribute ("Clipboard", _clipboard.ToString ());
+                       }
                        return e;
                }
 
-               [MonoTODO]
                public override IPermission Union (IPermission target)
                {
-                       return null;
+                       UIPermission uip = Cast (target);
+                       if (uip == null)
+                               return Copy ();
+
+                       // there are not [Flags] so we can't use boolean operators
+                       UIPermissionWindow w = ((_window > uip._window) ? _window : uip._window);
+                       UIPermissionClipboard c = ((_clipboard > uip._clipboard) ? _clipboard : uip._clipboard);
+
+                       if (IsEmpty (w, c))
+                               return null;
+
+                       return new UIPermission (w, c);
                }
 
                // IBuiltInPermission
                int IBuiltInPermission.GetTokenIndex ()
                {
-                       return 7;
+                       return (int) BuiltInToken.UI;
+               }
+
+               // helpers
+
+               private bool IsEmpty (UIPermissionWindow w, UIPermissionClipboard c)
+               {
+                       return ((w == UIPermissionWindow.NoWindows) && (c == UIPermissionClipboard.NoClipboard));
+               }
+
+               private UIPermission Cast (IPermission target)
+               {
+                       if (target == null)
+                               return null;
+
+                       UIPermission uip = (target as UIPermission);
+                       if (uip == null) {
+                               ThrowInvalidPermission (target, typeof (UIPermission));
+                       }
+
+                       return uip;
                }
        }
 }