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:
@@ -1,12 +1,11 @@
|
||||
using Disco.BI.Extensions;
|
||||
using Disco.Models.Repository;
|
||||
using Disco.Models.Repository;
|
||||
using Disco.Services;
|
||||
using Disco.Services.Authorization;
|
||||
using Disco.Services.Authorization.Roles;
|
||||
using Disco.Services.Interop.ActiveDirectory;
|
||||
using Disco.Services.Users;
|
||||
using Disco.Services.Web;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Web.Mvc;
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using Disco.BI.Extensions;
|
||||
using Disco.Models.Repository;
|
||||
using Disco.Models.Repository;
|
||||
using Disco.Services;
|
||||
using Disco.Services.Authorization;
|
||||
using Disco.Services.Devices.ManagedGroups;
|
||||
|
||||
@@ -703,7 +703,7 @@ namespace Disco.Web.Areas.API.Controllers
|
||||
[DiscoAuthorize(Claims.DiscoAdminAccount)]
|
||||
public virtual ActionResult MigrateDeviceMacAddressesFromLog()
|
||||
{
|
||||
var taskStatus = Disco.BI.DeviceBI.Migration.LogMacAddressImporting.ScheduleImmediately();
|
||||
var taskStatus = Disco.Services.Devices.Enrolment.LogMacAddressImportingTask.ScheduleImmediately();
|
||||
return RedirectToAction(MVC.Config.Logging.TaskStatus(taskStatus.SessionId));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using Disco.BI.Extensions;
|
||||
using Disco.Models.Repository;
|
||||
using Disco.Models.Repository;
|
||||
using Disco.Services;
|
||||
using Disco.Services.Authorization;
|
||||
using Disco.Services.Plugins;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
using Disco.BI;
|
||||
using Disco.BI.DocumentTemplateBI.ManagedGroups;
|
||||
using Disco.BI.Extensions;
|
||||
using Disco.BI.Extensions;
|
||||
using Disco.Models.Repository;
|
||||
using Disco.Services;
|
||||
using Disco.Services.Authorization;
|
||||
using Disco.Services.Documents;
|
||||
using Disco.Services.Documents.ManagedGroups;
|
||||
using Disco.Services.Interop.ActiveDirectory;
|
||||
using Disco.Services.Tasks;
|
||||
using Disco.Services.Users;
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
using Disco.BI.Extensions;
|
||||
using Disco.Models.Repository;
|
||||
using Disco.Models.Services.Documents;
|
||||
using Disco.Models.Services.Job;
|
||||
using Disco.Models.Services.Jobs.JobLists;
|
||||
using Disco.Services;
|
||||
using Disco.Services.Authorization;
|
||||
using Disco.Services.Interop;
|
||||
using Disco.Services.Jobs.JobLists;
|
||||
using Disco.Services.Jobs.Statistics;
|
||||
using Disco.Services.Users;
|
||||
using Disco.Services.Web;
|
||||
using Disco.Web.Extensions;
|
||||
@@ -528,7 +530,7 @@ namespace Disco.Web.Areas.API.Controllers
|
||||
private void UpdateDeviceHeldLocation(Job job, string DeviceHeldLocation)
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(DeviceHeldLocation) &&
|
||||
Database.DiscoConfiguration.JobPreferences.LocationMode == Disco.Models.BI.Job.LocationModes.RestrictedList)
|
||||
Database.DiscoConfiguration.JobPreferences.LocationMode == LocationModes.RestrictedList)
|
||||
{
|
||||
// Enforce Restricted List Mode
|
||||
var value = DeviceHeldLocation.Trim();
|
||||
@@ -2076,7 +2078,7 @@ namespace Disco.Web.Areas.API.Controllers
|
||||
[DiscoAuthorize(Claims.Job.Show)]
|
||||
public virtual ActionResult StatisticsDailyOpenedClosed()
|
||||
{
|
||||
var result = BI.JobBI.Statistics.DailyOpenedClosed.Data(Database, true);
|
||||
var result = DailyOpenedClosed.Data(Database, true);
|
||||
|
||||
return Json(result, JsonRequestBehavior.AllowGet);
|
||||
}
|
||||
@@ -2123,12 +2125,12 @@ namespace Disco.Web.Areas.API.Controllers
|
||||
|
||||
switch (Database.DiscoConfiguration.JobPreferences.LocationMode)
|
||||
{
|
||||
case Disco.Models.BI.Job.LocationModes.Unrestricted:
|
||||
case LocationModes.Unrestricted:
|
||||
var jobDateThreshold = DateTime.Now.AddYears(-1);
|
||||
locations = Database.Jobs.Where(j => (j.OpenedDate > jobDateThreshold || !j.ClosedDate.HasValue) && j.DeviceHeldLocation != null).Select(j => j.DeviceHeldLocation).Distinct().OrderBy(l => l).ToList().Where(l => !string.IsNullOrWhiteSpace(l)).Select(l => l.Trim()).Distinct(StringComparer.OrdinalIgnoreCase).OrderBy(l => l).ToList();
|
||||
break;
|
||||
case Disco.Models.BI.Job.LocationModes.OptionalList:
|
||||
case Disco.Models.BI.Job.LocationModes.RestrictedList:
|
||||
case LocationModes.OptionalList:
|
||||
case LocationModes.RestrictedList:
|
||||
locations = Database.DiscoConfiguration.JobPreferences.LocationList;
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
using Disco.Models.BI.Job;
|
||||
using Disco.Models.Services.Job;
|
||||
using Disco.Services.Authorization;
|
||||
using Disco.Services.Web;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using System.Web.Mvc;
|
||||
|
||||
namespace Disco.Web.Areas.API.Controllers
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
using Disco.Models.Repository;
|
||||
using Disco.Services.Authorization;
|
||||
using Disco.Services.Interop.ActiveDirectory;
|
||||
using Disco.Services.Jobs.JobQueues;
|
||||
using Disco.Services.Web;
|
||||
using Disco.BI.Extensions;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Web.Mvc;
|
||||
using System.Collections.Generic;
|
||||
using Disco.Services.Interop.ActiveDirectory;
|
||||
|
||||
namespace Disco.Web.Areas.API.Controllers
|
||||
{
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
using Disco.Models.Repository;
|
||||
using Disco.Services;
|
||||
using Disco.Services.Authorization;
|
||||
using Disco.Services.Jobs.JobQueues;
|
||||
using Disco.BI.Extensions;
|
||||
using Disco.Services.Web;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using System.Web.Mvc;
|
||||
|
||||
namespace Disco.Web.Areas.API.Controllers
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using Disco.BI.Extensions;
|
||||
using Disco.Data.Configuration;
|
||||
using Disco.Data.Configuration;
|
||||
using Disco.Services;
|
||||
using Disco.Services.Authorization;
|
||||
using Disco.Services.Interop.ActiveDirectory;
|
||||
@@ -29,40 +28,9 @@ namespace Disco.Web.Areas.API.Controllers
|
||||
[DiscoAuthorize(Claims.DiscoAdminAccount)]
|
||||
public virtual ActionResult UpdateAttachmentThumbnails()
|
||||
{
|
||||
// Device Attachments
|
||||
var das = Database.DeviceAttachments.Where(da => da.MimeType == "application/pdf");
|
||||
foreach (var da in das)
|
||||
{
|
||||
var fileName = da.RepositoryThumbnailFilename(Database);
|
||||
if (!System.IO.File.Exists(fileName))
|
||||
{
|
||||
da.GenerateThumbnail(Database);
|
||||
}
|
||||
}
|
||||
|
||||
// User Attachments
|
||||
var uas = Database.UserAttachments.Where(ua => ua.MimeType == "application/pdf");
|
||||
foreach (var ua in uas)
|
||||
{
|
||||
var fileName = ua.RepositoryThumbnailFilename(Database);
|
||||
if (!System.IO.File.Exists(fileName))
|
||||
{
|
||||
ua.GenerateThumbnail(Database);
|
||||
}
|
||||
}
|
||||
|
||||
// Job Attachments
|
||||
var jas = Database.JobAttachments.Where(ja => ja.MimeType == "application/pdf");
|
||||
foreach (var ja in jas)
|
||||
{
|
||||
var fileName = ja.RepositoryThumbnailFilename(Database);
|
||||
if (!System.IO.File.Exists(fileName))
|
||||
{
|
||||
ja.GenerateThumbnail(Database);
|
||||
}
|
||||
}
|
||||
|
||||
return Content("Done", "text/text");
|
||||
var ts = Disco.Services.Documents.AttachmentImport.ThumbnailUpdateTask.ScheduleImmediately();
|
||||
ts.SetFinishedUrl(Url.Action(MVC.Config.SystemConfig.Index()));
|
||||
return RedirectToAction(MVC.Config.Logging.TaskStatus(ts.SessionId));
|
||||
}
|
||||
|
||||
[DiscoAuthorize(Claims.Config.System.Show)]
|
||||
@@ -243,7 +211,7 @@ namespace Disco.Web.Areas.API.Controllers
|
||||
try
|
||||
{
|
||||
var result = ActiveDirectory.Context.UpdateSearchAllForestServers(Database, SearchAllForestServers);
|
||||
|
||||
|
||||
Database.SaveChanges();
|
||||
|
||||
if (!result)
|
||||
@@ -269,11 +237,24 @@ namespace Disco.Web.Areas.API.Controllers
|
||||
}
|
||||
}
|
||||
|
||||
[DiscoAuthorize(Claims.Config.System.ConfigureActiveDirectory)]
|
||||
public virtual ActionResult UpdateActiveDirectorySearchWildcardSuffixOnly(bool SearchWildcardSuffixOnly, bool redirect = false)
|
||||
{
|
||||
ActiveDirectory.Context.UpdateWildcardSearchSuffixOnly(Database, SearchWildcardSuffixOnly);
|
||||
|
||||
Database.SaveChanges();
|
||||
|
||||
if (redirect)
|
||||
return RedirectToAction(MVC.Config.SystemConfig.Index());
|
||||
else
|
||||
return Json("OK", JsonRequestBehavior.AllowGet);
|
||||
}
|
||||
|
||||
[DiscoAuthorizeAny(Claims.Config.System.ConfigureActiveDirectory, Claims.Config.DeviceProfile.Configure)]
|
||||
public virtual ActionResult DomainOrganisationalUnits()
|
||||
{
|
||||
var domainOUs = ActiveDirectory.RetrieveADOrganisationalUnitStructure()
|
||||
.Select(d => new Models.System.DomainOrganisationalUnitsModel() { Domain = d.Item1, OrganisationalUnits = d.Item2})
|
||||
.Select(d => new Models.System.DomainOrganisationalUnitsModel() { Domain = d.Item1, OrganisationalUnits = d.Item2 })
|
||||
.Select(ous => ous.ToFancyTreeNode()).ToList();
|
||||
|
||||
return new JsonResult()
|
||||
@@ -322,12 +303,12 @@ namespace Disco.Web.Areas.API.Controllers
|
||||
public virtual ActionResult SyncActiveDirectoryManagedGroup(string id, string redirectUrl = null)
|
||||
{
|
||||
ADManagedGroup managedGroup;
|
||||
|
||||
|
||||
if (!ActiveDirectory.Context.ManagedGroups.TryGetValue(id, out managedGroup))
|
||||
throw new ArgumentException("Unknown Managed Group Key");
|
||||
|
||||
var taskStatus = ADManagedGroupsSyncTask.ScheduleSync(managedGroup);
|
||||
|
||||
|
||||
if (redirectUrl != null)
|
||||
taskStatus.SetFinishedUrl(redirectUrl);
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
using Disco.BI.Extensions;
|
||||
using Disco.Models.Repository;
|
||||
using Disco.Models.Repository;
|
||||
using Disco.Services;
|
||||
using Disco.Services.Authorization;
|
||||
using Disco.Services.Users.UserFlags;
|
||||
using Disco.Services.Web;
|
||||
@@ -13,7 +13,7 @@ namespace Disco.Web.Areas.API.Controllers
|
||||
{
|
||||
const string pComments = "comments";
|
||||
|
||||
public virtual ActionResult Update(int id, string key, string value = null, Nullable<bool> redirect = null)
|
||||
public virtual ActionResult Update(int id, string key, string value = null, bool? redirect = null)
|
||||
{
|
||||
try
|
||||
{
|
||||
@@ -53,7 +53,7 @@ namespace Disco.Web.Areas.API.Controllers
|
||||
|
||||
#region Update Shortcut Methods
|
||||
[DiscoAuthorizeAny(Claims.User.Actions.EditFlags)]
|
||||
public virtual ActionResult UpdateComments(int id, string Comments = null, Nullable<bool> redirect = null)
|
||||
public virtual ActionResult UpdateComments(int id, string Comments = null, bool? redirect = null)
|
||||
{
|
||||
return Update(id, pComments, Comments, redirect);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user