From ce3b4506af7b5af12d2f2b52d0bbcec0d3817f85 Mon Sep 17 00:00:00 2001 From: ck Date: Tue, 1 Dec 2009 16:22:50 +0100 Subject: [PATCH] Maemo: Add authentication options (password or key based) --- .../qt-maemo/maemodeviceconfigurations.cpp | 13 ++ .../qt-maemo/maemodeviceconfigurations.h | 3 + .../qt-maemo/maemorunconfiguration.cpp | 31 +++- .../qt-maemo/maemosettingspage.cpp | 31 +++- .../qt-maemo/maemosettingswidget.ui | 149 ++++++++++++++---- 5 files changed, 179 insertions(+), 48 deletions(-) diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.cpp index 9fde0218e41..1f527e61534 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.cpp @@ -37,6 +37,7 @@ #include #include +#include #include @@ -52,9 +53,15 @@ namespace { const QLatin1String HostKey("Host"); const QLatin1String PortKey("Port"); const QLatin1String UserNameKey("Uname"); + const QLatin1String AuthKey("Authentication"); + const QLatin1String KeyFileKey("KeyFile"); const QLatin1String PasswordKey("Password"); const QLatin1String TimeoutKey("Timeout"); const QLatin1String InternalIdKey("InternalId"); + + const QString DefaultKeyFile = + QDesktopServices::storageLocation(QDesktopServices::HomeLocation) + + QLatin1String("/.ssh/id_rsa"); }; class DevConfIdMatcher @@ -73,6 +80,8 @@ MaemoDeviceConfigurations::DeviceConfig::DeviceConfig(const QString &name) : name(name), type(Physical), port(22), + authentication(Key), + keyFile(DefaultKeyFile), timeout(30), internalId(MaemoDeviceConfigurations::instance().m_nextId++) { @@ -84,7 +93,9 @@ MaemoDeviceConfigurations::DeviceConfig::DeviceConfig(const QSettings &settings) host(settings.value(HostKey).toString()), port(settings.value(PortKey, 22).toInt()), uname(settings.value(UserNameKey).toString()), + authentication(static_cast(settings.value(AuthKey).toInt())), pwd(settings.value(PasswordKey).toString()), + keyFile(settings.value(KeyFileKey).toString()), timeout(settings.value(TimeoutKey, 30).toInt()), internalId(settings.value(InternalIdKey, MaemoDeviceConfigurations::instance().m_nextId).toInt()) { @@ -110,7 +121,9 @@ void MaemoDeviceConfigurations::DeviceConfig::save(QSettings &settings) const settings.setValue(HostKey, host); settings.setValue(PortKey, port); settings.setValue(UserNameKey, uname); + settings.setValue(AuthKey, authentication); settings.setValue(PasswordKey, pwd); + settings.setValue(KeyFileKey, keyFile); settings.setValue(TimeoutKey, timeout); settings.setValue(InternalIdKey, internalId); } diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.h b/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.h index ed7958eeb53..6a224eba41d 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.h +++ b/src/plugins/qt4projectmanager/qt-maemo/maemodeviceconfigurations.h @@ -56,6 +56,7 @@ public: { public: enum DeviceType { Physical, Simulator }; + enum AuthType { Password, Key }; DeviceConfig(); DeviceConfig(const QString &name); DeviceConfig(const QSettings &settings); @@ -66,7 +67,9 @@ public: QString host; int port; QString uname; + AuthType authentication; QString pwd; + QString keyFile; int timeout; quint64 internalId; diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp index 5920d91abeb..6ab6e38e52f 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemorunconfiguration.cpp @@ -112,6 +112,7 @@ protected: const QString port() const; const QString targetCmdLinePrefix() const; const QString remoteDir() const; + const QStringList options() const; virtual void deploymentFinished(bool success)=0; virtual bool setProcessEnvironment(QProcess &process); private slots: @@ -752,6 +753,7 @@ MaemoRunConfigurationWidget::MaemoRunConfigurationWidget( m_configNameLineEdit = new QLineEdit(m_runConfiguration->name()); mainLayout->addRow(tr("Run configuration name:"), m_configNameLineEdit); m_devConfBox = new QComboBox; + m_devConfBox->setSizeAdjustPolicy(QComboBox::AdjustToContents); mainLayout->addRow(new QLabel(tr("Device Configuration:")), m_devConfBox); m_executableLabel = new QLabel(m_runConfiguration->executable()); mainLayout->addRow(tr("Executable:"), m_executableLabel); @@ -1031,8 +1033,10 @@ AbstractMaemoRunControl::AbstractMaemoRunControl(RunConfiguration *rc) void AbstractMaemoRunControl::startDeployment(bool forDebugging) { QTC_ASSERT(runConfig, return); - if (!devConfig.isValid()) + if (!devConfig.isValid()) { deploymentFinished(false); + return; + } QStringList deployables; if (runConfig->currentlyNeedsDeployment()) { deployingExecutable = true; @@ -1050,8 +1054,8 @@ void AbstractMaemoRunControl::startDeployment(bool forDebugging) emit addToOutputWindow(this, tr("Files to deploy: %1.") .arg(deployables.join(" "))); QStringList cmdArgs; - cmdArgs << "-P" << port() << deployables << (devConfig.uname - + "@" + devConfig.host + ":" + remoteDir()); + cmdArgs << "-P" << port() << options() << deployables + << (devConfig.uname + "@" + devConfig.host + ":" + remoteDir()); deployProcess.setWorkingDirectory(QFileInfo(executableOnHost()).absolutePath()); deployProcess.start(runConfig->scpCmd(), cmdArgs); if (!deployProcess.waitForStarted()) { @@ -1114,6 +1118,19 @@ const QString AbstractMaemoRunControl::remoteDir() const : QString::fromLocal8Bit("/home/") + devConfig.uname; } +const QStringList AbstractMaemoRunControl::options() const +{ + const bool usePassword = + devConfig.authentication == MaemoDeviceConfigurations::DeviceConfig::Password; + const QLatin1String opt("-o"); + return QStringList() << opt + << QString::fromLatin1("PasswordAuthentication=%1"). + arg(usePassword ? "yes" : "no") << opt + << QString::fromLatin1("PubkeyAuthentication=%1"). + arg(usePassword ? "no" : "yes") << opt + << QString::fromLatin1("ConnectTimeout=%1").arg(devConfig.timeout); +} + const QString AbstractMaemoRunControl::executableOnTarget() const { return QString::fromLocal8Bit("%1/%2").arg(remoteDir()). @@ -1202,7 +1219,7 @@ void MaemoRunControl::startExecution() QStringList cmdArgs; cmdArgs << "-n" << "-p" << port() << "-l" << devConfig.uname - << devConfig.host << remoteCall; + << options() << devConfig.host << remoteCall; sshProcess.start(runConfig->sshCmd(), cmdArgs); sshProcess.start(runConfig->sshCmd(), cmdArgs); @@ -1237,7 +1254,7 @@ void MaemoRunControl::stop() const QString remoteCall = QString::fromLocal8Bit("pkill -x %1; " "sleep 1; pkill -x -9 %1").arg(executableFileName()); cmdArgs << "-n" << "-p" << port() << "-l" << devConfig.uname - << devConfig.host << remoteCall; + << options() << devConfig.host << remoteCall; stopProcess.start(runConfig->sshCmd(), cmdArgs); } } @@ -1311,7 +1328,7 @@ void MaemoDebugRunControl::startGdbServer() .arg(runConfig->arguments().join(" "))); QStringList sshArgs; sshArgs << "-t" << "-n" << "-l" << devConfig.uname << "-p" - << port() << devConfig.host << remoteCall; + << port() << options() << devConfig.host << remoteCall; inferiorPid = -1; disconnect(&gdbServer, SIGNAL(readyReadStandardError()), 0, 0); connect(&gdbServer, SIGNAL(readyReadStandardError()), this, @@ -1394,7 +1411,7 @@ void MaemoDebugRunControl::debuggingFinished() "kill -9 %1; pkill -x -9 gdbserver").arg(inferiorPid); QStringList sshArgs; sshArgs << "-n" << "-l" << devConfig.uname << "-p" << port() - << devConfig.host << remoteCall; + << options() << devConfig.host << remoteCall; stopProcess.start(runConfig->sshCmd(), sshArgs); } qDebug("ssh return code is %d", gdbServer.exitCode()); diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemosettingspage.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemosettingspage.cpp index 222aa6cd65d..ae60e3cc6e1 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemosettingspage.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemosettingspage.cpp @@ -127,11 +127,13 @@ private slots: void deleteConfig(); void configNameEditingFinished(); void deviceTypeChanged(); + void authenticationTypeChanged(); void hostNameEditingFinished(); void portEditingFinished(); void timeoutEditingFinished(); void userNameEditingFinished(); void passwordEditingFinished(); + void keyFileEditingFinished(); private: void initGui(); @@ -151,12 +153,10 @@ private: MaemoSettingsPage::MaemoSettingsPage(QObject *parent) : Core::IOptionsPage(parent) { - qDebug("Creating maemo settings page"); } MaemoSettingsPage::~MaemoSettingsPage() { - qDebug("deleting maemo settings page"); } QString MaemoSettingsPage::id() const @@ -193,7 +193,6 @@ void MaemoSettingsPage::apply() void MaemoSettingsPage::finish() { - // apply(); } MaemoSettingsWidget::MaemoSettingsWidget(QWidget *parent) @@ -203,13 +202,11 @@ MaemoSettingsWidget::MaemoSettingsWidget(QWidget *parent) m_nameValidator(m_devConfs) { - qDebug("creating maemo settings widget"); initGui(); } MaemoSettingsWidget::~MaemoSettingsWidget() { - qDebug("Deleting maemo settings widget"); } void MaemoSettingsWidget::initGui() @@ -265,11 +262,16 @@ void MaemoSettingsWidget::display(const MaemoDeviceConfigurations::DeviceConfig m_ui->deviceButton->setChecked(true); else m_ui->simulatorButton->setChecked(true); + if (devConfig.authentication == MaemoDeviceConfigurations::DeviceConfig::Password) + m_ui->passwordButton->setChecked(true); + else + m_ui->keyButton->setChecked(true); m_ui->hostLineEdit->setText(devConfig.host); m_ui->portLineEdit->setText(QString::number(devConfig.port)); m_ui->timeoutLineEdit->setText(QString::number(devConfig.timeout)); m_ui->userLineEdit->setText(devConfig.uname); m_ui->pwdLineEdit->setText(devConfig.pwd); + m_ui->keyFileLineEdit->setText(devConfig.keyFile); m_ui->detailsWidget->setEnabled(true); m_nameValidator.setName(devConfig.name); m_portValidator.setValue(devConfig.port); @@ -284,13 +286,11 @@ void MaemoSettingsWidget::saveSettings() MaemoDeviceConfigurations::DeviceConfig &MaemoSettingsWidget::currentConfig() { - qDebug("%d/%d", m_ui->configListWidget->count(), m_devConfs.count()); Q_ASSERT(m_ui->configListWidget->count() == m_devConfs.count()); const QList &selectedItems = m_ui->configListWidget->selectedItems(); Q_ASSERT(selectedItems.count() == 1); const int selectedRow = m_ui->configListWidget->row(selectedItems.first()); - qDebug("selected row = %d", selectedRow); Q_ASSERT(selectedRow < m_devConfs.count()); return m_devConfs[selectedRow]; } @@ -311,6 +311,18 @@ void MaemoSettingsWidget::deviceTypeChanged() : MaemoDeviceConfigurations::DeviceConfig::Simulator; } +void MaemoSettingsWidget::authenticationTypeChanged() +{ + const bool usePassword = m_ui->passwordButton->isChecked(); + currentConfig().authentication = usePassword + ? MaemoDeviceConfigurations::DeviceConfig::Password + : MaemoDeviceConfigurations::DeviceConfig::Key; + m_ui->pwdLineEdit->setEnabled(usePassword); + m_ui->passwordLabel->setEnabled(usePassword); + m_ui->keyFileLineEdit->setEnabled(!usePassword); + m_ui->keyLabel->setEnabled(!usePassword); +} + void MaemoSettingsWidget::hostNameEditingFinished() { currentConfig().host = m_ui->hostLineEdit->text(); @@ -346,6 +358,11 @@ void MaemoSettingsWidget::passwordEditingFinished() currentConfig().pwd = m_ui->pwdLineEdit->text(); } +void MaemoSettingsWidget::keyFileEditingFinished() +{ + currentConfig().keyFile = m_ui->keyFileLineEdit->text(); +} + void MaemoSettingsWidget::selectionChanged() { const QList &selectedItems = diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemosettingswidget.ui b/src/plugins/qt4projectmanager/qt-maemo/maemosettingswidget.ui index 29c19cc803c..8b666afd0d3 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemosettingswidget.ui +++ b/src/plugins/qt4projectmanager/qt-maemo/maemosettingswidget.ui @@ -42,13 +42,6 @@ - - - - Device type: - - - @@ -75,60 +68,114 @@ - + Host Name: - + - + Port: - + - + Connection Timeout: - + - + User Name: - + - - + + Password: - + QLineEdit::Password + + + + Device type: + + + + + + + Authentication type: + + + + + + + + 0 + + + 0 + + + + + Password + + + + + + + Key + + + + + + + + + + Private key file: + + + + + + + QLineEdit::Normal + + + @@ -180,8 +227,8 @@ configNameEditingFinished() - 221 - 166 + 372 + 146 514 @@ -196,8 +243,8 @@ deviceTypeChanged() - 164 - 197 + 269 + 170 511 @@ -212,8 +259,8 @@ hostNameEditingFinished() - 289 - 222 + 397 + 219 424 @@ -228,8 +275,8 @@ portEditingFinished() - 320 - 248 + 397 + 243 514 @@ -244,8 +291,8 @@ timeoutEditingFinished() - 371 - 276 + 397 + 268 425 @@ -260,8 +307,8 @@ userNameEditingFinished() - 340 - 302 + 397 + 293 422 @@ -276,8 +323,8 @@ passwordEditingFinished() - 243 - 333 + 394 + 317 423 @@ -292,8 +339,8 @@ deviceTypeChanged() - 291 - 198 + 388 + 170 426 @@ -349,6 +396,38 @@ + + passwordButton + toggled(bool) + maemoSettingsWidget + authenticationTypeChanged() + + + 196 + 187 + + + 513 + 240 + + + + + keyFileLineEdit + editingFinished() + maemoSettingsWidget + keyFileChanged() + + + 208 + 332 + + + 424 + 41 + + + configNameEditingFinished() @@ -361,5 +440,7 @@ addConfig() selectionChanged() deleteConfig() + authenticationTypeChanged() + keyFileChanged()