commit 145414d218a6bb302f67abb85212545025a44962 Author: orin Date: Fri Oct 20 16:49:52 2023 +0200 Initial commit diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/autodl.php b/autodl.php new file mode 100644 index 0000000..44056db --- /dev/null +++ b/autodl.php @@ -0,0 +1,236 @@ +setOfflineFilesOrDie(); + $this->setUpdateInfo(); + $this->setArchiveNames(); + $this->setUrlsForPacks(); + } + + private function setOfflineFilesOrDie() { + $files = uupGetFiles( + $this->updateId, + $this->usePack, + $this->desiredEditionMixed, + 2 + ); + + if(isset($files['error'])) { + fancyError($files['error'], 'downloads'); + die(); + } + + $this->files = $files; + } + + private function setUpdateInfo() { + $info = uupUpdateInfo($this->updateId, ignoreFiles: true); + $info = @$info['info']; + + $this->sku = isset($info['sku']) ? $info['sku'] : 48; + $this->build = isset($info['build']) ? $info['build'] : 'UNKNOWN'; + $this->arch = isset($info['arch']) ? $info['arch'] : 'UNKNOWN'; + $this->title = isset($info['title']) ? $info['title'] : 'UNKNOWN'; + + $this->buildNum = uupApiBuildMajor($this->build); + } + + private function setArchiveNames() { + $usePack = $this->usePack; + $desiredEditionMixed = $this->desiredEditionMixed; + + $build = $this->build; + $arch = $this->arch; + + $lang = $usePack ? $usePack : 'all'; + + if(is_array($desiredEditionMixed)) { + $edition = count($desiredEditionMixed) == 1 ? strtolower($desiredEditionMixed[0]) : 'multi'; + } else { + $edition = $desiredEditionMixed ? strtolower($desiredEditionMixed) : 'all'; + } + + if($edition == 'multi') { + foreach($desiredEditionMixed as $val) { + if(strtolower($val) == 'app' || strtolower($val) == 'app_moment') $edition = 'app'; + } + } + + $id = substr($this->updateId, 0, 8); + $this->archiveName = $edition == 'updateonly' ? "{$build}_{$arch}_updates_{$id}" : "{$build}_{$arch}_{$lang}_{$edition}_{$id}"; + + $this->lang = $lang; + $this->edition = $edition; + } + + private function skipApps() { + $desiredEditionMixed = $this->desiredEditionMixed; + $appSkip = false; + + if(is_array($desiredEditionMixed)) { + foreach($desiredEditionMixed as $val) { + $edition = strtolower($val); + if($edition == 'updateonly' || $edition == 'app' || $edition == 'app_moment') $appSkip = true; + } + } else { + $edition = $desiredEditionMixed ? strtolower($desiredEditionMixed) : 'all'; + if($edition == 'updateonly' || $edition == 'app' || $edition == 'app_moment') $appSkip = true; + } + + return $appSkip; + } + + private function supportsApps() { + $isBlocked = isUpdateBlocked($this->buildNum, $this->title); + + if($this->buildNum <= 22557 || $isBlocked || $this->skipApps()) + return false; + + $genPack = uupGetGenPacks($this->buildNum, $this->arch, $this->updateId); + + if(empty($genPack) || !isset($genPack['neutral'])) + return false; + + $isAPP = false; + foreach(array_keys($genPack['neutral']) as $edition) { + if($edition == 'APP') $isAPP = true; + } + + return $isAPP; + } + + private function setUrlsForPacks() { + $updateId = $this->updateId; + $usePack = $this->usePack; + $desiredEdition = $this->desiredEdition; + + if(isset($_SERVER['HTTPS'])) { + $url = 'https://'; + } else { + $url = 'http://'; + } + + $url .= $_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']; + $app = $url; + + $url .= '?id='.$updateId.'&pack='.$usePack.'&edition='.$desiredEdition.'&aria2=2'; + $app .= '?id='.$updateId.'&pack=neutral&edition=app&aria2=2'; + + $this->url = $url; + + $supportsApps = $this->supportsApps(); + $this->appUrl = $supportsApps ? $app : null; + } + + private function getMoreOptionsFromPost() { + if(!isset($_GET['autodl'])) { + $updates = isset($_POST['updates']) ? $_POST['updates'] : 0; + } else { + $updates = 1; + } + + $cleanup = isset($_POST['cleanup']) ? $_POST['cleanup'] : 0; + $netfx = isset($_POST['netfx']) ? $_POST['netfx'] : 0; + $esd = isset($_POST['esd']) ? $_POST['esd'] : 0; + + $moreOptions = []; + $moreOptions['updates'] = $updates; + $moreOptions['cleanup'] = $cleanup; + $moreOptions['netfx'] = $netfx; + $moreOptions['esd'] = $esd; + + return $moreOptions; + } + + private function isVeAvailable() { + $supportsVE = areVirtualEditonsSupported($this->buildNum, $this->sku); + $isApps = ($this->edition == 'app' || $this->edition == 'app_moment'); + + return $supportsVE && !$isApps; + } + + private function verifyVeAndDieOnError() { + if(!$this->isVeAvailable()) { + fancyError('VE_UNAVAILABLE', 'downloads'); + die(); + } else if (count($this->desiredVE) == 0) { + fancyError('UNSPECIFIED_VE', 'downloads'); + die(); + } + } + + private function createDownloadOnlyPackage() { + $url = $this->url; + $name = $this->archiveName; + $app = $this->appUrl; + + createAria2Package($url, $name, $app); + } + + private function createConversionPackage($isVe) { + $url = $this->url; + $name = $this->archiveName; + $ve = $this->desiredVE; + $opt = $this->getMoreOptionsFromPost(); + $app = $this->appUrl; + + if($isVe) { + $this->verifyVeAndDieOnError(); + } + + createUupConvertPackage($url, $name, $isVe, $ve, $opt, $app); + } + + public function createPackage() { + $isConversion = $this->autoDl > 1; + $isVe = $this->autoDl == 3 ? 1 : 0; + + if(!$isConversion) { + $this->createDownloadOnlyPackage(); + } else { + $this->createConversionPackage($isVe); + } + } +} diff --git a/autodl_files/converter_multi b/autodl_files/converter_multi new file mode 100644 index 0000000..a3025e3 --- /dev/null +++ b/autodl_files/converter_multi @@ -0,0 +1,7 @@ +https://git.uupdump.net/uup-dump/converter/raw/commit/7b507c6c99afcf4cff59adcdf51cdb75159bd548/convert.sh + out=convert.sh + checksum=sha-256=689ba88620ae9e49d370341422ece227fd3f08014a0b6f3e302e9528648ff4ab + +https://git.uupdump.net/uup-dump/converter/raw/commit/7b507c6c99afcf4cff59adcdf51cdb75159bd548/convert_ve_plugin + out=convert_ve_plugin + checksum=sha-256=02db2f5f2caf742daa6aeaa189d9af27775e8457db48fadd8d71bb1be5982eae diff --git a/autodl_files/depends_win.ps1 b/autodl_files/depends_win.ps1 new file mode 100644 index 0000000..da82d5b --- /dev/null +++ b/autodl_files/depends_win.ps1 @@ -0,0 +1,91 @@ +<# +This was made because I refuse to continue taking part in the unwritten +PowerShell/Batch obfuscation contest. +#> + +param ( + [Parameter()] + [Switch]$ForDownload +) + +<# +There are myths that some Windows versions do not work without this. + +Since I can't be arsed to verify this, I'm just adding this to lower the number +of reports to which I would normally respond with "works on my machine". +#> +try { + [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +} catch { + Write-Error "Abandonware operating systems are not supported." + Exit 1 +} + +$filesDownload = @('aria2c.exe') +$filesConvert = @('aria2c.exe', '7zr.exe', 'uup-converter-wimlib.7z') + +$urls = @{ + 'aria2c.exe' = 'https://git.uupdump.net/uup-dump/containment-zone/raw/commit/5732ce376d74b98da25634a4439e36ead38d48f8/aria2c.exe'; + '7zr.exe' = 'https://git.uupdump.net/uup-dump/containment-zone/raw/commit/5732ce376d74b98da25634a4439e36ead38d48f8/7zr.exe'; + 'uup-converter-wimlib.7z' = 'https://git.uupdump.net/uup-dump/containment-zone/raw/commit/5732ce376d74b98da25634a4439e36ead38d48f8/uup-converter-wimlib.7z'; +} + +$hashes = @{ + 'aria2c.exe' = '0ae98794b3523634b0af362d6f8c04a9bbd32aeda959b72ca0e7fc24e84d2a66'; + '7zr.exe' = '108ab5f1e36f2068e368fe97cd763c639e403cac8f511c6681eaf19fc585d814'; + 'uup-converter-wimlib.7z' = '0a62714d93320bab24d75e7761c01c519e86dc7f815a99125bd4829c71a63c6d'; +} + +function Retrieve-File { + param ( + [String]$File, + [String]$Url + ) + + Write-Host -BackgroundColor Black -ForegroundColor Yellow "Downloading ${File}..." + Invoke-WebRequest -UseBasicParsing -Uri $Url -OutFile "files\$File" -ErrorAction Stop +} + +function Test-Hash { + param ( + [String]$File, + [String]$Hash + ) + + Write-Host -BackgroundColor Black -ForegroundColor Cyan "Verifying ${File}..." + + $fileHash = (Get-FileHash -Path "files\$File" -Algorithm SHA256 -ErrorAction Stop).Hash + return ($fileHash.ToLower() -eq $Hash) +} + +if($ForDownload.IsPresent) { + $files = $filesDownload +} else { + $files = $filesConvert +} + +if(-not (Test-Path -PathType Container -Path "files")) { + $null = New-Item -Path "files" -ItemType Directory +} + +foreach($file in $files) { + try { + Retrieve-File -File $file -Url $urls[$file] + } catch { + Write-Host "Failed to download $file" + Write-Host $_ + Exit 1 + } +} + +Write-Host "" + +foreach($file in $files) { + if(-not (Test-Hash -File $file -Hash $hashes[$file])) { + Write-Error "$file appears to be tampered with" + Exit 1 + } +} + +Write-Host "" +Write-Host -BackgroundColor Black -ForegroundColor Green "It appears all the dependencies are ready." diff --git a/autodl_files/readme.unix.md b/autodl_files/readme.unix.md new file mode 100644 index 0000000..365dbe5 --- /dev/null +++ b/autodl_files/readme.unix.md @@ -0,0 +1,34 @@ +Multiplatform UUP converter requirements +======================================== +The script requires the following applications: + * cabextract - to extract cabs + * wimlib-imagex - to export files from metadata ESD + * chntpw - to modify registry of first index of boot.wim + * genisoimage or mkisofs - to create ISO image + +Linux +----- +If you use Debian or Ubuntu based distribution you can install these using +the following command: + +```bash +sudo apt-get install cabextract wimtools chntpw genisoimage +``` + +If you use Arch Linux you can also install these using the following command: +```bash +sudo pacman -S cabextract wimlib chntpw cdrtools +``` + +If you use any other distribution, you'll need to check its repository for the +appropriate packages. + +macOS +----- +macOS requires [Homebrew](https://brew.sh) to install the prerequisite software. +After Homebrew was installed, you can install the requirements using: + +```bash +brew tap sidneys/homebrew +brew install cabextract wimlib cdrtools sidneys/homebrew/chntpw +``` diff --git a/get.php b/get.php new file mode 100644 index 0000000..3304615 --- /dev/null +++ b/get.php @@ -0,0 +1,551 @@ +NUL 2>&1 && goto :START_PROCESS + +set command="""%~f0""" 49127c4b-02dc-482e-ac4f-ec4d659b7547 +SETLOCAL ENABLEDELAYEDEXPANSION +set "command=!command:'=''!" + +powershell -NoProfile Start-Process -FilePath '%COMSPEC%' ^ +-ArgumentList '/c """!command!"""' -Verb RunAs 2>NUL + +IF %ERRORLEVEL% GTR 0 ( + echo ===================================================== + echo This script needs to be executed as an administrator. + echo ===================================================== + echo. + pause +) + +SETLOCAL DISABLEDELAYEDEXPANSION +goto :EOF + +:START_PROCESS +set "aria2=files\\aria2c.exe" +set "a7z=files\\7zr.exe" +set "uupConv=files\\uup-converter-wimlib.7z" +set "aria2Script=files\\aria2_script.%random%.txt" +set "destDir=UUPs" + +powershell -NoProfile -ExecutionPolicy Unrestricted .\\files\\depends_win.ps1 || (pause & exit /b 1) +echo. + +if NOT EXIST ConvertConfig.ini goto :NO_FILE_ERROR +if NOT EXIST %a7z% goto :NO_FILE_ERROR +if NOT EXIST %uupConv% goto :NO_FILE_ERROR + +echo Extracting UUP converter... +"%a7z%" -x!ConvertConfig.ini -y x "%uupConv%" >NUL +echo. +$downloadapp +:DOWNLOAD_UUPS +echo Retrieving aria2 script... +"%aria2%" --no-conf --log-level=info --log="aria2_download.log" -o"%aria2Script%" --allow-overwrite=true --auto-file-renaming=false "$url" +if %ERRORLEVEL% GTR 0 call :DOWNLOAD_ERROR & exit /b 1 +echo. + +for /F "tokens=2 delims=:" %%i in ('findstr #UUPDUMP_ERROR: "%aria2Script%"') do set DETECTED_ERROR=%%i +if NOT [%DETECTED_ERROR%] == [] ( + echo Unable to retrieve data from Windows Update servers. Reason: %DETECTED_ERROR% + echo If this problem persists, most likely the set you are attempting to download was removed from Windows Update servers. + echo. + pause + goto :EOF +) + +echo Attempting to download files... +"%aria2%" --no-conf --log-level=info --log="aria2_download.log" -x16 -s16 -j5 -c -R -d"%destDir%" -i"%aria2Script%" +if %ERRORLEVEL% GTR 0 goto :DOWNLOAD_UUPS & exit /b 1 + +if EXIST convert-UUP.cmd goto :START_CONVERT +pause +goto :EOF + +:START_CONVERT +call convert-UUP.cmd +goto :EOF + +:NO_FILE_ERROR +echo We couldn't find one of needed files for this script. +pause +goto :EOF + +:DOWNLOAD_ERROR +echo. +echo We have encountered an error while downloading files. +pause +goto :EOF + +:EOF + +SCRIPT; + +$shellScript = <<