summaryrefslogtreecommitdiff
path: root/packages/taler-wallet-core/src/operations/backup/export.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/taler-wallet-core/src/operations/backup/export.ts')
-rw-r--r--packages/taler-wallet-core/src/operations/backup/export.ts72
1 files changed, 48 insertions, 24 deletions
diff --git a/packages/taler-wallet-core/src/operations/backup/export.ts b/packages/taler-wallet-core/src/operations/backup/export.ts
index ab2262653..eae7995ca 100644
--- a/packages/taler-wallet-core/src/operations/backup/export.ts
+++ b/packages/taler-wallet-core/src/operations/backup/export.ts
@@ -24,44 +24,54 @@
/**
* Imports.
*/
-import { hash } from "../../crypto/primitives/nacl-fast.js";
import {
- WalletBackupContentV1,
- BackupExchange,
- BackupCoin,
- BackupDenomination,
- BackupReserve,
- BackupPurchase,
- BackupProposal,
- BackupRefreshGroup,
+ Amounts,
BackupBackupProvider,
- BackupTip,
- BackupRecoupGroup,
- BackupWithdrawalGroup,
BackupBackupProviderTerms,
+ BackupCoin,
BackupCoinSource,
BackupCoinSourceType,
+ BackupDenomination,
+ BackupExchange,
+ BackupExchangeDetails,
BackupExchangeWireFee,
- BackupRefundItem,
- BackupRefundState,
+ BackupProposal,
BackupProposalStatus,
+ BackupPurchase,
+ BackupRecoupGroup,
+ BackupRefreshGroup,
BackupRefreshOldCoin,
BackupRefreshSession,
- BackupExchangeDetails,
+ BackupRefundItem,
+ BackupRefundState,
+ BackupReserve,
+ BackupTip,
+ BackupWithdrawalGroup,
+ canonicalizeBaseUrl,
+ canonicalJson,
+ getTimestampNow,
+ Logger,
+ timestampToIsoString,
+ WalletBackupContentV1,
} from "@gnu-taler/taler-util";
import { InternalWalletState } from "../../common.js";
-import { provideBackupState, getWalletBackupState } from "./state.js";
-import { Amounts, getTimestampNow } from "@gnu-taler/taler-util";
+import { hash } from "../../crypto/primitives/nacl-fast.js";
import {
+ encodeCrock,
+ getRandomBytes,
+ stringToBytes,
+} from "../../crypto/talerCrypto.js";
+import {
+ AbortStatus,
CoinSourceType,
CoinStatus,
- RefundState,
- AbortStatus,
ProposalStatus,
+ RefundState,
WALLET_BACKUP_STATE_KEY,
} from "../../db.js";
-import { encodeCrock, stringToBytes, getRandomBytes } from "../../crypto/talerCrypto.js";
-import { canonicalizeBaseUrl, canonicalJson } from "@gnu-taler/taler-util";
+import { getWalletBackupState, provideBackupState } from "./state.js";
+
+const logger = new Logger("backup/export.ts");
export async function exportBackup(
ws: InternalWalletState,
@@ -444,8 +454,10 @@ export async function exportBackup(
});
});
+ const ts = getTimestampNow();
+
if (!bs.lastBackupTimestamp) {
- bs.lastBackupTimestamp = getTimestampNow();
+ bs.lastBackupTimestamp = ts;
}
const backupBlob: WalletBackupContentV1 = {
@@ -469,18 +481,30 @@ export async function exportBackup(
tombstones: [],
};
- // If the backup changed, we increment our clock.
+ // If the backup changed, we change our nonce and timestamp.
let h = encodeCrock(hash(stringToBytes(canonicalJson(backupBlob))));
- if (h != bs.lastBackupPlainHash) {
+ if (h !== bs.lastBackupPlainHash) {
+ logger.trace(
+ `plain backup hash changed (from ${bs.lastBackupPlainHash}to ${h})`,
+ );
+ bs.lastBackupTimestamp = ts;
+ backupBlob.timestamp = ts;
bs.lastBackupPlainHash = encodeCrock(
hash(stringToBytes(canonicalJson(backupBlob))),
);
bs.lastBackupNonce = encodeCrock(getRandomBytes(32));
+ logger.trace(
+ `setting timestamp to ${timestampToIsoString(ts)} and nonce to ${
+ bs.lastBackupNonce
+ }`,
+ );
await tx.config.put({
key: WALLET_BACKUP_STATE_KEY,
value: bs,
});
+ } else {
+ logger.trace("backup hash did not change");
}
return backupBlob;