diff --git a/CMakeLists.txt b/CMakeLists.txt --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,13 +33,23 @@ # Dependencies set(REQUIRED_QT_VERSION 5.10.0) +find_package(Qt5 ${REQUIRED_QT_VERSION} CONFIG COMPONENTS Gui) +set_package_properties(Qt5Gui PROPERTIES DESCRIPTION "Qt 5: Gui component" + TYPE OPTIONAL + PURPOSE "Qt5::Gui is needed to build the AppImage extractor") + find_package(Qt5 ${REQUIRED_QT_VERSION} REQUIRED NO_MODULE COMPONENTS Xml) find_package(KF5 ${KF5_DEP_VERSION} COMPONENTS Archive) set_package_properties(KF5Archive PROPERTIES DESCRIPTION "KDE Frameworks 5: Archive Framework" URL "https://download.kde.org/stable/frameworks/" TYPE OPTIONAL PURPOSE "Archive is needed to build ODF and OOXML 2007 extractors") +find_package(KF5 ${KF5_DEP_VERSION} COMPONENTS Config) +set_package_properties(KF5Config PROPERTIES DESCRIPTION "KDE Frameworks 5: Config Framework" + URL "https://download.kde.org/stable/frameworks/" TYPE OPTIONAL + PURPOSE "Config is needed to build the AppImage extractor") + find_package(KF5 ${KF5_DEP_VERSION} REQUIRED COMPONENTS I18n) find_package(Poppler 0.12.1 COMPONENTS Qt5) @@ -92,6 +102,19 @@ # URL "https://projects.kde.org/projects/kde/kdegraphics/kdegraphics-mobipocket" # TYPE OPTIONAL PURPOSE "Support for mobi metadata") +find_package(libappimage) +set_package_properties(libappimage PROPERTIES DESCRIPTION "Core library of the AppImage project" + URL "https://github.com/AppImage/libappimage" + TYPE OPTIONAL + PURPOSE "Provides support for AppImage thumbnails" + ) +if (libappimage_FOUND) + # workaround for currently released libappimage versions (sadly no version check possible yet) + if (NOT LIBAPPIMAGE_INCLUDE_DIRS) + get_target_property(LIBAPPIMAGE_INCLUDE_DIRS libappimage INTERFACE_INCLUDE_DIRECTORIES) + endif() +endif() + add_definitions(-DTRANSLATION_DOMAIN=\"kfilemetadata5\") add_subdirectory(src) diff --git a/autotests/CMakeLists.txt b/autotests/CMakeLists.txt --- a/autotests/CMakeLists.txt +++ b/autotests/CMakeLists.txt @@ -164,6 +164,23 @@ LINK_LIBRARIES Qt5::Test KF5::FileMetaData ) +# +# AppImage +# +if(libappimage_FOUND AND KF5Config_FOUND AND Qt5Gui_FOUND) + ecm_add_test(appimageextractortest.cpp ../src/extractors/appimageextractor.cpp + TEST_NAME "appimageextractortest" + LINK_LIBRARIES + Qt5::Test + KF5::FileMetaData + KF5::ConfigCore + Qt5::Xml + Qt5::Gui + ${LIBAPPIMAGE_LIBRARIES} + ) + target_include_directories(appimageextractortest SYSTEM PRIVATE ${LIBAPPIMAGE_INCLUDE_DIRS}) +endif() + ################ # Writer tests # ################ diff --git a/autotests/appimageextractortest.h b/autotests/appimageextractortest.h new file mode 100644 --- /dev/null +++ b/autotests/appimageextractortest.h @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2019 Friedrich W. H. Kossebau + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef APPIMAGEEXTRACTORTEST_H +#define APPIMAGEEXTRACTORTEST_H + +#include + +class AppImageExtractorTest : public QObject +{ + Q_OBJECT +private: + QString testFilePath(const QString& fileName) const; + +private Q_SLOTS: + void test(); +}; + +#endif diff --git a/autotests/appimageextractortest.cpp b/autotests/appimageextractortest.cpp new file mode 100644 --- /dev/null +++ b/autotests/appimageextractortest.cpp @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2019 Friedrich W. H. Kossebau + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include "appimageextractortest.h" + +// Qt +#include +#include + +#include "simpleextractionresult.h" +#include "indexerextractortestsconfig.h" +#include "extractors/appimageextractor.h" + +using namespace KFileMetaData; + +QString AppImageExtractorTest::testFilePath(const QString& fileName) const +{ + return QLatin1String(INDEXER_TESTS_SAMPLE_FILES_PATH) + QLatin1Char('/') + fileName; +} + +/* +The test.AppImage got created by: + +wget https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage +./linuxdeploy-x86_64.AppImage --appdir AppDir --output appimage --executable=/usr/bin/echo --desktop-file=appimagetest.desktop --icon-file=/usr/share/icons/oxygen/base/16x16/apps/kde.png +mkdir AppDir/usr/share/metainfo/ +cp org.kde.kfilemetadata.appimagetest.appdata.xml AppDir/usr/share/metainfo/ +./linuxdeploy-x86_64.AppImage --appdir AppDir --output appimage +mv Test_Desktop_Name-x86_64.AppImage test.AppImage + +To edit the appdata.xml & desktop file, run ./test.AppImage --appimage-extract to get the files. +Use linuxdeploy to create the appimage then again. +*/ + +void AppImageExtractorTest::test() +{ + AppImageExtractor plugin{this}; + + SimpleExtractionResult result(testFilePath(QStringLiteral("test.AppImage")), QStringLiteral("application/vnd.appimage")); + plugin.extract(&result); + + QCOMPARE(result.types().size(), 0); + + QCOMPARE(result.properties().value(Property::Author), QVariant(QStringLiteral("Konqi"))); + QCOMPARE(result.properties().value(Property::Title), QVariant(QStringLiteral("Test Desktop Name"))); + QCOMPARE(result.properties().value(Property::Comment), QVariant(QStringLiteral("Test Desktop Comment"))); + QCOMPARE(result.properties().value(Property::Description), QVariant(QStringLiteral("Test description line 1.\nTest description line 2."))); + QCOMPARE(result.properties().value(Property::License), QVariant(QStringLiteral("GPL-2.0"))); + +} + +QTEST_GUILESS_MAIN(AppImageExtractorTest) diff --git a/autotests/samplefiles/test.AppImage b/autotests/samplefiles/test.AppImage new file mode 100755 index 0000000000000000000000000000000000000000..4a6cc539b228cc5889d7ea985d2d5efac87a36c1 GIT binary patch literal 208456 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 FzW_YVgu?&; literal 0 Hc$@ + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef APPIMAGEEXTRACTOR_H +#define APPIMAGEEXTRACTOR_H + +#include "extractorplugin.h" + +namespace KFileMetaData +{ + +class AppImageExtractor : public ExtractorPlugin +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "org.kde.kf5.kfilemetadata.ExtractorPlugin") + Q_INTERFACES(KFileMetaData::ExtractorPlugin) + +public: + explicit AppImageExtractor(QObject* parent = nullptr); + +public: + void extract(ExtractionResult* result) override; + QStringList mimetypes() const override; +}; + +} + +#endif diff --git a/src/extractors/appimageextractor.cpp b/src/extractors/appimageextractor.cpp new file mode 100644 --- /dev/null +++ b/src/extractors/appimageextractor.cpp @@ -0,0 +1,307 @@ +/* + Copyright (C) 2019 Friedrich W. H. Kossebau + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "appimageextractor.h" + +// KF +#include +// Qt +#include +#include +#include +#include +#include +// libappimage +#include + +using namespace KFileMetaData; + + +namespace { +namespace AttributeNames { +QString xml_lang() { return QStringLiteral("xml:lang"); } +} +} + + +// helper class to extract the interesting data from the appdata file +// prefers localized strings over unlocalized, using system locale +class AppDataParser +{ +public: + AppDataParser(const char* appImageFilePath, const QString& appdataFilePath); + +public: + QString name() const { return !m_localized.name.isEmpty() ? m_localized.name : m_unlocalized.name; } + QString summary() const { return !m_localized.summary.isEmpty() ? m_localized.summary : m_unlocalized.summary; } + QString description() const { return !m_localized.description.isEmpty() ? m_localized.description : m_unlocalized.description; } + QString developerName() const { return !m_localized.developerName.isEmpty() ? m_localized.developerName : m_unlocalized.developerName; } + QString projectLicense() const { return m_projectLicense; } + +private: + void extractDescription(const QDomElement& e, const QString& localeName); + +private: + struct Data { + QString name; + QString summary; + QString description; + QString developerName; + }; + Data m_localized; + Data m_unlocalized; + QString m_projectLicense; +}; + + +AppDataParser::AppDataParser(const char* appImageFilePath, const QString& appdataFilePath) +{ + if (appdataFilePath.isEmpty()) { + return; + } + + unsigned long size = 0L; + char* buf = nullptr; + bool ok = appimage_read_file_into_buffer_following_symlinks(appImageFilePath, + qUtf8Printable(appdataFilePath), + &buf, + &size); + + QScopedPointer cleanup(buf); + + if (!ok) { + return; + } + + QDomDocument domDocument; + if (!domDocument.setContent(QByteArray::fromRawData(buf, size))) { + return; + } + + QDomElement docElem = domDocument.documentElement(); + if (docElem.tagName() != QLatin1String("component")) { + return; + } + + const auto localeName = QLocale::system().bcp47Name(); + + QDomElement ec = docElem.firstChildElement(); + while (!ec.isNull()) { + const auto tagName = ec.tagName(); + const auto hasLangAttribute = ec.hasAttribute(AttributeNames::xml_lang()); + const auto matchingLocale = hasLangAttribute && (ec.attribute(AttributeNames::xml_lang()) == localeName); + if (matchingLocale || !hasLangAttribute) { + if (tagName == QLatin1String("name")) { + Data& data = hasLangAttribute ? m_localized : m_unlocalized; + data.name = ec.text(); + } else if (tagName == QLatin1String("summary")) { + Data& data = hasLangAttribute ? m_localized : m_unlocalized; + data.summary = ec.text(); + } else if (tagName == QLatin1String("description")) { + extractDescription(ec, localeName); + } else if (tagName == QLatin1String("developer_name")) { + Data& data = hasLangAttribute ? m_localized : m_unlocalized; + data.developerName = ec.text(); + } else if (tagName == QLatin1String("project_license")) { + m_projectLicense = ec.text(); + } + } + ec = ec.nextSiblingElement(); + } +} + +using DesriptionDomFilter = std::function; + +void stripDescriptionTextElements(QDomElement& element, const DesriptionDomFilter& stripFilter) +{ + auto childElement = element.firstChildElement(); + while (!childElement.isNull()) { + auto nextChildElement = childElement.nextSiblingElement(); + + const auto tagName = childElement.tagName(); + const bool isElementToFilter = (tagName == QLatin1String("p")) || (tagName == QLatin1String("li")); + if (isElementToFilter && stripFilter(childElement)) { + element.removeChild(childElement); + } else { + stripDescriptionTextElements(childElement, stripFilter); + } + + childElement = nextChildElement; + } +} + +void AppDataParser::extractDescription(const QDomElement& e, const QString& localeName) +{ + // create fake html from it and let QTextDocument transform it to plain text for us + QDomDocument descriptionDocument; + auto htmlElement = descriptionDocument.createElement(QStringLiteral("html")); + descriptionDocument.appendChild(htmlElement); + + // first localized... + auto clonedE = descriptionDocument.importNode(e, true).toElement(); + clonedE.setTagName(QStringLiteral("body")); + stripDescriptionTextElements(clonedE, [localeName](const QDomElement& e) { + return !e.hasAttribute(AttributeNames::xml_lang()) || + e.attribute(AttributeNames::xml_lang()) != localeName; + }); + htmlElement.appendChild(clonedE); + + QTextDocument textDocument; + textDocument.setHtml(descriptionDocument.toString(-1)); + + m_localized.description = textDocument.toPlainText().trimmed(); + + if (!m_localized.description.isEmpty()) { + // localized will be preferred, no need to calculate unlocalized one + return; + } + + // then unlocalized if still needed + htmlElement.removeChild(clonedE); // reuse descriptionDocument + clonedE = descriptionDocument.importNode(e, true).toElement(); + clonedE.setTagName(QStringLiteral("body")); + stripDescriptionTextElements(clonedE, [](const QDomElement& e) { + return e.hasAttribute(AttributeNames::xml_lang()); + }); + htmlElement.appendChild(clonedE); + + textDocument.setHtml(descriptionDocument.toString(-1)); + + m_unlocalized.description = textDocument.toPlainText().trimmed(); +} + + +// helper class to extract the interesting data from the desktop file +class DesktopFileParser +{ +public: + DesktopFileParser(const char* appImageFilePath, const QString& desktopFilePath); + +public: + QString name; + QString comment; +}; + + +DesktopFileParser::DesktopFileParser(const char* appImageFilePath, const QString& desktopFilePath) +{ + if (desktopFilePath.isEmpty()) { + return; + } + + unsigned long size = 0L; + char* buf = nullptr; + bool ok = appimage_read_file_into_buffer_following_symlinks(appImageFilePath, + qUtf8Printable(desktopFilePath), + &buf, + &size); + + QScopedPointer cleanup(buf); + + if (!ok) { + return; + } + + // create real file, KDesktopFile needs that + QTemporaryFile tmpDesktopFile; + tmpDesktopFile.open(); + tmpDesktopFile.write(buf, size); + tmpDesktopFile.close(); + + KDesktopFile desktopFile(tmpDesktopFile.fileName()); + name = desktopFile.readName(); + comment = desktopFile.readComment(); +} + + +AppImageExtractor::AppImageExtractor(QObject* parent) + : ExtractorPlugin(parent) +{ +} + +QStringList AppImageExtractor::mimetypes() const +{ + return QStringList{ + QStringLiteral("application/x-iso9660-appimage"), + QStringLiteral("application/vnd.appimage"), + }; +} + +void KFileMetaData::AppImageExtractor::extract(ExtractionResult* result) +{ + const auto appImageFilePath = result->inputUrl().toUtf8(); + const auto appImageType = appimage_get_type(appImageFilePath.constData(), false); + // not a valid appimage file? + if (appImageType <= 0) { + return; + } + + // find desktop file and appdata file + // need to scan ourselves, given there are no fixed names in the spec yet defined + // and we just can try as the other appimage tools to simply use the first file of the type found + char** filePaths = appimage_list_files(appImageFilePath.constData()); + if (!filePaths) { + return; + } + + QString desktopFilePath; + QString appdataFilePath; + for (int i = 0; filePaths[i] != nullptr; ++i) { + const auto filePath = QString::fromUtf8(filePaths[i]); + + if (filePath.startsWith(QLatin1String("usr/share/metainfo/")) && + filePath.endsWith(QLatin1String(".appdata.xml"))) { + appdataFilePath = filePath; + if (!desktopFilePath.isEmpty()) { + break; + } + } + + if (filePath.endsWith(QLatin1String(".desktop")) && !filePath.contains(QLatin1Char('/'))) { + desktopFilePath = filePath; + if (!appdataFilePath.isEmpty()) { + break; + } + } + } + + appimage_string_list_free(filePaths); + + // extract data from both files... + const AppDataParser appData(appImageFilePath.constData(), appdataFilePath); + + const DesktopFileParser desktopFileData(appImageFilePath.constData(), desktopFilePath); + + // ... and insert into the result + result->add(Property::Title, desktopFileData.name); + + if (!desktopFileData.comment.isEmpty()) { + result->add(Property::Comment, desktopFileData.comment); + } else if (!appData.summary().isEmpty()) { + result->add(Property::Comment, appData.summary()); + } + if (!appData.description().isEmpty()) { + result->add(Property::Description, appData.description()); + } + if (!appData.projectLicense().isEmpty()) { + result->add(Property::License, appData.projectLicense()); + } + if (!appData.developerName().isEmpty()) { + result->add(Property::Author, appData.developerName()); + } +}