├── .dockerignore ├── .env.example ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── config.yml │ └── feature_request.md ├── dependabot.yml ├── pull_request_template.md └── workflows │ └── main.yml ├── .gitignore ├── .prettierignore ├── .prettierrc.js ├── .release-it.json ├── .vscode ├── extensions.json └── settings.json ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── Dockerfile ├── LICENSE ├── Procfile ├── README.md ├── SECURITY.md ├── _dev ├── docker-compose-cockroachdb.yml ├── docker-compose.yml └── saml_config │ ├── boxyhq.js │ └── boxyhq.xml ├── app.json ├── check-locale.js ├── components ├── LicenseRequired.tsx ├── Navbar.tsx ├── PoweredBy.tsx ├── Sidebar.tsx ├── Toaster.tsx ├── connection │ ├── ConnectionList.tsx │ ├── CreateConnection.tsx │ └── EditConnection.tsx ├── dsync │ ├── CreateDirectory.tsx │ ├── DirectoryList.tsx │ └── EditDirectory.tsx ├── layouts │ ├── AccountLayout.tsx │ ├── SetupLinkLayout.tsx │ └── index.ts ├── logo │ ├── AuditLogs.tsx │ ├── DSync.tsx │ └── SSO.tsx ├── retraced │ ├── AddProject.tsx │ ├── CodeSnippet.tsx │ ├── LogsViewer.tsx │ └── ProjectDetails.tsx ├── setup-link-instructions │ ├── CreateSSOConnection.tsx │ ├── Footer.tsx │ ├── NextButton.tsx │ ├── PreviousButton.tsx │ ├── SelectIdentityProviders.tsx │ ├── auth0 │ │ ├── 1.mdx │ │ ├── 2.mdx │ │ └── 3.mdx │ ├── azure │ │ ├── 1.mdx │ │ ├── 2.mdx │ │ ├── 3.mdx │ │ └── 4.mdx │ ├── generic-oidc │ │ ├── 1.mdx │ │ └── 2.mdx │ ├── generic-saml │ │ ├── 1.mdx │ │ ├── 2.mdx │ │ └── 3.mdx │ ├── google │ │ ├── 1.mdx │ │ ├── 2.mdx │ │ ├── 3.mdx │ │ └── 4.mdx │ ├── jumpcloud │ │ ├── 1.mdx │ │ ├── 2.mdx │ │ ├── 3.mdx │ │ └── 4.mdx │ ├── microsoft-adfs │ │ ├── 1.mdx │ │ ├── 2.mdx │ │ ├── 3.mdx │ │ └── 4.mdx │ ├── okta │ │ ├── 1.mdx │ │ ├── 2.mdx │ │ ├── 3.mdx │ │ └── 4.mdx │ ├── onelogin │ │ ├── 1.mdx │ │ ├── 2.mdx │ │ ├── 3.mdx │ │ └── 4.mdx │ ├── pingone │ │ ├── 1.mdx │ │ ├── 2.mdx │ │ ├── 3.mdx │ │ └── 4.mdx │ └── rippling │ │ ├── 1.mdx │ │ ├── 2.mdx │ │ └── 3.mdx ├── setup-link │ ├── InvalidSetupLinkAlert.tsx │ └── StepProgressBar.tsx └── styles.ts ├── docker-compose.yml ├── e2e ├── .gitignore ├── api │ ├── helpers │ │ ├── api.ts │ │ ├── directories.ts │ │ ├── groups.ts │ │ ├── index.ts │ │ ├── oauth.ts │ │ ├── sso.ts │ │ ├── users.ts │ │ └── utils.ts │ ├── scim │ │ └── v2.0 │ │ │ ├── groups.spec.ts │ │ │ └── users.spec.ts │ └── v1 │ │ ├── directory-sync │ │ ├── directories.spec.ts │ │ ├── events.spec.ts │ │ ├── groups-members.spec.ts │ │ ├── groups.spec.ts │ │ ├── setup-links.spec.ts │ │ └── users.spec.ts │ │ ├── identity-federation │ │ └── app.spec.ts │ │ └── sso │ │ ├── jwks.spec.ts │ │ ├── oidc-discovery.spec.ts │ │ ├── oidc.spec.ts │ │ ├── saml.spec.ts │ │ ├── setup-links.spec.ts │ │ └── sso-traces.spec.ts ├── support │ ├── data │ │ └── dsync │ │ │ ├── azure.ts │ │ │ ├── index.ts │ │ │ └── okta.ts │ ├── fixtures │ │ ├── dsync-page.ts │ │ ├── identity-federation.ts │ │ ├── index.ts │ │ ├── portal.ts │ │ ├── setuplink-ds-page.ts │ │ ├── setuplink-page.ts │ │ └── sso-page.ts │ ├── globalSetup.ts │ ├── nextAuth.constants.ts │ └── pretest.ts └── ui │ ├── Directory Sync │ ├── connections.spec.ts │ └── setup_link_ds.spec.ts │ ├── Enterprise SSO │ ├── error.spec.ts │ ├── oidc.spec.ts │ ├── oidc_saml.spec.ts │ ├── saml.spec.ts │ └── setup_link.spec.ts │ ├── Identity Federation │ ├── error.spec.ts │ ├── oidc.spec.ts │ └── saml.spec.ts │ └── settings │ └── sso.spec.ts ├── ee ├── ENTERPRISE.md ├── LICENSE ├── branding │ ├── api │ │ ├── admin │ │ │ └── index.ts │ │ └── index.ts │ ├── pages │ │ └── index.tsx │ └── utils.ts ├── identity-federation │ ├── api │ │ ├── admin │ │ │ ├── [id] │ │ │ │ └── index.ts │ │ │ └── index.ts │ │ ├── metadata.ts │ │ ├── oidc │ │ │ └── idp-login │ │ │ │ └── [fedAppId].ts │ │ ├── sso.ts │ │ └── v1 │ │ │ ├── index.ts │ │ │ └── product.ts │ └── pages │ │ ├── edit.tsx │ │ ├── index.tsx │ │ ├── metadata.tsx │ │ └── new.tsx └── product │ └── api │ ├── [productId].ts │ └── index.ts ├── eslint.config.cjs ├── find-dupe-locale.js ├── helm ├── jackson │ ├── .helmignore │ ├── Chart.yaml │ ├── templates │ │ ├── _helpers.tpl │ │ └── dep-helm.yaml │ └── values.yaml └── source │ └── dep-helm.yaml ├── i18next.d.ts ├── internal-ui ├── .gitignore ├── LICENSE ├── README.md ├── dev │ └── verdaccio.sh ├── package-lock.json ├── package.json ├── postcss.config.js ├── src │ ├── branding │ │ ├── BrandingForm.tsx │ │ └── index.ts │ ├── dsync │ │ ├── DirectoryGroupInfo.tsx │ │ ├── DirectoryGroups.tsx │ │ ├── DirectoryInfo.tsx │ │ ├── DirectoryTab.tsx │ │ ├── DirectoryUserInfo.tsx │ │ ├── DirectoryUsers.tsx │ │ ├── DirectoryWebhookLogInfo.tsx │ │ ├── DirectoryWebhookLogs.tsx │ │ └── index.ts │ ├── hooks │ │ ├── index.ts │ │ ├── useDirectory.tsx │ │ ├── useFetch.ts │ │ ├── usePaginate.tsx │ │ └── useRouter.tsx │ ├── identity-federation │ │ ├── AttributesMapping.tsx │ │ ├── Edit.tsx │ │ ├── EditAttributesMapping.tsx │ │ ├── EditIdentityFederationApp.tsx │ │ ├── IdentityFederationApps.tsx │ │ ├── NewIdentityFederationApp.tsx │ │ └── index.ts │ ├── index.ts │ ├── provider.tsx │ ├── setup-link │ │ ├── DSyncForm.tsx │ │ ├── NewSetupLink.tsx │ │ ├── SSOForm.tsx │ │ ├── SetupLinkInfo.tsx │ │ ├── SetupLinkInfoModal.tsx │ │ ├── SetupLinks.tsx │ │ └── index.ts │ ├── shared │ │ ├── Alert.tsx │ │ ├── Badge.tsx │ │ ├── ButtonBase.tsx │ │ ├── ButtonDanger.tsx │ │ ├── ButtonOutline.tsx │ │ ├── ButtonPrimary.tsx │ │ ├── Card.tsx │ │ ├── ConfirmationModal.tsx │ │ ├── DeleteCard.tsx │ │ ├── EmptyState.tsx │ │ ├── Error.tsx │ │ ├── IconButton.tsx │ │ ├── InputWithCopyButton.tsx │ │ ├── LinkBack.tsx │ │ ├── LinkBase.tsx │ │ ├── LinkOutline.tsx │ │ ├── LinkPrimary.tsx │ │ ├── Loading.tsx │ │ ├── Modal.tsx │ │ ├── PageHeader.tsx │ │ ├── Pagination.tsx │ │ ├── PrismLoader.tsx │ │ ├── Table.tsx │ │ └── index.ts │ ├── sso-traces │ │ ├── SSOTraceInfo.tsx │ │ ├── SSOTraces.tsx │ │ └── index.ts │ ├── types.ts │ ├── utils.ts │ └── well-known │ │ ├── WellKnownURLs.tsx │ │ └── index.ts ├── tsconfig.json ├── vite-env.d.ts └── vite.config.ts ├── kustomize ├── base │ ├── jackson-deployment.yaml │ ├── kustomization.yaml │ ├── migration │ │ ├── kustomization.yaml │ │ └── migratepg-job.yaml │ ├── namespace.yaml │ └── services │ │ ├── internal │ │ ├── jackson-internal-service.yaml │ │ └── kustomization.yaml │ │ ├── jackson-service.yaml │ │ └── kustomization.yaml └── overlays │ ├── dbs │ ├── dynamodb │ │ ├── dynamodb.yaml │ │ └── kustomization.yaml │ ├── mariadb │ │ ├── kustomization.yaml │ │ └── mariadb.yaml │ ├── mongo │ │ ├── kustomization.yaml │ │ └── mongo.yaml │ ├── mssql │ │ ├── kustomization.yaml │ │ └── mssql.yaml │ ├── mysql │ │ ├── kustomization.yaml │ │ └── mysql.yaml │ └── postgres │ │ ├── kustomization.yaml │ │ └── postgres.yaml │ ├── demo │ ├── .gitignore │ ├── jackson-deployment.yaml │ ├── kustomization.yaml │ ├── migratepg-job.yaml │ ├── mocksaml │ │ ├── kustomization.yaml │ │ └── mocksaml-deployment.yaml │ └── services │ │ ├── jackson-service.yaml │ │ ├── kustomization.yaml │ │ └── mocksaml │ │ ├── kustomization.yaml │ │ └── mocksaml-service.yaml │ ├── dynamodb │ ├── kustomization.yaml │ └── secrets.yaml │ ├── mariadb │ ├── kustomization.yaml │ └── secrets.yaml │ ├── mongo │ ├── kustomization.yaml │ └── secrets.yaml │ ├── mssql │ ├── kustomization.yaml │ └── secrets.yaml │ ├── mysql │ ├── kustomization.yaml │ └── secrets.yaml │ ├── postgres │ ├── kustomization.yaml │ ├── migratepg-job.yaml │ └── secrets.yaml │ └── prod-eu │ ├── .gitignore │ ├── jackson-deployment.yaml │ ├── kustomization.yaml │ ├── migratepg-job.yaml │ ├── mocksaml │ ├── kustomization.yaml │ └── mocksaml-deployment.yaml │ └── services │ ├── jackson-service.yaml │ ├── kustomization.yaml │ └── mocksaml │ ├── kustomization.yaml │ └── mocksaml-service.yaml ├── lib ├── api │ ├── default.ts │ ├── index.ts │ └── utils.ts ├── auth.ts ├── color.ts ├── constants.ts ├── development-mode.ts ├── env.ts ├── error.ts ├── jackson.ts ├── logger.ts ├── metrics.ts ├── middleware.ts ├── nextAuthAdapter.ts ├── retraced.ts ├── ui │ ├── hooks │ │ ├── useIdpEntityID.ts │ │ ├── usePaginate.ts │ │ └── useSetupLink.ts │ ├── retraced.ts │ └── utils.ts └── utils.ts ├── locales └── en │ └── common.json ├── middleware.ts ├── migrate.sh ├── next-env.d.ts ├── next-i18next.config.js ├── next.config.js ├── npm ├── .eslintignore ├── .gitignore ├── LICENSE ├── README.md ├── map.js ├── migrate-mongo-config.js ├── migration │ ├── cockroachdb │ │ └── 1733850225778-pg_Initial.ts │ ├── mariadb │ │ ├── 1669204927486-md_Initial.ts │ │ ├── 1692767993709-md_namespace.ts │ │ ├── 1695120700240-md_sortorder.ts │ │ └── 1714417013715-md_namespace.ts │ ├── mongo │ │ └── 20230824060000-namespace.js │ ├── mssql │ │ ├── 1669211007419-mss_Initial.ts │ │ ├── 1692767993709-mss_namespace.ts │ │ ├── 1692817789888-mss_namespace.ts │ │ └── 1714421718208-mss_namespace.ts │ ├── mysql │ │ ├── 1669204920448-ms_Initial.ts │ │ ├── 1692767993709-ms_namespace.ts │ │ ├── 1695120580071-ms_sortorder.ts │ │ └── 1714419315556-ms_namespace.ts │ ├── planetscale │ │ ├── 1653746497237-ms_nocascade.ts │ │ ├── 1692767993709-ms_namespace.ts │ │ ├── 1695120599689-ms_sortorder.ts │ │ └── 1714457285484-ms_namespace.ts │ ├── postgres │ │ ├── 1640877103193-Initial.ts │ │ ├── 1644332647279-createdAt.ts │ │ ├── 1692767993709-pg_namespace.ts │ │ └── 1714452929542-pg_namespace.ts │ ├── sql │ │ └── 1692817789888-namespace.ts │ └── sqlite │ │ └── 1716476500487-sqlite_Initial.ts ├── package-lock.json ├── package.json ├── src │ ├── controller │ │ ├── admin.ts │ │ ├── analytics.ts │ │ ├── api.ts │ │ ├── connection │ │ │ ├── oidc.ts │ │ │ └── saml.ts │ │ ├── error.ts │ │ ├── logout.ts │ │ ├── oauth.ts │ │ ├── oauth │ │ │ ├── allowed.ts │ │ │ ├── code-verifier.ts │ │ │ ├── oidc-client.ts │ │ │ └── redirect.ts │ │ ├── oidc-discovery.ts │ │ ├── setup-link.ts │ │ ├── sp-config.ts │ │ ├── sso-handler.ts │ │ └── utils.ts │ ├── cron │ │ └── lock.ts │ ├── db │ │ ├── db.ts │ │ ├── defaultDb.ts │ │ ├── dynamoDb.ts │ │ ├── encrypter.ts │ │ ├── mem.ts │ │ ├── mongo.ts │ │ ├── planetscale │ │ │ └── entity │ │ │ │ ├── JacksonIndex.ts │ │ │ │ ├── JacksonStore.ts │ │ │ │ └── JacksonTTL.ts │ │ ├── redis.ts │ │ ├── sql │ │ │ ├── entity │ │ │ │ ├── JacksonIndex.ts │ │ │ │ ├── JacksonStore.ts │ │ │ │ └── JacksonTTL.ts │ │ │ ├── mariadb │ │ │ │ └── entity │ │ │ │ │ ├── JacksonIndex.ts │ │ │ │ │ ├── JacksonStore.ts │ │ │ │ │ └── JacksonTTL.ts │ │ │ ├── mssql.ts │ │ │ ├── mssql │ │ │ │ └── entity │ │ │ │ │ ├── JacksonIndex.ts │ │ │ │ │ ├── JacksonStore.ts │ │ │ │ │ └── JacksonTTL.ts │ │ │ ├── sql.ts │ │ │ └── sqlite │ │ │ │ └── entity │ │ │ │ ├── JacksonIndex.ts │ │ │ │ ├── JacksonStore.ts │ │ │ │ └── JacksonTTL.ts │ │ ├── store.ts │ │ └── utils.ts │ ├── directory-sync │ │ ├── batch-events │ │ │ └── queue.ts │ │ ├── index.ts │ │ ├── non-scim │ │ │ ├── google │ │ │ │ ├── api.ts │ │ │ │ ├── index.ts │ │ │ │ └── oauth.ts │ │ │ ├── index.ts │ │ │ ├── syncGroupMembers.ts │ │ │ ├── syncGroups.ts │ │ │ ├── syncUsers.ts │ │ │ └── utils.ts │ │ ├── request.ts │ │ ├── scim │ │ │ ├── Base.ts │ │ │ ├── DirectoryConfig.ts │ │ │ ├── DirectoryGroups.ts │ │ │ ├── DirectoryUsers.ts │ │ │ ├── Groups.ts │ │ │ ├── Users.ts │ │ │ ├── WebhookEventsLogger.ts │ │ │ ├── transform.ts │ │ │ └── utils.ts │ │ ├── types.ts │ │ └── utils.ts │ ├── ee │ │ ├── LICENSE │ │ ├── branding │ │ │ └── index.ts │ │ ├── common │ │ │ └── checkLicense.ts │ │ ├── identity-federation │ │ │ ├── app.ts │ │ │ ├── idp-login.ts │ │ │ ├── index.ts │ │ │ ├── sso.ts │ │ │ └── types.ts │ │ ├── ory │ │ │ └── ory.ts │ │ └── product │ │ │ └── index.ts │ ├── event │ │ ├── axios.ts │ │ ├── index.ts │ │ ├── types.ts │ │ ├── utils.ts │ │ └── webhook.ts │ ├── index.ts │ ├── loadConnection.ts │ ├── opentelemetry │ │ └── metrics.ts │ ├── saml │ │ ├── claims.ts │ │ ├── lib.ts │ │ └── x509.ts │ ├── sso-traces │ │ ├── index.ts │ │ └── types.ts │ └── typings.ts ├── test │ ├── db │ │ └── db.test.ts │ ├── dsync │ │ ├── batch │ │ │ └── webhooks.test.ts │ │ ├── data │ │ │ ├── directories.ts │ │ │ ├── group-requests.ts │ │ │ ├── groups.ts │ │ │ ├── user-requests.ts │ │ │ └── users.ts │ │ ├── directories.test.ts │ │ ├── google_api.test.ts │ │ ├── google_oauth.test.ts │ │ ├── groups.test.ts │ │ ├── membership.test.ts │ │ ├── users.test.ts │ │ └── webhooks.test.ts │ ├── event │ │ └── index.test.ts │ ├── identity-federation │ │ ├── app.test.ts │ │ ├── constants.ts │ │ ├── data │ │ │ ├── metadata.xml │ │ │ ├── request.xml │ │ │ └── response.xml │ │ └── sso.test.ts │ ├── setup-link.test.ts │ ├── sso-traces │ │ └── tracer.test.ts │ ├── sso │ │ ├── data │ │ │ ├── logout_response.xml │ │ │ ├── logout_response_failed.xml │ │ │ ├── metadata │ │ │ │ ├── boxyhq.js │ │ │ │ ├── boxyhq.xml │ │ │ │ ├── example.js │ │ │ │ ├── example.oidc.js │ │ │ │ ├── example.xml │ │ │ │ ├── invalidSSODescriptor │ │ │ │ │ ├── invalidssodescriptor.js │ │ │ │ │ └── invalidssodescriptor.xml │ │ │ │ ├── nobinding │ │ │ │ │ ├── boxyhq-nobinding.js │ │ │ │ │ └── boxyhq-nobinding.xml │ │ │ │ └── noentityID │ │ │ │ │ ├── boxyhq-noentityID.js │ │ │ │ │ └── boxyhq-noentityID.xml │ │ │ └── saml_response │ │ ├── fixture.ts │ │ ├── logout.test.ts │ │ ├── oidc_idp_api.test.ts │ │ ├── oidc_idp_oauth.test.ts │ │ ├── saml_idp_api.test.ts │ │ ├── saml_idp_oauth.test.ts │ │ └── saml_idp_oauth_flattened.test.ts │ └── utils.ts ├── tsconfig.build.json ├── tsconfig.json └── typeorm.ts ├── package-lock.json ├── package.json ├── pages ├── _app.tsx ├── _document.tsx ├── admin │ ├── auth │ │ ├── idp-login.tsx │ │ └── login.tsx │ ├── dashboard.tsx │ ├── directory-sync │ │ ├── [directoryId] │ │ │ ├── edit.tsx │ │ │ ├── events │ │ │ │ ├── [eventId].tsx │ │ │ │ └── index.tsx │ │ │ ├── groups │ │ │ │ ├── [groupId].tsx │ │ │ │ └── index.tsx │ │ │ ├── index.tsx │ │ │ └── users │ │ │ │ ├── [userId].tsx │ │ │ │ └── index.tsx │ │ ├── index.tsx │ │ └── new.tsx │ ├── identity-federation │ │ ├── [id] │ │ │ └── edit.tsx │ │ ├── index.tsx │ │ └── new.tsx │ ├── retraced │ │ ├── index.tsx │ │ └── projects │ │ │ ├── [id] │ │ │ ├── events.tsx │ │ │ └── index.tsx │ │ │ ├── index.tsx │ │ │ └── new.tsx │ ├── settings │ │ ├── branding │ │ │ └── index.tsx │ │ └── sso-connection │ │ │ ├── edit │ │ │ └── [id].tsx │ │ │ ├── index.tsx │ │ │ └── new.tsx │ ├── setup-link │ │ ├── index.tsx │ │ └── new.tsx │ ├── sso-connection │ │ ├── edit │ │ │ └── [id].tsx │ │ ├── index.tsx │ │ └── new.tsx │ └── sso-traces │ │ ├── [traceId] │ │ └── inspect.tsx │ │ └── index.tsx ├── api │ ├── admin │ │ ├── branding.ts │ │ ├── connections │ │ │ ├── [clientId].ts │ │ │ ├── idp-entityid.ts │ │ │ └── index.ts │ │ ├── directory-sync │ │ │ ├── [directoryId] │ │ │ │ ├── events │ │ │ │ │ ├── [eventId].ts │ │ │ │ │ └── index.ts │ │ │ │ ├── groups │ │ │ │ │ ├── [groupId].ts │ │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ └── users │ │ │ │ │ ├── [userId].ts │ │ │ │ │ └── index.ts │ │ │ ├── index.ts │ │ │ └── providers.ts │ │ ├── identity-federation │ │ │ ├── [id] │ │ │ │ └── index.ts │ │ │ └── index.ts │ │ ├── retraced │ │ │ └── projects │ │ │ │ ├── [id] │ │ │ │ ├── groups.ts │ │ │ │ ├── index.ts │ │ │ │ └── viewer-token.ts │ │ │ │ └── index.ts │ │ ├── setup-links │ │ │ └── index.ts │ │ └── sso-traces │ │ │ ├── [traceId] │ │ │ └── index.ts │ │ │ └── index.ts │ ├── auth │ │ └── [...nextauth].ts │ ├── branding.ts │ ├── federated-saml │ │ └── sso.ts │ ├── health.ts │ ├── hello.ts │ ├── identity-federation │ │ ├── oidc │ │ │ └── idp-login │ │ │ │ └── [fedAppId].ts │ │ └── sso.ts │ ├── import-hack.ts │ ├── internals │ │ └── product │ │ │ ├── [productId].ts │ │ │ └── index.ts │ ├── logout │ │ ├── callback.ts │ │ └── index.ts │ ├── oauth │ │ ├── authorize.ts │ │ ├── jwks.ts │ │ ├── oidc.ts │ │ ├── saml.ts │ │ ├── token.ts │ │ └── userinfo.ts │ ├── scim │ │ ├── oauth │ │ │ ├── authorize.ts │ │ │ └── callback.ts │ │ └── v2.0 │ │ │ └── [...directory].ts │ ├── setup │ │ └── [token] │ │ │ ├── directory-sync │ │ │ ├── [directoryId] │ │ │ │ └── index.ts │ │ │ ├── index.ts │ │ │ └── providers.ts │ │ │ ├── index.ts │ │ │ └── sso-connection │ │ │ ├── [id].ts │ │ │ ├── idp-entityid.ts │ │ │ └── index.ts │ ├── v1 │ │ ├── dsync │ │ │ ├── [directoryId].ts │ │ │ ├── cron │ │ │ │ ├── process-events.ts │ │ │ │ └── sync-google.ts │ │ │ ├── events │ │ │ │ ├── [eventId].ts │ │ │ │ └── index.ts │ │ │ ├── groups │ │ │ │ ├── [groupId] │ │ │ │ │ ├── index.ts │ │ │ │ │ └── members.ts │ │ │ │ └── index.ts │ │ │ ├── index.ts │ │ │ ├── product.ts │ │ │ ├── setuplinks │ │ │ │ ├── index.ts │ │ │ │ └── product.ts │ │ │ └── users │ │ │ │ ├── [userId].ts │ │ │ │ └── index.ts │ │ ├── identity-federation │ │ │ ├── index.ts │ │ │ └── product.ts │ │ ├── saml │ │ │ ├── config.ts │ │ │ └── config │ │ │ │ └── exists.ts │ │ ├── sso-traces │ │ │ ├── index.ts │ │ │ └── product │ │ │ │ ├── count.ts │ │ │ │ └── index.ts │ │ ├── sso │ │ │ ├── exists.ts │ │ │ ├── index.ts │ │ │ ├── product.ts │ │ │ └── setuplinks │ │ │ │ ├── index.ts │ │ │ │ └── product.ts │ │ └── stats │ │ │ ├── index.ts │ │ │ └── product.ts │ └── well-known │ │ ├── idp-metadata.ts │ │ ├── openid-configuration.ts │ │ ├── saml.cer.ts │ │ └── sp-metadata.ts ├── error.tsx ├── idp │ └── select.tsx ├── index.tsx ├── setup │ └── [token] │ │ ├── directory-sync │ │ ├── [directoryId] │ │ │ ├── edit.tsx │ │ │ └── index.tsx │ │ ├── index.tsx │ │ └── new.tsx │ │ ├── index.tsx │ │ └── sso-connection │ │ ├── edit │ │ └── [id].tsx │ │ ├── index.tsx │ │ └── new.tsx └── well-known │ ├── idp-configuration.tsx │ ├── index.tsx │ ├── oidc-configuration.tsx │ └── saml-configuration.tsx ├── performance-test ├── Readme.md └── k6 │ ├── dsync-load-test.js │ ├── idFed-load-test.js │ ├── scim-load-test.js │ └── sso-load-test.js ├── playwright.config.ts ├── postbuild.ts ├── postcss.config.js ├── public ├── favicon.ico └── logo.png ├── samljackson480.gif ├── skaffold-demo-mocksaml-services.yaml ├── skaffold-demo-mocksaml.yaml ├── skaffold-demo-services.yaml ├── skaffold-demo.yaml ├── skaffold-dynamodb.yaml ├── skaffold-mariadb.yaml ├── skaffold-mongo.yaml ├── skaffold-mssql.yaml ├── skaffold-mysql.yaml ├── skaffold-postgres.yaml ├── skaffold-prod-eu-mocksaml-services.yaml ├── skaffold-prod-eu-mocksaml.yaml ├── skaffold-prod-eu-services.yaml ├── skaffold-prod-eu.yaml ├── styles ├── globals.css └── sdk-override.module.css ├── swagger ├── swagger-definition.js └── swagger.json ├── tailwind.config.js ├── tsconfig.json └── types ├── base.ts ├── index.ts └── retraced.ts /.dockerignore: -------------------------------------------------------------------------------- 1 | Dockerfile 2 | .dockerignore 3 | **/node_modules 4 | npm-debug.log 5 | README.md 6 | .next 7 | .git 8 | .github 9 | _dev 10 | .vscode 11 | swagger 12 | .husky -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Report any issues with the platform 4 | title: '' 5 | labels: bug 6 | assignees: '' 7 | --- 8 | 9 | Found a bug? Please fill out the sections below. 👍 10 | 11 | ### Issue Summary 12 | 13 | A summary of the issue. This needs to be a clear detailed-rich summary. 14 | 15 | ### Steps to Reproduce 16 | 17 | 1. (for example) Went to ... 18 | 2. Clicked on... 19 | 3. ... 20 | 21 | Any other relevant information. For example, why do you consider this a bug and what did you expect to happen instead? 22 | 23 | ### Technical details 24 | 25 | - Browser version: You can use https://www.whatsmybrowser.org/ to find this out. 26 | - Node.js version 27 | - Anything else that you think could be an issue. 28 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: Questions 4 | url: https://github.com/ory/polis/discussions 5 | about: Ask a general question about the project on our GitHub Discussion page 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | _config 4 | .eslintcache 5 | 6 | # dependencies 7 | /node_modules 8 | /.pnp 9 | .pnp.js 10 | 11 | # testing 12 | /coverage 13 | 14 | # next.js 15 | /.next/ 16 | /out/ 17 | 18 | # production 19 | /build 20 | 21 | # misc 22 | .DS_Store 23 | *.pem 24 | 25 | # debug 26 | npm-debug.log* 27 | yarn-debug.log* 28 | yarn-error.log* 29 | 30 | # local env files 31 | .env.local 32 | .env.development.local 33 | .env.test.local 34 | .env.production.local 35 | 36 | # vercel 37 | .vercel 38 | 39 | # typescript 40 | *.tsbuildinfo 41 | .nyc_output/** 42 | 43 | npmversion.txt 44 | publishTag.txt 45 | .env 46 | _dev/docker/dynamodb/shared-local-instance.db 47 | public/terminus/sprites.png 48 | **/.tap/** 49 | 50 | internal-ui/dist 51 | _dev/docker/libsql/iku.db 52 | 53 | # tests 54 | /report 55 | /test-results/ 56 | /playwright-report/ 57 | /playwright/.cache/ 58 | .idea 59 | _dev/cockroach-data 60 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .next 3 | public 4 | **/**/node_modules 5 | **/**/.next 6 | **/**/public 7 | npm/migration/** 8 | npm/dist/** 9 | npm/.nyc_output/** 10 | .vscode/** 11 | 12 | npm/package-lock.json 13 | 14 | *.lock 15 | *.log 16 | 17 | .gitignore 18 | .npmignore 19 | .prettierignore 20 | .DS_Store 21 | .eslintignore 22 | 23 | **/LICENSE 24 | swagger/swagger.json 25 | e2e/state.json 26 | 27 | internal-ui/dist/** 28 | 29 | helm 30 | eslint.config.cjs 31 | -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | bracketSpacing: true, 3 | bracketSameLine: true, 4 | singleQuote: true, 5 | jsxSingleQuote: true, 6 | trailingComma: 'es5', 7 | semi: true, 8 | printWidth: 110, 9 | arrowParens: 'always', 10 | overrides: [ 11 | { 12 | files: ['tsconfig.json', 'jsconfig.json'], 13 | options: { 14 | parser: 'jsonc', 15 | }, 16 | }, 17 | ], 18 | }; 19 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "yzhang.markdown-all-in-one", // nicer markdown support 4 | "esbenp.prettier-vscode", // prettier plugin 5 | "dbaeumer.vscode-eslint", // eslint plugin 6 | "bradlc.vscode-tailwindcss", // hinting / autocompletion for tailwind 7 | "ban.spellright", // Spell check for docs 8 | "fabianlauer.vs-code-xml-format" // xml formatter 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.formatOnSave": true, 3 | "files.exclude": { 4 | "**/.next": true, 5 | "**/.nyc_output": true, 6 | "**/dist": true, 7 | "**/node_modules": true 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: npm start -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Responsible Disclosure 2 | 3 | ## Reporting a Vulnerability 4 | 5 | We strive to stay ahead of security vulnerabilities but would love to get the community's help in making us aware of the ones we miss. 6 | 7 | Please email `security@boxyhq.com` to report security vulnerabilities and exploits. 8 | 9 | We will acknowledge legitimate reports and address it according to the severity. 10 | -------------------------------------------------------------------------------- /_dev/docker-compose-cockroachdb.yml: -------------------------------------------------------------------------------- 1 | services: 2 | cockroachdb: 3 | image: cockroachdb/cockroach:v24.3.0 4 | platform: linux/amd64 5 | ports: 6 | - '26257:26257' 7 | - '8081:8080' 8 | command: start-single-node --insecure 9 | -------------------------------------------------------------------------------- /_dev/saml_config/boxyhq.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | defaultRedirectUrl: 'http://localhost:3366/login/saml', 3 | redirectUrl: '["http://localhost:3366/*"]', 4 | tenant: 'boxyhq.com', 5 | product: 'saml-demo.boxyhq.com', 6 | name: 'Mock SAML', 7 | }; 8 | -------------------------------------------------------------------------------- /components/LicenseRequired.tsx: -------------------------------------------------------------------------------- 1 | import { EmptyState } from '@boxyhq/internal-ui'; 2 | 3 | const LicenseRequired = () => { 4 | return ( 5 | 9 | ); 10 | }; 11 | 12 | export default LicenseRequired; 13 | -------------------------------------------------------------------------------- /components/PoweredBy.tsx: -------------------------------------------------------------------------------- 1 | import { useTranslation } from 'next-i18next'; 2 | 3 | export const PoweredBy = () => { 4 | const { t } = useTranslation('common'); 5 | 6 | return ( 7 |

8 | 9 | {t('boxyhq_powered_by')} 10 | 11 |

12 | ); 13 | }; 14 | -------------------------------------------------------------------------------- /components/layouts/index.ts: -------------------------------------------------------------------------------- 1 | export { AccountLayout } from './AccountLayout'; 2 | export { SetupLinkLayout } from './SetupLinkLayout'; 3 | -------------------------------------------------------------------------------- /components/setup-link-instructions/Footer.tsx: -------------------------------------------------------------------------------- 1 | import NextButton from '@components/setup-link-instructions/NextButton'; 2 | import PreviousButton from '@components/setup-link-instructions/PreviousButton'; 3 | 4 | interface FooterProps { 5 | hasNext?: boolean; 6 | } 7 | 8 | const Footer = ({ hasNext = true }: FooterProps) => { 9 | return ( 10 |
11 | 12 | {hasNext && } 13 |
14 | ); 15 | }; 16 | 17 | export default Footer; 18 | -------------------------------------------------------------------------------- /components/setup-link-instructions/NextButton.tsx: -------------------------------------------------------------------------------- 1 | import { useRouter } from 'next/router'; 2 | import { useTranslation } from 'next-i18next'; 3 | import { ButtonPrimary } from '@boxyhq/internal-ui'; 4 | 5 | const NextButton = () => { 6 | const router = useRouter(); 7 | const { t } = useTranslation('common'); 8 | 9 | const onClick = () => { 10 | const { idp, step, token } = router.query as { idp: string; step: string; token: string }; 11 | 12 | router.push({ 13 | pathname: router.pathname, 14 | query: { 15 | idp, 16 | step: parseInt(step) + 1, 17 | token, 18 | }, 19 | }); 20 | }; 21 | 22 | return ( 23 |
24 | {t('next_step')} 25 |
26 | ); 27 | }; 28 | 29 | export default NextButton; 30 | -------------------------------------------------------------------------------- /components/setup-link-instructions/PreviousButton.tsx: -------------------------------------------------------------------------------- 1 | import { useRouter } from 'next/router'; 2 | import { useTranslation } from 'next-i18next'; 3 | import { ButtonOutline } from '@boxyhq/internal-ui'; 4 | 5 | const PreviousButton = () => { 6 | const router = useRouter(); 7 | const { t } = useTranslation('common'); 8 | 9 | const onClick = () => { 10 | const { idp, step, token } = router.query as { idp: string; step: string; token: string }; 11 | 12 | router.push({ 13 | pathname: router.pathname, 14 | query: { 15 | idp, 16 | step: parseInt(step) - 1, 17 | token, 18 | }, 19 | }); 20 | }; 21 | 22 | return ( 23 |
24 | {t('previous_step')} 25 |
26 | ); 27 | }; 28 | 29 | export default PreviousButton; 30 | -------------------------------------------------------------------------------- /components/setup-link-instructions/SelectIdentityProviders.tsx: -------------------------------------------------------------------------------- 1 | import { useRouter } from 'next/router'; 2 | 3 | import { identityProviders } from '@lib/constants'; 4 | 5 | const SelectIdentityProviders = () => { 6 | const router = useRouter(); 7 | 8 | const onClick = (id: string) => { 9 | const params = new URLSearchParams({ 10 | idp: id, 11 | step: '1', 12 | }); 13 | 14 | router.push(router.asPath + '?' + params.toString()); 15 | }; 16 | 17 | return ( 18 |
19 | {identityProviders.map((provider) => ( 20 | 26 | ))} 27 |
28 | ); 29 | }; 30 | 31 | export default SelectIdentityProviders; 32 | -------------------------------------------------------------------------------- /components/setup-link-instructions/auth0/1.mdx: -------------------------------------------------------------------------------- 1 | ## Step 1: Create Application 2 | 3 | From your Auth0 dashboard, click **Applications** from the left navigation menu. 4 | 5 | If your application is already created, choose it from the list and move to the next step. 6 | 7 | ![img alt](https://cdn.boxyhq.com/docs/sso/providers/auth0/1.png) 8 | 9 | If you haven't created a SAML application, click the **Create Application** button to create a new application. 10 | 11 | Give your application a **Name** and click **Create**. 12 | 13 | ![img alt](https://cdn.boxyhq.com/docs/sso/providers/auth0/5.png) 14 | 15 |