From 9ab73acf44585546914c1429821ca3d61a9fd29d Mon Sep 17 00:00:00 2001 From: Eric Date: Tue, 13 Jun 2023 02:13:18 +0000 Subject: Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (192 of 192 strings) Translation: QtPass/QtPass Translate-URL: https://hosted.weblate.org/projects/qtpass/qtpass/zh_Hans/ --- localization/localization_zh_CN.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/localization/localization_zh_CN.ts b/localization/localization_zh_CN.ts index 0cd175a2..20b29d4b 100644 --- a/localization/localization_zh_CN.ts +++ b/localization/localization_zh_CN.ts @@ -252,7 +252,7 @@ Profiles - 用户 + 配置文件 @@ -843,7 +843,7 @@ Expire-Date: 0 New file - 新密码 + 新文件 @@ -904,7 +904,7 @@ Expire-Date: 0 Add password - 新密码 + 添加密码 @@ -1034,7 +1034,7 @@ Expire-Date: 0 Character Set: - 所用字符: + 字符集: -- cgit v1.2.3 From f386cc08a2d4de3e9d51f78479eb1c6c4ca1c7f2 Mon Sep 17 00:00:00 2001 From: Alexander Blum Date: Fri, 16 Jun 2023 19:26:02 +0200 Subject: Add pass store signing key feature --- README.md | 1 + src/configdialog.cpp | 35 +++++++++++++++++++++++------------ src/configdialog.h | 4 ++-- src/configdialog.ui | 5 +++++ src/mainwindow.cpp | 9 ++++++--- src/pass.cpp | 23 ++++++++++++++++++++++- src/qtpasssettings.cpp | 31 +++++++++++++++++++++++-------- src/qtpasssettings.h | 8 ++++++-- src/settingsconstants.cpp | 1 + src/settingsconstants.h | 1 + 10 files changed, 90 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 6ffd46c1..43a126b3 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,7 @@ qmake && make && make install ## Using profiles Profiles allow to group passwords. Each profile might use a different git repository and/or different gpg key. +Each profile also can be associated with a pass store singing key to verify the detached .gpg-id signature (pass only). A typical use case is to separate personal and work passwords. > **Hint**
diff --git a/src/configdialog.cpp b/src/configdialog.cpp index 4a711b03..72b5f809 100644 --- a/src/configdialog.cpp +++ b/src/configdialog.cpp @@ -97,7 +97,7 @@ ConfigDialog::ConfigDialog(MainWindow *parent) useTemplate(QtPassSettings::isUseTemplate()); ui->profileTable->verticalHeader()->hide(); - ui->profileTable->horizontalHeader()->setStretchLastSection(true); + ui->profileTable->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch); ui->label->setText(ui->label->text() + VERSION); ui->comboBoxClipboard->clear(); @@ -170,7 +170,7 @@ void ConfigDialog::validate(QTableWidgetItem *item) { for (int j = 0; j < ui->profileTable->columnCount(); j++) { QTableWidgetItem *_item = ui->profileTable->item(i, j); - if (_item->text().isEmpty()) { + if (_item->text().isEmpty() && j != 2) { _item->setBackground(Qt::red); status = false; break; @@ -181,7 +181,7 @@ void ConfigDialog::validate(QTableWidgetItem *item) { break; } } else { - if (item->text().isEmpty()) { + if (item->text().isEmpty() && item->column() != 2) { item->setBackground(Qt::red); status = false; } @@ -460,8 +460,8 @@ void ConfigDialog::genKey(QString batch, QDialog *dialog) { * @param profiles * @param profile */ -void ConfigDialog::setProfiles(QHash profiles, - QString profile) { +void ConfigDialog::setProfiles(QHash> profiles, + QString currentProfile) { // dbg()<< profiles; if (profiles.contains("")) { profiles.remove(""); @@ -469,15 +469,19 @@ void ConfigDialog::setProfiles(QHash profiles, } ui->profileTable->setRowCount(profiles.count()); - QHashIterator i(profiles); + QHashIterator> i(profiles); int n = 0; while (i.hasNext()) { i.next(); if (!i.value().isEmpty() && !i.key().isEmpty()) { - ui->profileTable->setItem(n, 0, new QTableWidgetItem(i.key())); - ui->profileTable->setItem(n, 1, new QTableWidgetItem(i.value())); + ui->profileTable->setItem( + n, 0, new QTableWidgetItem(i.key())); + ui->profileTable->setItem( + n, 1, new QTableWidgetItem(i.value().value("path"))); + ui->profileTable->setItem( + n, 2, new QTableWidgetItem(i.value().value("signingKey"))); // dbg()<< "naam:" + i.key(); - if (i.key() == profile) + if (i.key() == currentProfile) ui->profileTable->selectRow(n); } ++n; @@ -488,17 +492,23 @@ void ConfigDialog::setProfiles(QHash profiles, * @brief ConfigDialog::getProfiles return profile list. * @return */ -QHash ConfigDialog::getProfiles() { - QHash profiles; +QHash> ConfigDialog::getProfiles() { + QHash> profiles; // Check? for (int i = 0; i < ui->profileTable->rowCount(); ++i) { + QHash profile; QTableWidgetItem *pathItem = ui->profileTable->item(i, 1); if (nullptr != pathItem) { QTableWidgetItem *item = ui->profileTable->item(i, 0); if (item == nullptr) { continue; } - profiles.insert(item->text(), pathItem->text()); + profile["path"] = pathItem->text(); + QTableWidgetItem *signingKeyItem = ui->profileTable->item(i, 2); + if (nullptr != signingKeyItem) { + profile["signingKey"] = signingKeyItem->text(); + } + profiles.insert(item->text(), profile); } } return profiles; @@ -512,6 +522,7 @@ void ConfigDialog::on_addButton_clicked() { ui->profileTable->insertRow(n); ui->profileTable->setItem(n, 0, new QTableWidgetItem()); ui->profileTable->setItem(n, 1, new QTableWidgetItem(ui->storePath->text())); + ui->profileTable->setItem(n, 2, new QTableWidgetItem()); ui->profileTable->selectRow(n); ui->deleteButton->setEnabled(true); diff --git a/src/configdialog.h b/src/configdialog.h index a0f162b0..4460d4bf 100644 --- a/src/configdialog.h +++ b/src/configdialog.h @@ -31,7 +31,7 @@ public: void useSelection(bool useSelection); void useAutoclear(bool useAutoclear); void useAutoclearPanel(bool useAutoclearPanel); - QHash getProfiles(); + QHash> getProfiles(); void wizard(); void genKey(QString, QDialog *); void useTrayIcon(bool useSystray); @@ -76,7 +76,7 @@ private: QStringList getSecretKeys(); void setGitPath(QString); - void setProfiles(QHash, QString); + void setProfiles(QHash>, QString); void usePass(bool usePass); void setGroupBoxState(); diff --git a/src/configdialog.ui b/src/configdialog.ui index 874bbb3f..68281ca7 100644 --- a/src/configdialog.ui +++ b/src/configdialog.ui @@ -913,6 +913,11 @@ Path + + + Signing Key + + diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 60b3d0ca..e273dbb1 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -766,7 +766,7 @@ void MainWindow::generateKeyPair(QString batch, QDialog *keygenWindow) { * select a more appropriate one to view too */ void MainWindow::updateProfileBox() { - QHash profiles = QtPassSettings::getProfiles(); + QHash> profiles = QtPassSettings::getProfiles(); if (profiles.isEmpty()) { ui->profileWidget->hide(); @@ -774,7 +774,7 @@ void MainWindow::updateProfileBox() { ui->profileWidget->show(); ui->profileBox->setEnabled(profiles.size() > 1); ui->profileBox->clear(); - QHashIterator i(profiles); + QHashIterator> i(profiles); while (i.hasNext()) { i.next(); if (!i.key().isEmpty()) @@ -800,7 +800,10 @@ void MainWindow::on_profileBox_currentIndexChanged(QString name) { QtPassSettings::setProfile(name); - QtPassSettings::setPassStore(QtPassSettings::getProfiles()[name]); + QtPassSettings::setPassStore( + QtPassSettings::getProfiles().value(name).value("path")); + QtPassSettings::setPassSigningKey( + QtPassSettings::getProfiles().value(name).value("signingKey")); ui->statusBar->showMessage(tr("Profile changed to %1").arg(name), 2000); QtPassSettings::getPass()->updateEnv(); diff --git a/src/pass.cpp b/src/pass.cpp index f52c27a5..8509161f 100644 --- a/src/pass.cpp +++ b/src/pass.cpp @@ -242,8 +242,29 @@ void Pass::finished(int id, int exitCode, const QString &out, * switching profiles) */ void Pass::updateEnv() { - QStringList store = env.filter("PASSWORD_STORE_DIR="); + // put PASSWORD_STORE_SIGNING_KEY in env + QStringList envSigningKey = env.filter("PASSWORD_STORE_SIGNING_KEY="); + QString currentSigningKey = QtPassSettings::getPassSigningKey(); + if (envSigningKey.isEmpty()) { + if (!currentSigningKey.isEmpty()) { + // dbg()<< "Added + // PASSWORD_STORE_SIGNING_KEY with" + currentSigningKey; + env.append("PASSWORD_STORE_SIGNING_KEY=" + currentSigningKey); + } + } else { + if (currentSigningKey.isEmpty()) { + // dbg() << "Removed + // PASSWORD_STORE_SIGNING_KEY"; + env.removeAll(envSigningKey.first()); + } else { + // dbg()<< "Update + // PASSWORD_STORE_SIGNING_KEY with " + currentSigningKey; + env.replaceInStrings(envSigningKey.first(), + "PASSWORD_STORE_SIGNING_KEY=" + currentSigningKey); + } + } // put PASSWORD_STORE_DIR in env + QStringList store = env.filter("PASSWORD_STORE_DIR="); if (store.isEmpty()) { // dbg()<< "Added // PASSWORD_STORE_DIR"; diff --git a/src/qtpasssettings.cpp b/src/qtpasssettings.cpp index b32a6525..83117021 100644 --- a/src/qtpasssettings.cpp +++ b/src/qtpasssettings.cpp @@ -58,13 +58,18 @@ void QtPassSettings::setPasswordConfiguration( config.Characters[PasswordConfiguration::CUSTOM]); } -QHash QtPassSettings::getProfiles() { +QHash> QtPassSettings::getProfiles() { getInstance()->beginGroup(SettingsConstants::profile); - QStringList childrenKeys = getInstance()->childKeys(); - QHash profiles; - foreach (QString key, childrenKeys) { - profiles.insert(key, getInstance()->value(key).toString()); + QStringList childGroups = getInstance()->childGroups(); + QHash> profiles; + foreach (QString group, childGroups) { + QHash profile; + profile.insert("path", getInstance()->value(group + "/path").toString()); + profile.insert("signingKey", + getInstance()->value(group + "/signingKey").toString()); + // profiles.insert(group, getInstance()->value(group).toString()); + profiles.insert(group, profile); } getInstance()->endGroup(); @@ -72,13 +77,14 @@ QHash QtPassSettings::getProfiles() { return profiles; } -void QtPassSettings::setProfiles(const QHash &profiles) { +void QtPassSettings::setProfiles(const QHash> &profiles) { getInstance()->remove(SettingsConstants::profile); getInstance()->beginGroup(SettingsConstants::profile); - QHash::const_iterator i = profiles.begin(); + QHash>::const_iterator i = profiles.begin(); for (; i != profiles.end(); ++i) { - getInstance()->setValue(i.key(), i.value()); + getInstance()->setValue(i.key() + "/path", i.value().value("path")); + getInstance()->setValue(i.key() + "/signingKey", i.value().value("signingKey")); } getInstance()->endGroup(); @@ -303,6 +309,15 @@ void QtPassSettings::setPassStore(const QString &passStore) { getInstance()->setValue(SettingsConstants::passStore, passStore); } +QString QtPassSettings::getPassSigningKey(const QString &defaultValue) { + return getInstance() + ->value(SettingsConstants::passSigningKey, defaultValue) + .toString(); +} +void QtPassSettings::setPassSigningKey(const QString &passSigningKey) { + getInstance()->setValue(SettingsConstants::passSigningKey, passSigningKey); +} + void QtPassSettings::initExecutables() { QString passExecutable = QtPassSettings::getPassExecutable(Util::findBinaryInPath("pass")); diff --git a/src/qtpasssettings.h b/src/qtpasssettings.h index e3d5b3f0..d96c70c9 100644 --- a/src/qtpasssettings.h +++ b/src/qtpasssettings.h @@ -108,6 +108,10 @@ public: getPassStore(const QString &defaultValue = QVariant().toString()); static void setPassStore(const QString &passStore); + static QString + getPassSigningKey(const QString &defaultValue = QVariant().toString()); + static void setPassSigningKey(const QString &passSigningKey); + static void initExecutables(); static QString getPassExecutable(const QString &defaultValue = QVariant().toString()); @@ -210,8 +214,8 @@ public: isTemplateAllFields(const bool &defaultValue = QVariant().toBool()); static void setTemplateAllFields(const bool &templateAllFields); - static QHash getProfiles(); - static void setProfiles(const QHash &profiles); + static QHash> getProfiles(); + static void setProfiles(const QHash> &profiles); static Pass *getPass(); static RealPass *getRealPass(); diff --git a/src/settingsconstants.cpp b/src/settingsconstants.cpp index 863d110f..00b004fd 100644 --- a/src/settingsconstants.cpp +++ b/src/settingsconstants.cpp @@ -32,6 +32,7 @@ const QString SettingsConstants::displayAsIs = "displayAsIs"; const QString SettingsConstants::noLineWrapping = "noLineWrapping"; const QString SettingsConstants::addGPGId = "addGPGId"; const QString SettingsConstants::passStore = "passStore"; +const QString SettingsConstants::passSigningKey = "passSigningKey"; const QString SettingsConstants::passExecutable = "passExecutable"; const QString SettingsConstants::gitExecutable = "gitExecutable"; const QString SettingsConstants::gpgExecutable = "gpgExecutable"; diff --git a/src/settingsconstants.h b/src/settingsconstants.h index bb237ab3..f95aeba2 100644 --- a/src/settingsconstants.h +++ b/src/settingsconstants.h @@ -31,6 +31,7 @@ public: const static QString noLineWrapping; const static QString addGPGId; const static QString passStore; + const static QString passSigningKey; const static QString passExecutable; const static QString gitExecutable; const static QString gpgExecutable; -- cgit v1.2.3 From 88bb093dfacab7cc2d2ed8dbb25cb6fa8a1306de Mon Sep 17 00:00:00 2001 From: Alexander Blum Date: Sun, 18 Jun 2023 21:11:54 +0200 Subject: Add migration for profile settings from 'profile/name'->path to 'profile/name/path'->path --- src/qtpasssettings.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/qtpasssettings.cpp b/src/qtpasssettings.cpp index 83117021..9a95c96b 100644 --- a/src/qtpasssettings.cpp +++ b/src/qtpasssettings.cpp @@ -60,9 +60,21 @@ void QtPassSettings::setPasswordConfiguration( QHash> QtPassSettings::getProfiles() { getInstance()->beginGroup(SettingsConstants::profile); + QHash> profiles; + + // migration from version <= v1.3.2: profiles datastructure + QStringList childKeys = getInstance()->childKeys(); + if (!childKeys.empty()) { + foreach (QString key, childKeys) { + QHash profile; + profile.insert("path", getInstance()->value(key).toString()); + profile.insert("signingKey", ""); + profiles.insert(key, profile); + } + } + // /migration from version <= v1.3.2 QStringList childGroups = getInstance()->childGroups(); - QHash> profiles; foreach (QString group, childGroups) { QHash profile; profile.insert("path", getInstance()->value(group + "/path").toString()); -- cgit v1.2.3 From 386f6651d75dc0d40034140e74a3212669e97347 Mon Sep 17 00:00:00 2001 From: Tim Lee Date: Tue, 20 Jun 2023 02:40:24 +0200 Subject: Added translation using Weblate (Korean) --- localization/localization_ko.ts | 1291 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 1291 insertions(+) create mode 100644 localization/localization_ko.ts diff --git a/localization/localization_ko.ts b/localization/localization_ko.ts new file mode 100644 index 00000000..d3ec9efe --- /dev/null +++ b/localization/localization_ko.ts @@ -0,0 +1,1291 @@ + + + + + ConfigDialog + + + Configuration + + + + + Settings + + + + + Clipboard behaviour: + + + + + Use primary selection + + + + + Autoclear after: + + + + + + Seconds + + + + Password Behaviour: + Password Behaviour: + + + + Content panel behaviour: + + + + + Hide content + + + + + Hide password + + + + + Autoclear panel after: + + + + + Use a monospace font + + + + + Display the files content as-is + + + + + No line wrapping + + + + + Password Generation: + + + + + Password Length: + + + + + Characters + + + + + Use characters: + + + + + Select character set for password generation + + + + + All Characters + + + + + Alphabetical + + + + + Alphanumerical + + + + + Custom + + + + + ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 + + + + + Include special symbols + + + + + Current path + + + + Use pwgen + Use pwgen + + + + Exclude capital letters + + + + Include special symbols + Include special symbols + + + + Generate easy to memorize but less secure passwords + + + + + Exclude numbers + + + + + Git: + + + + Use git + Use git + + + + Automatically add .gpg-id files + + + + + Automatically push + + + + + Automatically pull + + + + + Extensions: + + + + Use pass otp extension + Use pass otp extension + + + + System: + + + + + Use TrayIcon + + + + + Start minimized + + + + + Hide on close + + + + + Always on top + + + + + Programs + + + + + Select password storage program: + + + + Nati&ve git/gpg + Nati&ve git/gpg + + + + &Use pass + + + + + Native + + + + git + git + + + ... + ... + + + gpg + gpg + + + pwgen + pwgen + + + + Pass + + + + + pass + + + + <html><head/><body><p><a href="https://www.passwordstore.org/"><span style=" text-decoration: underline; color:#0000ff;">www.passwordstore.org</span></a></p></body></html> + <html><head/><body><p><a href="https://www.passwordstore.org/"><span style=" text-decoration: underline; color:#0000ff;">www.passwordstore.org</span></a></p></body></html> + + + + Profiles + + + + + Name + + + + + Path + + + + + Add + + + + + Delete + + + + Current password-store + Current password-store + + + + Template + + + + Templates add extra fields in the password generation dialogue and in the password view. + Templates add extra fields in the password generation dialogue and in the password view. + + + + Use template + + + + + Show all lines beginning with a word followed by a colon as fields in password fields, not only the listed ones + + + + + Show all fields templated + + + + login +url +email + login +url +email + + + + <a href="https://QtPass.org/">QtPass</a> version + + + + + No Clipboard + + + + + Always copy to clipboard + + + + + On-demand copy to clipboard + + + + + No profile selected + + + + + No profile selected to delete + + + + + GnuPG not found + + + + + Please install GnuPG on your system.<br>Install <strong>gpg</strong> using your favorite package manager<br>or <a href="https://www.gnupg.org/download/#sec-1-2">download</a> it from GnuPG.org + + + + + Create password-store? + + + + + Would you like to create a password-store at %1? + + + + + Password store not initialised + + + + + The folder %1 doesn't seem to be a password store or is not yet initialised. + + + + + <html><head/><body><p><a href="https://www.passwordstore.org/"><span style=" text-decoration: underline;">www.passwordstore.org</span></a></p></body></html> + + + + + Autodetect + + + + + System tray is not available + + + + + Pass OTP extension needs to be installed + + + + + qrencode needs to be installed + + + + + Please install GnuPG on your system.<br>Install <strong>Ubuntu</strong> from the Microsoft Store to get it.<br>If you already did so, make sure you started it once and<br>click "Autodetect" in the next dialog. + + + + + Please install GnuPG on your system.<br>Install <strong>Ubuntu</strong> from the Microsoft Store<br>or <a href="https://www.gnupg.org/download/#sec-1-2">download</a> it from GnuPG.org + + + + + Use PWGen + + + + + Use Git + + + + + Use QRencode + + + + + Use pass-otp extension + + + + + Nati&ve Git/GPG + + + + + Git + + + + + + + + + … + + + + + GPG + + + + + PWGen + + + + + Templates add extra fields in the password generation dialogue, and in the password view. + + + + + login +URL +e-mail + + + + + ImitatePass + + + + Can not edit + + + + + + Could not read encryption key to use, .gpg-id file missing or invalid. + + + + + Cannot update + + + + + Failed to open .gpg-id for writing. + + + + + Check selected users! + + + + + None of the selected keys have a secret key available. +You will not be able to decrypt any newly added passwords! + + + + + Re-encrypting from folder %1 + + + + + + Updating password-store + + + + + KeygenDialog + + + Generate GnuPG keypair + + + + + Generate a new key pair + + + + + Passphrase + + + + + Email + + + + + Name + + + + + <html><head/><body><p>There is no limit on the length of a passphrase, and it should be carefully chosen. From the perspective of security, the passphrase to unlock the private key is one of the weakest points in GnuPG (and other public-key encryption systems as well) since it is the only protection you have if another individual gets your private key. <br/>Ideally, the passphrase should not use words from a dictionary and should mix the case of alphabetic characters as well as use non-alphabetic characters.<br/>A good passphrase is crucial to the secure use of GnuPG.</p></body></html> + + + + + Expert + + + + + # QtPass GPG key generator +# +# first test version please comment +# +%echo Generating a default key +Key-Type: default +Subkey-Type: default +Name-Real: +Name-Comment: QtPass +Name-Email: +Expire-Date: 0 +%no-protection +# Do a commit here, so that we can later print "done" :-) +%commit +%echo done + + + + + For expert options check out the <a href="https://www.gnupg.org/documentation/manuals/gnupg/Unattended-GPG-key-generation.html">GnuPG manual</a> + + + + + Invalid name + + + + + Name must be at least 5 characters long. + + + + + Invalid email + + + + + The email address you typed is not a valid email address. + + + + + This operation can take some minutes.<br />We need to generate a lot of random bytes. It is a good idea to perform some other action (type on the keyboard, move the mouse, utilize the disks) during the prime generation; this gives the random number generator a better chance to gain enough entropy. + + + + + MainWindow + + + QtPass + + + + Add + Add + + + + + + Edit + + + + + + + Delete + + + + git push + git push + + + + Push + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Helvetica Neue,Helvetica,Segoe UI,Arial,freesans,sans-serif'; font-size:13pt; font-weight:600; color:#333333;">QtPass</span><span style=" font-family:'Helvetica Neue,Helvetica,Segoe UI,Arial,freesans,sans-serif'; font-size:13pt; color:#333333;"> is a GUI for </span><a href="https://www.passwordstore.org/"><span style=" font-family:'Helvetica Neue,Helvetica,Segoe UI,Arial,freesans,sans-serif'; font-size:13pt; text-decoration: underline; color:#4183c4; background-color:transparent;">pass</span></a><span style=" font-family:'Helvetica Neue,Helvetica,Segoe UI,Arial,freesans,sans-serif'; font-size:13pt; color:#333333;">, the standard unix password manager.</span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Helvetica Neue,Helvetica,Segoe UI,Arial,freesans,sans-serif'; font-size:13pt; color:#333333;"><br />Please report any </span><a href="https://github.com/IJHack/qtpass/issues"><span style=" font-family:'Helvetica Neue,Helvetica,Segoe UI,Arial,freesans,sans-serif'; font-size:13pt; text-decoration: underline; color:#4183c4;">issues</span></a><span style=" font-family:'Helvetica Neue,Helvetica,Segoe UI,Arial,freesans,sans-serif'; font-size:13pt; color:#333333;"> you might have with this software.</span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="https://qtpass.org/"><span style=" font-family:'Helvetica Neue,Helvetica,Segoe UI,Arial,freesans,sans-serif'; font-size:13pt; text-decoration: underline; color:#4183c4; background-color:transparent;">Documentation</span></a></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="https://github.com/IJHack/qtpass"><span style=" font-family:'Noto Sans'; font-size:12pt; text-decoration: underline; color:#4183c4;">SourceCode</span></a></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Helvetica Neue,Helvetica,Segoe UI,Arial,freesans,sans-serif'; font-size:13pt; font-weight:600; color:#333333;">QtPass</span><span style=" font-family:'Helvetica Neue,Helvetica,Segoe UI,Arial,freesans,sans-serif'; font-size:13pt; color:#333333;"> is a GUI for </span><a href="https://www.passwordstore.org/"><span style=" font-family:'Helvetica Neue,Helvetica,Segoe UI,Arial,freesans,sans-serif'; font-size:13pt; text-decoration: underline; color:#4183c4; background-color:transparent;">pass</span></a><span style=" font-family:'Helvetica Neue,Helvetica,Segoe UI,Arial,freesans,sans-serif'; font-size:13pt; color:#333333;">, the standard unix password manager.</span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Helvetica Neue,Helvetica,Segoe UI,Arial,freesans,sans-serif'; font-size:13pt; color:#333333;"><br />Please report any </span><a href="https://github.com/IJHack/qtpass/issues"><span style=" font-family:'Helvetica Neue,Helvetica,Segoe UI,Arial,freesans,sans-serif'; font-size:13pt; text-decoration: underline; color:#4183c4;">issues</span></a><span style=" font-family:'Helvetica Neue,Helvetica,Segoe UI,Arial,freesans,sans-serif'; font-size:13pt; color:#333333;"> you might have with this software.</span></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="https://qtpass.org/"><span style=" font-family:'Helvetica Neue,Helvetica,Segoe UI,Arial,freesans,sans-serif'; font-size:13pt; text-decoration: underline; color:#4183c4; background-color:transparent;">Documentation</span></a></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="https://github.com/IJHack/qtpass"><span style=" font-family:'Noto Sans'; font-size:12pt; text-decoration: underline; color:#4183c4;">SourceCode</span></a></p></body></html> + + + + Ctrl+N + + + + + OTP + + + + + Generate OTP and copy to clipboard + + + + + Ctrl+G + + + + + Git push + + + + + Git pull + + + + git pull + git pull + + + + Update + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'.SF NS Text'; font-size:13pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> <span style=" font-family:'Lato';">QtPass</span> is a GUI for <a href="https://www.passwordstore.org/"><span style=" text-decoration: underline; color:#0000ff;">pass</span></a>, the standard unix password manager.<br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Please report any <a href="https://github.com/IJHack/qtpass/issues"><span style=" text-decoration: underline; color:#0000ff;">issues</span></a> you might have with this software.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="https://qtpass.org/"><span style=" text-decoration: underline; color:#0000ff;">Documentation</span></a></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="https://github.com/IJHack/qtpass"><span style=" text-decoration: underline; color:#0000ff;">SourceCode</span></a></p></body></html> + <!DOCTYPE HTML><html><head> <meta name="qrichtext" content="1"/> <style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body><p><span style="font-family: Lato;">QtPass</span> is a GUI for <a href="https://www.passwordstore.org/">pass</a>, the standard unix password manager.<br/></p><p>Please report any <a href="https://github.com/IJHack/qtpass/issues">issues</a> you might have with this software.</p><p><a href="https://qtpass.org/">Documentation</a></p><p><a href="https://github.com/IJHack/qtpass">SourceCode</a></p></body></html> + + + + Manage who can read password in folder + + + + + + Users + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'.SF NS Text'; font-size:13pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Lato';">QtPass</span> is a GUI for <a href="https://www.passwordstore.org/"><span style=" text-decoration: underline; color:#0000ff;">pass</span></a>, the standard unix password manager.<br /></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Please report any <a href="https://github.com/IJHack/qtpass/issues"><span style=" text-decoration: underline; color:#0000ff;">issues</span></a> you might have with this software.</p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="https://qtpass.org/"><span style=" text-decoration: underline; color:#0000ff;">Documentation</span></a></p> +<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="https://github.com/IJHack/qtpass"><span style=" text-decoration: underline; color:#0000ff;">SourceCode</span></a></p></body></html> + <!DOCTYPE HTML><html><head> <meta name="qrichtext" content="1"/> <style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body><p><span style="font-family: Lato;">QtPass</span> is a GUI for <a href="https://www.passwordstore.org/">pass</a>, the standard unix password manager.<br/></p><p>Please report any <a href="https://github.com/IJHack/qtpass/issues">issues</a> you might have with this software.</p><p><a href="https://qtpass.org/">Documentation</a></p><p><a href="https://github.com/IJHack/qtpass">SourceCode</a></p></body></html> + + + + Configuration + + + + + Config + + + + + Select profile + + + + + Welcome to QtPass + + + + + Search Password + + + + qtpass + qtpass + + + + Welcome to QtPass %1 + + + + Add Password + Add Password + + + Add Folder + Add Folder + + + Failed to connect WebDAV: + + Failed to connect WebDAV: + + + + QtPass WebDAV password + QtPass WebDAV password + + + Enter password to connect to WebDAV: + Enter password to connect to WebDAV: + + + fusedav exited unexpectedly + + fusedav exited unexpectedly + + + + Failed to start fusedav to connect WebDAV: + + Failed to start fusedav to connect WebDAV: + + + + + + Updating password-store + + + + Can not edit + Can not edit + + + Selected password file does not exist, not able to edit + Selected password file does not exist, not able to edit + + + Password hidden + Password hidden + + + + Content hidden + + + + + + Password + + + + + OTP Code + + + + Clipboard cleared + Clipboard cleared + + + Clipboard not cleared + Clipboard not cleared + + + + Password and Content hidden + + + + QProcess::FailedToStart + QProcess::FailedToStart + + + QProcess::Crashed + QProcess::Crashed + + + QProcess::Timedout + QProcess::Timedout + + + QProcess::ReadError + QProcess::ReadError + + + QProcess::WriteError + QProcess::WriteError + + + QProcess::UnknownError + QProcess::UnknownError + + +