You've already forked linux-packaging-mono
Imported Upstream version 4.8.0.309
Former-commit-id: 5f9c6ae75f295e057a7d2971f3a6df4656fa8850
This commit is contained in:
parent
ee1447783b
commit
94b2861243
174
external/cecil-legacy/rocks/Mono.Cecil.Rocks/SecurityDeclarationRocks.cs
vendored
Normal file
174
external/cecil-legacy/rocks/Mono.Cecil.Rocks/SecurityDeclarationRocks.cs
vendored
Normal file
@@ -0,0 +1,174 @@
|
||||
//
|
||||
// SecurityDeclarationRocks.cs
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2011 Jb Evain
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
#if !SILVERLIGHT && !CF
|
||||
|
||||
using System;
|
||||
using System.Security;
|
||||
using SSP = System.Security.Permissions;
|
||||
|
||||
namespace Mono.Cecil.Rocks {
|
||||
|
||||
#if INSIDE_ROCKS
|
||||
public
|
||||
#endif
|
||||
static class SecurityDeclarationRocks {
|
||||
|
||||
public static PermissionSet ToPermissionSet (this SecurityDeclaration self)
|
||||
{
|
||||
if (self == null)
|
||||
throw new ArgumentNullException ("self");
|
||||
|
||||
PermissionSet set;
|
||||
if (TryProcessPermissionSetAttribute (self, out set))
|
||||
return set;
|
||||
|
||||
return CreatePermissionSet (self);
|
||||
}
|
||||
|
||||
static bool TryProcessPermissionSetAttribute (SecurityDeclaration declaration, out PermissionSet set)
|
||||
{
|
||||
set = null;
|
||||
|
||||
if (!declaration.HasSecurityAttributes && declaration.SecurityAttributes.Count != 1)
|
||||
return false;
|
||||
|
||||
var security_attribute = declaration.SecurityAttributes [0];
|
||||
if (!security_attribute.AttributeType.IsTypeOf ("System.Security.Permissions", "PermissionSetAttribute"))
|
||||
return false;
|
||||
|
||||
var attribute = new SSP.PermissionSetAttribute ((SSP.SecurityAction) declaration.Action);
|
||||
|
||||
var named_argument = security_attribute.Properties [0];
|
||||
string value = (string) named_argument.Argument.Value;
|
||||
switch (named_argument.Name) {
|
||||
case "XML":
|
||||
attribute.XML = value;
|
||||
break;
|
||||
case "Name":
|
||||
attribute.Name = value;
|
||||
break;
|
||||
default:
|
||||
throw new NotImplementedException (named_argument.Name);
|
||||
}
|
||||
|
||||
set = attribute.CreatePermissionSet ();
|
||||
return true;
|
||||
}
|
||||
|
||||
static PermissionSet CreatePermissionSet (SecurityDeclaration declaration)
|
||||
{
|
||||
var set = new PermissionSet (SSP.PermissionState.None);
|
||||
|
||||
foreach (var attribute in declaration.SecurityAttributes) {
|
||||
var permission = CreatePermission (declaration, attribute);
|
||||
set.AddPermission (permission);
|
||||
}
|
||||
|
||||
return set;
|
||||
}
|
||||
|
||||
static IPermission CreatePermission (SecurityDeclaration declaration, SecurityAttribute attribute)
|
||||
{
|
||||
var attribute_type = Type.GetType (attribute.AttributeType.FullName);
|
||||
if (attribute_type == null)
|
||||
throw new ArgumentException ("attribute");
|
||||
|
||||
var security_attribute = CreateSecurityAttribute (attribute_type, declaration);
|
||||
if (security_attribute == null)
|
||||
throw new InvalidOperationException ();
|
||||
|
||||
CompleteSecurityAttribute (security_attribute, attribute);
|
||||
|
||||
return security_attribute.CreatePermission ();
|
||||
}
|
||||
|
||||
static void CompleteSecurityAttribute (SSP.SecurityAttribute security_attribute, SecurityAttribute attribute)
|
||||
{
|
||||
if (attribute.HasFields)
|
||||
CompleteSecurityAttributeFields (security_attribute, attribute);
|
||||
|
||||
if (attribute.HasProperties)
|
||||
CompleteSecurityAttributeProperties (security_attribute, attribute);
|
||||
}
|
||||
|
||||
static void CompleteSecurityAttributeFields (SSP.SecurityAttribute security_attribute, SecurityAttribute attribute)
|
||||
{
|
||||
var type = security_attribute.GetType ();
|
||||
|
||||
foreach (var named_argument in attribute.Fields)
|
||||
type.GetField (named_argument.Name).SetValue (security_attribute, named_argument.Argument.Value);
|
||||
}
|
||||
|
||||
static void CompleteSecurityAttributeProperties (SSP.SecurityAttribute security_attribute, SecurityAttribute attribute)
|
||||
{
|
||||
var type = security_attribute.GetType ();
|
||||
|
||||
foreach (var named_argument in attribute.Properties)
|
||||
type.GetProperty (named_argument.Name).SetValue (security_attribute, named_argument.Argument.Value, null);
|
||||
}
|
||||
|
||||
static SSP.SecurityAttribute CreateSecurityAttribute (Type attribute_type, SecurityDeclaration declaration)
|
||||
{
|
||||
SSP.SecurityAttribute security_attribute;
|
||||
try {
|
||||
security_attribute = (SSP.SecurityAttribute) Activator.CreateInstance (
|
||||
attribute_type, new object [] { (SSP.SecurityAction) declaration.Action });
|
||||
} catch (MissingMethodException) {
|
||||
security_attribute = (SSP.SecurityAttribute) Activator.CreateInstance (attribute_type, new object [0]);
|
||||
}
|
||||
|
||||
return security_attribute;
|
||||
}
|
||||
|
||||
public static SecurityDeclaration ToSecurityDeclaration (this PermissionSet self, SecurityAction action, ModuleDefinition module)
|
||||
{
|
||||
if (self == null)
|
||||
throw new ArgumentNullException ("self");
|
||||
if (module == null)
|
||||
throw new ArgumentNullException ("module");
|
||||
|
||||
var declaration = new SecurityDeclaration (action);
|
||||
|
||||
var attribute = new SecurityAttribute (
|
||||
module.TypeSystem.LookupType ("System.Security.Permissions", "PermissionSetAttribute"));
|
||||
|
||||
attribute.Properties.Add (
|
||||
new CustomAttributeNamedArgument (
|
||||
"XML",
|
||||
new CustomAttributeArgument (
|
||||
module.TypeSystem.String, self.ToXml ().ToString ())));
|
||||
|
||||
declaration.SecurityAttributes.Add (attribute);
|
||||
|
||||
return declaration;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user