aboutsummaryrefslogtreecommitdiff
path: root/src/core/kdesktopfile.cpp
diff options
context:
space:
mode:
authorJenkins CI <null@kde.org>2013-12-18 00:45:18 +0000
committerJenkins CI <null@kde.org>2013-12-18 00:45:18 +0000
commit867e7a50e6396338ab4fe9aa22ad141e4cd344d2 (patch)
tree1d6f8d6c912fa04dc268b5580bcfe696fa538743 /src/core/kdesktopfile.cpp
parentc38b88497a833e482e6892b72c8f52adec6de857 (diff)
downloadkconfig-867e7a50e6396338ab4fe9aa22ad141e4cd344d2.tar.gz
kconfig-867e7a50e6396338ab4fe9aa22ad141e4cd344d2.tar.bz2
Move kconfig code to the root directory.
Diffstat (limited to 'src/core/kdesktopfile.cpp')
-rw-r--r--src/core/kdesktopfile.cpp366
1 files changed, 366 insertions, 0 deletions
diff --git a/src/core/kdesktopfile.cpp b/src/core/kdesktopfile.cpp
new file mode 100644
index 00000000..0ebbb4b0
--- /dev/null
+++ b/src/core/kdesktopfile.cpp
@@ -0,0 +1,366 @@
+/*
+ This file is part of the KDE libraries
+ Copyright (c) 1999 Pietro Iglio <iglio@kde.org>
+ Copyright (c) 1999 Preston Brown <pbrown@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+// Qt5 TODO: re-enable. No point in doing it before, it breaks on QString::fromUtf8(QByteArray), which exists in qt5.
+#undef QT_NO_CAST_FROM_BYTEARRAY
+
+#include "kdesktopfile.h"
+
+#ifndef Q_OS_WIN
+#include <unistd.h>
+#endif
+
+#include <QtCore/QDir>
+#include <QtCore/QFileInfo>
+#include <QUrl>
+#include <qstandardpaths.h>
+
+#include "kauthorized.h"
+#include "kconfig_p.h"
+#include "kconfiggroup.h"
+#include "kconfigini_p.h"
+
+class KDesktopFilePrivate : public KConfigPrivate
+{
+ public:
+ KDesktopFilePrivate(QStandardPaths::StandardLocation resourceType, const QString &fileName);
+ KConfigGroup desktopGroup;
+};
+
+KDesktopFilePrivate::KDesktopFilePrivate(QStandardPaths::StandardLocation resourceType, const QString &fileName)
+ : KConfigPrivate(KConfig::NoGlobals, resourceType)
+{
+ mBackend = new KConfigIniBackend();
+ bDynamicBackend = false;
+ changeFileName(fileName);
+}
+
+KDesktopFile::KDesktopFile(QStandardPaths::StandardLocation resourceType, const QString &fileName)
+ : KConfig(*new KDesktopFilePrivate(resourceType, fileName))
+{
+ Q_D(KDesktopFile);
+ reparseConfiguration();
+ d->desktopGroup = KConfigGroup(this, "Desktop Entry");
+}
+
+KDesktopFile::KDesktopFile(const QString &fileName)
+ : KConfig(*new KDesktopFilePrivate(QStandardPaths::ApplicationsLocation, fileName))
+{
+ Q_D(KDesktopFile);
+ reparseConfiguration();
+ d->desktopGroup = KConfigGroup(this, "Desktop Entry");
+}
+
+KDesktopFile::~KDesktopFile()
+{
+}
+
+KConfigGroup KDesktopFile::desktopGroup() const
+{
+ Q_D(const KDesktopFile);
+ return d->desktopGroup;
+}
+
+QString KDesktopFile::locateLocal(const QString &path)
+{
+ QString relativePath;
+ // Relative to config? (e.g. for autostart)
+ Q_FOREACH(const QString& dir, QStandardPaths::standardLocations(QStandardPaths::GenericConfigLocation)) {
+ if (path.startsWith(dir) + '/') {
+ relativePath = dir.mid(path.length() + 1);
+ return QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) + QLatin1Char('/') + relativePath;
+ }
+ }
+ // Relative to xdg data dir? (much more common)
+ Q_FOREACH(const QString& dir, QStandardPaths::standardLocations(QStandardPaths::GenericDataLocation)) {
+ if (path.startsWith(dir) + '/')
+ relativePath = dir.mid(path.length() + 1);
+ }
+ if (relativePath.isEmpty()) {
+ // What now? The desktop file doesn't come from XDG_DATA_DIRS. Use filename only and hope for the best.
+ relativePath = path.mid(path.lastIndexOf(QLatin1Char('/'))+1);
+ }
+ return QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QLatin1Char('/') + relativePath;
+}
+
+bool KDesktopFile::isDesktopFile(const QString& path)
+{
+ return (path.length() > 8
+ && path.endsWith(QLatin1String(".desktop")));
+}
+
+bool KDesktopFile::isAuthorizedDesktopFile(const QString& path)
+{
+ if (path.isEmpty())
+ return false; // Empty paths are not ok.
+
+ if (QDir::isRelativePath(path))
+ return true; // Relative paths are ok.
+
+ const QString realPath = QFileInfo(path).canonicalFilePath();
+ if (realPath.isEmpty())
+ return false; // File doesn't exist.
+
+#ifndef Q_OS_WIN
+ const Qt::CaseSensitivity sensitivity = Qt::CaseSensitive;
+#else
+ const Qt::CaseSensitivity sensitivity = Qt::CaseInsensitive;
+#endif
+
+ // Check if the .desktop file is installed as part of KDE or XDG.
+ const QStringList appsDirs = QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation);
+ Q_FOREACH (const QString &prefix, appsDirs) {
+ if (QDir(prefix).exists() && realPath.startsWith(QFileInfo(prefix).canonicalFilePath(), sensitivity))
+ return true;
+ }
+ const QString servicesDir = QLatin1String("kde5/services/"); // KGlobal::dirs()->xdgDataRelativePath("services")
+ Q_FOREACH (const QString &xdgDataPrefix, QStandardPaths::standardLocations(QStandardPaths::GenericDataLocation)) {
+ if (QDir(xdgDataPrefix).exists()) {
+ const QString prefix = QFileInfo(xdgDataPrefix).canonicalFilePath();
+ if (realPath.startsWith(prefix + QLatin1Char('/') + servicesDir, sensitivity))
+ return true;
+ }
+ }
+ const QString autostartDir = QLatin1String("autostart/");
+ Q_FOREACH (const QString &xdgDataPrefix, QStandardPaths::standardLocations(QStandardPaths::GenericConfigLocation)) {
+ if (QDir(xdgDataPrefix).exists()) {
+ const QString prefix = QFileInfo(xdgDataPrefix).canonicalFilePath();
+ if (realPath.startsWith(prefix + QLatin1Char('/') + autostartDir, sensitivity))
+ return true;
+ }
+ }
+
+ // Forbid desktop files outside of standard locations if kiosk is set so
+ if (!KAuthorized::authorize(QLatin1String("run_desktop_files"))) {
+ qWarning() << "Access to '" << path << "' denied because of 'run_desktop_files' restriction." << endl;
+ return false;
+ }
+
+ // Not otherwise permitted, so only allow if the file is executable, or if
+ // owned by root (uid == 0)
+ QFileInfo entryInfo( path );
+ if (entryInfo.isExecutable() || entryInfo.ownerId() == 0)
+ return true;
+
+ qWarning() << "Access to '" << path << "' denied, not owned by root, executable flag not set." << endl;
+ return false;
+}
+
+QString KDesktopFile::readType() const
+{
+ Q_D(const KDesktopFile);
+ return d->desktopGroup.readEntry("Type", QString());
+}
+
+QString KDesktopFile::readIcon() const
+{
+ Q_D(const KDesktopFile);
+ return d->desktopGroup.readEntry("Icon", QString());
+}
+
+QString KDesktopFile::readName() const
+{
+ Q_D(const KDesktopFile);
+ return d->desktopGroup.readEntry("Name", QString());
+}
+
+QString KDesktopFile::readComment() const
+{
+ Q_D(const KDesktopFile);
+ return d->desktopGroup.readEntry("Comment", QString());
+}
+
+QString KDesktopFile::readGenericName() const
+{
+ Q_D(const KDesktopFile);
+ return d->desktopGroup.readEntry("GenericName", QString());
+}
+
+QString KDesktopFile::readPath() const
+{
+ Q_D(const KDesktopFile);
+ // NOT readPathEntry, it is not XDG-compliant. Path entries written by
+ // KDE4 will be still treated as such, though.
+ return d->desktopGroup.readEntry("Path", QString());
+}
+
+QString KDesktopFile::readDevice() const
+{
+ Q_D(const KDesktopFile);
+ return d->desktopGroup.readEntry("Dev", QString());
+}
+
+QString KDesktopFile::readUrl() const
+{
+ Q_D(const KDesktopFile);
+ if (hasDeviceType()) {
+ return d->desktopGroup.readEntry("MountPoint", QString());
+ } else {
+ // NOT readPathEntry (see readPath())
+ QString url = d->desktopGroup.readEntry("URL", QString());
+ if ( !url.isEmpty() && !QDir::isRelativePath(url) )
+ {
+ // Handle absolute paths as such (i.e. we need to escape them)
+ return QUrl::fromLocalFile(url).toString();
+ }
+ return url;
+ }
+}
+
+QStringList KDesktopFile::readActions() const
+{
+ Q_D(const KDesktopFile);
+ return d->desktopGroup.readXdgListEntry("Actions");
+}
+
+KConfigGroup KDesktopFile::actionGroup(const QString &group)
+{
+ return KConfigGroup(this, QLatin1String("Desktop Action ") + group);
+}
+
+const KConfigGroup KDesktopFile::actionGroup(const QString& group) const
+{
+ return const_cast<KDesktopFile*>(this)->actionGroup(group);
+}
+
+bool KDesktopFile::hasActionGroup(const QString &group) const
+{
+ return hasGroup(QString(QLatin1String("Desktop Action ") + group).toUtf8().constData());
+}
+
+bool KDesktopFile::hasLinkType() const
+{
+ return readType() == QLatin1String("Link");
+}
+
+bool KDesktopFile::hasApplicationType() const
+{
+ return readType() == QLatin1String("Application");
+}
+
+bool KDesktopFile::hasDeviceType() const
+{
+ return readType() == QLatin1String("FSDevice");
+}
+
+bool KDesktopFile::tryExec() const
+{
+ Q_D(const KDesktopFile);
+ // Test for TryExec and "X-KDE-AuthorizeAction"
+ // NOT readPathEntry (see readPath())
+ QString te = d->desktopGroup.readEntry("TryExec", QString());
+
+ if (!te.isEmpty()) {
+ return !QStandardPaths::findExecutable(te).isEmpty();
+ }
+ const QStringList list = d->desktopGroup.readEntry("X-KDE-AuthorizeAction", QStringList());
+ if (!list.isEmpty())
+ {
+ for(QStringList::ConstIterator it = list.begin();
+ it != list.end();
+ ++it)
+ {
+ if (!KAuthorized::authorize((*it).trimmed()))
+ return false;
+ }
+ }
+
+ // See also KService::username()
+ bool su = d->desktopGroup.readEntry("X-KDE-SubstituteUID", false);
+ if (su)
+ {
+ QString user = d->desktopGroup.readEntry("X-KDE-Username", QString());
+ if (user.isEmpty())
+ user = QString::fromLocal8Bit(qgetenv("ADMIN_ACCOUNT"));
+ if (user.isEmpty())
+ user = QString::fromLatin1("root");
+ if (!KAuthorized::authorize(QString::fromLatin1("user/")+user))
+ return false;
+ }
+
+ return true;
+}
+
+/**
+ * @return the filename as passed to the constructor.
+ */
+//QString KDesktopFile::fileName() const { return backEnd->fileName(); }
+
+/**
+ * @return the resource type as passed to the constructor.
+ */
+//QString
+//KDesktopFile::resource() const { return backEnd->resource(); }
+
+QStringList
+KDesktopFile::sortOrder() const
+{
+ Q_D(const KDesktopFile);
+ return d->desktopGroup.readEntry("SortOrder", QStringList());
+}
+
+//void KDesktopFile::virtual_hook( int id, void* data )
+//{ KConfig::virtual_hook( id, data ); }
+
+QString KDesktopFile::readDocPath() const
+{
+ Q_D(const KDesktopFile);
+ //legacy entry in kde3 apps
+ if(d->desktopGroup.hasKey( "DocPath" ))
+ return d->desktopGroup.readPathEntry( "DocPath", QString() );
+ return d->desktopGroup.readPathEntry( "X-DocPath", QString() );
+}
+
+KDesktopFile* KDesktopFile::copyTo(const QString &file) const
+{
+ KDesktopFile *config = new KDesktopFile(QString());
+ this->KConfig::copyTo(file, config);
+// config->setDesktopGroup();
+ return config;
+}
+
+QStandardPaths::StandardLocation KDesktopFile::resource() const
+{
+ Q_D(const KDesktopFile);
+ return d->resourceType;
+}
+
+QString KDesktopFile::fileName() const
+{
+ return name();
+}
+
+bool KDesktopFile::noDisplay() const
+{
+ Q_D(const KDesktopFile);
+ if (d->desktopGroup.readEntry("NoDisplay", false)) {
+ return true;
+ }
+ if (d->desktopGroup.hasKey("OnlyShowIn")) {
+ if (!d->desktopGroup.readXdgListEntry("OnlyShowIn").contains(QLatin1String("KDE")))
+ return true;
+ }
+ if (d->desktopGroup.hasKey("NotShowIn")) {
+ if (d->desktopGroup.readXdgListEntry("NotShowIn").contains(QLatin1String("KDE")))
+ return true;
+ }
+ return false;
+}