2019-11-23 23:08:03 +02:00

119 lines
4.4 KiB
JavaScript

module.exports = function () {
var server = {};
server.run = (db) => {
console.log("Starting Server")
return new Promise((resolve, reject) => {
const config = require('config');
const express = require('express');
const pug = require("pug");
const session = require("express-session");
const SequelizeSessionStore = require('connect-session-sequelize')(session.Store);
const bodyParser = require("body-parser");
const path = require("path");
const passport = require('passport');
const HDAuthStrategy = require('../../passport-hd-auth').Strategy;
const app = express();
app.set("view engine", "pug");
app.set("views", path.resolve("server/views"));
app.use('/static', express.static("server/static"));
// Session related stuff...
function extendDefaultFields(defaults, session) {
return {
data: defaults.data,
expires: session.cookie && session.cookie.expires ? session.cookie.expires : defaults.expires, // 157680000
userId: session.passport.user
};
}
var sessionStore = new SequelizeSessionStore({
db: db.sequelize,
table: 'session',
extendDefaultFields: extendDefaultFields
// TODO: Define expiry and clean up...
});
app.use(session({
store: sessionStore,
secret: config.get("server.secret"),
saveUninitialized: false,
cookie: config.get("server.cookie")
}));
sessionStore.sync();
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
// Setup all passport strategies
const hdAuthUtil = new HDAuthStrategy({
serverExtendedPrivateKey: config.get('bip32.serverExtendedPrivateKey'),
serverExtendedPrivateKeyDerivationPath: config.get('bip32.serverExtendedPrivateKeyDerivationPath'),
serviceAuthenticatingExtendedPublicKey: config.get('bip32.serviceAuthenticatingExtendedPublicKey')
}, function(xpub, challengeRequestDerivationPath, challengeRequestMessage, challengeResponseSignature, done) {
db.User.findOne({
include: [
{
association: db.User.ExtendedPublicKeys,
required: true,
where: {
xpub: xpub
}
}
]
}).then(user => {
if(user) {
done(null, user, {verified: true})
} else {
done(null, false);
}
}).catch(error => {
done(error);
})
});
passport.use(hdAuthUtil); // TODO: implement new hdAuthUtil.Strategy()
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
// TODO: Add memberships and things like that...
return db.User.findByPk(id) // TODO: Limit attributes...
.then(user => {
return done(null, user);
}).catch(error => {
return done(error);
})
});
app.use(passport.initialize());
app.use(passport.session());
// TODO: Create a load router module... that has inheritence...
var router = require('./router/index.js')({
app: app,
express: express,
db: db,
passport: passport,
hdAuthUtil: hdAuthUtil
});
// REGISTER OUR ROUTES -------------------------------
// all of our routes will be prefixed with /api
app.use('/', router);
const port = process.env.PORT || config.get("server.port");
app.listen(port);
resolve(port);
});
}
// TODO: other features I might wanna do in the server...
return server;
};