geronimo-scm mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jgenen...@apache.org
Subject svn commit: r607542 [2/6] - in /geronimo/sandbox/async-http-client-mina2: ./ src/ src/main/ src/main/java/ src/main/java/org/ src/main/java/org/apache/ src/main/java/org/apache/ahc/ src/main/java/org/apache/ahc/auth/ src/main/java/org/apache/ahc/codec/...
Date Sun, 30 Dec 2007 11:37:00 GMT
Added: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/BasicScheme.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/BasicScheme.java?rev=607542&view=auto
==============================================================================
--- geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/BasicScheme.java (added)
+++ geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/BasicScheme.java Sun Dec 30 03:36:47 2007
@@ -0,0 +1,156 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.ahc.auth;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.ahc.util.EncodingUtil;
+import org.apache.ahc.codec.HttpRequestMessage;
+
+public class BasicScheme extends RFC2617Scheme{
+        /** Log object for this class. */
+    private static final Logger LOG = LoggerFactory.getLogger(BasicScheme.class);
+
+    /** Whether the basic authentication process is complete */
+    private boolean complete;
+
+    /**
+     * Default constructor for the basic authetication scheme.
+     *
+     * @since 3.0
+     */
+    public BasicScheme() {
+        super();
+        this.complete = false;
+    }
+
+    /**
+     * Returns textual designation of the basic authentication scheme.
+     *
+     * @return <code>basic</code>
+     */
+    public String getSchemeName() {
+        return "basic";
+    }
+
+    /**
+     * Processes the Basic challenge.
+     *
+     * @param challenge the challenge string
+     *
+     * @throws MalformedChallengeException is thrown if the authentication challenge
+     * is malformed
+     *
+     * @since 3.0
+     */
+    public void processChallenge(String challenge)
+        throws MalformedChallengeException
+    {
+        super.processChallenge(challenge);
+        this.complete = true;
+    }
+
+    /**
+     * Tests if the Basic authentication process has been completed.
+     *
+     * @return <tt>true</tt> if Basic authorization has been processed,
+     *   <tt>false</tt> otherwise.
+     *
+     * @since 3.0
+     */
+    public boolean isComplete() {
+        return this.complete;
+    }
+
+    /**
+     * Returns <tt>false</tt>. Basic authentication scheme is request based.
+     *
+     * @return <tt>false</tt>.
+     *
+     * @since 3.0
+     */
+    public boolean isConnectionBased() {
+        return false;
+    }
+
+    /**
+     * Produces basic authorization string for the given set of {@link Credentials}.
+     *
+     * @param credentials The set of credentials to be used for athentication
+     * @param request The request being authenticated
+     * @throws InvalidCredentialsException if authentication credentials
+     *         are not valid or not applicable for this authentication scheme
+     * @throws AuthenticationException if authorization string cannot
+     *   be generated due to an authentication failure
+     *
+     * @return a basic authorization string
+     *
+     * @since 3.0
+     */
+    public String authenticate(Credentials credentials, HttpRequestMessage request) throws AuthenticationException {
+
+        LOG.trace("enter BasicScheme.authenticate(Credentials, HttpMethod)");
+
+        if (request == null) {
+            throw new IllegalArgumentException("Request may not be null");
+        }
+        UsernamePasswordCredentials usernamepassword = null;
+        try {
+            usernamepassword = (UsernamePasswordCredentials) credentials;
+        } catch (ClassCastException e) {
+            throw new InvalidCredentialsException(
+                    "Credentials cannot be used for basic authentication: "
+                    + credentials.getClass().getName());
+        }
+        return BasicScheme.authenticate( usernamepassword, request.getCredentialCharset());
+    }
+
+
+    /**
+     * Returns a basic <tt>Authorization</tt> header value for the given
+     * {@link UsernamePasswordCredentials} and charset.
+     *
+     * @param credentials The credentials to encode.
+     * @param charset The charset to use for encoding the credentials
+     *
+     * @return a basic authorization string
+     *
+     * @since 3.0
+     */
+    public static String authenticate(UsernamePasswordCredentials credentials, String charset) {
+
+        LOG.trace("enter BasicScheme.authenticate(UsernamePasswordCredentials, String)");
+
+        if (credentials == null) {
+            throw new IllegalArgumentException("Credentials may not be null");
+        }
+        if (charset == null || charset.length() == 0) {
+            throw new IllegalArgumentException("charset may not be null or empty");
+        }
+        StringBuffer buffer = new StringBuffer();
+        buffer.append(credentials.getUserName());
+        buffer.append(":");
+        buffer.append(credentials.getPassword());
+
+        return "Basic " + EncodingUtil.getAsciiString(
+                Base64.encodeBase64(EncodingUtil.getBytes(buffer.toString(), charset)));
+    }
+}

Propchange: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/BasicScheme.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/BasicScheme.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/BasicScheme.java
------------------------------------------------------------------------------
    svn:mime-type = text/x-java

Added: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/Credentials.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/Credentials.java?rev=607542&view=auto
==============================================================================
--- geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/Credentials.java (added)
+++ geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/Credentials.java Sun Dec 30 03:36:47 2007
@@ -0,0 +1,23 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.ahc.auth;
+
+public interface Credentials {
+}

Propchange: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/Credentials.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/Credentials.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/Credentials.java
------------------------------------------------------------------------------
    svn:mime-type = text/x-java

Added: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/DigestScheme.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/DigestScheme.java?rev=607542&view=auto
==============================================================================
--- geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/DigestScheme.java (added)
+++ geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/DigestScheme.java Sun Dec 30 03:36:47 2007
@@ -0,0 +1,451 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.ahc.auth;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.StringTokenizer;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.ahc.util.EncodingUtil;
+import org.apache.ahc.util.AsyncHttpClientException;
+import org.apache.ahc.util.NameValuePair;
+import org.apache.ahc.util.ParameterFormatter;
+import org.apache.ahc.codec.HttpRequestMessage;
+import org.slf4j.LoggerFactory;
+import org.slf4j.Logger;
+
+public class DigestScheme extends RFC2617Scheme {
+
+    /** Log object for this class. */
+    private static final Logger LOG = LoggerFactory.getLogger(DigestScheme.class);
+
+    /**
+     * Hexa values used when creating 32 character long digest in HTTP DigestScheme
+     * in case of authentication.
+     *
+     * @see #encode(byte[])
+     */
+    private static final char[] HEXADECIMAL = {
+        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd',
+        'e', 'f'
+    };
+
+    /** Whether the digest authentication process is complete */
+    private boolean complete;
+
+    //TODO: supply a real nonce-count, currently a server will interprete a repeated request as a replay
+    private static final String NC = "00000001"; //nonce-count is always 1
+    private static final int QOP_MISSING = 0;
+    private static final int QOP_AUTH_INT = 1;
+    private static final int QOP_AUTH = 2;
+
+    private int qopVariant = QOP_MISSING;
+    private String cnonce;
+
+    private final ParameterFormatter formatter;
+    /**
+     * Default constructor for the digest authetication scheme.
+     *
+     * @since 3.0
+     */
+    public DigestScheme() {
+        super();
+        this.complete = false;
+        this.formatter = new ParameterFormatter();
+    }
+
+    /**
+     * Processes the Digest challenge.
+     *
+     * @param challenge the challenge string
+     *
+     * @throws MalformedChallengeException is thrown if the authentication challenge
+     * is malformed
+     *
+     * @since 3.0
+     */
+    public void processChallenge(final String challenge)
+      throws MalformedChallengeException {
+        super.processChallenge(challenge);
+
+        if (getParameter("realm") == null) {
+            throw new MalformedChallengeException("missing realm in challange");
+        }
+        if (getParameter("nonce") == null) {
+            throw new MalformedChallengeException("missing nonce in challange");
+        }
+
+        boolean unsupportedQop = false;
+        // qop parsing
+        String qop = getParameter("qop");
+        if (qop != null) {
+            StringTokenizer tok = new StringTokenizer(qop,",");
+            while (tok.hasMoreTokens()) {
+                String variant = tok.nextToken().trim();
+                if (variant.equals("auth")) {
+                    qopVariant = QOP_AUTH;
+                    break; //that's our favourite, because auth-int is unsupported
+                } else if (variant.equals("auth-int")) {
+                    qopVariant = QOP_AUTH_INT;
+                } else {
+                    unsupportedQop = true;
+                    LOG.warn("Unsupported qop detected: "+ variant);
+                }
+            }
+        }
+
+        if (unsupportedQop && (qopVariant == QOP_MISSING)) {
+            throw new MalformedChallengeException("None of the qop methods is supported");
+        }
+
+        cnonce = createCnonce();
+        this.complete = true;
+    }
+
+    /**
+     * Tests if the Digest authentication process has been completed.
+     *
+     * @return <tt>true</tt> if Digest authorization has been processed,
+     *   <tt>false</tt> otherwise.
+     *
+     * @since 3.0
+     */
+    public boolean isComplete() {
+        String s = getParameter("stale");
+        if ("true".equalsIgnoreCase(s)) {
+            return false;
+        } else {
+            return this.complete;
+        }
+    }
+
+    /**
+     * Returns textual designation of the digest authentication scheme.
+     *
+     * @return <code>digest</code>
+     */
+    public String getSchemeName() {
+        return "digest";
+    }
+
+    /**
+     * Returns <tt>false</tt>. Digest authentication scheme is request based.
+     *
+     * @return <tt>false</tt>.
+     *
+     * @since 3.0
+     */
+    public boolean isConnectionBased() {
+        return false;
+    }
+
+    /**
+     * Produces a digest authorization string for the given set of
+     * {@link Credentials}, method name and URI.
+     *
+     * @param credentials A set of credentials to be used for athentication
+     * @param request The request being authenticated
+     *
+     * @throws InvalidCredentialsException if authentication credentials
+     *         are not valid or not applicable for this authentication scheme
+     * @throws AuthenticationException if authorization string cannot
+     *   be generated due to an authentication failure
+     *
+     * @return a digest authorization string
+     *
+     */
+    public String authenticate(Credentials credentials, HttpRequestMessage request)
+    throws AuthenticationException {
+
+        LOG.trace("enter DigestScheme.authenticate(Credentials, HttpMethod)");
+
+        UsernamePasswordCredentials usernamepassword = null;
+        try {
+            usernamepassword = (UsernamePasswordCredentials) credentials;
+        } catch (ClassCastException e) {
+            throw new InvalidCredentialsException(
+                    "Credentials cannot be used for digest authentication: "
+                    + credentials.getClass().getName());
+        }
+        getParameters().put("methodname", request.getRequestMethod());
+        StringBuffer buffer = new StringBuffer(request.getPath());
+        String query = request.getUrl().getQuery();
+        if (query != null) {
+            if (query.indexOf("?") != 0) {
+                buffer.append("?");
+            }
+            buffer.append(request.getQuery());
+        }
+        getParameters().put("uri", buffer.toString());
+        String charset = getParameter("charset");
+        if (charset == null) {
+            getParameters().put("charset", request.getCredentialCharset());
+        }
+        String digest = createDigest(
+            usernamepassword.getUserName(),
+            usernamepassword.getPassword());
+        return "Digest " + createDigestHeader(usernamepassword.getUserName(),
+                digest);
+    }
+
+    /**
+     * Creates an MD5 response digest.
+     *
+     * @param uname Username
+     * @param pwd Password
+     *
+     * @return The created digest as string. This will be the response tag's
+     *         value in the Authentication HTTP header.
+     * @throws AuthenticationException when MD5 is an unsupported algorithm
+     */
+    private String createDigest(final String uname, final String pwd) throws AuthenticationException {
+
+        LOG.trace("enter DigestScheme.createDigest(String, String, Map)");
+
+        final String digAlg = "MD5";
+
+        // Collecting required tokens
+        String uri = getParameter("uri");
+        String realm = getParameter("realm");
+        String nonce = getParameter("nonce");
+        String qop = getParameter("qop");
+        String method = getParameter("methodname");
+        String algorithm = getParameter("algorithm");
+        // If an algorithm is not specified, default to MD5.
+        if (algorithm == null) {
+            algorithm = "MD5";
+        }
+        // If an charset is not specified, default to ISO-8859-1.
+        String charset = getParameter("charset");
+        if (charset == null) {
+            charset = "ISO-8859-1";
+        }
+
+        if (qopVariant == QOP_AUTH_INT) {
+            LOG.warn("qop=auth-int is not supported");
+            throw new AuthenticationException(
+                "Unsupported qop in HTTP Digest authentication");
+        }
+
+        MessageDigest md5Helper;
+
+        try {
+            md5Helper = MessageDigest.getInstance(digAlg);
+        } catch (Exception e) {
+            throw new AuthenticationException(
+              "Unsupported algorithm in HTTP Digest authentication: "
+               + digAlg);
+        }
+
+        // 3.2.2.2: Calculating digest
+        StringBuffer tmp = new StringBuffer(uname.length() + realm.length() + pwd.length() + 2);
+        tmp.append(uname);
+        tmp.append(':');
+        tmp.append(realm);
+        tmp.append(':');
+        tmp.append(pwd);
+        // unq(username-value) ":" unq(realm-value) ":" passwd
+        String a1 = tmp.toString();
+        //a1 is suitable for MD5 algorithm
+        if(algorithm.equals("MD5-sess")) {
+            // H( unq(username-value) ":" unq(realm-value) ":" passwd )
+            //      ":" unq(nonce-value)
+            //      ":" unq(cnonce-value)
+
+            String tmp2=encode(md5Helper.digest(EncodingUtil.getBytes(a1, charset)));
+            StringBuffer tmp3 = new StringBuffer(tmp2.length() + nonce.length() + cnonce.length() + 2);
+            tmp3.append(tmp2);
+            tmp3.append(':');
+            tmp3.append(nonce);
+            tmp3.append(':');
+            tmp3.append(cnonce);
+            a1 = tmp3.toString();
+        } else if(!algorithm.equals("MD5")) {
+            LOG.warn("Unhandled algorithm " + algorithm + " requested");
+        }
+        String md5a1 = encode(md5Helper.digest(EncodingUtil.getBytes(a1, charset)));
+
+        String a2 = null;
+        if (qopVariant == QOP_AUTH_INT) {
+            LOG.error("Unhandled qop auth-int");
+            //we do not have access to the entity-body or its hash
+            //TODO: add Method ":" digest-uri-value ":" H(entity-body)
+        } else {
+            a2 = method + ":" + uri;
+        }
+        String md5a2 = encode(md5Helper.digest(EncodingUtil.getAsciiBytes(a2)));
+
+        // 3.2.2.1
+        String serverDigestValue;
+        if (qopVariant == QOP_MISSING) {
+            LOG.debug("Using null qop method");
+            StringBuffer tmp2 = new StringBuffer(md5a1.length() + nonce.length() + md5a2.length());
+            tmp2.append(md5a1);
+            tmp2.append(':');
+            tmp2.append(nonce);
+            tmp2.append(':');
+            tmp2.append(md5a2);
+            serverDigestValue = tmp2.toString();
+        } else {
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("Using qop method " + qop);
+            }
+            String qopOption = getQopVariantString();
+            StringBuffer tmp2 = new StringBuffer(md5a1.length() + nonce.length()
+                + NC.length() + cnonce.length() + qopOption.length() + md5a2.length() + 5);
+            tmp2.append(md5a1);
+            tmp2.append(':');
+            tmp2.append(nonce);
+            tmp2.append(':');
+            tmp2.append(NC);
+            tmp2.append(':');
+            tmp2.append(cnonce);
+            tmp2.append(':');
+            tmp2.append(qopOption);
+            tmp2.append(':');
+            tmp2.append(md5a2);
+            serverDigestValue = tmp2.toString();
+        }
+
+        String serverDigest =
+            encode(md5Helper.digest(EncodingUtil.getAsciiBytes(serverDigestValue)));
+
+        return serverDigest;
+    }
+
+    /**
+     * Creates digest-response header as defined in RFC2617.
+     *
+     * @param uname Username
+     * @param digest The response tag's value as String.
+     *
+     * @return The digest-response as String.
+     */
+    private String createDigestHeader(final String uname, final String digest)
+        throws AuthenticationException {
+
+        LOG.trace("enter DigestScheme.createDigestHeader(String, Map, "
+            + "String)");
+
+        String uri = getParameter("uri");
+        String realm = getParameter("realm");
+        String nonce = getParameter("nonce");
+        String opaque = getParameter("opaque");
+        String response = digest;
+        String algorithm = getParameter("algorithm");
+
+        List params = new ArrayList(20);
+        params.add(new NameValuePair("username", uname));
+        params.add(new NameValuePair("realm", realm));
+        params.add(new NameValuePair("nonce", nonce));
+        params.add(new NameValuePair("uri", uri));
+        params.add(new NameValuePair("response", response));
+
+        if (qopVariant != QOP_MISSING) {
+            params.add(new NameValuePair("qop", getQopVariantString()));
+            params.add(new NameValuePair("nc", NC));
+            params.add(new NameValuePair("cnonce", this.cnonce));
+        }
+        if (algorithm != null) {
+            params.add(new NameValuePair("algorithm", algorithm));
+        }
+        if (opaque != null) {
+            params.add(new NameValuePair("opaque", opaque));
+        }
+
+        StringBuffer buffer = new StringBuffer();
+        for (int i = 0; i < params.size(); i++) {
+            NameValuePair param = (NameValuePair) params.get(i);
+            if (i > 0) {
+                buffer.append(", ");
+            }
+            boolean noQuotes = "nc".equals(param.getName()) ||
+                               "qop".equals(param.getName());
+            this.formatter.setAlwaysUseQuotes(!noQuotes);
+            this.formatter.format(buffer, param);
+        }
+        return buffer.toString();
+    }
+
+    private String getQopVariantString() {
+        String qopOption;
+        if (qopVariant == QOP_AUTH_INT) {
+            qopOption = "auth-int";
+        } else {
+            qopOption = "auth";
+        }
+        return qopOption;
+    }
+
+    /**
+     * Encodes the 128 bit (16 bytes) MD5 digest into a 32 characters long
+     * <CODE>String</CODE> according to RFC 2617.
+     *
+     * @param binaryData array containing the digest
+     * @return encoded MD5, or <CODE>null</CODE> if encoding failed
+     */
+    private static String encode(byte[] binaryData) {
+        LOG.trace("enter DigestScheme.encode(byte[])");
+
+        if (binaryData.length != 16) {
+            return null;
+        }
+
+        char[] buffer = new char[32];
+        for (int i = 0; i < 16; i++) {
+            int low = (int) (binaryData[i] & 0x0f);
+            int high = (int) ((binaryData[i] & 0xf0) >> 4);
+            buffer[i * 2] = HEXADECIMAL[high];
+            buffer[(i * 2) + 1] = HEXADECIMAL[low];
+        }
+
+        return new String(buffer);
+    }
+
+
+    /**
+     * Creates a random cnonce value based on the current time.
+     *
+     * @return The cnonce value as String.
+     * @throws AsyncHttpClientException if MD5 algorithm is not supported.
+     */
+    public static String createCnonce() {
+        LOG.trace("enter DigestScheme.createCnonce()");
+
+        String cnonce;
+        final String digAlg = "MD5";
+        MessageDigest md5Helper;
+
+        try {
+            md5Helper = MessageDigest.getInstance(digAlg);
+        } catch (NoSuchAlgorithmException e) {
+            throw new AsyncHttpClientException(
+              "Unsupported algorithm in HTTP Digest authentication: "
+               + digAlg);
+        }
+
+        cnonce = Long.toString(System.currentTimeMillis());
+        cnonce = encode(md5Helper.digest(EncodingUtil.getAsciiBytes(cnonce)));
+
+        return cnonce;
+    }
+}

Propchange: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/DigestScheme.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/DigestScheme.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/DigestScheme.java
------------------------------------------------------------------------------
    svn:mime-type = text/x-java

Added: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/InvalidCredentialsException.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/InvalidCredentialsException.java?rev=607542&view=auto
==============================================================================
--- geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/InvalidCredentialsException.java (added)
+++ geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/InvalidCredentialsException.java Sun Dec 30 03:36:47 2007
@@ -0,0 +1,41 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.ahc.auth;
+
+import org.apache.ahc.util.AsyncHttpClientException;
+
+public class InvalidCredentialsException extends AsyncHttpClientException {
+
+    public InvalidCredentialsException() {
+        super();
+    }
+
+    public InvalidCredentialsException(String string) {
+        super(string);
+    }
+
+    public InvalidCredentialsException(String string, Throwable throwable) {
+        super(string, throwable);
+    }
+
+    public InvalidCredentialsException(Throwable throwable) {
+        super(throwable);
+    }
+}

Propchange: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/InvalidCredentialsException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/InvalidCredentialsException.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/InvalidCredentialsException.java
------------------------------------------------------------------------------
    svn:mime-type = text/x-java

Added: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/MalformedChallengeException.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/MalformedChallengeException.java?rev=607542&view=auto
==============================================================================
--- geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/MalformedChallengeException.java (added)
+++ geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/MalformedChallengeException.java Sun Dec 30 03:36:47 2007
@@ -0,0 +1,41 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.ahc.auth;
+
+import org.apache.ahc.util.AsyncHttpClientException;
+
+public class MalformedChallengeException extends AsyncHttpClientException {
+
+    public MalformedChallengeException() {
+        super();
+    }
+
+    public MalformedChallengeException(String string) {
+        super(string);
+    }
+
+    public MalformedChallengeException(String string, Throwable throwable) {
+        super(string, throwable);
+    }
+
+    public MalformedChallengeException(Throwable throwable) {
+        super(throwable);
+    }
+}

Propchange: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/MalformedChallengeException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/MalformedChallengeException.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/MalformedChallengeException.java
------------------------------------------------------------------------------
    svn:mime-type = text/x-java

Added: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/NTCredentials.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/NTCredentials.java?rev=607542&view=auto
==============================================================================
--- geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/NTCredentials.java (added)
+++ geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/NTCredentials.java Sun Dec 30 03:36:47 2007
@@ -0,0 +1,180 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.ahc.auth;
+
+import org.apache.ahc.util.LangUtils;
+
+/**
+ * {@link Credentials} for use with the NTLM authentication scheme which requires additional
+ * information.
+ *
+ * @author <a href="mailto:adrian@ephox.com">Adrian Sutton</a>
+ * @author <a href="mailto:mbowler@GargoyleSoftware.com">Mike Bowler</a>
+ */
+public class NTCredentials extends UsernamePasswordCredentials {
+    // ----------------------------------------------------- Instance Variables
+
+    /**
+     * The Domain to authenticate with.
+     */
+    private String domain;
+
+    /**
+     * The host the authentication request is originating from.
+     */
+    private String host;
+
+    // ----------------------------------------------------------- Constructors
+
+    /**
+     * Default constructor.
+     *
+     * @deprecated Do not use. Null user name, domain & host no longer allowed
+     */
+    public NTCredentials() {
+        super();
+    }
+
+    /**
+     * Constructor.
+     *
+     * @param userName The user name.  This should not include the domain to authenticate with.
+     *                 For example: "user" is correct whereas "DOMAIN\\user" is not.
+     * @param password The password.
+     * @param host     The host the authentication request is originating from.  Essentially, the
+     *                 computer name for this machine.
+     * @param domain   The domain to authenticate within.
+     */
+    public NTCredentials(String userName, String password, String host,
+                         String domain) {
+        super(userName, password);
+        if (domain == null) {
+            throw new IllegalArgumentException("Domain may not be null");
+        }
+        this.domain = domain;
+        if (host == null) {
+            throw new IllegalArgumentException("Host may not be null");
+        }
+        this.host = host;
+    }
+    // ------------------------------------------------------- Instance Methods
+
+
+    /**
+     * Sets the domain to authenticate with. The domain may not be null.
+     *
+     * @param domain the NT domain to authenticate in.
+     * @see #getDomain()
+     * @deprecated Do not use. The NTCredentials objects should be immutable
+     */
+    public void setDomain(String domain) {
+        if (domain == null) {
+            throw new IllegalArgumentException("Domain may not be null");
+        }
+        this.domain = domain;
+    }
+
+    /**
+     * Retrieves the name to authenticate with.
+     *
+     * @return String the domain these credentials are intended to authenticate with.
+     * @see #setDomain(String)
+     */
+    public String getDomain() {
+        return domain;
+    }
+
+    /**
+     * Sets the host name of the computer originating the request. The host name may
+     * not be null.
+     *
+     * @param host the Host the user is logged into.
+     * @deprecated Do not use. The NTCredentials objects should be immutable
+     */
+    public void setHost(String host) {
+        if (host == null) {
+            throw new IllegalArgumentException("Host may not be null");
+        }
+        this.host = host;
+    }
+
+    /**
+     * Retrieves the host name of the computer originating the request.
+     *
+     * @return String the host the user is logged into.
+     */
+    public String getHost() {
+        return this.host;
+    }
+
+    /**
+     * Return a string representation of this object.
+     *
+     * @return A string represenation of this object.
+     */
+    public String toString() {
+        final StringBuffer sbResult = new StringBuffer(super.toString());
+
+        sbResult.append("@");
+        sbResult.append(this.host);
+        sbResult.append(".");
+        sbResult.append(this.domain);
+
+        return sbResult.toString();
+    }
+
+    /**
+     * Computes a hash code based on all the case-sensitive parts of the credentials object.
+     *
+     * @return The hash code for the credentials.
+     */
+    public int hashCode() {
+        int hash = super.hashCode();
+        hash = LangUtils.hashCode(hash, this.host);
+        hash = LangUtils.hashCode(hash, this.domain);
+        return hash;
+    }
+
+    /**
+     * Performs a case-sensitive check to see if the components of the credentials
+     * are the same.
+     *
+     * @param o The object to match.
+     * @return <code>true</code> if all of the credentials match.
+     */
+    public boolean equals(Object o) {
+        if (o == null) {
+            return false;
+        }
+        if (this == o) {
+            return true;
+        }
+        if (super.equals(o)) {
+            if (o instanceof NTCredentials) {
+                NTCredentials that = (NTCredentials)o;
+
+                return LangUtils.equals(this.domain, that.domain)
+                    && LangUtils.equals(this.host, that.host);
+            }
+        }
+
+        return false;
+    }
+}

Propchange: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/NTCredentials.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/NTCredentials.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/NTCredentials.java
------------------------------------------------------------------------------
    svn:mime-type = text/x-java

Added: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/NTLM.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/NTLM.java?rev=607542&view=auto
==============================================================================
--- geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/NTLM.java (added)
+++ geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/NTLM.java Sun Dec 30 03:36:47 2007
@@ -0,0 +1,549 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.ahc.auth;
+
+import java.security.NoSuchAlgorithmException;
+import java.security.InvalidKeyException;
+import javax.crypto.Cipher;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.BadPaddingException;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.spec.SecretKeySpec;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.ahc.util.EncodingUtil;
+
+/**
+ * Provides an implementation of the NTLM authentication protocol.
+ * <p>
+ * This class provides methods for generating authentication
+ * challenge responses for the NTLM authentication protocol.  The NTLM
+ * protocol is a proprietary Microsoft protocol and as such no RFC
+ * exists for it.  This class is based upon the reverse engineering
+ * efforts of a wide range of people.</p>
+ *
+ * <p>Please note that an implementation of JCE must be correctly installed and configured when
+ * using NTLM support.</p>
+ *
+ * <p>This class should not be used externally to HttpClient as it's API is specifically
+ * designed to work with HttpClient's use case, in particular it's connection management.</p>
+ *
+ * @author <a href="mailto:adrian@ephox.com">Adrian Sutton</a>
+ * @author <a href="mailto:jsdever@apache.org">Jeff Dever</a>
+ * @author <a href="mailto:mbowler@GargoyleSoftware.com">Mike Bowler</a>
+ */
+final class NTLM {
+    /** Character encoding */
+    public static final String DEFAULT_CHARSET = "ASCII";
+
+    /** The current response */
+    private byte[] currentResponse;
+
+    /** The current position */
+    private int currentPosition = 0;
+
+    /** The character set to use for encoding the credentials */
+    private String credentialCharset = DEFAULT_CHARSET;
+
+    /**
+     * Returns the response for the given message.
+     *
+     * @param message the message that was received from the server.
+     * @param username the username to authenticate with.
+     * @param password the password to authenticate with.
+     * @param host The host.
+     * @param domain the NT domain to authenticate in.
+     * @return The response.
+     * @throws AuthenticationException If the messages cannot be retrieved.
+     */
+    public final String getResponseFor(String message,
+            String username, String password, String host, String domain)
+            throws AuthenticationException {
+
+        final String response;
+        if (message == null || message.trim().equals("")) {
+            response = getType1Message(host, domain);
+        } else {
+            response = getType3Message(username, password, host, domain,
+                    parseType2Message(message));
+        }
+        return response;
+    }
+
+    /**
+     * Return the cipher for the specified key.
+     * @param key The key.
+     * @return Cipher The cipher.
+     * @throws AuthenticationException If the cipher cannot be retrieved.
+     */
+    private Cipher getCipher(byte[] key) throws AuthenticationException {
+        try {
+            final Cipher ecipher = Cipher.getInstance("DES/ECB/NoPadding");
+            key = setupKey(key);
+            ecipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "DES"));
+            return ecipher;
+        } catch (NoSuchAlgorithmException e) {
+            throw new AuthenticationException("DES encryption is not available.", e);
+        } catch (InvalidKeyException e) {
+            throw new AuthenticationException("Invalid key for DES encryption.", e);
+        } catch (NoSuchPaddingException e) {
+            throw new AuthenticationException(
+                "NoPadding option for DES is not available.", e);
+        }
+    }
+
+    /**
+     * Adds parity bits to the key.
+     * @param key56 The key
+     * @return The modified key.
+     */
+    private byte[] setupKey(byte[] key56) {
+        byte[] key = new byte[8];
+        key[0] = (byte) ((key56[0] >> 1) & 0xff);
+        key[1] = (byte) ((((key56[0] & 0x01) << 6)
+            | (((key56[1] & 0xff) >> 2) & 0xff)) & 0xff);
+        key[2] = (byte) ((((key56[1] & 0x03) << 5)
+            | (((key56[2] & 0xff) >> 3) & 0xff)) & 0xff);
+        key[3] = (byte) ((((key56[2] & 0x07) << 4)
+            | (((key56[3] & 0xff) >> 4) & 0xff)) & 0xff);
+        key[4] = (byte) ((((key56[3] & 0x0f) << 3)
+            | (((key56[4] & 0xff) >> 5) & 0xff)) & 0xff);
+        key[5] = (byte) ((((key56[4] & 0x1f) << 2)
+            | (((key56[5] & 0xff) >> 6) & 0xff)) & 0xff);
+        key[6] = (byte) ((((key56[5] & 0x3f) << 1)
+            | (((key56[6] & 0xff) >> 7) & 0xff)) & 0xff);
+        key[7] = (byte) (key56[6] & 0x7f);
+
+        for (int i = 0; i < key.length; i++) {
+            key[i] = (byte) (key[i] << 1);
+        }
+        return key;
+    }
+
+    /**
+     * Encrypt the data.
+     * @param key The key.
+     * @param bytes The data
+     * @return byte[] The encrypted data
+     * @throws AuthenticationException If {@link javax.crypto.Cipher#doFinal(byte[])} fails
+     */
+    private byte[] encrypt(byte[] key, byte[] bytes)
+        throws AuthenticationException {
+        Cipher ecipher = getCipher(key);
+        try {
+            byte[] enc = ecipher.doFinal(bytes);
+            return enc;
+        } catch (IllegalBlockSizeException e) {
+            throw new AuthenticationException("Invalid block size for DES encryption.", e);
+        } catch (BadPaddingException e) {
+            throw new AuthenticationException("Data not padded correctly for DES encryption.", e);
+        }
+    }
+
+    /**
+     * Prepares the object to create a response of the given length.
+     * @param length the length of the response to prepare.
+     */
+    private void prepareResponse(int length) {
+        currentResponse = new byte[length];
+        currentPosition = 0;
+    }
+
+    /**
+     * Adds the given byte to the response.
+     * @param b the byte to add.
+     */
+    private void addByte(byte b) {
+        currentResponse[currentPosition] = b;
+        currentPosition++;
+    }
+
+    /**
+     * Adds the given bytes to the response.
+     * @param bytes the bytes to add.
+     */
+    private void addBytes(byte[] bytes) {
+        for (int i = 0; i < bytes.length; i++) {
+            currentResponse[currentPosition] = bytes[i];
+            currentPosition++;
+        }
+    }
+
+    /**
+     * Returns the response that has been generated after shrinking the array if
+     * required and base64 encodes the response.
+     * @return The response as above.
+     */
+    private String getResponse() {
+        byte[] resp;
+        if (currentResponse.length > currentPosition) {
+            byte[] tmp = new byte[currentPosition];
+            for (int i = 0; i < currentPosition; i++) {
+                tmp[i] = currentResponse[i];
+            }
+            resp = tmp;
+        } else {
+            resp = currentResponse;
+        }
+        return EncodingUtil.getAsciiString(Base64.encodeBase64(resp));
+    }
+
+    /**
+     * Creates the first message (type 1 message) in the NTLM authentication sequence.
+     * This message includes the user name, domain and host for the authentication session.
+     *
+     * @param host the computer name of the host requesting authentication.
+     * @param domain The domain to authenticate with.
+     * @return String the message to add to the HTTP request header.
+     */
+    public String getType1Message(String host, String domain) {
+        host = host.toUpperCase();
+        domain = domain.toUpperCase();
+        byte[] hostBytes = EncodingUtil.getBytes(host, DEFAULT_CHARSET);
+        byte[] domainBytes = EncodingUtil.getBytes(domain, DEFAULT_CHARSET);
+
+        int finalLength = 32 + hostBytes.length + domainBytes.length;
+        prepareResponse(finalLength);
+
+        // The initial id string.
+        byte[] protocol = EncodingUtil.getBytes("NTLMSSP", DEFAULT_CHARSET);
+        addBytes(protocol);
+        addByte((byte) 0);
+
+        // Type
+        addByte((byte) 1);
+        addByte((byte) 0);
+        addByte((byte) 0);
+        addByte((byte) 0);
+
+        // Flags
+        addByte((byte) 6);
+        addByte((byte) 82);
+        addByte((byte) 0);
+        addByte((byte) 0);
+
+        // Domain length (first time).
+        int iDomLen = domainBytes.length;
+        byte[] domLen = convertShort(iDomLen);
+        addByte(domLen[0]);
+        addByte(domLen[1]);
+
+        // Domain length (second time).
+        addByte(domLen[0]);
+        addByte(domLen[1]);
+
+        // Domain offset.
+        byte[] domOff = convertShort(hostBytes.length + 32);
+        addByte(domOff[0]);
+        addByte(domOff[1]);
+        addByte((byte) 0);
+        addByte((byte) 0);
+
+        // Host length (first time).
+        byte[] hostLen = convertShort(hostBytes.length);
+        addByte(hostLen[0]);
+        addByte(hostLen[1]);
+
+        // Host length (second time).
+        addByte(hostLen[0]);
+        addByte(hostLen[1]);
+
+        // Host offset (always 32).
+        byte[] hostOff = convertShort(32);
+        addByte(hostOff[0]);
+        addByte(hostOff[1]);
+        addByte((byte) 0);
+        addByte((byte) 0);
+
+        // Host String.
+        addBytes(hostBytes);
+
+        // Domain String.
+        addBytes(domainBytes);
+
+        return getResponse();
+    }
+
+    /**
+     * Extracts the server nonce out of the given message type 2.
+     *
+     * @param message the String containing the base64 encoded message.
+     * @return an array of 8 bytes that the server sent to be used when
+     * hashing the password.
+     */
+    public byte[] parseType2Message(String message) {
+        // Decode the message first.
+        byte[] msg = Base64.decodeBase64(EncodingUtil.getBytes(message, DEFAULT_CHARSET));
+        byte[] nonce = new byte[8];
+        // The nonce is the 8 bytes starting from the byte in position 24.
+        for (int i = 0; i < 8; i++) {
+            nonce[i] = msg[i + 24];
+        }
+        return nonce;
+    }
+
+    /**
+     * Creates the type 3 message using the given server nonce.  The type 3 message includes all the
+     * information for authentication, host, domain, username and the result of encrypting the
+     * nonce sent by the server using the user's password as the key.
+     *
+     * @param user The user name.  This should not include the domain name.
+     * @param password The password.
+     * @param host The host that is originating the authentication request.
+     * @param domain The domain to authenticate within.
+     * @param nonce the 8 byte array the server sent.
+     * @return The type 3 message.
+     * @throws AuthenticationException If {@encrypt(byte[],byte[])} fails.
+     */
+    public String getType3Message(String user, String password,
+            String host, String domain, byte[] nonce)
+    throws AuthenticationException {
+
+        int ntRespLen = 0;
+        int lmRespLen = 24;
+        domain = domain.toUpperCase();
+        host = host.toUpperCase();
+        user = user.toUpperCase();
+        byte[] domainBytes = EncodingUtil.getBytes(domain, DEFAULT_CHARSET);
+        byte[] hostBytes = EncodingUtil.getBytes(host, DEFAULT_CHARSET);
+        byte[] userBytes = EncodingUtil.getBytes(user, credentialCharset);
+        int domainLen = domainBytes.length;
+        int hostLen = hostBytes.length;
+        int userLen = userBytes.length;
+        int finalLength = 64 + ntRespLen + lmRespLen + domainLen
+            + userLen + hostLen;
+        prepareResponse(finalLength);
+        byte[] ntlmssp = EncodingUtil.getBytes("NTLMSSP", DEFAULT_CHARSET);
+        addBytes(ntlmssp);
+        addByte((byte) 0);
+        addByte((byte) 3);
+        addByte((byte) 0);
+        addByte((byte) 0);
+        addByte((byte) 0);
+
+        // LM Resp Length (twice)
+        addBytes(convertShort(24));
+        addBytes(convertShort(24));
+
+        // LM Resp Offset
+        addBytes(convertShort(finalLength - 24));
+        addByte((byte) 0);
+        addByte((byte) 0);
+
+        // NT Resp Length (twice)
+        addBytes(convertShort(0));
+        addBytes(convertShort(0));
+
+        // NT Resp Offset
+        addBytes(convertShort(finalLength));
+        addByte((byte) 0);
+        addByte((byte) 0);
+
+        // Domain length (twice)
+        addBytes(convertShort(domainLen));
+        addBytes(convertShort(domainLen));
+
+        // Domain offset.
+        addBytes(convertShort(64));
+        addByte((byte) 0);
+        addByte((byte) 0);
+
+        // User Length (twice)
+        addBytes(convertShort(userLen));
+        addBytes(convertShort(userLen));
+
+        // User offset
+        addBytes(convertShort(64 + domainLen));
+        addByte((byte) 0);
+        addByte((byte) 0);
+
+        // Host length (twice)
+        addBytes(convertShort(hostLen));
+        addBytes(convertShort(hostLen));
+
+        // Host offset
+        addBytes(convertShort(64 + domainLen + userLen));
+
+        for (int i = 0; i < 6; i++) {
+            addByte((byte) 0);
+        }
+
+        // Message length
+        addBytes(convertShort(finalLength));
+        addByte((byte) 0);
+        addByte((byte) 0);
+
+        // Flags
+        addByte((byte) 6);
+        addByte((byte) 82);
+        addByte((byte) 0);
+        addByte((byte) 0);
+
+        addBytes(domainBytes);
+        addBytes(userBytes);
+        addBytes(hostBytes);
+        addBytes(hashPassword(password, nonce));
+        return getResponse();
+    }
+
+    /**
+     * Creates the LANManager and NT response for the given password using the
+     * given nonce.
+     * @param password the password to create a hash for.
+     * @param nonce the nonce sent by the server.
+     * @return The response.
+     * @throws AuthenticationException If {@link #encrypt(byte[],byte[])} fails.
+     */
+    private byte[] hashPassword(String password, byte[] nonce)
+        throws AuthenticationException {
+        byte[] passw = EncodingUtil.getBytes(password.toUpperCase(), credentialCharset);
+        byte[] lmPw1 = new byte[7];
+        byte[] lmPw2 = new byte[7];
+
+        int len = passw.length;
+        if (len > 7) {
+            len = 7;
+        }
+
+        int idx;
+        for (idx = 0; idx < len; idx++) {
+            lmPw1[idx] = passw[idx];
+        }
+        for (; idx < 7; idx++) {
+            lmPw1[idx] = (byte) 0;
+        }
+
+        len = passw.length;
+        if (len > 14) {
+            len = 14;
+        }
+        for (idx = 7; idx < len; idx++) {
+            lmPw2[idx - 7] = passw[idx];
+        }
+        for (; idx < 14; idx++) {
+            lmPw2[idx - 7] = (byte) 0;
+        }
+
+        // Create LanManager hashed Password
+        byte[] magic = {
+            (byte) 0x4B, (byte) 0x47, (byte) 0x53, (byte) 0x21,
+            (byte) 0x40, (byte) 0x23, (byte) 0x24, (byte) 0x25
+        };
+
+        byte[] lmHpw1;
+        lmHpw1 = encrypt(lmPw1, magic);
+
+        byte[] lmHpw2 = encrypt(lmPw2, magic);
+
+        byte[] lmHpw = new byte[21];
+        for (int i = 0; i < lmHpw1.length; i++) {
+            lmHpw[i] = lmHpw1[i];
+        }
+        for (int i = 0; i < lmHpw2.length; i++) {
+            lmHpw[i + 8] = lmHpw2[i];
+        }
+        for (int i = 0; i < 5; i++) {
+            lmHpw[i + 16] = (byte) 0;
+        }
+
+        // Create the responses.
+        byte[] lmResp = new byte[24];
+        calcResp(lmHpw, nonce, lmResp);
+
+        return lmResp;
+    }
+
+    /**
+     * Takes a 21 byte array and treats it as 3 56-bit DES keys.  The 8 byte
+     * plaintext is encrypted with each key and the resulting 24 bytes are
+     * stored in the results array.
+     *
+     * @param keys The keys.
+     * @param plaintext The plain text to encrypt.
+     * @param results Where the results are stored.
+     * @throws AuthenticationException If {@link #encrypt(byte[],byte[])} fails.
+     */
+    private void calcResp(byte[] keys, byte[] plaintext, byte[] results)
+        throws AuthenticationException {
+        byte[] keys1 = new byte[7];
+        byte[] keys2 = new byte[7];
+        byte[] keys3 = new byte[7];
+        for (int i = 0; i < 7; i++) {
+            keys1[i] = keys[i];
+        }
+
+        for (int i = 0; i < 7; i++) {
+            keys2[i] = keys[i + 7];
+        }
+
+        for (int i = 0; i < 7; i++) {
+            keys3[i] = keys[i + 14];
+        }
+        byte[] results1 = encrypt(keys1, plaintext);
+
+        byte[] results2 = encrypt(keys2, plaintext);
+
+        byte[] results3 = encrypt(keys3, plaintext);
+
+        for (int i = 0; i < 8; i++) {
+            results[i] = results1[i];
+        }
+        for (int i = 0; i < 8; i++) {
+            results[i + 8] = results2[i];
+        }
+        for (int i = 0; i < 8; i++) {
+            results[i + 16] = results3[i];
+        }
+    }
+
+    /**
+     * Converts a given number to a two byte array in little endian order.
+     * @param num the number to convert.
+     * @return The byte representation of <i>num</i> in little endian order.
+     */
+    private byte[] convertShort(int num) {
+        byte[] val = new byte[2];
+        String hex = Integer.toString(num, 16);
+        while (hex.length() < 4) {
+            hex = "0" + hex;
+        }
+        String low = hex.substring(2, 4);
+        String high = hex.substring(0, 2);
+
+        val[0] = (byte) Integer.parseInt(low, 16);
+        val[1] = (byte) Integer.parseInt(high, 16);
+        return val;
+    }
+
+    /**
+     * @return Returns the credentialCharset.
+     */
+    public String getCredentialCharset() {
+        return credentialCharset;
+    }
+
+    /**
+     * @param credentialCharset The credentialCharset to set.
+     */
+    public void setCredentialCharset(String credentialCharset) {
+        this.credentialCharset = credentialCharset;
+    }
+
+}

Propchange: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/NTLM.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/NTLM.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/NTLM.java
------------------------------------------------------------------------------
    svn:mime-type = text/x-java

Added: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/NTLMScheme.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/NTLMScheme.java?rev=607542&view=auto
==============================================================================
--- geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/NTLMScheme.java (added)
+++ geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/NTLMScheme.java Sun Dec 30 03:36:47 2007
@@ -0,0 +1,210 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.ahc.auth;
+
+import org.apache.ahc.codec.HttpRequestMessage;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * An implementation of the Microsoft proprietary NTLM authentication scheme.
+ *
+ * @author <a href="mailto:remm@apache.org">Remy Maucherat</a>
+ * @author Rodney Waldhoff
+ * @author <a href="mailto:jsdever@apache.org">Jeff Dever</a>
+ * @author Ortwin Gl???ck
+ * @author Sean C. Sullivan
+ * @author <a href="mailto:adrian@ephox.com">Adrian Sutton</a>
+ * @author <a href="mailto:mbowler@GargoyleSoftware.com">Mike Bowler</a>
+ * @author <a href="mailto:oleg@ural.ru">Oleg Kalnichevski</a>
+ */
+public class NTLMScheme implements AuthScheme {
+
+    /**
+     * Log object for this class.
+     */
+    private static final Logger LOG = LoggerFactory.getLogger(NTLMScheme.class);
+
+    /**
+     * NTLM challenge string.
+     */
+    private String ntlmchallenge = null;
+
+    private static final int UNINITIATED = 0;
+    private static final int INITIATED = 1;
+    private static final int TYPE1_MSG_GENERATED = 2;
+    private static final int TYPE2_MSG_RECEIVED = 3;
+    private static final int TYPE3_MSG_GENERATED = 4;
+    private static final int FAILED = Integer.MAX_VALUE;
+
+    /**
+     * Authentication process state
+     */
+    private int state;
+
+    /**
+     * Default constructor for the NTLM authentication scheme.
+     */
+    public NTLMScheme() {
+        super();
+        this.state = UNINITIATED;
+    }
+
+    /**
+     * Constructor for the NTLM authentication scheme.
+     *
+     * @param challenge The authentication challenge
+     * @throws MalformedChallengeException is thrown if the authentication challenge
+     *                                     is malformed
+     */
+    public NTLMScheme(final String challenge) throws MalformedChallengeException {
+        super();
+        processChallenge(challenge);
+    }
+
+    /**
+     * Processes the NTLM challenge.
+     *
+     * @param challenge the challenge string
+     * @throws MalformedChallengeException is thrown if the authentication challenge
+     *                                     is malformed
+     */
+    public void processChallenge(final String challenge) throws MalformedChallengeException {
+        String s = AuthChallengeParser.extractScheme(challenge);
+        if (!s.equalsIgnoreCase(getSchemeName())) {
+            throw new MalformedChallengeException("Invalid NTLM challenge: " + challenge);
+        }
+        int i = challenge.indexOf(' ');
+        if (i != -1) {
+            s = challenge.substring(i, challenge.length());
+            this.ntlmchallenge = s.trim();
+            this.state = TYPE2_MSG_RECEIVED;
+        } else {
+            this.ntlmchallenge = "";
+            if (this.state == UNINITIATED) {
+                this.state = INITIATED;
+            } else {
+                this.state = FAILED;
+            }
+        }
+    }
+
+    /**
+     * Tests if the NTLM authentication process has been completed.
+     *
+     * @return <tt>true</tt> if Basic authorization has been processed,
+     *         <tt>false</tt> otherwise.
+     */
+    public boolean isComplete() {
+        return this.state == TYPE3_MSG_GENERATED || this.state == FAILED;
+    }
+
+    /**
+     * Returns textual designation of the NTLM authentication scheme.
+     *
+     * @return <code>ntlm</code>
+     */
+    public String getSchemeName() {
+        return "ntlm";
+    }
+
+    /**
+     * The concept of an authentication realm is not supported by the NTLM
+     * authentication scheme. Always returns <code>null</code>.
+     *
+     * @return <code>null</code>
+     */
+    public String getRealm() {
+        return null;
+    }
+
+    /**
+     * Returns the authentication parameter with the given name, if available.
+     * <p/>
+     * <p>There are no valid parameters for NTLM authentication so this method always returns
+     * <tt>null</tt>.</p>
+     *
+     * @param name The name of the parameter to be returned
+     * @return the parameter with the given name
+     */
+    public String getParameter(String name) {
+        if (name == null) {
+            throw new IllegalArgumentException("Parameter name may not be null");
+        }
+        return null;
+    }
+
+    /**
+     * Returns <tt>true</tt>. NTLM authentication scheme is connection based.
+     *
+     * @return <tt>true</tt>.
+     */
+    public boolean isConnectionBased() {
+        return true;
+    }
+
+    /**
+     * Produces NTLM authorization string for the given set of {@link Credentials}.
+     *
+     * @param credentials The set of credentials to be used for athentication
+     * @param request     The request being authenticated
+     * @return an NTLM authorization string
+     * @throws InvalidCredentialsException if authentication credentials
+     *                                     are not valid or not applicable for this authentication scheme
+     * @throws AuthenticationException     if authorization string cannot
+     *                                     be generated due to an authentication failure
+     */
+    public String authenticate(Credentials credentials, HttpRequestMessage request)
+        throws AuthenticationException {
+        LOG.trace("enter NTLMScheme.authenticate(Credentials, HttpMethod)");
+
+        if (this.state == UNINITIATED) {
+            throw new IllegalStateException("NTLM authentication process has not been initiated");
+        }
+
+        NTCredentials ntcredentials = null;
+        try {
+            ntcredentials = (NTCredentials)credentials;
+        } catch (ClassCastException e) {
+            throw new InvalidCredentialsException(
+                "Credentials cannot be used for NTLM authentication: "
+                    + credentials.getClass().getName());
+        }
+        NTLM ntlm = new NTLM();
+        ntlm.setCredentialCharset(request.getCredentialCharset());
+        String response = null;
+        if (this.state == INITIATED || this.state == FAILED) {
+            response = ntlm.getType1Message(
+                ntcredentials.getHost(),
+                ntcredentials.getDomain());
+            this.state = TYPE1_MSG_GENERATED;
+        } else {
+            response = ntlm.getType3Message(
+                ntcredentials.getUserName(),
+                ntcredentials.getPassword(),
+                ntcredentials.getHost(),
+                ntcredentials.getDomain(),
+                ntlm.parseType2Message(this.ntlmchallenge));
+            this.state = TYPE3_MSG_GENERATED;
+        }
+        return "NTLM " + response;
+    }
+}
+

Propchange: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/NTLMScheme.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/NTLMScheme.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/NTLMScheme.java
------------------------------------------------------------------------------
    svn:mime-type = text/x-java

Added: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/RFC2617Scheme.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/RFC2617Scheme.java?rev=607542&view=auto
==============================================================================
--- geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/RFC2617Scheme.java (added)
+++ geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/RFC2617Scheme.java Sun Dec 30 03:36:47 2007
@@ -0,0 +1,109 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.ahc.auth;
+
+import java.util.Map;
+
+public abstract class RFC2617Scheme implements AuthScheme{
+        /**
+     * Authentication parameter map.
+     */
+    private Map params = null;
+
+    /**
+     * Default constructor for RFC2617 compliant authetication schemes.
+     *
+     * @since 3.0
+     */
+    public RFC2617Scheme() {
+        super();
+    }
+
+    /**
+     * Default constructor for RFC2617 compliant authetication schemes.
+     *
+     * @param challenge authentication challenge
+     *
+     * @throws MalformedChallengeException is thrown if the authentication challenge
+     * is malformed
+     *
+     * @deprecated Use parameterless constructor and {@link AuthScheme#processChallenge(String)}
+     *             method
+     */
+    public RFC2617Scheme(final String challenge) throws MalformedChallengeException {
+        super();
+        processChallenge(challenge);
+    }
+
+    /**
+     * Processes the given challenge token. Some authentication schemes
+     * may involve multiple challenge-response exchanges. Such schemes must be able
+     * to maintain the state information when dealing with sequential challenges
+     *
+     * @param challenge the challenge string
+     *
+     * @throws MalformedChallengeException is thrown if the authentication challenge
+     * is malformed
+     *
+     * @since 3.0
+     */
+    public void processChallenge(final String challenge) throws MalformedChallengeException {
+        String s = AuthChallengeParser.extractScheme(challenge);
+        if (!s.equalsIgnoreCase(getSchemeName())) {
+            throw new MalformedChallengeException("Invalid " + getSchemeName() + " challenge: " + challenge);
+        }
+        this.params = AuthChallengeParser.extractParams(challenge);
+    }
+
+    /**
+     * Returns authentication parameters map. Keys in the map are lower-cased.
+     *
+     * @return the map of authentication parameters
+     */
+    protected Map getParameters() {
+        return this.params;
+    }
+
+    /**
+     * Returns authentication parameter with the given name, if available.
+     *
+     * @param name The name of the parameter to be returned
+     *
+     * @return the parameter with the given name
+     */
+    public String getParameter(String name) {
+        if (name == null) {
+            throw new IllegalArgumentException("Parameter name may not be null");
+        }
+        if (this.params == null) {
+            return null;
+        }
+        return (String) this.params.get(name.toLowerCase());
+    }
+
+    /**
+     * Returns authentication realm. The realm may not be null.
+     *
+     * @return the authentication realm
+     */
+    public String getRealm() {
+        return getParameter("realm");
+    }
+}

Propchange: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/RFC2617Scheme.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/RFC2617Scheme.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/RFC2617Scheme.java
------------------------------------------------------------------------------
    svn:mime-type = text/x-java

Added: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/UsernamePasswordCredentials.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/UsernamePasswordCredentials.java?rev=607542&view=auto
==============================================================================
--- geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/UsernamePasswordCredentials.java (added)
+++ geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/UsernamePasswordCredentials.java Sun Dec 30 03:36:47 2007
@@ -0,0 +1,189 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.ahc.auth;
+
+import org.apache.ahc.util.LangUtils;
+
+public class UsernamePasswordCredentials implements Credentials{
+        // ----------------------------------------------------------- Constructors
+
+    /**
+     * Default constructor.
+     *
+     * @deprecated Do not use. Null user name no longer allowed
+     */
+    public UsernamePasswordCredentials() {
+        super();
+    }
+
+
+    /**
+     * The constructor with the username and password combined string argument.
+     *
+     * @param usernamePassword the username:password formed string
+     * @see #toString
+     */
+    public UsernamePasswordCredentials(String usernamePassword) {
+        super();
+        if (usernamePassword == null) {
+            throw new IllegalArgumentException("Username:password string may not be null");
+        }
+        int atColon = usernamePassword.indexOf(':');
+        if (atColon >= 0) {
+            this.userName = usernamePassword.substring(0, atColon);
+            this.password = usernamePassword.substring(atColon + 1);
+        } else {
+            this.userName = usernamePassword;
+        }
+    }
+
+
+    /**
+     * The constructor with the username and password arguments.
+     *
+     * @param userName the user name
+     * @param password the password
+     */
+    public UsernamePasswordCredentials(String userName, String password) {
+        super();
+        if (userName == null) {
+            throw new IllegalArgumentException("Username may not be null");
+        }
+        this.userName = userName;
+        this.password = password;
+    }
+
+    // ----------------------------------------------------- Instance Variables
+
+    /**
+     * User name.
+     */
+    private String userName;
+
+
+    /**
+     * Password.
+     */
+    private String password;
+
+
+    // ------------------------------------------------------------- Properties
+
+
+    /**
+     * User name property setter. User name may not be null.
+     *
+     * @param userName
+     * @see #getUserName()
+     *
+     * @deprecated Do not use. The UsernamePasswordCredentials objects should be immutable
+     */
+    public void setUserName(String userName) {
+        if (userName == null) {
+            throw new IllegalArgumentException("Username may not be null");
+        }
+        this.userName = userName;
+    }
+
+
+    /**
+     * User name property getter.
+     *
+     * @return the userName
+     * @see #setUserName(String)
+     */
+    public String getUserName() {
+        return userName;
+    }
+
+
+    /**
+     * Password property setter.
+     *
+     * @param password
+     * @see #getPassword()
+     *
+     * @deprecated Do not use. The UsernamePasswordCredentials objects should be immutable
+     */
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+
+    /**
+     * Password property getter.
+     *
+     * @return the password
+     * @see #setPassword(String)
+     */
+    public String getPassword() {
+        return password;
+    }
+
+
+    /**
+     * Get this object string.
+     *
+     * @return the username:password formed string
+     */
+    public String toString() {
+        StringBuffer result = new StringBuffer();
+        result.append(this.userName);
+        result.append(":");
+        result.append((this.password == null) ? "null" : this.password);
+        return result.toString();
+    }
+
+    /**
+     * Does a hash of both user name and password.
+     *
+     * @return The hash code including user name and password.
+     */
+    public int hashCode() {
+        int hash = LangUtils.HASH_SEED;
+        hash = LangUtils.hashCode(hash, this.userName);
+        hash = LangUtils.hashCode(hash, this.password);
+        return hash;
+    }
+
+    /**
+     * These credentials are assumed equal if the username and password are the
+     * same.
+     *
+     * @param o The other object to compare with.
+     *
+     * @return  <code>true</code> if the object is equivalent.
+     */
+    public boolean equals(Object o) {
+        if (o == null) return false;
+        if (this == o) return true;
+        // note - to allow for sub-classing, this checks that class is the same
+        // rather than do "instanceof".
+        if (this.getClass().equals(o.getClass())) {
+            UsernamePasswordCredentials that = (UsernamePasswordCredentials) o;
+
+            if (LangUtils.equals(this.userName, that.userName)
+                    && LangUtils.equals(this.password, that.password) ) {
+                return true;
+            }
+        }
+        return false;
+    }
+}

Propchange: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/UsernamePasswordCredentials.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/UsernamePasswordCredentials.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/auth/UsernamePasswordCredentials.java
------------------------------------------------------------------------------
    svn:mime-type = text/x-java

Added: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/codec/Cookie.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/codec/Cookie.java?rev=607542&view=auto
==============================================================================
--- geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/codec/Cookie.java (added)
+++ geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/codec/Cookie.java Sun Dec 30 03:36:47 2007
@@ -0,0 +1,209 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.ahc.codec;
+
+import java.util.Date;
+
+/**
+ * Class is the container for an HTTP Cookie. It is an object representing the cookie header of
+ * the HTTP protocol.
+ */
+public class Cookie {
+
+    /** The comment. */
+    private String comment;
+    
+    /** The domain. */
+    private String domain;
+    
+    /** The name. */
+    private String name;
+    
+    /** The value. */
+    private String value;
+    
+    /** The path. */
+    private String path;
+    
+    /** The secure. */
+    private boolean secure;
+    
+    /** The version. */
+    private int version;
+    
+    /** The expires. */
+    private Date expires;
+
+    /**
+     * Constructs a cookie identified by a name and value.
+     * 
+     * @param name the cookie name
+     * @param value the cookie value
+     */
+    public Cookie(String name, String value) {
+        this.name = name;
+        this.value = value;
+    }
+
+    /**
+     * Returns a cookie's comment or <code>null</code> if no comment exists.
+     * 
+     * @return The cookie comment
+     */
+    public String getComment() {
+        return comment;
+    }
+
+    /**
+     * Sets a comment which describes the cookie.
+     * 
+     * @param comment the comment to set
+     */
+    public void setComment(String comment) {
+        this.comment = comment;
+    }
+
+    /**
+     * Returns a cookie's domain is one is available or <code>null</code> if it does not exist.
+     * 
+     * @return the cookie's domain.
+     */
+    public String getDomain() {
+        return domain;
+    }
+
+    /**
+     * Sets a cookie's domain as specified by RFC 2109.
+     * 
+     * @param domain the cookie's domain to set
+     */
+    public void setDomain(String domain) {
+        this.domain = domain;
+    }
+
+
+    /**
+     * Returns the name of the cookie.
+     * 
+     * @return the name of the cookie
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * Sets the name of the cookie.
+     * 
+     * @param name the name of the cookie
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    /**
+     * Returns the cookie's value.
+     * 
+     * @return the cookie's value
+     */
+    public String getValue() {
+        return value;
+    }
+
+    /**
+     * Sets the cookie's value.
+     * 
+     * @param value the cookie value
+     */
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    /**
+     * Returns the cookie path. The path represents all paths, and sub-paths that this cookie is valid.
+     * 
+     * @return the cookie path
+     */
+    public String getPath() {
+        return path;
+    }
+
+    /**
+     * Set the cookie's path. The path represents all paths, and sub-paths that this cookie is valid.
+     * 
+     * @param path the cookie path
+     */
+    public void setPath(String path) {
+        this.path = path;
+    }
+
+    /**
+     * Returns if the cookie is secure.
+     * 
+     * @return true, if is secure
+     */
+    public boolean isSecure() {
+        return secure;
+    }
+
+    /**
+     * Sets the cookie secure flag.
+     * 
+     * @param secure the new secure value (<code>true</code>/<code>false</code>)
+     */
+    public void setSecure(boolean secure) {
+        this.secure = secure;
+    }
+
+    /**
+     * Gets the cookie version.
+     * 
+     * @return the cookie version
+     */
+    public int getVersion() {
+        return version;
+    }
+
+    /**
+     * Sets the cookie version.
+     * 
+     * @param version the cookie version
+     */
+    public void setVersion(int version) {
+        this.version = version;
+    }
+
+    /**
+     * Gets the cookie expiration <code>Date</code>.
+     * 
+     * @return the expiration <code>Date</code>
+     */
+    public Date getExpires() {
+        return expires;
+    }
+
+    /**
+     * Sets the cookie expiration <code>Date</code>.
+     * 
+     * @param expires the new expiration <code>Date</code>
+     */
+    public void setExpires(Date expires) {
+        this.expires = expires;
+    }
+}

Propchange: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/codec/Cookie.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/codec/Cookie.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: geronimo/sandbox/async-http-client-mina2/src/main/java/org/apache/ahc/codec/Cookie.java
------------------------------------------------------------------------------
    svn:mime-type = text/x-java



Mime
View raw message