From 8228808435965f1a69ff5aff2aae11aa436ee049 Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 8 Aug 2025 14:39:50 +1000 Subject: [PATCH 1/9] Creating an interactive sub-processors form --- src/components/SubProcessorsForm.astro | 588 ++++++++++++++++++ .../sub-processors-interactive.mdx | 53 ++ .../privacy-and-compliance/sub-processors.mdx | 15 +- 3 files changed, 654 insertions(+), 2 deletions(-) create mode 100644 src/components/SubProcessorsForm.astro create mode 100644 src/content/docs/trust-center/privacy-and-compliance/sub-processors-interactive.mdx diff --git a/src/components/SubProcessorsForm.astro b/src/components/SubProcessorsForm.astro new file mode 100644 index 00000000..682332f6 --- /dev/null +++ b/src/components/SubProcessorsForm.astro @@ -0,0 +1,588 @@ +--- +// Astro component for interactive sub-processors form +--- + +
+
+

Configure your Kinde setup

+ + + + + + + + +
+ +
+ + +
+
+ +
+ + + + + +
+
+ +
+ + +
+
+ +
+ + +
+
+
+ + +
+ + \ No newline at end of file diff --git a/src/content/docs/trust-center/privacy-and-compliance/sub-processors-interactive.mdx b/src/content/docs/trust-center/privacy-and-compliance/sub-processors-interactive.mdx new file mode 100644 index 00000000..4a3707e0 --- /dev/null +++ b/src/content/docs/trust-center/privacy-and-compliance/sub-processors-interactive.mdx @@ -0,0 +1,53 @@ +--- +page_id: 9812b3a4-9368-4c26-aaba-6686cd47610a +title: Sub-processors - Interactive +description: "Interactive tool to view relevant sub-processors based on your Kinde configuration including data region, services used, and email provider." +sidebar: + order: 5 +relatedArticles: + - 9aca52ac-b374-4dce-b1fe-460df48f0f86 +topics: + - "trust-center" + - "privacy-and-compliance" + - "data-processing" +sdk: null +languages: null +audience: + - "business-owners" + - "admins" + - "legal" + - "compliance" +complexity: "beginner" +keywords: + - "sub-processors" + - "data processing" + - "privacy" + - "GDPR" + - "DPA" + - "third-party services" + - "interactive" + - "configuration" +updated: "2024-08-02" +featured: false +deprecated: false +ai_summary: "Interactive tool to view relevant sub-processors based on your Kinde configuration including data region, services used, and email provider." +--- + +import SubProcessorsForm from '../../../../components/SubProcessorsForm.astro'; + +Please refer to the [sub-processors](/trust-center/privacy-and-compliance/sub-processors/) page for a comprehensive list of sub-processors, more information about how we use them, and how to request a Data Processing Agreement (DPA). + +Use the form below to see only the sub-processors relevant to your specific Kinde business. + + + +## About this tool + +This interactive tool helps you identify which sub-processors are relevant to your specific Kinde business. The URL can be bookmarked for future reference. + +The results are filtered based on: + +- **Data Region**: The region where your Kinde instance is hosted +- **Services Used**: Which Kinde services you're actively using +- **Email Provider**: Whether you're using Kinde's default email service or your own custom SMTP provider +- **SMS Provider**: Whether you're using Kinde's default SMS service or your own custom SMS provider diff --git a/src/content/docs/trust-center/privacy-and-compliance/sub-processors.mdx b/src/content/docs/trust-center/privacy-and-compliance/sub-processors.mdx index 3517f62a..192e0cfd 100644 --- a/src/content/docs/trust-center/privacy-and-compliance/sub-processors.mdx +++ b/src/content/docs/trust-center/privacy-and-compliance/sub-processors.mdx @@ -6,6 +6,7 @@ sidebar: order: 3 relatedArticles: - 58403493-55f6-423c-9464-ccd6e21ef2f7 + - 9812b3a4-9368-4c26-aaba-6686cd47610a topics: - "trust-center" - "privacy-and-compliance" @@ -40,19 +41,28 @@ If you have signed a Data Processing Agreement (DPA) with Kinde, we will notify Last update to the sub-processors for the external users is August 11, 2025. + + ## Sub-Processors for external users - Authentication External users are customers of Kinde’s customers. -Kinde will share external user personal information to the following third parties to facilitate authentication and customer support. For public cloud hosting and webhooks, the location is directly aligned only with the customer’s selected Kinde region. +Kinde will share external user personal information to the following third parties to facilitate authentication and customer support. For public cloud hosting, SMS services, and webhooks, the location is directly aligned only with the customer’s selected Kinde region. Email services: If you are using your own custom SMTP provider to send emails via Kinde, AWS for email services is not a sub-processor. +SMS services: If you are using your own custom SMS provider to send SMS via Kinde, AWS for SMS services is not a sub-processor. + Customer support: We do not recommend sending external user personal information, such as their email, in our support conversations, however we acknowledge that this may happen. All customer support tools, whether you interact with them or not, and their location of processing are listed. | Service provider | Entity type | Link | Location | | ---------------- | -------------------- | -------------------------------------------------------------- | --------------------------------------------------------- | | AWS | Public cloud hosting | [https://aws.amazon.com](https://aws.amazon.com/) | Australia, Canada, Ireland, United Kingdom, United States | +| AWS | SMS services | [https://aws.amazon.com](https://aws.amazon.com/) | Australia, Canada, Ireland, United Kingdom, United States | | AWS | Email services | [https://aws.amazon.com](https://aws.amazon.com/) | Australia | | Temporal | Webhooks | [https://temporal.io](https://temporal.io/) | Australia, Canada, Ireland, United Kingdom, United States | | Discord | Customer support | [https://discord.com/](https://discord.com/) | United States | @@ -66,7 +76,7 @@ Customer support: We do not recommend sending external user personal information External users are customers of Kinde’s customers. -Kinde will share external user personal information to the following third parties to facilitate billing and customer support. For public cloud hosting and webhooks, the location is directly aligned only with the customer’s selected Kinde region. +Kinde will share external user personal information to the following third parties to facilitate billing and customer support. For public cloud hosting, SMS services, and webhooks, the location is directly aligned only with the customer’s selected Kinde region. Email services: If you are using your own custom SMTP provider to send emails via Kinde, AWS for email services is not a sub-processor. @@ -75,6 +85,7 @@ Customer support: We do not recommend sending external user personal information | Service provider | Entity type | Link | Location | | ---------------- | --------------------- | -------------------------------------------------------------- | --------------------------------------------------------- | | AWS | Public cloud hosting | [https://aws.amazon.com](https://aws.amazon.com/) | Australia, Canada, Ireland, United Kingdom, United States | +| AWS | SMS services | [https://aws.amazon.com](https://aws.amazon.com/) | Australia, Canada, Ireland, United Kingdom, United States | | AWS | Email services | [https://aws.amazon.com](https://aws.amazon.com/) | Australia | | Stripe | Billing and invoicing | [https://stripe.com](https://stripe.com/) | United States | | Temporal | Webhooks | [https://temporal.io](https://temporal.io/) | Australia, Canada, Ireland, United Kingdom, United States | From f16e92de8b7525fdb588d8e156497e607251a7e4 Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 8 Aug 2025 15:52:57 +1000 Subject: [PATCH 2/9] Updating JS --- src/components/SubProcessorsForm.astro | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/components/SubProcessorsForm.astro b/src/components/SubProcessorsForm.astro index 682332f6..95eb6e50 100644 --- a/src/components/SubProcessorsForm.astro +++ b/src/components/SubProcessorsForm.astro @@ -484,13 +484,18 @@ const serviceKey = service.toLowerCase() as keyof typeof subProcessorsData; if (subProcessorsData[serviceKey]) { subProcessorsData[serviceKey].forEach((processor: any) => { - // Check if processor should be included based on conditions - if (processor.condition) { - const condition = processor.condition.replace('emailServices', `'${emailServices}'`); - if (!eval(condition)) { + // Check if processor should be included based on conditions + if (processor.condition) { + if (processor.condition === "emailServices === 'Kinde default'") { + if (emailServices !== 'Kinde default') { + return; // Skip this processor + } + } else if (processor.condition === "smsServices === 'Kinde default'") { + if (smsServices !== 'Kinde default') { return; // Skip this processor } } + } relevantSubProcessors.push({ service: processor.service, From ea2a8c9811255d52615dc0792eb081f38937cb31 Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 8 Aug 2025 16:08:19 +1000 Subject: [PATCH 3/9] Adding references to other docs --- .../privacy-and-compliance/sub-processors-interactive.mdx | 4 ++-- .../privacy-and-compliance/sub-processors.mdx | 8 +++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/content/docs/trust-center/privacy-and-compliance/sub-processors-interactive.mdx b/src/content/docs/trust-center/privacy-and-compliance/sub-processors-interactive.mdx index 4a3707e0..b9eebccc 100644 --- a/src/content/docs/trust-center/privacy-and-compliance/sub-processors-interactive.mdx +++ b/src/content/docs/trust-center/privacy-and-compliance/sub-processors-interactive.mdx @@ -49,5 +49,5 @@ The results are filtered based on: - **Data Region**: The region where your Kinde instance is hosted - **Services Used**: Which Kinde services you're actively using -- **Email Provider**: Whether you're using Kinde's default email service or your own custom SMTP provider -- **SMS Provider**: Whether you're using Kinde's default SMS service or your own custom SMS provider +- **Email Provider**: Whether you're using Kinde's default email service or your own [custom SMTP provider](/get-started/connect/customize-email-sender) +- **SMS Provider**: Whether you're using Kinde's default SMS service or your own [custom SMS provider](/authenticate/authentication-methods/phone-authentication/) diff --git a/src/content/docs/trust-center/privacy-and-compliance/sub-processors.mdx b/src/content/docs/trust-center/privacy-and-compliance/sub-processors.mdx index 192e0cfd..6781fb3a 100644 --- a/src/content/docs/trust-center/privacy-and-compliance/sub-processors.mdx +++ b/src/content/docs/trust-center/privacy-and-compliance/sub-processors.mdx @@ -53,9 +53,9 @@ External users are customers of Kinde’s customers. Kinde will share external user personal information to the following third parties to facilitate authentication and customer support. For public cloud hosting, SMS services, and webhooks, the location is directly aligned only with the customer’s selected Kinde region. -Email services: If you are using your own custom SMTP provider to send emails via Kinde, AWS for email services is not a sub-processor. +Email services: If you are using your own [custom SMTP provider](/get-started/connect/customize-email-sender) to send emails via Kinde, AWS for email services is not a sub-processor. -SMS services: If you are using your own custom SMS provider to send SMS via Kinde, AWS for SMS services is not a sub-processor. +SMS services: If you are using your own [custom SMS provider](/authenticate/authentication-methods/phone-authentication/) to send SMS via Kinde, AWS for SMS services is not a sub-processor. Customer support: We do not recommend sending external user personal information, such as their email, in our support conversations, however we acknowledge that this may happen. All customer support tools, whether you interact with them or not, and their location of processing are listed. @@ -78,7 +78,9 @@ External users are customers of Kinde’s customers. Kinde will share external user personal information to the following third parties to facilitate billing and customer support. For public cloud hosting, SMS services, and webhooks, the location is directly aligned only with the customer’s selected Kinde region. -Email services: If you are using your own custom SMTP provider to send emails via Kinde, AWS for email services is not a sub-processor. +Email services: If you are using your own [custom SMTP provider](/get-started/connect/customize-email-sender) to send emails via Kinde, AWS for email services is not a sub-processor. + +SMS services: If you are using your own [custom SMS provider](/authenticate/authentication-methods/phone-authentication/) to send SMS via Kinde, AWS for SMS services is not a sub-processor. Customer support: We do not recommend sending external user personal information, such as their email, in our support conversations, however we acknowledge that this may happen. All customer support tools, whether you interact with them or not, and their location of processing are listed. From 6cf565a25427c084d1e4e2647fb1077ecc1b3645 Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 11 Aug 2025 21:52:06 +1000 Subject: [PATCH 4/9] Code review changes --- customHttp.yml | 25 ++++----- src/components/SubProcessorsForm.astro | 70 +++++++++++--------------- 2 files changed, 43 insertions(+), 52 deletions(-) diff --git a/customHttp.yml b/customHttp.yml index b1958338..9e460fcf 100644 --- a/customHttp.yml +++ b/customHttp.yml @@ -5,13 +5,13 @@ customHeaders: value: >- default-src 'self' *.kinde.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; frame-src - https://www.youtube-nocookie.com; child-src 'self'; connect-src 'self' - ws https://api.management.inkeep.com https://api.inkeep.com - wss://api.inkeep.com https://api.hsforms.com https://app.kinde.com - https://kinde.com https://kinde-api-docs-proxy.pages.dev - https://analytics.usehall.com; base-uri - 'none'; font-src 'self' https://fonts.gstatic.com; img-src 'self' - data: https://storage.googleapis.com https://imagedelivery.net + https://www.youtube-nocookie.com; child-src 'self'; + connect-src 'self' ws https://api.management.inkeep.com + https://api.inkeep.com wss://api.inkeep.com https://api.hsforms.com + https://app.kinde.com https://kinde.com + https://kinde-api-docs-proxy.pages.dev https://analytics.usehall.com; + base-uri 'none'; font-src 'self' https://fonts.gstatic.com; img-src + 'self' data: https://storage.googleapis.com https://imagedelivery.net https://customer-xcbruusbiervz265.cloudflarestream.com https://i.ytimg.com; media-src 'self' https://customer-xcbruusbiervz265.cloudflarestream.com @@ -46,7 +46,8 @@ customHeaders: 'sha256-w78n7W12c94ck4KhBCBA4NrjqkbDvSutqee+u+no0Tg=' 'sha256-/4BQzbQ0kgR1l13wtSM3rZ7nSvyV3PX/ShEfhZA1WoQ=' 'sha256-zB5rUhTjHzt+r/RjhhI8CyMb5Y63k+J7ICVfQ7iHJqA=' - 'sha256-fFmtUWM/kGeUru+1rcCArLmnXKoEjis5I/dYQkZA+HM=' 'self' + 'sha256-fFmtUWM/kGeUru+1rcCArLmnXKoEjis5I/dYQkZA+HM=' + 'sha256-13ENHEoc4foVPMgYwApSstLrIGX/6Y5xvroD2DkDFcE=' 'self' widgets.kinde.com kinde.com https://cdn.jsdelivr.net/npm/@scalar/api-reference@1.23.5/dist/browser/standalone.min.js - key: Strict-Transport-Security @@ -79,8 +80,8 @@ customHeaders: 'self' ws https://api.management.inkeep.com https://api.inkeep.com wss://api.inkeep.com https://api.hsforms.com https://app.kinde.com https://kinde.com https://api-spec.kinde.com - https://kinde-api-docs-proxy.pages.dev https://analytics.usehall.com; img-src - https://storage.googleapis.com + https://kinde-api-docs-proxy.pages.dev https://analytics.usehall.com; + img-src https://storage.googleapis.com - pattern: /kinde-apis/frontend/* headers: - key: Content-Security-Policy @@ -93,5 +94,5 @@ customHeaders: 'self' ws https://api.management.inkeep.com https://api.inkeep.com wss://api.inkeep.com https://api.hsforms.com https://app.kinde.com https://kinde.com https://api-spec.kinde.com - https://kinde-api-docs-proxy.pages.dev https://analytics.usehall.com; img-src - https://storage.googleapis.com + https://kinde-api-docs-proxy.pages.dev https://analytics.usehall.com; + img-src https://storage.googleapis.com diff --git a/src/components/SubProcessorsForm.astro b/src/components/SubProcessorsForm.astro index 95eb6e50..6885b504 100644 --- a/src/components/SubProcessorsForm.astro +++ b/src/components/SubProcessorsForm.astro @@ -356,9 +356,9 @@ }; document.addEventListener('DOMContentLoaded', function() { - const form = document.getElementById('subProcessorsForm') as HTMLFormElement; - const results = document.getElementById('results') as HTMLElement; - const tableContainer = document.getElementById('subProcessorsTable') as HTMLElement; + const form = document.getElementById('subProcessorsForm'); + const results = document.getElementById('results'); + const tableContainer = document.getElementById('subProcessorsTable'); if (!form || !results || !tableContainer) { console.error('Required form elements not found'); @@ -366,17 +366,17 @@ } // Function to get URL parameter value - function getUrlParameter(name: string): string | null { + function getUrlParameter(name) { const urlParams = new URLSearchParams(window.location.search); return urlParams.get(name); } // Function to update URL with current selections function updateUrl() { - const dataRegionInputs = form.querySelectorAll('input[name="dataRegion"]:checked') as NodeListOf; - const servicesInputs = form.querySelectorAll('input[name="services"]:checked') as NodeListOf; - const emailServicesInputs = form.querySelectorAll('input[name="emailServices"]:checked') as NodeListOf; - const smsServicesInputs = form.querySelectorAll('input[name="smsServices"]:checked') as NodeListOf; + const dataRegionInputs = form.querySelectorAll('input[name="dataRegion"]:checked'); + const servicesInputs = form.querySelectorAll('input[name="services"]:checked'); + const emailServicesInputs = form.querySelectorAll('input[name="emailServices"]:checked'); + const smsServicesInputs = form.querySelectorAll('input[name="smsServices"]:checked'); const dataRegion = dataRegionInputs.length > 0 ? dataRegionInputs[0].value : ''; const services = Array.from(servicesInputs).map(input => input.value); @@ -411,7 +411,7 @@ if (dataRegion) { const dataRegionValue = dataRegion.replace(/-/g, ' ').replace(/\b\w/g, l => l.toUpperCase()); - const dataRegionInput = form.querySelector(`input[name="dataRegion"][value="${dataRegionValue}"]`) as HTMLInputElement; + const dataRegionInput = form.querySelector(`input[name="dataRegion"][value="${dataRegionValue}"]`); if (dataRegionInput) { dataRegionInput.checked = true; } @@ -421,7 +421,7 @@ const serviceArray = services.split(','); serviceArray.forEach(service => { const serviceValue = service.charAt(0).toUpperCase() + service.slice(1); - const serviceInput = form.querySelector(`input[name="services"][value="${serviceValue}"]`) as HTMLInputElement; + const serviceInput = form.querySelector(`input[name="services"][value="${serviceValue}"]`); if (serviceInput) { serviceInput.checked = true; } @@ -437,7 +437,7 @@ } else { emailServicesValue = emailServices.replace(/-/g, ' ').replace(/\b\w/g, l => l.toUpperCase()); } - const emailServicesInput = form.querySelector(`input[name="emailServices"][value="${emailServicesValue}"]`) as HTMLInputElement; + const emailServicesInput = form.querySelector(`input[name="emailServices"][value="${emailServicesValue}"]`); if (emailServicesInput) { emailServicesInput.checked = true; } @@ -452,7 +452,7 @@ } else { smsServicesValue = smsServices.replace(/-/g, ' ').replace(/\b\w/g, l => l.toUpperCase()); } - const smsServicesInput = form.querySelector(`input[name="smsServices"][value="${smsServicesValue}"]`) as HTMLInputElement; + const smsServicesInput = form.querySelector(`input[name="smsServices"][value="${smsServicesValue}"]`); if (smsServicesInput) { smsServicesInput.checked = true; } @@ -461,10 +461,10 @@ // Function to check if all required fields are filled function checkFormCompletion() { - const dataRegionInputs = form.querySelectorAll('input[name="dataRegion"]:checked') as NodeListOf; - const servicesInputs = form.querySelectorAll('input[name="services"]:checked') as NodeListOf; - const emailServicesInputs = form.querySelectorAll('input[name="emailServices"]:checked') as NodeListOf; - const smsServicesInputs = form.querySelectorAll('input[name="smsServices"]:checked') as NodeListOf; + const dataRegionInputs = form.querySelectorAll('input[name="dataRegion"]:checked'); + const servicesInputs = form.querySelectorAll('input[name="services"]:checked'); + const emailServicesInputs = form.querySelectorAll('input[name="emailServices"]:checked'); + const smsServicesInputs = form.querySelectorAll('input[name="smsServices"]:checked'); const dataRegion = dataRegionInputs.length > 0 ? dataRegionInputs[0].value : ''; const services = Array.from(servicesInputs).map(input => input.value); @@ -473,29 +473,24 @@ if (dataRegion && services.length > 0 && emailServices && smsServices) { // Get relevant sub-processors - const relevantSubProcessors: Array<{ - service: string; - entityType: string; - link: string; - location: string; - }> = []; + const relevantSubProcessors = []; services.forEach(service => { - const serviceKey = service.toLowerCase() as keyof typeof subProcessorsData; + const serviceKey = service.toLowerCase(); if (subProcessorsData[serviceKey]) { - subProcessorsData[serviceKey].forEach((processor: any) => { - // Check if processor should be included based on conditions - if (processor.condition) { - if (processor.condition === "emailServices === 'Kinde default'") { - if (emailServices !== 'Kinde default') { - return; // Skip this processor - } - } else if (processor.condition === "smsServices === 'Kinde default'") { - if (smsServices !== 'Kinde default') { - return; // Skip this processor + subProcessorsData[serviceKey].forEach((processor) => { + // Check if processor should be included based on conditions + if (processor.condition) { + if (processor.condition === "emailServices === 'Kinde default'") { + if (emailServices !== 'Kinde default') { + return; // Skip this processor + } + } else if (processor.condition === "smsServices === 'Kinde default'") { + if (smsServices !== 'Kinde default') { + return; // Skip this processor + } } } - } relevantSubProcessors.push({ service: processor.service, @@ -539,12 +534,7 @@ }); }); - function displayResults(processors: Array<{ - service: string; - entityType: string; - link: string; - location: string; - }>) { + function displayResults(processors) { if (processors.length === 0) { tableContainer.innerHTML = '

No sub-processors found for your configuration.

'; } else { From c734b42379a7c7ea7232801a83c010e1c8516a11 Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 11 Aug 2025 22:04:23 +1000 Subject: [PATCH 5/9] Normalising casing for deep links --- src/components/SubProcessorsForm.astro | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/SubProcessorsForm.astro b/src/components/SubProcessorsForm.astro index 6885b504..562bb9e5 100644 --- a/src/components/SubProcessorsForm.astro +++ b/src/components/SubProcessorsForm.astro @@ -379,23 +379,23 @@ const smsServicesInputs = form.querySelectorAll('input[name="smsServices"]:checked'); const dataRegion = dataRegionInputs.length > 0 ? dataRegionInputs[0].value : ''; - const services = Array.from(servicesInputs).map(input => input.value); + const services = Array.from(servicesInputs).map(input => input.value.toLowerCase()); const emailServices = emailServicesInputs.length > 0 ? emailServicesInputs[0].value : ''; const smsServices = smsServicesInputs.length > 0 ? smsServicesInputs[0].value : ''; const urlParams = new URLSearchParams(); if (dataRegion) { - urlParams.set('data-region', dataRegion.toLowerCase().replace(' ', '-')); + urlParams.set('data-region', dataRegion.toLowerCase().replace(/\s+/g, '-')); } if (services.length > 0) { urlParams.set('services', services.join(',')); } if (emailServices) { - urlParams.set('email-services', emailServices.toLowerCase().replace(' ', '-')); + urlParams.set('email-services', emailServices.toLowerCase().replace(/\s+/g, '-')); } if (smsServices) { - urlParams.set('sms-services', smsServices.toLowerCase().replace(' ', '-')); + urlParams.set('sms-services', smsServices.toLowerCase().replace(/\s+/g, '-')); } const newUrl = window.location.pathname + (urlParams.toString() ? '?' + urlParams.toString() : ''); @@ -418,7 +418,7 @@ } if (services) { - const serviceArray = services.split(','); + const serviceArray = services.toLowerCase().split(','); serviceArray.forEach(service => { const serviceValue = service.charAt(0).toUpperCase() + service.slice(1); const serviceInput = form.querySelector(`input[name="services"][value="${serviceValue}"]`); From d244f99d500b5a3659b8e99beec367e53cfa2049 Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 11 Aug 2025 22:12:37 +1000 Subject: [PATCH 6/9] Update CSP --- customHttp.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/customHttp.yml b/customHttp.yml index 9e460fcf..12cf647d 100644 --- a/customHttp.yml +++ b/customHttp.yml @@ -6,7 +6,7 @@ customHeaders: default-src 'self' *.kinde.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; frame-src https://www.youtube-nocookie.com; child-src 'self'; - connect-src 'self' ws https://api.management.inkeep.com + connect-src 'self' ws: https://api.management.inkeep.com https://api.inkeep.com wss://api.inkeep.com https://api.hsforms.com https://app.kinde.com https://kinde.com https://kinde-api-docs-proxy.pages.dev https://analytics.usehall.com; @@ -77,7 +77,7 @@ customHeaders: https://cdn.jsdelivr.net/npm/@scalar/api-reference@1.23.5/dist/browser/standalone.min.js 'unsafe-inline' 'self' widgets.kinde.com kinde.com; font-src https://fonts.scalar.com 'self' https://fonts.gstatic.com; connect-src - 'self' ws https://api.management.inkeep.com https://api.inkeep.com + 'self' ws: https://api.management.inkeep.com https://api.inkeep.com wss://api.inkeep.com https://api.hsforms.com https://app.kinde.com https://kinde.com https://api-spec.kinde.com https://kinde-api-docs-proxy.pages.dev https://analytics.usehall.com; @@ -91,7 +91,7 @@ customHeaders: https://cdn.jsdelivr.net/npm/@scalar/api-reference@1.23.5/dist/browser/standalone.min.js 'unsafe-inline' 'self' widgets.kinde.com kinde.com; font-src https://fonts.scalar.com 'self' https://fonts.gstatic.com; connect-src - 'self' ws https://api.management.inkeep.com https://api.inkeep.com + 'self' ws: https://api.management.inkeep.com https://api.inkeep.com wss://api.inkeep.com https://api.hsforms.com https://app.kinde.com https://kinde.com https://api-spec.kinde.com https://kinde-api-docs-proxy.pages.dev https://analytics.usehall.com; From e8ff76f1bd93edd1ea5b938c2b2ab2b14f2b20b0 Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 11 Aug 2025 22:33:35 +1000 Subject: [PATCH 7/9] Code review changes --- src/components/SubProcessorsForm.astro | 31 +++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/src/components/SubProcessorsForm.astro b/src/components/SubProcessorsForm.astro index 562bb9e5..ff399e0b 100644 --- a/src/components/SubProcessorsForm.astro +++ b/src/components/SubProcessorsForm.astro @@ -371,6 +371,17 @@ return urlParams.get(name); } + // Helper function to safely find input by name and value + function findInputByValue(name, value) { + const inputs = form.querySelectorAll(`input[name="${name}"]`); + for (const input of inputs) { + if (input.value === value) { + return input; + } + } + return null; + } + // Function to update URL with current selections function updateUrl() { const dataRegionInputs = form.querySelectorAll('input[name="dataRegion"]:checked'); @@ -383,19 +394,29 @@ const emailServices = emailServicesInputs.length > 0 ? emailServicesInputs[0].value : ''; const smsServices = smsServicesInputs.length > 0 ? smsServicesInputs[0].value : ''; - const urlParams = new URLSearchParams(); + // Start with existing URL parameters to preserve other query params + const urlParams = new URLSearchParams(window.location.search); + // Update only the parameters this form controls if (dataRegion) { urlParams.set('data-region', dataRegion.toLowerCase().replace(/\s+/g, '-')); + } else { + urlParams.delete('data-region'); } if (services.length > 0) { urlParams.set('services', services.join(',')); + } else { + urlParams.delete('services'); } if (emailServices) { urlParams.set('email-services', emailServices.toLowerCase().replace(/\s+/g, '-')); + } else { + urlParams.delete('email-services'); } if (smsServices) { urlParams.set('sms-services', smsServices.toLowerCase().replace(/\s+/g, '-')); + } else { + urlParams.delete('sms-services'); } const newUrl = window.location.pathname + (urlParams.toString() ? '?' + urlParams.toString() : ''); @@ -411,7 +432,7 @@ if (dataRegion) { const dataRegionValue = dataRegion.replace(/-/g, ' ').replace(/\b\w/g, l => l.toUpperCase()); - const dataRegionInput = form.querySelector(`input[name="dataRegion"][value="${dataRegionValue}"]`); + const dataRegionInput = findInputByValue('dataRegion', dataRegionValue); if (dataRegionInput) { dataRegionInput.checked = true; } @@ -421,7 +442,7 @@ const serviceArray = services.toLowerCase().split(','); serviceArray.forEach(service => { const serviceValue = service.charAt(0).toUpperCase() + service.slice(1); - const serviceInput = form.querySelector(`input[name="services"][value="${serviceValue}"]`); + const serviceInput = findInputByValue('services', serviceValue); if (serviceInput) { serviceInput.checked = true; } @@ -437,7 +458,7 @@ } else { emailServicesValue = emailServices.replace(/-/g, ' ').replace(/\b\w/g, l => l.toUpperCase()); } - const emailServicesInput = form.querySelector(`input[name="emailServices"][value="${emailServicesValue}"]`); + const emailServicesInput = findInputByValue('emailServices', emailServicesValue); if (emailServicesInput) { emailServicesInput.checked = true; } @@ -452,7 +473,7 @@ } else { smsServicesValue = smsServices.replace(/-/g, ' ').replace(/\b\w/g, l => l.toUpperCase()); } - const smsServicesInput = form.querySelector(`input[name="smsServices"][value="${smsServicesValue}"]`); + const smsServicesInput = findInputByValue('smsServices', smsServicesValue); if (smsServicesInput) { smsServicesInput.checked = true; } From 40d72253a17e6c00c079cf2ea55ac2615ab11240 Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 11 Aug 2025 22:40:11 +1000 Subject: [PATCH 8/9] Updating CSP --- customHttp.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/customHttp.yml b/customHttp.yml index 12cf647d..84ed869d 100644 --- a/customHttp.yml +++ b/customHttp.yml @@ -6,7 +6,7 @@ customHeaders: default-src 'self' *.kinde.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; frame-src https://www.youtube-nocookie.com; child-src 'self'; - connect-src 'self' ws: https://api.management.inkeep.com + connect-src 'self' wss: https://api.management.inkeep.com https://api.inkeep.com wss://api.inkeep.com https://api.hsforms.com https://app.kinde.com https://kinde.com https://kinde-api-docs-proxy.pages.dev https://analytics.usehall.com; From 8dde81e68bfd43b5e4c2ccde8aa1f803966c864f Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 11 Aug 2025 22:40:47 +1000 Subject: [PATCH 9/9] Updating CSP --- customHttp.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/customHttp.yml b/customHttp.yml index 84ed869d..352aa678 100644 --- a/customHttp.yml +++ b/customHttp.yml @@ -77,7 +77,7 @@ customHeaders: https://cdn.jsdelivr.net/npm/@scalar/api-reference@1.23.5/dist/browser/standalone.min.js 'unsafe-inline' 'self' widgets.kinde.com kinde.com; font-src https://fonts.scalar.com 'self' https://fonts.gstatic.com; connect-src - 'self' ws: https://api.management.inkeep.com https://api.inkeep.com + 'self' wss: https://api.management.inkeep.com https://api.inkeep.com wss://api.inkeep.com https://api.hsforms.com https://app.kinde.com https://kinde.com https://api-spec.kinde.com https://kinde-api-docs-proxy.pages.dev https://analytics.usehall.com; @@ -91,7 +91,7 @@ customHeaders: https://cdn.jsdelivr.net/npm/@scalar/api-reference@1.23.5/dist/browser/standalone.min.js 'unsafe-inline' 'self' widgets.kinde.com kinde.com; font-src https://fonts.scalar.com 'self' https://fonts.gstatic.com; connect-src - 'self' ws: https://api.management.inkeep.com https://api.inkeep.com + 'self' wss: https://api.management.inkeep.com https://api.inkeep.com wss://api.inkeep.com https://api.hsforms.com https://app.kinde.com https://kinde.com https://api-spec.kinde.com https://kinde-api-docs-proxy.pages.dev https://analytics.usehall.com;