From 1e5e88480570dd0761f0f74c622dc64727e80741 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Mon, 26 Nov 2018 10:41:14 +0100 Subject: [PATCH] vfs: Don't always load plugins, check metadata --- src/common/common.cmake | 2 ++ src/common/vfs.cpp | 37 +++++++++++++++++++++++++--- src/common/vfspluginmetadata.json.in | 4 +++ src/libsync/vfs/suffix/vfs_suffix.h | 2 +- 4 files changed, 40 insertions(+), 5 deletions(-) create mode 100644 src/common/vfspluginmetadata.json.in diff --git a/src/common/common.cmake b/src/common/common.cmake index 88c870933..f47e7745e 100644 --- a/src/common/common.cmake +++ b/src/common/common.cmake @@ -12,3 +12,5 @@ set(common_SOURCES ${CMAKE_CURRENT_LIST_DIR}/vfs.cpp ${CMAKE_CURRENT_LIST_DIR}/plugin.cpp ) + +configure_file(${CMAKE_CURRENT_LIST_DIR}/vfspluginmetadata.json.in ${CMAKE_CURRENT_BINARY_DIR}/vfspluginmetadata.json) diff --git a/src/common/vfs.cpp b/src/common/vfs.cpp index d9881e4f9..a1ad02efe 100644 --- a/src/common/vfs.cpp +++ b/src/common/vfs.cpp @@ -18,6 +18,7 @@ #include "vfs.h" #include "plugin.h" +#include "version.h" #include #include @@ -74,6 +75,8 @@ static QString modeToPluginName(Vfs::Mode mode) return QString(); } +Q_LOGGING_CATEGORY(lcPlugin, "plugins", QtInfoMsg) + bool OCC::isVfsPluginAvailable(Vfs::Mode mode) { if (mode == Vfs::Off) @@ -81,7 +84,30 @@ bool OCC::isVfsPluginAvailable(Vfs::Mode mode) auto name = modeToPluginName(mode); if (name.isEmpty()) return false; - return QPluginLoader(pluginFileName("vfs", name)).load(); + auto pluginPath = pluginFileName("vfs", name); + QPluginLoader loader(pluginPath); + + auto basemeta = loader.metaData(); + if (basemeta.isEmpty() || !basemeta.contains("IID")) { + qCDebug(lcPlugin) << "Plugin doesn't exist" << pluginPath; + return false; + } + if (basemeta["IID"].toString() != "org.owncloud.PluginFactory") { + qCWarning(lcPlugin) << "Plugin has wrong IID" << pluginPath << basemeta["IID"]; + return false; + } + + auto metadata = basemeta["MetaData"].toObject(); + if (metadata["type"].toString() != "vfs") { + qCWarning(lcPlugin) << "Plugin has wrong type" << pluginPath << metadata["type"]; + return false; + } + if (metadata["version"].toString() != MIRALL_VERSION_STRING) { + qCWarning(lcPlugin) << "Plugin has wrong version" << pluginPath << metadata["version"]; + return false; + } + + return true; } Vfs::Mode OCC::bestAvailableVfsMode() @@ -94,8 +120,6 @@ Vfs::Mode OCC::bestAvailableVfsMode() return Vfs::Off; } -Q_LOGGING_CATEGORY(lcPlugin, "plugins", QtInfoMsg) - std::unique_ptr OCC::createVfsFromPlugin(Vfs::Mode mode) { if (mode == Vfs::Off) @@ -104,8 +128,13 @@ std::unique_ptr OCC::createVfsFromPlugin(Vfs::Mode mode) auto name = modeToPluginName(mode); if (name.isEmpty()) return nullptr; - auto pluginPath = pluginFileName("vfs", name); + + if (!isVfsPluginAvailable(mode)) { + qCWarning(lcPlugin) << "Could not load plugin: not existant or bad metadata" << pluginPath; + return nullptr; + } + QPluginLoader loader(pluginPath); auto plugin = loader.instance(); if (!plugin) { diff --git a/src/common/vfspluginmetadata.json.in b/src/common/vfspluginmetadata.json.in new file mode 100644 index 000000000..82c447ad5 --- /dev/null +++ b/src/common/vfspluginmetadata.json.in @@ -0,0 +1,4 @@ +{ + "type": "vfs", + "version": "@MIRALL_VERSION_STRING@" +} diff --git a/src/libsync/vfs/suffix/vfs_suffix.h b/src/libsync/vfs/suffix/vfs_suffix.h index 32a8bed92..6d45fc75c 100644 --- a/src/libsync/vfs/suffix/vfs_suffix.h +++ b/src/libsync/vfs/suffix/vfs_suffix.h @@ -51,7 +51,7 @@ public: class SuffixVfsPluginFactory : public QObject, public DefaultPluginFactory { Q_OBJECT - Q_PLUGIN_METADATA(IID "org.owncloud.PluginFactory") + Q_PLUGIN_METADATA(IID "org.owncloud.PluginFactory" FILE "vfspluginmetadata.json") Q_INTERFACES(OCC::PluginFactory) };