// 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
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
+ }
}
// 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
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
-using System;
using System.Globalization;
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;
}
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
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 ()
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;
}
}
}