Replaced ChatAuth with public API auth.

This commit is contained in:
flash 2024-11-19 21:21:36 +00:00
parent 6dc0ccd9bf
commit ada2baee17
5 changed files with 61 additions and 77 deletions

View file

@ -1,6 +1,7 @@
{ {
"require": { "require": {
"flashwave/index": "^0.2410", "flashwave/index": "^0.2410",
"flashii/apii": "^0.2",
"erusev/parsedown": "~1.6", "erusev/parsedown": "~1.6",
"sentry/sdk": "^4.0" "sentry/sdk": "^4.0"
}, },

39
composer.lock generated
View file

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "0fcc2129a9e1c99597116e91c7bb2df1", "content-hash": "f71663659023233c6bbd47cc74f1d954",
"packages": [ "packages": [
{ {
"name": "erusev/parsedown", "name": "erusev/parsedown",
@ -56,6 +56,43 @@
}, },
"time": "2019-12-30T22:54:17+00:00" "time": "2019-12-30T22:54:17+00:00"
}, },
{
"name": "flashii/apii",
"version": "v0.2.1",
"source": {
"type": "git",
"url": "https://patchii.net/flashii/apii-php.git",
"reference": "6a93d31375dd7e75ff9264f3024f2208ce602f49"
},
"require": {
"php": ">=8.1"
},
"require-dev": {
"phpstan/phpstan": "^1.12",
"phpunit/phpunit": "^10.5"
},
"type": "library",
"autoload": {
"psr-4": {
"Flashii\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"bsd-3-clause-clear"
],
"authors": [
{
"name": "flashwave",
"email": "packagist@flash.moe",
"homepage": "https://flash.moe",
"role": "mom"
}
],
"description": "Client library for the Flashii.net API.",
"homepage": "https://api.flashii.net",
"time": "2024-11-16T16:03:42+00:00"
},
{ {
"name": "flashwave/index", "name": "flashwave/index",
"version": "v0.2410.191603", "version": "v0.2410.191603",

View file

@ -1,24 +1,29 @@
<?php <?php
namespace Seria; namespace Seria;
use Seria\Auth\ChatAuth; use Flashii\{FlashiiClient,FlashiiUrls};
use Flashii\Credentials\MisuzuCredentials;
use Seria\Users\UserInfo; use Seria\Users\UserInfo;
require_once __DIR__ . '/../seria.php'; require_once __DIR__ . '/../seria.php';
$authToken = (string)filter_input(INPUT_COOKIE, 'msz_auth'); $authToken = (string)filter_input(INPUT_COOKIE, 'msz_auth');
$authInfo = ChatAuth::attempt($cfg->scopeTo('cauth'), $authToken); $flashii = new FlashiiClient('Seria', new MisuzuCredentials($authToken), new FlashiiUrls(
$cfg->getString('apii:api', FlashiiUrls::PROD_API_URL),
$cfg->getString('apii:id', FlashiiUrls::PROD_ID_URL)
));
$authInfo = $flashii->v1()->me();
if($authInfo->success) { if($authInfo !== null) {
$users = $seria->getUsersContext()->getUsers(); $users = $seria->getUsersContext()->getUsers();
$users->syncChatUser($authInfo); $users->syncApiUser($authInfo);
$sUserInfo = $users->getUser($authInfo->user_id, 'id'); $sUserInfo = $users->getUser($authInfo->getId(), 'id');
$seria->getAuthInfo()->setInfo($sUserInfo); $seria->getAuthInfo()->setInfo($sUserInfo);
} else $sUserInfo = null; } else $sUserInfo = null;
$seria->startCSRFP( $seria->startCSRFP(
$cfg->getString('csrfp:secret', 'mewow'), $cfg->getString('csrfp:secret', 'mewow'),
$authInfo->success ? $authToken : (string)filter_input(INPUT_SERVER, 'REMOTE_ADDR') $authInfo === null ? (string)filter_input(INPUT_SERVER, 'REMOTE_ADDR') : $authToken
); );
$seria->startTemplating(); $seria->startTemplating();

View file

@ -1,55 +0,0 @@
<?php
namespace Seria\Auth;
use stdClass;
use Index\Config\Config;
final class ChatAuth {
public static function attempt(Config $config, string $cookie): object {
if(!empty($cookie)) {
$method = 'Misuzu';
$signature = sprintf('verify#%s#%s#%s', $method, $cookie, $_SERVER['REMOTE_ADDR']);
$signature = hash_hmac('sha256', $signature, $config->getString('secret'));
$login = curl_init($config->getString('endpoint'));
curl_setopt_array($login, [
CURLOPT_AUTOREFERER => false,
CURLOPT_FAILONERROR => false,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HEADER => false,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query([
'method' => $method,
'token' => $cookie,
'ipaddr' => $_SERVER['REMOTE_ADDR'],
], '', '&', PHP_QUERY_RFC3986),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TCP_FASTOPEN => true,
CURLOPT_CONNECTTIMEOUT => 2,
CURLOPT_MAXREDIRS => 2,
CURLOPT_PROTOCOLS => CURLPROTO_HTTPS,
CURLOPT_TIMEOUT => 5,
CURLOPT_USERAGENT => 'Seria',
CURLOPT_HTTPHEADER => [
'Content-Type: application/x-www-form-urlencoded',
'X-SharpChat-Signature: ' . $signature,
],
]);
$userInfo = json_decode(curl_exec($login));
curl_close($login);
}
if(empty($userInfo->success)) {
$userInfo = new stdClass;
$userInfo->success = false;
$userInfo->user_id = 0;
$userInfo->username = 'Anonymous';
$userInfo->colour_raw = 0x40000000;
$userInfo->rank = 0;
$userInfo->hierarchy = 0;
$userInfo->perms = 0;
}
return $userInfo;
}
}

View file

@ -3,6 +3,7 @@ namespace Seria\Users;
use InvalidArgumentException; use InvalidArgumentException;
use RuntimeException; use RuntimeException;
use Flashii\V1\Users\V1User;
use Index\XString; use Index\XString;
use Index\Colour\Colour; use Index\Colour\Colour;
use Index\Db\{DbConnection,DbStatementCache}; use Index\Db\{DbConnection,DbStatementCache};
@ -18,21 +19,16 @@ class Users {
return XString::random(48); return XString::random(48);
} }
public function syncChatUser(object $authInfo): void { public function syncApiUser(V1User $authInfo): void {
if(!$authInfo->success) $userColourUnfixed = $authInfo->getColourRaw() ?? 0x40000000;
return; $stmt = $this->cache->get('INSERT INTO ser_users (user_id, user_name, user_colour, user_rank, user_permissions) VALUES (?, ?, ?, ?, 0) ON DUPLICATE KEY UPDATE user_name = ?, user_colour = ?, user_rank = ?');
$stmt->nextParameter($authInfo->getId());
$userColourFixed = /*($authInfo->colour_raw & 0x40000000) ? null :*/ $authInfo->colour_raw; $stmt->nextParameter($authInfo->getName());
$stmt = $this->cache->get('INSERT INTO ser_users (user_id, user_name, user_colour, user_rank, user_permissions) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE user_name = ?, user_colour = ?, user_rank = ?, user_permissions = ?'); $stmt->nextParameter($userColourUnfixed);
$stmt->addParameter(1, $authInfo->user_id); $stmt->nextParameter($authInfo->getRank());
$stmt->addParameter(2, $authInfo->username); $stmt->nextParameter($authInfo->getName());
$stmt->addParameter(3, $userColourFixed); $stmt->nextParameter($userColourUnfixed);
$stmt->addParameter(4, $authInfo->rank); $stmt->nextParameter($authInfo->getRank());
$stmt->addParameter(5, $authInfo->perms);
$stmt->addParameter(6, $authInfo->username);
$stmt->addParameter(7, $userColourFixed);
$stmt->addParameter(8, $authInfo->rank);
$stmt->addParameter(9, $authInfo->perms);
$stmt->execute(); $stmt->execute();
} }