[Add] FishNet
This commit is contained in:
+155
@@ -0,0 +1,155 @@
|
||||
//
|
||||
// Author:
|
||||
// Jb Evain (jbevain@gmail.com)
|
||||
//
|
||||
// Copyright (c) 2008 - 2015 Jb Evain
|
||||
// Copyright (c) 2008 - 2011 Novell, Inc.
|
||||
//
|
||||
// Licensed under the MIT/X11 license.
|
||||
//
|
||||
|
||||
#if !NET_CORE
|
||||
using System;
|
||||
using System.Security;
|
||||
using System.Security.Permissions;
|
||||
using SSP = System.Security.Permissions;
|
||||
|
||||
namespace MonoFN.Cecil.Rocks
|
||||
{
|
||||
#if UNITY_EDITOR
|
||||
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);
|
||||
}
|
||||
|
||||
private static bool TryProcessPermissionSetAttribute(SecurityDeclaration declaration, out PermissionSet set)
|
||||
{
|
||||
set = null;
|
||||
|
||||
if (!declaration.HasSecurityAttributes && declaration.SecurityAttributes.Count != 1)
|
||||
return false;
|
||||
|
||||
SecurityAttribute security_attribute = declaration.SecurityAttributes[0];
|
||||
if (!security_attribute.AttributeType.IsTypeOf("System.Security.Permissions", "PermissionSetAttribute"))
|
||||
return false;
|
||||
|
||||
PermissionSetAttribute attribute = new((SSP.SecurityAction)declaration.Action);
|
||||
|
||||
CustomAttributeNamedArgument 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;
|
||||
}
|
||||
|
||||
private static PermissionSet CreatePermissionSet(SecurityDeclaration declaration)
|
||||
{
|
||||
PermissionSet set = new(SSP.PermissionState.None);
|
||||
|
||||
foreach (SecurityAttribute attribute in declaration.SecurityAttributes)
|
||||
{
|
||||
IPermission permission = CreatePermission(declaration, attribute);
|
||||
set.AddPermission(permission);
|
||||
}
|
||||
|
||||
return set;
|
||||
}
|
||||
|
||||
private static IPermission CreatePermission(SecurityDeclaration declaration, SecurityAttribute attribute)
|
||||
{
|
||||
Type attribute_type = Type.GetType(attribute.AttributeType.FullName);
|
||||
if (attribute_type == null)
|
||||
throw new ArgumentException("attribute");
|
||||
|
||||
System.Security.Permissions.SecurityAttribute security_attribute = CreateSecurityAttribute(attribute_type, declaration);
|
||||
if (security_attribute == null)
|
||||
throw new InvalidOperationException();
|
||||
|
||||
CompleteSecurityAttribute(security_attribute, attribute);
|
||||
|
||||
return security_attribute.CreatePermission();
|
||||
}
|
||||
|
||||
private static void CompleteSecurityAttribute(SSP.SecurityAttribute security_attribute, SecurityAttribute attribute)
|
||||
{
|
||||
if (attribute.HasFields)
|
||||
CompleteSecurityAttributeFields(security_attribute, attribute);
|
||||
|
||||
if (attribute.HasProperties)
|
||||
CompleteSecurityAttributeProperties(security_attribute, attribute);
|
||||
}
|
||||
|
||||
private static void CompleteSecurityAttributeFields(SSP.SecurityAttribute security_attribute, SecurityAttribute attribute)
|
||||
{
|
||||
Type type = security_attribute.GetType();
|
||||
|
||||
foreach (CustomAttributeNamedArgument named_argument in attribute.Fields)
|
||||
type.GetField(named_argument.Name).SetValue(security_attribute, named_argument.Argument.Value);
|
||||
}
|
||||
|
||||
private static void CompleteSecurityAttributeProperties(SSP.SecurityAttribute security_attribute, SecurityAttribute attribute)
|
||||
{
|
||||
Type type = security_attribute.GetType();
|
||||
|
||||
foreach (CustomAttributeNamedArgument named_argument in attribute.Properties)
|
||||
type.GetProperty(named_argument.Name).SetValue(security_attribute, named_argument.Argument.Value, null);
|
||||
}
|
||||
|
||||
private 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");
|
||||
|
||||
SecurityDeclaration declaration = new(action);
|
||||
|
||||
SecurityAttribute attribute = new(module.TypeSystem.LookupType("System.Security.Permissions", "PermissionSetAttribute"));
|
||||
|
||||
attribute.Properties.Add(new("XML", new(module.TypeSystem.String, self.ToXml().ToString())));
|
||||
|
||||
declaration.SecurityAttributes.Add(attribute);
|
||||
|
||||
return declaration;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user