package rfx.server.http.common; import static io.netty.handler.codec.http.HttpHeaders.Names.COOKIE; import static io.netty.handler.codec.http.HttpHeaders.Names.SET_COOKIE; import static io.netty.handler.codec.http.HttpHeaders.Names.USER_AGENT; import io.netty.handler.codec.http.Cookie; import io.netty.handler.codec.http.CookieDecoder; import io.netty.handler.codec.http.DefaultCookie; import io.netty.handler.codec.http.FullHttpResponse; import io.netty.handler.codec.http.HttpRequest; import io.netty.handler.codec.http.ServerCookieEncoder; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.Set; import rfx.server.http.cookie.CookieData; import rfx.server.util.LocationUtil; import rfx.server.util.SecurityUtil; public class CookieUtil { public final static long COOKIE_AGE_10_YEARS = 630720000; public final static long COOKIE_AGE_2_YEARS = 63072000; public final static long COOKIE_AGE_1_YEAR = 31536000; public final static long COOKIE_AGE_1_HOUR = 3600; // One hour public final static long COOKIE_AGE_2_HOURS = 7200; // 2 hours public final static long COOKIE_AGE_3_HOURS = 10800; // 3 hours public final static long COOKIE_AGE_1_DAY = 86400; // One day public final static long COOKIE_AGE_3_DAYS = 259200; // 3 days public final static long COOKIE_AGE_1_WEEK = 604800; // One week /* * rand format 3b10f37d26bae61d.1330937373.4.1331004249.1330998456.2 * userid. first time visit, number visit, current time, last time visit, locationId */ public static String newSessionValue(String rand_aid, int rand_locationId) { int rand_numbervisit = 1; int rand_numberidvisit = 1; long unixTime = System.currentTimeMillis() / 1000L; int rand_currenttime = (int) unixTime; int rand_firsttime = rand_currenttime; int rand_lasttimevisit = rand_currenttime; return CookieUtil.generateSessionString(rand_aid, rand_firsttime, rand_numbervisit, rand_currenttime, rand_lasttimevisit,rand_numberidvisit, rand_locationId); } public static String generateSessionString(String rand_aid, int rand_firsttime,int rand_numbervisit, int rand_currenttime, int rand_lasttimevisit,int rand_numberidvisit, int rand_locationId) { StringBuilder cookieString = new StringBuilder(); cookieString.append(rand_aid); cookieString.append(CookieData.COOKIE_SEPARATOR); cookieString.append(rand_firsttime); cookieString.append(CookieData.COOKIE_SEPARATOR); cookieString.append(rand_numbervisit); cookieString.append(CookieData.COOKIE_SEPARATOR); cookieString.append(rand_currenttime); cookieString.append(CookieData.COOKIE_SEPARATOR); cookieString.append(rand_lasttimevisit); cookieString.append(CookieData.COOKIE_SEPARATOR); cookieString.append(rand_numberidvisit); cookieString.append(CookieData.COOKIE_SEPARATOR); cookieString.append(rand_locationId); return SecurityUtil.encryptBeaconValue(cookieString.toString()); } public static void setAnomyousCookie(Cookie cookie, FullHttpResponse response) { response.headers().add(SET_COOKIE, ServerCookieEncoder.encode(cookie)); } public static Cookie getAnomyousCookie(HttpRequest request) { Cookie fospAid = null; String cookieString = request.headers().get(COOKIE); if (cookieString != null) { try { cookieString = URLDecoder.decode(cookieString, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } Set<Cookie> cookies = CookieDecoder.decode(cookieString); if (!cookies.isEmpty()) { for (Cookie cookie : cookies) { String name = cookie.getName(); // String value = cookie.getValue(); // TODO: Check validate PK_UID if (name.equals(CookieData.USER_ID)) { fospAid = cookie; addExpireTime2YearsForCookie(fospAid); fospAid.setDomain(CookieData.DEFAULT_DOMAIN); fospAid.setPath(CookieData.DEFAULT_PATH); //hasFospId = true; // case PK_UID: // hasPkUid = true; // break; } } } } return fospAid; } public static boolean validateTrueCookie(HttpRequest request) { return true; } public static boolean isValidFospAid(String fosp_aid) { if (fosp_aid.length() == 16 && fosp_aid.matches("^[0-9A-Fa-f]+$")) { return true; } else { return false; } } public static Cookie createNewHttpOnlyCookie(String name, String value, String domain, String path) { Cookie cookie = new DefaultCookie(name, value); cookie.setDomain(domain); cookie.setPath(path); cookie.setHttpOnly(true); return cookie; } public static Cookie createCookie(String name, String value, String domain, String path) { Cookie cookie = new DefaultCookie(name, value); cookie.setDomain(domain); cookie.setPath(path); return cookie; } public static String generateUserIdCookieString(HttpRequest request) { String userAgent = request.headers().get(USER_AGENT); String logDetails = request.headers().get(io.netty.handler.codec.http.HttpHeaders.Names.HOST); String result = SecurityUtil.sha1(userAgent + logDetails + System.currentTimeMillis()); return result.substring(0, 16); } // create ID for browser not support cookies and localStorage public static String generateUserIdByIp(String ipAddress, String browser, String os) { String result = SecurityUtil.sha1(ipAddress + browser + os); return result.substring(0, 16); } static void setDefaultCookieInfo(Cookie cookie) { cookie.setMaxAge(COOKIE_AGE_2_YEARS); cookie.setPath(CookieData.DEFAULT_DOMAIN); cookie.setPath(CookieData.DEFAULT_PATH); cookie.setHttpOnly(true); } public static void addExpireTime2YearsForCookie(Cookie cookie) { cookie.setMaxAge(COOKIE_AGE_2_YEARS); } public static void addExpireTimeForCookie(Cookie cookie, long maxAge) { cookie.setMaxAge(maxAge); } public static int getIntParam(String[] params, int position) { int result = LocationUtil.LOCATION_NULL; if (params.length > position) { try { result = Integer.parseInt(params[position]); } catch (Exception e) { e.printStackTrace(); } } return result; } public static String getStrParam(String[] params, int position) { String result = ""; try { result = params[position]; } catch (Exception e) { result = ""; } return result; } public static FullHttpResponse handleGetIdPath(HttpRequest request,String ipAdress, String uri) { // http://example.com/getid?callback=callback return new CookieData(request, ipAdress, uri).responseForGetId(); } public static Cookie createCookie(String name, String value, String domain, String path, long maxAge) { Cookie cookie = new DefaultCookie(name, value); cookie.setDomain(domain); cookie.setPath(path); cookie.setMaxAge(maxAge); return cookie; } public static Cookie createCookie(String name, String value, long maxAge) { Cookie cookie = new DefaultCookie(name, value); cookie.setMaxAge(maxAge); return cookie; } public static void setCookie(String name, String value, String domain, String path, long maxAge, FullHttpResponse response) { Cookie cookie = createCookie(name, value, domain, path, maxAge); response.headers().add(SET_COOKIE, ServerCookieEncoder.encode(cookie)); } }