]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-12460 Fail startup when detecting GitLab Auth plugin
authorJulien Lancelot <julien.lancelot@sonarsource.com>
Thu, 19 Sep 2019 11:59:14 +0000 (13:59 +0200)
committerSonarTech <sonartech@sonarsource.com>
Mon, 23 Sep 2019 18:21:07 +0000 (20:21 +0200)
server/sonar-server-common/src/main/java/org/sonar/server/plugins/ServerExtensionInstaller.java
server/sonar-server-common/src/test/java/org/sonar/server/plugins/ServerExtensionInstallerTest.java [new file with mode: 0644]

index 97a8b68d1cc18177cb2b5b0f186317c88e36c16f..a0562ef3717fc45cd66c2c09405521b511e8940c 100644 (file)
@@ -24,14 +24,17 @@ import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.ListMultimap;
 import java.lang.annotation.Annotation;
 import java.util.Collection;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 import org.sonar.api.ExtensionProvider;
 import org.sonar.api.Plugin;
 import org.sonar.api.SonarRuntime;
 import org.sonar.api.config.Configuration;
 import org.sonar.api.internal.PluginContextImpl;
 import org.sonar.api.utils.AnnotationUtils;
+import org.sonar.api.utils.MessageException;
 import org.sonar.core.platform.ComponentContainer;
 import org.sonar.core.platform.PluginInfo;
 import org.sonar.core.platform.PluginRepository;
@@ -44,6 +47,8 @@ import static org.sonar.core.extension.ExtensionProviderSupport.isExtensionProvi
  */
 public abstract class ServerExtensionInstaller {
 
+  private static final Set<String> NO_MORE_COMPATIBLE_PLUGINS = ImmutableSet.of("authgitlab");
+
   private final SonarRuntime sonarRuntime;
   private final PluginRepository pluginRepository;
   private final Set<Class<? extends Annotation>> supportedAnnotationTypes;
@@ -57,8 +62,8 @@ public abstract class ServerExtensionInstaller {
   }
 
   public void installExtensions(ComponentContainer container) {
+    failWhenNoMoreCompatiblePlugins();
     ListMultimap<PluginInfo, Object> installedExtensionsByPlugin = ArrayListMultimap.create();
-
     for (PluginInfo pluginInfo : pluginRepository.getPluginInfos()) {
       try {
         String pluginKey = pluginInfo.getKey();
@@ -97,6 +102,17 @@ public abstract class ServerExtensionInstaller {
     }
   }
 
+  private void failWhenNoMoreCompatiblePlugins() {
+    List<String> noMoreCompatiblePluginNames = pluginRepository.getPluginInfos()
+      .stream()
+      .filter(pluginInfo -> NO_MORE_COMPATIBLE_PLUGINS.contains(pluginInfo.getKey()))
+      .map(PluginInfo::getName)
+      .collect(Collectors.toList());
+    if (!noMoreCompatiblePluginNames.isEmpty()) {
+      throw MessageException.of(String.format("Plugins '%s' are no more compatible with SonarQube", String.join(",", noMoreCompatiblePluginNames)));
+    }
+  }
+
   private void installProvider(ComponentContainer container, PluginInfo pluginInfo, ExtensionProvider provider) {
     Object obj = provider.provide();
     if (obj != null) {
@@ -110,7 +126,7 @@ public abstract class ServerExtensionInstaller {
     }
   }
 
-  Object installExtension(ComponentContainer container, PluginInfo pluginInfo, Object extension, boolean acceptProvider) {
+  private Object installExtension(ComponentContainer container, PluginInfo pluginInfo, Object extension, boolean acceptProvider) {
     for (Class<? extends Annotation> supportedAnnotationType : supportedAnnotationTypes) {
       if (AnnotationUtils.getAnnotation(extension, supportedAnnotationType) != null) {
         if (!acceptProvider && isExtensionProvider(extension)) {
diff --git a/server/sonar-server-common/src/test/java/org/sonar/server/plugins/ServerExtensionInstallerTest.java b/server/sonar-server-common/src/test/java/org/sonar/server/plugins/ServerExtensionInstallerTest.java
new file mode 100644 (file)
index 0000000..5c97ab1
--- /dev/null
@@ -0,0 +1,129 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2019 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.server.plugins;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.sonar.api.Plugin;
+import org.sonar.api.SonarEdition;
+import org.sonar.api.SonarQubeSide;
+import org.sonar.api.SonarRuntime;
+import org.sonar.api.internal.SonarRuntimeImpl;
+import org.sonar.api.server.ServerSide;
+import org.sonar.api.utils.MessageException;
+import org.sonar.api.utils.Version;
+import org.sonar.core.platform.ComponentContainer;
+import org.sonar.core.platform.PluginInfo;
+import org.sonar.core.platform.PluginRepository;
+
+import static java.util.Collections.singleton;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public class ServerExtensionInstallerTest {
+
+  @Rule
+  public ExpectedException expectedException = ExpectedException.none();
+
+  private SonarRuntime sonarRuntime = SonarRuntimeImpl.forSonarQube(Version.parse("8.0"), SonarQubeSide.SERVER, SonarEdition.COMMUNITY);
+  private TestPluginRepository pluginRepository = new TestPluginRepository();
+
+  private TestServerExtensionInstaller underTest = new TestServerExtensionInstaller(sonarRuntime, pluginRepository);
+
+  @Test
+  public void add_plugin_to_container() {
+    PluginInfo fooPluginInfo = newPlugin("foo", "Foo");
+    Plugin fooPlugin = mock(Plugin.class);
+    pluginRepository.add(fooPluginInfo, fooPlugin);
+    ComponentContainer componentContainer = new ComponentContainer();
+
+    underTest.installExtensions(componentContainer);
+
+    assertThat(componentContainer.getPicoContainer().getComponents()).contains(fooPlugin);
+  }
+
+  @Test
+  public void fail_when_detecting_gitlab_auth_plugin() {
+    PluginInfo foo = newPlugin("authgitlab", "GitLab Auth");
+    pluginRepository.add(foo, mock(Plugin.class));
+    ComponentContainer componentContainer = new ComponentContainer();
+
+    expectedException.expect(MessageException.class);
+    expectedException.expectMessage("Plugins 'GitLab Auth' are no more compatible with SonarQube");
+
+    underTest.installExtensions(componentContainer);
+  }
+
+  private static PluginInfo newPlugin(String key, String name) {
+    PluginInfo plugin = mock(PluginInfo.class);
+    when(plugin.getKey()).thenReturn(key);
+    when(plugin.getName()).thenReturn(name);
+    return plugin;
+  }
+
+  private static class TestPluginRepository implements PluginRepository {
+    private final Map<String, PluginInfo> pluginsInfoMap = new HashMap<>();
+    private final Map<String, Plugin> pluginsMap = new HashMap<>();
+
+    void add(PluginInfo pluginInfo, Plugin plugin) {
+      pluginsInfoMap.put(pluginInfo.getKey(), pluginInfo);
+      pluginsMap.put(pluginInfo.getKey(), plugin);
+    }
+
+    @Override
+    public Collection<PluginInfo> getPluginInfos() {
+      return pluginsInfoMap.values();
+    }
+
+    @Override
+    public PluginInfo getPluginInfo(String key) {
+      if (!pluginsMap.containsKey(key)) {
+        throw new IllegalArgumentException();
+      }
+      return pluginsInfoMap.get(key);
+    }
+
+    @Override
+    public Plugin getPluginInstance(String key) {
+      if (!pluginsMap.containsKey(key)) {
+        throw new IllegalArgumentException();
+      }
+      return pluginsMap.get(key);
+    }
+
+    @Override
+    public boolean hasPlugin(String key) {
+      return pluginsMap.containsKey(key);
+    }
+  }
+
+  private static class TestServerExtensionInstaller extends ServerExtensionInstaller {
+
+    protected TestServerExtensionInstaller(SonarRuntime sonarRuntime, PluginRepository pluginRepository) {
+      super(sonarRuntime, pluginRepository, singleton(ServerSide.class));
+    }
+  }
+
+}