Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 101 additions & 0 deletions bin/admin/install-package.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
#!/usr/bin/env bash

print_usage()
{
printf "Installs a LinkedDataHub package.\n"
printf "\n"
printf "Usage: %s options\n" "$0"
printf "\n"
printf "Options:\n"
printf " -b, --base BASE_URL Base URL of the application\n"
printf " -f, --cert-pem-file CERT_FILE .pem file with the WebID certificate of the agent\n"
printf " -p, --cert-password CERT_PASSWORD Password of the WebID certificate\n"
printf " --proxy PROXY_URL The host this request will be proxied through (optional)\n"
printf " --package PACKAGE_URI URI of the package to install (e.g., https://packages.linkeddatahub.com/skos/#this)\n"
printf "\n"
printf "Example:\n"
printf " %s -b https://localhost:4443/ -f ssl/owner/cert.pem -p Password --package https://packages.linkeddatahub.com/skos/#this\n" "$0"
}

hash curl 2>/dev/null || { echo >&2 "curl not on \$PATH. Aborting."; exit 1; }

unknown=()
while [[ $# -gt 0 ]]
do
key="$1"

case $key in
-b|--base)
base="$2"
shift # past argument
shift # past value
;;
-f|--cert-pem-file)
cert_pem_file="$2"
shift # past argument
shift # past value
;;
-p|--cert-password)
cert_password="$2"
shift # past argument
shift # past value
;;
--proxy)
proxy="$2"
shift # past argument
shift # past value
;;
--package)
package_uri="$2"
shift # past argument
shift # past value
;;
*) # unknown option
unknown+=("$1") # save it in an array for later
shift # past argument
;;
esac
done
set -- "${unknown[@]}" # restore args

if [ -z "$base" ] ; then
print_usage
exit 1
fi
if [ -z "$cert_pem_file" ] ; then
print_usage
exit 1
fi
if [ -z "$cert_password" ] ; then
print_usage
exit 1
fi
if [ -z "$package_uri" ] ; then
print_usage
exit 1
fi

# Convert base URL to admin base URL
admin_uri() {
local uri="$1"
echo "$uri" | sed 's|://|://admin.|'
}

admin_base=$(admin_uri "$base")
target_url="${admin_base}install-package"

if [ -n "$proxy" ]; then
admin_proxy=$(admin_uri "$proxy")
# rewrite target hostname to proxy hostname
url_host=$(echo "$target_url" | cut -d '/' -f 1,2,3)
proxy_host=$(echo "$admin_proxy" | cut -d '/' -f 1,2,3)
final_url="${target_url/$url_host/$proxy_host}"
else
final_url="$target_url"
fi

# POST to install-package endpoint
curl -k -w "%{http_code}\n" -E "${cert_pem_file}":"${cert_password}" \
-H "Accept: text/turtle" \
-d "package-uri=${package_uri}" \
"${final_url}"
16 changes: 16 additions & 0 deletions http-tests/admin/packages/install-package-400.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#!/usr/bin/env bash
set -euo pipefail

initialize_dataset "$END_USER_BASE_URL" "$TMP_END_USER_DATASET" "$END_USER_ENDPOINT_URL"
initialize_dataset "$ADMIN_BASE_URL" "$TMP_ADMIN_DATASET" "$ADMIN_ENDPOINT_URL"
purge_cache "$END_USER_VARNISH_SERVICE"
purge_cache "$ADMIN_VARNISH_SERVICE"
purge_cache "$FRONTEND_VARNISH_SERVICE"

# Missing package-uri parameter should return 400 Bad Request
curl -k -w "%{http_code}\n" -o /dev/null -s \
-E "$OWNER_CERT_FILE":"$OWNER_CERT_PWD" \
-X POST \
-H "Content-Type: application/x-www-form-urlencoded" \
"${ADMIN_BASE_URL}packages/install" \
| grep -q "$STATUS_BAD_REQUEST"
16 changes: 16 additions & 0 deletions http-tests/admin/packages/install-package-403.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#!/usr/bin/env bash
set -euo pipefail

initialize_dataset "$END_USER_BASE_URL" "$TMP_END_USER_DATASET" "$END_USER_ENDPOINT_URL"
initialize_dataset "$ADMIN_BASE_URL" "$TMP_ADMIN_DATASET" "$ADMIN_ENDPOINT_URL"
purge_cache "$END_USER_VARNISH_SERVICE"
purge_cache "$ADMIN_VARNISH_SERVICE"
purge_cache "$FRONTEND_VARNISH_SERVICE"

# Unauthorized access (without certificate) should return 403 Forbidden
curl -k -w "%{http_code}\n" -o /dev/null -s \
-X POST \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "package-uri=https://packages.linkeddatahub.com/skos/#this" \
"${ADMIN_BASE_URL}packages/install" \
| grep -q "$STATUS_FORBIDDEN"
18 changes: 18 additions & 0 deletions http-tests/admin/packages/install-package-404.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#!/usr/bin/env bash
set -euo pipefail

initialize_dataset "$END_USER_BASE_URL" "$TMP_END_USER_DATASET" "$END_USER_ENDPOINT_URL"
initialize_dataset "$ADMIN_BASE_URL" "$TMP_ADMIN_DATASET" "$ADMIN_ENDPOINT_URL"
purge_cache "$END_USER_VARNISH_SERVICE"
purge_cache "$ADMIN_VARNISH_SERVICE"
purge_cache "$FRONTEND_VARNISH_SERVICE"

# Invalid/non-existent package URI should return 404 Not Found
# (the HTTP client error from the remote package server is re-thrown)
curl -k -w "%{http_code}\n" -o /dev/null -s \
-E "$OWNER_CERT_FILE":"$OWNER_CERT_PWD" \
-X POST \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "package-uri=https://packages.linkeddatahub.com/nonexistent/#package" \
"${ADMIN_BASE_URL}packages/install" \
| grep -q "$STATUS_NOT_FOUND"
28 changes: 28 additions & 0 deletions http-tests/admin/packages/install-package.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
#!/usr/bin/env bash
set -euo pipefail

initialize_dataset "$END_USER_BASE_URL" "$TMP_END_USER_DATASET" "$END_USER_ENDPOINT_URL"
initialize_dataset "$ADMIN_BASE_URL" "$TMP_ADMIN_DATASET" "$ADMIN_ENDPOINT_URL"
purge_cache "$END_USER_VARNISH_SERVICE"
purge_cache "$ADMIN_VARNISH_SERVICE"
purge_cache "$FRONTEND_VARNISH_SERVICE"

# test package URI (SKOS package)
package_uri="https://packages.linkeddatahub.com/skos/#this"

# install package via POST to packages/install endpoint
curl -k -w "%{http_code}\n" -o /dev/null -f -s \
-E "$OWNER_CERT_FILE":"$OWNER_CERT_PWD" \
-X POST \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "package-uri=$package_uri" \
"${ADMIN_BASE_URL}packages/install" \
| grep -q "$STATUS_SEE_OTHER"

# verify package stylesheet was installed (should return 200)
curl -k -f -s -o /dev/null \
"$END_USER_BASE_URL"static/com/linkeddatahub/packages/skos/layout.xsl

# verify master stylesheet was regenerated and includes package import
curl -k -s "${END_USER_BASE_URL}static/localhost/layout.xsl" \
| grep -q "com/linkeddatahub/packages/skos/layout.xsl"
46 changes: 46 additions & 0 deletions http-tests/admin/packages/install-uninstall-package.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
#!/usr/bin/env bash
set -euo pipefail

initialize_dataset "$END_USER_BASE_URL" "$TMP_END_USER_DATASET" "$END_USER_ENDPOINT_URL"
initialize_dataset "$ADMIN_BASE_URL" "$TMP_ADMIN_DATASET" "$ADMIN_ENDPOINT_URL"
purge_cache "$END_USER_VARNISH_SERVICE"
purge_cache "$ADMIN_VARNISH_SERVICE"
purge_cache "$FRONTEND_VARNISH_SERVICE"

# test package URI (SKOS package)
package_uri="https://packages.linkeddatahub.com/skos/#this"

# install package
curl -k -w "%{http_code}\n" -o /dev/null -f -s \
-E "$OWNER_CERT_FILE":"$OWNER_CERT_PWD" \
-X POST \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "package-uri=$package_uri" \
"$ADMIN_BASE_URL"packages/install \
| grep -q "$STATUS_SEE_OTHER"

# verify package stylesheet was installed (should return 200)
curl -k -f -s -o /dev/null \
"${END_USER_BASE_URL}static/com/linkeddatahub/packages/skos/layout.xsl"

# verify master stylesheet includes package
curl -k -s "$END_USER_BASE_URL"static/localhost/layout.xsl \
| grep -q "com/linkeddatahub/packages/skos/layout.xsl"

# uninstall package
curl -k -w "%{http_code}\n" -o /dev/null -f -s \
-E "$OWNER_CERT_FILE":"$OWNER_CERT_PWD" \
-X POST \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "package-uri=$package_uri" \
"$ADMIN_BASE_URL"packages/uninstall \
| grep -q "$STATUS_SEE_OTHER"

# verify package stylesheet was deleted (should return 404)
curl -k -w "%{http_code}\n" -o /dev/null -s \
"${END_USER_BASE_URL}static/com/linkeddatahub/packages/skos/layout.xsl" \
| grep -q "$STATUS_NOT_FOUND"

# verify master stylesheet no longer includes package
curl -k -s "$END_USER_BASE_URL"static/localhost/layout.xsl \
| grep -v -q "com/linkeddatahub/packages/skos/layout.xsl"
16 changes: 16 additions & 0 deletions http-tests/admin/packages/uninstall-package-400.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#!/usr/bin/env bash
set -euo pipefail

initialize_dataset "$END_USER_BASE_URL" "$TMP_END_USER_DATASET" "$END_USER_ENDPOINT_URL"
initialize_dataset "$ADMIN_BASE_URL" "$TMP_ADMIN_DATASET" "$ADMIN_ENDPOINT_URL"
purge_cache "$END_USER_VARNISH_SERVICE"
purge_cache "$ADMIN_VARNISH_SERVICE"
purge_cache "$FRONTEND_VARNISH_SERVICE"

# Missing package-uri parameter should return 400 Bad Request
curl -k -w "%{http_code}\n" -o /dev/null -s \
-E "$OWNER_CERT_FILE":"$OWNER_CERT_PWD" \
-X POST \
-H "Content-Type: application/x-www-form-urlencoded" \
"{$ADMIN_BASE_URL}packages/uninstall" \
| grep -q "$STATUS_BAD_REQUEST"
42 changes: 42 additions & 0 deletions http-tests/admin/packages/uninstall-package.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
#!/usr/bin/env bash
set -euo pipefail

initialize_dataset "$END_USER_BASE_URL" "$TMP_END_USER_DATASET" "$END_USER_ENDPOINT_URL"
initialize_dataset "$ADMIN_BASE_URL" "$TMP_ADMIN_DATASET" "$ADMIN_ENDPOINT_URL"
purge_cache "$END_USER_VARNISH_SERVICE"
purge_cache "$ADMIN_VARNISH_SERVICE"
purge_cache "$FRONTEND_VARNISH_SERVICE"

# test package URI (SKOS package)
package_uri="https://packages.linkeddatahub.com/skos/#this"

# first install the package
curl -k -w "%{http_code}\n" -o /dev/null -f -s \
-E "$OWNER_CERT_FILE":"$OWNER_CERT_PWD" \
-X POST \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "package-uri=$package_uri" \
"${ADMIN_BASE_URL}packages/install" \
| grep -q "$STATUS_SEE_OTHER"

# verify package stylesheet exists before uninstall (should return 200)
curl -k -f -s -o /dev/null \
"${END_USER_BASE_URL}static/com/linkeddatahub/packages/skos/layout.xsl"

# uninstall package via POST to packages/uninstall endpoint
curl -k -w "%{http_code}\n" -o /dev/null -f -s \
-E "$OWNER_CERT_FILE":"$OWNER_CERT_PWD" \
-X POST \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "package-uri=$package_uri" \
"${ADMIN_BASE_URL}packages/uninstall" \
| grep -q "$STATUS_SEE_OTHER"

# verify package stylesheet was deleted (should return 404)
curl -k -w "%{http_code}\n" -o /dev/null -s \
"${END_USER_BASE_URL}static/com/linkeddatahub/packages/skos/layout.xsl" \
| grep -q "$STATUS_NOT_FOUND"

# verify master stylesheet was regenerated without package import
curl -k -s "$END_USER_BASE_URL"static/localhost/layout.xsl \
| grep -v -q "com/linkeddatahub/packages/skos/layout.xsl"
36 changes: 36 additions & 0 deletions platform/datasets/admin.trig
Original file line number Diff line number Diff line change
Expand Up @@ -821,6 +821,42 @@ WHERE

}

### PACKAGES ###

# ENDPOINTS

<packages/install>
{

<packages/install> a foaf:Document ;
dct:title "Install package endpoint" .

}

<packages/uninstall>
{

<packages/uninstall> a foaf:Document ;
dct:title "Uninstall package endpoint" .

}

# CONTAINERS

<packages/>
{

<packages/> a dh:Container ;
sioc:has_parent <> ;
dct:title "Packages" ;
dct:description "Manage installed packages" ;
rdf:_1 <packages/#select-children> .

<packages/#select-children> a ldh:Object ;
rdf:value ldh:ChildrenView .

}

### ONTOLOGIES ###

# CONTAINERS
Expand Down
1 change: 1 addition & 0 deletions src/main/java/com/atomgraph/linkeddatahub/Application.java
Original file line number Diff line number Diff line change
Expand Up @@ -715,6 +715,7 @@ public Application(final ServletConfig servletConfig, final MediaTypes mediaType
BuiltinPersonalities.model.add(EndUserApplication.class, new com.atomgraph.linkeddatahub.apps.model.end_user.impl.ApplicationImplementation());
BuiltinPersonalities.model.add(com.atomgraph.linkeddatahub.apps.model.Application.class, new com.atomgraph.linkeddatahub.apps.model.impl.ApplicationImplementation());
BuiltinPersonalities.model.add(com.atomgraph.linkeddatahub.apps.model.Dataset.class, new com.atomgraph.linkeddatahub.apps.model.impl.DatasetImplementation());
BuiltinPersonalities.model.add(com.atomgraph.linkeddatahub.apps.model.Package.class, new com.atomgraph.linkeddatahub.apps.model.impl.PackageImplementation());
BuiltinPersonalities.model.add(Service.class, new com.atomgraph.linkeddatahub.model.impl.ServiceImplementation(noCertClient, mediaTypes, maxGetRequestSize));
BuiltinPersonalities.model.add(Import.class, ImportImpl.factory);
BuiltinPersonalities.model.add(RDFImport.class, RDFImportImpl.factory);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,6 @@
public interface Application extends Resource, com.atomgraph.core.model.Application
{

/**
* The relative path of the content-addressed file container.
*/
public static final String UPLOADS_PATH = "uploads";

/**
* Returns the application's namespace ontology.
*
Expand Down Expand Up @@ -100,9 +95,16 @@ public interface Application extends Resource, com.atomgraph.core.model.Applicat

/**
* Returns frontend proxy's cache URI resource.
*
*
* @return RDF resource
*/
Resource getFrontendProxy();


/**
* Returns the set of packages imported by this application.
*
* @return set of package resources
*/
java.util.Set<Resource> getImportedPackages();

}
Loading
Loading