com.github.sardine.AuthenticationTest.java Source code

Java tutorial

Introduction

Here is the source code for com.github.sardine.AuthenticationTest.java

Source

/*
 * 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()));
    }
}