158 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			158 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| //
 | |
| // 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 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);
 | |
| 		}
 | |
| 
 | |
| 		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
 |