Skip to content

Commit

Permalink
Fixed ledger recovery seed
Browse files Browse the repository at this point in the history
Resolves brave#11383

Auditors:

Test Plan:
  • Loading branch information
NejcZdovc committed Dec 10, 2017
1 parent 3260f58 commit 225f693
Show file tree
Hide file tree
Showing 3 changed files with 118 additions and 1 deletion.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,9 @@ httpse.leveldb
# webstrom
.idea

# VSC
*.code-workspace

# sync bundle file should be built and copied from the brave/sync repo for now
app/extensions/brave/content/scripts/sync.js

Expand Down
10 changes: 9 additions & 1 deletion app/browser/api/ledger.js
Original file line number Diff line number Diff line change
Expand Up @@ -1008,6 +1008,13 @@ const onWalletRecovery = (state, error, result) => {
state = logError(state, error.toString(), 'recoveryWallet')
state = ledgerState.setRecoveryStatus(state, false)
} else {
// 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)
}

callback(error, result)

if (balanceTimeoutId) {
Expand Down Expand Up @@ -2559,7 +2566,8 @@ const getMethods = () => {
synopsisNormalizer,
checkVerifiedStatus,
roundtrip,
observeTransactions
observeTransactions,
onWalletRecovery
}
}

Expand Down
106 changes: 106 additions & 0 deletions test/unit/app/browser/api/ledgerTest.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ const ledgerMediaProviders = require('../../../../../app/common/constants/ledger
describe('ledger api unit tests', function () {
let ledgerApi
let ledgerNotificationsApi
let ledgerState
let isBusy = false
let ledgerClient
let ledgerPublisher
Expand Down Expand Up @@ -183,6 +184,7 @@ describe('ledger api unit tests', function () {
})

ledgerNotificationsApi = require('../../../../../app/browser/api/ledgerNotifications')
ledgerState = require('../../../../../app/common/state/ledgerState')

// once everything is stubbed, load the ledger
ledgerApi = require('../../../../../app/browser/api/ledger')
Expand Down Expand Up @@ -1440,4 +1442,108 @@ describe('ledger api unit tests', function () {
assert(ledgerSetTimeUntilReconcile.notCalled)
})
})

describe('onWalletRecovery', function () {
let setRecoveryStatusSpy, getBalanceSpy, fakeClock

const unit = 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 newSeed = new Uint8Array(Object.values(unit))
const param = Immutable.fromJS({
bootStamp: 1512939627058,
properties: {
wallet: {
altcurrency: 'BAT',
keyinfo: {
seed: unit
}
}
}
})

before(function () {
setRecoveryStatusSpy = sinon.spy(ledgerState, 'setRecoveryStatus')
getBalanceSpy = sinon.spy(ledgerApi, 'getBalance')
onLedgerCallbackSpy.reset()
fakeClock = sinon.useFakeTimers()
})

afterEach(function () {
setRecoveryStatusSpy.reset()
onLedgerCallbackSpy.reset()
getBalanceSpy.reset()
})

after(function () {
setRecoveryStatusSpy.restore()
onLedgerCallbackSpy.restore()
getBalanceSpy.restore()
fakeClock.restore()
})

it('on error', function () {
const result = ledgerApi.onWalletRecovery(defaultAppState, 'Wrong key')
const expectedSate = defaultAppState
.set('about', Immutable.fromJS({
preferences: {
recoverySucceeded: false,
updatedStamp: 0
}
}))
.setIn(['ledger', 'info', 'error'], Immutable.fromJS({
caller: 'recoveryWallet',
error: 'Wrong key'
}))
assert(setRecoveryStatusSpy.withArgs(sinon.match.any, false))
assert.deepEqual(result.toJS(), expectedSate.toJS())
})

it('success', function () {
const result = ledgerApi.onWalletRecovery(defaultAppState, null, param)
const expectedSate = defaultAppState
.set('about', Immutable.fromJS({
preferences: {
recoverySucceeded: true,
updatedStamp: 0
}
}))
assert(setRecoveryStatusSpy.withArgs(sinon.match.any, true))
assert.deepEqual(result.toJS(), expectedSate.toJS())
const callBack = onLedgerCallbackSpy.getCall(0).args[0]
const unit = callBack.getIn(['properties', 'wallet', 'keyinfo', 'seed'])
assert.deepStrictEqual(unit, newSeed)
})
})
})

0 comments on commit 225f693

Please sign in to comment.