1 using System; 2 using System.Reflection; 3 using System.Security; 4 using System.Security.Policy; 5 6 namespace AppDomainManagers 7 { 8 public sealed class ZoneSandboxAppDomainManager : AppDomainManager 9 { 10 private AppDomain internetDomain = null; 11 private AppDomain localIntranetDomain = null; 12 private AppDomain myComputerDomain = null; 13 14 /// <summary> 15 /// Create a new AppDomain 16 /// </summary> 17 /// <remarks> 18 /// Provides a new AppDomain using the following algorithm: 19 /// 20 /// 1. If this is not the default domain, return the current domain 21 /// 2. All new domains get an ApplicationBase of the plugins directory 22 /// 3. Put all requests to create domains for the MyComputer zone in a single domain 23 /// 4. Put all requests to create domains for the Intranet zone in a single domain 24 /// 5. Put all requests to create domains for the Internet zone in a single domain 25 /// 26 /// Note: This is not thread-safe. 27 /// </remarks> 28 /// <param name="friendlyName">Friendly name of the AppDomain to create</param> 29 /// <param name="securityInfo">Evidence to create the AppDomain with</param> 30 /// <param name="appDomainSetup">Information about the new domain</param> 31 public override AppDomain CreateDomain(string friendlyName, 32 Evidence securityInfo, AppDomainSetup appDomainInfo) 33 { 34 // 1. if this is not the default domain, then just return the current domain 35 if(!AppDomain.CurrentDomain.IsDefaultAppDomain()) 36 return AppDomain.CurrentDomain; 37 38 // 2. All new domains get an ApplicationBase of the plugins directory 39 appDomainInfo.ApplicationBase = 40 AppDomain.CurrentDomain.SetupInformation.ApplicationBase + @"\plugins"; 41 42 // make sure there is some evidence 43 if(securityInfo == null) 44 securityInfo = new Evidence(); 45 46 // find the security zone, defaulting to Internet 47 Zone zone = null; 48 foreach(object evidence in securityInfo) 49 if(evidence is Zone) 50 zone = evidence as Zone; 51 52 if(zone == null) 53 { 54 zone = new Zone(SecurityZone.Internet); 55 securityInfo.AddHost(zone); 56 } 57 58 // figure out which AppDomain to get 59 switch(zone.SecurityZone) 60 { 61 // 3. Put all requests to create domains for the MyComputer zone in a single domain 62 case SecurityZone.MyComputer: 63 if(myComputerDomain == null) 64 myComputerDomain = CreateDomainHelper("MyComputer Plugins", 65 securityInfo, appDomainInfo); 66 return myComputerDomain; 67 68 // 4. Put all requests to create domains for the Intranet zone in a single domain 69 case SecurityZone.Intranet: 70 if(localIntranetDomain == null) 71 localIntranetDomain = CreateDomainHelper("LocalIntranet Plugins", 72 securityInfo, appDomainInfo); 73 return localIntranetDomain; 74 75 // 5. Put all requests to create domains for the Internet zone in a single domain 76 case SecurityZone.Internet: 77 default: 78 if(internetDomain == null) 79 internetDomain = CreateDomainHelper("Internet Plugins", 80 securityInfo, appDomainInfo); 81 return internetDomain; 82 } 83 } 84 } 85 }