summaryrefslogtreecommitdiffstats
path: root/xrdp/xrdp_login_wnd.c
diff options
context:
space:
mode:
authorArvidNorr <norrarvid@gmail.com>2014-05-23 07:54:08 +0200
committerArvidNorr <norrarvid@gmail.com>2014-05-23 07:54:08 +0200
commit19ef9ea3b76c8c98d732e6cac21c2f5cd97219a4 (patch)
tree97e7e76b020076ab43626c1cde180cb51e96b7c9 /xrdp/xrdp_login_wnd.c
parent1d1eb037f311e4f4d97e12d128eb330f57bdfb36 (diff)
downloadxrdp-proprietary-19ef9ea3b76c8c98d732e6cac21c2f5cd97219a4.tar.gz
xrdp-proprietary-19ef9ea3b76c8c98d732e6cac21c2f5cd97219a4.zip
support for preferred combo box choice added
Diffstat (limited to 'xrdp/xrdp_login_wnd.c')
-rw-r--r--xrdp/xrdp_login_wnd.c81
1 files changed, 78 insertions, 3 deletions
diff --git a/xrdp/xrdp_login_wnd.c b/xrdp/xrdp_login_wnd.c
index 8b14cb26..2d853446 100644
--- a/xrdp/xrdp_login_wnd.c
+++ b/xrdp/xrdp_login_wnd.c
@@ -242,6 +242,74 @@ xrdp_wm_ok_clicked(struct xrdp_bitmap *wnd)
return 0;
}
+/**
+* This is an internal function in this file used to parse the domain information
+* sent from the client.
+* If the information starts with '_' the domain field contains the
+* IP/DNS to connect to. If the domain field contains an additional '__' the char
+* that follows this '__' is an index number of a preferred combo choice.
+* Valid values for this choice is 0-9. But this function will only return index
+* numbers between 0 and the max number of combo items -1.
+* Example: _192.168.1.2__1 result in a resultbuffer containing 192.168.1.2 and
+* the return value will be 1. Meaning that index 1 is the preferred combo choice.
+*
+* Users can create shortcuts where this information is configured. These
+* shortcuts simplifies login.
+* @param orginalDomainInfo indata to this function
+* @param comboMax the max number of combo choices
+* @param decode if true then we perform decoding of combo choice
+* @param resultBuffer must be pre allocated before calling this function.
+* Holds the IP. The size of this buffer must be 256 bytes
+* @return the index number of the combobox that the user prefer.
+* 0 if the user does not prefer any choice.
+*/
+static int APP_CC xrdp_wm_parse_domain_information(char *orginalDomainInfo, int comboMax, int decode, char *resultBuffer)
+{
+ /* If the first char in the domain name is '_' we use the domain name as IP*/
+ int ret = 0; // default return value
+ g_memset(resultBuffer, 0, 255);
+ if(orginalDomainInfo[0]=='_')
+ {
+ /* we try to locate a number indicating what combobox index the user prefer
+ * the information is loaded from domain field, from the client
+ * log_message(LOG_LEVEL_DEBUG, "domain contains _");
+ * We must use valid chars in the domain name.
+ * Underscore is a valid name in the domain.
+ * Invalid chars are ignored in microsoft client therefore we use '_' again.
+ * this sec '__' contains the split for index.*/
+ int pos = g_pos(&orginalDomainInfo[1],"__");
+ if(pos>0)
+ {
+ /* an index is found we try to use it
+ log_message(LOG_LEVEL_DEBUG, "domain contains index char __");*/
+ if(decode)
+ {
+ char index[2] ;
+ char debugstr[256] ;
+ g_memset(index, 0, 2) ;
+ int comboxindex ;
+ g_strncpy(index, &orginalDomainInfo[pos+3], 1); // we just accept values 0-9 (one figure)
+ comboxindex = g_htoi(index) ;
+ g_sprintf(debugstr, "Value of index (as char): %s (converted) : %d (max) : %d",index,comboxindex,comboMax-1);
+ log_message(LOG_LEVEL_DEBUG, debugstr);
+ if(comboxindex>0 && comboxindex<comboMax) // limit to max number of items in combo box
+ {
+ log_message(LOG_LEVEL_DEBUG, "domain contains a valid index number");
+ ret = comboxindex ; // preferred index for combo box.
+ }
+ }
+ // pos limit the String to only contain the IP
+ g_strncpy(resultBuffer, &orginalDomainInfo[1], pos);
+ }
+ else
+ {
+ //log_message(LOG_LEVEL_DEBUG, "domain does not contain _");
+ g_strncpy(resultBuffer, &orginalDomainInfo[1], 255);
+ }
+ }
+ return ret ;
+}
+
/******************************************************************************/
static int APP_CC
xrdp_wm_show_edits(struct xrdp_wm *self, struct xrdp_bitmap *combo)
@@ -269,7 +337,7 @@ xrdp_wm_show_edits(struct xrdp_wm *self, struct xrdp_bitmap *combo)
}
insert_index = list_index_of(self->login_window->child_list,
- (long)combo);
+ (long)combo); // find combo in the list
insert_index++;
mod = (struct xrdp_mod_data *)
list_get_item(combo->data_list, combo->item_index);
@@ -330,7 +398,9 @@ xrdp_wm_show_edits(struct xrdp_wm *self, struct xrdp_bitmap *combo)
/* If the first char in the domain name is '_' we use the domain name as IP*/
if(self->session->client_info->domain[0]=='_')
{
- g_strncpy(b->caption1, &self->session->client_info->domain[1], 255);
+ char resultIP[256];
+ xrdp_wm_parse_domain_information(self->session->client_info->domain,combo->data_list->count,0,resultIP);
+ g_strncpy(b->caption1, resultIP, 255);
b->edit_pos = g_mbstowcs(0, b->caption1, 0);
}
@@ -642,7 +712,12 @@ xrdp_login_wnd_create(struct xrdp_wm *self)
but->tab_stop = 1;
self->login_window->esc_button = but;
- /* labels and edits */
+ /* labels and edits.
+ * parameter: 1 = decode domain field index information from client.
+ * We only perform this the first time for each connection.
+ */
+ char resultIP[256]; // just a dummy place holder, we ignore
+ combo->item_index = xrdp_wm_parse_domain_information(self->session->client_info->domain,combo->data_list->count,1,resultIP);
xrdp_wm_show_edits(self, combo);
return 0;