Skip to content
Merged
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
2 changes: 1 addition & 1 deletion bin/ldnode.js
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ argv.live = !argv.noLive;

// Set up debug environment
process.env.DEBUG = argv.verbose ? 'ldnode:*' : false;
var debug = require('../lib/logging').server;
var debug = require('../lib/debug').server;

// Set up port
argv.port = argv.port || 3456;
Expand Down
227 changes: 2 additions & 225 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,229 +1,6 @@
/*jslint node: true*/
"use strict";

// Third-party dependencies
var express = require('express');
var app = express();
var getRawBody = require('raw-body');
var expressWs = require('express-ws');
var fs = require('fs');
var responseTime = require('response-time'); // Add X-Response-Time headers
var path = require('path');
var session = require('express-session');
var http = require('http');
var https = require('https');
var request = require('request');
var uuid = require('node-uuid');
var cors = require('cors');

// ldnode dependencies
var acl = require('./lib/acl');
var metadata = require('./lib/metadata');
var header = require('./lib/header');
var LDP = require('./lib/ldp');
var login = require('./lib/login');
var parse = require('./lib/parse');
var debug = require('./lib/logging');

// Request handlers
var getHandler = require('./lib/handlers/get.js');
var postHandler = require('./lib/handlers/post.js');
var putHandler = require('./lib/handlers/put.js');
var deleteHandler = require('./lib/handlers/delete.js');
var patchHandler = require('./lib/handlers/patch.js');

// Error page handler
var errorHandler = require('./lib/handlers/error.js');

// Setting up cors
var corsSettings = cors({
methods: [
'OPTIONS', 'HEAD', 'GET',
'PATCH', 'POST', 'PUT', 'DELETE'
],
exposedHeaders: 'User, Location, Link, Vary, Last-Modified, Content-Length',
credentials: true,
maxAge: 1728000,
origin: true
});

function ldnode (argv) {
var ldp = new LDP(argv);
var app = express();

// Setting options as local variable
app.locals.ldp = ldp;

// Session
app.use(session({
secret: ldp.secret || uuid.v1(),
saveUninitialized: false,
resave: false
}));

// Adding proxy
if (ldp.proxy) {
proxy(app, ldp.proxy);
}

// Setting up routes
app.use('/', routes());

// Setup Express app
if (ldp.live) {
ws(app);
}

debug.server("Router attached to " + ldp.mount);

return app;
}

function createServer(argv) {
var app = express();
var ldpApp = ldnode(argv);
var ldp = ldpApp.locals.ldp;
app.use(ldp.mount, ldpApp);

if (ldp && (ldp.webid || ldp.key || ldp.cert) ) {
debug.settings("SSL Private Key path: " + ldp.key);
debug.settings("SSL Certificate path: " + ldp.cert);

if (!ldp.cert && !ldp.key) {
throw new Error("Missing SSL cert and SSL key to enable WebID");
}

if (!ldp.key && ldp.cert) {
throw new Error("Missing path for SSL key");
}

if (!ldp.cert && ldp.key) {
throw new Error("Missing path for SSL cert");
}

var key;
try {
key = fs.readFileSync(ldp.key);
} catch(e) {
throw new Error("Can't find SSL key in " + ldp.key);
}

var cert;
try {
cert = fs.readFileSync(ldp.cert);
} catch(e) {
throw new Error("Can't find SSL cert in " + ldp.cert);
}

var credentials = {
key: key,
cert: cert,
requestCert: true
};

debug.settings("Certificate: " + credentials.cert);

return https.createServer(credentials, app);
}

return app;
}

function proxy (app, path) {
debug.settings('XSS Proxy listening to ' + path);
app.get(
path,
cors({
methods: ['GET'],
exposedHeaders: 'User, Location, Link, Vary, Last-Modified, Content-Length',
credentials: true,
maxAge: 1728000,
origin: true
}),
function (req, res) {
debug.settings('originalUrl: ' + req.originalUrl);
var uri = req.query.uri;
if (!uri) {
return res
.status(400)
.send("Proxy has no uri param ");
}

debug.settings('Proxy destination URI: ' + uri);
request.get(uri).pipe(res);
});
}

function routes () {
var router = express.Router('/');

// Add Link headers
router.use(header.linksHandler);

// Setting CORS
router.use(corsSettings);

router.use('/*', function(req, res, next) {
getRawBody(req,
{
length: req.headers['content-length'],
encoding: 'utf-8' // typer.parse(req.headers['content-type']).parameters.charset
},
function(err, string) {
if (err) {
return next(err);
}
req.text = string;
next();
});
});

router.use('/*', login.loginHandler);

//ACL handlers
router.get("/*", acl.allowReadHandler);
router.head("/*", acl.allowReadHandler);
router.post("/*", acl.allowAppendThenWriteHandler);
router.patch("/*", acl.allowAppendThenWriteHandler);
router.put("/*", acl.allowAppendThenWriteHandler);
router.delete("/*", acl.allowWriteHandler);

// Convert json-ld and nquads to turtle
router.use('/*', parse.parseHandler);

// Add response time
router.use(responseTime());

// HTTP methods handlers
router.get('/*', getHandler.handler);
router.head('/*', getHandler.headHandler);
router.put('/*', putHandler.handler);
router.delete('/*', deleteHandler.handler);
router.post('/*', postHandler.handler);
router.patch('/*', patchHandler.handler);

//Error handling
router.use(errorHandler.handler);
return router;
}

function ws (app) {
expressWs(app);
app.mountpath = ''; // needs to be set for addSocketRoute aka .ws()
// was options.pathFilter
app.ws('/', function(socket, res) {
debug.subscription("incoming on " + socket.path);
socket.on('message', function(msg) {
debug.subscription("message = " + msg);
// subscribeToChanges(socket, res);
});
});
}

ldnode.proxy = proxy;
ldnode.ws = ws;
ldnode.routes = routes;
ldnode.createServer = createServer;
var ldnode = require('./lib/create-app');
ldnode.createServer = require('./lib/create-server');

module.exports = ldnode;

2 changes: 1 addition & 1 deletion lib/acl.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ var S = require('string');
var url = require('url');
var async = require('async');

var debug = require('./logging').ACL;
var debug = require('./debug').ACL;
var utils = require('./utils.js');
var ns = require('./vocab/ns.js').ns;
var rdfVocab = require('./vocab/rdf.js');
Expand Down
67 changes: 67 additions & 0 deletions lib/create-app.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
module.exports = createApp;

var express = require('express');
var expressWs = require('express-ws');
var session = require('express-session');
var uuid = require('node-uuid');
var cors = require('cors');

var debug = require('./debug');
var LDP = require('./ldp');
var LdpMiddleware = require('./ldp-middleware');

var proxy = require('./handlers/proxy')

var corsSettings = cors({
methods: [
'OPTIONS', 'HEAD', 'GET',
'PATCH', 'POST', 'PUT', 'DELETE'
],
exposedHeaders: 'User, Location, Link, Vary, Last-Modified, Content-Length',
credentials: true,
maxAge: 1728000,
origin: true
});

function ws (app) {
expressWs(app);
app.mountpath = ''; // needs to be set for addSocketRoute aka .ws()
// was options.pathFilter
app.ws('/', function(socket, res) {
debug.subscription("incoming on " + socket.path);
socket.on('message', function(msg) {
debug.subscription("message = " + msg);
// subscribeToChanges(socket, res);
});
});
}

function createApp (argv) {
var ldp = new LDP(argv);
var app = express();

// Setting options as local variable
app.locals.ldp = ldp;

// Session
app.use(session({
secret: ldp.secret || uuid.v1(),
saveUninitialized: false,
resave: false
}));

// Adding proxy
if (ldp.proxy) {
proxy(app, ldp.proxy);
}

// Setting up routes
app.use('/', LdpMiddleware(corsSettings));

// Setup Express app
if (ldp.live) {
ws(app);
}

return app;
}
68 changes: 68 additions & 0 deletions lib/create-server.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
module.exports = createServer;

var express = require('express');
var fs = require('fs');
var https = require('https');

var debug = require('./debug');
var createApp = require('./create-app');

function createServer(argv) {
var app = express();
var ldpApp = createApp(argv);
var ldp = ldpApp.locals.ldp;

// Mount path
var mount = argv.mount || '/';
// Removing ending '/'
if (mount.length > 1 &&
mount[mount.length - 1] === '/') {
mount = mount.slice(0, -1);
}

app.use(mount, ldpApp);
debug.settings('mount: ' + mount);

if (ldp && (ldp.webid || argv.key || argv.cert) ) {
debug.settings("SSL Private Key path: " + argv.key);
debug.settings("SSL Certificate path: " + argv.cert);

if (!argv.cert && !argv.key) {
throw new Error("Missing SSL cert and SSL key to enable WebID");
}

if (!argv.key && argv.cert) {
throw new Error("Missing path for SSL key");
}

if (!argv.cert && argv.key) {
throw new Error("Missing path for SSL cert");
}

var key;
try {
key = fs.readFileSync(argv.key);
} catch(e) {
throw new Error("Can't find SSL key in " + argv.key);
}

var cert;
try {
cert = fs.readFileSync(argv.cert);
} catch(e) {
throw new Error("Can't find SSL cert in " + argv.cert);
}

var credentials = {
key: key,
cert: cert,
requestCert: true
};

debug.settings("Certificate: " + credentials.cert);

return https.createServer(credentials, app);
}

return app;
}
File renamed without changes.
2 changes: 1 addition & 1 deletion lib/handlers/delete.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"use strict";

var fs = require('fs');
var debug = require('../logging').handlers;
var debug = require('../debug').handlers;
var utils = require('../utils.js');
var metadata = require('../metadata.js');

Expand Down
Loading