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  }