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