Skip to content

Commit

Permalink
Merge pull request #2198 from daniel-beck/JENKINS-12875
Browse files Browse the repository at this point in the history
[FIX JENKINS-12875] Change default crumb name to Jenkins-Crumb
  • Loading branch information
daniel-beck committed Apr 1, 2016
2 parents 4649e04 + 8b6d38d commit a87c38c
Show file tree
Hide file tree
Showing 6 changed files with 29 additions and 15 deletions.
27 changes: 18 additions & 9 deletions core/src/main/java/hudson/security/csrf/CrumbFilter.java
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -62,17 +62,11 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha
String crumbFieldName = crumbIssuer.getDescriptor().getCrumbRequestField(); String crumbFieldName = crumbIssuer.getDescriptor().getCrumbRequestField();
String crumbSalt = crumbIssuer.getDescriptor().getCrumbSalt(); String crumbSalt = crumbIssuer.getDescriptor().getCrumbSalt();


String crumb = httpRequest.getHeader(crumbFieldName);
boolean valid = false; boolean valid = false;
String crumb = extractCrumbFromRequest(httpRequest, crumbFieldName);
if (crumb == null) { if (crumb == null) {
Enumeration<?> paramNames = request.getParameterNames(); // compatibility for clients that hard-code the default crumb name up to Jenkins 1.TODO
while (paramNames.hasMoreElements()) { extractCrumbFromRequest(httpRequest, ".crumb");
String paramName = (String) paramNames.nextElement();
if (crumbFieldName.equals(paramName)) {
crumb = request.getParameter(paramName);
break;
}
}
} }
if (crumb != null) { if (crumb != null) {
if (crumbIssuer.validateCrumb(httpRequest, crumbSalt, crumb)) { if (crumbIssuer.validateCrumb(httpRequest, crumbSalt, crumb)) {
Expand All @@ -93,6 +87,21 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha
} }
} }


private String extractCrumbFromRequest(HttpServletRequest httpRequest, String crumbFieldName) {
String crumb = httpRequest.getHeader(crumbFieldName);
if (crumb == null) {
Enumeration<?> paramNames = httpRequest.getParameterNames();
while (paramNames.hasMoreElements()) {
String paramName = (String) paramNames.nextElement();
if (crumbFieldName.equals(paramName)) {
crumb = httpRequest.getParameter(paramName);
break;
}
}
}
return crumb;
}

protected static boolean isMultipart(HttpServletRequest request) { protected static boolean isMultipart(HttpServletRequest request) {
if (request == null) { if (request == null) {
return false; return false;
Expand Down
5 changes: 4 additions & 1 deletion core/src/main/java/hudson/security/csrf/CrumbIssuer.java
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -44,6 +44,9 @@ public abstract class CrumbIssuer implements Describable<CrumbIssuer>, Extension


private static final String CRUMB_ATTRIBUTE = CrumbIssuer.class.getName() + "_crumb"; private static final String CRUMB_ATTRIBUTE = CrumbIssuer.class.getName() + "_crumb";


@Restricted(NoExternalUse.class)
public static final String DEFAULT_CRUMB_NAME = "Jenkins-Crumb";

/** /**
* Get the name of the request parameter the crumb will be stored in. Exposed * Get the name of the request parameter the crumb will be stored in. Exposed
* here for the remote API. * here for the remote API.
Expand Down Expand Up @@ -199,7 +202,7 @@ public static class RestrictedApi extends Api {
} else if ("concat(//crumbRequestField,\":\",//crumb)".equals(xpath)) { // new FullDuplexHttpStream; Main } else if ("concat(//crumbRequestField,\":\",//crumb)".equals(xpath)) { // new FullDuplexHttpStream; Main
text = ci.getCrumbRequestField() + ':' + ci.getCrumb(); text = ci.getCrumbRequestField() + ':' + ci.getCrumb();
} else if ("concat(//crumbRequestField,'=',//crumb)".equals(xpath)) { // NetBeans } else if ("concat(//crumbRequestField,'=',//crumb)".equals(xpath)) { // NetBeans
if (ci.getCrumbRequestField().startsWith(".")) { if (ci.getCrumbRequestField().startsWith(".") || ci.getCrumbRequestField().contains("-")) {
text = ci.getCrumbRequestField() + '=' + ci.getCrumb(); text = ci.getCrumbRequestField() + '=' + ci.getCrumb();
} else { } else {
text = null; text = null;
Expand Down
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ public String getCrumbRequestField() {
*/ */
public void setCrumbRequestField(String requestField) { public void setCrumbRequestField(String requestField) {
if (Util.fixEmptyAndTrim(requestField) == null) { if (Util.fixEmptyAndTrim(requestField) == null) {
crumbRequestField = ".crumb"; crumbRequestField = CrumbIssuer.DEFAULT_CRUMB_NAME;
} else { } else {
crumbRequestField = requestField; crumbRequestField = requestField;
} }
Expand Down
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ public static final class DescriptorImpl extends CrumbIssuerDescriptor<DefaultCr
private final static HexStringConfidentialKey CRUMB_SALT = new HexStringConfidentialKey(Jenkins.class,"crumbSalt",16); private final static HexStringConfidentialKey CRUMB_SALT = new HexStringConfidentialKey(Jenkins.class,"crumbSalt",16);


public DescriptorImpl() { public DescriptorImpl() {
super(CRUMB_SALT.get(), System.getProperty("hudson.security.csrf.requestfield", ".crumb")); super(CRUMB_SALT.get(), System.getProperty("hudson.security.csrf.requestfield", CrumbIssuer.DEFAULT_CRUMB_NAME));
load(); load();
} }


Expand Down
3 changes: 2 additions & 1 deletion test/src/test/groovy/hudson/model/SlaveTest.groovy
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import static hudson.util.FormValidation.Kind.WARNING
import static org.junit.Assert.assertNotNull import static org.junit.Assert.assertNotNull
import static org.junit.Assert.assertEquals import static org.junit.Assert.assertEquals


import hudson.security.csrf.CrumbIssuer
import hudson.slaves.DumbSlave import hudson.slaves.DumbSlave
import hudson.slaves.JNLPLauncher import hudson.slaves.JNLPLauncher
import hudson.util.FormValidation import hudson.util.FormValidation
Expand Down Expand Up @@ -84,7 +85,7 @@ class SlaveTest {
HttpURLConnection con = new URL(j.getURL(),url).openConnection(); HttpURLConnection con = new URL(j.getURL(),url).openConnection();
con.requestMethod = "POST" con.requestMethod = "POST"
con.setRequestProperty("Content-Type","application/xml;charset=UTF-8") con.setRequestProperty("Content-Type","application/xml;charset=UTF-8")
con.setRequestProperty(".crumb","test") con.setRequestProperty(CrumbIssuer.DEFAULT_CRUMB_NAME,"test")
con.doOutput = true; con.doOutput = true;
con.outputStream.write(xml.getBytes("UTF-8")) con.outputStream.write(xml.getBytes("UTF-8"))
con.outputStream.close(); con.outputStream.close();
Expand Down
5 changes: 3 additions & 2 deletions test/src/test/java/lib/form/RowSetTest.java
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@


import com.gargoylesoftware.htmlunit.html.HtmlPage; import com.gargoylesoftware.htmlunit.html.HtmlPage;
import hudson.model.RootAction; import hudson.model.RootAction;
import hudson.security.csrf.CrumbIssuer;
import junit.framework.Assert; import junit.framework.Assert;
import net.sf.json.JSONObject; import net.sf.json.JSONObject;
import org.junit.Rule; import org.junit.Rule;
Expand All @@ -27,12 +28,12 @@ public void json() throws Exception {
public static class Subject implements RootAction { public static class Subject implements RootAction {
public void doSubmitTest1(StaplerRequest req) throws Exception { public void doSubmitTest1(StaplerRequest req) throws Exception {
JSONObject json = req.getSubmittedForm(); JSONObject json = req.getSubmittedForm();
json.remove("crumb"); json.remove(CrumbIssuer.DEFAULT_CRUMB_NAME);
System.out.println(json); System.out.println(json);


JSONObject expected = JSONObject.fromObject( JSONObject expected = JSONObject.fromObject(
"{'a':'aaa','b':'bbb','c':{'c1':'ccc1','c2':'ccc2'},'d':{'d1':'d1','d2':'d2'}}"); "{'a':'aaa','b':'bbb','c':{'c1':'ccc1','c2':'ccc2'},'d':{'d1':'d1','d2':'d2'}}");
Assert.assertEquals(json,expected); Assert.assertEquals(expected, json);
} }


@Override @Override
Expand Down

0 comments on commit a87c38c

Please sign in to comment.