Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/mainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -985,7 +985,7 @@ void MainWindow::onUsers() {
? Util::getDir(ui->treeView->currentIndex(), false, model, proxyModel)
: currentDir;
int count = 0;
QString recipients = QtPassSettings::getPass()->getRecipientString(
QStringList recipients = QtPassSettings::getPass()->getRecipientString(
dir.isEmpty() ? "" : dir, " ", &count);
if (!recipients.isEmpty())
selected_users = QtPassSettings::getPass()->listKeys(recipients);
Expand All @@ -1007,7 +1007,7 @@ void MainWindow::onUsers() {
users.append(i);
}
}
}
}
UsersDialog d(this);
d.setUsers(&users);
if (!d.exec()) {
Expand Down
86 changes: 47 additions & 39 deletions src/pass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -111,44 +111,58 @@ void Pass::GenerateGPGKeys(QString batch) {
// https://github.com/IJHack/QtPass/issues/202#issuecomment-251081688
}

/**
* @brief Pass::listKeys list users
* @param keystrings
* @param secret list private keys
* @return QList<UserInfo> users
*/
QList<UserInfo> Pass::listKeys(QStringList keystrings, bool secret) {
QList<UserInfo> users;
QStringList args = {"--no-tty", "--with-colons"};
args.append(secret ? "--list-secret-keys" : "--list-keys");

foreach (QString keystring, keystrings) {
if(!keystring.isEmpty()) {
args.append(keystring);
}
}
QString p_out;
if (exec.executeBlocking(QtPassSettings::getGpgExecutable(), args, &p_out) !=
0)
return users;
QStringList keys = p_out.split(QRegExp("[\r\n]"), QString::SkipEmptyParts);
UserInfo current_user;
foreach (QString key, keys) {
QStringList props = key.split(':');
if (props.size() < 10)
continue;
if (props[0] == (secret ? "sec" : "pub")) {
if (!current_user.key_id.isEmpty())
users.append(current_user);
current_user = UserInfo();
current_user.key_id = props[4];
current_user.name = props[9].toUtf8();
current_user.validity = props[1][0].toLatin1();
current_user.created.setTime_t(props[5].toUInt());
current_user.expiry.setTime_t(props[6].toUInt());
} else if (current_user.name.isEmpty() && props[0] == "uid") {
current_user.name = props[9];
}
}
if (!current_user.key_id.isEmpty())
users.append(current_user);
return users;
}

/**
* @brief Pass::listKeys list users
* @param keystring
* @param secret list private keys
* @return QList<UserInfo> users
*/
QList<UserInfo> Pass::listKeys(QString keystring, bool secret) {
QList<UserInfo> users;
QStringList args = {"--no-tty", "--with-colons"};
args.append(secret ? "--list-secret-keys" : "--list-keys");
if (!keystring.isEmpty())
args.append(keystring);
QString p_out;
if (exec.executeBlocking(QtPassSettings::getGpgExecutable(), args, &p_out) !=
0)
return users;
QStringList keys = p_out.split(QRegExp("[\r\n]"), QString::SkipEmptyParts);
UserInfo current_user;
foreach (QString key, keys) {
QStringList props = key.split(':');
if (props.size() < 10)
continue;
if (props[0] == (secret ? "sec" : "pub")) {
if (!current_user.key_id.isEmpty())
users.append(current_user);
current_user = UserInfo();
current_user.key_id = props[4];
current_user.name = props[9].toUtf8();
current_user.validity = props[1][0].toLatin1();
current_user.created.setTime_t(props[5].toUInt());
current_user.expiry.setTime_t(props[6].toUInt());
} else if (current_user.name.isEmpty() && props[0] == "uid") {
current_user.name = props[9];
}
}
if (!current_user.key_id.isEmpty())
users.append(current_user);
return users;
return listKeys(QStringList(keystring), secret);
}

/**
Expand Down Expand Up @@ -266,15 +280,9 @@ QStringList Pass::getRecipientList(QString for_file) {
* @param count
* @return recepient string
*/
QString Pass::getRecipientString(QString for_file, QString separator,
QStringList Pass::getRecipientString(QString for_file, QString separator,
int *count) {
QString recipients_str;
QStringList recipients_list = Pass::getRecipientList(for_file);
if (count)
*count = recipients_list.size();
foreach (const QString recipient, recipients_list)
recipients_str += separator + '"' + recipient + '"';
return recipients_str;
return Pass::getRecipientList(for_file);
}

/* Copyright (C) 2017 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
Expand Down
3 changes: 2 additions & 1 deletion src/pass.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,11 +54,12 @@ class Pass : public QObject {
virtual QString Generate_b(unsigned int length, const QString &charset);

void GenerateGPGKeys(QString batch);
QList<UserInfo> listKeys(QStringList keystring, bool secret = false);
QList<UserInfo> listKeys(QString keystring = "", bool secret = false);
void updateEnv();
static QStringList getRecipientList(QString for_file);
// TODO(bezet): getRecipientString is useless, refactor
static QString getRecipientString(QString for_file, QString separator = " ",
static QStringList getRecipientString(QString for_file, QString separator = " ",
int *count = NULL);

protected:
Expand Down