diff --git a/src/main/java/org/jenkinsci/plugins/ParameterizedRemoteTrigger/RemoteBuildConfiguration.java b/src/main/java/org/jenkinsci/plugins/ParameterizedRemoteTrigger/RemoteBuildConfiguration.java index fa62789e..0ef63317 100644 --- a/src/main/java/org/jenkinsci/plugins/ParameterizedRemoteTrigger/RemoteBuildConfiguration.java +++ b/src/main/java/org/jenkinsci/plugins/ParameterizedRemoteTrigger/RemoteBuildConfiguration.java @@ -929,14 +929,17 @@ public JSONObject sendHTTPCall(String urlString, String requestType, AbstractBui this.failBuild(new Exception("No remote host is defined for this job."), listener); return null; } - HttpURLConnection connection = null; JSONObject responseObject = null; URL buildUrl = new URL(urlString); connection = (HttpURLConnection) buildUrl.openConnection(); - + if(remoteServer.hasCrumbSupport() && requestType.equals("POST")){ + String crumbUrl=remoteServer.getAddress()+"/crumbIssuer/api/json"; + JSONObject crumb = sendHTTPCall(crumbUrl, "GET", build, listener); + connection.addRequestProperty(crumb.getString("crumbRequestField"),crumb.getString("crumb")); + } // if there is a username + apiToken defined for this remote host, then use it String usernameTokenConcat; diff --git a/src/main/java/org/jenkinsci/plugins/ParameterizedRemoteTrigger/RemoteJenkinsServer.java b/src/main/java/org/jenkinsci/plugins/ParameterizedRemoteTrigger/RemoteJenkinsServer.java index 22475360..133fecfd 100644 --- a/src/main/java/org/jenkinsci/plugins/ParameterizedRemoteTrigger/RemoteJenkinsServer.java +++ b/src/main/java/org/jenkinsci/plugins/ParameterizedRemoteTrigger/RemoteJenkinsServer.java @@ -30,18 +30,20 @@ public class RemoteJenkinsServer extends AbstractDescribableImpl auth = new CopyOnWriteList(); @DataBoundConstructor - public RemoteJenkinsServer(String address, String displayName, boolean hasBuildTokenRootSupport, JSONObject auth) + public RemoteJenkinsServer(String address, String displayName, boolean hasBuildTokenRootSupport, boolean hasCrumbSupport, JSONObject auth) throws MalformedURLException { this.address = new URL(address); this.displayName = displayName.trim(); this.hasBuildTokenRootSupport = hasBuildTokenRootSupport; + this.hasCrumbSupport = hasCrumbSupport; // Holding on to both of these variables for legacy purposes. The seemingly 'dirty' getters for these properties // are for the same reason. @@ -78,6 +80,10 @@ public boolean getHasBuildTokenRootSupport() { return this.hasBuildTokenRootSupport; } + public boolean hasCrumbSupport() { + return hasCrumbSupport; + } + @Override public DescriptorImpl getDescriptor() { return (DescriptorImpl) super.getDescriptor(); diff --git a/src/main/resources/org/jenkinsci/plugins/ParameterizedRemoteTrigger/RemoteJenkinsServer/config.jelly b/src/main/resources/org/jenkinsci/plugins/ParameterizedRemoteTrigger/RemoteJenkinsServer/config.jelly index 95997624..79106280 100644 --- a/src/main/resources/org/jenkinsci/plugins/ParameterizedRemoteTrigger/RemoteJenkinsServer/config.jelly +++ b/src/main/resources/org/jenkinsci/plugins/ParameterizedRemoteTrigger/RemoteJenkinsServer/config.jelly @@ -7,6 +7,9 @@ + + + diff --git a/src/test/java/org/jenkinsci/plugins/ParameterizedRemoteTrigger/RemoteBuildConfigurationTest.java b/src/test/java/org/jenkinsci/plugins/ParameterizedRemoteTrigger/RemoteBuildConfigurationTest.java index c7e14599..f4f21536 100644 --- a/src/test/java/org/jenkinsci/plugins/ParameterizedRemoteTrigger/RemoteBuildConfigurationTest.java +++ b/src/test/java/org/jenkinsci/plugins/ParameterizedRemoteTrigger/RemoteBuildConfigurationTest.java @@ -1,6 +1,7 @@ package org.jenkinsci.plugins.ParameterizedRemoteTrigger; import hudson.model.FreeStyleProject; +import hudson.security.csrf.DefaultCrumbIssuer; import net.sf.json.JSONObject; import org.junit.Rule; import org.junit.Test; @@ -21,7 +22,34 @@ public void testRemoteBuild() throws Exception { String remoteUrl = jenkinsRule.getURL().toString(); RemoteJenkinsServer remoteJenkinsServer = - new RemoteJenkinsServer(remoteUrl, "JENKINS", false, auth); + new RemoteJenkinsServer(remoteUrl, "JENKINS", false, false, auth); + RemoteBuildConfiguration.DescriptorImpl descriptor = + jenkinsRule.jenkins.getDescriptorByType(RemoteBuildConfiguration.DescriptorImpl.class); + descriptor.setRemoteSites(remoteJenkinsServer); + + FreeStyleProject remoteProject = jenkinsRule.createFreeStyleProject(); + + FreeStyleProject project = jenkinsRule.createFreeStyleProject(); + RemoteBuildConfiguration remoteBuildConfiguration = new RemoteBuildConfiguration( + remoteJenkinsServer.getDisplayName(), false, remoteProject.getFullName(), "", + "", true, null, null, false, true, 1); + project.getBuildersList().add(remoteBuildConfiguration); + + jenkinsRule.buildAndAssertSuccess(project); + } + + @Test + public void testRemoteBuildWithCrumb() throws Exception { + jenkinsRule.jenkins.setCrumbIssuer(new DefaultCrumbIssuer(true)); + + JSONObject authenticationMode = new JSONObject(); + authenticationMode.put("value", "none"); + JSONObject auth = new JSONObject(); + auth.put("authenticationMode", authenticationMode); + + String remoteUrl = jenkinsRule.getURL().toString(); + RemoteJenkinsServer remoteJenkinsServer = + new RemoteJenkinsServer(remoteUrl, "JENKINS", false, true, auth); RemoteBuildConfiguration.DescriptorImpl descriptor = jenkinsRule.jenkins.getDescriptorByType(RemoteBuildConfiguration.DescriptorImpl.class); descriptor.setRemoteSites(remoteJenkinsServer);