diff --git a/core/src/main/java/hudson/ExtensionFinder.java b/core/src/main/java/hudson/ExtensionFinder.java index 1ff0638c10..9e9c18f63b 100644 --- a/core/src/main/java/hudson/ExtensionFinder.java +++ b/core/src/main/java/hudson/ExtensionFinder.java @@ -42,7 +42,6 @@ import com.google.inject.spi.ProvisionListener; import hudson.init.InitMilestone; import hudson.model.Descriptor; import hudson.model.Hudson; -import hudson.util.ReflectionUtils; import jenkins.ExtensionComponentSet; import jenkins.ExtensionFilter; import jenkins.ExtensionRefreshException; diff --git a/core/src/main/java/hudson/ExtensionList.java b/core/src/main/java/hudson/ExtensionList.java index 566e3de404..b4d32bd06d 100644 --- a/core/src/main/java/hudson/ExtensionList.java +++ b/core/src/main/java/hudson/ExtensionList.java @@ -245,8 +245,7 @@ public class ExtensionList extends AbstractList implements OnMaster { } private boolean removeComponent(Collection> collection, Object t) { - for (Iterator> itr = collection.iterator(); itr.hasNext();) { - ExtensionComponent c = itr.next(); + for (ExtensionComponent c : collection) { if (c.getInstance().equals(t)) { return collection.remove(c); } diff --git a/core/src/main/java/hudson/ExtensionPoint.java b/core/src/main/java/hudson/ExtensionPoint.java index e544ed7576..f49a5a096c 100644 --- a/core/src/main/java/hudson/ExtensionPoint.java +++ b/core/src/main/java/hudson/ExtensionPoint.java @@ -29,7 +29,6 @@ import static java.lang.annotation.ElementType.TYPE; import java.lang.annotation.Retention; import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.Target; -import jenkins.util.io.OnMaster; /** * Marker interface that designates extensible components diff --git a/core/src/main/java/hudson/FilePath.java b/core/src/main/java/hudson/FilePath.java index 9cc93b7ab6..66d2ea9aae 100644 --- a/core/src/main/java/hudson/FilePath.java +++ b/core/src/main/java/hudson/FilePath.java @@ -132,6 +132,7 @@ import org.jenkinsci.remoting.RoleChecker; import org.jenkinsci.remoting.RoleSensitive; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; +import org.kohsuke.stapler.Function; import org.kohsuke.stapler.Stapler; import static hudson.FilePath.TarCompression.GZIP; @@ -3262,9 +3263,14 @@ public final class FilePath implements Serializable { Path parentAbsolutePath = Util.fileToPath(parentFile.getAbsoluteFile()); Path parentRealPath; try { - parentRealPath = parentAbsolutePath.toRealPath(); + if (Functions.isWindows()) { + parentRealPath = this.windowsToRealPath(parentAbsolutePath); + } else { + parentRealPath = parentAbsolutePath.toRealPath(); + } } - catch(NoSuchFileException e) { + catch (NoSuchFileException e) { + LOGGER.log(Level.FINE, String.format("Cannot find the real path to the parentFile: %s", parentAbsolutePath), e); return false; } @@ -3296,10 +3302,11 @@ public final class FilePath implements Serializable { try{ Path child = currentFileAbsolutePath.toRealPath(); if (!child.startsWith(parentRealPath)) { + LOGGER.log(Level.FINE, "Child [{0}] does not start with parent [{1}] => not descendant", new Object[]{ child, parentRealPath }); return false; } } catch (NoSuchFileException e) { - // nonexistent file + // nonexistent file / Windows Server 2016 + MSFT docker // in case this folder / file will be copied somewhere else, // it becomes the responsibility of that system to check the isDescendant with the existing links // we are not taking the parentRealPath to avoid possible problem @@ -3322,6 +3329,21 @@ public final class FilePath implements Serializable { } return current; } + + private @Nonnull Path windowsToRealPath(@Nonnull Path path) throws IOException { + try { + return path.toRealPath(); + } + catch (IOException e) { + if (LOGGER.isLoggable(Level.FINE)) { + LOGGER.log(Level.FINE, String.format("relaxedToRealPath cannot use the regular toRealPath on %s, trying with toRealPath(LinkOption.NOFOLLOW_LINKS)", path), e); + } + } + + // that's required for specific environment like Windows Server 2016, running MSFT docker + // where the root is a + return path.toRealPath(LinkOption.NOFOLLOW_LINKS); + } } private static final SoloFilePathFilter UNRESTRICTED = SoloFilePathFilter.wrap(FilePathFilter.UNRESTRICTED); diff --git a/core/src/main/java/hudson/FileSystemProvisioner.java b/core/src/main/java/hudson/FileSystemProvisioner.java index 13f55b7370..901ff79a6a 100644 --- a/core/src/main/java/hudson/FileSystemProvisioner.java +++ b/core/src/main/java/hudson/FileSystemProvisioner.java @@ -40,7 +40,6 @@ import org.jenkinsci.Symbol; import java.io.BufferedOutputStream; import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; diff --git a/core/src/main/java/hudson/Functions.java b/core/src/main/java/hudson/Functions.java index a2275d7d1f..118a1f70fa 100644 --- a/core/src/main/java/hudson/Functions.java +++ b/core/src/main/java/hudson/Functions.java @@ -2006,7 +2006,7 @@ public class Functions { if(size < 1024){ return size + " " + measure; } - Double number = new Double(size); + double number = size; if(number>=1024){ number = number/1024; measure = "KB"; diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java index 96dddf8abd..c26ca2439d 100644 --- a/core/src/main/java/hudson/PluginManager.java +++ b/core/src/main/java/hudson/PluginManager.java @@ -591,10 +591,10 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas }); // All plugins are loaded. Now we can figure out who depends on who. - requires(PLUGINS_PREPARED).attains(COMPLETED).add("Resolving Dependant Plugins Graph", new Executable() { + requires(PLUGINS_PREPARED).attains(COMPLETED).add("Resolving Dependent Plugins Graph", new Executable() { @Override public void run(Reactor reactor) throws Exception { - resolveDependantPlugins(); + resolveDependentPlugins(); } }); }}); @@ -948,7 +948,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas } // Redo who depends on who. - resolveDependantPlugins(); + resolveDependentPlugins(); try { Jenkins.get().refreshExtensions(); @@ -960,40 +960,40 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas } @Restricted(NoExternalUse.class) - public synchronized void resolveDependantPlugins() { + public synchronized void resolveDependentPlugins() { for (PluginWrapper plugin : plugins) { - // Set of optional dependants plugins of plugin - Set optionalDependants = new HashSet<>(); - Set dependants = new HashSet<>(); - for (PluginWrapper possibleDependant : plugins) { - // No need to check if plugin is dependant of itself - if(possibleDependant.getShortName().equals(plugin.getShortName())) { + // Set of optional dependents plugins of plugin + Set optionalDependents = new HashSet<>(); + Set dependents = new HashSet<>(); + for (PluginWrapper possibleDependent : plugins) { + // No need to check if plugin is dependent of itself + if(possibleDependent.getShortName().equals(plugin.getShortName())) { continue; } // The plugin could have just been deleted. If so, it doesn't - // count as a dependant. - if (possibleDependant.isDeleted()) { + // count as a dependent. + if (possibleDependent.isDeleted()) { continue; } - List dependencies = possibleDependant.getDependencies(); + List dependencies = possibleDependent.getDependencies(); for (Dependency dependency : dependencies) { if (dependency.shortName.equals(plugin.getShortName())) { - dependants.add(possibleDependant.getShortName()); + dependents.add(possibleDependent.getShortName()); - // If, in addition, the dependency is optional, add to the optionalDependants list + // If, in addition, the dependency is optional, add to the optionalDependents list if (dependency.optional) { - optionalDependants.add(possibleDependant.getShortName()); + optionalDependents.add(possibleDependent.getShortName()); } - // already know possibleDependant depends on plugin, no need to continue with the rest of - // dependencies. We continue with the next possibleDependant + // already know possibleDependent depends on plugin, no need to continue with the rest of + // dependencies. We continue with the next possibleDependent break; } } } - plugin.setDependants(dependants); - plugin.setOptionalDependants(optionalDependants); + plugin.setDependents(dependents); + plugin.setOptionalDependents(optionalDependents); } } @@ -1545,7 +1545,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas } // Fire a one-off thread to wait for the plugins to be deployed and then - // refresh the dependant plugins list. + // refresh the dependent plugins list. new Thread() { @Override public void run() { @@ -1563,7 +1563,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas } } // All the plugins are installed. It's now safe to refresh. - resolveDependantPlugins(); + resolveDependentPlugins(); break; } } @@ -1941,10 +1941,10 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas } /** - * Disable a list of plugins using a strategy for their dependants plugins. - * @param strategy the strategy regarding how the dependant plugins are processed + * Disable a list of plugins using a strategy for their dependents plugins. + * @param strategy the strategy regarding how the dependent plugins are processed * @param plugins the list of plugins - * @return the list of results for every plugin and their dependant plugins. + * @return the list of results for every plugin and their dependent plugins. * @throws IOException see {@link PluginWrapper#disable()} */ public @NonNull List disablePlugins(@NonNull PluginWrapper.PluginDisableStrategy strategy, @NonNull List plugins) throws IOException { diff --git a/core/src/main/java/hudson/PluginWrapper.java b/core/src/main/java/hudson/PluginWrapper.java index 8c16b0c6f8..be78e2d192 100644 --- a/core/src/main/java/hudson/PluginWrapper.java +++ b/core/src/main/java/hudson/PluginWrapper.java @@ -208,12 +208,12 @@ public class PluginWrapper implements Comparable, ModelObject { /** * List of plugins that depend on this plugin. */ - private Set dependants = Collections.emptySet(); + private Set dependents = Collections.emptySet(); /** * List of plugins that depend optionally on this plugin. */ - private Set optionalDependants = Collections.emptySet(); + private Set optionalDependents = Collections.emptySet(); /** * The core can depend on a plugin if it is bundled. Sometimes it's the only thing that @@ -223,37 +223,69 @@ public class PluginWrapper implements Comparable, ModelObject { /** * Set the list of components that depend on this plugin. - * @param dependants The list of components that depend on this plugin. + * @param dependents The list of components that depend on this plugin. */ - public void setDependants(@Nonnull Set dependants) { - this.dependants = dependants; + public void setDependents(@Nonnull Set dependents) { + this.dependents = dependents; + } + + /** + * @deprecated Please use {@link setDependents}. + */ + @Deprecated + public void setDependants(@Nonnull Set dependents) { + setDependents(dependents); } /** * Set the list of components that depend optionally on this plugin. - * @param optionalDependants The list of components that depend optionally on this plugin. + * @param optionalDependents The list of components that depend optionally on this plugin. */ - public void setOptionalDependants(@Nonnull Set optionalDependants) { - this.optionalDependants = optionalDependants; + public void setOptionalDependents(@Nonnull Set optionalDependents) { + this.optionalDependents = optionalDependents; + } + + /** + * @deprecated Please use {@link setOptionalDependents}. + */ + @Deprecated + public void setOptionalDependants(@Nonnull Set optionalDependents) { + setOptionalDependents(dependents); } /** * Get the list of components that depend on this plugin. * @return The list of components that depend on this plugin. */ - public @Nonnull Set getDependants() { - if (isBundled && dependants.isEmpty()) { + public @Nonnull Set getDependents() { + if (isBundled && dependents.isEmpty()) { return CORE_ONLY_DEPENDANT; } else { - return dependants; + return dependents; } } + /** + * @deprecated Please use {@link getDependents}. + */ + @Deprecated + public @Nonnull Set getDependants() { + return getDependents(); + } + /** * @return The list of components that depend optionally on this plugin. */ + public @Nonnull Set getOptionalDependents() { + return optionalDependents; + } + + /** + * @deprecated Please use {@link getOptionalDependents}. + */ + @Deprecated public @Nonnull Set getOptionalDependants() { - return optionalDependants; + return getOptionalDependents(); } /** @@ -261,8 +293,16 @@ public class PluginWrapper implements Comparable, ModelObject { * @return {@code true} if something (Jenkins core, or another plugin) depends on this * plugin, otherwise {@code false}. */ + public boolean hasDependents() { + return (isBundled || !dependents.isEmpty()); + } + + /** + * @deprecated Please use {@link hasDependents}. + */ + @Deprecated public boolean hasDependants() { - return (isBundled || !dependants.isEmpty()); + return hasDependents(); } /** @@ -270,10 +310,17 @@ public class PluginWrapper implements Comparable, ModelObject { * @return {@code true} if something (Jenkins core, or another plugin) depends optionally on this * plugin, otherwise {@code false}. */ - public boolean hasOptionalDependants() { - return !optionalDependants.isEmpty(); + public boolean hasOptionalDependents() { + return !optionalDependents.isEmpty(); } + /** + * @deprecated Please use {@link hasOptionalDependents}. + */ + @Deprecated + public boolean hasOptionalDependants() { + return hasOptionalDependents(); + } /** * Does this plugin depend on any other plugins. @@ -597,7 +644,7 @@ public class PluginWrapper implements Comparable, ModelObject { /** * Disable this plugin using a strategy. * @param strategy strategy to use - * @return an object representing the result of the disablement of this plugin and its dependants plugins. + * @return an object representing the result of the disablement of this plugin and its dependents plugins. */ public @Nonnull PluginDisableResult disable(@Nonnull PluginDisableStrategy strategy) { PluginDisableResult result = new PluginDisableResult(shortName); @@ -608,55 +655,55 @@ public class PluginWrapper implements Comparable, ModelObject { return result; } - // Act as a flag indicating if this plugin, finally, can be disabled. If there is a not-disabled-dependant + // Act as a flag indicating if this plugin, finally, can be disabled. If there is a not-disabled-dependent // plugin, this one couldn't be disabled. - String aDependantNotDisabled = null; + String aDependentNotDisabled = null; - // List of dependants plugins to 'check'. 'Check' means disable for mandatory or all strategies, or review if - // this dependant-mandatory plugin is enabled in order to return an error for the NONE strategy. - Set dependantsToCheck = dependantsToCheck(strategy); + // List of dependents plugins to 'check'. 'Check' means disable for mandatory or all strategies, or review if + // this dependent-mandatory plugin is enabled in order to return an error for the NONE strategy. + Set dependentsToCheck = dependentsToCheck(strategy); - // Review all the dependants and add to the plugin result what happened with its dependants - for (String dependant : dependantsToCheck) { - PluginWrapper dependantPlugin = parent.getPlugin(dependant); + // Review all the dependents and add to the plugin result what happened with its dependents + for (String dependent : dependentsToCheck) { + PluginWrapper dependentPlugin = parent.getPlugin(dependent); - // The dependant plugin doesn't exist, add an error to the report - if (dependantPlugin == null) { - PluginDisableResult dependantStatus = new PluginDisableResult(dependant, NO_SUCH_PLUGIN, Messages.PluginWrapper_NoSuchPlugin(dependant)); - result.addDependantDisableStatus(dependantStatus); + // The dependent plugin doesn't exist, add an error to the report + if (dependentPlugin == null) { + PluginDisableResult dependentStatus = new PluginDisableResult(dependent, NO_SUCH_PLUGIN, Messages.PluginWrapper_NoSuchPlugin(dependent)); + result.addDependentDisableStatus(dependentStatus); - // If the strategy is none and there is some enabled dependant plugin, the plugin cannot be disabled. If - // this dependant plugin is not enabled, continue searching for one enabled. + // If the strategy is none and there is some enabled dependent plugin, the plugin cannot be disabled. If + // this dependent plugin is not enabled, continue searching for one enabled. } else if (strategy.equals(PluginDisableStrategy.NONE)) { - if (dependantPlugin.isEnabled()) { - aDependantNotDisabled = dependant; - break; // in this case, we don't need to continue with the rest of its dependants + if (dependentPlugin.isEnabled()) { + aDependentNotDisabled = dependent; + break; // in this case, we don't need to continue with the rest of its dependents } - // If the strategy is not none and this dependant plugin is not enabled, add it as already disabled - } else if (!dependantPlugin.isEnabled()) { - PluginDisableResult dependantStatus = new PluginDisableResult(dependant, ALREADY_DISABLED, Messages.PluginWrapper_Already_Disabled(dependant)); - result.addDependantDisableStatus(dependantStatus); + // If the strategy is not none and this dependent plugin is not enabled, add it as already disabled + } else if (!dependentPlugin.isEnabled()) { + PluginDisableResult dependentStatus = new PluginDisableResult(dependent, ALREADY_DISABLED, Messages.PluginWrapper_Already_Disabled(dependent)); + result.addDependentDisableStatus(dependentStatus); - // If the strategy is not none and this dependant plugin is enabled, disable it + // If the strategy is not none and this dependent plugin is enabled, disable it } else { // As there is no cycles in the plugin dependencies, the recursion shouldn't be infinite. The - // strategy used is the same for its dependants plugins - PluginDisableResult dependantResult = dependantPlugin.disable(strategy); - PluginDisableStatus dependantStatus = dependantResult.status; + // strategy used is the same for its dependents plugins + PluginDisableResult dependentResult = dependentPlugin.disable(strategy); + PluginDisableStatus dependentStatus = dependentResult.status; - // If something wrong happened, flag this dependant plugin to set the plugin later as not-disabled due - // to its dependants plugins. - if (ERROR_DISABLING.equals(dependantStatus) || NOT_DISABLED_DEPENDANTS.equals(dependantStatus)) { - aDependantNotDisabled = dependant; - break; // we found a dependant plugin enabled, stop looking for dependant plugins to disable. + // If something wrong happened, flag this dependent plugin to set the plugin later as not-disabled due + // to its dependents plugins. + if (ERROR_DISABLING.equals(dependentStatus) || NOT_DISABLED_DEPENDANTS.equals(dependentStatus)) { + aDependentNotDisabled = dependent; + break; // we found a dependent plugin enabled, stop looking for dependent plugins to disable. } - result.addDependantDisableStatus(dependantResult); + result.addDependentDisableStatus(dependentResult); } } - // If there is no enabled-dependant plugin, disable this plugin and add it to the result - if (aDependantNotDisabled == null) { + // If there is no enabled-dependent plugin, disable this plugin and add it to the result + if (aDependentNotDisabled == null) { try { this.disableWithoutCheck(); result.setMessage(Messages.PluginWrapper_Plugin_Disabled(shortName)); @@ -665,30 +712,30 @@ public class PluginWrapper implements Comparable, ModelObject { result.setMessage(Messages.PluginWrapper_Error_Disabling(shortName, io.toString())); result.setStatus(ERROR_DISABLING); } - // if there is yet some not disabled dependant plugin (only possible with none strategy), this plugin cannot + // if there is yet some not disabled dependent plugin (only possible with none strategy), this plugin cannot // be disabled. } else { - result.setMessage(Messages.PluginWrapper_Plugin_Has_Dependant(shortName, aDependantNotDisabled, strategy)); + result.setMessage(Messages.PluginWrapper_Plugin_Has_Dependent(shortName, aDependentNotDisabled, strategy)); result.setStatus(NOT_DISABLED_DEPENDANTS); } return result; } - private Set dependantsToCheck(PluginDisableStrategy strategy) { - Set dependantsToCheck; + private Set dependentsToCheck(PluginDisableStrategy strategy) { + Set dependentsToCheck; switch (strategy) { case ALL: - // getDependants returns all the dependant plugins, mandatory or optional. - dependantsToCheck = this.getDependants(); + // getDependents returns all the dependent plugins, mandatory or optional. + dependentsToCheck = this.getDependents(); break; default: // It includes MANDATORY, NONE: - // with NONE, the process only fail if mandatory dependant plugins exists - // As of getDependants has all the dependants, we get the difference between them and only the optionals - dependantsToCheck = Sets.difference(this.getDependants(), this.getOptionalDependants()); + // with NONE, the process only fail if mandatory dependent plugins exists + // As of getDependents has all the dependents, we get the difference between them and only the optionals + dependentsToCheck = Sets.difference(this.getDependents(), this.getOptionalDependents()); } - return dependantsToCheck; + return dependentsToCheck; } /** @@ -1001,13 +1048,13 @@ public class PluginWrapper implements Comparable, ModelObject { } /** - * The result of the disablement of a plugin and its dependants plugins. + * The result of the disablement of a plugin and its dependents plugins. */ public static class PluginDisableResult { private String plugin; private PluginDisableStatus status; private String message; - private Set dependantsDisableStatus = new HashSet<>(); + private Set dependentsDisableStatus = new HashSet<>(); public PluginDisableResult(String plugin) { this.plugin = plugin; @@ -1052,12 +1099,12 @@ public class PluginWrapper implements Comparable, ModelObject { this.message = message; } - public Set getDependantsDisableStatus() { - return dependantsDisableStatus; + public Set getDependentsDisableStatus() { + return dependentsDisableStatus; } - public void addDependantDisableStatus(PluginDisableResult dependantDisableStatus) { - dependantsDisableStatus.add(dependantDisableStatus); + public void addDependentDisableStatus(PluginDisableResult dependentDisableStatus) { + dependentsDisableStatus.add(dependentDisableStatus); } } @@ -1132,7 +1179,7 @@ public class PluginWrapper implements Comparable, ModelObject { archive.delete(); // Redo who depends on who. - jenkins.getPluginManager().resolveDependantPlugins(); + jenkins.getPluginManager().resolveDependentPlugins(); return HttpResponses.redirectViaContextPath("/pluginManager/installed"); // send back to plugin manager } diff --git a/core/src/main/java/hudson/Proc.java b/core/src/main/java/hudson/Proc.java index 26d74984cf..b218017522 100644 --- a/core/src/main/java/hudson/Proc.java +++ b/core/src/main/java/hudson/Proc.java @@ -325,8 +325,8 @@ public abstract class Proc { // see https://jenkins.io/redirect/troubleshooting/process-leaked-file-descriptors // problems like that shows up as infinite wait in join(), which confuses great many users. // So let's do a timed wait here and try to diagnose the problem - if (copier!=null) copier.join(10*1000); - if(copier2!=null) copier2.join(10*1000); + if (copier!=null) copier.join(TimeUnit.SECONDS.toMillis(10)); + if(copier2!=null) copier2.join(TimeUnit.SECONDS.toMillis(10)); if((copier!=null && copier.isAlive()) || (copier2!=null && copier2.isAlive())) { // looks like handles are leaking. // closing these handles should terminate the threads. diff --git a/core/src/main/java/hudson/ProxyConfiguration.java b/core/src/main/java/hudson/ProxyConfiguration.java index 11d90e17d9..f6560c6a05 100644 --- a/core/src/main/java/hudson/ProxyConfiguration.java +++ b/core/src/main/java/hudson/ProxyConfiguration.java @@ -47,6 +47,7 @@ import java.net.URL; import java.net.URLConnection; import java.util.Collections; import java.util.List; +import java.util.concurrent.TimeUnit; import java.util.regex.Pattern; import javax.annotation.CheckForNull; import jenkins.model.Jenkins; @@ -85,7 +86,7 @@ public final class ProxyConfiguration extends AbstractDescribableImpl 0 ? DEFAULT_CONNECT_TIMEOUT_MILLIS : new Integer(30 * 1000)); + method.getParams().setParameter("http.socket.timeout", DEFAULT_CONNECT_TIMEOUT_MILLIS > 0 ? DEFAULT_CONNECT_TIMEOUT_MILLIS : TimeUnit.SECONDS.toMillis(30)); HttpClient client = new HttpClient(); if (Util.fixEmptyAndTrim(name) != null && !isNoProxyHost(host, noProxyHost)) { diff --git a/core/src/main/java/hudson/Util.java b/core/src/main/java/hudson/Util.java index 1492f36451..9699df02c8 100644 --- a/core/src/main/java/hudson/Util.java +++ b/core/src/main/java/hudson/Util.java @@ -91,7 +91,6 @@ import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.io.FileUtils; -import org.kohsuke.stapler.Ancestor; import org.kohsuke.stapler.StaplerRequest; /** @@ -1464,9 +1463,9 @@ public class Util { public static int permissionsToMode(Set permissions) { PosixFilePermission[] allPermissions = PosixFilePermission.values(); int result = 0; - for (int i = 0; i < allPermissions.length; i++) { + for (PosixFilePermission allPermission : allPermissions) { result <<= 1; - result |= permissions.contains(allPermissions[i]) ? 1 : 0; + result |= permissions.contains(allPermission) ? 1 : 0; } return result; } diff --git a/core/src/main/java/hudson/cli/DisablePluginCommand.java b/core/src/main/java/hudson/cli/DisablePluginCommand.java index 354d69a561..101576e904 100644 --- a/core/src/main/java/hudson/cli/DisablePluginCommand.java +++ b/core/src/main/java/hudson/cli/DisablePluginCommand.java @@ -47,10 +47,10 @@ public class DisablePluginCommand extends CLICommand { @Option(name = "-restart", aliases = "-r", usage = "Restart Jenkins after disabling plugins.") private boolean restart; - @Option(name = "-strategy", aliases = "-s", metaVar = "strategy", usage = "How to process the dependant plugins. \n" + - "- none: if a mandatory dependant plugin exists and it is enabled, the plugin cannot be disabled (default value).\n" + - "- mandatory: all mandatory dependant plugins are also disabled, optional dependant plugins remain enabled.\n" + - "- all: all dependant plugins are also disabled, no matter if its dependency is optional or mandatory.") + @Option(name = "-strategy", aliases = "-s", metaVar = "strategy", usage = "How to process the dependent plugins. \n" + + "- none: if a mandatory dependent plugin exists and it is enabled, the plugin cannot be disabled (default value).\n" + + "- mandatory: all mandatory dependent plugins are also disabled, optional dependent plugins remain enabled.\n" + + "- all: all dependent plugins are also disabled, no matter if its dependency is optional or mandatory.") private String strategy = PluginWrapper.PluginDisableStrategy.NONE.toString(); @Option(name = "-quiet", aliases = "-q", usage = "Be quiet, print only the error messages") @@ -140,10 +140,10 @@ public class DisablePluginCommand extends CLICommand { } printIndented(indent, Messages.DisablePluginCommand_StatusMessage(oneResult.getPlugin(), oneResult.getStatus(), oneResult.getMessage())); - if (oneResult.getDependantsDisableStatus().size() > 0) { + if (oneResult.getDependentsDisableStatus().size() > 0) { indent += INDENT_SPACE; - for (PluginWrapper.PluginDisableResult oneDependantResult : oneResult.getDependantsDisableStatus()) { - printResult(oneDependantResult, indent); + for (PluginWrapper.PluginDisableResult oneDependentResult : oneResult.getDependentsDisableStatus()) { + printResult(oneDependentResult, indent); } } } @@ -163,9 +163,9 @@ public class DisablePluginCommand extends CLICommand { } /** - * Restart if this particular result of the disablement of a plugin and its dependant plugins (depending on the + * Restart if this particular result of the disablement of a plugin and its dependent plugins (depending on the * strategy used) has a plugin disablexd. - * @param oneResult the result of a plugin (and its dependants). + * @param oneResult the result of a plugin (and its dependents). * @return true if it end up in restarting jenkins. */ private boolean restartIfNecessary(PluginWrapper.PluginDisableResult oneResult) throws RestartNotSupportedException { @@ -175,9 +175,9 @@ public class DisablePluginCommand extends CLICommand { return true; } - if (oneResult.getDependantsDisableStatus().size() > 0) { - for (PluginWrapper.PluginDisableResult oneDependantResult : oneResult.getDependantsDisableStatus()) { - if (restartIfNecessary(oneDependantResult)) { + if (oneResult.getDependentsDisableStatus().size() > 0) { + for (PluginWrapper.PluginDisableResult oneDependentResult : oneResult.getDependentsDisableStatus()) { + if (restartIfNecessary(oneDependentResult)) { return true; } } @@ -191,7 +191,7 @@ public class DisablePluginCommand extends CLICommand { * Calculate the result code of the full process based in what went on during the process * @param results he list of results for the disablement of each plugin * @return the status code. 0 if all plugins disabled. {@link #RETURN_CODE_NOT_DISABLED_DEPENDANTS} if some - * dependant plugin is not disabled (with strategy NONE), {@link #RETURN_CODE_NO_SUCH_PLUGIN} if some passed + * dependent plugin is not disabled (with strategy NONE), {@link #RETURN_CODE_NO_SUCH_PLUGIN} if some passed * plugin doesn't exist. Whatever happens first. */ private int getResultCode(List results) { @@ -208,7 +208,7 @@ public class DisablePluginCommand extends CLICommand { /** * Calculate the result code of the disablement of one plugin based in what went on during the process of this one - * and its dependant plugins. + * and its dependent plugins. * @param result the result of the disablement of this plugin * @return the status code */ @@ -223,8 +223,8 @@ public class DisablePluginCommand extends CLICommand { } if (returnCode == 0) { - for (PluginWrapper.PluginDisableResult oneDependantResult : result.getDependantsDisableStatus()) { - returnCode = getResultCode(oneDependantResult); + for (PluginWrapper.PluginDisableResult oneDependentResult : result.getDependentsDisableStatus()) { + returnCode = getResultCode(oneDependentResult); if (returnCode != 0) { break; } diff --git a/core/src/main/java/hudson/cli/handlers/package-info.java b/core/src/main/java/hudson/cli/handlers/package-info.java index ee7dee536f..65a4bb7adf 100644 --- a/core/src/main/java/hudson/cli/handlers/package-info.java +++ b/core/src/main/java/hudson/cli/handlers/package-info.java @@ -3,4 +3,3 @@ */ package hudson.cli.handlers; -import org.kohsuke.args4j.spi.OptionHandler; \ No newline at end of file diff --git a/core/src/main/java/hudson/init/impl/InstallUncaughtExceptionHandler.java b/core/src/main/java/hudson/init/impl/InstallUncaughtExceptionHandler.java index a092a5123a..454af18cb3 100644 --- a/core/src/main/java/hudson/init/impl/InstallUncaughtExceptionHandler.java +++ b/core/src/main/java/hudson/init/impl/InstallUncaughtExceptionHandler.java @@ -5,12 +5,8 @@ import java.io.EOFException; import jenkins.model.Jenkins; import org.kohsuke.stapler.WebApp; import org.kohsuke.stapler.compression.CompressionFilter; -import org.kohsuke.stapler.compression.UncaughtExceptionHandler; -import javax.servlet.ServletContext; import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; diff --git a/core/src/main/java/hudson/init/package-info.java b/core/src/main/java/hudson/init/package-info.java index 5f66063ca3..57dbab8fd5 100644 --- a/core/src/main/java/hudson/init/package-info.java +++ b/core/src/main/java/hudson/init/package-info.java @@ -44,4 +44,3 @@ */ package hudson.init; -import org.jvnet.hudson.reactor.Task; \ No newline at end of file diff --git a/core/src/main/java/hudson/lifecycle/WindowsInstallerLink.java b/core/src/main/java/hudson/lifecycle/WindowsInstallerLink.java index b218d59640..64bd857be7 100644 --- a/core/src/main/java/hudson/lifecycle/WindowsInstallerLink.java +++ b/core/src/main/java/hudson/lifecycle/WindowsInstallerLink.java @@ -54,7 +54,6 @@ import org.kohsuke.stapler.interceptor.RequirePOST; import javax.servlet.ServletException; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; import java.util.logging.Logger; import java.util.logging.Level; diff --git a/core/src/main/java/hudson/logging/LogRecorder.java b/core/src/main/java/hudson/logging/LogRecorder.java index 14f5b3e5ca..0ca0d57196 100644 --- a/core/src/main/java/hudson/logging/LogRecorder.java +++ b/core/src/main/java/hudson/logging/LogRecorder.java @@ -156,7 +156,7 @@ public class LogRecorder extends AbstractModelObject implements Saveable { continue; } - if (match.booleanValue()) { + if (match) { // most specific logger matches, so publish super.publish(record); } @@ -215,14 +215,14 @@ public class LogRecorder extends AbstractModelObject implements Saveable { public Boolean matches(LogRecord r) { boolean levelSufficient = r.getLevel().intValue() >= level; if (name.length() == 0) { - return Boolean.valueOf(levelSufficient); // include if level matches + return levelSufficient; // include if level matches } String logName = r.getLoggerName(); if(logName==null || !logName.startsWith(name)) return null; // not in the domain of this logger String rest = logName.substring(name.length()); if (rest.startsWith(".") || rest.length()==0) { - return Boolean.valueOf(levelSufficient); // include if level matches + return levelSufficient; // include if level matches } return null; } diff --git a/core/src/main/java/hudson/logging/LogRecorderManager.java b/core/src/main/java/hudson/logging/LogRecorderManager.java index 765253341b..78c24c2a2e 100644 --- a/core/src/main/java/hudson/logging/LogRecorderManager.java +++ b/core/src/main/java/hudson/logging/LogRecorderManager.java @@ -25,7 +25,6 @@ package hudson.logging; import hudson.FeedAdapter; import hudson.Functions; -import hudson.PluginManager; import hudson.init.Initializer; import static hudson.init.InitMilestone.PLUGINS_PREPARED; import hudson.model.AbstractModelObject; diff --git a/core/src/main/java/hudson/model/AbstractCIBase.java b/core/src/main/java/hudson/model/AbstractCIBase.java index d82afd6488..073099e548 100644 --- a/core/src/main/java/hudson/model/AbstractCIBase.java +++ b/core/src/main/java/hudson/model/AbstractCIBase.java @@ -39,7 +39,6 @@ import java.util.concurrent.CopyOnWriteArraySet; import java.util.logging.Level; import java.util.logging.Logger; import javax.annotation.CheckForNull; -import javax.annotation.Nonnull; import jenkins.model.Configuration; diff --git a/core/src/main/java/hudson/model/AbstractItem.java b/core/src/main/java/hudson/model/AbstractItem.java index 1374429381..b52c646a74 100644 --- a/core/src/main/java/hudson/model/AbstractItem.java +++ b/core/src/main/java/hudson/model/AbstractItem.java @@ -38,7 +38,6 @@ import hudson.model.queue.Tasks; import hudson.model.queue.WorkUnit; import hudson.security.ACLContext; import hudson.security.AccessControlled; -import hudson.security.Permission; import hudson.security.ACL; import hudson.util.AlternativeUiTextProvider; import hudson.util.AlternativeUiTextProvider.Message; diff --git a/core/src/main/java/hudson/model/Cause.java b/core/src/main/java/hudson/model/Cause.java index c0286bc55a..d05cd867b5 100644 --- a/core/src/main/java/hudson/model/Cause.java +++ b/core/src/main/java/hudson/model/Cause.java @@ -25,7 +25,6 @@ package hudson.model; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.List; import hudson.console.ModelHyperlinkNote; diff --git a/core/src/main/java/hudson/model/Computer.java b/core/src/main/java/hudson/model/Computer.java index 3a9fde57dc..e4c3a661b8 100644 --- a/core/src/main/java/hudson/model/Computer.java +++ b/core/src/main/java/hudson/model/Computer.java @@ -31,7 +31,6 @@ import hudson.Extension; import hudson.Launcher.ProcStarter; import hudson.slaves.Cloud; import jenkins.security.stapler.StaplerDispatchable; -import jenkins.util.SystemProperties; import hudson.Util; import hudson.cli.declarative.CLIResolver; import hudson.console.AnnotatedLargeText; diff --git a/core/src/main/java/hudson/model/ComputerPinger.java b/core/src/main/java/hudson/model/ComputerPinger.java index ecf81abceb..1cf4114a00 100644 --- a/core/src/main/java/hudson/model/ComputerPinger.java +++ b/core/src/main/java/hudson/model/ComputerPinger.java @@ -6,6 +6,7 @@ import hudson.ExtensionPoint; import java.io.IOException; import java.net.InetAddress; +import java.util.concurrent.TimeUnit; import java.util.logging.Logger; /** @@ -57,7 +58,7 @@ public abstract class ComputerPinger implements ExtensionPoint { public static class BuiltInComputerPinger extends ComputerPinger { @Override public boolean isReachable(InetAddress ia, int timeout) throws IOException { - return ia.isReachable(timeout * 1000); + return ia.isReachable((int)TimeUnit.SECONDS.toMillis(timeout)); } } diff --git a/core/src/main/java/hudson/model/DependencyGraph.java b/core/src/main/java/hudson/model/DependencyGraph.java index 237eba1b40..6c7469a302 100644 --- a/core/src/main/java/hudson/model/DependencyGraph.java +++ b/core/src/main/java/hudson/model/DependencyGraph.java @@ -339,10 +339,9 @@ public class DependencyGraph implements Comparator { set = new ArrayList(); map.put(key,set); } - for (ListIterator it = set.listIterator(); it.hasNext();) { - DependencyGroup d = it.next(); + for (DependencyGroup d : set) { // Check for existing edge that connects the same two projects: - if (d.getUpstreamProject()==dep.getUpstreamProject() && d.getDownstreamProject()==dep.getDownstreamProject()) { + if (d.getUpstreamProject() == dep.getUpstreamProject() && d.getDownstreamProject() == dep.getDownstreamProject()) { d.add(dep); return; } diff --git a/core/src/main/java/hudson/model/Descriptor.java b/core/src/main/java/hudson/model/Descriptor.java index b7fc8097e8..3d941cd058 100644 --- a/core/src/main/java/hudson/model/Descriptor.java +++ b/core/src/main/java/hudson/model/Descriptor.java @@ -53,7 +53,6 @@ import org.apache.commons.io.IOUtils; import static hudson.util.QuotedStringTokenizer.*; import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND; -import javax.annotation.PostConstruct; import javax.servlet.ServletException; import javax.servlet.RequestDispatcher; import java.io.File; diff --git a/core/src/main/java/hudson/model/DownloadService.java b/core/src/main/java/hudson/model/DownloadService.java index ada651bbe4..125d58a394 100644 --- a/core/src/main/java/hudson/model/DownloadService.java +++ b/core/src/main/java/hudson/model/DownloadService.java @@ -46,11 +46,11 @@ import java.net.URLConnection; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; import jenkins.model.DownloadSettings; import jenkins.model.Jenkins; -import jenkins.util.JSONSignatureValidator; import net.sf.json.JSONException; import net.sf.json.JSONObject; import org.apache.commons.io.IOUtils; @@ -92,7 +92,7 @@ public class DownloadService extends PageDecorator { if(Jenkins.getInstance().hasPermission(Jenkins.READ)) { long now = System.currentTimeMillis(); for (Downloadable d : Downloadable.all()) { - if(d.getDue()") .append("Behaviour.addLoadEvent(function() {") .append(" downloadService.download(") diff --git a/core/src/main/java/hudson/model/JDK.java b/core/src/main/java/hudson/model/JDK.java index abcb1a9f74..043a5f392f 100644 --- a/core/src/main/java/hudson/model/JDK.java +++ b/core/src/main/java/hudson/model/JDK.java @@ -39,7 +39,6 @@ import hudson.util.XStream2; import java.io.File; import java.io.IOException; import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; import java.util.Map; import java.util.List; import java.util.Arrays; diff --git a/core/src/main/java/hudson/model/Job.java b/core/src/main/java/hudson/model/Job.java index f8510221c6..047e90a85f 100644 --- a/core/src/main/java/hudson/model/Job.java +++ b/core/src/main/java/hudson/model/Job.java @@ -29,7 +29,6 @@ import hudson.EnvVars; import hudson.Extension; import hudson.ExtensionPoint; import hudson.FeedAdapter; -import hudson.FilePath; import hudson.PermalinkList; import hudson.Util; import hudson.cli.declarative.CLIResolver; @@ -67,7 +66,6 @@ import java.awt.Color; import java.awt.Paint; import java.io.File; import java.io.IOException; -import java.nio.file.Files; import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; diff --git a/core/src/main/java/hudson/model/LargeText.java b/core/src/main/java/hudson/model/LargeText.java index 705c0242ef..0d63147adc 100644 --- a/core/src/main/java/hudson/model/LargeText.java +++ b/core/src/main/java/hudson/model/LargeText.java @@ -26,7 +26,6 @@ package hudson.model; import hudson.util.ByteBuffer; import hudson.util.CharSpool; import hudson.util.LineEndNormalizingWriter; -import org.apache.commons.fileupload.util.Closeable; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.framework.io.WriterOutputStream; diff --git a/core/src/main/java/hudson/model/LoadStatistics.java b/core/src/main/java/hudson/model/LoadStatistics.java index 5b87c5789b..a3ddfe183e 100644 --- a/core/src/main/java/hudson/model/LoadStatistics.java +++ b/core/src/main/java/hudson/model/LoadStatistics.java @@ -51,6 +51,7 @@ import java.io.IOException; import java.io.Serializable; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.util.concurrent.TimeUnit; import java.util.List; import javax.annotation.CheckForNull; @@ -376,7 +377,7 @@ public abstract class LoadStatistics { /** * Load statistics clock cycle in milliseconds. Specify a small value for quickly debugging this feature and node provisioning through cloud. */ - public static int CLOCK = SystemProperties.getInteger(LoadStatistics.class.getName() + ".clock", 10 * 1000); + public static int CLOCK = SystemProperties.getInteger(LoadStatistics.class.getName() + ".clock", (int)TimeUnit.SECONDS.toMillis(10)); /** * Periodically update the load statistics average. diff --git a/core/src/main/java/hudson/model/MyViewsProperty.java b/core/src/main/java/hudson/model/MyViewsProperty.java index c7852d926d..b4b246e2ca 100644 --- a/core/src/main/java/hudson/model/MyViewsProperty.java +++ b/core/src/main/java/hudson/model/MyViewsProperty.java @@ -27,7 +27,6 @@ import hudson.Extension; import hudson.Util; import hudson.model.Descriptor.FormException; import hudson.security.ACL; -import hudson.security.Permission; import hudson.util.FormValidation; import hudson.views.MyViewsTabBar; import hudson.views.ViewsTabBar; @@ -45,7 +44,6 @@ import javax.servlet.ServletException; import jenkins.model.Jenkins; import net.sf.json.JSONObject; -import org.acegisecurity.AccessDeniedException; import org.jenkinsci.Symbol; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; diff --git a/core/src/main/java/hudson/model/Node.java b/core/src/main/java/hudson/model/Node.java index c61ee7abc1..d06021406a 100644 --- a/core/src/main/java/hudson/model/Node.java +++ b/core/src/main/java/hudson/model/Node.java @@ -39,7 +39,6 @@ import hudson.remoting.Callable; import hudson.remoting.VirtualChannel; import hudson.security.ACL; import hudson.security.AccessControlled; -import hudson.security.Permission; import hudson.slaves.Cloud; import hudson.slaves.ComputerListener; import hudson.slaves.NodeDescriptor; diff --git a/core/src/main/java/hudson/model/PersistentDescriptor.java b/core/src/main/java/hudson/model/PersistentDescriptor.java index 837d154cfb..80a2f829e4 100644 --- a/core/src/main/java/hudson/model/PersistentDescriptor.java +++ b/core/src/main/java/hudson/model/PersistentDescriptor.java @@ -8,6 +8,7 @@ import javax.annotation.PostConstruct; * {@link Descriptor#load()} method is annotated as {@link PostConstruct} so it get automatically invoked after * constructor and field injection. * @author Nicolas De Loof + * @since 2.140 */ public interface PersistentDescriptor extends Saveable { diff --git a/core/src/main/java/hudson/model/Run.java b/core/src/main/java/hudson/model/Run.java index 57c312cd61..8565876d29 100644 --- a/core/src/main/java/hudson/model/Run.java +++ b/core/src/main/java/hudson/model/Run.java @@ -95,7 +95,6 @@ import java.util.Map; import java.util.Set; import java.util.logging.Level; import static java.util.logging.Level.*; -import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND; import java.util.logging.Logger; import javax.annotation.CheckForNull; @@ -125,7 +124,6 @@ import org.apache.commons.lang.ArrayUtils; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.stapler.HttpResponse; -import org.kohsuke.stapler.HttpResponses; import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.StaplerProxy; @@ -1798,7 +1796,9 @@ public abstract class Run ,RunT extends Run, RunT extends Run< reload(); } finally { reloadingInProgress = false; - nextUpdate = reloadPeriodically ? System.currentTimeMillis()+1000*60 : Long.MAX_VALUE; + nextUpdate = reloadPeriodically ? System.currentTimeMillis()+TimeUnit.MINUTES.toMillis(1) : Long.MAX_VALUE; } } @@ -187,7 +188,7 @@ public abstract class ViewJob, RunT extends Run< // reload operations might eat InterruptException, // so check the status every so often while(reloadQueue.isEmpty() && !terminating()) - reloadQueue.wait(60*1000); + reloadQueue.wait(TimeUnit.MINUTES.toMillis(1)); if(terminating()) throw new InterruptedException(); // terminate now ViewJob job = reloadQueue.iterator().next(); diff --git a/core/src/main/java/hudson/model/listeners/ItemListener.java b/core/src/main/java/hudson/model/listeners/ItemListener.java index f72a8acff3..20be92f1c2 100644 --- a/core/src/main/java/hudson/model/listeners/ItemListener.java +++ b/core/src/main/java/hudson/model/listeners/ItemListener.java @@ -24,7 +24,6 @@ package hudson.model.listeners; import com.google.common.base.Function; -import hudson.AbortException; import hudson.ExtensionPoint; import hudson.ExtensionList; import hudson.Extension; @@ -35,7 +34,6 @@ import hudson.model.Items; import hudson.security.ACL; import java.util.logging.Level; import java.util.logging.Logger; -import org.acegisecurity.AccessDeniedException; /** * Receives notifications about CRUD operations of {@link Item}. diff --git a/core/src/main/java/hudson/model/listeners/RunListener.java b/core/src/main/java/hudson/model/listeners/RunListener.java index 4c9a58434a..1803386d2a 100644 --- a/core/src/main/java/hudson/model/listeners/RunListener.java +++ b/core/src/main/java/hudson/model/listeners/RunListener.java @@ -28,12 +28,10 @@ import hudson.ExtensionListView; import hudson.Extension; import hudson.ExtensionList; import hudson.FilePath; -import hudson.Functions; import hudson.Launcher; import hudson.model.AbstractBuild; import hudson.model.BuildListener; import hudson.model.Environment; -import hudson.model.Job; import hudson.model.JobProperty; import hudson.model.Run; import hudson.model.Run.RunnerAbortedException; diff --git a/core/src/main/java/hudson/security/ACLContext.java b/core/src/main/java/hudson/security/ACLContext.java index 95c3337692..aa8455737b 100644 --- a/core/src/main/java/hudson/security/ACLContext.java +++ b/core/src/main/java/hudson/security/ACLContext.java @@ -23,7 +23,6 @@ */ package hudson.security; -import javax.annotation.CheckForNull; import javax.annotation.Nonnull; import org.acegisecurity.Authentication; import org.acegisecurity.context.SecurityContext; diff --git a/core/src/main/java/hudson/security/AuthorizationStrategy.java b/core/src/main/java/hudson/security/AuthorizationStrategy.java index 4c246a40d4..c8ee16e681 100644 --- a/core/src/main/java/hudson/security/AuthorizationStrategy.java +++ b/core/src/main/java/hudson/security/AuthorizationStrategy.java @@ -39,7 +39,6 @@ import jenkins.model.Jenkins; import jenkins.security.stapler.StaplerAccessibleType; import net.sf.json.JSONObject; -import org.acegisecurity.Authentication; import org.jenkinsci.Symbol; import org.kohsuke.stapler.StaplerRequest; diff --git a/core/src/main/java/hudson/security/BasicAuthenticationFilter.java b/core/src/main/java/hudson/security/BasicAuthenticationFilter.java index 737108560b..c75b619acb 100644 --- a/core/src/main/java/hudson/security/BasicAuthenticationFilter.java +++ b/core/src/main/java/hudson/security/BasicAuthenticationFilter.java @@ -26,7 +26,6 @@ package hudson.security; import hudson.model.User; import jenkins.model.Jenkins; import hudson.util.Scrambler; -import jenkins.security.ApiTokenProperty; import jenkins.security.SecurityListener; import org.acegisecurity.Authentication; import jenkins.security.BasicApiTokenHelper; diff --git a/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java b/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java index 629c8bba69..a2e78eeffc 100644 --- a/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java +++ b/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java @@ -50,7 +50,6 @@ import net.sf.json.JSONObject; import org.jenkinsci.Symbol; import org.kohsuke.accmod.Restricted; -import org.kohsuke.accmod.restrictions.DoNotUse; import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; diff --git a/core/src/main/java/hudson/security/TokenBasedRememberMeServices2.java b/core/src/main/java/hudson/security/TokenBasedRememberMeServices2.java index c93d4c77c2..c412919d59 100644 --- a/core/src/main/java/hudson/security/TokenBasedRememberMeServices2.java +++ b/core/src/main/java/hudson/security/TokenBasedRememberMeServices2.java @@ -189,9 +189,9 @@ public class TokenBasedRememberMeServices2 extends TokenBasedRememberMeServices return null; } - for (int i = 0; i < cookies.length; i++) { - if (ACEGI_SECURITY_HASHED_REMEMBER_ME_COOKIE_KEY.equals(cookies[i].getName())) { - return cookies[i].getValue(); + for (Cookie cookie : cookies) { + if (ACEGI_SECURITY_HASHED_REMEMBER_ME_COOKIE_KEY.equals(cookie.getName())) { + return cookie.getValue(); } } diff --git a/core/src/main/java/hudson/slaves/ChannelPinger.java b/core/src/main/java/hudson/slaves/ChannelPinger.java index 8493fe13fb..d92ef1bff9 100644 --- a/core/src/main/java/hudson/slaves/ChannelPinger.java +++ b/core/src/main/java/hudson/slaves/ChannelPinger.java @@ -42,6 +42,7 @@ import java.io.IOException; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.concurrent.TimeUnit; /** * Establish a periodic ping to keep connections between {@link Slave agents} @@ -184,7 +185,7 @@ public class ChannelPinger extends ComputerListener { public static void setUpPingForChannel(final Channel channel, final SlaveComputer computer, int timeoutSeconds, int intervalSeconds, final boolean analysis) { LOGGER.log(Level.FINE, "setting up ping on {0} with a {1} seconds interval and {2} seconds timeout", new Object[] {channel.getName(), intervalSeconds, timeoutSeconds}); final AtomicBoolean isInClosed = new AtomicBoolean(false); - final PingThread t = new PingThread(channel, timeoutSeconds * 1000L, intervalSeconds * 1000L) { + final PingThread t = new PingThread(channel, TimeUnit.SECONDS.toMillis(timeoutSeconds), TimeUnit.SECONDS.toMillis(intervalSeconds)) { @Override protected void onDead(Throwable cause) { if (analysis) { diff --git a/core/src/main/java/hudson/slaves/Channels.java b/core/src/main/java/hudson/slaves/Channels.java index 4b0b910b37..0657cc0ae3 100644 --- a/core/src/main/java/hudson/slaves/Channels.java +++ b/core/src/main/java/hudson/slaves/Channels.java @@ -49,6 +49,7 @@ import java.net.ServerSocket; import java.net.Socket; import java.util.Map; import java.util.concurrent.ExecutorService; +import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; @@ -210,7 +211,7 @@ public class Channels { public static Channel newJVM(String displayName, TaskListener listener, JVMBuilder vmb, FilePath workDir, ClasspathBuilder classpath) throws IOException { ServerSocket serverSocket = new ServerSocket(); serverSocket.bind(new InetSocketAddress("localhost",0)); - serverSocket.setSoTimeout(10*1000); + serverSocket.setSoTimeout((int)TimeUnit.SECONDS.toMillis(10)); // use -cp + FQCN instead of -jar since remoting.jar can be rebundled (like in the case of the swarm plugin.) vmb.classpath().addJarOf(Channel.class); diff --git a/core/src/main/java/hudson/slaves/ComputerRetentionWork.java b/core/src/main/java/hudson/slaves/ComputerRetentionWork.java index 36ec97ab3b..ee246750a0 100644 --- a/core/src/main/java/hudson/slaves/ComputerRetentionWork.java +++ b/core/src/main/java/hudson/slaves/ComputerRetentionWork.java @@ -25,6 +25,7 @@ package hudson.slaves; import java.util.Map; import java.util.WeakHashMap; +import java.util.concurrent.TimeUnit; import hudson.model.Computer; import hudson.model.Queue; @@ -70,7 +71,7 @@ public class ComputerRetentionWork extends PeriodicWork { // at the moment I don't trust strategies to wait more than 60 minutes // strategies need to wait at least one minute final long waitInMins = Math.max(1, Math.min(60, c.getRetentionStrategy().check(c))); - nextCheck.put(c, startRun + waitInMins*1000*60 /*MINS->MILLIS*/); + nextCheck.put(c, startRun + TimeUnit.MINUTES.toMillis(waitInMins)); } } }); diff --git a/core/src/main/java/hudson/slaves/EnvironmentVariablesNodeProperty.java b/core/src/main/java/hudson/slaves/EnvironmentVariablesNodeProperty.java index 90f95efb4e..d054c4a51b 100644 --- a/core/src/main/java/hudson/slaves/EnvironmentVariablesNodeProperty.java +++ b/core/src/main/java/hudson/slaves/EnvironmentVariablesNodeProperty.java @@ -40,7 +40,6 @@ import java.io.IOException; import java.util.Arrays; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.stream.Collectors; /** diff --git a/core/src/main/java/hudson/slaves/RetentionStrategy.java b/core/src/main/java/hudson/slaves/RetentionStrategy.java index c2237c3a56..f2137c9f3c 100644 --- a/core/src/main/java/hudson/slaves/RetentionStrategy.java +++ b/core/src/main/java/hudson/slaves/RetentionStrategy.java @@ -249,7 +249,7 @@ public abstract class RetentionStrategy extends AbstractDesc Node checkedNode = c.getNode(); if (needExecutor && checkedNode != null && checkedNode.canTake(item) == null) { demandMilliseconds = System.currentTimeMillis() - item.buildableStartMilliseconds; - needComputer = demandMilliseconds > inDemandDelay * 1000 * 60 /*MINS->MILLIS*/; + needComputer = demandMilliseconds > TimeUnit.MINUTES.toMillis(inDemandDelay); break; } } @@ -262,7 +262,7 @@ public abstract class RetentionStrategy extends AbstractDesc } } else if (c.isIdle()) { final long idleMilliseconds = System.currentTimeMillis() - c.getIdleStartMilliseconds(); - if (idleMilliseconds > idleDelay * 1000 * 60 /*MINS->MILLIS*/) { + if (idleMilliseconds > TimeUnit.MINUTES.toMillis(idleDelay)) { // we've been idle for long enough logger.log(Level.INFO, "Disconnecting computer {0} as it has been idle for {1}", new Object[]{c.getName(), Util.getTimeSpanString(idleMilliseconds)}); diff --git a/core/src/main/java/hudson/tasks/BuildStepCompatibilityLayer.java b/core/src/main/java/hudson/tasks/BuildStepCompatibilityLayer.java index d47a246aad..17a80931e9 100644 --- a/core/src/main/java/hudson/tasks/BuildStepCompatibilityLayer.java +++ b/core/src/main/java/hudson/tasks/BuildStepCompatibilityLayer.java @@ -31,12 +31,10 @@ import hudson.model.Action; import hudson.model.Project; import hudson.model.AbstractBuild; import hudson.model.AbstractProject; -import hudson.util.ReflectionUtils; import hudson.Launcher; import hudson.Util; import java.io.IOException; -import java.lang.reflect.Method; import java.util.Collection; import java.util.Collections; diff --git a/core/src/main/java/hudson/tasks/Fingerprinter.java b/core/src/main/java/hudson/tasks/Fingerprinter.java index c563180e01..959bbaebc0 100644 --- a/core/src/main/java/hudson/tasks/Fingerprinter.java +++ b/core/src/main/java/hudson/tasks/Fingerprinter.java @@ -154,8 +154,8 @@ public class Fingerprinter extends Recorder implements Serializable, DependencyD RunList builds = owner.getBuilds(); Set seenUpstreamProjects = new HashSet(); - for ( ListIterator iter = builds.listIterator(); iter.hasNext(); ) { - Run build = (Run) iter.next(); + for (Object build1 : builds) { + Run build = (Run) build1; for (FingerprintAction action : build.getActions(FingerprintAction.class)) { for (AbstractProject key : action.getDependencies().keySet()) { if (key == owner) { diff --git a/core/src/main/java/hudson/triggers/Trigger.java b/core/src/main/java/hudson/triggers/Trigger.java index b37fd7ce05..4423c0137d 100644 --- a/core/src/main/java/hudson/triggers/Trigger.java +++ b/core/src/main/java/hudson/triggers/Trigger.java @@ -52,6 +52,7 @@ import java.util.Collections; import java.util.Date; import java.util.GregorianCalendar; import java.util.List; +import java.util.concurrent.TimeUnit; import java.util.concurrent.Future; import java.util.logging.Level; import java.util.logging.Logger; @@ -60,7 +61,6 @@ import antlr.ANTLRException; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.model.Items; import jenkins.model.ParameterizedJobMixIn; import org.jenkinsci.Symbol; @@ -216,7 +216,7 @@ public abstract class Trigger implements Describable> } public long getInitialDelay() { - return MIN - (Calendar.getInstance().get(Calendar.SECOND) * 1000); + return MIN - TimeUnit.SECONDS.toMillis(Calendar.getInstance().get(Calendar.SECOND)); } public void doRun() { diff --git a/core/src/main/java/hudson/util/FormFieldValidator.java b/core/src/main/java/hudson/util/FormFieldValidator.java index a12941c9c7..5f0bb33f67 100644 --- a/core/src/main/java/hudson/util/FormFieldValidator.java +++ b/core/src/main/java/hudson/util/FormFieldValidator.java @@ -273,7 +273,7 @@ public abstract class FormFieldValidator { protected boolean findText(BufferedReader in, String literal) throws IOException { String line; while((line=in.readLine())!=null) - if(line.indexOf(literal)!=-1) + if(line.contains(literal)) return true; return false; } diff --git a/core/src/main/java/hudson/util/FormValidation.java b/core/src/main/java/hudson/util/FormValidation.java index a306f66d2d..60b63b18ac 100644 --- a/core/src/main/java/hudson/util/FormValidation.java +++ b/core/src/main/java/hudson/util/FormValidation.java @@ -499,7 +499,7 @@ public abstract class FormValidation extends IOException implements HttpResponse protected boolean findText(BufferedReader in, String literal) throws IOException { String line; while((line=in.readLine())!=null) - if(line.indexOf(literal)!=-1) + if(line.contains(literal)) return true; return false; } diff --git a/core/src/main/java/hudson/util/HttpResponses.java b/core/src/main/java/hudson/util/HttpResponses.java index ef731f3ff8..206db06530 100644 --- a/core/src/main/java/hudson/util/HttpResponses.java +++ b/core/src/main/java/hudson/util/HttpResponses.java @@ -29,7 +29,6 @@ import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; -import javax.annotation.CheckForNull; import javax.annotation.Nonnull; import javax.servlet.ServletException; import java.io.File; diff --git a/core/src/main/java/hudson/util/Iterators.java b/core/src/main/java/hudson/util/Iterators.java index 8d93d72262..d07e97f38b 100644 --- a/core/src/main/java/hudson/util/Iterators.java +++ b/core/src/main/java/hudson/util/Iterators.java @@ -33,7 +33,6 @@ import java.util.List; import java.util.NoSuchElementException; import java.util.ListIterator; import java.util.AbstractList; -import java.util.Arrays; import java.util.Set; import java.util.HashSet; import javax.annotation.Nonnull; diff --git a/core/src/main/java/hudson/util/LRUStringConverter.java b/core/src/main/java/hudson/util/LRUStringConverter.java index 4be36ab0d7..3e9fd9e2ba 100644 --- a/core/src/main/java/hudson/util/LRUStringConverter.java +++ b/core/src/main/java/hudson/util/LRUStringConverter.java @@ -1,11 +1,9 @@ package hudson.util; import com.thoughtworks.xstream.converters.basic.AbstractSingleValueConverter; -import com.thoughtworks.xstream.converters.basic.StringConverter; import org.apache.commons.collections.map.LRUMap; import java.util.Collections; -import java.util.HashMap; import java.util.Map; public class LRUStringConverter extends AbstractSingleValueConverter { diff --git a/core/src/main/java/hudson/util/MultipartFormDataParser.java b/core/src/main/java/hudson/util/MultipartFormDataParser.java index a09a153046..466962e4a3 100644 --- a/core/src/main/java/hudson/util/MultipartFormDataParser.java +++ b/core/src/main/java/hudson/util/MultipartFormDataParser.java @@ -27,6 +27,7 @@ import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; +import org.apache.commons.lang.ArrayUtils; import javax.annotation.CheckForNull; import javax.servlet.http.HttpServletRequest; @@ -92,16 +93,6 @@ public class MultipartFormDataParser implements AutoCloseable { } String[] parts = contentType.split(";"); - if (parts.length == 0) { - return false; - } - - for (int i = 0; i < parts.length; i++) { - if ("multipart/form-data".equals(parts[i])) { - return true; - } - } - - return false; + return ArrayUtils.contains(parts, "multipart/form-data"); } } diff --git a/core/src/main/java/hudson/util/NoOverlapCategoryAxis.java b/core/src/main/java/hudson/util/NoOverlapCategoryAxis.java index f7b2a78045..03508ce50d 100644 --- a/core/src/main/java/hudson/util/NoOverlapCategoryAxis.java +++ b/core/src/main/java/hudson/util/NoOverlapCategoryAxis.java @@ -70,10 +70,9 @@ public class NoOverlapCategoryAxis extends CategoryAxis { Rectangle2D r = null; int categoryIndex = 0; - Iterator iterator = ticks.iterator(); - while (iterator.hasNext()) { + for (Object tick1 : ticks) { - CategoryTick tick = (CategoryTick) iterator.next(); + CategoryTick tick = (CategoryTick) tick1; g2.setFont(getTickLabelFont(tick.getCategory())); g2.setPaint(getTickLabelPaint(tick.getCategory())); diff --git a/core/src/main/java/hudson/util/ProcessTree.java b/core/src/main/java/hudson/util/ProcessTree.java index 73438b2989..fd33d2f995 100644 --- a/core/src/main/java/hudson/util/ProcessTree.java +++ b/core/src/main/java/hudson/util/ProcessTree.java @@ -68,6 +68,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Optional; import java.util.SortedMap; +import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; @@ -550,7 +551,7 @@ public abstract class ProcessTree implements Iterable, IProcessTree, } // after that wait for it to cease to exist - long deadline = System.nanoTime() + softKillWaitSeconds * 1000000000; + long deadline = System.nanoTime() + TimeUnit.SECONDS.toNanos(softKillWaitSeconds); int sleepTime = 10; // initially we sleep briefly, then sleep up to 1sec do { if (!p.isRunning()) { @@ -759,7 +760,7 @@ public abstract class ProcessTree implements Iterable, IProcessTree, */ public void kill() throws InterruptedException { // after sending SIGTERM, wait for the process to cease to exist - long deadline = System.nanoTime() + softKillWaitSeconds * 1000000000; + long deadline = System.nanoTime() + TimeUnit.SECONDS.toNanos(softKillWaitSeconds); kill(deadline); } @@ -798,7 +799,7 @@ public abstract class ProcessTree implements Iterable, IProcessTree, public void killRecursively() throws InterruptedException { // after sending SIGTERM, wait for the processes to cease to exist until the deadline - long deadline = System.nanoTime() + softKillWaitSeconds * 1000000000; + long deadline = System.nanoTime() + TimeUnit.SECONDS.toNanos(softKillWaitSeconds); killRecursively(deadline); } diff --git a/core/src/main/java/hudson/util/RobustReflectionConverter.java b/core/src/main/java/hudson/util/RobustReflectionConverter.java index 3ec65ec994..68d2dc816f 100644 --- a/core/src/main/java/hudson/util/RobustReflectionConverter.java +++ b/core/src/main/java/hudson/util/RobustReflectionConverter.java @@ -44,7 +44,6 @@ import hudson.model.Saveable; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -213,8 +212,7 @@ public class RobustReflectionConverter implements Converter { if (mapping != null) { if (mapping.getItemFieldName() != null) { Collection list = (Collection) newObj; - for (Iterator iter = list.iterator(); iter.hasNext();) { - Object obj = iter.next(); + for (Object obj : list) { writeField(fieldName, mapping.getItemFieldName(), mapping.getItemType(), definedIn, obj); } } else { diff --git a/core/src/main/java/hudson/util/io/RewindableFileOutputStream.java b/core/src/main/java/hudson/util/io/RewindableFileOutputStream.java index d75e43fcaa..6b8a7db113 100644 --- a/core/src/main/java/hudson/util/io/RewindableFileOutputStream.java +++ b/core/src/main/java/hudson/util/io/RewindableFileOutputStream.java @@ -25,7 +25,6 @@ package hudson.util.io; import java.io.File; import java.io.FileNotFoundException; -import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.nio.file.Files; diff --git a/core/src/main/java/hudson/util/io/TarArchiver.java b/core/src/main/java/hudson/util/io/TarArchiver.java index 5d97aaa43b..2e8f151744 100644 --- a/core/src/main/java/hudson/util/io/TarArchiver.java +++ b/core/src/main/java/hudson/util/io/TarArchiver.java @@ -30,7 +30,6 @@ import hudson.util.FileVisitor; import hudson.util.IOUtils; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; diff --git a/core/src/main/java/hudson/util/io/ZipArchiver.java b/core/src/main/java/hudson/util/io/ZipArchiver.java index 20da13cbc3..1ed1f04e3c 100644 --- a/core/src/main/java/hudson/util/io/ZipArchiver.java +++ b/core/src/main/java/hudson/util/io/ZipArchiver.java @@ -34,7 +34,6 @@ import org.apache.tools.zip.Zip64Mode; import org.apache.tools.zip.ZipOutputStream; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; diff --git a/core/src/main/java/hudson/util/jna/Advapi32.java b/core/src/main/java/hudson/util/jna/Advapi32.java index fd929d963b..bef26018ac 100644 --- a/core/src/main/java/hudson/util/jna/Advapi32.java +++ b/core/src/main/java/hudson/util/jna/Advapi32.java @@ -30,6 +30,7 @@ import java.util.List; * * @author TB */ +@SuppressWarnings("UnusedReturnValue") public interface Advapi32 extends StdCallLibrary { Advapi32 INSTANCE = (Advapi32) Native.loadLibrary("Advapi32", Advapi32.class, Options.UNICODE_OPTIONS); diff --git a/core/src/main/java/hudson/widgets/BuildHistoryWidget.java b/core/src/main/java/hudson/widgets/BuildHistoryWidget.java index efd81da9d1..eb1986e718 100644 --- a/core/src/main/java/hudson/widgets/BuildHistoryWidget.java +++ b/core/src/main/java/hudson/widgets/BuildHistoryWidget.java @@ -28,7 +28,6 @@ import hudson.model.Queue.Item; import hudson.model.Queue.Task; import jenkins.widgets.HistoryPageFilter; -import java.util.Collection; import java.util.LinkedList; import java.util.List; diff --git a/core/src/main/java/jenkins/AgentProtocol.java b/core/src/main/java/jenkins/AgentProtocol.java index 587fdefa69..39a7f0f13a 100644 --- a/core/src/main/java/jenkins/AgentProtocol.java +++ b/core/src/main/java/jenkins/AgentProtocol.java @@ -9,7 +9,7 @@ import java.io.IOException; import java.net.Socket; import java.util.Set; import javax.annotation.CheckForNull; -import javax.annotation.Nonnull; + import jenkins.model.Jenkins; /** diff --git a/core/src/main/java/jenkins/PluginSubtypeMarker.java b/core/src/main/java/jenkins/PluginSubtypeMarker.java index c18eac83fb..71e0413c93 100644 --- a/core/src/main/java/jenkins/PluginSubtypeMarker.java +++ b/core/src/main/java/jenkins/PluginSubtypeMarker.java @@ -43,8 +43,6 @@ import javax.tools.FileObject; import javax.tools.StandardLocation; import java.io.IOException; import java.io.OutputStreamWriter; -import java.io.PrintWriter; -import java.io.StringWriter; import java.io.Writer; import java.nio.charset.StandardCharsets; import java.util.Set; diff --git a/core/src/main/java/jenkins/diagnosis/HsErrPidList.java b/core/src/main/java/jenkins/diagnosis/HsErrPidList.java index c38bdb06f4..c497206431 100644 --- a/core/src/main/java/jenkins/diagnosis/HsErrPidList.java +++ b/core/src/main/java/jenkins/diagnosis/HsErrPidList.java @@ -6,9 +6,8 @@ import hudson.Functions; import hudson.Util; import hudson.model.AdministrativeMonitor; import hudson.util.jna.Kernel32Utils; -import java.nio.file.Files; + import java.nio.file.InvalidPathException; -import java.nio.file.OpenOption; import java.nio.file.StandardOpenOption; import jenkins.model.Jenkins; import jenkins.security.stapler.StaplerDispatchable; @@ -18,7 +17,6 @@ import org.apache.tools.ant.types.FileSet; import java.io.BufferedReader; import java.io.File; -import java.io.FileInputStream; import java.io.FileReader; import java.io.IOException; import java.io.Reader; @@ -29,7 +27,7 @@ import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; -import org.apache.commons.io.IOUtils; + import org.jenkinsci.Symbol; /** diff --git a/core/src/main/java/jenkins/install/InstallUtil.java b/core/src/main/java/jenkins/install/InstallUtil.java index 7552f9fa35..8ee5f1a57b 100644 --- a/core/src/main/java/jenkins/install/InstallUtil.java +++ b/core/src/main/java/jenkins/install/InstallUtil.java @@ -48,7 +48,6 @@ import com.google.common.base.Function; import com.thoughtworks.xstream.XStream; import hudson.Functions; -import hudson.Main; import hudson.model.UpdateCenter.DownloadJob.InstallationStatus; import hudson.model.UpdateCenter.DownloadJob.Installing; import hudson.model.UpdateCenter.InstallationJob; diff --git a/core/src/main/java/jenkins/management/AdministrativeMonitorsDecorator.java b/core/src/main/java/jenkins/management/AdministrativeMonitorsDecorator.java index 77ea0758e3..ade826367a 100644 --- a/core/src/main/java/jenkins/management/AdministrativeMonitorsDecorator.java +++ b/core/src/main/java/jenkins/management/AdministrativeMonitorsDecorator.java @@ -28,17 +28,13 @@ import hudson.Functions; import hudson.diagnosis.ReverseProxySetupMonitor; import hudson.model.AdministrativeMonitor; import hudson.model.PageDecorator; -import hudson.util.HttpResponses; import hudson.util.HudsonIsLoading; import hudson.util.HudsonIsRestarting; import jenkins.diagnostics.URICheckEncodingMonitor; import jenkins.model.Jenkins; -import net.sf.json.JSON; -import net.sf.json.JSONObject; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.stapler.Ancestor; -import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.StaplerRequest; diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index a75df79b0a..5f363a6f40 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -3830,7 +3830,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve while (isQuietingDown && (timeout <= 0 || System.currentTimeMillis() < waitUntil) && !RestartListener.isAllReady()) { - Thread.sleep(1000); + Thread.sleep(TimeUnit.SECONDS.toMillis(1)); } } return new HttpRedirect("."); @@ -3889,7 +3889,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve // if the result isn't available in 5 sec, ignore that. // this is a precaution against hang nodes - long endTime = System.currentTimeMillis() + 5000; + long endTime = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(5); Map> r = new HashMap>(); for (Entry>> e : future.entrySet()) { @@ -4246,7 +4246,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve ACL.impersonate(ACL.SYSTEM); // give some time for the browser to load the "reloading" page - Thread.sleep(5000); + Thread.sleep(TimeUnit.SECONDS.toMillis(5)); LOGGER.info(String.format("Restarting VM as requested by %s",exitUser)); for (RestartListener listener : RestartListener.all()) listener.onRestart(); @@ -4282,7 +4282,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve servletContext.setAttribute("app",new HudsonIsRestarting()); // give some time for the browser to load the "reloading" page LOGGER.info("Restart in 10 seconds"); - Thread.sleep(10000); + Thread.sleep(TimeUnit.SECONDS.toMillis(10)); LOGGER.info(String.format("Restarting VM as requested by %s",exitUser)); for (RestartListener listener : RestartListener.all()) listener.onRestart(); @@ -4587,7 +4587,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve if(ALLOWED_RESOURCE_EXTENSIONS.contains(extension)) { URL url = pluginManager.uberClassLoader.getResource(path); if(url!=null) { - long expires = MetaClass.NO_CACHE ? 0 : 365L * 24 * 60 * 60 * 1000; /*1 year*/ + long expires = MetaClass.NO_CACHE ? 0 : TimeUnit.DAYS.toMillis(365); rsp.serveFile(req,url,expires); return; } diff --git a/core/src/main/java/jenkins/model/Uptime.java b/core/src/main/java/jenkins/model/Uptime.java index 190c678ff7..5884e1bfe0 100644 --- a/core/src/main/java/jenkins/model/Uptime.java +++ b/core/src/main/java/jenkins/model/Uptime.java @@ -1,7 +1,6 @@ package jenkins.model; import hudson.Extension; -import hudson.ExtensionList; import hudson.init.InitMilestone; import hudson.init.Initializer; diff --git a/core/src/main/java/jenkins/model/identity/IdentityRootAction.java b/core/src/main/java/jenkins/model/identity/IdentityRootAction.java index 6497c012d1..a58d9a9d83 100644 --- a/core/src/main/java/jenkins/model/identity/IdentityRootAction.java +++ b/core/src/main/java/jenkins/model/identity/IdentityRootAction.java @@ -4,7 +4,6 @@ import hudson.Extension; import hudson.model.UnprotectedRootAction; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; -import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import org.apache.commons.codec.Charsets; import org.apache.commons.codec.binary.Base64; diff --git a/core/src/main/java/jenkins/model/queue/AsynchronousExecution.java b/core/src/main/java/jenkins/model/queue/AsynchronousExecution.java index c99dd40de6..3da69e2217 100644 --- a/core/src/main/java/jenkins/model/queue/AsynchronousExecution.java +++ b/core/src/main/java/jenkins/model/queue/AsynchronousExecution.java @@ -39,7 +39,6 @@ import javax.annotation.Nonnull; import javax.annotation.concurrent.GuardedBy; import jenkins.model.Jenkins; import org.kohsuke.accmod.Restricted; -import org.kohsuke.accmod.restrictions.DoNotUse; import org.kohsuke.accmod.restrictions.NoExternalUse; /** diff --git a/core/src/main/java/jenkins/org/apache/commons/validator/routines/RegexValidator.java b/core/src/main/java/jenkins/org/apache/commons/validator/routines/RegexValidator.java index eebc3747d9..c6a7bb1cb2 100644 --- a/core/src/main/java/jenkins/org/apache/commons/validator/routines/RegexValidator.java +++ b/core/src/main/java/jenkins/org/apache/commons/validator/routines/RegexValidator.java @@ -149,8 +149,8 @@ public class RegexValidator implements Serializable { if (value == null) { return false; } - for (int i = 0; i < patterns.length; i++) { - if (patterns[i].matcher(value).matches()) { + for (Pattern pattern : patterns) { + if (pattern.matcher(value).matches()) { return true; } } @@ -169,13 +169,13 @@ public class RegexValidator implements Serializable { if (value == null) { return null; } - for (int i = 0; i < patterns.length; i++) { - Matcher matcher = patterns[i].matcher(value); + for (Pattern pattern : patterns) { + Matcher matcher = pattern.matcher(value); if (matcher.matches()) { int count = matcher.groupCount(); String[] groups = new String[count]; for (int j = 0; j < count; j++) { - groups[j] = matcher.group(j+1); + groups[j] = matcher.group(j + 1); } return groups; } @@ -196,8 +196,8 @@ public class RegexValidator implements Serializable { if (value == null) { return null; } - for (int i = 0; i < patterns.length; i++) { - Matcher matcher = patterns[i].matcher(value); + for (Pattern pattern : patterns) { + Matcher matcher = pattern.matcher(value); if (matcher.matches()) { int count = matcher.groupCount(); if (count == 1) { @@ -205,7 +205,7 @@ public class RegexValidator implements Serializable { } StringBuilder buffer = new StringBuilder(); for (int j = 0; j < count; j++) { - String component = matcher.group(j+1); + String component = matcher.group(j + 1); if (component != null) { buffer.append(component); } diff --git a/core/src/main/java/jenkins/org/apache/commons/validator/routines/UrlValidator.java b/core/src/main/java/jenkins/org/apache/commons/validator/routines/UrlValidator.java index f309b177e6..3d7e082f35 100644 --- a/core/src/main/java/jenkins/org/apache/commons/validator/routines/UrlValidator.java +++ b/core/src/main/java/jenkins/org/apache/commons/validator/routines/UrlValidator.java @@ -284,8 +284,8 @@ public class UrlValidator implements Serializable { schemes = DEFAULT_SCHEMES; } allowedSchemes = new HashSet(schemes.length); - for(int i=0; i < schemes.length; i++) { - allowedSchemes.add(schemes[i].toLowerCase(Locale.ENGLISH)); + for (String scheme : schemes) { + allowedSchemes.add(scheme.toLowerCase(Locale.ENGLISH)); } } diff --git a/core/src/main/java/jenkins/scm/RunWithSCM.java b/core/src/main/java/jenkins/scm/RunWithSCM.java index 1523b5a2ad..95e86a8cd3 100644 --- a/core/src/main/java/jenkins/scm/RunWithSCM.java +++ b/core/src/main/java/jenkins/scm/RunWithSCM.java @@ -26,7 +26,6 @@ package jenkins.scm; import com.google.common.collect.ImmutableSet; import hudson.model.Job; -import hudson.model.Queue; import hudson.model.Result; import hudson.model.Run; import hudson.model.User; diff --git a/core/src/main/java/jenkins/security/ApiTokenProperty.java b/core/src/main/java/jenkins/security/ApiTokenProperty.java index 8e61e0350a..9cb01b6268 100644 --- a/core/src/main/java/jenkins/security/ApiTokenProperty.java +++ b/core/src/main/java/jenkins/security/ApiTokenProperty.java @@ -50,7 +50,6 @@ import org.kohsuke.stapler.StaplerResponse; import java.io.IOException; import java.security.SecureRandom; -import java.text.SimpleDateFormat; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.Collection; diff --git a/core/src/main/java/jenkins/security/BasicApiTokenHelper.java b/core/src/main/java/jenkins/security/BasicApiTokenHelper.java index ed45727b43..5c73ba5f94 100644 --- a/core/src/main/java/jenkins/security/BasicApiTokenHelper.java +++ b/core/src/main/java/jenkins/security/BasicApiTokenHelper.java @@ -31,8 +31,6 @@ import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; import javax.annotation.CheckForNull; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; diff --git a/core/src/main/java/jenkins/security/CryptoConfidentialKey.java b/core/src/main/java/jenkins/security/CryptoConfidentialKey.java index 836e71dd69..bfc7758490 100644 --- a/core/src/main/java/jenkins/security/CryptoConfidentialKey.java +++ b/core/src/main/java/jenkins/security/CryptoConfidentialKey.java @@ -2,9 +2,7 @@ package jenkins.security; import hudson.Main; import hudson.util.Secret; -import jenkins.model.Jenkins; import org.kohsuke.accmod.Restricted; -import org.kohsuke.accmod.restrictions.DoNotUse; import org.kohsuke.accmod.restrictions.NoExternalUse; import javax.crypto.Cipher; diff --git a/core/src/main/java/jenkins/security/ImpersonatingUserDetailsService.java b/core/src/main/java/jenkins/security/ImpersonatingUserDetailsService.java index 5e3d62e49a..2df00eafa0 100644 --- a/core/src/main/java/jenkins/security/ImpersonatingUserDetailsService.java +++ b/core/src/main/java/jenkins/security/ImpersonatingUserDetailsService.java @@ -8,8 +8,6 @@ import org.acegisecurity.userdetails.UserDetailsService; import org.acegisecurity.userdetails.UsernameNotFoundException; import org.springframework.dao.DataAccessException; -import static java.util.Collections.*; - /** * {@link UserDetailsService} for those {@link SecurityRealm} * that doesn't allow query of other users. diff --git a/core/src/main/java/jenkins/security/LastGrantedAuthoritiesProperty.java b/core/src/main/java/jenkins/security/LastGrantedAuthoritiesProperty.java index 5172188b17..2f851ac2d7 100644 --- a/core/src/main/java/jenkins/security/LastGrantedAuthoritiesProperty.java +++ b/core/src/main/java/jenkins/security/LastGrantedAuthoritiesProperty.java @@ -56,10 +56,10 @@ public class LastGrantedAuthoritiesProperty extends UserProperty { List grantedAuthorities = new ArrayList<>(roles.length + 1); grantedAuthorities.add(new GrantedAuthorityImpl(authenticatedRole)); - for (int i = 0; i < roles.length; i++){ + for (String role : roles) { // to avoid having twice that role - if(!authenticatedRole.equals(roles[i])){ - grantedAuthorities.add(new GrantedAuthorityImpl(roles[i])); + if (!authenticatedRole.equals(role)) { + grantedAuthorities.add(new GrantedAuthorityImpl(role)); } } diff --git a/core/src/main/java/jenkins/security/MasterToSlaveCallable.java b/core/src/main/java/jenkins/security/MasterToSlaveCallable.java index d8ef8b09ee..5f5560a1bb 100644 --- a/core/src/main/java/jenkins/security/MasterToSlaveCallable.java +++ b/core/src/main/java/jenkins/security/MasterToSlaveCallable.java @@ -5,8 +5,6 @@ import hudson.remoting.Channel; import hudson.remoting.ChannelClosedException; import jenkins.slaves.RemotingVersionInfo; import org.jenkinsci.remoting.RoleChecker; -import org.kohsuke.accmod.Restricted; -import org.kohsuke.accmod.restrictions.NoExternalUse; /** diff --git a/core/src/main/java/jenkins/security/QueueItemAuthenticatorConfiguration.java b/core/src/main/java/jenkins/security/QueueItemAuthenticatorConfiguration.java index c6283401b2..4b5b15fb01 100644 --- a/core/src/main/java/jenkins/security/QueueItemAuthenticatorConfiguration.java +++ b/core/src/main/java/jenkins/security/QueueItemAuthenticatorConfiguration.java @@ -6,7 +6,6 @@ import hudson.model.queue.Tasks; import hudson.util.DescribableList; import jenkins.model.GlobalConfiguration; import jenkins.model.GlobalConfigurationCategory; -import jenkins.model.Jenkins; import net.sf.json.JSONObject; import org.jenkinsci.Symbol; import org.kohsuke.stapler.StaplerRequest; diff --git a/core/src/main/java/jenkins/security/QueueItemAuthenticatorMonitor.java b/core/src/main/java/jenkins/security/QueueItemAuthenticatorMonitor.java new file mode 100644 index 0000000000..8e3d903d58 --- /dev/null +++ b/core/src/main/java/jenkins/security/QueueItemAuthenticatorMonitor.java @@ -0,0 +1,147 @@ +/* + * The MIT License + * + * Copyright (c) 2019, CloudBees, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package jenkins.security; + +import hudson.Extension; +import hudson.model.AdministrativeMonitor; +import hudson.model.Job; +import hudson.model.Queue; +import hudson.model.queue.QueueListener; +import hudson.security.ACL; +import hudson.security.AuthorizationStrategy; +import hudson.security.FullControlOnceLoggedInAuthorizationStrategy; +import hudson.security.LegacyAuthorizationStrategy; +import hudson.util.HttpResponses; +import jenkins.model.Jenkins; +import org.acegisecurity.Authentication; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; +import org.kohsuke.stapler.HttpResponse; +import org.kohsuke.stapler.QueryParameter; +import org.kohsuke.stapler.interceptor.RequirePOST; + +import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * Display an administrative monitor if we expect {@link QueueItemAuthenticator} to be a useful security measure, + * but either it's not present, or potentially badly configured. + */ +@Extension +@Restricted(NoExternalUse.class) +public class QueueItemAuthenticatorMonitor extends AdministrativeMonitor { + @Override + public boolean isActivated() { + AuthorizationStrategy authorizationStrategy = Jenkins.get().getAuthorizationStrategy(); + if (authorizationStrategy instanceof AuthorizationStrategy.Unsecured) { + return false; + } + if (authorizationStrategy instanceof LegacyAuthorizationStrategy) { + return false; + } + if (authorizationStrategy instanceof FullControlOnceLoggedInAuthorizationStrategy) { + return false; + } + return !isQueueItemAuthenticatorPresent() || !isQueueItemAuthenticatorConfigured() || isAnyBuildLaunchedAsSystemWithAuthenticatorPresent(); + } + + @RequirePOST + public HttpResponse doAct(@QueryParameter String redirect, @QueryParameter String dismiss, @QueryParameter String reset) throws IOException { + if (redirect != null) { + return HttpResponses.redirectTo("https://jenkins.io/redirect/queue-item-security"); + } + if (dismiss != null) { + this.disable(true); + } + if (reset != null) { + anyBuildLaunchedAsSystemWithAuthenticatorPresent = false; + } + return HttpResponses.forwardToPreviousPage(); + } + + public static boolean isQueueItemAuthenticatorPresent() { + // there is no QueueItemAuthenticatorDescriptor; perhaps you need to install authorize-project? + return !QueueItemAuthenticatorDescriptor.all().isEmpty(); + } + + public static boolean isQueueItemAuthenticatorConfigured() { + // there is no configured QueueItemAuthenticator; perhaps you need to configure it? + return !QueueItemAuthenticatorConfiguration.get().getAuthenticators().isEmpty(); + } + + public boolean isAnyBuildLaunchedAsSystemWithAuthenticatorPresent() { + // you configured a QueueItemAuthenticator, but builds are still running as SYSTEM + return anyBuildLaunchedAsSystemWithAuthenticatorPresent; + } + + @Override + public String getDisplayName() { + return Messages.QueueItemAuthenticatorMonitor_DisplayName(); + } + + @Restricted(NoExternalUse.class) + @Extension + public static class QueueListenerImpl extends QueueListener { + @Override + public void onLeft(Queue.LeftItem li) { + if (li.isCancelled()) { + return; + } + + // XXX This can probably be done better, unsure what the expected priority order is + String displayName = li.getDisplayName(); + if (displayName == null && li.task != null) { + displayName = li.task.getFullDisplayName(); + } + Queue.Executable executable = li.getExecutable(); + if (displayName == null && executable != null) { + displayName = executable.toString(); + } + + if (!(li.task instanceof Job)) { + // Only care about jobs for now -- Do not react to folder scans and similar + LOGGER.log(Level.FINE, displayName + " is not a job"); + return; + } + + // TODO this is probably not intended to be used as a getter -- seems potentially unstable + Authentication buildAuthentication = li.authenticate(); + boolean buildRunsAsSystem = buildAuthentication == ACL.SYSTEM; + if (!buildRunsAsSystem) { + LOGGER.log(Level.FINE, displayName + " does not run as SYSTEM"); + return; + } + + LOGGER.log(Level.FINE, displayName + " is running as SYSTEM"); + if (isQueueItemAuthenticatorConfigured()) { + anyBuildLaunchedAsSystemWithAuthenticatorPresent = true; + } + } + } + + private static boolean anyBuildLaunchedAsSystemWithAuthenticatorPresent = false; + + private static final Logger LOGGER = Logger.getLogger(QueueItemAuthenticatorMonitor.class.getName()); +} diff --git a/core/src/main/java/jenkins/security/SecurityListener.java b/core/src/main/java/jenkins/security/SecurityListener.java index c473a85fb4..7b28bc5e07 100644 --- a/core/src/main/java/jenkins/security/SecurityListener.java +++ b/core/src/main/java/jenkins/security/SecurityListener.java @@ -26,7 +26,6 @@ package jenkins.security; import hudson.ExtensionList; import hudson.ExtensionPoint; -import hudson.security.AbstractPasswordBasedSecurityRealm; import hudson.security.SecurityRealm; import java.util.ArrayList; import java.util.List; diff --git a/core/src/main/java/jenkins/security/apitoken/LegacyApiTokenAdministrativeMonitor.java b/core/src/main/java/jenkins/security/apitoken/LegacyApiTokenAdministrativeMonitor.java index bb00783c38..d2463aa404 100644 --- a/core/src/main/java/jenkins/security/apitoken/LegacyApiTokenAdministrativeMonitor.java +++ b/core/src/main/java/jenkins/security/apitoken/LegacyApiTokenAdministrativeMonitor.java @@ -26,7 +26,6 @@ package jenkins.security.apitoken; import hudson.Extension; import hudson.model.AdministrativeMonitor; import hudson.model.User; -import hudson.node_monitors.AbstractAsyncNodeMonitorDescriptor; import hudson.util.HttpResponses; import jenkins.security.ApiTokenProperty; import org.jenkinsci.Symbol; @@ -53,7 +52,7 @@ import java.util.stream.Collectors; @Symbol("legacyApiTokenUsage") @Restricted(NoExternalUse.class) public class LegacyApiTokenAdministrativeMonitor extends AdministrativeMonitor { - private static final Logger LOGGER = Logger.getLogger(AbstractAsyncNodeMonitorDescriptor.class.getName()); + private static final Logger LOGGER = Logger.getLogger(LegacyApiTokenAdministrativeMonitor.class.getName()); public LegacyApiTokenAdministrativeMonitor() { super("legacyApiToken"); diff --git a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol.java b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol.java index 69720d9cce..b2386ffd2c 100644 --- a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol.java +++ b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol.java @@ -2,7 +2,6 @@ package jenkins.slaves; import hudson.Extension; import hudson.ExtensionList; -import hudson.Util; import hudson.model.Computer; import java.io.IOException; import java.net.Socket; @@ -10,7 +9,6 @@ import java.util.Collections; import java.util.logging.Logger; import javax.inject.Inject; import jenkins.AgentProtocol; -import jenkins.model.Jenkins; import jenkins.security.HMACConfidentialKey; import org.jenkinsci.Symbol; import org.jenkinsci.remoting.engine.JnlpConnectionState; diff --git a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java index fcc4e240e9..9be7c9bcb3 100644 --- a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java +++ b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java @@ -1,22 +1,16 @@ package jenkins.slaves; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.Extension; import hudson.ExtensionList; -import hudson.Util; import hudson.model.Computer; import java.io.IOException; import java.net.Socket; import java.util.Collections; import javax.inject.Inject; import jenkins.AgentProtocol; -import jenkins.model.Jenkins; -import jenkins.util.SystemProperties; import org.jenkinsci.Symbol; import org.jenkinsci.remoting.engine.JnlpConnectionState; import org.jenkinsci.remoting.engine.JnlpProtocol3Handler; -import org.kohsuke.accmod.Restricted; -import org.kohsuke.accmod.restrictions.NoExternalUse; /** * Master-side implementation for JNLP3-connect protocol. diff --git a/core/src/main/java/jenkins/telemetry/impl/StaplerDispatches.java b/core/src/main/java/jenkins/telemetry/impl/StaplerDispatches.java index 6e73a73e95..ad9f1a6a9d 100644 --- a/core/src/main/java/jenkins/telemetry/impl/StaplerDispatches.java +++ b/core/src/main/java/jenkins/telemetry/impl/StaplerDispatches.java @@ -25,7 +25,6 @@ package jenkins.telemetry.impl; import hudson.Extension; import hudson.PluginWrapper; -import hudson.model.UsageStatistics; import hudson.util.VersionNumber; import jenkins.model.Jenkins; import jenkins.telemetry.Telemetry; diff --git a/core/src/main/java/jenkins/util/AntClassLoader.java b/core/src/main/java/jenkins/util/AntClassLoader.java index 980aa25c00..3362c2f543 100644 --- a/core/src/main/java/jenkins/util/AntClassLoader.java +++ b/core/src/main/java/jenkins/util/AntClassLoader.java @@ -35,7 +35,6 @@ import org.kohsuke.accmod.restrictions.NoExternalUse; import java.io.ByteArrayOutputStream; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Constructor; @@ -546,7 +545,7 @@ public class AntClassLoader extends ClassLoader implements SubBuildListener { * separated by the path separator for the system. */ public String getClasspath() { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); boolean firstPass = true; Enumeration componentEnum = pathComponents.elements(); while (componentEnum.hasMoreElements()) { @@ -1562,8 +1561,7 @@ public class AntClassLoader extends ClassLoader implements SubBuildListener { ReflectUtil.newInstance(subClassToLoad, CONSTRUCTOR_ARGS, new Object[] { - parent, project, path, - Boolean.valueOf(parentFirst) + parent, project, path, parentFirst }); } return new AntClassLoader(parent, project, path, parentFirst); diff --git a/core/src/main/java/jenkins/util/JSONSignatureValidator.java b/core/src/main/java/jenkins/util/JSONSignatureValidator.java index 15b573a4a6..ec6f20da9b 100644 --- a/core/src/main/java/jenkins/util/JSONSignatureValidator.java +++ b/core/src/main/java/jenkins/util/JSONSignatureValidator.java @@ -17,7 +17,6 @@ import org.jvnet.hudson.crypto.SignatureOutputStream; import java.io.ByteArrayInputStream; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; diff --git a/core/src/main/java/jenkins/util/ProgressiveRendering.java b/core/src/main/java/jenkins/util/ProgressiveRendering.java index 77582d74ce..e675b945f4 100644 --- a/core/src/main/java/jenkins/util/ProgressiveRendering.java +++ b/core/src/main/java/jenkins/util/ProgressiveRendering.java @@ -24,7 +24,6 @@ package jenkins.util; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.lang.reflect.Field; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; diff --git a/core/src/main/java/jenkins/util/TreeString.java b/core/src/main/java/jenkins/util/TreeString.java index 86dbced012..09ea85a93e 100644 --- a/core/src/main/java/jenkins/util/TreeString.java +++ b/core/src/main/java/jenkins/util/TreeString.java @@ -26,6 +26,7 @@ package jenkins.util; import java.io.Serializable; import java.util.Map; +import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; import com.thoughtworks.xstream.XStream; @@ -124,9 +125,7 @@ public final class TreeString implements Serializable { public int hashCode() { int h = parent == null ? 0 : parent.hashCode(); - for (int i = 0; i < label.length; i++) { - h = 31 * h + label[i]; - } + h = 31 * h + ArrayUtils.hashCode(label); assert toString().hashCode() == h; return h; diff --git a/core/src/main/java/jenkins/util/VirtualFile.java b/core/src/main/java/jenkins/util/VirtualFile.java index 9d08782198..0cce3d1a65 100644 --- a/core/src/main/java/jenkins/util/VirtualFile.java +++ b/core/src/main/java/jenkins/util/VirtualFile.java @@ -44,7 +44,6 @@ import java.net.URI; import java.net.URL; import java.nio.file.Files; import java.nio.file.InvalidPathException; -import java.nio.file.LinkOption; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -192,8 +191,7 @@ public abstract class VirtualFile implements Comparable, Serializab public @Nonnull List listOnlyDescendants() throws IOException { VirtualFile[] children = list(); List result = new ArrayList<>(); - for (int i = 0; i < children.length; i++) { - VirtualFile child = children[i]; + for (VirtualFile child : children) { if (child.isDescendant("")) { result.add(child); } @@ -233,7 +231,7 @@ public abstract class VirtualFile implements Comparable, Serializab } return r.stream().filter(p -> { TokenizedPath path = new TokenizedPath(p.replace('/', File.separatorChar)); - return includePatterns.stream().anyMatch(patt -> patt.matchPath(path, true)) && !excludePatterns.stream().anyMatch(patt -> patt.matchPath(path, true)); + return includePatterns.stream().anyMatch(patt -> patt.matchPath(path, true)) && excludePatterns.stream().noneMatch(patt -> patt.matchPath(path, true)); }).collect(Collectors.toSet()); } private static final class CollectFiles extends MasterToSlaveCallable, IOException> { @@ -546,7 +544,11 @@ public abstract class VirtualFile implements Comparable, Serializab private boolean isIllegalSymlink() { try { - return !this.isDescendant(""); + String myPath = f.toPath().toRealPath().toString(); + String rootPath = root.toPath().toRealPath().toString(); + if (!myPath.equals(rootPath) && !myPath.startsWith(rootPath + File.separatorChar)) { + return true; + } } catch (IOException x) { Logger.getLogger(VirtualFile.class.getName()).log(Level.FINE, "could not determine symlink status of " + f, x); } catch (InvalidPathException x2) { diff --git a/core/src/main/java/jenkins/util/io/FileBoolean.java b/core/src/main/java/jenkins/util/io/FileBoolean.java index 7caa25e9e3..c43eefea63 100644 --- a/core/src/main/java/jenkins/util/io/FileBoolean.java +++ b/core/src/main/java/jenkins/util/io/FileBoolean.java @@ -5,7 +5,6 @@ import java.nio.file.InvalidPathException; import jenkins.model.Jenkins; import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; diff --git a/core/src/main/java/jenkins/util/xml/XMLUtils.java b/core/src/main/java/jenkins/util/xml/XMLUtils.java index 85d37f30ea..9469adc65e 100644 --- a/core/src/main/java/jenkins/util/xml/XMLUtils.java +++ b/core/src/main/java/jenkins/util/xml/XMLUtils.java @@ -4,7 +4,6 @@ import java.io.InputStream; import java.nio.file.Files; import java.nio.file.InvalidPathException; import jenkins.util.SystemProperties; -import org.apache.commons.io.IOUtils; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; import org.w3c.dom.Document; @@ -14,7 +13,6 @@ import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLReaderFactory; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; diff --git a/core/src/main/resources/hudson/Messages.properties b/core/src/main/resources/hudson/Messages.properties index 7ee5f14f93..20f79ad0b0 100644 --- a/core/src/main/resources/hudson/Messages.properties +++ b/core/src/main/resources/hudson/Messages.properties @@ -89,7 +89,7 @@ PluginWrapper.obsoleteCore=You must update Jenkins from version {0} to version { PluginWrapper.obsoleteJava=You must update Java from version {0} to version {1} or later to run this plugin. PluginWrapper.PluginWrapperAdministrativeMonitor.DisplayName=Plugins Failed To Load PluginWrapper.Already.Disabled=The plugin ''{0}'' was already disabled -PluginWrapper.Plugin.Has.Dependant=The plugin ''{0}'' has, at least, one dependant plugin ({1}) and the disable strategy is {2}, so it cannot be disabled +PluginWrapper.Plugin.Has.Dependent=The plugin ''{0}'' has, at least, one dependent plugin ({1}) and the disable strategy is {2}, so it cannot be disabled PluginWrapper.Plugin.Disabled=Plugin ''{0}'' disabled PluginWrapper.NoSuchPlugin=No such plugin found with the name ''{0}'' PluginWrapper.Error.Disabling=There was an error disabling the ''{0}'' plugin. Error: ''{1}'' diff --git a/core/src/main/resources/hudson/PluginManager/_table.js b/core/src/main/resources/hudson/PluginManager/_table.js index 845185ef6d..107ee8a8c9 100644 --- a/core/src/main/resources/hudson/PluginManager/_table.js +++ b/core/src/main/resources/hudson/PluginManager/_table.js @@ -58,7 +58,7 @@ Behaviour.specify("#filter-box", '_table', 0, function(e) { /** * Code for handling the enable/disable behavior based on plugin - * dependencies and dependants. + * dependencies and dependents. */ (function(){ function selectAll(selector, element) { @@ -127,41 +127,41 @@ Behaviour.specify("#filter-box", '_table', 0, function(e) { return ids; } - function markAllDependantsDisabled(pluginTR) { + function markAllDependentsDisabled(pluginTR) { var jenkinsPluginMetadata = pluginTR.jenkinsPluginMetadata; - var dependantIds = jenkinsPluginMetadata.dependantIds; + var dependentIds = jenkinsPluginMetadata.dependentIds; - if (dependantIds) { - // If the only dependant is jenkins-core (it's a bundle plugin), then lets - // treat it like all its dependants are disabled. We're really only interested in - // dependant plugins in this case. + if (dependentIds) { + // If the only dependent is jenkins-core (it's a bundle plugin), then lets + // treat it like all its dependents are disabled. We're really only interested in + // dependent plugins in this case. // Note: This does not cover "implied" dependencies ala detached plugins. See https://goo.gl/lQHrUh - if (dependantIds.length === 1 && dependantIds[0] === 'jenkins-core') { - pluginTR.addClassName('all-dependants-disabled'); + if (dependentIds.length === 1 && dependentIds[0] === 'jenkins-core') { + pluginTR.addClassName('all-dependents-disabled'); return; } - for (var i = 0; i < dependantIds.length; i++) { - var dependantId = dependantIds[i]; + for (var i = 0; i < dependentIds.length; i++) { + var dependentId = dependentIds[i]; - if (dependantId === 'jenkins-core') { + if (dependentId === 'jenkins-core') { // Jenkins core is always enabled. So, make sure it's not possible to disable/uninstall // any plugins that it "depends" on. (we sill have bundled plugins) - pluginTR.removeClassName('all-dependants-disabled'); + pluginTR.removeClassName('all-dependents-disabled'); return; } - // The dependant is a plugin.... - var dependantPluginTr = getPluginTR(dependantId); - if (dependantPluginTr && dependantPluginTr.jenkinsPluginMetadata.enableInput.checked) { + // The dependent is a plugin.... + var dependentPluginTr = getPluginTR(dependentId); + if (dependentPluginTr && dependentPluginTr.jenkinsPluginMetadata.enableInput.checked) { // One of the plugins that depend on this plugin, is marked as enabled. - pluginTR.removeClassName('all-dependants-disabled'); + pluginTR.removeClassName('all-dependents-disabled'); return; } } } - pluginTR.addClassName('all-dependants-disabled'); + pluginTR.addClassName('all-dependents-disabled'); } function markHasDisabledDependencies(pluginTR) { @@ -185,12 +185,12 @@ Behaviour.specify("#filter-box", '_table', 0, function(e) { function setEnableWidgetStates() { for (var i = 0; i < pluginTRs.length; i++) { var pluginMetadata = pluginTRs[i].jenkinsPluginMetadata; - if (pluginTRs[i].hasClassName('has-dependants-but-disabled')) { + if (pluginTRs[i].hasClassName('has-dependents-but-disabled')) { if (pluginMetadata.enableInput.checked) { - pluginTRs[i].removeClassName('has-dependants-but-disabled'); + pluginTRs[i].removeClassName('has-dependents-but-disabled'); } } - markAllDependantsDisabled(pluginTRs[i]); + markAllDependentsDisabled(pluginTRs[i]); markHasDisabledDependencies(pluginTRs[i]); } } @@ -244,48 +244,48 @@ Behaviour.specify("#filter-box", '_table', 0, function(e) { infoContainer.appendChild(dependenciesDiv); return true; - } if (pluginTR.hasClassName('has-dependants')) { - if (!pluginTR.hasClassName('all-dependants-disabled')) { - var dependantIds = pluginMetadata.dependantIds; + } if (pluginTR.hasClassName('has-dependents')) { + if (!pluginTR.hasClassName('all-dependents-disabled')) { + var dependentIds = pluginMetadata.dependentIds; - // If the only dependant is jenkins-core (it's a bundle plugin), then lets - // treat it like all its dependants are disabled. We're really only interested in - // dependant plugins in this case. + // If the only dependent is jenkins-core (it's a bundle plugin), then lets + // treat it like all its dependents are disabled. We're really only interested in + // dependent plugins in this case. // Note: This does not cover "implied" dependencies ala detached plugins. See https://goo.gl/lQHrUh - if (dependantIds.length === 1 && dependantIds[0] === 'jenkins-core') { - pluginTR.addClassName('all-dependants-disabled'); + if (dependentIds.length === 1 && dependentIds[0] === 'jenkins-core') { + pluginTR.addClassName('all-dependents-disabled'); return false; } - var dependantsDiv = pluginMetadata.dependantsDiv; - var dependantSpans = pluginMetadata.dependants; + var dependentsDiv = pluginMetadata.dependentsDiv; + var dependentSpans = pluginMetadata.dependents; - infoContainer.update('
' + i18n('cannot-disable') + '
' + i18n('enabled-dependants') + '.
'); + infoContainer.update('
' + i18n('cannot-disable') + '
' + i18n('enabled-dependents') + '.
'); - // Go through each dependant element. Show the spans where the dependant is + // Go through each dependent element. Show the spans where the dependent is // enabled. Hide the others. - for (var i = 0; i < dependantSpans.length; i++) { - var dependantSpan = dependantSpans[i]; - var dependantId = dependantSpan.getAttribute('data-plugin-id'); + for (var i = 0; i < dependentSpans.length; i++) { + var dependentSpan = dependentSpans[i]; + var dependentId = dependentSpan.getAttribute('data-plugin-id'); - if (dependantId === 'jenkins-core') { + if (dependentId === 'jenkins-core') { // show the span - dependantSpan.setStyle({display: 'inline-block'}); + dependentSpan.setStyle({display: 'inline-block'}); } else { - var depPluginTR = getPluginTR(dependantId); + var depPluginTR = getPluginTR(dependentId); var depPluginMetadata = depPluginTR.jenkinsPluginMetadata; if (depPluginMetadata.enableInput.checked) { // It's enabled ... show the span - dependantSpan.setStyle({display: 'inline-block'}); + dependentSpan.setStyle({display: 'inline-block'}); } else { // It's disabled ... hide the span - dependantSpan.setStyle({display: 'none'}); + dependentSpan.setStyle({display: 'none'}); } } } - dependantsDiv.setStyle({display: 'inherit'}); - infoContainer.appendChild(dependantsDiv); + dependentsDiv.setStyle({display: 'inherit'}); + infoContainer.appendChild(dependentsDiv); return true; } @@ -299,21 +299,21 @@ Behaviour.specify("#filter-box", '_table', 0, function(e) { infoContainer.removeAttribute('class'); infoContainer.addClassName('uninstall-state-info'); - if (pluginTR.hasClassName('has-dependants')) { + if (pluginTR.hasClassName('has-dependents')) { var pluginMetadata = pluginTR.jenkinsPluginMetadata; - var dependantsDiv = pluginMetadata.dependantsDiv; - var dependantSpans = pluginMetadata.dependants; + var dependentsDiv = pluginMetadata.dependentsDiv; + var dependentSpans = pluginMetadata.dependents; - infoContainer.update('
' + i18n('cannot-uninstall') + '
' + i18n('installed-dependants') + '.
'); + infoContainer.update('
' + i18n('cannot-uninstall') + '
' + i18n('installed-dependents') + '.
'); - // Go through each dependant element. Show them all. - for (var i = 0; i < dependantSpans.length; i++) { - var dependantSpan = dependantSpans[i]; - dependantSpan.setStyle({display: 'inline-block'}); + // Go through each dependent element. Show them all. + for (var i = 0; i < dependentSpans.length; i++) { + var dependentSpan = dependentSpans[i]; + dependentSpan.setStyle({display: 'inline-block'}); } - dependantsDiv.setStyle({display: 'inherit'}); - infoContainer.appendChild(dependantsDiv); + dependentsDiv.setStyle({display: 'inherit'}); + infoContainer.appendChild(dependentsDiv); return true; } @@ -324,23 +324,23 @@ Behaviour.specify("#filter-box", '_table', 0, function(e) { function initPluginRowHandling(pluginTR) { var enableInput = select('.enable input', pluginTR); var dependenciesDiv = select('.dependency-list', pluginTR); - var dependantsDiv = select('.dependant-list', pluginTR); + var dependentsDiv = select('.dependent-list', pluginTR); var enableTD = select('td.enable', pluginTR); var uninstallTD = select('td.uninstall', pluginTR); pluginTR.jenkinsPluginMetadata = { enableInput: enableInput, dependenciesDiv: dependenciesDiv, - dependantsDiv: dependantsDiv + dependentsDiv: dependentsDiv }; if (dependenciesDiv) { pluginTR.jenkinsPluginMetadata.dependencies = selectAll('span', dependenciesDiv); pluginTR.jenkinsPluginMetadata.dependencyIds = processSpanSet(pluginTR.jenkinsPluginMetadata.dependencies); } - if (dependantsDiv) { - pluginTR.jenkinsPluginMetadata.dependants = selectAll('span', dependantsDiv); - pluginTR.jenkinsPluginMetadata.dependantIds = processSpanSet(pluginTR.jenkinsPluginMetadata.dependants); + if (dependentsDiv) { + pluginTR.jenkinsPluginMetadata.dependents = selectAll('span', dependentsDiv); + pluginTR.jenkinsPluginMetadata.dependentIds = processSpanSet(pluginTR.jenkinsPluginMetadata.dependents); } // Setup event handlers... diff --git a/core/src/main/resources/hudson/PluginManager/installed.jelly b/core/src/main/resources/hudson/PluginManager/installed.jelly index f2cdc4b13c..12dccd3dee 100644 --- a/core/src/main/resources/hudson/PluginManager/installed.jelly +++ b/core/src/main/resources/hudson/PluginManager/installed.jelly @@ -48,8 +48,8 @@ THE SOFTWARE. data-cannot-disable="${%This plugin cannot be disabled}" data-cannot-uninstall="${%This plugin cannot be uninstalled}" data-disabled-dependencies="${%It has one or more disabled dependencies}" - data-enabled-dependants="${%It has one or more enabled dependants}" - data-installed-dependants="${%It has one or more installed dependants}" + data-enabled-dependents="${%It has one or more enabled dependents}" + data-installed-dependents="${%It has one or more installed dependents}" /> @@ -67,7 +67,7 @@ THE SOFTWARE. - +
${%Uninstall}
${%Uninstallation pending}

- -
- - + +
+ +
diff --git a/core/src/main/resources/hudson/PluginManager/installed_bg.properties b/core/src/main/resources/hudson/PluginManager/installed_bg.properties index 60dc8c4e29..226fb91952 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_bg.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_bg.properties @@ -48,7 +48,7 @@ Warning=\ \u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435 This\ plugin\ cannot\ be\ uninstalled=\ \u0422\u0430\u0437\u0438 \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0441\u0435 \u0434\u0435\u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430 -It\ has\ one\ or\ more\ enabled\ dependants=\ +It\ has\ one\ or\ more\ enabled\ dependents=\ \u0418\u043c\u0430 \u043f\u043e\u043d\u0435 \u0435\u0434\u043d\u0430 \u0434\u0440\u0443\u0433\u0430 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430, \u043a\u043e\u044f\u0442\u043e \u0437\u0430\u0432\u0438\u0441\u0438 \u043e\u0442 \u043d\u0435\u044f It\ has\ one\ or\ more\ disabled\ dependencies=\ \u0418\u043c\u0430 \u043f\u043e\u043d\u0435 \u0435\u0434\u043d\u0430 \u0434\u0440\u0443\u0433\u0430 \u0438\u0437\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430, \u043a\u043e\u044f\u0442\u043e \u0437\u0430\u0432\u0438\u0441\u0438 \u043e\u0442 \u043d\u0435\u044f @@ -61,7 +61,7 @@ Filter=\ requires.restart=\ \u0422\u0440\u044f\u0431\u0432\u0430 \u0434\u0430 \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u0438\u0440\u0430\u0442\u0435 Jenkins, \u043f\u0440\u0435\u0434\u0438 \u0434\u0430 \u043f\u0440\u0430\u0432\u0438\u0442\u0435 \u043f\u043e\u0432\u0435\u0447\u0435 \u043f\u0440\u043e\u043c\u0435\u043d\u0438 \u043f\u043e\ \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0438\u0442\u0435. \u041e\u043f\u0430\u0441\u043d\u043e \u0435 \u0434\u0430 \u043f\u0440\u043e\u0434\u044a\u043b\u0436\u0438\u0442\u0435 \u0431\u0435\u0437 \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u0438\u0440\u0430\u043d\u0435. -It\ has\ one\ or\ more\ installed\ dependants=\ +It\ has\ one\ or\ more\ installed\ dependents=\ \u041a\u044a\u043c \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430\u0442\u0430 \u0435 \u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u043d\u0430 \u043f\u043e\u043d\u0435 \u0435\u0434\u043d\u0430 \u0434\u0440\u0443\u0433\u0430 \u043a\u0430\u0442\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442. No\ description\ available.=\ \u0411\u0435\u0437 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 diff --git a/core/src/main/resources/hudson/PluginManager/installed_de.properties b/core/src/main/resources/hudson/PluginManager/installed_de.properties index 442d08f127..2148e128ad 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_de.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_de.properties @@ -34,10 +34,10 @@ Uninstallation\ pending=Zur Deinstallation vorgemerkt Update\ Center=Update-Center This\ plugin\ cannot\ be\ disabled=Dieses Plugin kann nicht deaktiviert werden. requires.restart=Jenkins erfordert einen Neustart. Die Plugin-Konfiguration sollte nicht weiter ge\u00E4ndert werden. Starten Sie Jenkins neu, bevor Sie fortfahren. -It\ has\ one\ or\ more\ installed\ dependants=Mindestens ein Plugin ist von diesem abh\u00E4ngig +It\ has\ one\ or\ more\ installed\ dependents=Mindestens ein Plugin ist von diesem abh\u00E4ngig Warning=Warnung Filter=Filter -It\ has\ one\ or\ more\ enabled\ dependants=Mindestens ein aktives Plugin ist von diesem abh\u00E4ngig +It\ has\ one\ or\ more\ enabled\ dependents=Mindestens ein aktives Plugin ist von diesem abh\u00E4ngig It\ has\ one\ or\ more\ disabled\ dependencies=Mindestens eine Abh\u00E4ngigkeit ist deaktiviert This\ plugin\ cannot\ be\ uninstalled=Dieses Plugin kann nicht deinstalliert werden. No\ description\ available.=Keine Beschreibung verf\u00FCgbar. diff --git a/core/src/main/resources/hudson/PluginManager/installed_it.properties b/core/src/main/resources/hudson/PluginManager/installed_it.properties index a1361443e9..67ea17da65 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_it.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_it.properties @@ -35,8 +35,8 @@ This\ plugin\ cannot\ be\ uninstalled=Impossibile disinstallare questo plugin requires.restart=Quest''istanza di Jenkins deve essere riavviata. La modifica dello stato dei plugin in questa condizione è caldamente sconsigliata. Riavviare Jenkins prima di procedere. No\ plugins\ installed.=Nessun plugin installato. Filter=Filtro -It\ has\ one\ or\ more\ installed\ dependants=Ha uno o più plugin dipendenti installati -It\ has\ one\ or\ more\ enabled\ dependants=Ha uno o più plugin dipendenti abilitati +It\ has\ one\ or\ more\ installed\ dependents=Ha uno o più plugin dipendenti installati +It\ has\ one\ or\ more\ enabled\ dependents=Ha uno o più plugin dipendenti abilitati This\ plugin\ cannot\ be\ enabled=Questo plugin non può essere abilitato This\ plugin\ cannot\ be\ disabled=Questo plugin non può essere disabilitato No\ description\ available.=Nessuna descrizione disponibile. diff --git a/core/src/main/resources/hudson/PluginManager/installed_sr.properties b/core/src/main/resources/hudson/PluginManager/installed_sr.properties index b555a4dbe9..0d54c1472d 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_sr.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_sr.properties @@ -8,8 +8,8 @@ This\ plugin\ cannot\ be\ enabled=\u041E\u0432\u0430 \u043C\u043E\u0434\u0443\u0 This\ plugin\ cannot\ be\ disabled=\u041E\u0432\u0430 \u043C\u043E\u0434\u0443\u043B\u0430 \u043D\u0435\u043C\u043E\u0436\u0435 \u0431\u0438\u0442\u0438 \u043E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0435\u043D\u0430 This\ plugin\ cannot\ be\ uninstalled=\u041E\u0432\u0430 \u043C\u043E\u0434\u0443\u043B\u0430 \u043D\u0435\u043C\u043E\u0436\u0435 \u0432\u0438\u0442\u0438 \u0434\u0435\u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u0430 It\ has\ one\ or\ more\ disabled\ dependencies=\u041F\u043E\u0441\u0442\u043E\u0458\u0438 \u043D\u0430\u0458\u043C\u0430\u045A\u0435 \u0458\u0435\u0434\u043D\u0430 \u0438\u0441\u043A\u0459\u0443\u0447\u0435\u043D\u0430 \u043C\u043E\u0434\u0443\u043B\u0430 \u043E\u0434 \u043A\u043E\u0458\u0435 \u043E\u0432\u0430 \u0437\u0430\u0432\u0438\u0441\u0438 -It\ has\ one\ or\ more\ enabled\ dependants=\u041F\u043E\u0441\u0442\u043E\u0458\u0438 \u043D\u0430\u0458\u043C\u0430\u045A\u0435 \u0458\u0435\u043D\u0434\u0430 \u0434\u0440\u0443\u0433\u0430 \u043C\u043E\u0434\u0443\u043B\u0430 \u043A\u043E\u0458\u0430 \u0437\u0430\u0432\u0438\u0441\u0438 \u043E\u0434 \u045A\u0435 -It\ has\ one\ or\ more\ installed\ dependants=\u041F\u043E\u0441\u0442\u043E\u0458\u0438 \u043D\u0430\u0458\u043C\u0430\u045A\u0435 \u0458\u0435\u043D\u0434\u0430 \u0434\u0440\u0443\u0433\u0430 \u043C\u043E\u0434\u0443\u043B\u0430 \u043A\u043E\u0458\u0430 \u0437\u0430\u0432\u0438\u0441\u0438 \u043E\u0434 \u045A\u0435 +It\ has\ one\ or\ more\ enabled\ dependents=\u041F\u043E\u0441\u0442\u043E\u0458\u0438 \u043D\u0430\u0458\u043C\u0430\u045A\u0435 \u0458\u0435\u043D\u0434\u0430 \u0434\u0440\u0443\u0433\u0430 \u043C\u043E\u0434\u0443\u043B\u0430 \u043A\u043E\u0458\u0430 \u0437\u0430\u0432\u0438\u0441\u0438 \u043E\u0434 \u045A\u0435 +It\ has\ one\ or\ more\ installed\ dependents=\u041F\u043E\u0441\u0442\u043E\u0458\u0438 \u043D\u0430\u0458\u043C\u0430\u045A\u0435 \u0458\u0435\u043D\u0434\u0430 \u0434\u0440\u0443\u0433\u0430 \u043C\u043E\u0434\u0443\u043B\u0430 \u043A\u043E\u0458\u0430 \u0437\u0430\u0432\u0438\u0441\u0438 \u043E\u0434 \u045A\u0435 No\ plugins\ installed.=\u041D\u0435\u043C\u0430 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u0438\u0445 \u043C\u043E\u0434\u0443\u043B\u0430 Uncheck\ to\ disable\ the\ plugin=\u0423\u043A\u043B\u043E\u043D\u0438\u0442\u0435 \u043A\u0432\u0430\u0447\u0438\u0446\u0443 \u0434\u0430 \u043E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0438\u0442\u0435 \u043C\u043E\u0434\u0443\u043B\u0443 Enabled=\u0410\u043A\u0442\u0438\u043D\u0432\u043E diff --git a/core/src/main/resources/hudson/cli/Messages.properties b/core/src/main/resources/hudson/cli/Messages.properties index 604b31395c..4b22f967d4 100644 --- a/core/src/main/resources/hudson/cli/Messages.properties +++ b/core/src/main/resources/hudson/cli/Messages.properties @@ -98,5 +98,5 @@ DisablePluginCommand.ShortDescription=\ Disable one or more installed plugins. DisablePluginCommand.NoSuchStrategy=This strategy ({0}) does not exist. Allowed strategies are {1} DisablePluginCommand.PrintUsageSummary=\ -Disable the plugins with the given short names. You can define how to proceed with the dependant plugins and if a restart after should be done. You can also set the quiet mode to avoid extra info in the console. +Disable the plugins with the given short names. You can define how to proceed with the dependent plugins and if a restart after should be done. You can also set the quiet mode to avoid extra info in the console. DisablePluginCommand.StatusMessage=Disabling ''{0}'': {1} ({2}) diff --git a/core/src/main/resources/hudson/model/Messages.properties b/core/src/main/resources/hudson/model/Messages.properties index e136e683d1..ece9c435ed 100644 --- a/core/src/main/resources/hudson/model/Messages.properties +++ b/core/src/main/resources/hudson/model/Messages.properties @@ -221,6 +221,7 @@ Run.BuildAborted=Build was aborted Run.MarkedExplicitly=This record is explicitly marked to be kept. Run.Permissions.Title=Run Run.running_as_=Running as {0} +Run.running_as_SYSTEM=Running as SYSTEM Run.UnableToDelete=Unable to delete {0}: {1} Run.DeletePermission.Description=\ This permission allows users to manually delete specific builds from the build history. diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signup.jelly b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signup.jelly index ff5d9ea136..3792702fd8 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signup.jelly +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signup.jelly @@ -50,6 +50,8 @@ THE SOFTWARE. ${%Create an account! [Jenkins]} + + diff --git a/core/src/main/resources/hudson/util/HudsonIsLoading/index.jelly b/core/src/main/resources/hudson/util/HudsonIsLoading/index.jelly index 2ed44ba863..11f826607f 100644 --- a/core/src/main/resources/hudson/util/HudsonIsLoading/index.jelly +++ b/core/src/main/resources/hudson/util/HudsonIsLoading/index.jelly @@ -39,6 +39,8 @@ THE SOFTWARE. ${%Starting Jenkins} + + diff --git a/core/src/main/resources/hudson/util/HudsonIsRestarting/index.jelly b/core/src/main/resources/hudson/util/HudsonIsRestarting/index.jelly index 65f30b5d94..a372dda355 100644 --- a/core/src/main/resources/hudson/util/HudsonIsRestarting/index.jelly +++ b/core/src/main/resources/hudson/util/HudsonIsRestarting/index.jelly @@ -39,6 +39,8 @@ THE SOFTWARE. ${%Restarting Jenkins} + + diff --git a/core/src/main/resources/jenkins/install/platform-plugins.json b/core/src/main/resources/jenkins/install/platform-plugins.json index 903f3df00f..48af4a4007 100644 --- a/core/src/main/resources/jenkins/install/platform-plugins.json +++ b/core/src/main/resources/jenkins/install/platform-plugins.json @@ -88,7 +88,8 @@ { "name": "pam-auth", "suggested": true }, { "name": "ldap", "suggested": true }, { "name": "role-strategy" }, - { "name": "active-directory" } + { "name": "active-directory" }, + { "name": "authorize-project" } ] }, { diff --git a/core/src/main/resources/jenkins/model/Jenkins/login.jelly b/core/src/main/resources/jenkins/model/Jenkins/login.jelly index 7fbe3dc26f..a2d20b3b76 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/login.jelly +++ b/core/src/main/resources/jenkins/model/Jenkins/login.jelly @@ -57,6 +57,8 @@ THE SOFTWARE. ${%signIn} [Jenkins] + + diff --git a/core/src/main/resources/jenkins/security/Messages.properties b/core/src/main/resources/jenkins/security/Messages.properties index 4e5ed11db2..0f4887f68b 100644 --- a/core/src/main/resources/jenkins/security/Messages.properties +++ b/core/src/main/resources/jenkins/security/Messages.properties @@ -29,3 +29,4 @@ ApiTokenProperty.LegacyTokenName=Legacy Token ApiTokenProperty.NoLegacyToken=This user currently does not have a legacy token RekeySecretAdminMonitor.DisplayName=Re-keying UpdateSiteWarningsMonitor.DisplayName=Update Site Warnings +QueueItemAuthenticatorMonitor.DisplayName=Access Control for Builds diff --git a/core/src/main/resources/jenkins/security/QueueItemAuthenticatorMonitor/message.groovy b/core/src/main/resources/jenkins/security/QueueItemAuthenticatorMonitor/message.groovy new file mode 100644 index 0000000000..0fe2a8d2ff --- /dev/null +++ b/core/src/main/resources/jenkins/security/QueueItemAuthenticatorMonitor/message.groovy @@ -0,0 +1,65 @@ +/* + * The MIT License + * + * Copyright (c) 2019, CloudBees, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package jenkins.security.QueueItemAuthenticatorMonitor + +def f = namespace(lib.FormTagLib) + +div(class: "alert alert-warning", role: "alert") { + + form(method: "post", action: "${rootURL}/${my.url}/act") { + f.submit(name: 'redirect', value: _("Learn more...")) + f.submit(name: 'dismiss', value: _("Dismiss")) + } + + text(_("blurb")) + + ul(style: "list-style-type: none;") { + if (my.queueItemAuthenticatorPresent) { + li(raw(_("queueItemAuthenticatorPresent"))) + + + if (my.queueItemAuthenticatorConfigured) { + li(raw(_("queueItemAuthenticatorConfigured"))) + + + if (my.anyBuildLaunchedAsSystemWithAuthenticatorPresent) { + li(raw(_("anyBuildLaunchedAsSystem", rootURL))) + form(method: "post", action: "${rootURL}/${my.url}/act") { + f.submit(name: 'reset', value: _("Reset")) + } + } + // else: This monitor will not be displayed + + + } else { + li(raw(_("noQueueItemAuthenticatorConfigured", rootURL))) + } + + } else { + li(raw(_("noQueueItemAuthenticatorPresent"))) + } + + } +} diff --git a/core/src/main/resources/jenkins/security/QueueItemAuthenticatorMonitor/message.properties b/core/src/main/resources/jenkins/security/QueueItemAuthenticatorMonitor/message.properties new file mode 100644 index 0000000000..97559c0d81 --- /dev/null +++ b/core/src/main/resources/jenkins/security/QueueItemAuthenticatorMonitor/message.properties @@ -0,0 +1,16 @@ +blurb = Builds in Jenkins run as the virtual SYSTEM user with full permissions by default. \ + This can be a problem if some users have restricted or no access to some jobs, but can configure others. \ + If that is the case, it is recommended to install a plugin implementing build authentication, and to override this default. + +queueItemAuthenticatorPresent = \u2705 An implementation of access control for builds is present. +noQueueItemAuthenticatorPresent = \u274c No implementation of access control for builds is present. \ + It is recommended that you install Authorize Project Plugin or another plugin \ + implementing the QueueItemAuthenticator \ + extension point. + +queueItemAuthenticatorConfigured = \u2705 Access control for builds is configured. +noQueueItemAuthenticatorConfigured = \u274c Access control for builds is possible, but not configured. Configure it in the global security configuration. + +anyBuildLaunchedAsSystem = \u274c Builds have been observed as launching as the internal SYSTEM user despite access control for builds being set up. \ + It is recommended that you review the access control for builds configuration to ensure builds are not generally running as the SYSTEM user. +notAnyBuildLaunchedAsSystem = \u2705 No builds have been launched as the internal SYSTEM user, indicating a complete configuration. diff --git a/core/src/main/resources/jenkins/security/apitoken/LegacyApiTokenAdministrativeMonitor/resources.js b/core/src/main/resources/jenkins/security/apitoken/LegacyApiTokenAdministrativeMonitor/resources.js index 58207a0dc0..31cedefeba 100644 --- a/core/src/main/resources/jenkins/security/apitoken/LegacyApiTokenAdministrativeMonitor/resources.js +++ b/core/src/main/resources/jenkins/security/apitoken/LegacyApiTokenAdministrativeMonitor/resources.js @@ -144,7 +144,7 @@ function onCheckChanged(checkBox){ var allCheckBoxes = document.querySelectorAll('.token-to-revoke'); for(var i = 0; i < allCheckBoxes.length; i++){ var checkBox = allCheckBoxes[i]; - checkBox.onchange = function(){ onCheckChanged(checkBox); }; + checkBox.onchange = function(){ onCheckChanged(this); }; } }); -})() \ No newline at end of file +})() diff --git a/pom.xml b/pom.xml index 5d5ac185ed..e05adb4008 100644 --- a/pom.xml +++ b/pom.xml @@ -76,7 +76,7 @@ THE SOFTWARE. - 2.167 + 2.170 -SNAPSHOT org.jenkins-ci winstone - 5.1 + 5.2 test diff --git a/war/src/main/js/widgets/config/tabbar.less b/war/src/main/js/widgets/config/tabbar.less index 82b9dc7cd2..0298d91cb3 100644 --- a/war/src/main/js/widgets/config/tabbar.less +++ b/war/src/main/js/widgets/config/tabbar.less @@ -228,7 +228,7 @@ height:@input-line-height; line-height:@input-line-height; } - select{ + select:not(.select-ajax-pending) { border-radius:0; background:@brightest; } diff --git a/war/src/main/webapp/css/signup.css b/war/src/main/webapp/css/signup.css index 17a7b58a38..01fc1c7c03 100644 --- a/war/src/main/webapp/css/signup.css +++ b/war/src/main/webapp/css/signup.css @@ -22,17 +22,15 @@ * THE SOFTWARE. */ .signup{ - min-width: 480px; max-width: 480px; - width: 480px; + width: 100%; } .signupIntroDefault { text-align: center; } form.signup{ - min-width: 480px; max-width: 480px; - width: 480px; + width: 100%; text-align: left; } .inputHeader { @@ -53,4 +51,4 @@ label { } #passwordStrengthWrapper { margin-top: 4px; -} \ No newline at end of file +} diff --git a/war/src/main/webapp/css/simple-page.css b/war/src/main/webapp/css/simple-page.css index d269ceb791..df1e953c6d 100644 --- a/war/src/main/webapp/css/simple-page.css +++ b/war/src/main/webapp/css/simple-page.css @@ -30,6 +30,7 @@ html { .simple-page h1 { font-size: 24px; + line-height: normal; } .simple-page { @@ -132,4 +133,4 @@ html { .layout-large { font-size: 18px; -} \ No newline at end of file +} diff --git a/war/src/main/webapp/css/style.css b/war/src/main/webapp/css/style.css index ebc646374d..14c3f1250a 100644 --- a/war/src/main/webapp/css/style.css +++ b/war/src/main/webapp/css/style.css @@ -1295,25 +1295,25 @@ TABLE.fingerprint-in-build TD { border: 1px solid #5788a1; } -#plugins tr.has-dependants input.uninstall { +#plugins tr.has-dependents input.uninstall { background-color: #e0e0e0; border: 1px solid #cccccc; color: #505050; background-color: white; } -#plugins tr.all-dependants-disabled .enable input { +#plugins tr.all-dependents-disabled .enable input { pointer-events: auto; opacity: 1.0; visibility: visible; } -#plugins tr.has-dependants input, #plugins tr.has-disabled-dependency .enable input { +#plugins tr.has-dependents input, #plugins tr.has-disabled-dependency .enable input { pointer-events: none; opacity: 0.2; } -#plugins tr.has-dependants-but-disabled .enable input { +#plugins tr.has-dependents-but-disabled .enable input { pointer-events: auto; opacity: 1.0; visibility: visible; @@ -1327,7 +1327,7 @@ TABLE.fingerprint-in-build TD { visibility: hidden !important; } -#plugins .dependant-list, #plugins .dependency-list { +#plugins .dependent-list, #plugins .dependency-list { display: none; }