tAdd pulley item to unlock safe - sailfish-safe - Sailfish frontend for safe(1)
 (HTM) git clone git://git.z3bra.org/sailfish-safe.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit cdd12c07bb71cf68b909b3b1c583589efc7bf2fb
 (DIR) parent 4f037ca1d4443945913e886ef6516282b125309a
 (HTM) Author: Willy Goiffon <contact@z3bra.org>
       Date:   Tue, 13 Jul 2021 18:46:33 +0200
       
       Add pulley item to unlock safe
       
       Diffstat:
         M qml/components/GlobalPullDownMenu.… |       6 ++++++
         M qml/pages/PassphraseRequester.qml   |       5 ++++-
         M src/passwordprovider.cpp            |       1 -
         M src/passwordsmodel.cpp              |      26 ++++++++++++++++++++++++++
         M src/passwordsmodel.h                |       2 ++
         M src/passwordsortproxymodel.cpp      |      10 ++++++++++
         M src/passwordsortproxymodel.h        |       3 +++
         M src/safe.cpp                        |      14 ++++++++++++--
       
       8 files changed, 63 insertions(+), 4 deletions(-)
       ---
 (DIR) diff --git a/qml/components/GlobalPullDownMenu.qml b/qml/components/GlobalPullDownMenu.qml
       t@@ -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 })
       +    }
        }
 (DIR) diff --git a/qml/pages/PassphraseRequester.qml b/qml/pages/PassphraseRequester.qml
       t@@ -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
       t@@ -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 {
            }
 (DIR) diff --git a/src/passwordprovider.cpp b/src/passwordprovider.cpp
       t@@ -159,4 +159,3 @@ void PasswordProvider::removePasswordFromClipboard(const QString &password)
                clipboard->clear();
            }
        }
       -
 (DIR) diff --git a/src/passwordsmodel.cpp b/src/passwordsmodel.cpp
       t@@ -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!";
       +            });
       +}
 (DIR) diff --git a/src/passwordsmodel.h b/src/passwordsmodel.h
       t@@ -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:
 (DIR) diff --git a/src/passwordsortproxymodel.cpp b/src/passwordsortproxymodel.cpp
       t@@ -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();
       +}
 (DIR) diff --git a/src/passwordsortproxymodel.h b/src/passwordsortproxymodel.h
       t@@ -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;
        };
 (DIR) diff --git a/src/safe.cpp b/src/safe.cpp
       t@@ -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();