Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
0c01a48
Add resourcMapper field to LDP.
RubenVerborgh Aug 20, 2018
546462c
Use ResourceMapper in ldp#graph.
RubenVerborgh Aug 20, 2018
a3bb625
Use ResourceMapper in ldp#readContainerMeta.
RubenVerborgh Aug 21, 2018
805a0da
Use ResourceMapper in ldp#readResource.
RubenVerborgh Aug 21, 2018
4198144
Switch stat to promises.
RubenVerborgh Aug 23, 2018
646086e
Support Express request objects in ResourceMapper.
RubenVerborgh Aug 23, 2018
b720eac
Promisify util#serialize and util#translate
rubensworks Nov 14, 2018
ab5143b
Use ResourceMapper in ldp#put
rubensworks Nov 14, 2018
04a18c9
Use ResourceMapper in ldp#delete
rubensworks Nov 14, 2018
ae95dee
Use ResourceMapper in patch handler
rubensworks Nov 14, 2018
13a29ec
Use ResourceMapper in ldp#get
rubensworks Nov 19, 2018
0135c23
Promisify ldp#post
rubensworks Nov 19, 2018
43eaa0b
Promisify ldp#exists
rubensworks Nov 19, 2018
c81f9e3
Simplify promise-based handlers using async-await syntax
rubensworks Nov 19, 2018
0303cab
Use ResourceMapper in header#linksHandler
rubensworks Nov 19, 2018
f957b2e
Use ResourceMapper in get#globHandler
rubensworks Nov 19, 2018
f768c6d
Use ResourceMapper in copy handler
rubensworks Nov 19, 2018
5cc2d19
Use ResourceMapper in root handler
rubensworks Nov 19, 2018
796473a
Remove utils#uriToFilename
rubensworks Nov 19, 2018
252a227
Use ResourceMapper instead of utils#getBaseUri
rubensworks Nov 19, 2018
6769d23
Use ResourceMapper in handlers/get#hasReadPermissions
rubensworks Nov 19, 2018
7857a29
Pass content type to ResourceMapper when putting resources
rubensworks Nov 19, 2018
a6d1052
Remove ldp.root in favor of ResourceMapper
rubensworks Nov 19, 2018
3f1d9ae
Use ResourceMapper in ensureWelcomePage
rubensworks Nov 19, 2018
2d35a0e
Move calls from utils#getFullUri to ResourceMapper
rubensworks Nov 19, 2018
8344096
Remove deprecated utils#getBaseUri
rubensworks Nov 20, 2018
bd4cf23
Fix standard linting issues
rubensworks Nov 20, 2018
beb080f
Make ResourceMapper interpret URLs ending with '/' as index pages
rubensworks Nov 20, 2018
f0736a9
Improve error message when file is not found in ResourceMapper
rubensworks Nov 21, 2018
5d8dd78
Map URLs to folders when no index is available
rubensworks Nov 21, 2018
5d30510
Make text/turtle the default content type for mapping .acl files
rubensworks Nov 21, 2018
900616f
Require Content-Type in POST request
rubensworks Nov 21, 2018
9d0f26a
Inherit content type from source in COPY handler
rubensworks Nov 21, 2018
2f6cb7f
Transition to new ResourceMapper
rubensworks Nov 21, 2018
e5073ff
Allow linksHandler to map resources that do (not) exist yet
rubensworks Nov 21, 2018
d682fe0
Allow patch handler to map resources that do no exist yet
rubensworks Nov 21, 2018
289ee0e
Fix incorrect response content type being passed in HEAD
rubensworks Nov 21, 2018
ff0423e
Fix databrowser being used instead of index.html files
rubensworks Nov 21, 2018
58f937a
Fix globbing crash with new ResourceMapper
rubensworks Nov 21, 2018
2fe6788
Fix minor LDP issues with new ResourceMapper
rubensworks Nov 21, 2018
d70d2d3
Update unit tests to new ResourceMapper
rubensworks Nov 21, 2018
96cb163
Fix linting errors due to ResourceMapper changes
rubensworks Nov 21, 2018
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
3 changes: 1 addition & 2 deletions lib/capability-discovery.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
* @module capability-discovery
*/
const express = require('express')
const util = require('./utils')

const serviceConfigDefaults = {
'api': {
Expand Down Expand Up @@ -47,7 +46,7 @@ function capabilityDiscovery () {
function serviceCapabilityDocument (serviceConfig) {
return (req, res) => {
// Add the server root url
serviceConfig.root = util.getFullUri(req) // TODO make sure we align with the rest
serviceConfig.root = req.app.locals.ldp.resourceMapper.getBaseUrl(req.hostname, req.path)
// Add the 'apps' urls section
serviceConfig.apps = req.app.locals.appUrls
res.json(serviceConfig)
Expand Down
7 changes: 7 additions & 0 deletions lib/create-app.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ const options = require('./handlers/options')
const debug = require('./debug').authentication
const path = require('path')
const { routeResolvedFile } = require('./utils')
const ResourceMapper = require('./resource-mapper')

const corsSettings = cors({
methods: [
Expand All @@ -41,6 +42,12 @@ function createApp (argv = {}) {

argv.host = SolidHost.from({ port: argv.port, serverUri: argv.serverUri })

argv.resourceMapper = new ResourceMapper({
rootUrl: argv.serverUri,
rootPath: argv.root,
includeHost: argv.multiuser
})

const configPath = config.initConfigDir(argv)
argv.templates = config.initTemplateDirs(configPath)

Expand Down
86 changes: 35 additions & 51 deletions lib/handlers/allow.js
Original file line number Diff line number Diff line change
@@ -1,25 +1,17 @@
module.exports = allow

const ACL = require('../acl-checker')
const $rdf = require('rdflib')
const utils = require('../utils')
const debug = require('../debug.js').ACL
const LegacyResourceMapper = require('../legacy-resource-mapper')

function allow (mode) {
return function allowHandler (req, res, next) {
return async function allowHandler (req, res, next) {
const ldp = req.app.locals.ldp || {}
if (!ldp.webid) {
return next()
}

// Set up URL to filesystem mapping
const rootUrl = utils.getBaseUri(req)
const mapper = new LegacyResourceMapper({
rootUrl,
rootPath: ldp.root,
includeHost: ldp.multiuser
})
const rootUrl = ldp.resourceMapper.getBaseUrl(req.hostname)

// Determine the actual path of the request
// (This is used as an ugly hack to check the ACL status of other resources.)
Expand All @@ -28,36 +20,41 @@ function allow (mode) {
: req.path

// Check whether the resource exists
ldp.exists(req.hostname, reqPath, (err, ret) => {
// Ensure directories always end in a slash
const stat = err ? null : ret.stream
if (!reqPath.endsWith('/') && stat && stat.isDirectory()) {
reqPath += '/'
}
let stat
try {
const ret = await ldp.exists(req.hostname, reqPath)
stat = ret.stream
} catch (err) {
stat = null
}

// Obtain and store the ACL of the requested resource
req.acl = new ACL(rootUrl + reqPath, {
origin: req.get('origin'),
host: req.protocol + '://' + req.get('host'),
fetch: fetchFromLdp(mapper, ldp),
fetchGraph: (uri, options) => {
// first try loading from local fs
return ldp.getGraph(uri, options.contentType)
// failing that, fetch remote graph
.catch(() => ldp.fetchGraph(uri, options))
},
suffix: ldp.suffixAcl,
strictOrigin: ldp.strictOrigin
})
// Ensure directories always end in a slash
if (!reqPath.endsWith('/') && stat && stat.isDirectory()) {
reqPath += '/'
}

// Ensure the user has the required permission
const userId = req.session.userId
req.acl.can(userId, mode)
.then(() => next(), err => {
debug(`${mode} access denied to ${userId || '(none)'}`)
next(err)
})
// Obtain and store the ACL of the requested resource
req.acl = new ACL(rootUrl + reqPath, {
origin: req.get('origin'),
host: req.protocol + '://' + req.get('host'),
fetch: fetchFromLdp(ldp.resourceMapper, ldp),
fetchGraph: (uri, options) => {
// first try loading from local fs
return ldp.getGraph(uri, options.contentType)
// failing that, fetch remote graph
.catch(() => ldp.fetchGraph(uri, options))
},
suffix: ldp.suffixAcl,
strictOrigin: ldp.strictOrigin
})

// Ensure the user has the required permission
const userId = req.session.userId
req.acl.can(userId, mode)
.then(() => next(), err => {
debug(`${mode} access denied to ${userId || '(none)'}`)
next(err)
})
}
}

Expand All @@ -71,19 +68,6 @@ function allow (mode) {
*/
function fetchFromLdp (mapper, ldp) {
return function fetch (url, callback) {
// Convert the URL into a filename
mapper.mapUrlToFile({ url })
// Read the file from disk
.then(({ path }) => new Promise((resolve, reject) => {
ldp.readFile(path, (e, c) => e ? reject(e) : resolve(c))
}))
// Parse the file as Turtle
.then(body => {
const graph = $rdf.graph()
$rdf.parse(body, graph, url, 'text/turtle')
return graph
})
// Return the ACL graph
.then(graph => callback(null, graph), callback)
ldp.getGraph(url).then(g => callback(null, g), callback)
}
}
31 changes: 15 additions & 16 deletions lib/handlers/copy.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ module.exports = handler
const debug = require('../debug')
const error = require('../http-error')
const ldpCopy = require('../ldp-copy')
const utils = require('../utils')
const url = require('url')

/**
Expand All @@ -14,25 +13,25 @@ const url = require('url')
* "Save an external resource to Solid" type apps.
* @method handler
*/
function handler (req, res, next) {
async function handler (req, res, next) {
const copyFrom = req.header('Source')
if (!copyFrom) {
return next(error(400, 'Source header required'))
}
const fromExternal = !!url.parse(copyFrom).hostname
const serverRoot = utils.getBaseUri(req)
const ldp = req.app.locals.ldp
const serverRoot = ldp.resourceMapper.getBaseUrl(req.hostname)
const copyFromUrl = fromExternal ? copyFrom : serverRoot + copyFrom
const copyTo = res.locals.path || req.path
const copyToPath = utils.reqToPath(req)
ldpCopy(copyToPath, copyFromUrl, function (err) {
if (err) {
let statusCode = err.statusCode || 500
let errorMessage = err.statusMessage || err.message
debug.handlers('Error with COPY request:' + errorMessage)
return next(error(statusCode, errorMessage))
}
res.set('Location', copyTo)
res.sendStatus(201)
next()
})
const copyToUrl = res.locals.path || req.path
try {
await ldpCopy(ldp.resourceMapper, copyToUrl, copyFromUrl)
} catch (err) {
let statusCode = err.statusCode || 500
let errorMessage = err.statusMessage || err.message
debug.handlers('Error with COPY request:' + errorMessage)
return next(error(statusCode, errorMessage))
}
res.set('Location', copyToUrl)
res.sendStatus(201)
next()
}
16 changes: 8 additions & 8 deletions lib/handlers/delete.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@ module.exports = handler

const debug = require('../debug').handlers

function handler (req, res, next) {
async function handler (req, res, next) {
debug('DELETE -- Request on' + req.originalUrl)

const ldp = req.app.locals.ldp
ldp.delete(req.hostname, req.path, function (err) {
if (err) {
debug('DELETE -- Failed to delete: ' + err)
return next(err)
}
try {
await ldp.delete(req)
debug('DELETE -- Ok.')
res.sendStatus(200)
return next()
})
next()
} catch (err) {
debug('DELETE -- Failed to delete: ' + err)
next(err)
}
}
Loading