/** * ============================================================================= * * ORCID (R) Open Source * http://orcid.org * * Copyright (c) 2012-2014 ORCID, Inc. * Licensed under an MIT-Style License (MIT) * http://orcid.org/open-source-license * * This copyright and license information (including a link to the full license) * shall be included in its entirety in all copies or substantial portion of * the software. * * ============================================================================= */ package org.orcid.core.web.filters; import static org.junit.Assert.fail; import java.io.ByteArrayInputStream; import java.net.URI; import java.util.Collections; import java.util.Enumeration; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import org.junit.Before; import org.junit.Test; import org.mockito.Matchers; import org.mockito.Mockito; import org.orcid.core.exception.OrcidBadRequestException; import org.orcid.core.locale.LocaleManager; import org.orcid.pojo.ajaxForm.PojoUtil; import org.springframework.mock.web.MockHttpServletRequest; import com.sun.jersey.core.header.InBoundHeaders; import com.sun.jersey.spi.container.ContainerRequest; import com.sun.jersey.spi.container.WebApplication; public class ApiVersionCheckFilterTest { private ContainerRequest request; @Before public void setup() { WebApplication webApp = Mockito.mock(WebApplication.class, Mockito.RETURNS_MOCKS); InBoundHeaders headers = new InBoundHeaders(); headers.add("X-Forwarded-Proto", "https"); request = new ContainerRequest(webApp, "GET", URI.create("https://localhost:8443/orcid-api-web/"), URI.create("https://localhost:8443/orcid-api-web/v2.0_rc1/0000-0001-7510-9252/activities"), headers, new ByteArrayInputStream(new byte[0])); } @Test public void apiV2SchemeTest() { ApiVersionCheckFilter filter = getApiVersionCheckFilter("https"); filter.filter(request); } @Test(expected=OrcidBadRequestException.class) public void apiV2BlockHttpTest() { ApiVersionCheckFilter filter = getApiVersionCheckFilter("http"); filter.filter(request); } @Test public void apiV2HeaderTest() { MockHttpServletRequest mockReq = new MockHttpServletRequest(); mockReq.setAttribute("X-Forwarded-Proto", "https"); OrcidHttpServletRequestWrapper requestWrapper = new OrcidHttpServletRequestWrapper(mockReq); ApiVersionCheckFilter filter = new ApiVersionCheckFilter(requestWrapper); filter.filter(request); } @Test public void apiDefaultVersionTest() { WebApplication webApp = Mockito.mock(WebApplication.class, Mockito.RETURNS_MOCKS); URI baseUri = URI.create("http://localhost:8443/orcid-api-web/"); URI requestUri = URI.create("http://localhost:8443/orcid-api-web/0000-0001-7510-9252/activities"); InBoundHeaders headers = new InBoundHeaders(); ByteArrayInputStream inputStream = new ByteArrayInputStream(new byte[0]); try { ContainerRequest containerRequest = new ContainerRequest(webApp, "POST", baseUri, requestUri, headers, inputStream); ApiVersionCheckFilter filter = getApiVersionCheckFilter("http"); filter.filter(containerRequest); fail(); } catch(OrcidBadRequestException e) { } catch(Exception e) { fail(); } try { ContainerRequest containerRequest = new ContainerRequest(webApp, "PUT", baseUri, requestUri, headers, inputStream); ApiVersionCheckFilter filter = getApiVersionCheckFilter("http"); filter.filter(containerRequest); fail(); } catch(OrcidBadRequestException e) { } catch(Exception e) { fail(); } try { ContainerRequest containerRequest = new ContainerRequest(webApp, "DELETE", baseUri, requestUri, headers, inputStream); ApiVersionCheckFilter filter = getApiVersionCheckFilter("http"); filter.filter(containerRequest); fail(); } catch(OrcidBadRequestException e) { } catch(Exception e) { fail(); } ContainerRequest containerRequest = new ContainerRequest(webApp, "GET", baseUri, requestUri, headers, inputStream); ApiVersionCheckFilter filter = getApiVersionCheckFilter("http"); filter.filter(containerRequest); } @Test public void webhooksShouldWorkWithoutVersionTest() { WebApplication webApp = Mockito.mock(WebApplication.class, Mockito.RETURNS_MOCKS); URI baseUri = URI.create("http://localhost:8443/orcid-api-web/"); URI requestUri = URI.create("http://localhost:8443/orcid-api-web/0000-0001-7510-9252/webhook/http://test.orcid.org"); InBoundHeaders headers = new InBoundHeaders(); ByteArrayInputStream inputStream = new ByteArrayInputStream(new byte[0]); try { ContainerRequest containerRequest = new ContainerRequest(webApp, "POST", baseUri, requestUri, headers, inputStream); ApiVersionCheckFilter filter = getApiVersionCheckFilter("http"); filter.filter(containerRequest); } catch(Exception e) { fail(); } try { ContainerRequest containerRequest = new ContainerRequest(webApp, "PUT", baseUri, requestUri, headers, inputStream); ApiVersionCheckFilter filter = getApiVersionCheckFilter("http"); filter.filter(containerRequest); } catch(Exception e) { fail(); } try { ContainerRequest containerRequest = new ContainerRequest(webApp, "DELETE", baseUri, requestUri, headers, inputStream); ApiVersionCheckFilter filter = getApiVersionCheckFilter("http"); filter.filter(containerRequest); } catch(Exception e) { fail(); } } @Test public void invalidWebhooksShouldNotWork() { WebApplication webApp = Mockito.mock(WebApplication.class, Mockito.RETURNS_MOCKS); URI baseUri = URI.create("http://localhost:8443/orcid-api-web/"); URI requestUri = URI.create("http://localhost:8443/orcid-api-web/0000-0001-7510-9252/webhook/"); InBoundHeaders headers = new InBoundHeaders(); ByteArrayInputStream inputStream = new ByteArrayInputStream(new byte[0]); try { ContainerRequest containerRequest = new ContainerRequest(webApp, "POST", baseUri, requestUri, headers, inputStream); ApiVersionCheckFilter filter = getApiVersionCheckFilter("http"); filter.filter(containerRequest); fail(); } catch(OrcidBadRequestException e) { } catch(Exception e) { fail(); } try { ContainerRequest containerRequest = new ContainerRequest(webApp, "PUT", baseUri, requestUri, headers, inputStream); ApiVersionCheckFilter filter = getApiVersionCheckFilter("http"); filter.filter(containerRequest); fail(); } catch(OrcidBadRequestException e) { } catch(Exception e) { fail(); } try { ContainerRequest containerRequest = new ContainerRequest(webApp, "DELETE", baseUri, requestUri, headers, inputStream); ApiVersionCheckFilter filter = getApiVersionCheckFilter("http"); filter.filter(containerRequest); fail(); } catch(OrcidBadRequestException e) { } catch(Exception e) { fail(); } } @Test public void api1_2VersionTest() { WebApplication webApp = Mockito.mock(WebApplication.class, Mockito.RETURNS_MOCKS); URI baseUri = URI.create("http://localhost:8443/orcid-api-web/"); URI requestUri = URI.create("http://localhost:8443/orcid-api-web/v1.2/0000-0001-7510-9252/activities"); InBoundHeaders headers = new InBoundHeaders(); ByteArrayInputStream inputStream = new ByteArrayInputStream(new byte[0]); try { ContainerRequest containerRequest = new ContainerRequest(webApp, "POST", baseUri, requestUri, headers, inputStream); ApiVersionCheckFilter filter = getApiVersionCheckFilter("http"); filter.filter(containerRequest); } catch (Exception e) { fail(); } try { ContainerRequest containerRequest = new ContainerRequest(webApp, "PUT", baseUri, requestUri, headers, inputStream); ApiVersionCheckFilter filter = getApiVersionCheckFilter("http"); filter.filter(containerRequest); } catch (Exception e) { fail(); } try { ContainerRequest containerRequest = new ContainerRequest(webApp, "DELETE", baseUri, requestUri, headers, inputStream); ApiVersionCheckFilter filter = getApiVersionCheckFilter("http"); filter.filter(containerRequest); } catch (Exception e) { fail(); } try { ContainerRequest containerRequest = new ContainerRequest(webApp, "GET", baseUri, requestUri, headers, inputStream); ApiVersionCheckFilter filter = getApiVersionCheckFilter("http"); filter.filter(containerRequest); } catch (Exception e) { fail(); } } @Test public void api2_0_rc2VersionTest() { MockHttpServletRequest mockReq = new MockHttpServletRequest(); mockReq.setAttribute("X-Forwarded-Proto", "https"); OrcidHttpServletRequestWrapper requestWrapper = new OrcidHttpServletRequestWrapper(mockReq); WebApplication webApp = Mockito.mock(WebApplication.class, Mockito.RETURNS_MOCKS); URI baseUri = URI.create("http://localhost:8443/orcid-api-web/"); URI requestUri = URI.create("http://localhost:8443/orcid-api-web/v2.0_rc2/0000-0001-7510-9252/activities"); InBoundHeaders headers = new InBoundHeaders(); ByteArrayInputStream inputStream = new ByteArrayInputStream(new byte[0]); try { ContainerRequest containerRequest = new ContainerRequest(webApp, "POST", baseUri, requestUri, headers, inputStream); ApiVersionCheckFilter filter = new ApiVersionCheckFilter(requestWrapper); filter.filter(containerRequest); } catch (Exception e) { fail(); } try { ContainerRequest containerRequest = new ContainerRequest(webApp, "PUT", baseUri, requestUri, headers, inputStream); ApiVersionCheckFilter filter = new ApiVersionCheckFilter(requestWrapper); filter.filter(containerRequest); } catch (Exception e) { fail(); } try { ContainerRequest containerRequest = new ContainerRequest(webApp, "DELETE", baseUri, requestUri, headers, inputStream); ApiVersionCheckFilter filter = new ApiVersionCheckFilter(requestWrapper); filter.filter(containerRequest); } catch (Exception e) { fail(); } try { ContainerRequest containerRequest = new ContainerRequest(webApp, "GET", baseUri, requestUri, headers, inputStream); ApiVersionCheckFilter filter = new ApiVersionCheckFilter(requestWrapper); filter.filter(containerRequest); } catch (Exception e) { fail(); } } @Test public void api2_0_rc3VersionTest() { MockHttpServletRequest mockReq = new MockHttpServletRequest(); mockReq.setAttribute("X-Forwarded-Proto", "https"); OrcidHttpServletRequestWrapper requestWrapper = new OrcidHttpServletRequestWrapper(mockReq); WebApplication webApp = Mockito.mock(WebApplication.class, Mockito.RETURNS_MOCKS); URI baseUri = URI.create("http://localhost:8443/orcid-api-web/"); URI requestUri = URI.create("http://localhost:8443/orcid-api-web/v2.0_rc3/0000-0001-7510-9252/activities"); InBoundHeaders headers = new InBoundHeaders(); ByteArrayInputStream inputStream = new ByteArrayInputStream(new byte[0]); try { ContainerRequest containerRequest = new ContainerRequest(webApp, "POST", baseUri, requestUri, headers, inputStream); ApiVersionCheckFilter filter = new ApiVersionCheckFilter(requestWrapper); filter.filter(containerRequest); } catch (Exception e) { fail(); } try { ContainerRequest containerRequest = new ContainerRequest(webApp, "PUT", baseUri, requestUri, headers, inputStream); ApiVersionCheckFilter filter = new ApiVersionCheckFilter(requestWrapper); filter.filter(containerRequest); } catch (Exception e) { fail(); } try { ContainerRequest containerRequest = new ContainerRequest(webApp, "DELETE", baseUri, requestUri, headers, inputStream); ApiVersionCheckFilter filter = new ApiVersionCheckFilter(requestWrapper); filter.filter(containerRequest); } catch (Exception e) { fail(); } try { ContainerRequest containerRequest = new ContainerRequest(webApp, "GET", baseUri, requestUri, headers, inputStream); ApiVersionCheckFilter filter = new ApiVersionCheckFilter(requestWrapper); filter.filter(containerRequest); } catch (Exception e) { fail(); } } @Test public void api2_0_rc4VersionTest() { MockHttpServletRequest mockReq = new MockHttpServletRequest(); mockReq.setAttribute("X-Forwarded-Proto", "https"); OrcidHttpServletRequestWrapper requestWrapper = new OrcidHttpServletRequestWrapper(mockReq); WebApplication webApp = Mockito.mock(WebApplication.class, Mockito.RETURNS_MOCKS); URI baseUri = URI.create("http://localhost:8443/orcid-api-web/"); URI requestUri = URI.create("http://localhost:8443/orcid-api-web/v2.0_rc4/0000-0001-7510-9252/activities"); InBoundHeaders headers = new InBoundHeaders(); ByteArrayInputStream inputStream = new ByteArrayInputStream(new byte[0]); try { ContainerRequest containerRequest = new ContainerRequest(webApp, "POST", baseUri, requestUri, headers, inputStream); ApiVersionCheckFilter filter = new ApiVersionCheckFilter(requestWrapper); filter.filter(containerRequest); } catch (Exception e) { fail(); } try { ContainerRequest containerRequest = new ContainerRequest(webApp, "PUT", baseUri, requestUri, headers, inputStream); ApiVersionCheckFilter filter = new ApiVersionCheckFilter(requestWrapper); filter.filter(containerRequest); } catch (Exception e) { fail(); } try { ContainerRequest containerRequest = new ContainerRequest(webApp, "DELETE", baseUri, requestUri, headers, inputStream); ApiVersionCheckFilter filter = new ApiVersionCheckFilter(requestWrapper); filter.filter(containerRequest); } catch (Exception e) { fail(); } try { ContainerRequest containerRequest = new ContainerRequest(webApp, "GET", baseUri, requestUri, headers, inputStream); ApiVersionCheckFilter filter = new ApiVersionCheckFilter(requestWrapper); filter.filter(containerRequest); } catch (Exception e) { fail(); } } @Test public void api2_0VersionTest() { MockHttpServletRequest mockReq = new MockHttpServletRequest(); mockReq.setAttribute("X-Forwarded-Proto", "https"); OrcidHttpServletRequestWrapper requestWrapper = new OrcidHttpServletRequestWrapper(mockReq); WebApplication webApp = Mockito.mock(WebApplication.class, Mockito.RETURNS_MOCKS); URI baseUri = URI.create("http://localhost:8443/orcid-api-web/"); URI requestUri = URI.create("http://localhost:8443/orcid-api-web/v2.0/0000-0001-7510-9252/activities"); InBoundHeaders headers = new InBoundHeaders(); ByteArrayInputStream inputStream = new ByteArrayInputStream(new byte[0]); try { ContainerRequest containerRequest = new ContainerRequest(webApp, "POST", baseUri, requestUri, headers, inputStream); ApiVersionCheckFilter filter = new ApiVersionCheckFilter(requestWrapper); filter.filter(containerRequest); } catch (Exception e) { fail(); } try { ContainerRequest containerRequest = new ContainerRequest(webApp, "PUT", baseUri, requestUri, headers, inputStream); ApiVersionCheckFilter filter = new ApiVersionCheckFilter(requestWrapper); filter.filter(containerRequest); } catch (Exception e) { fail(); } try { ContainerRequest containerRequest = new ContainerRequest(webApp, "DELETE", baseUri, requestUri, headers, inputStream); ApiVersionCheckFilter filter = new ApiVersionCheckFilter(requestWrapper); filter.filter(containerRequest); } catch (Exception e) { fail(); } try { ContainerRequest containerRequest = new ContainerRequest(webApp, "GET", baseUri, requestUri, headers, inputStream); ApiVersionCheckFilter filter = new ApiVersionCheckFilter(requestWrapper); filter.filter(containerRequest); } catch (Exception e) { fail(); } } @Test public void apiOauthTokenTest() { MockHttpServletRequest mockReq = new MockHttpServletRequest(); mockReq.setAttribute("X-Forwarded-Proto", "https"); OrcidHttpServletRequestWrapper requestWrapper = new OrcidHttpServletRequestWrapper(mockReq); WebApplication webApp = Mockito.mock(WebApplication.class, Mockito.RETURNS_MOCKS); URI baseUri = URI.create("http://localhost:8443/orcid-api-web/"); URI requestUri = URI.create("http://localhost:8443/orcid-api-web/oauth/token"); InBoundHeaders headers = new InBoundHeaders(); ByteArrayInputStream inputStream = new ByteArrayInputStream(new byte[0]); try { ContainerRequest containerRequest = new ContainerRequest(webApp, "POST", baseUri, requestUri, headers, inputStream); ApiVersionCheckFilter filter = new ApiVersionCheckFilter(requestWrapper); filter.filter(containerRequest); } catch (Exception e) { fail(); } } private ApiVersionCheckFilter getApiVersionCheckFilter(String scheme) { LocaleManager localeManager = Mockito.mock(LocaleManager.class); Mockito.when(localeManager.resolveMessage(Matchers.anyString())).thenReturn("error message"); Mockito.when(localeManager.resolveMessage(Matchers.anyString(), Matchers.any())).thenReturn("error message"); MockHttpServletRequest mockReq = new MockHttpServletRequest(); if(!PojoUtil.isEmpty(scheme)) { mockReq.setScheme(scheme); } return new ApiVersionCheckFilter(localeManager, mockReq); } private static class OrcidHttpServletRequestWrapper extends HttpServletRequestWrapper { public OrcidHttpServletRequestWrapper(HttpServletRequest request) { super(request); } @Override public String getHeader(String name) { String header = super.getHeader(name); return header == null ? (String) super.getAttribute(name) : header; } @Override public Enumeration<String> getHeaderNames() { List<String> headerNames = Collections.list(super.getHeaderNames()); headerNames.addAll(Collections.list(super.getAttributeNames())); return Collections.enumeration(headerNames); } } }