Try your search with a different keyword or use * as a wildcard.
using Microsoft.AspNetCore.Mvc;
using Nop.Core;
using Nop.Core.Domain.Catalog;
using Nop.Core.Domain.Cms;
using Nop.Core.Domain.Customers;
using Nop.Core.Domain.Payments;
using Nop.Core.Domain.Shipping;
using Nop.Core.Domain.Tax;
using Nop.Core.Events;
using Nop.Services.Authentication.External;
using Nop.Services.Authentication.MultiFactor;
using Nop.Services.Catalog;
using Nop.Services.Cms;
using Nop.Services.Configuration;
using Nop.Services.Localization;
using Nop.Services.Logging;
using Nop.Services.Messages;
using Nop.Services.Payments;
using Nop.Services.Plugins;
using Nop.Services.Security;
using Nop.Services.Shipping;
using Nop.Services.Shipping.Pickup;
using Nop.Services.Tax;
using Nop.Services.Themes;
using Nop.Web.Areas.Admin.Factories;
using Nop.Web.Areas.Admin.Models.Common;
using Nop.Web.Areas.Admin.Models.Plugins;
using Nop.Web.Areas.Admin.Models.Plugins.Marketplace;
using Nop.Web.Framework.Controllers;
namespace Nop.Web.Areas.Admin.Controllers;
public partial class PluginController : BaseAdminController
{
#region Fields
protected readonly CatalogSettings _catalogSettings;
protected readonly ExternalAuthenticationSettings _externalAuthenticationSettings;
protected readonly IAuthenticationPluginManager _authenticationPluginManager;
protected readonly ICommonModelFactory _commonModelFactory;
protected readonly ICustomerActivityService _customerActivityService;
protected readonly IEventPublisher _eventPublisher;
protected readonly ILocalizationService _localizationService;
protected readonly IMultiFactorAuthenticationPluginManager _multiFactorAuthenticationPluginManager;
protected readonly INotificationService _notificationService;
protected readonly IPermissionService _permissionService;
protected readonly IPaymentPluginManager _paymentPluginManager;
protected readonly IPickupPluginManager _pickupPluginManager;
protected readonly IPluginModelFactory _pluginModelFactory;
protected readonly IPluginService _pluginService;
protected readonly ISearchPluginManager _searchPluginManager;
protected readonly ISettingService _settingService;
protected readonly IShippingPluginManager _shippingPluginManager;
protected readonly IUploadService _uploadService;
protected readonly IWidgetPluginManager _widgetPluginManager;
protected readonly IWorkContext _workContext;
protected readonly MultiFactorAuthenticationSettings _multiFactorAuthenticationSettings;
protected readonly PaymentSettings _paymentSettings;
protected readonly ShippingSettings _shippingSettings;
protected readonly TaxSettings _taxSettings;
protected readonly WidgetSettings _widgetSettings;
#endregion
#region Ctor
public PluginController(CatalogSettings catalogSettings,
ExternalAuthenticationSettings externalAuthenticationSettings,
IAuthenticationPluginManager authenticationPluginManager,
ICommonModelFactory commonModelFactory,
ICustomerActivityService customerActivityService,
IEventPublisher eventPublisher,
ILocalizationService localizationService,
IMultiFactorAuthenticationPluginManager multiFactorAuthenticationPluginManager,
INotificationService notificationService,
IPermissionService permissionService,
IPaymentPluginManager paymentPluginManager,
IPickupPluginManager pickupPluginManager,
IPluginModelFactory pluginModelFactory,
IPluginService pluginService,
ISearchPluginManager searchPluginManager,
ISettingService settingService,
IShippingPluginManager shippingPluginManager,
IUploadService uploadService,
IWidgetPluginManager widgetPluginManager,
IWorkContext workContext,
MultiFactorAuthenticationSettings multiFactorAuthenticationSettings,
PaymentSettings paymentSettings,
ShippingSettings shippingSettings,
TaxSettings taxSettings,
WidgetSettings widgetSettings)
{
_catalogSettings = catalogSettings;
_externalAuthenticationSettings = externalAuthenticationSettings;
_authenticationPluginManager = authenticationPluginManager;
_commonModelFactory = commonModelFactory;
_customerActivityService = customerActivityService;
_eventPublisher = eventPublisher;
_localizationService = localizationService;
_multiFactorAuthenticationPluginManager = multiFactorAuthenticationPluginManager;
_notificationService = notificationService;
_permissionService = permissionService;
_paymentPluginManager = paymentPluginManager;
_pickupPluginManager = pickupPluginManager;
_pluginModelFactory = pluginModelFactory;
_pluginService = pluginService;
_searchPluginManager = searchPluginManager;
_settingService = settingService;
_shippingPluginManager = shippingPluginManager;
_uploadService = uploadService;
_widgetPluginManager = widgetPluginManager;
_workContext = workContext;
_multiFactorAuthenticationSettings = multiFactorAuthenticationSettings;
_paymentSettings = paymentSettings;
_shippingSettings = shippingSettings;
_taxSettings = taxSettings;
_widgetSettings = widgetSettings;
}
#endregion
#region Methods
public virtual async Task List(bool showWarnings = true)
{
if (!await _permissionService.AuthorizeAsync(StandardPermissionProvider.ManagePlugins))
return AccessDeniedView();
var model = await _pluginModelFactory.PreparePluginSearchModelAsync(new PluginSearchModel());
if (!showWarnings)
return View(model);
var warnings = new List();
await _commonModelFactory.PreparePluginsWarningModelAsync(warnings);
if (warnings.Any())
_notificationService.WarningNotification(string.Join("
", warnings), false);
return View(model);
}
[HttpPost]
public virtual async Task ListSelect(PluginSearchModel searchModel)
{
if (!await _permissionService.AuthorizeAsync(StandardPermissionProvider.ManagePlugins))
return await AccessDeniedDataTablesJson();
//prepare model
var model = await _pluginModelFactory.PreparePluginListModelAsync(searchModel);
return Json(model);
}
public virtual async Task AdminNavigationPlugins()
{
if (!await _permissionService.AuthorizeAsync(StandardPermissionProvider.ManagePlugins))
return Json(new List());
//prepare models
var models = await (await _pluginModelFactory.PrepareAdminNavigationPluginModelsAsync()).SelectAwait(async model => new
{
title = model.FriendlyName,
link = model.ConfigurationUrl,
parent = await _localizationService.GetResourceAsync("Admin.Configuration.Plugins.Local"),
grandParent = string.Empty,
rate = -50 //negative rate is set to move plugins to the end of list
}).ToListAsync();
return Json(models);
}
[HttpPost]
public virtual async Task UploadPluginsAndThemes(IFormFile archivefile)
{
if (!await _permissionService.AuthorizeAsync(StandardPermissionProvider.ManagePlugins))
return AccessDeniedView();
try
{
if (archivefile == null || archivefile.Length == 0)
throw new NopException(await _localizationService.GetResourceAsync("Admin.Common.UploadFile"));
var descriptors = await _uploadService.UploadPluginsAndThemesAsync(archivefile);
var pluginDescriptors = descriptors.OfType().ToList();
var themeDescriptors = descriptors.OfType().ToList();
//activity log
foreach (var descriptor in pluginDescriptors)
{
await _customerActivityService.InsertActivityAsync("UploadNewPlugin",
string.Format(await _localizationService.GetResourceAsync("ActivityLog.UploadNewPlugin"), descriptor.FriendlyName));
}
foreach (var descriptor in themeDescriptors)
{
await _customerActivityService.InsertActivityAsync("UploadNewTheme",
string.Format(await _localizationService.GetResourceAsync("ActivityLog.UploadNewTheme"), descriptor.FriendlyName));
}
//events
if (pluginDescriptors.Any())
await _eventPublisher.PublishAsync(new PluginsUploadedEvent(pluginDescriptors));
if (themeDescriptors.Any())
await _eventPublisher.PublishAsync(new ThemesUploadedEvent(themeDescriptors));
var message = string.Format(await _localizationService.GetResourceAsync("Admin.Configuration.Plugins.Uploaded"), pluginDescriptors.Count, themeDescriptors.Count);
_notificationService.SuccessNotification(message);
if (themeDescriptors.Any())
return View("RestartApplication", Url.Action("List", "Plugin"));
}
catch (Exception exc)
{
await _notificationService.ErrorNotificationAsync(exc);
}
return RedirectToAction("List", new { showWarnings = false });
}
[HttpPost, ActionName("List")]
[FormValueRequired(FormValueRequirement.StartsWith, "install-plugin-link-")]
public virtual async Task Install(IFormCollection form)
{
if (!await _permissionService.AuthorizeAsync(StandardPermissionProvider.ManagePlugins))
return AccessDeniedView();
try
{
//get plugin system name
string systemName = null;
foreach (var formValue in form.Keys)
if (formValue.StartsWith("install-plugin-link-", StringComparison.InvariantCultureIgnoreCase))
systemName = formValue["install-plugin-link-".Length..];
var pluginDescriptor = await _pluginService.GetPluginDescriptorBySystemNameAsync(systemName, LoadPluginsMode.All);
if (pluginDescriptor == null)
//No plugin found with the specified id
return RedirectToAction("List", new { showWarnings = false });
//check whether plugin is not installed
if (pluginDescriptor.Installed)
return RedirectToAction("List", new { showWarnings = false });
await _pluginService.PreparePluginToInstallAsync(pluginDescriptor.SystemName, await _workContext.GetCurrentCustomerAsync());
pluginDescriptor.ShowInPluginsList = false;
_notificationService.SuccessNotification(await _localizationService.GetResourceAsync("Admin.Configuration.Plugins.ChangesApplyAfterReboot"));
}
catch (Exception exc)
{
await _notificationService.ErrorNotificationAsync(exc);
}
return RedirectToAction("List", new { showWarnings = false });
}
[HttpPost, ActionName("List")]
[FormValueRequired(FormValueRequirement.StartsWith, "uninstall-plugin-link-")]
public virtual async Task Uninstall(IFormCollection form)
{
if (!await _permissionService.AuthorizeAsync(StandardPermissionProvider.ManagePlugins))
return AccessDeniedView();
try
{
//get plugin system name
string systemName = null;
foreach (var formValue in form.Keys)
if (formValue.StartsWith("uninstall-plugin-link-", StringComparison.InvariantCultureIgnoreCase))
systemName = formValue["uninstall-plugin-link-".Length..];
var pluginDescriptor = await _pluginService.GetPluginDescriptorBySystemNameAsync(systemName, LoadPluginsMode.All);
if (pluginDescriptor == null)
//No plugin found with the specified id
return RedirectToAction("List", new { showWarnings = false });
//check whether plugin is installed
if (!pluginDescriptor.Installed)
return RedirectToAction("List", new { showWarnings = false });
await _pluginService.PreparePluginToUninstallAsync(pluginDescriptor.SystemName);
pluginDescriptor.ShowInPluginsList = false;
_notificationService.SuccessNotification(await _localizationService.GetResourceAsync("Admin.Configuration.Plugins.ChangesApplyAfterReboot"));
}
catch (Exception exc)
{
await _notificationService.ErrorNotificationAsync(exc);
}
return RedirectToAction("List", new { showWarnings = false });
}
[HttpPost, ActionName("List")]
[FormValueRequired(FormValueRequirement.StartsWith, "delete-plugin-link-")]
public virtual async Task Delete(IFormCollection form)
{
if (!await _permissionService.AuthorizeAsync(StandardPermissionProvider.ManagePlugins))
return AccessDeniedView();
try
{
//get plugin system name
string systemName = null;
foreach (var formValue in form.Keys)
if (formValue.StartsWith("delete-plugin-link-", StringComparison.InvariantCultureIgnoreCase))
systemName = formValue["delete-plugin-link-".Length..];
var pluginDescriptor = await _pluginService.GetPluginDescriptorBySystemNameAsync(systemName, LoadPluginsMode.All);
//check whether plugin is not installed
if (pluginDescriptor.Installed)
return RedirectToAction("List", new { showWarnings = false });
await _pluginService.PreparePluginToDeleteAsync(pluginDescriptor.SystemName);
pluginDescriptor.ShowInPluginsList = false;
_notificationService.SuccessNotification(await _localizationService.GetResourceAsync("Admin.Configuration.Plugins.ChangesApplyAfterReboot"));
}
catch (Exception exc)
{
await _notificationService.ErrorNotificationAsync(exc);
}
return RedirectToAction("List", new { showWarnings = false });
}
[HttpPost, ActionName("List")]
[FormValueRequired("plugin-reload-grid")]
public virtual async Task ReloadList()
{
if (!await _permissionService.AuthorizeAsync(StandardPermissionProvider.ManagePlugins))
return AccessDeniedView();
await _pluginService.UninstallPluginsAsync();
await _pluginService.DeletePluginsAsync();
return View("RestartApplication", Url.Action("List", "Plugin"));
}
public virtual async Task UninstallAndDeleteUnusedPlugins(string[] names)
{
if (!await _permissionService.AuthorizeAsync(StandardPermissionProvider.ManagePlugins))
return AccessDeniedView();
foreach (var name in names)
await _pluginService.PreparePluginToUninstallAsync(name);
await _pluginService.UninstallPluginsAsync();
foreach (var name in names)
await _pluginService.PreparePluginToDeleteAsync(name);
await _pluginService.DeletePluginsAsync();
return View("RestartApplication", Url.Action("Warnings", "Common"));
}
[HttpPost, ActionName("List")]
[FormValueRequired("plugin-apply-changes")]
public virtual async Task ApplyChanges()
{
return await ReloadList();
}
[HttpPost, ActionName("List")]
[FormValueRequired("plugin-discard-changes")]
public virtual async Task DiscardChanges()
{
if (!await _permissionService.AuthorizeAsync(StandardPermissionProvider.ManagePlugins))
return AccessDeniedView();
_pluginService.ResetChanges();
return RedirectToAction("List", new { showWarnings = false });
}
public virtual async Task EditPopup(string systemName)
{
if (!await _permissionService.AuthorizeAsync(StandardPermissionProvider.ManagePlugins))
return AccessDeniedView();
//try to get a plugin with the specified system name
var pluginDescriptor = await _pluginService.GetPluginDescriptorBySystemNameAsync(systemName, LoadPluginsMode.All);
if (pluginDescriptor == null)
return RedirectToAction("List", new { showWarnings = false });
//prepare model
var model = await _pluginModelFactory.PreparePluginModelAsync(null, pluginDescriptor);
return View(model);
}
[HttpPost]
public virtual async Task EditPopup(PluginModel model)
{
if (!await _permissionService.AuthorizeAsync(StandardPermissionProvider.ManagePlugins))
return AccessDeniedView();
//try to get a plugin with the specified system name
var pluginDescriptor = await _pluginService.GetPluginDescriptorBySystemNameAsync(model.SystemName, LoadPluginsMode.All);
if (pluginDescriptor == null)
return RedirectToAction("List", new { showWarnings = false });
if (ModelState.IsValid)
{
ViewBag.RefreshPage = true;
//we allow editing of 'friendly name', 'display order', store mappings
pluginDescriptor.FriendlyName = model.FriendlyName;
pluginDescriptor.DisplayOrder = model.DisplayOrder;
pluginDescriptor.LimitedToStores.Clear();
if (model.SelectedStoreIds.Any())
pluginDescriptor.LimitedToStores = model.SelectedStoreIds;
pluginDescriptor.LimitedToCustomerRoles.Clear();
if (model.SelectedCustomerRoleIds.Any())
pluginDescriptor.LimitedToCustomerRoles = model.SelectedCustomerRoleIds;
//update the description file
pluginDescriptor.Save();
//raise event
await _eventPublisher.PublishAsync(new PluginUpdatedEvent(pluginDescriptor));
//locales
var pluginInstance = pluginDescriptor.Instance();
foreach (var localized in model.Locales)
{
await _localizationService.SaveLocalizedFriendlyNameAsync(pluginInstance, localized.LanguageId, localized.FriendlyName);
}
//enabled/disabled
if (!pluginDescriptor.Installed)
return View(model);
bool pluginIsActive;
switch (pluginInstance)
{
case IPaymentMethod paymentMethod:
pluginIsActive = _paymentPluginManager.IsPluginActive(paymentMethod);
if (pluginIsActive && !model.IsEnabled)
{
//mark as disabled
_paymentSettings.ActivePaymentMethodSystemNames.Remove(pluginDescriptor.SystemName);
await _settingService.SaveSettingAsync(_paymentSettings);
break;
}
if (!pluginIsActive && model.IsEnabled)
{
//mark as enabled
_paymentSettings.ActivePaymentMethodSystemNames.Add(pluginDescriptor.SystemName);
await _settingService.SaveSettingAsync(_paymentSettings);
}
break;
case IShippingRateComputationMethod shippingRateComputationMethod:
pluginIsActive = _shippingPluginManager.IsPluginActive(shippingRateComputationMethod);
if (pluginIsActive && !model.IsEnabled)
{
//mark as disabled
_shippingSettings.ActiveShippingRateComputationMethodSystemNames.Remove(pluginDescriptor.SystemName);
await _settingService.SaveSettingAsync(_shippingSettings);
break;
}
if (!pluginIsActive && model.IsEnabled)
{
//mark as enabled
_shippingSettings.ActiveShippingRateComputationMethodSystemNames.Add(pluginDescriptor.SystemName);
await _settingService.SaveSettingAsync(_shippingSettings);
}
break;
case IPickupPointProvider pickupPointProvider:
pluginIsActive = _pickupPluginManager.IsPluginActive(pickupPointProvider);
if (pluginIsActive && !model.IsEnabled)
{
//mark as disabled
_shippingSettings.ActivePickupPointProviderSystemNames.Remove(pluginDescriptor.SystemName);
await _settingService.SaveSettingAsync(_shippingSettings);
break;
}
if (!pluginIsActive && model.IsEnabled)
{
//mark as enabled
_shippingSettings.ActivePickupPointProviderSystemNames.Add(pluginDescriptor.SystemName);
await _settingService.SaveSettingAsync(_shippingSettings);
}
break;
case ITaxProvider taxProvider:
if (!model.IsEnabled)
{
//mark as disabled
_taxSettings.ActiveTaxProviderSystemName = string.Empty;
await _settingService.SaveSettingAsync(_taxSettings);
break;
}
//mark as enabled
_taxSettings.ActiveTaxProviderSystemName = model.SystemName;
await _settingService.SaveSettingAsync(_taxSettings);
break;
case IExternalAuthenticationMethod externalAuthenticationMethod:
pluginIsActive = _authenticationPluginManager.IsPluginActive(externalAuthenticationMethod);
if (pluginIsActive && !model.IsEnabled)
{
//mark as disabled
_externalAuthenticationSettings.ActiveAuthenticationMethodSystemNames.Remove(pluginDescriptor.SystemName);
await _settingService.SaveSettingAsync(_externalAuthenticationSettings);
break;
}
if (!pluginIsActive && model.IsEnabled)
{
//mark as enabled
_externalAuthenticationSettings.ActiveAuthenticationMethodSystemNames.Add(pluginDescriptor.SystemName);
await _settingService.SaveSettingAsync(_externalAuthenticationSettings);
}
break;
case IMultiFactorAuthenticationMethod multiFactorAuthenticationMethod:
pluginIsActive = _multiFactorAuthenticationPluginManager.IsPluginActive(multiFactorAuthenticationMethod);
if (pluginIsActive && !model.IsEnabled)
{
//mark as disabled
_multiFactorAuthenticationSettings.ActiveAuthenticationMethodSystemNames.Remove(pluginDescriptor.SystemName);
await _settingService.SaveSettingAsync(_multiFactorAuthenticationSettings);
break;
}
if (!pluginIsActive && model.IsEnabled)
{
//mark as enabled
_multiFactorAuthenticationSettings.ActiveAuthenticationMethodSystemNames.Add(pluginDescriptor.SystemName);
await _settingService.SaveSettingAsync(_multiFactorAuthenticationSettings);
}
break;
case ISearchProvider _:
if (!model.IsEnabled)
{
//mark as disabled
_catalogSettings.ActiveSearchProviderSystemName = string.Empty;
await _settingService.SaveSettingAsync(_catalogSettings);
break;
}
//mark as enabled
_catalogSettings.ActiveSearchProviderSystemName = model.SystemName;
await _settingService.SaveSettingAsync(_catalogSettings);
break;
case IWidgetPlugin widgetPlugin:
pluginIsActive = _widgetPluginManager.IsPluginActive(widgetPlugin);
if (pluginIsActive && !model.IsEnabled)
{
//mark as disabled
_widgetSettings.ActiveWidgetSystemNames.Remove(pluginDescriptor.SystemName);
await _settingService.SaveSettingAsync(_widgetSettings);
break;
}
if (!pluginIsActive && model.IsEnabled)
{
//mark as enabled
_widgetSettings.ActiveWidgetSystemNames.Add(pluginDescriptor.SystemName);
await _settingService.SaveSettingAsync(_widgetSettings);
}
break;
}
//activity log
await _customerActivityService.InsertActivityAsync("EditPlugin",
string.Format(await _localizationService.GetResourceAsync("ActivityLog.EditPlugin"), pluginDescriptor.FriendlyName));
return View(model);
}
//prepare model
model = await _pluginModelFactory.PreparePluginModelAsync(model, pluginDescriptor, true);
//if we got this far, something failed, redisplay form
return View(model);
}
public virtual async Task OfficialFeed()
{
if (!await _permissionService.AuthorizeAsync(StandardPermissionProvider.ManagePlugins))
return AccessDeniedView();
//prepare model
var model = await _pluginModelFactory.PrepareOfficialFeedPluginSearchModelAsync(new OfficialFeedPluginSearchModel());
return View(model);
}
[HttpPost]
public virtual async Task OfficialFeedSelect(OfficialFeedPluginSearchModel searchModel)
{
if (!await _permissionService.AuthorizeAsync(StandardPermissionProvider.ManagePlugins))
return await AccessDeniedDataTablesJson();
//prepare model
var model = await _pluginModelFactory.PrepareOfficialFeedPluginListModelAsync(searchModel);
return Json(model);
}
#endregion
}