1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 package org.apache.http.impl.client;
29
30 import java.util.Arrays;
31 import java.util.Collection;
32 import java.util.Collections;
33 import java.util.HashMap;
34 import java.util.List;
35 import java.util.Locale;
36 import java.util.Map;
37
38 import org.apache.commons.logging.Log;
39 import org.apache.commons.logging.LogFactory;
40 import org.apache.http.FormattedHeader;
41 import org.apache.http.Header;
42 import org.apache.http.HttpResponse;
43 import org.apache.http.annotation.Immutable;
44 import org.apache.http.auth.AuthScheme;
45 import org.apache.http.auth.AuthSchemeRegistry;
46 import org.apache.http.auth.AuthenticationException;
47 import org.apache.http.auth.MalformedChallengeException;
48 import org.apache.http.client.AuthenticationHandler;
49 import org.apache.http.client.AuthenticationStrategy;
50 import org.apache.http.client.params.AuthPolicy;
51 import org.apache.http.client.protocol.ClientContext;
52 import org.apache.http.protocol.HTTP;
53 import org.apache.http.protocol.HttpContext;
54 import org.apache.http.util.CharArrayBuffer;
55
56
57
58
59
60
61
62
63 @Deprecated
64 @Immutable
65 public abstract class AbstractAuthenticationHandler implements AuthenticationHandler {
66
67 private final Log log = LogFactory.getLog(getClass());
68
69 private static final List<String> DEFAULT_SCHEME_PRIORITY =
70 Collections.unmodifiableList(Arrays.asList(new String[] {
71 AuthPolicy.SPNEGO,
72 AuthPolicy.NTLM,
73 AuthPolicy.DIGEST,
74 AuthPolicy.BASIC
75 }));
76
77 public AbstractAuthenticationHandler() {
78 super();
79 }
80
81 protected Map<String, Header> parseChallenges(
82 final Header[] headers) throws MalformedChallengeException {
83
84 Map<String, Header> map = new HashMap<String, Header>(headers.length);
85 for (Header header : headers) {
86 CharArrayBuffer buffer;
87 int pos;
88 if (header instanceof FormattedHeader) {
89 buffer = ((FormattedHeader) header).getBuffer();
90 pos = ((FormattedHeader) header).getValuePos();
91 } else {
92 String s = header.getValue();
93 if (s == null) {
94 throw new MalformedChallengeException("Header value is null");
95 }
96 buffer = new CharArrayBuffer(s.length());
97 buffer.append(s);
98 pos = 0;
99 }
100 while (pos < buffer.length() && HTTP.isWhitespace(buffer.charAt(pos))) {
101 pos++;
102 }
103 int beginIndex = pos;
104 while (pos < buffer.length() && !HTTP.isWhitespace(buffer.charAt(pos))) {
105 pos++;
106 }
107 int endIndex = pos;
108 String s = buffer.substring(beginIndex, endIndex);
109 map.put(s.toLowerCase(Locale.US), header);
110 }
111 return map;
112 }
113
114
115
116
117
118
119 protected List<String> getAuthPreferences() {
120 return DEFAULT_SCHEME_PRIORITY;
121 }
122
123
124
125
126
127
128
129
130
131
132 protected List<String> getAuthPreferences(
133 final HttpResponse response,
134 final HttpContext context) {
135 return getAuthPreferences();
136 }
137
138 public AuthScheme selectScheme(
139 final Map<String, Header> challenges,
140 final HttpResponse response,
141 final HttpContext context) throws AuthenticationException {
142
143 AuthSchemeRegistry registry = (AuthSchemeRegistry) context.getAttribute(
144 ClientContext.AUTHSCHEME_REGISTRY);
145 if (registry == null) {
146 throw new IllegalStateException("AuthScheme registry not set in HTTP context");
147 }
148
149 Collection<String> authPrefs = getAuthPreferences(response, context);
150 if (authPrefs == null) {
151 authPrefs = DEFAULT_SCHEME_PRIORITY;
152 }
153
154 if (this.log.isDebugEnabled()) {
155 this.log.debug("Authentication schemes in the order of preference: "
156 + authPrefs);
157 }
158
159 AuthScheme authScheme = null;
160 for (String id: authPrefs) {
161 Header challenge = challenges.get(id.toLowerCase(Locale.ENGLISH));
162
163 if (challenge != null) {
164 if (this.log.isDebugEnabled()) {
165 this.log.debug(id + " authentication scheme selected");
166 }
167 try {
168 authScheme = registry.getAuthScheme(id, response.getParams());
169 break;
170 } catch (IllegalStateException e) {
171 if (this.log.isWarnEnabled()) {
172 this.log.warn("Authentication scheme " + id + " not supported");
173
174 }
175 }
176 } else {
177 if (this.log.isDebugEnabled()) {
178 this.log.debug("Challenge for " + id + " authentication scheme not available");
179
180 }
181 }
182 }
183 if (authScheme == null) {
184
185 throw new AuthenticationException(
186 "Unable to respond to any of these challenges: "
187 + challenges);
188 }
189 return authScheme;
190 }
191
192 }