diff --git a/src/lib/server/actions/project.ts b/src/lib/server/actions/project.ts index 52207303..b2d1c69a 100644 --- a/src/lib/server/actions/project.ts +++ b/src/lib/server/actions/project.ts @@ -3,6 +3,7 @@ import { IAmWrapper } from '../aws/iamwrapper'; import { prisma } from '../prisma'; import { Utils } from '../utils'; import { Project } from '$lib/server/models/project'; +import { trimStrings } from '$lib/valibot'; export class ProjectUpdateOperation { private id; @@ -66,11 +67,14 @@ export class ProjectUpdateOperation { const url = this.adjustUrl(project.url!, publicKeyId!); await prisma.project.update({ where: { id: project.id }, - data: { - user_id, - publishing_key, - url - } + data: trimStrings( + { + user_id, + publishing_key, + url + }, + 'project' + ) }); } private adjustUrl(url: string, newPublicKeyId: string) { diff --git a/src/lib/server/job-executors/build.ts b/src/lib/server/job-executors/build.ts index 3909fc78..b207ffcf 100644 --- a/src/lib/server/job-executors/build.ts +++ b/src/lib/server/job-executors/build.ts @@ -7,6 +7,7 @@ import { CodeCommit } from '../aws/codecommit'; import { BullMQ, getQueues } from '../bullmq'; import { Build } from '../models/build'; import { prisma } from '../prisma'; +import { trimStrings } from '$lib/valibot'; export async function product(job: Job): Promise { try { @@ -65,12 +66,16 @@ export async function product(job: Job): Promise if (lastBuildGuid) { await prisma.build.update({ where: { id: build.id }, - data: { - build_guid: lastBuildGuid, - codebuild_url: CodeBuild.getCodeBuildUrl('build_app', lastBuildGuid), - console_text_url: CodeBuild.getConsoleTextUrl('build_app', lastBuildGuid), - status: Build.Status.Active - } + data: trimStrings( + { + build_guid: lastBuildGuid, + codebuild_url: CodeBuild.getCodeBuildUrl('build_app', lastBuildGuid), + console_text_url: CodeBuild.getConsoleTextUrl('build_app', lastBuildGuid), + status: Build.Status.Active + }, + 'build', + job.log + ) }); } job.updateProgress(100); @@ -102,12 +107,16 @@ export async function product(job: Job): Promise if (lastBuildGuid) { await prisma.build.update({ where: { id: build.id }, - data: { - build_guid: lastBuildGuid, - codebuild_url: CodeBuild.getCodeBuildUrl('build_app', lastBuildGuid), - console_text_url: CodeBuild.getConsoleTextUrl('build_app', lastBuildGuid), - status: Build.Status.Active - } + data: trimStrings( + { + build_guid: lastBuildGuid, + codebuild_url: CodeBuild.getCodeBuildUrl('build_app', lastBuildGuid), + console_text_url: CodeBuild.getConsoleTextUrl('build_app', lastBuildGuid), + status: Build.Status.Active + }, + 'build', + job.log + ) }); } const name = `Check status of Build #${build.id}`; @@ -128,11 +137,15 @@ export async function product(job: Job): Promise job.log(`${e}`); await prisma.build.update({ where: { id: job.data.buildId }, - data: { - result: Build.Result.Failure, - status: Build.Status.Completed, - error: String(e) - } + data: trimStrings( + { + result: Build.Result.Failure, + status: Build.Status.Completed, + error: String(e) + }, + 'build', + job.log + ) }); } } diff --git a/src/lib/server/job-executors/polling.ts b/src/lib/server/job-executors/polling.ts index 30e8278d..d3bb3ee8 100644 --- a/src/lib/server/job-executors/polling.ts +++ b/src/lib/server/job-executors/polling.ts @@ -5,6 +5,8 @@ import { BullMQ, getQueues } from '../bullmq'; import { Build } from '../models/build'; import { prisma } from '../prisma'; import { Release } from '$lib/server/models/release'; +import type { Logger } from '$lib/utils'; +import { trimStrings } from '$lib/valibot'; export async function build(job: Job): Promise { try { @@ -56,7 +58,7 @@ export async function build(job: Job): Promise { } await prisma.build.update({ where: { id: build.id }, - data: { ...build, job: undefined } + data: trimStrings({ ...build, job: undefined }, 'build', job.log) }); job.updateProgress(100); return { @@ -71,11 +73,15 @@ export async function build(job: Job): Promise { job.log(`${e}`); await prisma.build.update({ where: { id: job.data.buildId }, - data: { - result: Build.Result.Failure, - status: Build.Status.Completed, - error: String(e) - } + data: trimStrings( + { + result: Build.Result.Failure, + status: Build.Status.Completed, + error: String(e) + }, + 'build', + job.log + ) }); } } @@ -122,11 +128,11 @@ export async function release(job: Job): Promise): Promise + release: Prisma.releaseGetPayload<{ select: { id: true; console_text_url: true } }>, + log: Logger ) { await prisma.release.update({ where: { id: release.id }, - data: { error: release.console_text_url } + data: trimStrings({ error: release.console_text_url }, 'release', log) }); await getQueues().S3.add(`Save Errors for Release ${release.id} to S3`, { type: BullMQ.JobType.S3_CopyError, diff --git a/src/lib/server/job-executors/release.ts b/src/lib/server/job-executors/release.ts index 4a290279..6b82cb25 100644 --- a/src/lib/server/job-executors/release.ts +++ b/src/lib/server/job-executors/release.ts @@ -5,6 +5,7 @@ import type { BullMQ } from '../bullmq'; import { prisma } from '../prisma'; import { Build } from '$lib/server/models/build'; import { Release } from '$lib/server/models/release'; +import { trimStrings } from '$lib/valibot'; export async function product(job: Job): Promise { try { @@ -32,12 +33,16 @@ export async function product(job: Job): Promise): Promise): Promise { const id = job.data.id; @@ -106,12 +107,16 @@ export async function save(job: Job): Promise } await prisma.build.update({ where: { id }, - data: { - ...build, - status: Build.Status.Completed, - result: Build.Result.Success, - job: undefined - } + data: trimStrings( + { + ...build, + status: Build.Status.Completed, + result: Build.Result.Success, + job: undefined + }, + 'build', + job.log + ) }); await s3.removeCodeBuildFolder(build); job.updateProgress(100); diff --git a/src/lib/utils/index.ts b/src/lib/utils/index.ts index 5a187072..a50e4faa 100644 --- a/src/lib/utils/index.ts +++ b/src/lib/utils/index.ts @@ -1,3 +1,6 @@ export function ErrorResponse(status: number, message: string, headers?: HeadersInit) { return new Response(JSON.stringify({ status, message }), { status, headers }); } + +export type Logger = (msg: string) => void; +export const defaultLogger: Logger = (msg) => console.log(msg); diff --git a/src/lib/valibot.ts b/src/lib/valibot.ts index e4fb9598..6574f6e9 100644 --- a/src/lib/valibot.ts +++ b/src/lib/valibot.ts @@ -1,4 +1,5 @@ import * as v from 'valibot'; +import { type Logger, defaultLogger } from './utils'; export const idSchema = v.pipe(v.number(), v.minValue(0), v.integer()); @@ -7,14 +8,14 @@ export const paramNumber = v.pipe( v.transform((s) => parseInt(s)) ); -export function convertEmptyStrToNull() { +export function convertEmptyStrToNull(limit?: number) { return v.nullable( v.union([ v.pipe( v.literal(''), v.transform(() => null) ), - v.string() + limit ? v.pipe(v.string(), v.maxBytes(limit)) : v.string() ]) ); } @@ -42,3 +43,79 @@ export const tableSchema = v.object({ }) ) }); + +export const stringLimits = { + build: { + status: 255, + result: 255, + error: 2083, + channel: 255, + artifact_url_base: 2083, + artifact_files: 4096, + build_guid: 255, + console_text_url: 255, + codebuild_url: 255, + targets: 255 + }, + client: { + access_token: 255, + prefix: 4 + }, + job: { + request_id: 255, + git_url: 2083, + app_id: 255, + publisher_id: 255, + jenkins_build_url: 1024, + jenkins_publish_url: 1024 + }, + project: { + status: 255, + result: 255, + error: 2083, + url: 1024, + user_id: 255, + group_id: 255, + app_id: 255, + project_name: 255, + language_code: 255, + publishing_key: 1024 + }, + release: { + status: 255, + result: 255, + error: 2083, + channel: 255, + title: 30, + defaultLanguage: 255, + promote_from: 255, + build_guid: 255, + console_text_url: 255, + codebuild_url: 255, + targets: 255, + artifact_url_base: 255, + artifact_files: 255 + } +} as const; + +export function trimStrings>( + obj: T, + scope: keyof typeof stringLimits, + log: Logger = defaultLogger +) { + for (const [key, limit] of Object.entries(stringLimits[scope])) { + const raw = obj[key]; + if (raw) { + let val = (raw as string).trim().substring(0, limit); + while (new Blob([val]).size < limit) { + val = val.substring(0, val.length - 1); + } + if (raw !== val) { + log(`trimStrings ${scope}: "${raw}" => "${val}"`); + //@ts-expect-error this should be fine... + obj[key] = val; + } + } + } + return obj; +} diff --git a/src/routes/(api)/job/+server.ts b/src/routes/(api)/job/+server.ts index d649cb97..8f12185c 100644 --- a/src/routes/(api)/job/+server.ts +++ b/src/routes/(api)/job/+server.ts @@ -2,13 +2,13 @@ import * as v from 'valibot'; import type { RequestHandler } from './$types'; import { prisma } from '$lib/server/prisma'; import { ErrorResponse } from '$lib/utils'; -import { stringIdSchema } from '$lib/valibot'; +import { stringIdSchema, stringLimits } from '$lib/valibot'; const jobSchema = v.strictObject({ request_id: stringIdSchema, - git_url: v.pipe(v.string(), v.url()), - app_id: v.string(), - publisher_id: v.string() + git_url: v.pipe(v.string(), v.url(), v.maxBytes(stringLimits.job.git_url)), + app_id: v.pipe(v.string(), v.maxBytes(stringLimits.job.app_id)), + publisher_id: v.pipe(v.string(), v.maxBytes(stringLimits.job.publisher_id)) }); // POST /job diff --git a/src/routes/(api)/job/[jobId=idNumber]/+server.ts b/src/routes/(api)/job/[jobId=idNumber]/+server.ts index 67426c54..55bdccaf 100644 --- a/src/routes/(api)/job/[jobId=idNumber]/+server.ts +++ b/src/routes/(api)/job/[jobId=idNumber]/+server.ts @@ -2,6 +2,7 @@ import * as v from 'valibot'; import type { RequestHandler } from './$types'; import { prisma } from '$lib/server/prisma'; import { ErrorResponse } from '$lib/utils'; +import { stringLimits } from '$lib/valibot'; // GET /job/[id] export const GET: RequestHandler = async ({ params }) => { @@ -33,7 +34,7 @@ export const GET: RequestHandler = async ({ params }) => { }; const updateSchema = v.strictObject({ - publisher_id: v.string() + publisher_id: v.pipe(v.string(), v.maxBytes(stringLimits.job.publisher_id)) }); // PUT /job/[id] diff --git a/src/routes/(api)/job/[jobId=idNumber]/build/+server.ts b/src/routes/(api)/job/[jobId=idNumber]/build/+server.ts index d8c0c536..8ae41e0e 100644 --- a/src/routes/(api)/job/[jobId=idNumber]/build/+server.ts +++ b/src/routes/(api)/job/[jobId=idNumber]/build/+server.ts @@ -4,9 +4,10 @@ import { BullMQ, getQueues } from '$lib/server/bullmq'; import { Build } from '$lib/server/models/build'; import { prisma } from '$lib/server/prisma'; import { ErrorResponse } from '$lib/utils'; +import { stringLimits } from '$lib/valibot'; const buildSchema = v.strictObject({ - targets: v.string(), + targets: v.pipe(v.string(), v.maxBytes(stringLimits.build.targets)), environment: v.record(v.string(), v.string()) }); diff --git a/src/routes/(api)/job/[jobId=idNumber]/build/[buildId=idNumber]/+server.ts b/src/routes/(api)/job/[jobId=idNumber]/build/[buildId=idNumber]/+server.ts index 002f37d9..8d6b8ae4 100644 --- a/src/routes/(api)/job/[jobId=idNumber]/build/[buildId=idNumber]/+server.ts +++ b/src/routes/(api)/job/[jobId=idNumber]/build/[buildId=idNumber]/+server.ts @@ -5,6 +5,7 @@ import { Build } from '$lib/server/models/build'; import { Release } from '$lib/server/models/release'; import { prisma } from '$lib/server/prisma'; import { ErrorResponse } from '$lib/utils'; +import { stringLimits } from '$lib/valibot'; // GET /job/[id]/build/[id] export const GET: RequestHandler = async ({ params }) => { @@ -55,7 +56,7 @@ export const GET: RequestHandler = async ({ params }) => { }; const releaseSchema = v.strictObject({ - targets: v.string(), + targets: v.pipe(v.string(), v.maxBytes(stringLimits.release.targets)), channel: v.pipe(v.string(), v.picklist(['alpha', 'beta', 'production'])), environment: v.record(v.string(), v.string()) }); diff --git a/src/routes/(api)/project/+server.ts b/src/routes/(api)/project/+server.ts index 3bf80fe6..d626bbbf 100644 --- a/src/routes/(api)/project/+server.ts +++ b/src/routes/(api)/project/+server.ts @@ -4,6 +4,7 @@ import type { RequestHandler } from './$types'; import { AWSCommon } from '$lib/server/aws/common'; import { prisma } from '$lib/server/prisma'; import { ErrorResponse } from '$lib/utils'; +import { stringLimits } from '$lib/valibot'; const projectSchema = v.strictObject({ app_id: v.pipe( @@ -15,8 +16,8 @@ const projectSchema = v.strictObject({ 'keyboardappbuilder' ]) ), - project_name: v.string(), - language_code: v.string(), + project_name: v.pipe(v.string(), v.maxBytes(stringLimits.project.project_name)), + language_code: v.pipe(v.string(), v.maxBytes(stringLimits.project.language_code)), storage_type: v.literal('s3') }); diff --git a/src/routes/(ui)/build-admin/update/+page.server.ts b/src/routes/(ui)/build-admin/update/+page.server.ts index 95825885..acb794f0 100644 --- a/src/routes/(ui)/build-admin/update/+page.server.ts +++ b/src/routes/(ui)/build-admin/update/+page.server.ts @@ -9,20 +9,27 @@ import { idSchema, paramNumber, selectFrom, - stringIdSchema + stringIdSchema, + stringLimits } from '$lib/valibot'; const buildSchema = v.object({ job_id: idSchema, - status: convertEmptyStrToNull(), + status: v.pipe(convertEmptyStrToNull(stringLimits.build.status)), build_guid: v.pipe(convertEmptyStrToNull(), v.nullable(stringIdSchema)), - result: convertEmptyStrToNull(), - error: v.pipe(convertEmptyStrToNull(), v.nullable(v.pipe(v.string(), v.url()))), - artifact_url_base: v.pipe(convertEmptyStrToNull(), v.nullable(v.pipe(v.string(), v.url()))), - artifact_files: convertEmptyStrToNull(), - channel: convertEmptyStrToNull(), + result: convertEmptyStrToNull(stringLimits.build.result), + error: v.pipe( + convertEmptyStrToNull(stringLimits.build.error), + v.nullable(v.pipe(v.string(), v.url())) + ), + artifact_url_base: v.pipe( + convertEmptyStrToNull(stringLimits.build.artifact_url_base), + v.nullable(v.pipe(v.string(), v.url())) + ), + artifact_files: convertEmptyStrToNull(stringLimits.build.artifact_files), + channel: convertEmptyStrToNull(stringLimits.build.channel), version_code: v.nullable(idSchema), - targets: convertEmptyStrToNull(), + targets: convertEmptyStrToNull(stringLimits.build.targets), environment: convertEmptyStrToNull() }); diff --git a/src/routes/(ui)/build-admin/update/+page.svelte b/src/routes/(ui)/build-admin/update/+page.svelte index 3d72eb6a..312f6981 100644 --- a/src/routes/(ui)/build-admin/update/+page.svelte +++ b/src/routes/(ui)/build-admin/update/+page.svelte @@ -5,6 +5,7 @@ import Breadcrumbs from '$lib/components/Breadcrumbs.svelte'; import LabeledFormInput from '$lib/components/LabeledFormInput.svelte'; import { title } from '$lib/stores'; + import { stringLimits } from '$lib/valibot'; const id = $derived(page.url.searchParams.get('id')!); @@ -42,19 +43,39 @@   - +   - +   - +   - +   @@ -63,6 +84,7 @@ type="url" bind:value={$form.artifact_url_base} required + maxlength={stringLimits.build.artifact_url_base} />   @@ -70,11 +92,17 @@   - +   @@ -82,7 +110,12 @@   - +   diff --git a/src/routes/(ui)/client-admin/create/+page.svelte b/src/routes/(ui)/client-admin/create/+page.svelte index 8980f7f7..b9ed24eb 100644 --- a/src/routes/(ui)/client-admin/create/+page.svelte +++ b/src/routes/(ui)/client-admin/create/+page.svelte @@ -4,6 +4,7 @@ import Breadcrumbs from '$lib/components/Breadcrumbs.svelte'; import LabeledFormInput from '$lib/components/LabeledFormInput.svelte'; import { title } from '$lib/stores'; + import { stringLimits } from '$lib/valibot'; $title = 'Create Client'; @@ -32,11 +33,18 @@ type="text" bind:value={$form.access_token} required + maxlength={stringLimits.client.access_token} />   - +   diff --git a/src/routes/(ui)/client-admin/update/+page.svelte b/src/routes/(ui)/client-admin/update/+page.svelte index 144b96eb..d113ddb4 100644 --- a/src/routes/(ui)/client-admin/update/+page.svelte +++ b/src/routes/(ui)/client-admin/update/+page.svelte @@ -5,6 +5,7 @@ import Breadcrumbs from '$lib/components/Breadcrumbs.svelte'; import LabeledFormInput from '$lib/components/LabeledFormInput.svelte'; import { title } from '$lib/stores'; + import { stringLimits } from '$lib/valibot'; const id = $derived(page.url.searchParams.get('id')!); @@ -38,11 +39,18 @@ type="text" bind:value={$form.access_token} required + maxlength={stringLimits.client.access_token} />   - +   diff --git a/src/routes/(ui)/client-admin/valibot.ts b/src/routes/(ui)/client-admin/valibot.ts index d69af0fb..ccb06d5d 100644 --- a/src/routes/(ui)/client-admin/valibot.ts +++ b/src/routes/(ui)/client-admin/valibot.ts @@ -1,14 +1,17 @@ import * as v from 'valibot'; +import { stringLimits } from '$lib/valibot'; export const clientSchema = v.strictObject({ access_token: v.pipe( v.string(), v.transform((s) => s.trim()), - v.minLength(1) + v.minLength(1), + v.maxBytes(stringLimits.client.access_token) ), prefix: v.pipe( v.string(), v.transform((s) => s.trim()), - v.minLength(1) + v.minLength(1), + v.maxBytes(stringLimits.client.prefix) ) }); diff --git a/src/routes/(ui)/job-admin/update/+page.server.ts b/src/routes/(ui)/job-admin/update/+page.server.ts index 49639fa8..43584cdd 100644 --- a/src/routes/(ui)/job-admin/update/+page.server.ts +++ b/src/routes/(ui)/job-admin/update/+page.server.ts @@ -9,18 +9,25 @@ import { idSchema, paramNumber, selectFrom, - stringIdSchema + stringIdSchema, + stringLimits } from '$lib/valibot'; const jobSchema = v.strictObject({ request_id: stringIdSchema, - git_url: v.pipe(v.string(), v.url()), - app_id: v.string(), - publisher_id: v.string(), + git_url: v.pipe(v.string(), v.url(), v.maxBytes(stringLimits.job.git_url)), + app_id: v.pipe(v.string(), v.maxBytes(stringLimits.job.app_id)), + publisher_id: v.pipe(v.string(), v.maxBytes(stringLimits.job.publisher_id)), client_id: v.nullable(idSchema), existing_version_code: v.nullable(idSchema), - jenkins_build_url: v.pipe(convertEmptyStrToNull(), v.nullable(v.pipe(v.string(), v.url()))), - jenkins_publish_url: v.pipe(convertEmptyStrToNull(), v.nullable(v.pipe(v.string(), v.url()))) + jenkins_build_url: v.pipe( + convertEmptyStrToNull(stringLimits.job.jenkins_build_url), + v.nullable(v.pipe(v.string(), v.url())) + ), + jenkins_publish_url: v.pipe( + convertEmptyStrToNull(stringLimits.job.jenkins_publish_url), + v.nullable(v.pipe(v.string(), v.url())) + ) }); export const load = (async ({ url }) => { diff --git a/src/routes/(ui)/job-admin/update/+page.svelte b/src/routes/(ui)/job-admin/update/+page.svelte index 2269635b..227ee026 100644 --- a/src/routes/(ui)/job-admin/update/+page.svelte +++ b/src/routes/(ui)/job-admin/update/+page.svelte @@ -5,6 +5,7 @@ import Breadcrumbs from '$lib/components/Breadcrumbs.svelte'; import LabeledFormInput from '$lib/components/LabeledFormInput.svelte'; import { title } from '$lib/stores'; + import { stringLimits } from '$lib/valibot'; const id = $derived(page.url.searchParams.get('id')!); @@ -38,15 +39,28 @@ type="text" bind:value={$form.request_id} required + maxlength={stringLimits.job.request_id} />   - +   - +   @@ -55,6 +69,7 @@ type="text" bind:value={$form.publisher_id} required + maxlength={stringLimits.job.publisher_id} />   @@ -76,7 +91,12 @@   - +   @@ -84,6 +104,7 @@ class="input input-bordered validator" type="url" bind:value={$form.jenkins_publish_url} + maxlength={stringLimits.job.jenkins_publish_url} />   diff --git a/src/routes/(ui)/project-admin/update/+page.server.ts b/src/routes/(ui)/project-admin/update/+page.server.ts index 3c24f7ca..2eb5ea54 100644 --- a/src/routes/(ui)/project-admin/update/+page.server.ts +++ b/src/routes/(ui)/project-admin/update/+page.server.ts @@ -4,20 +4,29 @@ import { valibot } from 'sveltekit-superforms/adapters'; import * as v from 'valibot'; import type { Actions, PageServerLoad } from './$types'; import { prisma } from '$lib/server/prisma'; -import { convertEmptyStrToNull, idSchema, paramNumber, selectFrom } from '$lib/valibot'; +import { + convertEmptyStrToNull, + idSchema, + paramNumber, + selectFrom, + stringLimits +} from '$lib/valibot'; const projectSchema = v.object({ - status: convertEmptyStrToNull(), - result: convertEmptyStrToNull(), - error: convertEmptyStrToNull(), - url: v.pipe(convertEmptyStrToNull(), v.nullable(v.pipe(v.string(), v.url()))), - user_id: convertEmptyStrToNull(), - group_id: convertEmptyStrToNull(), - app_id: convertEmptyStrToNull(), + status: convertEmptyStrToNull(stringLimits.project.status), + result: convertEmptyStrToNull(stringLimits.project.result), + error: convertEmptyStrToNull(stringLimits.project.error), + url: v.pipe( + convertEmptyStrToNull(stringLimits.project.url), + v.nullable(v.pipe(v.string(), v.url())) + ), + user_id: convertEmptyStrToNull(stringLimits.project.user_id), + group_id: convertEmptyStrToNull(stringLimits.project.group_id), + app_id: convertEmptyStrToNull(stringLimits.project.app_id), client_id: v.nullable(idSchema), - project_name: convertEmptyStrToNull(), - language_code: convertEmptyStrToNull(), - publishing_key: convertEmptyStrToNull() + project_name: convertEmptyStrToNull(stringLimits.project.project_name), + language_code: convertEmptyStrToNull(stringLimits.project.language_code), + publishing_key: convertEmptyStrToNull(stringLimits.project.publishing_key) }); export const load = (async ({ url }) => { diff --git a/src/routes/(ui)/project-admin/update/+page.svelte b/src/routes/(ui)/project-admin/update/+page.svelte index 2df17818..9300bf7d 100644 --- a/src/routes/(ui)/project-admin/update/+page.svelte +++ b/src/routes/(ui)/project-admin/update/+page.svelte @@ -5,6 +5,7 @@ import Breadcrumbs from '$lib/components/Breadcrumbs.svelte'; import LabeledFormInput from '$lib/components/LabeledFormInput.svelte'; import { title } from '$lib/stores'; + import { stringLimits } from '$lib/valibot'; const id = $derived(page.url.searchParams.get('id')!); @@ -33,31 +34,66 @@
- +   - +   - +   - +   - +   - +   - +   @@ -65,15 +101,30 @@   - +   - +   - +   diff --git a/src/routes/(ui)/release-admin/update/+page.server.ts b/src/routes/(ui)/release-admin/update/+page.server.ts index 8571a11e..4b81cd81 100644 --- a/src/routes/(ui)/release-admin/update/+page.server.ts +++ b/src/routes/(ui)/release-admin/update/+page.server.ts @@ -9,23 +9,30 @@ import { idSchema, paramNumber, selectFrom, - stringIdSchema + stringIdSchema, + stringLimits } from '$lib/valibot'; const releaseSchema = v.object({ build_id: idSchema, - status: convertEmptyStrToNull(), - result: convertEmptyStrToNull(), - error: v.pipe(convertEmptyStrToNull(), v.nullable(v.pipe(v.string(), v.url()))), - channel: v.string(), - title: convertEmptyStrToNull(), - defaultLanguage: convertEmptyStrToNull(), + status: convertEmptyStrToNull(stringLimits.release.status), + result: convertEmptyStrToNull(stringLimits.release.result), + error: v.pipe( + convertEmptyStrToNull(stringLimits.release.error), + v.nullable(v.pipe(v.string(), v.url())) + ), + channel: v.pipe(v.string(), v.maxBytes(stringLimits.release.channel)), + title: convertEmptyStrToNull(stringLimits.release.title), + defaultLanguage: convertEmptyStrToNull(stringLimits.release.defaultLanguage), build_guid: v.pipe(convertEmptyStrToNull(), v.nullable(stringIdSchema)), - promote_from: convertEmptyStrToNull(), - targets: convertEmptyStrToNull(), + promote_from: convertEmptyStrToNull(stringLimits.release.promote_from), + targets: convertEmptyStrToNull(stringLimits.release.targets), environment: convertEmptyStrToNull(), - artifact_url_base: v.pipe(convertEmptyStrToNull(), v.nullable(v.pipe(v.string(), v.url()))), - artifact_files: convertEmptyStrToNull() + artifact_url_base: v.pipe( + convertEmptyStrToNull(stringLimits.release.artifact_url_base), + v.nullable(v.pipe(v.string(), v.url())) + ), + artifact_files: convertEmptyStrToNull(stringLimits.release.artifact_files) }); export const load = (async ({ url }) => { diff --git a/src/routes/(ui)/release-admin/update/+page.svelte b/src/routes/(ui)/release-admin/update/+page.svelte index a4b3a837..02a014b5 100644 --- a/src/routes/(ui)/release-admin/update/+page.svelte +++ b/src/routes/(ui)/release-admin/update/+page.svelte @@ -5,6 +5,7 @@ import Breadcrumbs from '$lib/components/Breadcrumbs.svelte'; import LabeledFormInput from '$lib/components/LabeledFormInput.svelte'; import { title } from '$lib/stores'; + import { stringLimits } from '$lib/valibot'; const id = $derived(page.url.searchParams.get('id')!); @@ -42,39 +43,85 @@   - +   - +   - +   - +   - +   - +   - +   - +   - +   @@ -87,6 +134,7 @@ type="url" bind:value={$form.artifact_url_base} required + maxlength={stringLimits.release.artifact_url_base} />   @@ -94,6 +142,7 @@