quick draft PR for not throwing when looking for a chunked password (#150402) (#20956)

* quick draft PR for not throwing when looking for a chunked password

* update comment with more info

Co-authored-by: Ian Huff <ianhuff@Ians-MacBook-Pro.local>

Co-authored-by: Ian Huff <ianhu@microsoft.com>
Co-authored-by: Ian Huff <ianhuff@Ians-MacBook-Pro.local>
This commit is contained in:
Christopher Suh
2022-10-24 17:48:06 -07:00
committed by GitHub
parent 31bfc2fc94
commit ab958a2724

View File

@@ -150,6 +150,7 @@ export abstract class BaseCredentialsMainService extends Disposable implements I
return false; return false;
} }
const didDelete = await keytar.deletePassword(service, account); const didDelete = await keytar.deletePassword(service, account);
try {
let { content, hasNextChunk }: ChunkedPassword = JSON.parse(password); let { content, hasNextChunk }: ChunkedPassword = JSON.parse(password);
if (content && hasNextChunk) { if (content && hasNextChunk) {
// need to delete additional chunks // need to delete additional chunks
@@ -164,6 +165,14 @@ export abstract class BaseCredentialsMainService extends Disposable implements I
index++; index++;
} }
} }
} catch {
// When the password is saved the entire JSON payload is encrypted then stored, thus the result from getPassword might not be valid JSON
// https://github.com/microsoft/vscode/blob/c22cb87311b5eb1a3bf5600d18733f7485355dc0/src/vs/workbench/api/browser/mainThreadSecretState.ts#L83
// However in the chunked case we JSONify each chunk after encryption so for the chunked case we do expect valid JSON here
// https://github.com/microsoft/vscode/blob/708cb0c507d656b760f9d08115b8ebaf8964fd73/src/vs/platform/credentials/common/credentialsMainService.ts#L128
// Empty catch here just as in getPassword because we expect to handle both JSON cases and non JSON cases here it's not an error case to fail to parse
// https://github.com/microsoft/vscode/blob/708cb0c507d656b760f9d08115b8ebaf8964fd73/src/vs/platform/credentials/common/credentialsMainService.ts#L76
}
if (didDelete) { if (didDelete) {
this._onDidChangePassword.fire({ service, account }); this._onDidChangePassword.fire({ service, account });