OSDN Git Service

SSH: Support password input for private keys in non-GUI applications.
authorChristian Kandeler <christian.kandeler@nokia.com>
Fri, 29 Jul 2011 08:15:46 +0000 (10:15 +0200)
committerChristian Kandeler <christian.kandeler@nokia.com>
Fri, 29 Jul 2011 08:17:37 +0000 (10:17 +0200)
Change-Id: Ibd5e47409e92edb6909053d7f17e67b6fa72e642
Reviewed-on: http://codereview.qt.nokia.com/2384
Reviewed-by: Christian Kandeler <christian.kandeler@nokia.com>
src/libs/utils/ssh/sshkeypasswordretriever.cpp

index bcd73aa..938b51f 100644 (file)
 **************************************************************************/
 #include "sshkeypasswordretriever_p.h"
 
-#include <QtCore/QCoreApplication>
 #include <QtCore/QString>
+#include <QtGui/QApplication>
 #include <QtGui/QInputDialog>
 
+#include <iostream>
+
 namespace Utils {
 namespace Internal {
 
 std::string SshKeyPasswordRetriever::get_passphrase(const std::string &, const std::string &,
     UI_Result &result) const
 {
-    bool ok;
-    const QString &password = QInputDialog::getText(0,
-        QCoreApplication::translate("Utils::Ssh", "Password Required"),
-        QCoreApplication::translate("Utils::Ssh", "Please enter the password for your private key."),
-        QLineEdit::Password, QString(), &ok);
-    result = ok ? OK : CANCEL_ACTION;
-    return std::string(password.toLocal8Bit().data());
+    const bool hasGui = dynamic_cast<QApplication *>(QApplication::instance());
+    if (hasGui) {
+        bool ok;
+        const QString &password = QInputDialog::getText(0,
+            QCoreApplication::translate("Utils::Ssh", "Password Required"),
+            QCoreApplication::translate("Utils::Ssh", "Please enter the password for your private key."),
+            QLineEdit::Password, QString(), &ok);
+        result = ok ? OK : CANCEL_ACTION;
+        return std::string(password.toLocal8Bit().data());
+    } else {
+        result = OK;
+        std::string password;
+        std::cout << "Please enter the password for your private key (set echo off beforehand!): " << std::flush;
+        std::cin >> password;
+        return password;
+    }
 }
 
 } // namespace Internal