1
0
mirror of https://github.com/QRouland/UTPass.git synced 2025-05-12 13:30:54 +00:00

Compare commits

...

4 Commits

15 changed files with 197 additions and 134 deletions

View File

@ -9,7 +9,7 @@
#include "utils.h" #include "utils.h"
QDir Git::clone_setup() QDir Git::cloneSetup()
{ {
QDir tmp_dir(QStandardPaths::writableLocation( QStandardPaths::CacheLocation).append("/clone")); QDir tmp_dir(QStandardPaths::writableLocation( QStandardPaths::CacheLocation).append("/clone"));
@ -20,12 +20,12 @@ QDir Git::clone_setup()
} }
bool Git::clone_tear_down(QDir tmp_dir) bool Git::cloneTearDown(QDir tmp_dir)
{ {
return tmp_dir.removeRecursively(); return tmp_dir.removeRecursively();
} }
bool Git::move_to_destination(QString path, QDir tmp_dir) bool Git::moveToDestination(QString path, QDir tmp_dir)
{ {
qDebug() << "Removing password_store " << path; qDebug() << "Removing password_store " << path;
QDir destination_dir(path); QDir destination_dir(path);
@ -37,42 +37,40 @@ bool Git::move_to_destination(QString path, QDir tmp_dir)
return dir.rename(tmp_dir.absolutePath(), destination_dir.absolutePath()); // TODO Better error handling return dir.rename(tmp_dir.absolutePath(), destination_dir.absolutePath()); // TODO Better error handling
} }
bool Git::clone(QString url, QString path, mode_type mode) //, GitPlugin::RepoType type, QString pass) bool Git::clone(QString url, QString path, mode_type mode) //, GitPlugin::RepoType type, QString pass)
{ {
auto v = overload { auto v = overload {
[](const Unset & x) { return "Unset"; }, [](const Unset & x) { return "Unset"; },
[](const HTTP & x) { return "Unset"; }, [](const HTTP & x) { return "HTTP"; },
[](const HTTPAuth & x) { return "HTTPAuth"; }, [](const HTTPAuth & x) { return "HTTPAuth"; },
[](const SSHAuth & x) { return "SSHAuth"; }, [](const SSHAuth & x) { return "SSHAuth"; },
[](const SSHKey & x) { return "SSHKey"; }, [](const SSHKey & x) { return "SSHKey"; },
}; };
qInfo() << "Cloning " << url << " to destination " << path << " using " << std::visit(v, mode); qInfo() << "Cloning " << url << " to destination " << path << " using " << std::visit(v, mode);
LibGit::instance()->set_mode(mode); LibGit::instance()->setMode(mode);
auto tmp_dir = this->clone_setup(); auto tmp_dir = this->cloneSetup();
qDebug() << "Cloning " << url << " to tmp dir " << tmp_dir.absolutePath(); qDebug() << "Cloning " << url << " to tmp dir " << tmp_dir.absolutePath();
auto ret = LibGit::instance()->clone(url, tmp_dir.absolutePath()); // TODO Better error handling auto ret = LibGit::instance()->clone(url, tmp_dir.absolutePath()); // TODO Better error handling
if (ret) { if (ret) {
this->move_to_destination(path, tmp_dir); this->moveToDestination(path, tmp_dir);
} }
this->clone_tear_down(tmp_dir); this->cloneTearDown(tmp_dir);
LibGit::instance()->set_mode(Unset()); LibGit::instance()->setMode(Unset());
return ret ; return ret ;
} }
bool Git::clone_http(QString url, QString path) //, GitPlugin::RepoType type, QString pass) bool Git::cloneHttp(QString url, QString path)
{ {
HTTP mode = {}; HTTP mode = {};
return this->clone(url, path, mode); return this->clone(url, path, mode);
} }
bool Git::clone_http_pass(QString url, QString path, QString pass) bool Git::cloneHttpPass(QString url, QString path, QString pass)
{ {
HTTPAuth mode = { pass }; HTTPAuth mode = { pass };
return this->clone(url, path, mode); return this->clone(url, path, mode);

View File

@ -7,14 +7,17 @@
#include "libgit.h" #include "libgit.h"
/**
* @brief The Git class is class that provide Git functionnly to clone and update a repo.
*/
class Git : public QObject class Git : public QObject
{ {
Q_OBJECT Q_OBJECT
private: private:
QDir clone_setup(); QDir cloneSetup();
bool move_to_destination(QString path, QDir tmp_dir); bool moveToDestination(QString path, QDir tmp_dir);
bool clone_tear_down(QDir tmp_dir); bool cloneTearDown(QDir tmp_dir);
bool clone(QString url, QString path, mode_type mode); bool clone(QString url, QString path, mode_type mode);
@ -22,8 +25,8 @@ public:
Git() = default; Git() = default;
~Git() override = default; ~Git() override = default;
Q_INVOKABLE bool clone_http(QString url, QString path); Q_INVOKABLE bool cloneHttp(QString url, QString path);
Q_INVOKABLE bool clone_http_pass(QString url, QString path, QString pass); Q_INVOKABLE bool cloneHttpPass(QString url, QString path, QString pass);
// Q_INVOKABLE bool clone_ssh_pass(QString url, QString path, QString pass); // Q_INVOKABLE bool clone_ssh_pass(QString url, QString path, QString pass);
// Q_INVOKABLE bool clone_ssh_key(QString url, QString path, QString pub_key, QString priv_key, QString passphrase); // Q_INVOKABLE bool clone_ssh_key(QString url, QString path, QString pub_key, QString priv_key, QString passphrase);
// Q_INVOKABLE bool update(QUrl url, QString path); // Q_INVOKABLE bool update(QUrl url, QString path);

View File

@ -21,13 +21,13 @@ LibGit::~LibGit()
git_libgit2_shutdown(); git_libgit2_shutdown();
} }
void LibGit::set_mode(mode_type type) void LibGit::setMode(mode_type type)
{ {
this->mode = type; this->mode = type;
} }
int LibGit::credentials_cb(git_cred **out, const char *url, const char *username_from_url, int LibGit::credentialsCB(git_cred **out, const char *url, const char *username_from_url,
unsigned int allowed_types, void *payload) unsigned int allowed_types, void *payload)
{ {
// TODO : More precise Error Handling for UI // TODO : More precise Error Handling for UI
auto instance = LibGit::instance(); auto instance = LibGit::instance();
@ -73,7 +73,7 @@ bool LibGit::clone(QString url, QString path)
git_repository *repo = NULL; git_repository *repo = NULL;
git_clone_options opts = GIT_CLONE_OPTIONS_INIT; git_clone_options opts = GIT_CLONE_OPTIONS_INIT;
opts.fetch_opts.callbacks.credentials = *credentials_cb; opts.fetch_opts.callbacks.credentials = *credentialsCB;
int ret = git_clone(&repo, url.toLocal8Bit().data(), path.toLocal8Bit().data(), &opts); int ret = git_clone(&repo, url.toLocal8Bit().data(), path.toLocal8Bit().data(), &opts);
if (ret != 0) { if (ret != 0) {

View File

@ -26,8 +26,8 @@ private:
mode_type mode; mode_type mode;
static int credentials_cb(git_cred **out, const char *url, const char *username_from_url, static int credentialsCB(git_cred **out, const char *url, const char *username_from_url,
unsigned int allowed_types, void *payload); unsigned int allowed_types, void *payload);
public: public:
~LibGit(); ~LibGit();
@ -40,7 +40,7 @@ public:
void operator=(LibGit const &) = delete; void operator=(LibGit const &) = delete;
bool clone(QString url, QString path); bool clone(QString url, QString path);
void set_mode(mode_type type); void setMode(mode_type type);
}; };
#endif #endif

View File

@ -137,6 +137,7 @@ QPair<Error, QString> Gpg::decrypt(QByteArray cipherText)
auto decResult = job->exec(cipherText, plain_text); auto decResult = job->exec(cipherText, plain_text);
delete job; delete job;
delete provider;
if (decResult.error()) { if (decResult.error()) {
qWarning() << "something gone wrong on decrypt"; qWarning() << "something gone wrong on decrypt";
@ -245,9 +246,6 @@ Error Gpg::importKeysFromFile(QString path)
auto job = openpgp()->importJob(); auto job = openpgp()->importJob();
auto ctx = ImportJob::context(job); auto ctx = ImportJob::context(job);
auto provider = new UTPassphraseProvider;
ctx->setPassphraseProvider(provider);
ctx->setPinentryMode(Context::PinentryLoopback);
auto result = job->exec(file.readAll()); auto result = job->exec(file.readAll());
qDebug() << "numImported" << result.numImported(); qDebug() << "numImported" << result.numImported();
@ -258,7 +256,6 @@ Error Gpg::importKeysFromFile(QString path)
file.close(); file.close();
delete job; delete job;
delete provider;
if (result.error()) { if (result.error()) {
qWarning() << "Import go wrong"; qWarning() << "Import go wrong";

View File

@ -12,7 +12,7 @@ Pass::Pass(): m_password_store (QStandardPaths::writableLocation(
QStandardPaths::AppDataLocation).append("/.password-store")) QStandardPaths::AppDataLocation).append("/.password-store"))
{} {}
void Pass::init(QObject *window) void Pass::initialize(QObject *window)
{ {
if (!window) { if (!window) {
qFatal("window is invalid. Abording."); qFatal("window is invalid. Abording.");
@ -27,7 +27,7 @@ void Pass::init(QObject *window)
qInfo() << "Password Store is :" << m_password_store; qInfo() << "Password Store is :" << m_password_store;
} }
void Pass::decrypt(QUrl url) void Pass::show(QUrl url)
{ {
qInfo() << "Decrypting"; qInfo() << "Decrypting";
auto decrypt_ret = Gpg::instance()->decryptFromFile(url.toLocalFile()); auto decrypt_ret = Gpg::instance()->decryptFromFile(url.toLocalFile());
@ -39,26 +39,26 @@ void Pass::decrypt(QUrl url)
emit decryptCanceled(); emit decryptCanceled();
} else { } else {
qInfo() << "Decrypt OK"; qInfo() << "Decrypt OK";
emit decrypted(decrypt_ret.second); emit decrypted(url.fileName(), decrypt_ret.second);
} }
} }
bool Pass::gpgDeleteKeyId(QString id) bool Pass::deleteGPGKey(QString id)
{ {
qInfo() << "Deleting Key id " << id; qInfo() << "Deleting Key id " << id;
return !Gpg::instance()->deleteKeyId(id); return !Gpg::instance()->deleteKeyId(id);
} }
bool Pass::gpgImportKeyFromFile(QUrl url) bool Pass::importGPGKey(QUrl url)
{ {
qInfo() << "Importing Key from " << url; qInfo() << "Importing Key from " << url;
return !Gpg::instance()->importKeysFromFile(url.toLocalFile()); return !Gpg::instance()->importKeysFromFile(url.toLocalFile());
} }
QVariant Pass::gpgGetAllKeysModel() QVariant Pass::getAllGPGKeys()
{ {
qInfo() << "Getting all key form gpg "; qInfo() << "Getting all key form gpg ";
return QVariant::fromValue(PassKeyModel::keysToPassKeyQObjectList( return QVariant::fromValue(PassKeyModel::keysToPassKey(
Gpg::instance()->getAllKeys().second)); Gpg::instance()->getAllKeys().second)); // TODO Error handling
} }

View File

@ -15,7 +15,7 @@ private:
QString m_password_store; QString m_password_store;
signals: signals:
void decrypted(QString text); void decrypted(QString name, QString text);
void decryptCanceled(); void decryptCanceled();
void decryptFailed(); void decryptFailed();
@ -28,11 +28,11 @@ public:
return m_password_store; return m_password_store;
} }
Q_INVOKABLE void init(QObject *window); Q_INVOKABLE void initialize(QObject *window);
Q_INVOKABLE void decrypt(QUrl url); Q_INVOKABLE void show(QUrl url);
Q_INVOKABLE bool gpgDeleteKeyId(QString id); Q_INVOKABLE bool deleteGPGKey(QString id);
Q_INVOKABLE bool gpgImportKeyFromFile(QUrl url); Q_INVOKABLE bool importGPGKey(QUrl url);
Q_INVOKABLE QVariant gpgGetAllKeysModel(); Q_INVOKABLE QVariant getAllGPGKeys();
}; };
#endif #endif

View File

@ -6,69 +6,84 @@
using namespace GpgME; using namespace GpgME;
class UserIdModel : public QObject
{
Q_OBJECT
Q_PROPERTY(QString uid READ uid MEMBER m_uid CONSTANT)
Q_PROPERTY(QString name READ name MEMBER m_name CONSTANT)
Q_PROPERTY(QString email READ email MEMBER m_email CONSTANT)
UserID m_user_id;
public:
UserIdModel(UserID key):
m_user_id(key)
{};
QString uid() const
{
return QString::fromUtf8(m_user_id.id());
};
QString name() const
{
return QString::fromUtf8(m_user_id.name());
};
QString email() const
{
return QString::fromUtf8(m_user_id.email());
};
};
class PassKeyModel : public QObject class PassKeyModel : public QObject
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY(QString uid READ uid WRITE setUid NOTIFY uidChanged MEMBER m_uid) Q_PROPERTY(QString uid READ uid MEMBER m_uid CONSTANT)
Q_PROPERTY(bool secret READ secret WRITE setSecret NOTIFY secretChanged MEMBER m_secret) Q_PROPERTY(QList<QObject *> userIds READ userIds MEMBER m_user_ids CONSTANT)
Q_PROPERTY(bool expired READ expired WRITE setExpired NOTIFY expiredChanged MEMBER m_expired) Q_PROPERTY(bool isSecret READ isSecret MEMBER m_secret CONSTANT)
Q_PROPERTY(bool isExpired READ isExpired MEMBER m_expired CONSTANT)
QString m_uid;
bool m_secret;
bool m_expired;
Key m_key;
public: public:
PassKeyModel(QString uid, bool secret, bool expired):
m_uid(uid),
m_secret(secret),
m_expired(expired)
{};
PassKeyModel(Key key): PassKeyModel(Key key):
PassKeyModel(QString::fromUtf8(key.keyID()), key.hasSecret(), key.isExpired()) m_key(key)
{}; {};
static QList<QObject *> keysToPassKeyQObjectList(std::vector<Key> keys) static QList<QObject *> keysToPassKey(std::vector<Key> keys)
{ {
QList<QObject *> r; QList<QObject *> ret;
std::for_each(keys.begin(), keys.end(), [&r](Key k) { std::for_each(keys.begin(), keys.end(), [&ret](Key k) {
r.append(new PassKeyModel(k)); ret.append(new PassKeyModel(k));
}); });
return r; return ret;
}; };
QString uid() const QString uid() const
{ {
return m_uid; return QString::fromUtf8(m_key.keyID());
};
bool secret() const
{
return m_secret;
};
bool expired() const
{
return m_expired;
}; };
void setUid(QString uid) QList<QObject *> userIds() const
{ {
m_uid = uid; auto user_ids = m_key.userIDs();
emit uidChanged(uid); QList<QObject *> ret;
} std::for_each(user_ids.begin(), user_ids.end(), [&ret](UserID k) {
void setSecret(bool secret) ret.append(new UserIdModel(k));
{ });
m_secret = secret; return ret;
emit secretChanged(secret); };
}
void setExpired(bool expired)
{
m_expired = expired;
emit expiredChanged(expired);
}
signals: bool isSecret() const
void uidChanged(QString); {
void secretChanged(bool); return m_key.hasSecret();
void expiredChanged(bool); };
bool isExpired() const
{
return m_key.hasSecret();
};
}; };
#endif #endif

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: utpass.qrouland\n" "Project-Id-Version: utpass.qrouland\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-01-13 20:49+0100\n" "POT-Creation-Date: 2025-01-14 13:57+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n" "Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
#: ../qml/components/FileDir.qml:72 #: ../qml/components/FileDir.qml:59
msgid "Decryption failed !" msgid "Decryption failed !"
msgstr "" msgstr ""
@ -47,7 +47,7 @@ msgid "Ok"
msgstr "" msgstr ""
#: ../qml/dialogs/PassphraseDialog.qml:41 #: ../qml/dialogs/PassphraseDialog.qml:41
#: ../qml/dialogs/SimpleValidationDialog.qml:33 #: ../qml/dialogs/SimpleValidationDialog.qml:34
msgid "Cancel" msgid "Cancel"
msgstr "" msgstr ""
@ -83,18 +83,18 @@ msgstr ""
msgid "Info" msgid "Info"
msgstr "" msgstr ""
#: ../qml/pages/PasswordList.qml:26 #: ../qml/pages/PasswordList.qml:22
msgid "" msgid ""
"No password found<br>You can import a password store by cloning or importing " "No password found<br>You can import a password store by cloning or importing "
"a zip in the settings" "a zip in the settings"
msgstr "" msgstr ""
#: ../qml/pages/PasswordList.qml:65 #: ../qml/pages/PasswordList.qml:61
msgid "Back" msgid "Back"
msgstr "" msgstr ""
#: ../qml/pages/headers/MainHeader.qml:9 ../qml/pages/headers/StackHeader.qml:9 #: ../qml/pages/PasswordList.qml:68 ../qml/pages/headers/MainHeader.qml:9
#: UTPass.desktop.in.h:1 #: ../qml/pages/headers/StackHeader.qml:9 UTPass.desktop.in.h:1
msgid "UTPass" msgid "UTPass"
msgstr "" msgstr ""
@ -125,7 +125,8 @@ msgid ""
msgstr "" msgstr ""
#: ../qml/pages/settings/ImportGitClone.qml:91 #: ../qml/pages/settings/ImportGitClone.qml:91
#: ../qml/pages/settings/ImportZip.qml:62 ../qml/pages/settings/InfoKeys.qml:77 #: ../qml/pages/settings/ImportZip.qml:62
#: ../qml/pages/settings/InfoKeys.qml:122
msgid "Yes" msgid "Yes"
msgstr "" msgstr ""
@ -167,27 +168,31 @@ msgstr ""
msgid "Zip Password Store Import" msgid "Zip Password Store Import"
msgstr "" msgstr ""
#: ../qml/pages/settings/InfoKeys.qml:41 #: ../qml/pages/settings/InfoKeys.qml:39
msgid "Key id : %1" msgid "Key ID :"
msgstr "" msgstr ""
#: ../qml/pages/settings/InfoKeys.qml:54 #: ../qml/pages/settings/InfoKeys.qml:73
msgid "Users IDs : "
msgstr ""
#: ../qml/pages/settings/InfoKeys.qml:99
msgid "Delete this key" msgid "Delete this key"
msgstr "" msgstr ""
#: ../qml/pages/settings/InfoKeys.qml:76 #: ../qml/pages/settings/InfoKeys.qml:121
msgid "You're are about to delete<br>%1<br>Continue ?" msgid "You're are about to delete<br>%1<br>Continue ?"
msgstr "" msgstr ""
#: ../qml/pages/settings/InfoKeys.qml:94 #: ../qml/pages/settings/InfoKeys.qml:139
msgid "Key removal failed !" msgid "Key removal failed !"
msgstr "" msgstr ""
#: ../qml/pages/settings/InfoKeys.qml:103 #: ../qml/pages/settings/InfoKeys.qml:148
msgid "Key successfully deleted !" msgid "Key successfully deleted !"
msgstr "" msgstr ""
#: ../qml/pages/settings/InfoKeys.qml:114 #: ../qml/pages/settings/InfoKeys.qml:159
msgid "Info Keys" msgid "Info Keys"
msgstr "" msgstr ""

View File

@ -13,7 +13,7 @@ MainView {
signal responsePassphraseDialog(bool canceled, string passphrase) signal responsePassphraseDialog(bool canceled, string passphrase)
function initPass(rootView) { function initPass(rootView) {
Pass.init(rootView); Pass.initialize(rootView);
pageStack.push(Qt.resolvedUrl("pages/PasswordList.qml")); pageStack.push(Qt.resolvedUrl("pages/PasswordList.qml"));
} }

View File

@ -8,10 +8,6 @@ import QtQuick 2.4
Component { Component {
Rectangle { Rectangle {
id: fileDir
property string activePasswordName
anchors.right: parent.right anchors.right: parent.right
anchors.left: parent.left anchors.left: parent.left
height: units.gu(5) height: units.gu(5)
@ -40,18 +36,9 @@ Component {
if (fileIsDir) { if (fileIsDir) {
folderModel.folder = folderModel.folder + "/" + fileName; folderModel.folder = folderModel.folder + "/" + fileName;
backAction.visible = true; backAction.visible = true;
passwordListHeader.title = fileName;
} else { } else {
fileDir.activePasswordName = fileBaseName; Pass.show(folderModel.folder + "/" + fileName);
Pass.onDecrypted.connect(function(text) {
pageStack.push(Qt.resolvedUrl("../pages/Password.qml"), {
"plainText": text,
"title": fileDir.activePasswordName
});
});
Pass.onDecryptFailed.connect(function() {
PopupUtils.open(passwordPageDecryptError);
});
Pass.decrypt(folderModel.folder + "/" + fileName);
} }
} }
} }

View File

@ -49,11 +49,11 @@ Page {
iconName: "back" iconName: "back"
text: "Back" text: "Back"
onTriggered: { onTriggered: {
passwordPage.plainText = ""; // passwordPage.plainText = "";
for (var object in objects) { // for (var object in objects) {
object.text = ""; // object.text = "";
object.destroy(); // object.destroy();
} // }
pageStack.pop(); pageStack.pop();
} }
} }

View File

@ -13,6 +13,15 @@ Page {
anchors.fill: parent anchors.fill: parent
Component.onCompleted: { Component.onCompleted: {
passwordStorePath = "file:" + Pass.password_store; passwordStorePath = "file:" + Pass.password_store;
Pass.onDecrypted.connect(function(filename, text) {
pageStack.push(Qt.resolvedUrl("../pages/Password.qml"), {
"plainText": text,
"title": filename
});
});
Pass.onDecryptFailed.connect(function() {
PopupUtils.open(passwordPageDecryptError);
});
} }
Rectangle { Rectangle {
@ -66,9 +75,13 @@ Page {
visible: false visible: false
onTriggered: { onTriggered: {
folderModel.folder = folderModel.parentFolder; folderModel.folder = folderModel.parentFolder;
if (folderModel.rootFolder === folderModel.folder) console.debug(folderModel.folder);
if (folderModel.rootFolder === folderModel.folder) {
backAction.visible = false; backAction.visible = false;
passwordListHeader.title = i18n.tr("UTPass");
} else {
passwordListHeader.title = folderModel.folder;
}
} }
} }
] ]

View File

@ -28,7 +28,7 @@ Page {
if (importKeyFilePage.activeTransfer.state === ContentTransfer.Charged) { if (importKeyFilePage.activeTransfer.state === ContentTransfer.Charged) {
console.log("Charged"); console.log("Charged");
console.log(importKeyFilePage.activeTransfer.items[0].url); console.log(importKeyFilePage.activeTransfer.items[0].url);
var status = Pass.gpgImportKeyFromFile(importKeyFilePage.activeTransfer.items[0].url); var status = Pass.importGPGKey(importKeyFilePage.activeTransfer.items[0].url);
Utils.rmFile(importKeyFilePage.activeTransfer.items[0].url); Utils.rmFile(importKeyFilePage.activeTransfer.items[0].url);
if (status) if (status)
PopupUtils.open(dialogImportKeyPageSucess); PopupUtils.open(dialogImportKeyPageSucess);

View File

@ -18,7 +18,7 @@ Page {
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.right: parent.right anchors.right: parent.right
anchors.left: parent.left anchors.left: parent.left
model: Pass.gpgGetAllKeysModel() model: Pass.getAllGPGKeys()
delegate: Grid { delegate: Grid {
columns: 1 columns: 1
@ -33,15 +33,60 @@ Page {
} }
Text { Text {
id: uidKey
width: parent.width width: parent.width
horizontalAlignment: Text.AlignHCenter horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
text: i18n.tr('Key id : %1').arg(model.modelData.uid) text: i18n.tr('Key ID :')
color: theme.palette.normal.backgroundText color: theme.palette.normal.backgroundText
} }
Text {
width: parent.width
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
text: model.modelData.uid
color: theme.palette.normal.backgroundText
}
Rectangle {
width: parent.width
height: units.gu(1)
color: theme.palette.normal.background
}
ListModel {
id: userIdsModel
Component.onCompleted: {
for (var i = 0; i < model.modelData.userIds.length; ++i) {
userIdsModel.append({
"model": model.modelData.userIds[i]
});
}
}
}
Text {
width: parent.width
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
text: i18n.tr('Users IDs : ')
color: theme.palette.normal.backgroundText
}
Repeater {
model: userIdsModel
Text {
width: parent.width
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
text: modelData.uid
color: theme.palette.normal.backgroundText
}
}
Rectangle { Rectangle {
width: parent.width width: parent.width
height: units.gu(1) height: units.gu(1)
@ -77,7 +122,7 @@ Page {
continueText: i18n.tr("Yes") continueText: i18n.tr("Yes")
continueColor: theme.palette.normal.negative continueColor: theme.palette.normal.negative
onValidated: { onValidated: {
var status = Pass.gpgDeleteKeyId(infoKeysPage.currentKey); var status = Pass.deleteGPGKey(infoKeysPage.currentKey);
if (status) if (status)
PopupUtils.open(infoKeysPageDeleteSuccess); PopupUtils.open(infoKeysPageDeleteSuccess);
else else
@ -102,7 +147,7 @@ Page {
SuccessDialog { SuccessDialog {
textSuccess: i18n.tr("Key successfully deleted !") textSuccess: i18n.tr("Key successfully deleted !")
onDialogClosed: { onDialogClosed: {
infoKeysListView.model = Pass.gpgGetAllKeysModel(); infoKeysListView.model = Pass.getAllGPGKeys();
} }
} }