Java tutorial
/* * Copyright 2009-2011 Jon Stevens et al. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.github.sardine; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.IOException; import java.net.URI; import java.security.Principal; import java.util.List; import java.util.Properties; import java.util.concurrent.CountDownLatch; import org.apache.http.HttpException; import org.apache.http.HttpHeaders; import org.apache.http.HttpRequest; import org.apache.http.HttpRequestInterceptor; import org.apache.http.auth.AuthScope; import org.apache.http.auth.BasicUserPrincipal; import org.apache.http.auth.Credentials; import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.protocol.HttpContext; import org.junit.Before; import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import com.github.sardine.impl.SardineException; import com.github.sardine.impl.SardineImpl; /** * @version $Id:$ */ public class AuthenticationTest { private static final String TEST_PROPERTIES_FILENAME = "test.properties"; protected Properties properties; @Rule public ExpectedException thrown = ExpectedException.none(); @Before public void properties() throws Exception { thrown.expect(NullPointerException.class); properties = new Properties(); properties.load(ClassLoader.getSystemResourceAsStream(TEST_PROPERTIES_FILENAME)); } @Test public void testBasicAuth() throws Exception { Sardine sardine = SardineFactory.begin(properties.getProperty("username"), properties.getProperty("password")); try { URI url = URI.create("http://sudo.ch/dav/basic/"); final List<DavResource> resources = sardine.list(url.toString()); assertNotNull(resources); assertFalse(resources.isEmpty()); } catch (SardineException e) { fail(e.getMessage()); } } @Test public void testDigestAuth() throws Exception { Sardine sardine = SardineFactory.begin(properties.getProperty("username"), properties.getProperty("password")); try { URI url = URI.create("http://sudo.ch/dav/digest/"); final List<DavResource> resources = sardine.list(url.toString()); assertNotNull(resources); assertFalse(resources.isEmpty()); } catch (SardineException e) { fail(e.getMessage()); } } @Test public void testDigestAuthWithBasicPreemptive() throws Exception { Sardine sardine = SardineFactory.begin(properties.getProperty("username"), properties.getProperty("password")); URI url = URI.create("http://sudo.ch/dav/digest/"); sardine.enablePreemptiveAuthentication(url.getHost()); try { sardine.list(url.toString()); fail("Expected authentication to fail"); } catch (SardineException e) { // Preemptive basic authentication is expected to fail when no basic // method is returned in Authentication response header } } @Test public void testDigestAuthWithBasicPreemptiveAuthenticationEnabled() throws Exception { Sardine sardine = SardineFactory.begin(properties.getProperty("username"), properties.getProperty("password")); try { URI url = URI.create("http://sudo.ch/dav/digest/"); sardine.enablePreemptiveAuthentication(url.getHost()); sardine.list(url.toString()); fail("Expected authentication to fail becuase of preemptive credential cache"); } catch (SardineException e) { // If preemptive basic authentication is enabled, we cannot login // with digest authentication. This is currently expected. assertEquals(401, e.getStatusCode()); } } @Test @Ignore public void testNtlmAuth() throws Exception { fail("Need a NTLM enabled WebDAV server for testing"); } @Test public void testBasicPreemptiveAuth() throws Exception { final HttpClientBuilder client = HttpClientBuilder.create(); final CountDownLatch count = new CountDownLatch(1); client.setDefaultCredentialsProvider(new BasicCredentialsProvider() { @Override public Credentials getCredentials(AuthScope authscope) { // Set flag that credentials have been used indicating preemptive authentication count.countDown(); return new Credentials() { public Principal getUserPrincipal() { return new BasicUserPrincipal("anonymous"); } public String getPassword() { return "invalid"; } }; } }); SardineImpl sardine = new SardineImpl(client); URI url = URI.create("http://sudo.ch/dav/basic/"); //Send basic authentication header in initial request sardine.enablePreemptiveAuthentication(url.getHost()); try { sardine.list(url.toString()); fail("Expected authorization failure"); } catch (SardineException e) { // Expect Authorization Failed assertEquals(401, e.getStatusCode()); // Make sure credentials have been queried assertEquals("No preemptive authentication attempt", 0, count.getCount()); } } @Test public void testBasicPreemptiveAuthHeader() throws Exception { final HttpClientBuilder client = HttpClientBuilder.create(); client.addInterceptorFirst(new HttpRequestInterceptor() { public void process(final HttpRequest r, final HttpContext context) throws HttpException, IOException { assertNotNull(r.getHeaders(HttpHeaders.AUTHORIZATION)); assertEquals(1, r.getHeaders(HttpHeaders.AUTHORIZATION).length); } }); Sardine sardine = new SardineImpl(client); sardine.setCredentials("anonymous", null); // mod_dav supports Range headers for PUT final URI url = URI.create("http://sardine.googlecode.com/svn/trunk/README.html"); sardine.enablePreemptiveAuthentication(url.getHost()); assertTrue(sardine.exists(url.toString())); } }