//
// Authors:
// Gonzalo Paniagua Javier (gonzalo@ximian.com)
+// Sebastien Pouliot <sebastien@ximian.com>
//
// (C) 2002 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
// 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;
-using System.Security;
+
+using System.Globalization;
+using System.Runtime.InteropServices;
namespace System.Security.Permissions {
+ [ComVisible (true)]
[Serializable]
public sealed class ZoneIdentityPermission : CodeAccessPermission, IBuiltInPermission {
- SecurityZone zone;
+ private const int version = 1;
+
+ private SecurityZone zone;
public ZoneIdentityPermission (PermissionState state)
{
- if (state == PermissionState.Unrestricted)
- throw new ArgumentException ("unrestricted not allowed");
-
- if (state != PermissionState.None)
- throw new ArgumentException ("invalid state");
-
+ // false == do not allow Unrestricted for Identity Permissions
+ CheckPermissionState (state, false);
+ // default values
zone = SecurityZone.NoZone;
}
public ZoneIdentityPermission (SecurityZone zone)
{
- this.zone = zone;
+ // also needs the validations
+ SecurityZone = zone;
}
public override IPermission Copy ()
public override bool IsSubsetOf (IPermission target)
{
- if (target == null)
- return zone == SecurityZone.NoZone;
-
- if (!(target is ZoneIdentityPermission))
- throw new ArgumentException ();
+ ZoneIdentityPermission zip = Cast (target);
+ if (zip == null)
+ return (zone == SecurityZone.NoZone);
- return zone != ((ZoneIdentityPermission) target).zone;
+ return ((zone == SecurityZone.NoZone) || (zone == zip.zone));
}
public override IPermission Union (IPermission target)
{
- if (target == null)
+ ZoneIdentityPermission zip = Cast (target);
+ if (zip == null)
return (zone == SecurityZone.NoZone) ? null : Copy ();
- if (!(target is ZoneIdentityPermission))
- throw new ArgumentException ();
-
- ZoneIdentityPermission se = (ZoneIdentityPermission) target;
- if (zone == se.zone || se.zone == SecurityZone.NoZone)
+ if (zone == zip.zone || zip.zone == SecurityZone.NoZone)
return Copy ();
if (zone == SecurityZone.NoZone)
- return se.Copy ();
-
- return null;
+ return zip.Copy ();
+ throw new ArgumentException (Locale.GetText (
+ "Union impossible"));
}
public override IPermission Intersect (IPermission target)
{
- if (target == null || zone == SecurityZone.NoZone)
+ ZoneIdentityPermission zip = Cast (target);
+ if (zip == null || zone == SecurityZone.NoZone)
return null;
- if (!(target is ZoneIdentityPermission))
- throw new ArgumentException ();
-
- if (zone == ((ZoneIdentityPermission) target).zone)
+ if (zone == zip.zone)
return Copy ();
return null;
public override void FromXml (SecurityElement esd)
{
- if (esd == null)
- throw new ArgumentException ("esd is null");
+ // 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 (esd.Attribute ("version") != "1")
- throw new ArgumentException ("version attributte is wrong");
-
string zoneName = esd.Attribute ("Zone");
- zone = (SecurityZone) Enum.Parse (typeof (SecurityZone), zoneName);
+ if (zoneName == null)
+ zone = SecurityZone.NoZone;
+ else
+ zone = (SecurityZone) Enum.Parse (typeof (SecurityZone), zoneName);
}
public override SecurityElement ToXml ()
{
- SecurityElement se = new SecurityElement ("IPermission");
- Type t = GetType ();
- se.AddAttribute ("class", t.FullName + ", " + t.Module.Assembly.FullName);
- se.AddAttribute ("version", "1");
- se.AddAttribute ("Zone", zone.ToString ());
-
+ SecurityElement se = Element (version);
+ if (zone != SecurityZone.NoZone)
+ se.AddAttribute ("Zone", zone.ToString ());
return se;
}
- public SecurityZone SecurityZone
- {
- get {
- return zone;
- }
-
+ public SecurityZone SecurityZone {
+ get { return zone; }
set {
- if (!Enum.IsDefined (typeof (SecurityZone), value))
- throw new ArgumentException ("invalid zone");
+ if (!Enum.IsDefined (typeof (SecurityZone), value)) {
+ string msg = String.Format (Locale.GetText ("Invalid enum {0}"), value);
+ throw new ArgumentException (msg, "SecurityZone");
+ }
zone = value;
}
}
// IBuiltInPermission
int IBuiltInPermission.GetTokenIndex ()
{
- return 13;
+ return (int) BuiltInToken.ZoneIdentity;
+ }
+
+ // helpers
+
+ private ZoneIdentityPermission Cast (IPermission target)
+ {
+ if (target == null)
+ return null;
+
+ ZoneIdentityPermission zip = (target as ZoneIdentityPermission);
+ if (zip == null) {
+ ThrowInvalidPermission (target, typeof (ZoneIdentityPermission));
+ }
+
+ return zip;
}
}
}