Certificate/wireless plugins; major refactoring

Migrate much of BI to Services.
Added Wireless Profile Provider plugin feature.
Added Certificate Authority Provider plugin feature.
Modified Certificate Provider plugin feature.
Database migration v17, for Device Profiles.
Enrolment Client Updated to support CA Certificates, Wireless Profiles
and Hardware Info.
New Client Enrolment Protocol to support new features.
Plugin Manifest Generator added to main solution.
Improved AD search performance.
This commit is contained in:
Gary Sharp
2016-09-28 20:16:25 +10:00
parent 489a5df7cc
commit 27c21175d7
210 changed files with 9822 additions and 6675 deletions
@@ -1,11 +1,17 @@
using Disco.BI.Extensions;
using Disco.Models.Repository;
using Disco.Models.Repository;
using Disco.Services;
using Disco.Services.Authorization;
using Disco.Services.Devices.ManagedGroups;
using Disco.Services.Interop.ActiveDirectory;
using Disco.Services.Plugins;
using Disco.Services.Plugins.Features.CertificateAuthorityProvider;
using Disco.Services.Plugins.Features.CertificateProvider;
using Disco.Services.Plugins.Features.WirelessProfileProvider;
using Disco.Services.Tasks;
using Disco.Services.Web;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
namespace Disco.Web.Areas.API.Controllers
@@ -16,7 +22,9 @@ namespace Disco.Web.Areas.API.Controllers
const string pName = "name";
const string pShortName = "shortname";
const string pDistributionType = "distributiontype";
const string pCertificateProviderId = "certificateproviderid";
const string pCertificateProviders = "certificateproviders";
const string pCertificateAuthorityProviders = "certificateauthorityproviders";
const string pWirelessProfileProviders = "wirelessprofileproviders";
const string pOrganisationalUnit = "organisationalunit";
const string pDefaultOrganisationAddress = "defaultorganisationaddress";
const string pComputerNameTemplate = "computernametemplate";
@@ -56,8 +64,14 @@ namespace Disco.Web.Areas.API.Controllers
case pDistributionType:
UpdateDistributionType(deviceProfile, value);
break;
case pCertificateProviderId:
UpdateCertificateProviderId(deviceProfile, value);
case pCertificateProviders:
UpdateCertificateProviders(deviceProfile, value);
break;
case pCertificateAuthorityProviders:
UpdateCertificateAuthorityProviders(deviceProfile, value);
break;
case pWirelessProfileProviders:
UpdateWirelessProfileProviders(deviceProfile, value);
break;
case pOrganisationalUnit:
UpdateOrganisationalUnit(deviceProfile, value);
@@ -139,9 +153,21 @@ namespace Disco.Web.Areas.API.Controllers
}
[DiscoAuthorize(Claims.Config.DeviceProfile.Configure)]
public virtual ActionResult UpdateCertificateProviderId(int id, string CertificateProviderId = null, Nullable<bool> redirect = null)
public virtual ActionResult UpdateCertificateProviders(int id, string CertificateProviders = null, Nullable<bool> redirect = null)
{
return Update(id, pCertificateProviderId, CertificateProviderId, redirect);
return Update(id, pCertificateProviders, CertificateProviders, redirect);
}
[DiscoAuthorize(Claims.Config.DeviceProfile.Configure)]
public virtual ActionResult UpdateCertificateAuthorityProviders(int id, string CertificateAuthorityProviders = null, Nullable<bool> redirect = null)
{
return Update(id, pCertificateAuthorityProviders, CertificateAuthorityProviders, redirect);
}
[DiscoAuthorize(Claims.Config.DeviceProfile.Configure)]
public virtual ActionResult UpdateWirelessProfileProviders(int id, string WirelessProfileProviders = null, Nullable<bool> redirect = null)
{
return Update(id, pWirelessProfileProviders, WirelessProfileProviders, redirect);
}
[DiscoAuthorize(Claims.Config.DeviceProfile.Configure)]
@@ -298,21 +324,111 @@ namespace Disco.Web.Areas.API.Controllers
throw new Exception("Invalid Distribution Type Number");
}
private void UpdateCertificateProviderId(Disco.Models.Repository.DeviceProfile deviceProfile, string CertificateProviderId)
private void UpdateCertificateProviders(DeviceProfile deviceProfile, string CertificateProviderIds)
{
if (string.IsNullOrWhiteSpace(CertificateProviderId))
if (string.IsNullOrWhiteSpace(CertificateProviderIds))
{
deviceProfile.CertificateProviderId = null;
deviceProfile.CertificateProviders = null;
}
else
{
// Validate
var featureManifest = Disco.Services.Plugins.Plugins.GetPluginFeature(CertificateProviderId, typeof(Disco.Services.Plugins.Features.CertificateProvider.CertificateProviderFeature));
if (featureManifest == null)
throw new Exception(string.Format("Invalid Certificate Provider Plugin Id: [{0}]", CertificateProviderId));
var validatedProviders = new List<PluginFeatureManifest>();
foreach (var certificateProviderId in CertificateProviderIds.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
var featureManifest = Plugins.GetPluginFeature(certificateProviderId, typeof(CertificateProviderFeature));
if (featureManifest == null)
{
throw new Exception(string.Format("Invalid Certificate Provider Plugin Id: [{0}]", certificateProviderId));
}
else
{
validatedProviders.Add(featureManifest);
}
}
if (validatedProviders.Count > 0)
{
deviceProfile.CertificateProviders = string.Join(",", validatedProviders.Select(p => p.Id));
}
else
deviceProfile.CertificateProviderId = featureManifest.Id;
{
deviceProfile.CertificateProviders = null;
}
}
Database.SaveChanges();
}
private void UpdateCertificateAuthorityProviders(DeviceProfile deviceProfile, string CertificateAuthorityProviderIds)
{
if (string.IsNullOrWhiteSpace(CertificateAuthorityProviderIds))
{
deviceProfile.CertificateAuthorityProviders = null;
}
else
{
// Validate
var validatedProviders = new List<PluginFeatureManifest>();
foreach (var certificateAuthorityProviderId in CertificateAuthorityProviderIds.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
var featureManifest = Plugins.GetPluginFeature(certificateAuthorityProviderId, typeof(CertificateAuthorityProviderFeature));
if (featureManifest == null)
{
throw new Exception(string.Format("Invalid Certificate Authority Provider Plugin Id: [{0}]", certificateAuthorityProviderId));
}
else
{
validatedProviders.Add(featureManifest);
}
}
if (validatedProviders.Count > 0)
{
deviceProfile.CertificateAuthorityProviders = string.Join(",", validatedProviders.Select(p => p.Id));
}
else
{
deviceProfile.CertificateAuthorityProviders = null;
}
}
Database.SaveChanges();
}
private void UpdateWirelessProfileProviders(DeviceProfile deviceProfile, string WirelessProfileProviderIds)
{
if (string.IsNullOrWhiteSpace(WirelessProfileProviderIds))
{
deviceProfile.WirelessProfileProviders = null;
}
else
{
// Validate
var validatedProviders = new List<PluginFeatureManifest>();
foreach (var wirelessProfileProviderId in WirelessProfileProviderIds.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
var featureManifest = Plugins.GetPluginFeature(wirelessProfileProviderId, typeof(WirelessProfileProviderFeature));
if (featureManifest == null)
{
throw new Exception(string.Format("Invalid Wireless Profile Provider Plugin Id: [{0}]", wirelessProfileProviderId));
}
else
{
validatedProviders.Add(featureManifest);
}
}
if (validatedProviders.Count > 0)
{
deviceProfile.WirelessProfileProviders = string.Join(",", validatedProviders.Select(p => p.Id));
}
else
{
deviceProfile.WirelessProfileProviders = null;
}
}
Database.SaveChanges();
}