diff --git a/.env.example b/.env.example index 5f3da7c1f..4d409e798 100644 --- a/.env.example +++ b/.env.example @@ -80,6 +80,8 @@ NEXT_PRIVATE_SIGNING_CSC_OAUTH_CLIENT_SECRET= NEXT_PRIVATE_SIGNING_CSC_SIGNATURE_LEVEL= # OPTIONAL: Comma-separated list of timestamp authority URLs for PDF signing (enables LTV and archival timestamps). NEXT_PRIVATE_SIGNING_TIMESTAMP_AUTHORITY= +# OPTIONAL: Reason to embed in PDF signatures. Defaults to "Signed by Documenso". +NEXT_PRIVATE_SIGNING_REASON= # OPTIONAL: Contact info to embed in PDF signatures. Defaults to the webapp URL. NEXT_PUBLIC_SIGNING_CONTACT_INFO= # OPTIONAL: Set to "true" to use the legacy adbe.pkcs7.detached subfilter instead of ETSI.CAdES.detached. diff --git a/packages/lib/constants/app.test.ts b/packages/lib/constants/app.test.ts new file mode 100644 index 000000000..41d1cf5b6 --- /dev/null +++ b/packages/lib/constants/app.test.ts @@ -0,0 +1,27 @@ +import { afterEach, describe, expect, it, vi } from 'vitest'; + +import { NEXT_PRIVATE_SIGNING_REASON } from './app'; + +describe('NEXT_PRIVATE_SIGNING_REASON', () => { + afterEach(() => { + vi.unstubAllEnvs(); + }); + + it('defaults to the Documenso signing reason', () => { + vi.stubEnv('NEXT_PRIVATE_SIGNING_REASON', undefined); + + expect(NEXT_PRIVATE_SIGNING_REASON()).toBe('Signed by Documenso'); + }); + + it('uses the default for an empty signing reason', () => { + vi.stubEnv('NEXT_PRIVATE_SIGNING_REASON', ''); + + expect(NEXT_PRIVATE_SIGNING_REASON()).toBe('Signed by Documenso'); + }); + + it('uses the configured signing reason verbatim', () => { + vi.stubEnv('NEXT_PRIVATE_SIGNING_REASON', 'Signed by Objective'); + + expect(NEXT_PRIVATE_SIGNING_REASON()).toBe('Signed by Objective'); + }); +}); diff --git a/packages/lib/constants/app.ts b/packages/lib/constants/app.ts index 17ded9d66..98dff4757 100644 --- a/packages/lib/constants/app.ts +++ b/packages/lib/constants/app.ts @@ -92,6 +92,7 @@ export const IS_AI_FEATURES_CONFIGURED = (): boolean => { export const NEXT_PRIVATE_USE_PLAYWRIGHT_PDF = () => env('NEXT_PRIVATE_USE_PLAYWRIGHT_PDF') === 'true'; export const NEXT_PRIVATE_SIGNING_TIMESTAMP_AUTHORITY = () => env('NEXT_PRIVATE_SIGNING_TIMESTAMP_AUTHORITY'); +export const NEXT_PRIVATE_SIGNING_REASON = () => env('NEXT_PRIVATE_SIGNING_REASON') || 'Signed by Documenso'; export const NEXT_PRIVATE_SIGNING_TRANSPORT = () => env('NEXT_PRIVATE_SIGNING_TRANSPORT') || 'local'; diff --git a/packages/signing/index.ts b/packages/signing/index.ts index acb1c00bb..f60b26650 100644 --- a/packages/signing/index.ts +++ b/packages/signing/index.ts @@ -1,4 +1,5 @@ import { + NEXT_PRIVATE_SIGNING_REASON, NEXT_PRIVATE_SIGNING_TRANSPORT, NEXT_PRIVATE_USE_LEGACY_SIGNING_SUBFILTER, NEXT_PUBLIC_SIGNING_CONTACT_INFO, @@ -42,7 +43,7 @@ export const signPdf = async ({ pdf }: SignOptions) => { const { bytes } = await pdf.sign({ signer, - reason: 'Signed by Documenso', + reason: NEXT_PRIVATE_SIGNING_REASON(), location: NEXT_PUBLIC_WEBAPP_URL(), contactInfo: NEXT_PUBLIC_SIGNING_CONTACT_INFO(), subFilter: NEXT_PRIVATE_USE_LEGACY_SIGNING_SUBFILTER() ? 'adbe.pkcs7.detached' : 'ETSI.CAdES.detached', diff --git a/packages/tsconfig/process-env.d.ts b/packages/tsconfig/process-env.d.ts index d02df2be0..31f98cabb 100644 --- a/packages/tsconfig/process-env.d.ts +++ b/packages/tsconfig/process-env.d.ts @@ -59,6 +59,7 @@ declare namespace NodeJS { NEXT_PRIVATE_SIGNING_CSC_OAUTH_CLIENT_SECRET?: string; NEXT_PRIVATE_SIGNING_CSC_SIGNATURE_LEVEL?: 'AES' | 'QES'; NEXT_PRIVATE_SIGNING_TIMESTAMP_AUTHORITY?: string; + NEXT_PRIVATE_SIGNING_REASON?: string; NEXT_PUBLIC_SIGNING_CONTACT_INFO?: string; NEXT_PRIVATE_USE_LEGACY_SIGNING_SUBFILTER?: string;