UNPKG

dmc

Version:

Cross-platform, developer cli tool for Salesforce

107 lines (92 loc) 2.49 kB
var fs = require('fs-extra'); var http = require('http'); var logger = require('../lib/logger.js'); var re = /^\/oauth\/\_callback*/; var handlebars = require('handlebars'); var path = require('path'); var qs = require('querystring'); var sockets = {}; var nextSocketId = 0; var authTemplate = handlebars.compile( fs.readFileSync(path.resolve(__dirname, '../templates/oauth.hbs'), { encoding: 'utf8' }) ); function getCredentials(url) { var parts = url.split('?'); if(parts.length !== 2) { logger.error('invalid split: ' + parts.length); return; } return qs.parse(parts[1]); } function handleCallback(req, res) { //var creds = getCredentials(req.url); var body = authTemplate(); logger.log('salesforce callback received'); res.writeHead(200, { 'Content-Length': body.length, 'Content-Type': 'text/html' }); res.end(body, 'utf8'); } function handleAuthPost(req, res) { logger.log('auth post received'); var creds = getCredentials(req.url); res.on('finish', function(){ closeAllSockets(); if(creds && !creds.error) { server.emit('credentials', creds); } else { logger.error('credentials not received'); process.exit(1); } }); if(creds && !creds.error) { res.writeHead(200, { 'Content-Length': '0', 'Content-Type': 'application/json' }); } else { res.writeHead(400, { 'Content-Length': '0', 'Content-Type': 'application/json' }); } res.end(); } function handleNotFound(req, res) { var body = 'not found'; res.writeHead(404, { 'Content-Length': body.length, 'Content-Type': 'text/plain' }); res.end(body, 'utf8'); } var server = http.createServer(function(req, res) { logger.debug('req url: ' + req.url); var body; if(req.method === 'GET' && re.test(req.url)) { handleCallback(req, res); } else if(req.method === 'POST' && re.test(req.url)) { handleAuthPost(req, res); } else { handleNotFound(req, res); } }); server.on('connection', function (socket) { // Add a newly connected socket var socketId = nextSocketId++; sockets[socketId] = socket; // Remove the socket when it closes socket.on('close', function () { delete sockets[socketId]; }); }); function closeAllSockets() { for (var socketId in sockets) { sockets[socketId].destroy(); if(sockets[socketId]) delete sockets[socketId]; } } module.exports = server;