You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by fm...@apache.org on 2012/07/04 17:15:49 UTC

svn commit: r1357300 - in /chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/cookies: CmisCookieManager.java CmisCookieStoreImpl.java CmisHttpCookie.java

Author: fmui
Date: Wed Jul  4 15:15:49 2012
New Revision: 1357300

URL: http://svn.apache.org/viewvc?rev=1357300&view=rev
Log:
Client: support for RFC 6265 cookies

Modified:
    chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/cookies/CmisCookieManager.java
    chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/cookies/CmisCookieStoreImpl.java
    chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/cookies/CmisHttpCookie.java

Modified: chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/cookies/CmisCookieManager.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/cookies/CmisCookieManager.java?rev=1357300&r1=1357299&r2=1357300&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/cookies/CmisCookieManager.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/cookies/CmisCookieManager.java Wed Jul  4 15:15:49 2012
@@ -40,7 +40,8 @@ import org.slf4j.LoggerFactory;
 /**
  * Cookie Manager.
  * 
- * This implementation conforms to RFC 2965, section 3.3.
+ * This implementation conforms to RFC 2965, section 3.3 with some RFC 6265
+ * extensions.
  */
 public class CmisCookieManager implements Serializable {
     private static final long serialVersionUID = 1L;

Modified: chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/cookies/CmisCookieStoreImpl.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/cookies/CmisCookieStoreImpl.java?rev=1357300&r1=1357299&r2=1357300&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/cookies/CmisCookieStoreImpl.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/cookies/CmisCookieStoreImpl.java Wed Jul  4 15:15:49 2012
@@ -31,13 +31,17 @@ import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.regex.Pattern;
 
 /**
  * Provides an in-memory cookie store.
  */
-class CmisCookieStoreImpl implements Serializable {
+public class CmisCookieStoreImpl implements Serializable {
     private static final long serialVersionUID = 1L;
 
+    private static final String IP_ADDRESS_PATTERN_STR = "^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])$";
+    private static final Pattern IP_ADDRESS_PATTERN = Pattern.compile(IP_ADDRESS_PATTERN_STR);
+
     private final Map<URI, ArrayList<CmisHttpCookie>> storeMap;
 
     public CmisCookieStoreImpl() {
@@ -102,20 +106,42 @@ class CmisCookieStoreImpl implements Ser
                     secure = scheme.toLowerCase().startsWith("https");
                 }
 
+                String newHost = uri.getHost().toLowerCase();
+
                 List<CmisHttpCookie> listCookie = storeMap.get(u);
                 Iterator<CmisHttpCookie> iter = listCookie.iterator();
                 while (iter.hasNext()) {
                     CmisHttpCookie cookie = iter.next();
-                    if (CmisHttpCookie.domainMatches(cookie.getDomain(), uri.getHost())) {
-                        if (cookie.hasExpired()) {
-                            iter.remove();
-                            if (listCookie.isEmpty()) {
-                                storeMap.remove(u);
-                            }
-                        } else if (!(cookie.hasExpired() || cookies.contains(cookie))) {
-                            if (!cookie.getSecure() || secure) {
+
+                    if (cookie.hasExpired()) {
+                        iter.remove();
+                        if (listCookie.isEmpty()) {
+                            storeMap.remove(u);
+                        }
+                    } else if (!cookies.contains(cookie) && (!cookie.getSecure() || secure)
+                            && cookie.getDomain() != null) {
+                        String newDomain = cookie.getDomain().toLowerCase();
+
+                        if (isIPAddress(newHost)) {
+                            if (newHost.equals(newDomain)) {
                                 cookies.add(cookie);
                             }
+                        } else {
+                            if (cookie.getVersion() == 0) {
+                                // Netscape, RFC 2109, RFC 6265
+                                if (newHost.endsWith(newDomain)) {
+                                    if (newHost.length() == newDomain.length()) {
+                                        cookies.add(cookie);
+                                    } else if (newDomain.startsWith(".")) {
+                                        cookies.add(cookie);
+                                    }
+                                }
+                            } else if (cookie.getVersion() == 1) {
+                                // RFC 2965
+                                if (CmisHttpCookie.domainMatches(cookie.getDomain(), newHost)) {
+                                    cookies.add(cookie);
+                                }
+                            }
                         }
                     }
                 }
@@ -125,6 +151,20 @@ class CmisCookieStoreImpl implements Ser
         return cookies;
     }
 
+    private boolean isIPAddress(String s) {
+        if (s.startsWith("[")) {
+            // IPv6
+            return true;
+        }
+
+        if (IP_ADDRESS_PATTERN.matcher(s).matches()) {
+            // IPv4
+            return true;
+        }
+
+        return false;
+    }
+
     private void cleanCookieList(List<CmisHttpCookie> cookies) {
         Iterator<CmisHttpCookie> iter = cookies.iterator();
         while (iter.hasNext()) {

Modified: chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/cookies/CmisHttpCookie.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/cookies/CmisHttpCookie.java?rev=1357300&r1=1357299&r2=1357300&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/cookies/CmisHttpCookie.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/cookies/CmisHttpCookie.java Wed Jul  4 15:15:49 2012
@@ -34,8 +34,9 @@ import java.util.regex.Pattern;
 /**
  * This class represents a http cookie, which indicates the status information
  * between the client agent side and the server side. According to RFC, there
- * are 3 http cookie specifications. This class is compatible with all the three
- * forms. HttpCookie class can accept all these 3 forms of syntax.
+ * are 4 http cookie specifications. This class is compatible with the original
+ * Netscape specification, RFC 2109, RFC 2965 and party compatible with RFC
+ * 6265. HttpCookie class can accept all syntax forms.
  */
 public final class CmisHttpCookie implements Cloneable, Serializable {
 
@@ -94,6 +95,7 @@ public final class CmisHttpCookie implem
         }
         String newDomain = domain.toLowerCase();
         String newHost = host.toLowerCase();
+
         return newDomain.equals(newHost)
                 || (isValidDomain(newDomain) && effDomainMatches(newDomain, newHost) && isValidHost(newDomain, newHost));
     }