aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAkshit Kr Nagpal <nagpalkrakshit@gmail.com>2019-06-29 06:51:51 +0800
committerFrankie <frankie.diamond@gmail.com>2019-06-29 06:51:51 +0800
commitd16d6f483c28c07aedcaa0bc69228109fa5fbade (patch)
tree007c42ba91000b13dcf590c0cca564e4ea0fbbd4
parent90eb5c44406aaf0be68a1bb366cf98023a2214b2 (diff)
downloadtangerine-wallet-browser-d16d6f483c28c07aedcaa0bc69228109fa5fbade.tar.gz
tangerine-wallet-browser-d16d6f483c28c07aedcaa0bc69228109fa5fbade.tar.zst
tangerine-wallet-browser-d16d6f483c28c07aedcaa0bc69228109fa5fbade.zip
Validate txParams in TransactionStateManager.addTx (#6713)
* Normalize and Validate txParams in TransactionStateManager.addTx too * Added Tests * Updated normalizeAndValidateParams to return the new txParams
-rw-r--r--app/scripts/controllers/transactions/tx-state-manager.js26
-rw-r--r--test/unit/app/controllers/transactions/tx-state-manager-test.js62
2 files changed, 82 insertions, 6 deletions
diff --git a/app/scripts/controllers/transactions/tx-state-manager.js b/app/scripts/controllers/transactions/tx-state-manager.js
index 9504f43a5..2aa28c270 100644
--- a/app/scripts/controllers/transactions/tx-state-manager.js
+++ b/app/scripts/controllers/transactions/tx-state-manager.js
@@ -125,6 +125,11 @@ class TransactionStateManager extends EventEmitter {
@returns {object} the txMeta
*/
addTx (txMeta) {
+ // normalize and validate txParams if present
+ if (txMeta.txParams) {
+ txMeta.txParams = this.normalizeAndValidateTxParams(txMeta.txParams)
+ }
+
this.once(`${txMeta.id}:signed`, function () {
this.removeAllListeners(`${txMeta.id}:rejected`)
})
@@ -174,13 +179,9 @@ class TransactionStateManager extends EventEmitter {
@param [note] {string} - a note about the update for history
*/
updateTx (txMeta, note) {
- // validate txParams
+ // normalize and validate txParams if present
if (txMeta.txParams) {
- if (typeof txMeta.txParams.data === 'undefined') {
- delete txMeta.txParams.data
- }
- txMeta.txParams = normalizeTxParams(txMeta.txParams, false)
- this.validateTxParams(txMeta.txParams)
+ txMeta.txParams = this.normalizeAndValidateTxParams(txMeta.txParams)
}
// create txMeta snapshot for history
@@ -213,6 +214,19 @@ class TransactionStateManager extends EventEmitter {
}
/**
+ * normalize and validate txParams members
+ * @param txParams {object} - txParams
+ */
+ normalizeAndValidateTxParams (txParams) {
+ if (typeof txParams.data === 'undefined') {
+ delete txParams.data
+ }
+ txParams = normalizeTxParams(txParams, false)
+ this.validateTxParams(txParams)
+ return txParams
+ }
+
+ /**
validates txParams members by type
@param txParams {object} - txParams to validate
*/
diff --git a/test/unit/app/controllers/transactions/tx-state-manager-test.js b/test/unit/app/controllers/transactions/tx-state-manager-test.js
index 4ccade2aa..72dbbc4a1 100644
--- a/test/unit/app/controllers/transactions/tx-state-manager-test.js
+++ b/test/unit/app/controllers/transactions/tx-state-manager-test.js
@@ -93,6 +93,37 @@ describe('TransactionStateManager', function () {
assert.equal(result[0].id, 1)
})
+ it('throws error and does not add tx if txParams are invalid', function () {
+ const validTxParams = {
+ from: '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc',
+ to: '0x0039f22efb07a647557c7c5d17854cfd6d489ef3',
+ nonce: '0x3',
+ gas: '0x77359400',
+ gasPrice: '0x77359400',
+ value: '0x0',
+ data: '0x0',
+ }
+ const invalidValues = [1, true, {}, Symbol('1')]
+
+ for (const key in validTxParams) {
+ for (const value of invalidValues) {
+ const tx = {
+ id: 1,
+ status: 'unapproved',
+ metamaskNetworkId: currentNetworkId,
+ txParams: {
+ ...validTxParams,
+ [key]: value,
+ },
+ }
+ assert.throws(txStateManager.addTx.bind(txStateManager, tx), 'addTx should throw error')
+ const result = txStateManager.getTxList()
+ assert.ok(Array.isArray(result), 'txList should be an array')
+ assert.equal(result.length, 0, 'txList should be empty')
+ }
+ }
+ })
+
it('does not override txs from other networks', function () {
const tx = { id: 1, status: 'confirmed', metamaskNetworkId: currentNetworkId, txParams: {} }
const tx2 = { id: 2, status: 'confirmed', metamaskNetworkId: otherNetworkId, txParams: {} }
@@ -153,6 +184,37 @@ describe('TransactionStateManager', function () {
assert.equal(result.hash, 'foo')
})
+ it('throws error and does not update tx if txParams are invalid', function () {
+ const validTxParams = {
+ from: '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc',
+ to: '0x0039f22efb07a647557c7c5d17854cfd6d489ef3',
+ nonce: '0x3',
+ gas: '0x77359400',
+ gasPrice: '0x77359400',
+ value: '0x0',
+ data: '0x0',
+ }
+ const invalidValues = [1, true, {}, Symbol('1')]
+
+ txStateManager.addTx({ id: 1, status: 'unapproved', metamaskNetworkId: currentNetworkId, txParams: validTxParams })
+
+ for (const key in validTxParams) {
+ for (const value of invalidValues) {
+ const originalTx = txStateManager.getTx(1)
+ const newTx = {
+ ...originalTx,
+ txParams: {
+ ...originalTx.txParams,
+ [key]: value,
+ },
+ }
+ assert.throws(txStateManager.updateTx.bind(txStateManager, newTx), 'updateTx should throw an error')
+ const result = txStateManager.getTx(1)
+ assert.deepEqual(result, originalTx, 'tx should not be updated')
+ }
+ }
+ })
+
it('updates gas price and adds history items', function () {
const originalGasPrice = '0x01'
const desiredGasPrice = '0x02'