Commit abf5de69 authored by yangjianbo's avatar yangjianbo
Browse files

Merge branch 'main' into test

parents 7582dc53 174d7c77
...@@ -865,8 +865,8 @@ export default { ...@@ -865,8 +865,8 @@ export default {
editUser: '编辑用户', editUser: '编辑用户',
deleteUser: '删除用户', deleteUser: '删除用户',
deleteConfirmMessage: "确定要删除用户 '{email}' 吗?此操作无法撤销。", deleteConfirmMessage: "确定要删除用户 '{email}' 吗?此操作无法撤销。",
searchPlaceholder: '搜索用户邮箱用户名备注、支持模糊查询...', searchPlaceholder: '邮箱/用户名/备注/API Key 模糊搜索...',
searchUsers: '搜索用户邮箱用户名备注、支持模糊查询', searchUsers: '邮箱/用户名/备注/API Key 模糊搜索',
roleFilter: '角色筛选', roleFilter: '角色筛选',
allRoles: '全部角色', allRoles: '全部角色',
allStatus: '全部状态', allStatus: '全部状态',
...@@ -1936,7 +1936,15 @@ export default { ...@@ -1936,7 +1936,15 @@ export default {
authCodeHint: '您可以直接复制整个链接或仅复制 code 参数值,系统会自动识别', authCodeHint: '您可以直接复制整个链接或仅复制 code 参数值,系统会自动识别',
failedToGenerateUrl: '生成 Antigravity 授权链接失败', failedToGenerateUrl: '生成 Antigravity 授权链接失败',
missingExchangeParams: '缺少 code / session_id / state', missingExchangeParams: '缺少 code / session_id / state',
failedToExchangeCode: 'Antigravity 授权码兑换失败' failedToExchangeCode: 'Antigravity 授权码兑换失败',
// Refresh Token auth
refreshTokenAuth: '手动输入 RT',
refreshTokenDesc: '输入您已有的 Antigravity Refresh Token,支持批量输入(每行一个),系统将自动验证并创建账号。',
refreshTokenPlaceholder: '粘贴您的 Antigravity Refresh Token...\n支持多个,每行一个',
validating: '验证中...',
validateAndCreate: '验证并创建账号',
pleaseEnterRefreshToken: '请输入 Refresh Token',
failedToValidateRT: '验证 Refresh Token 失败'
} }
}, },
// Gemini specific (platform-wide) // Gemini specific (platform-wide)
...@@ -2315,7 +2323,7 @@ export default { ...@@ -2315,7 +2323,7 @@ export default {
allStatus: '全部状态', allStatus: '全部状态',
unused: '未使用', unused: '未使用',
used: '已使用', used: '已使用',
searchCodes: '搜索兑换码...', searchCodes: '搜索兑换码或邮箱...',
exportCsv: '导出 CSV', exportCsv: '导出 CSV',
deleteAllUnused: '删除全部未使用', deleteAllUnused: '删除全部未使用',
deleteCodeConfirm: '确定要删除此兑换码吗?此操作无法撤销。', deleteCodeConfirm: '确定要删除此兑换码吗?此操作无法撤销。',
...@@ -3572,6 +3580,7 @@ export default { ...@@ -3572,6 +3580,7 @@ export default {
custom: '自定义', custom: '自定义',
code: '状态码', code: '状态码',
body: '消息体', body: '消息体',
skipMonitoring: '跳过监控',
// Columns // Columns
columns: { columns: {
...@@ -3616,6 +3625,8 @@ export default { ...@@ -3616,6 +3625,8 @@ export default {
passthroughBody: '透传上游错误信息', passthroughBody: '透传上游错误信息',
customMessage: '自定义错误信息', customMessage: '自定义错误信息',
customMessagePlaceholder: '返回给客户端的错误信息...', customMessagePlaceholder: '返回给客户端的错误信息...',
skipMonitoring: '跳过运维监控记录',
skipMonitoringHint: '开启后,匹配此规则的错误不会被记录到运维监控中',
enabled: '启用此规则' enabled: '启用此规则'
}, },
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
*/ */
type SanitizeOptions = { type SanitizeOptions = {
allowRelative?: boolean allowRelative?: boolean
allowDataUrl?: boolean
} }
export function sanitizeUrl(value: string, options: SanitizeOptions = {}): string { export function sanitizeUrl(value: string, options: SanitizeOptions = {}): string {
...@@ -18,6 +19,11 @@ export function sanitizeUrl(value: string, options: SanitizeOptions = {}): strin ...@@ -18,6 +19,11 @@ export function sanitizeUrl(value: string, options: SanitizeOptions = {}): strin
return trimmed return trimmed
} }
// 允许 data:image/ 开头的 data URL(仅限图片类型)
if (options.allowDataUrl && trimmed.startsWith('data:image/')) {
return trimmed
}
// 只接受绝对 URL,不使用 base URL 来避免相对路径被解析为当前域名 // 只接受绝对 URL,不使用 base URL 来避免相对路径被解析为当前域名
// 检查是否以 http:// 或 https:// 开头 // 检查是否以 http:// 或 https:// 开头
if (!trimmed.match(/^https?:\/\//i)) { if (!trimmed.match(/^https?:\/\//i)) {
......
...@@ -117,9 +117,9 @@ ...@@ -117,9 +117,9 @@
</span> </span>
</template> </template>
<template #cell-used_by="{ value }"> <template #cell-used_by="{ value, row }">
<span class="text-sm text-gray-500 dark:text-dark-400"> <span class="text-sm text-gray-500 dark:text-dark-400">
{{ value ? t('admin.redeem.userPrefix', { id: value }) : '-' }} {{ row.user?.email || (value ? t('admin.redeem.userPrefix', { id: value }) : '-') }}
</span> </span>
</template> </template>
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment