Skip to content
Permalink
Browse files

Rename requiredSecret to secret and add secretRequired

AJP Connector will not start if secretRequired="true" and secret is set
to null or zero length String.
  • Loading branch information
markt-asf committed Jan 21, 2020
1 parent 69c5608 commit b962835f98b905286b78c414d5aaec2d0e711f75
@@ -143,14 +143,48 @@ public void setTomcatAuthorization(boolean tomcatAuthorization) {
}


private String requiredSecret = null;
private String secret = null;
/**
* Set the secret that must be included with every request.
*
* @param secret The required secret
*/
public void setSecret(String secret) {
this.secret = secret;
}
protected String getSecret() {
return secret;
}
/**
* Set the required secret that must be included with every request.
*
* @param requiredSecret The required secret
*
* @deprecated Replaced by {@link #setSecret(String)}.
* Will be removed in Tomcat 11 onwards
*/
@Deprecated
public void setRequiredSecret(String requiredSecret) {
this.requiredSecret = requiredSecret;
setSecret(requiredSecret);
}
/**
* @return The current secret
*
* @deprecated Replaced by {@link #getSecret()}.
* Will be removed in Tomcat 11 onwards
*/
@Deprecated
protected String getRequiredSecret() {
return getSecret();
}


private boolean secretRequired = true;
public void setSecretRequired(boolean secretRequired) {
this.secretRequired = secretRequired;
}
public boolean getSecretRequired() {
return secretRequired;
}


@@ -202,7 +236,7 @@ protected Processor createProcessor() {
processor.setAjpFlush(getAjpFlush());
processor.setTomcatAuthentication(getTomcatAuthentication());
processor.setTomcatAuthorization(getTomcatAuthorization());
processor.setRequiredSecret(requiredSecret);
processor.setSecret(secret);
processor.setKeepAliveTimeout(getKeepAliveTimeout());
processor.setClientCertProvider(getClientCertProvider());
processor.setSendReasonPhrase(getSendReasonPhrase());
@@ -216,4 +250,16 @@ protected Processor createUpgradeProcessor(SocketWrapperBase<?> socket,
throw new IllegalStateException(sm.getString("ajpprotocol.noUpgradeHandler",
upgradeToken.getHttpUpgradeHandler().getClass().getName()));
}


@Override
public void init() throws Exception {
if (getSecretRequired()) {
String secret = getSecret();
if (secret == null || secret.length() == 0) {
throw new IllegalArgumentException(sm.getString("ajpprotocol.nosecret"));
}
}
super.init();
}
}
@@ -322,9 +322,13 @@ public void setTomcatAuthorization(boolean tomcatAuthorization) {
/**
* Required secret.
*/
private String requiredSecret = null;
private String secret = null;
@Deprecated
public void setRequiredSecret(String requiredSecret) {
this.requiredSecret = requiredSecret;
setSecret(requiredSecret);
}
public void setSecret(String secret) {
this.secret = secret;
}


@@ -782,7 +786,7 @@ private void prepareRequest() {
}

// Decode extra attributes
boolean secret = false;
boolean secretPresentInRequest = false;
byte attributeCode;
while ((attributeCode = requestHeaderMessage.getByte())
!= Constants.SC_A_ARE_DONE) {
@@ -883,9 +887,9 @@ private void prepareRequest() {

case Constants.SC_A_SECRET:
requestHeaderMessage.getBytes(tmpMB);
if (requiredSecret != null) {
secret = true;
if (!tmpMB.equals(requiredSecret)) {
if (secret != null) {
secretPresentInRequest = true;
if (!tmpMB.equals(secret)) {
response.setStatus(403);
setErrorState(ErrorState.CLOSE_CLEAN, null);
}
@@ -901,7 +905,7 @@ private void prepareRequest() {
}

// Check if secret was submitted if required
if ((requiredSecret != null) && !secret) {
if ((secret != null) && !secretPresentInRequest) {
response.setStatus(403);
setErrorState(ErrorState.CLOSE_CLEAN, null);
}
@@ -32,5 +32,6 @@ ajpprocessor.request.process=Error processing request

ajpprotocol.noBio=The AJP BIO connector has been removed in Tomcat 8.5.x onwards. The AJP BIO connector configuration has been automatically switched to use the AJP NIO connector instead.
ajpprotocol.noSSL=SSL is not supported with AJP. The SSL host configuration for [{0}] was ignored
ajpprotocol.nosecret=The AJP Connector is configured with secretRequired="true" but the secret attribute is either null or "". This combination is not valid.
ajpprotocol.noUpgrade=Upgrade is not supported with AJP. The UpgradeProtocol configuration for [{0}] was ignored
ajpprotocol.noUpgradeHandler=Upgrade is not supported with AJP. The HttpUpgradeHandler [{0}] can not be processed
@@ -187,6 +187,14 @@
Change the default bind address for the AJP/1.3 connector to be the
loopback address. (markt)
</update>
<add>
Rename the <code>requiredSecret</code> attribute of the AJP/1.3
Connector to <code>secret</code> and add a new attribute
<code>secretRequired</code> that defaults to <code>true</code>. When
<code>secretRequired</code> is <code>true</code> the AJP/1.3 Connector
will not start unless the <code>secret</code> attribute is configured to
a non-null, non-zero length String. (markt)
</add>
</changelog>
</subsection>
<subsection name="Jasper">
@@ -437,8 +437,18 @@
expected concurrent requests (synchronous and asynchronous).</p>
</attribute>

<attribute name="requiredSecret" required="false">
<attribute name="secret" required="false">
<p>Only requests from workers with this secret keyword will be accepted.
The default value is <code>null</code>. This attrbute must be specified
with a non-null, non-zero length value unless
<strong>secretRequired</strong> is explicitly configured to be
<code>false</code>.</p>
</attribute>

<attribute name="secretRequired" required="false">
<p>If this attribute is <code>true</code>, the AJP Connector will only
start if the <strong>secret</strong> attribute is configured with a
non-null, non-zero length value. The default value is <code>true</code>.
</p>
</attribute>

0 comments on commit b962835

Please sign in to comment.
You can’t perform that action at this time.