/* * HeadsUp Agile * Copyright 2009-2012 Heads Up Development Ltd. * * 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 <http://www.gnu.org/licenses/>. */ package org.headsupdev.agile.security; import org.headsupdev.agile.api.Manager; import org.headsupdev.agile.api.User; import org.headsupdev.support.java.Base64; import java.util.*; /** * A login manager class that handles remembering users on the system * <p/> * Created: 02/02/2013 * * @author Andrew Williams * @since 2.0 */ public abstract class RememberedLoginManager { private static final String REMEMBER_STORE_KEY = "remembermes"; private static Map<String, Set<String>> rememberMap = null; public User getRememberedUser( String context ) { checkRemembers(); int pos = context.indexOf( ':' ); if ( pos != -1 ) { String username = context.substring( 0, pos ); String key = context.substring( pos + 1 ); Set<String> remembers = rememberMap.get( username ); if ( remembers != null && remembers.contains( key ) ) { return Manager.getSecurityInstance().getUserByUsername( username ); } } return null; } public void rememberUser( User user, String random ) { checkRemembers(); Set<String> remembers = rememberMap.get(user.getUsername()); if ( remembers == null ) { remembers = new HashSet<String>(); } remembers.add( random ); rememberMap.put( user.getUsername(), remembers ); saveRemembers(); } public void forgetUser( User user ) { checkRemembers(); rememberMap.remove( user.getUsername() ); saveRemembers(); } private void checkRemembers() { if ( rememberMap != null ) { return; } rememberMap = new HashMap<String,Set<String>>(); String data = Manager.getStorageInstance().getGlobalConfiguration().getProperty( REMEMBER_STORE_KEY ); if ( data == null ) { return; } data = new String( Base64.decodeBase64( data.getBytes() ) ); String[] entries = data.split( ";" ); for ( String entry : entries ) { String[] parts = entry.split( ":" ); if ( parts.length < 2 ) { continue; } rememberMap.put( parts[0], setFromString( parts[1] ) ); } } private void saveRemembers() { if ( rememberMap == null ) { return; } StringBuilder buffer = new StringBuilder(); for ( String user : rememberMap.keySet() ) { buffer.append( user ); buffer.append( ":" ); buffer.append( stringFromSet( rememberMap.get( user ) ) ); buffer.append( ";" ); } String data = buffer.toString(); if ( buffer.length() > 0 ) { data = data.substring( 0, buffer.length() - 1 ); } data = new String( Base64.encodeBase64( data.getBytes() ) ); Manager.getStorageInstance().getGlobalConfiguration().setProperty( REMEMBER_STORE_KEY, data ); } private String stringFromSet( Set<String> set ) { StringBuilder builder = new StringBuilder(); if ( set == null || set.size() == 0 ) { return ""; } for ( String string : set ) { builder.append( string ); builder.append( "," ); } String ret = builder.toString(); return ret.substring( 0, ret.length() - 1 ); } private Set<String> setFromString( String input ) { Set<String> ret = new HashSet<String>(); if ( input == null || input.length() == 0 ) { return ret; } String[] split = input.split( "," ); ret.addAll( Arrays.asList( split ) ); return ret; } }