package com.wesabe.servlet.normalizers; import javax.servlet.http.Cookie; import com.wesabe.servlet.normalizers.util.CharacterSet; /** * Normalizes HTTP cookies. * * @author coda */ public class CookieNormalizer implements Normalizer<Cookie> { private static class CookieValueNormalizer implements Normalizer<String> { private static final CharacterSet VALID_CHARACTERS = CharacterSet.of("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-/+=_ "); @Override public String normalize(String input) throws ValidationException { if (VALID_CHARACTERS.composes(input)) { return input; } throw new ValidationException(input, "not a valid cookie value"); } } private static class CookieNameNormalizer implements Normalizer<String> { private static final CharacterSet VALID_CHARACTERS = CharacterSet.of("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-"); @Override public String normalize(String name) throws ValidationException { if (VALID_CHARACTERS.composes(name)) { return name; } throw new ValidationException(name, "not a valid cookie name"); } } public static class CookiePathNormalizer implements Normalizer<String> { private static final CharacterSet VALID_CHARACTERS = CharacterSet.of("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789()-=*.?;,+/:&_ "); @Override public String normalize(String value) throws ValidationException { if (VALID_CHARACTERS.composes(value)) { return value; } throw new ValidationException(value, "not a valid cookie path"); } } private static final CookieNameNormalizer NAME_NORMALIZER = new CookieNameNormalizer(); private static final CookieValueNormalizer VALUE_NORMALIZER = new CookieValueNormalizer(); private static final HostnameNormalizer DOMAIN_NORMALIZER = new HostnameNormalizer(); private static final CookiePathNormalizer PATH_NORMALIZER = new CookiePathNormalizer(); @Override public Cookie normalize(Cookie cookie) throws ValidationException { final Cookie safeCookie = new Cookie( NAME_NORMALIZER.normalize(cookie.getName()), VALUE_NORMALIZER.normalize(cookie.getValue()) ); // safe attributes safeCookie.setMaxAge(cookie.getMaxAge()); safeCookie.setSecure(cookie.getSecure()); safeCookie.setVersion(cookie.getVersion()); // unsafe attributes if (cookie.getDomain() != null) { safeCookie.setDomain(DOMAIN_NORMALIZER.normalize(cookie.getDomain())); } if (cookie.getPath() != null) { safeCookie.setPath(PATH_NORMALIZER.normalize(cookie.getPath())); } // REVIEW coda@wesabe.com -- Apr 8, 2009: Should we be dropping cookie comments? return safeCookie; } }