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