From 288acf0ec0b0688abbd1e432612a33fa60c24373 Mon Sep 17 00:00:00 2001 From: Bryan Roe Date: Tue, 22 Mar 2022 22:25:47 -0700 Subject: [PATCH] 1. Added logging helper to KVM child 2. Added logic to support virtual kvm session for linux --- meshcore/KVM/Windows/kvm.c | 4 +++ meshcore/agentcore.c | 68 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 69 insertions(+), 3 deletions(-) diff --git a/meshcore/KVM/Windows/kvm.c b/meshcore/KVM/Windows/kvm.c index 0116aaa..5f98b8f 100644 --- a/meshcore/KVM/Windows/kvm.c +++ b/meshcore/KVM/Windows/kvm.c @@ -36,6 +36,8 @@ limitations under the License. #include #endif +extern void KVM_WriteLog(ILibKVM_WriteHandler writeHandler, void *user, char *format, ...); + //#define KVMDEBUGENABLED 1 ILibProcessPipe_SpawnTypes gProcessSpawnType = ILibProcessPipe_SpawnTypes_USER; int gProcessTSID = -1; @@ -473,12 +475,14 @@ int kvm_server_inputdata(char* block, int blocklen, ILibKVM_WriteHandler writeHa case MNG_KVM_KEY: // Key { if (size != 6) break; + //KVM_WriteLog(writeHandler, reserved, "Key[%u] UP: %d", (unsigned char)(block[5]), block[4]); KeyAction(block[5], block[4]); break; } case MNG_KVM_KEY_UNICODE: // Unicode key { if (size != 7) break; + //KVM_WriteLog(writeHandler, reserved, "UnicodeKey[%u] UP: %d", ((((unsigned char)block[5]) << 8) + ((unsigned char)block[6])), block[4]); KeyActionUnicode(((((unsigned char)block[5]) << 8) + ((unsigned char)block[6])), block[4]); break; } diff --git a/meshcore/agentcore.c b/meshcore/agentcore.c index b7c4fb4..6038ade 100644 --- a/meshcore/agentcore.c +++ b/meshcore/agentcore.c @@ -100,6 +100,7 @@ char exeMeshPolicyGuid[] = { 0xB9, 0x96, 0x01, 0x58, 0x80, 0x54, 0x4A, 0x19, 0xB #define DEFAULT_IDLE_TIMEOUT 120 #define MESH_USER_CHANGED_CB "\xFF_MeshAgent_UserChangedCallback" #define REMOTE_DESKTOP_UID "\xFF_RemoteDesktopUID" +#define REMOTE_DESKTOP_VIRTUAL_SESSION_USERNAME "\xFF_RemoteDesktopUSERNAME" #define MESHAGENT_DATAPING_ARRAY "\xFF_MeshAgent_DataPingArray" #define MESHAGENT_DATAPAING_PROMISE_TIMEOUT "\xFF_MeshAgent_DataPing_Timeout" @@ -824,11 +825,39 @@ void ILibDuktape_MeshAgent_RemoteDesktop_KVM_WriteSink_Chain(void *chain, void * ILibMemory_Free(user); } #endif + +void KVM_WriteLog(ILibKVM_WriteHandler writeHandler, void *user, char *format, ...) +{ + char dest[4096]; + int len = 4; + va_list argptr; + + va_start(argptr, format); + if ((size_t)len < sizeof(dest)) + { + if (len < sizeof(dest)) { len += vsnprintf(dest + len, sizeof(dest) - len, format, argptr); } + } + va_end(argptr); + + if (len < sizeof(dest)) + { + ((unsigned short*)dest)[0] = (unsigned short)htons((unsigned short)MNG_DEBUG); // Write the type + ((unsigned short*)dest)[1] = (unsigned short)htons((unsigned short)len); // Write the size + writeHandler(dest, len, user); + } +} + ILibTransport_DoneState ILibDuktape_MeshAgent_RemoteDesktop_KVM_WriteSink(char *buffer, int bufferLen, void *reserved) { RemoteDesktop_Ptrs *ptrs = (RemoteDesktop_Ptrs*)reserved; if (!ILibMemory_CanaryOK(ptrs)) { return(ILibTransport_DoneState_ERROR); } + if (ntohs(((unsigned short*)buffer)[0]) == MNG_DEBUG) + { + Duktape_Console_LogEx(ptrs->ctx, ILibDuktape_LogType_Info1, "%s", buffer + 4); + } + + #ifdef WIN32 if (duk_ctx_is_alive(ptrs->ctx)) { @@ -889,12 +918,25 @@ ILibTransport_DoneState ILibDuktape_MeshAgent_RemoteDesktop_WriteSink(ILibDuktap } void ILibDuktape_MeshAgent_RemoteDesktop_EndSink(ILibDuktape_DuplexStream *stream, void *user) { + // Peer disconnected the data channel RemoteDesktop_Ptrs *ptrs = (RemoteDesktop_Ptrs*)user; if (ptrs->ctx != NULL) { + Duktape_Console_LogEx(ptrs->ctx, ILibDuktape_LogType_Info1, "KVM Session Ending"); + duk_push_heapptr(ptrs->ctx, ptrs->MeshAgentObject); // [MeshAgent] duk_get_prop_string(ptrs->ctx, -1, REMOTE_DESKTOP_STREAM); // [MeshAgent][RD] + if (duk_has_prop_string(ptrs->ctx, -1, REMOTE_DESKTOP_VIRTUAL_SESSION_USERNAME)) + { + char *user = Duktape_GetStringPropertyValue(ptrs->ctx, -1, REMOTE_DESKTOP_VIRTUAL_SESSION_USERNAME, NULL); + if (user != NULL) + { + Duktape_Console_LogEx(ptrs->ctx, ILibDuktape_LogType_Info1, "Need to kill virtual user session: %s", user); + duk_push_sprintf(ptrs->ctx, "var _tmp=require('child_process').execFile('/bin/sh', ['sh']);_tmp.stdout.on('data', function (){});_tmp.stdin.write('loginctl kill-user %s\\nexit\\n');_tmp.waitExit();", user); + duk_peval_noresult(ptrs->ctx); + } + } if (duk_has_prop_string(ptrs->ctx, -1, KVM_IPC_SOCKET)) { duk_get_prop_string(ptrs->ctx, -1, KVM_IPC_SOCKET); // [MeshAgent][RD][IPC] @@ -1160,7 +1202,7 @@ duk_ret_t ILibDuktape_MeshAgent_getRemoteDesktop(duk_context *ctx) RemoteDesktop_Ptrs *ptrs; MeshAgentHostContainer *agent; -#ifdef WIN32 +#if defined(WIN32) || (defined(_POSIX) && !defined(__APPLE__)) int TSID = duk_is_number(ctx, 0) ? duk_require_int(ctx, 0) : -1; #endif @@ -1208,6 +1250,7 @@ duk_ret_t ILibDuktape_MeshAgent_getRemoteDesktop(duk_context *ctx) ptrs->stream = ILibDuktape_DuplexStream_InitEx(ctx, ILibDuktape_MeshAgent_RemoteDesktop_WriteSink, ILibDuktape_MeshAgent_RemoteDesktop_EndSink, ILibDuktape_MeshAgent_RemoteDesktop_PauseSink, ILibDuktape_MeshAgent_RemoteDesktop_ResumeSink, ILibDuktape_MeshAgent_remoteDesktop_unshiftSink, ptrs); ILibDuktape_CreateFinalizer(ctx, ILibDuktape_MeshAgent_RemoteDesktop_Finalizer); ptrs->stream->readableStream->PipeHookHandler = ILibDuktape_MeshAgent_RemoteDesktop_PipeHook; + // Setup Remote Desktop #ifdef WIN32 #ifdef _WINSERVICE @@ -1219,7 +1262,6 @@ duk_ret_t ILibDuktape_MeshAgent_getRemoteDesktop(duk_context *ctx) int console_uid = 0; if (duk_peval_string(ctx, "require('user-sessions').consoleUid();") == 0) { console_uid = duk_get_int(ctx, -1); } duk_pop(ctx); - #ifdef __APPLE__ // MacOS if (console_uid == 0) @@ -1242,6 +1284,26 @@ duk_ret_t ILibDuktape_MeshAgent_getRemoteDesktop(duk_context *ctx) ptrs->kvmPipe = kvm_relay_setup(agent->exePath, agent->pipeManager, ILibDuktape_MeshAgent_RemoteDesktop_KVM_WriteSink, ptrs, console_uid); } #else + if (TSID != -1) + { + console_uid = TSID; + duk_push_sprintf(ctx, "require('kvm-helper').createVirtualSession(%d);", console_uid); + duk_eval(ctx); // [uid] + console_uid = duk_get_int(ctx, -1); + duk_pop(ctx); // ... + if (console_uid != TSID) + { + duk_push_sprintf(ctx, "require('user-sessions').getUsername(%d);", console_uid); + if (duk_peval(ctx) == 0) + { + duk_put_prop_string(ctx, -2, REMOTE_DESKTOP_VIRTUAL_SESSION_USERNAME); + } + else + { + duk_pop(ctx); + } + } + } duk_push_int(ctx, console_uid); duk_put_prop_string(ctx, -2, REMOTE_DESKTOP_UID); duk_push_this(ctx); // [MeshAgent] if (!duk_has_prop_string(ctx, -1, MESH_USER_CHANGED_CB)) @@ -1320,7 +1382,7 @@ duk_ret_t ILibDuktape_MeshAgent_getRemoteDesktop(duk_context *ctx) needPop = 1; } - //MeshAgent_sendConsoleText(ctx, "Using uid: %d, XAUTHORITY: %s\n", console_uid, getenv("XAUTHORITY")==NULL? updateXAuth : getenv("XAUTHORITY")); + Duktape_Console_LogEx(ctx, ILibDuktape_LogType_Info1, "Using uid: %d, XAUTHORITY: %s\n", console_uid, getenv("XAUTHORITY") == NULL ? updateXAuth : getenv("XAUTHORITY")); ptrs->kvmPipe = kvm_relay_setup(agent->pipeManager, ILibDuktape_MeshAgent_RemoteDesktop_KVM_WriteSink, ptrs, console_uid, updateXAuth, updateDisplay); if (needPop!= 0) {duk_pop(ctx); } #endif