diff --git a/packages/contract/src/account.ts b/packages/contract/src/account.ts index d5a531c..c6c65ce 100644 --- a/packages/contract/src/account.ts +++ b/packages/contract/src/account.ts @@ -9,12 +9,25 @@ export const registerRequestSchema = z.object({ password: z.string().min(6).max(20), }) +/** + * 对齐旧后端 `account/serializers.py:125,127` 的 `serializers.URLField`: + * 这两个字段会被前端渲染成可点击链接,放任自由字符串等于允许写入 + * `javascript:` 一类的伪协议。只放行 http/https,空串与 null 表示「清空」。 + */ +const linkField = z + .string() + .max(256) + .refine( + (value) => value === "" || /^https?:\/\/\S+$/i.test(value), + "必须是以 http:// 或 https:// 开头的网址", + ) + export const updateProfileRequestSchema = z.object({ realName: z.string().max(32).nullable().optional(), avatar: z.string().max(256).optional(), - blog: z.string().max(256).nullable().optional(), + blog: linkField.nullable().optional(), mood: z.string().max(256).nullable().optional(), - github: z.string().max(256).nullable().optional(), + github: linkField.nullable().optional(), school: z.string().max(64).nullable().optional(), major: z.string().max(64).nullable().optional(), language: z.string().max(32).nullable().optional(),