Added Satori routes to Awaki.
This commit is contained in:
parent
b3a3e837bc
commit
00f98e463b
4 changed files with 75 additions and 22 deletions
|
@ -35,4 +35,4 @@ if($config->hasValues('sentry:dsn'))
|
||||||
$db = DbTools::create($config->getString('database:dsn', 'null:'));
|
$db = DbTools::create($config->getString('database:dsn', 'null:'));
|
||||||
$db->execute('SET SESSION time_zone = \'+00:00\', sql_mode = \'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION\';');
|
$db->execute('SET SESSION time_zone = \'+00:00\', sql_mode = \'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION\';');
|
||||||
|
|
||||||
$awk = new AwakiContext($db, $config->scopeTo('urls'));
|
$awk = new AwakiContext($db, $config);
|
||||||
|
|
|
@ -12,13 +12,12 @@ use Syokuhou\IConfig;
|
||||||
class AwakiContext {
|
class AwakiContext {
|
||||||
private const DB_INIT = 'SET SESSION time_zone = \'+00:00\', sql_mode = \'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION\';';
|
private const DB_INIT = 'SET SESSION time_zone = \'+00:00\', sql_mode = \'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION\';';
|
||||||
|
|
||||||
private IDbConnection $dbConn;
|
|
||||||
private HttpRouter $router;
|
private HttpRouter $router;
|
||||||
private IConfig $urls;
|
|
||||||
|
|
||||||
public function __construct(IDbConnection $dbConn, IConfig $urls) {
|
public function __construct(
|
||||||
$this->dbConn = $dbConn;
|
private IDbConnection $dbConn,
|
||||||
$this->urls = $urls;
|
private IConfig $config
|
||||||
|
) {
|
||||||
$dbConn->execute(self::DB_INIT);
|
$dbConn->execute(self::DB_INIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -55,6 +54,7 @@ class AwakiContext {
|
||||||
}
|
}
|
||||||
|
|
||||||
private function registerHttpRoutes(): void {
|
private function registerHttpRoutes(): void {
|
||||||
$this->router->register(new RedirectorRoutes($this->dbConn, $this->urls));
|
$this->router->register(new SatoriRoutes($this->dbConn, $this->config->scopeTo('satori')));
|
||||||
|
$this->router->register(new RedirectorRoutes($this->dbConn, $this->config->scopeTo('urls')));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,21 +50,6 @@ final class RedirectorRoutes implements IRouteHandler {
|
||||||
$this->redirect($response, $request, $info->getString(1));
|
$this->redirect($response, $request, $info->getString(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[HttpGet('/[bg]/([A-Za-z0-9]+)')]
|
|
||||||
public function redirectSatoriShort($response, $request, string $linkId) {
|
|
||||||
$linkId = Base62::decode($linkId);
|
|
||||||
|
|
||||||
$getInfo = $this->dbConn->prepare('SELECT redir_url FROM awk_satori_redirects WHERE redir_id = ?');
|
|
||||||
$getInfo->addParameter(1, $linkId);
|
|
||||||
$getInfo->execute();
|
|
||||||
$info = $getInfo->getResult();
|
|
||||||
|
|
||||||
if(!$info->next())
|
|
||||||
return 404;
|
|
||||||
|
|
||||||
$this->redirect($response, $request, $info->getString(0));
|
|
||||||
}
|
|
||||||
|
|
||||||
private function redirectSimple($response, $request, string $format, string $argument) {
|
private function redirectSimple($response, $request, string $format, string $argument) {
|
||||||
$scheme = empty($_SERVER['HTTPS']) ? 'http' : 'https';
|
$scheme = empty($_SERVER['HTTPS']) ? 'http' : 'https';
|
||||||
$argument = rawurlencode($argument);
|
$argument = rawurlencode($argument);
|
||||||
|
|
68
src/SatoriRoutes.php
Normal file
68
src/SatoriRoutes.php
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
<?php
|
||||||
|
namespace Awaki;
|
||||||
|
|
||||||
|
use Index\Data\IDbConnection;
|
||||||
|
use Index\Http\Routing\{HttpGet,HttpPost,RouteHandler};
|
||||||
|
use Index\Serialisation\Base62;
|
||||||
|
use Syokuhou\IConfig;
|
||||||
|
|
||||||
|
final class SatoriRoutes extends RouteHandler {
|
||||||
|
public function __construct(
|
||||||
|
private IDbConnection $dbConn,
|
||||||
|
private IConfig $config
|
||||||
|
) {}
|
||||||
|
|
||||||
|
#[HttpGet('/[bg]/([A-Za-z0-9]+)')]
|
||||||
|
public function redirectSatoriShort($response, $request, string $linkId) {
|
||||||
|
$linkId = Base62::decode($linkId);
|
||||||
|
|
||||||
|
$getInfo = $this->dbConn->prepare('SELECT redir_url FROM awk_satori_redirects WHERE redir_id = ?');
|
||||||
|
$getInfo->addParameter(1, $linkId);
|
||||||
|
$getInfo->execute();
|
||||||
|
$info = $getInfo->getResult();
|
||||||
|
|
||||||
|
if(!$info->next())
|
||||||
|
return 404;
|
||||||
|
|
||||||
|
$response->redirect($info->getString(0), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[HttpPost('/satori/create')]
|
||||||
|
public function createRedirect($response, $request) {
|
||||||
|
if(!$request->isFormContent())
|
||||||
|
return 400;
|
||||||
|
|
||||||
|
$content = $request->getContent();
|
||||||
|
|
||||||
|
$url = (string)$content->getParam('u');
|
||||||
|
$time = (int)$content->getParam('t', FILTER_SANITIZE_NUMBER_INT);
|
||||||
|
$sign = base64_decode((string)$content->getParam('s'));
|
||||||
|
$hash = hash_hmac('sha256', "satori#create#{$time}#{$url}", $this->config->getString('secret'), true);
|
||||||
|
|
||||||
|
if(!hash_equals($hash, $sign))
|
||||||
|
return 403;
|
||||||
|
|
||||||
|
$currentTime = time();
|
||||||
|
if($time < $currentTime - 30 || $time > $currentTime + 30)
|
||||||
|
return 403;
|
||||||
|
|
||||||
|
$stmt = $this->dbConn->prepare('SELECT redir_id FROM awk_satori_redirects WHERE redir_url = ?');
|
||||||
|
$stmt->addParameter(1, $url);
|
||||||
|
$stmt->execute();
|
||||||
|
|
||||||
|
$result = $stmt->getResult();
|
||||||
|
if($result->next()) {
|
||||||
|
$linkId = $stmt->getInteger(0);
|
||||||
|
} else {
|
||||||
|
$stmt = $this->dbConn->prepare('INSERT INTO awk_satori_redirects (redir_url) VALUES (?)');
|
||||||
|
$stmt->addParameter(1, $url);
|
||||||
|
$stmt->execute();
|
||||||
|
|
||||||
|
$linkId = (int)$stmt->getLastInsertId();
|
||||||
|
}
|
||||||
|
|
||||||
|
return [
|
||||||
|
'url' => sprintf($this->config->getString('format'), Base62::encode($linkId)),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue