This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository x2goclient. commit c788a1424ce7a270fd65e028da190d9f16586d05 Author: Tor Perkins <x2go34@noid.net> Date: Wed May 4 03:30:19 2016 +0200 src/{onmainwindow,sshmasterconnection}.{cpp,h}: add support for ANSI X9.9 OTP tokens. Fixes: #1027. For this to work correctly, the challenge string needs to be displayed to the user. --- debian/changelog | 6 ++++++ src/onmainwindow.cpp | 29 +++++++++++++++++++++++++++++ src/onmainwindow.h | 1 + src/sshmasterconnection.cpp | 26 ++++++++++++++++++-------- src/sshmasterconnection.h | 1 + 5 files changed, 55 insertions(+), 8 deletions(-) diff --git a/debian/changelog b/debian/changelog index 80d3c80..d418845 100644 --- a/debian/changelog +++ b/debian/changelog @@ -37,6 +37,12 @@ x2goclient (4.0.5.2-0x2go1) UNRELEASED; urgency=medium * New upstream version (4.0.5.2): - misc {src/,x2goclient.pro}: port to Qt5. + [ Tor Perkins ] + * New upstream release (4.0.5.2): + - src/{onmainwindow,sshmasterconnection}.{cpp,h}: add support for ANSI + X9.9 OTP tokens. Fixes: #1027. For this to work correctly, the challenge + string needs to be displayed to the user. + -- X2Go Release Manager <git-admin@x2go.org> Thu, 24 Mar 2016 23:04:42 +0100 x2goclient (4.0.5.1-0x2go1) unstable; urgency=low diff --git a/src/onmainwindow.cpp b/src/onmainwindow.cpp index c7fffd7..18ca368 100644 --- a/src/onmainwindow.cpp +++ b/src/onmainwindow.cpp @@ -2825,6 +2825,8 @@ SshMasterConnection* ONMainWindow::startSshConnection ( QString host, QString po SLOT ( slotSshServerAuthError ( int,QString, SshMasterConnection* ) ) ); connect ( con, SIGNAL ( needPassPhrase(SshMasterConnection*, bool)),this, SLOT ( slotSshServerAuthPassphrase(SshMasterConnection*, bool)) ); + connect ( con, SIGNAL ( needChallengeResponse(SshMasterConnection*, QString)),this, + SLOT ( slotSshServerAuthChallengeResponse(SshMasterConnection*, QString)) ); connect ( con, SIGNAL ( userAuthError ( QString ) ),this,SLOT ( slotSshUserAuthError ( QString ) ) ); connect ( con, SIGNAL ( connectionError ( QString,QString ) ), this, SLOT ( slotSshConnectionError ( QString,QString ) ) ); @@ -2948,6 +2950,33 @@ void ONMainWindow::slotSshServerAuthPassphrase(SshMasterConnection* connection, } +void ONMainWindow::slotSshServerAuthChallengeResponse(SshMasterConnection* connection, QString Challenge) +{ + bool ok; + QString message; + + message=Challenge; + + QString phrase=QInputDialog::getText(0,connection->getUser()+"@"+connection->getHost()+":"+QString::number(connection->getPort()), + message,QLineEdit::Password,QString::null, &ok); + if(!ok) + { + phrase=QString::null; + } + else + { + if(phrase==QString::null) + phrase=""; + } + connection->setKeyPhrase(phrase); + if(isHidden()) + { + show(); + QTimer::singleShot(1, this, SLOT(hide())); + } +} + + void ONMainWindow::slotSshServerAuthError ( int error, QString sshMessage, SshMasterConnection* connection ) { if ( startHidden ) diff --git a/src/onmainwindow.h b/src/onmainwindow.h index 809fe5f..0962ac6 100644 --- a/src/onmainwindow.h +++ b/src/onmainwindow.h @@ -1036,6 +1036,7 @@ private slots: void slotSshConnectionError ( QString message, QString lastSessionError ); void slotSshServerAuthError ( int error, QString sshMessage, SshMasterConnection* connection ); void slotSshServerAuthPassphrase ( SshMasterConnection* connection, bool verificationCode ); + void slotSshServerAuthChallengeResponse( SshMasterConnection* connection, QString Challenge ); void slotSshUserAuthError ( QString error ); void slotSshConnectionOk(); void slotServSshConnectionOk(QString server); diff --git a/src/sshmasterconnection.cpp b/src/sshmasterconnection.cpp index 8ebac10..1d330a3 100644 --- a/src/sshmasterconnection.cpp +++ b/src/sshmasterconnection.cpp @@ -881,15 +881,21 @@ bool SshMasterConnection::userChallengeAuth() } bool has_challenge_auth_code_prompt = false; + bool need_to_display_auth_code_prompt = false; const std::size_t challenge_auth_code_prompts_size = (sizeof (challenge_auth_code_prompts_)/sizeof (*challenge_auth_code_prompts_)); - for (std::size_t i = 0; i < challenge_auth_code_prompts_size; ++i) { - x2goDebug << "Checking against known prompt #" << i << ": " << challenge_auth_code_prompts_[i] << endl; - - if (pr.startsWith (challenge_auth_code_prompts_[i])) { - has_challenge_auth_code_prompt = true; - break; - } + if( pr.contains("challenge", Qt::CaseInsensitive) ) { + x2goDebug << "prompt contains 'challenge': " << pr << endl; + has_challenge_auth_code_prompt = true; + need_to_display_auth_code_prompt = true; + } else { + for (std::size_t i = 0; i < challenge_auth_code_prompts_size; ++i) { + x2goDebug << "Checking against known prompt #" << i << ": " << challenge_auth_code_prompts_[i] << endl; + if (pr.startsWith (challenge_auth_code_prompts_[i])) { + has_challenge_auth_code_prompt = true; + break; + } + } } if (has_challenge_auth_code_prompt) { @@ -901,7 +907,11 @@ bool SshMasterConnection::userChallengeAuth() if(challengeAuthVerificationCode == QString::null) { keyPhraseReady=false; - emit needPassPhrase(this, true); + if (need_to_display_auth_code_prompt) { + emit needChallengeResponse(this, pr); + } else { + emit needPassPhrase(this, true); + } for(;;) { bool ready=false; diff --git a/src/sshmasterconnection.h b/src/sshmasterconnection.h index 0136ac4..79da49a 100644 --- a/src/sshmasterconnection.h +++ b/src/sshmasterconnection.h @@ -218,6 +218,7 @@ signals: void connectionOk( QString host); void needPassPhrase(SshMasterConnection*, bool verificationCode); + void needChallengeResponse(SshMasterConnection*, QString Challenge); }; -- Alioth's /srv/git/code.x2go.org/x2goclient.git//..//_hooks_/post-receive-email on /srv/git/code.x2go.org/x2goclient.git