diff --git a/src/gui/entry/EditEntryWidget.cpp b/src/gui/entry/EditEntryWidget.cpp index 1b202bf08..1191402e7 100644 --- a/src/gui/entry/EditEntryWidget.cpp +++ b/src/gui/entry/EditEntryWidget.cpp @@ -673,7 +673,11 @@ bool EditEntryWidget::getOpenSSHKey(OpenSSHKey& key, bool decrypt) return false; } - if (!settings.toOpenSSHKey(m_entry, key, decrypt)) { + if (!settings.toOpenSSHKey(m_mainUi->usernameComboBox->lineEdit()->text(), + m_mainUi->passwordEdit->text(), + m_advancedUi->attachmentsWidget->entryAttachments(), + key, + decrypt)) { showMessage(settings.errorString(), MessageWidget::Error); return false; } diff --git a/src/sshagent/KeeAgentSettings.cpp b/src/sshagent/KeeAgentSettings.cpp index 71265dfea..f88735b98 100644 --- a/src/sshagent/KeeAgentSettings.cpp +++ b/src/sshagent/KeeAgentSettings.cpp @@ -364,13 +364,40 @@ bool KeeAgentSettings::keyConfigured() const * @return true if key was properly opened */ bool KeeAgentSettings::toOpenSSHKey(const Entry* entry, OpenSSHKey& key, bool decrypt) +{ + return toOpenSSHKey(entry->username(), entry->password(), entry->attachments(), key, decrypt); +} + +/** + * Read a SSH key based on settings to key. + * + * Sets error string on error. + * + * @param username username to set on key if empty + * @param password password to decrypt key if needed + * @param attachments attachments to read an attachment key from + * @param key output key object + * @param decrypt avoid private key decryption if possible (old RSA keys are always decrypted) + * @return true if key was properly opened + */ +bool KeeAgentSettings::toOpenSSHKey(const QString& username, + const QString& password, + const EntryAttachments* attachments, + OpenSSHKey& key, + bool decrypt) { QString fileName; QByteArray privateKeyData; if (m_selectedType == "attachment") { + if (!attachments) { + m_error = QCoreApplication::translate("KeeAgentSettings", + "Private key is an attachment but no attachments provided."); + return false; + } + fileName = m_attachmentName; - privateKeyData = entry->attachments()->value(fileName); + privateKeyData = attachments->value(fileName); } else { QFile localFile(fileNameEnvSubst()); QFileInfo localFileInfo(localFile); @@ -405,14 +432,14 @@ bool KeeAgentSettings::toOpenSSHKey(const Entry* entry, OpenSSHKey& key, bool de } if (key.encrypted() && (decrypt || key.publicParts().isEmpty())) { - if (!key.openKey(entry->password())) { + if (!key.openKey(password)) { m_error = key.errorString(); return false; } } if (key.comment().isEmpty()) { - key.setComment(entry->username()); + key.setComment(username); } if (key.comment().isEmpty()) { diff --git a/src/sshagent/KeeAgentSettings.h b/src/sshagent/KeeAgentSettings.h index 3be780055..ec6fd3ee7 100644 --- a/src/sshagent/KeeAgentSettings.h +++ b/src/sshagent/KeeAgentSettings.h @@ -20,6 +20,7 @@ #define KEEAGENTSETTINGS_H #include "core/Entry.h" +#include "core/EntryAttachments.h" #include "crypto/ssh/OpenSSHKey.h" #include #include @@ -39,6 +40,11 @@ public: void toEntry(Entry* entry) const; bool keyConfigured() const; bool toOpenSSHKey(const Entry* entry, OpenSSHKey& key, bool decrypt); + bool toOpenSSHKey(const QString& username, + const QString& password, + const EntryAttachments* attachments, + OpenSSHKey& key, + bool decrypt); const QString errorString() const;