]> andersk Git - openssh.git/blobdiff - session.c
- markus@cvs.openbsd.org 2001/03/20 19:21:21
[openssh.git] / session.c
index 4562b6d72bec7cb80e0013b33242fb5d67347857..800f2112741b9dec3786f993cbf8deb33b37a6cd 100644 (file)
--- a/session.c
+++ b/session.c
@@ -33,7 +33,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: session.c,v 1.59 2001/03/04 01:46:30 djm Exp $");
+RCSID("$OpenBSD: session.c,v 1.64 2001/03/20 19:35:29 markus Exp $");
 
 #include "ssh.h"
 #include "ssh1.h"
@@ -89,6 +89,10 @@ RCSID("$OpenBSD: session.c,v 1.59 2001/03/04 01:46:30 djm Exp $");
 # define S_UNOFILE_HARD        S_UNOFILE "_hard"
 #endif
 
+#ifdef _AIX
+# include <uinfo.h>
+#endif
+
 /* types */
 
 #define TTYSZ 64
@@ -96,7 +100,6 @@ typedef struct Session Session;
 struct Session {
        int     used;
        int     self;
-       int     extended;
        struct  passwd *pw;
        pid_t   pid;
        /* tty */
@@ -112,6 +115,7 @@ struct Session {
        int     single_connection;
        /* proto 2 */
        int     chanid;
+       int     is_subsystem;
 };
 
 /* func */
@@ -120,14 +124,10 @@ Session *session_new(void);
 void   session_set_fds(Session *s, int fdin, int fdout, int fderr);
 void   session_pty_cleanup(Session *s);
 void   session_proctitle(Session *s);
-void   do_exec_pty(Session *s, const char *command, struct passwd * pw);
-void   do_exec_no_pty(Session *s, const char *command, struct passwd * pw);
+void   do_exec_pty(Session *s, const char *command);
+void   do_exec_no_pty(Session *s, const char *command);
 void   do_login(Session *s, const char *command);
-
-void
-do_child(const char *command, struct passwd * pw, const char *term,
-    const char *display, const char *auth_proto,
-    const char *auth_data, const char *ttyname);
+void   do_child(Session *s, const char *command);
 
 /* import */
 extern ServerOptions options;
@@ -228,13 +228,6 @@ do_authenticated(struct passwd * pw)
                startup_pipe = -1;
        }
 
-       /*
-        * Inform the channel mechanism that we are the server side and that
-        * the client may request to connect to any port at all. (The user
-        * could do it anyway, and we wouldn\'t know what is permitted except
-        * by the client telling us, so we can equally well trust the client
-        * not to request anything bogus.)
-        */
        if (!no_port_forwarding_flag && options.allow_tcp_forwarding)
                channel_permit_all_opens();
 
@@ -428,9 +421,9 @@ do_authenticated(struct passwd * pw)
                                debug("Forced command '%.500s'", forced_command);
                        }
                        if (have_pty)
-                               do_exec_pty(s, command, pw);
+                               do_exec_pty(s, command);
                        else
-                               do_exec_no_pty(s, command, pw);
+                               do_exec_no_pty(s, command);
 
                        if (command != NULL)
                                xfree(command);
@@ -464,7 +457,7 @@ do_authenticated(struct passwd * pw)
  * setting up file descriptors and such.
  */
 void
-do_exec_no_pty(Session *s, const char *command, struct passwd * pw)
+do_exec_no_pty(Session *s, const char *command)
 {
        int pid;
 
@@ -543,7 +536,7 @@ do_exec_no_pty(Session *s, const char *command, struct passwd * pw)
 #endif /* USE_PIPES */
 
                /* Do processing for the child (exec command etc). */
-               do_child(command, pw, NULL, s->display, s->auth_proto, s->auth_data, NULL);
+               do_child(s, command);
                /* NOTREACHED */
        }
 #ifdef HAVE_CYGWIN
@@ -562,11 +555,11 @@ do_exec_no_pty(Session *s, const char *command, struct passwd * pw)
        close(perr[1]);
 
        if (compat20) {
-               session_set_fds(s, pin[1], pout[0], s->extended ? perr[0] : -1);
+               session_set_fds(s, pin[1], pout[0], s->is_subsystem ? -1 : perr[0]);
        } else {
                /* Enter the interactive session. */
                server_loop(pid, pin[1], pout[0], perr[0]);
-               /* server_loop has closed pin[1], pout[1], and perr[1]. */
+               /* server_loop has closed pin[1], pout[0], and perr[0]. */
        }
 #else /* USE_PIPES */
        /* We are the parent.  Close the child sides of the socket pairs. */
@@ -578,7 +571,7 @@ do_exec_no_pty(Session *s, const char *command, struct passwd * pw)
         * handle the case that fdin and fdout are the same.
         */
        if (compat20) {
-               session_set_fds(s, inout[1], inout[1], s->extended ? err[1] : -1);
+               session_set_fds(s, inout[1], inout[1], s->is_subsystem ? -1 : err[1]);
        } else {
                server_loop(pid, inout[1], inout[1], err[1]);
                /* server_loop has closed inout[1] and err[1]. */
@@ -593,7 +586,7 @@ do_exec_no_pty(Session *s, const char *command, struct passwd * pw)
  * lastlog, and other such operations.
  */
 void
-do_exec_pty(Session *s, const char *command, struct passwd * pw)
+do_exec_pty(Session *s, const char *command)
 {
        int fdout, ptyfd, ttyfd, ptymaster;
        pid_t pid;
@@ -641,8 +634,7 @@ do_exec_pty(Session *s, const char *command, struct passwd * pw)
                        do_login(s, command);
 
                /* Do common processing for the child, such as execing the command. */
-               do_child(command, pw, s->term, s->display, s->auth_proto,
-                   s->auth_data, s->tty);
+               do_child(s, command);
                /* NOTREACHED */
        }
 #ifdef HAVE_CYGWIN
@@ -1008,11 +1000,10 @@ void set_limits_from_userattr(char *user)
  * ids, and executing the command or shell.
  */
 void
-do_child(const char *command, struct passwd * pw, const char *term,
-        const char *display, const char *auth_proto,
-        const char *auth_data, const char *ttyname)
+do_child(Session *s, const char *command)
 {
        const char *shell, *hostname = NULL, *cp = NULL;
+       struct passwd * pw = s->pw;
        char buf[256];
        char cmd[1024];
        FILE *f = NULL;
@@ -1021,6 +1012,7 @@ do_child(const char *command, struct passwd * pw, const char *term,
        extern char **environ;
        struct stat st;
        char *argv[10];
+       int do_xauth = s->auth_proto != NULL && s->auth_data != NULL;
 #ifdef WITH_IRIX_PROJECT
        prid_t projid;
 #endif /* WITH_IRIX_PROJECT */
@@ -1061,7 +1053,7 @@ do_child(const char *command, struct passwd * pw, const char *term,
           switch, so we let login(1) to this for us. */
        if (!options.use_login) {
 #ifdef HAVE_OSF_SIA
-               session_setup_sia(pw->pw_name, ttyname);
+               session_setup_sia(pw->pw_name, s->ttyfd == -1 ? NULL : s->tty);
 #else /* HAVE_OSF_SIA */
 #ifdef HAVE_CYGWIN
                if (is_winnt) {
@@ -1136,6 +1128,25 @@ do_child(const char *command, struct passwd * pw, const char *term,
                        }
 #endif /* WITH_IRIX_AUDIT */
 
+#ifdef _AIX
+                       /*
+                        * AIX has a "usrinfo" area where logname and
+                        * other stuff is stored - a few applications
+                        * actually use this and die if it's not set
+                        */
+                       if (s->ttyfd == -1)
+                               s->tty[0] = '\0';
+                       cp = xmalloc(22 + strlen(s->tty) + 
+                           2 * strlen(pw->pw_name));
+                       i = sprintf(cp, "LOGNAME=%s%cNAME=%s%cTTY=%s%c%c",
+                           pw->pw_name, 0, pw->pw_name, 0, s->tty, 0, 0);
+                       if (usrinfo(SETUINFO, cp, i) == -1)
+                               fatal("Couldn't set usrinfo: %s", 
+                                   strerror(errno));
+                       debug3("AIX/UsrInfo: set len %d", i);
+                       xfree(cp);
+#endif
+
                        /* Permanently switch to the desired uid. */
                        permanently_set_uid(pw->pw_uid);
 # endif /* HAVE_LOGIN_CAP */
@@ -1231,12 +1242,12 @@ do_child(const char *command, struct passwd * pw, const char *term,
                 get_remote_ipaddr(), get_remote_port(), get_local_port());
        child_set_env(&env, &envsize, "SSH_CLIENT", buf);
 
-       if (ttyname)
-               child_set_env(&env, &envsize, "SSH_TTY", ttyname);
-       if (term)
-               child_set_env(&env, &envsize, "TERM", term);
-       if (display)
-               child_set_env(&env, &envsize, "DISPLAY", display);
+       if (s->ttyfd != -1)
+               child_set_env(&env, &envsize, "SSH_TTY", s->tty);
+       if (s->term)
+               child_set_env(&env, &envsize, "TERM", s->term);
+       if (s->display)
+               child_set_env(&env, &envsize, "DISPLAY", s->display);
        if (original_command)
                child_set_env(&env, &envsize, "SSH_ORIGINAL_COMMAND",
                    original_command);
@@ -1342,60 +1353,64 @@ do_child(const char *command, struct passwd * pw, const char *term,
        if (!options.use_login) {
                if (stat(_PATH_SSH_USER_RC, &st) >= 0) {
                        if (debug_flag)
-                               fprintf(stderr, "Running %s %s\n", _PATH_BSHELL, _PATH_SSH_USER_RC);
-
+                               fprintf(stderr, "Running %s %s\n", _PATH_BSHELL,
+                                   _PATH_SSH_USER_RC);
                        f = popen(_PATH_BSHELL " " _PATH_SSH_USER_RC, "w");
                        if (f) {
-                               if (auth_proto != NULL && auth_data != NULL)
-                                       fprintf(f, "%s %s\n", auth_proto, auth_data);
+                               if (do_xauth)
+                                       fprintf(f, "%s %s\n", s->auth_proto,
+                                           s->auth_data);
                                pclose(f);
                        } else
-                               fprintf(stderr, "Could not run %s\n", _PATH_SSH_USER_RC);
+                               fprintf(stderr, "Could not run %s\n", 
+                                   _PATH_SSH_USER_RC);
                } else if (stat(_PATH_SSH_SYSTEM_RC, &st) >= 0) {
                        if (debug_flag)
-                               fprintf(stderr, "Running %s %s\n", _PATH_BSHELL, _PATH_SSH_SYSTEM_RC);
+                               fprintf(stderr, "Running %s %s\n", _PATH_BSHELL,
+                                   _PATH_SSH_SYSTEM_RC);
 
                        f = popen(_PATH_BSHELL " " _PATH_SSH_SYSTEM_RC, "w");
                        if (f) {
-                               if (auth_proto != NULL && auth_data != NULL)
-                                       fprintf(f, "%s %s\n", auth_proto, auth_data);
+                               if (do_xauth)
+                                       fprintf(f, "%s %s\n", s->auth_proto,
+                                           s->auth_data);
                                pclose(f);
                        } else
-                               fprintf(stderr, "Could not run %s\n", _PATH_SSH_SYSTEM_RC);
-               } else if (options.xauth_location != NULL) {
+                               fprintf(stderr, "Could not run %s\n",
+                                   _PATH_SSH_SYSTEM_RC);
+               } else if (do_xauth && options.xauth_location != NULL) {
                        /* Add authority data to .Xauthority if appropriate. */
-                       if (auth_proto != NULL && auth_data != NULL) {
-                               char *screen = strchr(display, ':');
-                               if (debug_flag) {
+                       char *screen = strchr(s->display, ':');
+
+                       if (debug_flag) {
+                               fprintf(stderr,
+                                   "Running %.100s add "
+                                   "%.100s %.100s %.100s\n",
+                                   options.xauth_location, s->display,
+                                   s->auth_proto, s->auth_data);
+                               if (screen != NULL)
                                        fprintf(stderr,
-                                           "Running %.100s add %.100s %.100s %.100s\n",
-                                           options.xauth_location, display,
-                                           auth_proto, auth_data);
-#ifndef NO_X11_UNIX_SOCKETS
-                                       if (screen != NULL)
-                                               fprintf(stderr,
-                                                   "Adding %.*s/unix%s %s %s\n",
-                                                   (int)(screen-display), display,
-                                                   screen, auth_proto, auth_data);
-#endif /* NO_X11_UNIX_SOCKETS */
-                               }
-                               snprintf(cmd, sizeof cmd, "%s -q -",
-                                   options.xauth_location);
-                               f = popen(cmd, "w");
-                               if (f) {
-                                       fprintf(f, "add %s %s %s\n", display,
-                                           auth_proto, auth_data);
-#ifndef NO_X11_UNIX_SOCKETS
-                                       if (screen != NULL)
-                                               fprintf(f, "add %.*s/unix%s %s %s\n",
-                                                   (int)(screen-display), display,
-                                                   screen, auth_proto, auth_data);
-#endif /* NO_X11_UNIX_SOCKETS */
-                                       pclose(f);
-                               } else {
-                                       fprintf(stderr, "Could not run %s\n",
-                                           cmd);
-                               }
+                                           "Adding %.*s/unix%s %s %s\n",
+                                           (int)(screen - s->display),
+                                           s->display, screen,
+                                           s->auth_proto, s->auth_data);
+                       }
+                       snprintf(cmd, sizeof cmd, "%s -q -",
+                           options.xauth_location);
+                       f = popen(cmd, "w");
+                       if (f) {
+                               fprintf(f, "add %s %s %s\n", s->display,
+                                   s->auth_proto, s->auth_data);
+                               if (screen != NULL)
+                                       fprintf(f, "add %.*s/unix%s %s %s\n",
+                                           (int)(screen - s->display),
+                                           s->display, screen,
+                                           s->auth_proto,
+                                           s->auth_data);
+                               pclose(f);
+                       } else {
+                               fprintf(stderr, "Could not run %s\n",
+                                   cmd);
                        }
                }
                /* Get the last component of the shell name. */
@@ -1418,9 +1433,10 @@ do_child(const char *command, struct passwd * pw, const char *term,
                         * Check for mail if we have a tty and it was enabled
                         * in server options.
                         */
-                       if (ttyname && options.check_mail) {
+                       if (s->ttyfd != -1 && options.check_mail) {
                                char *mailbox;
                                struct stat mailstat;
+
                                mailbox = getenv("MAIL");
                                if (mailbox != NULL) {
                                        if (stat(mailbox, &mailstat) != 0 ||
@@ -1488,7 +1504,7 @@ session_new(void)
                Session *s = &sessions[i];
                if (! s->used) {
                        s->pid = 0;
-                       s->extended = 0;
+                       s->is_subsystem = 0;
                        s->chanid = -1;
                        s->ptyfd = -1;
                        s->ttyfd = -1;
@@ -1645,7 +1661,8 @@ session_subsystem_req(Session *s)
        for (i = 0; i < options.num_subsystems; i++) {
                if(strcmp(subsys, options.subsystem_name[i]) == 0) {
                        debug("subsystem: exec() %s", options.subsystem_command[i]);
-                       do_exec_no_pty(s, options.subsystem_command[i], s->pw);
+                       s->is_subsystem = 1;
+                       do_exec_no_pty(s, options.subsystem_command[i]);
                        success = 1;
                }
        }
@@ -1719,11 +1736,10 @@ session_shell_req(Session *s)
        /* if forced_command == NULL, the shell is execed */
        char *shell = forced_command;
        packet_done();
-       s->extended = 1;
        if (s->ttyfd == -1)
-               do_exec_no_pty(s, shell, s->pw);
+               do_exec_no_pty(s, shell);
        else
-               do_exec_pty(s, shell, s->pw);
+               do_exec_pty(s, shell);
        return 1;
 }
 
@@ -1738,11 +1754,10 @@ session_exec_req(Session *s)
                command = forced_command;
                debug("Forced command '%.500s'", forced_command);
        }
-       s->extended = 1;
        if (s->ttyfd == -1)
-               do_exec_no_pty(s, command, s->pw);
+               do_exec_no_pty(s, command);
        else
-               do_exec_pty(s, command, s->pw);
+               do_exec_pty(s, command);
        if (forced_command == NULL)
                xfree(command);
        return 1;
@@ -1789,8 +1804,8 @@ session_input_channel_req(int id, void *arg)
            s->self, id, rtype, reply);
 
        /*
-        * a session is in LARVAL state until a shell
-        * or programm is executed
+        * a session is in LARVAL state until a shell, a command
+        * or a subsystem is executed
         */
        if (c->type == SSH_CHANNEL_LARVAL) {
                if (strcmp(rtype, "shell") == 0) {
@@ -2016,6 +2031,8 @@ do_authenticated2(Authctxt *authctxt)
                close(startup_pipe);
                startup_pipe = -1;
        }
+       if (!no_port_forwarding_flag && options.allow_tcp_forwarding)
+               channel_permit_all_opens();
 #if defined(HAVE_LOGIN_CAP) && defined(HAVE_PW_CLASS_IN_PASSWD)
        if ((lc = login_getclass(authctxt->pw->pw_class)) == NULL) {
                error("unable to get login class");
This page took 0.052623 seconds and 4 git commands to generate.