refactor(gitref): 將分支名稱驗證改為正式模組
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
'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,
|
||||
};
|
||||
Reference in New Issue
Block a user