Webiant Logo Webiant Logo
  1. No results found.

    Try your search with a different keyword or use * as a wildcard.

PluginController.cs

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 }