338 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			338 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /*
 | |
| Copyright 2019 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.
 | |
| 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.
 | |
| */
 | |
| 
 | |
| require_once dirname(__FILE__).'/../listid.php';
 | |
| 
 | |
| function uupGetInfoTexts() {
 | |
|     $fancyLangNames = array(
 | |
|         'ar-sa' => 'Arabic (Saudi Arabia)',
 | |
|         'bg-bg' => 'Bulgarian',
 | |
|         'cs-cz' => 'Czech',
 | |
|         'da-dk' => 'Danish',
 | |
|         'de-de' => 'German',
 | |
|         'el-gr' => 'Greek',
 | |
|         'en-gb' => 'English (United Kingdom)',
 | |
|         'en-us' => 'English (United States)',
 | |
|         'es-es' => 'Spanish (Spain)',
 | |
|         'es-mx' => 'Spanish (Mexico)',
 | |
|         'et-ee' => 'Estonian',
 | |
|         'fi-fi' => 'Finnish',
 | |
|         'fr-ca' => 'French (Canada)',
 | |
|         'fr-fr' => 'French (France)',
 | |
|         'he-il' => 'Hebrew',
 | |
|         'hr-hr' => 'Croatian',
 | |
|         'hu-hu' => 'Hungarian',
 | |
|         'it-it' => 'Italian',
 | |
|         'ja-jp' => 'Japanese',
 | |
|         'ko-kr' => 'Korean',
 | |
|         'lt-lt' => 'Lithuanian',
 | |
|         'lv-lv' => 'Latvian',
 | |
|         'nb-no' => 'Norwegian (Bokmal)',
 | |
|         'nl-nl' => 'Dutch',
 | |
|         'pl-pl' => 'Polish',
 | |
|         'pt-br' => 'Portuguese (Brazil)',
 | |
|         'pt-pt' => 'Portuguese (Portugal)',
 | |
|         'ro-ro' => 'Romanian',
 | |
|         'ru-ru' => 'Russian',
 | |
|         'sk-sk' => 'Slovak',
 | |
|         'sl-si' => 'Slovenian',
 | |
|         'sr-latn-rs' => 'Serbian (Latin)',
 | |
|         'sv-se' => 'Swedish',
 | |
|         'th-th' => 'Thai',
 | |
|         'tr-tr' => 'Turkish',
 | |
|         'uk-ua' => 'Ukrainian',
 | |
|         'zh-cn' => 'Chinese (Simplified)',
 | |
|         'zh-hk' => 'Chinese (Hong Kong)',
 | |
|         'zh-tw' => 'Chinese (Traditional)',
 | |
|     );
 | |
| 
 | |
|     $fancyEditionNames = array(
 | |
|         'CLOUD' => 'Windows 10 S',
 | |
|         'CLOUDN' => 'Windows 10 S N',
 | |
|         'CLOUDE' => 'Windows 10 Lean',
 | |
|         'CORE' => 'Windows 10 Home',
 | |
|         'CORECOUNTRYSPECIFIC' => 'Windows 10 Home China',
 | |
|         'COREN' => 'Windows 10 Home N',
 | |
|         'CORESINGLELANGUAGE' => 'Windows 10 Home Single Language',
 | |
|         'EDUCATION' => 'Windows 10 Education',
 | |
|         'EDUCATIONN' => 'Windows 10 Education N',
 | |
|         'ENTERPRISE' => 'Windows 10 Enterprise',
 | |
|         'ENTERPRISEN' => 'Windows 10 Enterprise N',
 | |
|         'PPIPRO' => 'Windows 10 Team',
 | |
|         'PROFESSIONAL' => 'Windows 10 Pro',
 | |
|         'PROFESSIONALN' => 'Windows 10 Pro N',
 | |
|     );
 | |
| 
 | |
|     $allEditions = array(
 | |
|         'ANALOGONECORE',
 | |
|         'ANDROMEDA',
 | |
|         'CLOUD',
 | |
|         'CLOUDE',
 | |
|         'CLOUDN',
 | |
|         'CORE',
 | |
|         'CORECOUNTRYSPECIFIC',
 | |
|         'COREN',
 | |
|         'CORESINGLELANGUAGE',
 | |
|         'CORESYSTEMSERVER',
 | |
|         'EDUCATION',
 | |
|         'EDUCATIONN',
 | |
|         'EMBEDDED',
 | |
|         'EMBEDDEDE',
 | |
|         'EMBEDDEDEEVAL',
 | |
|         'EMBEDDEDEVAL',
 | |
|         'ENTERPRISE',
 | |
|         'ENTERPRISEEVAL',
 | |
|         'ENTERPRISEG',
 | |
|         'ENTERPRISEGN',
 | |
|         'ENTERPRISEN',
 | |
|         'ENTERPRISENEVAL',
 | |
|         'ENTERPRISES',
 | |
|         'ENTERPRISESEVAL',
 | |
|         'ENTERPRISESN',
 | |
|         'ENTERPRISESNEVAL',
 | |
|         'IOTUAP',
 | |
|         'MOBILECORE',
 | |
|         'ONECOREUPDATEOS',
 | |
|         'PPIPRO',
 | |
|         'PROFESSIONAL',
 | |
|         'PROFESSIONALCOUNTRYSPECIFIC',
 | |
|         'PROFESSIONALEDUCATION',
 | |
|         'PROFESSIONALEDUCATIONN',
 | |
|         'PROFESSIONALN',
 | |
|         'PROFESSIONALSINGLELANGUAGE',
 | |
|         'PROFESSIONALWORKSTATION',
 | |
|         'PROFESSIONALWORKSTATIONN',
 | |
|         'SERVERARM64',
 | |
|         'SERVERARM64CORE',
 | |
|         'SERVERAZURECOR',
 | |
|         'SERVERAZURECORCORE',
 | |
|         'SERVERAZURENANO',
 | |
|         'SERVERAZURENANOCORE',
 | |
|         'SERVERCLOUDSTORAGE',
 | |
|         'SERVERCLOUDSTORAGECORE',
 | |
|         'SERVERDATACENTER',
 | |
|         'SERVERDATACENTERACOR',
 | |
|         'SERVERDATACENTERACORCORE',
 | |
|         'SERVERDATACENTERCOR',
 | |
|         'SERVERDATACENTERCORCORE',
 | |
|         'SERVERDATACENTERCORE',
 | |
|         'SERVERDATACENTEREVAL',
 | |
|         'SERVERDATACENTEREVALCOR',
 | |
|         'SERVERDATACENTEREVALCORCORE',
 | |
|         'SERVERDATACENTEREVALCORE',
 | |
|         'SERVERDATACENTERNANO',
 | |
|         'SERVERDATACENTERNANOCORE',
 | |
|         'SERVERHYPERCORE',
 | |
|         'SERVERRDSH',
 | |
|         'SERVERRDSHCORE',
 | |
|         'SERVERSOLUTION',
 | |
|         'SERVERSOLUTIONCORE',
 | |
|         'SERVERSTANDARD',
 | |
|         'SERVERSTANDARDACOR',
 | |
|         'SERVERSTANDARDACORCORE',
 | |
|         'SERVERSTANDARDCOR',
 | |
|         'SERVERSTANDARDCORCORE',
 | |
|         'SERVERSTANDARDCORE',
 | |
|         'SERVERSTANDARDEVAL',
 | |
|         'SERVERSTANDARDEVALCOR',
 | |
|         'SERVERSTANDARDEVALCORCORE',
 | |
|         'SERVERSTANDARDEVALCORE',
 | |
|         'SERVERSTANDARDNANO',
 | |
|         'SERVERSTANDARDNANOCORE',
 | |
|         'SERVERSTORAGESTANDARD',
 | |
|         'SERVERSTORAGESTANDARDCORE',
 | |
|         'SERVERSTORAGESTANDARDEVAL',
 | |
|         'SERVERSTORAGESTANDARDEVALCORE',
 | |
|         'SERVERSTORAGEWORKGROUP',
 | |
|         'SERVERSTORAGEWORKGROUPCORE',
 | |
|         'SERVERSTORAGEWORKGROUPEVAL',
 | |
|         'SERVERSTORAGEWORKGROUPEVALCORE',
 | |
|         'SERVERWEB',
 | |
|         'SERVERWEBCORE',
 | |
|         'STARTER',
 | |
|         'STARTERN',
 | |
|     );
 | |
| 
 | |
|     return array(
 | |
|         'fancyEditionNames' => $fancyEditionNames,
 | |
|         'fancyLangNames' => $fancyLangNames,
 | |
|         'allEditions' => $allEditions,
 | |
|     );
 | |
| }
 | |
| 
 | |
| function uupGetGenPacks($build = 15063, $arch = null, $updateId = null) {
 | |
|     $internalPacks = dirname(__FILE__).'/packs';
 | |
| 
 | |
|     if(!file_exists($internalPacks.'/metadata.json')) {
 | |
|         if(!uupCreateInternalPacksMetadata($internalPacks)) {
 | |
|             return array();
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     if(!empty($updateId)) {
 | |
|         if(file_exists('packs/'.$updateId.'.json.gz')) {
 | |
|             $genPack = @gzdecode(@file_get_contents('packs/'.$updateId.'.json.gz'));
 | |
|             if(empty($genPack)) return array();
 | |
| 
 | |
|             $genPack = json_decode($genPack, 1);
 | |
|             return $genPack;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     $metadata = @file_get_contents($internalPacks.'/metadata.json');
 | |
|     if(empty($metadata)) {
 | |
|         return array();
 | |
|     } else {
 | |
|         $metadata = json_decode($metadata, 1);
 | |
|     }
 | |
| 
 | |
|     $hashDetermined = 0;
 | |
|     $useAllHashesForBuild = 0;
 | |
| 
 | |
|     if($updateId) {
 | |
|         if(isset($metadata['knownIds'][$updateId])) {
 | |
|             $hash = $metadata['knownIds'][$updateId];
 | |
|             $hashDetermined = 1;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     if(!$hashDetermined) {
 | |
|         foreach($metadata['knownBuilds'] as $buildNum => $val) {
 | |
|             if($build < $buildNum) continue;
 | |
|             $useBuild = $buildNum;
 | |
|             break;
 | |
|         }
 | |
| 
 | |
|         if(!isset($useBuild)) {
 | |
|             return array();
 | |
|         }
 | |
| 
 | |
|         if(!$arch && !isset($metadata['knownBuilds'][$useBuild][$arch])) {
 | |
|             $genPack = array();
 | |
|             foreach($metadata['knownBuilds'][$useBuild] as $hash) {
 | |
|                 $temp = @gzdecode(@file_get_contents($internalPacks.'/'.$hash.'.json.gz'));
 | |
|                 if(!empty($temp)) {
 | |
|                     $temp = json_decode($temp, 1);
 | |
|                     $genPack = array_merge_recursive($genPack, $temp);
 | |
|                     unset($temp);
 | |
|                 }
 | |
|             }
 | |
|         } else {
 | |
|             $hash = $metadata['knownBuilds'][$useBuild][$arch];
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     if(!isset($genPack)) {
 | |
|         $genPack = @gzdecode(@file_get_contents($internalPacks.'/'.$hash.'.json.gz'));
 | |
|         if(!empty($genPack)) {
 | |
|             $genPack = json_decode($genPack, 1);
 | |
|         } else {
 | |
|             $genPack = array();
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return $genPack;
 | |
| }
 | |
| 
 | |
| //Function to regenerate internal packs. Should not be used when not needed.
 | |
| function uupCreateInternalPacksMetadata($internalPacks) {
 | |
|     $metadataCreationAllowed = 0;
 | |
|     if(!$metadataCreationAllowed) return false;
 | |
| 
 | |
|     $builds = uupListIds();
 | |
|     if(isset($ids['error'])) {
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     $builds = $builds['builds'];
 | |
| 
 | |
|     if(!file_exists('packs')) return false;
 | |
| 
 | |
|     if(!file_exists($internalPacks)) {
 | |
|         if(!mkdir($internalPacks)) {
 | |
|             return false;
 | |
|         }
 | |
|     } else {
 | |
|         rmdir($internalPacks);
 | |
|         mkdir($internalPacks);
 | |
|     }
 | |
| 
 | |
|     $files = scandir('packs');
 | |
|     $files = preg_grep('/\.json.gz$/', $files);
 | |
| 
 | |
|     $packs = array();
 | |
|     foreach($builds as $build) {
 | |
|         $uuid = $build['uuid'];
 | |
|         $file = $uuid.'.json.gz';
 | |
| 
 | |
|         if(!file_exists('packs/'.$file)) continue;
 | |
| 
 | |
|         $genPack = @gzdecode(@file_get_contents('packs/'.$file));
 | |
|         $hash = hash('sha1', $genPack);
 | |
| 
 | |
|         if(!file_exists($internalPacks.'/'.$hash.'.json.gz')) {
 | |
|             if(!copy('packs/'.$file, $internalPacks.'/'.$hash.'.json.gz')) {
 | |
|                 return false;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         $packs['knownIds'][$uuid] = $hash;
 | |
| 
 | |
|         $buildNum = explode('.', $build['build']);
 | |
|         $buildNum = $buildNum[0];
 | |
| 
 | |
|         $packs['knownBuilds'][$buildNum][$build['arch']] = $hash;
 | |
|     }
 | |
| 
 | |
|     file_put_contents($internalPacks.'/metadata.json', json_encode($packs)."\n");
 | |
|     return true;
 | |
| }
 | |
| 
 | |
| //Emulation of legacy packs. Do not use in new scripts due to extremely slow process.
 | |
| function uupGetPacks($build = 15063) {
 | |
|     $returnArray = uupGetInfoTexts();
 | |
|     $genPack = uupGetGenPacks($build);
 | |
| 
 | |
|     foreach($genPack as $lang => $editions) {
 | |
|         $packsForLangs[$lang] = array_keys($editions);
 | |
|         $packsForLangs[$lang][] = $lang;
 | |
| 
 | |
|         foreach(array_keys($editions) as $edition) {
 | |
|             foreach($editions[$edition] as $name) {
 | |
|                 $newName = preg_replace('/^cabs_|^metadataesd_|~31bf3856ad364e35/i', '', $name);
 | |
|                 $newName = preg_replace('/~~\.|~\./', '.', $newName);
 | |
|                 $newName = preg_replace('/~/', '-', $newName);
 | |
|                 $newName = strtolower($newName);
 | |
|                 $packs[$lang][$edition][] = $newName;
 | |
|             }
 | |
| 
 | |
|             $editionPacks[$edition] = $edition;
 | |
|             $packs[$edition][$edition] = array();
 | |
|             $skipNeutral[$edition] = 1;
 | |
|             $skipLangPack[$edition] = 1;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     $returnArray['packs'] = $packs;
 | |
|     $returnArray['packsForLangs'] = $packsForLangs;
 | |
|     $returnArray['editionPacks'] = $editionPacks;
 | |
|     $returnArray['skipNeutral'] = $skipNeutral;
 | |
|     $returnArray['skipLangPack'] = $skipLangPack;
 | |
| 
 | |
|     return $returnArray;
 | |
| }
 |