summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSlávek Banko <slavek.banko@axis.cz>2019-12-02 23:24:31 +0100
committerSlávek Banko <slavek.banko@axis.cz>2019-12-02 23:24:31 +0100
commit38b2b0be7840d868c21093a406ab98a646212de1 (patch)
treec5dde84eeca51ae264fa9cdb62dae0b7564147f0
parent0810a81ba195c1a45c4377aa30f483184e098348 (diff)
downloadtdelibs-38b2b0be7840d868c21093a406ab98a646212de1.tar.gz
tdelibs-38b2b0be7840d868c21093a406ab98a646212de1.zip
Process the new location of the ICEauthority file
+ our internal implementation of IceAuthFileName tests whether the ICEauthority file exists in the folder specified by the XDG_RUNTIME_DIR variable + DCOP client tests whether the ICEauthority file for a specific user exists in the user's folder based on the XDG_RUNTIME_DIR variable + tdeinit uses the IceAuthFileName() function instead of building the file name This relates to bug 3027. Signed-off-by: Slávek Banko <slavek.banko@axis.cz>
-rw-r--r--dcop/KDE-ICE/authutil.c78
-rw-r--r--dcop/client/dcop.cpp26
-rw-r--r--tdeinit/CMakeLists.txt2
-rw-r--r--tdeinit/tdeinit.cpp8
4 files changed, 82 insertions, 32 deletions
diff --git a/dcop/KDE-ICE/authutil.c b/dcop/KDE-ICE/authutil.c
index 41a2eefaa..da52b1cf3 100644
--- a/dcop/KDE-ICE/authutil.c
+++ b/dcop/KDE-ICE/authutil.c
@@ -81,11 +81,13 @@ char *
IceAuthFileName ()
{
+ static char baseICEauthority[] = "ICEauthority";
#ifdef _WIN32
- static char slashDotICEauthority[] = "\\.ICEauthority";
+ static char pathSep[] = "\\";
#else
- static char slashDotICEauthority[] = "/.ICEauthority";
+ static char pathSep[] = "/";
#endif
+ char fileSep[2];
char *name;
static char *buf;
static int bsize;
@@ -95,37 +97,70 @@ IceAuthFileName ()
#endif
name = getenv ("ICEAUTHORITY");
- if ( name )
+ if (name && name[0])
return (name);
- name = getenv ("HOME");
+ name = getenv("XDG_RUNTIME_DIR");
+ if (name && name[0])
+ {
+ char *testBuf;
+ strcpy(fileSep, "");
+ size = strlen(name) + strlen(pathSep) + strlen(fileSep) + strlen(baseICEauthority) + 1;
+ testBuf = malloc(size);
+ if (!testBuf)
+ {
+ return (NULL);
+ }
+ snprintf(testBuf, size, "%s%s%s%s", name, pathSep, fileSep, baseICEauthority);
+ if (access(testBuf, F_OK))
+ {
+ name = NULL;
+ }
+ free(testBuf);
+ }
- if (!name)
+ if (!name || !name[0])
{
+ name = getenv ("HOME");
+ strcpy(fileSep, ".");
#ifdef _WIN32
- if(name = getenv ("HOMEDRIVE"))
+ if (!name || !name[0])
{
- strcpy (dir, name);
- if(name = getenv ("HOMEPATH"))
- strcat (dir, name);
- }
- else
+ if(name = getenv ("HOMEDRIVE"))
+ {
+ strcpy (dir, name);
+ if(name = getenv ("HOMEPATH"))
{
- if(name = getenv ("USERPROFILE"))
- strcpy (dir, name);
- }
- name = dir;
- if (!name)
+ strcat (dir, name);
+ }
+ name = dir;
+ }
+ else
+ {
+ name = getenv ("USERPROFILE");
+ }
+ }
#endif
#ifdef __EMX__
- strcpy (dir,"c:");
- name = dir;
- if (!name)
+ if (!name || !name[0])
+ {
+ strcpy (dir,"c:");
+ name = dir;
+ }
#endif
+ }
+ if (!name || !name[0])
+ {
return (NULL);
}
- size = strlen (name) + strlen (&slashDotICEauthority[1]) + 2;
+ /* Special case for "/". We will add our own '/' later. */
+ if (strcmp(name, pathSep) == 0)
+ {
+ name++;
+ }
+
+ size = strlen(name) + strlen(pathSep) + strlen(fileSep) + strlen(baseICEauthority) + 1;
if (size > bsize)
{
@@ -137,8 +172,7 @@ IceAuthFileName ()
bsize = size;
}
- strcpy (buf, name);
- strcat (buf, slashDotICEauthority + (name[1] == '\0' ? 1 : 0));
+ snprintf(buf, bsize, "%s%s%s%s", name, pathSep, fileSep, baseICEauthority);
return (buf);
}
diff --git a/dcop/client/dcop.cpp b/dcop/client/dcop.cpp
index 8aa1ea59d..698479612 100644
--- a/dcop/client/dcop.cpp
+++ b/dcop/client/dcop.cpp
@@ -594,9 +594,29 @@ int runDCOP( QCStringList args, UserList users, Session session,
( getenv( "ICEAUTHORITY" ) == 0 || getenv( "DISPLAY" ) == 0 ) ) )
{
// Check for ICE authority file and if the file can be read by us
- TQString home = it.data();
- TQString iceFile = it.data() + "/.ICEauthority";
- TQFileInfo fi( iceFile );
+ TQString iceFileBase = "ICEauthority";
+ TQString iceFile;
+ TQFileInfo fi;
+
+ if (getenv("XDG_RUNTIME_DIR") != 0 )
+ {
+ TQFileInfo xdgRuntime(getenv("XDG_RUNTIME_DIR"));
+ passwd* pstruct = getpwnam(it.key().local8Bit());
+ if (pstruct)
+ {
+ iceFile = TQString("%1/%2/%3").arg(xdgRuntime.dirPath()).arg(pstruct->pw_uid).arg(iceFileBase);
+ fi.setFile(iceFile);
+ }
+ if (!pstruct || !fi.exists())
+ {
+ iceFile = TQString::null;
+ }
+ }
+ if (iceFile.isEmpty())
+ {
+ iceFile = TQString("%1/.%2").arg(it.data()).arg(iceFileBase);
+ fi.setFile(iceFile);
+ }
if( iceFile.isEmpty() )
{
cerr_ << "WARNING: Cannot determine home directory for user "
diff --git a/tdeinit/CMakeLists.txt b/tdeinit/CMakeLists.txt
index 346bfa20e..f6347899b 100644
--- a/tdeinit/CMakeLists.txt
+++ b/tdeinit/CMakeLists.txt
@@ -40,7 +40,7 @@ set( ${target}_SRCS
tde_add_executable( ${target}
SOURCES ${${target}_SRCS}
- LINK ltdlc-static tdeparts-shared ${XFT_LIBRARIES}
+ LINK kICE-static ltdlc-static tdeparts-shared ${XFT_LIBRARIES}
DESTINATION ${BIN_INSTALL_DIR}
)
diff --git a/tdeinit/tdeinit.cpp b/tdeinit/tdeinit.cpp
index 566a8bda0..78ed1e7c4 100644
--- a/tdeinit/tdeinit.cpp
+++ b/tdeinit/tdeinit.cpp
@@ -59,6 +59,7 @@
#include <klibloader.h>
#include <tdeapplication.h>
#include <tdelocale.h>
+#include <dcopglobal.h>
#ifdef HAVE_SYS_PRCTL_H
#include <sys/prctl.h>
@@ -852,12 +853,7 @@ static void init_tdeinit_socket()
exit(255);
}
}
- path = getenv("ICEAUTHORITY");
- if (path.isEmpty())
- {
- path = home_dir;
- path += "/.ICEauthority";
- }
+ path = IceAuthFileName();
if (access(path.data(), R_OK|W_OK) && (errno != ENOENT))
{
fprintf(stderr, "[tdeinit] Aborting. No write access to '%s'.\n", path.data());