/// <summary> /// Sets everything up to load the plugins, creating the seperate appdomin and permission requirements /// </summary> public void SetupProtocolFactory(IProtocolAssemblyMetadata meta) { AppDomainSetup setup = this.CreateAppDomainSetup(); PermissionSet permissions = this.CreatePermissionSet(meta); // Create the app domain and the plugin factory in the new domain. this.AppDomainSandbox = AppDomain.CreateDomain(String.Format("Potato.Protocols.{0}", this.ConnectionModel != null ? this.ConnectionModel.ConnectionGuid.ToString() : String.Empty), null, setup, permissions); this.ProtocolFactory = (ISandboxProtocolController)this.AppDomainSandbox.CreateInstanceAndUnwrap(typeof(ISandboxProtocolController).Assembly.FullName, typeof(SandboxProtocolController).FullName); this.AssignProtocolEvents(); }
/// <summary> /// Sets up the factory, then attempts to load a specific type into the protocol appdomain. /// </summary> public bool SetupProtocol(IProtocolAssemblyMetadata meta, IProtocolType type, ProtocolSetup setup) { if (this.ProtocolFactory == null) { this.SetupProtocolFactory(meta); } if (this.ProtocolFactory.Create(meta.Assembly.FullName, type) == true) { this.Protocol = this.ProtocolFactory; this.Protocol.Setup(setup); } return this.Protocol != null; }
/// <summary> /// Creates the permissions set to apply to the app domain. /// </summary> /// <returns></returns> public PermissionSet CreatePermissionSet(IProtocolAssemblyMetadata meta) { PermissionSet permissions = new PermissionSet(PermissionState.None); permissions.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution)); permissions.AddPermission(new DnsPermission(PermissionState.Unrestricted)); permissions.AddPermission(new WebPermission(PermissionState.Unrestricted)); permissions.AddPermission(new SocketPermission(NetworkAccess.Connect, TransportType.All, "*.*.*.*", SocketPermission.AllPorts)); permissions.AddPermission(new FileIOPermission(FileIOPermissionAccess.PathDiscovery, AppDomain.CurrentDomain.BaseDirectory)); permissions.AddPermission(new FileIOPermission(FileIOPermissionAccess.AllAccess, meta.Directory.FullName)); DirectoryInfo coreSharedPackageDirectory = Defines.PackageContainingPath(Defines.PackageMyrconPotatoSharedLibNet40.FullName); if (coreSharedPackageDirectory != null) { permissions.AddPermission(new FileIOPermission(FileIOPermissionAccess.Read | FileIOPermissionAccess.PathDiscovery, coreSharedPackageDirectory.FullName)); } return permissions; }