fix(installer): make Windows option validation readable

This commit is contained in:
yiliang114 2026-05-13 20:43:30 +08:00
parent 90935774a2
commit 72a5efe744
2 changed files with 17 additions and 6 deletions

View file

@ -303,11 +303,18 @@ set "QWEN_VALIDATE_INSTALL_BASE=!INSTALL_BASE!"
set "QWEN_VALIDATE_INSTALL_DIR=!INSTALL_DIR!"
set "QWEN_VALIDATE_INSTALL_BIN_DIR=!INSTALL_BIN_DIR!"
set "QWEN_VALIDATE_SOURCE=!SOURCE!"
REM Keep this PowerShell script encoded so cmd.exe does not parse its metacharacters first.
set "QWEN_VALIDATE_OPTIONS_COMMAND=JAB1AG4AcwBhAGYAZQAgAD0AIABbAGMAaABhAHIAWwBdAF0AKAAxADAALAAxADMALAAzADMALAAzADQALAAzADcALAAzADgALAA2ADAALAA2ADIALAA5ADQALAA5ADYALAAxADIANAApAAoAZgBvAHIAZQBhAGMAaAAgACgAJABuAGEAbQBlACAAaQBuACAAJwBNAEUAVABIAE8ARAAnACwAJwBNAEkAUgBSAE8AUgAnACwAJwBCAEEAUwBFAF8AVQBSAEwAJwAsACcAQQBSAEMASABJAFYARQBfAFAAQQBUAEgAJwAsACcAVgBFAFIAUwBJAE8ATgAnACwAJwBOAFAATQBfAFIARQBHAEkAUwBUAFIAWQAnACwAJwBJAE4AUwBUAEEATABMAF8AQgBBAFMARQAnACwAJwBJAE4AUwBUAEEATABMAF8ARABJAFIAJwAsACcASQBOAFMAVABBAEwATABfAEIASQBOAF8ARABJAFIAJwAsACcAUwBPAFUAUgBDAEUAJwApACAAewAKACAAIAAkAHYAYQBsAHUAZQAgAD0AIABbAEUAbgB2AGkAcgBvAG4AbQBlAG4AdABdADoAOgBHAGUAdABFAG4AdgBpAHIAbwBuAG0AZQBuAHQAVgBhAHIAaQBhAGIAbABlACgAJwBRAFcARQBOAF8AVgBBAEwASQBEAEEAVABFAF8AJwAgACsAIAAkAG4AYQBtAGUAKQAKACAAIABpAGYAIAAoACQAbgB1AGwAbAAgAC0AbgBlACAAJAB2AGEAbAB1AGUAIAAtAGEAbgBkACAAJAB2AGEAbAB1AGUALgBJAG4AZABlAHgATwBmAEEAbgB5ACgAJAB1AG4AcwBhAGYAZQApACAALQBnAGUAIAAwACkAIAB7ACAAZQB4AGkAdAAgADEAIAB9AAoAfQAKAGUAeABpAHQAIAAwAA=="
powershell -NoProfile -ExecutionPolicy Bypass -EncodedCommand !QWEN_VALIDATE_OPTIONS_COMMAND!
set "QWEN_VALIDATE_OPTIONS_SCRIPT=%TEMP%\qwen-validate-options-%RANDOM%-%RANDOM%.ps1"
> "!QWEN_VALIDATE_OPTIONS_SCRIPT!" echo $unsafe = [char[]](10,13,33,34,37,38,60,62,94,96,124)
>> "!QWEN_VALIDATE_OPTIONS_SCRIPT!" echo $names = @('METHOD','MIRROR','BASE_URL','ARCHIVE_PATH','VERSION','NPM_REGISTRY','INSTALL_BASE','INSTALL_DIR','INSTALL_BIN_DIR','SOURCE')
>> "!QWEN_VALIDATE_OPTIONS_SCRIPT!" echo foreach ($name in $names) {
>> "!QWEN_VALIDATE_OPTIONS_SCRIPT!" echo $value = [Environment]::GetEnvironmentVariable('QWEN_VALIDATE_' + $name)
>> "!QWEN_VALIDATE_OPTIONS_SCRIPT!" echo if ($null -ne $value -and $value.IndexOfAny($unsafe) -ge 0) { exit 1 }
>> "!QWEN_VALIDATE_OPTIONS_SCRIPT!" echo }
>> "!QWEN_VALIDATE_OPTIONS_SCRIPT!" echo exit 0
powershell -NoProfile -ExecutionPolicy Bypass -File "!QWEN_VALIDATE_OPTIONS_SCRIPT!"
set "PS_STATUS=%ERRORLEVEL%"
set "QWEN_VALIDATE_OPTIONS_COMMAND="
del /F /Q "!QWEN_VALIDATE_OPTIONS_SCRIPT!" >nul 2>&1
set "QWEN_VALIDATE_OPTIONS_SCRIPT="
set "QWEN_VALIDATE_METHOD="
set "QWEN_VALIDATE_MIRROR="
set "QWEN_VALIDATE_BASE_URL="

View file

@ -182,8 +182,12 @@ describe('installation scripts', () => {
expect(script).toContain(
'installer options contain unsafe command characters',
);
expect(script).toContain('-EncodedCommand');
expect(script).toContain('QWEN_VALIDATE_OPTIONS_COMMAND');
expect(script).not.toContain('-EncodedCommand');
expect(script).toContain('QWEN_VALIDATE_OPTIONS_SCRIPT');
expect(script).toContain('$unsafe = [char[]](10,13,33,34');
expect(script).toContain(
'powershell -NoProfile -ExecutionPolicy Bypass -File "!QWEN_VALIDATE_OPTIONS_SCRIPT!"',
);
expect(script).toContain('if "!INSTALL_BASE:~1,2!"==":/"');
expect(script).toContain('if "!INSTALL_DIR:~1,2!"==":/"');
expect(script).toContain('if "!INSTALL_BIN_DIR:~1,2!"==":/"');