org.apache.archiva.webdav.RepositoryServletSecurityTest.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.archiva.webdav.RepositoryServletSecurityTest.java

Source

package org.apache.archiva.webdav;

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */

import junit.framework.TestCase;
import net.sf.ehcache.CacheManager;
import org.apache.archiva.configuration.ArchivaConfiguration;
import org.apache.archiva.configuration.Configuration;
import org.apache.archiva.configuration.ManagedRepositoryConfiguration;
import org.apache.archiva.redback.authentication.AuthenticationException;
import org.apache.archiva.redback.authentication.AuthenticationResult;
import org.apache.archiva.redback.authorization.UnauthorizedException;
import org.apache.archiva.redback.integration.filter.authentication.HttpAuthenticator;
import org.apache.archiva.redback.system.DefaultSecuritySession;
import org.apache.archiva.redback.system.SecuritySession;
import org.apache.archiva.redback.users.User;
import org.apache.archiva.redback.users.memory.SimpleUser;
import org.apache.archiva.repository.audit.TestAuditListener;
import org.apache.archiva.security.ServletAuthenticator;
import org.apache.archiva.security.common.ArchivaRoleConstants;
import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
import org.apache.archiva.webdav.util.MavenIndexerCleaner;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.jackrabbit.webdav.DavSessionProvider;
import org.easymock.EasyMock;
import org.easymock.IMocksControl;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.context.ApplicationContext;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.mock.web.MockServletConfig;
import org.springframework.mock.web.MockServletContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.web.context.WebApplicationContext;

import javax.inject.Inject;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

import static org.easymock.EasyMock.anyObject;
import static org.easymock.EasyMock.eq;
import org.junit.Rule;

/**
 * RepositoryServletSecurityTest Test the flow of the authentication and authorization checks. This does not necessarily
 * perform redback security checking.
 */
@RunWith(ArchivaSpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath*:/META-INF/spring-context.xml",
        "classpath*:/spring-context-servlet-security-test.xml" })
public class RepositoryServletSecurityTest extends TestCase {
    protected static final String REPOID_INTERNAL = "internal";

    @Inject
    protected ArchivaConfiguration archivaConfiguration;

    private DavSessionProvider davSessionProvider;

    private IMocksControl servletAuthControl;

    private ServletAuthenticator servletAuth;

    private IMocksControl httpAuthControl;

    private HttpAuthenticator httpAuth;

    private RepositoryServlet servlet;

    @Inject
    ApplicationContext applicationContext;

    @Rule
    public ArchivaTemporaryFolderRule repoRootInternal = new ArchivaTemporaryFolderRule();

    @Before
    @Override
    public void setUp() throws Exception {

        super.setUp();

        String appserverBase = System.getProperty("appserver.base",
                new File("target/appserver-base").getAbsolutePath());

        File testConf = new File("src/test/resources/repository-archiva.xml");
        File testConfDest = new File(appserverBase, "conf/archiva.xml");
        FileUtils.copyFile(testConf, testConfDest);

        Configuration config = archivaConfiguration.getConfiguration();
        // clear managed repository
        List<ManagedRepositoryConfiguration> f1 = new ArrayList<>(config.getManagedRepositories());
        for (ManagedRepositoryConfiguration f : f1) {
            config.removeManagedRepository(f);
        }
        assertEquals(0, config.getManagedRepositories().size());
        // add internal repo
        config.addManagedRepository(
                createManagedRepository(REPOID_INTERNAL, "Internal Test Repo", repoRootInternal.getRoot()));

        saveConfiguration(archivaConfiguration);

        CacheManager.getInstance().clearAll();

        servletAuthControl = EasyMock.createControl();

        servletAuth = servletAuthControl.createMock(ServletAuthenticator.class);

        httpAuthControl = EasyMock.createControl();

        httpAuth = httpAuthControl.createMock(HttpAuthenticator.class);

        davSessionProvider = new ArchivaDavSessionProvider(servletAuth, httpAuth);

        final MockServletContext mockServletContext = new MockServletContext();

        WebApplicationContext webApplicationContext = new AbstractRepositoryServletTestCase.TestWebapplicationContext(
                applicationContext, mockServletContext);

        mockServletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,
                webApplicationContext);

        MockServletConfig mockServletConfig = new MockServletConfig() {
            @Override
            public ServletContext getServletContext() {
                return mockServletContext;
            }
        };

        servlet = new RepositoryServlet();

        servlet.init(mockServletConfig);
    }

    protected ManagedRepositoryConfiguration createManagedRepository(String id, String name, File location) {
        ManagedRepositoryConfiguration repo = new ManagedRepositoryConfiguration();
        repo.setId(id);
        repo.setName(name);
        repo.setLocation(location.getAbsolutePath());
        return repo;
    }

    /*protected void saveConfiguration()
    throws Exception
    {
    saveConfiguration( archivaConfiguration );
    }*/

    protected void saveConfiguration(ArchivaConfiguration archivaConfiguration) throws Exception {
        archivaConfiguration.save(archivaConfiguration.getConfiguration());
    }

    /*protected void setupCleanRepo( File repoRootDir )
    throws IOException
    {
    }*/

    @Override
    @After
    public void tearDown() throws Exception {

        /* if ( repoRootInternal.exists() )
         {
        FileUtils.deleteDirectory( repoRootInternal );
         }*/

        applicationContext.getBean(MavenIndexerCleaner.class).cleanupIndex();

        super.tearDown();
    }

    // test deploy with invalid user, and guest has no write access to repo
    // 401 must be returned
    @Test
    public void testPutWithInvalidUserAndGuestHasNoWriteAccess() throws Exception {

        InputStream is = getClass().getResourceAsStream("/artifact.jar");
        assertNotNull("artifact.jar inputstream", is);

        servlet.setDavSessionProvider(davSessionProvider);

        AuthenticationResult result = new AuthenticationResult();

        EasyMock.expect(httpAuth.getAuthenticationResult(anyObject(HttpServletRequest.class),
                anyObject(HttpServletResponse.class))).andReturn(result);

        servletAuth.isAuthenticated(EasyMock.anyObject(HttpServletRequest.class),
                EasyMock.anyObject(AuthenticationResult.class));
        EasyMock.expectLastCall().andThrow(new AuthenticationException("Authentication error"));

        servletAuth.isAuthorized("guest", "internal", ArchivaRoleConstants.OPERATION_REPOSITORY_UPLOAD);

        EasyMock.expectLastCall().andThrow(new UnauthorizedException("'guest' has no write access to repository"));

        httpAuthControl.replay();
        servletAuthControl.replay();
        MockHttpServletRequest mockHttpServletRequest = new MockHttpServletRequest();
        mockHttpServletRequest.addHeader("User-Agent", "foo");
        mockHttpServletRequest.setMethod("PUT");
        mockHttpServletRequest.setRequestURI("/repository/internal/path/to/artifact.jar");
        mockHttpServletRequest.setContent(IOUtils.toByteArray(is));
        mockHttpServletRequest.setContentType("application/octet-stream");

        MockHttpServletResponse mockHttpServletResponse = new MockHttpServletResponse();

        servlet.service(mockHttpServletRequest, mockHttpServletResponse);

        httpAuthControl.verify();
        servletAuthControl.verify();

        assertEquals(HttpServletResponse.SC_UNAUTHORIZED, mockHttpServletResponse.getStatus());
    }

    // test deploy with invalid user, but guest has write access to repo
    @Test
    public void testPutWithInvalidUserAndGuestHasWriteAccess() throws Exception {

        servlet.setDavSessionProvider(davSessionProvider);

        ArchivaDavResourceFactory archivaDavResourceFactory = (ArchivaDavResourceFactory) servlet
                .getResourceFactory();
        archivaDavResourceFactory.setHttpAuth(httpAuth);
        archivaDavResourceFactory.setServletAuth(servletAuth);

        servlet.setResourceFactory(archivaDavResourceFactory);

        AuthenticationResult result = new AuthenticationResult();

        EasyMock.expect(httpAuth.getAuthenticationResult(anyObject(HttpServletRequest.class),
                anyObject(HttpServletResponse.class))).andReturn(result);

        EasyMock.expect(servletAuth.isAuthenticated(anyObject(HttpServletRequest.class),
                anyObject(AuthenticationResult.class)))
                .andThrow(new AuthenticationException("Authentication error"));

        EasyMock.expect(
                servletAuth.isAuthorized("guest", "internal", ArchivaRoleConstants.OPERATION_REPOSITORY_UPLOAD))
                .andReturn(true);

        // ArchivaDavResourceFactory#isAuthorized()
        SecuritySession session = new DefaultSecuritySession();

        EasyMock.expect(httpAuth.getAuthenticationResult(anyObject(HttpServletRequest.class),
                anyObject(HttpServletResponse.class))).andReturn(result);

        EasyMock.expect(httpAuth.getSecuritySession(anyObject(HttpSession.class))).andReturn(session);

        EasyMock.expect(servletAuth.isAuthenticated(anyObject(HttpServletRequest.class), eq(result)))
                .andThrow(new AuthenticationException("Authentication error"));

        EasyMock.expect(httpAuth.getSessionUser(anyObject(HttpSession.class))).andReturn(null);

        // check if guest has write access
        EasyMock.expect(
                servletAuth.isAuthorized("guest", "internal", ArchivaRoleConstants.OPERATION_REPOSITORY_UPLOAD))
                .andReturn(true);

        httpAuthControl.replay();
        servletAuthControl.replay();

        InputStream is = getClass().getResourceAsStream("/artifact.jar");
        assertNotNull("artifact.jar inputstream", is);

        MockHttpServletRequest mockHttpServletRequest = new MockHttpServletRequest();
        mockHttpServletRequest.addHeader("User-Agent", "foo");
        mockHttpServletRequest.setMethod("PUT");
        mockHttpServletRequest.setRequestURI("/repository/internal/path/to/artifact.jar");
        mockHttpServletRequest.setContent(IOUtils.toByteArray(is));
        mockHttpServletRequest.setContentType("application/octet-stream");

        MockHttpServletResponse mockHttpServletResponse = new MockHttpServletResponse();

        servlet.service(mockHttpServletRequest, mockHttpServletResponse);

        httpAuthControl.verify();
        servletAuthControl.verify();

        assertEquals(HttpServletResponse.SC_CREATED, mockHttpServletResponse.getStatus());
    }

    // test deploy with a valid user with no write access
    @Test
    public void testPutWithValidUserWithNoWriteAccess() throws Exception {

        servlet.setDavSessionProvider(davSessionProvider);

        ArchivaDavResourceFactory archivaDavResourceFactory = (ArchivaDavResourceFactory) servlet
                .getResourceFactory();
        archivaDavResourceFactory.setHttpAuth(httpAuth);
        archivaDavResourceFactory.setServletAuth(servletAuth);
        servlet.setResourceFactory(archivaDavResourceFactory);

        AuthenticationResult result = new AuthenticationResult();

        EasyMock.expect(httpAuth.getAuthenticationResult(anyObject(HttpServletRequest.class),
                anyObject(HttpServletResponse.class))).andReturn(result);

        EasyMock.expect(servletAuth.isAuthenticated(anyObject(HttpServletRequest.class),
                anyObject(AuthenticationResult.class))).andReturn(true);

        // ArchivaDavResourceFactory#isAuthorized()
        SecuritySession session = new DefaultSecuritySession();

        EasyMock.expect(httpAuth.getAuthenticationResult(anyObject(HttpServletRequest.class),
                anyObject(HttpServletResponse.class))).andReturn(result);

        MockHttpServletRequest mockHttpServletRequest = new MockHttpServletRequest();

        EasyMock.expect(httpAuth.getSecuritySession(mockHttpServletRequest.getSession(true))).andReturn(session);

        EasyMock.expect(httpAuth.getSessionUser(mockHttpServletRequest.getSession())).andReturn(new SimpleUser());

        EasyMock.expect(servletAuth.isAuthenticated(anyObject(HttpServletRequest.class), eq(result)))
                .andReturn(true);

        EasyMock.expect(servletAuth.isAuthorized(anyObject(HttpServletRequest.class), eq(session), eq("internal"),
                eq(ArchivaRoleConstants.OPERATION_REPOSITORY_UPLOAD)))
                .andThrow(new UnauthorizedException("User not authorized"));
        httpAuthControl.replay();
        servletAuthControl.replay();

        InputStream is = getClass().getResourceAsStream("/artifact.jar");
        assertNotNull("artifact.jar inputstream", is);

        mockHttpServletRequest.addHeader("User-Agent", "foo");
        mockHttpServletRequest.setMethod("PUT");
        mockHttpServletRequest.setRequestURI("/repository/internal/path/to/artifact.jar");
        mockHttpServletRequest.setContent(IOUtils.toByteArray(is));
        mockHttpServletRequest.setContentType("application/octet-stream");

        MockHttpServletResponse mockHttpServletResponse = new MockHttpServletResponse();

        servlet.service(mockHttpServletRequest, mockHttpServletResponse);

        httpAuthControl.verify();
        servletAuthControl.verify();

        assertEquals(HttpServletResponse.SC_UNAUTHORIZED, mockHttpServletResponse.getStatus());
    }

    // test deploy with a valid user with write access
    @Test
    public void testPutWithValidUserWithWriteAccess() throws Exception {
        assertTrue(repoRootInternal.getRoot().exists());

        MockHttpServletRequest mockHttpServletRequest = new MockHttpServletRequest();
        String putUrl = "http://machine.com/repository/internal/path/to/artifact.jar";
        InputStream is = getClass().getResourceAsStream("/artifact.jar");
        assertNotNull("artifact.jar inputstream", is);

        servlet.setDavSessionProvider(davSessionProvider);

        ArchivaDavResourceFactory archivaDavResourceFactory = (ArchivaDavResourceFactory) servlet
                .getResourceFactory();
        archivaDavResourceFactory.setHttpAuth(httpAuth);
        archivaDavResourceFactory.setServletAuth(servletAuth);

        TestAuditListener listener = new TestAuditListener();
        archivaDavResourceFactory.addAuditListener(listener);
        servlet.setResourceFactory(archivaDavResourceFactory);

        AuthenticationResult result = new AuthenticationResult();

        EasyMock.expect(httpAuth.getAuthenticationResult(anyObject(HttpServletRequest.class),
                anyObject(HttpServletResponse.class))).andReturn(result);

        EasyMock.expect(servletAuth.isAuthenticated(anyObject(HttpServletRequest.class),
                anyObject(AuthenticationResult.class))).andReturn(true);

        User user = new SimpleUser();
        user.setUsername("admin");

        // ArchivaDavResourceFactory#isAuthorized()
        SecuritySession session = new DefaultSecuritySession();

        EasyMock.expect(httpAuth.getAuthenticationResult(anyObject(HttpServletRequest.class),
                anyObject(HttpServletResponse.class))).andReturn(result);

        EasyMock.expect(httpAuth.getSecuritySession(mockHttpServletRequest.getSession())).andReturn(session);

        EasyMock.expect(httpAuth.getSessionUser(mockHttpServletRequest.getSession())).andReturn(user);

        EasyMock.expect(servletAuth.isAuthenticated(anyObject(HttpServletRequest.class), eq(result)))
                .andReturn(true);

        EasyMock.expect(servletAuth.isAuthorized(anyObject(HttpServletRequest.class), eq(session), eq("internal"),
                eq(ArchivaRoleConstants.OPERATION_REPOSITORY_UPLOAD))).andReturn(true);

        httpAuthControl.replay();
        servletAuthControl.replay();

        mockHttpServletRequest.addHeader("User-Agent", "foo");
        mockHttpServletRequest.setMethod("PUT");
        mockHttpServletRequest.setRequestURI("/repository/internal/path/to/artifact.jar");
        mockHttpServletRequest.setContent(IOUtils.toByteArray(is));
        mockHttpServletRequest.setContentType("application/octet-stream");

        MockHttpServletResponse mockHttpServletResponse = new MockHttpServletResponse();

        servlet.service(mockHttpServletRequest, mockHttpServletResponse);

        httpAuthControl.verify();
        servletAuthControl.verify();

        assertEquals(HttpServletResponse.SC_CREATED, mockHttpServletResponse.getStatus());

        assertEquals("admin", listener.getEvents().get(0).getUserId());
    }

    // test get with invalid user, and guest has read access to repo
    @Test
    public void testGetWithInvalidUserAndGuestHasReadAccess() throws Exception {
        String commonsLangJar = "commons-lang/commons-lang/2.1/commons-lang-2.1.jar";
        String expectedArtifactContents = "dummy-commons-lang-artifact";

        File artifactFile = new File(repoRootInternal.getRoot(), commonsLangJar);
        artifactFile.getParentFile().mkdirs();

        FileUtils.writeStringToFile(artifactFile, expectedArtifactContents, Charset.defaultCharset());

        servlet.setDavSessionProvider(davSessionProvider);

        ArchivaDavResourceFactory archivaDavResourceFactory = (ArchivaDavResourceFactory) servlet
                .getResourceFactory();
        archivaDavResourceFactory.setHttpAuth(httpAuth);
        archivaDavResourceFactory.setServletAuth(servletAuth);

        servlet.setResourceFactory(archivaDavResourceFactory);

        AuthenticationResult result = new AuthenticationResult();

        EasyMock.expect(httpAuth.getAuthenticationResult(anyObject(HttpServletRequest.class),
                anyObject(HttpServletResponse.class))).andReturn(result);

        EasyMock.expect(servletAuth.isAuthenticated(anyObject(HttpServletRequest.class),
                anyObject(AuthenticationResult.class)))
                .andThrow(new AuthenticationException("Authentication error"));

        EasyMock.expect(
                servletAuth.isAuthorized("guest", "internal", ArchivaRoleConstants.OPERATION_REPOSITORY_ACCESS))
                .andReturn(true);

        // ArchivaDavResourceFactory#isAuthorized()
        SecuritySession session = new DefaultSecuritySession();

        EasyMock.expect(httpAuth.getAuthenticationResult(anyObject(HttpServletRequest.class),
                anyObject(HttpServletResponse.class))).andReturn(result);

        EasyMock.expect(httpAuth.getSecuritySession(anyObject(HttpSession.class))).andReturn(session);

        EasyMock.expect(httpAuth.getSessionUser(anyObject(HttpSession.class))).andReturn(null);

        EasyMock.expect(servletAuth.isAuthenticated(anyObject(HttpServletRequest.class), eq(result)))
                .andReturn(true);

        EasyMock.expect(servletAuth.isAuthorized(anyObject(HttpServletRequest.class), eq(session), eq("internal"),
                eq(ArchivaRoleConstants.OPERATION_REPOSITORY_ACCESS))).andReturn(true);
        httpAuthControl.replay();
        servletAuthControl.replay();

        MockHttpServletRequest mockHttpServletRequest = new MockHttpServletRequest();
        mockHttpServletRequest.addHeader("User-Agent", "foo");
        mockHttpServletRequest.setMethod("GET");
        mockHttpServletRequest.setRequestURI("/repository/internal/" + commonsLangJar);

        MockHttpServletResponse mockHttpServletResponse = new MockHttpServletResponse();

        servlet.service(mockHttpServletRequest, mockHttpServletResponse);

        httpAuthControl.verify();
        servletAuthControl.verify();

        assertEquals(HttpServletResponse.SC_OK, mockHttpServletResponse.getStatus());

        assertEquals("Expected file contents", expectedArtifactContents,
                mockHttpServletResponse.getContentAsString());
    }

    // test get with invalid user, and guest has no read access to repo
    @Test
    public void testGetWithInvalidUserAndGuestHasNoReadAccess() throws Exception {
        String commonsLangJar = "commons-lang/commons-lang/2.1/commons-lang-2.1.jar";
        String expectedArtifactContents = "dummy-commons-lang-artifact";

        File artifactFile = new File(repoRootInternal.getRoot(), commonsLangJar);
        artifactFile.getParentFile().mkdirs();

        FileUtils.writeStringToFile(artifactFile, expectedArtifactContents, Charset.defaultCharset());

        servlet.setDavSessionProvider(davSessionProvider);

        AuthenticationResult result = new AuthenticationResult();

        EasyMock.expect(httpAuth.getAuthenticationResult(anyObject(HttpServletRequest.class),
                anyObject(HttpServletResponse.class))).andReturn(result);

        EasyMock.expect(servletAuth.isAuthenticated(anyObject(HttpServletRequest.class),
                anyObject(AuthenticationResult.class)))
                .andThrow(new AuthenticationException("Authentication error"));

        EasyMock.expect(
                servletAuth.isAuthorized("guest", "internal", ArchivaRoleConstants.OPERATION_REPOSITORY_ACCESS))
                .andReturn(false);
        httpAuthControl.replay();
        servletAuthControl.replay();

        MockHttpServletRequest mockHttpServletRequest = new MockHttpServletRequest();
        mockHttpServletRequest.addHeader("User-Agent", "foo");
        mockHttpServletRequest.setMethod("GET");
        mockHttpServletRequest.setRequestURI("/repository/internal/" + commonsLangJar);

        MockHttpServletResponse mockHttpServletResponse = new MockHttpServletResponse();

        servlet.service(mockHttpServletRequest, mockHttpServletResponse);

        httpAuthControl.verify();
        servletAuthControl.verify();

        assertEquals(HttpServletResponse.SC_UNAUTHORIZED, mockHttpServletResponse.getStatus());
    }

    // test get with valid user with read access to repo
    @Test
    public void testGetWithAValidUserWithReadAccess() throws Exception {
        String commonsLangJar = "commons-lang/commons-lang/2.1/commons-lang-2.1.jar";
        String expectedArtifactContents = "dummy-commons-lang-artifact";

        File artifactFile = new File(repoRootInternal.getRoot(), commonsLangJar);
        artifactFile.getParentFile().mkdirs();

        FileUtils.writeStringToFile(artifactFile, expectedArtifactContents, Charset.defaultCharset());

        servlet.setDavSessionProvider(davSessionProvider);

        ArchivaDavResourceFactory archivaDavResourceFactory = (ArchivaDavResourceFactory) servlet
                .getResourceFactory();
        archivaDavResourceFactory.setHttpAuth(httpAuth);
        archivaDavResourceFactory.setServletAuth(servletAuth);

        servlet.setResourceFactory(archivaDavResourceFactory);

        AuthenticationResult result = new AuthenticationResult();

        EasyMock.expect(httpAuth.getAuthenticationResult(anyObject(HttpServletRequest.class),
                anyObject(HttpServletResponse.class))).andReturn(result);

        EasyMock.expect(servletAuth.isAuthenticated(anyObject(HttpServletRequest.class),
                anyObject(AuthenticationResult.class))).andReturn(true);
        // ArchivaDavResourceFactory#isAuthorized()
        SecuritySession session = new DefaultSecuritySession();

        EasyMock.expect(httpAuth.getAuthenticationResult(anyObject(HttpServletRequest.class),
                anyObject(HttpServletResponse.class))).andReturn(result);

        EasyMock.expect(httpAuth.getSecuritySession(anyObject(HttpSession.class))).andReturn(session);

        EasyMock.expect(httpAuth.getSessionUser(anyObject(HttpSession.class))).andReturn(new SimpleUser());

        EasyMock.expect(servletAuth.isAuthenticated(anyObject(HttpServletRequest.class), eq(result)))
                .andReturn(true);

        EasyMock.expect(servletAuth.isAuthorized(anyObject(HttpServletRequest.class), eq(session), eq("internal"),
                eq(ArchivaRoleConstants.OPERATION_REPOSITORY_ACCESS))).andReturn(true);

        httpAuthControl.replay();
        servletAuthControl.replay();

        MockHttpServletRequest mockHttpServletRequest = new MockHttpServletRequest();
        mockHttpServletRequest.addHeader("User-Agent", "foo");
        mockHttpServletRequest.setMethod("GET");
        mockHttpServletRequest.setRequestURI("/repository/internal/" + commonsLangJar);

        MockHttpServletResponse mockHttpServletResponse = new MockHttpServletResponse();

        servlet.service(mockHttpServletRequest, mockHttpServletResponse);

        httpAuthControl.verify();
        servletAuthControl.verify();

        assertEquals(HttpServletResponse.SC_OK, mockHttpServletResponse.getStatus());
        assertEquals("Expected file contents", expectedArtifactContents,
                mockHttpServletResponse.getContentAsString());
    }

    // test get with valid user with no read access to repo
    @Test
    public void testGetWithAValidUserWithNoReadAccess() throws Exception {
        String commonsLangJar = "commons-lang/commons-lang/2.1/commons-lang-2.1.jar";
        String expectedArtifactContents = "dummy-commons-lang-artifact";

        File artifactFile = new File(repoRootInternal.getRoot(), commonsLangJar);
        artifactFile.getParentFile().mkdirs();

        FileUtils.writeStringToFile(artifactFile, expectedArtifactContents, Charset.defaultCharset());

        servlet.setDavSessionProvider(davSessionProvider);

        ArchivaDavResourceFactory archivaDavResourceFactory = (ArchivaDavResourceFactory) servlet
                .getResourceFactory();
        archivaDavResourceFactory.setHttpAuth(httpAuth);
        archivaDavResourceFactory.setServletAuth(servletAuth);

        servlet.setResourceFactory(archivaDavResourceFactory);

        AuthenticationResult result = new AuthenticationResult();

        EasyMock.expect(httpAuth.getAuthenticationResult(anyObject(HttpServletRequest.class),
                anyObject(HttpServletResponse.class))).andReturn(result);

        EasyMock.expect(servletAuth.isAuthenticated(anyObject(HttpServletRequest.class),
                anyObject(AuthenticationResult.class))).andReturn(true);

        // ArchivaDavResourceFactory#isAuthorized()
        SecuritySession session = new DefaultSecuritySession();

        EasyMock.expect(httpAuth.getAuthenticationResult(anyObject(HttpServletRequest.class),
                anyObject(HttpServletResponse.class))).andReturn(result);

        EasyMock.expect(httpAuth.getSecuritySession(anyObject(HttpSession.class))).andReturn(session);

        EasyMock.expect(httpAuth.getSessionUser(anyObject(HttpSession.class))).andReturn(new SimpleUser());

        EasyMock.expect(servletAuth.isAuthenticated(anyObject(HttpServletRequest.class), eq(result)))
                .andReturn(true);

        EasyMock.expect(servletAuth.isAuthorized(anyObject(HttpServletRequest.class), eq(session), eq("internal"),
                eq(ArchivaRoleConstants.OPERATION_REPOSITORY_ACCESS)))
                .andThrow(new UnauthorizedException("User not authorized to read repository."));
        httpAuthControl.replay();
        servletAuthControl.replay();

        MockHttpServletRequest mockHttpServletRequest = new MockHttpServletRequest();
        mockHttpServletRequest.addHeader("User-Agent", "foo");
        mockHttpServletRequest.setMethod("GET");
        mockHttpServletRequest.setRequestURI("/repository/internal/" + commonsLangJar);

        MockHttpServletResponse mockHttpServletResponse = new MockHttpServletResponse();

        servlet.service(mockHttpServletRequest, mockHttpServletResponse);

        httpAuthControl.verify();
        servletAuthControl.verify();

        assertEquals(HttpServletResponse.SC_UNAUTHORIZED, mockHttpServletResponse.getStatus());
    }

}