diff --git a/backend/src/services/app-connection/heroku/heroku-connection-fns.ts b/backend/src/services/app-connection/heroku/heroku-connection-fns.ts index 1f234fab7..dfb6f1e4b 100644 --- a/backend/src/services/app-connection/heroku/heroku-connection-fns.ts +++ b/backend/src/services/app-connection/heroku/heroku-connection-fns.ts @@ -86,7 +86,7 @@ export const refreshHerokuToken = async ( credentials: { refreshToken, authToken: data.access_token, - expiresAt: new Date(Date.now() + data.expires_in) + expiresAt: new Date(Date.now() + data.expires_in - 60) }, orgId, kmsService diff --git a/backend/src/services/app-connection/heroku/heroku-connection-schemas.ts b/backend/src/services/app-connection/heroku/heroku-connection-schemas.ts index 13d7d5989..57f992eea 100644 --- a/backend/src/services/app-connection/heroku/heroku-connection-schemas.ts +++ b/backend/src/services/app-connection/heroku/heroku-connection-schemas.ts @@ -19,8 +19,8 @@ export const HerokuConnectionOAuthCredentialsSchema = z.object({ }); export const HerokuConnectionOAuthOutputCredentialsSchema = z.object({ - authToken: z.string(), - refreshToken: z.string(), + authToken: z.string().trim(), + refreshToken: z.string().trim(), expiresAt: z.date() }); diff --git a/backend/src/services/app-connection/heroku/heroku-connection-service.ts b/backend/src/services/app-connection/heroku/heroku-connection-service.ts index 3b1b01d81..4b91adc0d 100644 --- a/backend/src/services/app-connection/heroku/heroku-connection-service.ts +++ b/backend/src/services/app-connection/heroku/heroku-connection-service.ts @@ -22,10 +22,9 @@ export const herokuConnectionService = ( const appConnection = await getAppConnection(AppConnection.Heroku, connectionId, actor); try { const apps = await getHerokuApps({ appConnection, appConnectionDAL, kmsService }); - // eslint-disable-next-line @typescript-eslint/no-unsafe-return return apps; } catch (error) { - logger.error(error, "Failed to establish connection with Heroku"); + logger.error(error, `Failed to establish connection with Heroku for app ${connectionId}`); return []; } }; diff --git a/backend/src/services/secret-sync/heroku/heroku-sync-fns.ts b/backend/src/services/secret-sync/heroku/heroku-sync-fns.ts index 1de000e17..a19578f50 100644 --- a/backend/src/services/secret-sync/heroku/heroku-sync-fns.ts +++ b/backend/src/services/secret-sync/heroku/heroku-sync-fns.ts @@ -41,12 +41,15 @@ const getValidAuthToken = async ( }; const getHerokuConfigVars = async ({ authToken, app }: THerokuListVariables): Promise => { - const { data } = await request.get(`${IntegrationUrls.HEROKU_API_URL}/apps/${app}/config-vars`, { - headers: { - Authorization: `Bearer ${authToken}`, - Accept: "application/vnd.heroku+json; version=3" + const { data } = await request.get( + `${IntegrationUrls.HEROKU_API_URL}/apps/${encodeURIComponent(app)}/config-vars`, + { + headers: { + Authorization: `Bearer ${authToken}`, + Accept: "application/vnd.heroku+json; version=3" + } } - }); + ); return data; }; diff --git a/docs/integrations/secret-syncs/heroku.mdx b/docs/integrations/secret-syncs/heroku.mdx index d2d52b6b0..e62b5df9e 100644 --- a/docs/integrations/secret-syncs/heroku.mdx +++ b/docs/integrations/secret-syncs/heroku.mdx @@ -82,7 +82,7 @@ description: "Learn how to configure a Heroku Sync for Infisical." }, "destinationConfig": { "app": "8dd25736052a4b50", - "appName": "my-app", + "appName": "my-app" } }' ``` @@ -114,7 +114,8 @@ description: "Learn how to configure a Heroku Sync for Infisical." "lastRemoveMessage": null, "lastRemovedAt": null, "syncOptions": { - "initialSyncBehavior": "overwrite-destination" + "initialSyncBehavior": "overwrite-destination", + "disableSecretDeletion": true }, "projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "connection": { diff --git a/frontend/src/components/secret-syncs/forms/SecretSyncDestinationFields/HerokuSyncFields.tsx b/frontend/src/components/secret-syncs/forms/SecretSyncDestinationFields/HerokuSyncFields.tsx index 008e19d35..6ceb94b3f 100644 --- a/frontend/src/components/secret-syncs/forms/SecretSyncDestinationFields/HerokuSyncFields.tsx +++ b/frontend/src/components/secret-syncs/forms/SecretSyncDestinationFields/HerokuSyncFields.tsx @@ -27,6 +27,7 @@ export const HerokuSyncFields = () => { { setValue("destinationConfig.app", ""); + setValue("destinationConfig.appName", ""); }} /> diff --git a/frontend/src/components/secret-syncs/forms/schemas/heroku-destination-schema.ts b/frontend/src/components/secret-syncs/forms/schemas/heroku-sync-destination-schema.ts similarity index 100% rename from frontend/src/components/secret-syncs/forms/schemas/heroku-destination-schema.ts rename to frontend/src/components/secret-syncs/forms/schemas/heroku-sync-destination-schema.ts diff --git a/frontend/src/components/secret-syncs/forms/schemas/secret-sync-schema.ts b/frontend/src/components/secret-syncs/forms/schemas/secret-sync-schema.ts index 6002e4d2e..381ddac8e 100644 --- a/frontend/src/components/secret-syncs/forms/schemas/secret-sync-schema.ts +++ b/frontend/src/components/secret-syncs/forms/schemas/secret-sync-schema.ts @@ -11,7 +11,7 @@ import { DatabricksSyncDestinationSchema } from "./databricks-sync-destination-s import { GcpSyncDestinationSchema } from "./gcp-sync-destination-schema"; import { GitHubSyncDestinationSchema } from "./github-sync-destination-schema"; import { HCVaultSyncDestinationSchema } from "./hc-vault-sync-destination-schema"; -import { HerokuSyncDestinationSchema } from "./heroku-destination-schema"; +import { HerokuSyncDestinationSchema } from "./heroku-sync-destination-schema"; import { HumanitecSyncDestinationSchema } from "./humanitec-sync-destination-schema"; import { OCIVaultSyncDestinationSchema } from "./oci-vault-sync-destination-schema"; import { TeamCitySyncDestinationSchema } from "./teamcity-sync-destination-schema"; diff --git a/frontend/src/pages/organization/AppConnections/AppConnectionsPage/components/AppConnectionForm/HerokuAppConnectionForm.tsx b/frontend/src/pages/organization/AppConnections/AppConnectionsPage/components/AppConnectionForm/HerokuAppConnectionForm.tsx index c464e866e..a7ab5e70c 100644 --- a/frontend/src/pages/organization/AppConnections/AppConnectionsPage/components/AppConnectionForm/HerokuAppConnectionForm.tsx +++ b/frontend/src/pages/organization/AppConnections/AppConnectionsPage/components/AppConnectionForm/HerokuAppConnectionForm.tsx @@ -113,7 +113,7 @@ export const HerokuConnectionForm = ({ appConnection, onSubmit: formSubmit }: Pr }) ); - // Redirect to Heroku OAuh + // Redirect to Heroku OAuth const oauthUrl = new URL("https://id.heroku.com/oauth/authorize"); oauthUrl.searchParams.set("client_id", oauthClientId); oauthUrl.searchParams.set("response_type", "code");