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
31package org.apache.http.auth;
32
33import java.util.Locale;
34
35import 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 * @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
52public 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