New test.
[mono.git] / mcs / class / corlib / System.Security.Permissions / PublisherIdentityPermission.cs
1 //
2 // PublisherIdentityPermission.cs: Publisher Identity Permission
3 //
4 // Author:
5 //      Sebastien Pouliot  <sebastien@ximian.com>
6 //
7 // (C) 2002, 2003 Motus Technologies Inc. (http://www.motus.com)
8 // Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
9 //
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:
17 // 
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
20 // 
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.
28 //
29
30 using System.Runtime.InteropServices;
31 using System.Security.Cryptography.X509Certificates;
32
33 using Mono.Security.Cryptography;
34
35 namespace System.Security.Permissions {
36
37 #if NET_2_0
38         [ComVisible (true)]
39 #endif
40         [Serializable]
41         public sealed class PublisherIdentityPermission : CodeAccessPermission, IBuiltInPermission {
42
43                 private const int version = 1;
44
45                 private X509Certificate x509;
46         
47                 public PublisherIdentityPermission (PermissionState state) 
48                 {
49                         // false == do not allow Unrestricted for Identity Permissions
50                         CheckPermissionState (state, false);
51                 }
52         
53                 public PublisherIdentityPermission (X509Certificate certificate) 
54                 {
55                         // reuse validation by the Certificate property
56                         Certificate = certificate;
57                 }
58         
59                 public X509Certificate Certificate { 
60                         get { return x509; }
61                         set { 
62                                 if (value == null)
63                                         throw new ArgumentNullException ("X509Certificate");
64                                 x509 = value; 
65                         }
66                 }
67         
68                 public override IPermission Copy () 
69                 {
70                         PublisherIdentityPermission p = new PublisherIdentityPermission (PermissionState.None);
71                         if (x509 != null)
72                                 p.Certificate = x509;
73                         return p;
74                 }
75
76                 public override void FromXml (SecurityElement esd) 
77                 {
78                         // General validation in CodeAccessPermission
79                         CheckSecurityElement (esd, "esd", version, version);
80                         // Note: we do not (yet) care about the return value 
81                         // as we only accept version 1 (min/max values)
82
83                         string cert = (esd.Attributes ["X509v3Certificate"] as string);
84                         if (cert != null) {
85                                 byte[] rawcert = CryptoConvert.FromHex (cert);
86                                 x509 = new X509Certificate (rawcert);
87                         }
88                 }
89         
90                 public override IPermission Intersect (IPermission target) 
91                 {
92                         PublisherIdentityPermission pip = Cast (target);
93                         if (pip == null)
94                                 return null;
95
96                         if ((x509 != null) && (pip.x509 != null)) {
97                                 if (x509.GetRawCertDataString () == pip.x509.GetRawCertDataString ())
98                                         return new PublisherIdentityPermission (pip.x509);
99                         }
100                         return null;
101                 }
102         
103                 public override bool IsSubsetOf (IPermission target) 
104                 {
105                         PublisherIdentityPermission pip = Cast (target);
106                         if (pip == null)
107                                 return false;
108
109                         if (x509 == null)
110                                 return true;
111                         if (pip.x509 == null)
112                                 return false;
113                         return (x509.GetRawCertDataString () == pip.x509.GetRawCertDataString ());
114                 }
115         
116                 public override SecurityElement ToXml () 
117                 {
118                         SecurityElement se = Element (version);
119                         if (x509 != null)
120                                 se.AddAttribute ("X509v3Certificate", x509.GetRawCertDataString ());
121                         return se;
122                 }
123         
124                 public override IPermission Union (IPermission target) 
125                 {
126                         PublisherIdentityPermission pip = Cast (target);
127                         if (pip == null)
128                                 return Copy ();
129
130                         if ((x509 != null) && (pip.x509 != null)) {
131                                 if (x509.GetRawCertDataString () == pip.x509.GetRawCertDataString ())
132                                         return new PublisherIdentityPermission (x509); // any cert would do
133                         }
134                         else if ((x509 == null) && (pip.x509 != null))
135                                 return new PublisherIdentityPermission (pip.x509);
136                         else if ((x509 != null) && (pip.x509 == null))
137                                 return new PublisherIdentityPermission (x509);
138                         return null;
139                 }
140
141                 // IBuiltInPermission
142                 int IBuiltInPermission.GetTokenIndex ()
143                 {
144                         return (int) BuiltInToken.PublisherIdentity;
145                 }
146
147                 // helpers
148
149                 private PublisherIdentityPermission Cast (IPermission target)
150                 {
151                         if (target == null)
152                                 return null;
153
154                         PublisherIdentityPermission pip = (target as PublisherIdentityPermission);
155                         if (pip == null) {
156                                 ThrowInvalidPermission (target, typeof (PublisherIdentityPermission));
157                         }
158
159                         return pip;
160                 }
161         }
162 }