Commit 30b7ff4022c3782e66ad52222385e24c644e0232

Authored by Adhidarma Hadiwinoto
1 parent d654fa22f0
Exists in master

Skip invalid reverse url

Showing 1 changed file with 5 additions and 0 deletions Inline Diff

1 "use strict"; 1 "use strict";
2 2
3 process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; 3 process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
4 4
5 const module_name = require('path').basename(__filename); 5 const module_name = require('path').basename(__filename);
6 6
7 const http = require('http'); 7 const http = require('http');
8 const url = require('url'); 8 const url = require('url');
9 const request = require('request'); 9 const request = require('request');
10 10
11 const config = require('komodo-sdk/config') 11 const config = require('komodo-sdk/config')
12 const logger = require('komodo-sdk/logger'); 12 const logger = require('komodo-sdk/logger');
13 13
14 let _callback; 14 let _callback;
15 15
16 function createHttpServer() { 16 function createHttpServer() {
17 let listenPort = config.center_port; 17 let listenPort = config.center_port;
18 18
19 http.createServer(onRequestFromPartner).listen(listenPort, function() { 19 http.createServer(onRequestFromPartner).listen(listenPort, function() {
20 logger.info('Center HTTP server listen on port ' + listenPort); 20 logger.info('Center HTTP server listen on port ' + listenPort);
21 });; 21 });;
22 } 22 }
23 23
24 function onRequestFromPartner(req, res) { 24 function onRequestFromPartner(req, res) {
25 const method_name = 'onRequestFromPartner'; 25 const method_name = 'onRequestFromPartner';
26 26
27 let remote_address = req.connection.remoteAddress.replace(/^::ffff:/, ''); 27 let remote_address = req.connection.remoteAddress.replace(/^::ffff:/, '');
28 28
29 let qs = url.parse(req.url, true).query; 29 let qs = url.parse(req.url, true).query;
30 30
31 logger.verbose('Got a request from partner', {module_name: module_name, method_name: method_name, remote_address: remote_address, url: req.url, qs: qs}); 31 logger.verbose('Got a request from partner', {module_name: module_name, method_name: method_name, remote_address: remote_address, url: req.url, qs: qs});
32 32
33 let partner = qs.terminal_name + '@' + remote_address; 33 let partner = qs.terminal_name + '@' + remote_address;
34 let password = qs.password; 34 let password = qs.password;
35 let reverse_url = qs.reverse_url; 35 let reverse_url = qs.reverse_url;
36 36
37 let product_name = qs.product_name; 37 let product_name = qs.product_name;
38 let destination = qs.destination; 38 let destination = qs.destination;
39 let request_id = qs.request_id; 39 let request_id = qs.request_id;
40 40
41 if (!qs.terminal_name || !password || !reverse_url || ! product_name || !destination || !request_id) { 41 if (!qs.terminal_name || !password || !reverse_url || ! product_name || !destination || !request_id) {
42 res.end('INVALID REQUEST'); 42 res.end('INVALID REQUEST');
43 return; 43 return;
44 } 44 }
45 45
46 let msg = [ product_name, destination, password, request_id ].join('.'); 46 let msg = [ product_name, destination, password, request_id ].join('.');
47 47
48 _callback.onIncomingMessage( 48 _callback.onIncomingMessage(
49 { 49 {
50 me: config.username, 50 me: config.username,
51 partner: partner, 51 partner: partner,
52 msg: msg.trim(), 52 msg: msg.trim(),
53 reverse_url: reverse_url 53 reverse_url: reverse_url
54 }, 54 },
55 55
56 function(err, _result) { 56 function(err, _result) {
57 let result = cleanResponseToPartner(_result); 57 let result = cleanResponseToPartner(_result);
58 58
59 logger.verbose('Forwarding CORE response to partner', _result); 59 logger.verbose('Forwarding CORE response to partner', _result);
60 res.end(JSON.stringify(result)); 60 res.end(JSON.stringify(result));
61 } 61 }
62 ) 62 )
63 } 63 }
64 64
65 function cleanResponseToPartner(_data) { 65 function cleanResponseToPartner(_data) {
66 let data = JSON.parse(JSON.stringify(_data)); 66 let data = JSON.parse(JSON.stringify(_data));
67 67
68 delete data.origin; 68 delete data.origin;
69 delete data.origin_report_ip; 69 delete data.origin_report_ip;
70 delete data.origin_report_port; 70 delete data.origin_report_port;
71 delete data.reverse_url; 71 delete data.reverse_url;
72 delete data.misc; 72 delete data.misc;
73 delete data.inquiry_only; 73 delete data.inquiry_only;
74 74
75 for (let key in data) { 75 for (let key in data) {
76 76
77 if (data.hasOwnProperty(key)) { 77 if (data.hasOwnProperty(key)) {
78 78
79 if (key.indexOf('[') >= 0) { delete data[key]; } 79 if (key.indexOf('[') >= 0) { delete data[key]; }
80 80
81 } 81 }
82 } 82 }
83 83
84 return data; 84 return data;
85 } 85 }
86 86
87 function init(cb) { 87 function init(cb) {
88 if (!cb) { 88 if (!cb) {
89 logger.warn('Callback is not defined'); 89 logger.warn('Callback is not defined');
90 console.trace(); 90 console.trace();
91 process.exit(1); 91 process.exit(1);
92 return; 92 return;
93 } 93 }
94 94
95 _callback = cb; 95 _callback = cb;
96 96
97 createHttpServer(); 97 createHttpServer();
98 } 98 }
99 99
100 function _sleepAndResend(partner, msg, params, retry) { 100 function _sleepAndResend(partner, msg, params, retry) {
101 if (retry === null || retry === undefined) { 101 if (retry === null || retry === undefined) {
102 retry = Number(config.max_send_retry) || 5; 102 retry = Number(config.max_send_retry) || 5;
103 } 103 }
104 104
105 if (retry-- > 0) { 105 if (retry-- > 0) {
106 setTimeout( 106 setTimeout(
107 function() { 107 function() {
108 send(partner, msg, params, retry); 108 send(partner, msg, params, retry);
109 }, 109 },
110 (Number(config.sleep_before_retry_secs) || 60) * 1000 110 (Number(config.sleep_before_retry_secs) || 60) * 1000
111 ) 111 )
112 } 112 }
113 } 113 }
114 114
115 function send(partner, msg, params, retry) { 115 function send(partner, msg, params, retry) {
116 logger.verbose('Got response from CORE', {partner: partner, msg: msg, params: params, retry: retry}); 116 logger.verbose('Got response from CORE', {partner: partner, msg: msg, params: params, retry: retry});
117 117
118 if (!params || !params.reverse_url) { 118 if (!params || !params.reverse_url) {
119 logger.verbose('Undefined reverse_url, not forwarding message to partner'); 119 logger.verbose('Undefined reverse_url, not forwarding message to partner');
120 return; 120 return;
121 } 121 }
122 122
123 if (params.reverse_url.indexOf('http') < 0) {
124 logger.verbose('Invalid reverse_url, not forwarding message to partner');
125 return;
126 }
127
123 if (params.rc === '68') { 128 if (params.rc === '68') {
124 logger.verbose('Ignoring RC 68 reverse report'); 129 logger.verbose('Ignoring RC 68 reverse report');
125 return; 130 return;
126 } 131 }
127 132
128 let reqOptions = { 133 let reqOptions = {
129 url: params.reverse_url, 134 url: params.reverse_url,
130 qs: cleanResponseToPartner(params) 135 qs: cleanResponseToPartner(params)
131 } 136 }
132 137
133 logger.verbose('Sending reverse report to partner', {request: reqOptions}); 138 logger.verbose('Sending reverse report to partner', {request: reqOptions});
134 request(reqOptions, function(err, res, body) { 139 request(reqOptions, function(err, res, body) {
135 if (err) { 140 if (err) {
136 logger.warn('Error sending reverse report to partner', {request: reqOptions, err: err}); 141 logger.warn('Error sending reverse report to partner', {request: reqOptions, err: err});
137 _sleepAndResend(partner, msg, params, retry); 142 _sleepAndResend(partner, msg, params, retry);
138 return; 143 return;
139 } 144 }
140 145
141 if (res.statusCode != 200) { 146 if (res.statusCode != 200) {
142 logger.warn('Partner not returning HTTP status code 200 on reverse report', {request: reqOptions, http_status: res.statusCode}); 147 logger.warn('Partner not returning HTTP status code 200 on reverse report', {request: reqOptions, http_status: res.statusCode});
143 _sleepAndResend(partner, msg, params, retry); 148 _sleepAndResend(partner, msg, params, retry);
144 return; 149 return;
145 } 150 }
146 151
147 logger.verbose('Reverse report has been sent to partner', {request: reqOptions}); 152 logger.verbose('Reverse report has been sent to partner', {request: reqOptions});
148 }) 153 })
149 } 154 }
150 155
151 exports.init = init; 156 exports.init = init;
152 exports.send = send; 157 exports.send = send;
153 158