@coderoftime/fints 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +519 -1
- package/README.md +138 -40
- package/dist/client.d.ts +49 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +242 -0
- package/dist/client.js.map +1 -0
- package/dist/core/account.d.ts +46 -7
- package/dist/core/account.d.ts.map +1 -1
- package/dist/core/account.js +143 -24
- package/dist/core/account.js.map +1 -1
- package/dist/core/amount.d.ts +15 -4
- package/dist/core/amount.d.ts.map +1 -1
- package/dist/core/amount.js +46 -9
- package/dist/core/amount.js.map +1 -1
- package/dist/core/balance.d.ts +4 -0
- package/dist/core/balance.d.ts.map +1 -1
- package/dist/core/balance.js +11 -5
- package/dist/core/balance.js.map +1 -1
- package/dist/core/bank-info.d.ts +21 -4
- package/dist/core/bank-info.d.ts.map +1 -1
- package/dist/core/bank-info.js +26 -5
- package/dist/core/bank-info.js.map +1 -1
- package/dist/core/client.d.ts +81 -19
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/config.d.ts +40 -20
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +85 -30
- package/dist/core/config.js.map +1 -1
- package/dist/core/errors.d.ts +100 -26
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +136 -53
- package/dist/core/errors.js.map +1 -1
- package/dist/core/feedback.d.ts +11 -1
- package/dist/core/feedback.d.ts.map +1 -1
- package/dist/core/feedback.js +14 -2
- package/dist/core/feedback.js.map +1 -1
- package/dist/core/transaction.d.ts +11 -1
- package/dist/core/transaction.d.ts.map +1 -1
- package/dist/core/transaction.js +21 -4
- package/dist/core/transaction.js.map +1 -1
- package/dist/core/transport.d.ts +48 -6
- package/dist/core/transport.d.ts.map +1 -1
- package/dist/core/transport.js +126 -29
- package/dist/core/transport.js.map +1 -1
- package/dist/formats/camt.d.ts +28 -5
- package/dist/formats/camt.d.ts.map +1 -1
- package/dist/formats/camt.js +132 -50
- package/dist/formats/camt.js.map +1 -1
- package/dist/formats/mt940.d.ts +29 -5
- package/dist/formats/mt940.d.ts.map +1 -1
- package/dist/formats/mt940.js +209 -113
- package/dist/formats/mt940.js.map +1 -1
- package/dist/formats/readers.d.ts +6 -2
- package/dist/formats/readers.d.ts.map +1 -1
- package/dist/formats/readers.js +28 -29
- package/dist/formats/readers.js.map +1 -1
- package/dist/formats/record-budget.d.ts +7 -0
- package/dist/formats/record-budget.d.ts.map +1 -0
- package/dist/formats/record-budget.js +17 -0
- package/dist/formats/record-budget.js.map +1 -0
- package/dist/formats/sepa-purpose.d.ts +9 -0
- package/dist/formats/sepa-purpose.d.ts.map +1 -1
- package/dist/formats/sepa-purpose.js +32 -2
- package/dist/formats/sepa-purpose.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/session/app-approval.d.ts +11 -5
- package/dist/session/app-approval.d.ts.map +1 -1
- package/dist/session/app-approval.js +23 -12
- package/dist/session/app-approval.js.map +1 -1
- package/dist/session/dialog-runner.d.ts +11 -11
- package/dist/session/dialog-runner.d.ts.map +1 -1
- package/dist/session/dialog-runner.js +34 -19
- package/dist/session/dialog-runner.js.map +1 -1
- package/dist/session/login-guard.d.ts +54 -49
- package/dist/session/login-guard.d.ts.map +1 -1
- package/dist/session/login-guard.js +170 -83
- package/dist/session/login-guard.js.map +1 -1
- package/dist/session/sepa-accounts.d.ts +20 -14
- package/dist/session/sepa-accounts.d.ts.map +1 -1
- package/dist/session/sepa-accounts.js +62 -46
- package/dist/session/sepa-accounts.js.map +1 -1
- package/dist/session/session-setup.d.ts +41 -24
- package/dist/session/session-setup.d.ts.map +1 -1
- package/dist/session/session-setup.js +106 -63
- package/dist/session/session-setup.js.map +1 -1
- package/dist/session/session-state.d.ts +10 -6
- package/dist/session/session-state.d.ts.map +1 -1
- package/dist/session/session-state.js +72 -18
- package/dist/session/session-state.js.map +1 -1
- package/dist/session/signed-dialog.d.ts +83 -0
- package/dist/session/signed-dialog.d.ts.map +1 -0
- package/dist/session/signed-dialog.js +185 -0
- package/dist/session/signed-dialog.js.map +1 -0
- package/dist/session/tan-selection.d.ts +26 -18
- package/dist/session/tan-selection.d.ts.map +1 -1
- package/dist/session/tan-selection.js +44 -33
- package/dist/session/tan-selection.js.map +1 -1
- package/dist/session/user-prompts.d.ts +14 -5
- package/dist/session/user-prompts.d.ts.map +1 -1
- package/dist/session/user-prompts.js +53 -18
- package/dist/session/user-prompts.js.map +1 -1
- package/dist/tan/challenge.d.ts +47 -24
- package/dist/tan/challenge.d.ts.map +1 -1
- package/dist/tan/challenge.js +56 -51
- package/dist/tan/challenge.js.map +1 -1
- package/dist/tan/flicker.d.ts +11 -1
- package/dist/tan/flicker.d.ts.map +1 -1
- package/dist/tan/flicker.js +70 -24
- package/dist/tan/flicker.js.map +1 -1
- package/dist/tan/tan-image.d.ts +6 -2
- package/dist/tan/tan-image.d.ts.map +1 -1
- package/dist/tan/tan-image.js +14 -6
- package/dist/tan/tan-image.js.map +1 -1
- package/dist/tan/tan-models.d.ts +14 -2
- package/dist/tan/tan-models.d.ts.map +1 -1
- package/dist/tan/tan-models.js +24 -7
- package/dist/tan/tan-models.js.map +1 -1
- package/dist/util/arguments.d.ts +13 -0
- package/dist/util/arguments.d.ts.map +1 -0
- package/dist/util/arguments.js +40 -0
- package/dist/util/arguments.js.map +1 -0
- package/dist/util/async.d.ts +4 -3
- package/dist/util/async.d.ts.map +1 -1
- package/dist/util/async.js +6 -7
- package/dist/util/async.js.map +1 -1
- package/dist/util/bytes.d.ts +3 -4
- package/dist/util/bytes.d.ts.map +1 -1
- package/dist/util/bytes.js +13 -21
- package/dist/util/bytes.js.map +1 -1
- package/dist/util/call-context.d.ts.map +1 -1
- package/dist/util/call-context.js +3 -2
- package/dist/util/call-context.js.map +1 -1
- package/dist/util/dates.d.ts +6 -20
- package/dist/util/dates.d.ts.map +1 -1
- package/dist/util/dates.js +58 -28
- package/dist/util/dates.js.map +1 -1
- package/dist/util/errors.d.ts +13 -3
- package/dist/util/errors.d.ts.map +1 -1
- package/dist/util/errors.js +19 -6
- package/dist/util/errors.js.map +1 -1
- package/dist/util/immutable-map.d.ts +5 -2
- package/dist/util/immutable-map.d.ts.map +1 -1
- package/dist/util/immutable-map.js +15 -12
- package/dist/util/immutable-map.js.map +1 -1
- package/dist/util/inspect.d.ts +11 -0
- package/dist/util/inspect.d.ts.map +1 -0
- package/dist/util/inspect.js +14 -0
- package/dist/util/inspect.js.map +1 -0
- package/dist/util/json.d.ts +4 -0
- package/dist/util/json.d.ts.map +1 -1
- package/dist/util/json.js +18 -0
- package/dist/util/json.js.map +1 -1
- package/dist/util/text.d.ts +38 -5
- package/dist/util/text.d.ts.map +1 -1
- package/dist/util/text.js +90 -16
- package/dist/util/text.js.map +1 -1
- package/dist/util/xml.d.ts +9 -6
- package/dist/util/xml.d.ts.map +1 -1
- package/dist/util/xml.js +129 -56
- package/dist/util/xml.js.map +1 -1
- package/dist/v3/account-extension.d.ts.map +1 -1
- package/dist/v3/account-extension.js +7 -10
- package/dist/v3/account-extension.js.map +1 -1
- package/dist/v3/bank-connection.d.ts +54 -0
- package/dist/v3/bank-connection.d.ts.map +1 -0
- package/dist/v3/bank-connection.js +118 -0
- package/dist/v3/bank-connection.js.map +1 -0
- package/dist/v3/dialog.d.ts +84 -46
- package/dist/v3/dialog.d.ts.map +1 -1
- package/dist/v3/dialog.js +174 -60
- package/dist/v3/dialog.js.map +1 -1
- package/dist/v3/message.d.ts +32 -11
- package/dist/v3/message.d.ts.map +1 -1
- package/dist/v3/message.js +144 -83
- package/dist/v3/message.js.map +1 -1
- package/dist/v3/parameter-store.d.ts +111 -0
- package/dist/v3/parameter-store.d.ts.map +1 -0
- package/dist/v3/parameter-store.js +197 -0
- package/dist/v3/parameter-store.js.map +1 -0
- package/dist/v3/parameters.d.ts +44 -17
- package/dist/v3/parameters.d.ts.map +1 -1
- package/dist/v3/parameters.js +136 -60
- package/dist/v3/parameters.js.map +1 -1
- package/dist/v3/protocol.d.ts +50 -50
- package/dist/v3/protocol.d.ts.map +1 -1
- package/dist/v3/protocol.js +91 -210
- package/dist/v3/protocol.js.map +1 -1
- package/dist/v3/queries.d.ts +51 -0
- package/dist/v3/queries.d.ts.map +1 -0
- package/dist/v3/queries.js +128 -0
- package/dist/v3/queries.js.map +1 -0
- package/dist/v3/segments.d.ts +43 -19
- package/dist/v3/segments.d.ts.map +1 -1
- package/dist/v3/segments.js +84 -33
- package/dist/v3/segments.js.map +1 -1
- package/dist/v3/syntax.d.ts +68 -13
- package/dist/v3/syntax.d.ts.map +1 -1
- package/dist/v3/syntax.js +183 -102
- package/dist/v3/syntax.js.map +1 -1
- package/package.json +10 -6
- package/src/client.ts +293 -0
- package/src/core/account.ts +153 -24
- package/src/core/amount.ts +45 -10
- package/src/core/balance.ts +12 -5
- package/src/core/bank-info.ts +29 -5
- package/src/core/client.ts +83 -19
- package/src/core/config.ts +95 -35
- package/src/core/errors.ts +148 -54
- package/src/core/feedback.ts +16 -2
- package/src/core/transaction.ts +22 -4
- package/src/core/transport.ts +153 -32
- package/src/formats/camt.ts +153 -45
- package/src/formats/mt940.ts +244 -122
- package/src/formats/readers.ts +28 -31
- package/src/formats/record-budget.ts +18 -0
- package/src/formats/sepa-purpose.ts +29 -2
- package/src/index.ts +4 -2
- package/src/session/app-approval.ts +51 -38
- package/src/session/dialog-runner.ts +61 -31
- package/src/session/login-guard.ts +189 -87
- package/src/session/sepa-accounts.ts +63 -45
- package/src/session/session-setup.ts +105 -68
- package/src/session/session-state.ts +74 -23
- package/src/session/signed-dialog.ts +222 -0
- package/src/session/tan-selection.ts +50 -39
- package/src/session/user-prompts.ts +62 -18
- package/src/tan/challenge.ts +87 -64
- package/src/tan/flicker.ts +72 -23
- package/src/tan/tan-image.ts +15 -6
- package/src/tan/tan-models.ts +26 -7
- package/src/util/arguments.ts +40 -0
- package/src/util/async.ts +10 -9
- package/src/util/bytes.ts +14 -20
- package/src/util/call-context.ts +3 -2
- package/src/util/dates.ts +64 -33
- package/src/util/errors.ts +22 -6
- package/src/util/immutable-map.ts +15 -12
- package/src/util/inspect.ts +14 -0
- package/src/util/json.ts +16 -0
- package/src/util/text.ts +87 -15
- package/src/util/xml.ts +130 -52
- package/src/v3/account-extension.ts +7 -12
- package/src/v3/bank-connection.ts +126 -0
- package/src/v3/dialog.ts +186 -92
- package/src/v3/message.ts +140 -79
- package/src/v3/parameter-store.ts +226 -0
- package/src/v3/parameters.ts +166 -66
- package/src/v3/protocol.ts +103 -253
- package/src/v3/queries.ts +198 -0
- package/src/v3/segments.ts +86 -31
- package/src/v3/syntax.ts +172 -93
- package/dist/session/bank-connection.d.ts +0 -28
- package/dist/session/bank-connection.d.ts.map +0 -1
- package/dist/session/bank-connection.js +0 -48
- package/dist/session/bank-connection.js.map +0 -1
- package/dist/session/parameter-data.d.ts +0 -83
- package/dist/session/parameter-data.d.ts.map +0 -1
- package/dist/session/parameter-data.js +0 -68
- package/dist/session/parameter-data.js.map +0 -1
- package/dist/session/pin-tan-client.d.ts +0 -54
- package/dist/session/pin-tan-client.d.ts.map +0 -1
- package/dist/session/pin-tan-client.js +0 -153
- package/dist/session/pin-tan-client.js.map +0 -1
- package/dist/session/pin-tan-dialog.d.ts +0 -71
- package/dist/session/pin-tan-dialog.d.ts.map +0 -1
- package/dist/session/pin-tan-dialog.js +0 -124
- package/dist/session/pin-tan-dialog.js.map +0 -1
- package/dist/session/protocol.d.ts +0 -209
- package/dist/session/protocol.d.ts.map +0 -1
- package/dist/session/protocol.js +0 -75
- package/dist/session/protocol.js.map +0 -1
- package/dist/session/response-handler.d.ts +0 -48
- package/dist/session/response-handler.d.ts.map +0 -1
- package/dist/session/response-handler.js +0 -121
- package/dist/session/response-handler.js.map +0 -1
- package/dist/v3/client.d.ts +0 -24
- package/dist/v3/client.d.ts.map +0 -1
- package/dist/v3/client.js +0 -16
- package/dist/v3/client.js.map +0 -1
- package/src/session/bank-connection.ts +0 -51
- package/src/session/parameter-data.ts +0 -137
- package/src/session/pin-tan-client.ts +0 -186
- package/src/session/pin-tan-dialog.ts +0 -160
- package/src/session/protocol.ts +0 -311
- package/src/session/response-handler.ts +0 -130
- package/src/v3/client.ts +0 -29
package/dist/tan/challenge.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { latin1Decode } from '../util/bytes.js';
|
|
2
|
+
import { copyDate } from '../util/dates.js';
|
|
3
|
+
import { frozenWithInspect, inspectCustom } from '../util/inspect.js';
|
|
4
|
+
import { characterReference, trimBlanks } from '../util/text.js';
|
|
2
5
|
import { challengeInstruction, FlickerCode, hasEmbeddedFlickerCode } from './flicker.js';
|
|
3
6
|
import { TanImage } from './tan-image.js';
|
|
4
7
|
/** Challenge text banks send when there is nothing to show. */
|
|
@@ -7,7 +10,6 @@ const noChallenge = 'nochallenge';
|
|
|
7
10
|
export function challengeText(message) {
|
|
8
11
|
return message === undefined || message === '' || message === noChallenge ? undefined : message;
|
|
9
12
|
}
|
|
10
|
-
const printableAscii = /^[\x20-\x7E]+$/;
|
|
11
13
|
const lineBreak = /<br\b[^<>]*>/gi;
|
|
12
14
|
const blockTag = /<\/?(?:p|li)\b[^<>]*>/gi;
|
|
13
15
|
/**
|
|
@@ -18,6 +20,8 @@ const blockTag = /<\/?(?:p|li)\b[^<>]*>/gi;
|
|
|
18
20
|
const formattingTag = /<\/?(?:b|i|u|ul|ol)\b[^<>]*>/gi;
|
|
19
21
|
const entityReference = /&(#x?[0-9a-fA-F]+|[a-zA-Z]+);/g;
|
|
20
22
|
const blankLines = /\n{3,}/g;
|
|
23
|
+
/** Longest challenge `plainMessage` formats: far longer than the specification allows (an..2048). */
|
|
24
|
+
const maxFormattedLength = 65_536;
|
|
21
25
|
const namedEntities = {
|
|
22
26
|
amp: '&',
|
|
23
27
|
lt: '<',
|
|
@@ -34,27 +38,21 @@ const namedEntities = {
|
|
|
34
38
|
szlig: 'ß',
|
|
35
39
|
euro: '€',
|
|
36
40
|
};
|
|
37
|
-
/**
|
|
38
|
-
* The character `name` refers to; `undefined` for an unknown name and for a number that is not a character, as XML
|
|
39
|
-
* defines them: `NUL`, half a surrogate pair, or beyond Unicode.
|
|
40
|
-
*/
|
|
41
|
+
/** The character `name` refers to; `undefined` for an unknown name and for a number that is not a character. */
|
|
41
42
|
function decodeEntity(name) {
|
|
42
|
-
|
|
43
|
-
const isHex = name.startsWith('#x') || name.startsWith('#X');
|
|
44
|
-
const digits = name.substring(isHex ? 2 : 1);
|
|
45
|
-
const code = (isHex ? /^[0-9a-fA-F]+$/ : /^[0-9]+$/).test(digits) ? parseInt(digits, isHex ? 16 : 10) : NaN;
|
|
46
|
-
const isCharacter = code > 0 && (code < 0xd800 || code > 0xdfff) && code <= 0x10ffff;
|
|
47
|
-
return isCharacter ? String.fromCodePoint(code) : undefined;
|
|
48
|
-
}
|
|
49
|
-
return Object.hasOwn(namedEntities, name) ? namedEntities[name] : undefined;
|
|
43
|
+
return characterReference(name) ?? (Object.hasOwn(namedEntities, name) ? namedEntities[name] : undefined);
|
|
50
44
|
}
|
|
51
45
|
/** A request from the bank to authorize an action with a TAN or an app approval. */
|
|
52
46
|
export class TanChallenge {
|
|
53
47
|
/** The TAN method the challenge is for. */
|
|
54
48
|
method;
|
|
55
|
-
/** Bank reference of the pending action. */
|
|
49
|
+
/** Bank reference of the pending action, one character per byte the bank sent (ISO 8859-1). */
|
|
56
50
|
reference;
|
|
57
|
-
/**
|
|
51
|
+
/**
|
|
52
|
+
* Challenge text as the bank sent it, including the formatting tags of a structured challenge
|
|
53
|
+
* (`TanMethod.structuredChallenge`); `plainMessage` is the text to show. Show either as text only, never as HTML
|
|
54
|
+
* (`innerHTML`, `v-html`): it is the bank's text, not markup to trust.
|
|
55
|
+
*/
|
|
58
56
|
message;
|
|
59
57
|
/** Raw challenge data for TAN generators (HHD_UC). */
|
|
60
58
|
hhdUc;
|
|
@@ -71,12 +69,15 @@ export class TanChallenge {
|
|
|
71
69
|
/** Counts repeated prompts for the same decoupled approval. */
|
|
72
70
|
attempt;
|
|
73
71
|
/**
|
|
74
|
-
* Settles when the client needs no more answer to this challenge:
|
|
75
|
-
* failed, timed out or was cancelled. Set where the client asks the bank
|
|
76
|
-
* challenge (`TanCallback`), `undefined` otherwise. It never rejects.
|
|
72
|
+
* Settles when the client needs no more answer to this challenge: a later prompt for the approval replaces it, or the
|
|
73
|
+
* bank confirmed the approval, or the approval failed, timed out or was cancelled. Set where the client asks the bank
|
|
74
|
+
* by itself while the callback shows the challenge (`TanCallback`), `undefined` otherwise. It never rejects.
|
|
77
75
|
*/
|
|
78
76
|
resolved;
|
|
79
|
-
/**
|
|
77
|
+
/**
|
|
78
|
+
* A challenge as the bank sent it, with a copy of `validUntil`, which no other challenge shares. Use
|
|
79
|
+
* `TanChallenge.create` to have a flicker code or image detected in the data.
|
|
80
|
+
*/
|
|
80
81
|
constructor(init) {
|
|
81
82
|
this.method = init.method;
|
|
82
83
|
this.reference = init.reference;
|
|
@@ -85,7 +86,7 @@ export class TanChallenge {
|
|
|
85
86
|
this.flickerCode = init.flickerCode;
|
|
86
87
|
this.image = init.image;
|
|
87
88
|
this.isDecoupled = init.isDecoupled ?? false;
|
|
88
|
-
this.validUntil = init.validUntil;
|
|
89
|
+
this.validUntil = copyDate(init.validUntil);
|
|
89
90
|
this.tanMediumName = init.tanMediumName;
|
|
90
91
|
this.attempt = init.attempt ?? 1;
|
|
91
92
|
this.resolved = init.resolved;
|
|
@@ -97,14 +98,11 @@ export class TanChallenge {
|
|
|
97
98
|
const data = init.hhdUc !== undefined && init.hhdUc.length > 0 ? init.hhdUc : undefined;
|
|
98
99
|
if (data !== undefined) {
|
|
99
100
|
image = TanImage.tryParse(data);
|
|
100
|
-
if (image === undefined)
|
|
101
|
-
|
|
102
|
-
if (printableAscii.test(text))
|
|
103
|
-
flicker = FlickerCode.tryParse(text);
|
|
104
|
-
}
|
|
101
|
+
if (image === undefined)
|
|
102
|
+
flicker = FlickerCode.tryParse(latin1Decode(data));
|
|
105
103
|
}
|
|
106
|
-
|
|
107
|
-
flicker
|
|
104
|
+
if (image === undefined && init.message !== undefined && hasEmbeddedFlickerCode(init.message)) {
|
|
105
|
+
flicker ??= FlickerCode.tryParse(init.message);
|
|
108
106
|
}
|
|
109
107
|
return new TanChallenge({
|
|
110
108
|
...init,
|
|
@@ -127,26 +125,41 @@ export class TanChallenge {
|
|
|
127
125
|
* A method with structured challenges (`TanMethod.structuredChallenge`) may use the formatting tags the specification
|
|
128
126
|
* defines. Line breaks, paragraphs and list items become new lines. Bold, italics, underlining and list tags are
|
|
129
127
|
* removed, and the entity references of such markup are resolved. Any other challenge stays as the bank sent it,
|
|
130
|
-
* which is how the specification wants it shown.
|
|
128
|
+
* which is how the specification wants it shown. So does a structured challenge of more than 65,536 characters.
|
|
129
|
+
*
|
|
130
|
+
* Show it as text, such as with `textContent`, or `{{ }}` in Vue, and `white-space: pre-line` for its line breaks;
|
|
131
|
+
* never as HTML (`innerHTML`, `v-html`). It keeps the tags the specification does not define, and `<` becomes
|
|
132
|
+
* `<`, so that as HTML the bank's text could run scripts in the app.
|
|
131
133
|
*/
|
|
132
134
|
get plainMessage() {
|
|
133
135
|
const text = this.message;
|
|
134
136
|
if (text === undefined)
|
|
135
137
|
return undefined;
|
|
136
138
|
const instruction = challengeInstruction(text);
|
|
137
|
-
if (!this.method.structuredChallenge)
|
|
139
|
+
if (!this.method.structuredChallenge || instruction.length > maxFormattedLength)
|
|
138
140
|
return instruction;
|
|
139
|
-
return instruction
|
|
141
|
+
return trimBlanks(instruction
|
|
140
142
|
.replace(lineBreak, '\n')
|
|
141
143
|
.replace(blockTag, '\n')
|
|
142
144
|
.replace(formattingTag, '')
|
|
143
145
|
.replace(entityReference, (match, name) => decodeEntity(name) ?? match)
|
|
144
|
-
.replace(blankLines, '\n\n')
|
|
145
|
-
|
|
146
|
+
.replace(blankLines, '\n\n'));
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* What Node.js's `util.inspect` and `console.log` show: the method, the kind of challenge and the attempt; not the
|
|
150
|
+
* text, the reference, the challenge data, the image or the medium, which may name the user, the account or the order.
|
|
151
|
+
*/
|
|
152
|
+
[inspectCustom]() {
|
|
153
|
+
const kinds = [
|
|
154
|
+
...(this.isDecoupled ? ['decoupled'] : []),
|
|
155
|
+
...(this.flickerCode === undefined ? [] : ['flicker code']),
|
|
156
|
+
...(this.image === undefined ? [] : ['image']),
|
|
157
|
+
];
|
|
158
|
+
return `TanChallenge(${[this.method.toString(), ...kinds, `attempt ${this.attempt}`].join(', ')})`;
|
|
146
159
|
}
|
|
147
160
|
}
|
|
148
161
|
// Copies of a challenge for the prompts of one approval. Not methods of `TanChallenge`, so that they are not part of its
|
|
149
|
-
// API
|
|
162
|
+
// API. The own fields of a challenge are those of `TanChallengeInit`, so a copy spreads it.
|
|
150
163
|
/** `challenge` again, counted as the next prompt for the same approval, with the bank's new instructions `message`. */
|
|
151
164
|
export function nextAttempt(challenge, message) {
|
|
152
165
|
return copyChallenge(challenge, { attempt: challenge.attempt + 1, message: message ?? challenge.message });
|
|
@@ -156,27 +169,19 @@ export function withResolved(challenge, resolved) {
|
|
|
156
169
|
return copyChallenge(challenge, { resolved });
|
|
157
170
|
}
|
|
158
171
|
function copyChallenge(challenge, changes) {
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
image: challenge.image,
|
|
166
|
-
isDecoupled: challenge.isDecoupled,
|
|
167
|
-
validUntil: challenge.validUntil,
|
|
168
|
-
tanMediumName: challenge.tanMediumName,
|
|
169
|
-
attempt: challenge.attempt,
|
|
170
|
-
resolved: challenge.resolved,
|
|
171
|
-
...changes,
|
|
172
|
-
});
|
|
172
|
+
const init = challenge;
|
|
173
|
+
return new TanChallenge({ ...init, ...changes });
|
|
174
|
+
}
|
|
175
|
+
/** `answer` frozen, which `util.inspect` shows by its kind, never with the TAN. */
|
|
176
|
+
function frozenAnswer(answer) {
|
|
177
|
+
return frozenWithInspect(answer, (a) => `TanAnswer(${a.kind})`);
|
|
173
178
|
}
|
|
174
|
-
const approvedAnswer =
|
|
175
|
-
const cancelledAnswer =
|
|
179
|
+
const approvedAnswer = frozenAnswer({ kind: 'approved' });
|
|
180
|
+
const cancelledAnswer = frozenAnswer({ kind: 'cancelled' });
|
|
176
181
|
/** The answers a `TanCallback` returns. */
|
|
177
182
|
export const TanAnswer = Object.freeze({
|
|
178
|
-
/** The TAN the user entered; an empty one cancels. */
|
|
179
|
-
tan: (tan) =>
|
|
183
|
+
/** The TAN the user entered; an empty one cancels a TAN challenge (`TanAnswer`). */
|
|
184
|
+
tan: (tan) => frozenAnswer({ kind: 'tan', tan }),
|
|
180
185
|
/** The user reports the approval in the banking app (`TanChallenge.isDecoupled`); the client then asks the bank. */
|
|
181
186
|
approved: approvedAnswer,
|
|
182
187
|
/** The user cancels: the client ends the bank dialog, and the call fails with `FinTsTanCancelledError`. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"challenge.js","sourceRoot":"","sources":["../../src/tan/challenge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACzF,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C,+DAA+D;AAC/D,MAAM,WAAW,GAAG,aAAa,CAAC;AAElC,0GAA0G;AAC1G,MAAM,UAAU,aAAa,CAAC,OAA2B;IACvD,OAAO,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,EAAE,IAAI,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;AAClG,CAAC;AAED,MAAM,
|
|
1
|
+
{"version":3,"file":"challenge.js","sourceRoot":"","sources":["../../src/tan/challenge.ts"],"names":[],"mappings":"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"}
|
package/dist/tan/flicker.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { inspectCustom } from '../util/inspect.js';
|
|
1
2
|
/** Version of the chipTAN HHD specification a flicker code follows: 1.3, or 1.4, which adds control bytes. */
|
|
2
3
|
export type HhdVersion = 'hhd13' | 'hhd14';
|
|
3
4
|
/** Whether `message` is a combined challenge with an embedded flicker code. */
|
|
@@ -13,11 +14,18 @@ export declare class FlickerCode {
|
|
|
13
14
|
private readonly startCode;
|
|
14
15
|
private readonly dataElements;
|
|
15
16
|
private constructor();
|
|
16
|
-
/**
|
|
17
|
+
/**
|
|
18
|
+
* Parses the challenge data sent by the bank, the code itself or a combined challenge, which embeds it in the
|
|
19
|
+
* challenge text (`CHLGUC`), wrapped into lines; throws `FormatError` if it is not a flicker code a TAN generator can
|
|
20
|
+
* take: one with characters after the length it states, an empty data element, data other than printable ASCII, or
|
|
21
|
+
* more data than its length fields can state, such as more than 15 bytes in an element in HHD 1.3 or 255 bytes in all.
|
|
22
|
+
*/
|
|
17
23
|
static parse(code: string): FlickerCode;
|
|
18
24
|
/** Parses `code`, or returns `undefined` if it is not a flicker code. */
|
|
19
25
|
static tryParse(code: string): FlickerCode | undefined;
|
|
20
26
|
private static parseLayout;
|
|
27
|
+
/** Whether the code renders as the bank sent it: its data printable ASCII, every length within its field. */
|
|
28
|
+
private get fitsTanGenerator();
|
|
21
29
|
/** The data of the start code, which opens the challenge. */
|
|
22
30
|
get startCodeData(): string;
|
|
23
31
|
/** The first data element of the challenge; `undefined` if the code leaves it out. */
|
|
@@ -32,5 +40,7 @@ export declare class FlickerCode {
|
|
|
32
40
|
private luhnChecksum;
|
|
33
41
|
/** Frames to animate: each is `[clock, bit0, bit1, bit2, bit3]` for the five bars. */
|
|
34
42
|
frames(): boolean[][];
|
|
43
|
+
/** What Node.js's `util.inspect` and `console.log` show: the version, not the data, which may hold IBAN and amount. */
|
|
44
|
+
[inspectCustom](): string;
|
|
35
45
|
}
|
|
36
46
|
//# sourceMappingURL=flicker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flicker.d.ts","sourceRoot":"","sources":["../../src/tan/flicker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"flicker.d.ts","sourceRoot":"","sources":["../../src/tan/flicker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,8GAA8G;AAC9G,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;AAuB3C,+EAA+E;AAC/E,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE/D;AAED,oFAAoF;AACpF,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE5D;AA2BD,2EAA2E;AAC3E,qBAAa,WAAW;IAEpB,qFAAqF;IACrF,QAAQ,CAAC,OAAO,EAAE,UAAU;IAC5B,uEAAuE;IACvE,QAAQ,CAAC,EAAE,EAAE,MAAM;IACnB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAN/B,OAAO;IASP;;;;;OAKG;IACH,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW;IAavC,yEAAyE;IACzE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAStD,OAAO,CAAC,MAAM,CAAC,WAAW;IA2B1B,6GAA6G;IAC7G,OAAO,KAAK,gBAAgB,GAG3B;IAED,6DAA6D;IAC7D,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,sFAAsF;IACtF,IAAI,YAAY,IAAI,MAAM,GAAG,SAAS,CAErC;IAED,uFAAuF;IACvF,IAAI,YAAY,IAAI,MAAM,GAAG,SAAS,CAErC;IAED,sFAAsF;IACtF,IAAI,YAAY,IAAI,MAAM,GAAG,SAAS,CAErC;IAED,4EAA4E;IAC5E,MAAM,IAAI,MAAM;IAKhB,OAAO,CAAC,OAAO;IAWf,OAAO,CAAC,YAAY;IAapB,sFAAsF;IACtF,MAAM,IAAI,OAAO,EAAE,EAAE;IAcrB,uHAAuH;IACvH,CAAC,aAAa,CAAC,IAAI,MAAM;CAG1B"}
|
package/dist/tan/flicker.js
CHANGED
|
@@ -1,32 +1,52 @@
|
|
|
1
1
|
import { FormatError } from '../util/errors.js';
|
|
2
|
-
import {
|
|
2
|
+
import { inspectCustom } from '../util/inspect.js';
|
|
3
|
+
import { trimBlanks, withoutWhitespace } from '../util/text.js';
|
|
3
4
|
// A combined challenge embeds the flicker code in the challenge text:
|
|
4
5
|
// `CHLGUC` + four-digit length + code + `CHLGTEXT` + four digits + instruction text.
|
|
5
6
|
const codeMarker = 'CHLGUC';
|
|
6
7
|
const textMarker = 'CHLGTEXT';
|
|
7
8
|
const markerLengthDigits = 4;
|
|
9
|
+
/**
|
|
10
|
+
* The flicker code and the instruction text of a combined challenge; `undefined` unless `message` starts with
|
|
11
|
+
* `CHLGUC`, after blanks, and states the length of the code. White space in the code wraps lines and is dropped.
|
|
12
|
+
*/
|
|
13
|
+
function splitCombined(message) {
|
|
14
|
+
const text = trimBlanks(message, { end: false });
|
|
15
|
+
const end = text.indexOf(textMarker);
|
|
16
|
+
if (!text.startsWith(codeMarker) || end < 0)
|
|
17
|
+
return undefined;
|
|
18
|
+
const lengthAndCode = withoutWhitespace(text.substring(codeMarker.length, end));
|
|
19
|
+
const code = lengthAndCode.substring(markerLengthDigits);
|
|
20
|
+
const length = lengthAndCode.substring(0, markerLengthDigits);
|
|
21
|
+
if (!/^[0-9]{4}$/.test(length) || parseInt(length, 10) !== code.length)
|
|
22
|
+
return undefined;
|
|
23
|
+
return { code, instruction: text.substring(end + textMarker.length + markerLengthDigits) };
|
|
24
|
+
}
|
|
8
25
|
/** Whether `message` is a combined challenge with an embedded flicker code. */
|
|
9
26
|
export function hasEmbeddedFlickerCode(message) {
|
|
10
|
-
return message
|
|
27
|
+
return splitCombined(message) !== undefined;
|
|
11
28
|
}
|
|
12
29
|
/** The instruction text of a combined challenge; `message` itself if it is none. */
|
|
13
30
|
export function challengeInstruction(message) {
|
|
14
|
-
|
|
15
|
-
if (start < 0)
|
|
16
|
-
return message;
|
|
17
|
-
const textStart = start + textMarker.length + markerLengthDigits;
|
|
18
|
-
return textStart < message.length ? message.substring(textStart) : '';
|
|
31
|
+
return splitCombined(message)?.instruction ?? message;
|
|
19
32
|
}
|
|
20
33
|
/**
|
|
21
34
|
* Digit counts of the challenge length (LC) and of the data element lengths (LDE) to try when parsing.
|
|
22
35
|
*
|
|
23
|
-
* HHD 1.4 states the LC with three digits, HHD 1.3 with two.
|
|
36
|
+
* HHD 1.4 states the LC with three digits, HHD 1.3 with two. Some banks state the LDE of HHD 1.4 with three digits;
|
|
37
|
+
* a code that both LDE widths read is taken with two, as the specification has it.
|
|
24
38
|
*/
|
|
25
39
|
const layouts = [
|
|
26
40
|
{ lcDigits: 3, lengthDigits: 2 },
|
|
27
41
|
{ lcDigits: 3, lengthDigits: 3 },
|
|
28
42
|
{ lcDigits: 2, lengthDigits: 2 },
|
|
29
43
|
];
|
|
44
|
+
/** The most bytes a length field states: HHD 1.3 flags ASCII data in bit 4 of it, HHD 1.4 in bit 6. */
|
|
45
|
+
const maxElementLength = { hhd13: 0x0f, hhd14: 0x3f };
|
|
46
|
+
/** The most bytes of a rendered code, which its one-byte length (LC) states. */
|
|
47
|
+
const maxCodeLength = 0xff;
|
|
48
|
+
/** The characters a TAN generator shows; one byte each. */
|
|
49
|
+
const printableAscii = /^[\x20-\x7E]*$/;
|
|
30
50
|
function hex(value, width) {
|
|
31
51
|
return value.toString(16).toUpperCase().padStart(width, '0');
|
|
32
52
|
}
|
|
@@ -46,12 +66,17 @@ export class FlickerCode {
|
|
|
46
66
|
this.startCode = startCode;
|
|
47
67
|
this.dataElements = dataElements;
|
|
48
68
|
}
|
|
49
|
-
/**
|
|
69
|
+
/**
|
|
70
|
+
* Parses the challenge data sent by the bank, the code itself or a combined challenge, which embeds it in the
|
|
71
|
+
* challenge text (`CHLGUC`), wrapped into lines; throws `FormatError` if it is not a flicker code a TAN generator can
|
|
72
|
+
* take: one with characters after the length it states, an empty data element, data other than printable ASCII, or
|
|
73
|
+
* more data than its length fields can state, such as more than 15 bytes in an element in HHD 1.3 or 255 bytes in all.
|
|
74
|
+
*/
|
|
50
75
|
static parse(code) {
|
|
51
|
-
const
|
|
76
|
+
const embedded = splitCombined(code)?.code ?? trimBlanks(code);
|
|
52
77
|
for (const layout of layouts) {
|
|
53
78
|
try {
|
|
54
|
-
return FlickerCode.parseLayout(new Reader(
|
|
79
|
+
return FlickerCode.parseLayout(new Reader(embedded), layout.lcDigits, layout.lengthDigits);
|
|
55
80
|
}
|
|
56
81
|
catch (error) {
|
|
57
82
|
// Not this layout; try the next one.
|
|
@@ -81,18 +106,28 @@ export class FlickerCode {
|
|
|
81
106
|
const controlBytes = [];
|
|
82
107
|
if ((startLength & 0x80) !== 0) {
|
|
83
108
|
do {
|
|
109
|
+
if (controlBytes.length === 10)
|
|
110
|
+
throw new FormatError('Too many control bytes in flicker code');
|
|
84
111
|
controlBytes.push(challenge.hex(2));
|
|
85
|
-
} while ((controlBytes.at(-1) & 0x80) !== 0
|
|
112
|
+
} while ((controlBytes.at(-1) & 0x80) !== 0);
|
|
86
113
|
}
|
|
87
|
-
const startCode = new StartCode(challenge.take(startLength &
|
|
114
|
+
const startCode = new StartCode(challenge.take(elementLength(startLength & 0x7f)), controlBytes);
|
|
88
115
|
const dataElements = [];
|
|
89
116
|
for (let i = 0; i < 3; i++) {
|
|
90
|
-
dataElements.push(new DataElement(challenge.isAtEnd ? undefined : challenge.take(challenge.decimal(lengthDigits)
|
|
117
|
+
dataElements.push(new DataElement(challenge.isAtEnd ? undefined : challenge.take(elementLength(challenge.decimal(lengthDigits)))));
|
|
91
118
|
}
|
|
92
|
-
//
|
|
93
|
-
if (!challenge.isAtEnd)
|
|
119
|
+
// Only a layout whose fields fill exactly the LC characters, which end the code, can be the right one.
|
|
120
|
+
if (!challenge.isAtEnd || !code.isAtEnd)
|
|
94
121
|
throw new FormatError('Flicker code fields do not match its length');
|
|
95
|
-
|
|
122
|
+
const flicker = new FlickerCode(controlBytes.length === 0 ? 'hhd13' : 'hhd14', lc, startCode, dataElements);
|
|
123
|
+
if (!flicker.fitsTanGenerator)
|
|
124
|
+
throw new FormatError('Flicker code data the TAN generator cannot take');
|
|
125
|
+
return flicker;
|
|
126
|
+
}
|
|
127
|
+
/** Whether the code renders as the bank sent it: its data printable ASCII, every length within its field. */
|
|
128
|
+
get fitsTanGenerator() {
|
|
129
|
+
const elements = [this.startCode, ...this.dataElements];
|
|
130
|
+
return elements.every((element) => element.fits(this.version)) && this.payload().length <= 2 * maxCodeLength;
|
|
96
131
|
}
|
|
97
132
|
/** The data of the start code, which opens the challenge. */
|
|
98
133
|
get startCodeData() {
|
|
@@ -155,14 +190,20 @@ export class FlickerCode {
|
|
|
155
190
|
}
|
|
156
191
|
return result;
|
|
157
192
|
}
|
|
193
|
+
/** What Node.js's `util.inspect` and `console.log` show: the version, not the data, which may hold IBAN and amount. */
|
|
194
|
+
[inspectCustom]() {
|
|
195
|
+
return `FlickerCode(${this.version})`;
|
|
196
|
+
}
|
|
158
197
|
}
|
|
159
|
-
/**
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
198
|
+
/**
|
|
199
|
+
* The length a field of the challenge states for the start code or a data element: 1 to 63 characters. The challenge
|
|
200
|
+
* leaves out an element without data and sets no flag in bit 6, which only the rendered code carries; bit 7 of the start
|
|
201
|
+
* code, which announces control bytes, is masked off before.
|
|
202
|
+
*/
|
|
203
|
+
function elementLength(length) {
|
|
204
|
+
if (length === 0 || length > 0x3f)
|
|
205
|
+
throw new FormatError('Invalid data element length');
|
|
206
|
+
return length;
|
|
166
207
|
}
|
|
167
208
|
function xorChecksum(payload) {
|
|
168
209
|
let x = 0;
|
|
@@ -222,6 +263,11 @@ class DataElement {
|
|
|
222
263
|
get isBcd() {
|
|
223
264
|
return this.data === undefined || /^[0-9]+$/.test(this.data);
|
|
224
265
|
}
|
|
266
|
+
/** Whether the data are printable ASCII, and no more bytes than the length field of `version` can state. */
|
|
267
|
+
fits(version) {
|
|
268
|
+
const d = this.data;
|
|
269
|
+
return d === undefined || (printableAscii.test(d) && this.renderData().length / 2 <= maxElementLength[version]);
|
|
270
|
+
}
|
|
225
271
|
renderData() {
|
|
226
272
|
const d = this.data;
|
|
227
273
|
if (d === undefined)
|
package/dist/tan/flicker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flicker.js","sourceRoot":"","sources":["../../src/tan/flicker.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"flicker.js","sourceRoot":"","sources":["../../src/tan/flicker.ts"],"names":[],"mappings":"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"}
|
package/dist/tan/tan-image.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { inspectCustom } from '../util/inspect.js';
|
|
1
2
|
/** An image challenge (photoTAN, QR-TAN) with its MIME type. */
|
|
2
3
|
export declare class TanImage {
|
|
3
4
|
/** The media type of `bytes`, for example `image/png`. */
|
|
@@ -12,10 +13,13 @@ export declare class TanImage {
|
|
|
12
13
|
/**
|
|
13
14
|
* Reads the bank's image container: a two-byte length and the MIME type, then a two-byte length and the image.
|
|
14
15
|
*
|
|
15
|
-
* `undefined` unless the MIME type is
|
|
16
|
+
* `undefined` unless the MIME type, in any case, is that of a PNG, JPEG, GIF, WebP or BMP image, and the container
|
|
17
|
+
* holds the whole image, of at least one byte.
|
|
16
18
|
*/
|
|
17
19
|
static tryParse(data: Uint8Array): TanImage | undefined;
|
|
18
|
-
/** The image as a `data:` URL,
|
|
20
|
+
/** The image as a `data:` URL, for the `src` of an `<img>` only: the bytes are the bank's, whatever their type says. */
|
|
19
21
|
toDataUrl(): string;
|
|
22
|
+
/** What Node.js's `util.inspect` and `console.log` show: type and size, not the image, which shows the order. */
|
|
23
|
+
[inspectCustom](): string;
|
|
20
24
|
}
|
|
21
25
|
//# sourceMappingURL=tan-image.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tan-image.d.ts","sourceRoot":"","sources":["../../src/tan/tan-image.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tan-image.d.ts","sourceRoot":"","sources":["../../src/tan/tan-image.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAMnD,gEAAgE;AAChE,qBAAa,QAAQ;IAEjB,0DAA0D;IAC1D,QAAQ,CAAC,QAAQ,EAAE,MAAM;IACzB,yBAAyB;IACzB,QAAQ,CAAC,KAAK,EAAE,UAAU;;IAH1B,0DAA0D;IACjD,QAAQ,EAAE,MAAM;IACzB,yBAAyB;IAChB,KAAK,EAAE,UAAU;IAG5B;;;;;OAKG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,QAAQ,GAAG,SAAS;IAavD,wHAAwH;IACxH,SAAS,IAAI,MAAM;IAInB,iHAAiH;IACjH,CAAC,aAAa,CAAC,IAAI,MAAM;CAG1B"}
|
package/dist/tan/tan-image.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { base64Encode, latin1Decode } from '../util/bytes.js';
|
|
2
|
-
|
|
2
|
+
import { inspectCustom } from '../util/inspect.js';
|
|
3
|
+
import { counted } from '../util/text.js';
|
|
4
|
+
/** The formats of photoTAN and QR-TAN images: raster images, which unlike SVG cannot carry scripts. */
|
|
5
|
+
const imageMimeTypes = new Set(['image/png', 'image/jpeg', 'image/gif', 'image/webp', 'image/bmp']);
|
|
3
6
|
/** An image challenge (photoTAN, QR-TAN) with its MIME type. */
|
|
4
7
|
export class TanImage {
|
|
5
8
|
mimeType;
|
|
@@ -15,7 +18,8 @@ export class TanImage {
|
|
|
15
18
|
/**
|
|
16
19
|
* Reads the bank's image container: a two-byte length and the MIME type, then a two-byte length and the image.
|
|
17
20
|
*
|
|
18
|
-
* `undefined` unless the MIME type is
|
|
21
|
+
* `undefined` unless the MIME type, in any case, is that of a PNG, JPEG, GIF, WebP or BMP image, and the container
|
|
22
|
+
* holds the whole image, of at least one byte.
|
|
19
23
|
*/
|
|
20
24
|
static tryParse(data) {
|
|
21
25
|
if (data.length < 4)
|
|
@@ -23,19 +27,23 @@ export class TanImage {
|
|
|
23
27
|
const mimeLength = (data[0] << 8) | data[1];
|
|
24
28
|
if (mimeLength === 0 || data.length < 2 + mimeLength + 2)
|
|
25
29
|
return undefined;
|
|
26
|
-
const mime = latin1Decode(data.subarray(2, 2 + mimeLength));
|
|
27
|
-
if (!
|
|
30
|
+
const mime = latin1Decode(data.subarray(2, 2 + mimeLength)).toLowerCase();
|
|
31
|
+
if (!imageMimeTypes.has(mime))
|
|
28
32
|
return undefined;
|
|
29
33
|
const offset = 2 + mimeLength;
|
|
30
34
|
const imageLength = (data[offset] << 8) | data[offset + 1];
|
|
31
35
|
const start = offset + 2;
|
|
32
|
-
if (start + imageLength > data.length)
|
|
36
|
+
if (imageLength === 0 || start + imageLength > data.length)
|
|
33
37
|
return undefined;
|
|
34
38
|
return new TanImage(mime, data.subarray(start, start + imageLength));
|
|
35
39
|
}
|
|
36
|
-
/** The image as a `data:` URL,
|
|
40
|
+
/** The image as a `data:` URL, for the `src` of an `<img>` only: the bytes are the bank's, whatever their type says. */
|
|
37
41
|
toDataUrl() {
|
|
38
42
|
return `data:${this.mimeType};base64,${base64Encode(this.bytes)}`;
|
|
39
43
|
}
|
|
44
|
+
/** What Node.js's `util.inspect` and `console.log` show: type and size, not the image, which shows the order. */
|
|
45
|
+
[inspectCustom]() {
|
|
46
|
+
return `TanImage(${this.mimeType}, ${counted(this.bytes.length, 'byte')})`;
|
|
47
|
+
}
|
|
40
48
|
}
|
|
41
49
|
//# sourceMappingURL=tan-image.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tan-image.js","sourceRoot":"","sources":["../../src/tan/tan-image.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"tan-image.js","sourceRoot":"","sources":["../../src/tan/tan-image.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,uGAAuG;AACvG,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC;AAEpG,gEAAgE;AAChE,MAAM,OAAO,QAAQ;IAGR;IAEA;IAJX;IACE,0DAA0D;IACjD,QAAgB;IACzB,yBAAyB;IAChB,KAAiB;QAFjB,aAAQ,GAAR,QAAQ,CAAQ;QAEhB,UAAK,GAAL,KAAK,CAAY;IACzB,CAAC;IAEJ;;;;;OAKG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAgB;QAC9B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,SAAS,CAAC;QACtC,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,CAAC,CAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QAC9C,IAAI,UAAU,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,UAAU,GAAG,CAAC;YAAE,OAAO,SAAS,CAAC;QAC3E,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAC1E,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,SAAS,CAAC;QAChD,MAAM,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC;QAC9B,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,MAAM,CAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;QAC7D,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC;QACzB,IAAI,WAAW,KAAK,CAAC,IAAI,KAAK,GAAG,WAAW,GAAG,IAAI,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QAC7E,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,wHAAwH;IACxH,SAAS;QACP,OAAO,QAAQ,IAAI,CAAC,QAAQ,WAAW,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;IACpE,CAAC;IAED,iHAAiH;IACjH,CAAC,aAAa,CAAC;QACb,OAAO,YAAY,IAAI,CAAC,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC;IAC7E,CAAC;CACF"}
|
package/dist/tan/tan-models.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { inspectCustom } from '../util/inspect.js';
|
|
1
2
|
/** Whether a TAN method needs the name of a TAN medium. */
|
|
2
3
|
export type TanMediumRequirement =
|
|
3
4
|
/** The method takes no medium name. */
|
|
@@ -62,7 +63,10 @@ export declare class TanMethod {
|
|
|
62
63
|
readonly structuredChallenge: boolean;
|
|
63
64
|
/** Whether approval happens in a separate app instead of entering a TAN. */
|
|
64
65
|
readonly decoupled: boolean;
|
|
65
|
-
/**
|
|
66
|
+
/**
|
|
67
|
+
* Most status requests the bank allows for a decoupled approval, 0 for any number. The client sends 60 where the bank
|
|
68
|
+
* states none, and polls for 10 minutes at most.
|
|
69
|
+
*/
|
|
66
70
|
readonly decoupledMaxPolls: number | undefined;
|
|
67
71
|
/** How long to wait before the first status request of a decoupled approval, in seconds. */
|
|
68
72
|
readonly decoupledFirstPollDelaySeconds: number | undefined;
|
|
@@ -80,6 +84,8 @@ export declare class TanMethod {
|
|
|
80
84
|
/** Whether the bank needs the name of a TAN medium for this procedure. */
|
|
81
85
|
get needsMediumName(): boolean;
|
|
82
86
|
toString(): string;
|
|
87
|
+
/** What Node.js's `util.inspect` and `console.log` show: `toString`, not the fields. */
|
|
88
|
+
[inspectCustom](): string;
|
|
83
89
|
}
|
|
84
90
|
/** State of a TAN medium as reported by the bank. */
|
|
85
91
|
export type TanMediumStatus =
|
|
@@ -136,10 +142,16 @@ export declare class TanMedium {
|
|
|
136
142
|
readonly lastUsed: Date | undefined;
|
|
137
143
|
/** When the medium was activated. */
|
|
138
144
|
readonly activatedOn: Date | undefined;
|
|
145
|
+
/** Takes copies of the dates of `init`: each medium has its own, which no other one shares. */
|
|
139
146
|
constructor(init: TanMediumInit);
|
|
140
147
|
/** Whether the medium is the one in use. */
|
|
141
148
|
get isActive(): boolean;
|
|
142
|
-
/**
|
|
149
|
+
/**
|
|
150
|
+
* The medium class, or the last digits of the card number, and the status: no name, which the user may have given the
|
|
151
|
+
* medium after themselves, such as `Max’s iPhone`, so that logs and crash reports collect neither.
|
|
152
|
+
*/
|
|
143
153
|
toString(): string;
|
|
154
|
+
/** What Node.js's `util.inspect` and `console.log` show: `toString`, not the fields. */
|
|
155
|
+
[inspectCustom](): string;
|
|
144
156
|
}
|
|
145
157
|
//# sourceMappingURL=tan-models.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tan-models.d.ts","sourceRoot":"","sources":["../../src/tan/tan-models.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tan-models.d.ts","sourceRoot":"","sources":["../../src/tan/tan-models.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,2DAA2D;AAC3D,MAAM,MAAM,oBAAoB;AAC9B,uCAAuC;AACrC,YAAY;AACd,4DAA4D;GAC1D,UAAU;AACZ,+CAA+C;GAC7C,UAAU,CAAC;AAEf,yEAAyE;AACzE,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,oBAAoB,CAErF;AAED,oEAAoE;AACpE,MAAM,WAAW,aAAa;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,kBAAkB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,iBAAiB,CAAC,EAAE,oBAAoB,CAAC;IACzC,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,8BAA8B,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpD,4BAA4B,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClD,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACrC;AAED,yEAAyE;AACzE,qBAAa,SAAS;IACpB,+FAA+F;IAC/F,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAElC,oEAAoE;IACpE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,4DAA4D;IAC5D,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAEzC,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAEtC,iCAAiC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAEvC,sCAAsC;IACtC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IAE1C,+CAA+C;IAC/C,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAE7B,6EAA6E;IAC7E,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IAE7C,gEAAgE;IAChE,QAAQ,CAAC,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAC;IAEhD,0DAA0D;IAC1D,QAAQ,CAAC,iBAAiB,EAAE,oBAAoB,CAAC;IAEjD;;;;;OAKG;IACH,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IAE9C,8EAA8E;IAC9E,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;IAEtC,4EAA4E;IAC5E,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAE5B;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAC;IAE/C,4FAA4F;IAC5F,QAAQ,CAAC,8BAA8B,EAAE,MAAM,GAAG,SAAS,CAAC;IAE5D,wFAAwF;IACxF,QAAQ,CAAC,4BAA4B,EAAE,MAAM,GAAG,SAAS,CAAC;IAE1D,kGAAkG;IAClG,QAAQ,CAAC,2BAA2B,EAAE,OAAO,CAAC;IAE9C,4EAA4E;IAC5E,QAAQ,CAAC,yBAAyB,EAAE,OAAO,CAAC;gBAEhC,IAAI,EAAE,aAAa;IAqB/B,iDAAiD;IACjD,MAAM,CAAC,QAAQ,CAAC,OAAO,YAA2E;IAElG,8CAA8C;IAC9C,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,0EAA0E;IAC1E,IAAI,eAAe,IAAI,OAAO,CAE7B;IAED,QAAQ,IAAI,MAAM;IAIlB,wFAAwF;IACxF,CAAC,aAAa,CAAC,IAAI,MAAM;CAG1B;AAED,qDAAqD;AACrD,MAAM,MAAM,eAAe;AACzB,4BAA4B;AAC1B,QAAQ;AACV,wDAAwD;GACtD,WAAW;AACb,+CAA+C;GAC7C,oBAAoB;AACtB,iDAAiD;GAC/C,uBAAuB;AACzB,2DAA2D;GACzD,SAAS,CAAC;AAEd,uCAAuC;AACvC,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,eAAe,CAa3E;AAED,oEAAoE;AACpE,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,eAAe,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,kBAAkB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,SAAS,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;IAC7B,UAAU,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;IAC9B,QAAQ,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;IAC5B,WAAW,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;CAChC;AAED,8EAA8E;AAC9E,qBAAa,SAAS;IACpB,qFAAqF;IACrF,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,oCAAoC;IACpC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IAEjC,oGAAoG;IACpG,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAElC,iEAAiE;IACjE,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IAE9C,sCAAsC;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAExC,sDAAsD;IACtD,QAAQ,CAAC,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAC;IAEhD,4EAA4E;IAC5E,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IAE1C,kDAAkD;IAClD,QAAQ,CAAC,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAC;IAEhD,0CAA0C;IAC1C,QAAQ,CAAC,SAAS,EAAE,IAAI,GAAG,SAAS,CAAC;IAErC,2CAA2C;IAC3C,QAAQ,CAAC,UAAU,EAAE,IAAI,GAAG,SAAS,CAAC;IAEtC,qCAAqC;IACrC,QAAQ,CAAC,QAAQ,EAAE,IAAI,GAAG,SAAS,CAAC;IAEpC,qCAAqC;IACrC,QAAQ,CAAC,WAAW,EAAE,IAAI,GAAG,SAAS,CAAC;IAEvC,+FAA+F;gBACnF,IAAI,EAAE,aAAa;IAe/B,4CAA4C;IAC5C,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;;;OAGG;IACH,QAAQ,IAAI,MAAM;IAKlB,wFAAwF;IACxF,CAAC,aAAa,CAAC,IAAI,MAAM;CAG1B"}
|