Skip to content
This repository was archived by the owner on Jan 28, 2022. It is now read-only.

Commit 803accc

Browse files
authored
feat: Check app version in plugin loading (#537)
Make sure the app version is at least the required version specified in the plugin's metadata: dependencies/app Part of #532
1 parent b3969b8 commit 803accc

File tree

3 files changed

+31
-5
lines changed

3 files changed

+31
-5
lines changed

sources/launcher.cpp

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
#include "launcher.h"
2424

25+
#include <QCoreApplication>
2526
#include <QPluginLoader>
2627
#include <QVersionNumber>
2728

@@ -43,10 +44,12 @@ QObject *Launcher::loadPlugin(const QString &path, const QString &pluginName) {
4344
QPluginLoader pluginLoader(pluginPath, this);
4445

4546
QJsonObject metaData = pluginLoader.metaData()["MetaData"].toObject();
46-
QString pluginIntgLibVersion = metaData["dependencies"].toObject()["integrations.library"].toString();
47+
QJsonObject dependencies = metaData["dependencies"].toObject();
48+
QString pluginIntgLibVersion = dependencies["integrations.library"].toString();
49+
QString requiredMinAppVersion = dependencies["app"].toString();
4750

4851
qCInfo(lcPlugin) << "Loading plugin:" << pluginPath << "version:" << metaData["version"].toString()
49-
<< "intg.lib:" << pluginIntgLibVersion;
52+
<< "intg.lib:" << pluginIntgLibVersion << "min app version:" << requiredMinAppVersion;
5053

5154
if (pluginIntgLibVersion.isEmpty()) {
5255
Notifications::getInstance()->add(true, tr("Incompatible plugin %1: metadata missing").arg(pluginName));
@@ -58,6 +61,12 @@ QObject *Launcher::loadPlugin(const QString &path, const QString &pluginName) {
5861
return nullptr;
5962
}
6063

64+
if (!isCompatibleAppVersion(requiredMinAppVersion)) {
65+
Notifications::getInstance()->add(
66+
true, tr("Plugin %1 requires app version %2 or higher").arg(pluginName, requiredMinAppVersion));
67+
return nullptr;
68+
}
69+
6170
QObject *plugin = pluginLoader.instance();
6271
if (!plugin) {
6372
qCCritical(lcPlugin) << "Failed to load plugin:" << pluginPath << pluginLoader.errorString();
@@ -98,6 +107,13 @@ bool Launcher::isCompatibleIntgLibVersion(const QString &pluginIntgLibVersion) {
98107
intgVersionPlugin.minorVersion() == intgVersion.minorVersion();
99108
}
100109

110+
bool Launcher::isCompatibleAppVersion(const QString &requiredMinAppVersion) {
111+
QVersionNumber appVersion = QVersionNumber::fromString(cleanVersionString(QCoreApplication::applicationVersion()));
112+
QVersionNumber reqMinVersion = QVersionNumber::fromString(cleanVersionString(requiredMinAppVersion));
113+
114+
return QVersionNumber::compare(appVersion, reqMinVersion) >= 0;
115+
}
116+
101117
QString Launcher::cleanVersionString(const QString &version) {
102118
if (version.startsWith('v')) {
103119
return version.mid(1);

sources/launcher.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ class Launcher : public QObject {
3838
*/
3939
bool isCompatibleIntgLibVersion(const QString &pluginIntgLibVersion);
4040

41+
/**
42+
* @brief Returns true if the required minium app version is fulfilled
43+
*/
44+
bool isCompatibleAppVersion(const QString &requiredMinAppVersion);
45+
4146
private:
4247
QString cleanVersionString(const QString &version);
4348

translations/en_US.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -608,17 +608,22 @@ to set up YIO remote</source>
608608
<context>
609609
<name>Launcher</name>
610610
<message>
611-
<location filename="../sources/launcher.cpp" line="52"/>
611+
<location filename="../sources/launcher.cpp" line="55"/>
612612
<source>Incompatible plugin %1: metadata missing</source>
613613
<translation type="unfinished"></translation>
614614
</message>
615615
<message>
616-
<location filename="../sources/launcher.cpp" line="57"/>
616+
<location filename="../sources/launcher.cpp" line="60"/>
617617
<source>Incompatible plugin %1: integration lib mismatch</source>
618618
<translation type="unfinished"></translation>
619619
</message>
620620
<message>
621-
<location filename="../sources/launcher.cpp" line="64"/>
621+
<location filename="../sources/launcher.cpp" line="66"/>
622+
<source>Plugin %1 requires app version %2 or higher</source>
623+
<translation type="unfinished"></translation>
624+
</message>
625+
<message>
626+
<location filename="../sources/launcher.cpp" line="73"/>
622627
<source>Failed to load %1</source>
623628
<translation type="unfinished"></translation>
624629
</message>

0 commit comments

Comments
 (0)