diff options
Diffstat (limited to 'bundles/org.eclipse.wst.wsi/src/org/eclipse/wst/wsi/internal/core/util/SetCookie2Validator.java')
-rw-r--r-- | bundles/org.eclipse.wst.wsi/src/org/eclipse/wst/wsi/internal/core/util/SetCookie2Validator.java | 629 |
1 files changed, 629 insertions, 0 deletions
diff --git a/bundles/org.eclipse.wst.wsi/src/org/eclipse/wst/wsi/internal/core/util/SetCookie2Validator.java b/bundles/org.eclipse.wst.wsi/src/org/eclipse/wst/wsi/internal/core/util/SetCookie2Validator.java new file mode 100644 index 000000000..5982e3a85 --- /dev/null +++ b/bundles/org.eclipse.wst.wsi/src/org/eclipse/wst/wsi/internal/core/util/SetCookie2Validator.java @@ -0,0 +1,629 @@ +/******************************************************************************* + * Copyright (c) 2002-2005 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM - Initial API and implementation + *******************************************************************************/ +package org.eclipse.wst.wsi.internal.core.util; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Vector; + +/** + * This class checks the cookies conform to RFC2965. + * + * @author Baltak + */ +public class SetCookie2Validator +{ + + private Vector commentVect = new Vector(); + private Vector commentURLVect = new Vector(); + private Vector domainVect = new Vector(); + private Vector max_AgeVect = new Vector(); + private Vector pathVect = new Vector(); + private Vector portVect = new Vector(); + private Vector versionVect = new Vector(); + + private boolean path = false; + + /** + * Method resetFlags. + */ + private void resetPath() + { + path = false; + } + + /** + * Check if the string satisfy the "Set-Cookie2" header value. + * @param str String + * @return boolean + */ + public boolean isSetCookie2(String str) + { + + try + { + int index = 0; + int newIndex = 0; + while (true) + { + newIndex = getLastCookie(str, index); + if (index == newIndex) + return false; + // skip spaces + index = newIndex; + index = skipSpaces(str, index); + if (index == str.length()) + { + return true; + } + else + { + if (str.charAt(index) != ',') + return false; + index++; + // skip spaces + index = skipSpaces(str, index); + } + + } + } + catch (Throwable th) + { + return false; + } + + } + + /** + * Method getLastCookie. + * @param str + * @param startIndex + * @return int + */ + private int getLastCookie(String str, int startIndex) + { + + resetPath(); + + int index = startIndex; + // find token + int newIndex = BasicRules.getLastToken(str, index); + if (index == newIndex) + return startIndex; + + index = newIndex; + if (index == str.length()) + return startIndex; + + // if not '=' - error + if (str.charAt(index) != '=') + return startIndex; + + index++; + if (index == str.length()) + return startIndex; + + // get value + newIndex = getLastValue(str, index); + if (index == newIndex) + return startIndex; + + while (true) + { + index = newIndex; + if (index == str.length()) + return index; + + if (str.charAt(index) != ';') + return index; + index++; + // skip spaces + index = skipSpaces(str, index); + + if (index == str.length()) + return startIndex; + newIndex = getLastSetCookieAv(str, index); + if (index == newIndex) + return startIndex; + } + } + + /** + * Method getLastValue. + * @param str + * @param startIndex + * @return int + */ + private int getLastValue(String str, int startIndex) + { + + int index = BasicRules.getLastToken(str, startIndex); + if (index != startIndex) + return index; + index = BasicRules.getLastQuotedString(str, startIndex); + if (index != startIndex) + return index; + + return startIndex; + } + + /** + * Method getLastSetCookieAv. + * @param str + * @param startIndex + * @return int + */ + private int getLastSetCookieAv(String str, int startIndex) + { + + int index = startIndex; + int newIndex = 0; + + if (str.startsWith("Comment=", index)) + { + index += "Comment=".length(); + newIndex = getLastValue(str, index); + if (index == newIndex) + return startIndex; + // debug -> + String qqq = getValue(str, index, newIndex); + commentVect.add(qqq); + // debug <- + return newIndex; + } + else if (str.startsWith("CommentURL=", index)) + { + index += "CommentURL=".length(); + + if (str.charAt(index) != '\"') + return startIndex; + + newIndex = str.indexOf('\"', index + 1); + if (newIndex == -1) + return startIndex; + try + { + new URL(str.substring(index + 1, newIndex)); + } + catch (MalformedURLException mue) + { + return startIndex; + } + // debug -> + String qqq = getValue(str, index + 1, newIndex); + commentURLVect.add(qqq); + // debug <- + newIndex++; + return newIndex; + } + else if (str.startsWith("Discard", index)) + { + return startIndex + "Discard".length(); + } + else if (str.startsWith("Domain=", index)) + { + index += "Domain=".length(); + + newIndex = getLastValue(str, index); + if (index == newIndex) + return startIndex; + + // debug -> + String qqq = getValue(str, index, newIndex); + domainVect.add(qqq); + // debug <- + return newIndex; + } + else if (str.startsWith("Max-Age=", index)) + { + index += "Max-Age=".length(); + + newIndex = getLastValue(str, index); + if (index == newIndex) + return startIndex; + + String qqq = getValue(str, index, newIndex); + try + { + Integer.parseInt(qqq); + } + catch (NumberFormatException nfe) + { + return startIndex; + } + // debug -> + max_AgeVect.add(qqq); + // debug <- + return newIndex; + } + else if (str.startsWith("Path=", index)) + { + index += "Path=".length(); + + newIndex = getLastValue(str, index); + if (index == newIndex) + return startIndex; + + String qqq = getValue(str, index, newIndex); + if (path == false) + pathVect.add(qqq); + path = true; + return newIndex; + } + else if (str.startsWith("Port", index)) + { + index += "Port".length(); + if (str.charAt(index) != '=') + return index; + + index++; + if (str.charAt(index) != '\"') + return startIndex; + + index++; + newIndex = getLastPortList(str, index); + if (index == newIndex) + return startIndex; + + // debug -> + String qqq = getValue(str, index, newIndex); + portVect.add(qqq); + // debug <- + + index = newIndex; + if (str.charAt(index) != '\"') + return startIndex; + index++; + return index; + + } + else if (str.startsWith("Secure", index)) + { + return startIndex + "Secure".length(); + } + else if (str.startsWith("Version=", index)) + { + index += "Version=".length(); + + newIndex = getLastDIGIT(str, index); + if (index == newIndex) + return startIndex; + + // debug -> + String qqq = getValue(str, index, newIndex); + versionVect.add(qqq); + // debug <- + return newIndex; + } + else + { + return startIndex; + } + } + + /** + * Method getLastPortList. + * @param str + * @param startIndex + * @return int + */ + private int getLastPortList(String str, int startIndex) + { + int index = startIndex; + int newIndex = 0; + + while (true) + { + newIndex = getLastDIGIT(str, index); + if (index == newIndex) + return startIndex; + + index = newIndex; + if (str.charAt(index) != ',') + return index; + index++; + } + } + + /** + * Method getLastDIGIT. + * @param str + * @param startIndex + * @return int + */ + private int getLastDIGIT(String str, int startIndex) + { + int index = startIndex; + for (; index < str.length(); index++) + { + if (!BasicRules.isDIGIT(str.charAt(index))) + return index; + } + return index; + } + + /** + * Check if the string satisfy the "Cookie" header value. + * @param str String + * @return boolean + */ + public boolean isCookie(String str) + { + int index = 0; + int newIndex = 0; + + try + { + newIndex = getLastVersion(str, index); + if (index == newIndex) + return false; + + index = newIndex; + index = skipSpaces(str, index); + if (str.charAt(index) != ';' && str.charAt(index) != ',') + return false; + + index++; + index = skipSpaces(str, index); + + while (true) + { + newIndex = getLastCookiesValue(str, index); + if (index == newIndex) + return false; + + index = newIndex; + if (index == str.length()) + return true; + + if (str.charAt(index) != ';' && str.charAt(index) != ',') + return false; + index++; + index = skipSpaces(str, index); + } + } + catch (Throwable th) + { + return false; + } + } + + /** + * Method getLastVersion. + * @param str + * @param startIndex + * @return int + */ + private int getLastVersion(String str, int startIndex) + { + int index = startIndex; + int newIndex = 0; + if (!str.startsWith("$Version=")) + return startIndex; + index += "$Version=".length(); + newIndex = getLastValue(str, index); + if (index == newIndex) + return startIndex; + + return newIndex; + } + + /** + * Method getLastCookiesValue. + * @param str + * @param startIndex + * @return int + */ + private int getLastCookiesValue(String str, int startIndex) + { + int index = startIndex; + int newIndex = 0; + int oldIndex = 0; + + // find token + newIndex = BasicRules.getLastToken(str, index); + if (index == newIndex) + return startIndex; + + index = newIndex; + if (index == str.length()) + return startIndex; + + // if not '=' - error + if (str.charAt(index) != '=') + return startIndex; + + index++; + if (index == str.length()) + return startIndex; + + // get value + newIndex = getLastValue(str, index); + if (index == newIndex) + return startIndex; + + index = newIndex; + if (index == str.length()) + return index; + + if (str.charAt(index) != ';') + return index; + + // process [";" path] [";" domain] [";" port] + oldIndex = index; + index++; + if (index == str.length()) + return startIndex; + + index = skipSpaces(str, index); + if (index == str.length()) + return startIndex; + + // process path + newIndex = getLastPath(str, index); + if (index != newIndex) + { + index = newIndex; + if (index == str.length()) + return index; + + if (str.charAt(index) != ';') + return index; + + oldIndex = index; + index++; + if (index == str.length()) + return startIndex; + + index = skipSpaces(str, index); + if (index == str.length()) + return startIndex; + + } + + // process domain + newIndex = getLastDomain(str, index); + if (index != newIndex) + { + index = newIndex; + if (index == str.length()) + return index; + + if (str.charAt(index) != ';') + return index; + + oldIndex = index; + index++; + if (index == str.length()) + return startIndex; + + index = skipSpaces(str, index); + if (index == str.length()) + return startIndex; + + } + + // process port + newIndex = getLastPort(str, index); + if (index != newIndex) + return newIndex; + else + return oldIndex; + } + + /** + * Method getLastPath. + * @param str + * @param startIndex + * @return int + */ + private int getLastPath(String str, int startIndex) + { + int index = startIndex; + int newIndex = 0; + + if (!str.startsWith("$Path=", index)) + return startIndex; + index += "$Path=".length(); + newIndex = getLastValue(str, index); + if (index == newIndex) + return startIndex; + + return newIndex; + } + + /** + * Method getLastDomain. + * @param str + * @param startIndex + * @return int + */ + private int getLastDomain(String str, int startIndex) + { + int index = startIndex; + int newIndex = 0; + + if (!str.startsWith("$Domain=", index)) + return startIndex; + index += "$Domain=".length(); + newIndex = getLastValue(str, index); + if (index == newIndex) + return startIndex; + + return newIndex; + } + + /** + * Method getLastPort. + * @param str + * @param startIndex + * @return int + */ + private int getLastPort(String str, int startIndex) + { + int index = startIndex; + int newIndex = 0; + + if (!str.startsWith("$Port", index)) + return startIndex; + + index += "$Port".length(); + if (str.charAt(index) != '=') + return index; + + index++; + if (str.charAt(index) != '\"') + return startIndex; + + index++; + newIndex = getLastPortList(str, index); + if (index == newIndex) + return startIndex; + + index = newIndex; + if (str.charAt(index) != '\"') + return startIndex; + index++; + return index; + } + + /** + * Method skipSpaces. + * @param str + * @param index + * @return int + */ + private int skipSpaces(String str, int index) + { + for (; index < str.length(); index++) + if (!BasicRules.isSP(str.charAt(index))) + break; + return index; + } + + /** + * Method getValue. + * @param str + * @param beg + * @param end + * @return String + */ + private String getValue(String str, int beg, int end) + { + String qqq = null; + if (str.charAt(beg) == '\"') + qqq = str.substring(beg + 1, end - 1); + else + qqq = str.substring(beg, end); + return qqq; + } + +} |