/* * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package juzu.plugin.shiro.impl; import javax.servlet.http.Cookie; import juzu.impl.request.Request; import juzu.request.HttpContext; import org.apache.shiro.codec.Base64; import org.apache.shiro.mgt.AbstractRememberMeManager; import org.apache.shiro.subject.Subject; import org.apache.shiro.subject.SubjectContext; /** * @author <a href="mailto:haithanh0809@gmail.com">Nguyen Thanh Hai</a> * @version $Id$ * */ public class JuzuRememberMe extends AbstractRememberMeManager { /** * The default name of the underlying rememberMe cookie which is * {@code rememberMe}. */ private final String DEFAULT_REMEMBER_ME_COOKIE_NAME = "rememberMe"; /** * The value of deleted cookie (with the maxAge 0). */ private final String DELETED_COOKIE_VALUE = "deleteMe"; @Override protected byte[] getRememberedSerializedIdentity(SubjectContext subjectContext) { String base64 = readCookieValue(DEFAULT_REMEMBER_ME_COOKIE_NAME); if (DELETED_COOKIE_VALUE.equals(base64)) { return null; } if (base64 != null) { base64 = ensurePadding(base64); return Base64.decode(base64); } return null; } /** * Sometimes a user agent will send the rememberMe cookie value without * padding, most likely because {@code =} is a separator in the cookie header. * <p/> * Contributed by Luis Arias. Thanks Luis! * * @param base64 * the base64 encoded String that may need to be padded * @return the base64 String padded if necessary. */ private String ensurePadding(String base64) { int length = base64.length(); if (length % 4 != 0) { StringBuilder sb = new StringBuilder(base64); for (int i = 0; i < length % 4; ++i) { sb.append('='); } base64 = sb.toString(); } return base64; } private String readCookieValue(String name) { HttpContext context = Request.getCurrent().getBridge().getHttpContext(); Cookie[] cookies = context.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { if (cookie.getName().equals(name)) { return cookie.getValue(); } } } return null; } public void forgetIdentity(SubjectContext subjectContext) { } @Override protected void forgetIdentity(Subject subject) { } @Override protected void rememberSerializedIdentity(Subject subject, byte[] serialized) { } }