Ensure that app abbreviation is unique before app installation
authorMatthias Schmidt <gravatronics@live.com>
Fri, 2 Jul 2021 11:23:40 +0000 (13:23 +0200)
committerMatthias Schmidt <gravatronics@live.com>
Mon, 5 Jul 2021 09:26:53 +0000 (11:26 +0200)
Close #4344

wcfsetup/install/files/lib/system/package/validation/PackageValidationArchive.class.php
wcfsetup/install/files/lib/system/package/validation/PackageValidationException.class.php
wcfsetup/install/lang/de.xml
wcfsetup/install/lang/en.xml

index 39ba7e52100f2eddc5e34b45ab08912e6841dc1e..9383be3072938abac1d01041a71bf22bafd75abb 100644 (file)
@@ -4,6 +4,7 @@ namespace wcf\system\package\validation;
 
 use wcf\data\package\Package;
 use wcf\data\package\PackageList;
+use wcf\system\application\ApplicationHandler;
 use wcf\system\database\util\PreparedStatementConditionBuilder;
 use wcf\system\package\PackageArchive;
 use wcf\system\WCF;
@@ -95,6 +96,8 @@ class PackageValidationArchive implements \RecursiveIterator
                 // try to read archive
                 $this->archive->openArchive();
 
+                $this->validateApplication();
+
                 // check if package is installable or suitable for an update
                 $this->validateInstructions($requiredVersion, $validationMode);
             } catch (PackageValidationException $e) {
@@ -191,6 +194,27 @@ class PackageValidationArchive implements \RecursiveIterator
         return true;
     }
 
+    /**
+     * Validates if the package, if it is an app, can be installed.
+     *
+     * @throws  PackageValidationException
+     * @since   5.4
+     */
+    protected function validateApplication(): void
+    {
+        if ($this->archive->getPackageInfo('isApplication')) {
+            $abbreviation = Package::getAbbreviation($this->archive->getPackageInfo('name'));
+
+            $application = ApplicationHandler::getInstance()->getApplication($abbreviation);
+            if ($application !== null) {
+                throw new PackageValidationException(PackageValidationException::DUPLICATE_ABBREVIATION, [
+                    'packageName' => $this->archive->getPackageInfo('name'),
+                    'application' => $application,
+                ]);
+            }
+        }
+    }
+
     /**
      * Validates if the package has suitable install or update instructions
      *
index 5b7cc9f5a874ff3777f6d079eca2fcb31ec2f5b4..4b7b2780cd7a611a11e71adff5135e3b1c85a071 100644 (file)
@@ -133,6 +133,12 @@ class PackageValidationException extends SystemException
      */
     const VOID_ON_INSTALL = 17;
 
+    /**
+     * an app with the same abbreviation is already installed
+     * @since   5.4
+     */
+    const DUPLICATE_ABBREVIATION = 18;
+
     /**
      * Creates a new PackageArchiveValidationException.
      *
index 297e3e76d56e9463aad6fbbb0c4e71ef9633394b..05a1739d402b6e6d18fe8066e1502944de57f8cc 100644 (file)
@@ -1964,6 +1964,7 @@ Die Datenbestände werden sorgfältig gepflegt, aber es ist nicht ausgeschlossen
                <item name="wcf.acp.package.validation.errorCode.15"><![CDATA[Das Paket verfügt über keine Angaben zur API-Kompatibilität, eine Installation  mit aktivierten Entwickler-Werkzeugen ist daher nicht möglich.]]></item>
                <item name="wcf.acp.package.validation.errorCode.16"><![CDATA[Neben der &lt;void/&gt;-Anweisung werden weitere Package Installation Plugins angegeben.]]></item>
                <item name="wcf.acp.package.validation.errorCode.17"><![CDATA[Die &lt;void/&gt;-Anweisung ist in den Installations-Anweisungen unzulässig.]]></item>
+               <item name="wcf.acp.package.validation.errorCode.18"><![CDATA[Die bereits installierte App „{$application->getPackage()->package}“ verwendet die gleiche App-Abkürzung.]]></item>
                <item name="wcf.acp.package.validation.failed"><![CDATA[Das hochgeladene Paket kann nicht installiert werden, bitte {if LANGUAGE_USE_INFORMAL_VARIANT}beachte{else}beachten Sie{/if} das unten stehende Prüfungsergebnis.]]></item>
                <item name="wcf.acp.package.evaluation.expired"><![CDATA[Die Testphase von <strong>{$packageName}</strong> ist abgelaufen. Bitte aktualisiere{if !LANGUAGE_USE_INFORMAL_VARIANT}n Sie{/if} auf die aktuellste Version um diese Software weiterhin legal betreiben zu können.{if $pluginStoreFileID || $isWoltLab}<br>{if LANGUAGE_USE_INFORMAL_VARIANT}Du kannst{else}Sie können{/if} die aktuelle Version sicher und bequem <strong>{if $pluginStoreFileID}<a href="https://pluginstore.woltlab.com/file/{$pluginStoreFileID}/">im WoltLab Plugin-Store</a>{else}<a href="https://www.woltlab.com/purchase/">auf WoltLab.com</a>{/if}</strong> erwerben.{/if}]]></item>
                <item name="wcf.acp.package.evaluation.pending"><![CDATA[Bei den folgenden installierten Apps handelt es sich um Testversionen, die am <strong>{$evaluationEndDate|plainTime}</strong> ({@$evaluationEndDate|dateDiff:TIME_NOW:true}) ablaufen. Mit Ablauf der Frist deaktiviert sich die App automatisch, es ist dann notwendig diese auf die endgültige Version zu aktualisieren, um den legalen Betrieb fortzusetzen.
index 994777e271d85b0403c160686acf7dd2a5028090..e5ee933efa51c8327d4f0fa3f48bd073282353c5 100644 (file)
@@ -1949,6 +1949,7 @@ The database is carefully maintained, but there will be always be a margin of er
                <item name="wcf.acp.package.validation.errorCode.15"><![CDATA[This package does not contain any data on API compatibility, the installation is prevented while the developer tools are enabled.]]></item>
                <item name="wcf.acp.package.validation.errorCode.16"><![CDATA[In addition to the &lt;void/&gt; instruction additional Package Installation Plugins are used.]]></item>
                <item name="wcf.acp.package.validation.errorCode.17"><![CDATA[The &lt;void/&gt; instruction may not be used in the install-instructions.]]></item>
+               <item name="wcf.acp.package.validation.errorCode.18"><![CDATA[The app “{$application->getPackage()->package}”, which is already installed, uses the same app abbreviation.]]></item>
                <item name="wcf.acp.package.validation.failed"><![CDATA[The package cannot be installed, please review the validation results below.]]></item>
                <item name="wcf.acp.package.evaluation.expired"><![CDATA[The evaluation period of <strong>{$packageName}</strong> has expired. For a legal use of this software, please update to the latest available version.{if $pluginStoreFileID || $isWoltLab}<br>The latest version can be purchased quickly and securely <strong>{if $pluginStoreFileID}<a href="https://pluginstore.woltlab.com/file/{$pluginStoreFileID}/">in the WoltLab Plugin-Store</a>{else}<a href="https://www.woltlab.com/purchase/">on WoltLab.com</a>{/if}</strong>.{/if}]]></item>
                <item name="wcf.acp.package.evaluation.pending"><![CDATA[The evaluation period of the apps listed below will expire on <strong>{$evaluationEndDate|plainTime}</strong> ({@$evaluationEndDate|dateDiff:TIME_NOW:true}). The apps will automatically disable themselves after this date and become unusable, you'll need to install the latest versions of the apps to active them again.