/* * Copyright (C) 2008-2017, Juick * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ package com.juick.service.security.deprecated; import com.juick.User; import com.juick.service.security.entities.JuickUser; import com.juick.service.UserService; import com.juick.service.security.NullUserDetailsService; import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.env.Environment; import org.springframework.security.core.Authentication; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.web.authentication.RememberMeServices; import org.springframework.security.web.authentication.rememberme.AbstractRememberMeServices; import org.springframework.security.web.authentication.rememberme.InvalidCookieException; import org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationException; import org.springframework.util.Assert; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Optional; /** * Created by aalexeev on 11/28/16. * * @deprecated not recommended use for secure reasons */ @Deprecated public class CookieSimpleHashRememberMeServices extends AbstractRememberMeServices implements RememberMeServices { private static final Logger logger = LoggerFactory.getLogger(CookieSimpleHashRememberMeServices.class); private static final String COOKIE_PARAM_NAME = "hash"; private final UserService userService; public CookieSimpleHashRememberMeServices( final String key, final UserService userService, final Environment environment) { super(key, new NullUserDetailsService()); Assert.notNull(userService); Assert.notNull(environment); this.userService = userService; setCookieName(COOKIE_PARAM_NAME); setCookieDomain(environment.getProperty("web_domain", "localhost")); setAlwaysRemember(true); } @Override public void logout(HttpServletRequest request, HttpServletResponse response, Authentication authentication) { super.logout(request, response, authentication); userService.deleteLoginForUser(authentication.getName()); } @Override protected void onLoginSuccess( HttpServletRequest request, HttpServletResponse response, Authentication successfulAuthentication) { String username = successfulAuthentication.getName(); logger.debug("Creating new persistent login for user {}", username); try { User user = userService.getUserByName(username); Assert.isTrue(user.getUid() > 0); String hash = RandomStringUtils.randomAlphanumeric(16).toUpperCase(); userService.setLoginForUser(user.getUid(), hash); setCookie(new String[]{hash}, getTokenValiditySeconds(), request, response); } catch (Exception e) { logger.error("Failed to save cookies", e); } } @Override protected UserDetails processAutoLoginCookie( String[] cookieTokens, HttpServletRequest request, HttpServletResponse response) throws RememberMeAuthenticationException, UsernameNotFoundException { String hash = cookieTokens[0]; if (StringUtils.isBlank(hash)) { hash = request.getParameter("hash"); } if (StringUtils.isBlank(hash)) { throw new InvalidCookieException("Cookie is invalid and hash parameter not found"); } User user = userService.getUserByHash(hash); if (user.getUid() <= 0) throw new UsernameNotFoundException("User not found by hash, cookies" + cookieTokens); Optional userOptional = userService.getUserByUID(user.getUid()); Assert.isTrue(userOptional.isPresent()); return new JuickUser(userOptional.get()); } @Override protected String[] decodeCookie(String cookieValue) throws InvalidCookieException { return new String[]{cookieValue}; } @Override protected String encodeCookie(String[] cookieTokens) { return cookieTokens != null && cookieTokens.length > 0 ? cookieTokens[0] : StringUtils.EMPTY; } }