Ben M. created SHIRO-678:
----------------------------

             Summary: Strings garbled when POST without JSESSIONID cookie
                 Key: SHIRO-678
                 URL: https://issues.apache.org/jira/browse/SHIRO-678
             Project: Shiro
          Issue Type: Bug
          Components: jax-rs, Session Management, Web
    Affects Versions: 1.4.0
         Environment: OS: Linux (SLES Enterprise 11SP4, Ubuntu 18.04.x), 
Windows 10.
ApplicationServers: LibertyProfile 18.0.0.2, 18.0.04, 19.0.01 and OpenLiberty 
19.0.0.1.

            Reporter: Ben M.


Dear all,

I created a login endpoint using jaxrs-2.1 and a simple form based 
authentication.

If I supply a password with German Umlauts (äöü etc.) and do NOT supply any 
JSESSIONID (any invalid would do), the received string will be mojibake.

However, if I supply a JSESSIONID (even an invalid JSESSIONID would do), the 
received String will be just fine.

 h2. Example servlet

Here's an example endpoint:
{code:java}
@Path("/api")
public class JaxRsEndpoint {

  @POST
  @Path("/login")
  @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
  @Produces(MediaType.APPLICATION_JSON)
  public Response doLogin(
      @DefaultValue("") @FormParam("l_username") final String username, // 
login username
      @DefaultValue("") @FormParam("l_password") final String password // login 
password
  ) {
    Map<String, String> receivedData = new ConcurrentHashMap<>();
    receivedData.put("l_username", username);
    receivedData.put("l_password", password);

    return Response.ok()
        .entity(unmodifiableMap(receivedData))
        .build();
  }

}
{code}
 
h2. web.xml

Here's the required web.xml configuration:
{code:xml}
<web-app id="WebApp_ID"
                                 version="3.1"
                                 xmlns="http://xmlns.jcp.org/xml/ns/javaee";
                                 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
                                 
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd";>
        <display-name>jaxrs-multipart-encoding</display-name>
        <servlet>
                <servlet-name>javax.ws.rs.core.Application</servlet-name>
                <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
                <servlet-name>javax.ws.rs.core.Application</servlet-name>
                <url-pattern>/*</url-pattern>
        </servlet-mapping>

        <listener>
                
<listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
        </listener>

        <filter>
                <filter-name>ShiroFilter</filter-name>
                
<filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
        </filter>

        <filter-mapping>
                <filter-name>ShiroFilter</filter-name>
                <url-pattern>/*</url-pattern>
                <dispatcher>REQUEST</dispatcher>
                <dispatcher>FORWARD</dispatcher>
                <dispatcher>INCLUDE</dispatcher>
                <dispatcher>ERROR</dispatcher>
        </filter-mapping>
</web-app>
{code}
 
h2. Test 1 (NOT working):
{code:java}
$ curl -i -XPOST --url "http://localhost:9080/formdata/api/login"; -d 
'l_username=user&l_password=äöü'; echo ""
HTTP/1.1 200 OK
Content-Type: application/json
Date: Tue, 05 Mar 2019 08:59:32 GMT
Content-Language: en-EN
Content-Length: 49

{"l_username":"user","l_password":"äöü"}
{code}
h2. Test 2 (working as expected):
{code:java}
$ curl -i -XPOST --cookie 'JSESSIONID=0'  --url 
"http://localhost:9080/formdata/api/login"; -d 'l_username=user&l_password=äöü'; 
echo "" 
HTTP/1.1 200 OK
Content-Type: application/json
Date: Tue, 05 Mar 2019 08:57:51 GMT
Content-Language: en-EN
Content-Length: 43

{"l_username":"user","l_password":"äöü"}
{code}
 
h2. shiro.ini
{code:java}
shiro.loginUrl = /api/login
shiro.successUrl = /overview
shiro.usernameParam = l_username
shiro.passwordParam = l_password
shiro.rememberMeParam = rememberMe


# Session handling.
sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager
# 3,600,000 milliseconds = 1 hour
# 7200000 = 2h
sessionManager.globalSessionTimeout = 7200000

# Use the configured native session manager:
securityManager.sessionManager = $sessionManager

# Cache
sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO
securityManager.sessionManager.sessionDAO = $sessionDAO

# URL Configuration
[urls]
/* = anon
{code}
I have looked through the source code but was unable to find a reason why this 
may occur.

 

This bug does not occur when NOT using Shiro. This means the shiro filter seems 
to do some damage, but only when the jsessionid cookie is NOT supplied.

 



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to