lamassu-server/lib/app.js
2014-04-27 11:31:34 -04:00

118 lines
3.3 KiB
JavaScript

/*jshint globalstrict: true, white: false, unused:false */
/*globals require, exports, console, module, process */
/*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
'use strict';
var http = require('http');
var https = require('https');
var path = require('path');
var express = require('express');
var morgan = require('morgan');
var fs = require('fs');
var LamassuConfig = require('lamassu-config');
var routes = require('./routes');
var Trader = require('./trader');
var PostgresqlInterface = require('./postgresql_interface');
var POLL_RE = /^poll/;
module.exports = function (options) {
var app = express();
var connectionString;
var server;
var config;
var trader;
var db;
connectionString = options.postgres ||
'postgres://lamassu:lamassu@localhost/lamassu';
config = new LamassuConfig(connectionString);
db = new PostgresqlInterface(connectionString);
trader = new Trader(db);
config.load(function (err, config) {
if (err) {
console.error('Loading config failed');
throw err;
}
trader.configure(config);
trader.startPolling();
});
config.on('configUpdate', function () {
config.load(function (err, config) {
if (err) {
return console.error('Error while reloading config');
}
trader.configure(config);
console.log('Config reloaded');
});
});
function suppressPollLog(tokens, req, res) {
return !POLL_RE.test(req.url);
}
app.use(morgan({skip: suppressPollLog }));
app.use(express.bodyParser());
if (!options.https) {
server = http.createServer(app);
}
else {
var serverOptions = {
key: options.https.key,
cert: options.https.cert,
requestCert: true,
secureProtocol: 'TLSv1_method',
ciphers: 'AES128-GCM-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH',
honorCipherOrder: true
};
server = https.createServer(serverOptions, app);
}
var authMiddleware = function (req, res, next) {
req.device = {};
return next();
};
if (options.https) {
authMiddleware = function(req, res, next) {
var fingerprint = req.connection.getPeerCertificate().fingerprint;
config.isAuthorized(fingerprint, function (err, device) {
if (err) {
var serverError = new Error('Internal Server Error');
serverError.status = 500;
return next(serverError);
}
if (!device) {
var pairError = new Error('Not Found');
pairError.status = 404;
return next(pairError);
}
next();
});
};
}
routes.init(app, config, trader, authMiddleware);
return server;
};