+ and = chars in Base64 encoded data
base64, java
Solution
I had this problem with Handlebars.
var htmlsrc64 = '{{posting.html64}}';
result:
var htmlsrc64 = '... wvZGl2Pgo=';
after changing the statement to 3 curly brackets it didn't longer escape the =
var htmlsrc64 = '{{{posting.html64}}}';
result:
var htmlsrc64 = '... wvZGl2Pgo=';
Problem
I am converting a SAML XML string into base 64 encoded data and posting from a JSP to Controller in java application. For some reason when I receive the data at the server side all the `'+'` chars are changed to `+` and all the `'='` chars are changed to `=` `.` Please explain what is happening there. For the time being I have written code to find any such strings to replace with `+` and `=` chars. Also let me know how can I stop this. My Code and design is: testSSO.jsp -> TestServletSSO.java -> SSOController.java -> CustomRequestWrapper.java JSP: ``` <html> <title>Test page for SSO</title> <body> <h3>Test page for SSO</h3> Please enter SAML in the input box below and submit the page. It will perform SSO with the application. <form id="form1" method="post" action="testsso"> <TEXTAREA NAME="saml" id="saml" COLS=40 ROWS=6></TEXTAREA> <input type="submit" /> </form> </body> </html> ``` TestServlet.java ``` package com.testsso; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class TestServletSSO extends HttpServlet { /** * */ private static final long serialVersionUID = 1L; public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { CustomRequestWrapper requestWrapper = new CustomRequestWrapper(request); RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/sso/fetchAndRegister"); dispatcher.forward(requestWrapper, response); } } ``` SSOController.java ``` package com.controller; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.AuthenticationEventPublisher; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.web.authentication.RememberMeServices; import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken; import org.springframework.security.web.context.HttpSessionSecurityContextRepository; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @RequestMapping("/sso") public class SSOController { @RequestMapping("/fetchAndRegister") public ModelAndView fetchAndRegister(HttpServletRequest request) { /** * This will call CustomRequestWrapper.getHeader() method. */ String authHeaderStr = (String) request .getHeader("Authorization"); System.out.println(authHeaderStr); // authHeaderStr has changed here. UserDetails userDetails = SSOService .fetchAndRegister(authHeaderStr); login(request, userDetails); return new ModelAndView("redirect:/account/eligibility"); } ``` CustomRequestWrapper.java: ``` package com.testsso; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; public class CustomRequestWrapper extends HttpServletRequestWrapper { public CustomRequestWrapper(HttpServletRequest request) { super(request); } public String getHeader(String name) { //get the request object and cast it HttpServletRequest request = (HttpServletRequest)getRequest(); String value = ""; if ("Authorization".equals(name)){ value = (String) request.getParameter("saml"); return value; } return request.getHeader(name); } } ```