diff --git a/app/config.js b/app/config.js index f2895cc..49665be 100644 --- a/app/config.js +++ b/app/config.js @@ -26,7 +26,10 @@ import { section, info, warn } from './logger.js' export function loadConfig(env = process.env) { section('參數檢查') - const serverUrl = env.GITEA_SERVER_URL + // 去除結尾多餘的 /,避免後續拼接出 `https://host//api/v1/...` 這類錯誤路徑。 + const rawServerUrl = env.GITEA_SERVER_URL + const serverUrl = + typeof rawServerUrl === 'string' ? rawServerUrl.replace(/\/+$/, '') : rawServerUrl const repository = env.GITEA_REPOSITORY const keepCountRaw = env.KEEP_COUNT const token = env.GITEA_TOKEN diff --git a/app/releases.js b/app/releases.js index 2c65042..bb373a4 100644 --- a/app/releases.js +++ b/app/releases.js @@ -60,12 +60,13 @@ export async function cleanupReleases(client, config) { for (const release of toDelete) { const { id, tag_name: tag, name } = release - if (isEmptyOrNull(id)) { - warn(`略過沒有 id 的成品: ${tag} (${name})`) + // 要求 id 為正整數(Gitea release id 本即正整數);非整數一律略過,不僅依賴 URL 編碼防護。 + if (isEmptyOrNull(id) || !Number.isInteger(Number(id)) || Number(id) <= 0) { + warn(`略過沒有有效 id 的成品: ${tag} (${name})`) continue } - // 對 id 做編碼,避免非預期內容被拼接進 URL(防路徑穿越);正常數值 id 編碼後不變。 + // id 已驗證為正整數;仍對其編碼作為縱深防禦。 const url = `${config.releaseApiUrl}/${encodeURIComponent(id)}` info(`DELETE ${tag} (${name})`)