Make Setup Link Expiry Time Configurable (#2112)

* Make Setup Link Expiry Time Configurable

* Update setup link expiry variable

* Fixes

* Add tests
This commit is contained in:
Kiran K 2024-01-03 18:00:13 +05:30 committed by GitHub
parent 7677fac377
commit 4a719ee911
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 206 additions and 326 deletions

View File

@ -98,4 +98,7 @@ DSYNC_GOOGLE_CLIENT_SECRET=
DSYNC_GOOGLE_REDIRECT_URI=
# Only applicable for BoxyHQ SaaS deployments
BOXYHQ_HOSTED=0
BOXYHQ_HOSTED=0
# Setup link expiry in days
SETUP_LINK_EXPIRY_DAYS=3

View File

@ -9,7 +9,12 @@ import { InputWithCopyButton } from '../ClipboardButton';
import type { SetupLinkService, SetupLink } from '@boxyhq/saml-jackson';
import type { ApiResponse } from 'types';
const CreateSetupLink = ({ service }: { service: SetupLinkService }) => {
interface Props {
service: SetupLinkService;
expiryDays: number;
}
const CreateSetupLink = ({ service, expiryDays }: Props) => {
const router = useRouter();
const { t } = useTranslation('common');
const [loading, setLoading] = useState(false);
@ -25,6 +30,7 @@ const CreateSetupLink = ({ service }: { service: SetupLinkService }) => {
description: '',
defaultRedirectUrl: '',
redirectUrl: '',
expiryDays,
});
// Create a new setup link
@ -206,8 +212,25 @@ const CreateSetupLink = ({ service }: { service: SetupLinkService }) => {
</div>
</>
)}
<div className=''>
<label
htmlFor='expiryDays'
className='mb-2 block text-sm font-medium text-gray-900 dark:text-gray-300'>
{t('expiry_in_days')}
</label>
<input
id='expiryDays'
name='expiryDays'
type='number'
placeholder='3'
value={formObj['expiryDays']}
onChange={handleChange}
className='input-bordered input w-1/4'
required
/>
</div>
</div>
<div className='flex'>
<div className='flex py-5'>
<ButtonPrimary loading={loading} disabled={buttonDisabled}>
{t('generate')}
</ButtonPrimary>

View File

@ -29,6 +29,10 @@ const terminus = {
adminToken: process.env.TERMINUS_ADMIN_ROOT_TOKEN,
};
export const setupLinkExpiryDays = process.env.SETUP_LINK_EXPIRY_DAYS
? Number(process.env.SETUP_LINK_EXPIRY_DAYS)
: 3;
const db: DatabaseOption = {
engine: process.env.DB_ENGINE ? <DatabaseEngine>process.env.DB_ENGINE : undefined,
url: process.env.DB_URL || process.env.DATABASE_URL,
@ -91,6 +95,7 @@ const jacksonOptions: JacksonOption = {
},
},
},
setupLinkExpiryDays,
};
const adminPortalSSODefaults = {
@ -108,7 +113,5 @@ export { jacksonOptions };
export const dsyncGoogleAuthURL = externalUrl + '/api/scim/oauth/authorize';
/**
* Indicates if the Jackson instance is hosted (i.e. not self-hosted)
*/
/** Indicates if the Jackson instance is hosted (i.e. not self-hosted) */
export const boxyhqHosted = process.env.BOXYHQ_HOSTED === '1';

View File

@ -263,5 +263,6 @@
"choose_an_identity_provider_to_continue": "Choose an Identity Provider to continue. If you don't see your Identity Provider, please contact your administrator.",
"choose_an_app_to_continue": "Choose an app to continue. If you don't see your app, please contact your administrator.",
"no_saml_response_try_again": "No SAMLResponse found. Please try again.",
"customize_branding": "You can customize the look and feel Identity Provider selection page by setting following options"
"customize_branding": "You can customize the look and feel Identity Provider selection page by setting following options",
"expiry_in_days": "Expiry in days"
}

56
npm/package-lock.json generated
View File

@ -1120,7 +1120,7 @@
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
"integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
"devOptional": true,
"dev": true,
"dependencies": {
"@jridgewell/trace-mapping": "0.3.9"
},
@ -1313,7 +1313,7 @@
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
"integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
"devOptional": true,
"dev": true,
"engines": {
"node": ">=6.0.0"
}
@ -1322,13 +1322,13 @@
"version": "1.4.15",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
"integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
"devOptional": true
"dev": true
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.9",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
"integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
"devOptional": true,
"dev": true,
"dependencies": {
"@jridgewell/resolve-uri": "^3.0.3",
"@jridgewell/sourcemap-codec": "^1.4.10"
@ -3008,13 +3008,13 @@
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz",
"integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==",
"devOptional": true
"dev": true
},
"node_modules/@tsconfig/node12": {
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
"integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
"devOptional": true
"dev": true
},
"node_modules/@tsconfig/node14": {
"version": "14.1.0",
@ -3159,7 +3159,7 @@
"version": "8.10.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
"integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
"devOptional": true,
"dev": true,
"bin": {
"acorn": "bin/acorn"
},
@ -3171,7 +3171,7 @@
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
"integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
"devOptional": true,
"dev": true,
"engines": {
"node": ">=0.4.0"
}
@ -3286,7 +3286,7 @@
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
"integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
"devOptional": true
"dev": true
},
"node_modules/array-buffer-byte-length": {
"version": "1.0.0",
@ -4074,7 +4074,7 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
"integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
"devOptional": true
"dev": true
},
"node_modules/cross-env": {
"version": "7.0.3",
@ -5211,7 +5211,7 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz",
"integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==",
"devOptional": true
"dev": true
},
"node_modules/is-actual-promise": {
"version": "1.0.1",
@ -5867,7 +5867,7 @@
"version": "1.3.6",
"resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
"integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
"devOptional": true
"dev": true
},
"node_modules/make-fetch-happen": {
"version": "13.0.0",
@ -7256,20 +7256,6 @@
"node": ">=0.10.0"
}
},
"node_modules/react-dom": {
"version": "18.2.0",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
"integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
"dev": true,
"peer": true,
"dependencies": {
"loose-envify": "^1.1.0",
"scheduler": "^0.23.0"
},
"peerDependencies": {
"react": "^18.2.0"
}
},
"node_modules/react-element-to-jsx-string": {
"version": "15.0.0",
"resolved": "https://registry.npmjs.org/react-element-to-jsx-string/-/react-element-to-jsx-string-15.0.0.tgz",
@ -7729,7 +7715,7 @@
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
"integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
"devOptional": true,
"dev": true,
"engines": {
"node": ">= 6.0.0",
"npm": ">= 3.0.0"
@ -7739,7 +7725,7 @@
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz",
"integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==",
"devOptional": true,
"dev": true,
"dependencies": {
"ip": "^2.0.0",
"smart-buffer": "^4.2.0"
@ -8326,7 +8312,7 @@
"version": "10.9.2",
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz",
"integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==",
"devOptional": true,
"dev": true,
"dependencies": {
"@cspotcode/source-map-support": "^0.8.0",
"@tsconfig/node10": "^1.0.7",
@ -8369,19 +8355,19 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
"integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
"devOptional": true
"dev": true
},
"node_modules/ts-node/node_modules/@tsconfig/node16": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
"integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
"devOptional": true
"dev": true
},
"node_modules/ts-node/node_modules/diff": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
"devOptional": true,
"dev": true,
"engines": {
"node": ">=0.3.1"
}
@ -8735,7 +8721,7 @@
"version": "5.3.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz",
"integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==",
"devOptional": true,
"dev": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@ -8818,7 +8804,7 @@
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
"integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
"devOptional": true
"dev": true
},
"node_modules/v8-to-istanbul": {
"version": "9.1.3",
@ -9273,7 +9259,7 @@
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
"integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
"devOptional": true,
"dev": true,
"engines": {
"node": ">=6"
}

View File

@ -34,6 +34,11 @@ const throwIfInvalidService = (service: string) => {
}
};
const calculateExpiryTimestamp = (expiryDays: number): number => {
const currentTimestamp = Date.now();
return currentTimestamp + expiryDays * 24 * 60 * 60 * 1000;
};
/**
* @swagger
* definitions:
@ -146,7 +151,17 @@ export class SetupLinkController {
* $ref: '#/definitions/SetupLink'
*/
async create(body: SetupLinkCreatePayload): Promise<SetupLink> {
const { tenant, product, service, name, description, defaultRedirectUrl, regenerate, redirectUrl } = body;
const {
tenant,
product,
service,
name,
description,
defaultRedirectUrl,
regenerate,
redirectUrl,
expiryDays,
} = body;
validateTenantAndProduct(tenant, product);
@ -176,6 +191,8 @@ export class SetupLinkController {
await this.setupLinkStore.delete(existing[0].setupID);
}
const expiryInDays = expiryDays || this.opts.setupLinkExpiryDays || 3;
const setupLink = {
setupID,
tenant,
@ -185,7 +202,7 @@ export class SetupLinkController {
description,
redirectUrl,
defaultRedirectUrl,
validTill: +new Date(new Date().setDate(new Date().getDate() + 3)),
validTill: calculateExpiryTimestamp(expiryInDays),
url: `${this.opts.externalUrl}/setup/${token}`,
};

View File

@ -449,6 +449,9 @@ export interface JacksonOption {
};
};
};
/** The number of days a setup link is valid for. Defaults to 3 days. */
setupLinkExpiryDays?: number;
}
export interface SLORequestParams {
@ -534,6 +537,7 @@ export type SetupLinkCreatePayload = {
redirectUrl?: string;
service: SetupLinkService;
regenerate?: boolean;
expiryDays?: number;
};
export type SetupLink = {

View File

@ -0,0 +1,68 @@
import tap from 'tap';
import { jacksonOptions } from './utils';
import { ISetupLinkController } from 'npm/src';
let setupLinkController: ISetupLinkController;
const product = 'jackson';
tap.before(async () => {
const jackson = await (await import('../src/index')).default(jacksonOptions);
setupLinkController = jackson.setupLinkController;
});
tap.teardown(async () => {
process.exit(0);
});
const expireInDays = (timestamp: number) => {
const diffInMilliseconds = timestamp - new Date().getTime();
const expireInDays = Math.ceil(diffInMilliseconds / (1000 * 3600 * 24));
return expireInDays;
};
tap.test('Setup link controller', async (t) => {
t.test('Create a new setup link', async (t) => {
const setupLink = await setupLinkController.create({
tenant: 'tenant-1',
product,
service: 'dsync',
});
t.ok(setupLink);
t.match(expireInDays(setupLink.validTill), 3);
});
// With custom expiry
t.test('Create a new setup link with custom expiry', async (t) => {
const setupLink = await setupLinkController.create({
tenant: 'tenant-2',
product,
service: 'dsync',
expiryDays: 5,
});
t.ok(setupLink);
t.match(expireInDays(setupLink.validTill), 5);
});
// With global expiry
t.test('Create a new setup link with global expiry', async (t) => {
const jackson = await (
await import('../src/index')
).default({
...jacksonOptions,
setupLinkExpiryDays: 10,
});
setupLinkController = jackson.setupLinkController;
const setupLink = await setupLinkController.create({
tenant: 'tenant-3',
product,
service: 'dsync',
});
t.ok(setupLink);
t.match(expireInDays(setupLink.validTill), 10);
});
});

315
package-lock.json generated
View File

@ -284,26 +284,26 @@
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
},
"node_modules/@aws-sdk/client-cognito-identity": {
"version": "3.481.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.481.0.tgz",
"integrity": "sha512-yt3kDnsEixMEa1mQRRB0dbLfrmDgeLK/7/DEka23w0FdryAYm5eZzVpUtaUJpAd6x6FgJ5xuN7fpeXpzOnxI9A==",
"version": "3.484.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.484.0.tgz",
"integrity": "sha512-xjibqYYx8I8lYM17q3THMC8WpJihzio3+Wd6oAMdcaw+EBsgUcphsRHL5YO8wNEzNiMeXrXOPPUBapxpBmFPBA==",
"dependencies": {
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
"@aws-sdk/client-sts": "3.481.0",
"@aws-sdk/client-sts": "3.484.0",
"@aws-sdk/core": "3.481.0",
"@aws-sdk/credential-provider-node": "3.481.0",
"@aws-sdk/credential-provider-node": "3.484.0",
"@aws-sdk/middleware-host-header": "3.468.0",
"@aws-sdk/middleware-logger": "3.468.0",
"@aws-sdk/middleware-recursion-detection": "3.468.0",
"@aws-sdk/middleware-signing": "3.468.0",
"@aws-sdk/middleware-user-agent": "3.478.0",
"@aws-sdk/region-config-resolver": "3.470.0",
"@aws-sdk/region-config-resolver": "3.484.0",
"@aws-sdk/types": "3.468.0",
"@aws-sdk/util-endpoints": "3.478.0",
"@aws-sdk/util-user-agent-browser": "3.468.0",
"@aws-sdk/util-user-agent-node": "3.470.0",
"@smithy/config-resolver": "^2.0.21",
"@smithy/config-resolver": "^2.0.22",
"@smithy/core": "^1.2.1",
"@smithy/fetch-http-handler": "^2.3.1",
"@smithy/hash-node": "^2.0.17",
@ -323,7 +323,7 @@
"@smithy/util-body-length-browser": "^2.0.1",
"@smithy/util-body-length-node": "^2.1.0",
"@smithy/util-defaults-mode-browser": "^2.0.23",
"@smithy/util-defaults-mode-node": "^2.0.30",
"@smithy/util-defaults-mode-node": "^2.0.31",
"@smithy/util-endpoints": "^1.0.7",
"@smithy/util-retry": "^2.0.8",
"@smithy/util-utf8": "^2.0.2",
@ -386,7 +386,7 @@
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/client-dynamodb/node_modules/@aws-sdk/client-sso": {
"node_modules/@aws-sdk/client-sso": {
"version": "3.484.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.484.0.tgz",
"integrity": "sha512-eHKXDHqgPt99977hNissa1y/efwXZ9kg3EKPLK13b6VzTC8s0+Ih+YZemNE22ahw6SYnRiGglYdkdypJ/uPHkg==",
@ -433,7 +433,7 @@
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/client-dynamodb/node_modules/@aws-sdk/client-sts": {
"node_modules/@aws-sdk/client-sts": {
"version": "3.484.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.484.0.tgz",
"integrity": "sha512-psQxH0mYhTVvZhfca3s9NbXgnuOM8l+5LtF7fZBF5y4xaPpfAPicPWp6po69J3ynwyXi/MpHNXd/13d/L09TTA==",
@ -483,223 +483,6 @@
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/client-dynamodb/node_modules/@aws-sdk/credential-provider-ini": {
"version": "3.484.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.484.0.tgz",
"integrity": "sha512-BbvU7seI0RPPwpujnz4LA1lC53Cj4BOSRpYYZbrxA6C7SzW0D/IQBZQP3JBbrxIhqewSROSsYGDjvYbyi5aDEw==",
"dependencies": {
"@aws-sdk/credential-provider-env": "3.468.0",
"@aws-sdk/credential-provider-process": "3.468.0",
"@aws-sdk/credential-provider-sso": "3.484.0",
"@aws-sdk/credential-provider-web-identity": "3.468.0",
"@aws-sdk/types": "3.468.0",
"@smithy/credential-provider-imds": "^2.0.0",
"@smithy/property-provider": "^2.0.0",
"@smithy/shared-ini-file-loader": "^2.0.6",
"@smithy/types": "^2.7.0",
"tslib": "^2.5.0"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/client-dynamodb/node_modules/@aws-sdk/credential-provider-node": {
"version": "3.484.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.484.0.tgz",
"integrity": "sha512-Ylqej3FqRwUD3I7929k214LRH1bUz7f2hfV4ZqY7teM9hQC5Ov5SpVtOtLKNfgaaxAkhD2ffMNfmq8TAg824+g==",
"dependencies": {
"@aws-sdk/credential-provider-env": "3.468.0",
"@aws-sdk/credential-provider-ini": "3.484.0",
"@aws-sdk/credential-provider-process": "3.468.0",
"@aws-sdk/credential-provider-sso": "3.484.0",
"@aws-sdk/credential-provider-web-identity": "3.468.0",
"@aws-sdk/types": "3.468.0",
"@smithy/credential-provider-imds": "^2.0.0",
"@smithy/property-provider": "^2.0.0",
"@smithy/shared-ini-file-loader": "^2.0.6",
"@smithy/types": "^2.7.0",
"tslib": "^2.5.0"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/client-dynamodb/node_modules/@aws-sdk/credential-provider-sso": {
"version": "3.484.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.484.0.tgz",
"integrity": "sha512-Fl7+YhrlU2icZkz18z9aj4SiWb2aQlWp5LsVqMfSzTlJFc9yPlD9e7F33gnL7kKLVSnAVxsr5v4y4pFC6FZUSw==",
"dependencies": {
"@aws-sdk/client-sso": "3.484.0",
"@aws-sdk/token-providers": "3.484.0",
"@aws-sdk/types": "3.468.0",
"@smithy/property-provider": "^2.0.0",
"@smithy/shared-ini-file-loader": "^2.0.6",
"@smithy/types": "^2.7.0",
"tslib": "^2.5.0"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/client-dynamodb/node_modules/@aws-sdk/region-config-resolver": {
"version": "3.484.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.484.0.tgz",
"integrity": "sha512-qfYSwSIc9GasHFrJidydlQE433mB93d31dfypFWhrJPXRv1fhopO72NSfsY2WCcbaRkADc4AajLZFly4J96abw==",
"dependencies": {
"@smithy/node-config-provider": "^2.1.8",
"@smithy/types": "^2.7.0",
"@smithy/util-config-provider": "^2.1.0",
"@smithy/util-middleware": "^2.0.8",
"tslib": "^2.5.0"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/client-dynamodb/node_modules/@aws-sdk/token-providers": {
"version": "3.484.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.484.0.tgz",
"integrity": "sha512-9Eb7X0sNhJANfYCeEYWCvfeD4shMZEse3YUz5EALzbpzi/So56ZaeA/lWWeh0fkYiByq74eA2QkC/tXZkHw6EQ==",
"dependencies": {
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
"@aws-sdk/middleware-host-header": "3.468.0",
"@aws-sdk/middleware-logger": "3.468.0",
"@aws-sdk/middleware-recursion-detection": "3.468.0",
"@aws-sdk/middleware-user-agent": "3.478.0",
"@aws-sdk/region-config-resolver": "3.484.0",
"@aws-sdk/types": "3.468.0",
"@aws-sdk/util-endpoints": "3.478.0",
"@aws-sdk/util-user-agent-browser": "3.468.0",
"@aws-sdk/util-user-agent-node": "3.470.0",
"@smithy/config-resolver": "^2.0.22",
"@smithy/fetch-http-handler": "^2.3.1",
"@smithy/hash-node": "^2.0.17",
"@smithy/invalid-dependency": "^2.0.15",
"@smithy/middleware-content-length": "^2.0.17",
"@smithy/middleware-endpoint": "^2.2.3",
"@smithy/middleware-retry": "^2.0.25",
"@smithy/middleware-serde": "^2.0.15",
"@smithy/middleware-stack": "^2.0.9",
"@smithy/node-config-provider": "^2.1.8",
"@smithy/node-http-handler": "^2.2.1",
"@smithy/property-provider": "^2.0.0",
"@smithy/protocol-http": "^3.0.11",
"@smithy/shared-ini-file-loader": "^2.0.6",
"@smithy/smithy-client": "^2.2.0",
"@smithy/types": "^2.7.0",
"@smithy/url-parser": "^2.0.15",
"@smithy/util-base64": "^2.0.1",
"@smithy/util-body-length-browser": "^2.0.1",
"@smithy/util-body-length-node": "^2.1.0",
"@smithy/util-defaults-mode-browser": "^2.0.23",
"@smithy/util-defaults-mode-node": "^2.0.31",
"@smithy/util-endpoints": "^1.0.7",
"@smithy/util-retry": "^2.0.8",
"@smithy/util-utf8": "^2.0.2",
"tslib": "^2.5.0"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/client-sso": {
"version": "3.481.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.481.0.tgz",
"integrity": "sha512-d+crFfW8HSDXa68MSfMDX6LH0J22P29SxJW4IGgRZKwHWEaSf4UjOP0mjA4V26R50suAV052/WBY6LjtGsZsHg==",
"dependencies": {
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
"@aws-sdk/core": "3.481.0",
"@aws-sdk/middleware-host-header": "3.468.0",
"@aws-sdk/middleware-logger": "3.468.0",
"@aws-sdk/middleware-recursion-detection": "3.468.0",
"@aws-sdk/middleware-user-agent": "3.478.0",
"@aws-sdk/region-config-resolver": "3.470.0",
"@aws-sdk/types": "3.468.0",
"@aws-sdk/util-endpoints": "3.478.0",
"@aws-sdk/util-user-agent-browser": "3.468.0",
"@aws-sdk/util-user-agent-node": "3.470.0",
"@smithy/config-resolver": "^2.0.21",
"@smithy/core": "^1.2.1",
"@smithy/fetch-http-handler": "^2.3.1",
"@smithy/hash-node": "^2.0.17",
"@smithy/invalid-dependency": "^2.0.15",
"@smithy/middleware-content-length": "^2.0.17",
"@smithy/middleware-endpoint": "^2.2.3",
"@smithy/middleware-retry": "^2.0.25",
"@smithy/middleware-serde": "^2.0.15",
"@smithy/middleware-stack": "^2.0.9",
"@smithy/node-config-provider": "^2.1.8",
"@smithy/node-http-handler": "^2.2.1",
"@smithy/protocol-http": "^3.0.11",
"@smithy/smithy-client": "^2.2.0",
"@smithy/types": "^2.7.0",
"@smithy/url-parser": "^2.0.15",
"@smithy/util-base64": "^2.0.1",
"@smithy/util-body-length-browser": "^2.0.1",
"@smithy/util-body-length-node": "^2.1.0",
"@smithy/util-defaults-mode-browser": "^2.0.23",
"@smithy/util-defaults-mode-node": "^2.0.30",
"@smithy/util-endpoints": "^1.0.7",
"@smithy/util-retry": "^2.0.8",
"@smithy/util-utf8": "^2.0.2",
"tslib": "^2.5.0"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/client-sts": {
"version": "3.481.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.481.0.tgz",
"integrity": "sha512-GSnJiceKpwLSEW5q2KRu9zHNJgtYysiy9Xkey0EKLKCdDRdM62yCJEFerAbvRRVJsF2LTSrmBmUl2zWB5RT8mw==",
"dependencies": {
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
"@aws-sdk/core": "3.481.0",
"@aws-sdk/credential-provider-node": "3.481.0",
"@aws-sdk/middleware-host-header": "3.468.0",
"@aws-sdk/middleware-logger": "3.468.0",
"@aws-sdk/middleware-recursion-detection": "3.468.0",
"@aws-sdk/middleware-user-agent": "3.478.0",
"@aws-sdk/region-config-resolver": "3.470.0",
"@aws-sdk/types": "3.468.0",
"@aws-sdk/util-endpoints": "3.478.0",
"@aws-sdk/util-user-agent-browser": "3.468.0",
"@aws-sdk/util-user-agent-node": "3.470.0",
"@smithy/config-resolver": "^2.0.21",
"@smithy/core": "^1.2.1",
"@smithy/fetch-http-handler": "^2.3.1",
"@smithy/hash-node": "^2.0.17",
"@smithy/invalid-dependency": "^2.0.15",
"@smithy/middleware-content-length": "^2.0.17",
"@smithy/middleware-endpoint": "^2.2.3",
"@smithy/middleware-retry": "^2.0.25",
"@smithy/middleware-serde": "^2.0.15",
"@smithy/middleware-stack": "^2.0.9",
"@smithy/node-config-provider": "^2.1.8",
"@smithy/node-http-handler": "^2.2.1",
"@smithy/protocol-http": "^3.0.11",
"@smithy/smithy-client": "^2.2.0",
"@smithy/types": "^2.7.0",
"@smithy/url-parser": "^2.0.15",
"@smithy/util-base64": "^2.0.1",
"@smithy/util-body-length-browser": "^2.0.1",
"@smithy/util-body-length-node": "^2.1.0",
"@smithy/util-defaults-mode-browser": "^2.0.23",
"@smithy/util-defaults-mode-node": "^2.0.30",
"@smithy/util-endpoints": "^1.0.7",
"@smithy/util-middleware": "^2.0.8",
"@smithy/util-retry": "^2.0.8",
"@smithy/util-utf8": "^2.0.2",
"fast-xml-parser": "4.2.5",
"tslib": "^2.5.0"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@aws-sdk/core": {
"version": "3.481.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.481.0.tgz",
@ -717,11 +500,11 @@
}
},
"node_modules/@aws-sdk/credential-provider-cognito-identity": {
"version": "3.481.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.481.0.tgz",
"integrity": "sha512-zuveZv/pK4wl/Pabq2233MmoGAqInSPaxRMvtLGKpIM1E7MGRiaIDfT2PelF62n2ptn4IceXE8xmoHNUDdKGkw==",
"version": "3.484.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.484.0.tgz",
"integrity": "sha512-kIusxi5f9jcNfLjNv/fv6eNRHN1bSQhN8nS31jBRemQL3zBuUePk50MqbciZUh29Rf/ATOVvH6UStaxnV6ivlg==",
"dependencies": {
"@aws-sdk/client-cognito-identity": "3.481.0",
"@aws-sdk/client-cognito-identity": "3.484.0",
"@aws-sdk/types": "3.468.0",
"@smithy/property-provider": "^2.0.0",
"@smithy/types": "^2.7.0",
@ -765,13 +548,13 @@
}
},
"node_modules/@aws-sdk/credential-provider-ini": {
"version": "3.481.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.481.0.tgz",
"integrity": "sha512-QXMlILewLV/yQHkyjXsu7PhvmTZIDAaQ4uAfhjnqbH1B8mErRpZKkzHWwp4yeZdTcHfenTVqoTnx9WDa+SnK/Q==",
"version": "3.484.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.484.0.tgz",
"integrity": "sha512-BbvU7seI0RPPwpujnz4LA1lC53Cj4BOSRpYYZbrxA6C7SzW0D/IQBZQP3JBbrxIhqewSROSsYGDjvYbyi5aDEw==",
"dependencies": {
"@aws-sdk/credential-provider-env": "3.468.0",
"@aws-sdk/credential-provider-process": "3.468.0",
"@aws-sdk/credential-provider-sso": "3.481.0",
"@aws-sdk/credential-provider-sso": "3.484.0",
"@aws-sdk/credential-provider-web-identity": "3.468.0",
"@aws-sdk/types": "3.468.0",
"@smithy/credential-provider-imds": "^2.0.0",
@ -785,14 +568,14 @@
}
},
"node_modules/@aws-sdk/credential-provider-node": {
"version": "3.481.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.481.0.tgz",
"integrity": "sha512-148Ztn2FjlS3VdGWJnAMjuXiZ55/tD823I/koawgp80LnDqMiKfmSGAioXIikqaBHl40K7ZvtBMqP/n/6GM41A==",
"version": "3.484.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.484.0.tgz",
"integrity": "sha512-Ylqej3FqRwUD3I7929k214LRH1bUz7f2hfV4ZqY7teM9hQC5Ov5SpVtOtLKNfgaaxAkhD2ffMNfmq8TAg824+g==",
"dependencies": {
"@aws-sdk/credential-provider-env": "3.468.0",
"@aws-sdk/credential-provider-ini": "3.481.0",
"@aws-sdk/credential-provider-ini": "3.484.0",
"@aws-sdk/credential-provider-process": "3.468.0",
"@aws-sdk/credential-provider-sso": "3.481.0",
"@aws-sdk/credential-provider-sso": "3.484.0",
"@aws-sdk/credential-provider-web-identity": "3.468.0",
"@aws-sdk/types": "3.468.0",
"@smithy/credential-provider-imds": "^2.0.0",
@ -821,12 +604,12 @@
}
},
"node_modules/@aws-sdk/credential-provider-sso": {
"version": "3.481.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.481.0.tgz",
"integrity": "sha512-3MrSIQPQDOxhZDppC2XpOLVfuUm7iqRfTrwjSYGeWc//pUZtUI7nMXYjEDL+li5gvasw1lYfYX3VHNdwNnvyOQ==",
"version": "3.484.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.484.0.tgz",
"integrity": "sha512-Fl7+YhrlU2icZkz18z9aj4SiWb2aQlWp5LsVqMfSzTlJFc9yPlD9e7F33gnL7kKLVSnAVxsr5v4y4pFC6FZUSw==",
"dependencies": {
"@aws-sdk/client-sso": "3.481.0",
"@aws-sdk/token-providers": "3.481.0",
"@aws-sdk/client-sso": "3.484.0",
"@aws-sdk/token-providers": "3.484.0",
"@aws-sdk/types": "3.468.0",
"@smithy/property-provider": "^2.0.0",
"@smithy/shared-ini-file-loader": "^2.0.6",
@ -852,20 +635,20 @@
}
},
"node_modules/@aws-sdk/credential-providers": {
"version": "3.481.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.481.0.tgz",
"integrity": "sha512-bZfl50WtY9nYNuBb9KiP7Sm+C86dc8u40FkyNFFu7xzEmSmT2FVipjBSM63YjE6AKO23AKgTMU3tU9xTy5KRpw==",
"version": "3.484.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.484.0.tgz",
"integrity": "sha512-Yl4YPlML79TUir6QPUsgBWFwDu3FOiQGdAnN2eei4ce76ZI5JwPIiBNP0S2qK63R40CeoBqRlSIveBX9v10jjQ==",
"dependencies": {
"@aws-sdk/client-cognito-identity": "3.481.0",
"@aws-sdk/client-sso": "3.481.0",
"@aws-sdk/client-sts": "3.481.0",
"@aws-sdk/credential-provider-cognito-identity": "3.481.0",
"@aws-sdk/client-cognito-identity": "3.484.0",
"@aws-sdk/client-sso": "3.484.0",
"@aws-sdk/client-sts": "3.484.0",
"@aws-sdk/credential-provider-cognito-identity": "3.484.0",
"@aws-sdk/credential-provider-env": "3.468.0",
"@aws-sdk/credential-provider-http": "3.481.0",
"@aws-sdk/credential-provider-ini": "3.481.0",
"@aws-sdk/credential-provider-node": "3.481.0",
"@aws-sdk/credential-provider-ini": "3.484.0",
"@aws-sdk/credential-provider-node": "3.484.0",
"@aws-sdk/credential-provider-process": "3.468.0",
"@aws-sdk/credential-provider-sso": "3.481.0",
"@aws-sdk/credential-provider-sso": "3.484.0",
"@aws-sdk/credential-provider-web-identity": "3.468.0",
"@aws-sdk/types": "3.468.0",
"@smithy/credential-provider-imds": "^2.0.0",
@ -979,13 +762,13 @@
}
},
"node_modules/@aws-sdk/region-config-resolver": {
"version": "3.470.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.470.0.tgz",
"integrity": "sha512-C1o1J06iIw8cyAAOvHqT4Bbqf+PgQ/RDlSyjt2gFfP2OovDpc2o2S90dE8f8iZdSGpg70N5MikT1DBhW9NbhtQ==",
"version": "3.484.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.484.0.tgz",
"integrity": "sha512-qfYSwSIc9GasHFrJidydlQE433mB93d31dfypFWhrJPXRv1fhopO72NSfsY2WCcbaRkADc4AajLZFly4J96abw==",
"dependencies": {
"@smithy/node-config-provider": "^2.1.8",
"@smithy/types": "^2.7.0",
"@smithy/util-config-provider": "^2.0.0",
"@smithy/util-config-provider": "^2.1.0",
"@smithy/util-middleware": "^2.0.8",
"tslib": "^2.5.0"
},
@ -994,9 +777,9 @@
}
},
"node_modules/@aws-sdk/token-providers": {
"version": "3.481.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.481.0.tgz",
"integrity": "sha512-G4ObHF2A/FlvQG7Lb/2sjuklG89IiH3TI1EiNZSzgu6TvY904Js72Slldls4VeJLY2zAnZgyZ9903pBMkDrcxQ==",
"version": "3.484.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.484.0.tgz",
"integrity": "sha512-9Eb7X0sNhJANfYCeEYWCvfeD4shMZEse3YUz5EALzbpzi/So56ZaeA/lWWeh0fkYiByq74eA2QkC/tXZkHw6EQ==",
"dependencies": {
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
@ -1004,12 +787,12 @@
"@aws-sdk/middleware-logger": "3.468.0",
"@aws-sdk/middleware-recursion-detection": "3.468.0",
"@aws-sdk/middleware-user-agent": "3.478.0",
"@aws-sdk/region-config-resolver": "3.470.0",
"@aws-sdk/region-config-resolver": "3.484.0",
"@aws-sdk/types": "3.468.0",
"@aws-sdk/util-endpoints": "3.478.0",
"@aws-sdk/util-user-agent-browser": "3.468.0",
"@aws-sdk/util-user-agent-node": "3.470.0",
"@smithy/config-resolver": "^2.0.21",
"@smithy/config-resolver": "^2.0.22",
"@smithy/fetch-http-handler": "^2.3.1",
"@smithy/hash-node": "^2.0.17",
"@smithy/invalid-dependency": "^2.0.15",
@ -1030,7 +813,7 @@
"@smithy/util-body-length-browser": "^2.0.1",
"@smithy/util-body-length-node": "^2.1.0",
"@smithy/util-defaults-mode-browser": "^2.0.23",
"@smithy/util-defaults-mode-node": "^2.0.30",
"@smithy/util-defaults-mode-node": "^2.0.31",
"@smithy/util-endpoints": "^1.0.7",
"@smithy/util-retry": "^2.0.8",
"@smithy/util-utf8": "^2.0.2",
@ -21498,7 +21281,7 @@
"license": "Apache 2.0",
"dependencies": {
"@aws-sdk/client-dynamodb": "3.484.0",
"@aws-sdk/credential-providers": "3.481.0",
"@aws-sdk/credential-providers": "3.484.0",
"@aws-sdk/util-dynamodb": "3.484.0",
"@boxyhq/error-code-mnemonic": "0.1.1",
"@boxyhq/metrics": "0.2.6",

View File

@ -1,15 +1,18 @@
import type { GetServerSidePropsContext, NextPage } from 'next';
import type { GetServerSidePropsContext, InferGetServerSidePropsType } from 'next';
import { useRouter } from 'next/router';
import CreateSetupLink from '@components/setup-link/CreateSetupLink';
import { serverSideTranslations } from 'next-i18next/serverSideTranslations';
import type { SetupLinkService } from '@boxyhq/saml-jackson';
import { setupLinkExpiryDays } from '@lib/env';
const serviceMaps = {
'sso-connection': 'sso',
'directory-sync': 'dsync',
};
const SetupLinkCreatePage: NextPage = () => {
type Props = InferGetServerSidePropsType<typeof getServerSideProps>;
const SetupLinkCreatePage = ({ expiryDays }: Props) => {
const router = useRouter();
// Extract the service name from the path
@ -21,13 +24,14 @@ const SetupLinkCreatePage: NextPage = () => {
return null;
}
return <CreateSetupLink service={service} />;
return <CreateSetupLink service={service} expiryDays={expiryDays} />;
};
export async function getServerSideProps({ locale }: GetServerSidePropsContext) {
return {
props: {
...(locale ? await serverSideTranslations(locale, ['common']) : {}),
expiryDays: setupLinkExpiryDays,
},
};
}

View File

@ -27,19 +27,7 @@ const handler = async (req: NextApiRequest, res: NextApiResponse) => {
const handlePOST = async (req: NextApiRequest, res: NextApiResponse) => {
const { setupLinkController } = await jackson();
const { tenant, product, service, regenerate, name, description, defaultRedirectUrl, redirectUrl } =
req.body;
const setupLink = await setupLinkController.create({
tenant,
product,
service,
name,
description,
defaultRedirectUrl,
redirectUrl,
regenerate,
});
const setupLink = await setupLinkController.create(req.body);
return res.status(201).json({ data: setupLink });
};