transport.js
3.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
"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(onRequestFromPartner).listen(listenPort, function() {
logger.info('Center HTTP server listen on port ' + listenPort);
});;
}
function onRequestFromPartner(req, res) {
const method_name = 'onRequestFromPartner';
let remote_address = req.connection.remoteAddress.replace(/^::ffff:/, '');
let qs = url.parse(req.url, true).query;
logger.verbose('Got a request from partner', {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;
for (let key in data) {
if (data.hasOwnProperty(key)) {
if (key.indexOf('[') >= 0) { delete data[key]; }
}
}
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;