00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
#include <stdlib.h>
00025
#include <unistd.h>
00026
00027
#include <qfile.h>
00028
#include <qdir.h>
00029
#include <qtextstream.h>
00030
00031
#include <kdebug.h>
00032
#include "kurl.h"
00033
#include "kconfigbackend.h"
00034
#include "kapplication.h"
00035
#include "kstandarddirs.h"
00036
#include "kmountpoint.h"
00037
00038
#include "kdesktopfile.h"
00039
#include "kdesktopfile.moc"
00040
00041 KDesktopFile::KDesktopFile(
const QString &fileName,
bool bReadOnly,
00042
const char * resType)
00043 :
KConfig(
QString::fromLatin1(""), bReadOnly, false)
00044 {
00045
00046
00047
00048 backEnd->
changeFileName(fileName, resType,
false);
00049 setReadOnly(bReadOnly);
00050
reparseConfiguration();
00051
setDesktopGroup();
00052 }
00053
00054 KDesktopFile::~KDesktopFile()
00055 {
00056
00057 }
00058
00059 QString KDesktopFile::locateLocal(
const QString &path)
00060 {
00061
QString local;
00062
if (path.
endsWith(
".directory"))
00063 {
00064 local = path;
00065
if (!QDir::isRelativePath(local))
00066 {
00067
00068 local =
KGlobal::dirs()->
relativeLocation(
"apps", path);
00069 }
00070
00071
if (QDir::isRelativePath(local))
00072 {
00073 local = ::locateLocal(
"apps", local);
00074 }
00075
else
00076 {
00077
00078
00079 local =
KGlobal::dirs()->
relativeLocation(
"xdgdata-dirs", local);
00080
if (!QDir::isRelativePath(local))
00081 {
00082
00083
00084 local = path.
mid(path.findRev(
'/')+1);
00085 }
00086 local = ::locateLocal(
"xdgdata-dirs", local);
00087 }
00088 }
00089
else
00090 {
00091
if (QDir::isRelativePath(path))
00092 {
00093 local = ::locateLocal(
"apps", path);
00094 }
00095
else
00096 {
00097
00098
00099 local =
KGlobal::dirs()->
relativeLocation(
"xdgdata-apps", path);
00100
if (!QDir::isRelativePath(local))
00101 {
00102
00103 local = path.
mid(path.
findRev(
'/')+1);
00104 }
00105 local = ::locateLocal(
"xdgdata-apps", local);
00106 }
00107 }
00108
return local;
00109 }
00110
00111 bool KDesktopFile::isDesktopFile(
const QString& path)
00112 {
00113
int len = path.
length();
00114
00115
if(len > 8 && path.
right(8) == QString::fromLatin1(
".desktop"))
00116
return true;
00117
else if(len > 7 && path.
right(7) == QString::fromLatin1(
".kdelnk"))
00118
return true;
00119
else
00120
return false;
00121 }
00122
00123 bool KDesktopFile::isAuthorizedDesktopFile(
const QString& path)
00124 {
00125
if (!kapp || kapp->authorize(
"run_desktop_files"))
00126
return true;
00127
00128
if (path.
isEmpty())
00129
return false;
00130
00131
if (QDir::isRelativePath(path))
00132
return true;
00133
00134
KStandardDirs *dirs =
KGlobal::dirs();
00135
if (QDir::isRelativePath( dirs->
relativeLocation(
"apps", path) ))
00136
return true;
00137
if (QDir::isRelativePath( dirs->
relativeLocation(
"xdgdata-apps", path) ))
00138
return true;
00139
if (QDir::isRelativePath( dirs->
relativeLocation(
"services", path) ))
00140
return true;
00141
if (dirs->
relativeLocation(
"data", path).
startsWith(
"kdesktop/Desktop"))
00142
return true;
00143
00144 kdWarning() <<
"Access to '" << path <<
"' denied because of 'run_desktop_files' restriction." <<
endl;
00145
return false;
00146 }
00147
00148 QString KDesktopFile::readType()
const
00149
{
00150
return readEntry(
"Type");
00151 }
00152
00153 QString KDesktopFile::readIcon()
const
00154
{
00155
return readEntry(
"Icon");
00156 }
00157
00158 QString KDesktopFile::readName()
const
00159
{
00160
return readEntry(
"Name");
00161 }
00162
00163 QString KDesktopFile::readComment()
const
00164
{
00165
return readEntry(
"Comment");
00166 }
00167
00168 QString KDesktopFile::readGenericName()
const
00169
{
00170
return readEntry(
"GenericName");
00171 }
00172
00173 QString KDesktopFile::readPath()
const
00174
{
00175
return readPathEntry(
"Path");
00176 }
00177
00178 QString KDesktopFile::readDevice()
const
00179
{
00180
return readEntry(
"Dev");
00181 }
00182
00183 QString KDesktopFile::readURL()
const
00184
{
00185
if (
hasDeviceType()) {
00186
QString device =
readDevice();
00187
KMountPoint::List mountPoints = KMountPoint::possibleMountPoints();
00188
00189
for(KMountPoint::List::ConstIterator it = mountPoints.
begin();
00190 it != mountPoints.
end(); ++it)
00191 {
00192
KMountPoint *mp = *it;
00193
if (mp->
mountedFrom() == device)
00194 {
00195
KURL u;
00196 u.
setPath( mp->
mountPoint() );
00197
return u.
url();
00198 }
00199 }
00200
return QString::null;
00201 }
else {
00202
QString url = readPathEntry(
"URL");
00203
if ( !url.
isEmpty() && !QDir::isRelativePath(url) )
00204 {
00205
00206
KURL u;
00207 u.
setPath( url );
00208
return u.
url();
00209 }
00210
return url;
00211 }
00212 }
00213
00214 QStringList KDesktopFile::readActions()
const
00215
{
00216
return readListEntry(
"Actions",
';');
00217 }
00218
00219 void KDesktopFile::setActionGroup(
const QString &group)
00220 {
00221 setGroup(QString::fromLatin1(
"Desktop Action ") + group);
00222 }
00223
00224 bool KDesktopFile::hasActionGroup(
const QString &group)
const
00225
{
00226
return hasGroup(QString::fromLatin1(
"Desktop Action ") + group);
00227 }
00228
00229 bool KDesktopFile::hasLinkType()
const
00230
{
00231
return readEntry(
"Type") == QString::fromLatin1(
"Link");
00232 }
00233
00234 bool KDesktopFile::hasApplicationType()
const
00235
{
00236
return readEntry(
"Type") == QString::fromLatin1(
"Application");
00237 }
00238
00239 bool KDesktopFile::hasMimeTypeType()
const
00240
{
00241
return readEntry(
"Type") == QString::fromLatin1(
"MimeType");
00242 }
00243
00244 bool KDesktopFile::hasDeviceType()
const
00245
{
00246
return readEntry(
"Type") == QString::fromLatin1(
"FSDev") ||
00247 readEntry(
"Type") == QString::fromLatin1(
"FSDevice");
00248 }
00249
00250 bool KDesktopFile::tryExec()
const
00251
{
00252
00253
QString te = readPathEntry(
"TryExec");
00254
00255
if (!te.
isEmpty()) {
00256
if (!QDir::isRelativePath(te)) {
00257
if (::access(QFile::encodeName(te), X_OK))
00258
return false;
00259 }
else {
00260
00261
00262
00263
QStringList dirs = QStringList::split(
':', QFile::decodeName(::getenv(
"PATH")));
00264 QStringList::Iterator it(dirs.begin());
00265
bool match =
false;
00266
for (; it != dirs.end(); ++it) {
00267
QString fName = *it +
"/" + te;
00268
if (::access(QFile::encodeName(fName), X_OK) == 0)
00269 {
00270 match =
true;
00271
break;
00272 }
00273 }
00274
00275
if (!match)
00276
return false;
00277 }
00278 }
00279
QStringList list = readListEntry(
"X-KDE-AuthorizeAction");
00280
if (kapp && !list.isEmpty())
00281 {
00282
for(QStringList::ConstIterator it = list.begin();
00283 it != list.end();
00284 ++it)
00285 {
00286
if (!kapp->authorize((*it).stripWhiteSpace()))
00287
return false;
00288 }
00289 }
00290
00291
00292
bool su = readBoolEntry(
"X-KDE-SubstituteUID");
00293
if (su)
00294 {
00295
QString user = readEntry(
"X-KDE-Username");
00296
if (user.
isEmpty())
00297 user = ::getenv(
"ADMIN_ACCOUNT");
00298
if (user.
isEmpty())
00299 user =
"root";
00300
if (!kapp->authorize(
"user/"+user))
00301
return false;
00302 }
00303
00304
return true;
00305 }
00306
00310
QString
00311 KDesktopFile::fileName()
const {
return backEnd->
fileName(); }
00312
00316
QString
00317 KDesktopFile::resource()
const {
return backEnd->
resource(); }
00318
00319
QStringList
00320 KDesktopFile::sortOrder()
const
00321
{
00322
return readListEntry(
"SortOrder");
00323 }
00324
00325
void KDesktopFile::virtual_hook(
int id,
void* data )
00326 { KConfig::virtual_hook(
id, data ); }
00327
00328 QString KDesktopFile::readDocPath()
const
00329
{
00330
00331
00332
if(hasKey(
"DocPath" ))
00333
return readPathEntry(
"DocPath" );
00334
00335
return readPathEntry(
"X-DocPath" );
00336 }
00337
00338 KDesktopFile*
KDesktopFile::copyTo(
const QString &file)
const
00339
{
00340
KDesktopFile *config =
new KDesktopFile(QString::null,
false);
00341 KConfig::copyTo(file, config);
00342 config->
setDesktopGroup();
00343
return config;
00344 }
00345
00346