org.everit.osgi.authentication.http.form.tests.FormAuthenticationServletTestComponent.java Source code

Java tutorial

Introduction

Here is the source code for org.everit.osgi.authentication.http.form.tests.FormAuthenticationServletTestComponent.java

Source

/**
 * This file is part of Everit - HTML form-based authentication tests.
 *
 * Everit - HTML form-based authentication tests is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Everit - HTML form-based authentication tests is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with Everit - HTML form-based authentication tests.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.everit.osgi.authentication.http.form.tests;

import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.servlet.Filter;
import javax.servlet.Servlet;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.IOUtils;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.ConfigurationPolicy;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.CookieStore;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.protocol.ClientContext;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.everit.osgi.authentication.context.AuthenticationContext;
import org.everit.osgi.authentication.simple.SimpleSubject;
import org.everit.osgi.authentication.simple.SimpleSubjectManager;
import org.everit.osgi.dev.testrunner.TestRunnerConstants;
import org.everit.osgi.resource.ResourceService;
import org.junit.Assert;
import org.junit.Test;
import org.osgi.framework.BundleContext;

@Component(name = "FormAuthenticationServletTest", metatype = true, configurationFactory = false, policy = ConfigurationPolicy.REQUIRE, immediate = true)
@Properties({ @Property(name = TestRunnerConstants.SERVICE_PROPERTY_TESTRUNNER_ENGINE_TYPE, value = "junit4"),
        @Property(name = TestRunnerConstants.SERVICE_PROPERTY_TEST_ID, value = "FormAuthenticationServletTest"),
        @Property(name = "simpleSubjectManager.target"), @Property(name = "resourceService.target"),
        @Property(name = "authenticationContext.target"), @Property(name = "helloWorldServlet.target"),
        @Property(name = "formAuthenticationServlet.target"),
        @Property(name = "sessionAuthenticationFilter.target") })
@Service(value = FormAuthenticationServletTestComponent.class)
public class FormAuthenticationServletTestComponent {

    private static final String LOGIN_SUCCESS_ALIAS = "/login-success.html";

    private static final String LOGIN_FAILED_ALIAS = "/login-failed.html";

    private static final String LOGIN_ACTION = "/login-action";

    private static final String HELLO_SERVLET_ALIAS = "/hello";

    private static final String USERNAME = "Aladdin";

    private static final String PASSWORD = "open sesame";

    private static final String WRONG_PASSWORD = PASSWORD + PASSWORD;

    @Reference(bind = "setSimpleSubjectManager")
    private SimpleSubjectManager simpleSubjectManager;

    @Reference(bind = "setResourceService")
    private ResourceService resourceService;

    @Reference(bind = "setAuthenticationContext")
    private AuthenticationContext authenticationContext;

    @Reference(bind = "setHelloWorldServlet")
    private Servlet helloWorldServlet;

    @Reference(bind = "setBelloWorldServlet")
    private Servlet belloWorldServlet;

    @Reference(bind = "setFormAuthenticationServlet")
    private Servlet formAuthenticationServlet;

    @Reference(bind = "setSessionAuthenticationFilter")
    private Filter sessionAuthenticationFilter;

    private Server testServer;

    private String helloUrl;

    private String loginActionUrl;

    private String loginFailedUrl;

    private String loginSuccessUrl;

    private long authenticatedResourceId;

    private long defaultResourceId;

    @Activate
    public void activate(final BundleContext context, final Map<String, Object> componentProperties)
            throws Exception {
        testServer = new Server(0);
        ServletContextHandler servletContextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
        testServer.setHandler(servletContextHandler);

        servletContextHandler.addFilter(new FilterHolder(sessionAuthenticationFilter), "/*", null);
        servletContextHandler.addServlet(new ServletHolder("helloWorldServlet", helloWorldServlet),
                HELLO_SERVLET_ALIAS);
        servletContextHandler.addServlet(new ServletHolder("formAuthenticationServlet", formAuthenticationServlet),
                LOGIN_ACTION);

        testServer.start();

        String testServerURI = testServer.getURI().toString();
        String testServerURL = testServerURI.substring(0, testServerURI.length() - 1);

        helloUrl = testServerURL + HELLO_SERVLET_ALIAS;
        loginActionUrl = testServerURL + LOGIN_ACTION;
        loginFailedUrl = testServerURL + LOGIN_FAILED_ALIAS;
        loginSuccessUrl = testServerURL + LOGIN_SUCCESS_ALIAS;

        long resourceId = resourceService.createResource();
        simpleSubjectManager.delete(USERNAME);
        SimpleSubject simpleSubject = simpleSubjectManager.create(resourceId, USERNAME, PASSWORD);
        authenticatedResourceId = simpleSubject.getResourceId();
        defaultResourceId = authenticationContext.getDefaultResourceId();
    }

    @Deactivate
    public void deactivate() throws Exception {
        if (testServer != null) {
            testServer.stop();
            testServer.destroy();
        }
    }

    private void hello(final HttpContext httpContext, final long expectedResourceId) throws IOException {
        HttpClient httpClient = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet(helloUrl);
        HttpResponse httpResponse = httpClient.execute(httpGet, httpContext);
        Assert.assertEquals(HttpServletResponse.SC_OK, httpResponse.getStatusLine().getStatusCode());
        HttpEntity responseEntity = httpResponse.getEntity();
        InputStream inputStream = responseEntity.getContent();
        StringWriter writer = new StringWriter();
        IOUtils.copy(inputStream, writer);
        String responseBodyAsString = writer.toString();
        Assert.assertEquals(expectedResourceId, Long.valueOf(responseBodyAsString).longValue());
    }

    private void login(final HttpContext httpContext, final String username, final String password,
            final String expectedLocation) throws Exception {
        HttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(loginActionUrl);
        List<NameValuePair> parameters = new ArrayList<NameValuePair>();
        parameters.add(new BasicNameValuePair("username", username));
        parameters.add(new BasicNameValuePair("password", password));
        parameters.add(new BasicNameValuePair("successUrl", LOGIN_SUCCESS_ALIAS));
        parameters.add(new BasicNameValuePair("failedUrl", LOGIN_FAILED_ALIAS));
        HttpEntity entity = new UrlEncodedFormEntity(parameters);
        httpPost.setEntity(entity);
        HttpResponse httpResponse = httpClient.execute(httpPost, httpContext);
        Assert.assertEquals(HttpServletResponse.SC_MOVED_TEMPORARILY, httpResponse.getStatusLine().getStatusCode());
        Header locationHeader = httpResponse.getFirstHeader("Location");
        Assert.assertEquals(expectedLocation, locationHeader.getValue());
    }

    public void setAuthenticationContext(final AuthenticationContext authenticationContext) {
        this.authenticationContext = authenticationContext;
    }

    public void setBelloWorldServlet(final Servlet belloWorldServlet) {
        this.belloWorldServlet = belloWorldServlet;
    }

    public void setFormAuthenticationServlet(final Servlet formAuthenticationServlet) {
        this.formAuthenticationServlet = formAuthenticationServlet;
    }

    public void setHelloWorldServlet(final Servlet helloWorldServlet) {
        this.helloWorldServlet = helloWorldServlet;
    }

    public void setResourceService(final ResourceService resourceService) {
        this.resourceService = resourceService;
    }

    public void setSessionAuthenticationFilter(final Filter sessionAuthenticationFilter) {
        this.sessionAuthenticationFilter = sessionAuthenticationFilter;
    }

    public void setSimpleSubjectManager(final SimpleSubjectManager simpleSubjectManager) {
        this.simpleSubjectManager = simpleSubjectManager;
    }

    @Test
    public void testAccessHelloPage() throws Exception {
        CookieStore cookieStore = new BasicCookieStore();
        HttpContext httpContext = new BasicHttpContext();
        httpContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);

        hello(httpContext, defaultResourceId);
        login(httpContext, USERNAME, WRONG_PASSWORD, loginFailedUrl);
        login(httpContext, USERNAME, PASSWORD, loginSuccessUrl);
        hello(httpContext, authenticatedResourceId);
    }

}