MetaMask / MetaMask/tkey

_deleteTKeyStoreItem cause error

Open
#182 0 comments 1 reaction 0 assignees View on GitHub
Dominant language
TypeScript
Stars
181
Forks
53
PR merge metrics
No merged PRs in 30d

Description

### Step to reproduce
1. assumed login and reconstruct key successfully
2. create item: _setTKeyStoreItem(module: "A", {id: 1, data: ...})
2. create other item: _setTKeyStoreItem(module: "A", {id: 2, data: ...})
2. try delete one of them: _deleteTKeyStoreItem(module: "A", id: 2})
2. execute getTKeyStore("A") cause error

### Error
```
The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type undefined
```

### Investigate
The following method cause error
```js
async _deleteTKeyStoreItem(moduleName: string, id: string): Promise {
if (!this.metadata) {
throw CoreError.metadataUndefined();
}
const rawTkeyStoreItems = (this.metadata.getTkeyStoreDomain(moduleName) as EncryptedMessage[]) || [];
const decryptedItems = await Promise.all(
rawTkeyStoreItems.map(async (x) => {
const decryptedItem = await this.decrypt(x);
return JSON.parse(decryptedItem.toString()) as TkeyStoreItemType;
})
);
const finalItems = decryptedItems.filter((x) => x.id !== id);
this.metadata.setTkeyStoreDomain(moduleName, finalItems);
await this._syncShareMetadata();
}
```

### Suggested Correction
```js
async _deleteTKeyStoreItem(moduleName: string, id: string): Promise {
if (!this.tKey.metadata) {
throw CoreError.metadataUndefined();
}
const rawTkeyStoreItems = (this.tKey.metadata.getTkeyStoreDomain(moduleName) as EncryptedMessage[]) || [];
const decryptedItems = await Promise.all(
rawTkeyStoreItems.map(async (x) => {
const decryptedItem = await this.tKey.decrypt(x);
return JSON.parse(decryptedItem.toString()) as TkeyStoreItemType;
})
);
const finalItems = decryptedItems.filter((x) => x.id !== id);

const finalRawTkeyStoreItems: EncryptedMessage[] = []
for (let i = 0; i < finalItems.length; i++) {
const encryptedData = await this.tKey.encrypt(Buffer.from(stringify(finalItems[i])));
finalRawTkeyStoreItems.push(encryptedData)
}

this.tKey.metadata.setTkeyStoreDomain(moduleName, finalRawTkeyStoreItems);
await this.tKey._syncShareMetadata();
}
```

Contributor guide

No contributing guide indexed for this repository

Research direction

Start with _deleteTKeyStoreItem and reproduce the sequence using _setTKeyStoreItem, _deleteTKeyStoreItem, and getTKeyStore("A"). Compare the deleted-item flow with the suggested correction, then verify that deleting one item leaves the remaining item readable without the undefined-input error.

Written by the indexing model from the issue text.

Assessment

Tech stack
typescript
Domain
cryptography
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Clearly specified
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.