1
0
mirror of https://github.com/badges/shields.git synced 2025-04-18 19:44:04 +03:00

URL validator tidyup; affects [discourse dynamic endpoint gerrit jira maven nexus osslifecycle python vpm website] securityheaders sonar swagger w3c (#10810)

* add a required url validator

* replace occurrences of optionalUrl.required() with url

* use standard validators in server.js
This commit is contained in:
chris48s 2025-01-18 19:16:41 +00:00 committed by GitHub
parent 49bcb52173
commit 954147f7d9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
19 changed files with 48 additions and 38 deletions

View File

@ -16,7 +16,12 @@ import { makeSend } from '../base-service/legacy-result-sender.js'
import { handleRequest } from '../base-service/legacy-request-handler.js'
import { clearResourceCache } from '../base-service/resource-cache.js'
import { rasterRedirectUrl } from '../badge-urls/make-badge-url.js'
import { fileSize, nonNegativeInteger } from '../../services/validators.js'
import {
fileSize,
nonNegativeInteger,
optionalUrl,
url as requiredUrl,
} from '../../services/validators.js'
import log from './log.js'
import PrometheusMetrics from './prometheus-metrics.js'
import InfluxMetrics from './influx-metrics.js'
@ -54,8 +59,6 @@ const Joi = originalJoi
},
}))
const optionalUrl = Joi.string().uri({ scheme: ['http', 'https'] })
const requiredUrl = optionalUrl.required()
const origins = Joi.arrayFromString().items(Joi.string().origin())
const defaultService = Joi.object({ authorizedOrigins: origins }).default({
authorizedOrigins: [],

View File

@ -1,6 +1,6 @@
import Joi from 'joi'
import { metric } from '../text-formatters.js'
import { nonNegativeInteger, optionalUrl } from '../validators.js'
import { nonNegativeInteger, url } from '../validators.js'
import { BaseJsonService, queryParams } from '../index.js'
const schemaSingular = Joi.object({
@ -20,7 +20,7 @@ const schemaPlural = Joi.object({
const schema = Joi.alternatives(schemaSingular, schemaPlural)
const queryParamSchema = Joi.object({
server: optionalUrl.required(),
server: url,
}).required()
function singular(variant) {

View File

@ -1,8 +1,8 @@
import Joi from 'joi'
import { optionalUrl } from '../validators.js'
import { url } from '../validators.js'
const queryParamSchema = Joi.object({
url: optionalUrl.required(),
url,
query: Joi.string().required(),
prefix: Joi.alternatives().try(Joi.string(), Joi.number()),
suffix: Joi.alternatives().try(Joi.string(), Joi.number()),

View File

@ -1,14 +1,14 @@
import { URL } from 'url'
import Joi from 'joi'
import { httpErrors } from '../dynamic-common.js'
import { optionalUrl } from '../validators.js'
import { url } from '../validators.js'
import { fetchEndpointData } from '../endpoint-common.js'
import { BaseJsonService, InvalidParameter, queryParams } from '../index.js'
const blockedDomains = ['github.com', 'shields.io']
const queryParamSchema = Joi.object({
url: optionalUrl.required(),
url,
}).required()
const description = `

View File

@ -1,9 +1,9 @@
import Joi from 'joi'
import { optionalUrl } from '../validators.js'
import { url } from '../validators.js'
import { BaseJsonService, pathParam, queryParam } from '../index.js'
const queryParamSchema = Joi.object({
baseUrl: optionalUrl.required(),
baseUrl: url,
}).required()
const schema = Joi.object({

View File

@ -1,10 +1,10 @@
import Joi from 'joi'
import { optionalUrl } from '../validators.js'
import { url } from '../validators.js'
import { BaseJsonService, pathParam, queryParam } from '../index.js'
import { authConfig } from './jira-common.js'
const queryParamSchema = Joi.object({
baseUrl: optionalUrl.required(),
baseUrl: url,
}).required()
const schema = Joi.object({

View File

@ -1,10 +1,10 @@
import Joi from 'joi'
import { optionalUrl } from '../validators.js'
import { url } from '../validators.js'
import { BaseJsonService, pathParam, queryParam } from '../index.js'
import { authConfig } from './jira-common.js'
const queryParamSchema = Joi.object({
baseUrl: optionalUrl.required(),
baseUrl: url,
}).required()
const schema = Joi.object({

View File

@ -1,11 +1,11 @@
import Joi from 'joi'
import { optionalUrl } from '../validators.js'
import { url } from '../validators.js'
import { renderVersionBadge } from '../version.js'
import { BaseXmlService, NotFound, queryParams } from '../index.js'
import { description } from './maven-metadata.js'
const queryParamSchema = Joi.object({
metadataUrl: optionalUrl.required(),
metadataUrl: url,
versionPrefix: Joi.string().optional(),
versionSuffix: Joi.string().optional(),
}).required()

View File

@ -1,7 +1,7 @@
import Joi from 'joi'
import { renderVersionBadge } from '../version.js'
import {
optionalUrl,
url,
optionalDottedVersionNClausesWithOptionalSuffix,
} from '../validators.js'
import {
@ -49,7 +49,7 @@ const nexus2ResolveApiSchema = Joi.object({
}).required()
const queryParamSchema = Joi.object({
server: optionalUrl.required(),
server: url,
queryOpt: Joi.string()
.regex(/(:[\w.]+=[^:]*)+/i)
.optional(),

View File

@ -1,5 +1,5 @@
import Joi from 'joi'
import { optionalUrl } from '../validators.js'
import { url } from '../validators.js'
import { BaseService, InvalidResponse, queryParam } from '../index.js'
const description = `
@ -12,7 +12,7 @@ can be viewed on the [OSS Tracker repository](https://github.com/Netflix/osstrac
`
const queryParamSchema = Joi.object({
file_url: optionalUrl.required(),
file_url: url,
}).required()
export default class OssTracker extends BaseService {

View File

@ -1,10 +1,10 @@
import Joi from 'joi'
import BaseTomlService from '../../core/base-service/base-toml.js'
import { queryParams } from '../index.js'
import { optionalUrl } from '../validators.js'
import { url } from '../validators.js'
const queryParamSchema = Joi.object({
tomlFilePath: optionalUrl.required(),
tomlFilePath: url,
}).required()
const schema = Joi.object({

View File

@ -1,9 +1,9 @@
import Joi from 'joi'
import { optionalUrl } from '../validators.js'
import { url } from '../validators.js'
import { BaseService, NotFound, queryParams } from '../index.js'
const queryParamSchema = Joi.object({
url: optionalUrl.required(),
url,
ignoreRedirects: Joi.equal(''),
}).required()

View File

@ -1,7 +1,7 @@
import Joi from 'joi'
import { queryParams } from '../index.js'
import { colorScale } from '../color-formatters.js'
import { optionalUrl } from '../validators.js'
import { url } from '../validators.js'
const ratingPercentageScaleSteps = [10, 20, 50, 100]
const ratingScaleColors = [
@ -38,7 +38,7 @@ const sonarVersionSchema = Joi.alternatives(
const queryParamSchema = Joi.object({
sonarVersion: sonarVersionSchema,
server: optionalUrl.required(),
server: url,
}).required()
const openApiQueryParams = queryParams(
@ -48,7 +48,7 @@ const openApiQueryParams = queryParams(
const queryParamWithFormatSchema = Joi.object({
sonarVersion: sonarVersionSchema,
server: optionalUrl.required(),
server: url,
format: Joi.string().allow('short', 'long').optional(),
}).required()

View File

@ -1,5 +1,5 @@
import Joi from 'joi'
import { optionalUrl } from '../validators.js'
import { url } from '../validators.js'
import { BaseJsonService, NotFound, queryParams } from '../index.js'
const schema = Joi.object()
@ -14,7 +14,7 @@ const schema = Joi.object()
.required()
const queryParamSchema = Joi.object({
specUrl: optionalUrl.required(),
specUrl: url,
}).required()
export default class SwaggerValidatorService extends BaseJsonService {

View File

@ -1,9 +1,9 @@
import Joi from 'joi'
import { optionalUrl } from '../validators.js'
import { url } from '../validators.js'
import { BaseService, pathParams, queryParams } from '../index.js'
const queryParamSchema = Joi.object({
url: optionalUrl.required(),
url,
}).required()
class TwitterUrl extends BaseService {

View File

@ -70,6 +70,13 @@ export const optionalDottedVersionNClausesWithOptionalSuffix =
*/
export const optionalUrl = Joi.string().uri({ scheme: ['http', 'https'] })
/**
* Joi validator that checks if a value is a URL and the value must be present.
*
* @type {Joi}
*/
export const url = optionalUrl.required()
/**
* Joi validator for a file size we are going to pass to bytes.parse
* see https://github.com/visionmedia/bytes.js#bytesparsestringnumber-value-numbernull

View File

@ -1,10 +1,10 @@
import Joi from 'joi'
import { optionalUrl } from '../validators.js'
import { url } from '../validators.js'
import { latest, renderVersionBadge } from '../version.js'
import { BaseJsonService, NotFound, pathParam, queryParam } from '../index.js'
const queryParamSchema = Joi.object({
repository_url: optionalUrl.required(),
repository_url: url,
include_prereleases: Joi.equal(''),
}).required()

View File

@ -1,5 +1,5 @@
import Joi from 'joi'
import { optionalUrl } from '../validators.js'
import { url } from '../validators.js'
import { BaseJsonService, NotFound, pathParam, queryParam } from '../index.js'
import {
description,
@ -25,7 +25,7 @@ const schema = Joi.object({
}).required()
const queryParamSchema = Joi.object({
targetUrl: optionalUrl.required(),
targetUrl: url,
preset: Joi.string().regex(presetRegex).allow(''),
}).required()

View File

@ -2,7 +2,7 @@ import emojic from 'emojic'
import Joi from 'joi'
import trace from '../../core/base-service/trace.js'
import { BaseService, queryParams } from '../index.js'
import { optionalUrl } from '../validators.js'
import { url } from '../validators.js'
import {
queryParamSchema,
renderWebsiteStatus,
@ -20,7 +20,7 @@ A site will be classified as "down" if it fails to respond within 3.5 seconds.
`
const urlQueryParamSchema = Joi.object({
url: optionalUrl.required(),
url,
}).required()
export default class Website extends BaseService {