• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * $HeadURL: http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/module-client/src/main/java/org/apache/http/impl/auth/NTLMScheme.java $
3  * $Revision: 655048 $
4  * $Date: 2008-05-10 04:22:12 -0700 (Sat, 10 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 
31 package org.apache.http.impl.auth;
32 
33 import org.apache.http.Header;
34 import org.apache.http.HttpRequest;
35 import org.apache.http.auth.AUTH;
36 import org.apache.http.auth.AuthenticationException;
37 import org.apache.http.auth.Credentials;
38 import org.apache.http.auth.InvalidCredentialsException;
39 import org.apache.http.auth.MalformedChallengeException;
40 import org.apache.http.auth.NTCredentials;
41 import org.apache.http.impl.auth.AuthSchemeBase;
42 import org.apache.http.message.BufferedHeader;
43 import org.apache.http.util.CharArrayBuffer;
44 /**
45  * @deprecated Please use {@link java.net.URL#openConnection} instead.
46  *     Please visit <a href="http://android-developers.blogspot.com/2011/09/androids-http-clients.html">this webpage</a>
47  *     for further details.
48 */
49 
50 @Deprecated
51 public class NTLMScheme extends AuthSchemeBase {
52 
53     enum State {
54         UNINITIATED,
55         CHALLENGE_RECEIVED,
56         MSG_TYPE1_GENERATED,
57         MSG_TYPE2_RECEVIED,
58         MSG_TYPE3_GENERATED,
59         FAILED,
60     }
61 
62     private final NTLMEngine engine;
63 
64     private State state;
65     private String challenge;
66 
NTLMScheme(final NTLMEngine engine)67     public NTLMScheme(final NTLMEngine engine) {
68         super();
69         if (engine == null) {
70             throw new IllegalArgumentException("NTLM engine may not be null");
71         }
72         this.engine = engine;
73         this.state = State.UNINITIATED;
74         this.challenge = null;
75     }
76 
getSchemeName()77     public String getSchemeName() {
78         return "ntlm";
79     }
80 
getParameter(String name)81     public String getParameter(String name) {
82         // String parameters not supported
83         return null;
84     }
85 
getRealm()86     public String getRealm() {
87         // NTLM does not support the concept of an authentication realm
88         return null;
89     }
90 
isConnectionBased()91     public boolean isConnectionBased() {
92         return true;
93     }
94 
95     @Override
parseChallenge( final CharArrayBuffer buffer, int pos, int len)96     protected void parseChallenge(
97             final CharArrayBuffer buffer, int pos, int len) throws MalformedChallengeException {
98         String challenge = buffer.substringTrimmed(pos, len);
99         if (challenge.length() == 0) {
100             if (this.state == State.UNINITIATED) {
101                 this.state = State.CHALLENGE_RECEIVED;
102             } else {
103                 this.state = State.FAILED;
104             }
105             this.challenge = null;
106         } else {
107             this.state = State.MSG_TYPE2_RECEVIED;
108             this.challenge = challenge;
109         }
110     }
111 
authenticate( final Credentials credentials, final HttpRequest request)112     public Header authenticate(
113             final Credentials credentials,
114             final HttpRequest request) throws AuthenticationException {
115         NTCredentials ntcredentials = null;
116         try {
117             ntcredentials = (NTCredentials) credentials;
118         } catch (ClassCastException e) {
119             throw new InvalidCredentialsException(
120              "Credentials cannot be used for NTLM authentication: "
121               + credentials.getClass().getName());
122         }
123         String response = null;
124         if (this.state == State.CHALLENGE_RECEIVED || this.state == State.FAILED) {
125             response = this.engine.generateType1Msg(
126                     ntcredentials.getDomain(),
127                     ntcredentials.getWorkstation());
128             this.state = State.MSG_TYPE1_GENERATED;
129         } else if (this.state == State.MSG_TYPE2_RECEVIED) {
130             response = this.engine.generateType3Msg(
131                     ntcredentials.getUserName(),
132                     ntcredentials.getPassword(),
133                     ntcredentials.getDomain(),
134                     ntcredentials.getWorkstation(),
135                     this.challenge);
136             this.state = State.MSG_TYPE3_GENERATED;
137         } else {
138             throw new AuthenticationException("Unexpected state: " + this.state);
139         }
140         CharArrayBuffer buffer = new CharArrayBuffer(32);
141         if (isProxy()) {
142             buffer.append(AUTH.PROXY_AUTH_RESP);
143         } else {
144             buffer.append(AUTH.WWW_AUTH_RESP);
145         }
146         buffer.append(": NTLM ");
147         buffer.append(response);
148         return new BufferedHeader(buffer);
149     }
150 
isComplete()151     public boolean isComplete() {
152         return this.state == State.MSG_TYPE3_GENERATED || this.state == State.FAILED;
153     }
154 
155 }
156