mirror of
https://github.com/node-ebics/node-ebics-client.git
synced 2025-08-15 04:05:35 +00:00
Compare commits
1 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
b46b214e57 |
23
.github/workflows/CI.yml
vendored
23
.github/workflows/CI.yml
vendored
@@ -1,23 +0,0 @@
|
|||||||
name: CI
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ main, master ]
|
|
||||||
pull_request:
|
|
||||||
branches: [ main, master ]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
node: [ 18, 19, 20 ]
|
|
||||||
name: Node.js ${{ matrix.node }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- name: Setup node
|
|
||||||
uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
node-version: ${{ matrix.node }}
|
|
||||||
- run: npm ci
|
|
||||||
- run: npm test
|
|
10
.travis.yml
10
.travis.yml
@@ -1,8 +1,8 @@
|
|||||||
language: node_js
|
language: node_js
|
||||||
node_js:
|
node_js:
|
||||||
- "16" # maintance lts
|
- "8"
|
||||||
- "17"
|
- "9"
|
||||||
- "18" # active lts
|
- "10"
|
||||||
- "19"
|
- "11"
|
||||||
- "20" # current
|
- "12"
|
||||||
after_success: npm run coverage
|
after_success: npm run coverage
|
||||||
|
55
CHANGELOG.md
55
CHANGELOG.md
@@ -1,21 +1,5 @@
|
|||||||
### Changelog
|
### Changelog
|
||||||
|
|
||||||
#### [v4.0.0](https://github.com/node-ebics/node-ebics-client/compare/v3.0.0...v0.4.0)
|
|
||||||
|
|
||||||
- Add CI [`#75`](https://github.com/node-ebics/node-ebics-client/pull/75)
|
|
||||||
|
|
||||||
- feat: update dependencies [`a03ec22`](https://github.com/node-ebics/node-ebics-client/commit/a03ec2283fdd3dcf750c5ed448f0195d92c5c9f0)
|
|
||||||
- chore: Update dev dependency libxmljs [`3a8dc1d`](https://github.com/node-ebics/node-ebics-client/commit/3a8dc1da0bac20a6f25a687da0a783f3b52d5163)
|
|
||||||
- feat: replace <request> with <rock-req> [`b6b2751`](https://github.com/node-ebics/node-ebics-client/commit/b6b27516d5854b38dcdbe56f23967001f844e631)
|
|
||||||
|
|
||||||
### [v3.0.0](https://github.com/node-ebics/node-ebics-client/compare/v0.2.1...v3.0.0)
|
|
||||||
|
|
||||||
> 4 August 2022
|
|
||||||
|
|
||||||
- Update LICENSE [`7520a56`](https://github.com/node-ebics/node-ebics-client/commit/7520a56be8ba446d3466c6dc9202b1d65ea3396f)
|
|
||||||
- changelog [`fe0f585`](https://github.com/node-ebics/node-ebics-client/commit/fe0f585b277c390415841a343aa86d4533997057)
|
|
||||||
- chore: update license in package.json, bump version [`b46b214`](https://github.com/node-ebics/node-ebics-client/commit/b46b214e57cf1b4e30455da306b26b3a06dc8a5f)
|
|
||||||
|
|
||||||
#### [v0.2.1](https://github.com/node-ebics/node-ebics-client/compare/v0.2.0...v0.2.1)
|
#### [v0.2.1](https://github.com/node-ebics/node-ebics-client/compare/v0.2.0...v0.2.1)
|
||||||
|
|
||||||
> 30 March 2021
|
> 30 March 2021
|
||||||
@@ -100,43 +84,38 @@
|
|||||||
|
|
||||||
#### [v0.1.1](https://github.com/node-ebics/node-ebics-client/compare/v0.1.0...v0.1.1)
|
#### [v0.1.1](https://github.com/node-ebics/node-ebics-client/compare/v0.1.0...v0.1.1)
|
||||||
|
|
||||||
> 7 November 2019
|
> 5 November 2019
|
||||||
|
|
||||||
- chore: update license [`9aabe93`](https://github.com/node-ebics/node-ebics-client/commit/9aabe933e91b506ea38820b952ce8e5e58b4c2ff)
|
- chore: update license [`9aabe93`](https://github.com/node-ebics/node-ebics-client/commit/9aabe933e91b506ea38820b952ce8e5e58b4c2ff)
|
||||||
|
|
||||||
#### [v0.1.0](https://github.com/node-ebics/node-ebics-client/compare/v0.0.36...v0.1.0)
|
#### [v0.1.0](https://github.com/node-ebics/node-ebics-client/compare/v0.0.8...v0.1.0)
|
||||||
|
|
||||||
> 5 November 2019
|
> 5 November 2019
|
||||||
|
|
||||||
- Feat: handle unsual exponent migrate to node-forge [`#16`](https://github.com/node-ebics/node-ebics-client/pull/16)
|
- Feat: handle unsual exponent migrate to node-forge [`#16`](https://github.com/node-ebics/node-ebics-client/pull/16)
|
||||||
- Add order generation tests and fix linting [`#15`](https://github.com/node-ebics/node-ebics-client/pull/15)
|
- Add order generation tests and fix linting [`#15`](https://github.com/node-ebics/node-ebics-client/pull/15)
|
||||||
- test script run mocha [`#14`](https://github.com/node-ebics/node-ebics-client/pull/14)
|
- test script run mocha [`#14`](https://github.com/node-ebics/node-ebics-client/pull/14)
|
||||||
- chore: readme maintenance [`#11`](https://github.com/node-ebics/node-ebics-client/pull/11)
|
|
||||||
- Provide examples [`#10`](https://github.com/node-ebics/node-ebics-client/pull/10)
|
|
||||||
- * Add Z53 order type [`#7`](https://github.com/node-ebics/node-ebics-client/pull/7)
|
|
||||||
- remove eCollect from constant and minor verbose error handeling [`#2`](https://github.com/node-ebics/node-ebics-client/pull/2)
|
|
||||||
- add iso pain format XCT order type [`#1`](https://github.com/node-ebics/node-ebics-client/pull/1)
|
|
||||||
- remove eCollect from constant and minor verbose error handaling [`#4`](https://github.com/node-ebics/node-ebics-client/pull/4)
|
|
||||||
- add iso pain format XCT order type [`#5`](https://github.com/node-ebics/node-ebics-client/pull/5)
|
|
||||||
- Fix parsing of the bank keys in the HPB response [`#3`](https://github.com/node-ebics/node-ebics-client/pull/3)
|
|
||||||
|
|
||||||
- feat: prepare order generation tests [`e40f79c`](https://github.com/node-ebics/node-ebics-client/commit/e40f79cee68a194272c93f07e763175b213a77a1)
|
- feat: prepare order generation tests [`e40f79c`](https://github.com/node-ebics/node-ebics-client/commit/e40f79cee68a194272c93f07e763175b213a77a1)
|
||||||
- Major changes. Separating responsibilities. Orders builder, serializer. [`ff9a3a1`](https://github.com/node-ebics/node-ebics-client/commit/ff9a3a16b47d0a25674134c875bfd651995837e4)
|
- chore: cleanup [`0c01420`](https://github.com/node-ebics/node-ebics-client/commit/0c01420c1e14992a4169098ccd47cd196b899f06)
|
||||||
- code optimization [`1876360`](https://github.com/node-ebics/node-ebics-client/commit/187636019c290d757aca77d4c14fb4f2519acd38)
|
|
||||||
|
|
||||||
#### [v0.0.36](https://github.com/node-ebics/node-ebics-client/compare/v0.0.35...v0.0.36)
|
#### [v0.0.36](https://github.com/node-ebics/node-ebics-client/compare/v0.0.35...v0.0.36)
|
||||||
|
|
||||||
> 7 November 2019
|
> 1 June 2018
|
||||||
|
|
||||||
- various modular fixes [`8492d94`](https://github.com/node-ebics/node-ebics-client/commit/8492d940542f61b17aa3a2da7de23f6539ffaad5)
|
- various modular fixes [`8492d94`](https://github.com/node-ebics/node-ebics-client/commit/8492d940542f61b17aa3a2da7de23f6539ffaad5)
|
||||||
|
|
||||||
#### [v0.0.35](https://github.com/node-ebics/node-ebics-client/compare/v0.0.8...v0.0.35)
|
#### [v0.0.35](https://github.com/node-ebics/node-ebics-client/compare/v0.0.3...v0.0.35)
|
||||||
|
|
||||||
> 7 November 2019
|
> 31 May 2018
|
||||||
|
|
||||||
|
- update License to GPL v3 [`babcf76`](https://github.com/node-ebics/node-ebics-client/commit/babcf76b61af6eb737ab291a301e71bb84621820)
|
||||||
|
- Add MGF1.js file - mask generation utility class [`7e6e2ff`](https://github.com/node-ebics/node-ebics-client/commit/7e6e2ff142688b0c453369fa7137b49e8b89cd81)
|
||||||
|
- Add sign, _emsaPSS and _modPowe methods in Key.js file [`5ace213`](https://github.com/node-ebics/node-ebics-client/commit/5ace2137231af9a3563ab31fa0f70fbdf4b148cb)
|
||||||
|
|
||||||
#### [v0.0.8](https://github.com/node-ebics/node-ebics-client/compare/v0.0.7...v0.0.8)
|
#### [v0.0.8](https://github.com/node-ebics/node-ebics-client/compare/v0.0.7...v0.0.8)
|
||||||
|
|
||||||
> 7 November 2019
|
> 8 October 2019
|
||||||
|
|
||||||
- chore: readme maintenance [`#11`](https://github.com/node-ebics/node-ebics-client/pull/11)
|
- chore: readme maintenance [`#11`](https://github.com/node-ebics/node-ebics-client/pull/11)
|
||||||
- Provide examples [`#10`](https://github.com/node-ebics/node-ebics-client/pull/10)
|
- Provide examples [`#10`](https://github.com/node-ebics/node-ebics-client/pull/10)
|
||||||
@@ -147,7 +126,7 @@
|
|||||||
|
|
||||||
#### [v0.0.7](https://github.com/node-ebics/node-ebics-client/compare/v0.0.6...v0.0.7)
|
#### [v0.0.7](https://github.com/node-ebics/node-ebics-client/compare/v0.0.6...v0.0.7)
|
||||||
|
|
||||||
> 7 November 2019
|
> 2 August 2019
|
||||||
|
|
||||||
- * Add Z53 order type [`#7`](https://github.com/node-ebics/node-ebics-client/pull/7)
|
- * Add Z53 order type [`#7`](https://github.com/node-ebics/node-ebics-client/pull/7)
|
||||||
- remove eCollect from constant and minor verbose error handeling [`#2`](https://github.com/node-ebics/node-ebics-client/pull/2)
|
- remove eCollect from constant and minor verbose error handeling [`#2`](https://github.com/node-ebics/node-ebics-client/pull/2)
|
||||||
@@ -159,7 +138,7 @@
|
|||||||
|
|
||||||
#### [v0.0.6](https://github.com/node-ebics/node-ebics-client/compare/v0.0.5...v0.0.6)
|
#### [v0.0.6](https://github.com/node-ebics/node-ebics-client/compare/v0.0.5...v0.0.6)
|
||||||
|
|
||||||
> 7 November 2019
|
> 24 July 2019
|
||||||
|
|
||||||
- remove eCollect from constant and minor verbose error handaling [`#4`](https://github.com/node-ebics/node-ebics-client/pull/4)
|
- remove eCollect from constant and minor verbose error handaling [`#4`](https://github.com/node-ebics/node-ebics-client/pull/4)
|
||||||
- add iso pain format XCT order type [`#5`](https://github.com/node-ebics/node-ebics-client/pull/5)
|
- add iso pain format XCT order type [`#5`](https://github.com/node-ebics/node-ebics-client/pull/5)
|
||||||
@@ -169,24 +148,24 @@
|
|||||||
|
|
||||||
#### [v0.0.5](https://github.com/node-ebics/node-ebics-client/compare/v0.0.4...v0.0.5)
|
#### [v0.0.5](https://github.com/node-ebics/node-ebics-client/compare/v0.0.4...v0.0.5)
|
||||||
|
|
||||||
> 7 November 2019
|
> 28 June 2019
|
||||||
|
|
||||||
- Fix parsing of the bank keys in the HPB response [`#3`](https://github.com/node-ebics/node-ebics-client/pull/3)
|
- Fix parsing of the bank keys in the HPB response [`#3`](https://github.com/node-ebics/node-ebics-client/pull/3)
|
||||||
|
|
||||||
- tc for bank keys parsing error [`c571ef1`](https://github.com/node-ebics/node-ebics-client/commit/c571ef181bca2e0cbec70bc6df53c706acd6c829)
|
- tc for bank keys parsing error [`c571ef1`](https://github.com/node-ebics/node-ebics-client/commit/c571ef181bca2e0cbec70bc6df53c706acd6c829)
|
||||||
- #2 corrected bank keys parsing [`5f0b6cd`](https://github.com/node-ebics/node-ebics-client/commit/5f0b6cd3747c4613920d2f71f3c04ce13225d397)
|
- #2 corrected bank keys parsing [`5f0b6cd`](https://github.com/node-ebics/node-ebics-client/commit/5f0b6cd3747c4613920d2f71f3c04ce13225d397)
|
||||||
|
|
||||||
#### [v0.0.4](https://github.com/node-ebics/node-ebics-client/compare/v0.0.3...v0.0.4)
|
#### [v0.0.4](https://github.com/node-ebics/node-ebics-client/compare/v0.0.36...v0.0.4)
|
||||||
|
|
||||||
> 3 September 2018
|
> 3 September 2018
|
||||||
|
|
||||||
- Major changes. Separating responsibilities. Orders builder, serializer. [`ff9a3a1`](https://github.com/node-ebics/node-ebics-client/commit/ff9a3a16b47d0a25674134c875bfd651995837e4)
|
- Major changes. Separating responsibilities. Orders builder, serializer. [`ff9a3a1`](https://github.com/node-ebics/node-ebics-client/commit/ff9a3a16b47d0a25674134c875bfd651995837e4)
|
||||||
- code optimization [`1876360`](https://github.com/node-ebics/node-ebics-client/commit/187636019c290d757aca77d4c14fb4f2519acd38)
|
- code optimization [`1876360`](https://github.com/node-ebics/node-ebics-client/commit/187636019c290d757aca77d4c14fb4f2519acd38)
|
||||||
- various modular fixes [`8492d94`](https://github.com/node-ebics/node-ebics-client/commit/8492d940542f61b17aa3a2da7de23f6539ffaad5)
|
- client and order optimization [`9454992`](https://github.com/node-ebics/node-ebics-client/commit/945499290a8698aed504b573019de2c23148006a)
|
||||||
|
|
||||||
#### v0.0.3
|
#### v0.0.3
|
||||||
|
|
||||||
> 7 November 2019
|
> 17 May 2018
|
||||||
|
|
||||||
- initial commit [`1f947ff`](https://github.com/node-ebics/node-ebics-client/commit/1f947ff1480c522f89fa1f547581b55e2378d920)
|
- initial commit [`1f947ff`](https://github.com/node-ebics/node-ebics-client/commit/1f947ff1480c522f89fa1f547581b55e2378d920)
|
||||||
- Initial commit [`cd37de3`](https://github.com/node-ebics/node-ebics-client/commit/cd37de3895e32a61798c79ce3a6447e2f269019d)
|
- Initial commit [`cd37de3`](https://github.com/node-ebics/node-ebics-client/commit/cd37de3895e32a61798c79ce3a6447e2f269019d)
|
||||||
|
102
lib/Client.js
102
lib/Client.js
@@ -1,6 +1,6 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const rock = require('rock-req');
|
const $request = require('request');
|
||||||
|
|
||||||
const constants = require('./consts');
|
const constants = require('./consts');
|
||||||
const Keys = require('./keymanagers/Keys');
|
const Keys = require('./keymanagers/Keys');
|
||||||
@@ -52,6 +52,7 @@ const stringifyKeys = (keys) => {
|
|||||||
* @property {string} storageLocation - Location where to store the files that are downloaded. This can be a network share for example.
|
* @property {string} storageLocation - Location where to store the files that are downloaded. This can be a network share for example.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
module.exports = class Client {
|
module.exports = class Client {
|
||||||
/**
|
/**
|
||||||
*Creates an instance of Client.
|
*Creates an instance of Client.
|
||||||
@@ -70,17 +71,18 @@ module.exports = class Client {
|
|||||||
languageCode,
|
languageCode,
|
||||||
storageLocation,
|
storageLocation,
|
||||||
}) {
|
}) {
|
||||||
if (!url) throw new Error('EBICS URL is required');
|
if (!url)
|
||||||
if (!partnerId) throw new Error('partnerId is required');
|
throw new Error('EBICS URL is required');
|
||||||
if (!userId) throw new Error('userId is required');
|
if (!partnerId)
|
||||||
if (!hostId) throw new Error('hostId is required');
|
throw new Error('partnerId is required');
|
||||||
if (!passphrase) throw new Error('passphrase is required');
|
if (!userId)
|
||||||
|
throw new Error('userId is required');
|
||||||
|
if (!hostId)
|
||||||
|
throw new Error('hostId is required');
|
||||||
|
if (!passphrase)
|
||||||
|
throw new Error('passphrase is required');
|
||||||
|
|
||||||
if (
|
if (!keyStorage || typeof keyStorage.read !== 'function' || typeof keyStorage.write !== 'function')
|
||||||
!keyStorage
|
|
||||||
|| typeof keyStorage.read !== 'function'
|
|
||||||
|| typeof keyStorage.write !== 'function'
|
|
||||||
)
|
|
||||||
throw new Error('keyStorage implementation missing or wrong');
|
throw new Error('keyStorage implementation missing or wrong');
|
||||||
|
|
||||||
this.url = url;
|
this.url = url;
|
||||||
@@ -97,25 +99,17 @@ module.exports = class Client {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async send(order) {
|
async send(order) {
|
||||||
const isInObject = 'operation' in order;
|
const isInObject = ('operation' in order);
|
||||||
|
|
||||||
if (!isInObject) throw new Error('Operation for the order needed');
|
if (!isInObject) throw new Error('Operation for the order needed');
|
||||||
|
|
||||||
if (order.operation.toUpperCase() === constants.orderOperations.ini)
|
if (order.operation.toUpperCase() === constants.orderOperations.ini) return this.initialization(order);
|
||||||
return this.initialization(order);
|
|
||||||
|
|
||||||
const keys = await this.keys();
|
const keys = await this.keys();
|
||||||
if (keys === null)
|
if (keys === null) throw new Error('No keys provided. Can not send the order or any other order for that matter.');
|
||||||
throw new Error(
|
|
||||||
'No keys provided. Can not send the order or any other order for that matter.',
|
|
||||||
);
|
|
||||||
|
|
||||||
if (order.operation.toUpperCase() === constants.orderOperations.upload)
|
if (order.operation.toUpperCase() === constants.orderOperations.upload) return this.upload(order);
|
||||||
return this.upload(order);
|
if (order.operation.toUpperCase() === constants.orderOperations.download) return this.download(order);
|
||||||
if (
|
|
||||||
order.operation.toUpperCase() === constants.orderOperations.download
|
|
||||||
)
|
|
||||||
return this.download(order);
|
|
||||||
|
|
||||||
throw new Error('Wrong order operation provided');
|
throw new Error('Wrong order operation provided');
|
||||||
}
|
}
|
||||||
@@ -124,7 +118,8 @@ module.exports = class Client {
|
|||||||
const keys = await this.keys();
|
const keys = await this.keys();
|
||||||
if (keys === null) await this._generateKeys();
|
if (keys === null) await this._generateKeys();
|
||||||
|
|
||||||
if (this.tracesStorage) this.tracesStorage.new().ofType('ORDER.INI');
|
if (this.tracesStorage)
|
||||||
|
this.tracesStorage.new().ofType('ORDER.INI');
|
||||||
const res = await this.ebicsRequest(order);
|
const res = await this.ebicsRequest(order);
|
||||||
const xml = res.orderData();
|
const xml = res.orderData();
|
||||||
|
|
||||||
@@ -137,9 +132,7 @@ module.exports = class Client {
|
|||||||
|
|
||||||
technicalCode: returnedTechnicalCode,
|
technicalCode: returnedTechnicalCode,
|
||||||
technicalCodeSymbol: res.technicalSymbol(),
|
technicalCodeSymbol: res.technicalSymbol(),
|
||||||
technicalCodeShortText: res.technicalShortText(
|
technicalCodeShortText: res.technicalShortText(returnedTechnicalCode),
|
||||||
returnedTechnicalCode,
|
|
||||||
),
|
|
||||||
technicalCodeMeaning: res.technicalMeaning(returnedTechnicalCode),
|
technicalCodeMeaning: res.technicalMeaning(returnedTechnicalCode),
|
||||||
|
|
||||||
businessCode: returnedBusinessCode,
|
businessCode: returnedBusinessCode,
|
||||||
@@ -174,9 +167,7 @@ module.exports = class Client {
|
|||||||
|
|
||||||
technicalCode: returnedTechnicalCode,
|
technicalCode: returnedTechnicalCode,
|
||||||
technicalCodeSymbol: res.technicalSymbol(),
|
technicalCodeSymbol: res.technicalSymbol(),
|
||||||
technicalCodeShortText: res.technicalShortText(
|
technicalCodeShortText: res.technicalShortText(returnedTechnicalCode),
|
||||||
returnedTechnicalCode,
|
|
||||||
),
|
|
||||||
technicalCodeMeaning: res.technicalMeaning(returnedTechnicalCode),
|
technicalCodeMeaning: res.technicalMeaning(returnedTechnicalCode),
|
||||||
|
|
||||||
businessCode: returnedBusinessCode,
|
businessCode: returnedBusinessCode,
|
||||||
@@ -187,7 +178,8 @@ module.exports = class Client {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async upload(order) {
|
async upload(order) {
|
||||||
if (this.tracesStorage) this.tracesStorage.new().ofType('ORDER.UPLOAD');
|
if (this.tracesStorage)
|
||||||
|
this.tracesStorage.new().ofType('ORDER.UPLOAD');
|
||||||
let res = await this.ebicsRequest(order);
|
let res = await this.ebicsRequest(order);
|
||||||
const transactionId = res.transactionId();
|
const transactionId = res.transactionId();
|
||||||
const orderId = res.orderId();
|
const orderId = res.orderId();
|
||||||
@@ -205,46 +197,32 @@ module.exports = class Client {
|
|||||||
return new Promise(async (resolve, reject) => {
|
return new Promise(async (resolve, reject) => {
|
||||||
const { version } = order;
|
const { version } = order;
|
||||||
const keys = await this.keys();
|
const keys = await this.keys();
|
||||||
const r = signer
|
const r = signer.version(version).sign((await serializer.use(order, this)).toXML(), keys.x());
|
||||||
.version(version)
|
|
||||||
.sign((await serializer.use(order, this)).toXML(), keys.x());
|
|
||||||
|
|
||||||
if (this.tracesStorage)
|
if (this.tracesStorage)
|
||||||
this.tracesStorage
|
this.tracesStorage.label(`REQUEST.${order.orderDetails.OrderType}`).data(r).persist();
|
||||||
.label(`REQUEST.${order.orderDetails.OrderType}`)
|
|
||||||
.data(r)
|
|
||||||
.persist();
|
|
||||||
|
|
||||||
rock({
|
$request.post({
|
||||||
method: 'POST',
|
url: this.url,
|
||||||
url: this.url,
|
body: r,
|
||||||
body: r,
|
headers: { 'content-type': 'text/xml;charset=UTF-8' },
|
||||||
headers: { 'content-type': 'text/xml;charset=UTF-8' },
|
}, (err, res, data) => {
|
||||||
},
|
if (err) reject(err);
|
||||||
(err, res, data) => {
|
|
||||||
if (err) reject(err);
|
|
||||||
|
|
||||||
const ebicsResponse = response.version(version)(data, keys);
|
const ebicsResponse = response.version(version)(data, keys);
|
||||||
|
|
||||||
if (this.tracesStorage)
|
if (this.tracesStorage)
|
||||||
this.tracesStorage
|
this.tracesStorage.label(`RESPONSE.${order.orderDetails.OrderType}`).connect().data(ebicsResponse.toXML()).persist();
|
||||||
.label(`RESPONSE.${order.orderDetails.OrderType}`)
|
|
||||||
.connect()
|
|
||||||
.data(ebicsResponse.toXML())
|
|
||||||
.persist();
|
|
||||||
|
|
||||||
resolve(ebicsResponse);
|
resolve(ebicsResponse);
|
||||||
},
|
});
|
||||||
);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async signOrder(order) {
|
async signOrder(order) {
|
||||||
const { version } = order;
|
const { version } = order;
|
||||||
const keys = await this.keys();
|
const keys = await this.keys();
|
||||||
return signer
|
return signer.version(version).sign((await serializer.use(order, this)).toXML(), keys.x());
|
||||||
.version(version)
|
|
||||||
.sign((await serializer.use(order, this)).toXML(), keys.x());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async keys() {
|
async keys() {
|
||||||
@@ -275,8 +253,6 @@ module.exports = class Client {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_writeKeys(keysObject) {
|
_writeKeys(keysObject) {
|
||||||
return this.keyStorage.write(
|
return this.keyStorage.write(this.keyEncryptor.encrypt(stringifyKeys(keysObject.keys)));
|
||||||
this.keyEncryptor.encrypt(stringifyKeys(keysObject.keys)),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@@ -5,7 +5,7 @@ const crypto = require('crypto');
|
|||||||
|
|
||||||
const Crypto = require('../../crypto/Crypto');
|
const Crypto = require('../../crypto/Crypto');
|
||||||
|
|
||||||
const { DOMParser, XMLSerializer } = require('@xmldom/xmldom');
|
const { DOMParser, XMLSerializer } = require('xmldom');
|
||||||
const xpath = require('xpath');
|
const xpath = require('xpath');
|
||||||
const errors = require('./errors');
|
const errors = require('./errors');
|
||||||
|
|
||||||
@@ -25,72 +25,45 @@ module.exports = (xml, keys) => ({
|
|||||||
|
|
||||||
isSegmented() {
|
isSegmented() {
|
||||||
const select = xpath.useNamespaces({ xmlns: 'urn:org:ebics:H004' });
|
const select = xpath.useNamespaces({ xmlns: 'urn:org:ebics:H004' });
|
||||||
const node = select(
|
const node = select('//xmlns:header/xmlns:mutable/xmlns:SegmentNumber', this.doc);
|
||||||
'//xmlns:header/xmlns:mutable/xmlns:SegmentNumber',
|
|
||||||
this.doc,
|
|
||||||
);
|
|
||||||
|
|
||||||
return !!node.length;
|
return !!node.length;
|
||||||
},
|
},
|
||||||
|
|
||||||
isLastSegment() {
|
isLastSegment() {
|
||||||
const select = xpath.useNamespaces({ xmlns: 'urn:org:ebics:H004' });
|
const select = xpath.useNamespaces({ xmlns: 'urn:org:ebics:H004' });
|
||||||
const node = select(
|
const node = select("//xmlns:header/xmlns:mutable/*[@lastSegment='true']", this.doc);
|
||||||
"//xmlns:header/xmlns:mutable/*[@lastSegment='true']",
|
|
||||||
this.doc,
|
|
||||||
);
|
|
||||||
|
|
||||||
return !!node.length;
|
return !!node.length;
|
||||||
},
|
},
|
||||||
|
|
||||||
orderData() {
|
orderData() {
|
||||||
const orderDataNode = this.doc.getElementsByTagNameNS(
|
const orderDataNode = this.doc.getElementsByTagNameNS('urn:org:ebics:H004', 'OrderData');
|
||||||
'urn:org:ebics:H004',
|
|
||||||
'OrderData',
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!orderDataNode.length) return {};
|
if (!orderDataNode.length) return {};
|
||||||
|
|
||||||
const orderData = orderDataNode[0].textContent;
|
const orderData = orderDataNode[0].textContent;
|
||||||
const decipher = crypto
|
const decipher = crypto.createDecipheriv('aes-128-cbc', this.transactionKey(), DEFAULT_IV).setAutoPadding(false);
|
||||||
.createDecipheriv('aes-128-cbc', this.transactionKey(), DEFAULT_IV)
|
const data = Buffer.from(decipher.update(orderData, 'base64', 'binary') + decipher.final('binary'), 'binary');
|
||||||
.setAutoPadding(false);
|
|
||||||
const data = Buffer.from(
|
|
||||||
decipher.update(orderData, 'base64', 'binary')
|
|
||||||
+ decipher.final('binary'),
|
|
||||||
'binary',
|
|
||||||
);
|
|
||||||
|
|
||||||
return zlib.inflateSync(data);
|
return zlib.inflateSync(data);
|
||||||
},
|
},
|
||||||
|
|
||||||
transactionKey() {
|
transactionKey() {
|
||||||
const keyNodeText = this.doc.getElementsByTagNameNS(
|
const keyNodeText = this.doc.getElementsByTagNameNS('urn:org:ebics:H004', 'TransactionKey')[0].textContent;
|
||||||
'urn:org:ebics:H004',
|
return Crypto.privateDecrypt(this.keys.e(), Buffer.from(keyNodeText, 'base64'));
|
||||||
'TransactionKey',
|
|
||||||
)[0].textContent;
|
|
||||||
return Crypto.privateDecrypt(
|
|
||||||
this.keys.e(),
|
|
||||||
Buffer.from(keyNodeText, 'base64'),
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
transactionId() {
|
transactionId() {
|
||||||
const select = xpath.useNamespaces({ xmlns: 'urn:org:ebics:H004' });
|
const select = xpath.useNamespaces({ xmlns: 'urn:org:ebics:H004' });
|
||||||
const node = select(
|
const node = select('//xmlns:header/xmlns:static/xmlns:TransactionID', this.doc);
|
||||||
'//xmlns:header/xmlns:static/xmlns:TransactionID',
|
|
||||||
this.doc,
|
|
||||||
);
|
|
||||||
|
|
||||||
return node.length ? node[0].textContent : '';
|
return node.length ? node[0].textContent : '';
|
||||||
},
|
},
|
||||||
|
|
||||||
orderId() {
|
orderId() {
|
||||||
const select = xpath.useNamespaces({ xmlns: 'urn:org:ebics:H004' });
|
const select = xpath.useNamespaces({ xmlns: 'urn:org:ebics:H004' });
|
||||||
const node = select(
|
const node = select('.//xmlns:header/xmlns:mutable/xmlns:OrderID', this.doc);
|
||||||
'.//xmlns:header/xmlns:mutable/xmlns:OrderID',
|
|
||||||
this.doc,
|
|
||||||
);
|
|
||||||
|
|
||||||
return node.length ? node[0].textContent : '';
|
return node.length ? node[0].textContent : '';
|
||||||
},
|
},
|
||||||
@@ -116,20 +89,14 @@ module.exports = (xml, keys) => ({
|
|||||||
|
|
||||||
technicalCode() {
|
technicalCode() {
|
||||||
const select = xpath.useNamespaces({ xmlns: 'urn:org:ebics:H004' });
|
const select = xpath.useNamespaces({ xmlns: 'urn:org:ebics:H004' });
|
||||||
const node = select(
|
const node = select('//xmlns:header/xmlns:mutable/xmlns:ReturnCode', this.doc);
|
||||||
'//xmlns:header/xmlns:mutable/xmlns:ReturnCode',
|
|
||||||
this.doc,
|
|
||||||
);
|
|
||||||
|
|
||||||
return node.length ? node[0].textContent : '';
|
return node.length ? node[0].textContent : '';
|
||||||
},
|
},
|
||||||
|
|
||||||
technicalSymbol() {
|
technicalSymbol() {
|
||||||
const select = xpath.useNamespaces({ xmlns: 'urn:org:ebics:H004' });
|
const select = xpath.useNamespaces({ xmlns: 'urn:org:ebics:H004' });
|
||||||
const node = select(
|
const node = select('//xmlns:header/xmlns:mutable/xmlns:ReportText', this.doc);
|
||||||
'//xmlns:header/xmlns:mutable/xmlns:ReportText',
|
|
||||||
this.doc,
|
|
||||||
);
|
|
||||||
|
|
||||||
return node.length ? node[0].textContent : '';
|
return node.length ? node[0].textContent : '';
|
||||||
},
|
},
|
||||||
@@ -155,14 +122,8 @@ module.exports = (xml, keys) => ({
|
|||||||
|
|
||||||
for (let i = 0; i < keyNodes.length; i++) {
|
for (let i = 0; i < keyNodes.length; i++) {
|
||||||
const type = lastChild(keyNodes[i].parentNode).textContent;
|
const type = lastChild(keyNodes[i].parentNode).textContent;
|
||||||
const modulus = xpath.select(
|
const modulus = xpath.select(".//*[local-name(.)='Modulus']", keyNodes[i])[0].textContent;
|
||||||
".//*[local-name(.)='Modulus']",
|
const exponent = xpath.select(".//*[local-name(.)='Exponent']", keyNodes[i])[0].textContent;
|
||||||
keyNodes[i],
|
|
||||||
)[0].textContent;
|
|
||||||
const exponent = xpath.select(
|
|
||||||
".//*[local-name(.)='Exponent']",
|
|
||||||
keyNodes[i],
|
|
||||||
)[0].textContent;
|
|
||||||
|
|
||||||
const mod = Buffer.from(modulus, 'base64');
|
const mod = Buffer.from(modulus, 'base64');
|
||||||
const exp = Buffer.from(exponent, 'base64');
|
const exp = Buffer.from(exponent, 'base64');
|
||||||
|
@@ -1,32 +1,26 @@
|
|||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
// const crypto = require('crypto');
|
// const crypto = require('crypto');
|
||||||
const Crypto = require('../../crypto/Crypto');
|
const Crypto = require('../../crypto/Crypto');
|
||||||
|
|
||||||
const { DOMParser, XMLSerializer } = require('@xmldom/xmldom');
|
const { DOMParser, XMLSerializer } = require('xmldom');
|
||||||
const xpath = require('xpath');
|
const xpath = require('xpath');
|
||||||
const C14n = require('xml-crypto/lib/c14n-canonicalization').C14nCanonicalization;
|
const C14n = require('xml-crypto/lib/c14n-canonicalization').C14nCanonicalization;
|
||||||
|
|
||||||
const digest = (doc) => {
|
const digest = (doc) => {
|
||||||
// get the xml node, where the digested value is supposed to be
|
// get the xml node, where the digested value is supposed to be
|
||||||
const nodeDigestValue = doc.getElementsByTagName('ds:DigestValue')[0];
|
const nodeDigestValue = doc.getElementsByTagName('ds:DigestValue')[0];
|
||||||
|
|
||||||
// canonicalize the node that has authenticate='true' attribute
|
// canonicalize the node that has authenticate='true' attribute
|
||||||
const contentToDigest = xpath
|
const contentToDigest = xpath.select("//*[@authenticate='true']", doc)
|
||||||
.select("//*[@authenticate='true']", doc)
|
.map(x => new C14n().process(x)).join('');
|
||||||
.map(x => new C14n().process(x))
|
|
||||||
.join('');
|
|
||||||
|
|
||||||
// fix the canonicalization
|
// fix the canonicalization
|
||||||
const fixedContent = contentToDigest.replace(
|
const fixedContent = contentToDigest.replace(/xmlns="urn:org:ebics:H004"/g, 'xmlns="urn:org:ebics:H004" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"');
|
||||||
/xmlns="urn:org:ebics:H004"/g,
|
|
||||||
'xmlns="urn:org:ebics:H004" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"',
|
|
||||||
);
|
|
||||||
|
|
||||||
if (nodeDigestValue)
|
if (nodeDigestValue)
|
||||||
nodeDigestValue.textContent = Crypto.digestWithHash(fixedContent)
|
nodeDigestValue.textContent = Crypto.digestWithHash(fixedContent).toString('base64').trim();
|
||||||
.toString('base64')
|
|
||||||
.trim();
|
|
||||||
|
|
||||||
return doc;
|
return doc;
|
||||||
};
|
};
|
||||||
@@ -35,15 +29,8 @@ const sign = (doc, key) => {
|
|||||||
const nodeSignatureValue = doc.getElementsByTagName('ds:SignatureValue')[0];
|
const nodeSignatureValue = doc.getElementsByTagName('ds:SignatureValue')[0];
|
||||||
|
|
||||||
if (nodeSignatureValue) {
|
if (nodeSignatureValue) {
|
||||||
const select = xpath.useNamespaces({
|
const select = xpath.useNamespaces({ ds: 'http://www.w3.org/2000/09/xmldsig#' });
|
||||||
ds: 'http://www.w3.org/2000/09/xmldsig#',
|
const contentToSign = (new C14n().process(select('//ds:SignedInfo', doc)[0])).replace('xmlns:ds="http://www.w3.org/2000/09/xmldsig#"', 'xmlns="urn:org:ebics:H004" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"');
|
||||||
});
|
|
||||||
const contentToSign = new C14n()
|
|
||||||
.process(select('//ds:SignedInfo', doc)[0])
|
|
||||||
.replace(
|
|
||||||
'xmlns:ds="http://www.w3.org/2000/09/xmldsig#"',
|
|
||||||
'xmlns="urn:org:ebics:H004" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"',
|
|
||||||
);
|
|
||||||
|
|
||||||
nodeSignatureValue.textContent = Crypto.privateSign(key, contentToSign); // this.keys.x().key.sign(contentToSign, 'base64');
|
nodeSignatureValue.textContent = Crypto.privateSign(key, contentToSign); // this.keys.x().key.sign(contentToSign, 'base64');
|
||||||
}
|
}
|
||||||
|
7761
package-lock.json
generated
7761
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
30
package.json
30
package.json
@@ -1,7 +1,8 @@
|
|||||||
{
|
{
|
||||||
"name": "ebics-client",
|
"name": "ebics-client",
|
||||||
"version": "4.1.0",
|
"version": "0.3.0",
|
||||||
"description": "Node.js ISO 20022 Compliant EBICS Client",
|
"description": "Node.js ISO 20022 Compliant EBICS Client",
|
||||||
|
"license": "MIT",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"files": [
|
"files": [
|
||||||
"lib/**/*",
|
"lib/**/*",
|
||||||
@@ -57,26 +58,25 @@
|
|||||||
"url": "https://github.com/Herrie82"
|
"url": "https://github.com/Herrie82"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@xmldom/xmldom": "^0.8.10",
|
"handlebars": "^4.7.7",
|
||||||
"handlebars": "^4.7.8",
|
"js2xmlparser": "^4.0.1",
|
||||||
"js2xmlparser": "^5.0.0",
|
"node-forge": "^0.10.0",
|
||||||
"node-forge": "^1.3.1",
|
"request": "^2.88.2",
|
||||||
"rock-req": "^5.1.3",
|
"uuid": "^8.3.2",
|
||||||
"uuid": "^9.0.1",
|
"xml-crypto": "^2.1.1",
|
||||||
"xml-crypto": "^4.0.1",
|
"xmldom": "^0.5.0",
|
||||||
"xpath": "0.0.32"
|
"xpath": "0.0.32"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"auto-changelog": "^2.4.0",
|
"auto-changelog": "^1.16.2",
|
||||||
"chai": "^4.3.10",
|
"chai": "^4.3.4",
|
||||||
"coveralls": "^3.1.1",
|
"coveralls": "^3.1.0",
|
||||||
"eslint": "^6.7.2",
|
"eslint": "^6.7.2",
|
||||||
"eslint-config-ecollect-base": "^0.1.2",
|
"eslint-config-ecollect-base": "^0.1.2",
|
||||||
"eslint-plugin-import": "^2.28.1",
|
"eslint-plugin-import": "^2.18.2",
|
||||||
"libxmljs": "^1.0.10",
|
"libxmljs": "^0.19.7",
|
||||||
"mocha": "^10.2.0",
|
"mocha": "^7.1.2",
|
||||||
"nyc": "^15.1.0"
|
"nyc": "^15.1.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -12,9 +12,7 @@ const ebics = require('../../');
|
|||||||
const libxml = require('libxmljs');
|
const libxml = require('libxmljs');
|
||||||
|
|
||||||
const schemaPath = path.resolve(__dirname, '../xsd/ebics_H004.xsd');
|
const schemaPath = path.resolve(__dirname, '../xsd/ebics_H004.xsd');
|
||||||
const schemaDoc = libxml.parseXml(
|
const schemaDoc = libxml.parseXml(fs.readFileSync(schemaPath, { encoding: 'utf8' }));
|
||||||
fs.readFileSync(schemaPath, { encoding: 'utf8' }),
|
|
||||||
);
|
|
||||||
|
|
||||||
const schemaDir = path.dirname(schemaPath);
|
const schemaDir = path.dirname(schemaPath);
|
||||||
const cwd = process.cwd();
|
const cwd = process.cwd();
|
||||||
@@ -22,7 +20,7 @@ const cwd = process.cwd();
|
|||||||
const validateXML = (str) => {
|
const validateXML = (str) => {
|
||||||
try {
|
try {
|
||||||
process.chdir(schemaDir);
|
process.chdir(schemaDir);
|
||||||
const isValid = libxml.parseXml(str).validate(schemaDoc);
|
const isValid = libxml.parseXmlString(str).validate(schemaDoc);
|
||||||
process.chdir(cwd);
|
process.chdir(cwd);
|
||||||
return isValid;
|
return isValid;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@@ -37,9 +35,7 @@ const client = new ebics.Client({
|
|||||||
userId: 'CRS04381',
|
userId: 'CRS04381',
|
||||||
hostId: 'CRSISOTB',
|
hostId: 'CRSISOTB',
|
||||||
passphrase: 'test',
|
passphrase: 'test',
|
||||||
keyStorage: ebics.fsKeysStorage(
|
keyStorage: ebics.fsKeysStorage(path.resolve(__dirname, '../support/TEST_KEYS.key')),
|
||||||
path.resolve(__dirname, '../support/TEST_KEYS.key'),
|
|
||||||
),
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const { Orders } = ebics;
|
const { Orders } = ebics;
|
||||||
@@ -87,8 +83,10 @@ const fnOrders = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const getOrderObject = (name, order) => {
|
const getOrderObject = (name, order) => {
|
||||||
if (typeof order === 'object') return order;
|
if (typeof order === 'object')
|
||||||
if (fnOrders[name]) return fnOrders[name](order);
|
return order;
|
||||||
|
if (fnOrders[name])
|
||||||
|
return fnOrders[name](order);
|
||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -96,7 +94,8 @@ describe('H004 order generation', () => {
|
|||||||
// eslint-disable-next-line no-restricted-syntax
|
// eslint-disable-next-line no-restricted-syntax
|
||||||
for (const [name, orderDefinition] of Object.entries(Orders)) {
|
for (const [name, orderDefinition] of Object.entries(Orders)) {
|
||||||
const order = getOrderObject(name, orderDefinition);
|
const order = getOrderObject(name, orderDefinition);
|
||||||
if (!order) continue;
|
if (!order)
|
||||||
|
continue;
|
||||||
|
|
||||||
const type = order.orderDetails.OrderType;
|
const type = order.orderDetails.OrderType;
|
||||||
const { operation } = order;
|
const { operation } = order;
|
||||||
|
Reference in New Issue
Block a user