package com.mossle.security.util;
import java.io.IOException;
import java.util.UUID;
import javax.annotation.Resource;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.mossle.api.tenant.TenantHolder;
import com.mossle.security.SecurityConstants;
import com.mossle.security.impl.SpringSecurityUserAuth;
import com.mossle.spi.device.DeviceConnector;
import com.mossle.spi.device.DeviceDTO;
import eu.bitwalker.useragentutils.UserAgent;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
public class RememberLastUsernameAuthenticationSuccessHandler extends
SavedRequestAwareAuthenticationSuccessHandler {
private TenantHolder tenantHolder;
private DeviceConnector deviceConnector;
@Override
public void onAuthenticationSuccess(HttpServletRequest request,
HttpServletResponse response, Authentication authentication)
throws ServletException, IOException {
this.handleTenant(response);
this.handleUsername(response, authentication);
this.handleDevice(request, response);
super.onAuthenticationSuccess(request, response, authentication);
}
public void handleTenant(HttpServletResponse response) {
String tenantCode = tenantHolder.getTenantCode();
this.addCookie(response, SecurityConstants.SECURITY_LAST_TENANT,
tenantCode);
}
public void handleUsername(HttpServletResponse response,
Authentication authentication) {
String username = this.getUsername(authentication);
this.addCookie(response, SecurityConstants.SECURITY_LAST_USERNAME,
username);
}
public void handleDevice(HttpServletRequest request,
HttpServletResponse response) {
String deviceId = getCookie(request, "SECURITY_DEVICE_ID");
if (deviceId == null) {
deviceId = UUID.randomUUID().toString();
this.addCookie(response, "SECURITY_DEVICE_ID", deviceId,
3600 * 24 * 365 * 100);
}
DeviceDTO deviceDto = deviceConnector.findDevice(deviceId);
if (deviceDto == null) {
deviceDto = new DeviceDTO();
deviceDto.setCode(deviceId);
UserAgent userAgent = UserAgent.parseUserAgentString(request
.getHeader("User-Agent"));
deviceDto.setType(userAgent.getOperatingSystem().getDeviceType()
.toString());
deviceDto.setOs(userAgent.getOperatingSystem().toString());
deviceDto.setClient(userAgent.getBrowser().toString());
}
deviceConnector.saveDevice(deviceDto);
}
public void addCookie(HttpServletResponse response, String key, String value) {
this.addCookie(response, key, value, 3600 * 24 * 30);
}
public void addCookie(HttpServletResponse response, String key,
String value, int maxAge) {
Cookie cookie = new Cookie(key, value);
cookie.setMaxAge(maxAge);
response.addCookie(cookie);
}
public String getCookie(HttpServletRequest request, String key) {
Cookie[] cookies = request.getCookies();
if (cookies == null) {
return null;
}
for (Cookie cookie : cookies) {
if ((cookie == null) || (cookie.getName() == null)) {
continue;
}
if (cookie.getName().equals(key)) {
return cookie.getValue();
}
}
return null;
}
public String getUsername(Authentication authentication) {
if (authentication == null) {
return "";
}
Object principal = authentication.getPrincipal();
if (principal instanceof SpringSecurityUserAuth) {
return ((SpringSecurityUserAuth) principal).getUsername();
} else {
return authentication.getName();
}
}
@Resource
public void setTenantHolder(TenantHolder tenantHolder) {
this.tenantHolder = tenantHolder;
}
@Resource
public void setDeviceConnector(DeviceConnector deviceConnector) {
this.deviceConnector = deviceConnector;
}
}