File obsoletes-nxssh.diff of Package freenx-client
Index: nxcl/lib/notQt.cpp
===================================================================
--- nxcl/lib/notQt.cpp.orig
+++ nxcl/lib/notQt.cpp
@@ -26,6 +26,7 @@ extern "C" {
#include <sys/wait.h>
#include <sys/stat.h>
#include <sys/poll.h>
+#include <sys/socket.h>
#include <signal.h>
}
#include <stdlib.h>
@@ -53,7 +54,8 @@ notQProcess::notQProcess () :
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)));
@@ -63,6 +65,15 @@ notQProcess::notQProcess () :
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
@@ -85,10 +96,18 @@ notQProcess::start (const string& progra
// 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();
Index: nxcl/lib/nxsession.cpp
===================================================================
--- nxcl/lib/nxsession.cpp.orig
+++ nxcl/lib/nxsession.cpp
@@ -69,6 +69,7 @@ string NXSession::parseSSH(string messag
int response = parseResponse (message);
string returnMessage;
+#ifdef NXCL_USE_NXSSH
if (response == 211) {
if (doSSH == true) {
returnMessage = "yes";
@@ -80,6 +81,7 @@ string NXSession::parseSSH(string messag
if (response == 204) { // Authentication failed
returnMessage = "204";
}
+#endif
if (response == 147) { // Server capacity reached
returnMessage = "147";
@@ -90,6 +92,17 @@ string NXSession::parseSSH(string messag
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 ";
Index: nxcl/lib/notQt.h
===================================================================
--- nxcl/lib/notQt.h.orig
+++ nxcl/lib/notQt.h
@@ -117,6 +117,18 @@ namespace nxcl {
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 @@ namespace nxcl {
* Pointer to a callback object
*/
notQProcessCallbacks * callbacks;
+
+ /*!
+ * old parent FD for comm with child
+ */
+ int parentFD;
};
/*!
Index: nxcl/lib/nxclientlib.cpp
===================================================================
--- nxcl/lib/nxclientlib.cpp.orig
+++ nxcl/lib/nxclientlib.cpp
@@ -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
***************************************************************************/
/***************************************************************************
@@ -28,6 +29,14 @@
#include <fstream>
+// 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>
#include <sys/types.h>
@@ -188,10 +197,14 @@ void NXClientLib::invokeNXSSH (string pu
// 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;
@@ -217,6 +230,7 @@ void NXClientLib::invokeNXSSH (string pu
}
argtmp.str("");
+ // FF-FIXME: Perhaps the user wants to login as user directly
argtmp << "nx@" << serverHost;
arguments.push_back (argtmp.str());
@@ -229,9 +243,13 @@ void NXClientLib::invokeNXSSH (string pu
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);
@@ -242,10 +260,16 @@ void NXClientLib::invokeNXSSH (string pu
// 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);
@@ -367,8 +391,9 @@ void NXClientLib::processParseStdout()
// 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).
@@ -390,6 +415,11 @@ void NXClientLib::processParseStdout()
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
@@ -404,6 +434,9 @@ void NXClientLib::processParseStdout()
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);
@@ -438,7 +471,9 @@ void NXClientLib::processParseStderr()
+ (*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;
@@ -480,6 +515,11 @@ void NXClientLib::processParseStderr()
_("SSH host key verification failed"));
this->isFinished = true;
}
+#else /* don't use nxssh, use nxproxy -stdin */
+ {
+ invokeProxy();
+ }
+#endif
}
}
@@ -582,21 +622,41 @@ string NXClientLib::parseSSH (string mes
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;
@@ -702,18 +762,24 @@ void NXClientLib::invokeProxy()
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";
}
@@ -728,10 +794,23 @@ void NXClientLib::invokeProxy()
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");