18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 217b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner * $HeadURL: http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/module-client/src/main/java/org/apache/http/impl/client/BasicCredentialsProvider.java $ 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * $Revision: 653041 $ 48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * $Date: 2008-05-03 03:39:28 -0700 (Sat, 03 May 2008) $ 58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * ==================================================================== 78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * this work for additional information regarding copyright ownership. 118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (the "License"); you may not use this file except in compliance with 138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * the License. You may obtain a copy of the License at 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 2017b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner * See the License for the specific language governing permissions and 2117b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner * limitations under the License. 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * ==================================================================== 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * This software consists of voluntary contributions made by many 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * individuals on behalf of the Apache Software Foundation. For more 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * information on the Apache Software Foundation, please see 278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * <http://www.apache.org/>. 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpackage org.apache.http.impl.client; 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectimport java.util.HashMap; 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectimport org.apache.http.auth.AuthScope; 3617b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turnerimport org.apache.http.auth.Credentials; 3717b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turnerimport org.apache.http.client.CredentialsProvider; 3817b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/** 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Default implementation of {@link CredentialsProvider} 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * @author <a href="mailto:remm@apache.org">Remy Maucherat</a> 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * @author Rodney Waldhoff 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * @author <a href="mailto:jsdever@apache.org">Jeff Dever</a> 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * @author Sean C. Sullivan 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * @author <a href="mailto:becke@u.washington.edu">Michael Becke</a> 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * @author <a href="mailto:oleg at ural.ru">Oleg Kalnichevski</a> 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * @author <a href="mailto:mbowler@GargoyleSoftware.com">Mike Bowler</a> 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * @author <a href="mailto:adrian@intencha.com">Adrian Sutton</a> 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * @since 4.0 528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 5317b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner * @deprecated Please use {@link java.net.URL#openConnection} instead. 5417b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner * Please visit <a href="http://android-developers.blogspot.com/2011/09/androids-http-clients.html">this webpage</a> 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * for further details. 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project@Deprecated 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic class BasicCredentialsProvider implements CredentialsProvider { 5917b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project private final HashMap<AuthScope, Credentials> credMap; 618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6217b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner /** 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Default constructor. 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project public BasicCredentialsProvider() { 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project super(); 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project this.credMap = new HashMap<AuthScope, Credentials>(); 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /** 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Sets the {@link Credentials credentials} for the given authentication 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * scope. Any previous credentials for the given scope will be overwritten. 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * @param authscope the {@link AuthScope authentication scope} 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * @param credentials the authentication {@link Credentials credentials} 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * for the given scope. 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * @see #getCredentials(AuthScope) 798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project public synchronized void setCredentials( 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project final AuthScope authscope, 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project final Credentials credentials) { 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (authscope == null) { 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project throw new IllegalArgumentException("Authentication scope may not be null"); 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project credMap.put(authscope, credentials); 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /** 908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Find matching {@link Credentials credentials} for the given authentication scope. 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 9217b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner * @param map the credentials hash map 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * @param authscope the {@link AuthScope authentication scope} 9417b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner * @return the credentials 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project private static Credentials matchCredentials( 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project final HashMap<AuthScope, Credentials> map, 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project final AuthScope authscope) { 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // see if we get a direct hit 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Credentials creds = map.get(authscope); 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (creds == null) { 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Nope. 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Do a full scan 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int bestMatchFactor = -1; 10617b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner AuthScope bestMatch = null; 10717b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner for (AuthScope current: map.keySet()) { 10817b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner int factor = authscope.match(current); 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (factor > bestMatchFactor) { 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bestMatchFactor = factor; 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bestMatch = current; 11217b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner } 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (bestMatch != null) { 1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project creds = map.get(bestMatch); 1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return creds; 1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /** 1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Get the {@link Credentials credentials} for the given authentication scope. 12317b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner * 1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * @param authscope the {@link AuthScope authentication scope} 1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * @return the credentials 1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 12717b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner * @see #setCredentials(AuthScope, Credentials) 1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project public synchronized Credentials getCredentials(final AuthScope authscope) { 1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (authscope == null) { 1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project throw new IllegalArgumentException("Authentication scope may not be null"); 1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return matchCredentials(this.credMap, authscope); 1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project @Override 1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project public String toString() { 1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return credMap.toString(); 1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /** 1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Clears all credentials. 1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project public synchronized void clear() { 1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project this.credMap.clear(); 1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 14917b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner