[xrdp] add xrdp-pam_session.patch from bz#821569

Itamar Reis Peixoto itamarjp at fedoraproject.org
Thu May 24 02:20:43 UTC 2012


commit 9896b62c9b2dcbd83e36cc2da7caef2d8ca294ae
Author: Itamar Reis Peixoto <itamar at ispbrasil.com.br>
Date:   Wed May 23 23:18:45 2012 -0300

    add xrdp-pam_session.patch from bz#821569

 xrdp-pam_session.patch |  229 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 229 insertions(+), 0 deletions(-)
---
diff --git a/xrdp-pam_session.patch b/xrdp-pam_session.patch
new file mode 100644
index 0000000..cc4fcb9
--- /dev/null
+++ b/xrdp-pam_session.patch
@@ -0,0 +1,229 @@
+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)


More information about the scm-commits mailing list