From 5e69f15cd7897a36aa6f79822e523b2dc7204e32 Mon Sep 17 00:00:00 2001 From: jsorg71 Date: Thu, 18 Aug 2005 02:49:35 +0000 Subject: [PATCH] harvest and pass on hostname and keylayout of client --- libxrdp/libxrdpinc.h | 3 +++ libxrdp/xrdp_sec.c | 39 +++++++++++++++++++++++++++++++++++++++ xrdp/xrdp_login_wnd.c | 7 +++++++ 3 files changed, 49 insertions(+) diff --git a/libxrdp/libxrdpinc.h b/libxrdp/libxrdpinc.h index 32c46cef..626b7bbd 100644 --- a/libxrdp/libxrdpinc.h +++ b/libxrdp/libxrdpinc.h @@ -41,6 +41,9 @@ struct xrdp_client_info int op2; /* use smaller bitmap header in bitmap cache */ int desktop_cache; int use_compact_packets; /* rdp5 smaller packets */ + char hostname[32]; + int build; + int keylayout; }; struct xrdp_brush diff --git a/libxrdp/xrdp_sec.c b/libxrdp/xrdp_sec.c index 0616b656..a1cf27bc 100644 --- a/libxrdp/xrdp_sec.c +++ b/libxrdp/xrdp_sec.c @@ -576,6 +576,44 @@ xrdp_sec_out_mcs_data(struct xrdp_sec* self) s_mark_end(p); } +/*****************************************************************************/ +/* process the mcs client data we received from the mcs layer */ +static void APP_CC +xrdp_sec_in_mcs_data(struct xrdp_sec* self) +{ + struct stream* s; + struct xrdp_client_info* client_info; + int index; + char c; + + client_info = &self->rdp_layer->client_info; + s = &self->client_mcs_data; + /* get hostname, its unicode */ + s->p = s->data; + in_uint8s(s, 47); + g_memset(client_info->hostname, 0, 32); + c = 1; + index = 0; + while (index < 16 && c != 0) + { + in_uint8(s, c); + in_uint8s(s, 1); + client_info->hostname[index] = c; + index++; + } + /* get build */ + s->p = s->data; + in_uint8s(s, 43); + in_uint32_le(s, client_info->build); + /* get keylayout */ + s->p = s->data; + in_uint8s(s, 39); + in_uint32_le(s, client_info->keylayout); +// g_printf("%s %d %x\n", client_info->hostname, client_info->build, +// client_info->keylayout); + s->p = s->data; +} + /*****************************************************************************/ int APP_CC xrdp_sec_incoming(struct xrdp_sec* self) @@ -595,6 +633,7 @@ xrdp_sec_incoming(struct xrdp_sec* self) self->server_mcs_data.end - self->server_mcs_data.data); #endif DEBUG(("out xrdp_sec_incoming\n\r")); + xrdp_sec_in_mcs_data(self); return 0; } diff --git a/xrdp/xrdp_login_wnd.c b/xrdp/xrdp_login_wnd.c index 57b84e66..c2c43d30 100644 --- a/xrdp/xrdp_login_wnd.c +++ b/xrdp/xrdp_login_wnd.c @@ -273,6 +273,7 @@ xrdp_wm_ok_clicked(struct xrdp_bitmap* wnd) struct list* values; struct xrdp_mod_data* mod_data; int i; + char text[256]; wm = wnd->wm; combo = xrdp_bitmap_get_child_by_id(wnd, 6); @@ -327,6 +328,12 @@ xrdp_wm_ok_clicked(struct xrdp_bitmap* wnd) (char*)list_get_item(names, i), (char*)list_get_item(values, i)); } + /* always set these */ + wm->mod->mod_set_param(wm->mod, "hostname", + wm->session->client_info->hostname); + g_sprintf(text, "%d", wm->session->client_info->keylayout); + wm->mod->mod_set_param(wm->mod, "keylayout", text); + /* connect */ if (wm->mod->mod_connect(wm->mod) != 0) { /* totaly free mod */