From 5e12230fc1cba0389011dfef54bb984977cea70e Mon Sep 17 00:00:00 2001 From: tsangington Date: Tue, 23 Apr 2024 13:51:40 +0000 Subject: [PATCH 01/11] Add GoogleAuth --- app-config.yaml | 4 ++++ packages/app/src/App.tsx | 28 ++++++++++++++++++++-------- packages/backend/src/plugins/auth.ts | 19 +++++++++++++++++++ 3 files changed, 43 insertions(+), 8 deletions(-) diff --git a/app-config.yaml b/app-config.yaml index ad0e38e..dcbc998 100644 --- a/app-config.yaml +++ b/app-config.yaml @@ -72,6 +72,10 @@ auth: development: clientId: ${GITHUB_CLIENT_ID} clientSecret: ${GITHUB_CLIENT_SECRET} + google: + development: + clientId: ${GOOGLE_CLIENT_ID} + clientSecret: ${GOOGLE_CLIENT_SECRET} kubernetes: serviceLocatorMethod: diff --git a/packages/app/src/App.tsx b/packages/app/src/App.tsx index 40abe34..023e358 100644 --- a/packages/app/src/App.tsx +++ b/packages/app/src/App.tsx @@ -34,8 +34,22 @@ import { CatalogGraphPage } from '@backstage/plugin-catalog-graph'; import { RequirePermission } from '@backstage/plugin-permission-react'; import { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common/alpha'; -import { githubAuthApiRef } from '@backstage/core-plugin-api'; -import { SignInPage } from '@backstage/core-components'; +import { githubAuthApiRef, googleAuthApiRef } from '@backstage/core-plugin-api'; +import { SignInPage, SignInProviderConfig } from '@backstage/core-components'; + +const githubProvider: SignInProviderConfig = { + id: 'github-auth-provider', + title: 'GitHub', + message: 'Sign in using GitHub', + apiRef: githubAuthApiRef, +}; +const googleProvider: SignInProviderConfig = { + id: 'google-auth-provider', + title: 'Google', + message: 'Sign in using Google', + apiRef: googleAuthApiRef, +}; + const app = createApp({ apis, @@ -44,12 +58,10 @@ const app = createApp({ ), }, diff --git a/packages/backend/src/plugins/auth.ts b/packages/backend/src/plugins/auth.ts index 77eb6aa..6ab5c9e 100644 --- a/packages/backend/src/plugins/auth.ts +++ b/packages/backend/src/plugins/auth.ts @@ -49,6 +49,25 @@ export default async function createPlugin( // resolver: providers.github.resolvers.usernameMatchingUserEntityName(), }, }), + google: providers.google.create({ + signIn: { + resolver: async (info, ctx) => { + const { + profile: { email }, + } = info; + + if (!email) { + throw new Error('User profile contained no email'); + } + + const [name] = email.split('@'); + + return ctx.signInWithCatalogUser({ + entityRef: { name }, + }); + }, + }, + }) }, }); } From c1ed984f91d63f372fe0be92e3d8f8dbd2d33387 Mon Sep 17 00:00:00 2001 From: tsangington Date: Tue, 30 Apr 2024 15:43:28 +0000 Subject: [PATCH 02/11] ADD: Google Login Without Catalog For Testing Purposes --- packages/backend/src/plugins/auth.ts | 58 +++++++++++++++++++++------- 1 file changed, 44 insertions(+), 14 deletions(-) diff --git a/packages/backend/src/plugins/auth.ts b/packages/backend/src/plugins/auth.ts index 6ab5c9e..05ea22a 100644 --- a/packages/backend/src/plugins/auth.ts +++ b/packages/backend/src/plugins/auth.ts @@ -5,6 +5,7 @@ import { } from '@backstage/plugin-auth-backend'; import { Router } from 'express'; import { PluginEnvironment } from '../types'; +import { DEFAULT_NAMESPACE, stringifyEntityRef, } from '@backstage/catalog-model'; export default async function createPlugin( env: PluginEnvironment, @@ -51,23 +52,52 @@ export default async function createPlugin( }), google: providers.google.create({ signIn: { - resolver: async (info, ctx) => { - const { - profile: { email }, - } = info; - - if (!email) { - throw new Error('User profile contained no email'); + resolver: async ({ profile }, ctx) => { + if (!profile.email) { + throw new Error( + 'Login failed, user profile does not contain an email', + ); } - - const [name] = email.split('@'); - - return ctx.signInWithCatalogUser({ - entityRef: { name }, + const [localPart] = profile.email.split('@'); + const userEntityRef = stringifyEntityRef({ + kind: 'User', + name: localPart, + namespace: DEFAULT_NAMESPACE, + }); + return ctx.issueToken({ + claims: { + sub: userEntityRef, + ent: [userEntityRef], + }, }); }, }, - }) + }), + }, +}); +} + + +`google: providers.google.create({ + signIn: { + resolver: async (info, ctx) => { + const { + profile: { email }, + } = info; + + if (!email) { + throw new Error('User profile contained no email'); + } + + const [name] = email.split('@'); + + return ctx.signInWithCatalogUser({ + entityRef: { name }, + }); }, - }); + }, +}) +}, +}); } +` \ No newline at end of file From 49672d04899e6d95ad99c161fb91a97b42c8339b Mon Sep 17 00:00:00 2001 From: tsangington Date: Sun, 5 May 2024 20:32:29 +0000 Subject: [PATCH 03/11] feat: Add Custom Domain Check for code.berlin emails --- packages/backend/src/plugins/auth.ts | 32 ++++++---------------------- 1 file changed, 6 insertions(+), 26 deletions(-) diff --git a/packages/backend/src/plugins/auth.ts b/packages/backend/src/plugins/auth.ts index 05ea22a..fb555cd 100644 --- a/packages/backend/src/plugins/auth.ts +++ b/packages/backend/src/plugins/auth.ts @@ -58,7 +58,12 @@ export default async function createPlugin( 'Login failed, user profile does not contain an email', ); } - const [localPart] = profile.email.split('@'); + const [localPart, domain] = profile.email.split('@'); + if (domain !== 'code.berlin') { + throw new Error( + `Login failed, '${profile.email}' does not belong to the expected domain`, + ); + } const userEntityRef = stringifyEntityRef({ kind: 'User', name: localPart, @@ -76,28 +81,3 @@ export default async function createPlugin( }, }); } - - -`google: providers.google.create({ - signIn: { - resolver: async (info, ctx) => { - const { - profile: { email }, - } = info; - - if (!email) { - throw new Error('User profile contained no email'); - } - - const [name] = email.split('@'); - - return ctx.signInWithCatalogUser({ - entityRef: { name }, - }); - }, - }, -}) -}, -}); -} -` \ No newline at end of file From 5e77477de89ec7549f324dc83623fcfd3d15b2e2 Mon Sep 17 00:00:00 2001 From: tsangington Date: Wed, 8 May 2024 21:35:31 +0000 Subject: [PATCH 04/11] Chore: Add details to readme about google client env variables --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index d1c5a19..291c425 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,9 @@ BASE_URL="http://localhost:7007" GITHUB_CLIENT_ID="your-id" GITHUB_CLIENT_SECRET="your-secret" +GOOGLE_CLIENT_ID= "google_client_id" +GOOGLE_CLIENT_SECRET= "google_client_secret" + GITHUB_TOKEN="your-token" K8S_URL="k8s-url" @@ -63,6 +66,12 @@ Keep it the same as it is right now, this is the url on which the application is
These environment variables are to setup correct [authentication](https://backstage.io/docs/getting-started/configuration#setting-up-authentication). Please follow [these](#github-auth) steps. +**`GOOGLE_CLIENT`:** +
+These environment variables are to allow google login with your code.berlin email. +( https://console.cloud.google.com/apis/credentials/oauthclient/1006240973223-fs36u8kllipl761732fn565l6suviroh.apps.googleusercontent.com?authuser=0&project=code-idp&pli=1 ) +Use the link above and copy the client ID and secret. + **`GITHUB_TOKEN`:**
This environment variable is to configure the [GitHub integration](https://backstage.io/docs/getting-started/configuration#setting-up-a-github-integration), From b6055ddf74b60f7f114bbd9733162a86e25e14dd Mon Sep 17 00:00:00 2001 From: tsangington Date: Thu, 9 May 2024 10:59:29 +0000 Subject: [PATCH 05/11] Removed Github SignIn Provider In Frontend --- packages/app/src/App.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/app/src/App.tsx b/packages/app/src/App.tsx index 023e358..272f473 100644 --- a/packages/app/src/App.tsx +++ b/packages/app/src/App.tsx @@ -59,7 +59,6 @@ const app = createApp({ {...props} auto providers={[ - githubProvider, googleProvider ]} /> From 43ef4d67ae7d77d5f9d5f73f814c761fbd0d4177 Mon Sep 17 00:00:00 2001 From: tsangington Date: Thu, 9 May 2024 10:59:29 +0000 Subject: [PATCH 06/11] DEL: Removed Github SignIn Provider In Frontend --- packages/app/src/App.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/app/src/App.tsx b/packages/app/src/App.tsx index 023e358..272f473 100644 --- a/packages/app/src/App.tsx +++ b/packages/app/src/App.tsx @@ -59,7 +59,6 @@ const app = createApp({ {...props} auto providers={[ - githubProvider, googleProvider ]} /> From b652da1979006e4d585f11e7bf5fb4adfdce8097 Mon Sep 17 00:00:00 2001 From: Menna Tullah Magdy Taha Date: Sat, 11 May 2024 19:16:49 +0200 Subject: [PATCH 07/11] UPD: Refactored google oauth to make the function testable --- packages/backend/src/plugins/auth.ts | 31 ++----------- .../plugins_helper/googleAuthResolver.ts | 43 +++++++++++++++++++ 2 files changed, 47 insertions(+), 27 deletions(-) create mode 100644 packages/backend/src/plugins/plugins_helper/googleAuthResolver.ts diff --git a/packages/backend/src/plugins/auth.ts b/packages/backend/src/plugins/auth.ts index fb555cd..f6dbdd2 100644 --- a/packages/backend/src/plugins/auth.ts +++ b/packages/backend/src/plugins/auth.ts @@ -5,7 +5,7 @@ import { } from '@backstage/plugin-auth-backend'; import { Router } from 'express'; import { PluginEnvironment } from '../types'; -import { DEFAULT_NAMESPACE, stringifyEntityRef, } from '@backstage/catalog-model'; +import { resolverResult } from './plugins_helper/googleAuthResolver'; export default async function createPlugin( env: PluginEnvironment, @@ -52,32 +52,9 @@ export default async function createPlugin( }), google: providers.google.create({ signIn: { - resolver: async ({ profile }, ctx) => { - if (!profile.email) { - throw new Error( - 'Login failed, user profile does not contain an email', - ); - } - const [localPart, domain] = profile.email.split('@'); - if (domain !== 'code.berlin') { - throw new Error( - `Login failed, '${profile.email}' does not belong to the expected domain`, - ); - } - const userEntityRef = stringifyEntityRef({ - kind: 'User', - name: localPart, - namespace: DEFAULT_NAMESPACE, - }); - return ctx.issueToken({ - claims: { - sub: userEntityRef, - ent: [userEntityRef], - }, - }); - }, + resolver: resolverResult, }, }), - }, -}); + }, + }); } diff --git a/packages/backend/src/plugins/plugins_helper/googleAuthResolver.ts b/packages/backend/src/plugins/plugins_helper/googleAuthResolver.ts new file mode 100644 index 0000000..b6633d3 --- /dev/null +++ b/packages/backend/src/plugins/plugins_helper/googleAuthResolver.ts @@ -0,0 +1,43 @@ +import { + stringifyEntityRef, + DEFAULT_NAMESPACE, +} from '@backstage/catalog-model'; +import { OAuthResult } from '@backstage/plugin-auth-backend'; +import { SignInInfo, AuthResolverContext } from '@backstage/plugin-auth-node'; + +export const resolverResult = async ( + profile_input: SignInInfo, + ctx: AuthResolverContext, +) => { + const profile = profile_input.profile; + const regexp = new RegExp( + /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/, + ); + + if (!profile.email || !regexp.test(profile.email)) { + throw new Error( + 'Login failed, user profile does not contain a valid email', + ); + } + + const [localPart, domain] = profile.email.split('@'); + + if (domain !== 'code.berlin') { + throw new Error( + `Login failed, '${profile.email}' does not belong to the expected domain`, + ); + } + + const userEntityRef = stringifyEntityRef({ + kind: 'User', + name: localPart, + namespace: DEFAULT_NAMESPACE, + }); + + return ctx.issueToken({ + claims: { + sub: userEntityRef, + ent: [userEntityRef], + }, + }); +}; From 1436240cb538d806a0bf74113b533d63b345f1a1 Mon Sep 17 00:00:00 2001 From: Menna Tullah Magdy Taha Date: Sat, 11 May 2024 21:07:05 +0200 Subject: [PATCH 08/11] ADD: added unit tests for index.test.ts to verify the logic provided to the google oauth resolver --- packages/backend/src/index.test.ts | 157 +++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) diff --git a/packages/backend/src/index.test.ts b/packages/backend/src/index.test.ts index 7814b8c..13e1621 100644 --- a/packages/backend/src/index.test.ts +++ b/packages/backend/src/index.test.ts @@ -1,4 +1,14 @@ import { PluginEnvironment } from './types'; +import { resolverResult } from './plugins/plugins_helper/googleAuthResolver'; +import { + AuthResolverCatalogUserQuery, + AuthResolverContext, + BackstageSignInResult, + ProfileInfo, + SignInInfo, +} from '@backstage/plugin-auth-node'; +import { TokenParams } from '@backstage/plugin-auth-backend'; +import { Entity } from '@backstage/catalog-model'; describe('test', () => { it('unbreaks the test runner', () => { @@ -6,3 +16,150 @@ describe('test', () => { expect(unbreaker).toBeTruthy(); }); }); + +describe('providers.google.create.signIn.resolver logic', () => { + it('should throw an exception for empty email address', async () => { + const mockProfile: ProfileInfo = { + email: '', + displayName: 'John Doe', + picture: 'https://example.com/avatar.jpg', + }; + + const mockSignInInfo: SignInInfo = { + profile: mockProfile, + result: {}, // Placeholder for the authentication result + }; + + const mockTokenParams: TokenParams = { + claims: { + sub: 'user123', + ent: ['entity1', 'entity2'], + customClaim: 'value', + }, + }; + + const mockContext: AuthResolverContext = { + issueToken: (params: TokenParams) => { + return new Promise<{ token: string }>(resolve => { + resolve({ token: 'fake token' }); + }); + }, + findCatalogUser: function ( + query: AuthResolverCatalogUserQuery, + ): Promise<{ entity: Entity }> { + throw new Error('Function not implemented.'); + }, + signInWithCatalogUser: function ( + query: AuthResolverCatalogUserQuery, + ): Promise { + throw new Error('Function not implemented.'); + }, + }; + + await expect(resolverResult(mockSignInInfo, mockContext)).rejects.toThrow( + 'Login failed, user profile does not contain a valid email', + ); + }); + + it('should throw an exception for invalid non empty email address', async () => { + const mockProfile: ProfileInfo = { + email: 'test.example.com', + displayName: 'John Doe', + picture: 'https://example.com/avatar.jpg', + }; + + const mockSignInInfo: SignInInfo = { + profile: mockProfile, + result: {}, // Placeholder for the authentication result + }; + + const mockContext: AuthResolverContext = { + issueToken: (params: TokenParams) => { + return new Promise<{ token: string }>(resolve => { + resolve({ token: 'fake token' }); + }); + }, + findCatalogUser: function ( + query: AuthResolverCatalogUserQuery, + ): Promise<{ entity: Entity }> { + throw new Error('Function not implemented.'); + }, + signInWithCatalogUser: function ( + query: AuthResolverCatalogUserQuery, + ): Promise { + throw new Error('Function not implemented.'); + }, + }; + + await expect(resolverResult(mockSignInInfo, mockContext)).rejects.toThrow( + 'Login failed, user profile does not contain a valid email', + ); + }); + + it('should throw an exception for valid email address with incorrect domain', async () => { + const mockProfile: ProfileInfo = { + email: 'user@example.com', + displayName: 'John Doe', + picture: 'https://example.com/avatar.jpg', + }; + + const mockSignInInfo: SignInInfo = { + profile: mockProfile, + result: {}, // Placeholder for the authentication result + }; + + const mockContext: AuthResolverContext = { + issueToken: (params: TokenParams) => { + return new Promise<{ token: string }>(resolve => { + resolve({ token: 'fake token' }); + }); + }, + findCatalogUser: function ( + query: AuthResolverCatalogUserQuery, + ): Promise<{ entity: Entity }> { + throw new Error('Function not implemented.'); + }, + signInWithCatalogUser: function ( + query: AuthResolverCatalogUserQuery, + ): Promise { + throw new Error('Function not implemented.'); + }, + }; + + await expect(resolverResult(mockSignInInfo, mockContext)).rejects.toThrow( + `Login failed, '${mockProfile.email}' does not belong to the expected domain`, + ); + }); + + it('should return a token for valid email address with correct domain', async () => { + const mockProfile: ProfileInfo = { + email: 'john_doe@code.berlin', + displayName: 'John Doe', + picture: 'https://example.com/avatar.jpg', + }; + + const mockSignInInfo: SignInInfo = { + profile: mockProfile, + result: {}, // Placeholder for the authentication result + }; + + const mockContext: AuthResolverContext = { + issueToken: (params: TokenParams) => { + // Mock implementation for issueToken method + return { token: params.claims.sub + params.claims.ent }; + }, + findCatalogUser: (query: AuthResolverCatalogUserQuery) => { + // Mock implementation for findCatalogUser method + return ''; + }, + signInWithCatalogUser: (query: AuthResolverCatalogUserQuery) => { + // Mock implementation for signInWithCatalogUser method + return ''; + }, + }; + + return expect(resolverResult(mockSignInInfo, mockContext)).resolves.toEqual( + { token: 'user:default/john_doeuser:default/john_doe' }, + ); + }); +}); From d59e2b236383af045e2e6ee72c2287ac9d34dde1 Mon Sep 17 00:00:00 2001 From: Menna Tullah Magdy Taha Date: Tue, 14 May 2024 17:17:02 +0200 Subject: [PATCH 09/11] ADD: install jest canvas mock --- package.json | 2 +- packages/app/src/App.test.tsx | 2 + packages/backend/package.json | 2 + packages/backend/src/index.test.ts | 146 +++--------------- .../plugins_helper/googleAuthResolver.ts | 11 +- yarn.lock | 55 +++++-- 6 files changed, 80 insertions(+), 138 deletions(-) diff --git a/package.json b/package.json index 3af2822..fa72792 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "@playwright/test": "^1.32.3", "@spotify/prettier-config": "^12.0.0", "concurrently": "^8.0.0", + "jest-canvas-mock": "^2.5.2", "lerna": "^7.3.0", "node-gyp": "^10.0.1", "prettier": "^2.3.2", @@ -67,5 +68,4 @@ "prettier --write" ] } - } diff --git a/packages/app/src/App.test.tsx b/packages/app/src/App.test.tsx index 824bc54..344f624 100644 --- a/packages/app/src/App.test.tsx +++ b/packages/app/src/App.test.tsx @@ -1,6 +1,8 @@ import React from 'react'; import { render, waitFor } from '@testing-library/react'; import App from './App'; +import 'jest-canvas-mock' + describe('App', () => { it('should render', async () => { diff --git a/packages/backend/package.json b/packages/backend/package.json index 558e4a6..5a4e481 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -40,8 +40,10 @@ "@backstage/plugin-techdocs-backend": "^1.9.2", "app": "link:../app", "dockerode": "^3.3.1", + "dotenv": "^16.4.5", "express": "^4.17.1", "express-promise-router": "^4.1.0", + "jest-canvas-mock": "^2.5.2", "node-gyp": "^9.0.0", "pg": "^8.11.3", "winston": "^3.2.1" diff --git a/packages/backend/src/index.test.ts b/packages/backend/src/index.test.ts index 13e1621..4147dca 100644 --- a/packages/backend/src/index.test.ts +++ b/packages/backend/src/index.test.ts @@ -1,14 +1,11 @@ import { PluginEnvironment } from './types'; import { resolverResult } from './plugins/plugins_helper/googleAuthResolver'; -import { - AuthResolverCatalogUserQuery, - AuthResolverContext, - BackstageSignInResult, - ProfileInfo, - SignInInfo, -} from '@backstage/plugin-auth-node'; import { TokenParams } from '@backstage/plugin-auth-backend'; -import { Entity } from '@backstage/catalog-model'; +import 'jest-canvas-mock'; + +let mockProfile: any; +let mockSignInInfo: any; +let mockContext: any; describe('test', () => { it('unbreaks the test runner', () => { @@ -18,43 +15,25 @@ describe('test', () => { }); describe('providers.google.create.signIn.resolver logic', () => { - it('should throw an exception for empty email address', async () => { - const mockProfile: ProfileInfo = { - email: '', + beforeEach(() => { + mockProfile = { displayName: 'John Doe', picture: 'https://example.com/avatar.jpg', }; - - const mockSignInInfo: SignInInfo = { - profile: mockProfile, - result: {}, // Placeholder for the authentication result - }; - - const mockTokenParams: TokenParams = { - claims: { - sub: 'user123', - ent: ['entity1', 'entity2'], - customClaim: 'value', - }, - }; - - const mockContext: AuthResolverContext = { + mockSignInInfo = { profile: mockProfile, result: {} }; + mockContext = { issueToken: (params: TokenParams) => { - return new Promise<{ token: string }>(resolve => { - resolve({ token: 'fake token' }); - }); - }, - findCatalogUser: function ( - query: AuthResolverCatalogUserQuery, - ): Promise<{ entity: Entity }> { - throw new Error('Function not implemented.'); - }, - signInWithCatalogUser: function ( - query: AuthResolverCatalogUserQuery, - ): Promise { - throw new Error('Function not implemented.'); + // Mock implementation for issueToken method + return { token: params.claims.sub + params.claims.ent }; }, + findCatalogUser: jest.fn(), + signInWithCatalogUser: jest.fn(), }; + }); + + it('should throw an exception for empty email address', async () => { + mockProfile.email = ''; + mockSignInInfo.profile = mockProfile; await expect(resolverResult(mockSignInInfo, mockContext)).rejects.toThrow( 'Login failed, user profile does not contain a valid email', @@ -62,34 +41,8 @@ describe('providers.google.create.signIn.resolver logic', () => { }); it('should throw an exception for invalid non empty email address', async () => { - const mockProfile: ProfileInfo = { - email: 'test.example.com', - displayName: 'John Doe', - picture: 'https://example.com/avatar.jpg', - }; - - const mockSignInInfo: SignInInfo = { - profile: mockProfile, - result: {}, // Placeholder for the authentication result - }; - - const mockContext: AuthResolverContext = { - issueToken: (params: TokenParams) => { - return new Promise<{ token: string }>(resolve => { - resolve({ token: 'fake token' }); - }); - }, - findCatalogUser: function ( - query: AuthResolverCatalogUserQuery, - ): Promise<{ entity: Entity }> { - throw new Error('Function not implemented.'); - }, - signInWithCatalogUser: function ( - query: AuthResolverCatalogUserQuery, - ): Promise { - throw new Error('Function not implemented.'); - }, - }; + mockProfile.email = 'test.example.com'; + mockSignInInfo.profile = mockProfile; await expect(resolverResult(mockSignInInfo, mockContext)).rejects.toThrow( 'Login failed, user profile does not contain a valid email', @@ -97,66 +50,17 @@ describe('providers.google.create.signIn.resolver logic', () => { }); it('should throw an exception for valid email address with incorrect domain', async () => { - const mockProfile: ProfileInfo = { - email: 'user@example.com', - displayName: 'John Doe', - picture: 'https://example.com/avatar.jpg', - }; - - const mockSignInInfo: SignInInfo = { - profile: mockProfile, - result: {}, // Placeholder for the authentication result - }; - - const mockContext: AuthResolverContext = { - issueToken: (params: TokenParams) => { - return new Promise<{ token: string }>(resolve => { - resolve({ token: 'fake token' }); - }); - }, - findCatalogUser: function ( - query: AuthResolverCatalogUserQuery, - ): Promise<{ entity: Entity }> { - throw new Error('Function not implemented.'); - }, - signInWithCatalogUser: function ( - query: AuthResolverCatalogUserQuery, - ): Promise { - throw new Error('Function not implemented.'); - }, - }; + mockProfile.email = 'user@example.com'; + mockSignInInfo.profile = mockProfile; await expect(resolverResult(mockSignInInfo, mockContext)).rejects.toThrow( - `Login failed, '${mockProfile.email}' does not belong to the expected domain`, + `Login failed due to incorrect email domain.`, ); }); it('should return a token for valid email address with correct domain', async () => { - const mockProfile: ProfileInfo = { - email: 'john_doe@code.berlin', - displayName: 'John Doe', - picture: 'https://example.com/avatar.jpg', - }; - - const mockSignInInfo: SignInInfo = { - profile: mockProfile, - result: {}, // Placeholder for the authentication result - }; - - const mockContext: AuthResolverContext = { - issueToken: (params: TokenParams) => { - // Mock implementation for issueToken method - return { token: params.claims.sub + params.claims.ent }; - }, - findCatalogUser: (query: AuthResolverCatalogUserQuery) => { - // Mock implementation for findCatalogUser method - return ''; - }, - signInWithCatalogUser: (query: AuthResolverCatalogUserQuery) => { - // Mock implementation for signInWithCatalogUser method - return ''; - }, - }; + mockProfile.email = 'john_doe@code.berlin'; + mockSignInInfo.profile = mockProfile; return expect(resolverResult(mockSignInInfo, mockContext)).resolves.toEqual( { token: 'user:default/john_doeuser:default/john_doe' }, diff --git a/packages/backend/src/plugins/plugins_helper/googleAuthResolver.ts b/packages/backend/src/plugins/plugins_helper/googleAuthResolver.ts index b6633d3..6c7f9b0 100644 --- a/packages/backend/src/plugins/plugins_helper/googleAuthResolver.ts +++ b/packages/backend/src/plugins/plugins_helper/googleAuthResolver.ts @@ -2,9 +2,12 @@ import { stringifyEntityRef, DEFAULT_NAMESPACE, } from '@backstage/catalog-model'; +import dotenv from 'dotenv'; import { OAuthResult } from '@backstage/plugin-auth-backend'; import { SignInInfo, AuthResolverContext } from '@backstage/plugin-auth-node'; +dotenv.config(); + export const resolverResult = async ( profile_input: SignInInfo, ctx: AuthResolverContext, @@ -22,10 +25,8 @@ export const resolverResult = async ( const [localPart, domain] = profile.email.split('@'); - if (domain !== 'code.berlin') { - throw new Error( - `Login failed, '${profile.email}' does not belong to the expected domain`, - ); + if (domain !== process.env.EMAIL_DOMAIN) { + throw new Error(`Login failed due to incorrect email domain.`); } const userEntityRef = stringifyEntityRef({ @@ -33,7 +34,7 @@ export const resolverResult = async ( name: localPart, namespace: DEFAULT_NAMESPACE, }); - + return ctx.issueToken({ claims: { sub: userEntityRef, diff --git a/yarn.lock b/yarn.lock index 80b5f55..14b5688 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8915,10 +8915,10 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== -"@types/react-dom@*", "@types/react-dom@^18", "@types/react-dom@^18.0.0": - version "18.2.19" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.19.tgz#b84b7c30c635a6c26c6a6dfbb599b2da9788be58" - integrity sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA== +"@types/react-dom@*", "@types/react-dom@^18.0.0": + version "18.3.0" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.0.tgz#0cbc818755d87066ab6ca74fbedb2547d74a82b0" + integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== dependencies: "@types/react" "*" @@ -8953,13 +8953,21 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^16.13.1 || ^17.0.0", "@types/react@^16.13.1 || ^17.0.0 || ^18.0.0", "@types/react@^18": - version "18.2.63" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.63.tgz#4637c56146ad90f96d0583171edab953f7e6fe57" - integrity sha512-ppaqODhs15PYL2nGUOaOu2RSCCB4Difu4UFrP4I3NHLloXC/ESQzQMi9nvjfT1+rudd0d2L3fQPJxRSey+rGlQ== +"@types/react@*", "@types/react@^16.13.1 || ^17.0.0 || ^18.0.0": + version "18.3.2" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.2.tgz#462ae4904973bc212fa910424d901e3d137dbfcd" + integrity sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w== dependencies: "@types/prop-types" "*" - "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/react@^16.13.1 || ^17.0.0": + version "17.0.80" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.80.tgz#a5dfc351d6a41257eb592d73d3a85d3b7dbcbb41" + integrity sha512-LrgHIu2lEtIo8M7d1FcI3BdwXWoRQwMoXOZ7+dPTW0lYREjmlHl3P0U1VD0i/9tppOuv8/sam7sOjx34TxSFbA== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "^0.16" csstype "^3.0.2" "@types/request@^2.47.1", "@types/request@^2.48.8": @@ -8989,7 +8997,7 @@ resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== -"@types/scheduler@*": +"@types/scheduler@^0.16": version "0.16.8" resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff" integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== @@ -11106,7 +11114,7 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== -color-name@^1.0.0, color-name@~1.1.4: +color-name@^1.0.0, color-name@^1.1.4, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== @@ -11782,6 +11790,11 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== +cssfontparser@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/cssfontparser/-/cssfontparser-1.2.1.tgz#f4022fc8f9700c68029d542084afbaf425a3f3e3" + integrity sha512-6tun4LoZnj7VN6YeegOVb67KBX/7JJsqvj+pv3ZA7F878/eN33AbGa5b/S/wXxS/tcp8nc40xRUrsPlxIyNUPg== + cssnano-preset-default@^5.2.14: version "5.2.14" resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz#309def4f7b7e16d71ab2438052093330d9ab45d8" @@ -12454,6 +12467,11 @@ dotenv-expand@~10.0.0: resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-10.0.0.tgz#12605d00fb0af6d0a592e6558585784032e4ef37" integrity sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A== +dotenv@^16.4.5: + version "16.4.5" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== + dotenv@~16.3.1: version "16.3.2" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.2.tgz#3cb611ce5a63002dbabf7c281bc331f69d28f03f" @@ -15662,6 +15680,14 @@ jake@^10.8.5: filelist "^1.0.4" minimatch "^3.1.2" +jest-canvas-mock@^2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jest-canvas-mock/-/jest-canvas-mock-2.5.2.tgz#7e21ebd75e05ab41c890497f6ba8a77f915d2ad6" + integrity sha512-vgnpPupjOL6+L5oJXzxTxFrlGEIbHdZqFU+LFNdtLxZ3lRDCl17FlTMM7IatoRQkrcyOTMlDinjUguqmQ6bR2A== + dependencies: + cssfontparser "^1.2.1" + moo-color "^1.0.2" + jest-changed-files@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" @@ -18056,6 +18082,13 @@ modify-values@^1.0.1: resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== +moo-color@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/moo-color/-/moo-color-1.0.3.tgz#d56435f8359c8284d83ac58016df7427febece74" + integrity sha512-i/+ZKXMDf6aqYtBhuOcej71YSlbjT3wCO/4H1j8rPvxDJEifdwgg5MaFyu6iYAT8GBZJg2z0dkgK4YMzvURALQ== + dependencies: + color-name "^1.1.4" + moo@^0.5.0: version "0.5.2" resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.2.tgz#f9fe82473bc7c184b0d32e2215d3f6e67278733c" From 3e49800125e7a1de3508d77d8b2da6d70dc00425 Mon Sep 17 00:00:00 2001 From: Menna Tullah Magdy Taha Date: Tue, 14 May 2024 20:23:29 +0200 Subject: [PATCH 10/11] fixed canvas issue --- package.json | 2 + packages/app/src/App.test.tsx | 5 +- yarn.lock | 249 ++++++++++++++++++++++++++++++---- 3 files changed, 228 insertions(+), 28 deletions(-) diff --git a/package.json b/package.json index fa72792..cc39a26 100644 --- a/package.json +++ b/package.json @@ -47,8 +47,10 @@ "@backstage/e2e-test-utils": "^0.1.0", "@playwright/test": "^1.32.3", "@spotify/prettier-config": "^12.0.0", + "canvas": "^2.11.2", "concurrently": "^8.0.0", "jest-canvas-mock": "^2.5.2", + "jsdom": "^24.0.0", "lerna": "^7.3.0", "node-gyp": "^10.0.1", "prettier": "^2.3.2", diff --git a/packages/app/src/App.test.tsx b/packages/app/src/App.test.tsx index 344f624..6645d48 100644 --- a/packages/app/src/App.test.tsx +++ b/packages/app/src/App.test.tsx @@ -4,6 +4,7 @@ import App from './App'; import 'jest-canvas-mock' + describe('App', () => { it('should render', async () => { process.env = { @@ -21,9 +22,7 @@ describe('App', () => { }, ] as any, }; - - const rendered = render(); - + const rendered = render(); await waitFor(() => { expect(rendered.baseElement).toBeInTheDocument(); }); diff --git a/yarn.lock b/yarn.lock index 14b5688..251144c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5442,6 +5442,21 @@ globby "^11.0.0" read-yaml-file "^1.1.0" +"@mapbox/node-pre-gyp@^1.0.0": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz#417db42b7f5323d79e93b34a6d7a2a12c0df43fa" + integrity sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ== + dependencies: + detect-libc "^2.0.0" + https-proxy-agent "^5.0.0" + make-dir "^3.1.0" + node-fetch "^2.6.7" + nopt "^5.0.0" + npmlog "^5.0.1" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.11" + "@material-table/core@^3.1.0": version "3.2.5" resolved "https://registry.yarnpkg.com/@material-table/core/-/core-3.2.5.tgz#37b3c665bed3ded6c147ad74adb330bf49efb213" @@ -8915,7 +8930,7 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== -"@types/react-dom@*", "@types/react-dom@^18.0.0": +"@types/react-dom@*", "@types/react-dom@^18", "@types/react-dom@^18.0.0": version "18.3.0" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.0.tgz#0cbc818755d87066ab6ca74fbedb2547d74a82b0" integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== @@ -8953,7 +8968,7 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^16.13.1 || ^17.0.0 || ^18.0.0": +"@types/react@*", "@types/react@^16.13.1 || ^17.0.0", "@types/react@^16.13.1 || ^17.0.0 || ^18.0.0", "@types/react@^18": version "18.3.2" resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.2.tgz#462ae4904973bc212fa910424d901e3d137dbfcd" integrity sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w== @@ -8961,15 +8976,6 @@ "@types/prop-types" "*" csstype "^3.0.2" -"@types/react@^16.13.1 || ^17.0.0": - version "17.0.80" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.80.tgz#a5dfc351d6a41257eb592d73d3a85d3b7dbcbb41" - integrity sha512-LrgHIu2lEtIo8M7d1FcI3BdwXWoRQwMoXOZ7+dPTW0lYREjmlHl3P0U1VD0i/9tppOuv8/sam7sOjx34TxSFbA== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "^0.16" - csstype "^3.0.2" - "@types/request@^2.47.1", "@types/request@^2.48.8": version "2.48.12" resolved "https://registry.yarnpkg.com/@types/request/-/request-2.48.12.tgz#0f590f615a10f87da18e9790ac94c29ec4c5ef30" @@ -8997,11 +9003,6 @@ resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== -"@types/scheduler@^0.16": - version "0.16.8" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff" - integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== - "@types/semver@^7.3.12", "@types/semver@^7.5.0": version "7.5.6" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.6.tgz#c65b2bfce1bec346582c07724e3f8c1017a20339" @@ -9500,7 +9501,7 @@ abab@^2.0.3, abab@^2.0.5, abab@^2.0.6: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== -abbrev@^1.0.0: +abbrev@1, abbrev@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== @@ -9812,6 +9813,14 @@ archiver@^6.0.0: tar-stream "^3.0.0" zip-stream "^5.0.1" +are-we-there-yet@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" + integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + are-we-there-yet@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" @@ -10803,6 +10812,15 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001580: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001585.tgz#0b4e848d84919c783b2a41c13f7de8ce96744401" integrity sha512-yr2BWR1yLXQ8fMpdS/4ZZXpseBgE7o4g41x3a6AJOqZuOi+iE/WdJYAuZ6Y95i4Ohd2Y+9MzIWRR+uGABH4s3Q== +canvas@^2.11.2: + version "2.11.2" + resolved "https://registry.yarnpkg.com/canvas/-/canvas-2.11.2.tgz#553d87b1e0228c7ac0fc72887c3adbac4abbd860" + integrity sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw== + dependencies: + "@mapbox/node-pre-gyp" "^1.0.0" + nan "^2.17.0" + simple-get "^3.0.3" + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -11127,7 +11145,7 @@ color-string@^1.6.0, color-string@^1.9.0: color-name "^1.0.0" simple-swizzle "^0.2.2" -color-support@^1.1.3: +color-support@^1.1.2, color-support@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== @@ -11363,7 +11381,7 @@ console-browserify@^1.1.0: resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== -console-control-strings@^1.1.0: +console-control-strings@^1.0.0, console-control-strings@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== @@ -11873,6 +11891,13 @@ cssstyle@^2.3.0: dependencies: cssom "~0.3.6" +cssstyle@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-4.0.1.tgz#ef29c598a1e90125c870525490ea4f354db0660a" + integrity sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ== + dependencies: + rrweb-cssom "^0.6.0" + csstype@^2.5.2: version "2.6.21" resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.21.tgz#2efb85b7cc55c80017c66a5ad7cbd931fda3a90e" @@ -12019,6 +12044,14 @@ data-urls@^3.0.2: whatwg-mimetype "^3.0.0" whatwg-url "^11.0.0" +data-urls@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-5.0.0.tgz#2f76906bce1824429ffecb6920f45a0b30f00dde" + integrity sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg== + dependencies: + whatwg-mimetype "^4.0.0" + whatwg-url "^14.0.0" + dataloader@^2.0.0, dataloader@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-2.2.2.tgz#216dc509b5abe39d43a9b9d97e6e5e473dfbe3e0" @@ -12075,7 +12108,7 @@ decamelize@^1.1.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== -decimal.js@^10.2.1, decimal.js@^10.4.2: +decimal.js@^10.2.1, decimal.js@^10.4.2, decimal.js@^10.4.3: version "10.4.3" resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== @@ -12092,6 +12125,13 @@ decode-uri-component@^0.2.2: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== +decompress-response@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986" + integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== + dependencies: + mimic-response "^2.0.0" + decompress-response@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" @@ -13936,6 +13976,21 @@ functions-have-names@^1.2.3: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== +gauge@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" + integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.2" + console-control-strings "^1.0.0" + has-unicode "^2.0.1" + object-assign "^4.1.1" + signal-exit "^3.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.2" + gauge@^4.0.3: version "4.0.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" @@ -14710,6 +14765,13 @@ html-encoding-sniffer@^3.0.0: dependencies: whatwg-encoding "^2.0.0" +html-encoding-sniffer@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz#696df529a7cfd82446369dc5193e590a3735b448" + integrity sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ== + dependencies: + whatwg-encoding "^3.1.1" + html-entities@^2.1.0, html-entities@^2.3.2: version "2.4.0" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.4.0.tgz#edd0cee70402584c8c76cc2c0556db09d1f45061" @@ -14874,6 +14936,14 @@ https-proxy-agent@^7.0.1: agent-base "^7.0.2" debug "4" +https-proxy-agent@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz#8e97b841a029ad8ddc8731f26595bad868cb4168" + integrity sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg== + dependencies: + agent-base "^7.0.2" + debug "4" + human-signals@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" @@ -16215,6 +16285,33 @@ jsdom@^20.0.0: ws "^8.11.0" xml-name-validator "^4.0.0" +jsdom@^24.0.0: + version "24.0.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-24.0.0.tgz#e2dc04e4c79da368481659818ee2b0cd7c39007c" + integrity sha512-UDS2NayCvmXSXVP6mpTj+73JnNQadZlr9N68189xib2tx5Mls7swlTNao26IoHv46BZJFvXygyRtyXd1feAk1A== + dependencies: + cssstyle "^4.0.1" + data-urls "^5.0.0" + decimal.js "^10.4.3" + form-data "^4.0.0" + html-encoding-sniffer "^4.0.0" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.2" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.7" + parse5 "^7.1.2" + rrweb-cssom "^0.6.0" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.1.3" + w3c-xmlserializer "^5.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^3.1.1" + whatwg-mimetype "^4.0.0" + whatwg-url "^14.0.0" + ws "^8.16.0" + xml-name-validator "^5.0.0" + jsep@^1.1.2, jsep@^1.2.0: version "1.3.8" resolved "https://registry.yarnpkg.com/jsep/-/jsep-1.3.8.tgz#facb6eb908d085d71d950bd2b24b757c7b8a46d7" @@ -17181,6 +17278,13 @@ make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" +make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + make-error@^1.1.1: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" @@ -17860,6 +17964,11 @@ mimic-response@^1.0.0: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== +mimic-response@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" + integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== + mimic-response@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" @@ -18431,6 +18540,13 @@ node-releases@^2.0.14: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" + nopt@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d" @@ -18611,6 +18727,16 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" +npmlog@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" + integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== + dependencies: + are-we-there-yet "^2.0.0" + console-control-strings "^1.1.0" + gauge "^3.0.0" + set-blocking "^2.0.0" + npmlog@^6.0.0, npmlog@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" @@ -18647,6 +18773,11 @@ nwsapi@^2.2.0, nwsapi@^2.2.2: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== +nwsapi@^2.2.7: + version "2.2.10" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.10.tgz#0b77a68e21a0b483db70b11fad055906e867cda8" + integrity sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ== + nx@16.10.0, "nx@>=16.5.1 < 17": version "16.10.0" resolved "https://registry.yarnpkg.com/nx/-/nx-16.10.0.tgz#b070461f7de0a3d7988bd78558ea84cda3543ace" @@ -19219,7 +19350,7 @@ parse5@6.0.1: resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== -parse5@^7.0.0, parse5@^7.1.1: +parse5@^7.0.0, parse5@^7.1.1, parse5@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== @@ -20201,7 +20332,7 @@ punycode@^1.2.4, punycode@^1.4.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== -punycode@^2.1.0, punycode@^2.1.1: +punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== @@ -21278,6 +21409,11 @@ rollup@^2.60.2: optionalDependencies: fsevents "~2.3.2" +rrweb-cssom@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz#ed298055b97cbddcdeb278f904857629dec5e0e1" + integrity sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw== + rtl-css-js@^1.16.1: version "1.16.1" resolved "https://registry.yarnpkg.com/rtl-css-js/-/rtl-css-js-1.16.1.tgz#4b48b4354b0ff917a30488d95100fbf7219a3e80" @@ -21461,7 +21597,7 @@ semver@7.5.3: dependencies: lru-cache "^6.0.0" -semver@^6.3.0, semver@^6.3.1: +semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== @@ -21642,7 +21778,7 @@ side-channel@^1.0.4: get-intrinsic "^1.2.4" object-inspect "^1.13.1" -signal-exit@3.0.7, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: +signal-exit@3.0.7, signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -21675,6 +21811,15 @@ simple-eval@1.0.0: dependencies: jsep "^1.1.2" +simple-get@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.1.tgz#cc7ba77cfbe761036fbfce3d021af25fc5584d55" + integrity sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA== + dependencies: + decompress-response "^4.2.0" + once "^1.3.1" + simple-concat "^1.0.0" + simple-get@^4.0.0, simple-get@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" @@ -22768,6 +22913,16 @@ tough-cookie@^4.0.0, tough-cookie@^4.1.2: universalify "^0.2.0" url-parse "^1.5.3" +tough-cookie@^4.1.3: + version "4.1.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" + integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + tough-cookie@~2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" @@ -22790,6 +22945,13 @@ tr46@^3.0.0: dependencies: punycode "^2.1.1" +tr46@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-5.0.0.tgz#3b46d583613ec7283020d79019f1335723801cec" + integrity sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g== + dependencies: + punycode "^2.3.1" + tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -23659,6 +23821,13 @@ w3c-xmlserializer@^4.0.0: dependencies: xml-name-validator "^4.0.0" +w3c-xmlserializer@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz#f925ba26855158594d907313cedd1476c5967f6c" + integrity sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA== + dependencies: + xml-name-validator "^5.0.0" + walker@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" @@ -23841,6 +24010,13 @@ whatwg-encoding@^2.0.0: dependencies: iconv-lite "0.6.3" +whatwg-encoding@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz#d0f4ef769905d426e1688f3e34381a99b60b76e5" + integrity sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ== + dependencies: + iconv-lite "0.6.3" + whatwg-mimetype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" @@ -23851,6 +24027,11 @@ whatwg-mimetype@^3.0.0: resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== +whatwg-mimetype@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz#bc1bf94a985dc50388d54a9258ac405c3ca2fc0a" + integrity sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg== + whatwg-url@^11.0.0: version "11.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" @@ -23859,6 +24040,14 @@ whatwg-url@^11.0.0: tr46 "^3.0.0" webidl-conversions "^7.0.0" +whatwg-url@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-14.0.0.tgz#00baaa7fd198744910c4b1ef68378f2200e4ceb6" + integrity sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw== + dependencies: + tr46 "^5.0.0" + webidl-conversions "^7.0.0" + whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" @@ -23954,7 +24143,7 @@ which@^4.0.0: dependencies: isexe "^3.1.1" -wide-align@^1.1.5: +wide-align@^1.1.2, wide-align@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== @@ -24085,6 +24274,11 @@ ws@^8.11.0, ws@^8.12.0, ws@^8.13.0, ws@^8.15.0: resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4" integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== +ws@^8.16.0: + version "8.17.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.0.tgz#d145d18eca2ed25aaf791a183903f7be5e295fea" + integrity sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow== + xcase@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/xcase/-/xcase-2.0.1.tgz#c7fa72caa0f440db78fd5673432038ac984450b9" @@ -24124,6 +24318,11 @@ xml-name-validator@^4.0.0: resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== +xml-name-validator@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-5.0.0.tgz#82be9b957f7afdacf961e5980f1bf227c0bf7673" + integrity sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg== + xml2js@^0.4.23: version "0.4.23" resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" From ec076f5a755ca15364f06d0f3c85e703a2e54436 Mon Sep 17 00:00:00 2001 From: Menna Tullah Magdy Taha Date: Tue, 14 May 2024 20:28:35 +0200 Subject: [PATCH 11/11] UPD: removed env variable email domain as it was breaking the workflow --- .../backend/src/plugins/plugins_helper/googleAuthResolver.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/backend/src/plugins/plugins_helper/googleAuthResolver.ts b/packages/backend/src/plugins/plugins_helper/googleAuthResolver.ts index 6c7f9b0..58fe66d 100644 --- a/packages/backend/src/plugins/plugins_helper/googleAuthResolver.ts +++ b/packages/backend/src/plugins/plugins_helper/googleAuthResolver.ts @@ -2,12 +2,9 @@ import { stringifyEntityRef, DEFAULT_NAMESPACE, } from '@backstage/catalog-model'; -import dotenv from 'dotenv'; import { OAuthResult } from '@backstage/plugin-auth-backend'; import { SignInInfo, AuthResolverContext } from '@backstage/plugin-auth-node'; -dotenv.config(); - export const resolverResult = async ( profile_input: SignInInfo, ctx: AuthResolverContext, @@ -25,7 +22,7 @@ export const resolverResult = async ( const [localPart, domain] = profile.email.split('@'); - if (domain !== process.env.EMAIL_DOMAIN) { + if (domain !== 'code.berlin') { throw new Error(`Login failed due to incorrect email domain.`); }