mirror of
https://github.com/microsoft/vscode.git
synced 2025-12-23 19:59:37 +00:00
Git - implement SSH_ASKPASS handler (#159573)
This commit is contained in:
@@ -16,24 +16,49 @@ function fatal(err: any): void {
|
||||
}
|
||||
|
||||
function main(argv: string[]): void {
|
||||
if (argv.length !== 5) {
|
||||
return fatal('Wrong number of arguments');
|
||||
}
|
||||
|
||||
if (!process.env['VSCODE_GIT_ASKPASS_PIPE']) {
|
||||
return fatal('Missing pipe');
|
||||
}
|
||||
|
||||
if (!process.env['VSCODE_GIT_ASKPASS_TYPE']) {
|
||||
return fatal('Missing type');
|
||||
}
|
||||
|
||||
if (process.env['VSCODE_GIT_ASKPASS_TYPE'] !== 'https' && process.env['VSCODE_GIT_ASKPASS_TYPE'] !== 'ssh') {
|
||||
return fatal(`Invalid type: ${process.env['VSCODE_GIT_ASKPASS_TYPE']}`);
|
||||
}
|
||||
|
||||
if (process.env['VSCODE_GIT_COMMAND'] === 'fetch' && !!process.env['VSCODE_GIT_FETCH_SILENT']) {
|
||||
return fatal('Skip silent fetch commands');
|
||||
}
|
||||
|
||||
const output = process.env['VSCODE_GIT_ASKPASS_PIPE'] as string;
|
||||
const request = argv[2];
|
||||
const host = argv[4].replace(/^["']+|["':]+$/g, '');
|
||||
const ipcClient = new IPCClient('askpass');
|
||||
const askpassType = process.env['VSCODE_GIT_ASKPASS_TYPE'] as 'https' | 'ssh';
|
||||
|
||||
ipcClient.call({ request, host }).then(res => {
|
||||
// HTTPS (username | password), SSH (passphrase | authenticity)
|
||||
const request = askpassType === 'https' ? argv[2] : argv[3];
|
||||
|
||||
let host: string | undefined,
|
||||
file: string | undefined,
|
||||
fingerprint: string | undefined;
|
||||
|
||||
if (askpassType === 'https') {
|
||||
host = argv[4].replace(/^["']+|["':]+$/g, '');
|
||||
}
|
||||
|
||||
if (askpassType === 'ssh') {
|
||||
if (/passphrase/i.test(request)) {
|
||||
// passphrase
|
||||
file = argv[6].replace(/^["']+|["':]+$/g, '');
|
||||
} else {
|
||||
// authenticity
|
||||
host = argv[6].replace(/^["']+|["':]+$/g, '');
|
||||
fingerprint = argv[15];
|
||||
}
|
||||
}
|
||||
|
||||
const ipcClient = new IPCClient('askpass');
|
||||
ipcClient.call({ askpassType, request, host, file, fingerprint }).then(res => {
|
||||
fs.writeFileSync(output, res + '\n');
|
||||
setTimeout(() => process.exit(0), 0);
|
||||
}).catch(err => fatal(err));
|
||||
|
||||
Reference in New Issue
Block a user