1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.impl.wsdl.submit.filters;
14
15 import java.io.IOException;
16
17 import org.apache.commons.httpclient.Credentials;
18 import org.apache.commons.httpclient.HttpClient;
19 import org.apache.commons.httpclient.HttpState;
20 import org.apache.commons.httpclient.NTCredentials;
21 import org.apache.commons.httpclient.UsernamePasswordCredentials;
22 import org.apache.commons.httpclient.auth.AuthScheme;
23 import org.apache.commons.httpclient.auth.AuthScope;
24 import org.apache.commons.httpclient.auth.CredentialsNotAvailableException;
25 import org.apache.commons.httpclient.auth.CredentialsProvider;
26 import org.apache.commons.httpclient.auth.NTLMScheme;
27 import org.apache.commons.httpclient.auth.RFC2617Scheme;
28 import org.apache.log4j.Logger;
29
30 import com.eviware.soapui.impl.wsdl.WsdlRequest;
31 import com.eviware.soapui.impl.wsdl.submit.RequestFilter;
32 import com.eviware.soapui.impl.wsdl.submit.transports.http.BaseHttpRequestTransport;
33 import com.eviware.soapui.impl.wsdl.submit.transports.http.TimeablePostMethod;
34 import com.eviware.soapui.model.iface.SubmitContext;
35 import com.eviware.soapui.model.settings.Settings;
36 import com.eviware.soapui.settings.HttpSettings;
37
38 /***
39 * RequestFilter for setting preemptive authentication and related credentials
40 */
41
42 public class HttpAuthenticationRequestFilter implements RequestFilter
43 {
44 public void filterRequest(SubmitContext context, WsdlRequest wsdlRequest)
45 {
46 String username = PropertyExpansionRequestFilter.expandProperties( context, wsdlRequest.getUsername());
47
48
49 if( username == null || username.length() == 0 )
50 return;
51
52 Settings settings = wsdlRequest.getSettings();
53 String password =PropertyExpansionRequestFilter.expandProperties( context, wsdlRequest.getPassword() );
54 String domain = PropertyExpansionRequestFilter.expandProperties( context, wsdlRequest.getDomain() );
55
56 initRequestCredentials( context, username, settings, password, domain );
57 }
58
59 public static void initRequestCredentials( SubmitContext context, String username, Settings settings, String password, String domain )
60 {
61 HttpClient httpClient = (HttpClient) context.getProperty( BaseHttpRequestTransport.HTTP_CLIENT );
62
63
64 if (settings.getBoolean(HttpSettings.AUTHENTICATE_PREEMPTIVELY))
65 {
66 httpClient.getParams().setAuthenticationPreemptive(true);
67 HttpState state = (HttpState) context.getProperty( SubmitContext.HTTP_STATE_PROPERTY );
68
69 if( state != null )
70 {
71 Credentials defaultcreds = new UsernamePasswordCredentials(username, password);
72 state.setCredentials(AuthScope.ANY, defaultcreds);
73 }
74 }
75 else
76 {
77 httpClient.getParams().setAuthenticationPreemptive(false);
78 }
79
80 TimeablePostMethod postMethod = (TimeablePostMethod) context.getProperty( BaseHttpRequestTransport.POST_METHOD );
81
82 postMethod.getParams().setParameter(CredentialsProvider.PROVIDER,
83 new UPDCredentialsProvider( username, password, domain ));
84
85 postMethod.setDoAuthentication(true);
86 }
87
88 public static class UPDCredentialsProvider implements CredentialsProvider
89 {
90 private boolean checkedCredentials;
91 private final static Logger logger = Logger.getLogger(WsdlRequestCredentialsProvider.class);
92 private final String username;
93 private final String password;
94 private final String domain;
95
96 public UPDCredentialsProvider(String username, String password, String domain)
97 {
98 this.username = username;
99 this.password = password;
100 this.domain = domain;
101 }
102
103 public Credentials getCredentials(final AuthScheme authscheme, final String host, int port, boolean proxy)
104 throws CredentialsNotAvailableException
105 {
106 if (checkedCredentials)
107 throw new CredentialsNotAvailableException("Missing valid credentials");
108
109 if (authscheme == null)
110 {
111 return null;
112 }
113 try
114 {
115 if (authscheme instanceof NTLMScheme)
116 {
117 logger.info(host + ":" + port + " requires Windows authentication");
118 return new NTCredentials(username, password, host, domain );
119 }
120 else if (authscheme instanceof RFC2617Scheme)
121 {
122 logger.info(host + ":" + port + " requires authentication with the realm '" + authscheme.getRealm() + "'");
123 return new UsernamePasswordCredentials(username, password);
124 }
125 else
126 {
127 throw new CredentialsNotAvailableException("Unsupported authentication scheme: "
128 + authscheme.getSchemeName());
129 }
130 }
131 catch (IOException e)
132 {
133 throw new CredentialsNotAvailableException(e.getMessage(), e);
134 }
135 finally
136 {
137 checkedCredentials = true;
138 }
139 }
140 }
141 }