diff --git a/sesman/auth.h b/sesman/auth.h index a6c5e7f..86bfc96 100644 --- a/sesman/auth.h +++ b/sesman/auth.h @@ -58,6 +58,16 @@ auth_start_session(long in_val, int in_display); * */ int DEFAULT_CC +auth_stop_session(long in_val); + +/** + * + * @brief FIXME + * @param in_val + * @return 0 on success, 1 on failure + * + */ +int DEFAULT_CC auth_end(long in_val); /** diff --git a/sesman/session.c b/sesman/session.c index 36262ad..24e40d1 100644 --- a/sesman/session.c +++ b/sesman/session.c @@ -310,7 +310,7 @@ session_start_fork(int width, int height, int bpp, char* username, { int display = 0; int pid = 0; - int wmpid = 0; + int wmpid = 0, pampid = 0; int xpid = 0; int i = 0; char geometry[32]; @@ -369,7 +369,6 @@ session_start_fork(int width, int height, int bpp, char* username, } else if (pid == 0) /* child sesman */ { - auth_start_session(data, display); g_sprintf(geometry, "%dx%d", width, height); g_sprintf(depth, "%d", bpp); g_sprintf(screen, ":%d", display); @@ -380,80 +379,94 @@ session_start_fork(int width, int height, int bpp, char* username, else if (wmpid == 0) /* child (child sesman) xserver */ { wait_for_xserver(display); - env_set_user(username, 0, display); - if (x_server_running(display)) + auth_start_session(data, display); + pampid = g_fork(); + if(pampid == -1) { - auth_set_env(data); - if (directory != 0) + } + else if (pampid == 0) /* child: X11/client */ + { + env_set_user(username, 0, display); + if (x_server_running(display)) { - if (directory[0] != 0) + auth_set_env(data); + if (directory != 0) { - g_set_current_dir(directory); + if (directory[0] != 0) + { + g_set_current_dir(directory); + } } - } - if (program != 0) - { - if (program[0] != 0) + if (program != 0) { - g_execlp3(program, program, 0); - log_message(&(g_cfg->log), LOG_LEVEL_ALWAYS, - "error starting program %s for user %s - pid %d", - program, username, g_getpid()); + if (program[0] != 0) + { + g_execlp3(program, program, 0); + log_message(&(g_cfg->log), LOG_LEVEL_ALWAYS, + "error starting program %s for user %s - pid %d", + program, username, g_getpid()); + } } - } - /* try to execute user window manager if enabled */ - if (g_cfg->enable_user_wm) - { - g_sprintf(text,"%s/%s", g_getenv("HOME"), g_cfg->user_wm); - if (g_file_exist(text)) + /* try to execute user window manager if enabled */ + if (g_cfg->enable_user_wm) { - g_execlp3(text, g_cfg->user_wm, 0); - log_message(&(g_cfg->log), LOG_LEVEL_ALWAYS,"error starting user " - "wm for user %s - pid %d", username, g_getpid()); - /* logging parameters */ - log_message(&(g_cfg->log), LOG_LEVEL_DEBUG, "errno: %d, " - "description: %s", errno, g_get_strerror()); - log_message(&(g_cfg->log), LOG_LEVEL_DEBUG,"execlp3 parameter " - "list:"); - log_message(&(g_cfg->log), LOG_LEVEL_DEBUG, " argv[0] = %s", - text); - log_message(&(g_cfg->log), LOG_LEVEL_DEBUG, " argv[1] = %s", - g_cfg->user_wm); + g_sprintf(text,"%s/%s", g_getenv("HOME"), g_cfg->user_wm); + if (g_file_exist(text)) + { + g_execlp3(text, g_cfg->user_wm, 0); + log_message(&(g_cfg->log), LOG_LEVEL_ALWAYS,"error starting user " + "wm for user %s - pid %d", username, g_getpid()); + /* logging parameters */ + log_message(&(g_cfg->log), LOG_LEVEL_DEBUG, "errno: %d, " + "description: %s", errno, g_get_strerror()); + log_message(&(g_cfg->log), LOG_LEVEL_DEBUG,"execlp3 parameter " + "list:"); + log_message(&(g_cfg->log), LOG_LEVEL_DEBUG, " argv[0] = %s", + text); + log_message(&(g_cfg->log), LOG_LEVEL_DEBUG, " argv[1] = %s", + g_cfg->user_wm); + } } + /* if we're here something happened to g_execlp3 + so we try running the default window manager */ + g_sprintf(text, "%s/%s", XRDP_CFG_PATH, g_cfg->default_wm); + g_execlp3(text, g_cfg->default_wm, 0); + + log_message(&(g_cfg->log), LOG_LEVEL_ALWAYS,"error starting default " + "wm for user %s - pid %d", username, g_getpid()); + /* logging parameters */ + log_message(&(g_cfg->log), LOG_LEVEL_DEBUG, "errno: %d, description: " + "%s", errno, g_get_strerror()); + log_message(&(g_cfg->log), LOG_LEVEL_DEBUG,"execlp3 parameter list:"); + log_message(&(g_cfg->log), LOG_LEVEL_DEBUG, " argv[0] = %s", + text); + log_message(&(g_cfg->log), LOG_LEVEL_DEBUG, " argv[1] = %s", + g_cfg->default_wm); + + /* still a problem starting window manager just start xterm */ + g_execlp3("xterm", "xterm", 0); + + /* should not get here */ + log_message(&(g_cfg->log), LOG_LEVEL_ALWAYS,"error starting xterm " + "for user %s - pid %d", username, g_getpid()); + /* logging parameters */ + log_message(&(g_cfg->log), LOG_LEVEL_DEBUG, "errno: %d, description: " + "%s", errno, g_get_strerror()); } - /* if we're here something happened to g_execlp3 - so we try running the default window manager */ - g_sprintf(text, "%s/%s", XRDP_CFG_PATH, g_cfg->default_wm); - g_execlp3(text, g_cfg->default_wm, 0); - - log_message(&(g_cfg->log), LOG_LEVEL_ALWAYS,"error starting default " - "wm for user %s - pid %d", username, g_getpid()); - /* logging parameters */ - log_message(&(g_cfg->log), LOG_LEVEL_DEBUG, "errno: %d, description: " - "%s", errno, g_get_strerror()); - log_message(&(g_cfg->log), LOG_LEVEL_DEBUG,"execlp3 parameter list:"); - log_message(&(g_cfg->log), LOG_LEVEL_DEBUG, " argv[0] = %s", - text); - log_message(&(g_cfg->log), LOG_LEVEL_DEBUG, " argv[1] = %s", - g_cfg->default_wm); - - /* still a problem starting window manager just start xterm */ - g_execlp3("xterm", "xterm", 0); - - /* should not get here */ - log_message(&(g_cfg->log), LOG_LEVEL_ALWAYS,"error starting xterm " - "for user %s - pid %d", username, g_getpid()); - /* logging parameters */ - log_message(&(g_cfg->log), LOG_LEVEL_DEBUG, "errno: %d, description: " - "%s", errno, g_get_strerror()); + else + { + log_message(&(g_cfg->log), LOG_LEVEL_ERROR, "another Xserver is " + "already active on display %d", display); + } + log_message(&(g_cfg->log), LOG_LEVEL_DEBUG,"aborting connection..."); + g_exit(0); } else { - log_message(&(g_cfg->log), LOG_LEVEL_ERROR, "another Xserver is " - "already active on display %d", display); + g_waitpid(pampid); + auth_stop_session(data); + g_exit(0); } - log_message(&(g_cfg->log), LOG_LEVEL_DEBUG,"aborting connection..."); - g_exit(0); } else /* parent (child sesman) */ { diff --git a/sesman/verify_user_pam.c b/sesman/verify_user_pam.c index e3d8596..54aaeaa 100644 --- a/sesman/verify_user_pam.c +++ b/sesman/verify_user_pam.c @@ -173,6 +173,26 @@ auth_start_session(long in_val, int in_display) /******************************************************************************/ /* returns error */ +int DEFAULT_CC +auth_stop_session(long in_val) +{ + struct t_auth_info* auth_info; + int error; + + auth_info = (struct t_auth_info*)in_val; + error = pam_close_session(auth_info->ph, 0); + if (error != PAM_SUCCESS) + { + g_printf("pam_close_session failed: %s\r\n", + pam_strerror(auth_info->ph, error)); + return 1; + } + auth_info->session_opened = 0; + return 0; +} + +/******************************************************************************/ +/* returns error */ /* cleanup */ int DEFAULT_CC auth_end(long in_val)