From e5d61af45c2f05196e4a20eebf1d7df518844d4c Mon Sep 17 00:00:00 2001 From: Eugene Petrenko Date: Thu, 24 Jun 2021 18:08:54 +0200 Subject: [PATCH] WIP plugins: check plugins filter before installing a plugin GitOrigin-RevId: 4a470b6fd9c27c3291888e47b638a8f0276c8fb8 --- .../ide/plugins/PluginInstallOperation.java | 5 +++++ .../org/PluginManagerConfigurableForOrg.kt | 4 ++++ .../InstallAndEnableTask.java | 4 +++- .../PluginAdvertiserService.kt | 7 +++++++ .../PluginsAdvertiserDialog.java | 16 ++++++++++++++++ 5 files changed, 35 insertions(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/PluginInstallOperation.java b/platform/platform-impl/src/com/intellij/ide/plugins/PluginInstallOperation.java index 675b47c45e9b..192c652c0984 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/PluginInstallOperation.java +++ b/platform/platform-impl/src/com/intellij/ide/plugins/PluginInstallOperation.java @@ -7,6 +7,7 @@ import com.intellij.ide.IdeBundle; import com.intellij.ide.plugins.marketplace.MarketplaceRequests; import com.intellij.ide.plugins.marketplace.statistics.PluginManagerUsageCollector; import com.intellij.ide.plugins.marketplace.statistics.enums.InstallationSourceEnum; +import com.intellij.ide.plugins.org.PluginManagerConfigurableForOrg; import com.intellij.notification.Notification; import com.intellij.notification.NotificationGroup; import com.intellij.notification.NotificationType; @@ -235,6 +236,10 @@ public final class PluginInstallOperation { private boolean prepareToInstall(@NotNull PluginNode pluginNode, @NotNull List pluginIds) throws IOException { if (!checkMissingDependencies(pluginNode, pluginIds)) return false; + if (!PluginManagerConfigurableForOrg.getInstance().allowInstallingPlugin(pluginNode)) { + LOG.warn("The plugin " + pluginNode.getPluginId() + " is not allowed to install for the organization"); + return false; + } IdeaPluginDescriptor toDisable = checkDependenciesAndReplacements(pluginNode); myShownErrors = false; diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/org/PluginManagerConfigurableForOrg.kt b/platform/platform-impl/src/com/intellij/ide/plugins/org/PluginManagerConfigurableForOrg.kt index 77694eaef763..74ad877bf606 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/org/PluginManagerConfigurableForOrg.kt +++ b/platform/platform-impl/src/com/intellij/ide/plugins/org/PluginManagerConfigurableForOrg.kt @@ -16,6 +16,10 @@ class PluginManagerConfigurableForOrg { fun getInstance(): PluginManagerConfigurableForOrg = service() } + fun allowInstallingPlugin(descriptor: IdeaPluginDescriptor) : Boolean { + return true + } + fun isPluginAllowed(isLocalPlugin: Boolean, descriptor: IdeaPluginDescriptor) : Boolean { diff --git a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/pluginsAdvertisement/InstallAndEnableTask.java b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/pluginsAdvertisement/InstallAndEnableTask.java index 6b94a3f0e7ed..3a3cd7fbc80e 100644 --- a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/pluginsAdvertisement/InstallAndEnableTask.java +++ b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/pluginsAdvertisement/InstallAndEnableTask.java @@ -7,6 +7,7 @@ import com.intellij.ide.plugins.PluginManagerCore; import com.intellij.ide.plugins.PluginNode; import com.intellij.ide.plugins.RepositoryHelper; import com.intellij.ide.plugins.marketplace.MarketplaceRequests; +import com.intellij.ide.plugins.org.PluginManagerConfigurableForOrg; import com.intellij.openapi.extensions.PluginId; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.Task; @@ -47,8 +48,9 @@ final class InstallAndEnableTask extends Task.Modal { List descriptors = new ArrayList<>(RepositoryHelper.mergePluginsFromRepositories(marketplacePlugins, myCustomPlugins, true)); + var org = PluginManagerConfigurableForOrg.getInstance(); for (IdeaPluginDescriptor descriptor : PluginManagerCore.getPlugins()) { - if (!descriptor.isEnabled() && PluginManagerCore.isCompatible(descriptor)) { + if (!descriptor.isEnabled() && PluginManagerCore.isCompatible(descriptor) && org.allowInstallingPlugin(descriptor)) { descriptors.add(descriptor); } } diff --git a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/pluginsAdvertisement/PluginAdvertiserService.kt b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/pluginsAdvertisement/PluginAdvertiserService.kt index 50f64b8bdb07..50f7f74da076 100644 --- a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/pluginsAdvertisement/PluginAdvertiserService.kt +++ b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/pluginsAdvertisement/PluginAdvertiserService.kt @@ -6,6 +6,7 @@ import com.intellij.ide.plugins.* import com.intellij.ide.plugins.advertiser.PluginData import com.intellij.ide.plugins.advertiser.PluginFeatureCacheService import com.intellij.ide.plugins.marketplace.MarketplaceRequests +import com.intellij.ide.plugins.org.PluginManagerConfigurableForOrg import com.intellij.ide.ui.PluginBooleanOptionDescriptor import com.intellij.notification.NotificationAction import com.intellij.notification.NotificationType @@ -66,6 +67,8 @@ open class PluginAdvertiserService { } } + val org = PluginManagerConfigurableForOrg.getInstance() + //include disabled plugins ids.filter { (pluginId, _) -> PluginManagerCore.isDisabled(pluginId) @@ -73,6 +76,8 @@ open class PluginAdvertiserService { PluginManagerCore.getPlugin(pluginId)?.let { plugin to it } + }.filter { + org.allowInstallingPlugin(it.second) }.forEach { (plugin, pluginDescriptor) -> disabledPlugins[plugin] = pluginDescriptor } @@ -95,6 +100,8 @@ open class PluginAdvertiserService { || !ids.containsKey(pluginId) || PluginManagerCore.isDisabled(pluginId) || PluginManagerCore.isBrokenPlugin(loadedPlugin) + }.filter { + org.allowInstallingPlugin(it) }.map { PluginDownloader.createDownloader(it) } invokeLater(ModalityState.NON_MODAL) { diff --git a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/pluginsAdvertisement/PluginsAdvertiserDialog.java b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/pluginsAdvertisement/PluginsAdvertiserDialog.java index 207d185eba38..c3f8d0aabd9c 100644 --- a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/pluginsAdvertisement/PluginsAdvertiserDialog.java +++ b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/pluginsAdvertisement/PluginsAdvertiserDialog.java @@ -3,11 +3,13 @@ package com.intellij.openapi.updateSettings.impl.pluginsAdvertisement; import com.intellij.ide.IdeBundle; import com.intellij.ide.plugins.*; +import com.intellij.ide.plugins.org.PluginManagerConfigurableForOrg; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.updateSettings.impl.DetectedPluginsPanel; import com.intellij.openapi.updateSettings.impl.PluginDownloader; +import com.intellij.openapi.util.text.StringUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -16,6 +18,7 @@ import java.io.IOException; import java.util.*; import java.util.function.Consumer; import java.util.function.Predicate; +import java.util.stream.Collectors; /** * @author anna @@ -91,6 +94,19 @@ public final class PluginsAdvertiserDialog extends DialogWrapper { return false; } + var org = PluginManagerConfigurableForOrg.getInstance(); + var notAllowedToInstallPlugins = nodes + .stream() + .filter(descriptor -> !org.allowInstallingPlugin(descriptor)) + .map(e -> e.getPluginId().getIdString()) + .collect(Collectors.toCollection(TreeSet::new)); + + if (!notAllowedToInstallPlugins.isEmpty()) { + LOG.warn("Some advertised plugins were not allowed to install for " + + "the organization: " + StringUtil.join(notAllowedToInstallPlugins, ", ")); + return false; + } + PluginManagerMain.suggestToEnableInstalledDependantPlugins(PluginEnabler.HEADLESS, nodes); Runnable notifyRunnable = () -> {