new file: src/Controllers/AuthController.php

This commit is contained in:
2024-12-19 08:16:09 +02:00
parent f96c3e9337
commit 248698fda3
9 changed files with 612 additions and 103 deletions

View File

@@ -61,7 +61,7 @@ class Report
{
$columnsDefinition = self::generateColumns([
["title" => "id", "field" => "id", "visible" => false],
["title" => "ip", "field" => "ip", 'formatter'=> 'ipFormatter'],
["title" => "ip", "field" => "ip", 'formatter' => 'ipFormatter'],
["title" => "domain", "field" => "domain", "visible" => false],
["title" => "path", "field" => "path"],
["title" => "useragent", "field" => "useragent"],
@@ -70,6 +70,12 @@ class Report
]);
$queryParams = self::parseQueryParams($request);
if (!isset($queryParams['limit'])) {
return [
"columns" => $columnsDefinition,
"rows" => [],
];
}
$sql = "
SELECT
req.rowid AS id, ip.data AS ip, domain.data AS domain,
@@ -97,11 +103,17 @@ class Report
public static function count_requests_by_ip(ServerRequestInterface $request): PromiseInterface
{
$columnsDefinition = self::generateColumns([
["title" => "ip", "field" => "ip_address", 'formatter'=> 'ipFormatter'],
["title" => "ip", "field" => "ip_address", 'formatter' => 'ipFormatter'],
["title" => "request_count", "field" => "request_count"],
]);
$queryParams = self::parseQueryParams($request);
if (!isset($queryParams['limit'])) {
return [
"columns" => $columnsDefinition,
"rows" => [],
];
}
$sql = "
SELECT
ip.data AS ip_address,
@@ -110,16 +122,14 @@ class Report
request
INNER JOIN
ip ON request.id_ip = ip.rowid
WHERE
request.timestamp BETWEEN ? AND ?
GROUP BY
ip.data
ORDER BY
request_count DESC
LIMIT ?;
WHERE 1=1
";
$params = [$queryParams['from'], $queryParams['to'], $queryParams['limit']];
list($filterSQL, $filterParams) = self::prepareFilterClauses($queryParams['filter']);
$sql .= $filterSQL . " AND request.timestamp BETWEEN ? AND ? GROUP BY
ip.data ORDER BY request_count DESC LIMIT ?;";
$params = array_merge($filterParams, [$queryParams['from'], $queryParams['to'], $queryParams['limit']]);
return self::executeQuery($sql, $params, $columnsDefinition);
}
@@ -132,6 +142,12 @@ class Report
]);
$queryParams = self::parseQueryParams($request);
if (!isset($queryParams['limit'])) {
return [
"columns" => $columnsDefinition,
"rows" => [],
];
}
$sql = "
SELECT
useragent.data AS id_useragent,
@@ -140,16 +156,12 @@ class Report
request
INNER JOIN
useragent ON request.id_useragent = useragent.rowid
WHERE
request.timestamp BETWEEN ? AND ?
GROUP BY
useragent.data
ORDER BY
request_count DESC
LIMIT ?;
WHERE 1=1
";
$params = [$queryParams['from'], $queryParams['to'], $queryParams['limit']];
list($filterSQL, $filterParams) = self::prepareFilterClauses($queryParams['filter']);
$sql .= $filterSQL . " AND req.timestamp BETWEEN ? AND ? GROUP BY useragent.data ORDER BY request_count DESC LIMIT ?;";
$params = array_merge($filterParams, [$queryParams['from'], $queryParams['to'], $queryParams['limit']]);
return self::executeQuery($sql, $params, $columnsDefinition);
}
@@ -157,13 +169,19 @@ class Report
public static function top_ip_ua_path(ServerRequestInterface $request): PromiseInterface
{
$columnsDefinition = self::generateColumns([
["title" => "ip", "field" => "ip", 'formatter'=> 'ipFormatter'],
["title" => "ip", "field" => "ip", 'formatter' => 'ipFormatter'],
["title" => "useragent", "field" => "user_agent"],
["title" => "path", "field" => "path"],
["title" => "count", "field" => "count"],
]);
$queryParams = self::parseQueryParams($request);
if (!isset($queryParams['limit'])) {
return [
"columns" => $columnsDefinition,
"rows" => [],
];
}
$sql = "
SELECT
ip.data AS ip,
@@ -175,16 +193,14 @@ class Report
JOIN ip ON request.id_ip = ip.rowid
JOIN useragent ON request.id_useragent = useragent.rowid
JOIN path ON request.id_path = path.rowid
WHERE
request.timestamp BETWEEN ? AND ?
GROUP BY
ip.data, useragent.data, path.data
ORDER BY
count DESC
LIMIT ?;
WHERE 1=1
";
$params = [$queryParams['from'], $queryParams['to'], $queryParams['limit']];
list($filterSQL, $filterParams) = self::prepareFilterClauses($queryParams['filter']);
$sql .= $filterSQL . " AND request.timestamp BETWEEN ? AND ? GROUP BY ip.data, useragent.data, path.data ORDER BY count DESC LIMIT ?;";
$params = array_merge($filterParams, [$queryParams['from'], $queryParams['to'], $queryParams['limit']]);
return self::executeQuery($sql, $params, $columnsDefinition);
}
@@ -192,12 +208,18 @@ class Report
public static function top_ip_by_load(ServerRequestInterface $request): PromiseInterface
{
$columnsDefinition = self::generateColumns([
["title" => "ip", "field" => "data", 'formatter'=> 'ipFormatter'],
["title" => "ip", "field" => "data", 'formatter' => 'ipFormatter'],
["title" => "avg_load", "field" => "avg_load"],
["title" => "request_count", "field" => "request_count"],
]);
$queryParams = self::parseQueryParams($request);
if (!isset($queryParams['limit'])) {
return [
"columns" => $columnsDefinition,
"rows" => [],
];
}
$sql = "
SELECT
ip.data,
@@ -211,17 +233,13 @@ class Report
FROM load AS load_sub
WHERE load_sub.rowid > request.timestamp
)
WHERE
load.load1 > 1
AND request.timestamp BETWEEN ? AND ?
GROUP BY
ip.data
ORDER BY
avg_load DESC, request_count DESC
LIMIT ?;
WHERE load.load1 > 1
";
$params = [$queryParams['from'], $queryParams['to'], $queryParams['limit']];
list($filterSQL, $filterParams) = self::prepareFilterClauses($queryParams['filter']);
$sql .= $filterSQL . " AND request.timestamp BETWEEN ? AND ? GROUP BY ip.data ORDER BY avg_load DESC LIMIT ?;";
$params = array_merge($filterParams, [$queryParams['from'], $queryParams['to'], $queryParams['limit']]);
return self::executeQuery($sql, $params, $columnsDefinition);
}
@@ -229,11 +247,17 @@ class Report
public static function top_ip_by_rps(ServerRequestInterface $request): PromiseInterface
{
$columnsDefinition = self::generateColumns([
["title" => "ip", "field" => "ip_address", 'formatter'=> 'ipFormatter'],
["title" => "ip", "field" => "ip_address", 'formatter' => 'ipFormatter'],
["title" => "avg_request_per_second", "field" => "avg_request_per_second"],
]);
$queryParams = self::parseQueryParams($request);
if (!isset($queryParams['limit'])) {
return [
"columns" => $columnsDefinition,
"rows" => [],
];
}
$sql = "
WITH TimestampIPRequests AS (
SELECT
@@ -266,13 +290,13 @@ SELECT
FROM
IPRequestPerSecond
JOIN ip ON IPRequestPerSecond.id_ip = ip.rowid
ORDER BY
avg_request_per_second DESC
LIMIT ?;
WHERE 1 = 1
";
$params = [$queryParams['from'], $queryParams['to'], $queryParams['limit']];
list($filterSQL, $filterParams) = self::prepareFilterClauses($queryParams['filter']);
$sql .= $filterSQL . " GROUP BY ip.data ORDER BY avg_request_per_second DESC LIMIT ?;";
$params = array_merge($filterParams, [$queryParams['from'], $queryParams['to'], $queryParams['limit']]);
return self::executeQuery($sql, $params, $columnsDefinition);
}
@@ -285,6 +309,12 @@ LIMIT ?;
]);
$queryParams = self::parseQueryParams($request);
if (!isset($queryParams['limit'])) {
return [
"columns" => $columnsDefinition,
"rows" => [],
];
}
$sql = "
CREATE FUNCTION cidr_to_network(cidr VARCHAR(30), prefix INT) RETURNS VARCHAR(30)
BEGIN

View File

@@ -4,8 +4,6 @@ declare(strict_types=1);
namespace XBotControl;
use MaxMind\Db\Reader;
class Config
{
@@ -32,7 +30,7 @@ class Config
]);
$this->smarty->compile_check = 1;
if (isset($_ENV['GEOIP_DB_FILE_PATH'])) {
$this->geoipreader = new Reader($_ENV['APP_DIR'].'/'.$_ENV['GEOIP_DB_FILE']);
$this->geoipreader = new \MaxMind\Db\Reader($_ENV['APP_DIR'].'/'.$_ENV['GEOIP_DB_FILE']);
}
$dnsConfig = \React\Dns\Config\Config::loadSystemConfigBlocking();
$dnsConfig->nameservers[] = '8.8.8.8';

View File

@@ -0,0 +1,30 @@
<?php
declare(strict_types=1);
namespace XBotControl\Controllers;
use Psr\Http\Message\ServerRequestInterface;
use React\Http\Message\Response;
class AuthController
{
public function __invoke(ServerRequestInterface $request, callable $next)
{
if (isset($_SESSION['API_KEY']) && $_SESSION['API_KEY'] === $_ENV['API_KEY']) {
return $next($request);
}
return new Response(
Response::STATUS_FOUND,
[
'Location' => $_ENV['BASE_URI'] . '/login'
]
);
}
}

View File

@@ -0,0 +1,34 @@
<?php
declare(strict_types=1);
namespace XBotControl\Controllers;
use Psr\Http\Message\ServerRequestInterface;
use React\Http\Message\Response;
class LoginController
{
public function __invoke(ServerRequestInterface $request): \React\Http\Message\Response
{
$data = $request->getParsedBody();
if ($data['api_key'] === $_ENV['API_KEY']) {
$_SESSION['API_KEY'] = $_ENV['API_KEY'];
$uri = $request->getUri();
var_dump($uri->getPath() );
return new Response(
Response::STATUS_FOUND,
[
'Location' => $_ENV['BASE_URI'] . '/'
]
);
}
return Response::html(
\XBotControl\Config::getInstance()->smarty->fetch('login.tpl')
);
}
}