UNPKG

cozy-proxy

Version:

Cozy Proxy redirects requests properly to the right application of the Cozy platform depending on given path. It also handles authentication to the Cozy for users and devices.

105 lines (91 loc) 3.2 kB
// Generated by CoffeeScript 1.10.0 var async, config, errorHandler, fs, http, httpProxy, logger, passport, proxy, router, urlHelper; http = require('http'); fs = require('graceful-fs'); httpProxy = require('http-proxy'); async = require('async'); passport = require('passport'); config = require('../config'); urlHelper = require('cozy-url-sdk'); logger = require('printit')({ date: false, prefix: 'lib:proxy' }); router = require('./router'); errorHandler = require('../middlewares/errors'); proxy = null; module.exports.getProxy = function() { return proxy; }; module.exports.initializeProxy = function(app, server) { proxy = httpProxy.createProxyServer({ agent: new http.Agent() }); proxy.on('error', function(err, req, res) { logger.error("Error connecting to " + req.url); logger.error(err); err = new Error(err); err.statusCode = 500; err.template = { name: 'error' }; return errorHandler(err, req, res); }); return server.on('upgrade', function(req, socket, head) { var cookieParser, fakeRes, initialize, ref, session, sessionParser; req.originalUrl = req.url; fakeRes = { on: function() {} }; ref = config.authSteps, cookieParser = ref[0], sessionParser = ref[1], initialize = ref[2], session = ref[3]; return async.series([ function(callback) { return cookieParser(req, fakeRes, callback); }, function(callback) { return sessionParser(req, fakeRes, callback); }, function(callback) { return initialize(req, fakeRes, callback); }, function(callback) { return session(req, fakeRes, callback); } ], function(err) { var _, fail, host, port, proxyWS, publicOrPrivate, ref1, ref2, routes, slug, urlHelperSlug; proxyWS = function(host, port) { return proxy.ws(req, socket, head, { target: "ws://" + host + ":" + port, ws: true }); }; fail = function(err) { if (err != null) { logger.error(err); } logger.error("Socket unauthorized"); return socket.end("HTTP/1.1 400 Connection Refused \r\n" + "Connection: close\r\n\r\n", 'ascii'); }; if (err) { return fail(err); } ref1 = req.url.split('/'), _ = ref1[0], publicOrPrivate = ref1[1], slug = ref1[2]; routes = router.getRoutes(); urlHelperSlug = slug.replace('data-system', 'dataSystem'); host = 'localhost'; port = (ref2 = routes[slug]) != null ? ref2.port : void 0; if (urlHelper[urlHelperSlug]) { host = urlHelper[urlHelperSlug].host(); port = urlHelper[urlHelperSlug].port(); } if (publicOrPrivate === 'public') { req.url = req.url.replace("/public/" + slug, '/public'); return proxyWS(host, port); } else if (publicOrPrivate === 'apps' && req.isAuthenticated()) { req.url = req.url.replace("/apps/" + slug, ''); return proxyWS(host, port); } else if (req.isAuthenticated()) { return proxyWS(urlHelper.home.host(), urlHelper.home.port()); } else { return fail(new Error('socket not authorized')); } }); }); };