Home | History | Annotate | Download | only in auth
      1 /*
      2  * $HeadURL: http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/module-client/src/main/java/org/apache/http/auth/AuthScope.java $
      3  * $Revision: 652950 $
      4  * $Date: 2008-05-02 16:49:48 -0700 (Fri, 02 May 2008) $
      5  *
      6  * ====================================================================
      7  *
      8  *  Licensed to the Apache Software Foundation (ASF) under one or more
      9  *  contributor license agreements.  See the NOTICE file distributed with
     10  *  this work for additional information regarding copyright ownership.
     11  *  The ASF licenses this file to You under the Apache License, Version 2.0
     12  *  (the "License"); you may not use this file except in compliance with
     13  *  the License.  You may obtain a copy of the License at
     14  *
     15  *      http://www.apache.org/licenses/LICENSE-2.0
     16  *
     17  *  Unless required by applicable law or agreed to in writing, software
     18  *  distributed under the License is distributed on an "AS IS" BASIS,
     19  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     20  *  See the License for the specific language governing permissions and
     21  *  limitations under the License.
     22  * ====================================================================
     23  *
     24  * This software consists of voluntary contributions made by many
     25  * individuals on behalf of the Apache Software Foundation.  For more
     26  * information on the Apache Software Foundation, please see
     27  * <http://www.apache.org/>.
     28  *
     29  */
     30 
     31 package org.apache.http.auth;
     32 
     33 import java.util.Locale;
     34 
     35 import org.apache.http.util.LangUtils;
     36 
     37 /**
     38  * The class represents an authentication scope consisting of a host name,
     39  * a port number, a realm name and an authentication scheme name which
     40  * {@link Credentials Credentials} apply to.
     41  *
     42  * @author <a href="mailto:oleg at ural.ru">Oleg Kalnichevski</a>
     43  * @author <a href="mailto:adrian (at) intencha.com">Adrian Sutton</a>
     44  *
     45  * @since 4.0
     46  *
     47  * @deprecated Please use {@link java.net.URL#openConnection} instead.
     48  *     Please visit <a href="http://android-developers.blogspot.com/2011/09/androids-http-clients.html">this webpage</a>
     49  *     for further details.
     50  */
     51 @Deprecated
     52 public class AuthScope {
     53 
     54     /**
     55      * The <tt>null</tt> value represents any host. In the future versions of
     56      * HttpClient the use of this parameter will be discontinued.
     57      */
     58     public static final String ANY_HOST = null;
     59 
     60     /**
     61      * The <tt>-1</tt> value represents any port.
     62      */
     63     public static final int ANY_PORT = -1;
     64 
     65     /**
     66      * The <tt>null</tt> value represents any realm.
     67      */
     68     public static final String ANY_REALM = null;
     69 
     70     /**
     71      * The <tt>null</tt> value represents any authentication scheme.
     72      */
     73     public static final String ANY_SCHEME = null;
     74 
     75     /**
     76      * Default scope matching any host, port, realm and authentication scheme.
     77      * In the future versions of HttpClient the use of this parameter will be
     78      * discontinued.
     79      */
     80     public static final AuthScope ANY = new AuthScope(ANY_HOST, ANY_PORT, ANY_REALM, ANY_SCHEME);
     81 
     82     /** The authentication scheme the credentials apply to. */
     83     private final String scheme;
     84 
     85     /** The realm the credentials apply to. */
     86     private final String realm;
     87 
     88     /** The host the credentials apply to. */
     89     private final String host;
     90 
     91     /** The port the credentials apply to. */
     92     private final int port;
     93 
     94     /** Creates a new credentials scope for the given
     95      * <tt>host</tt>, <tt>port</tt>, <tt>realm</tt>, and
     96      * <tt>authentication scheme</tt>.
     97      *
     98      * @param host the host the credentials apply to. May be set
     99      *   to <tt>null</tt> if credenticals are applicable to
    100      *   any host.
    101      * @param port the port the credentials apply to. May be set
    102      *   to negative value if credenticals are applicable to
    103      *   any port.
    104      * @param realm the realm the credentials apply to. May be set
    105      *   to <tt>null</tt> if credenticals are applicable to
    106      *   any realm.
    107      * @param scheme the authentication scheme the credentials apply to.
    108      *   May be set to <tt>null</tt> if credenticals are applicable to
    109      *   any authentication scheme.
    110      */
    111     public AuthScope(final String host, int port,
    112         final String realm, final String scheme)
    113     {
    114         this.host =   (host == null)   ? ANY_HOST: host.toLowerCase(Locale.ENGLISH);
    115         this.port =   (port < 0)       ? ANY_PORT: port;
    116         this.realm =  (realm == null)  ? ANY_REALM: realm;
    117         this.scheme = (scheme == null) ? ANY_SCHEME: scheme.toUpperCase(Locale.ENGLISH);
    118     }
    119 
    120     /** Creates a new credentials scope for the given
    121      * <tt>host</tt>, <tt>port</tt>, <tt>realm</tt>, and any
    122      * authentication scheme.
    123      *
    124      * @param host the host the credentials apply to. May be set
    125      *   to <tt>null</tt> if credenticals are applicable to
    126      *   any host.
    127      * @param port the port the credentials apply to. May be set
    128      *   to negative value if credenticals are applicable to
    129      *   any port.
    130      * @param realm the realm the credentials apply to. May be set
    131      *   to <tt>null</tt> if credenticals are applicable to
    132      *   any realm.
    133      */
    134     public AuthScope(final String host, int port, final String realm) {
    135         this(host, port, realm, ANY_SCHEME);
    136     }
    137 
    138     /** Creates a new credentials scope for the given
    139      * <tt>host</tt>, <tt>port</tt>, any realm name, and any
    140      * authentication scheme.
    141      *
    142      * @param host the host the credentials apply to. May be set
    143      *   to <tt>null</tt> if credenticals are applicable to
    144      *   any host.
    145      * @param port the port the credentials apply to. May be set
    146      *   to negative value if credenticals are applicable to
    147      *   any port.
    148      */
    149     public AuthScope(final String host, int port) {
    150         this(host, port, ANY_REALM, ANY_SCHEME);
    151     }
    152 
    153     /**
    154      * Creates a copy of the given credentials scope.
    155      */
    156     public AuthScope(final AuthScope authscope) {
    157         super();
    158         if (authscope == null) {
    159             throw new IllegalArgumentException("Scope may not be null");
    160         }
    161         this.host = authscope.getHost();
    162         this.port = authscope.getPort();
    163         this.realm = authscope.getRealm();
    164         this.scheme = authscope.getScheme();
    165     }
    166 
    167     /**
    168      * @return the host
    169      */
    170     public String getHost() {
    171         return this.host;
    172     }
    173 
    174     /**
    175      * @return the port
    176      */
    177     public int getPort() {
    178         return this.port;
    179     }
    180 
    181     /**
    182      * @return the realm name
    183      */
    184     public String getRealm() {
    185         return this.realm;
    186     }
    187 
    188     /**
    189      * @return the scheme type
    190      */
    191     public String getScheme() {
    192         return this.scheme;
    193     }
    194 
    195     /**
    196      * Tests if the authentication scopes match.
    197      *
    198      * @return the match factor. Negative value signifies no match.
    199      *    Non-negative signifies a match. The greater the returned value
    200      *    the closer the match.
    201      */
    202     public int match(final AuthScope that) {
    203         int factor = 0;
    204         if (LangUtils.equals(this.scheme, that.scheme)) {
    205             factor += 1;
    206         } else {
    207             if (this.scheme != ANY_SCHEME && that.scheme != ANY_SCHEME) {
    208                 return -1;
    209             }
    210         }
    211         if (LangUtils.equals(this.realm, that.realm)) {
    212             factor += 2;
    213         } else {
    214             if (this.realm != ANY_REALM && that.realm != ANY_REALM) {
    215                 return -1;
    216             }
    217         }
    218         if (this.port == that.port) {
    219             factor += 4;
    220         } else {
    221             if (this.port != ANY_PORT && that.port != ANY_PORT) {
    222                 return -1;
    223             }
    224         }
    225         if (LangUtils.equals(this.host, that.host)) {
    226             factor += 8;
    227         } else {
    228             if (this.host != ANY_HOST && that.host != ANY_HOST) {
    229                 return -1;
    230             }
    231         }
    232         return factor;
    233     }
    234 
    235     /**
    236      * @see java.lang.Object#equals(Object)
    237      */
    238     @Override
    239     public boolean equals(Object o) {
    240         if (o == null) {
    241             return false;
    242         }
    243         if (o == this) {
    244             return true;
    245         }
    246         if (!(o instanceof AuthScope)) {
    247             return super.equals(o);
    248         }
    249         AuthScope that = (AuthScope) o;
    250         return
    251         LangUtils.equals(this.host, that.host)
    252           && this.port == that.port
    253           && LangUtils.equals(this.realm, that.realm)
    254           && LangUtils.equals(this.scheme, that.scheme);
    255     }
    256 
    257     /**
    258      * @see java.lang.Object#toString()
    259      */
    260     @Override
    261     public String toString() {
    262         StringBuffer buffer = new StringBuffer();
    263         if (this.scheme != null) {
    264             buffer.append(this.scheme.toUpperCase(Locale.ENGLISH));
    265             buffer.append(' ');
    266         }
    267         if (this.realm != null) {
    268             buffer.append('\'');
    269             buffer.append(this.realm);
    270             buffer.append('\'');
    271         } else {
    272             buffer.append("<any realm>");
    273         }
    274         if (this.host != null) {
    275             buffer.append('@');
    276             buffer.append(this.host);
    277             if (this.port >= 0) {
    278                 buffer.append(':');
    279                 buffer.append(this.port);
    280             }
    281         }
    282         return buffer.toString();
    283     }
    284 
    285     /**
    286      * @see java.lang.Object#hashCode()
    287      */
    288     @Override
    289     public int hashCode() {
    290         int hash = LangUtils.HASH_SEED;
    291         hash = LangUtils.hashCode(hash, this.host);
    292         hash = LangUtils.hashCode(hash, this.port);
    293         hash = LangUtils.hashCode(hash, this.realm);
    294         hash = LangUtils.hashCode(hash, this.scheme);
    295         return hash;
    296     }
    297 }
    298