diff --git a/changelog.html b/changelog.html index e768ac7cbf33fe4731af2a0fb706c298af131270..fb940c63df6a874373978a513e9914d5db307403 100644 --- a/changelog.html +++ b/changelog.html @@ -55,7 +55,14 @@ Upcoming changes @@ -79,7 +86,7 @@ Upcoming changes Absolute URLs in console output (issue 16368)
  • - Revert ampersand encoding which can cause backwad incompatibility issue + Revert ampersand encoding which can cause backward incompatibility issue (pull 683)
  • Fix dependency graph computation when upstream build trigger is involved diff --git a/cli/src/main/resources/hudson/cli/client/Messages.properties b/cli/src/main/resources/hudson/cli/client/Messages.properties index 09e78b185278d804e3dbabee7b30e0fb9b855b59..567122ab9d49a01f6e0f95debdf0c6dd7a6e466a 100644 --- a/cli/src/main/resources/hudson/cli/client/Messages.properties +++ b/cli/src/main/resources/hudson/cli/client/Messages.properties @@ -9,5 +9,5 @@ CLI.Usage=Jenkins CLI\n\ The available commands depend on the server. Run the 'help' command to\n\ see the list. CLI.NoURL=Neither -s nor the JENKINS_URL env var is specified. -CLI.VersionMismatch=Version mismatch. This CLI cannot work with this Hudson server +CLI.VersionMismatch=Version mismatch. This CLI cannot work with this Jenkins server. CLI.NoSuchFileExists=No such file exists: {0} diff --git a/core/pom.xml b/core/pom.xml index e19432da08790bddce0499d65bdbd6929a4c42f5..5edf04b16cc817a7adc7d04abf352b644a025573 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -42,7 +42,7 @@ THE SOFTWARE. true - 1.199 + 1.204 2.5.6.SEC03 @@ -199,7 +199,7 @@ THE SOFTWARE. org.kohsuke.stapler json-lib - 2.1-rev7 + 2.4-jenkins-1 commons-httpclient diff --git a/core/src/main/java/hudson/Functions.java b/core/src/main/java/hudson/Functions.java index e23502e1ae0a998960d2671648e7024ef9cab8da..a330a042bfba8edad253fa7ec7269e3ba901e92a 100644 --- a/core/src/main/java/hudson/Functions.java +++ b/core/src/main/java/hudson/Functions.java @@ -782,6 +782,7 @@ public class Functions { * * @param predicate * Filter the descriptors based on {@link GlobalConfigurationCategory} + * @since 1.494 */ public static Collection getSortedDescriptorsForGlobalConfig(Predicate predicate) { ExtensionList exts = Jenkins.getInstance().getExtensionList(Descriptor.class); @@ -807,13 +808,32 @@ public class Functions { return DescriptorVisibilityFilter.apply(Jenkins.getInstance(),answer); } + /** + * Like {@link #getSortedDescriptorsForGlobalConfig(Predicate)} but with a constant truth predicate, to include all descriptors. + */ public static Collection getSortedDescriptorsForGlobalConfig() { return getSortedDescriptorsForGlobalConfig(Predicates.alwaysTrue()); } + /** + * @deprecated This is rather meaningless. + */ + @Deprecated public static Collection getSortedDescriptorsForGlobalConfigNoSecurity() { return getSortedDescriptorsForGlobalConfig(Predicates.not(GlobalSecurityConfiguration.FILTER)); } + + /** + * Like {@link #getSortedDescriptorsForGlobalConfig(Predicate)} but for unclassified descriptors only. + * @since 1.506 + */ + public static Collection getSortedDescriptorsForGlobalConfigUnclassified() { + return getSortedDescriptorsForGlobalConfig(new Predicate() { + public boolean apply(GlobalConfigurationCategory cat) { + return cat instanceof GlobalConfigurationCategory.Unclassified; + } + }); + } private static class Tag implements Comparable { double ordinal; diff --git a/core/src/main/java/hudson/UDPBroadcastThread.java b/core/src/main/java/hudson/UDPBroadcastThread.java index 168279ba444e39238c33371963550f1f50205de8..384321ac9cae66acc022481d8045c52f0b7b1169 100644 --- a/core/src/main/java/hudson/UDPBroadcastThread.java +++ b/core/src/main/java/hudson/UDPBroadcastThread.java @@ -23,6 +23,7 @@ */ package hudson; +import edu.umd.cs.findbugs.annotations.SuppressWarnings; import hudson.model.Hudson; import jenkins.model.Jenkins; import hudson.util.OneShotEvent; @@ -52,6 +53,7 @@ public class UDPBroadcastThread extends Thread { public final OneShotEvent ready = new OneShotEvent(); private MulticastSocket mcs; private boolean shutdown; + static boolean udpHandlingProblem; // for tests /** * @deprecated as of 1.416 @@ -67,6 +69,7 @@ public class UDPBroadcastThread extends Thread { mcs = new MulticastSocket(PORT); } + @SuppressWarnings("ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD") @Override public void run() { try { @@ -106,6 +109,7 @@ public class UDPBroadcastThread extends Thread { } catch (IOException e) { if (shutdown) return; // forcibly closed LOGGER.log(Level.WARNING, "UDP handling problem",e); + udpHandlingProblem = true; } } diff --git a/core/src/main/java/hudson/model/Cause.java b/core/src/main/java/hudson/model/Cause.java index 38347f26c6119320305faabcbe145c4f6982f3b2..4ccab0333893604d8ab4abb33d68dbc091b22308 100644 --- a/core/src/main/java/hudson/model/Cause.java +++ b/core/src/main/java/hudson/model/Cause.java @@ -195,7 +195,7 @@ public abstract class Cause { */ public @CheckForNull Run getUpstreamRun() { Job job = Jenkins.getInstance().getItemByFullName(upstreamProject, Job.class); - return job.getBuildByNumber(upstreamBuild); + return job != null ? job.getBuildByNumber(upstreamBuild) : null; } @Exported(visibility=3) diff --git a/core/src/main/java/hudson/model/Result.java b/core/src/main/java/hudson/model/Result.java index a83055d860e2079e2e9e6888243a3fe3bdb66e73..d7f4a5970c4ddf18bd6a5a44c722706ea6ad345c 100644 --- a/core/src/main/java/hudson/model/Result.java +++ b/core/src/main/java/hudson/model/Result.java @@ -27,7 +27,6 @@ import com.thoughtworks.xstream.converters.SingleValueConverter; import com.thoughtworks.xstream.converters.basic.AbstractSingleValueConverter; import hudson.cli.declarative.OptionHandlerExtension; import hudson.util.EditDistance; -import hudson.util.EnumConverter; import org.apache.commons.beanutils.Converter; import org.kohsuke.args4j.CmdLineException; import org.kohsuke.args4j.CmdLineParser; diff --git a/core/src/main/java/hudson/model/UpdateSite.java b/core/src/main/java/hudson/model/UpdateSite.java index 147bf3f3b7bb5921da99d3541b90977b5f0155de..77bc130c3f644f24992cd04fa7f8f266f022132f 100644 --- a/core/src/main/java/hudson/model/UpdateSite.java +++ b/core/src/main/java/hudson/model/UpdateSite.java @@ -171,7 +171,11 @@ public class UpdateSite { String uncleanJson = IOUtils.toString(is,"UTF-8"); int jsonStart = uncleanJson.indexOf("{\""); if (jsonStart >= 0) { - return updateData(uncleanJson.substring(jsonStart), signatureCheck); + uncleanJson = uncleanJson.substring(jsonStart); + int end = uncleanJson.lastIndexOf('}'); + if (end>0) + uncleanJson = uncleanJson.substring(0,end+1); + return updateData(uncleanJson, signatureCheck); } else { throw new IOException("Could not find json in content of " + "update center from url: "+src.toExternalForm()); diff --git a/core/src/main/java/hudson/security/csrf/CrumbFilter.java b/core/src/main/java/hudson/security/csrf/CrumbFilter.java index 167f9786f5791a371287c330cc78d35e1146f89e..788eaa50caf30d37e3bb46671568b3af04380cbf 100644 --- a/core/src/main/java/hudson/security/csrf/CrumbFilter.java +++ b/core/src/main/java/hudson/security/csrf/CrumbFilter.java @@ -9,6 +9,7 @@ import jenkins.model.Jenkins; import java.io.IOException; import java.util.Enumeration; +import java.util.logging.Level; import java.util.logging.Logger; import javax.servlet.Filter; @@ -76,15 +77,14 @@ public class CrumbFilter implements Filter { if (crumbIssuer.validateCrumb(httpRequest, crumbSalt, crumb)) { valid = true; } else { - LOGGER.warning("Found invalid crumb " + crumb + - ". Will check remaining parameters for a valid one..."); + LOGGER.log(Level.WARNING, "Found invalid crumb {0}. Will check remaining parameters for a valid one...", crumb); } } // Multipart requests need to be handled by each handler. if (valid || isMultipart(httpRequest)) { chain.doFilter(request, response); } else { - LOGGER.warning("No valid crumb was included in request for " + httpRequest.getRequestURI() + ". Returning " + HttpServletResponse.SC_FORBIDDEN + "."); + LOGGER.log(Level.WARNING, "No valid crumb was included in request for {0}. Returning {1}.", new Object[] {httpRequest.getRequestURI(), HttpServletResponse.SC_FORBIDDEN}); httpResponse.sendError(HttpServletResponse.SC_FORBIDDEN,"No valid crumb was included in the request"); } } else { diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index a11dd3484526217fac3d7390158ee7253a269522..88adf177be76c5f5cc3cd1d223399b97e7ceb047 100755 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -94,6 +94,7 @@ import hudson.DNSMultiCast; import hudson.DescriptorExtensionList; import hudson.Extension; import hudson.ExtensionList; +import hudson.ExtensionPoint; import hudson.FilePath; import hudson.Functions; import hudson.Launcher; @@ -110,6 +111,7 @@ import hudson.UDPBroadcastThread; import hudson.Util; import static hudson.Util.fixEmpty; import static hudson.Util.fixNull; +import hudson.WebAppMain; import hudson.XmlFile; import hudson.cli.CLICommand; import hudson.cli.CliEntryPoint; @@ -247,6 +249,7 @@ import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletResponse; import static hudson.init.InitMilestone.*; +import hudson.security.BasicAuthenticationFilter; import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST; import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND; import java.io.File; @@ -790,7 +793,7 @@ public class Jenkins extends AbstractCIBase implements ModifiableTopLevelItemGro // JSON binding needs to be able to see all the classes from all the plugins WebApp.get(servletContext).setClassLoader(pluginManager.uberClassLoader); - adjuncts = new AdjunctManager(servletContext, pluginManager.uberClassLoader,"adjuncts/"+SESSION_HASH); + adjuncts = new AdjunctManager(servletContext, pluginManager.uberClassLoader,"adjuncts/"+SESSION_HASH, TimeUnit2.DAYS.toMillis(365)); // initialization consists of ... executeReactor( is, @@ -2702,7 +2705,7 @@ public class Jenkins extends AbstractCIBase implements ModifiableTopLevelItemGro jdks.addAll(req.bindJSONToList(JDK.class,json.get("jdks"))); boolean result = true; - for( Descriptor d : Functions.getSortedDescriptorsForGlobalConfig() ) + for (Descriptor d : Functions.getSortedDescriptorsForGlobalConfigUnclassified()) result &= configureDescriptor(req,json,d); version = VERSION; @@ -2886,7 +2889,7 @@ public class Jenkins extends AbstractCIBase implements ModifiableTopLevelItemGro * Check if the given name is suitable as a name * for job, view, etc. * - * @throws ParseException + * @throws Failure * if the given name is not good */ public static void checkGoodName(String name) throws Failure { @@ -2907,7 +2910,7 @@ public class Jenkins extends AbstractCIBase implements ModifiableTopLevelItemGro /** * Makes sure that the given name is good as a job name. - * @return trimmed name if valid; throws ParseException if not + * @return trimmed name if valid; throws Failure if not */ private String checkJobName(String name) throws Failure { checkGoodName(name); diff --git a/core/src/main/resources/hudson/model/Api/index.jelly b/core/src/main/resources/hudson/model/Api/index.jelly index 77da9470bb0587fb634145a322829414e66d0b63..215b157c24daba0a33ff587637d06d9b0e349eea 100644 --- a/core/src/main/resources/hudson/model/Api/index.jelly +++ b/core/src/main/resources/hudson/model/Api/index.jelly @@ -42,10 +42,9 @@ THE SOFTWARE.

    You can also specify optional XPath to control the fragment you'd like to obtain (but see below). - For example, ../api/xml?xpath=/*/*[0]. If the XPath only matches a text node, - the result will be sent with text/plain MIME type to simplify - further processing. - + For example, ../api/xml?xpath=/*/*[0]. +

    +

    For XPath that matches multiple nodes, you need to also specify the "wrapper" query parameter to specify the name of the root XML element to be create so that the resulting XML becomes well-formed.

    @@ -67,9 +66,7 @@ THE SOFTWARE.
    JSON API
    - Access the same data as JSON for JavaScript-based access. Supports - JSONP through - the optional jsonp=callbackname query parameter. + Access the same data as JSON for JavaScript-based access. tree may be used.
    Python API
    diff --git a/core/src/main/resources/hudson/model/ComputerSet/index.jelly b/core/src/main/resources/hudson/model/ComputerSet/index.jelly index 13a107e92d5ae5e4519441463d9d39f9ae08da03..08e3a51243efe67f9db0ad2150493ee3cf783d4b 100644 --- a/core/src/main/resources/hudson/model/ComputerSet/index.jelly +++ b/core/src/main/resources/hudson/model/ComputerSet/index.jelly @@ -42,11 +42,11 @@ THE SOFTWARE. - + - + + \ No newline at end of file diff --git a/core/src/main/resources/jenkins/model/Jenkins/configure.jelly b/core/src/main/resources/jenkins/model/Jenkins/configure.jelly index f695d73d9b99757882eca24a0d31308e4c3f28e8..ac7438b4d7fb8ae1f913507d0d00dac7960ca525 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/configure.jelly +++ b/core/src/main/resources/jenkins/model/Jenkins/configure.jelly @@ -53,7 +53,7 @@ THE SOFTWARE. - + diff --git a/core/src/main/resources/lib/form/textarea/textarea.js b/core/src/main/resources/lib/form/textarea/textarea.js index de78308fe6af910c3c68e0b41237c5a5b3c9187d..296b45fd54bc39c7e51cf10cb7c45d10551120ce 100644 --- a/core/src/main/resources/lib/form/textarea/textarea.js +++ b/core/src/main/resources/lib/form/textarea/textarea.js @@ -34,8 +34,6 @@ Behaviour.specify("DIV.textarea-preview-container", 'textarea', 100, function (e }; new Ajax.Request(rootURL + showPreview.getAttribute("previewEndpoint"), { - method: "POST", - requestHeaders: "Content-Type: application/x-www-form-urlencoded", parameters: { text: text }, diff --git a/test/src/test/java/hudson/UDPBroadcastThreadTest.java b/test/src/test/java/hudson/UDPBroadcastThreadTest.java index 5ad31abf5c5705290a7c49a6224f5170299c491c..2562de9f7154b3957673bfcdf46dcae0578194a1 100644 --- a/test/src/test/java/hudson/UDPBroadcastThreadTest.java +++ b/test/src/test/java/hudson/UDPBroadcastThreadTest.java @@ -1,6 +1,5 @@ package hudson; -import org.jvnet.hudson.test.HudsonTestCase; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; @@ -12,30 +11,43 @@ import java.net.DatagramPacket; import java.net.InetAddress; import java.io.StringReader; import java.io.IOException; +import java.net.SocketTimeoutException; +import org.junit.Assume; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; /** * @author Kohsuke Kawaguchi */ -public class UDPBroadcastThreadTest extends HudsonTestCase { +public class UDPBroadcastThreadTest { + + @Rule public JenkinsRule j = new JenkinsRule(); + /** * Old unicast based clients should still be able to receive some reply, * as we haven't changed the port. */ - public void testLegacy() throws Exception { + @Test public void legacy() throws Exception { DatagramSocket s = new DatagramSocket(); sendQueryTo(s, InetAddress.getLocalHost()); s.setSoTimeout(15000); // to prevent test hang - receiveAndVerify(s); + try { + receiveAndVerify(s); + } catch (SocketTimeoutException x) { + Assume.assumeFalse(UDPBroadcastThread.udpHandlingProblem); + throw x; + } } /** * Multicast based clients should be able to receive multiple replies. */ - public void testMulticast() throws Exception { - UDPBroadcastThread second = new UDPBroadcastThread(jenkins); + @Test public void multicast() throws Exception { + UDPBroadcastThread second = new UDPBroadcastThread(j.jenkins); second.start(); - UDPBroadcastThread third = new UDPBroadcastThread(jenkins); + UDPBroadcastThread third = new UDPBroadcastThread(j.jenkins); third.start(); second.ready.block(); @@ -47,8 +59,13 @@ public class UDPBroadcastThreadTest extends HudsonTestCase { s.setSoTimeout(15000); // to prevent test hang // we should at least get two replies since we run two broadcasts - receiveAndVerify(s); - receiveAndVerify(s); + try { + receiveAndVerify(s); + receiveAndVerify(s); + } catch (SocketTimeoutException x) { + Assume.assumeFalse(UDPBroadcastThread.udpHandlingProblem); + throw x; + } } finally { third.interrupt(); second.interrupt(); diff --git a/war/src/main/webapp/scripts/hudson-behavior.js b/war/src/main/webapp/scripts/hudson-behavior.js index 277ed3bba782f70d3b8e8c7d829148937d81a618..5618b51b7fe9f3994247a94a687b73c1a570fe35 100644 --- a/war/src/main/webapp/scripts/hudson-behavior.js +++ b/war/src/main/webapp/scripts/hudson-behavior.js @@ -100,10 +100,12 @@ var crumb = { wrap: function(headers) { if (this.fieldName!=null) { if (headers instanceof Array) + // XXX prototype.js only seems to interpret object headers.push(this.fieldName, this.value); else headers[this.fieldName]=this.value; } + // XXX return value unused return headers; },
    S${%Name}${%Name} ${m.columnCaption}${m.columnCaption} diff --git a/core/src/main/resources/hudson/node_monitors/ArchitectureMonitor/column.jelly b/core/src/main/resources/hudson/node_monitors/ArchitectureMonitor/column.jelly index 46dd6500fd9311019d19ae694a9a9190b681f8e4..9c6fbced67640e8724958f6cb0a00d91ed2dff00 100644 --- a/core/src/main/resources/hudson/node_monitors/ArchitectureMonitor/column.jelly +++ b/core/src/main/resources/hudson/node_monitors/ArchitectureMonitor/column.jelly @@ -24,5 +24,5 @@ THE SOFTWARE. - ${data}${data}