From d9cc2f02136c454984ef9e5a8682a0bf369fa9b6 Mon Sep 17 00:00:00 2001
From: Morris Jobke <hey@morrisjobke.de>
Date: Mon, 13 Jul 2020 14:58:52 +0200
Subject: [PATCH] Do not load app.php if Application implements IBootstrap

Signed-off-by: Morris Jobke <hey@morrisjobke.de>
---
 .../AppFramework/Bootstrap/Coordinator.php        |  8 +++++++-
 lib/private/legacy/OC_App.php                     | 15 +++++++++++----
 2 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/lib/private/AppFramework/Bootstrap/Coordinator.php b/lib/private/AppFramework/Bootstrap/Coordinator.php
index 085e7460da6..8a513d65029 100644
--- a/lib/private/AppFramework/Bootstrap/Coordinator.php
+++ b/lib/private/AppFramework/Bootstrap/Coordinator.php
@@ -147,7 +147,6 @@ class Coordinator {
 			$this->logger->logException($e, [
 				'message' => "Could not boot $appId" . $e->getMessage(),
 			]);
-			return;
 		} catch (Throwable $e) {
 			$this->logger->logException($e, [
 				'message' => "Could not boot $appId" . $e->getMessage(),
@@ -155,4 +154,11 @@ class Coordinator {
 			]);
 		}
 	}
+
+	public function isBootable(string $appId) {
+		$appNameSpace = App::buildAppNamespace($appId);
+		$applicationClassName = $appNameSpace . '\\AppInfo\\Application';
+		return class_exists($applicationClassName) &&
+			in_array(IBootstrap::class, class_implements($applicationClassName), true);
+	}
 }
diff --git a/lib/private/legacy/OC_App.php b/lib/private/legacy/OC_App.php
index f4308dae2fd..4110bee114d 100644
--- a/lib/private/legacy/OC_App.php
+++ b/lib/private/legacy/OC_App.php
@@ -149,7 +149,17 @@ class OC_App {
 		// in case someone calls loadApp() directly
 		self::registerAutoloading($app, $appPath);
 
-		if (is_file($appPath . '/appinfo/app.php')) {
+		/** @var \OC\AppFramework\Bootstrap\Coordinator $coordinator */
+		$coordinator = \OC::$server->query(\OC\AppFramework\Bootstrap\Coordinator::class);
+		$isBootable = $coordinator->isBootable($app);
+
+		$hasAppPhpFile = is_file($appPath . '/appinfo/app.php');
+
+		if ($isBootable && $hasAppPhpFile) {
+			\OC::$server->getLogger()->error('/appinfo/app.php is not loaded when \OCP\AppFramework\Bootstrap\IBootstrap on the application class is used. Migrate everything from app.php to the Application class.', [
+				'app' => $app,
+			]);
+		} elseif ($hasAppPhpFile) {
 			\OC::$server->getLogger()->debug('/appinfo/app.php is deprecated, use \OCP\AppFramework\Bootstrap\IBootstrap on the application class instead.', [
 				'app' => $app,
 			]);
@@ -175,9 +185,6 @@ class OC_App {
 			}
 			\OC::$server->getEventLogger()->end('load_app_' . $app);
 		}
-
-		/** @var \OC\AppFramework\Bootstrap\Coordinator $coordinator */
-		$coordinator = \OC::$server->query(\OC\AppFramework\Bootstrap\Coordinator::class);
 		$coordinator->bootApp($app);
 
 		$info = self::getAppInfo($app);
-- 
GitLab