diff options
| author | 2018-06-04 21:05:54 -0400 | |
|---|---|---|
| committer | 2018-06-04 21:05:54 -0400 | |
| commit | 4d1efbbd1aa971401202bb1bd436742c57170980 (patch) | |
| tree | a3eb68d768223982546ee6bf35bd533b1e0905bc /src/lib/platform | |
| parent | 5f6625ebd476340745d578b08620dbe4d27d1a9b (diff) | |
| parent | 4a8bfd06e73d7f051f0b39e19e57616c7bbb8ad1 (diff) | |
Update upstream source from tag 'upstream/2.1.1+dfsg'
Update to upstream version '2.1.1+dfsg'
with Debian dir fae8a5463c58b9ee303cb04f24606a56a5a08fba
Diffstat (limited to 'src/lib/platform')
| -rw-r--r-- | src/lib/platform/MSWindowsHook.cpp | 3 | ||||
| -rw-r--r-- | src/lib/platform/MSWindowsUtil.cpp | 20 | ||||
| -rw-r--r-- | src/lib/platform/MSWindowsUtil.h | 7 | ||||
| -rw-r--r-- | src/lib/platform/MSWindowsWatchdog.cpp | 102 | ||||
| -rw-r--r-- | src/lib/platform/MSWindowsWatchdog.h | 7 |
5 files changed, 46 insertions, 93 deletions
diff --git a/src/lib/platform/MSWindowsHook.cpp b/src/lib/platform/MSWindowsHook.cpp index 929888e..2d7845a 100644 --- a/src/lib/platform/MSWindowsHook.cpp +++ b/src/lib/platform/MSWindowsHook.cpp @@ -22,6 +22,7 @@ #include "platform/ImmuneKeysReader.h" #include "barrier/protocol_types.h" #include "barrier/XScreen.h" +#include "common/DataDirectories.h" #include "base/Log.h" // @@ -52,7 +53,7 @@ static BYTE g_keyState[256] = { 0 }; static bool g_fakeServerInput = false; static std::vector<DWORD> g_immuneKeys; -static const std::string ImmuneKeysPath = ArchFileWindows().getProfileDirectory() + "\\ImmuneKeys.txt"; +static const std::string ImmuneKeysPath = DataDirectories::profile() + "\\ImmuneKeys.txt"; static std::vector<DWORD> immune_keys_list() { diff --git a/src/lib/platform/MSWindowsUtil.cpp b/src/lib/platform/MSWindowsUtil.cpp index 4b51781..b657906 100644 --- a/src/lib/platform/MSWindowsUtil.cpp +++ b/src/lib/platform/MSWindowsUtil.cpp @@ -62,3 +62,23 @@ MSWindowsUtil::getErrorString(HINSTANCE hinstance, DWORD error, DWORD id) return result; } } + +/* + +This is a quick and dirty iterative CreateDirectory() wrapper that does zero +error checking. A much better cross-platform option exists in C++17 via +std::filesystem. If/when the project is updated to use 17 this function should +absolutley be replaced! + +*/ + +void +MSWindowsUtil::createDirectory(const std::string& path, bool stripLast) +{ + // create parent directories + for (auto pos = path.find_first_of('\\'); pos != std::string::npos; pos = path.find_first_of('\\', pos + 1)) + CreateDirectory(path.substr(0, pos).c_str(), NULL); + if (!stripLast) + // create innermost directory + CreateDirectory(path.c_str(), NULL); +} diff --git a/src/lib/platform/MSWindowsUtil.h b/src/lib/platform/MSWindowsUtil.h index 95ec2cf..29eef2e 100644 --- a/src/lib/platform/MSWindowsUtil.h +++ b/src/lib/platform/MSWindowsUtil.h @@ -37,4 +37,11 @@ public: found return the string for \p id, replacing ${1} with \p error. */ static String getErrorString(HINSTANCE, DWORD error, DWORD id); + + //! Create directory + /*! + Create directory \p recursively optionally stripping the last component + (presumably the filename) if \p is set. + */ + static void createDirectory(const std::string& path, bool stripLast = false); }; diff --git a/src/lib/platform/MSWindowsWatchdog.cpp b/src/lib/platform/MSWindowsWatchdog.cpp index ba1890e..9856b5d 100644 --- a/src/lib/platform/MSWindowsWatchdog.cpp +++ b/src/lib/platform/MSWindowsWatchdog.cpp @@ -44,7 +44,20 @@ enum { typedef VOID (WINAPI *SendSas)(BOOL asUser); -const char g_activeDesktop[] = {"activeDesktop:"}; +std::string activeDesktopName() +{ + const std::size_t BufferLength = 1024; + std::string name; + HDESK desk = OpenInputDesktop(0, FALSE, GENERIC_READ); + if (desk != NULL) { + TCHAR buffer[BufferLength]; + if (GetUserObjectInformation(desk, UOI_NAME, buffer, BufferLength - 1, NULL) == TRUE) + name = buffer; + CloseDesktop(desk); + } + LOG((CLOG_DEBUG "found desktop name: %.64s", name.c_str())); + return name; +} MSWindowsWatchdog::MSWindowsWatchdog( bool daemonized, @@ -64,22 +77,8 @@ MSWindowsWatchdog::MSWindowsWatchdog( m_processRunning(false), m_fileLogOutputter(NULL), m_autoElevated(false), - m_ready(false), m_daemonized(daemonized) { - m_mutex = ARCH->newMutex(); - m_condVar = ARCH->newCondVar(); -} - -MSWindowsWatchdog::~MSWindowsWatchdog() -{ - if (m_condVar != NULL) { - ARCH->closeCondVar(m_condVar); - } - - if (m_mutex != NULL) { - ARCH->closeMutex(m_mutex); - } } void @@ -288,12 +287,9 @@ MSWindowsWatchdog::startProcess() if (!m_daemonized) { createRet = doStartProcessAsSelf(m_command); } else { - SECURITY_ATTRIBUTES sa; - ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES)); - - getActiveDesktop(&sa); + m_autoElevated = activeDesktopName() != "Default"; - ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES)); + SECURITY_ATTRIBUTES sa{ 0 }; HANDLE userToken = getUserToken(&sa); m_elevateProcess = m_autoElevated ? m_autoElevated : m_elevateProcess; m_autoElevated = false; @@ -408,7 +404,7 @@ MSWindowsWatchdog::getCommand() const } // seems like a fairly convoluted way to get the process name - const char* launchName = App::instance().argsBase().m_pname; + const char* launchName = App::instance().argsBase().m_exename.c_str(); std::string args = ARCH->commandLine(); // build up a full command line @@ -444,11 +440,7 @@ MSWindowsWatchdog::outputLoop(void*) } else { buffer[bytesRead] = '\0'; - - testOutput(buffer); - m_ipcLogOutputter.write(kINFO, buffer); - if (m_fileLogOutputter != NULL) { m_fileLogOutputter->write(kINFO, buffer); } @@ -549,63 +541,3 @@ MSWindowsWatchdog::shutdownExistingProcesses() CloseHandle(snapshot); m_processRunning = false; } - -void -MSWindowsWatchdog::getActiveDesktop(LPSECURITY_ATTRIBUTES security) -{ - String installedDir = ARCH->getInstalledDirectory(); - if (!installedDir.empty()) { - String syntoolCommand; - syntoolCommand.append("\"").append(installedDir).append("\\").append("syntool").append("\""); - syntoolCommand.append(" --get-active-desktop"); - - m_session.updateActiveSession(); - bool elevateProcess = m_elevateProcess; - m_elevateProcess = true; - HANDLE userToken = getUserToken(security); - m_elevateProcess = elevateProcess; - - BOOL createRet = doStartProcessAsUser(syntoolCommand, userToken, security); - - if (!createRet) { - DWORD rc = GetLastError(); - RevertToSelf(); - } - else { - LOG((CLOG_DEBUG "launched syntool to check active desktop")); - } - - ARCH->lockMutex(m_mutex); - int waitTime = 0; - while (!m_ready) { - if (waitTime >= MAXIMUM_WAIT_TIME) { - break; - } - - ARCH->waitCondVar(m_condVar, m_mutex, 1.0); - waitTime++; - } - m_ready = false; - ARCH->unlockMutex(m_mutex); - } -} - -void -MSWindowsWatchdog::testOutput(String buffer) -{ - // HACK: check standard output seems hacky. - size_t i = buffer.find(g_activeDesktop); - if (i != String::npos) { - size_t s = sizeof(g_activeDesktop); - String defaultDesktop("Default"); - String sub = buffer.substr(i + s - 1, defaultDesktop.size()); - if (sub != defaultDesktop) { - m_autoElevated = true; - } - - ARCH->lockMutex(m_mutex); - m_ready = true; - ARCH->broadcastCondVar(m_condVar); - ARCH->unlockMutex(m_mutex); - } -} diff --git a/src/lib/platform/MSWindowsWatchdog.h b/src/lib/platform/MSWindowsWatchdog.h index 64ffab3..7a1f661 100644 --- a/src/lib/platform/MSWindowsWatchdog.h +++ b/src/lib/platform/MSWindowsWatchdog.h @@ -39,7 +39,6 @@ public: bool autoDetectCommand, IpcServer& ipcServer, IpcLogOutputter& ipcLogOutputter); - virtual ~MSWindowsWatchdog(); void startAsync(); std::string getCommand() const; @@ -58,9 +57,6 @@ private: void startProcess(); BOOL doStartProcessAsUser(String& command, HANDLE userToken, LPSECURITY_ATTRIBUTES sa); BOOL doStartProcessAsSelf(String& command); - void sendSas(); - void getActiveDesktop(LPSECURITY_ATTRIBUTES security); - void testOutput(String buffer); private: Thread* m_thread; @@ -80,9 +76,6 @@ private: bool m_processRunning; FileLogOutputter* m_fileLogOutputter; bool m_autoElevated; - ArchMutex m_mutex; - ArchCond m_condVar; - bool m_ready; bool m_daemonized; }; |
