From eb74e81c3d93581e310b391cd029e62a0d690a8a Mon Sep 17 00:00:00 2001 From: Yassine Doghri <yassine@doghri.fr> Date: Thu, 10 Jun 2021 13:18:58 +0000 Subject: [PATCH] fix: check for database connection and podcasts table existence before redirecting to install fix signature regex --- app/Controllers/HomeController.php | 12 +++++------ app/Controllers/NoteController.php | 20 ++++++++----------- app/Controllers/PodcastController.php | 1 + .../Controllers/ActorController.php | 8 ++++---- .../Controllers/NoteController.php | 8 ++------ app/Libraries/ActivityPub/HttpSignature.php | 2 +- 6 files changed, 22 insertions(+), 29 deletions(-) diff --git a/app/Controllers/HomeController.php b/app/Controllers/HomeController.php index 1daacbd6f3..7031b741ae 100644 --- a/app/Controllers/HomeController.php +++ b/app/Controllers/HomeController.php @@ -11,25 +11,25 @@ declare(strict_types=1); namespace App\Controllers; use App\Models\PodcastModel; -use CodeIgniter\Database\Exceptions\DatabaseException; use CodeIgniter\HTTP\RedirectResponse; use Config\Services; -use mysqli_sql_exception; class HomeController extends BaseController { public function index(): RedirectResponse | string { - try { - $allPodcasts = (new PodcastModel())->findAll(); - } catch (mysqli_sql_exception | DatabaseException) { - // An error was caught when retrieving the podcasts from the database. + $connections = \CodeIgniter\Database\Config::getConnections(); + $db = db_connect(); + if ($connections === [] || ! $db->tableExists('podcasts')) { + // Cannot connect to the database or cannot find the podcasts table // Redirecting to install page because it is likely that Castopod Host has not been installed yet. // NB: as base_url wouldn't have been defined here, redirect to install wizard manually $route = Services::routes()->reverseRoute('install'); return redirect()->to(rtrim(host_url(), '/') . $route); } + $allPodcasts = (new PodcastModel())->findAll(); + // check if there's only one podcast to redirect user to it if (count($allPodcasts) === 1) { return redirect()->route('podcast-activity', [$allPodcasts[0]->name]); diff --git a/app/Controllers/NoteController.php b/app/Controllers/NoteController.php index 0182fd29f6..39831e1cf6 100644 --- a/app/Controllers/NoteController.php +++ b/app/Controllers/NoteController.php @@ -39,28 +39,24 @@ class NoteController extends ActivityPubNoteController public function _remap(string $method, string ...$params): mixed { - if (count($params) < 2) { - throw PageNotFoundException::forPageNotFound(); - } - if ( - ($this->podcast = (new PodcastModel())->getPodcastByName($params[0])) === null + ($podcast = (new PodcastModel())->getPodcastByName($params[0],)) === null ) { throw PageNotFoundException::forPageNotFound(); } + $this->podcast = $podcast; $this->actor = $this->podcast->actor; if ( - ($note = (new NoteModel())->getNoteById($params[1])) === null + count($params) > 1 && + ($note = (new NoteModel())->getNoteById($params[1])) !== null ) { - throw PageNotFoundException::forPageNotFound(); - } - - $this->note = $note; + $this->note = $note; - unset($params[0]); - unset($params[1]); + unset($params[0]); + unset($params[1]); + } return $this->{$method}(...$params); } diff --git a/app/Controllers/PodcastController.php b/app/Controllers/PodcastController.php index 793352512a..b3dd5351da 100644 --- a/app/Controllers/PodcastController.php +++ b/app/Controllers/PodcastController.php @@ -38,6 +38,7 @@ class PodcastController extends BaseController $this->podcast = $podcast; unset($params[0]); + return $this->{$method}(...$params); } diff --git a/app/Libraries/ActivityPub/Controllers/ActorController.php b/app/Libraries/ActivityPub/Controllers/ActorController.php index 8b8705b4a1..41ab1e1f35 100644 --- a/app/Libraries/ActivityPub/Controllers/ActorController.php +++ b/app/Libraries/ActivityPub/Controllers/ActorController.php @@ -272,9 +272,9 @@ class ActorController extends Controller ->where('`created_at` <= NOW()', null, false) ->orderBy('created_at', 'DESC'); - $pageNumber = $this->request->getGet('page'); + $pageNumber = (int) $this->request->getGet('page'); - if (! isset($pageNumber)) { + if ($pageNumber < 1) { $actorActivity->paginate(12); $pager = $actorActivity->pager; $collection = new OrderedCollectionObject(null, $pager); @@ -304,9 +304,9 @@ class ActorController extends Controller ->where('activitypub_follows.target_actor_id', $this->actor->id) ->orderBy('activitypub_follows.created_at', 'DESC'); - $pageNumber = $this->request->getGet('page'); + $pageNumber = (int) $this->request->getGet('page'); - if (! isset($pageNumber)) { + if ($pageNumber < 1) { $followers->paginate(12); $pager = $followers->pager; $followersCollection = new OrderedCollectionObject(null, $pager); diff --git a/app/Libraries/ActivityPub/Controllers/NoteController.php b/app/Libraries/ActivityPub/Controllers/NoteController.php index 10cac4a5f7..05b748d695 100644 --- a/app/Libraries/ActivityPub/Controllers/NoteController.php +++ b/app/Libraries/ActivityPub/Controllers/NoteController.php @@ -39,10 +39,6 @@ class NoteController extends Controller public function _remap(string $method, string ...$params): mixed { - if (count($params) < 1) { - throw PageNotFoundException::forPageNotFound(); - } - if (($note = model('NoteModel')->getNoteById($params[0])) === null) { throw PageNotFoundException::forPageNotFound(); } @@ -80,9 +76,9 @@ class NoteController extends Controller ->where('`published_at` <= NOW()', null, false) ->orderBy('published_at', 'ASC'); - $pageNumber = $this->request->getGet('page'); + $pageNumber = (int) $this->request->getGet('page'); - if (! isset($pageNumber)) { + if ($pageNumber < 1) { $noteReplies->paginate(12); $pager = $noteReplies->pager; $collection = new OrderedCollectionObject(null, $pager); diff --git a/app/Libraries/ActivityPub/HttpSignature.php b/app/Libraries/ActivityPub/HttpSignature.php index a630613c71..046a1cf62d 100644 --- a/app/Libraries/ActivityPub/HttpSignature.php +++ b/app/Libraries/ActivityPub/HttpSignature.php @@ -35,7 +35,7 @@ class HttpSignature ([\w\-\.#\/@]+) )", algorithm="(?P<algorithm>[\w\-]+)", - (headers="\(request-target\) (?P<headers>[\w\\-\s]+)")? + (headers="\(request-target\) (?P<headers>[\w\\-\s]+)",)? signature="(?P<signature>[\w+\/]+={0,2})" /x'; -- GitLab