Subject: x2goclient 4.0.5.0 overwrites user's shell

From: Orion Poplawski <[email-masked]>
Date: Tue, 25 Aug 2015 11:28:02 -0600

Package: x2goclient
Version: 4.0.5.0
Tags: patch

See https://bugzilla.redhat.com/show_bug.cgi?id=1256799

Description of problem:
After upgrading x2goclient my system assigned shell of /bin/zsh is ignored and
forcefully set to /bin/bash

The shift to running everything under /bin/bash had the side effect of setting
SHELL to /bin/bash, which is then what terminal emulators and others use for
spawning shells.

If we specify -l to bash it runs as a login shell, sources the proper startup
files and sets SHELL to whatever getpwent() returns for the login shell.

However, this also opens the door for things like ~/.bash_logout to get run
which executes "clear", which emits:

TERM environment variable not set.

when TERM is empty as it is here.  So we also set TERM=dumb to work around that.

It might be nice to add the ability to distinguish between a session startup
command and other utility commands (x2gomountdirs, etc.) and only add -l to
the session startup commands.  This is probably more appropriate.

-- 
Orion Poplawski
Technical Manager                     303-415-9701 x222
NWRA, Boulder/CoRA Office             FAX: 303-415-9702
3380 Mitchell Lane                       [email-masked]
Boulder, CO 80301                   http://www.nwra.com
diff --git a/src/sshprocess.cpp b/src/sshprocess.cpp
index 4866c2b..2e599b5 100644
--- a/src/sshprocess.cpp
+++ b/src/sshprocess.cpp
@@ -200,8 +200,8 @@ void SshProcess::startNormal(const QString& cmd)
 // #endif
     if(!masterCon->useKerberos())
     {
-        QString shcmd = "bash -c 'echo \"X2GODATABEGIN:" + uuidStr + "\"; export PATH=\"/usr/local/bin:/usr/bin:/bin\"; "+cmd+"; echo \"X2GODATAEND:" + uuidStr + "\";'";
-        x2goDebug << "Running masterCon->addChannelConnection(this, '" << uuidStr << "', '" << shcmd.left (200) << "');";
+        QString shcmd = "bash -l -c 'echo \"X2GODATABEGIN:" + uuidStr + "\"; export PATH=\"/usr/local/bin:/usr/bin:/bin\"; export TERM=dumb; "+cmd+"; echo \"X2GODATAEND:" + uuidStr + "\";'";
+        x2goDebug << "this="<<this<<" Running masterCon->addChannelConnection(this, '" << uuidStr << "', '" << shcmd.left (200) << "');";
         masterCon->addChannelConnection(this, uuidStr, shcmd);
         connect(masterCon,SIGNAL(stdOut(SshProcess*,QByteArray)),this,SLOT(slotStdOut(SshProcess*,QByteArray)));
         connect(masterCon,SIGNAL(channelClosed(SshProcess*,QString)), this,SLOT(slotChannelClosed(SshProcess*,QString)));
@@ -222,7 +222,7 @@ void SshProcess::startNormal(const QString& cmd)
          * as there is no preceding "outer double quote" the whole argument
          * is wrapped in.
          */
-        shcmd = "bash -c 'echo \"X2GODATABEGIN:" + uuidStr + "\"; export PATH=\"/usr/local/bin:/usr/bin:/bin\"; "+cmd+"; echo \"X2GODATAEND:" + uuidStr + "\";'";
+        shcmd = "bash -l -c 'echo \"X2GODATABEGIN:" + uuidStr + "\"; export PATH=\"/usr/local/bin:/usr/bin:/bin\"; export TERM=dumb; "+cmd+"; echo \"X2GODATAEND:" + uuidStr + "\";'";
 
         proc=new QProcess(this);
         QString local_cmd = "";