diff -Naur freenx-client-0.9/nxcl/configure.ac freenx-client.svn545.plusfixes/nxcl/configure.ac --- freenx-client-0.9/nxcl/configure.ac 2008-03-11 00:13:08.000000000 +0100 +++ freenx-client.svn545.plusfixes/nxcl/configure.ac 2008-07-10 10:01:24.000000000 +0200 @@ -5,7 +5,7 @@ AC_REVISION([$Revision: 1.3 $]) AC_PREFIX_DEFAULT(/usr/local) -AM_INIT_AUTOMAKE([1.10 foreign]) +AM_INIT_AUTOMAKE([1.9 foreign]) AM_CONFIG_HEADER(config.h) AM_MAINTAINER_MODE diff -Naur freenx-client-0.9/nxcl/doc/Makefile.am freenx-client.svn545.plusfixes/nxcl/doc/Makefile.am --- freenx-client-0.9/nxcl/doc/Makefile.am 2008-03-11 00:13:08.000000000 +0100 +++ freenx-client.svn545.plusfixes/nxcl/doc/Makefile.am 2008-07-10 10:01:24.000000000 +0200 @@ -2,8 +2,6 @@ DOXYFILE = Doxyfile -docdir = $(prefix)/doc/$(PACKAGE)-$(VERSION) - EXTRA_DIST = html SEDCMD1 = s/$$title/GNU nxcl documentation version $(VERSION)/g diff -Naur freenx-client-0.9/nxcl/lib/notQt.cpp freenx-client.svn545.plusfixes/nxcl/lib/notQt.cpp --- freenx-client-0.9/nxcl/lib/notQt.cpp 2008-03-11 00:13:08.000000000 +0100 +++ freenx-client.svn545.plusfixes/nxcl/lib/notQt.cpp 2009-07-25 17:07:36.000000000 +0200 @@ -19,6 +19,7 @@ #include <iostream> #include <sstream> +#include <cstdlib> extern "C" { #include <unistd.h> #include <errno.h> @@ -26,8 +27,10 @@ #include <sys/wait.h> #include <sys/stat.h> #include <sys/poll.h> +#include <sys/socket.h> #include <signal.h> } +#include <stdlib.h> #include "../config.h" #include "notQt.h" @@ -52,7 +55,8 @@ progName("unknown"), error (NOTQPROCNOERROR), pid(0), - signalledStart(false) + signalledStart(false), + parentFD(-1) { // Set up the polling structs this->p = static_cast<struct pollfd*>(malloc (2*sizeof (struct pollfd))); @@ -62,6 +66,15 @@ notQProcess::~notQProcess () { free (this->p); + if (parentFD != -1) + { + close(parentFD); + parentFD=-1; + } + // FIXME: this should be closed here + // close (parentToChild[READING_END]); + // close (childToParent[WRITING_END]); + // close (childErrToParent[WRITING_END]); } void @@ -84,10 +97,18 @@ // NB: The first item in the args list should be the program name. this->progName = program; +#ifdef NXCL_USE_NXSSH // Set up our pipes if (pipe(parentToChild) == -1 || pipe(childToParent) == -1 || pipe(childErrToParent) == -1) { return NOTQTPROCESS_FAILURE; } +#else /* We need a socketpair for that to work */ + if (socketpair(AF_UNIX, SOCK_STREAM, 0, parentToChild) == -1 || pipe(childErrToParent) == -1) + return NOTQTPROCESS_FAILURE; + + childToParent[READING_END]=dup(parentToChild[WRITING_END]); + childToParent[WRITING_END]=dup(parentToChild[READING_END]); +#endif this->pid = fork(); @@ -339,6 +360,9 @@ fn << "/tmp/notQt" << time(NULL); this->theFileName = fn.str(); this->f.open (this->theFileName.c_str(), ios::in|ios::out|ios::trunc); + if (chmod(this->theFileName.c_str(), S_IRUSR | S_IWUSR) == -1) { + perror("chmod"); + } } void diff -Naur freenx-client-0.9/nxcl/lib/notQt.h freenx-client.svn545.plusfixes/nxcl/lib/notQt.h --- freenx-client-0.9/nxcl/lib/notQt.h 2008-03-11 00:13:08.000000000 +0100 +++ freenx-client.svn545.plusfixes/nxcl/lib/notQt.h 2008-03-12 04:40:04.000000000 +0100 @@ -117,6 +117,18 @@ pid_t getPid (void) { return this->pid; } int getError (void) { return this->error; } void setError (int e) { this->error = e; } + + int getParentFD() + { + this->parentFD = this->parentToChild[1]; + close(this->childToParent[0]); + + // Create new pipes + pipe(this->parentToChild); + pipe(this->childToParent); + + return this->parentFD; + } /*! * Setter for the callbacks. @@ -180,6 +192,11 @@ * Pointer to a callback object */ notQProcessCallbacks * callbacks; + + /*! + * old parent FD for comm with child + */ + int parentFD; }; /*! diff -Naur freenx-client-0.9/nxcl/lib/nxclientlib.cpp freenx-client.svn545.plusfixes/nxcl/lib/nxclientlib.cpp --- freenx-client-0.9/nxcl/lib/nxclientlib.cpp 2008-03-11 00:13:08.000000000 +0100 +++ freenx-client.svn545.plusfixes/nxcl/lib/nxclientlib.cpp 2009-07-25 16:59:24.000000000 +0200 @@ -8,7 +8,8 @@ : Author: Sebastian James : (C) 2008 Defuturo Ltd : Author: George Wright - email : seb@esfnet.co.uk, gwright@kde.org + : (C) 2008 Fabian Franz + email : seb@esfnet.co.uk, gwright@kde.org, freenx@fabian-franz.de ***************************************************************************/ /*************************************************************************** @@ -27,6 +28,16 @@ #include "../config.h" #include <fstream> +#include <cstdlib> +#include <cstring> + +// Define to use nxssh +#if defined(NXCL_CYGWIN) || defined(NXCL_DARWIN) + +// FF-FIXME That does not work. +//#define NXCL_USE_NXSSH 1 + +#endif extern "C" { #include <errno.h> @@ -34,6 +45,8 @@ #include <sys/stat.h> #include <unistd.h> } +#include <stdlib.h> +#include <string.h> /* * On the location of nxproxy and nxssh binaries @@ -186,10 +199,14 @@ // Start to build the arguments for the nxssh command. // notQProcess requires that argv[0] contains the program name +#ifdef NXCL_USE_NXSSH arguments.push_back ("nxssh"); argtmp << "-nx"; arguments.push_back (argtmp.str()); +#else + arguments.push_back ("ssh"); +#endif argtmp.str(""); argtmp << "-p" << port; @@ -215,6 +232,7 @@ } argtmp.str(""); + // FF-FIXME: Perhaps the user wants to login as user directly argtmp << "nx@" << serverHost; arguments.push_back (argtmp.str()); @@ -227,9 +245,13 @@ arguments.push_back ("-oRSAAuthentication no"); arguments.push_back ("-oRhostsRSAAuthentication no"); arguments.push_back ("-oPubkeyAuthentication yes"); + // FF-FIXME: Perhaps the user wants to login as user directly + //arguments.push_back ("-c nxserver"); if (encryption == true) { +#ifdef NXCL_USE_NXSSH arguments.push_back("-B"); +#endif session.setEncryption (true); } else { session.setEncryption (false); @@ -240,10 +262,16 @@ // nxssh -E gives this message when called: // NX> 285 Enabling skip of SSH config files // ...so there you have the meaning. +#ifdef NXCL_USE_NXSSH arguments.push_back ("-E"); +#endif // Find a path for the nxssh process using getPath() +#ifdef NXCL_USE_NXSSH string nxsshPath = this->getPath ("nxssh"); +#else + string nxsshPath = this->getPath ("ssh"); +#endif this->nxsshProcess->start(nxsshPath, arguments); @@ -365,8 +393,9 @@ // On some connections this is sent via stdout instead of stderr? if (proxyData.encrypted && readyForProxy && - ((*msgiter).find("NX> 999 Bye")!=string::npos)) { - + ((*msgiter).find("NX> 999 Bye")!=string::npos)) +#ifdef NXCL_USE_NXSSH + { // This is "NX> 299 Switching connection to: " in // version 1.5.0. This was changed in nxssh version // 2.0.0-8 (see the nxssh CHANGELOG). @@ -388,6 +417,11 @@ this->externalCallbacks->connectedSuccessfullySignal(); this->sessionRunning = true; } +#else /* don't use nxssh, start nxproxy -stdin */ + { + invokeProxy(); + } +#endif if ((*msgiter).find("Password") != string::npos) { this->externalCallbacks->write @@ -402,6 +436,9 @@ dbgln ("NXClientLib::processParseStdout: Got auth failed" " or capacity reached, calling this->parseSSH."); msg = this->parseSSH (*msgiter); +#ifndef NXCL_USE_NXSSH + this->isFinished = true; +#endif } if (msg.size() > 0) { this->write (msg); @@ -436,7 +473,9 @@ + (*msgiter) + "'(end msg)"); if (proxyData.encrypted && readyForProxy && - ((*msgiter).find("NX> 999 Bye") != string::npos)) { + ((*msgiter).find("NX> 999 Bye") != string::npos)) +#ifdef NXCL_USE_NXSSH + { string switchCommand = "NX> 299 Switch connection to: "; stringstream ss; @@ -478,6 +517,11 @@ _("SSH host key verification failed")); this->isFinished = true; } +#else /* don't use nxssh, use nxproxy -stdin */ + { + invokeProxy(); + } +#endif } } @@ -580,21 +624,41 @@ this->externalCallbacks->serverCapacitySignal(); this->isFinished = true; - } else if + } +#ifdef NXCL_USE_NXSSH + else if (message.find ("NX> 204 Authentication failed.") != string::npos) { this->externalCallbacks->write (204, _("NX SSH Authentication Failed, finishing")); this->isFinished = true; } +#endif if (message.find("NX> 710 Session status: running") != string::npos) { this->externalCallbacks->write (710, _("Session status is \"running\"")); + } + + // FF-FIXME: This is technically incorrect as the proxy is just ready once 1002 and 1006 have + // been sent. + if (message.find("NX> 710 Session status: running") != string::npos) { + + //this->externalCallbacks->write + // (1006, _("Session status is \"running\"")); + +#ifdef NXCL_USE_NXSSH invokeProxy(); +#else + if (!proxyData.encrypted) + invokeProxy(); +#endif session.wipeSessions(); - rMessage = "bye\n"; + if (proxyData.encrypted) + rMessage = "bye\n"; + else + rMessage = "quit\n"; } return rMessage; @@ -700,18 +764,24 @@ stringstream data; if (proxyData.encrypted) { +#ifdef NXCL_USE_NXSSH data << "nx/nx" << x11Display << ",session=session,encryption=1,cookie=" << proxyData.cookie << ",id=" << proxyData.id << ",listen=" << proxyData.port << ":" << proxyData.display << "\n"; // may also need shmem=1,shpix=1,font=1,product=... +#else + data << "nx/nx" << x11Display << ",session=session,encryption=1,cookie=" + << proxyData.cookie + << ",id=" << proxyData.id << ":" << proxyData.display << "\n"; +#endif } else { - // Not tested yet + // Not tested yet, FF-FIXME: Test data << "nx/nx" << x11Display << ",session=session,cookie=" << proxyData.cookie - << ",id=" << proxyData.id - // << ",connect=" << proxyData.server << ":" << proxyData.display - << ",listen=" << proxyData.port << ":" << proxyData.display + << ",connect=" << proxyData.server << ":" << proxyData.port + << ",id=" << proxyData.id << ":" << proxyData.display + //<< ",listen=" << proxyData.port << ":" << proxyData.display << "\n"; } @@ -726,10 +796,23 @@ list<string> arguments; arguments.push_back("nxproxy"); // argv[0] has to be the program name arguments.push_back("-S"); + ss.str(""); - ss << "options=" << nxdir; - ss << ":" << proxyData.display; - arguments.push_back(ss.str()); + ss << "nx/nx,options=" << nxdir << ":" << proxyData.display; + + setenv("NX_DISPLAY", ss.str().c_str(), 1); + +#ifndef NXCL_USE_NXSSH + if (proxyData.encrypted) + { + ss.str(""); + ss << this->nxsshProcess->getParentFD(); + fprintf(stderr, "NX_COMMFD=%d", this->nxsshProcess->getParentFD()); + setenv("NX_COMMFD", ss.str().c_str(), 1); + // FF-FIXME: need to wait for 2 secs due to race condition with "bye" in buffer + sleep(2); + } +#endif // Find a path for the nxproxy process using getPath() string nxproxyPath = this->getPath ("nxproxy"); diff -Naur freenx-client-0.9/nxcl/lib/nxsession.cpp freenx-client.svn545.plusfixes/nxcl/lib/nxsession.cpp --- freenx-client-0.9/nxcl/lib/nxsession.cpp 2008-03-11 00:13:08.000000000 +0100 +++ freenx-client.svn545.plusfixes/nxcl/lib/nxsession.cpp 2008-03-12 04:40:04.000000000 +0100 @@ -69,6 +69,7 @@ int response = parseResponse (message); string returnMessage; +#ifdef NXCL_USE_NXSSH if (response == 211) { if (doSSH == true) { returnMessage = "yes"; @@ -80,6 +81,7 @@ if (response == 204) { // Authentication failed returnMessage = "204"; } +#endif if (response == 147) { // Server capacity reached returnMessage = "147"; @@ -90,6 +92,17 @@ case HELLO_NXCLIENT: dbgln ("HELLO_NXCLIENT stage"); + if (message.find("Are you sure you want to continue connecting (yes/no)?") != string::npos) + returnMessage = "yes"; // FF-FIXME: Or 211? + + if (message.find("assword") != string::npos) + returnMessage = nxPassword; // FF-FIXME: -> What to do? What to do? + + if (message.find("Permission denied") != string::npos || + message.find("su: Authentication failure") != string::npos || + message.find("Unknown id:") != string::npos) + returnMessage = "204"; // Authentication failed + if (message.find("HELLO NXSERVER - Version") != string::npos) { this->callbacks->authenticatedSignal(); returnMessage = "hello NXCLIENT - Version "; diff -Naur freenx-client-0.9/nxcl/nxcl/nxcl.cpp freenx-client.svn545.plusfixes/nxcl/nxcl/nxcl.cpp --- freenx-client-0.9/nxcl/nxcl/nxcl.cpp 2008-03-11 00:13:08.000000000 +0100 +++ freenx-client.svn545.plusfixes/nxcl/nxcl/nxcl.cpp 2009-07-25 16:59:24.000000000 +0200 @@ -20,6 +20,7 @@ #include "nxclientlib_i18n.h" #include "nxclientlib.h" #include <fstream> +#include <cstdlib> #include "nxcl.h" @@ -30,6 +31,7 @@ #include <dbus/dbus.h> #include <X11/Xlib.h> } +#include <stdlib.h> using namespace nxcl; using namespace std; diff -Naur freenx-client-0.9/qtnx/qtnx.pro freenx-client.svn545.plusfixes/qtnx/qtnx.pro --- freenx-client-0.9/qtnx/qtnx.pro 2008-03-11 00:13:09.000000000 +0100 +++ freenx-client.svn545.plusfixes/qtnx/qtnx.pro 2008-07-10 10:01:24.000000000 +0200 @@ -24,6 +24,8 @@ DEPENDPATH += $(QTDIR)/include -QT += ui xml +QT += gui xml TARGET = qtnx +target.path = $$[QT_INSTALL_BINS] +INSTALLS += target diff -Naur freenx-client-0.9/qtnx/qtnxwindow.cpp freenx-client.svn545.plusfixes/qtnx/qtnxwindow.cpp --- freenx-client-0.9/qtnx/qtnxwindow.cpp 2008-03-11 00:13:09.000000000 +0100 +++ freenx-client.svn545.plusfixes/qtnx/qtnxwindow.cpp 2009-07-25 17:07:19.000000000 +0200 @@ -274,7 +274,8 @@ key = config.key; session.key = "supplied"; } else - session.key = "default"; + session.key = "id.key"; + if (config.sessionType == "unix-application") session.customCommand = config.customCommand; @@ -290,13 +291,12 @@ m_NXClient->setDepth(getDepth()); - QString keyPath = "id.key"; #ifdef Q_WS_MAC keyPath = binaryPath + "/id.key"; #endif - m_NXClient->invokeNXSSH(keyPath.toStdString(), config.serverHost, config.encryption, "", + m_NXClient->invokeNXSSH(session.key, config.serverHost, config.encryption, config.key, config.serverPort); processProbe->start(30);