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;
// 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) {
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
*
*/
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.
*
<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 <void/>-Anweisung werden weitere Package Installation Plugins angegeben.]]></item>
<item name="wcf.acp.package.validation.errorCode.17"><![CDATA[Die <void/>-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.
<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 <void/> instruction additional Package Installation Plugins are used.]]></item>
<item name="wcf.acp.package.validation.errorCode.17"><![CDATA[The <void/> 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.