From ec0fd99c236c0d64986b18c0b1858ed8fa9ee368 Mon Sep 17 00:00:00 2001 From: vzhovnitsky Date: Tue, 8 Oct 2024 17:05:06 +0200 Subject: [PATCH 1/2] v2.3.21 --- VERSION_CODE | 2 +- ios/wallet/Info.plist | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/VERSION_CODE b/VERSION_CODE index aebfaa171..58e77f351 100644 --- a/VERSION_CODE +++ b/VERSION_CODE @@ -1 +1 @@ -214 \ No newline at end of file +215 \ No newline at end of file diff --git a/ios/wallet/Info.plist b/ios/wallet/Info.plist index 85980167a..e2bb09309 100644 --- a/ios/wallet/Info.plist +++ b/ios/wallet/Info.plist @@ -19,7 +19,7 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 2.3.20 + 2.3.21 CFBundleSignature ???? CFBundleURLTypes @@ -41,7 +41,7 @@ CFBundleVersion - 214 + 215 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes diff --git a/package.json b/package.json index bbe3d2a23..45fe3f636 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wallet", - "version": "2.3.20", + "version": "2.3.21", "scripts": { "start": "expo start --dev-client", "android": "expo run:android", From 3c6dd064be95ab920de66cfb44d90dd174fc435c Mon Sep 17 00:00:00 2001 From: vzhovnitsky Date: Tue, 8 Oct 2024 17:06:42 +0200 Subject: [PATCH 2/2] fix: adding try-catch to detect unauth --- .../hooks/holders/useCardTransactions.ts | 24 +++++-- .../hooks/holders/useHoldersAccountStatus.ts | 24 +++++-- .../hooks/holders/useHoldersAccounts.ts | 66 +++++++++++-------- 3 files changed, 72 insertions(+), 42 deletions(-) diff --git a/app/engine/hooks/holders/useCardTransactions.ts b/app/engine/hooks/holders/useCardTransactions.ts index 185e4afc0..4793f17da 100644 --- a/app/engine/hooks/holders/useCardTransactions.ts +++ b/app/engine/hooks/holders/useCardTransactions.ts @@ -3,6 +3,7 @@ import { CardNotification, fetchCardsTransactions } from "../../api/holders/fetc import { Queries } from "../../queries"; import { deleteHoldersToken, useHoldersAccountStatus } from "./useHoldersAccountStatus"; import { HoldersUserState } from "../../api/holders/fetchUserState"; +import axios from "axios"; export function useCardTransactions(address: string, id: string) { let status = useHoldersAccountStatus(address).data; @@ -24,15 +25,24 @@ export function useCardTransactions(address: string, id: string) { }, queryFn: async (ctx) => { if (!!status && status.state !== HoldersUserState.NeedEnrollment) { - const cardRes = await fetchCardsTransactions(status.token, id, 40, ctx.pageParam?.lastCursor, 'desc'); + try { + const cardRes = await fetchCardsTransactions(status.token, id, 40, ctx.pageParam?.lastCursor, 'desc'); - if (!cardRes) { - deleteHoldersToken(address); - throw new Error('Unauthorized'); - } + if (!cardRes) { + deleteHoldersToken(address); + throw new Error('Unauthorized'); + } - if (!!cardRes) { - return cardRes; + if (!!cardRes) { + return cardRes; + } + } catch (error) { + if (axios.isAxiosError(error) && error.response?.status === 401) { + deleteHoldersToken(address); + throw new Error('Unauthorized'); + } else { + throw error; + } } } return null; diff --git a/app/engine/hooks/holders/useHoldersAccountStatus.ts b/app/engine/hooks/holders/useHoldersAccountStatus.ts index 1eb1381fd..3cf6a9f05 100644 --- a/app/engine/hooks/holders/useHoldersAccountStatus.ts +++ b/app/engine/hooks/holders/useHoldersAccountStatus.ts @@ -7,6 +7,7 @@ import { storage } from "../../../storage/storage"; import { HoldersUserState, userStateCodec, fetchUserState } from "../../api/holders/fetchUserState"; import { z } from 'zod'; import { removeProvisioningCredentials } from "../../holders/updateProvisioningCredentials"; +import axios from "axios"; const holdersAccountStatus = z.union([ z.object({ state: z.literal(HoldersUserState.NeedEnrollment) }), @@ -30,7 +31,7 @@ function migrateHoldersToken(addressString: string) { export function deleteHoldersToken(address: string) { // clean up provisioning credentials cache for this address - removeProvisioningCredentials(address); + removeProvisioningCredentials(address); storage.delete(`holders-jwt-${address}`); } @@ -66,14 +67,23 @@ export function useHoldersAccountStatus(address: string | Address) { return { state: HoldersUserState.NeedEnrollment } as HoldersAccountStatus; // This looks amazingly stupid } - const fetched = await fetchUserState(token, isTestnet); + try { + const fetched = await fetchUserState(token, isTestnet); - if (!fetched) { // unauthorized - deleteHoldersToken(addr); - return { state: HoldersUserState.NeedEnrollment } as HoldersAccountStatus; - } + if (!fetched) { // unauthorized + deleteHoldersToken(addr); + return { state: HoldersUserState.NeedEnrollment } as HoldersAccountStatus; + } - return { ...fetched, token } as HoldersAccountStatus; + return { ...fetched, token } as HoldersAccountStatus; + } catch (error) { + if (axios.isAxiosError(error) && error.response?.status === 401) { + deleteHoldersToken(addressString); + throw new Error('Unauthorized'); + } else { + throw error; + } + } }, refetchOnWindowFocus: true, refetchOnMount: true, diff --git a/app/engine/hooks/holders/useHoldersAccounts.ts b/app/engine/hooks/holders/useHoldersAccounts.ts index a1faf7548..423977325 100644 --- a/app/engine/hooks/holders/useHoldersAccounts.ts +++ b/app/engine/hooks/holders/useHoldersAccounts.ts @@ -7,10 +7,11 @@ import { GeneralHoldersAccount, PrePaidHoldersCard, fetchAccountsList, fetchAcco import { deleteHoldersToken, useHoldersAccountStatus } from "./useHoldersAccountStatus"; import { HoldersUserState } from "../../api/holders/fetchUserState"; import { updateProvisioningCredentials } from "../../holders/updateProvisioningCredentials"; +import axios from "axios"; export type HoldersAccounts = { - accounts: GeneralHoldersAccount[], - type: 'public' | 'private', + accounts: GeneralHoldersAccount[], + type: 'public' | 'private', prepaidCards?: PrePaidHoldersCard[] } @@ -38,38 +39,47 @@ export function useHoldersAccounts(address: string | Address) { refetchInterval: 35000, staleTime: 35000, queryFn: async () => { - let accounts; - let prepaidCards: PrePaidHoldersCard[] | undefined; - let type = 'public'; - - if (token) { - const res = await fetchAccountsList(token, isTestnet); + try { + let accounts; + let prepaidCards: PrePaidHoldersCard[] | undefined; + let type = 'public'; - if (!res) { - deleteHoldersToken(addressString); - throw new Error('Unauthorized'); - } + if (token) { + const res = await fetchAccountsList(token, isTestnet); - type = 'private'; - accounts = res?.accounts; - prepaidCards = res?.prepaidCards; + if (!res) { + deleteHoldersToken(addressString); + throw new Error('Unauthorized'); + } - // fetch apple pay credentials and update provisioning credentials cache - await updateProvisioningCredentials(addressString, isTestnet); - } else { - accounts = await fetchAccountsPublic(addressString, isTestnet); - type = 'public'; - } + type = 'private'; + accounts = res?.accounts; + prepaidCards = res?.prepaidCards; + + // fetch apple pay credentials and update provisioning credentials cache + await updateProvisioningCredentials(addressString, isTestnet); + } else { + accounts = await fetchAccountsPublic(addressString, isTestnet); + type = 'public'; + } - const filtered = accounts?.filter((a) => a.network === (isTestnet ? 'ton-testnet' : 'ton-mainnet')); + const filtered = accounts?.filter((a) => a.network === (isTestnet ? 'ton-testnet' : 'ton-mainnet')); - const sorted = filtered?.sort((a, b) => { - if (a.cards.length > b.cards.length) return -1; - if (a.cards.length < b.cards.length) return 1; - return 0; - }); + const sorted = filtered?.sort((a, b) => { + if (a.cards.length > b.cards.length) return -1; + if (a.cards.length < b.cards.length) return 1; + return 0; + }); - return { accounts: sorted, type, prepaidCards } as HoldersAccounts; + return { accounts: sorted, type, prepaidCards } as HoldersAccounts; + } catch (error) { + if (axios.isAxiosError(error) && error.response?.status === 401) { + deleteHoldersToken(addressString); + throw new Error('Unauthorized'); + } else { + throw error; + } + } } });