/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.login;
import java.util.UUID;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.enonic.cms.core.security.RememberedLoginEntity;
import com.enonic.cms.core.security.RememberedLoginKey;
import com.enonic.cms.core.security.user.UserKey;
import com.enonic.cms.core.structure.SiteKey;
import com.enonic.cms.core.time.TimeService;
import com.enonic.cms.store.dao.RememberedLoginDao;
@Service
public class LoginServiceImpl
implements LoginService
{
private RememberedLoginDao rememberedLoginDao;
private TimeService timeService;
private long autologinTimeoutInMilliSeconds;
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public String rememberLogin( UserKey userKey, SiteKey siteKey, boolean resetGUID )
{
RememberedLoginEntity rememberedLogin = rememberedLoginDao.findByUserKeyAndSiteKey( userKey, siteKey );
String guid;
if ( rememberedLogin == null )
{
guid = createCookieSafeUID();
RememberedLoginKey key = new RememberedLoginKey();
key.setSiteKey( siteKey );
key.setUserKey( userKey );
rememberedLogin = new RememberedLoginEntity();
rememberedLogin.setKey( key );
rememberedLogin.setCreatedAt( timeService.getNowAsDateTime().toDate() );
rememberedLogin.setGuid( guid );
rememberedLoginDao.store( rememberedLogin );
}
else
{
if ( resetGUID )
{
guid = createCookieSafeUID();
rememberedLogin.setGuid( guid );
}
else
{
guid = rememberedLogin.getGuid();
}
rememberedLogin.setCreatedAt( timeService.getNowAsDateTime().toDate() );
}
return guid;
}
public UserKey getRememberedLogin( String guid, SiteKey siteKey )
{
RememberedLoginEntity rememberedLogin = rememberedLoginDao.findByGuidAndSite( guid, siteKey );
if ( rememberedLogin == null )
{
return null;
}
long now = timeService.getNowAsMilliseconds();
long loginRememberedAt = rememberedLogin.getCreatedAt().getTime();
long timeRemembered = now - loginRememberedAt;
if ( timeRemembered < autologinTimeoutInMilliSeconds )
{
return rememberedLogin.getKey().getUserKey();
}
return null;
}
private String createCookieSafeUID()
{
return UUID.randomUUID().toString().replace( "-", "" );
}
@Autowired
public void setRememberedLoginDao( RememberedLoginDao value )
{
this.rememberedLoginDao = value;
}
@Autowired
public void setTimeService( TimeService value )
{
this.timeService = value;
}
@Value("${com.enonic.vertical.presentation.autologinTimeout}")
public void setAutologinTimeoutInDays( Integer value )
{
this.autologinTimeoutInMilliSeconds = (long) 1000 * 60 * 60 * 24 * value;
}
@Override
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public void removeRememberedLogin( final UserKey userKey )
{
this.rememberedLoginDao.removeUsage( userKey );
}
}