@coderoftime/fints 0.1.0 → 0.2.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.
Files changed (272) hide show
  1. package/CHANGELOG.md +142 -1
  2. package/README.md +127 -37
  3. package/dist/client.d.ts +48 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +199 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/core/account.d.ts +35 -7
  8. package/dist/core/account.d.ts.map +1 -1
  9. package/dist/core/account.js +84 -13
  10. package/dist/core/account.js.map +1 -1
  11. package/dist/core/amount.d.ts +2 -1
  12. package/dist/core/amount.d.ts.map +1 -1
  13. package/dist/core/amount.js +4 -1
  14. package/dist/core/amount.js.map +1 -1
  15. package/dist/core/balance.d.ts +1 -0
  16. package/dist/core/balance.d.ts.map +1 -1
  17. package/dist/core/balance.js +6 -5
  18. package/dist/core/balance.js.map +1 -1
  19. package/dist/core/bank-info.d.ts +1 -1
  20. package/dist/core/bank-info.js +1 -1
  21. package/dist/core/client.d.ts +50 -15
  22. package/dist/core/client.d.ts.map +1 -1
  23. package/dist/core/config.d.ts +28 -16
  24. package/dist/core/config.d.ts.map +1 -1
  25. package/dist/core/config.js +66 -26
  26. package/dist/core/config.js.map +1 -1
  27. package/dist/core/errors.d.ts +85 -23
  28. package/dist/core/errors.d.ts.map +1 -1
  29. package/dist/core/errors.js +112 -47
  30. package/dist/core/errors.js.map +1 -1
  31. package/dist/core/feedback.d.ts +4 -1
  32. package/dist/core/feedback.d.ts.map +1 -1
  33. package/dist/core/feedback.js +4 -1
  34. package/dist/core/feedback.js.map +1 -1
  35. package/dist/core/transaction.d.ts +6 -1
  36. package/dist/core/transaction.d.ts.map +1 -1
  37. package/dist/core/transaction.js +9 -4
  38. package/dist/core/transaction.js.map +1 -1
  39. package/dist/core/transport.d.ts +33 -6
  40. package/dist/core/transport.d.ts.map +1 -1
  41. package/dist/core/transport.js +77 -20
  42. package/dist/core/transport.js.map +1 -1
  43. package/dist/formats/camt.d.ts +24 -4
  44. package/dist/formats/camt.d.ts.map +1 -1
  45. package/dist/formats/camt.js +124 -41
  46. package/dist/formats/camt.js.map +1 -1
  47. package/dist/formats/mt940.d.ts +15 -3
  48. package/dist/formats/mt940.d.ts.map +1 -1
  49. package/dist/formats/mt940.js +161 -82
  50. package/dist/formats/mt940.js.map +1 -1
  51. package/dist/formats/readers.d.ts +6 -2
  52. package/dist/formats/readers.d.ts.map +1 -1
  53. package/dist/formats/readers.js +24 -29
  54. package/dist/formats/readers.js.map +1 -1
  55. package/dist/formats/record-budget.d.ts +7 -0
  56. package/dist/formats/record-budget.d.ts.map +1 -0
  57. package/dist/formats/record-budget.js +17 -0
  58. package/dist/formats/record-budget.js.map +1 -0
  59. package/dist/formats/sepa-purpose.d.ts +6 -0
  60. package/dist/formats/sepa-purpose.d.ts.map +1 -1
  61. package/dist/formats/sepa-purpose.js +23 -2
  62. package/dist/formats/sepa-purpose.js.map +1 -1
  63. package/dist/index.d.ts +3 -3
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +2 -2
  66. package/dist/index.js.map +1 -1
  67. package/dist/session/app-approval.d.ts +11 -5
  68. package/dist/session/app-approval.d.ts.map +1 -1
  69. package/dist/session/app-approval.js +23 -12
  70. package/dist/session/app-approval.js.map +1 -1
  71. package/dist/session/dialog-runner.d.ts +7 -10
  72. package/dist/session/dialog-runner.d.ts.map +1 -1
  73. package/dist/session/dialog-runner.js +15 -16
  74. package/dist/session/dialog-runner.js.map +1 -1
  75. package/dist/session/login-guard.d.ts +54 -49
  76. package/dist/session/login-guard.d.ts.map +1 -1
  77. package/dist/session/login-guard.js +156 -84
  78. package/dist/session/login-guard.js.map +1 -1
  79. package/dist/session/sepa-accounts.d.ts +20 -14
  80. package/dist/session/sepa-accounts.d.ts.map +1 -1
  81. package/dist/session/sepa-accounts.js +62 -46
  82. package/dist/session/sepa-accounts.js.map +1 -1
  83. package/dist/session/session-setup.d.ts +33 -25
  84. package/dist/session/session-setup.d.ts.map +1 -1
  85. package/dist/session/session-setup.js +87 -65
  86. package/dist/session/session-setup.js.map +1 -1
  87. package/dist/session/session-state.d.ts +9 -6
  88. package/dist/session/session-state.d.ts.map +1 -1
  89. package/dist/session/session-state.js +52 -17
  90. package/dist/session/session-state.js.map +1 -1
  91. package/dist/session/signed-dialog.d.ts +77 -0
  92. package/dist/session/signed-dialog.d.ts.map +1 -0
  93. package/dist/session/signed-dialog.js +170 -0
  94. package/dist/session/signed-dialog.js.map +1 -0
  95. package/dist/session/tan-selection.d.ts +26 -18
  96. package/dist/session/tan-selection.d.ts.map +1 -1
  97. package/dist/session/tan-selection.js +44 -33
  98. package/dist/session/tan-selection.js.map +1 -1
  99. package/dist/session/user-prompts.d.ts +8 -4
  100. package/dist/session/user-prompts.d.ts.map +1 -1
  101. package/dist/session/user-prompts.js +34 -14
  102. package/dist/session/user-prompts.js.map +1 -1
  103. package/dist/tan/challenge.d.ts +34 -13
  104. package/dist/tan/challenge.d.ts.map +1 -1
  105. package/dist/tan/challenge.js +25 -26
  106. package/dist/tan/challenge.js.map +1 -1
  107. package/dist/tan/flicker.d.ts +7 -1
  108. package/dist/tan/flicker.d.ts.map +1 -1
  109. package/dist/tan/flicker.js +40 -6
  110. package/dist/tan/flicker.js.map +1 -1
  111. package/dist/tan/tan-image.d.ts +3 -2
  112. package/dist/tan/tan-image.d.ts.map +1 -1
  113. package/dist/tan/tan-image.js +7 -5
  114. package/dist/tan/tan-image.js.map +1 -1
  115. package/dist/tan/tan-models.d.ts +5 -1
  116. package/dist/tan/tan-models.d.ts.map +1 -1
  117. package/dist/tan/tan-models.js +10 -5
  118. package/dist/tan/tan-models.js.map +1 -1
  119. package/dist/util/async.d.ts +0 -2
  120. package/dist/util/async.d.ts.map +1 -1
  121. package/dist/util/async.js +0 -4
  122. package/dist/util/async.js.map +1 -1
  123. package/dist/util/bytes.d.ts +2 -3
  124. package/dist/util/bytes.d.ts.map +1 -1
  125. package/dist/util/bytes.js +12 -20
  126. package/dist/util/bytes.js.map +1 -1
  127. package/dist/util/call-context.d.ts.map +1 -1
  128. package/dist/util/call-context.js +3 -2
  129. package/dist/util/call-context.js.map +1 -1
  130. package/dist/util/dates.d.ts +9 -16
  131. package/dist/util/dates.d.ts.map +1 -1
  132. package/dist/util/dates.js +39 -19
  133. package/dist/util/dates.js.map +1 -1
  134. package/dist/util/errors.d.ts +9 -1
  135. package/dist/util/errors.d.ts.map +1 -1
  136. package/dist/util/errors.js +12 -3
  137. package/dist/util/errors.js.map +1 -1
  138. package/dist/util/json.d.ts +4 -0
  139. package/dist/util/json.d.ts.map +1 -1
  140. package/dist/util/json.js +18 -0
  141. package/dist/util/json.js.map +1 -1
  142. package/dist/util/text.d.ts +21 -4
  143. package/dist/util/text.d.ts.map +1 -1
  144. package/dist/util/text.js +42 -13
  145. package/dist/util/text.js.map +1 -1
  146. package/dist/util/xml.d.ts +4 -3
  147. package/dist/util/xml.d.ts.map +1 -1
  148. package/dist/util/xml.js +37 -26
  149. package/dist/util/xml.js.map +1 -1
  150. package/dist/v3/account-extension.d.ts.map +1 -1
  151. package/dist/v3/account-extension.js +7 -10
  152. package/dist/v3/account-extension.js.map +1 -1
  153. package/dist/v3/bank-connection.d.ts +34 -0
  154. package/dist/v3/bank-connection.d.ts.map +1 -0
  155. package/dist/v3/bank-connection.js +58 -0
  156. package/dist/v3/bank-connection.js.map +1 -0
  157. package/dist/v3/dialog.d.ts +80 -46
  158. package/dist/v3/dialog.d.ts.map +1 -1
  159. package/dist/v3/dialog.js +162 -59
  160. package/dist/v3/dialog.js.map +1 -1
  161. package/dist/v3/message.d.ts +17 -4
  162. package/dist/v3/message.d.ts.map +1 -1
  163. package/dist/v3/message.js +62 -18
  164. package/dist/v3/message.js.map +1 -1
  165. package/dist/v3/parameter-store.d.ts +75 -0
  166. package/dist/v3/parameter-store.d.ts.map +1 -0
  167. package/dist/v3/parameter-store.js +143 -0
  168. package/dist/v3/parameter-store.js.map +1 -0
  169. package/dist/v3/parameters.d.ts +38 -12
  170. package/dist/v3/parameters.d.ts.map +1 -1
  171. package/dist/v3/parameters.js +91 -37
  172. package/dist/v3/parameters.js.map +1 -1
  173. package/dist/v3/protocol.d.ts +43 -50
  174. package/dist/v3/protocol.d.ts.map +1 -1
  175. package/dist/v3/protocol.js +58 -208
  176. package/dist/v3/protocol.js.map +1 -1
  177. package/dist/v3/queries.d.ts +51 -0
  178. package/dist/v3/queries.d.ts.map +1 -0
  179. package/dist/v3/queries.js +120 -0
  180. package/dist/v3/queries.js.map +1 -0
  181. package/dist/v3/segments.d.ts +29 -12
  182. package/dist/v3/segments.d.ts.map +1 -1
  183. package/dist/v3/segments.js +65 -23
  184. package/dist/v3/segments.js.map +1 -1
  185. package/dist/v3/syntax.d.ts +65 -14
  186. package/dist/v3/syntax.d.ts.map +1 -1
  187. package/dist/v3/syntax.js +167 -101
  188. package/dist/v3/syntax.js.map +1 -1
  189. package/package.json +10 -6
  190. package/src/client.ts +252 -0
  191. package/src/core/account.ts +86 -13
  192. package/src/core/amount.ts +3 -1
  193. package/src/core/balance.ts +6 -5
  194. package/src/core/bank-info.ts +1 -1
  195. package/src/core/client.ts +52 -15
  196. package/src/core/config.ts +69 -28
  197. package/src/core/errors.ts +122 -48
  198. package/src/core/feedback.ts +4 -1
  199. package/src/core/transaction.ts +9 -4
  200. package/src/core/transport.ts +98 -23
  201. package/src/formats/camt.ts +136 -39
  202. package/src/formats/mt940.ts +167 -81
  203. package/src/formats/readers.ts +24 -31
  204. package/src/formats/record-budget.ts +18 -0
  205. package/src/formats/sepa-purpose.ts +21 -2
  206. package/src/index.ts +4 -2
  207. package/src/session/app-approval.ts +51 -38
  208. package/src/session/dialog-runner.ts +31 -28
  209. package/src/session/login-guard.ts +174 -88
  210. package/src/session/sepa-accounts.ts +63 -45
  211. package/src/session/session-setup.ts +90 -71
  212. package/src/session/session-state.ts +56 -22
  213. package/src/session/signed-dialog.ts +192 -0
  214. package/src/session/tan-selection.ts +50 -39
  215. package/src/session/user-prompts.ts +35 -16
  216. package/src/tan/challenge.ts +40 -31
  217. package/src/tan/flicker.ts +44 -6
  218. package/src/tan/tan-image.ts +7 -5
  219. package/src/tan/tan-models.ts +10 -5
  220. package/src/util/async.ts +0 -5
  221. package/src/util/bytes.ts +13 -19
  222. package/src/util/call-context.ts +3 -2
  223. package/src/util/dates.ts +41 -24
  224. package/src/util/errors.ts +14 -3
  225. package/src/util/json.ts +16 -0
  226. package/src/util/text.ts +42 -12
  227. package/src/util/xml.ts +37 -26
  228. package/src/v3/account-extension.ts +7 -12
  229. package/src/v3/bank-connection.ts +67 -0
  230. package/src/v3/dialog.ts +175 -91
  231. package/src/v3/message.ts +69 -17
  232. package/src/v3/parameter-store.ts +160 -0
  233. package/src/v3/parameters.ts +110 -37
  234. package/src/v3/protocol.ts +70 -253
  235. package/src/v3/queries.ts +190 -0
  236. package/src/v3/segments.ts +65 -22
  237. package/src/v3/syntax.ts +153 -91
  238. package/dist/session/bank-connection.d.ts +0 -28
  239. package/dist/session/bank-connection.d.ts.map +0 -1
  240. package/dist/session/bank-connection.js +0 -48
  241. package/dist/session/bank-connection.js.map +0 -1
  242. package/dist/session/parameter-data.d.ts +0 -83
  243. package/dist/session/parameter-data.d.ts.map +0 -1
  244. package/dist/session/parameter-data.js +0 -68
  245. package/dist/session/parameter-data.js.map +0 -1
  246. package/dist/session/pin-tan-client.d.ts +0 -54
  247. package/dist/session/pin-tan-client.d.ts.map +0 -1
  248. package/dist/session/pin-tan-client.js +0 -153
  249. package/dist/session/pin-tan-client.js.map +0 -1
  250. package/dist/session/pin-tan-dialog.d.ts +0 -71
  251. package/dist/session/pin-tan-dialog.d.ts.map +0 -1
  252. package/dist/session/pin-tan-dialog.js +0 -124
  253. package/dist/session/pin-tan-dialog.js.map +0 -1
  254. package/dist/session/protocol.d.ts +0 -209
  255. package/dist/session/protocol.d.ts.map +0 -1
  256. package/dist/session/protocol.js +0 -75
  257. package/dist/session/protocol.js.map +0 -1
  258. package/dist/session/response-handler.d.ts +0 -48
  259. package/dist/session/response-handler.d.ts.map +0 -1
  260. package/dist/session/response-handler.js +0 -121
  261. package/dist/session/response-handler.js.map +0 -1
  262. package/dist/v3/client.d.ts +0 -24
  263. package/dist/v3/client.d.ts.map +0 -1
  264. package/dist/v3/client.js +0 -16
  265. package/dist/v3/client.js.map +0 -1
  266. package/src/session/bank-connection.ts +0 -51
  267. package/src/session/parameter-data.ts +0 -137
  268. package/src/session/pin-tan-client.ts +0 -186
  269. package/src/session/pin-tan-dialog.ts +0 -160
  270. package/src/session/protocol.ts +0 -311
  271. package/src/session/response-handler.ts +0 -130
  272. package/src/v3/client.ts +0 -29
@@ -1,9 +1,7 @@
1
- import { FinTsStateError } from '../core/errors.js';
1
+ import { clientClosedError } from '../core/errors.js';
2
+ import { TanAnswer } from '../tan/challenge.js';
2
3
  import { Deferred } from '../util/async.js';
3
4
  import { invalidArgument } from '../util/errors.js';
4
- function closedError() {
5
- return new FinTsStateError('The FinTS client is closed');
6
- }
7
5
  /**
8
6
  * Everything a session tells the app, asks of it or waits for: the bank's messages, warnings and log, the TAN callback,
9
7
  * the selectors and the pauses between status requests.
@@ -16,7 +14,7 @@ export class UserPrompts {
16
14
  closed = false;
17
15
  /** The first error an informing callback threw during the running call. */
18
16
  callbackError;
19
- /** Aborts the waits under way; each wait removes its abort when it is over. */
17
+ /** Aborts the waits under way; each wait removes its abort when it is over, or when nothing waits for it any more. */
20
18
  aborts = new Set();
21
19
  constructor(options) {
22
20
  this.options = options;
@@ -31,7 +29,7 @@ export class UserPrompts {
31
29
  /** Throws `FinTsStateError` once `close` was called. */
32
30
  checkOpen() {
33
31
  if (this.closed)
34
- throw closedError();
32
+ throw clientClosedError();
35
33
  }
36
34
  /**
37
35
  * Runs `call` and then fails it with the first error an informing callback threw meanwhile; an error of `call` itself
@@ -83,14 +81,17 @@ export class UserPrompts {
83
81
  this.callbackError ??= { error };
84
82
  }
85
83
  }
86
- /** Shows `challenge` through the TAN callback and returns its answer. */
84
+ /**
85
+ * Shows `challenge` through the TAN callback and returns its answer; rejects with `TypeError` for anything but a
86
+ * `TanAnswer`. Once `TanChallenge.resolved` settles, nothing waits for the answer any more.
87
+ */
87
88
  askTan(challenge) {
88
- return this.unlessClosed(() => this.options.tanCallback(challenge));
89
+ return this.unlessClosed(async () => tanAnswerOf(await this.options.tanCallback(challenge)), challenge.resolved);
89
90
  }
90
91
  /** Waits for `delayMs` milliseconds, or until `interrupt` settles. */
91
92
  pause(delayMs, interrupt) {
92
93
  if (this.closed)
93
- return Promise.reject(closedError());
94
+ return Promise.reject(clientClosedError());
94
95
  let timer;
95
96
  const elapsed = new Promise((resolve) => {
96
97
  timer = setTimeout(resolve, Math.max(0, delayMs));
@@ -135,17 +136,21 @@ export class UserPrompts {
135
136
  return match;
136
137
  }
137
138
  /**
138
- * Starts `wait` and ends it with `FinTsStateError` if `close` is called before it is over.
139
+ * Starts `wait` and ends it with `FinTsStateError` if `close` is called before it is over. Once `unwanted` settles,
140
+ * nothing waits for it any more: it is forgotten then, rather than kept until a callback that never answers does.
139
141
  *
140
142
  * Once the client is closed, the returned promise rejects rather than this function throwing: a caller that starts
141
143
  * several waits at once would otherwise leave the failure of those started first unheard.
142
144
  */
143
- unlessClosed(wait) {
145
+ unlessClosed(wait, unwanted) {
144
146
  if (this.closed)
145
- return Promise.reject(closedError());
147
+ return Promise.reject(clientClosedError());
146
148
  const result = new Deferred();
147
149
  const abort = () => {
148
- result.reject(closedError());
150
+ result.reject(clientClosedError());
151
+ };
152
+ const forget = () => {
153
+ this.aborts.delete(abort);
149
154
  };
150
155
  this.aborts.add(abort);
151
156
  // Runs `wait` at once, as far as its first `await`, and turns an error it throws into a rejection.
@@ -156,9 +161,24 @@ export class UserPrompts {
156
161
  }, (error) => {
157
162
  result.reject(error);
158
163
  })
159
- .finally(() => this.aborts.delete(abort))
164
+ .finally(forget)
160
165
  .catch(() => undefined);
166
+ void unwanted?.then(forget, forget);
161
167
  return result.promise;
162
168
  }
163
169
  }
170
+ /**
171
+ * `answer`, a result of the TAN callback, as a `TanAnswer`; throws `TypeError` for anything else, such as the
172
+ * `undefined` of a callback that returns nothing. The answer is read once, so that what was checked is what counts.
173
+ */
174
+ function tanAnswerOf(answer) {
175
+ const { kind, tan } = (typeof answer === 'object' && answer !== null ? answer : {});
176
+ if (kind === 'tan' && typeof tan === 'string')
177
+ return TanAnswer.tan(tan);
178
+ if (kind === 'approved')
179
+ return TanAnswer.approved;
180
+ if (kind === 'cancelled')
181
+ return TanAnswer.cancelled;
182
+ throw invalidArgument('Returned no TanAnswer', 'tanCallback');
183
+ }
164
184
  //# sourceMappingURL=user-prompts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"user-prompts.js","sourceRoot":"","sources":["../../src/session/user-prompts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"user-prompts.js","sourceRoot":"","sources":["../../src/session/user-prompts.ts"],"names":[],"mappings":"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"}
@@ -21,9 +21,13 @@ export interface TanChallengeInit {
21
21
  export declare class TanChallenge {
22
22
  /** The TAN method the challenge is for. */
23
23
  readonly method: TanMethod;
24
- /** Bank reference of the pending action. */
24
+ /** Bank reference of the pending action, one character per byte the bank sent (ISO 8859-1). */
25
25
  readonly reference: string;
26
- /** Challenge text as sent by the bank; may contain simple HTML. See `plainMessage`. */
26
+ /**
27
+ * Challenge text as the bank sent it, including the formatting tags of a structured challenge
28
+ * (`TanMethod.structuredChallenge`); `plainMessage` is the text to show. Show either as text only, never as HTML
29
+ * (`innerHTML`, `v-html`): it is the bank's text, not markup to trust.
30
+ */
27
31
  readonly message: string | undefined;
28
32
  /** Raw challenge data for TAN generators (HHD_UC). */
29
33
  readonly hhdUc: Uint8Array | undefined;
@@ -40,12 +44,15 @@ export declare class TanChallenge {
40
44
  /** Counts repeated prompts for the same decoupled approval. */
41
45
  readonly attempt: number;
42
46
  /**
43
- * Settles when the client needs no more answer to this challenge: the bank confirmed the approval, or the approval
44
- * failed, timed out or was cancelled. Set where the client asks the bank by itself while the callback shows the
45
- * challenge (`TanCallback`), `undefined` otherwise. It never rejects.
47
+ * Settles when the client needs no more answer to this challenge: a later prompt for the approval replaces it, or the
48
+ * bank confirmed the approval, or the approval failed, timed out or was cancelled. Set where the client asks the bank
49
+ * by itself while the callback shows the challenge (`TanCallback`), `undefined` otherwise. It never rejects.
46
50
  */
47
51
  readonly resolved: Promise<void> | undefined;
48
- /** A challenge as the bank sent it. Use `TanChallenge.create` to have a flicker code or image detected in the data. */
52
+ /**
53
+ * A challenge as the bank sent it, with a copy of `validUntil`, which no other challenge shares. Use
54
+ * `TanChallenge.create` to have a flicker code or image detected in the data.
55
+ */
49
56
  constructor(init: TanChallengeInit);
50
57
  /** Builds a challenge and detects a photoTAN image or chipTAN flicker code in `hhdUc` or `message`. */
51
58
  static create(init: Omit<TanChallengeInit, 'flickerCode' | 'image' | 'resolved'>): TanChallenge;
@@ -61,6 +68,10 @@ export declare class TanChallenge {
61
68
  * defines. Line breaks, paragraphs and list items become new lines. Bold, italics, underlining and list tags are
62
69
  * removed, and the entity references of such markup are resolved. Any other challenge stays as the bank sent it,
63
70
  * which is how the specification wants it shown.
71
+ *
72
+ * Show it as text, such as with `textContent`, or `{{ }}` in Vue, and `white-space: pre-line` for its line breaks;
73
+ * never as HTML (`innerHTML`, `v-html`). It keeps the tags the specification does not define, and `&lt;` becomes
74
+ * `<`, so that as HTML the bank's text could run scripts in the app.
64
75
  */
65
76
  get plainMessage(): string | undefined;
66
77
  }
@@ -70,7 +81,10 @@ export declare function nextAttempt(challenge: TanChallenge, message?: string):
70
81
  export declare function withResolved(challenge: TanChallenge, resolved: Promise<void>): TanChallenge;
71
82
  /** The user's answer to a `TanChallenge`: `TanAnswer.tan(…)`, `TanAnswer.approved` or `TanAnswer.cancelled`. */
72
83
  export type TanAnswer =
73
- /** The TAN the user entered; an empty one cancels. */
84
+ /**
85
+ * The TAN the user entered; an empty one cancels a TAN challenge. Blanks around it do not count, and digits of
86
+ * another width, such as full-width ones, count as the digits they are (Unicode NFKC).
87
+ */
74
88
  {
75
89
  readonly kind: 'tan';
76
90
  readonly tan: string;
@@ -85,7 +99,7 @@ export type TanAnswer =
85
99
  };
86
100
  /** The answers a `TanCallback` returns. */
87
101
  export declare const TanAnswer: Readonly<{
88
- /** The TAN the user entered; an empty one cancels. */
102
+ /** The TAN the user entered; an empty one cancels a TAN challenge (`TanAnswer`). */
89
103
  tan: (tan: string) => TanAnswer;
90
104
  /** The user reports the approval in the banking app (`TanChallenge.isDecoupled`); the client then asks the bank. */
91
105
  approved: {
@@ -99,12 +113,19 @@ export declare const TanAnswer: Readonly<{
99
113
  /**
100
114
  * Shows the `TanChallenge` to the user and returns the `TanAnswer`: `TanAnswer.tan(…)` for a TAN, `TanAnswer.approved`
101
115
  * once the user reports an approval in the banking app (`TanChallenge.isDecoupled`), `TanAnswer.cancelled` to cancel
102
- * either. An answer that does not fit the challenge fails the call with a `TypeError`.
116
+ * either.
117
+ *
118
+ * The call fails with a `TypeError`, without reaching the bank, for anything but a `TanAnswer`, for `approved` to a TAN
119
+ * challenge, for a TAN to an app approval the user can report, and for a TAN that the method rules out: longer than
120
+ * `TanMethod.maxTanLength`, with anything but the digits 0 to 9 where `TanMethod.numericTan`, or that FinTS 3.0 cannot
121
+ * send (ISO 8859-1 only). Where the user cannot report the approval (`TanChallenge.manualConfirmation` is `false`),
122
+ * offer no confirm button: any `TanAnswer` but `cancelled` is ignored.
103
123
  *
104
- * Where the client polls the bank by itself, it sets `TanChallenge.resolved`: close the prompt when it settles, the
105
- * callback's result is no longer waited for then. If the bank has not confirmed a reported approval yet, the callback is
106
- * called again with the next `TanChallenge.attempt`. Where `TanChallenge.manualConfirmation` is `false`, offer no
107
- * confirm button: any answer but `TanAnswer.cancelled` is ignored.
124
+ * If the bank has not confirmed a reported approval yet, the callback is called again with the next
125
+ * `TanChallenge.attempt` and the bank's latest instructions. Where the client polls the bank by itself, it sets
126
+ * `TanChallenge.resolved`: close the prompt when it settles, the callback's result is no longer waited for then. New
127
+ * instructions of the bank then replace the open prompt with the next attempt, which the callback gets after the
128
+ * handlers of the earlier prompt's `resolved` have run.
108
129
  */
109
130
  export type TanCallback = (challenge: TanChallenge) => TanAnswer | Promise<TanAnswer>;
110
131
  /** Picks one of several allowed TAN methods; the first is used when this returns `undefined`. */
@@ -1 +1 @@
1
- {"version":3,"file":"challenge.d.ts","sourceRoot":"","sources":["../../src/tan/challenge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"challenge.d.ts","sourceRoot":"","sources":["../../src/tan/challenge.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,6 @@
1
1
  import { latin1Decode } from '../util/bytes.js';
2
+ import { copyDate } from '../util/dates.js';
3
+ import { characterReference } from '../util/text.js';
2
4
  import { challengeInstruction, FlickerCode, hasEmbeddedFlickerCode } from './flicker.js';
3
5
  import { TanImage } from './tan-image.js';
4
6
  /** Challenge text banks send when there is nothing to show. */
@@ -7,7 +9,6 @@ const noChallenge = 'nochallenge';
7
9
  export function challengeText(message) {
8
10
  return message === undefined || message === '' || message === noChallenge ? undefined : message;
9
11
  }
10
- const printableAscii = /^[\x20-\x7E]+$/;
11
12
  const lineBreak = /<br\b[^<>]*>/gi;
12
13
  const blockTag = /<\/?(?:p|li)\b[^<>]*>/gi;
13
14
  /**
@@ -34,27 +35,21 @@ const namedEntities = {
34
35
  szlig: 'ß',
35
36
  euro: '€',
36
37
  };
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
- */
38
+ /** The character `name` refers to; `undefined` for an unknown name and for a number that is not a character. */
41
39
  function decodeEntity(name) {
42
- if (name.startsWith('#')) {
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;
40
+ return characterReference(name) ?? (Object.hasOwn(namedEntities, name) ? namedEntities[name] : undefined);
50
41
  }
51
42
  /** A request from the bank to authorize an action with a TAN or an app approval. */
52
43
  export class TanChallenge {
53
44
  /** The TAN method the challenge is for. */
54
45
  method;
55
- /** Bank reference of the pending action. */
46
+ /** Bank reference of the pending action, one character per byte the bank sent (ISO 8859-1). */
56
47
  reference;
57
- /** Challenge text as sent by the bank; may contain simple HTML. See `plainMessage`. */
48
+ /**
49
+ * Challenge text as the bank sent it, including the formatting tags of a structured challenge
50
+ * (`TanMethod.structuredChallenge`); `plainMessage` is the text to show. Show either as text only, never as HTML
51
+ * (`innerHTML`, `v-html`): it is the bank's text, not markup to trust.
52
+ */
58
53
  message;
59
54
  /** Raw challenge data for TAN generators (HHD_UC). */
60
55
  hhdUc;
@@ -71,12 +66,15 @@ export class TanChallenge {
71
66
  /** Counts repeated prompts for the same decoupled approval. */
72
67
  attempt;
73
68
  /**
74
- * Settles when the client needs no more answer to this challenge: the bank confirmed the approval, or the approval
75
- * failed, timed out or was cancelled. Set where the client asks the bank by itself while the callback shows the
76
- * challenge (`TanCallback`), `undefined` otherwise. It never rejects.
69
+ * Settles when the client needs no more answer to this challenge: a later prompt for the approval replaces it, or the
70
+ * bank confirmed the approval, or the approval failed, timed out or was cancelled. Set where the client asks the bank
71
+ * by itself while the callback shows the challenge (`TanCallback`), `undefined` otherwise. It never rejects.
77
72
  */
78
73
  resolved;
79
- /** A challenge as the bank sent it. Use `TanChallenge.create` to have a flicker code or image detected in the data. */
74
+ /**
75
+ * A challenge as the bank sent it, with a copy of `validUntil`, which no other challenge shares. Use
76
+ * `TanChallenge.create` to have a flicker code or image detected in the data.
77
+ */
80
78
  constructor(init) {
81
79
  this.method = init.method;
82
80
  this.reference = init.reference;
@@ -85,7 +83,7 @@ export class TanChallenge {
85
83
  this.flickerCode = init.flickerCode;
86
84
  this.image = init.image;
87
85
  this.isDecoupled = init.isDecoupled ?? false;
88
- this.validUntil = init.validUntil;
86
+ this.validUntil = copyDate(init.validUntil);
89
87
  this.tanMediumName = init.tanMediumName;
90
88
  this.attempt = init.attempt ?? 1;
91
89
  this.resolved = init.resolved;
@@ -97,11 +95,8 @@ export class TanChallenge {
97
95
  const data = init.hhdUc !== undefined && init.hhdUc.length > 0 ? init.hhdUc : undefined;
98
96
  if (data !== undefined) {
99
97
  image = TanImage.tryParse(data);
100
- if (image === undefined) {
101
- const text = latin1Decode(data);
102
- if (printableAscii.test(text))
103
- flicker = FlickerCode.tryParse(text);
104
- }
98
+ if (image === undefined)
99
+ flicker = FlickerCode.tryParse(latin1Decode(data));
105
100
  }
106
101
  else if (init.message !== undefined && hasEmbeddedFlickerCode(init.message)) {
107
102
  flicker = FlickerCode.tryParse(init.message);
@@ -128,6 +123,10 @@ export class TanChallenge {
128
123
  * defines. Line breaks, paragraphs and list items become new lines. Bold, italics, underlining and list tags are
129
124
  * removed, and the entity references of such markup are resolved. Any other challenge stays as the bank sent it,
130
125
  * which is how the specification wants it shown.
126
+ *
127
+ * Show it as text, such as with `textContent`, or `{{ }}` in Vue, and `white-space: pre-line` for its line breaks;
128
+ * never as HTML (`innerHTML`, `v-html`). It keeps the tags the specification does not define, and `&lt;` becomes
129
+ * `<`, so that as HTML the bank's text could run scripts in the app.
131
130
  */
132
131
  get plainMessage() {
133
132
  const text = this.message;
@@ -175,7 +174,7 @@ const approvedAnswer = Object.freeze({ kind: 'approved' });
175
174
  const cancelledAnswer = Object.freeze({ kind: 'cancelled' });
176
175
  /** The answers a `TanCallback` returns. */
177
176
  export const TanAnswer = Object.freeze({
178
- /** The TAN the user entered; an empty one cancels. */
177
+ /** The TAN the user entered; an empty one cancels a TAN challenge (`TanAnswer`). */
179
178
  tan: (tan) => Object.freeze({ kind: 'tan', tan }),
180
179
  /** The user reports the approval in the banking app (`TanChallenge.isDecoupled`); the client then asks the bank. */
181
180
  approved: approvedAnswer,
@@ -1 +1 @@
1
- {"version":3,"file":"challenge.js","sourceRoot":"","sources":["../../src/tan/challenge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"challenge.js","sourceRoot":"","sources":["../../src/tan/challenge.ts"],"names":[],"mappings":"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"}
@@ -13,11 +13,17 @@ export declare class FlickerCode {
13
13
  private readonly startCode;
14
14
  private readonly dataElements;
15
15
  private constructor();
16
- /** Parses the challenge data sent by the bank; throws `FormatError` if it is not a flicker code. */
16
+ /**
17
+ * Parses the challenge data sent by the bank; throws `FormatError` if it is not a flicker code a TAN generator can
18
+ * take: one with characters after the length it states, an empty data element, data other than printable ASCII, or
19
+ * 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.
20
+ */
17
21
  static parse(code: string): FlickerCode;
18
22
  /** Parses `code`, or returns `undefined` if it is not a flicker code. */
19
23
  static tryParse(code: string): FlickerCode | undefined;
20
24
  private static parseLayout;
25
+ /** Whether the code renders as the bank sent it: its data printable ASCII, every length within its field. */
26
+ private get fitsTanGenerator();
21
27
  /** The data of the start code, which opens the challenge. */
22
28
  get startCodeData(): string;
23
29
  /** The first data element of the challenge; `undefined` if the code leaves it out. */
@@ -1 +1 @@
1
- {"version":3,"file":"flicker.d.ts","sourceRoot":"","sources":["../../src/tan/flicker.ts"],"names":[],"mappings":"AAGA,8GAA8G;AAC9G,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;AAQ3C,+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,CAK5D;AAiBD,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,oGAAoG;IACpG,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;IAwB1B,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;CAatB"}
1
+ {"version":3,"file":"flicker.d.ts","sourceRoot":"","sources":["../../src/tan/flicker.ts"],"names":[],"mappings":"AAGA,8GAA8G;AAC9G,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;AAQ3C,+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,CAK5D;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;;;;OAIG;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;IA0B1B,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;CAatB"}
@@ -20,13 +20,20 @@ export function challengeInstruction(message) {
20
20
  /**
21
21
  * Digit counts of the challenge length (LC) and of the data element lengths (LDE) to try when parsing.
22
22
  *
23
- * HHD 1.4 states the LC with three digits, HHD 1.3 with two.
23
+ * 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;
24
+ * a code that both LDE widths read is taken with two, as the specification has it.
24
25
  */
25
26
  const layouts = [
26
27
  { lcDigits: 3, lengthDigits: 2 },
27
28
  { lcDigits: 3, lengthDigits: 3 },
28
29
  { lcDigits: 2, lengthDigits: 2 },
29
30
  ];
31
+ /** The most bytes a length field states: HHD 1.3 flags ASCII data in bit 4 of it, HHD 1.4 in bit 6. */
32
+ const maxElementLength = { hhd13: 0x0f, hhd14: 0x3f };
33
+ /** The most bytes of a rendered code, which its one-byte length (LC) states. */
34
+ const maxCodeLength = 0xff;
35
+ /** The characters a TAN generator shows; one byte each. */
36
+ const printableAscii = /^[\x20-\x7E]*$/;
30
37
  function hex(value, width) {
31
38
  return value.toString(16).toUpperCase().padStart(width, '0');
32
39
  }
@@ -46,7 +53,11 @@ export class FlickerCode {
46
53
  this.startCode = startCode;
47
54
  this.dataElements = dataElements;
48
55
  }
49
- /** Parses the challenge data sent by the bank; throws `FormatError` if it is not a flicker code. */
56
+ /**
57
+ * Parses the challenge data sent by the bank; throws `FormatError` if it is not a flicker code a TAN generator can
58
+ * take: one with characters after the length it states, an empty data element, data other than printable ASCII, or
59
+ * 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.
60
+ */
50
61
  static parse(code) {
51
62
  const cleaned = extractCode(code);
52
63
  for (const layout of layouts) {
@@ -87,12 +98,20 @@ export class FlickerCode {
87
98
  const startCode = new StartCode(challenge.take(startLength & 0x3f), controlBytes);
88
99
  const dataElements = [];
89
100
  for (let i = 0; i < 3; i++) {
90
- dataElements.push(new DataElement(challenge.isAtEnd ? undefined : challenge.take(challenge.decimal(lengthDigits) & 0x3f)));
101
+ dataElements.push(new DataElement(challenge.isAtEnd ? undefined : challenge.take(challenge.dataLength(lengthDigits))));
91
102
  }
92
- // The fields fill exactly the LC characters; a layout that reads them otherwise is the wrong one.
93
- if (!challenge.isAtEnd)
103
+ // Only a layout whose fields fill exactly the LC characters, which end the code, can be the right one.
104
+ if (!challenge.isAtEnd || !code.isAtEnd)
94
105
  throw new FormatError('Flicker code fields do not match its length');
95
- return new FlickerCode(controlBytes.length === 0 ? 'hhd13' : 'hhd14', lc, startCode, dataElements);
106
+ const flicker = new FlickerCode(controlBytes.length === 0 ? 'hhd13' : 'hhd14', lc, startCode, dataElements);
107
+ if (!flicker.fitsTanGenerator)
108
+ throw new FormatError('Flicker code data the TAN generator cannot take');
109
+ return flicker;
110
+ }
111
+ /** Whether the code renders as the bank sent it: its data printable ASCII, every length within its field. */
112
+ get fitsTanGenerator() {
113
+ const elements = [this.startCode, ...this.dataElements];
114
+ return elements.every((element) => element.fits(this.version)) && this.payload().length <= 2 * maxCodeLength;
96
115
  }
97
116
  /** The data of the start code, which opens the challenge. */
98
117
  get startCodeData() {
@@ -204,6 +223,16 @@ class Reader {
204
223
  hex(digits) {
205
224
  return parseInt(Reader.match(/^[0-9A-Fa-f]+$/, this.take(digits)), 16);
206
225
  }
226
+ /**
227
+ * A data element length field (LDE) of `digits` decimal digits: 1 to 63 characters. The challenge leaves out an
228
+ * element without data, and sets none of the flags in bits 6 and 7, which only the rendered code carries.
229
+ */
230
+ dataLength(digits) {
231
+ const length = this.decimal(digits);
232
+ if (length === 0 || length > 0x3f)
233
+ throw new FormatError('Invalid data element length');
234
+ return length;
235
+ }
207
236
  static match(pattern, field) {
208
237
  if (!pattern.test(field))
209
238
  throw new FormatError('Invalid length field', field);
@@ -222,6 +251,11 @@ class DataElement {
222
251
  get isBcd() {
223
252
  return this.data === undefined || /^[0-9]+$/.test(this.data);
224
253
  }
254
+ /** Whether the data are printable ASCII, and no more bytes than the length field of `version` can state. */
255
+ fits(version) {
256
+ const d = this.data;
257
+ return d === undefined || (printableAscii.test(d) && this.renderData().length / 2 <= maxElementLength[version]);
258
+ }
225
259
  renderData() {
226
260
  const d = this.data;
227
261
  if (d === undefined)
@@ -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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"}
@@ -12,10 +12,11 @@ export declare class TanImage {
12
12
  /**
13
13
  * Reads the bank's image container: a two-byte length and the MIME type, then a two-byte length and the image.
14
14
  *
15
- * `undefined` unless the MIME type is an image type and the container holds the whole image.
15
+ * `undefined` unless the MIME type, in any case, is that of a PNG, JPEG, GIF, WebP or BMP image, and the container
16
+ * holds the whole image.
16
17
  */
17
18
  static tryParse(data: Uint8Array): TanImage | undefined;
18
- /** The image as a `data:` URL, ready for the `src` of an `<img>`. */
19
+ /** The image as a `data:` URL, for the `src` of an `<img>` only: the bytes are the bank's, whatever their type says. */
19
20
  toDataUrl(): string;
20
21
  }
21
22
  //# 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":"AAIA,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;;;;OAIG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,QAAQ,GAAG,SAAS;IAavD,qEAAqE;IACrE,SAAS,IAAI,MAAM;CAGpB"}
1
+ {"version":3,"file":"tan-image.d.ts","sourceRoot":"","sources":["../../src/tan/tan-image.ts"],"names":[],"mappings":"AAKA,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;CAGpB"}
@@ -1,5 +1,6 @@
1
1
  import { base64Encode, latin1Decode } from '../util/bytes.js';
2
- const imageMimeType = /^image\/[a-zA-Z0-9.+-]+$/;
2
+ /** The formats of photoTAN and QR-TAN images: raster images, which unlike SVG cannot carry scripts. */
3
+ const imageMimeTypes = new Set(['image/png', 'image/jpeg', 'image/gif', 'image/webp', 'image/bmp']);
3
4
  /** An image challenge (photoTAN, QR-TAN) with its MIME type. */
4
5
  export class TanImage {
5
6
  mimeType;
@@ -15,7 +16,8 @@ export class TanImage {
15
16
  /**
16
17
  * Reads the bank's image container: a two-byte length and the MIME type, then a two-byte length and the image.
17
18
  *
18
- * `undefined` unless the MIME type is an image type and the container holds the whole image.
19
+ * `undefined` unless the MIME type, in any case, is that of a PNG, JPEG, GIF, WebP or BMP image, and the container
20
+ * holds the whole image.
19
21
  */
20
22
  static tryParse(data) {
21
23
  if (data.length < 4)
@@ -23,8 +25,8 @@ export class TanImage {
23
25
  const mimeLength = (data[0] << 8) | data[1];
24
26
  if (mimeLength === 0 || data.length < 2 + mimeLength + 2)
25
27
  return undefined;
26
- const mime = latin1Decode(data.subarray(2, 2 + mimeLength));
27
- if (!imageMimeType.test(mime))
28
+ const mime = latin1Decode(data.subarray(2, 2 + mimeLength)).toLowerCase();
29
+ if (!imageMimeTypes.has(mime))
28
30
  return undefined;
29
31
  const offset = 2 + mimeLength;
30
32
  const imageLength = (data[offset] << 8) | data[offset + 1];
@@ -33,7 +35,7 @@ export class TanImage {
33
35
  return undefined;
34
36
  return new TanImage(mime, data.subarray(start, start + imageLength));
35
37
  }
36
- /** The image as a `data:` URL, ready for the `src` of an `<img>`. */
38
+ /** The image as a `data:` URL, for the `src` of an `<img>` only: the bytes are the bank's, whatever their type says. */
37
39
  toDataUrl() {
38
40
  return `data:${this.mimeType};base64,${base64Encode(this.bytes)}`;
39
41
  }
@@ -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;AAE9D,MAAM,aAAa,GAAG,0BAA0B,CAAC;AAEjD,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;;;;OAIG;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;QAC5D,IAAI,CAAC,aAAa,CAAC,IAAI,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,KAAK,GAAG,WAAW,GAAG,IAAI,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QACxD,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,qEAAqE;IACrE,SAAS;QACP,OAAO,QAAQ,IAAI,CAAC,QAAQ,WAAW,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;IACpE,CAAC;CACF"}
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;AAE9D,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,KAAK,GAAG,WAAW,GAAG,IAAI,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QACxD,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;CACF"}