diff options
author | Slávek Banko <slavek.banko@axis.cz> | 2019-12-02 23:24:31 +0100 |
---|---|---|
committer | Slávek Banko <slavek.banko@axis.cz> | 2019-12-02 23:24:31 +0100 |
commit | 38b2b0be7840d868c21093a406ab98a646212de1 (patch) | |
tree | c5dde84eeca51ae264fa9cdb62dae0b7564147f0 | |
parent | 0810a81ba195c1a45c4377aa30f483184e098348 (diff) | |
download | tdelibs-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.c | 78 | ||||
-rw-r--r-- | dcop/client/dcop.cpp | 26 | ||||
-rw-r--r-- | tdeinit/CMakeLists.txt | 2 | ||||
-rw-r--r-- | tdeinit/tdeinit.cpp | 8 |
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()); |