From 47d55295156eadb6b23ce7d476b6b4c689e0caf7 Mon Sep 17 00:00:00 2001 From: Stefan Forstenlechner Date: Tue, 17 Sep 2024 13:56:19 +0200 Subject: [PATCH] Add possibility to configure timeout for remote process --- share/translations/keepassxc_en.ts | 8 ++ .../remote/DatabaseSettingsWidgetRemote.cpp | 11 +- .../remote/DatabaseSettingsWidgetRemote.ui | 136 ++++++++++++------ src/gui/remote/RemoteHandler.cpp | 4 +- src/gui/remote/RemoteSettings.cpp | 4 + src/gui/remote/RemoteSettings.h | 2 + 6 files changed, 117 insertions(+), 48 deletions(-) diff --git a/share/translations/keepassxc_en.ts b/share/translations/keepassxc_en.ts index 6bb5ae88d..36de355aa 100644 --- a/share/translations/keepassxc_en.ts +++ b/share/translations/keepassxc_en.ts @@ -2372,6 +2372,14 @@ The command has to exit. In case of `sftp` as last command `exit` has to be sent + + Timeout: + + + + seconds + + DatabaseTabWidget diff --git a/src/gui/remote/DatabaseSettingsWidgetRemote.cpp b/src/gui/remote/DatabaseSettingsWidgetRemote.cpp index e6ed0a486..c108ed5ed 100644 --- a/src/gui/remote/DatabaseSettingsWidgetRemote.cpp +++ b/src/gui/remote/DatabaseSettingsWidgetRemote.cpp @@ -46,8 +46,10 @@ DatabaseSettingsWidgetRemote::DatabaseSettingsWidgetRemote(QWidget* parent) connect(m_ui->nameLineEdit, &QLineEdit::textChanged, setModified); connect(m_ui->downloadCommand, &QLineEdit::textChanged, setModified); connect(m_ui->inputForDownload, &QPlainTextEdit::textChanged, setModified); + connect(m_ui->downloadTimeout, QOverload::of(&QSpinBox::valueChanged), setModified); connect(m_ui->uploadCommand, &QLineEdit::textChanged, setModified); connect(m_ui->inputForUpload, &QPlainTextEdit::textChanged, setModified); + connect(m_ui->uploadTimeout, QOverload::of(&QSpinBox::valueChanged), setModified); } DatabaseSettingsWidgetRemote::~DatabaseSettingsWidgetRemote() = default; @@ -100,8 +102,10 @@ void DatabaseSettingsWidgetRemote::saveCurrentSettings() params->name = m_ui->nameLineEdit->text(); params->downloadCommand = m_ui->downloadCommand->text(); params->downloadInput = m_ui->inputForDownload->toPlainText(); + params->downloadTimeout = m_ui->downloadTimeout->value(); params->uploadCommand = m_ui->uploadCommand->text(); params->uploadInput = m_ui->inputForUpload->toPlainText(); + params->uploadTimeout = m_ui->uploadTimeout->value(); m_remoteSettings->addRemoteParams(params); updateSettingsList(); @@ -145,8 +149,10 @@ void DatabaseSettingsWidgetRemote::editCurrentSettings() m_ui->nameLineEdit->setText(params->name); m_ui->downloadCommand->setText(params->downloadCommand); m_ui->inputForDownload->setPlainText(params->downloadInput); + m_ui->downloadTimeout->setValue(params->downloadTimeout); m_ui->uploadCommand->setText(params->uploadCommand); m_ui->inputForUpload->setPlainText(params->uploadInput); + m_ui->uploadTimeout->setValue(params->uploadTimeout); m_modified = false; } @@ -165,8 +171,10 @@ void DatabaseSettingsWidgetRemote::clearFields() m_ui->nameLineEdit->setText(""); m_ui->downloadCommand->setText(""); m_ui->inputForDownload->setPlainText(""); + m_ui->downloadTimeout->setValue(10); m_ui->uploadCommand->setText(""); m_ui->inputForUpload->setPlainText(""); + m_ui->uploadTimeout->setValue(10); m_modified = false; } @@ -176,6 +184,7 @@ void DatabaseSettingsWidgetRemote::testDownload() params->name = m_ui->nameLineEdit->text(); params->downloadCommand = m_ui->downloadCommand->text(); params->downloadInput = m_ui->inputForDownload->toPlainText(); + params->downloadTimeout = m_ui->downloadTimeout->value(); QScopedPointer remoteHandler(new RemoteHandler(this)); if (params->downloadCommand.isEmpty()) { @@ -197,4 +206,4 @@ void DatabaseSettingsWidgetRemote::testDownload() } m_ui->messageWidget->showMessage(tr("Download successful."), MessageWidget::Positive); -} \ No newline at end of file +} diff --git a/src/gui/remote/DatabaseSettingsWidgetRemote.ui b/src/gui/remote/DatabaseSettingsWidgetRemote.ui index a5e7126ea..681eceff7 100644 --- a/src/gui/remote/DatabaseSettingsWidgetRemote.ui +++ b/src/gui/remote/DatabaseSettingsWidgetRemote.ui @@ -132,6 +132,16 @@ Download + + + + Input: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + @@ -139,6 +149,22 @@ + + + + Download input field + + + e.g.: +get DatabaseOnRemote.kdbx {TEMP_DATABASE} +exit +--- +{TEMP_DATABASE} is used as placeholder to store the database in a temporary location +The command has to exit. In case of `sftp` as last command `exit` has to be sent + + + + @@ -160,29 +186,26 @@ - - + + - Input: - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + Timeout: - - - - Download input field + + + + seconds - - e.g.: -get DatabaseOnRemote.kdbx {TEMP_DATABASE} -exit ---- -{TEMP_DATABASE} is used as placeholder to store the database in a temporary location -The command has to exit. In case of `sftp` as last command `exit` has to be sent - + + 1 + + + 300 + + + 10 @@ -193,33 +216,6 @@ The command has to exit. In case of `sftp` as last command `exit` has to be sent Upload - - - - Input: - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - - - - - - - Command: - - - - - - - Upload command field - - - e.g.: "sftp user@hostname" or "scp {TEMP_DATABASE} user@hostname:DatabaseOnRemote.kdbx" - - - @@ -236,6 +232,56 @@ The command has to exit. In case of `sftp` as last command `exit` has to be sent + + + + Input: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + + + Upload command field + + + e.g.: "sftp user@hostname" or "scp {TEMP_DATABASE} user@hostname:DatabaseOnRemote.kdbx" + + + + + + + Command: + + + + + + + Timeout: + + + + + + + seconds + + + 1 + + + 300 + + + 10 + + + diff --git a/src/gui/remote/RemoteHandler.cpp b/src/gui/remote/RemoteHandler.cpp index 66f2d2d25..65fb41b58 100644 --- a/src/gui/remote/RemoteHandler.cpp +++ b/src/gui/remote/RemoteHandler.cpp @@ -67,7 +67,7 @@ RemoteHandler::RemoteResult RemoteHandler::download(const RemoteParams* params) remoteProcess->closeWriteChannel(); } - bool finished = remoteProcess->waitForFinished(10000); + bool finished = remoteProcess->waitForFinished(params->downloadTimeout * 1000); int statusCode = remoteProcess->exitCode(); // TODO: For future use @@ -118,7 +118,7 @@ RemoteHandler::RemoteResult RemoteHandler::upload(const QString& filePath, const remoteProcess->closeWriteChannel(); } - bool finished = remoteProcess->waitForFinished(10000); + bool finished = remoteProcess->waitForFinished(params->uploadTimeout * 1000); int statusCode = remoteProcess->exitCode(); // TODO: For future use diff --git a/src/gui/remote/RemoteSettings.cpp b/src/gui/remote/RemoteSettings.cpp index cc7437de5..ebdea9445 100644 --- a/src/gui/remote/RemoteSettings.cpp +++ b/src/gui/remote/RemoteSettings.cpp @@ -89,8 +89,10 @@ QString RemoteSettings::toConfig() const object["name"] = params->name; object["downloadCommand"] = params->downloadCommand; object["downloadCommandInput"] = params->downloadInput; + object["downloadTimeout"] = params->downloadTimeout; object["uploadCommand"] = params->uploadCommand; object["uploadCommandInput"] = params->uploadInput; + object["uploadTimeout"] = params->uploadTimeout; config << object; } QJsonDocument doc(config); @@ -108,8 +110,10 @@ void RemoteSettings::fromConfig(const QString& data) params->name = itemMap["name"].toString(); params->downloadCommand = itemMap["downloadCommand"].toString(); params->downloadInput = itemMap["downloadCommandInput"].toString(); + params->downloadTimeout = itemMap.value("downloadTimeout", 10).toInt(); params->uploadCommand = itemMap["uploadCommand"].toString(); params->uploadInput = itemMap["uploadCommandInput"].toString(); + params->uploadTimeout = itemMap.value("uploadTimeout", 10).toInt(); m_remoteParams.insert(params->name, params); } diff --git a/src/gui/remote/RemoteSettings.h b/src/gui/remote/RemoteSettings.h index 4ddd6e341..d2f5ca7e8 100644 --- a/src/gui/remote/RemoteSettings.h +++ b/src/gui/remote/RemoteSettings.h @@ -28,8 +28,10 @@ struct RemoteParams QString name; QString downloadCommand; QString downloadInput; + int downloadTimeout; QString uploadCommand; QString uploadInput; + int uploadTimeout; }; Q_DECLARE_METATYPE(RemoteParams)