commit cdd12c07bb71cf68b909b3b1c583589efc7bf2fb
parent 4f037ca1d4443945913e886ef6516282b125309a
Author: Willy Goiffon <contact@z3bra.org>
Date: Tue, 13 Jul 2021 18:46:33 +0200
Add pulley item to unlock safe
Diffstat:
8 files changed, 63 insertions(+), 4 deletions(-)
diff --git a/qml/components/GlobalPullDownMenu.qml b/qml/components/GlobalPullDownMenu.qml
@@ -41,4 +41,10 @@ PullDownMenu {
text: qsTr("Search")
onClicked: app.pageStack.push(searchPage)
}
+ MenuItem {
+ text: qsTr("Unlock")
+ onClicked: app.pageStack.push(Qt.resolvedUrl("../pages/PassphraseRequester.qml"),
+ { "currentIndex": currentIndex,
+ "model": model })
+ }
}
diff --git a/qml/pages/PassphraseRequester.qml b/qml/pages/PassphraseRequester.qml
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2019 Daniel Vrátil <dvratil@kde.org>
+ * 2021 Willy Goiffon <contact@z3bra.org>
*
* 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
@@ -19,10 +20,12 @@ import QtQuick 2.0
import Sailfish.Silica 1.0
import harbour.safe 0.1
+
Dialog {
id: dlg
- property var requester: null
+ property var model
+ property var currentIndex
DialogHeader {
}
diff --git a/src/passwordprovider.cpp b/src/passwordprovider.cpp
@@ -159,4 +159,3 @@ void PasswordProvider::removePasswordFromClipboard(const QString &password)
clipboard->clear();
}
}
-
diff --git a/src/passwordsmodel.cpp b/src/passwordsmodel.cpp
@@ -244,3 +244,29 @@ void PasswordsModel::addPassword(const QModelIndex &parent, const QString &name,
qDebug() << "Successfully stored secret " << secret;
});
}
+
+void PasswordsModel::setPassphrase(const QString &passphrase)
+{
+ auto *task = Safe::unlock(passphrase);
+ connect(task, &Safe::UnlockTask::finished,
+ this, [passphrase, task]() {
+ if (task->error()) {
+ qWarning() << "Error:" << task->errorString();
+ return;
+ }
+ qDebug() << "Safe unlocked!";
+ });
+}
+
+void PasswordsModel::forgetPassphrase()
+{
+ auto *task = Safe::lock();
+ connect(task, &Safe::LockTask::finished,
+ this, [task]() {
+ if (task->error()) {
+ qWarning() << "Error:" << task->errorString();
+ return;
+ }
+ qDebug() << "Safe locked!";
+ });
+}
diff --git a/src/passwordsmodel.h b/src/passwordsmodel.h
@@ -59,6 +59,8 @@ public:
QVariant data(const QModelIndex &index, int role) const override;
+ Q_INVOKABLE void setPassphrase(const QString &passphrase);
+ Q_INVOKABLE void forgetPassphrase();
Q_INVOKABLE void addPassword(const QModelIndex &parent, const QString &name,
const QString &password, const QString &extras);
private:
diff --git a/src/passwordsortproxymodel.cpp b/src/passwordsortproxymodel.cpp
@@ -47,3 +47,13 @@ void PasswordSortProxyModel::addPassword(const QModelIndex &parent, const QStrin
{
qobject_cast<PasswordsModel*>(sourceModel())->addPassword(mapToSource(parent), name, password, extras);
}
+
+void PasswordSortProxyModel::setPassphrase(const QString &passphrase)
+{
+ qobject_cast<PasswordsModel*>(sourceModel())->setPassphrase(passphrase);
+}
+
+void PasswordSortProxyModel::forgetPassphrase()
+{
+ qobject_cast<PasswordsModel*>(sourceModel())->forgetPassphrase();
+}
diff --git a/src/passwordsortproxymodel.h b/src/passwordsortproxymodel.h
@@ -29,8 +29,11 @@ class PasswordSortProxyModel : public QSortFilterProxyModel
public:
explicit PasswordSortProxyModel(QObject *parent = nullptr);
+ Q_INVOKABLE void setPassphrase(const QString &passphrase);
+ Q_INVOKABLE void forgetPassphrase();
Q_INVOKABLE void addPassword(const QModelIndex &parent, const QString &name,
const QString &password, const QString &extra);
+
protected:
bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const override;
};
diff --git a/src/safe.cpp b/src/safe.cpp
@@ -128,16 +128,26 @@ void Safe::UnlockTask::run()
}
if (!qEnvironmentVariableIsSet(SAFE_SOCK)) {
- qWarning() << "Agent is not found";
+ qWarning() << "Agent is not reachable";
return;
}
+ // Temporary hack until we can properly pass the passphrase to safe(1)
+ // Expect the "askpass" command to be available and reading from stdin
+ // ex. `read pass; echo $pass`
+ qputenv(SAFE_ASKPASS, "/usr/local/bin/askpass");
+
QProcess process;
process.setProgram(safe);
- process.setArguments({QStringLiteral("-r")});
+ process.setArguments({
+ QStringLiteral("-r"),
+ QStringLiteral("-k")
+ });
process.start();
process.waitForStarted();
+ QThread::currentThread()->sleep(1);
process.write(mPassphrase.toUtf8());
+ process.write("\n");
process.waitForFinished();
if (process.exitCode() != 0) {
const auto err = process.readAllStandardError();