2021-06-27 05:37:58 +03:00
|
|
|
#if defined(HAVE_CONFIG_H)
|
|
|
|
#include "config_ac.h"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include "libxrdp.h"
|
|
|
|
#include "os_calls.h"
|
|
|
|
|
2022-01-19 14:08:13 +03:00
|
|
|
#include "test_libxrdp.h"
|
|
|
|
|
2021-06-27 05:37:58 +03:00
|
|
|
struct xrdp_sec *sec_layer;
|
|
|
|
struct xrdp_rdp *rdp_layer;
|
|
|
|
struct xrdp_session *session;
|
|
|
|
|
2023-10-20 18:14:47 +03:00
|
|
|
static void setup(void)
|
2021-06-27 05:37:58 +03:00
|
|
|
{
|
|
|
|
rdp_layer = (struct xrdp_rdp *)g_malloc(sizeof(struct xrdp_rdp), 1);
|
|
|
|
session = (struct xrdp_session *)g_malloc(sizeof(struct xrdp_session), 1);
|
|
|
|
session->rdp = rdp_layer;
|
|
|
|
session->client_info = &(((struct xrdp_rdp *)session->rdp)->client_info);
|
|
|
|
session->client_info->multimon = 1;
|
|
|
|
sec_layer = (struct xrdp_sec *) g_malloc(sizeof(struct xrdp_sec), 1);
|
|
|
|
sec_layer->rdp_layer = rdp_layer;
|
|
|
|
}
|
|
|
|
|
2023-10-20 18:14:47 +03:00
|
|
|
static void teardown(void)
|
2021-06-27 05:37:58 +03:00
|
|
|
{
|
|
|
|
g_free(sec_layer);
|
|
|
|
g_free(session);
|
|
|
|
g_free(rdp_layer);
|
|
|
|
}
|
|
|
|
|
2022-03-20 09:55:09 +03:00
|
|
|
START_TEST(test_xrdp_sec_process_mcs_data_monitors__when_flags_is_not_zero__fail)
|
2021-06-27 05:37:58 +03:00
|
|
|
{
|
|
|
|
struct stream *s = (struct stream *)NULL;
|
|
|
|
make_stream(s);
|
|
|
|
init_stream(s, 8);
|
|
|
|
|
|
|
|
out_uint32_le(s, 1);
|
|
|
|
out_uint32_le(s, 0);
|
|
|
|
s_mark_end(s);
|
|
|
|
//Reset the read counter of the stream so the processing function handles it properly.
|
|
|
|
s->p = s->data;
|
|
|
|
|
|
|
|
int error = xrdp_sec_process_mcs_data_monitors(sec_layer, s);
|
2021-05-25 07:05:54 +03:00
|
|
|
ck_assert_int_eq(error, SEC_PROCESS_MONITORS_ERR);
|
2021-06-27 05:37:58 +03:00
|
|
|
|
|
|
|
free_stream(s);
|
|
|
|
}
|
|
|
|
END_TEST
|
|
|
|
|
2022-03-20 09:55:09 +03:00
|
|
|
START_TEST(test_xrdp_sec_process_mcs_data_monitors__when_monitor_count_is_greater_than_sixteen__fail)
|
2021-06-27 05:37:58 +03:00
|
|
|
{
|
|
|
|
struct stream *s = (struct stream *)NULL;
|
|
|
|
make_stream(s);
|
|
|
|
init_stream(s, 8);
|
|
|
|
|
|
|
|
out_uint32_le(s, 0);
|
|
|
|
out_uint32_le(s, 17);
|
|
|
|
s_mark_end(s);
|
|
|
|
//Reset the read counter of the stream so the processing function handles it properly.
|
|
|
|
s->p = s->data;
|
|
|
|
|
|
|
|
int error = xrdp_sec_process_mcs_data_monitors(sec_layer, s);
|
2021-05-25 07:05:54 +03:00
|
|
|
ck_assert_int_eq(error, SEC_PROCESS_MONITORS_ERR_TOO_MANY_MONITORS);
|
2021-06-27 05:37:58 +03:00
|
|
|
|
|
|
|
free_stream(s);
|
|
|
|
}
|
|
|
|
END_TEST
|
|
|
|
|
2022-03-20 09:55:09 +03:00
|
|
|
START_TEST(test_xrdp_sec_process_mcs_data_monitors__with_single_monitor_happy_path)
|
2021-06-27 05:37:58 +03:00
|
|
|
{
|
|
|
|
struct xrdp_client_info *client_info = &(rdp_layer->client_info);
|
|
|
|
struct stream *s = (struct stream *)NULL;
|
|
|
|
make_stream(s);
|
|
|
|
init_stream(s, 28);
|
|
|
|
|
|
|
|
out_uint32_le(s, 0); //flags
|
|
|
|
out_uint32_le(s, 1); //monitorCount
|
|
|
|
|
|
|
|
// Pretend we have a 4k monitor
|
|
|
|
out_uint32_le(s, 0); //monitor left
|
|
|
|
out_uint32_le(s, 0); //monitor top
|
|
|
|
out_uint32_le(s, 3840); //monitor right
|
|
|
|
out_uint32_le(s, 2160); //monitor bottom
|
|
|
|
out_uint32_le(s, 1); //is primary
|
|
|
|
|
|
|
|
s_mark_end(s);
|
|
|
|
//Reset the read counter of the stream so the processing function handles it properly.
|
|
|
|
s->p = s->data;
|
|
|
|
|
|
|
|
//Verify function call passed.
|
|
|
|
int error = xrdp_sec_process_mcs_data_monitors(sec_layer, s);
|
|
|
|
ck_assert_int_eq(error, 0);
|
|
|
|
|
2022-03-20 09:55:09 +03:00
|
|
|
ck_assert_int_eq(client_info->display_sizes.monitorCount, 1);
|
2021-06-27 05:37:58 +03:00
|
|
|
|
|
|
|
// Verify normal monitor
|
2022-03-20 09:55:09 +03:00
|
|
|
ck_assert_int_eq(client_info->display_sizes.minfo[0].left, 0);
|
|
|
|
ck_assert_int_eq(client_info->display_sizes.minfo[0].top, 0);
|
|
|
|
ck_assert_int_eq(client_info->display_sizes.minfo[0].right, 3840);
|
|
|
|
ck_assert_int_eq(client_info->display_sizes.minfo[0].bottom, 2160);
|
|
|
|
ck_assert_int_eq(client_info->display_sizes.minfo[0].is_primary, 1);
|
2021-06-27 05:37:58 +03:00
|
|
|
|
|
|
|
// Verify normalized monitor
|
2022-03-20 09:55:09 +03:00
|
|
|
ck_assert_int_eq(client_info->display_sizes.minfo_wm[0].left, 0);
|
|
|
|
ck_assert_int_eq(client_info->display_sizes.minfo_wm[0].top, 0);
|
|
|
|
ck_assert_int_eq(client_info->display_sizes.minfo_wm[0].right, 3840);
|
|
|
|
ck_assert_int_eq(client_info->display_sizes.minfo_wm[0].bottom, 2160);
|
|
|
|
ck_assert_int_eq(client_info->display_sizes.minfo_wm[0].is_primary, 1);
|
2021-06-27 05:37:58 +03:00
|
|
|
|
|
|
|
// Verify geometry (+1 greater than )
|
2022-03-20 09:55:09 +03:00
|
|
|
ck_assert_int_eq(client_info->display_sizes.session_width, 3841);
|
|
|
|
ck_assert_int_eq(client_info->display_sizes.session_height, 2161);
|
2021-06-27 05:37:58 +03:00
|
|
|
|
|
|
|
free_stream(s);
|
|
|
|
}
|
|
|
|
END_TEST
|
|
|
|
|
2022-03-20 09:55:09 +03:00
|
|
|
START_TEST(test_xrdp_sec_process_mcs_data_monitors__when_no_primary_monitor_is_specified_one_is_selected)
|
2021-06-27 05:37:58 +03:00
|
|
|
{
|
|
|
|
struct xrdp_client_info *client_info = &(rdp_layer->client_info);
|
|
|
|
struct stream *s = (struct stream *)NULL;
|
|
|
|
make_stream(s);
|
|
|
|
init_stream(s, 28);
|
|
|
|
|
|
|
|
out_uint32_le(s, 0); //flags
|
|
|
|
out_uint32_le(s, 1); //monitorCount
|
|
|
|
|
|
|
|
// Pretend we have a 4k monitor
|
|
|
|
out_uint32_le(s, 0); //monitor left
|
|
|
|
out_uint32_le(s, 0); //monitor top
|
|
|
|
out_uint32_le(s, 3840); //monitor right
|
|
|
|
out_uint32_le(s, 2160); //monitor bottom
|
|
|
|
out_uint32_le(s, 0); //is primary
|
|
|
|
|
|
|
|
s_mark_end(s);
|
|
|
|
//Reset the read counter of the stream so the processing function handles it properly.
|
|
|
|
s->p = s->data;
|
|
|
|
|
|
|
|
//Verify function call passed.
|
|
|
|
int error = xrdp_sec_process_mcs_data_monitors(sec_layer, s);
|
|
|
|
ck_assert_int_eq(error, 0);
|
|
|
|
|
2022-03-20 09:55:09 +03:00
|
|
|
ck_assert_int_eq(client_info->display_sizes.monitorCount, 1);
|
2021-06-27 05:37:58 +03:00
|
|
|
|
|
|
|
// Verify normal monitor
|
2022-03-20 09:55:09 +03:00
|
|
|
ck_assert_int_eq(client_info->display_sizes.minfo[0].left, 0);
|
|
|
|
ck_assert_int_eq(client_info->display_sizes.minfo[0].top, 0);
|
|
|
|
ck_assert_int_eq(client_info->display_sizes.minfo[0].right, 3840);
|
|
|
|
ck_assert_int_eq(client_info->display_sizes.minfo[0].bottom, 2160);
|
|
|
|
ck_assert_int_eq(client_info->display_sizes.minfo[0].is_primary, 1);
|
2021-06-27 05:37:58 +03:00
|
|
|
|
|
|
|
// Verify normalized monitor
|
2022-03-20 09:55:09 +03:00
|
|
|
ck_assert_int_eq(client_info->display_sizes.minfo_wm[0].left, 0);
|
|
|
|
ck_assert_int_eq(client_info->display_sizes.minfo_wm[0].top, 0);
|
|
|
|
ck_assert_int_eq(client_info->display_sizes.minfo_wm[0].right, 3840);
|
|
|
|
ck_assert_int_eq(client_info->display_sizes.minfo_wm[0].bottom, 2160);
|
|
|
|
ck_assert_int_eq(client_info->display_sizes.minfo_wm[0].is_primary, 1);
|
2021-06-27 05:37:58 +03:00
|
|
|
|
|
|
|
// Verify geometry (+1 greater than )
|
2022-03-20 09:55:09 +03:00
|
|
|
ck_assert_int_eq(client_info->display_sizes.session_width, 3841);
|
|
|
|
ck_assert_int_eq(client_info->display_sizes.session_height, 2161);
|
2021-06-27 05:37:58 +03:00
|
|
|
|
|
|
|
free_stream(s);
|
|
|
|
}
|
|
|
|
END_TEST
|
|
|
|
|
2022-03-20 09:55:09 +03:00
|
|
|
START_TEST(test_xrdp_sec_process_mcs_data_monitors__when_virtual_desktop_width_is_too_large)
|
2021-06-27 05:37:58 +03:00
|
|
|
{
|
|
|
|
struct stream *s = (struct stream *)NULL;
|
|
|
|
make_stream(s);
|
|
|
|
init_stream(s, 28);
|
|
|
|
|
|
|
|
out_uint32_le(s, 0); //flags
|
|
|
|
out_uint32_le(s, 1); //monitorCount
|
|
|
|
|
|
|
|
// Pretend we have a 4k monitor
|
|
|
|
out_uint32_le(s, 0); //monitor left
|
|
|
|
out_uint32_le(s, 0); //monitor top
|
|
|
|
out_uint32_le(s, 33000); //monitor right
|
|
|
|
out_uint32_le(s, 2160); //monitor bottom
|
|
|
|
out_uint32_le(s, 1); //is primary
|
|
|
|
|
|
|
|
s_mark_end(s);
|
|
|
|
//Reset the read counter of the stream so the processing function handles it properly.
|
|
|
|
s->p = s->data;
|
|
|
|
|
|
|
|
//Verify function call passed.
|
|
|
|
int error = xrdp_sec_process_mcs_data_monitors(sec_layer, s);
|
2021-05-25 07:05:54 +03:00
|
|
|
ck_assert_int_eq(error, SEC_PROCESS_MONITORS_ERR_INVALID_DESKTOP);
|
2021-06-27 05:37:58 +03:00
|
|
|
|
|
|
|
free_stream(s);
|
|
|
|
}
|
|
|
|
END_TEST
|
|
|
|
|
2022-03-20 09:55:09 +03:00
|
|
|
START_TEST(test_xrdp_sec_process_mcs_data_monitors__when_virtual_desktop_width_is_too_small)
|
2021-06-27 05:37:58 +03:00
|
|
|
{
|
|
|
|
struct stream *s = (struct stream *)NULL;
|
|
|
|
make_stream(s);
|
|
|
|
init_stream(s, 28);
|
|
|
|
|
|
|
|
out_uint32_le(s, 0); //flags
|
|
|
|
out_uint32_le(s, 1); //monitorCount
|
|
|
|
|
|
|
|
// Pretend we have a 4k monitor
|
|
|
|
out_uint32_le(s, 0); //monitor left
|
|
|
|
out_uint32_le(s, 0); //monitor top
|
|
|
|
out_uint32_le(s, 100); //monitor right
|
|
|
|
out_uint32_le(s, 2160); //monitor bottom
|
|
|
|
out_uint32_le(s, 1); //is primary
|
|
|
|
|
|
|
|
s_mark_end(s);
|
|
|
|
//Reset the read counter of the stream so the processing function handles it properly.
|
|
|
|
s->p = s->data;
|
|
|
|
|
|
|
|
//Verify function call passed.
|
|
|
|
int error = xrdp_sec_process_mcs_data_monitors(sec_layer, s);
|
2021-05-25 07:05:54 +03:00
|
|
|
ck_assert_int_eq(error, SEC_PROCESS_MONITORS_ERR_INVALID_DESKTOP);
|
2021-06-27 05:37:58 +03:00
|
|
|
|
|
|
|
free_stream(s);
|
|
|
|
}
|
|
|
|
END_TEST
|
|
|
|
|
2022-03-20 09:55:09 +03:00
|
|
|
START_TEST(test_xrdp_sec_process_mcs_data_monitors__when_virtual_desktop_height_is_too_large)
|
2021-06-27 05:37:58 +03:00
|
|
|
{
|
|
|
|
struct stream *s = (struct stream *)NULL;
|
|
|
|
make_stream(s);
|
|
|
|
init_stream(s, 28);
|
|
|
|
|
|
|
|
out_uint32_le(s, 0); //flags
|
|
|
|
out_uint32_le(s, 1); //monitorCount
|
|
|
|
|
|
|
|
// Pretend we have a 4k monitor
|
|
|
|
out_uint32_le(s, 0); //monitor left
|
|
|
|
out_uint32_le(s, 0); //monitor top
|
|
|
|
out_uint32_le(s, 3840); //monitor right
|
|
|
|
out_uint32_le(s, 33000); //monitor bottom
|
|
|
|
out_uint32_le(s, 1); //is primary
|
|
|
|
|
|
|
|
s_mark_end(s);
|
|
|
|
//Reset the read counter of the stream so the processing function handles it properly.
|
|
|
|
s->p = s->data;
|
|
|
|
|
|
|
|
//Verify function call passed.
|
|
|
|
int error = xrdp_sec_process_mcs_data_monitors(sec_layer, s);
|
2021-05-25 07:05:54 +03:00
|
|
|
ck_assert_int_eq(error, SEC_PROCESS_MONITORS_ERR_INVALID_DESKTOP);
|
2021-06-27 05:37:58 +03:00
|
|
|
|
|
|
|
free_stream(s);
|
|
|
|
}
|
|
|
|
END_TEST
|
|
|
|
|
2022-03-20 09:55:09 +03:00
|
|
|
START_TEST(test_xrdp_sec_process_mcs_data_monitors__when_virtual_desktop_height_is_too_small)
|
2021-06-27 05:37:58 +03:00
|
|
|
{
|
|
|
|
struct stream *s = (struct stream *)NULL;
|
|
|
|
make_stream(s);
|
|
|
|
init_stream(s, 28);
|
|
|
|
|
|
|
|
out_uint32_le(s, 0); //flags
|
|
|
|
out_uint32_le(s, 1); //monitorCount
|
|
|
|
|
|
|
|
// Pretend we have a 4k monitor
|
|
|
|
out_uint32_le(s, 0); //monitor left
|
|
|
|
out_uint32_le(s, 0); //monitor top
|
|
|
|
out_uint32_le(s, 3840); //monitor right
|
|
|
|
out_uint32_le(s, 100); //monitor bottom
|
|
|
|
out_uint32_le(s, 1); //is primary
|
|
|
|
|
|
|
|
s_mark_end(s);
|
|
|
|
//Reset the read counter of the stream so the processing function handles it properly.
|
|
|
|
s->p = s->data;
|
|
|
|
|
|
|
|
//Verify function call passed.
|
|
|
|
int error = xrdp_sec_process_mcs_data_monitors(sec_layer, s);
|
2021-05-25 07:05:54 +03:00
|
|
|
ck_assert_int_eq(error, SEC_PROCESS_MONITORS_ERR_INVALID_DESKTOP);
|
2021-06-27 05:37:58 +03:00
|
|
|
|
|
|
|
free_stream(s);
|
|
|
|
}
|
|
|
|
END_TEST
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
Suite *
|
2022-03-20 09:55:09 +03:00
|
|
|
make_suite_test_xrdp_sec_process_mcs_data_monitors(void)
|
2021-06-27 05:37:58 +03:00
|
|
|
{
|
|
|
|
Suite *s;
|
|
|
|
TCase *tc_process_monitors;
|
|
|
|
|
2022-03-20 09:55:09 +03:00
|
|
|
s = suite_create("test_xrdp_sec_process_mcs_data_monitors");
|
2021-06-27 05:37:58 +03:00
|
|
|
|
|
|
|
tc_process_monitors = tcase_create("xrdp_sec_process_mcs_data_monitors");
|
|
|
|
tcase_add_checked_fixture(tc_process_monitors, setup, teardown);
|
2022-03-20 09:55:09 +03:00
|
|
|
tcase_add_test(tc_process_monitors, test_xrdp_sec_process_mcs_data_monitors__when_flags_is_not_zero__fail);
|
|
|
|
tcase_add_test(tc_process_monitors, test_xrdp_sec_process_mcs_data_monitors__when_monitor_count_is_greater_than_sixteen__fail);
|
|
|
|
tcase_add_test(tc_process_monitors, test_xrdp_sec_process_mcs_data_monitors__with_single_monitor_happy_path);
|
|
|
|
tcase_add_test(tc_process_monitors, test_xrdp_sec_process_mcs_data_monitors__when_no_primary_monitor_is_specified_one_is_selected);
|
|
|
|
tcase_add_test(tc_process_monitors, test_xrdp_sec_process_mcs_data_monitors__when_virtual_desktop_width_is_too_large);
|
|
|
|
tcase_add_test(tc_process_monitors, test_xrdp_sec_process_mcs_data_monitors__when_virtual_desktop_width_is_too_small);
|
|
|
|
tcase_add_test(tc_process_monitors, test_xrdp_sec_process_mcs_data_monitors__when_virtual_desktop_height_is_too_large);
|
|
|
|
tcase_add_test(tc_process_monitors, test_xrdp_sec_process_mcs_data_monitors__when_virtual_desktop_height_is_too_small);
|
2021-06-27 05:37:58 +03:00
|
|
|
|
|
|
|
suite_add_tcase(s, tc_process_monitors);
|
|
|
|
|
|
|
|
return s;
|
|
|
|
}
|