Skip to content

Commit 55e66e7

Browse files
Throw a known Network error and don't delete secrets if so (microsoft#230560)
Fixes microsoft#228036
1 parent 23433ab commit 55e66e7

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

src/vs/code/browser/workbench/workbench.ts

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,14 @@ const enum AESConstants {
4343
IV_LENGTH = 12,
4444
}
4545

46+
class NetworkError extends Error {
47+
constructor(inner: Error) {
48+
super(inner.message);
49+
this.name = inner.name;
50+
this.stack = inner.stack;
51+
}
52+
}
53+
4654
class ServerKeyedAESCrypto implements ISecretStorageCrypto {
4755
private _serverKey: Uint8Array | undefined;
4856

@@ -138,30 +146,33 @@ class ServerKeyedAESCrypto implements ISecretStorageCrypto {
138146
}
139147

140148
let attempt = 0;
141-
let lastError: unknown | undefined;
149+
let lastError: Error | undefined;
142150

143151
while (attempt <= 3) {
144152
try {
145153
const res = await fetch(this.authEndpoint, { credentials: 'include', method: 'POST' });
146154
if (!res.ok) {
147155
throw new Error(res.statusText);
148156
}
149-
const serverKey = new Uint8Array(await await res.arrayBuffer());
157+
const serverKey = new Uint8Array(await res.arrayBuffer());
150158
if (serverKey.byteLength !== AESConstants.KEY_LENGTH / 8) {
151159
throw Error(`The key retrieved by the server is not ${AESConstants.KEY_LENGTH} bit long.`);
152160
}
153161
this._serverKey = serverKey;
154162
return this._serverKey;
155163
} catch (e) {
156-
lastError = e;
164+
lastError = e instanceof Error ? e : new Error(String(e));
157165
attempt++;
158166

159167
// exponential backoff
160168
await new Promise(resolve => setTimeout(resolve, attempt * attempt * 100));
161169
}
162170
}
163171

164-
throw lastError;
172+
if (lastError) {
173+
throw new NetworkError(lastError);
174+
}
175+
throw new Error('Unknown error');
165176
}
166177
}
167178

@@ -187,7 +198,9 @@ export class LocalStorageSecretStorageProvider implements ISecretStorageProvider
187198
} catch (err) {
188199
// TODO: send telemetry
189200
console.error('Failed to decrypt secrets from localStorage', err);
190-
localStorage.removeItem(this._storageKey);
201+
if (!(err instanceof NetworkError)) {
202+
localStorage.removeItem(this._storageKey);
203+
}
191204
}
192205
}
193206

0 commit comments

Comments
 (0)