XmlSecureResolver.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. //------------------------------------------------------------------------------
  2. // <copyright file="XmlSecureResolver.cs" company="Microsoft">
  3. // Copyright (c) Microsoft Corporation. All rights reserved.
  4. // </copyright>
  5. // <owner current="true" primary="true">Microsoft</owner>
  6. //------------------------------------------------------------------------------
  7. namespace System.Xml {
  8. using System.Net;
  9. using System.Security;
  10. using System.Security.Policy;
  11. using System.Security.Permissions;
  12. using System.Runtime.Versioning;
  13. [PermissionSetAttribute(SecurityAction.InheritanceDemand, Name = "FullTrust")]
  14. public partial class XmlSecureResolver : XmlResolver {
  15. XmlResolver resolver;
  16. #if MONO_FEATURE_CAS
  17. PermissionSet permissionSet;
  18. #endif
  19. #if MONO_FEATURE_CAS
  20. public XmlSecureResolver(XmlResolver resolver, string securityUrl) : this(resolver, CreateEvidenceForUrl(securityUrl)) {}
  21. public XmlSecureResolver(XmlResolver resolver, Evidence evidence) : this(resolver, SecurityManager.GetStandardSandbox(evidence)) {}
  22. #else
  23. public XmlSecureResolver(XmlResolver resolver, string securityUrl) : this(resolver, (PermissionSet) null) {}
  24. public XmlSecureResolver(XmlResolver resolver, Evidence evidence) : this(resolver, (PermissionSet) null) {}
  25. #endif
  26. public XmlSecureResolver(XmlResolver resolver, PermissionSet permissionSet) {
  27. this.resolver = resolver;
  28. #if MONO_FEATURE_CAS
  29. this.permissionSet = permissionSet;
  30. #endif
  31. }
  32. public override ICredentials Credentials {
  33. set { resolver.Credentials = value; }
  34. }
  35. public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn) {
  36. #if MONO_FEATURE_CAS
  37. permissionSet.PermitOnly();
  38. #endif
  39. return resolver.GetEntity(absoluteUri, role, ofObjectToReturn);
  40. }
  41. [ResourceConsumption(ResourceScope.Machine)]
  42. [ResourceExposure(ResourceScope.Machine)]
  43. public override Uri ResolveUri(Uri baseUri, string relativeUri) {
  44. return resolver.ResolveUri(baseUri, relativeUri);
  45. }
  46. public static Evidence CreateEvidenceForUrl(string securityUrl) {
  47. #if MONO_FEATURE_CAS
  48. Evidence evidence = new Evidence();
  49. if (securityUrl != null && securityUrl.Length > 0) {
  50. evidence.AddHostEvidence(new Url(securityUrl));
  51. evidence.AddHostEvidence(Zone.CreateFromUrl(securityUrl));
  52. Uri uri = new Uri(securityUrl, UriKind.RelativeOrAbsolute);
  53. if (uri.IsAbsoluteUri && !uri.IsFile) {
  54. evidence.AddHostEvidence(Site.CreateFromUrl(securityUrl));
  55. }
  56. // Allow same directory access for UNCs (SQLBUDT 394535)
  57. if (uri.IsAbsoluteUri && uri.IsUnc) {
  58. string uncDir = System.IO.Path.GetDirectoryName(uri.LocalPath);
  59. if (uncDir != null && uncDir.Length != 0) {
  60. evidence.AddHostEvidence(new UncDirectory(uncDir));
  61. }
  62. }
  63. }
  64. return evidence;
  65. #else
  66. return null;
  67. #endif
  68. }
  69. #if MONO_FEATURE_CAS
  70. [Serializable]
  71. private class UncDirectory : EvidenceBase, IIdentityPermissionFactory {
  72. private string uncDir;
  73. public UncDirectory(string uncDirectory) {
  74. this.uncDir = uncDirectory;
  75. }
  76. public IPermission CreateIdentityPermission(Evidence evidence) {
  77. return new FileIOPermission(FileIOPermissionAccess.Read, uncDir);
  78. }
  79. public override EvidenceBase Clone()
  80. {
  81. return new UncDirectory(uncDir);
  82. }
  83. private SecurityElement ToXml() {
  84. SecurityElement root = new SecurityElement("System.Xml.XmlSecureResolver");
  85. root.AddAttribute("version", "1");
  86. root.AddChild(new SecurityElement("UncDirectory", uncDir));
  87. return root;
  88. }
  89. public override string ToString() {
  90. return ToXml().ToString();
  91. }
  92. }
  93. #endif
  94. }
  95. }