UNPKG

akurath

Version:

IDE Frontend for codepsaces.io

148 lines (123 loc) 3.76 kB
// Requires var http = require('http'); var express = require('express'); var _ = require('lodash'); function setup(options, imports, register) { var workspace = imports.workspace; var logger = imports.logger.namespace("web"); // Expres app var app = express(); if (options.dev) { app.use(function(req, res, next) { logger.log("["+req.method+"]", req.url); next(); }); } // Apply middlewares app.use(express.cookieParser()); app.use(express.cookieSession({ 'key': ['sess', workspace.id].join('.'), 'secret': workspace.secret, })); // Get User and set it to res object app.use(function getUser(req, res, next) { var uid = req.session.userId; if(uid) { // Pause request stream req.pause(); return workspace.getUser(uid) .then(function(user) { // Set user res.user = user; // Activate user res.user.activate(); }, function(err) { res.user = null; }).done(function() { req.resume(); next(); }); } return next(); }); // Client-side app.get('/', function(req, res, next) { var doRedirect = false; var baseToken = options.defaultToken; var baseEmail = options.defaultEmail; if (req.query.email && req.query.token) { // Auth credential: save as cookies and redirect to clean url baseEmail = req.query.email; baseToken = req.query.token; doRedirect = true; } if ((baseToken || baseEmail) && (!req.cookies.autoAuth || doRedirect)) { if (baseEmail) { res.cookie('email', baseEmail, { httpOnly: false }); } if (baseToken) { res.cookie('token', baseToken, { httpOnly: false }) } res.cookie('autoAuth', true, { httpOnly: false }); } if (doRedirect) { return res.redirect("/"); } return next(); }); app.use('/', express.static(__dirname + '/../../client/build')); // Router app.use(app.router); // Error handling app.use(function(err, req, res, next) { if(!err) return next(); logger.error("Error:"); res.send({ 'error': err.message }, 500); logger.error(err.stack); }); // Block queries for unAuthenticated users // var authorizedPaths = []; app.all("*", function(req, res, next) { if(!needAuth(req.path) || res.user) { return next(); } // Unauthorized return res.send(403, { ok: false, data: {}, error: "Could not run API request because user was not authenticated", method: req.path, }); }); // Check if a path need auth var needAuth = function(path) { if (path == "/") return false; return _.find(authorizedPaths, function(authPath) { return path.indexOf(authPath) == 0; }) == null; }; // Disable auth for a path var disableAuth = function(path) { logger.log("disable auth for", path); authorizedPaths.push(path); }; disableAuth("/static"); // Http Server var server = http.createServer(app); // Register register(null, { "server": { "app": app, "http": server, 'disableAuth': disableAuth, 'port': options.port, 'hostname': options.hostname } }); } // Exports module.exports = setup;