allow package structures to say that external paths are ok. defaults to false, though some packagestructures that do not have executable code capabilities (e.g. wallpaper image sets) may wish to take advantage of this

CCBUG:180716

svn path=/trunk/KDE/kdelibs/; revision=911736
This commit is contained in:
Aaron J. Seigo 2009-01-16 01:02:35 +00:00
parent 4bc508411a
commit 023ae75d69
3 changed files with 39 additions and 4 deletions

View File

@ -139,6 +139,10 @@ QString Package::filePath(const char *fileType, const QString &filename) const
} }
if (QFile::exists(path)) { if (QFile::exists(path)) {
if (d->structure->allowExternalPaths()) {
return path;
}
// ensure that we don't return files outside of our base path // ensure that we don't return files outside of our base path
// due to symlink or ../ games // due to symlink or ../ games
QDir dir(path); QDir dir(path);
@ -171,6 +175,10 @@ QStringList Package::entryList(const char *fileType) const
QDir dir(d->basePath + d->structure->contentsPrefix() + path); QDir dir(d->basePath + d->structure->contentsPrefix() + path);
if (dir.exists()) { if (dir.exists()) {
if (d->structure->allowExternalPaths()) {
return dir.entryList(QDir::Files | QDir::Readable);
}
// ensure that we don't return files outside of our base path // ensure that we don't return files outside of our base path
// due to symlink or ../ games // due to symlink or ../ games
QString canonicalized = dir.canonicalPath(); QString canonicalized = dir.canonicalPath();

View File

@ -58,17 +58,19 @@ class ContentStructure
QString path; QString path;
QString name; QString name;
QStringList mimetypes; QStringList mimetypes;
bool directory; bool directory : 1;
bool required; bool required : 1;
}; };
class PackageStructurePrivate class PackageStructurePrivate
{ {
public: public:
PackageStructurePrivate() PackageStructurePrivate()
: metadata(0) : metadata(0),
externalPaths(false)
{ {
} }
~PackageStructurePrivate() ~PackageStructurePrivate()
{ {
delete metadata; delete metadata;
@ -76,6 +78,8 @@ public:
void createPackageMetadata(const QString &path); void createPackageMetadata(const QString &path);
static QHash<QString, PackageStructure::Ptr> structures;
QString type; QString type;
QString path; QString path;
QString contentsPrefix; QString contentsPrefix;
@ -83,8 +87,8 @@ public:
QString servicePrefix; QString servicePrefix;
QMap<QByteArray, ContentStructure> contents; QMap<QByteArray, ContentStructure> contents;
QStringList mimetypes; QStringList mimetypes;
static QHash<QString, PackageStructure::Ptr> structures;
PackageMetadata *metadata; PackageMetadata *metadata;
bool externalPaths;
}; };
QHash<QString, PackageStructure::Ptr> PackageStructurePrivate::structures; QHash<QString, PackageStructure::Ptr> PackageStructurePrivate::structures;
@ -491,6 +495,16 @@ PackageMetadata PackageStructure::metadata()
return *d->metadata; return *d->metadata;
} }
bool PackageStructure::allowExternalPaths() const
{
return d->externalPaths;
}
void PackageStructure::setAllowExternalPaths(bool allow)
{
d->externalPaths = allow;
}
} // Plasma namespace } // Plasma namespace
#include "packagestructure.moc" #include "packagestructure.moc"

View File

@ -278,6 +278,12 @@ public:
*/ */
virtual PackageMetadata metadata(); virtual PackageMetadata metadata();
/**
* @return true if paths/symlinks outside the package itself should be followed.
* By default this is set to false for security reasons.
*/
bool allowExternalPaths() const;
Q_SIGNALS: Q_SIGNALS:
/** /**
* Emitted when the new widget browser process completes. * Emitted when the new widget browser process completes.
@ -285,6 +291,13 @@ Q_SIGNALS:
void newWidgetBrowserFinished(); void newWidgetBrowserFinished();
protected: protected:
/**
* Sets whether or not external paths/symlinks can be followed by a package
* @arg allow true if paths/symlinks outside of the package should be followed,
* false if they should be rejected.
*/
void setAllowExternalPaths(bool allow);
/** /**
* Sets the prefix that all the contents in this package should * Sets the prefix that all the contents in this package should
* appear under. This defaults to "contents/" and is added automatically * appear under. This defaults to "contents/" and is added automatically