Commit 48ba4619d04ded0617eea07dbdd3be6f251849aa
1 parent
23bee92dd5
Exists in
master
Trust proxy by config.partner.callback.trust_proxy
Showing 2 changed files with 9 additions and 0 deletions Inline Diff
config.sample.json
1 | { | 1 | { |
2 | "handler_name": "KOMODO-GW-HTTPGETX", | 2 | "handler_name": "KOMODO-GW-HTTPGETX", |
3 | "pull_interval_ms": 1000, | 3 | "pull_interval_ms": 1000, |
4 | "partner": { | 4 | "partner": { |
5 | "url": "http://PLEASE_CHANGE_ME:25614", | 5 | "url": "http://PLEASE_CHANGE_ME:25614", |
6 | "terminal_name": "PLEASE_CHANGE_ME", | 6 | "terminal_name": "PLEASE_CHANGE_ME", |
7 | "password": "PLEASE_CHANGE_ME", | 7 | "password": "PLEASE_CHANGE_ME", |
8 | "dump_request": true, | 8 | "dump_request": true, |
9 | "callback": { | 9 | "callback": { |
10 | "port": 14000, | 10 | "port": 14000, |
11 | "url": "http://PLEASE_CHANGE_ME:14000", | 11 | "url": "http://PLEASE_CHANGE_ME:14000", |
12 | "apikey": [ | 12 | "apikey": [ |
13 | "PLEASE_CHANGE_ME" | 13 | "PLEASE_CHANGE_ME" |
14 | ], | 14 | ], |
15 | "trust_proxy": ["loopback"], | ||
15 | "dump_request": true | 16 | "dump_request": true |
16 | } | 17 | } |
17 | }, | 18 | }, |
18 | "control_panel": { | 19 | "control_panel": { |
19 | "listen_port": 16101, | 20 | "listen_port": 16101, |
20 | "url": "http://localhost:16101/" | 21 | "url": "http://localhost:16101/" |
21 | }, | 22 | }, |
22 | "apiserver": { | 23 | "apiserver": { |
23 | "port": 16102, | 24 | "port": 16102, |
24 | "apikey": "PLEASE_CHANGE_ME", | 25 | "apikey": "PLEASE_CHANGE_ME", |
25 | "url": "http://localhost:16102/apikey/PLEASE_CHANGE_ME" | 26 | "url": "http://localhost:16102/apikey/PLEASE_CHANGE_ME" |
26 | }, | 27 | }, |
27 | "push_server": { | 28 | "push_server": { |
28 | "apikey": "PLEASE_CHANGE_ME", | 29 | "apikey": "PLEASE_CHANGE_ME", |
29 | "advice": { | 30 | "advice": { |
30 | "port": 16103, | 31 | "port": 16103, |
31 | "url": "http://localhost:16103/apikey/PLEASE_CHANGE_ME/advice" | 32 | "url": "http://localhost:16103/apikey/PLEASE_CHANGE_ME/advice" |
32 | } | 33 | } |
33 | }, | 34 | }, |
34 | "products": [ | 35 | "products": [ |
35 | ], | 36 | ], |
36 | "remote_products": {}, | 37 | "remote_products": {}, |
37 | "do_not_verbose_log_report": true | 38 | "do_not_verbose_log_report": true |
38 | } | 39 | } |
lib/callback/index.js
1 | const MODULE_NAME = 'CALLBACK'; | 1 | const MODULE_NAME = 'CALLBACK'; |
2 | 2 | ||
3 | const express = require('express'); | 3 | const express = require('express'); |
4 | const uniqid = require('uniqid'); | 4 | const uniqid = require('uniqid'); |
5 | 5 | ||
6 | const config = require('komodo-sdk/config'); | 6 | const config = require('komodo-sdk/config'); |
7 | const logger = require('tektrans-logger'); | 7 | const logger = require('tektrans-logger'); |
8 | 8 | ||
9 | const morgan = require('morgan'); | 9 | const morgan = require('morgan'); |
10 | const moment = require('moment'); | 10 | const moment = require('moment'); |
11 | const rfs = require('rotating-file-stream'); | 11 | const rfs = require('rotating-file-stream'); |
12 | 12 | ||
13 | const dumper = require('./dumper'); | 13 | const dumper = require('./dumper'); |
14 | const apikeyChecker = require('./apikey-checker'); | 14 | const apikeyChecker = require('./apikey-checker'); |
15 | const handlerPrepaid = require('./handler-prepaid'); | 15 | const handlerPrepaid = require('./handler-prepaid'); |
16 | const handlerPostpaid = require('./handler-postpaid'); | 16 | const handlerPostpaid = require('./handler-postpaid'); |
17 | 17 | ||
18 | const baseFileName = 'logs/callback_access_log'; | 18 | const baseFileName = 'logs/callback_access_log'; |
19 | 19 | ||
20 | const app = express(); | 20 | const app = express(); |
21 | 21 | ||
22 | const listenPort = config.partner.callback && config.partner.callback.port; | 22 | const listenPort = config.partner.callback && config.partner.callback.port; |
23 | 23 | ||
24 | if (!listenPort) { | 24 | if (!listenPort) { |
25 | logger.warn(`${MODULE_NAME} BC903CB7: Unknown listen port. Please specified on config.partner.callback.port`); | 25 | logger.warn(`${MODULE_NAME} BC903CB7: Unknown listen port. Please specified on config.partner.callback.port`); |
26 | process.exit(1); | 26 | process.exit(1); |
27 | } | 27 | } |
28 | 28 | ||
29 | if (config.partner && config.partner.callback && config.partner.callback.trust_proxy) { | ||
30 | logger.verbose(`${MODULE_NAME} 9774C2DB: Trusting proxy`, { | ||
31 | trusted: config.partner.callback.trust_proxy, | ||
32 | }); | ||
33 | |||
34 | app.set('trust proxy', config.partner.callback.trust_proxy); | ||
35 | } | ||
36 | |||
29 | app.use((req, res, next) => { | 37 | app.use((req, res, next) => { |
30 | res.locals.xid = uniqid(); | 38 | res.locals.xid = uniqid(); |
31 | next(); | 39 | next(); |
32 | }); | 40 | }); |
33 | 41 | ||
34 | morgan.token('xid', (req, res) => (res.locals.xid)); | 42 | morgan.token('xid', (req, res) => (res.locals.xid)); |
35 | 43 | ||
36 | const accessLogFilenameGenerator = (time, index) => { | 44 | const accessLogFilenameGenerator = (time, index) => { |
37 | if (!time) return baseFileName; | 45 | if (!time) return baseFileName; |
38 | 46 | ||
39 | return [ | 47 | return [ |
40 | baseFileName, | 48 | baseFileName, |
41 | moment(time).format('YYYY-MM-DD'), | 49 | moment(time).format('YYYY-MM-DD'), |
42 | index || null, | 50 | index || null, |
43 | ].filter((item) => item) | 51 | ].filter((item) => item) |
44 | .join('.'); | 52 | .join('.'); |
45 | }; | 53 | }; |
46 | 54 | ||
47 | const accessLogStream = rfs.createStream(accessLogFilenameGenerator, { | 55 | const accessLogStream = rfs.createStream(accessLogFilenameGenerator, { |
48 | interval: '1d', | 56 | interval: '1d', |
49 | }); | 57 | }); |
50 | 58 | ||
51 | app.use( | 59 | app.use( |
52 | morgan( | 60 | morgan( |
53 | ':remote-addr - :remote-user [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length] ":referrer" ":user-agent" :xid', | 61 | ':remote-addr - :remote-user [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length] ":referrer" ":user-agent" :xid', |
54 | { | 62 | { |
55 | stream: accessLogStream, | 63 | stream: accessLogStream, |
56 | }, | 64 | }, |
57 | ), | 65 | ), |
58 | ); | 66 | ); |
59 | 67 | ||
60 | app.use((req, res, next) => { | 68 | app.use((req, res, next) => { |
61 | const { xid } = res.locals; | 69 | const { xid } = res.locals; |
62 | 70 | ||
63 | logger.info(`${MODULE_NAME} 78F5DD49: Got a request on callback listener`, { | 71 | logger.info(`${MODULE_NAME} 78F5DD49: Got a request on callback listener`, { |
64 | xid, | 72 | xid, |
65 | ip: req.ip, | 73 | ip: req.ip, |
66 | method: req.method, | 74 | method: req.method, |
67 | url: req.url, | 75 | url: req.url, |
68 | }); | 76 | }); |
69 | 77 | ||
70 | next(); | 78 | next(); |
71 | }); | 79 | }); |
72 | 80 | ||
73 | app.use('/apikey/:apikey', apikeyChecker); | 81 | app.use('/apikey/:apikey', apikeyChecker); |
74 | app.use('/apikey/:apikey', express.urlencoded({ extended: true })); | 82 | app.use('/apikey/:apikey', express.urlencoded({ extended: true })); |
75 | app.use('/apikey/:apikey', express.json()); | 83 | app.use('/apikey/:apikey', express.json()); |
76 | 84 | ||
77 | app.use('/apikey/:apikey', dumper); | 85 | app.use('/apikey/:apikey', dumper); |
78 | app.use('/apikey/:apikey/prepaid', handlerPrepaid); | 86 | app.use('/apikey/:apikey/prepaid', handlerPrepaid); |
79 | app.use('/apikey/:apikey/TOPUP', handlerPrepaid); | 87 | app.use('/apikey/:apikey/TOPUP', handlerPrepaid); |
80 | app.use('/apikey/:apikey/:hitType', handlerPostpaid); | 88 | app.use('/apikey/:apikey/:hitType', handlerPostpaid); |
81 | 89 | ||
82 | app | 90 | app |
83 | .listen(listenPort, () => { | 91 | .listen(listenPort, () => { |
84 | logger.info(`${MODULE_NAME} F702D60D: Callback listener ready to get request`, { | 92 | logger.info(`${MODULE_NAME} F702D60D: Callback listener ready to get request`, { |
85 | listenPort, | 93 | listenPort, |
86 | }); | 94 | }); |
87 | }) | 95 | }) |
88 | .on('error', (e) => { | 96 | .on('error', (e) => { |
89 | logger.warn(`${MODULE_NAME} B299BD82: Exception on EXPRESS SERVER`, { | 97 | logger.warn(`${MODULE_NAME} B299BD82: Exception on EXPRESS SERVER`, { |
90 | eCode: e.code, | 98 | eCode: e.code, |
91 | eMessage: e.message, | 99 | eMessage: e.message, |
92 | }); | 100 | }); |
93 | 101 | ||
94 | process.exit(1); | 102 | process.exit(1); |
95 | }); | 103 | }); |
96 | 104 |