/Test/Mono.Cecil.Tests/SecurityDeclarationTests.cs

http://github.com/jbevain/cecil · C# · 298 lines · 218 code · 80 blank · 0 comment · 16 complexity · be6c5c789bbaa78b48dc6ef0f7668e02 MD5 · raw file

  1. using System;
  2. using System.Globalization;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Text;
  6. using Mono.Cecil;
  7. using Mono.Cecil.Metadata;
  8. using Mono.Cecil.PE;
  9. using NUnit.Framework;
  10. namespace Mono.Cecil.Tests {
  11. [TestFixture]
  12. public class SecurityDeclarationTests : BaseTestFixture {
  13. [Test]
  14. public void XmlSecurityDeclaration ()
  15. {
  16. TestModule ("decsec-xml.dll", module => {
  17. var type = module.GetType ("SubLibrary");
  18. Assert.IsTrue (type.HasSecurityDeclarations);
  19. Assert.AreEqual (1, type.SecurityDeclarations.Count);
  20. var declaration = type.SecurityDeclarations [0];
  21. Assert.AreEqual (SecurityAction.Deny, declaration.Action);
  22. Assert.AreEqual (1, declaration.SecurityAttributes.Count);
  23. var attribute = declaration.SecurityAttributes [0];
  24. Assert.AreEqual ("System.Security.Permissions.PermissionSetAttribute", attribute.AttributeType.FullName);
  25. Assert.AreEqual (1, attribute.Properties.Count);
  26. var named_argument = attribute.Properties [0];
  27. Assert.AreEqual ("XML", named_argument.Name);
  28. var argument = named_argument.Argument;
  29. Assert.AreEqual ("System.String", argument.Type.FullName);
  30. const string permission_set = "<PermissionSet class=\"System.Security.PermissionSe"
  31. + "t\"\r\nversion=\"1\">\r\n<IPermission class=\"System.Security.Permis"
  32. + "sions.SecurityPermission, mscorlib, Version=2.0.0.0, Culture"
  33. + "=neutral, PublicKeyToken=b77a5c561934e089\"\r\nversion=\"1\"\r\nFla"
  34. + "gs=\"UnmanagedCode\"/>\r\n</PermissionSet>\r\n";
  35. Assert.AreEqual (permission_set, argument.Value);
  36. });
  37. }
  38. [Test]
  39. public void XmlNet_1_1SecurityDeclaration ()
  40. {
  41. TestModule ("decsec1-xml.dll", module => {
  42. var type = module.GetType ("SubLibrary");
  43. Assert.IsTrue (type.HasSecurityDeclarations);
  44. Assert.AreEqual (1, type.SecurityDeclarations.Count);
  45. var declaration = type.SecurityDeclarations [0];
  46. Assert.AreEqual (SecurityAction.Deny, declaration.Action);
  47. Assert.AreEqual (1, declaration.SecurityAttributes.Count);
  48. var attribute = declaration.SecurityAttributes [0];
  49. Assert.AreEqual ("System.Security.Permissions.PermissionSetAttribute", attribute.AttributeType.FullName);
  50. Assert.AreEqual (1, attribute.Properties.Count);
  51. var named_argument = attribute.Properties [0];
  52. Assert.AreEqual ("XML", named_argument.Name);
  53. var argument = named_argument.Argument;
  54. Assert.AreEqual ("System.String", argument.Type.FullName);
  55. const string permission_set = "<PermissionSet class=\"System.Security.PermissionSe"
  56. + "t\"\r\nversion=\"1\">\r\n<IPermission class=\"System.Security.Permis"
  57. + "sions.SecurityPermission, mscorlib, Version=1.0.0.0, Culture"
  58. + "=neutral, PublicKeyToken=b77a5c561934e089\"\r\nversion=\"1\"\r\nFla"
  59. + "gs=\"UnmanagedCode\"/>\r\n</PermissionSet>\r\n";
  60. Assert.AreEqual (permission_set, argument.Value);
  61. });
  62. }
  63. [Test]
  64. public void DefineSecurityDeclarationByBlob ()
  65. {
  66. var file = Path.Combine(Path.GetTempPath(), "SecDecBlob.dll");
  67. var module = ModuleDefinition.CreateModule ("SecDecBlob.dll", new ModuleParameters { Kind = ModuleKind.Dll, Runtime = TargetRuntime.Net_2_0 });
  68. const string permission_set = "<PermissionSet class=\"System.Security.PermissionSe"
  69. + "t\"\r\nversion=\"1\">\r\n<IPermission class=\"System.Security.Permis"
  70. + "sions.SecurityPermission, mscorlib, Version=2.0.0.0, Culture"
  71. + "=neutral, PublicKeyToken=b77a5c561934e089\"\r\nversion=\"1\"\r\nFla"
  72. + "gs=\"UnmanagedCode\"/>\r\n</PermissionSet>\r\n";
  73. var declaration = new SecurityDeclaration (SecurityAction.Deny, Encoding.Unicode.GetBytes (permission_set));
  74. module.Assembly.SecurityDeclarations.Add (declaration);
  75. module.Write (file);
  76. module = ModuleDefinition.ReadModule (file);
  77. declaration = module.Assembly.SecurityDeclarations [0];
  78. Assert.AreEqual (SecurityAction.Deny, declaration.Action);
  79. Assert.AreEqual (1, declaration.SecurityAttributes.Count);
  80. var attribute = declaration.SecurityAttributes [0];
  81. Assert.AreEqual ("System.Security.Permissions.PermissionSetAttribute", attribute.AttributeType.FullName);
  82. Assert.AreEqual (1, attribute.Properties.Count);
  83. var named_argument = attribute.Properties [0];
  84. Assert.AreEqual ("XML", named_argument.Name);
  85. var argument = named_argument.Argument;
  86. Assert.AreEqual ("System.String", argument.Type.FullName);
  87. Assert.AreEqual (permission_set, argument.Value);
  88. }
  89. [Test]
  90. public void SecurityDeclarationWithoutAttributes ()
  91. {
  92. TestModule ("empty-decsec-att.dll", module => {
  93. var type = module.GetType ("TestSecurityAction.ModalUITypeEditor");
  94. var method = type.GetMethod ("GetEditStyle");
  95. Assert.IsNotNull (method);
  96. Assert.AreEqual (1, method.SecurityDeclarations.Count);
  97. var declaration = method.SecurityDeclarations [0];
  98. Assert.AreEqual (SecurityAction.LinkDemand, declaration.Action);
  99. Assert.AreEqual (1, declaration.SecurityAttributes.Count);
  100. var attribute = declaration.SecurityAttributes [0];
  101. Assert.AreEqual ("System.Security.Permissions.SecurityPermissionAttribute", attribute.AttributeType.FullName);
  102. Assert.AreEqual (0, attribute.Fields.Count);
  103. Assert.AreEqual (0, attribute.Properties.Count);
  104. });
  105. }
  106. [Test]
  107. public void AttributeSecurityDeclaration ()
  108. {
  109. TestModule ("decsec-att.dll", module => {
  110. var type = module.GetType ("SubLibrary");
  111. Assert.IsTrue (type.HasSecurityDeclarations);
  112. Assert.AreEqual (1, type.SecurityDeclarations.Count);
  113. var declaration = type.SecurityDeclarations [0];
  114. Assert.AreEqual (SecurityAction.Deny, declaration.Action);
  115. Assert.AreEqual (1, declaration.SecurityAttributes.Count);
  116. var attribute = declaration.SecurityAttributes [0];
  117. Assert.AreEqual ("System.Security.Permissions.SecurityPermissionAttribute", attribute.AttributeType.FullName);
  118. Assert.AreEqual (1, attribute.Properties.Count);
  119. var named_argument = attribute.Properties [0];
  120. Assert.AreEqual ("UnmanagedCode", named_argument.Name);
  121. var argument = named_argument.Argument;
  122. Assert.AreEqual ("System.Boolean", argument.Type.FullName);
  123. Assert.AreEqual (true, argument.Value);
  124. });
  125. }
  126. static void AssertCustomAttributeArgument (string expected, CustomAttributeNamedArgument named_argument)
  127. {
  128. AssertCustomAttributeArgument (expected, named_argument.Argument);
  129. }
  130. static void AssertCustomAttributeArgument (string expected, CustomAttributeArgument argument)
  131. {
  132. var result = new StringBuilder ();
  133. PrettyPrint (argument, result);
  134. Assert.AreEqual (expected, result.ToString ());
  135. }
  136. static string PrettyPrint (CustomAttribute attribute)
  137. {
  138. var signature = new StringBuilder ();
  139. signature.Append (".ctor (");
  140. for (int i = 0; i < attribute.ConstructorArguments.Count; i++) {
  141. if (i > 0)
  142. signature.Append (", ");
  143. PrettyPrint (attribute.ConstructorArguments [i], signature);
  144. }
  145. signature.Append (")");
  146. return signature.ToString ();
  147. }
  148. static void PrettyPrint (CustomAttributeArgument argument, StringBuilder signature)
  149. {
  150. var value = argument.Value;
  151. signature.Append ("(");
  152. PrettyPrint (argument.Type, signature);
  153. signature.Append (":");
  154. PrettyPrintValue (argument.Value, signature);
  155. signature.Append (")");
  156. }
  157. static void PrettyPrintValue (object value, StringBuilder signature)
  158. {
  159. if (value == null) {
  160. signature.Append ("null");
  161. return;
  162. }
  163. var arguments = value as CustomAttributeArgument [];
  164. if (arguments != null) {
  165. signature.Append ("{");
  166. for (int i = 0; i < arguments.Length; i++) {
  167. if (i > 0)
  168. signature.Append (", ");
  169. PrettyPrint (arguments [i], signature);
  170. }
  171. signature.Append ("}");
  172. return;
  173. }
  174. switch (Type.GetTypeCode (value.GetType ())) {
  175. case System.TypeCode.String:
  176. signature.AppendFormat ("\"{0}\"", value);
  177. break;
  178. case System.TypeCode.Char:
  179. signature.AppendFormat ("'{0}'", (char) value);
  180. break;
  181. default:
  182. var formattable = value as IFormattable;
  183. if (formattable != null) {
  184. signature.Append (formattable.ToString (null, CultureInfo.InvariantCulture));
  185. return;
  186. }
  187. if (value is CustomAttributeArgument) {
  188. PrettyPrint ((CustomAttributeArgument) value, signature);
  189. return;
  190. }
  191. break;
  192. }
  193. }
  194. static void PrettyPrint (TypeReference type, StringBuilder signature)
  195. {
  196. if (type.IsArray) {
  197. ArrayType array = (ArrayType) type;
  198. signature.AppendFormat ("{0}[]", array.ElementType.etype.ToString ());
  199. } else if (type.etype == ElementType.None) {
  200. signature.Append (type.FullName);
  201. } else
  202. signature.Append (type.etype.ToString ());
  203. }
  204. static void AssertArgument<T> (T value, CustomAttributeNamedArgument named_argument)
  205. {
  206. AssertArgument (value, named_argument.Argument);
  207. }
  208. static void AssertArgument<T> (T value, CustomAttributeArgument argument)
  209. {
  210. AssertArgument (typeof (T).FullName, (object) value, argument);
  211. }
  212. static void AssertArgument (string type, object value, CustomAttributeArgument argument)
  213. {
  214. Assert.AreEqual (type, argument.Type.FullName);
  215. Assert.AreEqual (value, argument.Value);
  216. }
  217. }
  218. }