@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 +1 @@
1
- {"version":3,"file":"session-setup.d.ts","sourceRoot":"","sources":["../../src/session/session-setup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,KAAK,EAAa,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAiB,MAAM,kBAAkB,CAAC;AAElE,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAClF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;;;;GAKG;AACH,qBAAa,YAAY,CAAC,CAAC,SAAS,YAAY,EAAE,CAAC;IAK/C,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAPxB,kFAAkF;IAClF,OAAO,CAAC,oBAAoB,CAAS;gBAGlB,QAAQ,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,EAC9B,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC,EAC7B,IAAI,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,EACxB,KAAK,EAAE,UAAU;IAGpC;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IAMnC,wFAAwF;IAClF,OAAO,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAKrC,2GAA2G;IACrG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAM9B,kGAAkG;IAC5F,SAAS,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAKhD;;;;;;;;OAQG;IACG,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAkBxD,2GAA2G;YAC7F,MAAM;IAYpB;;;;;;;;OAQG;YACW,cAAc;IAM5B;;;OAGG;YACW,8BAA8B;IAS5C,8FAA8F;YAChF,gBAAgB;IAc9B;;;;;;OAMG;YACW,cAAc;IAW5B,+FAA+F;YACjF,IAAI;CAOnB"}
1
+ {"version":3,"file":"session-setup.d.ts","sourceRoot":"","sources":["../../src/session/session-setup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAIjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGxD,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;;;;GAKG;AACH,qBAAa,YAAY;IAErB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAFJ,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,YAAY;IAGrC;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IAMnC,wFAAwF;IAClF,OAAO,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAKrC;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,SAAS,EAAE,GAAG,SAAS,CAAC;IASjD,kGAAkG;IAC5F,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC;IAKxC,mGAAmG;IACnG,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAIlD;;;OAGG;YACW,MAAM;IAYpB;;;;;;;;OAQG;YACW,cAAc;IAM5B;;;;;OAKG;YACW,8BAA8B;IAW5C;;;;;OAKG;YACW,gCAAgC;YAahC,eAAe;IAS7B;;;;OAIG;YACW,gBAAgB;IAS9B;;;;;;OAMG;YACW,cAAc;IAW5B,+FAA+F;YACjF,IAAI;CAQnB"}
@@ -1,5 +1,9 @@
1
- import { FinTsBankError, FinTsError, FinTsProtocolError, FinTsTransportError, parseBankData } from '../core/errors.js';
2
- import { requireBankParameters } from './parameter-data.js';
1
+ import { FinTsError, FinTsProtocolError, FinTsTransportError, parseBankData, tryLookUp } from '../core/errors.js';
2
+ import { hasErrors } from '../core/feedback.js';
3
+ import { FinTs3Dialog } from '../v3/dialog.js';
4
+ import { requireBankParameters } from '../v3/parameters.js';
5
+ import { tanMediaQuery } from '../v3/queries.js';
6
+ import { SignedDialog } from './signed-dialog.js';
3
7
  /**
4
8
  * What has to be settled before a login: the bank parameter data, the synchronization, and through `TanSelection` the
5
9
  * TAN method and medium. Each of the dialogs this takes serves one purpose only.
@@ -7,87 +11,66 @@ import { requireBankParameters } from './parameter-data.js';
7
11
  * Where the bank refuses a login for a reason the session can take care of, `remedied` does so and logs in again.
8
12
  */
9
13
  export class SessionSetup {
14
+ session;
10
15
  protocol;
11
- responses;
12
16
  tans;
13
- guard;
14
- /** Whether a synchronization dialog ran, so that a helpful one runs once only. */
15
- synchronizationTried = false;
16
- constructor(protocol, responses, tans, guard) {
17
+ constructor(session, protocol, tans) {
18
+ this.session = session;
17
19
  this.protocol = protocol;
18
- this.responses = responses;
19
20
  this.tans = tans;
20
- this.guard = guard;
21
21
  }
22
22
  /**
23
23
  * The bank's general information: from an anonymous dialog where the bank answers one, else from the synchronization.
24
24
  * No TAN method or medium is chosen for it.
25
25
  */
26
26
  async bankInfo() {
27
- if (this.protocol.bankParameters === undefined)
27
+ if (this.session.parameters.bankParameters === undefined)
28
28
  await this.fetchBankParametersAnonymously();
29
- if (this.protocol.bankParameters === undefined)
29
+ if (this.session.parameters.bankParameters === undefined)
30
30
  await this.synchronizeIfDue();
31
- return requireBankParameters(this.protocol.bankParameters).bankInfo;
31
+ return requireBankParameters(this.session.parameters.bankParameters).bankInfo;
32
32
  }
33
33
  /** The TAN methods the bank allows for this user, which the synchronization reports. */
34
34
  async methods() {
35
35
  await this.loadParameters();
36
36
  return this.tans.available();
37
37
  }
38
- /** Settles what is still open: the bank parameter data, the synchronization, the TAN method and medium. */
38
+ /**
39
+ * Settles what is still open: the bank parameter data, the synchronization, the TAN method and medium. Returns the TAN
40
+ * media it looked up to choose the medium; `undefined` where it looked up none, or the bank listed none.
41
+ */
39
42
  async prepare() {
40
43
  await this.loadParameters();
41
44
  await this.tans.ensureMethodChosen();
42
- if (this.tans.mediumToLookUp)
43
- await this.tans.chooseMedium(await this.lookUpTanMedia());
45
+ if (!this.tans.mediumToLookUp)
46
+ return undefined;
47
+ const media = await this.lookUpTanMedia();
48
+ await this.tans.chooseMedium(media);
49
+ return media;
44
50
  }
45
51
  /** A new dialog signed with the TAN method and medium in use, once `prepare` has settled them. */
46
52
  async newDialog() {
47
53
  await this.prepare();
48
- return this.tans.newDialog();
54
+ return new SignedDialog(this.tans.newDialog(), this.session);
55
+ }
56
+ /** Runs `attempt`, which may log in, once more after each refused login `remedy` takes care of. */
57
+ remedied(attempt) {
58
+ return this.session.guard.remedied(attempt, (reason, rejected) => this.remedy(reason, rejected));
49
59
  }
50
60
  /**
51
- * Runs `attempt`, which may log in, and runs it once more for each reason of a refused login the session can take
52
- * care of, so that a bank that keeps refusing fails with its own error:
53
- *
54
- * | Refusal (`LoginGuard.remediableReasons`) | Remedy |
55
- * | --- | --- |
56
- * | 3920 without the method, or 9075 after the one-step method | another allowed method (`TanSelection.replace`) |
57
- * | 9391 | a new synchronization, which issues a customer system ID |
61
+ * Takes care of `reason`, given for refusing a login signed with `rejected`, with another TAN method or a new
62
+ * synchronization; returns whether it could.
58
63
  */
59
- async remedied(attempt) {
60
- // A refusal of an earlier call stops the attempt before it sends the PIN; there is nothing to remedy.
61
- if (this.guard.hasRefusal)
62
- return attempt();
63
- const remedied = new Set();
64
- for (;;) {
65
- try {
66
- return await attempt();
67
- }
68
- catch (error) {
69
- if (!(error instanceof FinTsBankError))
70
- throw error;
71
- const reason = this.guard.remediableReasons(error).find((r) => !remedied.has(r));
72
- const rejected = this.guard.refusedMethod;
73
- if (reason === undefined || rejected === undefined || !(await this.remedy(reason, rejected)))
74
- throw error;
75
- remedied.add(reason);
76
- this.guard.pardon(error);
77
- }
78
- }
79
- }
80
- /** Takes care of `reason`, given for refusing a login signed with `rejected`; returns whether it could. */
81
64
  async remedy(reason, rejected) {
82
65
  switch (reason) {
83
66
  case 'tanMethodNotAllowed':
84
67
  // The parameter data name the methods to choose from; the refusal may be the first to deliver them.
85
- if (this.protocol.bankParameters === undefined)
68
+ if (this.session.parameters.bankParameters === undefined)
86
69
  await this.fetchBankParametersAnonymously();
87
70
  return this.tans.replace(rejected);
88
71
  case 'systemIdRejected':
89
72
  // Without a customer system ID there is none to lose, and logging in once more would only send the PIN again.
90
- return this.protocol.forgetSystemId();
73
+ return this.session.parameters.forgetSystemId();
91
74
  }
92
75
  }
93
76
  /**
@@ -100,18 +83,23 @@ export class SessionSetup {
100
83
  * After a refused login it throws the refusal right away, before the user is asked for a TAN method or medium.
101
84
  */
102
85
  async loadParameters() {
103
- this.guard.check();
104
- if (this.protocol.bankParameters === undefined)
86
+ this.session.guard.check();
87
+ if (this.session.parameters.bankParameters === undefined)
105
88
  await this.fetchBankParametersAnonymously();
106
89
  await this.synchronizeIfDue();
107
90
  }
108
91
  /**
109
- * Asks for the bank parameter data without logging in. A bank that does not answer anonymously is no error, but a
110
- * failed connection is: the synchronization would only wait for the same server again.
92
+ * Asks for the bank parameter data without logging in, keeps them where there are none from a dialog signed with the
93
+ * PIN (`ParameterStore.keepAnonymous`), and passes the bank's messages on: all an anonymous dialog tells, since the
94
+ * TAN methods it lists are not those of a user. A bank that does not answer anonymously is no error, but a failed
95
+ * connection is: the synchronization would only wait for the same server again.
111
96
  */
112
97
  async fetchBankParametersAnonymously() {
113
98
  try {
114
- this.responses.showBankMessages(await this.protocol.fetchBankParametersAnonymously());
99
+ const response = await this.requestBankParametersAnonymously();
100
+ this.session.parameters.keepAnonymous(response);
101
+ for (const message of response.bankMessages)
102
+ this.session.prompts.showBankMessage(message);
115
103
  }
116
104
  catch (error) {
117
105
  // Optional: the login delivers the parameters as well.
@@ -119,15 +107,48 @@ export class SessionSetup {
119
107
  throw error;
120
108
  }
121
109
  }
122
- /** Runs the synchronization dialog where it is due (`TanSelection.synchronizationDialog`). */
110
+ /**
111
+ * Asks for the bank parameter data in an anonymous dialog that announces strong customer authentication; a bank that
112
+ * rejects the announcement, with a return code or by failing on it, is asked again without it.
113
+ *
114
+ * A timeout or a broken connection is not a reason to ask again: it would only double the wait.
115
+ */
116
+ async requestBankParametersAnonymously() {
117
+ let announced;
118
+ try {
119
+ announced = await this.anonymousDialog(true);
120
+ }
121
+ catch (error) {
122
+ if (error instanceof FinTsTransportError && error.statusCode === undefined)
123
+ throw error;
124
+ if (!(error instanceof FinTsError))
125
+ throw error;
126
+ return this.anonymousDialog(false);
127
+ }
128
+ if (!hasErrors(announced.feedback) || announced.find('HIBPA') !== undefined)
129
+ return announced;
130
+ return this.anonymousDialog(false);
131
+ }
132
+ async anonymousDialog(announceSca) {
133
+ const dialog = FinTs3Dialog.anonymous(this.protocol);
134
+ try {
135
+ return await dialog.requestBankParameters(announceSca);
136
+ }
137
+ finally {
138
+ await dialog.end();
139
+ }
140
+ }
141
+ /**
142
+ * Runs the synchronization, a login in a dialog of its own, while there is no customer system ID, without which no
143
+ * regular dialog starts. It runs before the TAN method and medium are settled (`TanSelection.synchronizationDialog`
144
+ * tells which method signs it).
145
+ */
123
146
  async synchronizeIfDue() {
124
- const due = this.protocol.synchronization === 'required' ||
125
- (this.protocol.synchronization === 'helpful' && !this.synchronizationTried);
126
- if (!due)
147
+ if (this.session.parameters.systemId !== undefined)
127
148
  return;
128
- this.synchronizationTried = true;
129
- await this.once(this.tans.synchronizationDialog(), (dialog) => this.responses.startDialog(dialog, () => dialog.start(true)));
130
- if (this.protocol.synchronization === 'required') {
149
+ await this.once(this.tans.synchronizationDialog(), (dialog) => dialog.login(true));
150
+ // Set by the synchronization, which the compiler cannot see.
151
+ if (this.session.parameters.systemId === undefined) {
131
152
  throw new FinTsProtocolError('The bank did not complete the synchronization');
132
153
  }
133
154
  }
@@ -139,21 +160,22 @@ export class SessionSetup {
139
160
  * medium the list tells (PIN/TAN B.4.3.1.3).
140
161
  */
141
162
  async lookUpTanMedia() {
142
- const query = this.protocol.tanMedia();
163
+ const query = tanMediaQuery(this.session.parameters);
143
164
  if (query === undefined)
144
165
  return undefined;
145
- return this.guard.tryLookUp(() => this.once(this.tans.lookupDialog(), async (dialog) => {
146
- const pages = await this.responses.startDialogWith(dialog, dialog.startWith(query.order(undefined)));
147
- return parseBankData(() => query.read(pages));
166
+ return tryLookUp(() => this.once(this.tans.lookupDialog(), async (dialog) => {
167
+ const answers = await dialog.loginWith(query.order(undefined));
168
+ return parseBankData(() => query.read(answers));
148
169
  }));
149
170
  }
150
171
  /** Runs `use` in `dialog`, a dialog of its own, and ends it afterwards, however `use` ends. */
151
172
  async once(dialog, use) {
173
+ const signed = new SignedDialog(dialog, this.session);
152
174
  try {
153
- return await use(dialog);
175
+ return await use(signed);
154
176
  }
155
177
  finally {
156
- await dialog.end();
178
+ await signed.end();
157
179
  }
158
180
  }
159
181
  }
@@ -1 +1 @@
1
- {"version":3,"file":"session-setup.js","sourceRoot":"","sources":["../../src/session/session-setup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-setup.js","sourceRoot":"","sources":["../../src/session/session-setup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAClH,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAE,YAAY,EAAqB,MAAM,oBAAoB,CAAC;AAGrE;;;;;GAKG;AACH,MAAM,OAAO,YAAY;IAEJ;IACA;IACA;IAHnB,YACmB,OAAqB,EACrB,QAAwB,EACxB,IAAkB;QAFlB,YAAO,GAAP,OAAO,CAAc;QACrB,aAAQ,GAAR,QAAQ,CAAgB;QACxB,SAAI,GAAJ,IAAI,CAAc;IAClC,CAAC;IAEJ;;;OAGG;IACH,KAAK,CAAC,QAAQ;QACZ,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,cAAc,KAAK,SAAS;YAAE,MAAM,IAAI,CAAC,8BAA8B,EAAE,CAAC;QACtG,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,cAAc,KAAK,SAAS;YAAE,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxF,OAAO,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,QAAQ,CAAC;IAChF,CAAC;IAED,wFAAwF;IACxF,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5B,MAAM,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACrC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,OAAO,SAAS,CAAC;QAChD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC1C,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACpC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,kGAAkG;IAClG,KAAK,CAAC,SAAS;QACb,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/D,CAAC;IAED,mGAAmG;IACnG,QAAQ,CAAI,OAAyB;QACnC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IACnG,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,MAAM,CAAC,MAAqB,EAAE,QAAmB;QAC7D,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,qBAAqB;gBACxB,oGAAoG;gBACpG,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,cAAc,KAAK,SAAS;oBAAE,MAAM,IAAI,CAAC,8BAA8B,EAAE,CAAC;gBACtG,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACrC,KAAK,kBAAkB;gBACrB,8GAA8G;gBAC9G,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC;QACpD,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACK,KAAK,CAAC,cAAc;QAC1B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,cAAc,KAAK,SAAS;YAAE,MAAM,IAAI,CAAC,8BAA8B,EAAE,CAAC;QACtG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAChC,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,8BAA8B;QAC1C,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,gCAAgC,EAAE,CAAC;YAC/D,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAChD,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,YAAY;gBAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAC7F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,uDAAuD;YACvD,IAAI,KAAK,YAAY,mBAAmB,IAAI,CAAC,CAAC,KAAK,YAAY,UAAU,CAAC;gBAAE,MAAM,KAAK,CAAC;QAC1F,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,gCAAgC;QAC5C,IAAI,SAA2B,CAAC;QAChC,IAAI,CAAC;YACH,SAAS,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,mBAAmB,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS;gBAAE,MAAM,KAAK,CAAC;YACxF,IAAI,CAAC,CAAC,KAAK,YAAY,UAAU,CAAC;gBAAE,MAAM,KAAK,CAAC;YAChD,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC9F,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,WAAoB;QAChD,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrD,IAAI,CAAC;YACH,OAAO,MAAM,MAAM,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;QACzD,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,gBAAgB;QAC5B,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,KAAK,SAAS;YAAE,OAAO;QAC3D,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACnF,6DAA6D;QAC7D,IAAK,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAA+B,KAAK,SAAS,EAAE,CAAC;YAC3E,MAAM,IAAI,kBAAkB,CAAC,+CAA+C,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,cAAc;QAC1B,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACrD,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC1C,OAAO,SAAS,CAAC,GAAG,EAAE,CACpB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACnD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;YAC/D,OAAO,aAAa,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QAClD,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAED,+FAA+F;IACvF,KAAK,CAAC,IAAI,CAAI,MAAoB,EAAE,GAAyC;QACnF,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACtD,IAAI,CAAC;YACH,OAAO,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;CACF"}
@@ -1,15 +1,18 @@
1
1
  import { Account } from '../core/account.js';
2
2
  import { type JsonObject } from '../util/json.js';
3
- import type { BankResponse, PinTanProtocol } from './protocol.js';
4
- /** The session and the protocol's parameter data as one JSON string, which `restoreSession` reads. */
5
- export declare function saveSession<R extends BankResponse, O>(protocol: PinTanProtocol<R, O>, session: SessionState): string;
3
+ import type { ParameterStore } from '../v3/parameter-store.js';
4
+ import type { LoginGuard } from './login-guard.js';
5
+ /** The session, the parameter data and the guard's refusal as JSON, which `restoreSession` reads. */
6
+ export declare function saveSession(parameters: ParameterStore, guard: LoginGuard, session: SessionState): string;
6
7
  /**
7
- * The session saved in `json`, and the protocol's parameter data restored from it.
8
+ * The session saved in `json`, and the parameter data and the guard's refused login restored from it.
8
9
  *
9
10
  * A missing or damaged state, or one saved for another user, bank, server or protocol version, gives a new session,
10
- * which only costs a new synchronization.
11
+ * which only costs a new synchronization. The refused login belongs to the user at the bank, so it comes first: it holds
12
+ * for another server or protocol version as well, and where the rest is damaged; a state saved by the Dart package or
13
+ * an earlier version has none.
11
14
  */
12
- export declare function restoreSession<R extends BankResponse, O>(json: string | undefined, protocol: PinTanProtocol<R, O>): SessionState;
15
+ export declare function restoreSession(json: string | undefined, parameters: ParameterStore, guard: LoginGuard): SessionState;
13
16
  /**
14
17
  * The session data saved between app starts: the allowed TAN methods, the TAN method and medium in use, and the SEPA
15
18
  * account list.
@@ -1 +1 @@
1
- {"version":3,"file":"session-state.d.ts","sourceRoot":"","sources":["../../src/session/session-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAG7C,OAAO,EAOL,KAAK,UAAU,EAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAQlE,sGAAsG;AACtG,wBAAgB,WAAW,CAAC,CAAC,SAAS,YAAY,EAAE,CAAC,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,GAAG,MAAM,CAQpH;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,YAAY,EAAE,CAAC,EACtD,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,QAAQ,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,GAC7B,YAAY,CAoBd;AAOD;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,mBAAmB,CAAgC;IAC3D,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,iBAAiB,CAAiC;IAC1D,OAAO,CAAC,cAAc,CAAqB;IAE3C,yGAAyG;IACzG,IAAI,cAAc,IAAI,SAAS,MAAM,EAAE,GAAG,SAAS,CAElD;IAED,kDAAkD;IAClD,IAAI,SAAS,IAAI,MAAM,GAAG,SAAS,CAElC;IAED,qCAAqC;IACrC,IAAI,SAAS,IAAI,MAAM,GAAG,SAAS,CAElC;IAED,uEAAuE;IACvE,sBAAsB,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI;IAIlE;;;OAGG;IACH,YAAY,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAKzE,yDAAyD;IACzD,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAI9C,iGAAiG;IACjG,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,OAAO,EAAE,GAAG,SAAS;IAI5E,mGAAmG;IACnG,iBAAiB,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAKrF,4EAA4E;IAC5E,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,YAAY;IAW/C,gCAAgC;IAChC,MAAM,IAAI,UAAU;CASrB"}
1
+ {"version":3,"file":"session-state.d.ts","sourceRoot":"","sources":["../../src/session/session-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAI7C,OAAO,EAQL,KAAK,UAAU,EAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAmB,MAAM,kBAAkB,CAAC;AAQpE,qGAAqG;AACrG,wBAAgB,WAAW,CAAC,UAAU,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,GAAG,MAAM,CAUxG;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,GAAG,YAAY,CAmBpH;AAYD;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,mBAAmB,CAAgC;IAC3D,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,iBAAiB,CAAiC;IAC1D,OAAO,CAAC,cAAc,CAAqB;IAE3C,yGAAyG;IACzG,IAAI,cAAc,IAAI,SAAS,MAAM,EAAE,GAAG,SAAS,CAElD;IAED,kDAAkD;IAClD,IAAI,SAAS,IAAI,MAAM,GAAG,SAAS,CAElC;IAED,qCAAqC;IACrC,IAAI,SAAS,IAAI,MAAM,GAAG,SAAS,CAElC;IAED,uEAAuE;IACvE,sBAAsB,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI;IAIlE;;;OAGG;IACH,YAAY,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAKzE,yDAAyD;IACzD,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAI9C,iGAAiG;IACjG,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,OAAO,EAAE,GAAG,SAAS;IAI5E,mGAAmG;IACnG,iBAAiB,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAKrF,4EAA4E;IAC5E,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,YAAY;IAW/C,gCAAgC;IAChC,MAAM,IAAI,UAAU;CASrB"}
@@ -1,42 +1,50 @@
1
1
  import { Account } from '../core/account.js';
2
2
  import { hostOf } from '../core/config.js';
3
+ import { FinTsFeedback } from '../core/feedback.js';
3
4
  import { FormatError } from '../util/errors.js';
4
- import { isJsonObject, isString, readObject, readOptionalInt, readOptionalList, readOptionalString, } from '../util/json.js';
5
+ import { isJsonObject, isString, readObject, readOptionalInt, readOptionalObject, readOptionalList, readOptionalString, } from '../util/json.js';
5
6
  /** Layout of the saved session; a state of another layout is ignored. */
6
7
  const stateFormat = 1;
7
8
  /** The protocol version the state is for, named as the Dart package names it, so that both read each other's states. */
8
9
  const protocolVersion = 'v300';
9
- /** The session and the protocol's parameter data as one JSON string, which `restoreSession` reads. */
10
- export function saveSession(protocol, session) {
10
+ /** The session, the parameter data and the guard's refusal as JSON, which `restoreSession` reads. */
11
+ export function saveSession(parameters, guard, session) {
11
12
  return JSON.stringify({
12
13
  format: stateFormat,
13
14
  version: protocolVersion,
14
- owner: ownerOf(protocol.config),
15
+ owner: ownerOf(parameters.config),
15
16
  session: session.toJson(),
16
- protocol: protocol.saveState(),
17
+ // Under the key the Dart package reads as well.
18
+ protocol: parameters.saveState(),
19
+ loginGuard: guardStateToJson(guard.saveState()),
17
20
  });
18
21
  }
19
22
  /**
20
- * The session saved in `json`, and the protocol's parameter data restored from it.
23
+ * The session saved in `json`, and the parameter data and the guard's refused login restored from it.
21
24
  *
22
25
  * A missing or damaged state, or one saved for another user, bank, server or protocol version, gives a new session,
23
- * which only costs a new synchronization.
26
+ * which only costs a new synchronization. The refused login belongs to the user at the bank, so it comes first: it holds
27
+ * for another server or protocol version as well, and where the rest is damaged; a state saved by the Dart package or
28
+ * an earlier version has none.
24
29
  */
25
- export function restoreSession(json, protocol) {
30
+ export function restoreSession(json, parameters, guard) {
26
31
  if (json === undefined)
27
32
  return new SessionState();
28
33
  try {
29
34
  const saved = JSON.parse(json);
30
- if (!isJsonObject(saved) || saved.format !== stateFormat || saved.version !== protocolVersion) {
35
+ if (!isJsonObject(saved) || saved.format !== stateFormat)
31
36
  return new SessionState();
32
- }
33
- const owner = readOptionalList(saved, 'owner', isString);
34
- const expected = ownerOf(protocol.config);
35
- if (owner?.length !== expected.length || owner.some((value, i) => value !== expected[i])) {
37
+ const [server, ...user] = readOptionalList(saved, 'owner', isString) ?? [];
38
+ const expected = userOf(parameters.config);
39
+ if (user.length !== expected.length || user.some((value, i) => value !== expected[i]))
40
+ return new SessionState();
41
+ const loginGuard = readOptionalObject(saved, 'loginGuard');
42
+ if (loginGuard !== undefined)
43
+ guard.restoreState(guardStateFromJson(loginGuard));
44
+ if (server !== hostOf(parameters.config.url) || saved.version !== protocolVersion)
36
45
  return new SessionState();
37
- }
38
46
  const session = SessionState.fromJson(readObject(saved, 'session'));
39
- protocol.restoreState(readObject(saved, 'protocol'));
47
+ parameters.restoreState(readObject(saved, 'protocol'));
40
48
  return session;
41
49
  }
42
50
  catch (error) {
@@ -46,9 +54,13 @@ export function restoreSession(json, protocol) {
46
54
  throw error;
47
55
  }
48
56
  }
49
- /** Whose data a state holds, so that the state of another user or bank is never used. */
57
+ /** Whose data a state holds, so that the state of another user or bank is never used: the server, then `userOf`. */
50
58
  function ownerOf(config) {
51
- return [hostOf(config.url), config.bankCode, config.userId, config.customerId];
59
+ return [hostOf(config.url), ...userOf(config)];
60
+ }
61
+ /** The user at the bank, whom a refused login belongs to. */
62
+ function userOf(config) {
63
+ return [config.bankCode, config.userId, config.customerId];
52
64
  }
53
65
  /**
54
66
  * The session data saved between app starts: the allowed TAN methods, the TAN method and medium in use, and the SEPA
@@ -144,4 +156,27 @@ function accountFromJson(json) {
144
156
  bankCode,
145
157
  });
146
158
  }
159
+ function guardStateToJson(state) {
160
+ return { refusal: state.refusal?.map(feedbackToJson) ?? null, unreadLogins: state.unreadLogins };
161
+ }
162
+ function guardStateFromJson(json) {
163
+ return {
164
+ refusal: readOptionalList(json, 'refusal', isJsonObject)?.map(feedbackFromJson),
165
+ unreadLogins: readOptionalInt(json, 'unreadLogins') ?? 0,
166
+ };
167
+ }
168
+ function feedbackToJson(f) {
169
+ return { code: f.code, reference: f.reference ?? null, text: f.text, parameters: [...f.parameters] };
170
+ }
171
+ function feedbackFromJson(json) {
172
+ const code = readOptionalString(json, 'code');
173
+ if (code === undefined)
174
+ throw new FormatError('Saved state: return code without code');
175
+ return new FinTsFeedback({
176
+ code,
177
+ reference: readOptionalString(json, 'reference'),
178
+ text: readOptionalString(json, 'text') ?? '',
179
+ parameters: readOptionalList(json, 'parameters', isString) ?? [],
180
+ });
181
+ }
147
182
  //# sourceMappingURL=session-state.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-state.js","sourceRoot":"","sources":["../../src/session/session-state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-state.js","sourceRoot":"","sources":["../../src/session/session-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import type { FinTs3Dialog } from '../v3/dialog.js';
2
+ import { IncomingMessage3 } from '../v3/message.js';
3
+ import type { ParameterStore } from '../v3/parameter-store.js';
4
+ import type { SegmentSpec } from '../v3/syntax.js';
5
+ import type { LoginGuard } from './login-guard.js';
6
+ import type { SessionState } from './session-state.js';
7
+ import type { UserPrompts } from './user-prompts.js';
8
+ /** The parts of the session that every `SignedDialog` reports to. */
9
+ export interface SessionParts {
10
+ readonly parameters: ParameterStore;
11
+ readonly state: SessionState;
12
+ readonly prompts: UserPrompts;
13
+ readonly guard: LoginGuard;
14
+ }
15
+ /**
16
+ * A dialog signed with the PIN, which settles each answer before it hands it out: it keeps the parameter data of the
17
+ * dialog's opening, passes the notices on, has the `LoginGuard` judge the answer and throws its errors, and completes
18
+ * the approval the bank asks for. The session sends every message signed with the PIN through it, so that the guard
19
+ * judges every answer, that to the dialog's end included.
20
+ */
21
+ export declare class SignedDialog {
22
+ private readonly dialog;
23
+ private readonly session;
24
+ constructor(dialog: FinTs3Dialog, session: SessionParts);
25
+ /** Whether the bank knows this dialog and it has not ended. */
26
+ get isActive(): boolean;
27
+ /** Logs in, which opens the dialog; with `synchronize` the bank also assigns a customer system ID. */
28
+ login(synchronize?: boolean): Promise<IncomingMessage3>;
29
+ /**
30
+ * Logs in, asking strong authentication for `order`, then sends `order` in a message of its own, as for listing the
31
+ * TAN media while no medium is chosen yet (`FinTs3Dialog.startWith`); returns both answers.
32
+ */
33
+ loginWith(order: SegmentSpec): Promise<IncomingMessage3[]>;
34
+ /** Sends `order`, the first page of a query, and completes the approval the bank asks for. */
35
+ send(order: SegmentSpec): Promise<IncomingMessage3>;
36
+ /**
37
+ * Sends `order` for a further page of a query (Formals B.6.3), whose answer must not ask for an approval: the client
38
+ * completes that of the first page only, so that a bank that asks anew for every page cannot prompt the user once per
39
+ * page. Throws `FinTsProtocolError` if it asks for one.
40
+ */
41
+ sendFurtherPage(order: SegmentSpec): Promise<IncomingMessage3>;
42
+ /**
43
+ * Ends the dialog at the bank; does nothing if it is not active. Of the answer only a rejected PIN counts, which the
44
+ * guard judges: the dialog is over either way.
45
+ */
46
+ end(): Promise<void>;
47
+ /**
48
+ * Receives `response`, the answer to a request of `kind`: keeps its parameter data where it answers the `opening` of
49
+ * the dialog, the login or its approval, even alongside errors, since the remedy for a refused login may need them;
50
+ * passes its notices on; and has the guard judge it, then throws its errors, as the refusal of the login where they
51
+ * amount to one.
52
+ */
53
+ private receive;
54
+ /**
55
+ * Where `response` answers a login, a request of `kind` other than `order`, or its approval with new login data: ends
56
+ * the dialog, stops the client from logging in with the old ones, and fails the call with
57
+ * `FinTsLoginDataChangedError` (Rückmeldungscodes C.6). It runs before any approval, which would cost the user a TAN
58
+ * for a session that ends anyway. New login data next to an error are the login's refusal already
59
+ * (`loginRefusalFor`).
60
+ */
61
+ private retireOldLoginData;
62
+ /**
63
+ * Receives `response`, the answer to a request of `kind`, then completes the approval it asks for; returns it joined
64
+ * with the response that completes the approval.
65
+ *
66
+ * Throws `FinTsProtocolError` if that response asks for an approval once more: the bank has not executed the message
67
+ * then either, and read as done it would report an empty result.
68
+ */
69
+ private settle;
70
+ /** Passes on the notices in `response`: the TAN methods the user may use (3920), the bank's messages and warnings. */
71
+ private readNotices;
72
+ /** Asks the user for the TAN `approval` takes and sends it; `opening` tells whether it approves the login. */
73
+ private enterTan;
74
+ /** Waits for the user to approve in the banking app; `opening` tells whether the approval is that of the login. */
75
+ private awaitAppApproval;
76
+ }
77
+ //# sourceMappingURL=signed-dialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signed-dialog.d.ts","sourceRoot":"","sources":["../../src/session/signed-dialog.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAY,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,kBAAkB,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,qEAAqE;AACrE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;CAC5B;AAED;;;;;GAKG;AACH,qBAAa,YAAY;IAErB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBADP,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,YAAY;IAGxC,+DAA+D;IAC/D,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,sGAAsG;IAChG,KAAK,CAAC,WAAW,UAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAI3D;;;OAGG;IACG,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAMhE,8FAA8F;IACxF,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAIzD;;;;OAIG;IACG,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC;IASpE;;;OAGG;IACG,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAO1B;;;;;OAKG;IACH,OAAO,CAAC,OAAO;IAUf;;;;;;OAMG;YACW,kBAAkB;IAOhC;;;;;;OAMG;YACW,MAAM;IAgBpB,sHAAsH;IACtH,OAAO,CAAC,WAAW;IAOnB,8GAA8G;YAChG,QAAQ;IAatB,mHAAmH;IACnH,OAAO,CAAC,gBAAgB;CAUzB"}