Commit ce5d956921aab50f34172d2e227107bd31ce6fb5
1 parent
a2839442c9
Exists in
master
Include req.ip on callback report
Showing 2 changed files with 13 additions and 3 deletions Inline Diff
lib/callback/main-handler.js
1 | const MODULE_NAME = 'CALLBACK.MAIN-HANDLER'; | 1 | const MODULE_NAME = 'CALLBACK.MAIN-HANDLER'; |
2 | 2 | ||
3 | const logger = require('tektrans-logger'); | 3 | const logger = require('tektrans-logger'); |
4 | 4 | ||
5 | const parseResult = require('../parse-result'); | 5 | const parseResult = require('../parse-result'); |
6 | 6 | ||
7 | module.exports = (req, res) => { | 7 | module.exports = (req, res) => { |
8 | res.end('ACK\n'); | 8 | res.end('ACK\n'); |
9 | 9 | ||
10 | const { xid } = res.locals; | 10 | const { xid } = res.locals; |
11 | 11 | ||
12 | if (!req.body) { | 12 | if (!req.body) { |
13 | logger.verbose(`${MODULE_NAME} 18FCF551: Ignoring request without body`, { xid }); | 13 | logger.verbose(`${MODULE_NAME} 18FCF551: Ignoring request without body`, { xid }); |
14 | 14 | ||
15 | return; | 15 | return; |
16 | } | 16 | } |
17 | 17 | ||
18 | if (typeof req.body !== 'string') { | 18 | if (typeof req.body !== 'string') { |
19 | logger.verbose(`${MODULE_NAME} 55F8AB88: Ignoring request with non string type`, { | 19 | logger.verbose(`${MODULE_NAME} 55F8AB88: Ignoring request with non string type`, { |
20 | xid, | 20 | xid, |
21 | typeofBody: typeof req.body, | 21 | typeofBody: typeof req.body, |
22 | }); | 22 | }); |
23 | 23 | ||
24 | return; | 24 | return; |
25 | } | 25 | } |
26 | 26 | ||
27 | logger.verbose(`${MODULE_NAME} 48B1E679: Parsing callback`, { xid }); | 27 | logger.verbose(`${MODULE_NAME} 48B1E679: Parsing callback`, { |
28 | parseResult(xid, null, req.body, true); | 28 | xid, |
29 | ip: req.ip, | ||
30 | method: req.method, | ||
31 | url: req.url, | ||
32 | qs: req.query, | ||
33 | contentType: req.get('content-type'), | ||
34 | body: req.body, | ||
35 | |||
36 | }); | ||
37 | parseResult(xid, null, req.body, true, req.ip); | ||
29 | }; | 38 | }; |
30 | 39 |
lib/parse-result.js
1 | const MODULE_NAME = 'PARSE-RESULT'; | 1 | const MODULE_NAME = 'PARSE-RESULT'; |
2 | 2 | ||
3 | const config = require('komodo-sdk/config'); | 3 | const config = require('komodo-sdk/config'); |
4 | const logger = require('tektrans-logger'); | 4 | const logger = require('tektrans-logger'); |
5 | 5 | ||
6 | const getParamsMemberObj = require('./generic-xmlrpc/get-params-members-obj'); | 6 | const getParamsMemberObj = require('./generic-xmlrpc/get-params-members-obj'); |
7 | const parseXml = require('./parse-xml'); | 7 | const parseXml = require('./parse-xml'); |
8 | 8 | ||
9 | const report = require('./report'); | 9 | const report = require('./report'); |
10 | const translateRc = require('./translate-rc'); | 10 | const translateRc = require('./translate-rc'); |
11 | const messageExtractor = require('./message-extractor'); | 11 | const messageExtractor = require('./message-extractor'); |
12 | const patternRules = require('./pattern-rules'); | 12 | const patternRules = require('./pattern-rules'); |
13 | 13 | ||
14 | module.exports = (xid, trxIdFromCaller, xml, isCallback) => { | 14 | module.exports = (xid, trxIdFromCaller, xml, isCallback, remoteIp) => { |
15 | logger.verbose(`${MODULE_NAME} 58547863: Processing XML message`, { xid, isCallback }); | 15 | logger.verbose(`${MODULE_NAME} 58547863: Processing XML message`, { xid, isCallback }); |
16 | 16 | ||
17 | const responseType = isCallback ? 'CALLBACK' : 'DIRECT-RESPONSE'; | 17 | const responseType = isCallback ? 'CALLBACK' : 'DIRECT-RESPONSE'; |
18 | 18 | ||
19 | if (!trxIdFromCaller && !isCallback) { | 19 | if (!trxIdFromCaller && !isCallback) { |
20 | if (logger) logger.warn(`${MODULE_NAME} 8CAAD7C9: No trx id on non callback`, { xid }); | 20 | if (logger) logger.warn(`${MODULE_NAME} 8CAAD7C9: No trx id on non callback`, { xid }); |
21 | return; | 21 | return; |
22 | } | 22 | } |
23 | 23 | ||
24 | const obj = parseXml(xid, xml); | 24 | const obj = parseXml(xid, xml); |
25 | if (!obj) { | 25 | if (!obj) { |
26 | const e = new Error(`${MODULE_NAME} B46CAAD1: Invalid XML`); | 26 | const e = new Error(`${MODULE_NAME} B46CAAD1: Invalid XML`); |
27 | logger.warn(e.message, { xid }); | 27 | logger.warn(e.message, { xid }); |
28 | 28 | ||
29 | if (trxIdFromCaller) { | 29 | if (trxIdFromCaller) { |
30 | report(xid, { | 30 | report(xid, { |
31 | trx_id: trxIdFromCaller.toString(), | 31 | trx_id: trxIdFromCaller.toString(), |
32 | rc: '68', | 32 | rc: '68', |
33 | message: { | 33 | message: { |
34 | xid, | 34 | xid, |
35 | responseType, | 35 | responseType, |
36 | 'GW-ERROR': { | 36 | 'GW-ERROR': { |
37 | message: e.message, | 37 | message: e.message, |
38 | responseFromPartner: xml, | 38 | responseFromPartner: xml, |
39 | }, | 39 | }, |
40 | }, | 40 | }, |
41 | }); | 41 | }); |
42 | } | 42 | } |
43 | 43 | ||
44 | return; | 44 | return; |
45 | } | 45 | } |
46 | 46 | ||
47 | const params = getParamsMemberObj(obj, false); | 47 | const params = getParamsMemberObj(obj, false); |
48 | 48 | ||
49 | if (!params) { | 49 | if (!params) { |
50 | const e = new Error(`${MODULE_NAME} A7B7EB30: Can not get params from message`); | 50 | const e = new Error(`${MODULE_NAME} A7B7EB30: Can not get params from message`); |
51 | logger.warn(e.message, { xid }); | 51 | logger.warn(e.message, { xid }); |
52 | 52 | ||
53 | if (trxIdFromCaller) { | 53 | if (trxIdFromCaller) { |
54 | report(xid, { | 54 | report(xid, { |
55 | trx_id: trxIdFromCaller.toString(), | 55 | trx_id: trxIdFromCaller.toString(), |
56 | rc: '68', | 56 | rc: '68', |
57 | message: { | 57 | message: { |
58 | xid, | 58 | xid, |
59 | responseType, | 59 | responseType, |
60 | 'GW-ERROR': { | 60 | 'GW-ERROR': { |
61 | message: e.message, | 61 | message: e.message, |
62 | responseFromPartner: obj, | 62 | responseFromPartner: obj, |
63 | }, | 63 | }, |
64 | }, | 64 | }, |
65 | }); | 65 | }); |
66 | } | 66 | } |
67 | } | 67 | } |
68 | 68 | ||
69 | logger.verbose(`${MODULE_NAME} 3D5400C1: Params extracted from response`, { xid, params }); | 69 | logger.verbose(`${MODULE_NAME} 3D5400C1: Params extracted from response`, { xid, params }); |
70 | 70 | ||
71 | const requestIdField = (config.partner.xmlrpc_field && config.partner.xmlrpc_field.requestId) || 'REQUESTID'; | 71 | const requestIdField = (config.partner.xmlrpc_field && config.partner.xmlrpc_field.requestId) || 'REQUESTID'; |
72 | const requestIdFromResponse = params[requestIdField]; | 72 | const requestIdFromResponse = params[requestIdField]; |
73 | 73 | ||
74 | const responseCodeField = (config.partner.xmlrpc_field && config.partner.xmlrpc_field.responseCode) || 'RESPONSECODE'; | 74 | const responseCodeField = (config.partner.xmlrpc_field && config.partner.xmlrpc_field.responseCode) || 'RESPONSECODE'; |
75 | const responseCodeFromResponse = params[responseCodeField]; | 75 | const responseCodeFromResponse = params[responseCodeField]; |
76 | 76 | ||
77 | const messageField = (config.partner.xmlrpc_field && config.partner.xmlrpc_field.message) || 'MESSAGE'; | 77 | const messageField = (config.partner.xmlrpc_field && config.partner.xmlrpc_field.message) || 'MESSAGE'; |
78 | const messageFromResponse = params[messageField]; | 78 | const messageFromResponse = params[messageField]; |
79 | 79 | ||
80 | const snField = (config.partner.xmlrpc_field && config.partner.xmlrpc_field.sn) || 'SN'; | 80 | const snField = (config.partner.xmlrpc_field && config.partner.xmlrpc_field.sn) || 'SN'; |
81 | const snFromResponse = params[snField]; | 81 | const snFromResponse = params[snField]; |
82 | 82 | ||
83 | const trxId = trxIdFromCaller || requestIdFromResponse; | 83 | const trxId = trxIdFromCaller || requestIdFromResponse; |
84 | if (!trxId) { | 84 | if (!trxId) { |
85 | logger.warn(`${MODULE_NAME} 534E684A: Unknown trxId`, { xid }); | 85 | logger.warn(`${MODULE_NAME} 534E684A: Unknown trxId`, { xid }); |
86 | return; | 86 | return; |
87 | } | 87 | } |
88 | 88 | ||
89 | const rc = translateRc(xid, responseCodeFromResponse) || '68'; | 89 | const rc = translateRc(xid, responseCodeFromResponse) || '68'; |
90 | 90 | ||
91 | const sn = ( | 91 | const sn = ( |
92 | rc === '00' && ( | 92 | rc === '00' && ( |
93 | snFromResponse | 93 | snFromResponse |
94 | || messageExtractor(patternRules.sn, messageFromResponse) | 94 | || messageExtractor(patternRules.sn, messageFromResponse) |
95 | ) | 95 | ) |
96 | ) || null; | 96 | ) || null; |
97 | 97 | ||
98 | const amount = Number(messageExtractor(patternRules.price, messageFromResponse) || '') || null; | 98 | const amount = Number(messageExtractor(patternRules.price, messageFromResponse) || '') || null; |
99 | const balance = Number(messageExtractor(patternRules.balance, messageFromResponse) || '') || null; | 99 | const balance = Number(messageExtractor(patternRules.balance, messageFromResponse) || '') || null; |
100 | 100 | ||
101 | report(xid, { | 101 | report(xid, { |
102 | trx_id: trxId.toString(), | 102 | trx_id: trxId.toString(), |
103 | rc, | 103 | rc, |
104 | sn, | 104 | sn, |
105 | amount, | 105 | amount, |
106 | balance, | 106 | balance, |
107 | message: { | 107 | message: { |
108 | xid, | 108 | xid, |
109 | ip: remoteIp || null, | ||
109 | responseType: isCallback ? 'CALLBACK' : 'DIRECT-RESPONSE', | 110 | responseType: isCallback ? 'CALLBACK' : 'DIRECT-RESPONSE', |
110 | message: params, | 111 | message: params, |
111 | }, | 112 | }, |
112 | }); | 113 | }); |
113 | }; | 114 | }; |
114 | 115 |