mirror of
https://github.com/QRouland/UTPass.git
synced 2024-12-22 01:42:39 +00:00
Various improvement :)
This commit is contained in:
parent
a017136f6a
commit
bd2fa6922e
20
README.md
20
README.md
@ -2,7 +2,6 @@
|
||||
|
||||
A password management app for Ubuntu Touch aiming to be compatible with [ZX2C4’s 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
|
||||
* [ZX2C4’s 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
|
||||
|
@ -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",
|
||||
|
3
main.cpp
3
main.cpp
@ -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");
|
||||
|
||||
|
0
password-store/dir/pass.gpg
Normal file
0
password-store/dir/pass.gpg
Normal file
0
password-store/pass.gpg
Normal file
0
password-store/pass.gpg
Normal 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;*/
|
||||
}
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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 ""
|
||||
|
66
qml/Main.qml
66
qml/Main.qml
@ -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()
|
||||
}
|
||||
|
@ -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
55
qml/components/Link.qml
Normal 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
2
qml/components/qmldir
Normal file
@ -0,0 +1,2 @@
|
||||
FileDir 1.0 FileDir.qml
|
||||
Link 1.0 Link.qml
|
6
qml/models/Manifest.qml
Normal file
6
qml/models/Manifest.qml
Normal file
@ -0,0 +1,6 @@
|
||||
pragma Singleton
|
||||
import QtQuick 2.4
|
||||
|
||||
Item {
|
||||
|
||||
}
|
0
qml/models/Passstore.qml
Normal file
0
qml/models/Passstore.qml
Normal file
2
qml/models/qmldir
Normal file
2
qml/models/qmldir
Normal file
@ -0,0 +1,2 @@
|
||||
singleton Passtore 1.0 Passtore.qml
|
||||
singleton Manifest 1.0 Manifest.qml
|
59
qml/pages/Info.qml
Normal file
59
qml/pages/Info.qml
Normal 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')
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
59
qml/pages/PasswordList.qml
Normal file
59
qml/pages/PasswordList.qml
Normal 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
30
qml/pages/Settings.qml
Normal 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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
32
qml/pages/headers/MainHeader.qml
Normal file
32
qml/pages/headers/MainHeader.qml
Normal 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"))
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
20
qml/pages/headers/StackHeader.qml
Normal file
20
qml/pages/headers/StackHeader.qml
Normal 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
2
qml/pages/headers/qmldir
Normal file
@ -0,0 +1,2 @@
|
||||
MainHeader 1.0 MainHeader.qml
|
||||
StackHeader 1.0 StackHeader.qml
|
4
qml/pages/qmldir
Normal file
4
qml/pages/qmldir
Normal 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
10
qml/styles/Theme.qml
Normal 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
2
qml/styles/qmldir
Normal file
@ -0,0 +1,2 @@
|
||||
CustomBorder 1.0 CustomBorder.qml
|
||||
singleton Theme 1.0 Theme.qml
|
Loading…
Reference in New Issue
Block a user