You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2017/09/04 11:28:06 UTC
svn commit: r1807211 - in /tomcat/tc7.0.x/trunk:
java/org/apache/catalina/authenticator/BasicAuthenticator.java
java/org/apache/catalina/authenticator/LocalStrings.properties
webapps/docs/changelog.xml webapps/docs/config/valve.xml
Author: markt
Date: Mon Sep 4 11:28:06 2017
New Revision: 1807211
URL: http://svn.apache.org/viewvc?rev=1807211&view=rev
Log:
Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=61280
Add RFC 7617 support to the BasicAuthenticator
Modified:
tomcat/tc7.0.x/trunk/java/org/apache/catalina/authenticator/BasicAuthenticator.java
tomcat/tc7.0.x/trunk/java/org/apache/catalina/authenticator/LocalStrings.properties
tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml
tomcat/tc7.0.x/trunk/webapps/docs/config/valve.xml
Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/authenticator/BasicAuthenticator.java
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/authenticator/BasicAuthenticator.java?rev=1807211&r1=1807210&r2=1807211&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/catalina/authenticator/BasicAuthenticator.java (original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/authenticator/BasicAuthenticator.java Mon Sep 4 11:28:06 2017
@@ -5,9 +5,9 @@
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -17,6 +17,7 @@
package org.apache.catalina.authenticator;
import java.io.IOException;
+import java.nio.charset.Charset;
import java.security.Principal;
import javax.servlet.http.HttpServletRequest;
@@ -38,17 +39,14 @@ import org.apache.tomcat.util.codec.bina
*/
public class BasicAuthenticator extends AuthenticatorBase {
- // ----------------------------------------------------- Instance Variables
-
-
/**
* Descriptive information about this implementation.
*/
- protected static final String info =
- "org.apache.catalina.authenticator.BasicAuthenticator/1.0";
+ protected static final String info = "org.apache.catalina.authenticator.BasicAuthenticator/1.0";
- // ------------------------------------------------------------- Properties
+ private Charset charset = B2CConverter.ISO_8859_1;
+ private String charsetString = null;
/**
@@ -56,28 +54,28 @@ public class BasicAuthenticator extends
*/
@Override
public String getInfo() {
+ return info;
+ }
- return (info);
+ public String getCharset() {
+ return charsetString;
}
- // --------------------------------------------------------- Public Methods
+ public void setCharset(String charsetString) {
+ // Only acceptable options are null, "" or "UTF-8" (case insensitive)
+ if (charsetString == null || charsetString.isEmpty()) {
+ charset = B2CConverter.ISO_8859_1;
+ } else if ("UTF-8".equalsIgnoreCase(charsetString)) {
+ charset = B2CConverter.UTF_8;
+ } else {
+ throw new IllegalArgumentException(sm.getString("basicAuthenticator.invalidCharset"));
+ }
+ this.charsetString = charsetString;
+ }
- /**
- * Authenticate the user making this request, based on the specified
- * login configuration. Return <code>true</code> if any specified
- * constraint has been satisfied, or <code>false</code> if we have
- * created a response challenge already.
- *
- * @param request Request we are processing
- * @param response Response we are creating
- * @param config Login configuration describing how authentication
- * should be performed
- *
- * @exception IOException if an input/output error occurs
- */
@Override
public boolean authenticate(Request request,
HttpServletResponse response,
@@ -92,21 +90,21 @@ public class BasicAuthenticator extends
String username = null;
String password = null;
- MessageBytes authorization =
+ MessageBytes authorization =
request.getCoyoteRequest().getMimeHeaders()
.getValue("authorization");
-
+
if (authorization != null) {
authorization.toBytes();
ByteChunk authorizationBC = authorization.getByteChunk();
if (authorizationBC.startsWithIgnoreCase("basic ", 0)) {
authorizationBC.setOffset(authorizationBC.getOffset() + 6);
-
+
byte[] decoded = Base64.decodeBase64(
authorizationBC.getBuffer(),
authorizationBC.getOffset(),
authorizationBC.getLength());
-
+
// Get username and password
int colon = -1;
for (int i = 0; i < decoded.length; i++) {
@@ -117,15 +115,12 @@ public class BasicAuthenticator extends
}
if (colon < 0) {
- username = new String(decoded, B2CConverter.ISO_8859_1);
+ username = new String(decoded, charset);
} else {
- username = new String(
- decoded, 0, colon, B2CConverter.ISO_8859_1);
- password = new String(
- decoded, colon + 1, decoded.length - colon - 1,
- B2CConverter.ISO_8859_1);
+ username = new String(decoded, 0, colon, charset);
+ password = new String(decoded, colon + 1, decoded.length - colon - 1, charset);
}
-
+
authorizationBC.setOffset(authorizationBC.getOffset() - 6);
}
@@ -136,7 +131,7 @@ public class BasicAuthenticator extends
return (true);
}
}
-
+
StringBuilder value = new StringBuilder(16);
value.append("Basic realm=\"");
if (config.getRealmName() == null) {
@@ -144,7 +139,11 @@ public class BasicAuthenticator extends
} else {
value.append(config.getRealmName());
}
- value.append('\"');
+ value.append('\"');
+ if (charsetString != null && !charsetString.isEmpty()) {
+ value.append(", charset=");
+ value.append(charsetString);
+ }
response.setHeader(AUTH_HEADER_NAME, value.toString());
response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
return (false);
Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/authenticator/LocalStrings.properties
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/authenticator/LocalStrings.properties?rev=1807211&r1=1807210&r2=1807211&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/catalina/authenticator/LocalStrings.properties (original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/authenticator/LocalStrings.properties Mon Sep 4 11:28:06 2017
@@ -33,6 +33,8 @@ authenticator.unauthorized=Cannot authen
authenticator.userDataConstraint=This request violates a User Data constraint for this application
authenticator.tomcatPrincipalLogoutFail=Logout with TomcatPrincipal instance has failed
+basicAuthenticator.invalidCharset=The only permitted values are null, the empty string or UTF-8
+
digestAuthenticator.cacheRemove=A valid entry has been removed from client nonce cache to make room for new entries. A replay attack is now possible. To prevent the possibility of replay attacks, reduce nonceValidity or increase cnonceCacheSize. Further warnings of this type will be suppressed for 5 minutes.
formAuthenticator.forwardErrorFail=Unexpected error forwarding to error page
Modified: tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml?rev=1807211&r1=1807210&r2=1807211&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml Mon Sep 4 11:28:06 2017
@@ -60,6 +60,11 @@
<section name="Tomcat 7.0.82 (violetagg)">
<subsection name="Catalina">
<changelog>
+ <add>
+ <bug>61280</bug>: Add RFC 7617 support to the
+ <code>BasicAuthenticator</code>. Note that the default configuration
+ does not change the existin behaviour. (markt)
+ </add>
<fix>
<bug>61452</bug>: Fix a copy paste error that caused an
<code>UnsupportedEncodingException</code> when using WebDAV. (markt)
Modified: tomcat/tc7.0.x/trunk/webapps/docs/config/valve.xml
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/config/valve.xml?rev=1807211&r1=1807210&r2=1807211&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/webapps/docs/config/valve.xml (original)
+++ tomcat/tc7.0.x/trunk/webapps/docs/config/valve.xml Mon Sep 4 11:28:06 2017
@@ -1009,6 +1009,19 @@
used.</p>
</attribute>
+ <attribute name="charset" required="false">
+ <p>Controls if the <code>WWW-Authenticate</code> HTTP header includes a
+ <code>charset</code> authentication parameter as per RFC 7617. The only
+ permitted options are <code>null</code>, the empty string and
+ <code>UTF-8</code>. If <code>UTF-8</code> is specified then the
+ <code>charset</code> authentication parameter will be sent with that
+ value and the provided user name and optional password will be converted
+ from bytes to characters using UTF-8. Otherwise, no <code>charset</code>
+ authentication parameter will be sent and the provided user name and
+ optional password will be converted from bytes to characters using
+ ISO-8859-1. The default value is <code>null</code></p>
+ </attribute>
+
<attribute name="className" required="true">
<p>Java class name of the implementation to use. This MUST be set to
<strong>org.apache.catalina.authenticator.BasicAuthenticator</strong>.</p>
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org