transport.js 3.24 KB
"use strict";

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

const module_name = require('path').basename(__filename);

const http = require('http');
const url = require('url');
const request = require('request');

const config = require('komodo-sdk/config')
const logger = require('komodo-sdk/logger');

let _callback;

function createHttpServer() {
    let listenPort = config.center_port;

    http.createServer(onRequest).listen(listenPort, function() {
        logger.info('Center HTTP server listen on port ' + listenPort);
    });;
}

function onRequest(req, res) {
    const method_name = 'onRequest';

    let remote_address = req.connection.remoteAddress.replace(/^::ffff:/, '');

    let qs = url.parse(req.url, true).query;

    logger.verbose('Got a request from CORE', {module_name: module_name, method_name: method_name, remote_address: remote_address, url: req.url, qs: qs});

    let partner = qs.terminal_name + '@' + remote_address;
    let password = qs.password;
    let reverse_url = qs.reverse_url;

    let product_name = qs.product_name;
    let destination = qs.destination;
    let request_id = qs.request_id;

    if (!qs.terminal_name || !password || !reverse_url || ! product_name || !destination || !request_id) {
        res.end('INVALID REQUEST');
        return;
    }

    let msg = [ product_name, destination, password, request_id ].join('.');

    _callback.onIncomingMessage(
        {
            me: config.username,
            partner: partner,
            msg: msg.trim(),
            reverse_url: reverse_url
        },

        function(err, _result) {
            let result = cleanResponseToPartner(_result);

            logger.verbose('Forwarding CORE response to partner', _result);
            res.end(JSON.stringify(result));
        }
    )
}

function cleanResponseToPartner(_data) {
    let data = JSON.parse(JSON.stringify(_data));

    delete data.origin;
    delete data.origin_report_ip;
    delete data.origin_report_port;
    delete data.reverse_url;
    delete data.misc;
    delete data.inquiry_only;

    return data;
}

function init(cb) {
    if (!cb) {
        logger.warn('Callback is not defined');
        console.trace();
        process.exit(1);
        return;
    }

    _callback = cb;

    createHttpServer();
}

function send(partner, msg, params) {
    logger.verbose('Got response from CORE', {partner: partner, msg: msg, params: params});

    if (!params || !params.reverse_url) {
        logger.verbose('Undefined reverse_url, not forwarding message to partner');
        return;
    }


    let reqOptions = {
        url: params.reverse_url,
        qs: cleanResponseToPartner(params)
    }

    logger.verbose('Sending reverse report to partner', {request: reqOptions});
    request(reqOptions, function(err, res, body) {
        if (err) {
            logger.warn('Error sending reverse report to partner', {request: reqOptions, err: err});
            return;
        }

        if (res.statusCode != 200) {
            logger.warn('Partner not returning HTTP status code 200 on reverse report', {request: reqOptions, http_status: res.statusCode});
            return;
        }

        logger.verbose('Reverse report has been sent to partner', {request: reqOptions});
    })
}

exports.init = init;
exports.send = send;