From d71d059a6c537bc1857d521b228de5cd08409c62 Mon Sep 17 00:00:00 2001 From: Radu Andries Date: Tue, 9 Jul 2013 16:55:13 +0200 Subject: Add a simple ssh sync handler CCMAIL: admiral0@tuxfamily.org REVIEWED-BY: adjam Many thanks, Radu! And sorry for the late merge ;) --- src/sync/sshsynchandler.cpp | 290 +++++++++++++++++++++++++++++++++++++ src/sync/sshsynchandler.h | 83 +++++++++++ src/sync/sync_host_type.ui | 7 + src/sync/sync_ssh_settings.ui | 112 ++++++++++++++ src/sync/syncassistant.cpp | 2 + src/sync/syncassistant.h | 1 + src/sync/synccheckwidget.cpp | 5 + src/sync/syncdatawidget.cpp | 6 + src/sync/syncftpsettingswidget.cpp | 9 +- src/sync/synchosttypewidget.cpp | 9 +- src/sync/syncmanager.cpp | 4 + src/sync/syncsshsettingswidget.cpp | 83 +++++++++++ src/sync/syncsshsettingswidget.h | 45 ++++++ 13 files changed, 653 insertions(+), 3 deletions(-) create mode 100644 src/sync/sshsynchandler.cpp create mode 100644 src/sync/sshsynchandler.h create mode 100644 src/sync/sync_ssh_settings.ui create mode 100644 src/sync/syncsshsettingswidget.cpp create mode 100644 src/sync/syncsshsettingswidget.h (limited to 'src/sync') diff --git a/src/sync/sshsynchandler.cpp b/src/sync/sshsynchandler.cpp new file mode 100644 index 00000000..06c06861 --- /dev/null +++ b/src/sync/sshsynchandler.cpp @@ -0,0 +1,290 @@ +/* ============================================================ +* +* This file is a part of the rekonq project +* +* Copyright (C) 2011 by Andrea Diamantini +* Copyright (C) 2013 by Radu Andries +* +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License as +* published by the Free Software Foundation; either version 2 of +* the License or (at your option) version 3 or any later version +* accepted by the membership of KDE e.V. (or its successor approved +* by the membership of KDE e.V.), which shall act as a proxy +* defined in Section 14 of version 3 of the license. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* +* ============================================================ */ + + +// Self Includes +#include "sshsynchandler.h" +#include "sshsynchandler.moc" + +// Auto Includes +#include "rekonq.h" + +// KDE Includes +#include +#include + +#include + + +SSHSyncHandler::SSHSyncHandler(QObject *parent) + : SyncHandler(parent) +{ + kDebug() << "creating SSH handler..."; +} + + +void SSHSyncHandler::initialLoadAndCheck() +{ + if (!ReKonfig::syncEnabled()) + { + _firstTimeSynced = false; + return; + } + + // Bookmarks + if (ReKonfig::syncBookmarks()) + { + _remoteBookmarksUrl = QUrl(); + _remoteBookmarksUrl.setHost(ReKonfig::syncHost()); + _remoteBookmarksUrl.setScheme("fish"); + _remoteBookmarksUrl.setUserName(ReKonfig::syncUser()); + _remoteBookmarksUrl.setPassword(ReKonfig::syncPass()); + _remoteBookmarksUrl.setPort(ReKonfig::syncPort()); + _remoteBookmarksUrl.setPath(ReKonfig::syncPath() + QL1S("/bookmarks.xml")); + + const QString bookmarksFilePath = KStandardDirs::locateLocal("data", QL1S("konqueror/bookmarks.xml")); + _localBookmarksUrl = KUrl(bookmarksFilePath); + + KIO::StatJob *job = KIO::stat(_remoteBookmarksUrl, KIO::StatJob::DestinationSide, 0, KIO::HideProgressInfo); + connect(job, SIGNAL(finished(KJob*)), this, SLOT(onBookmarksStatFinished(KJob*))); + } + + // History + if (ReKonfig::syncHistory()) + { + _remoteHistoryUrl = QUrl(); + _remoteHistoryUrl.setHost(ReKonfig::syncHost()); + _remoteHistoryUrl.setScheme("fish"); + _remoteHistoryUrl.setUserName(ReKonfig::syncUser()); + _remoteHistoryUrl.setPassword(ReKonfig::syncPass()); + _remoteHistoryUrl.setPort(ReKonfig::syncPort()); + _remoteHistoryUrl.setPath(ReKonfig::syncPath() + QL1S("/history")); + + const QString historyFilePath = KStandardDirs::locateLocal("appdata", "history"); + _localHistoryUrl = KUrl(historyFilePath); + + KIO::StatJob *job = KIO::stat(_remoteHistoryUrl, KIO::StatJob::DestinationSide, 0, KIO::HideProgressInfo); + connect(job, SIGNAL(finished(KJob*)), this, SLOT(onHistoryStatFinished(KJob*))); + } + + // Passwords + if (ReKonfig::syncPasswords()) + { + _remotePasswordsUrl = QUrl(); + _remotePasswordsUrl.setHost(ReKonfig::syncHost()); + _remotePasswordsUrl.setScheme("fish"); + _remotePasswordsUrl.setUserName(ReKonfig::syncUser()); + _remotePasswordsUrl.setPassword(ReKonfig::syncPass()); + _remotePasswordsUrl.setPort(ReKonfig::syncPort()); + _remotePasswordsUrl.setPath(ReKonfig::syncPath() + QL1S("/kdewallet.kwl")); + + const QString passwordsFilePath = KStandardDirs::locateLocal("data", QL1S("kwallet/kdewallet.kwl")); + _localPasswordsUrl = KUrl(passwordsFilePath); + + KIO::StatJob *job = KIO::stat(_remotePasswordsUrl, KIO::StatJob::DestinationSide, 0, KIO::HideProgressInfo); + connect(job, SIGNAL(finished(KJob*)), this, SLOT(onPasswordsStatFinished(KJob*))); + } +} + + +bool SSHSyncHandler::syncRelativeEnabled(bool check) +{ + if (!ReKonfig::syncEnabled()) + return false; + + if (!_firstTimeSynced) + return false; + + return check; +} + + +// --------------------------------------------------------------------------------------- + + +void SSHSyncHandler::syncBookmarks() +{ + kDebug() << "syncing now..."; + + if (!syncRelativeEnabled(ReKonfig::syncBookmarks())) + return; + + KIO::Job *job = KIO::file_copy(_localBookmarksUrl, _remoteBookmarksUrl, -1, KIO::HideProgressInfo | KIO::Overwrite); + connect(job, SIGNAL(finished(KJob*)), this, SLOT(onBookmarksSyncFinished(KJob*))); +} + + +void SSHSyncHandler::onBookmarksStatFinished(KJob *job) +{ + if (job->error()) + { + if (job->error() == KIO::ERR_DOES_NOT_EXIST) + { + KIO::Job *job = KIO::file_copy(_localBookmarksUrl, _remoteBookmarksUrl, -1, KIO::HideProgressInfo | KIO::Overwrite); + connect(job, SIGNAL(finished(KJob*)), this, SLOT(onBookmarksSyncFinished(KJob*))); + + emit syncStatus(Rekonq::Bookmarks, true, i18n("Remote bookmarks file does not exists. Exporting local copy...")); + _firstTimeSynced = true; + } + else + { + emit syncStatus(Rekonq::Bookmarks, false, job->errorString()); + } + } + else + { + KIO::Job *job = KIO::file_copy(_remoteBookmarksUrl, _localBookmarksUrl, -1, KIO::HideProgressInfo | KIO::Overwrite); + connect(job, SIGNAL(finished(KJob*)), this, SLOT(onBookmarksSyncFinished(KJob*))); + + emit syncStatus(Rekonq::Bookmarks, true, i18n("Remote bookmarks file exists. Syncing local copy...")); + _firstTimeSynced = true; + } +} + + +void SSHSyncHandler::onBookmarksSyncFinished(KJob *job) +{ + if (job->error()) + { + emit syncStatus(Rekonq::Bookmarks, false, job->errorString()); + emit syncBookmarksFinished(false); + return; + } + + emit syncBookmarksFinished(true); +} + + +// --------------------------------------------------------------------------------------- + + +void SSHSyncHandler::syncHistory() +{ + kDebug() << "syncing now..."; + + if (!syncRelativeEnabled(ReKonfig::syncHistory())) + return; + + KIO::Job *job = KIO::file_copy(_localHistoryUrl, _remoteHistoryUrl, -1, KIO::HideProgressInfo | KIO::Overwrite); + connect(job, SIGNAL(finished(KJob*)), this, SLOT(onHistorySyncFinished(KJob*))); +} + + +void SSHSyncHandler::onHistoryStatFinished(KJob *job) +{ + if (job->error()) + { + if (job->error() == KIO::ERR_DOES_NOT_EXIST) + { + KIO::Job *job = KIO::file_copy(_localHistoryUrl, _remoteHistoryUrl, -1, KIO::HideProgressInfo | KIO::Overwrite); + connect(job, SIGNAL(finished(KJob*)), this, SLOT(onHistorySyncFinished(KJob*))); + + emit syncStatus(Rekonq::History, true, i18n("Remote history file does not exists. Exporting local copy...")); + _firstTimeSynced = true; + } + else + { + emit syncStatus(Rekonq::History, false, job->errorString()); + } + } + else + { + KIO::Job *job = KIO::file_copy(_remoteHistoryUrl, _localHistoryUrl, -1, KIO::HideProgressInfo | KIO::Overwrite); + connect(job, SIGNAL(finished(KJob*)), this, SLOT(onHistorySyncFinished(KJob*))); + + emit syncStatus(Rekonq::History, true, i18n("Remote history file exists. Syncing local copy...")); + _firstTimeSynced = true; + } +} + + +void SSHSyncHandler::onHistorySyncFinished(KJob *job) +{ + if (job->error()) + { + emit syncStatus(Rekonq::History, false, job->errorString()); + emit syncHistoryFinished(false); + return; + } + + emit syncHistoryFinished(true); +} + + +// --------------------------------------------------------------------------------------- + + +void SSHSyncHandler::syncPasswords() +{ + kDebug() << "syncing now..."; + + if (!syncRelativeEnabled(ReKonfig::syncPasswords())) + return; + + KIO::Job *job = KIO::file_copy(_localPasswordsUrl, _remotePasswordsUrl, -1, KIO::HideProgressInfo | KIO::Overwrite); + connect(job, SIGNAL(finished(KJob*)), this, SLOT(onPasswordsSyncFinished(KJob*))); +} + + +void SSHSyncHandler::onPasswordsStatFinished(KJob *job) +{ + if (job->error()) + { + if (job->error() == KIO::ERR_DOES_NOT_EXIST) + { + KIO::Job *job = KIO::file_copy(_localPasswordsUrl, _remotePasswordsUrl, -1, KIO::HideProgressInfo | KIO::Overwrite); + connect(job, SIGNAL(finished(KJob*)), this, SLOT(onPasswordsSyncFinished(KJob*))); + + emit syncStatus(Rekonq::Passwords, true, i18n("Remote passwords file does not exists. Exporting local copy...")); + _firstTimeSynced = true; + } + else + { + emit syncStatus(Rekonq::Passwords, false, job->errorString()); + } + } + else + { + KIO::Job *job = KIO::file_copy(_remotePasswordsUrl, _localPasswordsUrl, -1, KIO::HideProgressInfo | KIO::Overwrite); + connect(job, SIGNAL(finished(KJob*)), this, SLOT(onPasswordsSyncFinished(KJob*))); + + emit syncStatus(Rekonq::Passwords, true, i18n("Remote passwords file exists. Syncing local copy...")); + _firstTimeSynced = true; + } +} + + +void SSHSyncHandler::onPasswordsSyncFinished(KJob *job) +{ + if (job->error()) + { + emit syncStatus(Rekonq::Passwords, false, job->errorString()); + emit syncPasswordsFinished(false); + return; + } + + emit syncPasswordsFinished(true); +} diff --git a/src/sync/sshsynchandler.h b/src/sync/sshsynchandler.h new file mode 100644 index 00000000..4c1718d9 --- /dev/null +++ b/src/sync/sshsynchandler.h @@ -0,0 +1,83 @@ +/* ============================================================ +* +* This file is a part of the rekonq project +* +* Copyright (C) 2011 by Andrea Diamantini +* Copyright (C) 2013 by Radu Andries +* +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License as +* published by the Free Software Foundation; either version 2 of +* the License or (at your option) version 3 or any later version +* accepted by the membership of KDE e.V. (or its successor approved +* by the membership of KDE e.V.), which shall act as a proxy +* defined in Section 14 of version 3 of the license. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* +* ============================================================ */ + +#ifndef SSHSYNCHANDLER_H +#define SSHSYNCHANDLER_H + +// Local includes +#include "synchandler.h" + +// KDE Includes +#include + +// Forward Declarations +class KJob; + +class KJob; + +class SSHSyncHandler : public SyncHandler +{ + Q_OBJECT + +public: + explicit SSHSyncHandler(QObject *parent = 0); + + void syncHistory(); + void syncBookmarks(); + void syncPasswords(); + + void initialLoadAndCheck(); + +private Q_SLOTS: + void onBookmarksSyncFinished(KJob *); + void onBookmarksStatFinished(KJob *); + + void onHistorySyncFinished(KJob *); + void onHistoryStatFinished(KJob *); + + void onPasswordsSyncFinished(KJob *); + void onPasswordsStatFinished(KJob *); + +Q_SIGNALS: + void syncBookmarksFinished(bool); + void syncHistoryFinished(bool); + void syncPasswordsFinished(bool); + +private: + bool syncRelativeEnabled(bool); + + QUrl _remoteBookmarksUrl; + KUrl _localBookmarksUrl; + + QUrl _remoteHistoryUrl; + KUrl _localHistoryUrl; + + QUrl _remotePasswordsUrl; + KUrl _localPasswordsUrl; + +}; + +#endif // SSHSYNCHANDLER_H diff --git a/src/sync/sync_host_type.ui b/src/sync/sync_host_type.ui index 676e0052..f3f82117 100644 --- a/src/sync/sync_host_type.ui +++ b/src/sync/sync_host_type.ui @@ -31,6 +31,13 @@ + + + + SSH + + + diff --git a/src/sync/sync_ssh_settings.ui b/src/sync/sync_ssh_settings.ui new file mode 100644 index 00000000..3ce8c662 --- /dev/null +++ b/src/sync/sync_ssh_settings.ui @@ -0,0 +1,112 @@ + + + SyncSSHSettings + + + + 0 + 0 + 400 + 300 + + + + + + + SSH Host Settings + + + + QFormLayout::ExpandingFieldsGrow + + + + + Server: + + + + + + + + + + Username: + + + + + + + + + + Password: + + + + + + + + + + Use system ssh keys to login + + + + + + + Path: + + + + + + + + + + Port: + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 124 + + + + + + + + + KLineEdit + QLineEdit +
klineedit.h
+
+ + KIntNumInput + QWidget +
knuminput.h
+
+
+ + +
diff --git a/src/sync/syncassistant.cpp b/src/sync/syncassistant.cpp index 35fcbddb..dcad5397 100644 --- a/src/sync/syncassistant.cpp +++ b/src/sync/syncassistant.cpp @@ -36,6 +36,7 @@ #include "syncftpsettingswidget.h" #include "syncgooglesettingswidget.h" #include "syncoperasettingswidget.h" +#include "syncsshsettingswidget.h" SyncAssistant::SyncAssistant(QWidget *parent) @@ -47,6 +48,7 @@ SyncAssistant::SyncAssistant(QWidget *parent) setPage(Page_FTP_Settings, new SyncFTPSettingsWidget(this)); setPage(Page_Google_Settings, new SyncGoogleSettingsWidget(this)); setPage(Page_Opera_Settings, new SyncOperaSettingsWidget(this)); + setPage(Page_SSH_Settings, new SyncSSHSettingsWidget(this)); setPage(Page_Data, new SyncDataWidget(this)); setPage(Page_Check, new SyncCheckWidget(this)); } diff --git a/src/sync/syncassistant.h b/src/sync/syncassistant.h index f373a5f8..d76df5e1 100644 --- a/src/sync/syncassistant.h +++ b/src/sync/syncassistant.h @@ -43,6 +43,7 @@ public: Page_FTP_Settings, Page_Google_Settings, Page_Opera_Settings, + Page_SSH_Settings, Page_Data, Page_Check }; diff --git a/src/sync/synccheckwidget.cpp b/src/sync/synccheckwidget.cpp index 913ccafe..d7748caa 100644 --- a/src/sync/synccheckwidget.cpp +++ b/src/sync/synccheckwidget.cpp @@ -68,6 +68,11 @@ void SyncCheckWidget::initializePage() syncLabel->setText(i18n("Opera")); hostLabel->setText(ReKonfig::syncHost()); } + else if (ReKonfig::syncType() == 3) + { + syncLabel->setText(i18n("SSH")); + hostLabel->setText(ReKonfig::syncHost()); + } else { syncLabel->setText(i18n("No sync")); diff --git a/src/sync/syncdatawidget.cpp b/src/sync/syncdatawidget.cpp index 635c6239..5624c45f 100644 --- a/src/sync/syncdatawidget.cpp +++ b/src/sync/syncdatawidget.cpp @@ -63,6 +63,12 @@ void SyncDataWidget::initializePage() case 2: kcfg_syncBookmarks->setEnabled(true); break; + case 3: + //SSH sync handler + kcfg_syncBookmarks->setEnabled(true); + kcfg_syncHistory->setEnabled(true); + kcfg_syncPasswords->setEnabled(true); + break; default: kDebug() << "Unknown sync type!"; } diff --git a/src/sync/syncftpsettingswidget.cpp b/src/sync/syncftpsettingswidget.cpp index 5eb6bfdc..14924f38 100644 --- a/src/sync/syncftpsettingswidget.cpp +++ b/src/sync/syncftpsettingswidget.cpp @@ -39,12 +39,17 @@ SyncFTPSettingsWidget::SyncFTPSettingsWidget(QWidget *parent) : QWizardPage(parent) { setupUi(this); - + + int port = ReKonfig::syncPort(); + if(port == -1){ + port=21; + } + kcfg_syncHost->setText(ReKonfig::syncHost()); kcfg_syncUser->setText(ReKonfig::syncUser()); kcfg_syncPass->setText(ReKonfig::syncPass()); kcfg_syncPath->setText(ReKonfig::syncPath()); - kcfg_syncPort->setValue(ReKonfig::syncPort()); + kcfg_syncPort->setValue(port); kcfg_syncPass->setPasswordMode(true); } diff --git a/src/sync/synchosttypewidget.cpp b/src/sync/synchosttypewidget.cpp index 289f5e5e..373b6a6a 100644 --- a/src/sync/synchosttypewidget.cpp +++ b/src/sync/synchosttypewidget.cpp @@ -49,6 +49,8 @@ SyncHostTypeWidget::SyncHostTypeWidget(QWidget *parent) googleRadioButton->setChecked(true); else if (ReKonfig::syncType() == 2) operaRadioButton->setChecked(true); + if (ReKonfig::syncType() == 3) + sshRadioButton->setChecked(true); else nullRadioButton->setChecked(true); @@ -93,9 +95,14 @@ int SyncHostTypeWidget::nextId() const ReKonfig::setSyncType(2); return SyncAssistant::Page_Opera_Settings; } - else + else if (sshRadioButton->isChecked()) { ReKonfig::setSyncType(3); + return SyncAssistant::Page_SSH_Settings; + } + else + { + ReKonfig::setSyncType(4); return SyncAssistant::Page_Check; } diff --git a/src/sync/syncmanager.cpp b/src/sync/syncmanager.cpp index 7a1cb782..20d2a4a5 100644 --- a/src/sync/syncmanager.cpp +++ b/src/sync/syncmanager.cpp @@ -43,6 +43,7 @@ #include "syncassistant.h" #include "ftpsynchandler.h" #include "googlesynchandler.h" +#include "sshsynchandler.h" #if (defined HAVE_QCA2 && defined HAVE_QTOAUTH) #include "operasynchandler.h" @@ -112,6 +113,9 @@ void SyncManager::loadSettings() _syncImplementation = new OperaSyncHandler(this); break; #endif + case 3: + _syncImplementation = new SSHSyncHandler(this); + break; default: kDebug() << "/dev/null"; return; diff --git a/src/sync/syncsshsettingswidget.cpp b/src/sync/syncsshsettingswidget.cpp new file mode 100644 index 00000000..cd89193d --- /dev/null +++ b/src/sync/syncsshsettingswidget.cpp @@ -0,0 +1,83 @@ +/* ============================================================ +* +* This file is a part of the rekonq project +* +* Copyright (C) 2013 by Radu Andries +* +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License as +* published by the Free Software Foundation; either version 2 of +* the License or (at your option) version 3 or any later version +* accepted by the membership of KDE e.V. (or its successor approved +* by the membership of KDE e.V.), which shall act as a proxy +* defined in Section 14 of version 3 of the license. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* +* ============================================================ */ + +#include "syncsshsettingswidget.h" + +// Auto Includes +#include "rekonq.h" + +#include + +// Local Includes +#include "syncassistant.h" + +int SyncSSHSettingsWidget::nextId() const +{ + // save + ReKonfig::setSyncHost(kcfg_syncHost->text()); + ReKonfig::setSyncUser(kcfg_syncUser->text()); + ReKonfig::setSyncPass(kcfg_syncPass->text()); + ReKonfig::setSyncPath(kcfg_syncPath->text()); + ReKonfig::setSyncPort(kcfg_syncPort->value()); + + return SyncAssistant::Page_Data; +} + +SyncSSHSettingsWidget::SyncSSHSettingsWidget(QWidget* parent): QWizardPage(parent) +{ + setupUi(this); + + int port = ReKonfig::syncPort(); + if(port == -1){ + port=22; + } + + kcfg_syncHost->setText(ReKonfig::syncHost()); + kcfg_syncUser->setText(ReKonfig::syncUser()); + kcfg_syncPass->setText(ReKonfig::syncPass()); + kcfg_syncPath->setText(ReKonfig::syncPath()); + kcfg_syncPort->setValue(port); + + if(kcfg_syncPass->text().isEmpty()){ + syncWithSSHKeys->setChecked(true); + toggleUserPass(true); + } + + kcfg_syncPass->setPasswordMode(true); + + connect(syncWithSSHKeys,SIGNAL(toggled(bool)),SLOT(toggleUserPass(bool))); +} + +void SyncSSHSettingsWidget::toggleUserPass(bool enabled) +{ + if(enabled){ + kcfg_syncPass->setText(""); + kcfg_syncPass->setEnabled(false); + }else{ + kcfg_syncPass->setEnabled(true); + } +} + + diff --git a/src/sync/syncsshsettingswidget.h b/src/sync/syncsshsettingswidget.h new file mode 100644 index 00000000..051be78e --- /dev/null +++ b/src/sync/syncsshsettingswidget.h @@ -0,0 +1,45 @@ +/* ============================================================ +* +* This file is a part of the rekonq project +* +* Copyright (C) 2013 by Radu Andries +* +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License as +* published by the Free Software Foundation; either version 2 of +* the License or (at your option) version 3 or any later version +* accepted by the membership of KDE e.V. (or its successor approved +* by the membership of KDE e.V.), which shall act as a proxy +* defined in Section 14 of version 3 of the license. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* +* ============================================================ */ +#ifndef SYNCSSHSETTINGSWIDGET_H +#define SYNCSSHSETTINGSWIDGET_H + +#include + +#include "ui_sync_ssh_settings.h" + +class SyncSSHSettingsWidget : public QWizardPage, private Ui::SyncSSHSettings +{ + Q_OBJECT +public: + + explicit SyncSSHSettingsWidget(QWidget *parent = 0); + + int nextId() const; + +private slots: + void toggleUserPass(bool enabled); +}; + +#endif // SYNCSSHSETTINGSWIDGET_H -- cgit v1.2.1