提交 ef64bb20 编写于 作者: V varmenise 提交者: Valentina Armenise

[SECURITY-184] revised version of the orginal patch

上级 91515d31
...@@ -14,6 +14,7 @@ import java.util.Properties; ...@@ -14,6 +14,7 @@ import java.util.Properties;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException; import java.util.concurrent.TimeoutException;
import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
/** /**
...@@ -28,17 +29,12 @@ public class DefaultJnlpSlaveReceiver extends JnlpAgentReceiver { ...@@ -28,17 +29,12 @@ public class DefaultJnlpSlaveReceiver extends JnlpAgentReceiver {
public boolean handle(String nodeName, JnlpSlaveHandshake handshake) throws IOException, InterruptedException { public boolean handle(String nodeName, JnlpSlaveHandshake handshake) throws IOException, InterruptedException {
SlaveComputer computer = (SlaveComputer) Jenkins.getInstance().getComputer(nodeName); SlaveComputer computer = (SlaveComputer) Jenkins.getInstance().getComputer(nodeName);
if(computer==null) { if (computer==null) {
return false;
}
// Validate the slave secret matches.
if (!computer.getJnlpMac().equals(handshake.getRequestProperty("Secret-Key"))) {
return false; return false;
} }
Channel ch = computer.getChannel(); Channel ch = computer.getChannel();
if(ch !=null) { if (ch !=null) {
String c = handshake.getRequestProperty("Cookie"); String c = handshake.getRequestProperty("Cookie");
if (c!=null && c.equals(ch.getProperty(COOKIE_NAME))) { if (c!=null && c.equals(ch.getProperty(COOKIE_NAME))) {
// we think we are currently connected, but this request proves that it's from the party // we think we are currently connected, but this request proves that it's from the party
...@@ -57,6 +53,11 @@ public class DefaultJnlpSlaveReceiver extends JnlpAgentReceiver { ...@@ -57,6 +53,11 @@ public class DefaultJnlpSlaveReceiver extends JnlpAgentReceiver {
} }
} }
if (!matchesSecret(nodeName,handshake)) {
handshake.error(nodeName + " can't be connected since the slave's secret does not match the handshake secret.");
return true;
}
Properties response = new Properties(); Properties response = new Properties();
String cookie = generateCookie(); String cookie = generateCookie();
response.put("Cookie",cookie); response.put("Cookie",cookie);
...@@ -71,6 +72,31 @@ public class DefaultJnlpSlaveReceiver extends JnlpAgentReceiver { ...@@ -71,6 +72,31 @@ public class DefaultJnlpSlaveReceiver extends JnlpAgentReceiver {
return true; return true;
} }
/**
* Called after the client has connected to check if the slave secret matches the handshake secret
*
* @param nodeName
* Name of the incoming JNLP agent. All {@link JnlpAgentReceiver} shares a single namespace
* of names. The implementation needs to be able to tell which name belongs to them.
*
* @param handshake
* Encapsulation of the interaction with the incoming JNLP agent.
*
* @return
* true if the slave secret matches the handshake secret, false otherwise.
*/
private boolean matchesSecret(String nodeName, JnlpSlaveHandshake handshake){
SlaveComputer computer = (SlaveComputer) Jenkins.getInstance().getComputer(nodeName);
String handshakeSecret = handshake.getRequestProperty("Secret-Key");
// Verify that the slave secret matches the handshake secret.
if (!computer.getJnlpMac().equals(handshakeSecret)) {
LOGGER.log(Level.WARNING, "An attempt was made to connect as {0} from {1} with an incorrect secret", new Object[]{nodeName, handshake.getSocket().getRemoteSocketAddress()});
return false;
} else {
return true;
}
}
private String generateCookie() { private String generateCookie() {
byte[] cookie = new byte[32]; byte[] cookie = new byte[32];
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册