mirror of
https://github.com/QRouland/UTPass.git
synced 2025-05-12 13:30:54 +00:00
Compare commits
4 Commits
8ec593becc
...
00116aea8c
Author | SHA1 | Date | |
---|---|---|---|
00116aea8c | |||
fd3ab95b27 | |||
200964246e | |||
0e5df76787 |
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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) {
|
||||||
|
@ -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
|
||||||
|
@ -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";
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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 ""
|
||||||
|
|
||||||
|
@ -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"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -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);
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user