PluginManager: account for possible invalid format of API version

we're seeing a lot of crashes because of this.
This commit is contained in:
Dylan K. Taylor 2021-10-05 18:36:00 +01:00
parent 0ad663ff50
commit 7d06b76aaf
No known key found for this signature in database
GPG Key ID: 8927471A91CAFD3D
5 changed files with 23 additions and 1 deletions

@ -1 +1 @@
Subproject commit cb47518ae37ce834b612b2efe2df841852d07a31
Subproject commit cf184a00f886a49dd91c2acb69384c630d3ac102

View File

@ -1734,6 +1734,12 @@ final class KnownTranslationFactory{
]);
}
public static function pocketmine_plugin_invalidAPI(Translatable|string $apiVersion) : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PLUGIN_INVALIDAPI, [
"apiVersion" => $apiVersion,
]);
}
public static function pocketmine_plugin_load(Translatable|string $param0) : Translatable{
return new Translatable(KnownTranslationKeys::POCKETMINE_PLUGIN_LOAD, [
0 => $param0,

View File

@ -362,6 +362,7 @@ final class KnownTranslationKeys{
public const POCKETMINE_PLUGIN_INCOMPATIBLEOS = "pocketmine.plugin.incompatibleOS";
public const POCKETMINE_PLUGIN_INCOMPATIBLEPHPVERSION = "pocketmine.plugin.incompatiblePhpVersion";
public const POCKETMINE_PLUGIN_INCOMPATIBLEPROTOCOL = "pocketmine.plugin.incompatibleProtocol";
public const POCKETMINE_PLUGIN_INVALIDAPI = "pocketmine.plugin.invalidAPI";
public const POCKETMINE_PLUGIN_LOAD = "pocketmine.plugin.load";
public const POCKETMINE_PLUGIN_LOADERROR = "pocketmine.plugin.loadError";
public const POCKETMINE_PLUGIN_RESTRICTEDNAME = "pocketmine.plugin.restrictedName";

View File

@ -40,6 +40,7 @@ use pocketmine\Server;
use pocketmine\timings\TimingsHandler;
use pocketmine\utils\AssumptionFailedError;
use pocketmine\utils\Utils;
use pocketmine\utils\VersionString;
use Webmozart\PathUtil\Path;
use function array_intersect;
use function array_merge;
@ -268,6 +269,16 @@ class PluginManager{
continue;
}
foreach($description->getCompatibleApis() as $api){
if(!VersionString::isValidBaseVersion($api)){
$this->server->getLogger()->error($this->server->getLanguage()->translate(KnownTranslationFactory::pocketmine_plugin_loadError(
$name,
KnownTranslationFactory::pocketmine_plugin_invalidAPI($api)
)));
continue 2;
}
}
if(!ApiVersion::isCompatible($this->server->getApiVersion(), $description->getCompatibleApis())){
$this->server->getLogger()->error($this->server->getLanguage()->translate(KnownTranslationFactory::pocketmine_plugin_loadError(
$name,

View File

@ -63,6 +63,10 @@ class VersionString{
$this->suffix = $matches[4] ?? "";
}
public static function isValidBaseVersion(string $baseVersion) : bool{
return preg_match('/^\d+\.\d+\.\d+(?:-(.*))?$/', $baseVersion, $matches) === 1;
}
public function getNumber() : int{
return (($this->major << 9) | ($this->minor << 5) | $this->patch);
}