diff --git a/core/src/main/java/hudson/ClassicPluginStrategy.java b/core/src/main/java/hudson/ClassicPluginStrategy.java index f7fdd821fd..22ce9459a0 100644 --- a/core/src/main/java/hudson/ClassicPluginStrategy.java +++ b/core/src/main/java/hudson/ClassicPluginStrategy.java @@ -241,8 +241,8 @@ public class ClassicPluginStrategy implements PluginStrategy { } } } - for (DetachedPlugin detached : DETACHED_LIST) - detached.fix(atts,optionalDependencies); + + fix(atts,optionalDependencies); // Register global classpath mask. This is useful for hiding JavaEE APIs that you might see from the container, // such as database plugin for JPA support. The Mask-Classes attribute is insufficient because those classes @@ -259,15 +259,35 @@ public class ClassicPluginStrategy implements PluginStrategy { return new PluginWrapper(pluginManager, archive, manifest, baseResourceURL, createClassLoader(paths, dependencyLoader, atts), disableFile, dependencies, optionalDependencies); } + + private static void fix(Attributes atts, List optionalDependencies) { + // don't fix the dependency for yourself, or else we'll have a cycle + String pluginName = atts.getValue("Short-Name"); + + // some earlier versions of maven-hpi-plugin apparently puts "null" as a literal in Hudson-Version. watch out for them. + String jenkinsVersion = atts.getValue("Jenkins-Version"); + if (jenkinsVersion==null) + jenkinsVersion = atts.getValue("Hudson-Version"); + + optionalDependencies.addAll(getImpliedDependencies(pluginName, jenkinsVersion)); + } /** - * Returns all the bundled plugin dependencies for a particular Jenkins version + * Returns all the plugin dependencies that are implicit based on a particular Jenkins version */ - public static List getPreviouslyBundledDependencies(String jenkinsVersion) { + public static List getImpliedDependencies(String pluginName, String jenkinsVersion) { List out = new ArrayList<>(); for (DetachedPlugin detached : DETACHED_LIST) { + if (detached.shortName.equals(pluginName)) { + continue; + } + if (BREAK_CYCLES.contains(pluginName + '/' + detached.shortName)) { + LOGGER.log(Level.FINE, "skipping implicit dependency {0} → {1}", new Object[] {pluginName, detached.shortName}); + continue; + } if (jenkinsVersion == null || jenkinsVersion.equals("null") || new VersionNumber(jenkinsVersion).compareTo(detached.splitWhen) <= 0) { out.add(new PluginWrapper.Dependency(detached.shortName + ':' + detached.requireVersion)); + LOGGER.log(Level.FINE, "adding implicit dependency {0} → {1} because of {2}", new Object[] {pluginName, detached.shortName, jenkinsVersion}); } } return out; @@ -390,25 +410,6 @@ public class ClassicPluginStrategy implements PluginStrategy { public VersionNumber getSplitWhen() { return splitWhen; } - - private void fix(Attributes atts, List optionalDependencies) { - // don't fix the dependency for yourself, or else we'll have a cycle - String yourName = atts.getValue("Short-Name"); - if (shortName.equals(yourName)) return; - if (BREAK_CYCLES.contains(yourName + '/' + shortName)) { - LOGGER.log(Level.FINE, "skipping implicit dependency {0} → {1}", new Object[] {yourName, shortName}); - return; - } - - // some earlier versions of maven-hpi-plugin apparently puts "null" as a literal in Hudson-Version. watch out for them. - String jenkinsVersion = atts.getValue("Jenkins-Version"); - if (jenkinsVersion==null) - jenkinsVersion = atts.getValue("Hudson-Version"); - if (jenkinsVersion == null || jenkinsVersion.equals("null") || new VersionNumber(jenkinsVersion).compareTo(splitWhen) <= 0) { - optionalDependencies.add(new PluginWrapper.Dependency(shortName + ':' + requireVersion)); - LOGGER.log(Level.FINE, "adding implicit dependency {0} → {1} because of {2}", new Object[] {yourName, shortName, jenkinsVersion}); - } - } } private static final List DETACHED_LIST = Collections.unmodifiableList(Arrays.asList( diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java index a191d04422..ed66c89f66 100644 --- a/core/src/main/java/hudson/PluginManager.java +++ b/core/src/main/java/hudson/PluginManager.java @@ -1158,7 +1158,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas } // JENKINS-33308 - automatically install implied/previously bundled dependencies for older plugins that may need them - for(PluginWrapper.Dependency previouslyBundledDependency : ClassicPluginStrategy.getPreviouslyBundledDependencies(p.requiredCore)) { + for(PluginWrapper.Dependency previouslyBundledDependency : ClassicPluginStrategy.getImpliedDependencies(p.name, p.requiredCore)) { // if they aren't already installed, note the dependencies show 'need restart' messages if installed multiple times // but it can't be prevented here if(getPlugin(previouslyBundledDependency.shortName) == null) { diff --git a/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java b/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java index 4d6781eca5..3d2e447527 100644 --- a/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java +++ b/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java @@ -81,7 +81,6 @@ import java.util.Collections; import java.util.List; import java.util.MissingResourceException; import java.util.ResourceBundle; -import java.util.logging.Level; import java.util.logging.Logger; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; @@ -385,9 +384,7 @@ public class HudsonPrivateSecurityRealm extends AbstractPasswordBasedSecurityRea Class up = Jenkins.getInstance().pluginManager.uberClassLoader.loadClass("hudson.tasks.Mailer$UserProperty"); Constructor c = up.getDeclaredConstructor(String.class); user.addProperty((UserProperty)c.newInstance(si.email)); - } catch (RuntimeException e) { - throw e; - } catch (Exception e) { + } catch (ReflectiveOperationException e) { throw new RuntimeException(e); } } @@ -395,6 +392,7 @@ public class HudsonPrivateSecurityRealm extends AbstractPasswordBasedSecurityRea return user; } + @Restricted(NoExternalUse.class) public boolean isMailerPluginPresent() { try { // mail support has moved to a separate plugin