Update allowed channel lists from entries in the connection entry prefixed channel. Allows different settings for each preset connection.
This commit is contained in:
parent
cc03ff6704
commit
64ca201fd8
@ -102,3 +102,10 @@ port=ask3389
|
||||
username=ask
|
||||
password=ask
|
||||
|
||||
channel.rdpdr=true
|
||||
channel.rdpsnd=true
|
||||
channel.drdynvc=true
|
||||
channel.cliprdr=true
|
||||
channel.rail=true
|
||||
channel.xrdpvr=true
|
||||
|
||||
|
104
xrdp/xrdp_mm.c
104
xrdp/xrdp_mm.c
@ -1932,6 +1932,7 @@ server_reset(struct xrdp_mod *mod, int width, int height, int bpp)
|
||||
xrdp_wm_load_static_pointers(wm);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* read the channel section of the ini file into lists
|
||||
* return 1 on success 0 on failure */
|
||||
int read_allowed_channel_names(struct list *names, struct list *values)
|
||||
@ -1960,44 +1961,90 @@ int read_allowed_channel_names(struct list *names, struct list *values)
|
||||
}
|
||||
|
||||
g_file_close(fd);
|
||||
return ret;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
#define CHANNEL_NAME_PREFIX "channel."
|
||||
/* update the channel lists from connection specific overrides
|
||||
* return 1 on success 0 on failure */
|
||||
int update_allowed_channel_names(struct xrdp_wm *wm, struct list *names, struct list *values)
|
||||
{
|
||||
int ret = 1;
|
||||
int index;
|
||||
int oldindex;
|
||||
char *val;
|
||||
char *name;
|
||||
//wm->mm->login_names,wm->mm->login_values
|
||||
for (index = 0; index < wm->mm->login_names->count; index++)
|
||||
{
|
||||
name = (char *)list_get_item(wm->mm->login_names, index);
|
||||
if ( (name != 0) && (g_strncmp( name, CHANNEL_NAME_PREFIX, g_strlen(CHANNEL_NAME_PREFIX)) == 0 ) )
|
||||
{
|
||||
name += g_strlen(CHANNEL_NAME_PREFIX);
|
||||
// locate and remove from list
|
||||
oldindex = find_name_in_lists(name, names);
|
||||
if (oldindex >= 0)
|
||||
{
|
||||
list_remove_item(names, oldindex);
|
||||
list_remove_item(values, oldindex);
|
||||
}
|
||||
val = (char *)list_get_item(wm->mm->login_values, index);
|
||||
// (re)add to lists
|
||||
list_add_item(names, (tbus)g_strdup(name));
|
||||
list_add_item(values, (tbus)g_strdup(val));
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* internal function return -1 if name is not in list
|
||||
* otherwise return the index 0->count-1*/
|
||||
int DEFAULT_CC
|
||||
find_name_in_lists(char *inName, struct list *names)
|
||||
{
|
||||
int reply = -1; /*means not in the list*/
|
||||
int index;
|
||||
char *name;
|
||||
|
||||
for (index = 0; index < names->count; index++)
|
||||
{
|
||||
name = (char *)list_get_item(names, index);
|
||||
if ( (name != 0) && g_strncmp(name, inName, MAX_CHANNEL_NAME))
|
||||
{
|
||||
reply = index;
|
||||
break; /* stop loop - item found*/
|
||||
}
|
||||
}
|
||||
|
||||
return reply;
|
||||
}
|
||||
|
||||
/* internal function return 1 if name is in list of channels
|
||||
* and if the value is allowed */
|
||||
int DEFAULT_CC
|
||||
is_name_in_lists(char *inName, struct list *names, struct list *values)
|
||||
is_channel_enabled(char *inName, struct list *names, struct list *values)
|
||||
{
|
||||
int reply = 0; /*means not in the list*/
|
||||
int index;
|
||||
char *val;
|
||||
char *name;
|
||||
|
||||
for (index = 0; index < names->count; index++)
|
||||
index = find_name_in_lists(inName, names);
|
||||
if ( index >= 0 )
|
||||
{
|
||||
name = (char *)list_get_item(names, index);
|
||||
val = (char *)list_get_item(values, index);
|
||||
|
||||
if (name != 0)
|
||||
if ((g_strcasecmp(val, "yes") == 0) ||
|
||||
(g_strcasecmp(val, "on") == 0) ||
|
||||
(g_strcasecmp(val, "true") == 0) ||
|
||||
(g_atoi(val) != 0))
|
||||
{
|
||||
/* ex rdpdr ;rdpsnd ; drdynvc ; cliprdr */
|
||||
if (!g_strncmp(name, inName, MAX_CHANNEL_NAME))
|
||||
{
|
||||
val = (char *)list_get_item(values, index);
|
||||
|
||||
if ((g_strcasecmp(val, "yes") == 0) ||
|
||||
(g_strcasecmp(val, "on") == 0) ||
|
||||
(g_strcasecmp(val, "true") == 0) ||
|
||||
(g_atoi(val) != 0))
|
||||
{
|
||||
reply = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_writeln("This channel is disabled: %s", name);
|
||||
}
|
||||
|
||||
break; /* stop loop - item found*/
|
||||
}
|
||||
reply = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_writeln("This channel is disabled: %s", name);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2026,7 +2073,8 @@ void init_channel_allowed(struct xrdp_wm *wm)
|
||||
names = list_create();
|
||||
values = list_create();
|
||||
|
||||
if (read_allowed_channel_names(names, values))
|
||||
if ( read_allowed_channel_names(names, values)
|
||||
&& update_allowed_channel_names(wm, names, values) )
|
||||
{
|
||||
do
|
||||
{
|
||||
@ -2036,9 +2084,9 @@ void init_channel_allowed(struct xrdp_wm *wm)
|
||||
if (error == 0)
|
||||
{
|
||||
/* examples of channel names: rdpdr ; rdpsnd ; drdynvc ; cliprdr */
|
||||
if (is_name_in_lists(channelname, names, values))
|
||||
if (is_channel_enabled(channelname, names, values))
|
||||
{
|
||||
g_writeln("The following channel is allowed: %s", channelname);
|
||||
g_writeln("The following channel is allowed: %s (%d)", channelname, index);
|
||||
wm->allowedchannels[allowindex] = index;
|
||||
allowindex++;
|
||||
|
||||
@ -2050,7 +2098,7 @@ void init_channel_allowed(struct xrdp_wm *wm)
|
||||
}
|
||||
else
|
||||
{
|
||||
g_writeln("The following channel is not allowed: %s", channelname);
|
||||
g_writeln("The following channel is not allowed: %s (%d)", channelname, index);
|
||||
}
|
||||
|
||||
index++;
|
||||
|
Loading…
Reference in New Issue
Block a user