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
45d42abb2fd917184764daf22f5f299e848b8701d7Narayan Kamath *
46d42abb2fd917184764daf22f5f299e848b8701d7Narayan Kamath * @deprecated Please use {@link java.net.URL#openConnection} instead.
47d42abb2fd917184764daf22f5f299e848b8701d7Narayan Kamath *     Please visit <a href="http://android-developers.blogspot.com/2011/09/androids-http-clients.html">this webpage</a>
48d42abb2fd917184764daf22f5f299e848b8701d7Narayan Kamath *     for further details.
49069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */
50d42abb2fd917184764daf22f5f299e848b8701d7Narayan Kamath@Deprecated
51069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectpublic class NTCredentials implements Credentials {
52069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
53069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /** The user principal  */
54069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    private final NTUserPrincipal principal;
55069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
56069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /** Password */
57069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    private final String password;
58069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
59069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /** The host the authentication request is originating from.  */
60069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    private final String workstation;
61069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
62069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
63069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * The constructor with the fully qualified username and password combined
64069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * string argument.
65069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
66069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param usernamePassword the domain/username:password formed string
67069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
68069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public NTCredentials(String usernamePassword) {
69069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        super();
70069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (usernamePassword == null) {
71069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            throw new IllegalArgumentException("Username:password string may not be null");
72069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
73069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        String username;
74069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        int atColon = usernamePassword.indexOf(':');
75069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (atColon >= 0) {
76069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            username = usernamePassword.substring(0, atColon);
77069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            this.password = usernamePassword.substring(atColon + 1);
78069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        } else {
79069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            username = usernamePassword;
80069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            this.password = null;
81069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
82069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        int atSlash = username.indexOf('/');
83069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (atSlash >= 0) {
84069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            this.principal = new NTUserPrincipal(
85069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                    username.substring(0, atSlash).toUpperCase(Locale.ENGLISH),
86069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                    username.substring(atSlash + 1));
87069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        } else {
88069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            this.principal = new NTUserPrincipal(
89069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                    null,
90069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                    username.substring(atSlash + 1));
91069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
92069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        this.workstation = null;
93069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
94069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
95069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
96069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Constructor.
97069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param userName The user name.  This should not include the domain to authenticate with.
98069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * For example: "user" is correct whereas "DOMAIN\\user" is not.
99069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param password The password.
100069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param workstation The workstation the authentication request is originating from.
101069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Essentially, the computer name for this machine.
102069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param domain The domain to authenticate within.
103069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
104069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public NTCredentials(
105069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            final String userName,
106069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            final String password,
107069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            final String workstation,
108069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            final String domain) {
109069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        super();
110069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (userName == null) {
111069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            throw new IllegalArgumentException("User name may not be null");
112069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
113069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        this.principal = new NTUserPrincipal(domain, userName);
114069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        this.password = password;
115069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (workstation != null) {
116069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            this.workstation = workstation.toUpperCase(Locale.ENGLISH);
117069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        } else {
118069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            this.workstation = null;
119069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
120069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
121069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
122069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public Principal getUserPrincipal() {
123069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return this.principal;
124069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
125069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
126069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public String getUserName() {
127069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return this.principal.getUsername();
128069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
129069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
130069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public String getPassword() {
131069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return this.password;
132069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
133069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
134069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
135069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Retrieves the name to authenticate with.
136069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
137069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @return String the domain these credentials are intended to authenticate with.
138069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
139069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public String getDomain() {
140069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return this.principal.getDomain();
141069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
142069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
143069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
144069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Retrieves the workstation name of the computer originating the request.
145069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
146069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @return String the workstation the user is logged into.
147069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
148069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public String getWorkstation() {
149069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return this.workstation;
150069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
151069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
152069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    @Override
153069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public int hashCode() {
154069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        int hash = LangUtils.HASH_SEED;
155069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        hash = LangUtils.hashCode(hash, this.principal);
156069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        hash = LangUtils.hashCode(hash, this.workstation);
157069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return hash;
158069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
159069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
160069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    @Override
161069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public boolean equals(Object o) {
162069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (o == null) return false;
163069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (this == o) return true;
164069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (o instanceof NTCredentials) {
165069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            NTCredentials that = (NTCredentials) o;
166069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            if (LangUtils.equals(this.principal, that.principal)
167069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                    && LangUtils.equals(this.workstation, that.workstation)) {
168069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                return true;
169069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            }
170069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
171069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return false;
172069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
173069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
174069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    @Override
175069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public String toString() {
176069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        StringBuilder buffer = new StringBuilder();
177069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        buffer.append("[principal: ");
178069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        buffer.append(this.principal);
179069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        buffer.append("][workstation: ");
180069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        buffer.append(this.workstation);
181069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        buffer.append("]");
182069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return buffer.toString();
183069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
184069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
185069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
186