From ad912e368859dce722af30125d29cb118924c04f Mon Sep 17 00:00:00 2001 From: GintV <17436829+GintV@users.noreply.github.com> Date: Mon, 19 Feb 2024 15:22:27 +0200 Subject: [PATCH 1/2] Handle decryptRefreshToken failure --- packages/electron/src/main/TokenStore.ts | 2 +- .../src/test/MainAuthorizationClient.test.ts | 20 +++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/electron/src/main/TokenStore.ts b/packages/electron/src/main/TokenStore.ts index b49d0f27..f9c6a1b4 100644 --- a/packages/electron/src/main/TokenStore.ts +++ b/packages/electron/src/main/TokenStore.ts @@ -76,7 +76,7 @@ export class RefreshTokenStore { return undefined; } const encryptedToken = this._store.get(key); - const refreshToken = await this.decryptRefreshToken(encryptedToken); + const refreshToken = await this.decryptRefreshToken(encryptedToken).catch(() => undefined); return refreshToken; } diff --git a/packages/electron/src/test/MainAuthorizationClient.test.ts b/packages/electron/src/test/MainAuthorizationClient.test.ts index 23791478..5830dc56 100644 --- a/packages/electron/src/test/MainAuthorizationClient.test.ts +++ b/packages/electron/src/test/MainAuthorizationClient.test.ts @@ -74,8 +74,8 @@ describe("ElectronMainAuthorization Token Logic", () => { const mockTokenResponse = new TokenResponse(mockTokenResponseJson); const refreshToken = "old refresh token"; - sinon.stub(RefreshTokenStore.prototype, "encryptRefreshToken" as any).returns(Buffer.from(refreshToken)); - sinon.stub(RefreshTokenStore.prototype, "decryptRefreshToken" as any).returns(refreshToken); + sinon.stub(RefreshTokenStore.prototype, "encryptRefreshToken" as any).returns(Promise.resolve(Buffer.from(refreshToken))); + sinon.stub(RefreshTokenStore.prototype, "decryptRefreshToken" as any).returns(Promise.resolve(refreshToken)); // Load refresh token into token store - use clientId const tokenStore = new RefreshTokenStore(getTokenStoreFileName(config.clientId),getTokenStoreKey(config.clientId)); await tokenStore.save(refreshToken); @@ -111,8 +111,8 @@ describe("ElectronMainAuthorization Token Logic", () => { expires_in: "60000", }); - sinon.stub(RefreshTokenStore.prototype, "encryptRefreshToken" as any).returns(Buffer.from(mockTokenResponse.refreshToken!)); - sinon.stub(RefreshTokenStore.prototype, "decryptRefreshToken" as any).returns(mockTokenResponse.refreshToken); + sinon.stub(RefreshTokenStore.prototype, "encryptRefreshToken" as any).returns(Promise.resolve(Buffer.from(mockTokenResponse.refreshToken!))); + sinon.stub(RefreshTokenStore.prototype, "decryptRefreshToken" as any).returns(Promise.resolve(mockTokenResponse.refreshToken)); // Clear token store const tokenStore = new RefreshTokenStore(getTokenStoreFileName(config.clientId),getTokenStoreKey(config.clientId)); await tokenStore.delete(); @@ -162,8 +162,8 @@ describe("ElectronMainAuthorization Token Logic", () => { }); const refreshToken = "old refresh token"; - sinon.stub(RefreshTokenStore.prototype, "encryptRefreshToken" as any).returns(Buffer.from(refreshToken)); - sinon.stub(RefreshTokenStore.prototype, "decryptRefreshToken" as any).returns(refreshToken); + sinon.stub(RefreshTokenStore.prototype, "encryptRefreshToken" as any).returns(Promise.resolve(Buffer.from(refreshToken))); + sinon.stub(RefreshTokenStore.prototype, "decryptRefreshToken" as any).returns(Promise.resolve(refreshToken)); // Load refresh token into token store - use clientId const tokenStore = new RefreshTokenStore(getTokenStoreFileName(config.clientId),getTokenStoreKey(config.clientId)); await tokenStore.save(refreshToken); @@ -204,8 +204,8 @@ describe("ElectronMainAuthorization Token Logic", () => { expires_in: "60000", }); - sinon.stub(RefreshTokenStore.prototype, "encryptRefreshToken" as any).returns(Buffer.from(mockTokenResponse.refreshToken!)); - sinon.stub(RefreshTokenStore.prototype, "decryptRefreshToken" as any).returns(mockTokenResponse.refreshToken); + sinon.stub(RefreshTokenStore.prototype, "encryptRefreshToken" as any).returns(Promise.resolve(Buffer.from(mockTokenResponse.refreshToken!))); + sinon.stub(RefreshTokenStore.prototype, "decryptRefreshToken" as any).returns(Promise.resolve(mockTokenResponse.refreshToken)); // Clear token store const tokenStore = new RefreshTokenStore(getTokenStoreFileName(config.clientId),getTokenStoreKey(config.clientId)); await tokenStore.delete(); @@ -257,8 +257,8 @@ describe("ElectronMainAuthorization Token Logic", () => { const mockTokenResponse = new TokenResponse(mockTokenResponseJson); const refreshToken = "old refresh token"; - sinon.stub(RefreshTokenStore.prototype, "encryptRefreshToken" as any).returns(Buffer.from(refreshToken)); - const decryptSpy = sinon.stub(RefreshTokenStore.prototype, "decryptRefreshToken" as any).returns(refreshToken); + sinon.stub(RefreshTokenStore.prototype, "encryptRefreshToken" as any).returns(Promise.resolve(Buffer.from(refreshToken))); + const decryptSpy = sinon.stub(RefreshTokenStore.prototype, "decryptRefreshToken" as any).returns(Promise.resolve(refreshToken)); // Load refresh token into token store - use clientId const tokenStore = new RefreshTokenStore(getTokenStoreFileName(config.clientId),getTokenStoreKey(config.clientId)); await tokenStore.delete(); From 3c88f329173fb181343e32fafb04a5c5e060cf0a Mon Sep 17 00:00:00 2001 From: GintV <17436829+GintV@users.noreply.github.com> Date: Mon, 19 Feb 2024 15:22:54 +0200 Subject: [PATCH 2/2] Change files --- ...authorization-42c4719f-cdb4-4366-a501-63704e26e476.json | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 change/@itwin-electron-authorization-42c4719f-cdb4-4366-a501-63704e26e476.json diff --git a/change/@itwin-electron-authorization-42c4719f-cdb4-4366-a501-63704e26e476.json b/change/@itwin-electron-authorization-42c4719f-cdb4-4366-a501-63704e26e476.json new file mode 100644 index 00000000..f9d9e61d --- /dev/null +++ b/change/@itwin-electron-authorization-42c4719f-cdb4-4366-a501-63704e26e476.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "Handle decryptRefreshToken failure", + "packageName": "@itwin/electron-authorization", + "email": "17436829+GintV@users.noreply.github.com", + "dependentChangeType": "patch" +}