sailfish-safe

Sailfish frontend for safe(1)
git clone git://git.z3bra.org/sailfish-safe.git
Log | Files | Refs | README | LICENSE

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:
Mqml/components/GlobalPullDownMenu.qml | 6++++++
Mqml/pages/PassphraseRequester.qml | 5++++-
Msrc/passwordprovider.cpp | 1-
Msrc/passwordsmodel.cpp | 26++++++++++++++++++++++++++
Msrc/passwordsmodel.h | 2++
Msrc/passwordsortproxymodel.cpp | 10++++++++++
Msrc/passwordsortproxymodel.h | 3+++
Msrc/safe.cpp | 14++++++++++++--
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();