310 lines
10 KiB
PHP
310 lines
10 KiB
PHP
<?php
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] != 'GET') {
|
|
header('Access-Control-Allow-Origin: *');
|
|
header('Access-Control-Allow-Headers: Content-Type');
|
|
header('Content-Type: application/json');
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
|
|
exit;
|
|
}
|
|
} else {
|
|
header('Content-Type: text/javascript');
|
|
}
|
|
|
|
include('config.php');
|
|
|
|
require __DIR__ . '/../vendor/autoload.php';
|
|
|
|
include('libraries/database.php');
|
|
include('libraries/tools.php');
|
|
include('models/lab.php');
|
|
include('models/raw.php');
|
|
include('models/browsers.php');
|
|
include('models/results.php');
|
|
|
|
use Ramsey\Uuid\Uuid;
|
|
|
|
$method = $_REQUEST['method'];
|
|
switch($method) {
|
|
|
|
case 'getIdentifiers':
|
|
$data = array();
|
|
|
|
$db = Factory::Database();
|
|
$result = $db->query('SELECT DISTINCT identifier FROM results WHERE `release` = "' . $GLOBALS['configuration']['release'] . '" AND source = "' . $db->escape_string($_REQUEST['source']) . '"');
|
|
while ($row = $result->fetch_object()) {
|
|
$data[] = $row->identifier;
|
|
}
|
|
|
|
echo json_encode($data);
|
|
break;
|
|
|
|
case 'getTask':
|
|
$task = Uuid::uuid4();
|
|
$source = $_REQUEST['source'];
|
|
$identifier = $_REQUEST['identifier'];
|
|
|
|
$url = (!empty($_SERVER['HTTPS']) ? 'https://' : 'http://') .
|
|
$_SERVER['HTTP_HOST'] .
|
|
'/index.html' .
|
|
'?task=' . $task .
|
|
'&source=' . rawurlencode($source) .
|
|
'&identifier=' . rawurlencode($identifier);
|
|
|
|
echo json_encode(array('task' => $task, 'url' => $url));
|
|
break;
|
|
|
|
case 'hasTask':
|
|
$db = Factory::Database();
|
|
$result = $db->query('SELECT * FROM results WHERE task = "' . $db->escape_string($_REQUEST['task']) . '"');
|
|
|
|
if ($result->num_rows) {
|
|
if ($row = $result->fetch_object()) {
|
|
$url = (!empty($_SERVER['HTTPS']) ? 'https://' : 'http://') .
|
|
$_SERVER['HTTP_HOST'] .
|
|
'/s/' .
|
|
$row->uniqueid .
|
|
'.html';
|
|
|
|
echo json_encode(array(
|
|
'source' => $row->source,
|
|
'identifier' => $row->identifier,
|
|
'score' => intval($row->score),
|
|
'fingerprint' => $row->fingerprint,
|
|
'url' => $url,
|
|
));
|
|
}
|
|
} else {
|
|
echo 'false';
|
|
}
|
|
break;
|
|
|
|
case 'exportResults':
|
|
echo json_encode(Results::export($GLOBALS['configuration']['release']));
|
|
break;
|
|
|
|
case 'myResults':
|
|
echo json_encode(Raw::getMine());
|
|
break;
|
|
|
|
case 'allResults':
|
|
echo json_encode(Raw::getAll());
|
|
break;
|
|
|
|
case 'searchResults':
|
|
echo json_encode(Raw::search($_REQUEST['query']));
|
|
break;
|
|
|
|
case 'loadLabDevice':
|
|
if ($data = Lab::getDevice($_REQUEST['id'])) {
|
|
echo json_encode($data);
|
|
}
|
|
|
|
break;
|
|
|
|
case 'loadFeature':
|
|
echo json_encode(array(
|
|
'key' => $_REQUEST['key'],
|
|
'supported' => implode(',', Results::getByFeature($_REQUEST['key'], $GLOBALS['configuration']['release']))
|
|
));
|
|
|
|
break;
|
|
|
|
case 'loadBrowser':
|
|
if (substr($_REQUEST['id'], 0, 7) == 'custom:') {
|
|
if ($data = Results::getByUniqueId(substr($_REQUEST['id'], 7))) {
|
|
echo json_encode($data);
|
|
}
|
|
|
|
} else {
|
|
if ($data = Results::getByBrowser($_REQUEST['id'], $GLOBALS['configuration']['release'])) {
|
|
echo json_encode($data);
|
|
}
|
|
}
|
|
|
|
break;
|
|
|
|
case 'submit':
|
|
$payload = json_decode($_REQUEST['payload']);
|
|
$headers = getallheaders();
|
|
|
|
$filteredHeaders = '';
|
|
|
|
foreach($headers as $key => $value) {
|
|
if (!in_array(strtolower($key), array(
|
|
'accept', 'host', 'connection', 'dnt', 'user-agent', 'accept-encoding', 'accept-language',
|
|
'accept-charset', 'referer', 'cookie', 'content-type', 'content-length', 'content-transfer-encoding',
|
|
'origin', 'pragma', 'cache-control', 'via', 'clientip', 'x-bluecoat-via', 'x-piper-id',
|
|
'x-forwarded-for', 'x-teacup', 'x-saucer', 'isajaxrequest', 'keep-alive', 'max-forwards',
|
|
'xroxy-connection', 'client-ip', 'cookie2', 'x-via', 'x-imforwards', 'http-client-id',
|
|
'x-proxy-id', 'z-forwarded-for', 'expect', 'x-ip-address', 'x-rbt-optimized-by', 'qpr-loop',
|
|
'cuda_cliip', 'x-source-id', 'x-clickoncesupport'
|
|
))) {
|
|
$filteredHeaders .= $key . ": " . $value . "\n";
|
|
}
|
|
}
|
|
|
|
if (!$GLOBALS['configuration']['readonly'] && intval($payload->release) >= 5) {
|
|
$useragentHeader = $_SERVER['HTTP_USER_AGENT'];
|
|
$useragentId = preg_replace("/(; ?)[a-z][a-z](?:-[a-zA-Z][a-zA-Z])?([;)])/", '$1xx$2', $useragentHeader);
|
|
|
|
$db = Factory::Database();
|
|
|
|
$db->query('
|
|
INSERT INTO
|
|
results
|
|
SET
|
|
`release` = "' . $db->escape_string($payload->release) . '",
|
|
`timestamp` = NOW(),
|
|
`ip` = "' . $db->escape_string(get_ip_address()) . '",
|
|
`source` = ' . (is_null($payload->source) ? 'NULL' : '"' . $db->escape_string($payload->source) . '"') . ',
|
|
`identifier` = ' . (is_null($payload->identifier) ? 'NULL' : '"' . $db->escape_string($payload->identifier) . '"') . ',
|
|
`task` = ' . (is_null($payload->task) ? 'NULL' : '"' . $db->escape_string($payload->task) . '"') . ',
|
|
`uniqueid` = "' . $db->escape_string($payload->uniqueid) . '",
|
|
`score` = "' . $db->escape_string($payload->score) . '",
|
|
`maximum` = "' . $db->escape_string($payload->maximum) . '",
|
|
`fingerprint` = "' . $db->escape_string(md5($payload->results.$payload->points)) . '",
|
|
`camouflage` = "' . $db->escape_string($payload->camouflage) . '",
|
|
`features` = "' . $db->escape_string($payload->features) . '",
|
|
`browserName` = "' . $db->escape_string($payload->browserName) . '",
|
|
`browserChannel` = "' . $db->escape_string($payload->browserChannel) . '",
|
|
`browserVersion` = "' . $db->escape_string($payload->browserVersion) . '",
|
|
`browserVersionType` = "' . $db->escape_string($payload->browserVersionType) . '",
|
|
`browserVersionMajor` = "' . intval($payload->browserVersionMajor) . '",
|
|
`browserVersionMinor` = "' . intval($payload->browserVersionMinor) . '",
|
|
`browserVersionOriginal` = "' . $db->escape_string($payload->browserVersionOriginal) . '",
|
|
`browserMode` = "' . $db->escape_string($payload->browserMode) . '",
|
|
`engineName` = "' . $db->escape_string($payload->engineName) . '",
|
|
`engineVersion` = "' . $db->escape_string($payload->engineVersion) . '",
|
|
`osName` = "' . $db->escape_string($payload->osName) . '",
|
|
`osFamily` = "' . $db->escape_string($payload->osFamily) . '",
|
|
`osVersion` = "' . $db->escape_string($payload->osVersion) . '",
|
|
`deviceManufacturer` = "' . $db->escape_string($payload->deviceManufacturer) . '",
|
|
`deviceModel` = "' . $db->escape_string($payload->deviceModel) . '",
|
|
`deviceSeries` = "' . $db->escape_string($payload->deviceSeries) . '",
|
|
`deviceWidth` = "' . $db->escape_string($payload->deviceWidth) . '",
|
|
`deviceHeight` = "' . $db->escape_string($payload->deviceHeight) . '",
|
|
`deviceType` = "' . $db->escape_string($payload->deviceType) . '",
|
|
`useragent` = "' . $db->escape_string($payload->useragent) . '",
|
|
`useragentHeader` = "' . $db->escape_string($useragentHeader) . '",
|
|
`useragentId` = "' . $db->escape_string(md5($useragentId)) . '",
|
|
`humanReadable` = "' . $db->escape_string($payload->humanReadable) . '",
|
|
`headers` = "' . $db->escape_string($filteredHeaders) . '",
|
|
`status` = 0
|
|
');
|
|
|
|
echo $db->error;
|
|
|
|
$db->query('
|
|
REPLACE INTO
|
|
indices
|
|
SET
|
|
`release` = "' . $db->escape_string($payload->release) . '",
|
|
`fingerprint` = "' . $db->escape_string(md5($payload->results.$payload->points)) . '",
|
|
`score` = "' . $db->escape_string($payload->score) . '",
|
|
`humanReadable` = "' . $db->escape_string($payload->humanReadable) . '",
|
|
`browserName` = "' . $db->escape_string($payload->browserName) . '",
|
|
`browserVersion` = "' . $db->escape_string($payload->browserVersion) . '",
|
|
`engineName` = "' . $db->escape_string($payload->engineName) . '",
|
|
`engineVersion` = "' . $db->escape_string($payload->engineVersion) . '",
|
|
`osName` = "' . $db->escape_string($payload->osName) . '",
|
|
`osFamily` = "' . $db->escape_string($payload->osFamily) . '",
|
|
`osVersion` = "' . $db->escape_string($payload->osVersion) . '",
|
|
`deviceManufacturer` = "' . $db->escape_string($payload->deviceManufacturer) . '",
|
|
`deviceModel` = "' . $db->escape_string($payload->deviceModel) . '",
|
|
`deviceSeries` = "' . $db->escape_string($payload->deviceSeries) . '",
|
|
`deviceType` = "' . $db->escape_string($payload->deviceType) . '",
|
|
`timestamp` = NOW(),
|
|
`uniqueid` = "' . $db->escape_string($payload->uniqueid) . '"
|
|
');
|
|
|
|
$db->query('
|
|
INSERT INTO
|
|
fingerprints
|
|
SET
|
|
`release` = "' . $db->escape_string($payload->release) . '",
|
|
`fingerprint` = "' . $db->escape_string(md5($payload->results.$payload->points)) . '",
|
|
`score` = "' . $db->escape_string($payload->score) . '",
|
|
`maximum` = "' . $db->escape_string($payload->maximum) . '",
|
|
`results` = "' . $db->escape_string($payload->results) . '",
|
|
`points` = "' . $db->escape_string($payload->points) . '"
|
|
');
|
|
}
|
|
|
|
break;
|
|
|
|
case 'feedback':
|
|
$payload = json_decode($_REQUEST['payload']);
|
|
|
|
if (!$GLOBALS['configuration']['readonly']) {
|
|
$db = Factory::Database();
|
|
|
|
$db->query('
|
|
UPDATE
|
|
results
|
|
SET
|
|
status = -1,
|
|
comments = "' . $db->escape_string($payload->value) . '"
|
|
WHERE
|
|
uniqueid = "' . $db->escape_string($payload->uniqueid) . '"
|
|
');
|
|
}
|
|
|
|
break;
|
|
|
|
case 'save':
|
|
$payload = json_decode($_REQUEST['payload']);
|
|
|
|
if (!$GLOBALS['configuration']['readonly']) {
|
|
$db = Factory::Database();
|
|
|
|
$db->query('
|
|
UPDATE
|
|
results
|
|
SET
|
|
used = used + 1,
|
|
lastUsed = NOW()
|
|
WHERE
|
|
uniqueid = "' . $db->escape_string($payload->uniqueid) . '"
|
|
');
|
|
}
|
|
|
|
break;
|
|
|
|
case 'confirm':
|
|
$payload = json_decode($_REQUEST['payload']);
|
|
|
|
if (!$GLOBALS['configuration']['readonly']) {
|
|
$db = Factory::Database();
|
|
|
|
$db->query('
|
|
UPDATE
|
|
results
|
|
SET
|
|
status = 1
|
|
WHERE
|
|
uniqueid = "' . $db->escape_string($payload->uniqueid) . '"
|
|
');
|
|
}
|
|
|
|
break;
|
|
|
|
case 'report':
|
|
$payload = json_decode($_REQUEST['payload']);
|
|
|
|
if (!$GLOBALS['configuration']['readonly']) {
|
|
$db = Factory::Database();
|
|
|
|
$db->query('
|
|
UPDATE
|
|
results
|
|
SET
|
|
status = -1
|
|
WHERE
|
|
uniqueid = "' . $db->escape_string($payload->uniqueid) . '"
|
|
');
|
|
}
|
|
|
|
break;
|
|
}
|