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