2 // System.Security.Policy.UnionCodeGroup.cs
5 // Duncan Mak (duncan@ximian.com)
6 // Sebastien Pouliot <sebastien@ximian.com>
8 // (C) 2003 Ximian, Inc (http://www.ximian.com)
9 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 using System
.Globalization
;
32 using System
.Security
.Permissions
;
34 namespace System
.Security
.Policy
{
37 public sealed class UnionCodeGroup
: CodeGroup
{
39 public UnionCodeGroup (IMembershipCondition membershipCondition
, PolicyStatement policyStatement
)
40 : base (membershipCondition
, policyStatement
)
44 // for PolicyLevel (to avoid validation duplication)
45 internal UnionCodeGroup (SecurityElement e
, PolicyLevel level
)
50 public override CodeGroup
Copy ()
55 internal CodeGroup
Copy (bool childs
)
57 UnionCodeGroup copy
= new UnionCodeGroup (MembershipCondition
, PolicyStatement
);
59 copy
.Description
= Description
;
61 foreach (CodeGroup child
in Children
) {
62 copy
.AddChild (child
.Copy ());
69 public override PolicyStatement
Resolve (Evidence evidence
)
72 throw new ArgumentNullException ("evidence");
74 if (!MembershipCondition
.Check (evidence
))
77 PolicyStatement pst
= this.PolicyStatement
.Copy ();
79 if (this.Children
.Count
> 0) {
80 foreach (CodeGroup child_cg
in this.Children
) {
81 PolicyStatement child_pst
= child_cg
.Resolve (evidence
);
82 if (child_pst
!= null) {
83 foreach (IPermission perm
in child_pst
.PermissionSet
) {
84 pst
.PermissionSet
.AddPermission (perm
);
92 public override CodeGroup
ResolveMatchingCodeGroups (Evidence evidence
)
95 throw new ArgumentNullException ("evidence");
97 if (!MembershipCondition
.Check (evidence
))
100 // Copy() would add the child (even if they didn't match)
101 CodeGroup match
= Copy (false);
102 if (this.Children
.Count
> 0) {
103 foreach (CodeGroup cg
in this.Children
) {
104 CodeGroup child
= cg
.ResolveMatchingCodeGroups (evidence
);
106 match
.AddChild (child
);
112 public override string MergeLogic
{
113 get { return "Union"; }