From 1c1718857e3083e1fbeff1450c46cecba542dc65 Mon Sep 17 00:00:00 2001 From: Heikki Hellgren Date: Wed, 17 Apr 2024 18:16:47 +0300 Subject: [PATCH] fix: use credentials manager instead config Signed-off-by: Heikki Hellgren --- .../config.d.ts | 13 +- .../package.json | 5 +- .../NotificationsEmailProcessor.test.ts | 48 ++- .../processor/NotificationsEmailProcessor.ts | 86 +++--- .../src/processor/transports/ses.ts | 24 +- .../src/types.ts | 17 +- yarn.lock | 273 +++++++++++++++++- 7 files changed, 381 insertions(+), 85 deletions(-) diff --git a/plugins/notifications-backend-module-email/config.d.ts b/plugins/notifications-backend-module-email/config.d.ts index 503d381161..fff78f735f 100644 --- a/plugins/notifications-backend-module-email/config.d.ts +++ b/plugins/notifications-backend-module-email/config.d.ts @@ -58,18 +58,9 @@ export interface Config { */ apiVersion?: string; /** - * SES region to use + * AWS account ID to use */ - region?: string; - /** - * AWS access key id - */ - accessKeyId?: string; - /** - * AWS secret access key - * @visibility secret - */ - secretAccessKey?: string; + accountId?: string; } | { transport: 'sendmail'; diff --git a/plugins/notifications-backend-module-email/package.json b/plugins/notifications-backend-module-email/package.json index 0a5bf4ffa2..345ba162b6 100644 --- a/plugins/notifications-backend-module-email/package.json +++ b/plugins/notifications-backend-module-email/package.json @@ -32,13 +32,14 @@ "test": "backstage-cli package test" }, "dependencies": { - "@aws-sdk/client-ses": "^3.556.0", - "@aws-sdk/credential-provider-node": "^3.350.0", + "@aws-sdk/client-ses": "3.554.0", + "@aws-sdk/types": "^3.347.0", "@backstage/backend-common": "workspace:^", "@backstage/backend-plugin-api": "workspace:^", "@backstage/catalog-client": "workspace:^", "@backstage/catalog-model": "workspace:^", "@backstage/config": "workspace:^", + "@backstage/integration-aws-node": "workspace:^", "@backstage/plugin-notifications-common": "workspace:^", "@backstage/plugin-notifications-node": "workspace:^", "@backstage/types": "workspace:^", diff --git a/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.test.ts b/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.test.ts index 13e1e912d8..72d1113eb1 100644 --- a/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.test.ts +++ b/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.test.ts @@ -45,7 +45,7 @@ describe('NotificationsEmailProcessor', () => { jest.resetAllMocks(); }); - it('should create smtp transport', () => { + it('should create smtp transport', async () => { const processor = new NotificationsEmailProcessor( logger, new ConfigReader({ @@ -66,6 +66,20 @@ describe('NotificationsEmailProcessor', () => { auth, ); + await processor.postProcess( + { + origin: 'plugin', + id: '1234', + user: 'user:default/mock', + created: new Date(), + payload: { title: 'notification' }, + }, + { + recipients: { type: 'entity', entityRef: 'user:default/mock' }, + payload: { title: 'notification' }, + }, + ); + expect(processor).toBeInstanceOf(NotificationsEmailProcessor); expect(createTransport as jest.Mock).toHaveBeenCalledWith({ host: 'localhost', @@ -75,7 +89,7 @@ describe('NotificationsEmailProcessor', () => { }); }); - it('should create ses transport', () => { + it('should create ses transport', async () => { const processor = new NotificationsEmailProcessor( logger, new ConfigReader({ @@ -93,13 +107,27 @@ describe('NotificationsEmailProcessor', () => { auth, ); + await processor.postProcess( + { + origin: 'plugin', + id: '1234', + user: 'user:default/mock', + created: new Date(), + payload: { title: 'notification' }, + }, + { + recipients: { type: 'entity', entityRef: 'user:default/mock' }, + payload: { title: 'notification' }, + }, + ); + expect(processor).toBeInstanceOf(NotificationsEmailProcessor); expect(createTransport as jest.Mock).toHaveBeenCalledWith({ SES: expect.anything(), }); }); - it('should create sendmail transport', () => { + it('should create sendmail transport', async () => { const processor = new NotificationsEmailProcessor( logger, new ConfigReader({ @@ -117,6 +145,20 @@ describe('NotificationsEmailProcessor', () => { auth, ); + await processor.postProcess( + { + origin: 'plugin', + id: '1234', + user: 'user:default/mock', + created: new Date(), + payload: { title: 'notification' }, + }, + { + recipients: { type: 'entity', entityRef: 'user:default/mock' }, + payload: { title: 'notification' }, + }, + ); + expect(processor).toBeInstanceOf(NotificationsEmailProcessor); expect(createTransport as jest.Mock).toHaveBeenCalledWith({ sendmail: true, diff --git a/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.ts b/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.ts index 8cf28917d5..8150aeebe6 100644 --- a/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.ts +++ b/plugins/notifications-backend-module-email/src/processor/NotificationsEmailProcessor.ts @@ -33,9 +33,10 @@ import { createSendmailTransport, createSmtpTransport } from './transports'; import { createSesTransport } from './transports/ses'; import { UserEntity } from '@backstage/catalog-model'; import { compact } from 'lodash'; +import { DefaultAwsCredentialsManager } from '@backstage/integration-aws-node'; export class NotificationsEmailProcessor implements NotificationProcessor { - private readonly transportter: any; + private transporter: any; private readonly broadcastConfig?: Config; private readonly sender: string; private readonly format: string; @@ -44,41 +45,11 @@ export class NotificationsEmailProcessor implements NotificationProcessor { constructor( private readonly logger: LoggerService, - config: Config, + private readonly config: Config, private readonly catalog: CatalogClient, private readonly auth: AuthService, private readonly cache?: CacheService, ) { - const transportConfig = config.getConfig('notifications.email.transport'); - const transport = transportConfig.getString('transport'); - if (transport === 'smtp') { - this.transportter = createSmtpTransport({ - transport: 'smtp', - hostname: transportConfig.getString('hostname'), - port: transportConfig.getNumber('port'), - secure: transportConfig.getOptionalBoolean('secure'), - requireTls: transportConfig.getOptionalBoolean('requireTls'), - username: transportConfig.getOptionalString('username'), - password: transportConfig.getOptionalString('password'), - }); - } else if (transport === 'ses') { - this.transportter = createSesTransport({ - transport: 'ses', - apiVersion: transportConfig.getOptionalString('apiVersion'), - region: transportConfig.getOptionalString('region'), - accessKeyId: transportConfig.getOptionalString('accessKeyId'), - secretAccessKey: transportConfig.getOptionalString('secretAccessKey'), - }); - } else if (transport === 'sendmail') { - this.transportter = createSendmailTransport({ - transport: 'sendmail', - path: transportConfig.getOptionalString('path'), - newline: transportConfig.getOptionalString('newline'), - }); - } else { - throw new Error(`Unsupported transport: ${transport}`); - } - this.broadcastConfig = config.getOptionalConfig( 'notifications.email.broadcastConfig', ); @@ -90,6 +61,46 @@ export class NotificationsEmailProcessor implements NotificationProcessor { config.getOptionalNumber('notifications.email.cacheTtl') ?? 3_600_000; } + private async getTransporter() { + if (this.transporter) { + return this.transporter; + } + const transportConfig = this.config.getConfig( + 'notifications.email.transport', + ); + const transport = transportConfig.getString('transport'); + if (transport === 'smtp') { + this.transporter = createSmtpTransport({ + transport: 'smtp', + hostname: transportConfig.getString('hostname'), + port: transportConfig.getNumber('port'), + secure: transportConfig.getOptionalBoolean('secure'), + requireTls: transportConfig.getOptionalBoolean('requireTls'), + username: transportConfig.getOptionalString('username'), + password: transportConfig.getOptionalString('password'), + }); + } else if (transport === 'ses') { + const awsCredentialsManager = DefaultAwsCredentialsManager.fromConfig( + this.config, + ); + this.transporter = await createSesTransport({ + transport: 'ses', + credentialsManager: awsCredentialsManager, + apiVersion: transportConfig.getOptionalString('apiVersion'), + accountId: transportConfig.getOptionalString('accountId'), + }); + } else if (transport === 'sendmail') { + this.transporter = createSendmailTransport({ + transport: 'sendmail', + path: transportConfig.getOptionalString('path'), + newline: transportConfig.getOptionalString('newline'), + }); + } else { + throw new Error(`Unsupported transport: ${transport}`); + } + return this.transporter; + } + getName(): string { return 'Email'; } @@ -190,6 +201,8 @@ export class NotificationsEmailProcessor implements NotificationProcessor { notification: Notification, options: NotificationSendOptions, ): Promise { + this.transporter = await this.getTransporter(); + let emails: string[] = []; try { emails = await this.getRecipientEmails(notification, options); @@ -198,6 +211,13 @@ export class NotificationsEmailProcessor implements NotificationProcessor { return; } + if (emails.length === 0) { + this.logger.info( + `No email recipients found for notification: ${notification.id}, skipping`, + ); + return; + } + // TODO: add template support for content either HTML or text const contentParts: string[] = []; if (notification.payload.description) { @@ -220,7 +240,7 @@ export class NotificationsEmailProcessor implements NotificationProcessor { for (const email of emails) { try { - await this.transportter.sendMail({ ...mailOptions, to: email }); + await this.transporter.sendMail({ ...mailOptions, to: email }); } catch (e) { this.logger.error(`Failed to send email to ${email}: ${e}`); } diff --git a/plugins/notifications-backend-module-email/src/processor/transports/ses.ts b/plugins/notifications-backend-module-email/src/processor/transports/ses.ts index 739a3167ab..7073cc08b2 100644 --- a/plugins/notifications-backend-module-email/src/processor/transports/ses.ts +++ b/plugins/notifications-backend-module-email/src/processor/transports/ses.ts @@ -15,25 +15,21 @@ */ import { SesTransportConfig } from '../../types'; import { createTransport } from 'nodemailer'; -import * as aws from '@aws-sdk/client-ses'; -import { defaultProvider } from '@aws-sdk/credential-provider-node'; +import { SendRawEmailCommand, SES } from '@aws-sdk/client-ses'; -export const createSesTransport = (config: SesTransportConfig) => { - const ses = new aws.SES([ +export const createSesTransport = async (config: SesTransportConfig) => { + const credentials = await config.credentialsManager.getCredentialProvider({ + accountId: config.accountId, + }); + const ses = new SES([ { - region: config.region, apiVersion: config.apiVersion ?? '2010-12-01', - defaultProvider, - credentials: - config.accessKeyId && config.secretAccessKey - ? { - accessKeyId: config.accessKeyId, - secretAccessKey: config.secretAccessKey, - } - : undefined, + credentials: credentials.sdkCredentialProvider, + region: credentials.stsRegion, + accountId: credentials.accountId, }, ]); return createTransport({ - SES: { ses, aws }, + SES: { ses, aws: { SendRawEmailCommand } }, }); }; diff --git a/plugins/notifications-backend-module-email/src/types.ts b/plugins/notifications-backend-module-email/src/types.ts index 6dd6ae9d76..67c7a1740d 100644 --- a/plugins/notifications-backend-module-email/src/types.ts +++ b/plugins/notifications-backend-module-email/src/types.ts @@ -13,6 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import { AwsCredentialsManager } from '@backstage/integration-aws-node'; + export interface TransportConfig { transport: 'smtp' | 'ses' | 'sendmail'; } @@ -52,19 +54,8 @@ export interface SesTransportConfig extends TransportConfig { * SES ApiVersion to use, defaults to 2010-12-01 */ apiVersion?: string; - /** - * SES region to use - */ - region?: string; - /** - * AWS access key id - */ - accessKeyId?: string; - /** - * AWS secret access key - * @visibility secret - */ - secretAccessKey?: string; + accountId?: string; + credentialsManager: AwsCredentialsManager; } export interface SendmailTransportConfig extends TransportConfig { diff --git a/yarn.lock b/yarn.lock index a0f16fa1ab..94ba875fae 100644 --- a/yarn.lock +++ b/yarn.lock @@ -599,15 +599,15 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/client-ses@npm:^3.556.0": - version: 3.556.0 - resolution: "@aws-sdk/client-ses@npm:3.556.0" +"@aws-sdk/client-ses@npm:3.554.0": + version: 3.554.0 + resolution: "@aws-sdk/client-ses@npm:3.554.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.556.0 - "@aws-sdk/core": 3.556.0 - "@aws-sdk/credential-provider-node": 3.556.0 + "@aws-sdk/client-sts": 3.554.0 + "@aws-sdk/core": 3.554.0 + "@aws-sdk/credential-provider-node": 3.554.0 "@aws-sdk/middleware-host-header": 3.535.0 "@aws-sdk/middleware-logger": 3.535.0 "@aws-sdk/middleware-recursion-detection": 3.535.0 @@ -644,7 +644,7 @@ __metadata: "@smithy/util-utf8": ^2.3.0 "@smithy/util-waiter": ^2.2.0 tslib: ^2.6.2 - checksum: 913108e79061185faae51711b121df99da624f988f530af23c3e4270299be60771be83f507dc8ed4af4051765077ea038edab19e4d0d32e159c4e67faf5fc9f8 + checksum: 14512aac8bd84a69066535580bd739509a5698a64be78b111fd9656f4a01f4921c016b0c22c8b103261370d9e75ba3c6301cc652b47e396e421b8b02f93334ce languageName: node linkType: hard @@ -698,6 +698,55 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/client-sso-oidc@npm:3.554.0": + version: 3.554.0 + resolution: "@aws-sdk/client-sso-oidc@npm:3.554.0" + dependencies: + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/client-sts": 3.554.0 + "@aws-sdk/core": 3.554.0 + "@aws-sdk/middleware-host-header": 3.535.0 + "@aws-sdk/middleware-logger": 3.535.0 + "@aws-sdk/middleware-recursion-detection": 3.535.0 + "@aws-sdk/middleware-user-agent": 3.540.0 + "@aws-sdk/region-config-resolver": 3.535.0 + "@aws-sdk/types": 3.535.0 + "@aws-sdk/util-endpoints": 3.540.0 + "@aws-sdk/util-user-agent-browser": 3.535.0 + "@aws-sdk/util-user-agent-node": 3.535.0 + "@smithy/config-resolver": ^2.2.0 + "@smithy/core": ^1.4.2 + "@smithy/fetch-http-handler": ^2.5.0 + "@smithy/hash-node": ^2.2.0 + "@smithy/invalid-dependency": ^2.2.0 + "@smithy/middleware-content-length": ^2.2.0 + "@smithy/middleware-endpoint": ^2.5.1 + "@smithy/middleware-retry": ^2.3.1 + "@smithy/middleware-serde": ^2.3.0 + "@smithy/middleware-stack": ^2.2.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/node-http-handler": ^2.5.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/smithy-client": ^2.5.1 + "@smithy/types": ^2.12.0 + "@smithy/url-parser": ^2.2.0 + "@smithy/util-base64": ^2.3.0 + "@smithy/util-body-length-browser": ^2.2.0 + "@smithy/util-body-length-node": ^2.3.0 + "@smithy/util-defaults-mode-browser": ^2.2.1 + "@smithy/util-defaults-mode-node": ^2.3.1 + "@smithy/util-endpoints": ^1.2.0 + "@smithy/util-middleware": ^2.2.0 + "@smithy/util-retry": ^2.2.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 + peerDependencies: + "@aws-sdk/credential-provider-node": ^3.554.0 + checksum: 91d0f6b8c5c787e2b705803d615f9400430ea0bca9d12171a5e7abe5c53cd83f711300e5c0a106dc4f1f1259adf08f87b728f9820679aa5ca73cd66a09bf8dd4 + languageName: node + linkType: hard + "@aws-sdk/client-sso-oidc@npm:3.556.0": version: 3.556.0 resolution: "@aws-sdk/client-sso-oidc@npm:3.556.0" @@ -747,6 +796,52 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/client-sso@npm:3.554.0": + version: 3.554.0 + resolution: "@aws-sdk/client-sso@npm:3.554.0" + dependencies: + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/core": 3.554.0 + "@aws-sdk/middleware-host-header": 3.535.0 + "@aws-sdk/middleware-logger": 3.535.0 + "@aws-sdk/middleware-recursion-detection": 3.535.0 + "@aws-sdk/middleware-user-agent": 3.540.0 + "@aws-sdk/region-config-resolver": 3.535.0 + "@aws-sdk/types": 3.535.0 + "@aws-sdk/util-endpoints": 3.540.0 + "@aws-sdk/util-user-agent-browser": 3.535.0 + "@aws-sdk/util-user-agent-node": 3.535.0 + "@smithy/config-resolver": ^2.2.0 + "@smithy/core": ^1.4.2 + "@smithy/fetch-http-handler": ^2.5.0 + "@smithy/hash-node": ^2.2.0 + "@smithy/invalid-dependency": ^2.2.0 + "@smithy/middleware-content-length": ^2.2.0 + "@smithy/middleware-endpoint": ^2.5.1 + "@smithy/middleware-retry": ^2.3.1 + "@smithy/middleware-serde": ^2.3.0 + "@smithy/middleware-stack": ^2.2.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/node-http-handler": ^2.5.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/smithy-client": ^2.5.1 + "@smithy/types": ^2.12.0 + "@smithy/url-parser": ^2.2.0 + "@smithy/util-base64": ^2.3.0 + "@smithy/util-body-length-browser": ^2.2.0 + "@smithy/util-body-length-node": ^2.3.0 + "@smithy/util-defaults-mode-browser": ^2.2.1 + "@smithy/util-defaults-mode-node": ^2.3.1 + "@smithy/util-endpoints": ^1.2.0 + "@smithy/util-middleware": ^2.2.0 + "@smithy/util-retry": ^2.2.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 + checksum: 08dbaca87bb25d7662a2e856dca16f92bc461b9cf50e048c679969df93189f653c2bc74c8be1ac3e82e720d2742fc81af554a04f0ebf83353c1fa6e30fdbbecf + languageName: node + linkType: hard + "@aws-sdk/client-sso@npm:3.556.0": version: 3.556.0 resolution: "@aws-sdk/client-sso@npm:3.556.0" @@ -793,6 +888,54 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/client-sts@npm:3.554.0": + version: 3.554.0 + resolution: "@aws-sdk/client-sts@npm:3.554.0" + dependencies: + "@aws-crypto/sha256-browser": 3.0.0 + "@aws-crypto/sha256-js": 3.0.0 + "@aws-sdk/core": 3.554.0 + "@aws-sdk/middleware-host-header": 3.535.0 + "@aws-sdk/middleware-logger": 3.535.0 + "@aws-sdk/middleware-recursion-detection": 3.535.0 + "@aws-sdk/middleware-user-agent": 3.540.0 + "@aws-sdk/region-config-resolver": 3.535.0 + "@aws-sdk/types": 3.535.0 + "@aws-sdk/util-endpoints": 3.540.0 + "@aws-sdk/util-user-agent-browser": 3.535.0 + "@aws-sdk/util-user-agent-node": 3.535.0 + "@smithy/config-resolver": ^2.2.0 + "@smithy/core": ^1.4.2 + "@smithy/fetch-http-handler": ^2.5.0 + "@smithy/hash-node": ^2.2.0 + "@smithy/invalid-dependency": ^2.2.0 + "@smithy/middleware-content-length": ^2.2.0 + "@smithy/middleware-endpoint": ^2.5.1 + "@smithy/middleware-retry": ^2.3.1 + "@smithy/middleware-serde": ^2.3.0 + "@smithy/middleware-stack": ^2.2.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/node-http-handler": ^2.5.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/smithy-client": ^2.5.1 + "@smithy/types": ^2.12.0 + "@smithy/url-parser": ^2.2.0 + "@smithy/util-base64": ^2.3.0 + "@smithy/util-body-length-browser": ^2.2.0 + "@smithy/util-body-length-node": ^2.3.0 + "@smithy/util-defaults-mode-browser": ^2.2.1 + "@smithy/util-defaults-mode-node": ^2.3.1 + "@smithy/util-endpoints": ^1.2.0 + "@smithy/util-middleware": ^2.2.0 + "@smithy/util-retry": ^2.2.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 + peerDependencies: + "@aws-sdk/credential-provider-node": ^3.554.0 + checksum: dee932b55e89f9b68275d21861f534ae1cdf006410841fe84bab38df12253ebafd4928e440d6243391c3234f2509b943628c5368d2bcd0489ea240464d65edc6 + languageName: node + linkType: hard + "@aws-sdk/client-sts@npm:3.556.0, @aws-sdk/client-sts@npm:^3.350.0": version: 3.556.0 resolution: "@aws-sdk/client-sts@npm:3.556.0" @@ -841,6 +984,21 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/core@npm:3.554.0": + version: 3.554.0 + resolution: "@aws-sdk/core@npm:3.554.0" + dependencies: + "@smithy/core": ^1.4.2 + "@smithy/protocol-http": ^3.3.0 + "@smithy/signature-v4": ^2.2.1 + "@smithy/smithy-client": ^2.5.1 + "@smithy/types": ^2.12.0 + fast-xml-parser: 4.2.5 + tslib: ^2.6.2 + checksum: 61e48deee6146aa92fca14f787dfcfe1ef91e0b9feda897d375174643071119aa5b0d51185f9a23843a8aaa82372187af4bb6aa9489e20b1fc651c1734592b40 + languageName: node + linkType: hard + "@aws-sdk/core@npm:3.556.0": version: 3.556.0 resolution: "@aws-sdk/core@npm:3.556.0" @@ -898,6 +1056,25 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-ini@npm:3.554.0": + version: 3.554.0 + resolution: "@aws-sdk/credential-provider-ini@npm:3.554.0" + dependencies: + "@aws-sdk/client-sts": 3.554.0 + "@aws-sdk/credential-provider-env": 3.535.0 + "@aws-sdk/credential-provider-process": 3.535.0 + "@aws-sdk/credential-provider-sso": 3.554.0 + "@aws-sdk/credential-provider-web-identity": 3.554.0 + "@aws-sdk/types": 3.535.0 + "@smithy/credential-provider-imds": ^2.3.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/shared-ini-file-loader": ^2.4.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 5b93ba3d3cf98cd0738b871db1036303ab0b05538171a650168aefc0071a1e51e4bbd0b88d06047b6170fbf20417069beb29d8f71cae13d87c4e17c736a5a252 + languageName: node + linkType: hard + "@aws-sdk/credential-provider-ini@npm:3.556.0": version: 3.556.0 resolution: "@aws-sdk/credential-provider-ini@npm:3.556.0" @@ -917,6 +1094,26 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-node@npm:3.554.0": + version: 3.554.0 + resolution: "@aws-sdk/credential-provider-node@npm:3.554.0" + dependencies: + "@aws-sdk/credential-provider-env": 3.535.0 + "@aws-sdk/credential-provider-http": 3.552.0 + "@aws-sdk/credential-provider-ini": 3.554.0 + "@aws-sdk/credential-provider-process": 3.535.0 + "@aws-sdk/credential-provider-sso": 3.554.0 + "@aws-sdk/credential-provider-web-identity": 3.554.0 + "@aws-sdk/types": 3.535.0 + "@smithy/credential-provider-imds": ^2.3.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/shared-ini-file-loader": ^2.4.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: b8dfbbace2c279792934057de6879d47fb95b5c068aed0938f5c104b79034982b04e34739dba78274c9fabaf97f6079a9938ff3b01765fc3042b15abbf273190 + languageName: node + linkType: hard + "@aws-sdk/credential-provider-node@npm:3.556.0, @aws-sdk/credential-provider-node@npm:^3.350.0": version: 3.556.0 resolution: "@aws-sdk/credential-provider-node@npm:3.556.0" @@ -950,6 +1147,21 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-sso@npm:3.554.0": + version: 3.554.0 + resolution: "@aws-sdk/credential-provider-sso@npm:3.554.0" + dependencies: + "@aws-sdk/client-sso": 3.554.0 + "@aws-sdk/token-providers": 3.554.0 + "@aws-sdk/types": 3.535.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/shared-ini-file-loader": ^2.4.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 0665748fce2ef6c4572570be35af31a55cee3fa3be49ef7a15be9e25ac54d3528c5a0b82c9672b7e147a9114525aeef7d9bb2a9270ef3d3e09de91d940da3779 + languageName: node + linkType: hard + "@aws-sdk/credential-provider-sso@npm:3.556.0": version: 3.556.0 resolution: "@aws-sdk/credential-provider-sso@npm:3.556.0" @@ -965,6 +1177,19 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-web-identity@npm:3.554.0": + version: 3.554.0 + resolution: "@aws-sdk/credential-provider-web-identity@npm:3.554.0" + dependencies: + "@aws-sdk/client-sts": 3.554.0 + "@aws-sdk/types": 3.535.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: e47772ca693bb2a0b02a1bf1b7ce288fd141510e944145d3188f532feffa3f7511f037ed5203c581764ab9d397c358c63baf28f3cf96bbce98c303ed7b9f1a2a + languageName: node + linkType: hard + "@aws-sdk/credential-provider-web-identity@npm:3.556.0": version: 3.556.0 resolution: "@aws-sdk/credential-provider-web-identity@npm:3.556.0" @@ -1310,6 +1535,20 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/token-providers@npm:3.554.0": + version: 3.554.0 + resolution: "@aws-sdk/token-providers@npm:3.554.0" + dependencies: + "@aws-sdk/client-sso-oidc": 3.554.0 + "@aws-sdk/types": 3.535.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/shared-ini-file-loader": ^2.4.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: ff6e13ab91ac9d5e0f7de8673a16b541b41dc445c7ec3dae66d85e47514c808ed059af4702156b437c4d2a510d378a83662ee988a853cdf2625cde886fe962cb + languageName: node + linkType: hard + "@aws-sdk/token-providers@npm:3.556.0": version: 3.556.0 resolution: "@aws-sdk/token-providers@npm:3.556.0" @@ -6035,8 +6274,8 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/plugin-notifications-backend-module-email@workspace:plugins/notifications-backend-module-email" dependencies: - "@aws-sdk/client-ses": ^3.556.0 - "@aws-sdk/credential-provider-node": ^3.350.0 + "@aws-sdk/client-ses": 3.554.0 + "@aws-sdk/types": ^3.347.0 "@backstage/backend-common": "workspace:^" "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-test-utils": "workspace:^" @@ -6044,6 +6283,7 @@ __metadata: "@backstage/catalog-model": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" + "@backstage/integration-aws-node": "workspace:^" "@backstage/plugin-notifications-common": "workspace:^" "@backstage/plugin-notifications-node": "workspace:^" "@backstage/types": "workspace:^" @@ -13553,6 +13793,21 @@ __metadata: languageName: node linkType: hard +"@smithy/signature-v4@npm:^2.2.1": + version: 2.2.1 + resolution: "@smithy/signature-v4@npm:2.2.1" + dependencies: + "@smithy/is-array-buffer": ^2.2.0 + "@smithy/types": ^2.12.0 + "@smithy/util-hex-encoding": ^2.2.0 + "@smithy/util-middleware": ^2.2.0 + "@smithy/util-uri-escape": ^2.2.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 + checksum: 8e44f2acfff8dd690396d93a86655291b344f35ed9f82755433982cf045c69513298935e54aa3a25354d33a167ba4fdf27067486003261a1ba9edcf58f6f9bef + languageName: node + linkType: hard + "@smithy/signature-v4@npm:^2.3.0": version: 2.3.0 resolution: "@smithy/signature-v4@npm:2.3.0"