diff --git a/docs/man/sesman.ini.5 b/docs/man/sesman.ini.5 index 2bf69297..6a0d5459 100644 --- a/docs/man/sesman.ini.5 +++ b/docs/man/sesman.ini.5 @@ -98,9 +98,8 @@ If unset or set to \fI0\fR, unlimited session are allowed. .TP \fBKillDisconnected\fR=\fI[0|1]\fR -If set to \fB1\fR, \fBtrue\fR or \fByes\fR, every session will be killed when the user disconnects. +If set to \fB1\fR, \fBtrue\fR or \fByes\fR, every session will be killed within 60 seconds when the user disconnects. .br -\fI\-this option is currently ignored!\-\fR .TP \fBIdleTimeLimit\fR=\fI\fR @@ -112,11 +111,10 @@ If set to \fI0\fR, automatic disconnection is disabled. .TP \fBDisconnectedTimeLimit\fR=\fI\fR -Sets the the time limit before a disconnected session is killed. +Sets the the time(in seconds) limit before a disconnected session is killed. .br If set to \fI0\fR, automatic killing is disabled. .br -\fI\-this option is currently ignored!\-\fR .SH "SECURITY" The following parameters can be used in the \fB[Sessions]\fR section: diff --git a/sesman/sesman.ini b/sesman/sesman.ini index 571e063b..02fef5ba 100644 --- a/sesman/sesman.ini +++ b/sesman/sesman.ini @@ -17,8 +17,13 @@ AlwaysGroupCheck = false [Sessions] X11DisplayOffset=10 MaxSessions=10 +# if 1, true, or yes, kill session after 60 seconds KillDisconnected=0 +# if not zero, the seconds without mouse or keyboard input before disconnect +# not complete yet IdleTimeLimit=0 +# if not zero, the seconds before a disconnected session is killed +# min 60 seconds DisconnectedTimeLimit=0 [Logging] diff --git a/xorg/X11R7.6/rdp/rdpup.c b/xorg/X11R7.6/rdp/rdpup.c index 325ee492..b8a763a7 100644 --- a/xorg/X11R7.6/rdp/rdpup.c +++ b/xorg/X11R7.6/rdp/rdpup.c @@ -137,14 +137,14 @@ static int g_rdp_opcodes[16] = static int g_do_kill_disconnected = 0; /* turn on or off */ static OsTimerPtr g_dis_timer = 0; static int g_disconnect_scheduled = 0; -static CARD32 g_disconnect_timeout = 60 * 1000; /* 60 seconds */ -static CARD32 g_disconnect_time = 0; /* time of disconnect */ +static CARD32 g_disconnect_timeout_s = 60; /* 60 seconds */ +static CARD32 g_disconnect_time_ms = 0; /* time of disconnect in milliseconds */ /******************************************************************************/ static CARD32 rdpDeferredDisconnectCallback(OsTimerPtr timer, CARD32 now, pointer arg) { - CARD32 lnow; + CARD32 lnow_ms; LLOGLN(10, ("rdpDeferredDisconnectCallback")); if (g_connected) @@ -165,8 +165,8 @@ rdpDeferredDisconnectCallback(OsTimerPtr timer, CARD32 now, pointer arg) { LLOGLN(10, ("rdpDeferredDisconnectCallback: not connected")); } - lnow = GetTimeInMillis(); - if (lnow - g_disconnect_time > g_disconnect_timeout) + lnow_ms = GetTimeInMillis(); + if (lnow_ms - g_disconnect_time_ms > g_disconnect_timeout_s * 1000) { LLOGLN(0, ("rdpDeferredDisconnectCallback: exit X11rdp")); kill(getpid(), SIGTERM); @@ -192,7 +192,7 @@ rdpup_disconnect(void) rdpDeferredDisconnectCallback, 0); g_disconnect_scheduled = 1; } - g_disconnect_time = GetTimeInMillis(); + g_disconnect_time_ms = GetTimeInMillis(); } RemoveEnabledDevice(g_sck); @@ -1063,20 +1063,31 @@ rdpup_init(void) ptext = getenv("XRDP_SESMAN_MAX_DISC_TIME"); if (ptext != 0) { - g_disconnect_timeout = atoi(ptext); + i = atoi(ptext); + if (i > 0) + { + g_do_kill_disconnected = 1; + g_disconnect_timeout_s = atoi(ptext); + } } ptext = getenv("XRDP_SESMAN_KILL_DISCONNECTED"); if (ptext != 0) { - g_do_kill_disconnected = atoi(ptext); + i = atoi(ptext); + if (i != 0) + { + g_do_kill_disconnected = 1; + g_disconnect_timeout_s = 0; + } } - if (g_disconnect_timeout == 0) + if (g_do_kill_disconnected && (g_disconnect_timeout_s < 60)) { - g_do_kill_disconnected = 0; + g_disconnect_timeout_s = 60; } - rdpLog("kill disconencted [%d] timeout [%d]\n", g_do_kill_disconnected, - g_disconnect_timeout); + + rdpLog("kill disconencted [%d] timeout [%d] sec\n", g_do_kill_disconnected, + g_disconnect_timeout_s); return 1; }