Various improvement :)

This commit is contained in:
Quentin Rouland 2019-03-15 17:53:40 +01:00
parent a017136f6a
commit bd2fa6922e
26 changed files with 393 additions and 85 deletions

View File

@ -2,7 +2,6 @@
A password management app for Ubuntu Touch aiming to be compatible with [ZX2C4s pass command line application](https://www.passwordstore.org/) the standard unix password manager.
# Building
* Install [clickable](https://github.com/bhdouglass/clickable).
@ -11,6 +10,13 @@ A password management app for Ubuntu Touch aiming to be compatible with [ZX2C4
For more options/details see the [clickable documentation](http://clickable.bhdouglass.com/en/latest/index.html)
## Custom clickable command
* ```clickable c ``` : clean third directory and run ```clickable clean```
* ```clickable crun ``` : clean third directory and run ```clickable```
* ```clickable run``` : run ```clickable --dirty```
* ```clickable crund ``` : clean third directory and run ```clickable desktop```
* ```clickable rund ``` : run ```clickable desktop --dirty ```
# Contributing
Any contributions are welcome using the github issue & pull request system.
@ -110,8 +116,10 @@ List passwords that match pass-names
along with this program. If not, see <http://www.gnu.org/licenses/>.
# Acknowledge
* Ubports
* pass
* clikable
* gpgmepp & gpgme & gpg
# Useful Links
Some useful links related to UTpass development :
* [Ubports](https://ubports.com/) : Ubuntu Touch Community
* [ZX2C4s pass command line application](https://www.passwordstore.org/) : the standard unix password manager.
* [Clickable](https://github.com/bhdouglass/clickable) : Compile, build, and deploy Ubuntu Touch click packages
* [Gpgme](https://www.gnupg.org/software/gpgme/index.html) : GnuPG Made Easy (GPGME) is a library designed to make access to GnuPG easier for applications

View File

@ -2,7 +2,11 @@
"template": "cmake",
"kill": "UTPass",
"scripts": {
"clean_third": "third/clean.sh"
"c": "third/clean.sh && clickable clean",
"crun": "third/clean.sh && clickable",
"run": "clickable --dirty",
"crund": "third/clean.sh && clickable desktop",
"rund": "clickable desktop --dirty"
},
"dependencies_build": [
"texinfo",

View File

@ -3,10 +3,11 @@
#include <QUrl>
#include <QString>
#include <QQuickView>
#include "gpgme++/global.h"
#include <QtQml>
int main(int argc, char *argv[])
{
new QGuiApplication(argc, argv);
QGuiApplication::setApplicationName("utpass.qrouland");

View File

0
password-store/pass.gpg Normal file
View File

View File

@ -1,20 +1,59 @@
#include <QDebug>
#include <QDir>
#include <QString>
#include <QFile>
#include "pass.h"
#include "gpgme++/global.h"
#include "qgpgme/protocol.h"
#include "qgpgme/encryptjob.h"
#include "qgpgme/decryptjob.h"
#include "qgpgme/keylistjob.h"
Pass::Pass() {
GpgME::initializeLibrary();
this->gpgHome = qgetenv("GNUPGHOME");
}
void Pass::cmd_show(const QString path) {
QDir dir = QDir(path);
if (!dir.exists()) {
qWarning("Path to show not found");
return;
QString Pass::decrypt(const QByteArray cipherText) {
/*auto decJob = QGpgME::openpgp()->decryptJob();
auto ctx = QGpgME::Job::context(decJob);
TestPassphraseProvider provider;
ctx->setPassphraseProvider(&provider);
ctx->setPinentryMode(Context::PinentryLoopback);
QByteArray plainText;
decJob->exec(cipherText, plainText);
return QString::fromUtf8(plainText);*/
}
QString Pass::decrypt_file(const QString path) {
/*QFile file(path);
if (!file.open(QIODevice::ReadOnly)) {
qErrnoWarning("Can't open the File");
return nullptr;
}
QByteArray plainText = file.readAll();
return Pass::decrypt(plainText);*/
}
void Pass::cmd_version() {
QByteArray Pass::encrypt(const QString str) {
/*auto listjob = QGpgME::openpgp()->keyListJob(false, false, false);
std::vector<GpgME::Key> keys;
auto keylistresult = listjob->exec(QStringList() << QStringLiteral("alfa@example.net"),
false, keys);
auto job = QGpgME::openpgp()->encryptJob(/*ASCII Armor *//*true, /* Textmode *//* true);
QByteArray cipherText;
auto result = job->exec(keys, QStringLiteral("Hello World").toUtf8(), GpgME::Context::AlwaysTrust, cipherText);
return cipherText;*/
}
bool Pass::encrypt_file(const QString str, const QString path) {
/*QFile file(path);
if (!file.open(QIODevice::WriteOnly)) {
qErrnoWarning("Can't open the File");
return false;
}
file.write(Pass::encrypt(str));
return true;*/
}

View File

@ -5,13 +5,16 @@
class Pass: public QObject {
Q_OBJECT
QString gpgHome;
public:
Pass();
~Pass() override = default;
Q_INVOKABLE void cmd_show(QString path) ;
Q_INVOKABLE void cmd_version() ;
Q_INVOKABLE QString decrypt(QByteArray plainText);
Q_INVOKABLE QString decrypt_file(QString path);
Q_INVOKABLE QByteArray encrypt(QString str);
Q_INVOKABLE bool encrypt_file(QString str, QString path);
};
#endif

View File

@ -8,7 +8,7 @@ class PassPlugin : public QQmlExtensionPlugin {
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
public:
void registerTypes(const char *uri);
void registerTypes(const char *uri) override;
};
#endif

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: utpass.qrouland\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-03-13 20:28+0000\n"
"POT-Creation-Date: 2019-03-15 16:52+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -17,6 +17,31 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: ../qml/Main.qml:26 UTPass.desktop.in.h:1
#: ../qml/pages/Settings.qml:8 ../qml/pages/headers/MainHeader.qml:19
msgid "Settings"
msgstr ""
#: ../qml/pages/PasswordList.qml:17
msgid "Back"
msgstr ""
#: ../qml/pages/PasswordList.qml:39
msgid "No password found in the current folder"
msgstr ""
#: ../qml/pages/Info.qml:9 ../qml/pages/headers/MainHeader.qml:26
msgid "Info"
msgstr ""
#: ../qml/pages/Info.qml:43 ../qml/pages/headers/MainHeader.qml:8
#: ../qml/pages/headers/StackHeader.qml:7 UTPass.desktop.in.h:1
msgid "UTPass"
msgstr ""
#: ../qml/pages/Info.qml:53
msgid "Suggest improvements or report a bug"
msgstr ""
#: ../qml/pages/headers/MainHeader.qml:15
msgid "Search"
msgstr ""

View File

@ -1,78 +1,22 @@
import QtQuick 2.4
import QtQuick.Layouts 1.1
import Qt.labs.folderlistmodel 2.1
import Ubuntu.Components 1.3
import Pass 1.0
import "components" as MyComponents
import "components"
MainView {
id: root
objectName: "mainView"
applicationName: "utpass.qrouland"
automaticOrientation: true
width: units.gu(45)
height: units.gu(75)
Page {
id: page
PageStack {
id: pageStack
anchors.fill: parent
header: PageHeader {
id: header
width: parent.width
height: units.gu(6)
title: i18n.tr("UTPass")
flickable: navigation
leadingActionBar.height: units.gu(4)
leadingActionBar.actions: [
Action {
id: backAction
iconName: "back"
text: "Back"
visible:false
onTriggered: {
folderModel.folder = folderModel.parentFolder;
if(folderModel.rootFolder === folderModel.folder) {
backAction.visible = false;
}
}
}
]
}
Flickable {
id: navigation
anchors.fill: parent
Rectangle {
width: page.width
visible: folderModel.count == 0
height: units.gu(5)
Text {
text: "No password found in the current folder"
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
}
}
ListView {
id : listViewDirs
anchors.fill: parent
spacing: 1
model: FolderListModel {
id: folderModel
nameFilters: ["*.gpg"]
rootFolder: "file:password-store"
folder: "file:password-store"
}
delegate: MyComponents.ViewFileDir {
id: fileDelegate
}
}
}
Component.onCompleted: push(pageStack.push(Qt.resolvedUrl("pages/PasswordList.qml")))
}
//Component.onCompleted: Pass.speak()
}

View File

@ -1,9 +1,10 @@
import QtQuick 2.4
import Ubuntu.Components 1.3
import "../styles"
Component {
Rectangle {
width: page.width
width: parent.width
height: units.gu(5)
Text {
@ -19,7 +20,7 @@ Component {
width: units.gu(4)
height: units.gu(4)
name: fileIsDir ? "go-next" : "lock"
color: UbuntuColors.orange
color: Theme.raisin_black
}
MouseArea {

55
qml/components/Link.qml Normal file
View File

@ -0,0 +1,55 @@
import QtQuick 2.4
import Ubuntu.Components 1.3
import "../styles"
Item {
property string url
property string text
property bool commonBorder : true
property int lBorderwidth : 0
property int rBorderwidth : 0
property int tBorderwidth : 0
property int bBorderwidth : 0
property int commonBorderWidth : 0
property string borderColor : UbuntuColors.warmGrey
width: parent.width
height: units.gu(6)
Rectangle {
width: parent.width
height: parent.height
Text {
text: parent.parent.text
anchors.left: parent.left
anchors.leftMargin: units.gu(1)
anchors.verticalCenter: parent.verticalCenter
}
Icon {
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
width: units.gu(4)
height: units.gu(4)
name: "go-next"
color: Theme.raisin_black
}
MouseArea {
anchors.fill: parent
onClicked: { Qt.openUrlExternally(parent.parent.url); }
}
CustomBorder {
id : cb
commonBorder: parent.parent.commonBorder
lBorderwidth: parent.parent.lBorderwidth
rBorderwidth: parent.parent.rBorderwidth
tBorderwidth: parent.parent.tBorderwidth
bBorderwidth: parent.parent.bBorderwidth
borderColor: parent.parent.borderColor
}
}
}

2
qml/components/qmldir Normal file
View File

@ -0,0 +1,2 @@
FileDir 1.0 FileDir.qml
Link 1.0 Link.qml

6
qml/models/Manifest.qml Normal file
View File

@ -0,0 +1,6 @@
pragma Singleton
import QtQuick 2.4
Item {
}

0
qml/models/Passstore.qml Normal file
View File

2
qml/models/qmldir Normal file
View File

@ -0,0 +1,2 @@
singleton Passtore 1.0 Passtore.qml
singleton Manifest 1.0 Manifest.qml

59
qml/pages/Info.qml Normal file
View File

@ -0,0 +1,59 @@
import QtQuick 2.4
import Ubuntu.Components 1.3
import "headers"
import "../components"
Page {
header: StackHeader {
id : infoHeader
title: i18n.tr('Info')
}
Rectangle {
anchors.top: infoHeader.bottom
anchors.bottom: parent.bottom
width: parent.width
color: "#FFF"
Flow {
spacing: 2
anchors.fill: parent
Rectangle {
width: parent.width
height: units.gu(4)
}
Rectangle {
width: parent.width
height: units.gu(12)
Image {
source: "../../assets/logo.svg"
width: units.gu(12)
height: units.gu(12)
anchors.horizontalCenter: parent.horizontalCenter
}
}
Rectangle {
width: parent.width
height: units.gu(4)
}
Text {
horizontalAlignment: Text.AlignHCenter
width: parent.width
height: units.gu(6)
text: i18n.tr('UTPass')
}
Text {
horizontalAlignment: Text.AlignHCenter
width: parent.width
height: units.gu(6)
text: "Version" //i18n.tr("Version %1").arg(Manifest.get("version"))
}
Link {
url: "https://github.com/QRouland/UTPass/issues"
text: i18n.tr('Suggest improvements or report a bug')
}
}
}
}

View File

@ -0,0 +1,59 @@
import QtQuick 2.4
import Ubuntu.Components 1.3
import Qt.labs.folderlistmodel 2.1
import "../components"
import "headers"
Page {
header : MainHeader {
flickable : nav
leadingActionBar.height: units.gu(4)
leadingActionBar.actions: [
Action {
id: backAction
iconName: "back"
text: i18n.tr("Back")
visible:false
onTriggered: {
folderModel.folder = folderModel.parentFolder;
if(folderModel.rootFolder === folderModel.folder) {
backAction.visible = false;
}
}
}
]
}
Flickable {
id: nav
height: parent.height
width: parent.width
Rectangle {
width: parent.width
visible: folderModel.count == 0
height: units.gu(5)
Text {
text: i18n.tr("No password found in the current folder")
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
}
}
ListView {
anchors.fill: parent
spacing: 1
model: FolderListModel {
id: folderModel
nameFilters: ["*.gpg"]
rootFolder: "file:password-store"
folder: "file:password-store"
}
delegate: FileDir {
id: fileDelegate
}
}
}
}

30
qml/pages/Settings.qml Normal file
View File

@ -0,0 +1,30 @@
import QtQuick 2.4
import Ubuntu.Components 1.3
import "headers"
Page {
header: StackHeader {
id:settingsHeader
title: i18n.tr('Settings')
}
Rectangle {
anchors.top: settingsHeader.bottom
anchors.bottom: parent.bottom
width: parent.width
color: "#FFF"
Flow {
spacing: 1
anchors.fill: parent
Text {
horizontalAlignment: Text.AlignHCenter
width: parent.width
height: units.gu(6)
text: "Settings"
}
}
}
}

View File

@ -0,0 +1,32 @@
import QtQuick 2.4
import Ubuntu.Components 1.3
PageHeader {
id: mainHeader
width: parent.width
height: units.gu(6)
title: i18n.tr("UTPass")
trailingActionBar.height: units.gu(4)
trailingActionBar.numberOfSlots: 2
trailingActionBar.actions: [
Action {
iconName: "search"
text: i18n.tr("Search")
},
Action {
iconName: "settings"
text: i18n.tr("Settings")
onTriggered: {
pageStack.push(Qt.resolvedUrl("../Settings.qml"))
}
},
Action {
iconName: "info"
text: i18n.tr("Info")
onTriggered: {
pageStack.push(Qt.resolvedUrl("../Info.qml"))
}
}
]
}

View File

@ -0,0 +1,20 @@
import QtQuick 2.4
import Ubuntu.Components 1.3
PageHeader {
width: parent.width
height: units.gu(6)
title: i18n.tr("UTPass")
leadingActionBar.height: units.gu(4)
leadingActionBar.actions: [
Action {
id: backAction
iconName: "back"
text: "Back"
onTriggered: {
pageStack.pop()
}
}
]
}

2
qml/pages/headers/qmldir Normal file
View File

@ -0,0 +1,2 @@
MainHeader 1.0 MainHeader.qml
StackHeader 1.0 StackHeader.qml

4
qml/pages/qmldir Normal file
View File

@ -0,0 +1,4 @@
Info 1.0 Info.qml
PassordList 1.0 Password.qml
Settings 1.0 Settings.qml
UTPassPage 1.0 UTPassPage.qml

10
qml/styles/Theme.qml Normal file
View File

@ -0,0 +1,10 @@
pragma Singleton
import QtQuick 2.4
Item {
readonly property color claret : "#77172A"
readonly property color raisin_black : "#AE2B25"
readonly property color steel_blue : "#462C98"
readonly property color twilight_lavender : "#754888"
readonly property color eerie_black : "#191716"
}

2
qml/styles/qmldir Normal file
View File

@ -0,0 +1,2 @@
CustomBorder 1.0 CustomBorder.qml
singleton Theme 1.0 Theme.qml