diff --git a/CHANGELOG.md b/CHANGELOG.md index 0744430..f1cf0f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -529,4 +529,9 @@ ### 1.30.04 (2023-08-28) Nightly version : only for experimental use -* Updated the logs for label update & delete account \ No newline at end of file +* Updated the logs for label update & delete account +* Removed unused encryption key parameter in get accounts +* Added validation for pin parameter in export private key, restore keyring state & current pin parameter in change pin +* Added validation for encryption key in add account, sign message, delete account, get vault details & update label +* Sync the pin validation steps with other methods in import wallet +* Updated tests wrt changes in vault generation and parameter validations \ No newline at end of file diff --git a/src/lib/keyring.js b/src/lib/keyring.js index d98fc87..44a0167 100644 --- a/src/lib/keyring.js +++ b/src/lib/keyring.js @@ -114,7 +114,8 @@ class Keyring { return { response: true }; } - async getAccounts(encryptionKey) { + async getAccounts() { + const decryptedVault = this.decryptedVault; let chain = (Chains.evmChains.hasOwnProperty(this.chain) || this.chain === 'ethereum') ? 'eth' : this.chain; @@ -153,6 +154,12 @@ class Keyring { return { error: ERROR_MESSAGE.INCORRECT_PIN_TYPE }; } + const response = await this.validatePin(pin); + + if (response.response == false || response.error) { + return { error: ERROR_MESSAGE.INCORRECT_PIN }; + }; + const chain = (Chains.evmChains.hasOwnProperty(this.chain) || this.chain === 'ethereum') ? 'eth' : this.chain; const importedChain = (chain === 'eth') ? 'evmChains' : chain; @@ -166,12 +173,6 @@ class Keyring { return { error: ERROR_MESSAGE.ADDRESS_NOT_PRESENT }; } - const response = await this.validatePin(pin); - - if (response.response == false || response.error) { - return { error: ERROR_MESSAGE.INCORRECT_PIN }; - }; - if (isImportedAddress) { const privateKey = (chain === 'eth') ? this.decryptedVault.importedWallets.evmChains.data.find(element => element.address === address).privateKey : this.decryptedVault.importedWallets[chain].data.find(element => element.address === address).privateKey; @@ -206,7 +207,13 @@ class Keyring { return { error: ERROR_MESSAGE.INCORRECT_PIN }; }; - const acc = await this.getAccounts(encryptionKey); + const { error } = helper.validateEncryptionKey(this.vault, JSON.stringify(encryptionKey)); + + if (error) { + return { error } + } + + const acc = await this.getAccounts(); if (Chains.evmChains.hasOwnProperty(this.chain) || this.chain === 'ethereum') { const accounts = await this.keyringInstance.getAccounts(); @@ -272,6 +279,13 @@ class Keyring { if(res.response == false || res.error) { return { error: ERROR_MESSAGE.INCORRECT_PIN }; }; + + const err = helper.validateEncryptionKey(this.vault, JSON.stringify(encryptionKey)); + + if (err.error) { + return { error : err.error } + } + const { error, response } = await this.exportPrivateKey(address, pin); if (error) { @@ -303,7 +317,7 @@ class Keyring { } else{ - const accounts = await this.getAccounts(encryptionKey); + const accounts = await this.getAccounts(); if(accounts.response.filter(e => e.address === address).length < 1) { return { error: ERROR_MESSAGE.NONEXISTENT_KEYRING_ACCOUNT }; @@ -374,6 +388,12 @@ class Keyring { return { error: ERROR_MESSAGE.INCORRECT_PIN_TYPE }; } + const res = await this.validatePin(pin) + + if(res.response == false || res.error) { + return { error: ERROR_MESSAGE.INCORRECT_PIN }; + }; + const { decryptedVault, error } = helper.validateEncryptionKey(vault, JSON.stringify(encryptionKey)); if (error) { @@ -439,6 +459,12 @@ class Keyring { return { error: ERROR_MESSAGE.INCORRECT_PIN }; }; + const { error } = helper.validateEncryptionKey(this.vault, JSON.stringify(encryptionKey)); + + if (error) { + return { error } + } + let chain = (Chains.evmChains.hasOwnProperty(this.chain) || this.chain === 'ethereum') ? 'eth' : this.chain; const importedChain = (chain === 'eth') ? 'evmChains' : chain; @@ -481,16 +507,16 @@ class Keyring { const response = await this.validatePin(pin); + if(response.response == false || response.error) { + return { error: ERROR_MESSAGE.INCORRECT_PIN }; + }; + const { error } = helper.validateEncryptionKey(this.vault, JSON.stringify(encryptionKey)); if (error) { return { error } } - if(response.response == false || response.error) { - return { error: ERROR_MESSAGE.INCORRECT_PIN }; - }; - if (privateKey.startsWith('0x')) { privateKey = privateKey.slice(2) } @@ -502,7 +528,7 @@ class Keyring { let isDuplicateAddress; let numOfAcc; - accounts = await this.getAccounts(encryptionKey); + accounts = await this.getAccounts(); if (accounts.error) { numOfAcc = 0; @@ -627,6 +653,13 @@ class Keyring { } async getVaultDetails(encryptionKey) { + + const { error } = helper.validateEncryptionKey(this.vault, JSON.stringify(encryptionKey)); + + if (error) { + return { error } + } + const decryptedVault = this.decryptedVault; let accounts = { evm: { } }; @@ -736,6 +769,12 @@ class Keyring { async updateLabel(address, encryptionKey, newLabel, chainName) { + const { error } = helper.validateEncryptionKey(this.vault, JSON.stringify(encryptionKey)); + + if (error) { + return { error } + } + if (newLabel === null || newLabel === undefined) { return { error: ERROR_MESSAGE.INCORRECT_LABEL_TYPE }; } @@ -785,6 +824,7 @@ class Keyring { } async changePin(currentPin, newPin, encryptionKey) { + if (!Number.isInteger(currentPin) || currentPin < 0) { throw ERROR_MESSAGE.INCORRECT_PIN_TYPE } @@ -793,6 +833,18 @@ class Keyring { throw ERROR_MESSAGE.INCORRECT_PIN_TYPE } + const response = await this.validatePin(currentPin); + + if (response.response == false || response.error) { + return { error: ERROR_MESSAGE.INCORRECT_PIN }; + }; + + const err = helper.validateEncryptionKey(this.vault, JSON.stringify(encryptionKey)); + + if (err.error) { + return { error : err.error } + } + const { error, response: mnemonic }= await this.exportMnemonic(currentPin); if (error) { diff --git a/src/lib/test/keyring.test.js b/src/lib/test/keyring.test.js index efa1314..9e1b7d4 100644 --- a/src/lib/test/keyring.test.js +++ b/src/lib/test/keyring.test.js @@ -22,7 +22,7 @@ beforeAll(async() => { result = await vault.generateVault(bufView,pin,phrase) vaultAddress=result.response - await vault.getAccounts(bufView); + await vault.getAccounts(); }); describe('exportMnemonic' , ()=>{ @@ -115,14 +115,14 @@ describe('addAccount' , ()=>{ }) - test('addAccount/empty encryption key' , async()=>{ + test('addAccount/empty encryption key' , async()=>{ try{ let result = await vault.addAccount(null,pin) } catch(e){ - expect(e.message).toBe("Cannot read properties of undefined (reading 'length')") + expect(e.message).toBe("Incorrect Encryption Key or vault string") } - + }) test('addAccount/empty pin' , async()=>{ @@ -892,6 +892,18 @@ describe('changePin',()=>{ }) + test('changePin/wrong currentpin' , async()=>{ + try{ + let result = await vault.changePin(111111,pin,bufView) + + } + catch(e){ + expect(e).toBe('Wrong pin type, format or length') + } + + + }) + test('changePin/invalid currentpin' , async()=>{ try{ let result = await vault.changePin('aefe',pin,bufView) @@ -942,19 +954,23 @@ describe('changePin',()=>{ }) test('changePin/empty encryption key' , async()=>{ - - let result = await vault.changePin(pin,pin,null) - expect(result).toHaveProperty('response') - - - + try{ + let result = await vault.changePin(pin,pin,null) + } + catch(e){ + expect(e.message).toBe("Incorrect Encryption Key or vault string") + } + }) test('changePin/invalid encryption key' , async()=>{ - + try{ let result = await vault.changePin(pin,pin,'efefe') - expect(result).toHaveProperty('response') + } + catch(e){ + expect(e.message).toBe("Incorrect Encryption Key or vault string") + } @@ -996,17 +1012,23 @@ describe('deleteAccount',()=>{ }) test('deleteAccount/empty encryption key' , async()=>{ - + try{ let result = await vault.deleteAccount(null,accAddress,pin) - expect(result.error).toBe('This address is not present in the vault') + } + catch(e){ + expect(e.message).toBe("Incorrect Encryption Key or vault string") + } }) test('deleteAccount/invalid encryption key' , async()=>{ - + try{ let result = await vault.deleteAccount(null,accAddress,pin) - expect(result.error).toBe('This address is not present in the vault') + } + catch(e){ + expect(e.message).toBe("Incorrect Encryption Key or vault string") + } }) @@ -1066,22 +1088,11 @@ describe('deleteAccount',()=>{ describe('getAccounts',()=>{ test('getAccounts/valid' , async()=>{ await vault.restoreKeyringState(vaultAddress,pin,bufView) - let result = await vault.getAccounts(bufView) + let result = await vault.getAccounts() expect(result).toHaveProperty('response') }) - test('getAccounts/empty encryption key ' , async()=>{ - - let result = await vault.getAccounts(null) - expect(result.error).toBe('Incorrect Encryption Key or vault string') - - }) - test('getAccounts/invalid encryption key ' , async()=>{ - - let result = await vault.getAccounts("aefefe") - expect(result.error).toBe('Incorrect Encryption Key or vault string') - - }) + }) @@ -1142,7 +1153,7 @@ describe('signTransaction',()=>{ } catch(e){ - expect(e.message).toBe("No keyring found for the requested account.") + expect(e.message).toBe("Cannot read properties of undefined (reading 'toLowerCase')") } @@ -1173,7 +1184,7 @@ describe('signTransaction',()=>{ } catch(e){ - expect(e.message).toBe("No keyring found for the requested account.") + expect(e.message).toBe("Cannot read properties of undefined (reading 'toLowerCase')") } diff --git a/src/lib/test/vault.test.js b/src/lib/test/vault.test.js index 061ad16..9a89324 100644 --- a/src/lib/test/vault.test.js +++ b/src/lib/test/vault.test.js @@ -12,7 +12,7 @@ describe('getSupportedChains' , ()=>{ test('getSupportedChains' , async()=>{ - let result = await new Vault().getSupportedChains() + let result = await new Vault({}).getSupportedChains() expect({ evmChains: { ethereum: 'ETH', bsc: 'BSC', polygon: 'MATIC', optimism: 'OP', arbitrum: 'ARB', mantle: 'MNT', velas: 'VLX' }, nonEvmChains: { bitcoin: 'BTC' } @@ -28,7 +28,7 @@ describe('generateMnemonic' , ()=>{ test('generateMnemonic' , async()=>{ - let result = await new Vault().generateMnemonic() + let result = await new Vault({}).generateMnemonic() Mnemonic=result expect(typeof(result)).toBe("string") @@ -58,7 +58,7 @@ describe("generateVault",()=>{ const buf = new ArrayBuffer(32); const bufView = new Uint8Array(buf); - let result = await new Vault().generateVault(bufView,null,Mnemonic) + let result = await new Vault({}).generateVault(bufView,null,Mnemonic) expect(result.error).toBe("Wrong pin type, format or length") }) @@ -66,14 +66,14 @@ describe("generateVault",()=>{ test('generateVault/empty encrption key' , async()=>{ const buf = new ArrayBuffer(32); const bufView = new Uint8Array(buf); - let result = await new Vault().generateVault(null,1111,Mnemonic) + let result = await new Vault({}).generateVault(null,1111,Mnemonic) expect(result.error).toBe('Wrong pin type, format or length') }) test('generateVault/empty encrption key' , async()=>{ const buf = new ArrayBuffer(32); const bufView = new Uint8Array(buf); - let result = await new Vault().generateVault(null,111111,Mnemonic) + let result = await new Vault({}).generateVault(null,111111,Mnemonic) expect(result.error).toBe('Please enter both encryptionKey and pin') }) @@ -82,7 +82,7 @@ describe("generateVault",()=>{ const buf = new ArrayBuffer(32); const bufView = new Uint8Array(buf); try{ - let result = await new Vault().generateVault(bufView,1111,null) + let result = await new Vault({}).generateVault(bufView,1111,null) } catch(e){ expect(e.message).toBe('Seed phrase is invalid.') @@ -95,7 +95,7 @@ describe("generateVault",()=>{ const buf = new ArrayBuffer(32); const bufView = new Uint8Array(buf); - let result = await new Vault().generateVault(null,null,null) + let result = await new Vault({}).generateVault(null,null,null) expect(result.error).toBe("Wrong pin type, format or length")