From 7e6a34459febe4c01eae773b30660dccc9f004cd Mon Sep 17 00:00:00 2001
From: =?utf8?q?Tim=20D=C3=BCsterhus?= <duesterhus@woltlab.com>
Date: Tue, 16 Feb 2021 12:11:21 +0100
Subject: [PATCH] Reject major com.woltlab.wcf upgrades via package upload

---
 .../form/PackageStartInstallForm.class.php    | 22 +++++++++++++++++++
 wcfsetup/install/lang/de.xml                  |  1 +
 wcfsetup/install/lang/en.xml                  |  1 +
 3 files changed, 24 insertions(+)

diff --git a/wcfsetup/install/files/lib/acp/form/PackageStartInstallForm.class.php b/wcfsetup/install/files/lib/acp/form/PackageStartInstallForm.class.php
index 97d993ac04..bcc7c5a44b 100755
--- a/wcfsetup/install/files/lib/acp/form/PackageStartInstallForm.class.php
+++ b/wcfsetup/install/files/lib/acp/form/PackageStartInstallForm.class.php
@@ -139,6 +139,28 @@ class PackageStartInstallForm extends AbstractForm {
 			}
 		}
 		
+		$requirements = PackageValidationManager::getInstance()->getPackageValidationArchive()->getArchive()->getOpenRequirements();
+		foreach ($requirements as $requirement) {
+			if ($requirement['name'] !== 'com.woltlab.wcf') {
+				continue;
+			}
+			if ($requirement['action'] !== 'update') {
+				continue;
+			}
+			if (!isset($requirement['file'])) {
+				continue;
+			}
+
+			$existingVersion = explode('.', $requirement['existingVersion']);
+			$minversion = explode('.', $requirement['minversion']);
+			if (
+				$existingVersion[0] !== $minversion[0]
+				|| $existingVersion[1] !== $minversion[1]
+			) {
+				throw new UserInputException('uploadPackage', 'majorUpgrade');
+			}
+		}
+
 		$this->package = PackageValidationManager::getInstance()->getPackageValidationArchive()->getPackage();
 	}
 	
diff --git a/wcfsetup/install/lang/de.xml b/wcfsetup/install/lang/de.xml
index 7df1922a6d..21779c7154 100644
--- a/wcfsetup/install/lang/de.xml
+++ b/wcfsetup/install/lang/de.xml
@@ -1263,6 +1263,7 @@ GmbH=Gesellschaft mit beschränkter Haftung]]></item>
 		<item name="wcf.acp.package.error.uniqueAlreadyInstalled"><![CDATA[Dieses Paket ist bereits installiert und kann nicht mehrfach installiert werden.]]></item>
 		<item name="wcf.acp.package.error.noValidInstall"><![CDATA[Das angegebene Paket lässt keine Neuinstallation zu.]]></item>
 		<item name="wcf.acp.package.error.noValidUpdate"><![CDATA[Paket „{$package->packageName|language}“ kann mit dem angegebenen Archiv nicht aktualisiert werden.]]></item>
+		<item name="wcf.acp.package.error.majorUpgrade"><![CDATA[Das Paket aktualisiert die Installation auf eine neue Major-Version. Aus Stabilitätsgründen können Major-Upgrades ausschließlich über die Paketserver durchgeführt werden. Detaillierte Informationen zur Durchführung des Upgrades finden sich <a href="https://manual.woltlab.com/de/updates/" class="externalURL">in unserem Handbuch</a>.]]></item>
 		<item name="wcf.acp.package.identifier"><![CDATA[Bezeichner]]></item>
 		<item name="wcf.acp.package.information.properties"><![CDATA[Eigenschaften]]></item>
 		<item name="wcf.acp.package.information.title"><![CDATA[Informationen]]></item>
diff --git a/wcfsetup/install/lang/en.xml b/wcfsetup/install/lang/en.xml
index c54a143ebf..3e9e6463e6 100644
--- a/wcfsetup/install/lang/en.xml
+++ b/wcfsetup/install/lang/en.xml
@@ -1268,6 +1268,7 @@
 		<item name="wcf.acp.package.error.uniqueAlreadyInstalled"><![CDATA[This package is already installed.]]></item>
 		<item name="wcf.acp.package.error.noValidInstall"><![CDATA[The selected package does not support an installation.]]></item>
 		<item name="wcf.acp.package.error.noValidUpdate"><![CDATA[Package “{$package->packageName|language}” cannot be updated using the selected archive.]]></item>
+		<item name="wcf.acp.package.error.majorUpgrade"><![CDATA[The package updates your community to a new major version. For stability reasons major upgrades may only be performed via the update servers. Detailed information regarding the upgrade process can be found <a href="https://manual.woltlab.com/en/updates/" class="externalURL">in our manual</a>.]]></item>
 		<item name="wcf.acp.package.identifier"><![CDATA[Identifier]]></item>
 		<item name="wcf.acp.package.information.properties"><![CDATA[Properties]]></item>
 		<item name="wcf.acp.package.information.title"><![CDATA[Details]]></item>
-- 
2.20.1