33 lines
1.1 KiB
JavaScript
33 lines
1.1 KiB
JavaScript
'use strict';
|
|
|
|
const { execFileSync } = require('child_process');
|
|
|
|
/**
|
|
* 驗證遠端分支名稱可安全用於 refspec 與 refs/remotes/origin/*。
|
|
*
|
|
* @param {string} refName - 使用者或事件 payload 提供的分支名稱。
|
|
* @param {string} fieldName - 錯誤訊息中的欄位名稱。
|
|
* @returns {string} 原樣回傳通過驗證的分支名稱。
|
|
* @throws {Error} 分支名稱空白、含路徑穿越,或不符合 git 分支 ref 規則時拋出。
|
|
*/
|
|
function assertSafeBranchRef(refName, fieldName) {
|
|
const value = String(refName || '').trim();
|
|
if (!value) throw new Error(`${fieldName} 不可為空。`);
|
|
if (value.includes('..') || value.startsWith('/') || value.endsWith('/') || value.includes('\\')) {
|
|
throw new Error(`${fieldName} 不是安全的分支名稱:${value}`);
|
|
}
|
|
try {
|
|
execFileSync('git', ['check-ref-format', '--branch', value], {
|
|
encoding: 'utf8',
|
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
});
|
|
} catch {
|
|
throw new Error(`${fieldName} 不是合法的 git 分支名稱:${value}`);
|
|
}
|
|
return value;
|
|
}
|
|
|
|
module.exports = {
|
|
assertSafeBranchRef,
|
|
};
|