Skip to content
This repository has been archived by the owner on Jan 15, 2021. It is now read-only.

Support for plugin directories hosted outside of ~/bin #175

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
10 changes: 10 additions & 0 deletions source/Glimpse.Core/Configuration/GlimpseConfiguration.cs
Expand Up @@ -103,6 +103,16 @@ public PluginBlacklistCollection PluginBlacklist
}
}

[ConfigurationProperty("pluginDirectories", IsRequired = false)]
public PluginDirectoryCollection PluginDirectories
{
set { this["pluginDirectories"] = value; }
get
{
return this["pluginDirectories"] as PluginDirectoryCollection;
}
}

[ConfigurationProperty("urlBlacklist", IsRequired = false)]
public UrlBlacklistCollection UrlBlackList
{
Expand Down
29 changes: 29 additions & 0 deletions source/Glimpse.Core/Configuration/PluginDirectory.cs
@@ -0,0 +1,29 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;

namespace Glimpse.Core.Configuration
{
/// <summary>
/// Directory containing plugins
/// </summary>
public class PluginDirectory : ConfigurationElement
{
[ConfigurationProperty("directory")]
public string Directory
{
get
{
return this["directory"].ToString();
}
set { this["directory"] = value; }
}

public override string ToString()
{
return Directory;
}
}
}
60 changes: 60 additions & 0 deletions source/Glimpse.Core/Configuration/PluginDirectoryCollection.cs
@@ -0,0 +1,60 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;

namespace Glimpse.Core.Configuration
{
public class PluginDirectoryCollection : ConfigurationElementCollection
{
public PluginDirectoryCollection()
{
BaseAdd(new PluginDirectory { Directory = "bin" });
}

public PluginDirectory this[int index]
{
get { return BaseGet(index) as PluginDirectory; }
set
{
if (BaseGet(index) != null)
{
BaseRemoveAt(index);
}
BaseAdd(index, value);
}
}

public void Add(PluginDirectory address)
{
BaseAdd(address);
}

public void Clear()
{
BaseClear();
}

protected override ConfigurationElement CreateNewElement()
{
return new PluginDirectory();
}

protected override object GetElementKey(ConfigurationElement element)
{
return element;
}

public IEnumerable<string> DirectoryNames
{
get
{
foreach (PluginDirectory directory in this)
{
yield return directory.ToString();
}
}
}
}
}
2 changes: 2 additions & 0 deletions source/Glimpse.Core/Glimpse.Core.csproj
Expand Up @@ -78,6 +78,8 @@
<Compile Include="Configuration\IpCollection.cs" />
<Compile Include="Configuration\GlimpseMode.cs" />
<Compile Include="Configuration\PluginBlacklistCollection.cs" />
<Compile Include="Configuration\PluginDirectory.cs" />
<Compile Include="Configuration\PluginDirectoryCollection.cs" />
<Compile Include="Configuration\UrlBlacklistCollection.cs" />
<Compile Include="Converter\AuthenticationSectionConverter.cs" />
<Compile Include="Converter\CustomErrorsSectionConverter.cs" />
Expand Down
2 changes: 1 addition & 1 deletion source/Glimpse.Core/Module.cs
Expand Up @@ -330,7 +330,7 @@ private void ComposePlugins()
{
var batch = new CompositionBatch();

var directoryCatalog = new BlacklistedSafeDirectoryCatalog("bin", Configuration.PluginBlacklist.TypeNames());
var directoryCatalog = new BlacklistedSafeDirectoryCatalog(Configuration.PluginDirectories.DirectoryNames, Configuration.PluginBlacklist.TypeNames());
var container = new CompositionContainer(directoryCatalog);

container.ComposeParts(this, RequestValidator);
Expand Down
37 changes: 20 additions & 17 deletions source/Glimpse.Core/Plumbing/BlacklistedSafeDirectoryCatalog.cs
Expand Up @@ -14,34 +14,37 @@ internal class BlacklistedSafeDirectoryCatalog : ComposablePartCatalog
public IList<Exception> Exceptions { get; private set; }
private IEnumerable<string> TypesBlacklist { get; set; }

public BlacklistedSafeDirectoryCatalog(string path, IEnumerable<string> typesBlacklist)
public BlacklistedSafeDirectoryCatalog(IEnumerable<string> paths, IEnumerable<string> typesBlacklist)
{
Exceptions = new List<Exception>();
TypesBlacklist = typesBlacklist;

var files = Directory.EnumerateFiles(GetFullPath(path), "*.dll", SearchOption.AllDirectories);

AggregateCatalog = new AggregateCatalog();

foreach (var file in files)
foreach (var path in paths)
{
try
{
var assemblyCatalog = new AssemblyCatalog(file);
var files = Directory.EnumerateFiles(GetFullPath(path), "*.dll", SearchOption.AllDirectories);

if (assemblyCatalog.Parts.ToList().Count > 0)
AggregateCatalog.Catalogs.Add(assemblyCatalog);
}
catch (ReflectionTypeLoadException ex)
foreach (var file in files)
{
foreach (var exception in ex.LoaderExceptions)
try
{
Exceptions.Add(exception);
var assemblyCatalog = new AssemblyCatalog(file);

if (assemblyCatalog.Parts.ToList().Count > 0)
AggregateCatalog.Catalogs.Add(assemblyCatalog);
}
catch (ReflectionTypeLoadException ex)
{
foreach (var exception in ex.LoaderExceptions)
{
Exceptions.Add(exception);
}
}
catch (Exception ex)
{
Exceptions.Add(ex);
}
}
catch (Exception ex)
{
Exceptions.Add(ex);
}
}
}
Expand Down