1069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project/* 2069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * $HeadURL: http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/module-client/src/main/java/org/apache/http/auth/NTCredentials.java $ 3069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * $Revision: 658430 $ 4069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * $Date: 2008-05-20 14:04:27 -0700 (Tue, 20 May 2008) $ 5069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 6069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * ==================================================================== 7069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 8069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 9069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 10069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * this work for additional information regarding copyright ownership. 11069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 12069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * (the "License"); you may not use this file except in compliance with 13069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * the License. You may obtain a copy of the License at 14069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 15069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 16069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 17069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 18069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 19069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 20069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * See the License for the specific language governing permissions and 21069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * limitations under the License. 22069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * ==================================================================== 23069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 24069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * This software consists of voluntary contributions made by many 25069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * individuals on behalf of the Apache Software Foundation. For more 26069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * information on the Apache Software Foundation, please see 27069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * <http://www.apache.org/>. 28069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 29069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 30069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 31069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectpackage org.apache.http.auth; 32069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 33069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport java.security.Principal; 34069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport java.util.Locale; 35069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 36069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.http.util.LangUtils; 37069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 38069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project/** {@link Credentials} specific to the Windows platform. 39069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 40069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @author <a href="mailto:adrian@ephox.com">Adrian Sutton</a> 41069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @author <a href="mailto:mbowler@GargoyleSoftware.com">Mike Bowler</a> 42069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @author <a href="mailto:oleg at ural.ru">Oleg Kalnichevski</a> 43069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 44069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @since 2.0 45069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 46069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectpublic class NTCredentials implements Credentials { 47069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 48069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** The user principal */ 49069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project private final NTUserPrincipal principal; 50069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 51069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** Password */ 52069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project private final String password; 53069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 54069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** The host the authentication request is originating from. */ 55069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project private final String workstation; 56069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 57069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** 58069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * The constructor with the fully qualified username and password combined 59069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * string argument. 60069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 61069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @param usernamePassword the domain/username:password formed string 62069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 63069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public NTCredentials(String usernamePassword) { 64069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project super(); 65069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (usernamePassword == null) { 66069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project throw new IllegalArgumentException("Username:password string may not be null"); 67069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 68069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project String username; 69069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project int atColon = usernamePassword.indexOf(':'); 70069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (atColon >= 0) { 71069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project username = usernamePassword.substring(0, atColon); 72069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project this.password = usernamePassword.substring(atColon + 1); 73069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } else { 74069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project username = usernamePassword; 75069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project this.password = null; 76069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 77069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project int atSlash = username.indexOf('/'); 78069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (atSlash >= 0) { 79069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project this.principal = new NTUserPrincipal( 80069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project username.substring(0, atSlash).toUpperCase(Locale.ENGLISH), 81069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project username.substring(atSlash + 1)); 82069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } else { 83069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project this.principal = new NTUserPrincipal( 84069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project null, 85069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project username.substring(atSlash + 1)); 86069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 87069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project this.workstation = null; 88069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 89069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 90069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** 91069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Constructor. 92069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @param userName The user name. This should not include the domain to authenticate with. 93069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * For example: "user" is correct whereas "DOMAIN\\user" is not. 94069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @param password The password. 95069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @param workstation The workstation the authentication request is originating from. 96069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Essentially, the computer name for this machine. 97069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @param domain The domain to authenticate within. 98069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 99069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public NTCredentials( 100069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project final String userName, 101069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project final String password, 102069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project final String workstation, 103069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project final String domain) { 104069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project super(); 105069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (userName == null) { 106069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project throw new IllegalArgumentException("User name may not be null"); 107069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 108069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project this.principal = new NTUserPrincipal(domain, userName); 109069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project this.password = password; 110069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (workstation != null) { 111069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project this.workstation = workstation.toUpperCase(Locale.ENGLISH); 112069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } else { 113069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project this.workstation = null; 114069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 115069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 116069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 117069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public Principal getUserPrincipal() { 118069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return this.principal; 119069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 120069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 121069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public String getUserName() { 122069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return this.principal.getUsername(); 123069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 124069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 125069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public String getPassword() { 126069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return this.password; 127069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 128069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 129069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** 130069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Retrieves the name to authenticate with. 131069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 132069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @return String the domain these credentials are intended to authenticate with. 133069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 134069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public String getDomain() { 135069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return this.principal.getDomain(); 136069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 137069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 138069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project /** 139069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Retrieves the workstation name of the computer originating the request. 140069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * 141069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @return String the workstation the user is logged into. 142069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */ 143069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public String getWorkstation() { 144069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return this.workstation; 145069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 146069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 147069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project @Override 148069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public int hashCode() { 149069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project int hash = LangUtils.HASH_SEED; 150069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project hash = LangUtils.hashCode(hash, this.principal); 151069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project hash = LangUtils.hashCode(hash, this.workstation); 152069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return hash; 153069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 154069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 155069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project @Override 156069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public boolean equals(Object o) { 157069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (o == null) return false; 158069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (this == o) return true; 159069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (o instanceof NTCredentials) { 160069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project NTCredentials that = (NTCredentials) o; 161069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project if (LangUtils.equals(this.principal, that.principal) 162069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project && LangUtils.equals(this.workstation, that.workstation)) { 163069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return true; 164069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 165069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 166069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return false; 167069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 168069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 169069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project @Override 170069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project public String toString() { 171069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project StringBuilder buffer = new StringBuilder(); 172069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project buffer.append("[principal: "); 173069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project buffer.append(this.principal); 174069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project buffer.append("][workstation: "); 175069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project buffer.append(this.workstation); 176069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project buffer.append("]"); 177069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project return buffer.toString(); 178069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project } 179069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project 180069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project} 181