From 402aabd2d88ed0a82700fe087490fbf7d3eb4c10 Mon Sep 17 00:00:00 2001 From: Borghild Date: Fri, 30 Aug 2024 20:14:13 +0200 Subject: [PATCH 1/7] :art: add warning for http and not valid slug --- sanityv3/schemas/editors/blockContentType.tsx | 8 +++++++- sanityv3/schemas/objects/linkSelector.tsx | 9 ++++++++- sanityv3/schemas/validations/validateSlug.ts | 15 +++++++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/sanityv3/schemas/editors/blockContentType.tsx b/sanityv3/schemas/editors/blockContentType.tsx index 9bad24f08..0b506721e 100644 --- a/sanityv3/schemas/editors/blockContentType.tsx +++ b/sanityv3/schemas/editors/blockContentType.tsx @@ -6,6 +6,7 @@ import { Flags } from '../../src/lib/datasetHelpers' import { ExternalLinkRenderer, SubScriptRenderer, SuperScriptRenderer } from '../components' import routes from '../routes' import { defaultColors } from '../defaultColors' +import { strictExternal, warnHttpExternal, warnHttpOrNotValidSlugExternal } from '../validations/validateSlug' export type BlockContentProps = { h2?: boolean @@ -194,7 +195,12 @@ export const configureBlockContent = (options: BlockContentProps = {}): BlockDef { name: 'href', type: 'url', - validation: (Rule: any) => Rule.uri({ scheme: ['http', 'https', 'tel', 'mailto'] }), + validation: (Rule: any) => + Rule.uri({ scheme: ['http', 'https', 'tel', 'mailto'] }) + .custom((value: any, context: ValidationContext) => { + return warnHttpOrNotValidSlugExternal(value, context) + }) + .warning(), }, ], } diff --git a/sanityv3/schemas/objects/linkSelector.tsx b/sanityv3/schemas/objects/linkSelector.tsx index 2300559da..908729d99 100644 --- a/sanityv3/schemas/objects/linkSelector.tsx +++ b/sanityv3/schemas/objects/linkSelector.tsx @@ -9,6 +9,7 @@ import { AnchorLinkDescription } from './anchorReferenceField' // eslint-disable-next-line import/no-unresolved import { defaultLanguage } from '../../languages' import { apiVersion } from '../../sanity.client' +import { warnHttpOrNotValidSlugExternal } from '../validations/validateSlug' export type ReferenceTarget = { type: string @@ -118,7 +119,13 @@ export const getLinkSelectorFields = (labelFieldset?: string, flag?: string) => const { parent } = context as { parent: LinkSelector } if (isHidden(parent)) return true const connectedField = parent?.linkToOtherLanguage ? parent?.referenceToOtherLanguage : parent?.reference - return validateInternalOrExternalUrl(value, connectedField) + const internalValidation = validateInternalOrExternalUrl(value, connectedField) + //If message from internalValidation return that if not continue to check external url + if (internalValidation) { + return warnHttpOrNotValidSlugExternal(value, context) + } else { + return internalValidation + } }), hidden: ({ parent }: { parent: LinkSelector }) => isHidden(parent), }, diff --git a/sanityv3/schemas/validations/validateSlug.ts b/sanityv3/schemas/validations/validateSlug.ts index 01ab31878..ff967e0ff 100644 --- a/sanityv3/schemas/validations/validateSlug.ts +++ b/sanityv3/schemas/validations/validateSlug.ts @@ -41,3 +41,18 @@ export const withSlugValidation = (options: any) => { } : options } + +const stringIsSlug = /^[a-z0-9]+(-[a-z0-9]+)*$/ +const httpRegex = /^(?:http:\/\/|).*$/ +export const warnHttpOrNotValidSlugExternal = (slug: string, context: ValidationContext) => { + const isHttp = httpRegex.test(slug) + const validSlug = stringIsSlug.test(slug) + let message = '' + if (isHttp) { + message = 'Use https in url. ' + } + if (!validSlug) { + message = message.concat(`Should only contain lowercase letters [a-z], numbers [0-9], and dashes ("-")`) + } + return isHttp || !validSlug ? message : true +} From 6878dfdef08c87ac0ee127d0f94c34c5f92d02be Mon Sep 17 00:00:00 2001 From: Padmaja <52911293+padms@users.noreply.github.com> Date: Fri, 27 Sep 2024 17:44:18 +0530 Subject: [PATCH 2/7] =?UTF-8?q?=F0=9F=90=9B=20Refactor=20after=20comments?= =?UTF-8?q?=20#2496?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sanityv3/schemas/editors/blockContentType.tsx | 4 ++-- sanityv3/schemas/objects/linkSelector.tsx | 2 +- .../schemas/validations/checkEquinorUrls.ts | 8 ++++++++ sanityv3/schemas/validations/validateSlug.ts | 18 ++++++++++++++---- 4 files changed, 25 insertions(+), 7 deletions(-) create mode 100644 sanityv3/schemas/validations/checkEquinorUrls.ts diff --git a/sanityv3/schemas/editors/blockContentType.tsx b/sanityv3/schemas/editors/blockContentType.tsx index 0b506721e..bb4993844 100644 --- a/sanityv3/schemas/editors/blockContentType.tsx +++ b/sanityv3/schemas/editors/blockContentType.tsx @@ -196,11 +196,11 @@ export const configureBlockContent = (options: BlockContentProps = {}): BlockDef name: 'href', type: 'url', validation: (Rule: any) => - Rule.uri({ scheme: ['http', 'https', 'tel', 'mailto'] }) + Rule.uri({ scheme: ['https', 'tel', 'mailto'] }) .custom((value: any, context: ValidationContext) => { return warnHttpOrNotValidSlugExternal(value, context) }) - .warning(), + .error(), }, ], } diff --git a/sanityv3/schemas/objects/linkSelector.tsx b/sanityv3/schemas/objects/linkSelector.tsx index 908729d99..ffa43be31 100644 --- a/sanityv3/schemas/objects/linkSelector.tsx +++ b/sanityv3/schemas/objects/linkSelector.tsx @@ -115,7 +115,7 @@ export const getLinkSelectorFields = (labelFieldset?: string, flag?: string) => description: 'Use this field to link to an external site.', type: 'url', validation: (Rule: Rule) => - Rule.uri({ scheme: ['http', 'https', 'tel', 'mailto'] }).custom((value: any, context: ValidationContext) => { + Rule.uri({ scheme: ['https', 'tel', 'mailto'] }).custom((value: any, context: ValidationContext) => { const { parent } = context as { parent: LinkSelector } if (isHidden(parent)) return true const connectedField = parent?.linkToOtherLanguage ? parent?.referenceToOtherLanguage : parent?.reference diff --git a/sanityv3/schemas/validations/checkEquinorUrls.ts b/sanityv3/schemas/validations/checkEquinorUrls.ts new file mode 100644 index 000000000..e78ed435f --- /dev/null +++ b/sanityv3/schemas/validations/checkEquinorUrls.ts @@ -0,0 +1,8 @@ +import datasets from '../../../satellites.json' assert { type: 'json' } +import { getDomain } from '../../../satellitesConfig' + +export const isEquinorUrl = (slug: string) => { + const urls = datasets.map((dataset) => getDomain(dataset)) + const isAllowed = urls.some((allowedUrl) => slug.toLowerCase().startsWith(allowedUrl)) + return isAllowed +} diff --git a/sanityv3/schemas/validations/validateSlug.ts b/sanityv3/schemas/validations/validateSlug.ts index ff967e0ff..646f4e3d2 100644 --- a/sanityv3/schemas/validations/validateSlug.ts +++ b/sanityv3/schemas/validations/validateSlug.ts @@ -1,6 +1,7 @@ import { ValidationContext } from 'sanity' import { apiVersion } from '../../sanity.client' import { Flags } from '../../src/lib/datasetHelpers' +import { isEquinorUrl } from './checkEquinorUrls' const validateIsUniqueWithinLocale = async (slug: string, context: ValidationContext) => { const { document, getClient } = context @@ -42,17 +43,26 @@ export const withSlugValidation = (options: any) => { : options } -const stringIsSlug = /^[a-z0-9]+(-[a-z0-9]+)*$/ -const httpRegex = /^(?:http:\/\/|).*$/ +const stringIsSlug = + /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&\/\/=]*)/ +const httpRegex = /^http:\/\/[^\s]+$/ export const warnHttpOrNotValidSlugExternal = (slug: string, context: ValidationContext) => { + if (!slug) return true + if (!slug.startsWith('http')) return true // ignore mailto , tel const isHttp = httpRegex.test(slug) const validSlug = stringIsSlug.test(slug) + const isInvalidEquinorUrl = slug !== slug.toLowerCase() && isEquinorUrl(slug) + let message = '' if (isHttp) { message = 'Use https in url. ' } if (!validSlug) { - message = message.concat(`Should only contain lowercase letters [a-z], numbers [0-9], and dashes ("-")`) + message = message.concat(`Not a valid url.`) + } + + if (isInvalidEquinorUrl) { + message = message.concat('Equinor urls should contain lowercase letters only.') } - return isHttp || !validSlug ? message : true + return isHttp || !validSlug || isInvalidEquinorUrl ? message : true } From 8f28c1e167554838e60809466a58fb407efd8212 Mon Sep 17 00:00:00 2001 From: Padmaja <52911293+padms@users.noreply.github.com> Date: Mon, 30 Sep 2024 15:11:23 +0530 Subject: [PATCH 3/7] =?UTF-8?q?=F0=9F=9A=A8=20Lint=20#2496?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sanityv3/schemas/validations/validateSlug.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sanityv3/schemas/validations/validateSlug.ts b/sanityv3/schemas/validations/validateSlug.ts index 646f4e3d2..a979cc07f 100644 --- a/sanityv3/schemas/validations/validateSlug.ts +++ b/sanityv3/schemas/validations/validateSlug.ts @@ -44,9 +44,9 @@ export const withSlugValidation = (options: any) => { } const stringIsSlug = - /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&\/\/=]*)/ + /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)/ const httpRegex = /^http:\/\/[^\s]+$/ -export const warnHttpOrNotValidSlugExternal = (slug: string, context: ValidationContext) => { +export const warnHttpOrNotValidSlugExternal = (slug: string) => { if (!slug) return true if (!slug.startsWith('http')) return true // ignore mailto , tel const isHttp = httpRegex.test(slug) From 729fe74ac49dda4df4281cbb80c59455a7cd7d09 Mon Sep 17 00:00:00 2001 From: Padmaja <52911293+padms@users.noreply.github.com> Date: Mon, 30 Sep 2024 15:26:36 +0530 Subject: [PATCH 4/7] =?UTF-8?q?=F0=9F=92=9A=20=F0=9F=90=9B=20Fix=20import?= =?UTF-8?q?=20bug=20#2496?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sanityv3/schemas/validations/checkEquinorUrls.ts | 6 ++---- satellitesConfig.js | 4 ++++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/sanityv3/schemas/validations/checkEquinorUrls.ts b/sanityv3/schemas/validations/checkEquinorUrls.ts index e78ed435f..1bb9af772 100644 --- a/sanityv3/schemas/validations/checkEquinorUrls.ts +++ b/sanityv3/schemas/validations/checkEquinorUrls.ts @@ -1,8 +1,6 @@ -import datasets from '../../../satellites.json' assert { type: 'json' } -import { getDomain } from '../../../satellitesConfig' +import { getAllDomainUrls } from '../../../satellitesConfig' export const isEquinorUrl = (slug: string) => { - const urls = datasets.map((dataset) => getDomain(dataset)) - const isAllowed = urls.some((allowedUrl) => slug.toLowerCase().startsWith(allowedUrl)) + const isAllowed = getAllDomainUrls().some((allowedUrl) => slug.toLowerCase().startsWith(allowedUrl)) return isAllowed } diff --git a/satellitesConfig.js b/satellitesConfig.js index b6dc08600..37497b794 100644 --- a/satellitesConfig.js +++ b/satellitesConfig.js @@ -185,3 +185,7 @@ export const getDomain = (dataset) => websiteDomains[dataset]?.url || 'Domain no export const getMetaTitleSuffix = (dataset) => { return websiteDomains[dataset]?.meta || 'Equinor' } + +export const getAllDomainUrls = () => { + return Object.keys(datasets).map((dataset) => websiteDomains[dataset].url) +} From ced96773c72e4bec703fdaa7df14bac968a9ab69 Mon Sep 17 00:00:00 2001 From: Padmaja <52911293+padms@users.noreply.github.com> Date: Tue, 15 Oct 2024 19:19:31 +0530 Subject: [PATCH 5/7] =?UTF-8?q?=F0=9F=90=9B=20Fix=20error=20with=20validat?= =?UTF-8?q?ion=20#2496?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sanityv3/schemas/validations/checkEquinorUrls.ts | 3 +-- satellitesConfig.js | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/sanityv3/schemas/validations/checkEquinorUrls.ts b/sanityv3/schemas/validations/checkEquinorUrls.ts index 1bb9af772..5f39c3250 100644 --- a/sanityv3/schemas/validations/checkEquinorUrls.ts +++ b/sanityv3/schemas/validations/checkEquinorUrls.ts @@ -1,6 +1,5 @@ import { getAllDomainUrls } from '../../../satellitesConfig' export const isEquinorUrl = (slug: string) => { - const isAllowed = getAllDomainUrls().some((allowedUrl) => slug.toLowerCase().startsWith(allowedUrl)) - return isAllowed + return getAllDomainUrls().some((allowedUrl) => slug.toLowerCase().startsWith(allowedUrl)) } diff --git a/satellitesConfig.js b/satellitesConfig.js index 37497b794..32f4b9738 100644 --- a/satellitesConfig.js +++ b/satellitesConfig.js @@ -187,5 +187,5 @@ export const getMetaTitleSuffix = (dataset) => { } export const getAllDomainUrls = () => { - return Object.keys(datasets).map((dataset) => websiteDomains[dataset].url) + return Object.keys(datasets).map((dataset) => websiteDomains[dataset]?.url) } From a5c1f0922eb740c6ef367f149a64e221ff98c4c1 Mon Sep 17 00:00:00 2001 From: Padmaja <52911293+padms@users.noreply.github.com> Date: Wed, 16 Oct 2024 13:22:48 +0530 Subject: [PATCH 6/7] =?UTF-8?q?=F0=9F=90=9B=20Check=20lowercase=20excludin?= =?UTF-8?q?g=20queryparam=20#2496?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sanityv3/schemas/validations/validateSlug.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sanityv3/schemas/validations/validateSlug.ts b/sanityv3/schemas/validations/validateSlug.ts index a979cc07f..aa355fbbd 100644 --- a/sanityv3/schemas/validations/validateSlug.ts +++ b/sanityv3/schemas/validations/validateSlug.ts @@ -51,7 +51,8 @@ export const warnHttpOrNotValidSlugExternal = (slug: string) => { if (!slug.startsWith('http')) return true // ignore mailto , tel const isHttp = httpRegex.test(slug) const validSlug = stringIsSlug.test(slug) - const isInvalidEquinorUrl = slug !== slug.toLowerCase() && isEquinorUrl(slug) + const slugWithOutQueryParam = slug.split('?')[0] + const isInvalidEquinorUrl = slugWithOutQueryParam !== slugWithOutQueryParam.toLowerCase() && isEquinorUrl(slug) let message = '' if (isHttp) { From f9e8964eafee7db4ed150c3caa9c9c58cbddb410 Mon Sep 17 00:00:00 2001 From: Padmaja <52911293+padms@users.noreply.github.com> Date: Fri, 25 Oct 2024 16:19:25 +0530 Subject: [PATCH 7/7] =?UTF-8?q?=F0=9F=90=9B=20Allow=20http=20to=20avoid=20?= =?UTF-8?q?error=20msg=20that=20confuses=20#2496?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sanityv3/schemas/editors/blockContentType.tsx | 2 +- sanityv3/schemas/objects/linkSelector.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sanityv3/schemas/editors/blockContentType.tsx b/sanityv3/schemas/editors/blockContentType.tsx index bb4993844..cdb6a42c6 100644 --- a/sanityv3/schemas/editors/blockContentType.tsx +++ b/sanityv3/schemas/editors/blockContentType.tsx @@ -196,7 +196,7 @@ export const configureBlockContent = (options: BlockContentProps = {}): BlockDef name: 'href', type: 'url', validation: (Rule: any) => - Rule.uri({ scheme: ['https', 'tel', 'mailto'] }) + Rule.uri({ scheme: ['http', 'https', 'tel', 'mailto'] }) .custom((value: any, context: ValidationContext) => { return warnHttpOrNotValidSlugExternal(value, context) }) diff --git a/sanityv3/schemas/objects/linkSelector.tsx b/sanityv3/schemas/objects/linkSelector.tsx index ffa43be31..908729d99 100644 --- a/sanityv3/schemas/objects/linkSelector.tsx +++ b/sanityv3/schemas/objects/linkSelector.tsx @@ -115,7 +115,7 @@ export const getLinkSelectorFields = (labelFieldset?: string, flag?: string) => description: 'Use this field to link to an external site.', type: 'url', validation: (Rule: Rule) => - Rule.uri({ scheme: ['https', 'tel', 'mailto'] }).custom((value: any, context: ValidationContext) => { + Rule.uri({ scheme: ['http', 'https', 'tel', 'mailto'] }).custom((value: any, context: ValidationContext) => { const { parent } = context as { parent: LinkSelector } if (isHidden(parent)) return true const connectedField = parent?.linkToOtherLanguage ? parent?.referenceToOtherLanguage : parent?.reference