You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tde-packaging/redhat/kdelibs/kdelibs-3.5.13-add_readonly...

249 lines
7.5 KiB

commit d3a9d56143cf668c7d29b26a324a424d02036371
Author: Timothy Pearson <kb9vqf@pearsoncomputing.net>
Date: 1337109016 -0500
Add the ability to force read-only configuration file access in a TDE application
Force kde-config to use read-only access
This closes Bug 293
diff --git a/kdecore/kconfigbackend.cpp b/kdecore/kconfigbackend.cpp
index 9ee9dd6..4ad0e5f 100644
--- a/kdecore/kconfigbackend.cpp
+++ b/kdecore/kconfigbackend.cpp
@@ -247,17 +247,22 @@ void KConfigBackEnd::changeFileName(const TQString &_fileName,
mfileName = _fileName;
resType = _resType;
useKDEGlobals = _useKDEGlobals;
- if (mfileName.isEmpty())
+ if (mfileName.isEmpty()) {
mLocalFileName = TQString::null;
- else if (!TQDir::isRelativePath(mfileName))
+ }
+ else if (!TQDir::isRelativePath(mfileName)) {
mLocalFileName = mfileName;
- else
- mLocalFileName = KGlobal::dirs()->saveLocation(resType) + mfileName;
+ }
+ else {
+ mLocalFileName = KGlobal::dirs()->saveLocation(resType, TQString(), false) + mfileName;
+ }
- if (useKDEGlobals)
+ if (useKDEGlobals) {
mGlobalFileName = KGlobal::dirs()->saveLocation("config", TQString(), false) + TQString::fromLatin1("kdeglobals");
- else
+ }
+ else {
mGlobalFileName = TQString::null;
+ }
d->localLastModified = TQDateTime();
d->localLastSize = 0;
diff --git a/kdecore/kconfigbase.cpp b/kdecore/kconfigbase.cpp
index 9ad6600..c5c0a4e 100644
--- a/kdecore/kconfigbase.cpp
+++ b/kdecore/kconfigbase.cpp
@@ -1139,16 +1139,18 @@ static TQString translatePath( TQString path )
// return original path, if it refers to another type of URL (e.g. http:/), or
// if the path is already relative to another directory
- if (!startsWithFile && path[0] != '/' ||
- startsWithFile && path[5] != '/')
+ if (((!startsWithFile) && (path[0] != '/')) || (startsWithFile && (path[5] != '/'))) {
return path;
+ }
- if (startsWithFile)
+ if (startsWithFile) {
path.remove(0,5); // strip leading "file:/" off the string
+ }
// keep only one single '/' at the beginning - needed for cleanHomeDirPath()
- while (path[0] == '/' && path[1] == '/')
+ while (path[0] == '/' && path[1] == '/') {
path.remove(0,1);
+ }
// we can not use KGlobal::dirs()->relativeLocation("home", path) here,
// since it would not recognize paths without a trailing '/'.
diff --git a/kdecore/kinstance.cpp b/kdecore/kinstance.cpp
index fe0a515..5b3aa86 100644
--- ./kdecore/kinstance.cpp.orig 2011-08-11 04:30:15.000000000 +0200
+++ ./kdecore/kinstance.cpp 2012-06-19 21:14:21.569741870 +0200
@@ -70,7 +70,7 @@
: _dirs (0L),
_config (0L),
_iconLoader (0L),
- _name( name ), _aboutData( new KAboutData( name, "", 0 ) )
+ _name( name ), _aboutData( new KAboutData( name, "", 0 ) ), m_configReadOnly(false)
{
DEBUG_ADD
Q_ASSERT(!name.isEmpty());
@@ -88,7 +88,7 @@
: _dirs (0L),
_config (0L),
_iconLoader (0L),
- _name( aboutData->appName() ), _aboutData( aboutData )
+ _name( aboutData->appName() ), _aboutData( aboutData ), m_configReadOnly(false)
{
DEBUG_ADD
Q_ASSERT(!_name.isEmpty());
@@ -107,7 +107,7 @@
: _dirs ( src->_dirs ),
_config ( src->_config ),
_iconLoader ( src->_iconLoader ),
- _name( src->_name ), _aboutData( src->_aboutData )
+ _name( src->_name ), _aboutData( src->_aboutData ), m_configReadOnly(false)
{
DEBUG_ADD
Q_ASSERT(!_name.isEmpty());
@@ -174,6 +174,11 @@
extern bool kde_kiosk_exception;
extern bool kde_kiosk_admin;
+void KInstance::setConfigReadOnly(bool ro)
+{
+ m_configReadOnly = ro;
+}
+
KConfig *KInstance::config() const
{
DEBUG_CHECK_ALIVE
@@ -198,10 +203,12 @@
if ( d->sharedConfig == 0 )
{
- if ( !_name.isEmpty() )
- d->sharedConfig = KSharedConfig::openConfig( _name + "rc");
- else
+ if ( !_name.isEmpty() ) {
+ d->sharedConfig = KSharedConfig::openConfig( _name + "rc", m_configReadOnly );
+ }
+ else {
d->sharedConfig = KSharedConfig::openConfig( TQString::null );
+ }
}
// Check if we are excempt from kiosk restrictions
@@ -211,7 +218,7 @@
d->sharedConfig = 0;
return config(); // Reread...
}
-
+
_config = d->sharedConfig;
if (_dirs)
if (_dirs->addCustomized(_config))
diff --git a/kdecore/kinstance.h b/kdecore/kinstance.h
index 75cc4b4..444a2d8 100644
--- a/kdecore/kinstance.h
+++ b/kdecore/kinstance.h
@@ -69,7 +69,7 @@ class kdecore_EXPORT KInstance
* Only for K(Unique)Application
* Initialize from src and delete it.
*/
-
+
KInstance( KInstance* src );
/**
@@ -96,6 +96,14 @@ class kdecore_EXPORT KInstance
KSharedConfig *sharedConfig() const;
/**
+ * Set a read-only flag on the configuration files
+ * This must be called before config() or dirs() to have any effect
+ * Defaults to FALSE
+ * @param ro read only if TRUE
+ */
+ void setConfigReadOnly(bool ro);
+
+ /**
* Returns an iconloader object.
* @return the iconloader object.
*/
@@ -162,6 +170,7 @@ protected:
virtual void virtual_hook( int id, void* data );
private:
KInstancePrivate *d;
+ bool m_configReadOnly;
};
#endif
diff --git a/kdecore/kstandarddirs.cpp b/kdecore/kstandarddirs.cpp
index bce4bf4..bb8ae97 100644
--- a/kdecore/kstandarddirs.cpp.orig 2011-08-21 06:15:32.000000000 +0200
+++ b/kdecore/kstandarddirs.cpp 2012-06-19 21:17:34.550007910 +0200
@@ -451,13 +450,17 @@
bool KStandardDirs::exists(const TQString &fullPath)
{
KDE_struct_stat buff;
- if (access(TQFile::encodeName(fullPath), R_OK) == 0 && KDE_stat( TQFile::encodeName(fullPath), &buff ) == 0)
+ if ((access(TQFile::encodeName(fullPath), R_OK) == 0) && (KDE_stat( TQFile::encodeName(fullPath), &buff ) == 0)) {
if (fullPath.tqat(fullPath.length() - 1) != QChar('/')) {
if (S_ISREG( buff.st_mode ))
return true;
- } else
- if (S_ISDIR( buff.st_mode ))
+ }
+ else {
+ if (S_ISDIR( buff.st_mode )) {
return true;
+ }
+ }
+ }
return false;
}
@@ -767,17 +770,23 @@
srv = findExe(TQString::tqfromLatin1("lnusertemp"));
if (!srv.isEmpty())
{
- system(TQFile::encodeName(srv)+" "+type);
- result = readlink(TQFile::encodeName(dir).data(), link, 1023);
+ if (system(TQFile::encodeName(srv)+" "+type) < 0 ) {
+ result = readlink(TQFile::encodeName(dir).data(), link, 1023);
+ }
+ else {
+ result = -1;
+ }
}
}
if (result > 0)
{
link[result] = 0;
- if (link[0] == TQChar('/').latin1())
+ if (link[0] == TQChar('/').latin1()) {
dir = TQFile::decodeName(link);
- else
+ }
+ else {
dir = TQDir::cleanDirPath(dir+TQFile::decodeName(link));
+ }
}
#endif
addResourceDir(type, dir+QChar('/'));
@@ -1139,8 +1148,9 @@
}
dircache.remove(type);
}
- if (!fullPath.endsWith("/"))
+ if (!fullPath.endsWith("/")) {
fullPath += "/";
+ }
return fullPath;
}
diff --git a/kdecore/kde-config.cpp.in b/kdecore/kde-config.cpp.in
index 90c5dae..c988b00 100644
--- a/kdecore/kde-config.cpp.in
+++ b/kdecore/kde-config.cpp.in
@@ -120,6 +120,7 @@ int main(int argc, char **argv)
KCmdLineArgs::addCmdLineOptions( options ); // Add my own options.
KInstance a("kde-config");
+ a.setConfigReadOnly(TRUE);
(void)KGlobal::dirs(); // trigger the creation
(void)KGlobal::config();