Skip to content

Commit

Permalink
First draft of a simple auth-aware HttpClient service
Browse files Browse the repository at this point in the history
  • Loading branch information
ajs6f committed May 3, 2017
1 parent 82c487d commit a49941a
Show file tree
Hide file tree
Showing 7 changed files with 170 additions and 0 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,5 @@
workbench.xmi
target
build
.DS_Store
bin/
31 changes: 31 additions & 0 deletions islandora-http-client/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
apply plugin: 'osgi'

description = 'Islandora CLAW HTTP Client'

def tomcatVersion = '8.0.28'

dependencies {
compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.3'

testCompile group: 'junit', name: 'junit', version:'4.12'
}

jar {
manifest {
description project.description
docURL project.docURL
vendor project.vendor
license project.license

instruction 'Import-Package', 'org.apache.http.client,' +
defaultOsgiImports
instruction 'Export-Package', 'ca.islandora.indexing.http.client'
}
}

artifacts {
archives (file('build/cfg/main/ca.islandora.alpaca.http.client.cfg')) {
classifier 'configuration'
type 'cfg'
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# The static token value to be used for authentication by the HttpClient available as an OSGi service for
# other services to use against the Fedora repository
token.value=islandora
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/*
* Licensed to Islandora Foundation under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
*
* The Islandora Foundation licenses this file to you under the MIT License.
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://opensource.org/licenses/MIT
*
* 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 ca.islandora.alpaca.http.client;

import static java.util.Objects.requireNonNull;

import org.apache.http.Header;
import org.apache.http.HttpRequest;
import org.apache.http.HttpRequestInterceptor;
import org.apache.http.message.BasicHeader;
import org.apache.http.protocol.HttpContext;

public class StaticTokenRequestInterceptor implements HttpRequestInterceptor {

public static final String AUTH_HEADER = "Authorization";

private Header header;

public StaticTokenRequestInterceptor() {
}

public StaticTokenRequestInterceptor(String token) {
this.header = makeHeader(token);
}

public void setToken(String token) {
this.header = makeHeader(token);
}

private Header makeHeader(String token) {
return new BasicHeader(AUTH_HEADER, "Bearer " + requireNonNull(token, "Token must not be null!"));
}

@Override
public void process(HttpRequest request, HttpContext context) {
// we do not inject if auth headers present
if (request.getFirstHeader(AUTH_HEADER)== null) request.addHeader(header);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"
xsi:schemaLocation="
http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0 http://aries.apache.org/schemas/blueprint-cm/blueprint-cm-1.1.0.xsd
http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">

<!-- OSGI blueprint property placeholder -->
<cm:property-placeholder id="properties" persistent-id="ca.islandora.alpaca.http.client" update-strategy="reload" >
<cm:default-properties>
<cm:property name="token.value" value="islandora"/>
</cm:default-properties>
</cm:property-placeholder>

<service id="httpClient" interface="org.apache.http.client.HttpClient" filter="(osgi.jndi.service.name=claw/httpClient)">
<bean class="ca.islandora.alpaca.http.client.StaticTokenRequestInterceptor" factory-method=“defaultClient”>
<argument>
<bean id="interceptor" class="ca.islandora.alpaca.http.client.StaticTokenRequestInterceptor">
<property name="token" value="${token.value}"/>
</bean>
</argument>
</bean>
</service>

</blueprint>
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/*
* Licensed to Islandora Foundation under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
*
* The Islandora Foundation licenses this file to you under the MIT License.
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://opensource.org/licenses/MIT
*
* 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 ca.islandora.alpaca.http.client;

import static ca.islandora.alpaca.http.client.StaticTokenRequestInterceptor.AUTH_HEADER;

import org.apache.http.Header;
import org.apache.http.HttpRequest;
import org.apache.http.client.methods.HttpGet;
import org.junit.Assert;
import org.junit.Test;

public class StaticTokenRequestInterceptorTest extends Assert {

@Test
public void shouldInjectHeaderWhenNoAuthHeadersPresent() {
StaticTokenRequestInterceptor testInterceptor = new StaticTokenRequestInterceptor("testToken");
HttpRequest request = new HttpGet();
testInterceptor.process(request, null);
Header[] authHeaders = request.getHeaders(AUTH_HEADER);
assertEquals("Should only be one auth header!", 1, authHeaders.length);
assertEquals("Wrong value for header!", "Bearer testToken", authHeaders[0].getValue());
}

@Test
public void shouldNotInjectHeaderWhenAuthHeadersPresent() {
StaticTokenRequestInterceptor testInterceptor = new StaticTokenRequestInterceptor("testToken");
HttpRequest request = new HttpGet();
request.addHeader(AUTH_HEADER, "fake header");
testInterceptor.process(request, null);
Header[] authHeaders = request.getHeaders(AUTH_HEADER);
assertEquals("Should only be one auth header!", 1, authHeaders.length);
assertEquals("Wrong value for header!", "fake header", authHeaders[0].getValue());
}
}
2 changes: 2 additions & 0 deletions settings.gradle
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
include ':islandora-karaf'
include ':islandora-indexing-triplestore'
include ':islandora-connector-broadcast'
include ':islandora-http-client'

project(':islandora-karaf').projectDir = "$rootDir/karaf" as File
project(':islandora-indexing-triplestore').projectDir = "$rootDir/islandora-indexing-triplestore" as File
project(':islandora-connector-broadcast').projectDir = "$rootDir/islandora-connector-broadcast" as File
project(':islandora-http-client').projectDir = "$rootDir/islandora-http-client" as File

0 comments on commit a49941a

Please sign in to comment.