Permissions & Authorization for Users #24

Initial Release; Includes Database and MVC refactoring
This commit is contained in:
Gary Sharp
2013-10-10 19:13:16 +11:00
parent 172ce5524a
commit a099d68915
458 changed files with 40221 additions and 12130 deletions
@@ -48,13 +48,13 @@ namespace Disco.Services.Plugins.CommunityInterop
Status.UpdateStatus(1, "Updating Plugin Library Catalogue", "Building Request");
using (DiscoDataContext dbContext = new DiscoDataContext())
using (DiscoDataContext database = new DiscoDataContext())
{
catalogueFile = Plugins.CatalogueFile(dbContext);
catalogueFile = Plugins.CatalogueFile(database);
updateRequestBody = new PluginLibraryUpdateRequest()
{
DeploymentId = dbContext.DiscoConfiguration.DeploymentId,
DeploymentId = database.DiscoConfiguration.DeploymentId,
HostVersion = typeof(Plugins).Assembly.GetName().Version.ToString(4)
};
}
@@ -111,13 +111,13 @@ namespace Disco.Services.Plugins.CommunityInterop
Status.UpdateStatus(50, "Updating Plugin Library Compatibility", "Building Request");
using (DiscoDataContext dbContext = new DiscoDataContext())
using (DiscoDataContext database = new DiscoDataContext())
{
compatibilityFile = Plugins.CompatibilityFile(dbContext);
compatibilityFile = Plugins.CompatibilityFile(database);
compatRequestBody = new PluginLibraryCompatibilityRequest()
{
DeploymentId = dbContext.DiscoConfiguration.DeploymentId,
DeploymentId = database.DiscoConfiguration.DeploymentId,
HostVersion = typeof(Plugins).Assembly.GetName().Version.ToString(4)
};
}
@@ -200,7 +200,7 @@ namespace Disco.Services.Plugins.CommunityInterop
}
}
public override void InitalizeScheduledTask(DiscoDataContext dbContext)
public override void InitalizeScheduledTask(DiscoDataContext Database)
{
// Random time between midday and midnight.
var rnd = new Random();
@@ -13,6 +13,6 @@ namespace Disco.Services.Plugins.Features.CertificateProvider
{
// Certificate Plugin Requirements
public abstract string CertificateProviderId { get; }
public abstract Tuple<DeviceCertificate, List<string>> AllocateCertificate(DiscoDataContext dbContext, Device Device);
public abstract Tuple<DeviceCertificate, List<string>> AllocateCertificate(DiscoDataContext Database, Device Device);
}
}
@@ -16,14 +16,14 @@ namespace Disco.Services.Plugins.Features.WarrantyProvider
// Warranty Plugin Requirements
public abstract string WarrantyProviderId { get; }
public abstract Type SubmitJobViewType { get; }
public abstract dynamic SubmitJobViewModel(DiscoDataContext dbContext, Controller controller, Job Job, OrganisationAddress Address, User TechUser);
public abstract Dictionary<string, string> SubmitJobParseProperties(DiscoDataContext dbContext, FormCollection form, Controller controller, Job Job, OrganisationAddress Address, User TechUser, string FaultDescription);
public abstract Dictionary<string, string> SubmitJobDiscloseInfo(DiscoDataContext dbContext, Job Job, OrganisationAddress Address, User TechUser, string FaultDescription, Dictionary<string, string> WarrantyProviderProperties);
public abstract string SubmitJob(DiscoDataContext dbContext, Job Job, OrganisationAddress Address, User TechUser, string FaultDescription, Dictionary<string, string> WarrantyProviderProperties);
public abstract dynamic SubmitJobViewModel(DiscoDataContext Database, Controller controller, Job Job, OrganisationAddress Address, User TechUser);
public abstract Dictionary<string, string> SubmitJobParseProperties(DiscoDataContext Database, FormCollection form, Controller controller, Job Job, OrganisationAddress Address, User TechUser, string FaultDescription);
public abstract Dictionary<string, string> SubmitJobDiscloseInfo(DiscoDataContext Database, Job Job, OrganisationAddress Address, User TechUser, string FaultDescription, Dictionary<string, string> WarrantyProviderProperties);
public abstract string SubmitJob(DiscoDataContext Database, Job Job, OrganisationAddress Address, User TechUser, string FaultDescription, Dictionary<string, string> WarrantyProviderProperties);
public abstract Type JobDetailsViewType { get; }
public bool JobDetailsSupported { get { return this.JobDetailsViewType != null; } }
public abstract dynamic JobDetailsViewModel(DiscoDataContext dbContext, Controller controller, Job Job);
public abstract dynamic JobDetailsViewModel(DiscoDataContext Database, Controller controller, Job Job);
public static PluginFeatureManifest FindPluginFeature(string PluginIdOrWarrantyProviderId)
{
+5 -5
View File
@@ -95,12 +95,12 @@ namespace Disco.Services.Plugins
if (Plugins.GetPlugins().FirstOrDefault(p => p.Id == packageManifest.Id) != null)
throw new InvalidOperationException(string.Format("The '{0} [{1}]' Plugin is already installed, please uninstall any existing versions before trying again", packageManifest.Name, packageManifest.Id));
using (DiscoDataContext dbContext = new DiscoDataContext())
using (DiscoDataContext database = new DiscoDataContext())
{
string packagePath = Path.Combine(dbContext.DiscoConfiguration.PluginsLocation, packageManifest.Id);
string packagePath = Path.Combine(database.DiscoConfiguration.PluginsLocation, packageManifest.Id);
// Check for Compatibility
var compatibilityData = Plugins.LoadCompatibilityData(dbContext);
var compatibilityData = Plugins.LoadCompatibilityData(database);
var pluginCompatibility = compatibilityData.Plugins.FirstOrDefault(i => i.Id.Equals(packageManifest.Id, StringComparison.InvariantCultureIgnoreCase) && packageManifest.Version == Version.Parse(i.Version));
if (pluginCompatibility != null && !pluginCompatibility.Compatible)
throw new InvalidOperationException(string.Format("The plugin [{0} v{1}] is not compatible: {2}", packageManifest.Id, packageManifest.VersionFormatted, pluginCompatibility.Reason));
@@ -144,11 +144,11 @@ namespace Disco.Services.Plugins
// Install Plugin
this.Status.UpdateStatus(80, "Initial Package Configuration");
packageManifest.InstallPlugin(dbContext, this.Status);
packageManifest.InstallPlugin(database, this.Status);
// Initialize Plugin
this.Status.UpdateStatus(98, "Initializing Plugin for Use");
packageManifest.InitializePlugin(dbContext);
packageManifest.InitializePlugin(database);
// Add Plugin Manifest to Host Environment
Plugins.AddPlugin(packageManifest);
+4 -4
View File
@@ -14,10 +14,10 @@ namespace Disco.Services.Plugins
#region Lifecycle
// Events/Triggers for Custom Plugin Initialization (Optional)
public virtual void Install(DiscoDataContext dbContext, ScheduledTaskStatus Status) { return; }
public virtual void Initialize(DiscoDataContext dbContext) { return; }
public virtual void Uninstall(DiscoDataContext dbContext, bool UninstallData, ScheduledTaskStatus Status) { return; }
public virtual void AfterUpdate(DiscoDataContext dbContext, PluginManifest PreviousManifest) { return; }
public virtual void Install(DiscoDataContext Database, ScheduledTaskStatus Status) { return; }
public virtual void Initialize(DiscoDataContext Database) { return; }
public virtual void Uninstall(DiscoDataContext Database, bool UninstallData, ScheduledTaskStatus Status) { return; }
public virtual void AfterUpdate(DiscoDataContext Database, PluginManifest PreviousManifest) { return; }
#endregion
public virtual void Dispose()
@@ -12,8 +12,8 @@ namespace Disco.Services.Plugins
{
public PluginManifest Manifest { get; set; }
public abstract PluginConfigurationHandlerGetResponse Get(DiscoDataContext dbContext, Controller controller);
public abstract bool Post(DiscoDataContext dbContext, FormCollection form, Controller controller);
public abstract PluginConfigurationHandlerGetResponse Get(DiscoDataContext Database, Controller controller);
public abstract bool Post(DiscoDataContext Database, FormCollection form, Controller controller);
public virtual void Dispose()
{
+1 -1
View File
@@ -12,7 +12,7 @@ namespace Disco.Services.Plugins
public PluginFeatureManifest Manifest {get; internal set;}
// Allow Custom Initialization (Optional)
public virtual void Initialize(DiscoDataContext dbContext) { return; }
public virtual void Initialize(DiscoDataContext Database) { return; }
public virtual void Dispose()
{
@@ -26,7 +26,7 @@ namespace Disco.Services.Plugins
[JsonIgnore]
public Type CategoryType { get; private set; }
internal bool Initialize(DiscoDataContext dbContext, PluginManifest pluginManifest)
internal bool Initialize(DiscoDataContext Database, PluginManifest pluginManifest)
{
this.PluginManifest = pluginManifest;
@@ -38,7 +38,7 @@ namespace Disco.Services.Plugins
using (var instance = this.CreateInstance())
{
instance.Initialize(dbContext);
instance.Initialize(Database);
}
PluginsLog.LogInitializedPluginFeature(this.PluginManifest, this);
+15 -15
View File
@@ -284,7 +284,7 @@ namespace Disco.Services.Plugins
{
return JsonConvert.SerializeObject(this, Formatting.Indented, new VersionConverter());
}
private bool InitializePluginEnvironment(DiscoDataContext dbContext)
private bool InitializePluginEnvironment(DiscoDataContext Database)
{
if (!environmentInitalized)
{
@@ -316,58 +316,58 @@ namespace Disco.Services.Plugins
this.WebHandlerType = this.PluginAssembly.GetType(this.WebHandlerTypeName, true, true);
// Update non-static values
this.StorageLocation = Path.Combine(dbContext.DiscoConfiguration.PluginStorageLocation, this.Id);
this.StorageLocation = Path.Combine(Database.DiscoConfiguration.PluginStorageLocation, this.Id);
environmentInitalized = true;
}
return true;
}
internal bool AfterPluginUpdate(DiscoDataContext dbContext, PluginManifest PreviousManifest)
internal bool AfterPluginUpdate(DiscoDataContext Database, PluginManifest PreviousManifest)
{
// Initialize Plugin
InitializePluginEnvironment(dbContext);
InitializePluginEnvironment(Database);
using (var pluginInstance = this.CreateInstance())
{
pluginInstance.AfterUpdate(dbContext, PreviousManifest);
pluginInstance.AfterUpdate(Database, PreviousManifest);
}
return true;
}
internal bool UninstallPlugin(DiscoDataContext dbContext, bool UninstallData, ScheduledTaskStatus Status)
internal bool UninstallPlugin(DiscoDataContext Database, bool UninstallData, ScheduledTaskStatus Status)
{
// Initialize Plugin
InitializePluginEnvironment(dbContext);
InitializePluginEnvironment(Database);
using (var pluginInstance = this.CreateInstance())
{
pluginInstance.Uninstall(dbContext, UninstallData, Status);
pluginInstance.Uninstall(Database, UninstallData, Status);
}
return true;
}
internal bool InstallPlugin(DiscoDataContext dbContext, ScheduledTaskStatus Status)
internal bool InstallPlugin(DiscoDataContext Database, ScheduledTaskStatus Status)
{
// Initialize Plugin
InitializePluginEnvironment(dbContext);
InitializePluginEnvironment(Database);
using (var pluginInstance = this.CreateInstance())
{
pluginInstance.Install(dbContext, Status);
pluginInstance.Install(Database, Status);
}
return true;
}
internal bool InitializePlugin(DiscoDataContext dbContext)
internal bool InitializePlugin(DiscoDataContext Database)
{
// Initialize Plugin
InitializePluginEnvironment(dbContext);
InitializePluginEnvironment(Database);
// Initialize Plugin
using (var pluginInstance = this.CreateInstance())
{
pluginInstance.Initialize(dbContext);
pluginInstance.Initialize(Database);
}
PluginsLog.LogInitializedPlugin(this);
@@ -376,7 +376,7 @@ namespace Disco.Services.Plugins
{
foreach (var feature in Features)
{
feature.Initialize(dbContext, this);
feature.Initialize(Database, this);
}
}
else
+20 -20
View File
@@ -250,18 +250,18 @@ namespace Disco.Services.Plugins
throw new InvalidOperationException(string.Format("Unknown Plugin Feature Category Type: [{0}]", FeatureCategoryType.Name));
}
public static string CatalogueFile(DiscoDataContext dbContext)
public static string CatalogueFile(DiscoDataContext Database)
{
return Path.Combine(dbContext.DiscoConfiguration.PluginPackagesLocation, "Catalogue.json");
return Path.Combine(Database.DiscoConfiguration.PluginPackagesLocation, "Catalogue.json");
}
public static string CompatibilityFile(DiscoDataContext dbContext)
public static string CompatibilityFile(DiscoDataContext Database)
{
return Path.Combine(dbContext.DiscoConfiguration.PluginPackagesLocation, "Compatibility.json");
return Path.Combine(Database.DiscoConfiguration.PluginPackagesLocation, "Compatibility.json");
}
public static PluginLibraryUpdateResponse LoadCatalogue(DiscoDataContext dbContext)
public static PluginLibraryUpdateResponse LoadCatalogue(DiscoDataContext Database)
{
var catalogueFile = CatalogueFile(dbContext);
var catalogueFile = CatalogueFile(Database);
if (!File.Exists(catalogueFile))
return null;
@@ -269,13 +269,13 @@ namespace Disco.Services.Plugins
return JsonConvert.DeserializeObject<PluginLibraryUpdateResponse>(File.ReadAllText(catalogueFile));
}
public static PluginLibraryCompatibilityResponse LoadCompatibilityData(DiscoDataContext dbContext)
public static PluginLibraryCompatibilityResponse LoadCompatibilityData(DiscoDataContext Database)
{
var pluginAssembly = typeof(Plugins).Assembly;
Version hostVersion = pluginAssembly.GetName().Version;
PluginLibraryCompatibilityResponse Data = null;
var localCompatFile = Path.Combine(Path.GetDirectoryName(pluginAssembly.Location), "ReleasePluginCompatibility.json");
var serverCompatFile = CompatibilityFile(dbContext);
var serverCompatFile = CompatibilityFile(Database);
if (File.Exists(localCompatFile))
{
@@ -325,7 +325,7 @@ namespace Disco.Services.Plugins
return Data;
}
public static void InitalizePlugins(DiscoDataContext dbContext)
public static void InitalizePlugins(DiscoDataContext Database)
{
if (_PluginManifests == null)
{
@@ -334,10 +334,10 @@ namespace Disco.Services.Plugins
if (_PluginManifests == null)
{
Version hostVersion = typeof(Plugins).Assembly.GetName().Version;
var compatibilityData = new Lazy<PluginLibraryCompatibilityResponse>(() => LoadCompatibilityData(dbContext));
var compatibilityData = new Lazy<PluginLibraryCompatibilityResponse>(() => LoadCompatibilityData(Database));
Dictionary<string, PluginManifest> loadedPlugins = new Dictionary<string, PluginManifest>();
PluginPath = dbContext.DiscoConfiguration.PluginsLocation;
PluginPath = Database.DiscoConfiguration.PluginsLocation;
AppDomain appDomain = AppDomain.CurrentDomain;
@@ -367,7 +367,7 @@ namespace Disco.Services.Plugins
if (File.Exists(updatePackagePath))
{
// Update Plugin
pluginManifest = UpdatePlugin(dbContext, pluginManifest, updatePackagePath, compatibilityData.Value);
pluginManifest = UpdatePlugin(Database, pluginManifest, updatePackagePath, compatibilityData.Value);
}
if (pluginManifest != null)
@@ -382,7 +382,7 @@ namespace Disco.Services.Plugins
if (pluginManifest.HostVersionMax != null && pluginManifest.HostVersionMax < hostVersion)
throw new InvalidOperationException(string.Format("The plugin [{0} v{1}] does not support this version of Disco (Support expired as of v{2})", pluginManifest.Id, pluginManifest.VersionFormatted, pluginManifest.HostVersionMax.ToString()));
pluginManifest.InitializePlugin(dbContext);
pluginManifest.InitializePlugin(Database);
loadedPlugins[pluginManifest.Id] = pluginManifest;
}
}
@@ -414,7 +414,7 @@ namespace Disco.Services.Plugins
// Check for Data Removal
bool DataUninstalled = false;
string pluginStorageLocation = Path.Combine(dbContext.DiscoConfiguration.PluginStorageLocation, uninstallManifest.Id);
string pluginStorageLocation = Path.Combine(Database.DiscoConfiguration.PluginStorageLocation, uninstallManifest.Id);
string pluginManifestUninstallDataFilename = Path.Combine(pluginStorageLocation, "manifest.uninstall.json");
if (File.Exists(pluginManifestUninstallDataFilename))
@@ -443,13 +443,13 @@ namespace Disco.Services.Plugins
_PluginAssemblyManifests = _PluginManifests.Values.ToDictionary(p => p.PluginAssembly, p => p);
}
public static PluginManifest UpdatePlugin(DiscoDataContext dbContext, PluginManifest ExistingManifest, String UpdatePluginPackageFilePath, PluginLibraryCompatibilityResponse CompatibilityData = null)
public static PluginManifest UpdatePlugin(DiscoDataContext Database, PluginManifest ExistingManifest, String UpdatePluginPackageFilePath, PluginLibraryCompatibilityResponse CompatibilityData = null)
{
PluginManifest updatedManifest;
using (var packageStream = File.OpenRead(UpdatePluginPackageFilePath))
{
updatedManifest = UpdatePlugin(dbContext, ExistingManifest, packageStream, CompatibilityData);
updatedManifest = UpdatePlugin(Database, ExistingManifest, packageStream, CompatibilityData);
}
// Remove Update after processing
@@ -458,7 +458,7 @@ namespace Disco.Services.Plugins
return updatedManifest;
}
public static PluginManifest UpdatePlugin(DiscoDataContext dbContext, PluginManifest ExistingManifest, Stream UpdatePluginPackage, PluginLibraryCompatibilityResponse CompatibilityData = null)
public static PluginManifest UpdatePlugin(DiscoDataContext Database, PluginManifest ExistingManifest, Stream UpdatePluginPackage, PluginLibraryCompatibilityResponse CompatibilityData = null)
{
using (MemoryStream packageStream = new MemoryStream())
{
@@ -495,12 +495,12 @@ namespace Disco.Services.Plugins
// Check Compatibility
if (CompatibilityData == null)
CompatibilityData = LoadCompatibilityData(dbContext);
CompatibilityData = LoadCompatibilityData(Database);
var pluginCompatibility = CompatibilityData.Plugins.FirstOrDefault(i => i.Id.Equals(packageManifest.Id, StringComparison.InvariantCultureIgnoreCase) && packageManifest.Version == Version.Parse(i.Version));
if (pluginCompatibility != null && !pluginCompatibility.Compatible)
throw new InvalidOperationException(string.Format("The plugin [{0} v{1}] is not compatible: {2}", packageManifest.Id, packageManifest.VersionFormatted, pluginCompatibility.Reason));
string packagePath = Path.Combine(dbContext.DiscoConfiguration.PluginsLocation, packageManifest.Id);
string packagePath = Path.Combine(Database.DiscoConfiguration.PluginsLocation, packageManifest.Id);
// Force Delete of Existing Folder
if (Directory.Exists(packagePath))
@@ -530,7 +530,7 @@ namespace Disco.Services.Plugins
packageManifest = PluginManifest.FromPluginManifestFile(Path.Combine(packagePath, "manifest.json"));
// Trigger AfterPluginUpdate
packageManifest.AfterPluginUpdate(dbContext, ExistingManifest);
packageManifest.AfterPluginUpdate(Database, ExistingManifest);
PluginsLog.LogAfterUpdate(ExistingManifest, packageManifest);
@@ -29,9 +29,9 @@ namespace Disco.Services.Plugins
if (!File.Exists(manifestFileLocation))
throw new FileNotFoundException("Plugin Manifest File Not Found", manifestFileLocation);
using (DiscoDataContext dbContext = new DiscoDataContext())
using (DiscoDataContext database = new DiscoDataContext())
{
manifest.UninstallPlugin(dbContext, UninstallData, this.Status);
manifest.UninstallPlugin(database, UninstallData, this.Status);
}
string manifestUninstallFileLocation = Path.Combine(manifest.PluginLocation, "manifest.uninstall.json");
+13 -13
View File
@@ -32,10 +32,10 @@ namespace Disco.Services.Plugins
List<Tuple<PluginManifest, string, PluginLibraryItem>> updatePlugins;
using (DiscoDataContext dbContext = new DiscoDataContext())
using (DiscoDataContext database = new DiscoDataContext())
{
catalogue = Plugins.LoadCatalogue(dbContext);
pluginPackagesLocation = dbContext.DiscoConfiguration.PluginPackagesLocation;
catalogue = Plugins.LoadCatalogue(database);
pluginPackagesLocation = database.DiscoConfiguration.PluginPackagesLocation;
}
if (!string.IsNullOrEmpty(pluginId))
@@ -82,10 +82,10 @@ namespace Disco.Services.Plugins
Plugins.RestartApp(1500);
}
public static List<PluginManifest> OfflineInstalledPlugins(DiscoDataContext dbContext)
public static List<PluginManifest> OfflineInstalledPlugins(DiscoDataContext Database)
{
string pluginsLocation = dbContext.DiscoConfiguration.PluginsLocation;
string pluginsStorageLocation = dbContext.DiscoConfiguration.PluginStorageLocation;
string pluginsLocation = Database.DiscoConfiguration.PluginsLocation;
string pluginsStorageLocation = Database.DiscoConfiguration.PluginStorageLocation;
List<PluginManifest> installedPluginManifests = new List<PluginManifest>();
@@ -121,13 +121,13 @@ namespace Disco.Services.Plugins
List<Tuple<PluginManifest, string, PluginLibraryItem>> updatePlugins = new List<Tuple<PluginManifest, string, PluginLibraryItem>>();
using (DiscoDataContext dbContext = new DiscoDataContext())
using (DiscoDataContext database = new DiscoDataContext())
{
pluginPackagesLocation = dbContext.DiscoConfiguration.PluginPackagesLocation;
installedPluginManifests = OfflineInstalledPlugins(dbContext);
pluginPackagesLocation = database.DiscoConfiguration.PluginPackagesLocation;
installedPluginManifests = OfflineInstalledPlugins(database);
if (installedPluginManifests.Count > 0)
pluginCatalogue = Plugins.LoadCatalogue(dbContext);
pluginCatalogue = Plugins.LoadCatalogue(database);
}
if (pluginCatalogue != null && installedPluginManifests.Count > 0)
@@ -231,15 +231,15 @@ namespace Disco.Services.Plugins
Status.UpdateStatus(20, string.Format("{0} [{1} v{2}] by {3}", updateManifest.Name, updateManifest.Id, updateManifest.Version.ToString(4), updateManifest.Author), "Initializing Update Environment");
using (DiscoDataContext dbContext = new DiscoDataContext())
using (DiscoDataContext database = new DiscoDataContext())
{
// Check for Compatibility
var compatibilityData = Plugins.LoadCompatibilityData(dbContext);
var compatibilityData = Plugins.LoadCompatibilityData(database);
var pluginCompatibility = compatibilityData.Plugins.FirstOrDefault(i => i.Id.Equals(updateManifest.Id, StringComparison.InvariantCultureIgnoreCase) && updateManifest.Version == Version.Parse(i.Version));
if (pluginCompatibility != null && !pluginCompatibility.Compatible)
throw new InvalidOperationException(string.Format("The plugin [{0} v{1}] is not compatible: {2}", updateManifest.Id, updateManifest.VersionFormatted, pluginCompatibility.Reason));
var updatePluginPath = Path.Combine(dbContext.DiscoConfiguration.PluginsLocation, string.Format("{0}.discoPlugin", updateManifest.Id));
var updatePluginPath = Path.Combine(database.DiscoConfiguration.PluginsLocation, string.Format("{0}.discoPlugin", updateManifest.Id));
File.Move(packageTempFilePath, updatePluginPath);
if (existingManifest != null)