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-2005 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
;
33 using System
.Runtime
.InteropServices
;
35 namespace System
.Security
.Policy
{
39 public sealed class UnionCodeGroup
: CodeGroup
{
41 public UnionCodeGroup (IMembershipCondition membershipCondition
, PolicyStatement policy
)
42 : base (membershipCondition
, policy
)
46 // for PolicyLevel (to avoid validation duplication)
47 internal UnionCodeGroup (SecurityElement e
, PolicyLevel level
)
52 public override CodeGroup
Copy ()
57 internal CodeGroup
Copy (bool childs
)
59 UnionCodeGroup copy
= new UnionCodeGroup (MembershipCondition
, PolicyStatement
);
61 copy
.Description
= Description
;
63 foreach (CodeGroup child
in Children
) {
64 copy
.AddChild (child
.Copy ());
71 public override PolicyStatement
Resolve (Evidence evidence
)
74 throw new ArgumentNullException ("evidence");
76 if (!MembershipCondition
.Check (evidence
))
79 PermissionSet ps
= this.PolicyStatement
.PermissionSet
.Copy ();
80 if (this.Children
.Count
> 0) {
81 foreach (CodeGroup child_cg
in this.Children
) {
82 PolicyStatement child_pst
= child_cg
.Resolve (evidence
);
83 if (child_pst
!= null) {
84 ps
= ps
.Union (child_pst
.PermissionSet
);
89 PolicyStatement pst
= this.PolicyStatement
.Copy ();
90 pst
.PermissionSet
= ps
;
94 public override CodeGroup
ResolveMatchingCodeGroups (Evidence evidence
)
97 throw new ArgumentNullException ("evidence");
99 if (!MembershipCondition
.Check (evidence
))
102 // Copy() would add the child (even if they didn't match)
103 CodeGroup match
= Copy (false);
104 if (this.Children
.Count
> 0) {
105 foreach (CodeGroup cg
in this.Children
) {
106 CodeGroup child
= cg
.ResolveMatchingCodeGroups (evidence
);
108 match
.AddChild (child
);
114 public override string MergeLogic
{
115 get { return "Union"; }