• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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@intencha.com">Adrian Sutton</a>
44  *
45  * @since 4.0
46  */
47 public class AuthScope {
48 
49     /**
50      * The <tt>null</tt> value represents any host. In the future versions of
51      * HttpClient the use of this parameter will be discontinued.
52      */
53     public static final String ANY_HOST = null;
54 
55     /**
56      * The <tt>-1</tt> value represents any port.
57      */
58     public static final int ANY_PORT = -1;
59 
60     /**
61      * The <tt>null</tt> value represents any realm.
62      */
63     public static final String ANY_REALM = null;
64 
65     /**
66      * The <tt>null</tt> value represents any authentication scheme.
67      */
68     public static final String ANY_SCHEME = null;
69 
70     /**
71      * Default scope matching any host, port, realm and authentication scheme.
72      * In the future versions of HttpClient the use of this parameter will be
73      * discontinued.
74      */
75     public static final AuthScope ANY = new AuthScope(ANY_HOST, ANY_PORT, ANY_REALM, ANY_SCHEME);
76 
77     /** The authentication scheme the credentials apply to. */
78     private final String scheme;
79 
80     /** The realm the credentials apply to. */
81     private final String realm;
82 
83     /** The host the credentials apply to. */
84     private final String host;
85 
86     /** The port the credentials apply to. */
87     private final int port;
88 
89     /** Creates a new credentials scope for the given
90      * <tt>host</tt>, <tt>port</tt>, <tt>realm</tt>, and
91      * <tt>authentication scheme</tt>.
92      *
93      * @param host the host the credentials apply to. May be set
94      *   to <tt>null</tt> if credenticals are applicable to
95      *   any host.
96      * @param port the port the credentials apply to. May be set
97      *   to negative value if credenticals are applicable to
98      *   any port.
99      * @param realm the realm the credentials apply to. May be set
100      *   to <tt>null</tt> if credenticals are applicable to
101      *   any realm.
102      * @param scheme the authentication scheme the credentials apply to.
103      *   May be set to <tt>null</tt> if credenticals are applicable to
104      *   any authentication scheme.
105      */
AuthScope(final String host, int port, final String realm, final String scheme)106     public AuthScope(final String host, int port,
107         final String realm, final String scheme)
108     {
109         this.host =   (host == null)   ? ANY_HOST: host.toLowerCase(Locale.ENGLISH);
110         this.port =   (port < 0)       ? ANY_PORT: port;
111         this.realm =  (realm == null)  ? ANY_REALM: realm;
112         this.scheme = (scheme == null) ? ANY_SCHEME: scheme.toUpperCase(Locale.ENGLISH);
113     }
114 
115     /** Creates a new credentials scope for the given
116      * <tt>host</tt>, <tt>port</tt>, <tt>realm</tt>, and any
117      * authentication scheme.
118      *
119      * @param host the host the credentials apply to. May be set
120      *   to <tt>null</tt> if credenticals are applicable to
121      *   any host.
122      * @param port the port the credentials apply to. May be set
123      *   to negative value if credenticals are applicable to
124      *   any port.
125      * @param realm the realm the credentials apply to. May be set
126      *   to <tt>null</tt> if credenticals are applicable to
127      *   any realm.
128      */
AuthScope(final String host, int port, final String realm)129     public AuthScope(final String host, int port, final String realm) {
130         this(host, port, realm, ANY_SCHEME);
131     }
132 
133     /** Creates a new credentials scope for the given
134      * <tt>host</tt>, <tt>port</tt>, any realm name, and any
135      * authentication scheme.
136      *
137      * @param host the host the credentials apply to. May be set
138      *   to <tt>null</tt> if credenticals are applicable to
139      *   any host.
140      * @param port the port the credentials apply to. May be set
141      *   to negative value if credenticals are applicable to
142      *   any port.
143      */
AuthScope(final String host, int port)144     public AuthScope(final String host, int port) {
145         this(host, port, ANY_REALM, ANY_SCHEME);
146     }
147 
148     /**
149      * Creates a copy of the given credentials scope.
150      */
AuthScope(final AuthScope authscope)151     public AuthScope(final AuthScope authscope) {
152         super();
153         if (authscope == null) {
154             throw new IllegalArgumentException("Scope may not be null");
155         }
156         this.host = authscope.getHost();
157         this.port = authscope.getPort();
158         this.realm = authscope.getRealm();
159         this.scheme = authscope.getScheme();
160     }
161 
162     /**
163      * @return the host
164      */
getHost()165     public String getHost() {
166         return this.host;
167     }
168 
169     /**
170      * @return the port
171      */
getPort()172     public int getPort() {
173         return this.port;
174     }
175 
176     /**
177      * @return the realm name
178      */
getRealm()179     public String getRealm() {
180         return this.realm;
181     }
182 
183     /**
184      * @return the scheme type
185      */
getScheme()186     public String getScheme() {
187         return this.scheme;
188     }
189 
190     /**
191      * Tests if the authentication scopes match.
192      *
193      * @return the match factor. Negative value signifies no match.
194      *    Non-negative signifies a match. The greater the returned value
195      *    the closer the match.
196      */
match(final AuthScope that)197     public int match(final AuthScope that) {
198         int factor = 0;
199         if (LangUtils.equals(this.scheme, that.scheme)) {
200             factor += 1;
201         } else {
202             if (this.scheme != ANY_SCHEME && that.scheme != ANY_SCHEME) {
203                 return -1;
204             }
205         }
206         if (LangUtils.equals(this.realm, that.realm)) {
207             factor += 2;
208         } else {
209             if (this.realm != ANY_REALM && that.realm != ANY_REALM) {
210                 return -1;
211             }
212         }
213         if (this.port == that.port) {
214             factor += 4;
215         } else {
216             if (this.port != ANY_PORT && that.port != ANY_PORT) {
217                 return -1;
218             }
219         }
220         if (LangUtils.equals(this.host, that.host)) {
221             factor += 8;
222         } else {
223             if (this.host != ANY_HOST && that.host != ANY_HOST) {
224                 return -1;
225             }
226         }
227         return factor;
228     }
229 
230     /**
231      * @see java.lang.Object#equals(Object)
232      */
233     @Override
equals(Object o)234     public boolean equals(Object o) {
235         if (o == null) {
236             return false;
237         }
238         if (o == this) {
239             return true;
240         }
241         if (!(o instanceof AuthScope)) {
242             return super.equals(o);
243         }
244         AuthScope that = (AuthScope) o;
245         return
246         LangUtils.equals(this.host, that.host)
247           && this.port == that.port
248           && LangUtils.equals(this.realm, that.realm)
249           && LangUtils.equals(this.scheme, that.scheme);
250     }
251 
252     /**
253      * @see java.lang.Object#toString()
254      */
255     @Override
toString()256     public String toString() {
257         StringBuffer buffer = new StringBuffer();
258         if (this.scheme != null) {
259             buffer.append(this.scheme.toUpperCase(Locale.ENGLISH));
260             buffer.append(' ');
261         }
262         if (this.realm != null) {
263             buffer.append('\'');
264             buffer.append(this.realm);
265             buffer.append('\'');
266         } else {
267             buffer.append("<any realm>");
268         }
269         if (this.host != null) {
270             buffer.append('@');
271             buffer.append(this.host);
272             if (this.port >= 0) {
273                 buffer.append(':');
274                 buffer.append(this.port);
275             }
276         }
277         return buffer.toString();
278     }
279 
280     /**
281      * @see java.lang.Object#hashCode()
282      */
283     @Override
hashCode()284     public int hashCode() {
285         int hash = LangUtils.HASH_SEED;
286         hash = LangUtils.hashCode(hash, this.host);
287         hash = LangUtils.hashCode(hash, this.port);
288         hash = LangUtils.hashCode(hash, this.realm);
289         hash = LangUtils.hashCode(hash, this.scheme);
290         return hash;
291     }
292 }
293