Change method of fetching updates to more foolproof

Fixes fetching of Release Preview for Fall Creators Update
This commit is contained in:
mkuba50 2017-10-13 22:55:46 +02:00
parent a0a0c39785
commit 73f8fad26c
4 changed files with 45 additions and 15 deletions

View File

@ -19,7 +19,7 @@ require_once dirname(__FILE__).'/shared/main.php';
require_once dirname(__FILE__).'/shared/requests.php'; require_once dirname(__FILE__).'/shared/requests.php';
require_once dirname(__FILE__).'/listid.php'; require_once dirname(__FILE__).'/listid.php';
function uupFetchUpd($arch = 'amd64', $ring = 'WIF', $flight = 'Active', $build = '16251') { function uupFetchUpd($arch = 'amd64', $ring = 'WIF', $flight = 'Active', $build = '16251', $minor = '0') {
uupApiPrintBrand(); uupApiPrintBrand();
$arch = strtolower($arch); $arch = strtolower($arch);
@ -47,9 +47,13 @@ function uupFetchUpd($arch = 'amd64', $ring = 'WIF', $flight = 'Active', $build
return array('error' => 'ILLEGAL_BUILD'); return array('error' => 'ILLEGAL_BUILD');
} }
if($minor < 0 || $minor > 65536) {
return array('error' => 'ILLEGAL_MINOR');
}
if($flight == 'Active' && $ring == 'RP') $flight = 'Current'; if($flight == 'Active' && $ring == 'RP') $flight = 'Current';
$build = '10.0.'.$build.'.0'; $build = '10.0.'.$build.'.'.$minor;
consoleLogger('Fetching information from the server...'); consoleLogger('Fetching information from the server...');
$postData = composeFetchUpdRequest(uupDevice(), uupEncryptedData(), $arch, $flight, $ring, $build); $postData = composeFetchUpdRequest(uupDevice(), uupEncryptedData(), $arch, $flight, $ring, $build);
@ -59,7 +63,30 @@ function uupFetchUpd($arch = 'amd64', $ring = 'WIF', $flight = 'Active', $build
consoleLogger('Information was successfully fetched.'); consoleLogger('Information was successfully fetched.');
consoleLogger('Checking build information...'); consoleLogger('Checking build information...');
preg_match('/<Files>.*<\/Files>/', $out, $fileList); preg_match_all('/<UpdateInfo>.*?<\/UpdateInfo>/', $out, $updateInfos);
$updateInfo = preg_grep('/<Action>Install<\/Action>/', $updateInfos[0]);
sort($updateInfo);
if(empty($updateInfo[0])) {
consoleLogger('An error has occurred');
return array('error' => 'NO_UPDATE_FOUND');
}
$updateNumId = preg_replace('/<UpdateInfo><ID>|<\/ID>.*/i', '', $updateInfo[0]);
$updates = preg_replace('/<Update>/', "\n<Update>", $out);
preg_match_all('/<Update>.*<\/Update>/', $updates, $updates);
$updateMeta = preg_grep('/<ID>'.$updateNumId.'<\/ID>/', $updates[0]);
sort($updateMeta);
$updateFiles = preg_grep('/<Files>.*<\/Files>/', $updateMeta);
sort($updateFiles);
$updateTitle = preg_grep('/<Title>.*<\/Title>/', $updateMeta);
sort($updateTitle);
preg_match('/<Files>.*<\/Files>/', $updateFiles[0], $fileList);
if(empty($fileList[0])) { if(empty($fileList[0])) {
consoleLogger('An error has occurred'); consoleLogger('An error has occurred');
return array('error' => 'EMPTY_FILELIST'); return array('error' => 'EMPTY_FILELIST');
@ -67,11 +94,11 @@ function uupFetchUpd($arch = 'amd64', $ring = 'WIF', $flight = 'Active', $build
preg_match('/<FlightMetadata>.*?<Relationships>/', $out, $out2); preg_match('/<FlightMetadata>.*?<Relationships>/', $out, $out2);
preg_match('/"BuildFlightVersion":".*"}/', $out2[0], $foundBuild); preg_match('/Version\=".*?"/', $updateInfo[0], $foundBuild);
$foundBuild = preg_replace('/"BuildFlightVersion":"10\.0\.|"}/', '', $foundBuild[0]); $foundBuild = preg_replace('/Version="10\.0\.|"/', '', $foundBuild[0]);
preg_match_all('/<Title>.*?<\/Title>/i', $out, $updateTitle);
$updateTitle = preg_replace('/<Title>|<\/Title>/i', '', $updateTitle[0]); preg_match('/<Title>.*?<\/Title>/i', $updateTitle[0], $updateTitle);
$updateTitle = preg_grep('/'.$foundBuild.'/', $updateTitle); $updateTitle = preg_replace('/<Title>|<\/Title>/i', '', $updateTitle);
sort($updateTitle); sort($updateTitle);
if(isset($updateTitle[0])) { if(isset($updateTitle[0])) {
@ -80,9 +107,7 @@ function uupFetchUpd($arch = 'amd64', $ring = 'WIF', $flight = 'Active', $build
$updateTitle = 'Windows 10 build '.$foundBuild; $updateTitle = 'Windows 10 build '.$foundBuild;
} }
$out = preg_replace('/>/', ">\n", $out2[0]); preg_match('/UpdateID=".*?"/', $updateInfo[0], $updateId);
preg_match('/UpdateID=".*?"/', $out, $updateId);
$updateId = preg_replace('/UpdateID="|"$/', '', $updateId[0]); $updateId = preg_replace('/UpdateID="|"$/', '', $updateId[0]);
consoleLogger('Successfully checked build information.'); consoleLogger('Successfully checked build information.');
consoleLogger('BUILD: '.$updateTitle.' '.$arch); consoleLogger('BUILD: '.$updateTitle.' '.$arch);

View File

@ -2,7 +2,7 @@ UUP dump API
------------ ------------
### Functions ### Functions
#### fetchupd.php: `uupFetchUpd($arch, $ring, $flight, $build);` #### fetchupd.php: `uupFetchUpd($arch, $ring, $flight, $build, $minor);`
Fetches latest update information from Windows Update servers. Fetches latest update information from Windows Update servers.
Parameters: Parameters:
@ -17,7 +17,10 @@ Parameters:
- **NOTE:** `Skip` is for `WIF` ring only. `Current` is for `RP` ring only. - **NOTE:** `Skip` is for `WIF` ring only. `Current` is for `RP` ring only.
- `build` - Build number to use when fetching information - `build` - Build number to use when fetching information
- **Supported values:** > 15063 and < 65536 - **Supported values:** >= 15063 and <= 65536
- `minor` - Build minor to use when fetching information
- **Supported values:** >= 0 and <= 65536
#### get.php: `uupGetFiles($updateId, $usePack, $desiredEdition);` #### get.php: `uupGetFiles($updateId, $usePack, $desiredEdition);`
Fetches files from `updateId` update and parses to array. Fetches files from `updateId` update and parses to array.
@ -75,6 +78,8 @@ Parameters:
- UNKNOWN_FLIGHT - UNKNOWN_FLIGHT
- UNKNOWN_COMBINATION - UNKNOWN_COMBINATION
- ILLEGAL_BUILD - ILLEGAL_BUILD
- ILLEGAL_MINOR
- NO_UPDATE_FOUND
- EMPTY_FILELIST - EMPTY_FILELIST
**get.php** **get.php**

View File

@ -16,7 +16,7 @@ limitations under the License.
*/ */
function uupApiVersion() { function uupApiVersion() {
return '1.1.2'; return '1.2.0';
} }
function uupApiPrintBrand() { function uupApiPrintBrand() {

View File

@ -24,6 +24,6 @@ function composeFileGetRequest($updateId, $device, $info) {
// Composes POST data for fetching the latest update information from Windows Update // Composes POST data for fetching the latest update information from Windows Update
function composeFetchUpdRequest($device, $encData, $arch, $flight, $ring, $build) { function composeFetchUpdRequest($device, $encData, $arch, $flight, $ring, $build) {
$uuid = randStr(8).'-'.randStr(4).'-'.randStr(4).'-'.randStr(4).'-'.randStr(12); $uuid = randStr(8).'-'.randStr(4).'-'.randStr(4).'-'.randStr(4).'-'.randStr(12);
return '<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Header><a:Action s:mustUnderstand="1">http://www.microsoft.com/SoftwareDistribution/Server/ClientWebService/SyncUpdates</a:Action><a:MessageID>urn:uuid:'.$uuid.'</a:MessageID><a:To s:mustUnderstand="1">https://fe3.delivery.mp.microsoft.com/ClientWebService/client.asmx</a:To><o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><Timestamp xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"><Created>2017-01-01T01:00:00.000Z</Created><Expires>2020-01-01T02:00:00.000Z</Expires></Timestamp><wuws:WindowsUpdateTicketsToken wsu:id="ClientMSA" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wuws="http://schemas.microsoft.com/msus/2014/10/WindowsUpdateAuthorization"><TicketType Name="MSA" Version="1.0" Policy="MBI_SSL"><Device>'.$device.'</Device></TicketType></wuws:WindowsUpdateTicketsToken></o:Security></s:Header><s:Body><SyncUpdates xmlns="http://www.microsoft.com/SoftwareDistribution/Server/ClientWebService"><cookie><Expiration>2045-04-07T12:38:34Z</Expiration><EncryptedData>'.$encData.'</EncryptedData></cookie><parameters><ExpressQuery>false</ExpressQuery><InstalledNonLeafUpdateIDs></InstalledNonLeafUpdateIDs><OtherCachedUpdateIDs></OtherCachedUpdateIDs><SkipSoftwareSync>false</SkipSoftwareSync><NeedTwoGroupOutOfScopeUpdates>true</NeedTwoGroupOutOfScopeUpdates><AlsoPerformRegularSync>true</AlsoPerformRegularSync><ComputerSpec/><ExtendedUpdateInfoParameters><XmlUpdateFragmentTypes><XmlUpdateFragmentType>Extended</XmlUpdateFragmentType><XmlUpdateFragmentType>LocalizedProperties</XmlUpdateFragmentType><XmlUpdateFragmentType>Eula</XmlUpdateFragmentType></XmlUpdateFragmentTypes><Locales><string>en-US</string><string>pl</string></Locales></ExtendedUpdateInfoParameters><ClientPreferredLanguages><string>pl</string></ClientPreferredLanguages><ProductsParameters><SyncCurrentVersionOnly>false</SyncCurrentVersionOnly><DeviceAttributes>App=WU;AppVer='.$build.';AttrDataVer=22;BranchReadinessLevel=CB;CurrentBranch=rs_prerelease;DeviceFamily=Windows.Desktop;FirmwareVersion=6.00;FlightContent='.$flight.';FlightingBranchName=external;FlightRing='.$ring.';InstallationType=Client;InstallLanguage=en-US;IsDeviceRetailDemo=0;IsFlightingEnabled=1;OSSkuId=48;OSUILocale=en-US;OSVersion='.$build.';TelemetryLevel=3;UpdateManagementGroup=2;</DeviceAttributes><CallerAttributes>Interactive=1;IsSeeker=0;</CallerAttributes><Products>PN=Client.OS.rs2.'.$arch.'&amp;Branch=rs_prerelease&amp;PrimaryOSProduct=1&amp;V='.$build.';</Products></ProductsParameters></parameters></SyncUpdates></s:Body></s:Envelope>'; return '<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Header><a:Action s:mustUnderstand="1">http://www.microsoft.com/SoftwareDistribution/Server/ClientWebService/SyncUpdates</a:Action><a:MessageID>urn:uuid:'.$uuid.'</a:MessageID><a:To s:mustUnderstand="1">https://fe3.delivery.mp.microsoft.com/ClientWebService/client.asmx</a:To><o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><Timestamp xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"><Created>2017-01-01T01:00:00.000Z</Created><Expires>2020-01-01T02:00:00.000Z</Expires></Timestamp><wuws:WindowsUpdateTicketsToken wsu:id="ClientMSA" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wuws="http://schemas.microsoft.com/msus/2014/10/WindowsUpdateAuthorization"><TicketType Name="MSA" Version="1.0" Policy="MBI_SSL"><Device>'.$device.'</Device></TicketType></wuws:WindowsUpdateTicketsToken></o:Security></s:Header><s:Body><SyncUpdates xmlns="http://www.microsoft.com/SoftwareDistribution/Server/ClientWebService"><cookie><Expiration>2045-04-07T12:38:34Z</Expiration><EncryptedData>'.$encData.'</EncryptedData></cookie><parameters><ExpressQuery>false</ExpressQuery><InstalledNonLeafUpdateIDs></InstalledNonLeafUpdateIDs><OtherCachedUpdateIDs></OtherCachedUpdateIDs><SkipSoftwareSync>false</SkipSoftwareSync><NeedTwoGroupOutOfScopeUpdates>true</NeedTwoGroupOutOfScopeUpdates><AlsoPerformRegularSync>true</AlsoPerformRegularSync><ComputerSpec/><ExtendedUpdateInfoParameters><XmlUpdateFragmentTypes><XmlUpdateFragmentType>Extended</XmlUpdateFragmentType><XmlUpdateFragmentType>LocalizedProperties</XmlUpdateFragmentType><XmlUpdateFragmentType>Eula</XmlUpdateFragmentType></XmlUpdateFragmentTypes><Locales><string>en-US</string></Locales></ExtendedUpdateInfoParameters><ClientPreferredLanguages></ClientPreferredLanguages><ProductsParameters><SyncCurrentVersionOnly>false</SyncCurrentVersionOnly><DeviceAttributes>App=WU;AppVer='.$build.';AttrDataVer=22;BranchReadinessLevel=CB;CurrentBranch=rs_prerelease;DeviceFamily=Windows.Desktop;FirmwareVersion=6.00;FlightContent='.$flight.';FlightingBranchName=external;FlightRing='.$ring.';InstallationType=Client;InstallLanguage=en-US;IsDeviceRetailDemo=0;IsFlightingEnabled=1;OSSkuId=48;OSUILocale=en-US;OSVersion='.$build.';TelemetryLevel=3;UpdateManagementGroup=2;</DeviceAttributes><CallerAttributes>Interactive=1;IsSeeker=0;</CallerAttributes><Products>PN=Client.OS.rs2.'.$arch.'&amp;Branch=rs_prerelease&amp;PrimaryOSProduct=1&amp;V='.$build.';</Products></ProductsParameters></parameters></SyncUpdates></s:Body></s:Envelope>';
} }
?> ?>