Signed-off-by: Maxence Lange <maxence@artificial-owl.com>
This commit is contained in:
Maxence Lange 2023-01-26 09:40:29 -01:00
Родитель f9913a04b5
Коммит 3f6a6abb0b
3 изменённых файлов: 46 добавлений и 17 удалений

Просмотреть файл

@ -47,7 +47,7 @@ CREATE TABLE IF NOT EXISTS `instances` (
`instance` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `instance` (`instance`(191))
UNIQUE KEY `instance` (`instance`(191))
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `toVerify`;

Просмотреть файл

@ -1,8 +1,35 @@
<?php
declare(strict_types=1);
/**
* lookup-server - Standalone Lookup Server.
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Maxence Lange <maxence@artificial-owl.com>
* @copyright 2022
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace LookupServer;
use Exception;
use PDO;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
@ -11,9 +38,9 @@ use Psr\Http\Message\ServerRequestInterface as Request;
class InstanceManager {
private PDO $db;
private SignatureHandler $signatureHandler;
private bool $globalScaleMode = false;
private string $authKey = '';
private array $instances = [];
private bool $globalScaleMode;
private string $authKey;
private array $instances;
public function __construct(
PDO $db,
@ -26,13 +53,11 @@ class InstanceManager {
$this->signatureHandler = $signatureHandler;
$this->globalScaleMode = $globalScaleMode;
$this->authKey = $authKey;
if (is_array($instances)) {
$this->instances = $instances;
}
$this->instances = $instances ?? [];
}
public function insert(string $instance) {
public function insert(string $instance): void {
$stmt = $this->db->prepare('SELECT id, instance, timestamp FROM instances WHERE instance=:instance');
$stmt->bindParam(':instance', $instance, PDO::PARAM_STR);
$stmt->execute();
@ -46,7 +71,10 @@ class InstanceManager {
$insert->bindParam(':instance', $instance, PDO::PARAM_STR);
$insert->bindParam(':timestamp', $time, PDO::PARAM_INT);
$insert->execute();
try {
$insert->execute();
} catch (Exception $e) {
}
}
}
@ -164,7 +192,7 @@ class InstanceManager {
/**
* @param string $instance
*/
private function removeUsers(string $instance) {
private function removeUsers(string $instance): void {
$search = '%@' . $this->escapeWildcard($instance);
$stmt = $this->db->prepare('SELECT id FROM users WHERE federationId LIKE :search');
$stmt->bindParam(':search', $search);
@ -182,7 +210,7 @@ class InstanceManager {
/**
* @param int $userId
*/
private function removeUser(int $userId) {
private function removeUser(int $userId): void {
$stmt = $this->db->prepare('DELETE FROM users WHERE id = :id');
$stmt->bindParam(':id', $userId);
$stmt->execute();
@ -231,7 +259,7 @@ class InstanceManager {
/**
* @param string $instance
*/
private function removingEmptyInstance(string $instance) {
private function removingEmptyInstance(string $instance): void {
$search = '%@' . $this->escapeWildcard($instance);
$stmt = $this->db->prepare('SELECT federationId FROM users WHERE federationId LIKE :search');

Просмотреть файл

@ -105,12 +105,12 @@ class SignatureHandler {
* @throws SignedRequestException
*/
public function verifyRequest(Request $request): string {
$body = json_decode($request->getBody(), true);
if ($body === null || !isset($body['message']) || !isset($body['message']['data'])
$body = json_decode((string)$request->getBody(), true);
if ($body === null
|| !isset($body['message']['data']['federationId'])
|| !isset($body['signature'])
|| !isset($body['message']['timestamp'])) {
throw new SignedRequestException();
throw new SignedRequestException('malformed body');
}
$cloudId = $body['message']['data']['federationId'];
@ -118,13 +118,14 @@ class SignatureHandler {
try {
$verified = $this->verify($cloudId, $body['message'], $body['signature']);
if ($verified) {
list(, $host) = $this->splitCloudId($body['message']['data']['federationId']);
[, $host] = $this->splitCloudId($body['message']['data']['federationId']);
return $host;
}
} catch (\Exception $e) {
throw new SignedRequestException($e->getMessage());
}
throw new SignedRequestException();
throw new SignedRequestException('not verified');
}
}