From d1a97345877fc3e6a409492bc20dd40f60927af8 Mon Sep 17 00:00:00 2001 From: NejcZdovc Date: Wed, 17 Jan 2018 07:56:51 +0100 Subject: [PATCH] Fixes recovery seed when you recover wallet with funds Resolves #12672 Auditors: Test Plan: --- app/browser/api/ledger.js | 28 +++++++++++-- test/unit/app/browser/api/ledgerTest.js | 54 +++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 3 deletions(-) diff --git a/app/browser/api/ledger.js b/app/browser/api/ledger.js index 024acd9da2f..73423999eb3 100644 --- a/app/browser/api/ledger.js +++ b/app/browser/api/ledger.js @@ -1048,8 +1048,7 @@ const onWalletRecovery = (state, error, result) => { // convert buffer to Uint8Array let seed = result && result.getIn(['properties', 'wallet', 'keyinfo', 'seed']) if (seed) { - seed = new Uint8Array(Object.values(seed)) - result = result.setIn(['properties', 'wallet', 'keyinfo', 'seed'], seed) + result = result.setIn(['properties', 'wallet', 'keyinfo', 'seed'], uintKeySeed(seed)) } // remove old QR codes and addresses @@ -1679,12 +1678,29 @@ const onBraveryProperties = (state, error, result) => { } if (result) { + if (result.properties && result.properties.wallet && result.properties.wallet.keyinfo) { + result.properties.wallet.keyinfo.seed = uintKeySeed(result.properties.wallet.keyinfo.seed) + } muonWriter(statePath, result) } return state } +const uintKeySeed = (currentSeed) => { + if (currentSeed == null) { + return currentSeed + } + + try { + currentSeed.toJSON() + const seed = new Uint8Array(Object.values(currentSeed)) + currentSeed = seed + } catch (err) { } + + return currentSeed +} + const getBalance = (state) => { if (!client) return @@ -1727,6 +1743,11 @@ const onCallback = (state, result, delayTime) => { state = ledgerState.setInfoProp(state, 'walletQR', Immutable.Map()) } + const seed = result.getIn(['properties', 'wallet', 'keyinfo', 'seed']) + if (seed) { + result = result.setIn(['properties', 'wallet', 'keyinfo', 'seed'], uintKeySeed(seed)) + } + const regularResults = result.toJS() if (client && result.getIn(['properties', 'wallet'])) { @@ -2657,7 +2678,8 @@ const getMethods = () => { onWalletRecovery, getStateInfo, lockInContributionAmount, - callback + callback, + uintKeySeed } } diff --git a/test/unit/app/browser/api/ledgerTest.js b/test/unit/app/browser/api/ledgerTest.js index bf742912d66..4ddede1b971 100644 --- a/test/unit/app/browser/api/ledgerTest.js +++ b/test/unit/app/browser/api/ledgerTest.js @@ -1878,4 +1878,58 @@ describe('ledger api unit tests', function () { }) }) }) + + describe('uintKeySeed', function () { + const buff = Buffer.from([ + 32, + 87, + 30, + 26, + 223, + 56, + 224, + 31, + 213, + 136, + 248, + 95, + 136, + 56, + 250, + 78, + 179, + 121, + 255, + 162, + 195, + 39, + 143, + 136, + 18, + 140, + 49, + 216, + 221, + 154, + 78, + 173 + ]) + + const uint = new Uint8Array(Object.values(buff)) + + it('null case', function () { + const result = ledgerApi.uintKeySeed() + assert.equal(result, undefined) + }) + + it('seed is in the correct format', function () { + const result = ledgerApi.uintKeySeed(uint) + assert.deepStrictEqual(result, uint) + }) + + it('seed needs to be converted', function () { + const result = ledgerApi.uintKeySeed(buff) + assert.deepStrictEqual(result, uint) + }) + }) })