forked from uup-dump/api
		
	Compare commits
	
		
			39 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 5000b4c4b9 | |||
| 887dcf71d3 | |||
| 84a149c044 | |||
| 2d2321b21c | |||
| 5bed3a028a | |||
| 37cefa11c6 | |||
| 862d157672 | |||
| e433df62cf | |||
| 1933521e0d | |||
| 7b3cd4eb10 | |||
| c1f00cecbd | |||
| 8b576e4496 | |||
| 21b1500490 | |||
| fb2c89b2f8 | |||
| 846feb2629 | |||
| 5e31a6f724 | |||
| faa3b7fa45 | |||
| 42b1091c0b | |||
| aa2dbd2938 | |||
| 42c1c12405 | |||
| 092e968f0c | |||
| d58f53de42 | |||
| ca81835609 | |||
| d10e24cf5b | |||
| 140613f657 | |||
| 4694c8dc00 | |||
| 0477fd5fa6 | |||
| 1ef84cb879 | |||
| 9e618c405a | |||
| 7711645f23 | |||
| d597a83422 | |||
| d0bad95c11 | |||
| 2a57ae0fe6 | |||
| 7bdc01bdb9 | |||
| b13403cf59 | |||
| 5777ff09b6 | |||
| 954547ea84 | |||
| db1e155c8d | |||
| 543e4c52e4 | 
							
								
								
									
										166
									
								
								fetchupd.php
									
									
									
									
									
								
							
							
						
						
									
										166
									
								
								fetchupd.php
									
									
									
									
									
								
							| @@ -21,6 +21,91 @@ require_once dirname(__FILE__).'/shared/cache.php'; | ||||
| require_once dirname(__FILE__).'/shared/fileinfo.php'; | ||||
| require_once dirname(__FILE__).'/listid.php'; | ||||
|  | ||||
| function uupApiPrivateParseFlags($str) { | ||||
|     $split = explode('+', $str); | ||||
|     $flagsSafe = []; | ||||
|  | ||||
|     if(isset($split[1])) { | ||||
|         $flags = array_unique(explode(',', strtolower($split[1]))); | ||||
|         $flagsSafe = array_intersect(getAllowedFlags(), $flags); | ||||
|     } | ||||
|  | ||||
|     return [$split[0], $flagsSafe]; | ||||
| } | ||||
|  | ||||
| function uupApiPrivateGetLatestBuild() { | ||||
|     $builds = array('22000.1'); | ||||
|  | ||||
|     $ids = uupListIds(); | ||||
|     if(isset($ids['error'])) { | ||||
|         $ids['builds'] = array(); | ||||
|     } | ||||
|  | ||||
|     if(empty($ids['builds'])) { | ||||
|         $build = $builds[0]; | ||||
|     } else { | ||||
|         $build = $ids['builds'][0]['build']; | ||||
|     } | ||||
|  | ||||
|     return $build; | ||||
| } | ||||
|  | ||||
| function uupApiPrivateIsAcceptableBranch($branch) { | ||||
|     if(!uupApiConfigIsTrue('production_mode')) { | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     $branches = [ | ||||
|         'auto', | ||||
|         'rs2_release', | ||||
|         'rs3_release', | ||||
|         'rs4_release', | ||||
|         'rs5_release', | ||||
|         'rs5_release_svc_hci', | ||||
|         '19h1_release', | ||||
|         'vb_release', | ||||
|         'fe_release_10x', | ||||
|         'fe_release', | ||||
|         'co_release', | ||||
|         'ni_release', | ||||
|         'zn_release', | ||||
|         'ge_release', | ||||
|         'br_release', | ||||
|         'ge_prerelease', | ||||
|         'rs_prerelease', | ||||
|     ]; | ||||
|  | ||||
|     return in_array($branch, $branches); | ||||
| } | ||||
|  | ||||
| function uupApiPrivateNormalizeFetchParams($params) { | ||||
|     $np = array_replace([ | ||||
|         'arch' => 'amd64', | ||||
|         'ring' => 'WIF', | ||||
|         'flight' => 'Active', | ||||
|         'branch' => 'ge_release', | ||||
|         'build' => 'latest', | ||||
|         'minor' => 0, | ||||
|         'sku' => 48, | ||||
|         'type' => 'Production', | ||||
|         'flags' => [], | ||||
|     ], $params); | ||||
|  | ||||
|     if(!is_array($np['flags'])) $np['flags'] = []; | ||||
|  | ||||
|     $np['arch'] = strtolower($np['arch']); | ||||
|     $np['ring'] = strtoupper($np['ring']); | ||||
|     $np['flight'] = ucwords(strtolower($np['flight'])); | ||||
|     $np['branch'] = strtolower($np['branch']); | ||||
|     $np['build'] = strtolower($np['build']); | ||||
|     $np['minor'] = intval($np['minor']); | ||||
|     $np['sku'] = intval($np['sku']); | ||||
|     $np['type'] = ucwords(strtolower($np['type'])); | ||||
|     $np['flags'] = array_map('strtolower', $np['flags']); | ||||
|  | ||||
|     return $np; | ||||
| } | ||||
|  | ||||
| function uupFetchUpd( | ||||
|     $arch = 'amd64', | ||||
|     $ring = 'WIF', | ||||
| @@ -31,33 +116,46 @@ function uupFetchUpd( | ||||
|     $type = 'Production', | ||||
|     $cacheRequests = 0 | ||||
| ) { | ||||
|     [$build, $flags] = uupApiPrivateParseFlags($build); | ||||
|  | ||||
|     $params = [ | ||||
|         'arch' => $arch, | ||||
|         'ring' => $ring, | ||||
|         'flight' => $flight, | ||||
|         'build' => $build, | ||||
|         'minor' => $minor, | ||||
|         'sku' => $sku, | ||||
|         'type' => $type, | ||||
|         'flags' => $flags, | ||||
|     ]; | ||||
|  | ||||
|     return uupFetchUpd2($params, $cacheRequests); | ||||
| } | ||||
|  | ||||
| function uupFetchUpd2($params, $cacheRequests = 0) { | ||||
|     uupApiPrintBrand(); | ||||
|  | ||||
|     $arch = strtolower($arch); | ||||
|     $ring = strtoupper($ring); | ||||
|     $flight = ucwords(strtolower($flight)); | ||||
|     $np = uupApiPrivateNormalizeFetchParams($params); | ||||
|  | ||||
|     $arch = $np['arch']; | ||||
|     $ring = $np['ring']; | ||||
|     $flight = 'Active'; | ||||
|     $branch = $np['branch']; | ||||
|     $build = $np['build']; | ||||
|     $minor = $np['minor']; | ||||
|     $sku = $np['sku']; | ||||
|     $type = $np['type']; | ||||
|     $flags = $np['flags']; | ||||
|  | ||||
|     if($build == 'latest' || (!$build)) { | ||||
|         $builds = array('22000.1'); | ||||
|     $flagsStr = implode(',', $flags); | ||||
|  | ||||
|         $ids = uupListIds(); | ||||
|         if(isset($ids['error'])) { | ||||
|             $ids['builds'] = array(); | ||||
|         } | ||||
|  | ||||
|         if(empty($ids['builds'])) { | ||||
|             $build = $builds[0]; | ||||
|         } else { | ||||
|             $build = $ids['builds'][0]['build']; | ||||
|         } | ||||
|         unset($builds, $ids); | ||||
|     if(strtolower($build) == 'latest' || (!$build)) { | ||||
|         $build = uupApiPrivateGetLatestBuild(); | ||||
|     } | ||||
|  | ||||
|     $build = explode('.', $build); | ||||
|     if(isset($build[1])) $minor = intval($build[1]); | ||||
|     $build = intval($build[0]); | ||||
|     $sku = intval($sku); | ||||
|  | ||||
|     if(!($arch == 'amd64' || $arch == 'x86' || $arch == 'arm64' || $arch == 'arm' || $arch == 'all')) { | ||||
|         return array('error' => 'UNKNOWN_ARCH'); | ||||
| @@ -83,6 +181,9 @@ function uupFetchUpd( | ||||
|         return array('error' => 'ILLEGAL_MINOR'); | ||||
|     } | ||||
|  | ||||
|     if(!uupApiPrivateIsAcceptableBranch($branch)) | ||||
|         $branch = 'auto'; | ||||
|  | ||||
|     if($ring == 'DEV') $ring = 'WIF'; | ||||
|     if($ring == 'BETA') $ring = 'WIS'; | ||||
|     if($ring == 'RELEASEPREVIEW') $ring = 'RP'; | ||||
| @@ -96,15 +197,15 @@ function uupFetchUpd( | ||||
|         $type = 'Production'; | ||||
|     } | ||||
|  | ||||
|     $res = "api-fetch-$arch-$ring-$flight-$build-$minor-$sku-$type"; | ||||
|     $res = "api-fetch-$arch-$ring-$flight-$branch-$build-$flagsStr-$minor-$sku-$type"; | ||||
|     $cache = new UupDumpCache($res); | ||||
|     $fromCache = $cache->get(); | ||||
|     if($fromCache !== false) return $fromCache; | ||||
|  | ||||
|     consoleLogger('Fetching information from the server...'); | ||||
|     $composerArgs = [$arch, $flight, $ring, $build, $sku, $type]; | ||||
|     $composerArgs = [$arch, $flight, $ring, $build, $sku, $type, $flags, $branch]; | ||||
|     $out = sendWuPostRequestHelper('client', 'composeFetchUpdRequest', $composerArgs); | ||||
|     if($out['error'] != 200) { | ||||
|     if($out === false || $out['error'] != 200) { | ||||
|         consoleLogger('The request has failed'); | ||||
|         return array('error' => 'WU_REQUEST_FAILED'); | ||||
|     } | ||||
| @@ -130,7 +231,7 @@ function uupFetchUpd( | ||||
|         $num++; | ||||
|         consoleLogger("Checking build information for update {$num} of {$updatesNum}..."); | ||||
|  | ||||
|         $info = parseFetchUpdate($val, $out, $arch, $ring, $flight, $build, $sku, $type); | ||||
|         $info = parseFetchUpdate($val, $out, $arch, $ring, $flight, $build, $sku, $type, $flags, $branch); | ||||
|         if(isset($info['error'])) { | ||||
|             $errorCount++; | ||||
|             continue; | ||||
| @@ -160,7 +261,7 @@ function uupFetchUpd( | ||||
|     return $data; | ||||
| } | ||||
|  | ||||
| function parseFetchUpdate($updateInfo, $out, $arch, $ring, $flight, $build, $sku, $type) { | ||||
| function parseFetchUpdate($updateInfo, $out, $arch, $ring, $flight, $build, $sku, $type, $flags, $branch) { | ||||
|     $updateNumId = preg_replace('/<UpdateInfo><ID>|<\/ID>.*/i', '', $updateInfo); | ||||
|  | ||||
|     $updates = preg_replace('/<Update>/', "\n<Update>", $out); | ||||
| @@ -202,6 +303,15 @@ function parseFetchUpdate($updateInfo, $out, $arch, $ring, $flight, $build, $sku | ||||
|         $foundBuild = @$info[3]; | ||||
|     } | ||||
|  | ||||
|     $isNet = 0; | ||||
|     if(strpos($foundArch, 'netfx') !== false) { | ||||
|         $isNet = 1; | ||||
|         preg_match('/ProductReleaseInstalled Name\=".*\.(.*?)\.(.*?)" Version\=".*\.\d{5}\.(.*?)"/', $updateInfo, $info); | ||||
|         $foundType = @strtolower($info[1]); | ||||
|         $foundArch = @strtolower($info[2]); | ||||
|         $foundBuild = @$info[3]; | ||||
|     } | ||||
|  | ||||
|     $updateTitle = preg_grep('/<Title>.*<\/Title>/', $updateMeta); | ||||
|     sort($updateTitle); | ||||
|  | ||||
| @@ -221,7 +331,11 @@ function parseFetchUpdate($updateInfo, $out, $arch, $ring, $flight, $build, $sku | ||||
|     $isCumulativeUpdate = 0; | ||||
|     if(preg_match('/\d{4}-\d{2}.+Update|Cumulative Update|Microsoft Edge|Windows Feature Experience Pack|Cumulative security Hotpatch/i', $updateTitle)) { | ||||
|         $isCumulativeUpdate = 1; | ||||
|         $updateTitle = preg_replace('/ for .{3,5}-based systems| \(KB.*?\)/i', '', $updateTitle); | ||||
|         if($isNet) { | ||||
|             $updateTitle = preg_replace("/3.5 and 4.8.1 |3.5 and 4.8 | for $foundArch| for x64| \(KB.*?\)/i", '', $updateTitle); | ||||
|         } else { | ||||
|             $updateTitle = preg_replace('/ for .{3,5}-based systems| \(KB.*?\)/i', '', $updateTitle); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     $updateTitle = preg_replace("/ ?\d{4}-\d{2}\D ?| ?$foundArch ?| ?x64 ?/i", '', $updateTitle); | ||||
| @@ -338,7 +452,9 @@ function parseFetchUpdate($updateInfo, $out, $arch, $ring, $flight, $build, $sku | ||||
|         $temp['title'] = $updateTitle; | ||||
|         $temp['ring'] = $ring; | ||||
|         $temp['flight'] = $flight; | ||||
|         $temp['branch'] = $branch; | ||||
|         $temp['arch'] = $foundArch; | ||||
|         $temp['fetchArch'] = $arch == 'all' ? 'amd64' : $arch; | ||||
|         $temp['build'] = $foundBuild; | ||||
|         $temp['checkBuild'] = $build; | ||||
|         $temp['sku'] = $sku; | ||||
| @@ -351,6 +467,10 @@ function parseFetchUpdate($updateInfo, $out, $arch, $ring, $flight, $build, $sku | ||||
|             $temp['releasetype'] = $type; | ||||
|         } | ||||
|  | ||||
|         if(!empty($flags)) { | ||||
|             $temp['flags'] = $flags; | ||||
|         } | ||||
|  | ||||
|         $temp['created'] = time(); | ||||
|         $temp['sha256ready'] = true; | ||||
|         $temp['files'] = $shaArray; | ||||
|   | ||||
							
								
								
									
										9
									
								
								get.php
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								get.php
									
									
									
									
									
								
							| @@ -76,8 +76,10 @@ function uupGetFiles( | ||||
|         $info['sku'] = 48; | ||||
|     } | ||||
|  | ||||
|     $genPack = []; | ||||
|  | ||||
|     if($usePack) { | ||||
|         $genPack = uupGetGenPacks($build, $info['arch'], $updateId); | ||||
|         $genPack = uupApiGetPacks($updateId); | ||||
|         if(empty($genPack)) return array('error' => 'UNSUPPORTED_COMBINATION'); | ||||
|  | ||||
|         if(!isset($genPack[$usePack])) { | ||||
| @@ -298,7 +300,7 @@ function uupGetFiles( | ||||
|  | ||||
|         $temp = preg_grep('/Windows(10|11)\.0-KB.*-baseless/i', $filesInfoKeys, PREG_GREP_INVERT); | ||||
|         if($appEdition) { | ||||
|             $temp = preg_grep('/.*?AggregatedMetadata.*?\.cab|.*?DesktopDeployment.*?\.cab/i', $temp); | ||||
|             $temp = preg_grep('/.*?AggregatedMetadata.*?\.cab/i', $temp); | ||||
|         } else if($build > 21380) { | ||||
|             $temp = preg_grep('/Windows(10|11)\.0-KB|SSU-.*?\....$|.*?AggregatedMetadata.*?\.cab|.*?DesktopDeployment.*?\.cab/i', $temp); | ||||
|         } else { | ||||
| @@ -372,6 +374,7 @@ function uupGetFiles( | ||||
|         'build' => $updateBuild, | ||||
|         'sku' => $updateSku, | ||||
|         'hasUpdates' => $hasUpdates, | ||||
|         'appxPresent' => uupAreAppxPresent($genPack), | ||||
|         'files' => $files, | ||||
|     ]; | ||||
|  | ||||
| @@ -399,7 +402,7 @@ function uupGetOnlineFiles($updateId, $rev, $info, $cacheRequests, $type) { | ||||
|         $composerArgs = [$updateId, $info, $rev, $type]; | ||||
|         $out = sendWuPostRequestHelper('clientSecured', 'composeFileGetRequest', $composerArgs); | ||||
|  | ||||
|         if($out['error'] != 200) { | ||||
|         if($out === false || $out['error'] != 200) { | ||||
|             consoleLogger('The request has failed'); | ||||
|             return array('error' => 'WU_REQUEST_FAILED'); | ||||
|         } | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| <?php | ||||
| /* | ||||
| Copyright 2022 UUP dump API authors | ||||
| Copyright 2023 UUP dump API authors | ||||
|  | ||||
| Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| you may not use this file except in compliance with the License. | ||||
| @@ -17,60 +17,35 @@ limitations under the License. | ||||
|  | ||||
| require_once dirname(__FILE__).'/shared/main.php'; | ||||
| require_once dirname(__FILE__).'/shared/packs.php'; | ||||
| require_once dirname(__FILE__).'/updateinfo.php'; | ||||
|  | ||||
| function uupListEditions($lang = 'en-us', $updateId = 0) { | ||||
|     if($updateId) { | ||||
|         $info = uupUpdateInfo($updateId, false, true); | ||||
|     } | ||||
|  | ||||
|     if(!$lang) { | ||||
|         return array('error' => 'UNSUPPORTED_LANG'); | ||||
|     } | ||||
|  | ||||
|     if(isset($info['info'])) $info = $info['info']; | ||||
|     $lang = strtolower($lang); | ||||
|     $genPack = uupApiGetPacks($updateId); | ||||
|     $fancyEditionNames = uupGetInfoTexts()['fancyEditionNames']; | ||||
|  | ||||
|     if(isset($info['build'])) { | ||||
|         $build = explode('.', $info['build']); | ||||
|         $build = $build[0]; | ||||
|     } else { | ||||
|         $build = 15063; | ||||
|     if(!isset($genPack[$lang])) { | ||||
|         return array('error' => 'UNSUPPORTED_LANG'); | ||||
|     } | ||||
|  | ||||
|     if(!isset($info['arch'])) { | ||||
|         $info['arch'] = null; | ||||
|     } | ||||
|     $editionList = []; | ||||
|     $editionListFancy = []; | ||||
|  | ||||
|     $genPack = uupGetGenPacks($build, $info['arch'], $updateId); | ||||
|     $fancyTexts = uupGetInfoTexts(); | ||||
|     $fancyEditionNames = $fancyTexts['fancyEditionNames']; | ||||
|  | ||||
|     if($lang) { | ||||
|         $lang = strtolower($lang); | ||||
|         if(!isset($genPack[$lang])) { | ||||
|             return array('error' => 'UNSUPPORTED_LANG'); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     $editionList = array(); | ||||
|     $editionListFancy = array(); | ||||
|     foreach(array_keys($genPack[$lang]) as $edition) { | ||||
|         if($edition == 'LXP') continue; | ||||
|         if($edition == 'FOD') continue; | ||||
|         if(in_array($edition, ['LXP', 'FOD'])) continue; | ||||
|  | ||||
|         if(isset($fancyEditionNames[$edition])) { | ||||
|             $fancyName = $fancyEditionNames[$edition]; | ||||
|         } else { | ||||
|             $fancyName = $edition; | ||||
|         } | ||||
|         $fancyName = isset($fancyEditionNames[$edition]) ? $fancyEditionNames[$edition] : $edition; | ||||
|  | ||||
|         $editionList[] = $edition; | ||||
|         $editionListFancy[$edition] = $fancyName; | ||||
|     } | ||||
|  | ||||
|     return array( | ||||
|     return [ | ||||
|         'apiVersion' => uupApiVersion(), | ||||
|         'editionList' => $editionList, | ||||
|         'editionFancyNames' => $editionListFancy, | ||||
|     ); | ||||
|     ]; | ||||
| } | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| <?php | ||||
| /* | ||||
| Copyright 2022 UUP dump API authors | ||||
| Copyright 2023 UUP dump API authors | ||||
|  | ||||
| Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| you may not use this file except in compliance with the License. | ||||
| @@ -19,63 +19,45 @@ require_once dirname(__FILE__).'/shared/main.php'; | ||||
| require_once dirname(__FILE__).'/shared/packs.php'; | ||||
| require_once dirname(__FILE__).'/updateinfo.php'; | ||||
|  | ||||
| function uupListLangs($updateId = 0) { | ||||
|     if($updateId) { | ||||
|         $info = uupUpdateInfo($updateId, false, true); | ||||
|     } | ||||
| function uupListLangsInternal($updateId) { | ||||
|     $genPack = uupApiGetPacks($updateId); | ||||
|     $fancyLangNames = uupGetInfoTexts()['fancyLangNames']; | ||||
|  | ||||
|     if(isset($info['info'])) { | ||||
|         $info = $info['info']; | ||||
|         unset($info['files']); | ||||
|     } | ||||
|     $langList = []; | ||||
|     $langListFancy = []; | ||||
|  | ||||
|     if(isset($info['build'])) { | ||||
|         $build = explode('.', $info['build']); | ||||
|         $build = $build[0]; | ||||
|     } else { | ||||
|         $build = 15063; | ||||
|     } | ||||
|  | ||||
|     if(!isset($info['arch'])) { | ||||
|         $info['arch'] = null; | ||||
|     } | ||||
|  | ||||
|     $genPack = uupGetGenPacks($build, $info['arch'], $updateId); | ||||
|     $fancyTexts = uupGetInfoTexts(); | ||||
|     $fancyLangNames = $fancyTexts['fancyLangNames']; | ||||
|  | ||||
|     $langList = array(); | ||||
|     $langListFancy = array(); | ||||
|     foreach($genPack as $key => $val) { | ||||
|         if(!count(array_diff(array_keys($val), array('LXP')))) { | ||||
|             continue; | ||||
|         } | ||||
|         if(!count(array_diff(array_keys($val), array('FOD')))) { | ||||
|         if(!count(array_diff(array_keys($val), ['LXP', 'FOD']))) { | ||||
|             continue; | ||||
|         } | ||||
|  | ||||
|         if(isset($fancyLangNames[$key])) { | ||||
|             $fancyName = $fancyLangNames[$key]; | ||||
|         } else { | ||||
|             $fancyName = $key; | ||||
|         } | ||||
|         $fancyName = isset($fancyLangNames[$key]) ? $fancyLangNames[$key] : $key; | ||||
|  | ||||
|         $langList[] = $key; | ||||
|         $langListFancy[$key] = $fancyName; | ||||
|     } | ||||
|     | ||||
|     if(isset($info)) { | ||||
|         return array( | ||||
|             'apiVersion' => uupApiVersion(), | ||||
|             'langList' => $langList, | ||||
|             'langFancyNames' => $langListFancy, | ||||
|             'updateInfo' => $info | ||||
|         ); | ||||
|     } else { | ||||
|         return array( | ||||
|             'apiVersion' => uupApiVersion(), | ||||
|             'langList' => $langList, | ||||
|             'langFancyNames' => $langListFancy | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     return [ | ||||
|         'langList' => $langList, | ||||
|         'langFancyNames' => $langListFancy, | ||||
|         'appxPresent' => uupAreAppxPresent($genPack), | ||||
|     ]; | ||||
| } | ||||
|  | ||||
| function uupListLangs($updateId = 0, $returnInfo = true) { | ||||
|     if($returnInfo) { | ||||
|         $info = uupUpdateInfo($updateId, ignoreFiles: true); | ||||
|         $info = isset($info['info']) ? $info['info'] : false; | ||||
|     } | ||||
|  | ||||
|     $langList = uupListLangsInternal($updateId); | ||||
|  | ||||
|     $response = array_merge( | ||||
|         ['apiVersion' => uupApiVersion()], | ||||
|         $langList | ||||
|     ); | ||||
|  | ||||
|     if($returnInfo) $response['updateInfo'] = $info; | ||||
|  | ||||
|     return $response; | ||||
| } | ||||
|   | ||||
| @@ -18,10 +18,10 @@ Parameters: | ||||
|    - **Supported Flight values:** `Active`, `Skip`, `Current` | ||||
|    - **NOTE:** `Skip` is for `WIF` ring only. `Current` is for `RP` ring only. | ||||
|  | ||||
|  - `build` - Build number to use when fetching information | ||||
|    - **Supported values:** >= 9841 and <= PHP_INT_MAX-1 | ||||
|  - `build` - Build number to use when fetching information. Can also be used to provide optional fetch flags in `major.minor+flag1,flag2` format. | ||||
|    - **Supported values:** Any correctly formatted build (`major` or `major.minor`) from range of 9841 and `PHP_INT_MAX-1`. | ||||
|  | ||||
|  - `minor` - Build minor to use when fetching information | ||||
|  - `minor` - Build minor to use when fetching information. Unused when build is formatted in `major.minor` format | ||||
|    - **Supported values:** >= 0 and <= PHP_INT_MAX-1 | ||||
|  | ||||
|  - `sku` - SKU number to use when fetching information | ||||
| @@ -80,6 +80,8 @@ Outputs list of languages supported for specified Update ID. | ||||
| Parameters: | ||||
|  - `updateId` - Update identifier (optional) | ||||
|    - **Supported values:** any update UUID | ||||
|  - `returnInfo` - Should the full update inforation be returned with a list of languages | ||||
|    - **Supported values:** `true` or `false` | ||||
|  | ||||
|  | ||||
| #### updateinfo.php: `uupUpdateInfo($updateId, $onlyInfo, $ignoreFiles);` | ||||
|   | ||||
| @@ -60,6 +60,9 @@ function uupEncryptedData() { | ||||
|  | ||||
|     if(empty($cookieInfo)) { | ||||
|         $data = sendWuPostRequestHelper('client', 'composeGetCookieRequest', [], false); | ||||
|         if($data === false || $data['error'] != 200)  | ||||
|             return false; | ||||
|  | ||||
|         $cookieInfo = uupSaveCookieFromResponse($data['out']); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -35,6 +35,10 @@ class UupDumpCache { | ||||
|     } | ||||
|  | ||||
|     public function get() { | ||||
|         if(!uupApiConfigIsTrue('production_mode')) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         $cacheFile = $this->cacheFile; | ||||
|  | ||||
|         if(!file_exists($cacheFile)) { | ||||
| @@ -58,6 +62,10 @@ class UupDumpCache { | ||||
|     } | ||||
|  | ||||
|     public function put($content, $validity) { | ||||
|         if(!uupApiConfigIsTrue('production_mode')) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         $cacheFile = $this->cacheFile; | ||||
|         $expires = $validity ? time() + $validity : false; | ||||
|  | ||||
|   | ||||
| @@ -31,6 +31,9 @@ function uupApiGetFileinfoDirs() { | ||||
| } | ||||
|  | ||||
| function uupApiGetFileinfoName($updateId, $meta = false) { | ||||
|     if(!uupApiCheckUpdateId($updateId)) | ||||
|         return null; | ||||
|  | ||||
|     $fileName = $updateId.'.json'; | ||||
|     $dirs = uupApiGetFileinfoDirs(); | ||||
|  | ||||
| @@ -41,7 +44,12 @@ function uupApiGetFileinfoName($updateId, $meta = false) { | ||||
| } | ||||
|  | ||||
| function uupApiFileInfoExists($updateId) { | ||||
|     return file_exists(uupApiGetFileinfoName($updateId)); | ||||
|     $name = uupApiGetFileinfoName($updateId); | ||||
|  | ||||
|     if($name === null) | ||||
|         return false; | ||||
|  | ||||
|     return file_exists($name); | ||||
| } | ||||
|  | ||||
| function uupApiWriteFileinfoMeta($updateId, $info) { | ||||
| @@ -49,12 +57,19 @@ function uupApiWriteFileinfoMeta($updateId, $info) { | ||||
|         unset($info['files']); | ||||
|  | ||||
|     $file = uupApiGetFileinfoName($updateId, true); | ||||
|  | ||||
|     if($file === null) | ||||
|         return false; | ||||
|  | ||||
|     return uupApiWriteJson($file, $info); | ||||
| } | ||||
|  | ||||
| function uupApiWriteFileinfo($updateId, $info) { | ||||
|     $file = uupApiGetFileinfoName($updateId); | ||||
|  | ||||
|     if($file === null) | ||||
|         return false; | ||||
|  | ||||
|     if(uupApiWriteJson($file, $info) === false) | ||||
|         return false; | ||||
|  | ||||
| @@ -64,10 +79,14 @@ function uupApiWriteFileinfo($updateId, $info) { | ||||
| function uupApiReadFileinfoMeta($updateId) { | ||||
|     $file = uupApiGetFileinfoName($updateId, true); | ||||
|  | ||||
|     if($file === null) | ||||
|         return false; | ||||
|  | ||||
|     if(file_exists($file)) | ||||
|         return uupApiReadJson($file); | ||||
|  | ||||
|     $info = uupApiReadFileinfo($updateId, false); | ||||
|  | ||||
|     if($info === false) | ||||
|         return false; | ||||
|  | ||||
| @@ -88,6 +107,10 @@ function uupApiReadFileinfo($updateId, $meta = false) { | ||||
|         return uupApiReadFileinfoMeta($updateId); | ||||
|  | ||||
|     $file = uupApiGetFileinfoName($updateId); | ||||
|  | ||||
|     if($file === null) | ||||
|         return false; | ||||
|  | ||||
|     $info = uupApiReadJson($file); | ||||
|  | ||||
|     return $info; | ||||
|   | ||||
| @@ -16,7 +16,7 @@ limitations under the License. | ||||
| */ | ||||
|  | ||||
| function uupApiVersion() { | ||||
|     return '1.41.0'; | ||||
|     return "I can't be bothered to update the version; use commit hash."; | ||||
| } | ||||
|  | ||||
| require_once dirname(__FILE__).'/auths.php'; | ||||
|   | ||||
| @@ -16,6 +16,7 @@ limitations under the License. | ||||
| */ | ||||
|  | ||||
| require_once dirname(__FILE__).'/../listid.php'; | ||||
| require_once dirname(__FILE__).'/utils.php'; | ||||
|  | ||||
| function uupGetInfoTexts() { | ||||
|     $fancyLangNames = array( | ||||
| @@ -83,6 +84,7 @@ function uupGetInfoTexts() { | ||||
|         'PPIPRO' => 'Windows Team', | ||||
|         'PROFESSIONAL' => 'Windows Pro', | ||||
|         'PROFESSIONALN' => 'Windows Pro N', | ||||
|         'PROFESSIONALCOUNTRYSPECIFIC' => 'Windows Pro China Only', | ||||
|         'SERVERSTANDARD' => 'Windows Server Standard', | ||||
|         'SERVERSTANDARDCORE' => 'Windows Server Standard, Core', | ||||
|         'SERVERDATACENTER' => 'Windows Server Datacenter', | ||||
| @@ -202,13 +204,25 @@ function uupGetInfoTexts() { | ||||
|     ); | ||||
| } | ||||
|  | ||||
| function uupGetGenPacks($build = 15063, $arch = null, $updateId = null) { | ||||
|     if(empty($updateId)) return []; | ||||
|     if(!file_exists('packs/'.$updateId.'.json.gz')) return []; | ||||
| function uupApiGetPacks($updateId) { | ||||
|     if(empty($updateId))  | ||||
|         return []; | ||||
|  | ||||
|     if(!uupApiCheckUpdateId($updateId)) | ||||
|         return []; | ||||
|  | ||||
|     if(!file_exists('packs/'.$updateId.'.json.gz'))  | ||||
|         return []; | ||||
|  | ||||
|     $genPack = @gzdecode(@file_get_contents('packs/'.$updateId.'.json.gz')); | ||||
|     if(empty($genPack)) return []; | ||||
|  | ||||
|     if(empty($genPack))  | ||||
|         return []; | ||||
|  | ||||
|     $genPack = json_decode($genPack, 1); | ||||
|     return $genPack; | ||||
| } | ||||
|  | ||||
| function uupGetGenPacks($build = 15063, $arch = null, $updateId = null) { | ||||
|     return uupApiGetPacks($updateId); | ||||
| } | ||||
|   | ||||
| @@ -16,8 +16,10 @@ limitations under the License. | ||||
| */ | ||||
|  | ||||
| // Composes DeviceAttributes parameter needed to fetch data | ||||
| function composeDeviceAttributes($flight, $ring, $build, $arch, $sku, $type) { | ||||
|     $branch = branchFromBuild($build); | ||||
| function composeDeviceAttributes($flight, $ring, $build, $arch, $sku, $type, $flags, $branch) { | ||||
|     if($branch == 'auto') | ||||
|         $branch = branchFromBuild($build); | ||||
|  | ||||
|     $blockUpgrades = 0; | ||||
|     $flightEnabled = 1; | ||||
|     $isRetail = 0; | ||||
| @@ -31,12 +33,14 @@ function composeDeviceAttributes($flight, $ring, $build, $arch, $sku, $type) { | ||||
|  | ||||
|     $dvcFamily = 'Windows.Desktop'; | ||||
|     $insType = 'Client'; | ||||
|     $prodType = 'WinNT'; | ||||
|     if($sku == 119) { | ||||
|         $dvcFamily = 'Windows.Team'; | ||||
|     } | ||||
|     if(uupApiIsServer($sku)) { | ||||
|         $dvcFamily = 'Windows.Server'; | ||||
|         $insType = 'Server'; | ||||
|         $prodType = 'ServerNT'; | ||||
|         $blockUpgrades = 1; | ||||
|     } | ||||
|     /*/ Hololens | ||||
| @@ -50,12 +54,12 @@ function composeDeviceAttributes($flight, $ring, $build, $arch, $sku, $type) { | ||||
|         $insType = 'FactoryOS'; | ||||
|     } | ||||
|  | ||||
|     $fltBranch = ''; | ||||
|     $fltContent = 'Mainline'; | ||||
|     $fltRing = 'External'; | ||||
|     $flight = 'Active'; | ||||
|  | ||||
|     if($ring == 'RETAIL') { | ||||
|         $fltBranch = ''; | ||||
|         $fltContent = $flight; | ||||
|         $fltRing = 'Retail'; | ||||
|         $flightEnabled = 0; | ||||
| @@ -112,7 +116,7 @@ function composeDeviceAttributes($flight, $ring, $build, $arch, $sku, $type) { | ||||
|     $attrib = array( | ||||
|         'App=WU_OS', | ||||
|         'AppVer='.$build, | ||||
|         'AttrDataVer=247', | ||||
|         'AttrDataVer=331', | ||||
|         'AllowInPlaceUpgrade=1', | ||||
|         'AllowOptionalContent=1', | ||||
|         'AllowUpgradesWithUnsupportedTPMOrCPU=1', | ||||
| @@ -120,6 +124,9 @@ function composeDeviceAttributes($flight, $ring, $build, $arch, $sku, $type) { | ||||
|         'BranchReadinessLevel=CB', | ||||
|         'CIOptin=1', | ||||
|         'CurrentBranch='.$branch, | ||||
|         'DataExpDateEpoch_GE25H2='.(time()+82800), | ||||
|         'DataExpDateEpoch_GE24H2='.(time()+82800), | ||||
|         'DataExpDateEpoch_GE24H2Setup='.(time()+82800), | ||||
|         'DataExpDateEpoch_CU23H2='.(time()+82800), | ||||
|         'DataExpDateEpoch_CU23H2Setup='.(time()+82800), | ||||
|         'DataExpDateEpoch_NI22H2='.(time()+82800), | ||||
| @@ -142,13 +149,16 @@ function composeDeviceAttributes($flight, $ring, $build, $arch, $sku, $type) { | ||||
|         //'FlightContent='.$fltContent, | ||||
|         'FlightRing='.$fltRing, | ||||
|         'Free=gt64', | ||||
|         'GStatus_GE25H2=2', | ||||
|         'GStatus_GE24H2=2', | ||||
|         'GStatus_GE24H2Setup=2', | ||||
|         'GStatus_CU23H2=2', | ||||
|         'GStatus_CU23H2Setup=2', | ||||
|         'GStatus_NI23H2=2', | ||||
|         'GStatus_NI22H2=2', | ||||
|         'GStatus_NI22H2Setup=2', | ||||
|         'GStatus_CO21H2=2', | ||||
|         'GStatus_CO21H2Setup=2', | ||||
|         'GStatus_23H2=2', | ||||
|         'GStatus_22H2=2', | ||||
|         'GStatus_21H2=2', | ||||
|         'GStatus_21H1=2', | ||||
| @@ -164,33 +174,37 @@ function composeDeviceAttributes($flight, $ring, $build, $arch, $sku, $type) { | ||||
|         'IsDeviceRetailDemo=0', | ||||
|         'IsFlightingEnabled='.$flightEnabled, | ||||
|         'IsRetailOS='.$isRetail, | ||||
|         'LCUVer=0.0.0.0', | ||||
|         'MediaBranch=', | ||||
|         'MediaVersion='.$build, | ||||
|         'CloudPBR=1', | ||||
|         'DUScan=1', | ||||
|         'OEMModel=Asus ROG Maximus Z690 Extreme', | ||||
|         'OEMModelBaseBoard=ROG MAXIMUS Z690 EXTREME', | ||||
|         'OEMName_Uncleaned=Contoso Corporation', | ||||
|         'OEMModel=21F6CTO1WW', | ||||
|         'OEMModelBaseBoard=21F6CTO1WW', | ||||
|         'OEMName_Uncleaned=LENOVO', | ||||
|         'OemPartnerRing=UPSFlighting', | ||||
|         'OSArchitecture='.$arch, | ||||
|         'OSSkuId='.$sku, | ||||
|         'OSUILocale=en-US', | ||||
|         'OSVersion='.$build, | ||||
|         'ProcessorIdentifier=Intel64 Family 6 Model 151 Stepping 2', | ||||
|         'ProcessorIdentifier=Intel64 Family 6 Model 186 Stepping 3', | ||||
|         'ProcessorManufacturer=GenuineIntel', | ||||
|         'ProcessorModel=12th Gen Intel(R) Core(TM) i9-12900K', | ||||
|         'ProcessorModel=13th Gen Intel(R) Core(TM) i7-1355U', | ||||
|         'ProductType='.$prodType, | ||||
|         'ReleaseType='.$type, | ||||
|         'SdbVer_20H1=2000000000', | ||||
|         'SdbVer_19H1=2000000000', | ||||
|         'SecureBootCapable=1', | ||||
|         'TelemetryLevel=3', | ||||
|         'TimestampEpochString_GE24H2='.(time()-3600), | ||||
|         'TimestampEpochString_GE24H2Setup='.(time()-3600), | ||||
|         'TimestampEpochString_CU23H2='.(time()-3600), | ||||
|         'TimestampEpochString_CU23H2Setup='.(time()-3600), | ||||
|         'TimestampEpochString_NI23H2='.(time()-3600), | ||||
|         'TimestampEpochString_NI22H2='.(time()-3600), | ||||
|         'TimestampEpochString_NI22H2Setup='.(time()-3600), | ||||
|         'TimestampEpochString_CO21H2='.(time()-3600), | ||||
|         'TimestampEpochString_CO21H2Setup='.(time()-3600), | ||||
|         'TimestampEpochString_23H2='.(time()-3600), | ||||
|         'TimestampEpochString_22H2='.(time()-3600), | ||||
|         'TimestampEpochString_21H2='.(time()-3600), | ||||
|         'TimestampEpochString_21H1='.(time()-3600), | ||||
| @@ -199,7 +213,11 @@ function composeDeviceAttributes($flight, $ring, $build, $arch, $sku, $type) { | ||||
|         'TPMVersion=2', | ||||
|         'UpdateManagementGroup=2', | ||||
|         'UpdateOfferedDays=0', | ||||
|         'UpgEx_GE25H2=Green', | ||||
|         'UpgEx_GE24H2Setup=Green', | ||||
|         'UpgEx_GE24H2=Green', | ||||
|         'UpgEx_CU23H2=Green', | ||||
|         'UpgEx_NI23H2=Green', | ||||
|         'UpgEx_NI22H2=Green', | ||||
|         'UpgEx_CO21H2=Green', | ||||
|         'UpgEx_23H2=Green', | ||||
| @@ -212,15 +230,21 @@ function composeDeviceAttributes($flight, $ring, $build, $arch, $sku, $type) { | ||||
|         'UpgradeAccepted=1', | ||||
|         'UpgradeEligible=1', | ||||
|         'UserInPlaceUpgrade=1', | ||||
|         'VBSState=2', | ||||
|         'Version_RS5=2000000000', | ||||
|         'Win10CommercialAzureESUEligible=1', | ||||
|         'Win10CommercialKeybasedESUEligible=1', | ||||
|         'Win10CommercialW365ESUEligible=1', | ||||
|         'Win10ConsumerESUStatus=3', | ||||
|         'Win10ConsumerESUAY=9', | ||||
|         'WuClientVer='.$build, | ||||
|     ); | ||||
|  | ||||
|     if(uupApiConfigIsTrue('fetch_sync_current_only')) { | ||||
|     if(in_array('thisonly', $flags)) { | ||||
|         $attrib[] = 'MediaBranch='.$branch; | ||||
|     } | ||||
|  | ||||
|     if($ring == 'MSIT' && uupApiConfigIsTrue('allow_corpnet')) { | ||||
|     if(in_array('corpnet', $flags) && uupApiConfigIsTrue('allow_corpnet')) { | ||||
|         $attrib[] = 'DUInternal=1'; | ||||
|     } | ||||
|  | ||||
| @@ -282,6 +306,7 @@ function branchFromBuild($build) { | ||||
|  | ||||
|         case 22621: | ||||
|         case 22631: | ||||
|         case 22635: | ||||
|             $branch = 'ni_release'; | ||||
|             break; | ||||
|  | ||||
| @@ -289,6 +314,12 @@ function branchFromBuild($build) { | ||||
|             $branch = 'zn_release'; | ||||
|             break; | ||||
|  | ||||
|         case 26100: | ||||
|         case 26120: | ||||
|         case 26200: | ||||
|             $branch = 'ge_release'; | ||||
|             break; | ||||
|  | ||||
|         default: | ||||
|             $branch = 'rs_prerelease'; | ||||
|             break; | ||||
| @@ -308,15 +339,23 @@ function composeFileGetRequest($updateId, $info, $rev = 1, $type = 'Production') | ||||
|     $created = gmdate(DATE_W3C, $createdTime); | ||||
|     $expires = gmdate(DATE_W3C, $expiresTime); | ||||
|  | ||||
|     //$branch = branchFromBuild($info['checkBuild']); | ||||
|     $arch = 'amd64'; | ||||
|  | ||||
|     if(isset($info['fetchArch'])) { | ||||
|         $arch = $info['fetchArch']; | ||||
|     } elseif(isset($info['arch'])) { | ||||
|         $arch = $info['arch']; | ||||
|     } | ||||
|  | ||||
|     $deviceAttributes = composeDeviceAttributes( | ||||
|         $info['flight'], | ||||
|         $info['ring'], | ||||
|         $info['checkBuild'], | ||||
|         $info['arch'], | ||||
|         $info['sku'], | ||||
|         $type | ||||
|         isset($info['flight']) ? $info['flight'] : 'Active', | ||||
|         isset($info['ring']) ? $info['ring'] : 'RETAIL', | ||||
|         isset($info['checkBuild']) ? $info['checkBuild'] : '10.0.19041.1', | ||||
|         $arch, | ||||
|         isset($info['sku']) ? $info['sku'] : 48, | ||||
|         $type, | ||||
|         isset($info['flags']) ? $info['flags'] : [], | ||||
|         isset($info['branch']) ? $info['branch'] : 'auto', | ||||
|     ); | ||||
|  | ||||
|     return <<<XML | ||||
| @@ -360,9 +399,12 @@ XML; | ||||
| } | ||||
|  | ||||
| // Composes POST data for fetching the latest update information from Windows Update | ||||
| function composeFetchUpdRequest($arch, $flight, $ring, $build, $sku = 48, $type = 'Production') { | ||||
|     $device = uupDevice(); | ||||
| function composeFetchUpdRequest($arch, $flight, $ring, $build, $sku = 48, $type = 'Production', $flags = [], $branch = 'auto') { | ||||
|     $encData = uupEncryptedData(); | ||||
|     if($encData === false) | ||||
|         return false; | ||||
|  | ||||
|     $device = uupDevice(); | ||||
|     $uuid = genUUID(); | ||||
|  | ||||
|     $createdTime = time(); | ||||
| @@ -373,7 +415,8 @@ function composeFetchUpdRequest($arch, $flight, $ring, $build, $sku = 48, $type | ||||
|     $expires = gmdate(DATE_W3C, $expiresTime); | ||||
|     $cookieExpires = gmdate(DATE_W3C, $cookieExpiresTime); | ||||
|  | ||||
|     $branch = branchFromBuild($build); | ||||
|     if($branch == 'auto') | ||||
|         $branch = branchFromBuild($build); | ||||
|  | ||||
|     $mainProduct = 'Client.OS.rs2'; | ||||
|     if(uupApiIsServer($sku)) { | ||||
| @@ -395,6 +438,10 @@ function composeFetchUpdRequest($arch, $flight, $ring, $build, $sku = 48, $type | ||||
|     if($sku == 189) { | ||||
|         $mainProduct = 'WCOSDevice0.OS'; | ||||
|     } | ||||
|     // WNC | ||||
|     if($sku == 210) { | ||||
|         $mainProduct = 'WNC.OS'; | ||||
|     } | ||||
|  | ||||
|     if($arch == 'all') { | ||||
|         $arch = array( | ||||
| @@ -414,7 +461,7 @@ function composeFetchUpdRequest($arch, $flight, $ring, $build, $sku = 48, $type | ||||
|         $products[] = "PN=$mainProduct.$currArch&Branch=$branch&PrimaryOSProduct=1&Repairable=1&V=$build&ReofferUpdate=1"; | ||||
|         $products[] = "PN=Adobe.Flash.$currArch&Repairable=1&V=0.0.0.0"; | ||||
|         $products[] = "PN=Microsoft.Edge.Stable.$currArch&Repairable=1&V=0.0.0.0"; | ||||
|         $products[] = "PN=Microsoft.NETFX.$currArch&V=2018.12.2.0"; | ||||
|         $products[] = "PN=Microsoft.NETFX.$currArch&V=0.0.0.0"; | ||||
|         $products[] = "PN=Windows.Autopilot.$currArch&Repairable=1&V=0.0.0.0"; | ||||
|         $products[] = "PN=Windows.AutopilotOOBE.$currArch&Repairable=1&V=0.0.0.0"; | ||||
|         $products[] = "PN=Windows.Appraiser.$currArch&Repairable=1&V=$build"; | ||||
| @@ -448,11 +495,12 @@ function composeFetchUpdRequest($arch, $flight, $ring, $build, $sku = 48, $type | ||||
|         $build, | ||||
|         $arch, | ||||
|         $sku, | ||||
|         $type | ||||
|         $type, | ||||
|         $flags, | ||||
|         $branch | ||||
|     ); | ||||
|  | ||||
|     $syncCurrent = uupApiConfigIsTrue('fetch_sync_current_only'); | ||||
|     $syncCurrentStr = $syncCurrent ? 'true' : 'false'; | ||||
|     $syncCurrent = in_array('thisonly', $flags) ? 'true' : 'false'; | ||||
|  | ||||
|     return <<<XML | ||||
| <s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope"> | ||||
| @@ -534,6 +582,7 @@ function composeFetchUpdRequest($arch, $flight, $ring, $build, $sku = 48, $type | ||||
|                     <int>2359977</int> | ||||
|                     <int>24513870</int> | ||||
|                     <int>28880263</int> | ||||
|                     <int>296374060</int> | ||||
|                     <int>3</int> | ||||
|                     <int>30077688</int> | ||||
|                     <int>30486944</int> | ||||
| @@ -575,7 +624,7 @@ function composeFetchUpdRequest($arch, $flight, $ring, $build, $sku = 48, $type | ||||
|                 </ExtendedUpdateInfoParameters> | ||||
|                 <ClientPreferredLanguages/> | ||||
|                 <ProductsParameters> | ||||
|                     <SyncCurrentVersionOnly>$syncCurrentStr</SyncCurrentVersionOnly> | ||||
|                     <SyncCurrentVersionOnly>$syncCurrent</SyncCurrentVersionOnly> | ||||
|                     <DeviceAttributes>$deviceAttributes</DeviceAttributes> | ||||
|                     <CallerAttributes>$callerAttrib</CallerAttributes> | ||||
|                     <Products>$products</Products> | ||||
|   | ||||
| @@ -19,7 +19,7 @@ function uupApiPrintBrand() { | ||||
|     global $uupApiBrandPrinted; | ||||
|  | ||||
|     if(!isset($uupApiBrandPrinted)) { | ||||
|         consoleLogger('UUP dump API v'.uupApiVersion()); | ||||
|         consoleLogger('UUP dump API'); | ||||
|         $uupApiBrandPrinted = 1; | ||||
|     } | ||||
| } | ||||
| @@ -64,8 +64,12 @@ function sendWuPostRequestInternal($url, $postData, $saveCookie = true) { | ||||
|     curl_setopt($req, CURLOPT_RETURNTRANSFER, 1); | ||||
|     curl_setopt($req, CURLOPT_ENCODING, ''); | ||||
|     curl_setopt($req, CURLOPT_POSTFIELDS, $postData); | ||||
|     curl_setopt($req, CURLOPT_CONNECTTIMEOUT, 5); | ||||
|     curl_setopt($req, CURLOPT_TIMEOUT, 15); | ||||
|  | ||||
|     if(uupApiConfigIsTrue('production_mode')) {  | ||||
|         curl_setopt($req, CURLOPT_CONNECTTIMEOUT, 5); | ||||
|         curl_setopt($req, CURLOPT_TIMEOUT, 15); | ||||
|     } | ||||
|  | ||||
|     curl_setopt($req, CURLOPT_SSL_VERIFYPEER, 0); | ||||
|     curl_setopt($req, CURLOPT_HTTPHEADER, array( | ||||
|         'User-Agent: Windows-Update-Agent/10.0.10011.16384 Client-Protocol/2.50', | ||||
| @@ -102,6 +106,9 @@ function sendWuPostRequestHelper( | ||||
|     ]; | ||||
|  | ||||
|     $postData = call_user_func_array($postComposer, $postComposerArgs); | ||||
|     if($postData === false) | ||||
|         return false; | ||||
|  | ||||
|     $data = sendWuPostRequestInternal($endpoints[$endpoint], $postData, $saveCookie); | ||||
|  | ||||
|     if($data['error'] == 500 && preg_match('/<ErrorCode>(ConfigChanged|CookieExpired|InvalidCookie)<\/ErrorCode>/', $data['out'])) { | ||||
| @@ -187,3 +194,16 @@ function uupApiConfigIsTrue($config) { | ||||
|  | ||||
|     return $data[$config] == true; | ||||
| } | ||||
|  | ||||
| function getAllowedFlags() { | ||||
|     $flags = ['thisonly']; | ||||
|  | ||||
|     if(uupApiConfigIsTrue('allow_corpnet')) | ||||
|         $flags[] = 'corpnet'; | ||||
|  | ||||
|     return $flags; | ||||
| } | ||||
|  | ||||
| function uupAreAppxPresent($genPack) { | ||||
|     return isset($genPack['neutral']['APP']); | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user