2 // PublisherIdentityPermission.cs: Publisher Identity Permission
5 // Sebastien Pouliot <sebastien@ximian.com>
7 // (C) 2002, 2003 Motus Technologies Inc. (http://www.motus.com)
8 // Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 using System
.Runtime
.InteropServices
;
31 using System
.Security
.Cryptography
.X509Certificates
;
33 using Mono
.Security
.Cryptography
;
35 namespace System
.Security
.Permissions
{
39 public sealed class PublisherIdentityPermission
: CodeAccessPermission
, IBuiltInPermission
{
41 private const int version
= 1;
43 private X509Certificate x509
;
45 public PublisherIdentityPermission (PermissionState state
)
47 // false == do not allow Unrestricted for Identity Permissions
48 CheckPermissionState (state
, false);
51 public PublisherIdentityPermission (X509Certificate certificate
)
53 // reuse validation by the Certificate property
54 Certificate
= certificate
;
57 public X509Certificate Certificate
{
61 throw new ArgumentNullException ("X509Certificate");
66 public override IPermission
Copy ()
68 PublisherIdentityPermission p
= new PublisherIdentityPermission (PermissionState
.None
);
74 public override void FromXml (SecurityElement esd
)
76 // General validation in CodeAccessPermission
77 CheckSecurityElement (esd
, "esd", version
, version
);
78 // Note: we do not (yet) care about the return value
79 // as we only accept version 1 (min/max values)
81 string cert
= (esd
.Attributes
["X509v3Certificate"] as string);
83 byte[] rawcert
= CryptoConvert
.FromHex (cert
);
84 x509
= new X509Certificate (rawcert
);
88 public override IPermission
Intersect (IPermission target
)
90 PublisherIdentityPermission pip
= Cast (target
);
94 if ((x509
!= null) && (pip
.x509
!= null)) {
95 if (x509
.GetRawCertDataString () == pip
.x509
.GetRawCertDataString ())
96 return new PublisherIdentityPermission (pip
.x509
);
101 public override bool IsSubsetOf (IPermission target
)
103 PublisherIdentityPermission pip
= Cast (target
);
109 if (pip
.x509
== null)
111 return (x509
.GetRawCertDataString () == pip
.x509
.GetRawCertDataString ());
114 public override SecurityElement
ToXml ()
116 SecurityElement se
= Element (version
);
118 se
.AddAttribute ("X509v3Certificate", x509
.GetRawCertDataString ());
122 public override IPermission
Union (IPermission target
)
124 PublisherIdentityPermission pip
= Cast (target
);
128 if ((x509
!= null) && (pip
.x509
!= null)) {
129 if (x509
.GetRawCertDataString () == pip
.x509
.GetRawCertDataString ())
130 return new PublisherIdentityPermission (x509
); // any cert would do
132 else if ((x509
== null) && (pip
.x509
!= null))
133 return new PublisherIdentityPermission (pip
.x509
);
134 else if ((x509
!= null) && (pip
.x509
== null))
135 return new PublisherIdentityPermission (x509
);
139 // IBuiltInPermission
140 int IBuiltInPermission
.GetTokenIndex ()
142 return (int) BuiltInToken
.PublisherIdentity
;
147 private PublisherIdentityPermission
Cast (IPermission target
)
152 PublisherIdentityPermission pip
= (target
as PublisherIdentityPermission
);
154 ThrowInvalidPermission (target
, typeof (PublisherIdentityPermission
));