Initial commit
This commit is contained in:
commit
b925e9a5f6
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
[submodule "api"]
|
||||
path = api
|
||||
url = git@github.com:uup-dump/api.git
|
21
LICENSE
Normal file
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2019 whatever127
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
1
api
Submodule
1
api
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit d628c2fe69ed91adb397d966812477767b2d8a69
|
37
fetchupd.php
Normal file
37
fetchupd.php
Normal file
@ -0,0 +1,37 @@
|
||||
<?php
|
||||
require_once 'api/fetchupd.php';
|
||||
require_once 'shared/main.php';
|
||||
require_once 'shared/ratelimits.php';
|
||||
|
||||
$arch = isset($_GET['arch']) ? $_GET['arch'] : 'amd64';
|
||||
$ring = isset($_GET['ring']) ? $_GET['ring'] : 'WIF';
|
||||
$flight = isset($_GET['flight']) ? $_GET['flight'] : 'Active';
|
||||
$build = isset($_GET['build']) ? $_GET['build'] : 'latest';
|
||||
$sku = isset($_GET['sku']) ? $_GET['sku'] : '48';
|
||||
|
||||
header('Content-Type: application/json');
|
||||
|
||||
$resource = hash('sha1', strtolower("fetch-$arch-$ring-$flight-$build-$sku"));
|
||||
if(checkIfUserIsRateLimited($resource)) {
|
||||
http_response_code(429);
|
||||
sendResponse(['error' => 'USER_RATE_LIMITED']);
|
||||
die();
|
||||
}
|
||||
|
||||
$apiResponse = uupFetchUpd($arch, $ring, $flight, $build, 0, $sku, 1);
|
||||
if(isset($apiResponse['error'])) {
|
||||
switch($apiResponse['error']) {
|
||||
case 'EMPTY_FILELIST':
|
||||
http_response_code(500);
|
||||
break;
|
||||
|
||||
case 'NO_UPDATE_FOUND':
|
||||
http_response_code(500);
|
||||
break;
|
||||
|
||||
default:
|
||||
http_response_code(400);
|
||||
}
|
||||
}
|
||||
|
||||
sendResponse($apiResponse);
|
39
get.php
Normal file
39
get.php
Normal file
@ -0,0 +1,39 @@
|
||||
<?php
|
||||
require_once 'api/get.php';
|
||||
require_once 'shared/main.php';
|
||||
require_once 'shared/ratelimits.php';
|
||||
|
||||
$updateId = isset($_GET['id']) ? $_GET['id'] : null;
|
||||
$usePack = isset($_GET['lang']) ? $_GET['lang'] : 0;
|
||||
$desiredEdition = isset($_GET['edition']) ? $_GET['edition'] : 0;
|
||||
|
||||
header('Content-Type: application/json');
|
||||
|
||||
$resource = hash('sha1', strtolower("get-$updateId-$usePack-$desiredEdition"));
|
||||
if(checkIfUserIsRateLimited($resource)) {
|
||||
http_response_code(429);
|
||||
sendResponse(['error' => 'USER_RATE_LIMITED']);
|
||||
die();
|
||||
}
|
||||
|
||||
$apiResponse = uupGetFiles($updateId, $usePack, $desiredEdition, 1);
|
||||
if(isset($apiResponse['error'])) {
|
||||
switch($apiResponse['error']) {
|
||||
case 'NO_FILES':
|
||||
http_response_code(500);
|
||||
break;
|
||||
|
||||
case 'XML_PARSE_ERROR':
|
||||
http_response_code(500);
|
||||
break;
|
||||
|
||||
case 'EMPTY_FILELIST':
|
||||
http_response_code(500);
|
||||
break;
|
||||
|
||||
default:
|
||||
http_response_code(400);
|
||||
}
|
||||
}
|
||||
|
||||
sendResponse($apiResponse);
|
7
index.php
Normal file
7
index.php
Normal file
@ -0,0 +1,7 @@
|
||||
<?php
|
||||
require_once 'api/shared/main.php';
|
||||
require_once 'shared/main.php';
|
||||
|
||||
header('Content-Type: application/json');
|
||||
|
||||
sendResponse(['apiVersion' => uupApiVersion()]);
|
14
listeditions.php
Normal file
14
listeditions.php
Normal file
@ -0,0 +1,14 @@
|
||||
<?php
|
||||
require_once 'api/listeditions.php';
|
||||
require_once 'shared/main.php';
|
||||
|
||||
$lang = isset($_GET['lang']) ? $_GET['lang'] : 'en-us';
|
||||
$updateId = isset($_GET['id']) ? $_GET['id'] : null;
|
||||
|
||||
header('Content-Type: application/json');
|
||||
|
||||
$apiResponse = uupListEditions($lang, $updateId);
|
||||
if(isset($apiResponse['error']))
|
||||
http_response_code(400);
|
||||
|
||||
sendResponse($apiResponse);
|
14
listid.php
Normal file
14
listid.php
Normal file
@ -0,0 +1,14 @@
|
||||
<?php
|
||||
require_once 'api/listid.php';
|
||||
require_once 'shared/main.php';
|
||||
|
||||
$search = isset($_GET['search']) ? $_GET['search'] : null;
|
||||
$sortByDate = isset($_GET['sortByDate']) ? $_GET['sortByDate'] : false;
|
||||
|
||||
header('Content-Type: application/json');
|
||||
|
||||
$apiResponse = uupListIds($search, $sortByDate);
|
||||
if(isset($apiResponse['error']))
|
||||
http_response_code(400);
|
||||
|
||||
sendResponse($apiResponse);
|
13
listlangs.php
Normal file
13
listlangs.php
Normal file
@ -0,0 +1,13 @@
|
||||
<?php
|
||||
require_once 'api/listlangs.php';
|
||||
require_once 'shared/main.php';
|
||||
|
||||
$updateId = isset($_GET['id']) ? $_GET['id'] : null;
|
||||
|
||||
header('Content-Type: application/json');
|
||||
|
||||
$apiResponse = uupListLangs($updateId);
|
||||
if(isset($apiResponse['error']))
|
||||
http_response_code(400);
|
||||
|
||||
sendResponse($apiResponse);
|
100
readme.md
Normal file
100
readme.md
Normal file
@ -0,0 +1,100 @@
|
||||
UUP dump JSON API
|
||||
-----------------
|
||||
|
||||
### Description
|
||||
A simple endpoint allowing access of the UUP dump API using HTTP requests.
|
||||
|
||||
### Usage
|
||||
All requests are done using GET requests with parameters specified in the URL.
|
||||
Response is provided as an JSON.
|
||||
|
||||
Example response:
|
||||
```json
|
||||
{
|
||||
"response": {
|
||||
"apiVersion": "1.27.0"
|
||||
},
|
||||
"jsonApiVersion": "0.1.0-alpha"
|
||||
}
|
||||
```
|
||||
|
||||
Responses from the UUP dump API are always returned in the `response` key.
|
||||
|
||||
If requests fails, a HTTP error code will be set to:
|
||||
- `400` if request was malformed
|
||||
- `429` if user is being rate limited
|
||||
- `500` if retrieval of data was unsuccessful
|
||||
|
||||
In such cases `response` key will contain an `error` key with short description
|
||||
of the error.
|
||||
|
||||
### Supported endpoints
|
||||
#### `/` or `/index.php`
|
||||
Returns versions of APIs
|
||||
|
||||
Parameters:
|
||||
- None
|
||||
|
||||
#### `/listid.php`
|
||||
Returns a list of builds in the local database.
|
||||
|
||||
Parameters:
|
||||
- `search` - Search query (optional)
|
||||
- **Supported values:** any text
|
||||
|
||||
- `sortByDate` - Sort results by creation date (optional)
|
||||
- **Supported values:** 0 = Disable, 1 = Enable
|
||||
|
||||
#### `/fetchupd.php`
|
||||
Fetches the latest builds from Windows Update servers using specified
|
||||
parameters.
|
||||
|
||||
Parameters:
|
||||
- `arch` - Architecture of build to find
|
||||
- **Supported values:** `amd64`, `arm64`, `x86`
|
||||
|
||||
- `ring` - Ring to use when fetching information
|
||||
- **Supported values:** `WIF`, `WIS`, `RP`, `RETAIL`
|
||||
|
||||
- `flight` - Flight to use when fetching information
|
||||
- **Supported 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
|
||||
|
||||
- `sku` - SKU number to use when fetching information
|
||||
- **Supported values:** Any integer
|
||||
|
||||
#### `/get.php`
|
||||
Retrieves download links for specified Update ID and provides lists of ready to
|
||||
use UUP sets.
|
||||
|
||||
Parameters:
|
||||
- `id` - Update identifier
|
||||
- **Supported values:** any update identifier
|
||||
|
||||
- `lang` - Create UUP set for selected language (optional)
|
||||
- **Supported values:** language name in xx-xx format
|
||||
|
||||
- `edition` - Create UUP set for selected edition (optional)
|
||||
- **Supported values:** any edition name
|
||||
- **NOTE:** You need to specify `lang` to get successful request
|
||||
|
||||
#### `/listlangs.php`
|
||||
Lists available languages for specified Update ID
|
||||
|
||||
Parameters:
|
||||
- `id` - Update identifier (optional)
|
||||
- **Supported values:** any update identifier
|
||||
|
||||
|
||||
#### `/listlangs.php`
|
||||
Lists available editions for specified Update ID
|
||||
|
||||
Parameters:
|
||||
- `lang` - Generate list for selected language
|
||||
- **Supported values:** language name in xx-xx format
|
||||
|
||||
- `id` - Update identifier (optional)
|
||||
- **Supported values:** any update identifier
|
13
shared/main.php
Normal file
13
shared/main.php
Normal file
@ -0,0 +1,13 @@
|
||||
<?php
|
||||
$webApiVersion = '0.1.0';
|
||||
|
||||
function sendResponse($apiResponse) {
|
||||
global $webApiVersion;
|
||||
|
||||
$response = [
|
||||
'response' => $apiResponse,
|
||||
'jsonApiVersion' => $webApiVersion,
|
||||
];
|
||||
|
||||
echo json_encode($response);
|
||||
}
|
51
shared/ratelimits.php
Normal file
51
shared/ratelimits.php
Normal file
@ -0,0 +1,51 @@
|
||||
<?php
|
||||
/*
|
||||
Copyright 2019 whatever127
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
function checkIfUserIsRateLimited($resource, $timeLimit = 10, $currentResLimit = 1) {
|
||||
$clientIP = $_SERVER['REMOTE_ADDR'];
|
||||
$ipHash = hash('sha256', "ratelimits-$clientIP");
|
||||
|
||||
$info = @file_get_contents('cache/'.$ipHash.'.json');
|
||||
$info = json_decode($info, 1);
|
||||
|
||||
if(!isset($info['resource'])) {
|
||||
$info['resource'] = $resource;
|
||||
}
|
||||
|
||||
if(!isset($info['lastAccess'])) {
|
||||
$info['lastAccess'] = 0;
|
||||
}
|
||||
|
||||
$lastAccess = $info['lastAccess'];
|
||||
$accessedRes = $info['resource'];
|
||||
$blockAccessTime = $lastAccess + $timeLimit;
|
||||
|
||||
if($blockAccessTime > microtime(1) && $accessedRes != $resource) {
|
||||
return true;
|
||||
}
|
||||
|
||||
$info['lastAccess'] = microtime(1);
|
||||
$info['resource'] = $resource;
|
||||
|
||||
@file_put_contents('cache/'.$ipHash.'.json', json_encode($info)."\n");
|
||||
|
||||
if($lastAccess + $currentResLimit > microtime(1) && $accessedRes == $resource) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
Loading…
Reference in New Issue
Block a user