From a89cb93bc793853ed7cd769d8dbec45a038c1fc0 Mon Sep 17 00:00:00 2001 From: Koichiro IWAO Date: Thu, 22 Jun 2017 15:04:16 +0900 Subject: [PATCH] decode base64 login window parameter such as prefill username and password: username=ask{base64}YmFzZTY0 username={base64}YmFzZTY0 password=ask{base64}YmFzZTs2NCFwYXNzd29yZCM= password={base64}YmFzZTs2NCFwYXNzd29yZCM= ';', '#', '!' means comment in .ini files. If prefill username or password contains such symbols, these can be provided base64 encoded. --- xrdp/xrdp_login_wnd.c | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/xrdp/xrdp_login_wnd.c b/xrdp/xrdp_login_wnd.c index 49477a12..34cb70ed 100644 --- a/xrdp/xrdp_login_wnd.c +++ b/xrdp/xrdp_login_wnd.c @@ -24,6 +24,7 @@ #include "xrdp.h" #include "log.h" +#include "ssl_calls.h" /*****************************************************************************/ /* all login help screen events go here */ @@ -339,6 +340,8 @@ xrdp_wm_show_edits(struct xrdp_wm *self, struct xrdp_bitmap *combo) struct xrdp_bitmap *b; struct xrdp_cfg_globals *globals; char resultIP[256]; + char *plain; /* base64 decoded string */ + size_t base64_length; /* length of base64 string */ globals = &self->xrdp_config->cfg_globals; @@ -366,7 +369,16 @@ xrdp_wm_show_edits(struct xrdp_wm *self, struct xrdp_bitmap *combo) { value = (char *)list_get_item(mod->values, index); - if (g_strncmp("ask", value, 3) == 0) + /* if the value begins with "{base64}", decode the string following it */ + if (g_strncmp("{base64}", value, 8) == 0) + { + base64_length = g_strlen(value + 8); + plain = (char *)g_malloc(base64_length, 0); + base64_decode(plain, value + 8, base64_length); + g_strncpy(value, plain, g_strlen(plain)); + free(plain); + } + else if (g_strncmp("ask", value, 3) == 0) { /* label */ b = xrdp_bitmap_create(95, DEFAULT_EDIT_H, self->screen->bpp, @@ -399,7 +411,19 @@ xrdp_wm_show_edits(struct xrdp_wm *self, struct xrdp_bitmap *combo) b->pointer = 1; b->tab_stop = 1; b->caption1 = (char *)g_malloc(256, 1); - g_strncpy(b->caption1, value + 3, 255); + /* ask{base64}... 3 for "ask", 8 for "{base64}" */ + if (g_strncmp("{base64}", value + 3, 8) == 0) + { + base64_length = g_strlen(value + 3 + 8); + plain = (char *)g_malloc(base64_length, 0); + base64_decode(plain, value + 3 + 8, base64_length); + g_strncpy(b->caption1, plain, 255); + free(plain); + } + else + { + g_strncpy(b->caption1, value + 3, 255); + } b->edit_pos = g_mbstowcs(0, b->caption1, 0); if (self->login_window->focused_control == 0)