[ https://issues.apache.org/jira/browse/MYFACES-1786?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12663782#action_12663782 ]
Simon Kitching commented on MYFACES-1786: ----------------------------------------- Oh, and possibly the code could avoid logging this exception, instead catching all javax.crypto exceptions in StateUtils.symmetric() and instead just logging "INFO: postback could not be decrypted; ignoring data". > Encryption is enabled by default, causing problems if no secret is set > ---------------------------------------------------------------------- > > Key: MYFACES-1786 > URL: https://issues.apache.org/jira/browse/MYFACES-1786 > Project: MyFaces Core > Issue Type: Bug > Components: General > Affects Versions: 1.2.0, 1.2.1-SNAPSHOT > Environment: Any > Reporter: Jon Harley > Priority: Minor > > According to the documentation of org.apache.myfaces.util.StateUtils "To > enable encryption, a secret must be provided. StateUtils looks first for the > org.apache.myfaces.secret init param, then system properties. If a secret > cannot be located, encryption is not used." > This is the correct behaviour but in fact the isSecure() method of that class > includes: > return ! "false".equals(ctx.getInitParameter(USE_ENCRYPTION)); > This enables encryption in ALL cases except where the init parameter is > PRESENT and EQUAL to "false". For example if it is absent, encryption is > enabled. It looks as though a secret is then generated. > This causes a problem because if the web container is restarted, a new secret > is generated. Existing users who then submit any view encoded with the old > secret hit an exception in the restore view phase which looks like this, at > least in my environment: > javax.faces.FacesException: javax.crypto.BadPaddingException: Given final > block not properly padded > at > org.apache.myfaces.shared_impl.util.StateUtils.symmetric(StateUtils.java:370) > at > org.apache.myfaces.shared_impl.util.StateUtils.symmetric(StateUtils.java:408) > at > org.apache.myfaces.shared_impl.util.StateUtils.decrypt(StateUtils.java:288) > at > org.apache.myfaces.shared_impl.util.StateUtils.reconstruct(StateUtils.java:237) > at > org.apache.myfaces.renderkit.html.HtmlResponseStateManager.getTreeStructureToRestore(HtmlResponseStateManager.java:129) > at > javax.faces.render.ResponseStateManager.getState(ResponseStateManager.java:81) > at > org.apache.myfaces.application.jsp.JspStateManagerImpl.restoreView(JspStateManagerImpl.java:283) > at > org.ajax4jsf.framework.ajax.AjaxStateManager.restoreView(AjaxStateManager.java:83) > at > org.apache.myfaces.application.jsp.JspViewHandlerImpl.restoreView(JspViewHandlerImpl.java:354) > at > com.sun.facelets.FaceletViewHandler.restoreView(FaceletViewHandler.java:317) > at > org.ajax4jsf.framework.ViewHandlerWrapper.restoreView(ViewHandlerWrapper.java:116) > at > org.ajax4jsf.framework.ajax.AjaxViewHandler.restoreView(AjaxViewHandler.java:147) > at > org.jenia.faces.template.handler.ViewHandler.restoreView(ViewHandler.java:263) > at > com.sun.facelets.FaceletViewHandler.restoreView(FaceletViewHandler.java:317) > at > org.ajax4jsf.framework.ViewHandlerWrapper.restoreView(ViewHandlerWrapper.java:116) > at > org.ajax4jsf.framework.ajax.AjaxViewHandler.restoreView(AjaxViewHandler.java:147) > at > org.apache.myfaces.lifecycle.RestoreViewExecutor.execute(RestoreViewExecutor.java:85) > at > org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:95) > at > org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:70) > at javax.faces.webapp.FacesServlet.service(FacesServlet.java:137) > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) > at > org.ajax4jsf.framework.ajax.xmlfilter.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:96) > at > org.ajax4jsf.framework.ajax.xmlfilter.BaseFilter.doFilter(BaseFilter.java:220) > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) > at > org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:147) > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) > at > net.parkplatz.rr.webframework.Doorkeeper.doFilter(Doorkeeper.java:185) > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) > at > org.springframework.orm.jdo.support.OpenPersistenceManagerInViewFilter.doFilterInternal(OpenPersistenceManagerInViewFilter.java:106) > at > org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77) > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) > at > org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390) > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) > at > org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) > at > org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) > at > org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) > at > org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) > at > org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) > at > org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263) > at > org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) > at > org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584) > at > org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) > at java.lang.Thread.run(Thread.java:619) > Caused by: javax.crypto.BadPaddingException: Given final block not properly > padded > at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..) > at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..) > at com.sun.crypto.provider.DESCipher.engineDoFinal(DashoA13*..) > at javax.crypto.Cipher.doFinal(DashoA13*..) > at > org.apache.myfaces.shared_impl.util.StateUtils.symmetric(StateUtils.java:366) > ... 48 more > Caused by: javax.crypto.BadPaddingException: Given final block not properly > padded > at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..) > at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..) > at com.sun.crypto.provider.DESCipher.engineDoFinal(DashoA13*..) > at javax.crypto.Cipher.doFinal(DashoA13*..) > at > org.apache.myfaces.shared_impl.util.StateUtils.symmetric(StateUtils.java:366) > at > org.apache.myfaces.shared_impl.util.StateUtils.symmetric(StateUtils.java:408) > at > org.apache.myfaces.shared_impl.util.StateUtils.decrypt(StateUtils.java:288) > at > org.apache.myfaces.shared_impl.util.StateUtils.reconstruct(StateUtils.java:237) > at > org.apache.myfaces.renderkit.html.HtmlResponseStateManager.getTreeStructureToRestore(HtmlResponseStateManager.java:129) > at > javax.faces.render.ResponseStateManager.getState(ResponseStateManager.java:81) > at > org.apache.myfaces.application.jsp.JspStateManagerImpl.restoreView(JspStateManagerImpl.java:283) > at > org.ajax4jsf.framework.ajax.AjaxStateManager.restoreView(AjaxStateManager.java:83) > at > org.apache.myfaces.application.jsp.JspViewHandlerImpl.restoreView(JspViewHandlerImpl.java:354) > at > com.sun.facelets.FaceletViewHandler.restoreView(FaceletViewHandler.java:317) > at > org.ajax4jsf.framework.ViewHandlerWrapper.restoreView(ViewHandlerWrapper.java:116) > at > org.ajax4jsf.framework.ajax.AjaxViewHandler.restoreView(AjaxViewHandler.java:147) > at > org.jenia.faces.template.handler.ViewHandler.restoreView(ViewHandler.java:263) > at > com.sun.facelets.FaceletViewHandler.restoreView(FaceletViewHandler.java:317) > at > org.ajax4jsf.framework.ViewHandlerWrapper.restoreView(ViewHandlerWrapper.java:116) > at > org.ajax4jsf.framework.ajax.AjaxViewHandler.restoreView(AjaxViewHandler.java:147) > at > org.apache.myfaces.lifecycle.RestoreViewExecutor.execute(RestoreViewExecutor.java:85) > at > org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:95) > at > org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:70) > at javax.faces.webapp.FacesServlet.service(FacesServlet.java:137) > This was reported on the MyFaces users list using MyFaces 1.2.0 and is still > present in 1.2.1-SNAPSHOT > The fix is to correct the bug in the line from > org.apache.myfaces.util.StateUtils.isSecure() quoted above, so that it reads: > return "true".equals(ctx.getInitParameter(USE_ENCRYPTION)); -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.