001 package com.khubla.pragmatach.framework.api;
002
003 import java.util.Hashtable;
004
005 import javax.servlet.http.Cookie;
006 import javax.servlet.http.HttpServletRequest;
007 import javax.servlet.http.HttpServletResponse;
008
009 import com.khubla.pragmatach.framework.application.Application;
010 import com.khubla.pragmatach.framework.crypto.AES;
011
012 /**
013 * @author tome
014 */
015 public class Cookies {
016 /**
017 * for long term cookies
018 */
019 private static final int SECONDS_PER_YEAR = 60 * 60 * 24 * 365;
020 /**
021 * HttpServletRequest
022 */
023 private final HttpServletRequest httpServletRequest;
024 /**
025 * HttpServletResponse
026 */
027 private final HttpServletResponse httpServletResponse;
028 /**
029 * config key
030 */
031 private final static String COOKIE_CONFIG_KEY = "pragmatach.cookie.cryptokey";
032
033 /**
034 * ctor
035 */
036 public Cookies(HttpServletRequest httpServletRequest,
037 HttpServletResponse httpServletResponse) {
038 this.httpServletRequest = httpServletRequest;
039 this.httpServletResponse = httpServletResponse;
040 }
041
042 /**
043 * clear all cookies
044 */
045 public void clearAll() throws PragmatachException {
046 final Cookie[] cookies = httpServletRequest.getCookies();
047 if ((null != cookies) && (cookies.length > 0)) {
048 for (final Cookie cookie : cookies) {
049 removeCookie(cookie.getName());
050 }
051 }
052 }
053
054 /**
055 * decrypt cookie
056 */
057 private String decryptCookie(String cookie) throws Exception {
058 final String key = getCryptoKey();
059 if (null != key) {
060 return AES.decrypt(cookie, key);
061 } else {
062 return cookie;
063 }
064 }
065
066 /**
067 * encrypt cookie
068 */
069 private String encryptCookie(String cookie) throws Exception {
070 final String key = getCryptoKey();
071 if (null != key) {
072 return AES.encrypt(cookie, key);
073 } else {
074 return cookie;
075 }
076 }
077
078 /**
079 * get a cookie by name
080 */
081 public String getCookie(String name) throws PragmatachException {
082 try {
083 if ((null != name) && (name.length() > 0)) {
084 final Hashtable<String, String> cookies = getCookies();
085 if (null != cookies) {
086 return cookies.get(name);
087 }
088 }
089 return null;
090 } catch (final Exception e) {
091 throw new PragmatachException("Exception in getCookie", e);
092 }
093 }
094
095 /**
096 * get all the cookies
097 */
098 public Hashtable<String, String> getCookies() throws PragmatachException {
099 try {
100 final Cookie[] cookies = httpServletRequest.getCookies();
101 if ((null != cookies) && (cookies.length > 0)) {
102 final Hashtable<String, String> ret = new Hashtable<String, String>();
103 for (final Cookie cookie : cookies) {
104 ret.put(cookie.getName(), cookie.getValue());
105 }
106 return ret;
107 }
108 return null;
109 } catch (final Exception e) {
110 throw new PragmatachException("Exception in getCookies", e);
111 }
112 }
113
114 private String getCryptoKey() throws PragmatachException {
115 return Application.getConfiguration().getParameter(COOKIE_CONFIG_KEY);
116 }
117
118 /**
119 * get a encrypter cookie by name
120 */
121 public String getEncryptedCookie(String name) throws PragmatachException {
122 try {
123 if ((null != name) && (name.length() > 0)) {
124 final Hashtable<String, String> cookies = getCookies();
125 if (null != cookies) {
126 final String k = cookies.get(name);
127 if (null != k) {
128 return decryptCookie(k);
129 }
130 }
131 }
132 return null;
133 } catch (final Exception e) {
134 throw new PragmatachException("Exception in getCookie", e);
135 }
136 }
137
138 /**
139 * remove a cookie
140 */
141 public void removeCookie(String name) throws PragmatachException {
142 final Cookie[] cookies = httpServletRequest.getCookies();
143 if ((null != cookies) && (cookies.length > 0)) {
144 for (final Cookie cookie : cookies) {
145 if (cookie.getName().compareTo(name) == 0) {
146 cookie.setMaxAge(0);
147 cookie.setPath("/");
148 httpServletResponse.addCookie(cookie);
149 break;
150 }
151 }
152 }
153 }
154
155 /**
156 * set a cookie
157 */
158 public void setCookie(String name, String value) throws PragmatachException {
159 try {
160 final Cookie cookie = new Cookie(name, value);
161 cookie.setMaxAge(SECONDS_PER_YEAR);
162 cookie.setPath("/");
163 httpServletResponse.addCookie(cookie);
164 } catch (final Exception e) {
165 throw new PragmatachException("Exception in setCookie", e);
166 }
167 }
168
169 /**
170 * set a cookie
171 */
172 public void setEncryptedCookie(String name, String value)
173 throws PragmatachException {
174 try {
175 final Cookie cookie = new Cookie(name, encryptCookie(value));
176 cookie.setMaxAge(SECONDS_PER_YEAR);
177 cookie.setPath("/");
178 httpServletResponse.addCookie(cookie);
179 } catch (final Exception e) {
180 throw new PragmatachException("Exception in setCookie", e);
181 }
182 }
183 }