From 904f890442173c1099a8d4e8f8bbc68e0cad7f2c Mon Sep 17 00:00:00 2001 From: Jannis R Date: Mon, 15 Jan 2018 00:45:05 +0100 Subject: [PATCH] move checksum calculation to lib/request --- lib/default-profile.js | 3 +++ lib/request.js | 18 ++++++++++++++++-- p/db/index.js | 18 ++++-------------- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/lib/default-profile.js b/lib/default-profile.js index ec2a09fe..1e767cbc 100644 --- a/lib/default-profile.js +++ b/lib/default-profile.js @@ -26,6 +26,9 @@ const filters = require('../format/filters') const id = x => x const defaultProfile = { + salt: null, + addChecksum: false, + transformReqBody: id, transformReq: id, diff --git a/lib/request.js b/lib/request.js index 0eccbb52..d4494f91 100644 --- a/lib/request.js +++ b/lib/request.js @@ -1,5 +1,6 @@ 'use strict' +const crypto = require('crypto') const Promise = require('pinkie-promise') const {fetch} = require('fetch-ponyfill')({Promise}) const {stringify} = require('query-string') @@ -9,6 +10,8 @@ const hafasError = (err) => { return err } +const md5 = input => crypto.createHash('md5').update(input).digest() + const request = (profile, data) => { const body = profile.transformReqBody({lang: 'en', svcReqL: [data]}) const req = profile.transformReq({ @@ -20,10 +23,21 @@ const request = (profile, data) => { 'Accept-Encoding': 'gzip, deflate', 'user-agent': 'https://github.com/derhuerst/hafas-client' }, - query: null + query: {} }) - const url = profile.endpoint + (req.query ? '?' + stringify(req.query) : '') + if (profile.addChecksum) { + if (!Buffer.isBuffer(profile.salt)) { + throw new Error('profile.salt must be a Buffer.') + } + const checksum = md5(Buffer.concat([ + Buffer.from(req.body, 'utf8'), + profile.salt + ])) + req.query.checksum = checksum.toString('hex') + } + + const url = profile.endpoint +'?' + stringify(req.query) return fetch(url, req) .then((res) => { if (!res.ok) { diff --git a/p/db/index.js b/p/db/index.js index 4b6dd41c..a5973581 100644 --- a/p/db/index.js +++ b/p/db/index.js @@ -1,7 +1,5 @@ 'use strict' -const crypto = require('crypto') - const _createParseLine = require('../../parse/line') const _createParseJourney = require('../../parse/journey') const _formatStation = require('../../format/station') @@ -23,17 +21,6 @@ const transformReqBody = (body) => { return body } -const salt = 'bdI8UVj40K5fvxwf' -const transformReq = (req) => { - const hash = crypto.createHash('md5') - hash.update(req.body + salt) - - if (!req.query) req.query = {} - req.query.checksum = hash.digest('hex') - - return req -} - const transformJourneysQuery = (query, opt) => { const filters = query.jnyFltrL if (opt.bike) filters.push(bike) @@ -142,8 +129,11 @@ const dbProfile = { locale: 'de-DE', timezone: 'Europe/Berlin', endpoint: 'https://reiseauskunft.bahn.de/bin/mgate.exe', + + salt: Buffer.from('bdI8UVj40K5fvxwf', 'utf8'), + addChecksum: true, + transformReqBody, - transformReq, transformJourneysQuery, products: modes.allProducts,