aboutsummaryrefslogtreecommitdiff
path: root/packages/taler-util/src/http-client/bank-core.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/taler-util/src/http-client/bank-core.ts')
-rw-r--r--packages/taler-util/src/http-client/bank-core.ts66
1 files changed, 59 insertions, 7 deletions
diff --git a/packages/taler-util/src/http-client/bank-core.ts b/packages/taler-util/src/http-client/bank-core.ts
index 51d6d7c96..b7e0292bd 100644
--- a/packages/taler-util/src/http-client/bank-core.ts
+++ b/packages/taler-util/src/http-client/bank-core.ts
@@ -18,7 +18,9 @@ import {
HttpStatusCode,
LibtoolVersion,
TalerErrorCode,
- codecForTalerErrorDetail
+ codecForChallenge,
+ codecForTalerErrorDetail,
+ codecForTanTransmission
} from "@gnu-taler/taler-util";
import {
HttpRequestLibrary,
@@ -123,6 +125,7 @@ export class TalerCoreBankHttpClient {
},
});
switch (resp.status) {
+ case HttpStatusCode.Accepted: return opSuccess(resp, codecForChallenge())
case HttpStatusCode.NoContent: return opEmptySuccess()
case HttpStatusCode.NotFound: return opKnownFailure("not-found", resp);
case HttpStatusCode.Unauthorized: return opKnownFailure("unauthorized", resp);
@@ -153,6 +156,7 @@ export class TalerCoreBankHttpClient {
},
});
switch (resp.status) {
+ case HttpStatusCode.Accepted: return opSuccess(resp, codecForChallenge())
case HttpStatusCode.NoContent: return opEmptySuccess()
case HttpStatusCode.NotFound: return opKnownFailure("not-found", resp);
case HttpStatusCode.Unauthorized: return opKnownFailure("unauthorized", resp);
@@ -163,7 +167,7 @@ export class TalerCoreBankHttpClient {
case TalerErrorCode.BANK_NON_ADMIN_PATCH_LEGAL_NAME: return opKnownFailure("user-cant-change-name", resp);
case TalerErrorCode.BANK_NON_ADMIN_PATCH_DEBT_LIMIT: return opKnownFailure("user-cant-change-debt", resp);
case TalerErrorCode.BANK_NON_ADMIN_PATCH_CASHOUT: return opKnownFailure("user-cant-change-cashout", resp);
- case TalerErrorCode.BANK_NON_ADMIN_PATCH_CONTACT: return opKnownFailure("user-cant-change-contact", resp);
+ case TalerErrorCode.BANK_MISSING_TAN_INFO: return opKnownFailure("missing-contact-data", resp);
default: return opUnknownFailure(resp, body)
}
}
@@ -185,6 +189,7 @@ export class TalerCoreBankHttpClient {
},
});
switch (resp.status) {
+ case HttpStatusCode.Accepted: return opSuccess(resp, codecForChallenge())
case HttpStatusCode.NoContent: return opEmptySuccess()
case HttpStatusCode.NotFound: return opKnownFailure("not-found", resp);
case HttpStatusCode.Unauthorized: return opKnownFailure("unauthorized", resp);
@@ -326,6 +331,7 @@ export class TalerCoreBankHttpClient {
body,
});
switch (resp.status) {
+ case HttpStatusCode.Accepted: return opSuccess(resp, codecForChallenge())
case HttpStatusCode.Ok: return opSuccess(resp, codecForCreateTransactionResponse())
case HttpStatusCode.BadRequest: return opKnownFailure("invalid-input", resp);
case HttpStatusCode.Unauthorized: return opKnownFailure("unauthorized", resp);
@@ -405,6 +411,7 @@ export class TalerCoreBankHttpClient {
},
});
switch (resp.status) {
+ case HttpStatusCode.Accepted: return opSuccess(resp, codecForChallenge())
case HttpStatusCode.NoContent: return opEmptySuccess()
//FIXME: missing in docs
case HttpStatusCode.BadRequest: return opKnownFailure("invalid-id", resp)
@@ -466,6 +473,7 @@ export class TalerCoreBankHttpClient {
body,
});
switch (resp.status) {
+ case HttpStatusCode.Accepted: return opSuccess(resp, codecForChallenge())
case HttpStatusCode.Ok: return opSuccess(resp, codecForCashoutPending())
case HttpStatusCode.NotFound: return opKnownFailure("account-not-found", resp)
case HttpStatusCode.Conflict: {
@@ -474,20 +482,19 @@ export class TalerCoreBankHttpClient {
switch (details.code) {
case TalerErrorCode.BANK_TRANSFER_REQUEST_UID_REUSED: return opKnownFailure("request-already-used", resp);
case TalerErrorCode.BANK_BAD_CONVERSION: return opKnownFailure("incorrect-exchange-rate", resp);
- case TalerErrorCode.BANK_MISSING_TAN_INFO: return opKnownFailure("no-contact-info", resp);
case TalerErrorCode.BANK_UNALLOWED_DEBIT: return opKnownFailure("no-enough-balance", resp);
+ case TalerErrorCode.BANK_CONFIRM_INCOMPLETE: return opKnownFailure("no-cashout-uri", resp);
default: return opUnknownFailure(resp, body)
}
}
case HttpStatusCode.NotImplemented: return opKnownFailure("cashout-not-supported", resp);
- case HttpStatusCode.BadGateway: return opKnownFailure("tan-failed", resp);
default: return opUnknownFailure(resp, await resp.text())
}
}
/**
* https://docs.taler.net/core/api-corebank.html#post--accounts-$USERNAME-cashouts-$CASHOUT_ID-abort
- *
+ * @deprecated since 4
*/
async abortCashoutById(auth: UserAndToken, cid: number) {
const url = new URL(`accounts/${auth.username}/cashouts/${cid}/abort`, this.baseUrl);
@@ -508,7 +515,7 @@ export class TalerCoreBankHttpClient {
/**
* https://docs.taler.net/core/api-corebank.html#post--accounts-$USERNAME-cashouts-$CASHOUT_ID-confirm
- *
+ * @deprecated since 4
*/
async confirmCashoutById(auth: UserAndToken, cid: number, body: TalerCorebankApi.CashoutConfirmRequest) {
const url = new URL(`accounts/${auth.username}/cashouts/${cid}/confirm`, this.baseUrl);
@@ -522,7 +529,6 @@ export class TalerCoreBankHttpClient {
switch (resp.status) {
case HttpStatusCode.NoContent: return opEmptySuccess()
case HttpStatusCode.NotFound: return opKnownFailure("not-found", resp);
- // case HttpStatusCode.Forbidden: return opKnownFailure("wrong-tan-or-credential", resp);
case HttpStatusCode.Conflict: {
const body = await resp.json()
const details = codecForTalerErrorDetail().decode(body)
@@ -638,6 +644,52 @@ export class TalerCoreBankHttpClient {
}
//
+ // 2FA
+ //
+ async sendChallenge(auth: UserAndToken, cid: string) {
+ const url = new URL(`accounts/${auth.username}/challenge/${cid}`, this.baseUrl);
+ const resp = await this.httpLib.fetch(url.href, {
+ method: "POST",
+ headers: {
+ Authorization: makeBearerTokenAuthHeader(auth.token)
+ },
+ });
+ switch (resp.status) {
+ case HttpStatusCode.Ok: return opSuccess(resp, codecForTanTransmission())
+ case HttpStatusCode.Unauthorized: return opKnownFailure("unauthorized", resp);
+ case HttpStatusCode.NotFound: return opKnownFailure("invalid-challenge", resp);
+ case HttpStatusCode.BadGateway: {
+ const body = await resp.json()
+ const details = codecForTalerErrorDetail().decode(body)
+ switch (details.code) {
+ case TalerErrorCode.BANK_TAN_CHANNEL_SCRIPT_FAILED: return opKnownFailure("tan-failed", resp);
+ default: return opUnknownFailure(resp, body)
+ }
+ }
+ default: return opUnknownFailure(resp, await resp.text())
+ }
+ }
+
+ async confirmChallenge(auth: UserAndToken, cid: string) {
+ const url = new URL(`accounts/${auth.username}/challenge/${cid}/confirm`, this.baseUrl);
+ const resp = await this.httpLib.fetch(url.href, {
+ method: "POST",
+ headers: {
+ Authorization: makeBearerTokenAuthHeader(auth.token)
+ },
+ });
+ switch (resp.status) {
+ case HttpStatusCode.Ok: return opEmptySuccess()
+ case HttpStatusCode.Unauthorized: return opKnownFailure("unauthorized", resp);
+ case HttpStatusCode.NotFound: return opKnownFailure("invalid-challenge", resp);
+ case HttpStatusCode.Conflict: return opKnownFailure("wrong-code", resp);
+ case HttpStatusCode.TooManyRequests: return opKnownFailure("too-many-errors", resp);
+ default: return opUnknownFailure(resp, await resp.text())
+ }
+ }
+
+
+ //
// Others API
//