From e15c93f56640ef6810d3304a07fd1e0fd4bfe350 Mon Sep 17 00:00:00 2001 From: tezeb Date: Mon, 21 Nov 2016 23:50:47 +0100 Subject: [PATCH 1/3] Initial design-like interface --- imitatepass.h | 24 ++++++++++++++++++++++++ pass.h | 29 +++++++++++++++++++++++++++++ qtpass.pro | 5 ++++- realpass.h | 22 ++++++++++++++++++++++ 4 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 imitatepass.h create mode 100644 pass.h create mode 100644 realpass.h diff --git a/imitatepass.h b/imitatepass.h new file mode 100644 index 000000000..017671dd3 --- /dev/null +++ b/imitatepass.h @@ -0,0 +1,24 @@ +#ifndef IMITATEPASS_H +#define IMITATEPASS_H + +#include "pass.h" + +class ImitatePass : public Pass +{ + + bool removeDir(const QString &dirName); +public: + ImitatePass(); + virtual ~ImitatePass() {} + virtual void GitInit() override; + virtual void GitPull() override; + virtual void GitPush() override; + virtual QProcess::ExitStatus Show(QString file, bool block=false) override; + virtual void Insert(QString file, QString value, bool overwrite=false) override; + virtual void Remove(QString file, bool isDir = false) override; + virtual void Init(QString path, const QList &list) override; + + void reencryptPath(QString dir); +}; + +#endif // IMITATEPASS_H diff --git a/pass.h b/pass.h new file mode 100644 index 000000000..97dfa52d1 --- /dev/null +++ b/pass.h @@ -0,0 +1,29 @@ +#ifndef PASS_H +#define PASS_H + +#include +#include +#include +#include +// TODO(bezet): extract UserInfo somewhere +#include "usersdialog.h" +#include "enums.h" + + +class Pass +{ +public: + Pass(); + virtual ~Pass() {} + virtual void GitInit() = 0; + virtual void GitPull() = 0; + virtual void GitPush() = 0; + virtual QProcess::ExitStatus Show(QString file, bool block=false) = 0; + virtual void Insert(QString file, QString value, bool force) = 0; + virtual void Remove(QString file, bool isDir) = 0; + virtual void Init(QString path, const QList &users) = 0; + virtual QString Generate(int length, const QString& charset); + +}; + +#endif // PASS_H diff --git a/qtpass.pro b/qtpass.pro index df3513085..14f4591b7 100644 --- a/qtpass.pro +++ b/qtpass.pro @@ -49,7 +49,10 @@ HEADERS += mainwindow.h \ qpushbuttonwithclipboard.h \ qtpasssettings.h \ enums.h \ - settingsconstants.h + settingsconstants.h \ + pass.h \ + realpass.h \ + imitatepass.h FORMS += mainwindow.ui \ configdialog.ui \ diff --git a/realpass.h b/realpass.h new file mode 100644 index 000000000..deb6f54fe --- /dev/null +++ b/realpass.h @@ -0,0 +1,22 @@ +#ifndef REALPASS_H +#define REALPASS_H + +#include "pass.h" + +class RealPass : public Pass +{ +private: + void executePass(QString args, QString input=QString()); +public: + RealPass(); + virtual ~RealPass() {} + virtual void GitInit() override; + virtual void GitPull() override; + virtual void GitPush() override; + virtual QProcess::ExitStatus Show(QString file, bool block=false) override; + virtual void Insert(QString file, QString value, bool overwrite=false) override; + virtual void Remove(QString file, bool isDir = false) override; + virtual void Init(QString path, const QList &users) override; +}; + +#endif // REALPASS_H From 1e06efd1bdfc55a4d03d454137256b46e4389b26 Mon Sep 17 00:00:00 2001 From: tezeb Date: Tue, 22 Nov 2016 23:52:58 +0100 Subject: [PATCH 2/3] refactor process mgmt and split Pass into subclasses --- imitatepass.cpp | 286 +++++++++++++++++++ imitatepass.h | 6 + mainwindow.cpp | 725 ++++++++++-------------------------------------- mainwindow.h | 45 +-- pass.cpp | 304 ++++++++++++++++++++ pass.h | 52 +++- qtpass.pro | 11 +- realpass.cpp | 87 ++++++ 8 files changed, 904 insertions(+), 612 deletions(-) create mode 100644 imitatepass.cpp create mode 100644 pass.cpp create mode 100644 realpass.cpp diff --git a/imitatepass.cpp b/imitatepass.cpp new file mode 100644 index 000000000..741312479 --- /dev/null +++ b/imitatepass.cpp @@ -0,0 +1,286 @@ +#include "imitatepass.h" +#include "mainwindow.h" +#include "qtpasssettings.h" + +ImitatePass::ImitatePass() +{ + +} + +/** + * @brief ImitatePass::GitInit git init wrapper + */ +void ImitatePass::GitInit() { + executeWrapper(QtPassSettings::getGitExecutable(), + "init \"" + QtPassSettings::getPassStore() + '"'); +} + +/** + * @brief ImitatePass::GitPull git init wrapper + */ +void ImitatePass::GitPull() { + executeWrapper(QtPassSettings::getGitExecutable(), "pull"); +} + +/** + * @brief ImitatePass::GitPush git init wrapper + */ +void ImitatePass::GitPush() { + executeWrapper(QtPassSettings::getGitExecutable(), "push"); +} + +/** + * @brief ImitatePass::Show git init wrapper + */ +QProcess::ExitStatus ImitatePass::Show(QString file, bool block) { + // TODO(bezet): apparently not yet needed + // file += ".gpg"; + executeWrapper(QtPassSettings::getGpgExecutable(), + "-d --quiet --yes --no-encrypt-to --batch --use-agent \"" + + file + '"'); + if(block) + return waitForProcess(); + return QProcess::NormalExit; +} + +/** + * @brief ImitatePass::Insert git init wrapper + * + * @param file file to be created + * @param value value to be stored in file + * @param overwrite whether to overwrite existing file + */ +void ImitatePass::Insert(QString file, QString newValue, bool overwrite) { + file += ".gpg"; + // TODO(bezet): getRecipientString is in MainWindow for now - fix this ;) + QString recipients = Pass::getRecipientString(file, " -r "); + if (recipients.isEmpty()) { + // TODO(bezet): probably throw here + emit critical(tr("Can not edit"), + tr("Could not read encryption key to use, .gpg-id " + "file missing or invalid.")); + return; + } + QString force(overwrite ? " --yes " : " "); + executeWrapper(QtPassSettings::getGpgExecutable(), + force + "--batch -eq --output \"" + file + "\" " + + recipients + " -", + newValue); + if (!QtPassSettings::isUseWebDav() && QtPassSettings::isUseGit()) { + if (!overwrite) + executeWrapper(QtPassSettings::getGitExecutable(), + "add \"" + file + '"'); + QString path = + QDir(QtPassSettings::getPassStore()).relativeFilePath(file); + path.replace(QRegExp("\\.gpg$"), ""); + executeWrapper(QtPassSettings::getGitExecutable(), + "commit \"" + file + "\" -m \"" + + (overwrite ? "Edit" : "Add") + " for " + path + + " using QtPass.\""); + } +} + +/** + * @brief ImitatePass::Remove git init wrapper + */ +void ImitatePass::Remove(QString file, bool isDir) { + if (QtPassSettings::isUseGit()) { + executeWrapper(QtPassSettings::getGitExecutable(), + QString("rm ") + (isDir?"-rf ":"-f ") + '"' + file + '"'); + // TODO(bezet): commit message used to have pass-like file name inside(ie. getFile(file, true) + executeWrapper(QtPassSettings::getGitExecutable(), + "commit \"" + file + "\" -m \"Remove for " + + file + + " using QtPass.\""); + } else { + if(isDir) { +#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) + QDir dir(file); + dir.removeRecursively(); +#else + removeDir(QtPassSettings::getPassStore() + file); +#endif + } else + QFile(file).remove(); + } +} + +/** + * @brief ImitatePass::Init initialize pass repository + * + * @param path path in which new password-store will be created + * @param users list of users who shall be able to decrypt passwords in path + */ +void ImitatePass::Init(QString path, const QList &users) { + QString gpgIdFile = path + ".gpg-id"; + QFile gpgId(gpgIdFile); + bool addFile = false; + if (QtPassSettings::isAddGPGId(true)) { + QFileInfo checkFile(gpgIdFile); + if (!checkFile.exists() || !checkFile.isFile()) + addFile = true; + } + if (!gpgId.open(QIODevice::WriteOnly | QIODevice::Text)) { + emit critical(tr("Cannot update"), + tr("Failed to open .gpg-id for writing.")); + return; + } + bool secret_selected = false; + foreach (const UserInfo &user, users) { + if (user.enabled) { + gpgId.write((user.key_id + "\n").toUtf8()); + secret_selected |= user.have_secret; + } + } + gpgId.close(); + if (!secret_selected) { + emit critical(tr("Check selected users!"), + tr("None of the selected keys have a secret key available.\n" + "You will not be able to decrypt any newly added passwords!")); + return; + } + + if (!QtPassSettings::isUseWebDav() && QtPassSettings::isUseGit() && + !QtPassSettings::getGitExecutable().isEmpty()) { + if (addFile) + executeWrapper(QtPassSettings::getGitExecutable(), + "add \"" + gpgIdFile + '"'); + QString path = gpgIdFile; + path.replace(QRegExp("\\.gpg$"), ""); + executeWrapper(QtPassSettings::getGitExecutable(), + "commit \"" + gpgIdFile + "\" -m \"Added " + path + + " using QtPass.\""); + } + reencryptPath(path); +} + +/** + * @brief ImitatePass::removeDir delete folder recursive. + * @param dirName which folder. + * @return was removal succesful? + */ +bool ImitatePass::removeDir(const QString &dirName) { + bool result = true; + QDir dir(dirName); + + if (dir.exists(dirName)) { + Q_FOREACH (QFileInfo info, + dir.entryInfoList(QDir::NoDotAndDotDot | QDir::System | + QDir::Hidden | QDir::AllDirs | QDir::Files, + QDir::DirsFirst)) { + if (info.isDir()) + result = removeDir(info.absoluteFilePath()); + else + result = QFile::remove(info.absoluteFilePath()); + + if (!result) + return result; + } + result = dir.rmdir(dirName); + } + return result; +} + +/** + * @brief MainWindow::reencryptPath reencrypt all files under the chosen + * directory + * + * This is stil quite experimental.. + * @param dir + */ +void ImitatePass::reencryptPath(QString dir) { + emit statusMsg(tr("Re-encrypting from folder %1").arg(dir), 3000); + emit startReencryptPath(); + if (QtPassSettings::isAutoPull()) { + // TODO(bezet): move statuses inside actions? + emit statusMsg(tr("Updating password-store"), 2000); + GitPull(); + } + waitFor(50); + process.waitForFinished(); + QDir currentDir; + QDirIterator gpgFiles(dir, QStringList() << "*.gpg", QDir::Files, + QDirIterator::Subdirectories); + QStringList gpgId; + while (gpgFiles.hasNext()) { + QString fileName = gpgFiles.next(); + if (gpgFiles.fileInfo().path() != currentDir.path()) { + gpgId = getRecipientList(fileName); + gpgId.sort(); + } + process.waitForFinished(); + executeWrapper(QtPassSettings::getGpgExecutable(), + "-v --no-secmem-warning " + "--no-permission-warning --list-only " + "--keyid-format long " + + fileName); + process.waitForFinished(3000); + QStringList actualKeys; + QString keys = + process.readAllStandardOutput() + process.readAllStandardError(); + QStringList key = keys.split("\n"); + QListIterator itr(key); + while (itr.hasNext()) { + QString current = itr.next(); + QStringList cur = current.split(" "); + if (cur.length() > 4) { + QString actualKey = cur.takeAt(4); + if (actualKey.length() == 16) { + actualKeys << actualKey; + } + } + } + actualKeys.sort(); + if (actualKeys != gpgId) { + // qDebug() << actualKeys << gpgId << getRecipientList(fileName); + qDebug() << "reencrypt " << fileName << " for " << gpgId; + QString local_lastDecrypt = "Could not decrypt"; + emit lastDecrypt(local_lastDecrypt); + executeWrapper(QtPassSettings::getGpgExecutable(), + "-d --quiet --yes --no-encrypt-to --batch --use-agent \"" + + fileName + '"'); + process.waitForFinished(30000); // long wait (passphrase stuff) + local_lastDecrypt = process.readAllStandardOutput(); + emit lastDecrypt(local_lastDecrypt); + + if (!local_lastDecrypt.isEmpty() && local_lastDecrypt != "Could not decrypt") { + if (local_lastDecrypt.right(1) != "\n") + local_lastDecrypt += "\n"; + + emit lastDecrypt(local_lastDecrypt); + QString recipients = getRecipientString(fileName, " -r "); + if (recipients.isEmpty()) { + emit critical(tr("Can not edit"), + tr("Could not read encryption key to use, .gpg-id " + "file missing or invalid.")); + return; + } + executeWrapper(QtPassSettings::getGpgExecutable(), + "--yes --batch -eq --output \"" + fileName + "\" " + + recipients + " -", + local_lastDecrypt); + process.waitForFinished(3000); + + if (!QtPassSettings::isUseWebDav() && QtPassSettings::isUseGit()) { + executeWrapper(QtPassSettings::getGitExecutable(), + "add \"" + fileName + '"'); + QString path = + QDir(QtPassSettings::getPassStore()).relativeFilePath(fileName); + path.replace(QRegExp("\\.gpg$"), ""); + executeWrapper(QtPassSettings::getGitExecutable(), + "commit \"" + fileName + "\" -m \"" + "Edit for " + + path + " using QtPass.\""); + process.waitForFinished(3000); + } + + } else { + qDebug() << "Decrypt error on re-encrypt"; + } + } + } + if (QtPassSettings::isAutoPush()) { + emit statusMsg(tr("Updating password-store"), 2000); + GitPush(); + } + emit endReencryptPath(); +} diff --git a/imitatepass.h b/imitatepass.h index 017671dd3..26cb0fab5 100644 --- a/imitatepass.h +++ b/imitatepass.h @@ -5,6 +5,7 @@ class ImitatePass : public Pass { + Q_OBJECT bool removeDir(const QString &dirName); public: @@ -19,6 +20,11 @@ class ImitatePass : public Pass virtual void Init(QString path, const QList &list) override; void reencryptPath(QString dir); +signals: + void startReencryptPath(); + void endReencryptPath(); + void lastDecrypt(QString); + }; #endif // IMITATEPASS_H diff --git a/mainwindow.cpp b/mainwindow.cpp index fdcddea0c..4e285b352 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -33,17 +33,43 @@ * @param parent */ MainWindow::MainWindow(QWidget *parent) - : QMainWindow(parent), ui(new Ui::MainWindow), process(new QProcess(this)), - fusedav(this), keygen(NULL), tray(NULL) { + : QMainWindow(parent), ui(new Ui::MainWindow), + fusedav(this), keygen(NULL), tray(NULL), pass(nullptr) { // connect(process.data(), SIGNAL(readyReadStandardOutput()), this, // SLOT(readyRead())); - connect(process.data(), SIGNAL(error(QProcess::ProcessError)), this, + + // TODO(bezet): this should be reconnected dynamically when pass changes + connect(&rpass, SIGNAL(error(QProcess::ProcessError)), this, + SLOT(processError(QProcess::ProcessError))); + connect(&rpass, SIGNAL(finished(int, QProcess::ExitStatus)), this, + SLOT(processFinished(int,QProcess::ExitStatus))); + connect(&rpass, SIGNAL(startingExecuteWrapper()), this, + SLOT(executeWrapperStarted())); + connect(&rpass, SIGNAL(statusMsg(QString,int)), this, + SLOT(showStatusMessage(QString,int))); + connect(&rpass, SIGNAL(critical(QString,QString)), this, + SLOT(critical(QString,QString))); + + connect(&ipass, SIGNAL(error(QProcess::ProcessError)), this, SLOT(processError(QProcess::ProcessError))); - connect(process.data(), SIGNAL(finished(int, QProcess::ExitStatus)), this, - SLOT(processFinished(int, QProcess::ExitStatus))); + connect(&ipass, SIGNAL(finished(int, QProcess::ExitStatus)), this, + SLOT(processFinished(int,QProcess::ExitStatus))); + connect(&ipass, SIGNAL(startingExecuteWrapper()), this, + SLOT(executeWrapperStarted())); + connect(&ipass, SIGNAL(statusMsg(QString,int)), this, + SLOT(showStatusMessage(QString,int))); + connect(&ipass, SIGNAL(critical(QString,QString)), this, + SLOT(critical(QString,QString))); + // only for ipass + connect(&ipass, SIGNAL(startReencryptPath()), this, + SLOT(startReencryptPath())); + connect(&ipass, SIGNAL(endReencryptPath()), this, + SLOT(endReencryptPath())); + connect(&ipass, SIGNAL(lastDecrypt(QString)), this, + SLOT(setLastDecrypt(QString))); + ui->setupUi(this); enableUiElements(true); - wrapperRunning = false; execQueue = new QQueue; ui->statusBar->showMessage(tr("Welcome to QtPass %1").arg(VERSION), 2000); freshStart = true; @@ -319,12 +345,6 @@ bool MainWindow::checkConfig() { updateProfileBox(); - env = QProcess::systemEnvironment(); - if (!QtPassSettings::getGpgHome().isEmpty()) { - QDir absHome(QtPassSettings::getGpgHome()); - absHome.makeAbsolute(); - env << "GNUPGHOME=" + absHome.path(); - } #ifdef __APPLE__ // If it exists, add the gpgtools to PATH if (QFile("/usr/local/MacGPG2/bin").exists()) @@ -336,7 +356,14 @@ bool MainWindow::checkConfig() { #endif // QMessageBox::information(this, "env", env.join("\n")); - updateEnv(); + // TODO(bezet): make this check unnecessary + if (pass == nullptr) { + if (QtPassSettings::isUsePass()) + pass = &rpass; + else + pass = &ipass; + } + pass->updateEnv(); if (!QtPassSettings::isUseGit() || (QtPassSettings::getGitExecutable().isEmpty() && @@ -366,6 +393,7 @@ void MainWindow::config() { // Automatically default to pass if it's available if (freshStart && QFile(QtPassSettings::getPassExecutable()).exists()) { QtPassSettings::setUsePass(true); + pass = &rpass; } d->setPassPath(QtPassSettings::getPassExecutable()); @@ -413,6 +441,10 @@ void MainWindow::config() { QtPassSettings::setPassStore( Util::normalizeFolderPath(d->getStorePath())); QtPassSettings::setUsePass(d->usePass()); + if(d->usePass()) + pass = &rpass; + else + pass = &ipass; QtPassSettings::setClipBoardType(d->useClipboard()); QtPassSettings::setUseAutoclear(d->useAutoclear()); QtPassSettings::setAutoclearSeconds(d->getAutoclear()); @@ -462,7 +494,7 @@ void MainWindow::config() { if (freshStart && Util::checkConfig()) config(); - updateEnv(); + pass->updateEnv(); if (!QtPassSettings::isUseGit() || (QtPassSettings::getGitExecutable().isEmpty() && QtPassSettings::getPassExecutable().isEmpty())) { @@ -488,13 +520,11 @@ void MainWindow::config() { /** * @brief MainWindow::on_updateButton_clicked do a git pull */ +// TODO(bezet): add bool block and wait for process to finish void MainWindow::on_updateButton_clicked() { ui->statusBar->showMessage(tr("Updating password-store"), 2000); currentAction = GIT; - if (QtPassSettings::isUsePass()) - executePass("git pull"); - else - executeWrapper(QtPassSettings::getGitExecutable(), "pull"); + pass->GitPull(); } /** @@ -503,10 +533,7 @@ void MainWindow::on_updateButton_clicked() { void MainWindow::on_pushButton_clicked() { ui->statusBar->showMessage(tr("Updating password-store"), 2000); currentAction = GIT; - if (QtPassSettings::isUsePass()) - executePass("git push"); - else - executeWrapper(QtPassSettings::getGitExecutable(), "push"); + pass->GitPush(); } /** @@ -532,7 +559,7 @@ QString MainWindow::getDir(const QModelIndex &index, bool forPass) { /** * @brief MainWindow::getFile get the selected file path * @param index - * @param forPass short or full path + * @param forPass returns relative path without '.gpg' extension * @return path * @return */ @@ -563,12 +590,7 @@ void MainWindow::on_treeView_clicked(const QModelIndex &index) { ui->passwordName->setText(getFile(index, true)); if (!file.isEmpty() && !cleared) { currentAction = GPG; - if (QtPassSettings::isUsePass()) - executePass("show \"" + file + '"'); - else - executeWrapper(QtPassSettings::getGpgExecutable(), - "-d --quiet --yes --no-encrypt-to --batch --use-agent \"" + - file + '"'); + pass->Show(file); } else { clearPanel(false); ui->editButton->setEnabled(false); @@ -609,69 +631,25 @@ void MainWindow::deselect() { clearPanel(false); } -/** - * @brief MainWindow::executePass easy wrapper for running pass - * @param args - */ -void MainWindow::executePass(QString args, QString input) { - executeWrapper(QtPassSettings::getPassExecutable(), args, input); -} - /** * @brief MainWindow::executePassGitInit git init wrapper */ void MainWindow::executePassGitInit() { qDebug() << "Pass git init called"; - if (QtPassSettings::isUsePass()) - executePass("git init"); - else - executeWrapper(QtPassSettings::getGitExecutable(), - "init \"" + QtPassSettings::getPassStore() + '"'); + pass->GitInit(); } -/** - * @brief MainWindow::executeWrapper run an application, queue when needed. - * @param app path to application to run - * @param args required arguements - * @param input optional input - */ -void MainWindow::executeWrapper(QString app, QString args, QString input) { - // qDebug() << app + " " + args; - // Happens a lot if e.g. git binary is not set. - // This will result in bogus "QProcess::FailedToStart" messages, - // also hiding legitimate errors from the gpg commands. - if (app.isEmpty()) { - qDebug() << "Trying to execute nothing.."; - return; - } - // Convert to absolute path, just in case - app = QDir(QCoreApplication::applicationDirPath()).absoluteFilePath(app); - if (wrapperRunning) { - execQueueItem item; - item.app = app; - item.args = args; - item.input = input; - - execQueue->enqueue(item); - qDebug() << item.app + "," + item.args + "," + item.input; - return; - } - wrapperRunning = true; - process->setWorkingDirectory(QtPassSettings::getPassStore()); - process->setEnvironment(env); - clearTemplateWidgets(); - ui->textBrowser->clear(); - ui->textBrowser->setTextColor(Qt::black); - enableUiElements(false); - if (autoclearTimer != NULL) { - autoclearTimer->stop(); - delete autoclearTimer; - autoclearTimer = NULL; - } - process->start('"' + app + "\" " + args); - if (!input.isEmpty()) - process->write(input.toUtf8()); - process->closeWriteChannel(); +void MainWindow::executeWrapperStarted() { + clearTemplateWidgets(); + ui->textBrowser->clear(); + ui->textBrowser->setTextColor(Qt::black); + enableUiElements(false); + if (autoclearTimer != NULL) { + autoclearTimer->stop(); + // TODO(bezet): why dynamic allocation? + delete autoclearTimer; + autoclearTimer = NULL; + } } /** @@ -683,8 +661,8 @@ void MainWindow::readyRead(bool finished = false) { QString output = ""; QString error = ""; if (currentAction != GPG_INTERNAL) { - error = process->readAllStandardError(); - QByteArray processOutBytes = process->readAllStandardOutput(); + error = pass->readAllStandardError(); + QByteArray processOutBytes = pass->readAllStandardOutput(); QTextCodec *codec = QTextCodec::codecForLocale(); output = codec->toUnicode(processOutBytes); if (finished && currentAction == GPG) { @@ -832,16 +810,11 @@ void MainWindow::clearPanel(bool notify = true) { */ void MainWindow::processFinished(int exitCode, QProcess::ExitStatus exitStatus) { - wrapperRunning = false; bool error = exitStatus != QProcess::NormalExit || exitCode > 0; readyRead(true); enableUiElements(true); if (!error && currentAction == EDIT) on_treeView_clicked(ui->treeView->currentIndex()); - if (!execQueue->isEmpty()) { - execQueueItem item = execQueue->dequeue(); - executeWrapper(item.app, item.args, item.input); - } } /** @@ -892,7 +865,8 @@ void MainWindow::processError(QProcess::ProcessError error) { } ui->textBrowser->setTextColor(Qt::red); ui->textBrowser->setText(errorString); - if (process->state() == QProcess::NotRunning) + // TODO(bezet): this probably shall be done in finished handler(I guess it finishes even on error) + if (pass->state() == QProcess::NotRunning) enableUiElements(true); } @@ -957,58 +931,6 @@ QModelIndex MainWindow::firstFile(QModelIndex parentIndex) { return index; } -/** - * @brief MainWindow::getRecipientList return list op gpg-id's to encrypt for - * @param for_file which file (folder) would you like recepients for - * @return recepients gpg-id contents - */ -QStringList MainWindow::getRecipientList(QString for_file) { - QDir gpgIdPath(QFileInfo(for_file.startsWith(QtPassSettings::getPassStore()) - ? for_file - : QtPassSettings::getPassStore() + for_file) - .absoluteDir()); - bool found = false; - while (gpgIdPath.exists() && - gpgIdPath.absolutePath().startsWith(QtPassSettings::getPassStore())) { - if (QFile(gpgIdPath.absoluteFilePath(".gpg-id")).exists()) { - found = true; - break; - } - if (!gpgIdPath.cdUp()) - break; - } - QFile gpgId(found ? gpgIdPath.absoluteFilePath(".gpg-id") - : QtPassSettings::getPassStore() + ".gpg-id"); - if (!gpgId.open(QIODevice::ReadOnly | QIODevice::Text)) - return QStringList(); - QStringList recipients; - while (!gpgId.atEnd()) { - QString recipient(gpgId.readLine()); - recipient = recipient.trimmed(); - if (!recipient.isEmpty()) - recipients += recipient; - } - return recipients; -} - -/** - * @brief MainWindow::getRecipientString formated string for use with GPG - * @param for_file which file (folder) would you like recepients for - * @param separator formating separator eg: " -r " - * @param count - * @return recepient string - */ -QString MainWindow::getRecipientString(QString for_file, QString separator, - int *count) { - QString recipients_str; - QStringList recipients_list = getRecipientList(for_file); - if (count) - *count = recipients_list.size(); - foreach (const QString recipient, recipients_list) - recipients_str += separator + '"' + recipient + '"'; - return recipients_str; -} - /** * @brief MainWindow::setPassword open passworddialog and save file (if not * canceled) @@ -1042,37 +964,10 @@ void MainWindow::setPassword(QString file, bool overwrite, bool isNew = false) { newValue += "\n"; currentAction = EDIT; - if (QtPassSettings::isUsePass()) { - QString force(overwrite ? " -f " : " "); - executePass("insert" + force + "-m \"" + file + '"', newValue); - } else { - QString recipients = getRecipientString(file, " -r "); - if (recipients.isEmpty()) { - QMessageBox::critical(this, tr("Can not edit"), - tr("Could not read encryption key to use, .gpg-id " - "file missing or invalid.")); - return; - } - QString force(overwrite ? " --yes " : " "); - executeWrapper(QtPassSettings::getGpgExecutable(), - force + "--batch -eq --output \"" + file + "\" " + - recipients + " -", - newValue); - if (!QtPassSettings::isUseWebDav() && QtPassSettings::isUseGit()) { - if (!overwrite) - executeWrapper(QtPassSettings::getGitExecutable(), - "add \"" + file + '"'); - QString path = - QDir(QtPassSettings::getPassStore()).relativeFilePath(file); - path.replace(QRegExp("\\.gpg$"), ""); - executeWrapper(QtPassSettings::getGitExecutable(), - "commit \"" + file + "\" -m \"" + - (overwrite ? "Edit" : "Add") + " for " + path + - " using QtPass.\""); - if (QtPassSettings::isAutoPush()) - on_pushButton_clicked(); - } - } + pass->Insert(file, newValue, overwrite); + + if (QtPassSettings::isUseGit() && QtPassSettings::isAutoPush()) + on_pushButton_clicked(); } /** @@ -1108,8 +1003,6 @@ void MainWindow::on_addButton_clicked() { if (!ok || file.isEmpty()) return; file = dir + file; - if (!QtPassSettings::isUsePass()) - file += ".gpg"; lastDecrypt = ""; setPassword(file, false, true); } @@ -1121,108 +1014,32 @@ void MainWindow::on_deleteButton_clicked() { QFileInfo fileOrFolder = model.fileInfo(proxyModel.mapToSource(ui->treeView->currentIndex())); QString file = ""; + bool isDir = false; if (fileOrFolder.isFile()) { file = getFile(ui->treeView->currentIndex(), QtPassSettings::isUsePass()); - if (QMessageBox::question( - this, tr("Delete password?"), - tr("Are you sure you want to delete %1?") - .arg(QDir::separator() + - getFile(ui->treeView->currentIndex(), true)), - QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes) - return; - if (QtPassSettings::isUsePass()) { - currentAction = REMOVE; - executePass("rm -f \"" + file + '"'); - if (QtPassSettings::isUseGit() && QtPassSettings::isAutoPush()) - on_pushButton_clicked(); - } else { - if (QtPassSettings::isUseGit()) { - executeWrapper(QtPassSettings::getGitExecutable(), - "rm -f \"" + file + '"'); - executeWrapper(QtPassSettings::getGitExecutable(), - "commit \"" + file + "\" -m \"Remove for " + - getFile(ui->treeView->currentIndex(), true) + - " using QtPass.\""); - if (QtPassSettings::isAutoPush()) - on_pushButton_clicked(); - } else { - QFile(file).remove(); - } - } - } else { - file = getDir(ui->treeView->currentIndex(), QtPassSettings::isUsePass()); - // TODO: message box should accept enter key - if (QMessageBox::question( - this, tr("Delete folder?"), - tr("Are you sure you want to delete %1?") - .arg(QDir::separator() + - getDir(ui->treeView->currentIndex(), true)), - QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes) { - return; - } else { - if (QtPassSettings::isUsePass()) { - currentAction = REMOVE; - executePass("rm -rf \"" + file + '"'); - if (QtPassSettings::isUseGit() && QtPassSettings::isAutoPush()) { - on_pushButton_clicked(); - } - } else { - if (QtPassSettings::isUseGit()) { - executeWrapper(QtPassSettings::getGitExecutable(), - "rm -rf \"" + file + '"'); -#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) - QDir dir(file); - dir.removeRecursively(); -#else - removeDir(QtPassSettings::getPassStore() + file); -#endif - executeWrapper(QtPassSettings::getGitExecutable(), - "commit \"" + file + "\" -m \"Remove for " + - getFile(ui->treeView->currentIndex(), true) + - " using QtPass.\""); - if (QtPassSettings::isAutoPush()) { - on_pushButton_clicked(); - } - } else { -#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) - QDir dir(file); - dir.removeRecursively(); -#else - removeDir(QtPassSettings::getPassStore() + file); -#endif - } - } - } } - lastDecrypt = ""; -} + else + { + file = getDir(ui->treeView->currentIndex(), QtPassSettings::isUsePass()); + isDir = true; + } -/** - * @brief MainWindow::removeDir delete folder recursive. - * @param dirName which folder. - * @return was removal succesful? - */ -bool MainWindow::removeDir(const QString &dirName) { - bool result = true; - QDir dir(dirName); - - if (dir.exists(dirName)) { - Q_FOREACH (QFileInfo info, - dir.entryInfoList(QDir::NoDotAndDotDot | QDir::System | - QDir::Hidden | QDir::AllDirs | QDir::Files, - QDir::DirsFirst)) { - if (info.isDir()) - result = removeDir(info.absoluteFilePath()); - else - result = QFile::remove(info.absoluteFilePath()); + if (QMessageBox::question( + this, isDir?tr("Delete folder?"):tr("Delete password?"), + tr("Are you sure you want to delete %1?") + .arg(QDir::separator() + + getFile(ui->treeView->currentIndex(), true)), + QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes) + return; - if (!result) - return result; - } - result = dir.rmdir(dirName); - } - return result; + currentAction = REMOVE; + pass->Remove(file, isDir); + // TODO(bezet): hide inside interface? + if (QtPassSettings::isUseGit() && QtPassSettings::isAutoPush()) + on_pushButton_clicked(); + + lastDecrypt = ""; } /** @@ -1240,50 +1057,6 @@ void MainWindow::on_editButton_clicked() { setPassword(file, true); } -/** - * @brief MainWindow::listKeys list users - * @param keystring - * @param secret list private keys - * @return QList users - */ -QList MainWindow::listKeys(QString keystring, bool secret) { - waitFor(5); - QList users; - currentAction = GPG_INTERNAL; - QString listopt = secret ? "--list-secret-keys " : "--list-keys "; - executeWrapper(QtPassSettings::getGpgExecutable(), - "--no-tty --with-colons " + listopt + keystring); - process->waitForFinished(2000); - if (process->exitStatus() != QProcess::NormalExit) - return users; - QByteArray processOutBytes = process->readAllStandardOutput(); - QTextCodec *codec = QTextCodec::codecForLocale(); - QString processOutString = codec->toUnicode(processOutBytes); - QStringList keys = QString(processOutString) - .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 MainWindow::userDialog see MainWindow::on_usersButton_clicked() * @param dir folder to edit users for. @@ -1294,6 +1067,12 @@ void MainWindow::userDialog(QString dir) { on_usersButton_clicked(); } +// TODO(bezet): temporary wrapper +QList MainWindow::listKeys(QString keystring, bool secret) { + currentAction = GPG_INTERNAL; + return pass->listKeys(keystring, secret); +} + /** * @brief MainWindow::on_usersButton_clicked edit users for the current folder, * gets lists and opens UserDialog. @@ -1317,7 +1096,7 @@ void MainWindow::on_usersButton_clicked() { : currentDir; int count = 0; QString recipients = - getRecipientString(dir.isEmpty() ? "" : dir, " ", &count); + pass->getRecipientString(dir.isEmpty() ? "" : dir, " ", &count); if (!recipients.isEmpty()) selected_users = listKeys(recipients); foreach (const UserInfo &sel, selected_users) { @@ -1327,7 +1106,7 @@ void MainWindow::on_usersButton_clicked() { } if (count > selected_users.size()) { // Some keys seem missing from keyring, add them separately - QStringList recipients = getRecipientList(dir.isEmpty() ? "" : dir); + QStringList recipients = pass->getRecipientList(dir.isEmpty() ? "" : dir); foreach (const QString recipient, recipients) { if (listKeys(recipient).size() < 1) { UserInfo i; @@ -1346,64 +1125,10 @@ void MainWindow::on_usersButton_clicked() { } d.setUsers(NULL); - if (QtPassSettings::isUsePass()) { - QString gpgIds = ""; - foreach (const UserInfo &user, users) { - if (user.enabled) { - gpgIds += user.key_id + " "; - } - } - // remove the passStore directory otherwise, - // pass would create a passStore/passStore/dir - // but you want passStore/dir - QString dirWithoutPassdir = - dir.remove(0, QtPassSettings::getPassStore().size()); - executePass("init --path=" + dirWithoutPassdir + " " + gpgIds); - } else { - QString gpgIdFile = dir + ".gpg-id"; - QFile gpgId(gpgIdFile); - bool addFile = false; - if (QtPassSettings::isAddGPGId(true)) { - QFileInfo checkFile(gpgIdFile); - if (!checkFile.exists() || !checkFile.isFile()) - addFile = true; - } - if (!gpgId.open(QIODevice::WriteOnly | QIODevice::Text)) { - QMessageBox::critical(this, tr("Cannot update"), - tr("Failed to open .gpg-id for writing.")); - return; - } - bool secret_selected = false; - foreach (const UserInfo &user, users) { - if (user.enabled) { - gpgId.write((user.key_id + "\n").toUtf8()); - secret_selected |= user.have_secret; - } - } - gpgId.close(); - if (!secret_selected) { - QMessageBox::critical( - this, tr("Check selected users!"), - tr("None of the selected keys have a secret key available.\n" - "You will not be able to decrypt any newly added passwords!")); - } - - if (!QtPassSettings::isUseWebDav() && QtPassSettings::isUseGit() && - !QtPassSettings::getGitExecutable().isEmpty()) { - if (addFile) - executeWrapper(QtPassSettings::getGitExecutable(), - "add \"" + gpgIdFile + '"'); - QString path = gpgIdFile; - path.replace(QRegExp("\\.gpg$"), ""); - executeWrapper(QtPassSettings::getGitExecutable(), - "commit \"" + gpgIdFile + "\" -m \"Added " + path + - " using QtPass.\""); - if (QtPassSettings::isAutoPush()) - on_pushButton_clicked(); - } + pass->Init(dir, users); - reencryptPath(dir); - } + if (QtPassSettings::isAutoPush()) + on_pushButton_clicked(); } /** @@ -1440,23 +1165,6 @@ void MainWindow::messageAvailable(QString message) { */ void MainWindow::setText(QString text) { ui->lineEdit->setText(text); } -/** - * @brief MainWindow::updateEnv update the execution environment (used when - * switching profiles) - */ -void MainWindow::updateEnv() { - QStringList store = env.filter("PASSWORD_STORE_DIR"); - // put PASSWORD_STORE_DIR in env - if (store.isEmpty()) { - // qDebug() << "Added PASSWORD_STORE_DIR"; - env.append("PASSWORD_STORE_DIR=" + QtPassSettings::getPassStore()); - } else { - // qDebug() << "Update PASSWORD_STORE_DIR with " + passStore; - env.replaceInStrings(store.first(), "PASSWORD_STORE_DIR=" + - QtPassSettings::getPassStore()); - } -} - /** * @brief MainWindow::getSecretKeys get list of secret/private keys * @return QStringList keys @@ -1483,10 +1191,7 @@ void MainWindow::generateKeyPair(QString batch, QDialog *keygenWindow) { keygen = keygenWindow; ui->statusBar->showMessage(tr("Generating GPG key pair"), 60000); currentAction = GPG_INTERNAL; - executeWrapper(QtPassSettings::getGpgExecutable(), - "--gen-key --no-tty --batch", batch); - // TODO check status / error messages - // https://github.com/IJHack/QtPass/issues/202#issuecomment-251081688 + pass->GenerateGPGKeys(batch); } /** @@ -1529,17 +1234,7 @@ void MainWindow::on_profileBox_currentIndexChanged(QString name) { QtPassSettings::setPassStore(QtPassSettings::getProfiles()[name]); ui->statusBar->showMessage(tr("Profile changed to %1").arg(name), 2000); - // qDebug() << env; - QStringList store = env.filter("PASSWORD_STORE_DIR"); - // put PASSWORD_STORE_DIR in env - if (store.isEmpty()) { - // qDebug() << "Added PASSWORD_STORE_DIR"; - env.append("PASSWORD_STORE_DIR=" + QtPassSettings::getPassStore()); - } else { - // qDebug() << "Update PASSWORD_STORE_DIR"; - env.replaceInStrings(store.first(), "PASSWORD_STORE_DIR=" + - QtPassSettings::getPassStore()); - } + pass->resetPasswordStoreDir(); ui->treeView->setRootIndex(proxyModel.mapFromSource( model.setRootPath(QtPassSettings::getPassStore()))); @@ -1685,7 +1380,6 @@ void MainWindow::showContextMenu(const QPoint &pos) { connect(deleteItem, SIGNAL(triggered()), this, SLOT(on_deleteButton_clicked())); } - contextMenu.exec(globalPos); } @@ -1728,8 +1422,8 @@ void MainWindow::addFolder() { void MainWindow::editPassword() { if (QtPassSettings::isUseGit() && QtPassSettings::isAutoPull()) on_updateButton_clicked(); - waitFor(30); - process->waitForFinished(); + pass->waitFor(30); + pass->waitForProcess(); // TODO(annejan) move to editbutton stuff possibly? currentDir = getDir(ui->treeView->currentIndex(), false); lastDecrypt = "Could not decrypt"; @@ -1737,15 +1431,8 @@ void MainWindow::editPassword() { getFile(ui->treeView->currentIndex(), QtPassSettings::isUsePass()); if (!file.isEmpty()) { currentAction = GPG; - if (QtPassSettings::isUsePass()) - executePass('"' + file + '"'); - else - executeWrapper(QtPassSettings::getGpgExecutable(), - "-d --quiet --yes --no-encrypt-to --batch --use-agent \"" + - file + '"'); - process->waitForFinished(30000); // long wait (passphrase stuff) - if (process->exitStatus() == QProcess::NormalExit) - on_editButton_clicked(); + if(pass->Show(file, true) == QProcess::NormalExit) + on_editButton_clicked(); } } @@ -1758,61 +1445,18 @@ void MainWindow::editPassword() { */ QString MainWindow::generatePassword(int length, Enums::characterSet selection) { - QString passwd; - if (QtPassSettings::isUsePwgen()) { - waitFor(2); - // --secure goes first as it overrides --no-* otherwise - QString args = - QString("-1 ") + (QtPassSettings::isLessRandom() ? "" : "--secure ") + - (QtPassSettings::isAvoidCapitals() ? "--no-capitalize " - : "--capitalize ") + - (QtPassSettings::isAvoidNumbers() ? "--no-numerals " : "--numerals ") + - (QtPassSettings::isUseSymbols() ? "--symbols " : "") + - QString::number(length); - currentAction = PWGEN; - executeWrapper(QtPassSettings::getPwgenExecutable(), args); - process->waitForFinished(1000); - if (process->exitStatus() == QProcess::NormalExit) - passwd = - QString(process->readAllStandardOutput()).remove(QRegExp("[\\n\\r]")); - else - qDebug() << "pwgen fail"; - } else { - int charsetLength = pwdConfig.Characters[selection].length(); - if (charsetLength > 0) { - for (int i = 0; i < length; ++i) { - int index = qrand() % charsetLength; - QChar nextChar = pwdConfig.Characters[selection].at(index); - passwd.append(nextChar); - } - } else { - QMessageBox::critical( - this, tr("No characters chosen"), - tr("Can't generate password, there are no characters to choose from " - "set in the configuration!")); - } - } - return passwd; -} - -/** - * @brief MainWindow::waitFor wait until process->atEnd and execQueue->isEmpty - * or timeout after x-seconds - * @param seconds - */ -void MainWindow::waitFor(uint seconds) { - QDateTime current = QDateTime::currentDateTime(); - uint stop = current.toTime_t() + seconds; - while (!process->atEnd() || !execQueue->isEmpty()) { - current = QDateTime::currentDateTime(); - if (stop < current.toTime_t()) { - QMessageBox::critical( - this, tr("Timed out"), - tr("Can't start process, previous one is still running!")); - return; - } - Util::qSleep(100); - } + currentAction = PWGEN; + // TODO(bezet): move checks inside and catch exceptions + + if(!QtPassSettings::isUsePwgen()) { + int charsetLength = pwdConfig.Characters[selection].length(); + if (charsetLength <= 0) + QMessageBox::critical(this, tr("No characters chosen"), + tr("Can't generate password, there are no characters to choose from " + "set in the configuration!")); + return QString(); + } + return pass->Generate(length, pwdConfig.Characters[selection]); } /** @@ -1861,107 +1505,6 @@ void MainWindow::copyTextToClipboard(const QString &text) { } } -/** - * @brief MainWindow::reencryptPath reencrypt all files under the chosen - * directory - * - * This is stil quite experimental.. - * @param dir - */ -void MainWindow::reencryptPath(QString dir) { - ui->statusBar->showMessage(tr("Re-encrypting from folder %1").arg(dir), 3000); - enableUiElements(false); - ui->treeView->setDisabled(true); - if (QtPassSettings::isAutoPull()) - on_updateButton_clicked(); - waitFor(50); - process->waitForFinished(); - QDir currentDir; - QDirIterator gpgFiles(dir, QStringList() << "*.gpg", QDir::Files, - QDirIterator::Subdirectories); - QStringList gpgId; - while (gpgFiles.hasNext()) { - QString fileName = gpgFiles.next(); - if (gpgFiles.fileInfo().path() != currentDir.path()) { - gpgId = getRecipientList(fileName); - gpgId.sort(); - } - currentAction = GPG_INTERNAL; - process->waitForFinished(); - executeWrapper(QtPassSettings::getGpgExecutable(), - "-v --no-secmem-warning " - "--no-permission-warning --list-only " - "--keyid-format long " + - fileName); - process->waitForFinished(3000); - QStringList actualKeys; - QString keys = - process->readAllStandardOutput() + process->readAllStandardError(); - QStringList key = keys.split("\n"); - QListIterator itr(key); - while (itr.hasNext()) { - QString current = itr.next(); - QStringList cur = current.split(" "); - if (cur.length() > 4) { - QString actualKey = cur.takeAt(4); - if (actualKey.length() == 16) { - actualKeys << actualKey; - } - } - } - actualKeys.sort(); - if (actualKeys != gpgId) { - // qDebug() << actualKeys << gpgId << getRecipientList(fileName); - qDebug() << "reencrypt " << fileName << " for " << gpgId; - lastDecrypt = "Could not decrypt"; - currentAction = GPG_INTERNAL; - executeWrapper(QtPassSettings::getGpgExecutable(), - "-d --quiet --yes --no-encrypt-to --batch --use-agent \"" + - fileName + '"'); - process->waitForFinished(30000); // long wait (passphrase stuff) - lastDecrypt = process->readAllStandardOutput(); - - if (!lastDecrypt.isEmpty() && lastDecrypt != "Could not decrypt") { - if (lastDecrypt.right(1) != "\n") - lastDecrypt += "\n"; - - QString recipients = getRecipientString(fileName, " -r "); - if (recipients.isEmpty()) { - QMessageBox::critical( - this, tr("Can not edit"), - tr("Could not read encryption key to use, .gpg-id " - "file missing or invalid.")); - return; - } - currentAction = EDIT; - executeWrapper(QtPassSettings::getGpgExecutable(), - "--yes --batch -eq --output \"" + fileName + "\" " + - recipients + " -", - lastDecrypt); - process->waitForFinished(3000); - - if (!QtPassSettings::isUseWebDav() && QtPassSettings::isUseGit()) { - executeWrapper(QtPassSettings::getGitExecutable(), - "add \"" + fileName + '"'); - QString path = - QDir(QtPassSettings::getPassStore()).relativeFilePath(fileName); - path.replace(QRegExp("\\.gpg$"), ""); - executeWrapper(QtPassSettings::getGitExecutable(), - "commit \"" + fileName + "\" -m \"" + "Edit for " + - path + " using QtPass.\""); - process->waitForFinished(3000); - } - - } else { - qDebug() << "Decrypt error on re-encrypt"; - } - } - } - if (QtPassSettings::isAutoPush()) - on_pushButton_clicked(); - enableUiElements(true); -} - /** * @brief MainWindow::addToGridLayout add a field to the template grid * @param position @@ -2023,3 +1566,31 @@ void MainWindow::addToGridLayout(int position, const QString &field, ui->gridLayout->addWidget(new QLabel(trimmedField), position, 0); ui->gridLayout->addWidget(frame, position, 1); } + +/** + * @brief Displays message in status bar + * + * @params msg text to be displayed + * @params timeout time for which msg shall be visible + */ +void MainWindow::showStatusMessage(QString msg, int timeout) { + ui->statusBar->showMessage(msg, timeout); +} + +void MainWindow::startReencryptPath() { + enableUiElements(false); + ui->treeView->setDisabled(true); +} + +void MainWindow::endReencryptPath() { + enableUiElements(true); +} + +void MainWindow::critical(QString title, QString msg) { + QMessageBox::critical( + this, title,msg); +} + +void MainWindow::setLastDecrypt(QString msg) { + lastDecrypt = msg; +} diff --git a/mainwindow.h b/mainwindow.h index cfbb39764..8a542be67 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -10,6 +10,9 @@ #include #include #include +#include "pass.h" +#include "realpass.h" +#include "imitatepass.h" #if SINGLE_APP #include "singleapplication.h" @@ -21,25 +24,6 @@ namespace Ui { class MainWindow; } -/*! - \struct execQueueItem - \brief Execution queue items for non-interactive ordered execution. - */ -struct execQueueItem { - /** - * @brief app executable path. - */ - QString app; - /** - * @brief args arguments for executable. - */ - QString args; - /** - * @brief input stdio input. - */ - QString input; -}; - struct UserInfo; /*! @@ -142,6 +126,13 @@ private slots: void focusInput(); void copyTextByButtonClick(bool checked = false); + void executeWrapperStarted(); + void showStatusMessage(QString msg, int timeout); + void startReencryptPath(); + void endReencryptPath(); + void critical(QString,QString); + void setLastDecrypt(QString); + private: QAction *actionAddPassword; QAction *actionAddFolder; @@ -151,7 +142,6 @@ private slots: QFileSystemModel model; StoreModel proxyModel; QScopedPointer selectionModel; - QScopedPointer process; QTreeView *treeView; QProcess fusedav; QString clippedText; @@ -159,17 +149,17 @@ private slots: QTimer *autoclearTimer; actionType currentAction; QString lastDecrypt; - bool wrapperRunning; - QStringList env; QQueue *execQueue; bool freshStart; QDialog *keygen; QString currentDir; bool startupPhase; TrayIcon *tray; + Pass *pass; + RealPass rpass; + ImitatePass ipass; + void updateText(); - void executePass(QString, QString = QString()); - void executeWrapper(QString, QString, QString = QString()); void enableUiElements(bool state); void selectFirstFile(); QModelIndex firstFile(QModelIndex parentIndex); @@ -177,16 +167,11 @@ private slots: QString getFile(const QModelIndex &, bool); void setPassword(QString, bool, bool); QList listKeys(QString keystring = "", bool secret = false); - QStringList getRecipientList(QString for_file); - QString getRecipientString(QString for_file, QString separator = " ", - int *count = NULL); + void mountWebDav(); - void updateEnv(); void updateProfileBox(); void initTrayIcon(); void destroyTrayIcon(); - bool removeDir(const QString &dirName); - void waitFor(uint seconds); void clearTemplateWidgets(); void reencryptPath(QString dir); void addToGridLayout(int position, const QString &field, diff --git a/pass.cpp b/pass.cpp new file mode 100644 index 000000000..e34621663 --- /dev/null +++ b/pass.cpp @@ -0,0 +1,304 @@ +#include "pass.h" +#include "qtpasssettings.h" +#include +#include "util.h" + +Pass::Pass() : wrapperRunning(false) +{ + connect(&process, SIGNAL(finished(int, QProcess::ExitStatus)), + this, SIGNAL(finished(int,QProcess::ExitStatus))); + connect(&process, SIGNAL(error(QProcess::ProcessError)), + this, SIGNAL(error(QProcess::ProcessError))); + connect(&process, SIGNAL(finished(int, QProcess::ExitStatus)), + this, SLOT(processFinished(int,QProcess::ExitStatus))); + + env = QProcess::systemEnvironment(); + + if (!QtPassSettings::getGpgHome().isEmpty()) { + QDir absHome(QtPassSettings::getGpgHome()); + absHome.makeAbsolute(); + env << "GNUPGHOME=" + absHome.path(); + } + +} + +QProcess::ExitStatus Pass::waitForProcess() { + process.waitForFinished(30000); + return process.exitStatus(); +} + +/** + * @brief Pass::Generate use either pwgen or internal password + * generator + * @param length of the desired password + * @param selection character set to use for generation + * @return the password + */ +// TODO(bezet): this should definitely throw +QString Pass::Generate(int length, const QString& charset) { + QString passwd; + if (QtPassSettings::isUsePwgen()) { + waitFor(2); + // --secure goes first as it overrides --no-* otherwise + QString args = + QString("-1 ") + (QtPassSettings::isLessRandom() ? "" : "--secure ") + + (QtPassSettings::isAvoidCapitals() ? "--no-capitalize " + : "--capitalize ") + + (QtPassSettings::isAvoidNumbers() ? "--no-numerals " : "--numerals ") + + (QtPassSettings::isUseSymbols() ? "--symbols " : "") + + QString::number(length); + executeWrapper(QtPassSettings::getPwgenExecutable(), args); + process.waitForFinished(1000); + if (process.exitStatus() == QProcess::NormalExit) + passwd = + QString(process.readAllStandardOutput()).remove(QRegExp("[\\n\\r]")); + else + qDebug() << "pwgen fail"; + } else { + if (charset.length() > 0) { + for (int i = 0; i < length; ++i) { + int index = qrand() % charset.length(); + QChar nextChar = charset.at(index); + passwd.append(nextChar); + } + } + } + return passwd; +} + +/** + * @brief Pass::GenerateGPGKeys internal gpg keypair generator . . + * @param batch + * @param keygenWindow + */ +void Pass::GenerateGPGKeys(QString batch) { + executeWrapper(QtPassSettings::getGpgExecutable(), + "--gen-key --no-tty --batch", batch); + // TODO check status / error messages + // https://github.com/IJHack/QtPass/issues/202#issuecomment-251081688 +} + +/** + * @brief Pass::listKeys list users + * @param keystring + * @param secret list private keys + * @return QList users + */ +QList Pass::listKeys(QString keystring, bool secret) { + waitFor(5); + QList users; + QString listopt = secret ? "--list-secret-keys " : "--list-keys "; + executeWrapper(QtPassSettings::getGpgExecutable(), + "--no-tty --with-colons " + listopt + keystring); + process.waitForFinished(2000); + if (process.exitStatus() != QProcess::NormalExit) + return users; + QByteArray processOutBytes = process.readAllStandardOutput(); + QTextCodec *codec = QTextCodec::codecForLocale(); + QString processOutString = codec->toUnicode(processOutBytes); + QStringList keys = QString(processOutString) + .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::waitFor wait until process.atEnd and execQueue.isEmpty + * or timeout after x-seconds + * + * @param seconds + */ +void Pass::waitFor(uint seconds) { + QDateTime current = QDateTime::currentDateTime(); + uint stop = current.toTime_t() + seconds; + while (!process.atEnd() || !execQueue.isEmpty()) { + current = QDateTime::currentDateTime(); + if (stop < current.toTime_t()) { + emit critical(tr("Timed out"), + tr("Can't start process, previous one is still running!")); + } + Util::qSleep(100); + } +} + +/** + * @brief Pass::processFinished process is finished, if there is another + * one queued up to run, start it. + * @param exitCode + * @param exitStatus + */ +void Pass::processFinished(int, QProcess::ExitStatus) { + wrapperRunning = false; + if (!execQueue.isEmpty()) { + execQueueItem item = execQueue.dequeue(); + executeWrapper(item.app, item.args, item.input); + } +} + +/** + * Temporary wrapper to ease refactoring, don't get used to it ;) + */ +QProcess::ProcessState Pass::state() { + return process.state(); +} + +/** + * @brief Pass::executeWrapper run an application, queue when needed. + * @param app path to application to run + * @param args required arguements + * @param input optional input + */ +void Pass::executeWrapper(QString app, QString args, QString input) { + // qDebug() << app + " " + args; + // Happens a lot if e.g. git binary is not set. + // This will result in bogus "QProcess::FailedToStart" messages, + // also hiding legitimate errors from the gpg commands. + if (app.isEmpty()) { + qDebug() << "Trying to execute nothing.."; + return; + } + // Convert to absolute path, just in case + app = QDir(QCoreApplication::applicationDirPath()).absoluteFilePath(app); + if (wrapperRunning) { + execQueueItem item; + item.app = app; + item.args = args; + item.input = input; + + execQueue.enqueue(item); + qDebug() << item.app + "," + item.args + "," + item.input; + return; + } + wrapperRunning = true; + process.setWorkingDirectory(QtPassSettings::getPassStore()); + process.setEnvironment(env); + emit startingExecuteWrapper(); + process.start('"' + app + "\" " + args); + if (!input.isEmpty()) + process.write(input.toUtf8()); + process.closeWriteChannel(); +} + +/** + * @brief Pass::readAllStandardOutput temporary helper + * @return + */ +QByteArray Pass::readAllStandardOutput() { + return process.readAllStandardOutput(); +} + +/** + * @brief Pass::readAllStandardError temporary helper + * @return + */ +QByteArray Pass::readAllStandardError() { + return process.readAllStandardError(); +} + +/** + * @brief Pass::updateEnv update the execution environment (used when + * switching profiles) + */ +void Pass::updateEnv() { + QStringList store = env.filter("PASSWORD_STORE_DIR"); + // put PASSWORD_STORE_DIR in env + if (store.isEmpty()) { + // qDebug() << "Added PASSWORD_STORE_DIR"; + env.append("PASSWORD_STORE_DIR=" + QtPassSettings::getPassStore()); + } else { + // qDebug() << "Update PASSWORD_STORE_DIR with " + passStore; + env.replaceInStrings(store.first(), "PASSWORD_STORE_DIR=" + + QtPassSettings::getPassStore()); + } +} + +/** + * @brief Pass::resetPasswordStoreDir probably temporary helper + */ +void Pass::resetPasswordStoreDir() { + // qDebug() << env; + QStringList store = env.filter("PASSWORD_STORE_DIR"); + // put PASSWORD_STORE_DIR in env + if (store.isEmpty()) { + // qDebug() << "Added PASSWORD_STORE_DIR"; + env.append("PASSWORD_STORE_DIR=" + QtPassSettings::getPassStore()); + } else { + // qDebug() << "Update PASSWORD_STORE_DIR"; + env.replaceInStrings(store.first(), "PASSWORD_STORE_DIR=" + + QtPassSettings::getPassStore()); + } +} + + +/** + * @brief Pass::getRecipientList return list op gpg-id's to encrypt for + * @param for_file which file (folder) would you like recepients for + * @return recepients gpg-id contents + */ +QStringList Pass::getRecipientList(QString for_file) { + QDir gpgIdPath(QFileInfo(for_file.startsWith(QtPassSettings::getPassStore()) + ? for_file + : QtPassSettings::getPassStore() + for_file) + .absoluteDir()); + bool found = false; + while (gpgIdPath.exists() && + gpgIdPath.absolutePath().startsWith(QtPassSettings::getPassStore())) { + if (QFile(gpgIdPath.absoluteFilePath(".gpg-id")).exists()) { + found = true; + break; + } + if (!gpgIdPath.cdUp()) + break; + } + QFile gpgId(found ? gpgIdPath.absoluteFilePath(".gpg-id") + : QtPassSettings::getPassStore() + ".gpg-id"); + if (!gpgId.open(QIODevice::ReadOnly | QIODevice::Text)) + return QStringList(); + QStringList recipients; + while (!gpgId.atEnd()) { + QString recipient(gpgId.readLine()); + recipient = recipient.trimmed(); + if (!recipient.isEmpty()) + recipients += recipient; + } + return recipients; +} + + +/** + * @brief Pass::getRecipientString formated string for use with GPG + * @param for_file which file (folder) would you like recepients for + * @param separator formating separator eg: " -r " + * @param count + * @return recepient string + */ +QString 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; +} diff --git a/pass.h b/pass.h index 97dfa52d1..2bab692e1 100644 --- a/pass.h +++ b/pass.h @@ -9,9 +9,35 @@ #include "usersdialog.h" #include "enums.h" +/*! + \struct execQueueItem + \brief Execution queue items for non-interactive ordered execution. + */ +struct execQueueItem { + /** + * @brief app executable path. + */ + QString app; + /** + * @brief args arguments for executable. + */ + QString args; + /** + * @brief input stdio input. + */ + QString input; +}; -class Pass +class Pass : public QObject { + Q_OBJECT + + QQueue execQueue; + bool wrapperRunning; + QStringList env; +protected: + void executeWrapper(QString, QString, QString = QString()); + QProcess process; public: Pass(); virtual ~Pass() {} @@ -24,6 +50,30 @@ class Pass virtual void Init(QString path, const QList &users) = 0; virtual QString Generate(int length, const QString& charset); + void GenerateGPGKeys(QString batch); + QList listKeys(QString keystring="", bool secret=false); + void waitFor(uint seconds); + QProcess::ProcessState state(); + QByteArray readAllStandardOutput(); + QByteArray readAllStandardError(); + // TODO(bezet): probably not needed in public interface(1 use MainWindow) + QProcess::ExitStatus waitForProcess(); + void resetPasswordStoreDir(); + void updateEnv(); + // TODO(bezet): those are probably temporarly here + static QStringList getRecipientList(QString for_file); + static QString getRecipientString(QString for_file, QString separator = " ", + int *count = NULL); + +private slots: + void processFinished(int, QProcess::ExitStatus); + +signals: + void finished(int exitCode, QProcess::ExitStatus); + void error(QProcess::ProcessError); + void startingExecuteWrapper(); + void statusMsg(QString,int); + void critical(QString,QString); }; #endif // PASS_H diff --git a/qtpass.pro b/qtpass.pro index 14f4591b7..79ba42cb8 100644 --- a/qtpass.pro +++ b/qtpass.pro @@ -34,7 +34,10 @@ SOURCES += main.cpp\ qprogressindicator.cpp \ qpushbuttonwithclipboard.cpp \ qtpasssettings.cpp \ - settingsconstants.cpp + settingsconstants.cpp \ + pass.cpp \ + realpass.cpp \ + imitatepass.cpp HEADERS += mainwindow.h \ configdialog.h \ @@ -50,9 +53,9 @@ HEADERS += mainwindow.h \ qtpasssettings.h \ enums.h \ settingsconstants.h \ - pass.h \ - realpass.h \ - imitatepass.h + pass.h \ + realpass.h \ + imitatepass.h FORMS += mainwindow.ui \ configdialog.ui \ diff --git a/realpass.cpp b/realpass.cpp new file mode 100644 index 000000000..35864e5a5 --- /dev/null +++ b/realpass.cpp @@ -0,0 +1,87 @@ +#include "realpass.h" +#include "qtpasssettings.h" + +RealPass::RealPass() +{ + +} + +/** + * @brief RealPass::executePass easy wrapper for running pass + * @param args + */ +void RealPass::executePass(QString args, QString input) { + executeWrapper(QtPassSettings::getPassExecutable(), args, input); +} + +/** + * @brief RealPass::GitInit git init wrapper + */ +void RealPass::GitInit() { + executePass("git init"); +} + +/** + * @brief RealPass::GitPull git init wrapper + */ +void RealPass::GitPull() { + executePass("git pull"); +} + +/** + * @brief RealPass::GitPush git init wrapper + */ +void RealPass::GitPush() { + executePass("git push"); +} + +/** + * @brief RealPass::Show git init wrapper + * + * @param file file to decrypt + * @param block wheater to wait for decryption process to finish + * + * @return if block is set, returns exit status of internal decryption process + * otherwise returns QProcess::NormalExit + */ +QProcess::ExitStatus RealPass::Show(QString file, bool block) { + executePass("show \"" + file + '"'); + if(block) + return waitForProcess(); + return QProcess::NormalExit; +} + +/** + * @brief RealPass::Insert git init wrapper + */ +void RealPass::Insert(QString file, QString newValue, bool overwrite) { + executePass(QString("insert ") + (overwrite?"-f ":"") + "-m \"" + file + '"', newValue); +} + +/** + * @brief RealPass::Remove git init wrapper + */ +void RealPass::Remove(QString file, bool isDir) { + executePass(QString("rm ") + (isDir?"-rf ":"-f ") + '"' + file + '"'); +} + +/** + * @brief RealPass::Init initialize pass repository + * + * @param path Absolute path to new password-store + * @param users list of users with ability to decrypt new password-store + */ +void RealPass::Init(QString path, const QList &users) { + QString gpgIds = ""; + foreach (const UserInfo &user, users) { + if (user.enabled) { + gpgIds += user.key_id + " "; + } + } + // remove the passStore directory otherwise, + // pass would create a passStore/passStore/dir + // but you want passStore/dir + QString dirWithoutPassdir = + path.remove(0, QtPassSettings::getPassStore().size()); + executePass("init --path=" + dirWithoutPassdir + " " + gpgIds); +} From 2ff206a934cac1868e1edb5bce270fd542be8649 Mon Sep 17 00:00:00 2001 From: tezeb Date: Wed, 23 Nov 2016 00:02:18 +0100 Subject: [PATCH 3/3] Changed translations --- localization/localization_ar_MA.ts | 191 +++++++++++++++------------- localization/localization_cs_CZ.ts | 185 +++++++++++++++++---------- localization/localization_de_DE.ts | 188 +++++++++++++++++----------- localization/localization_de_LU.ts | 188 +++++++++++++++++----------- localization/localization_el_GR.ts | 193 ++++++++++++++++------------- localization/localization_en_GB.ts | 185 +++++++++++++++++---------- localization/localization_en_US.ts | 185 +++++++++++++++++---------- localization/localization_es_ES.ts | 187 +++++++++++++++++----------- localization/localization_fr_BE.ts | 185 +++++++++++++++++---------- localization/localization_fr_FR.ts | 185 +++++++++++++++++---------- localization/localization_fr_LU.ts | 185 +++++++++++++++++---------- localization/localization_gl_ES.ts | 193 ++++++++++++++++------------- localization/localization_he_IL.ts | 191 +++++++++++++++------------- localization/localization_hu_HU.ts | 193 ++++++++++++++++------------- localization/localization_it_IT.ts | 185 +++++++++++++++++---------- localization/localization_lb_LU.ts | 191 +++++++++++++++------------- localization/localization_nl_BE.ts | 185 +++++++++++++++++---------- localization/localization_nl_NL.ts | 185 +++++++++++++++++---------- localization/localization_pl_PL.ts | 193 ++++++++++++++++------------- localization/localization_ru_RU.ts | 185 +++++++++++++++++---------- localization/localization_sv_SE.ts | 187 +++++++++++++++++----------- localization/localization_zh_CN.ts | 184 +++++++++++++++++---------- 22 files changed, 2475 insertions(+), 1654 deletions(-) diff --git a/localization/localization_ar_MA.ts b/localization/localization_ar_MA.ts index 6497c3d68..173323722 100644 --- a/localization/localization_ar_MA.ts +++ b/localization/localization_ar_MA.ts @@ -361,6 +361,53 @@ email + + 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 @@ -464,14 +511,14 @@ Expire-Date: 0 - + Edit - + Delete @@ -502,7 +549,7 @@ Expire-Date: 0 - + Users @@ -544,258 +591,226 @@ p, li { white-space: pre-wrap; } - + Failed to connect WebDAV: - + QtPass WebDAV password - + Enter password to connect to WebDAV: - + fusedav exited unexpectedly - + Failed to start fusedav to connect WebDAV: - - + + Updating password-store - + New Folder: (Will be placed in %1 ) - + Password hidden - + Add Password - + Add Folder - + Content hidden - + Clipboard cleared - + Clipboard not cleared - + Password and Content hidden - + QProcess::FailedToStart - + QProcess::Crashed - + QProcess::Timedout - + QProcess::ReadError - + QProcess::WriteError - + QProcess::UnknownError - + Looking for: %1 - - - - + + Can not edit - - - Could not read encryption key to use, .gpg-id file missing or invalid. - - - - - + + New file - + Delete password? - - + Are you sure you want to delete %1? - + Delete folder? - - + + Selected password file does not exist, not able to edit - + Welcome to QtPass %1 - - + + Password - + New password file: (Will be placed in %1 ) - + Can not get key list - + Unable to get list of available gpg keys - + Key not found in keyring - - 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! - - - - + Generating GPG key pair - + Profile changed to %1 - + Add folder - + Add password - + No characters chosen - + Can't generate password, there are no characters to choose from set in the configuration! - - Timed out - - - - - Can't start process, previous one is still running! + + Copied to clipboard + + + Pass - - Copied to clipboard + + Timed out - - Re-encrypting from folder %1 + + Can't start process, previous one is still running! diff --git a/localization/localization_cs_CZ.ts b/localization/localization_cs_CZ.ts index f81252a60..b8b5d6fe3 100644 --- a/localization/localization_cs_CZ.ts +++ b/localization/localization_cs_CZ.ts @@ -363,6 +363,54 @@ email Adresář %1 nevypadá jako úložiště hesel, nebo ještě nebyl vytvořen. + + ImitatePass + + + + Can not edit + Nelze upravovat + + + + + Could not read encryption key to use, .gpg-id file missing or invalid. + Nelze načíst šifrovací klíč, .gpg-id soubor chybí nebo je neplatný. + + + + Cannot update + Nelze aktualizovat + + + + Failed to open .gpg-id for writing. + Selhalo otevření .gpg-id pro zápis. + + + + Check selected users! + Zaškrtnout vybrané uživatele! + + + + None of the selected keys have a secret key available. +You will not be able to decrypt any newly added passwords! + Pro žádný z vybraných klíčů není dostupný tajný klíč. +Nebudete moci dešifrovat žádná nově přidaná hesla! + + + + Re-encrypting from folder %1 + Nově šifrováno z adresáře %1 + + + + + Updating password-store + Aktualizace úložiště hesel + + KeygenDialog @@ -480,14 +528,14 @@ Expire-Date: 0 - + Edit Upravit - + Delete Smazat @@ -518,7 +566,7 @@ Expire-Date: 0 - + Users Uživatelé @@ -582,265 +630,266 @@ p, li { white-space: pre-wrap; } qtpass - + Welcome to QtPass %1 Vítejte v QtPass %1 - + Add Password Přidat heslo - + Add Folder Přidat adresář - + Failed to connect WebDAV: Selhalo připojení k WebDAV: - + QtPass WebDAV password QtPass WebDAV heslo - + Enter password to connect to WebDAV: Vložte heslo pro připojení k WebDAV: - + fusedav exited unexpectedly fusedav neočekávaně skončil - + Failed to start fusedav to connect WebDAV: Selhalo spuštění fusedav pro připojení k WebDAV: - - + + Updating password-store Aktualizace úložiště hesel - - - - + + Can not edit Nelze upravovat - - + + Selected password file does not exist, not able to edit Vybraný soubor s heslem neexistuje, nelze upravovat - + Password hidden Skryté heslo - + Content hidden Skrytý obsah - - + + Password Heslo - + Clipboard cleared Schránka vymazána - + Clipboard not cleared Schránka nevymazána - + Password and Content hidden Skryté heslo i obsah - + QProcess::FailedToStart QProcess::FailedToStart - + QProcess::Crashed QProcess::Crashed - + QProcess::Timedout QProcess::Timedout - + QProcess::ReadError QProcess::ReadError - + QProcess::WriteError QProcess::WriteError - + QProcess::UnknownError QProcess::UnknownError - + Looking for: %1 Vyhledávání: %1 - - Could not read encryption key to use, .gpg-id file missing or invalid. - Nelze načíst šifrovací klíč, .gpg-id soubor chybí nebo je neplatný. + Nelze načíst šifrovací klíč, .gpg-id soubor chybí nebo je neplatný. - - + + New file Nový soubor - + New password file: (Will be placed in %1 ) Nový soubor s heslem: (Bude uložen do %1 ) - + Delete password? Smazat heslo? - - + Are you sure you want to delete %1? Opravdu chcete smazat %1? - + Delete folder? Smazat adresář? - + Can not get key list Nelze získat seznam klíčů - + Unable to get list of available gpg keys Nelze získat seznam dostupných gpg klíčů - + Key not found in keyring Klíč nebyl v klíčence nalezen - Cannot update - Nelze aktualizovat + Nelze aktualizovat - Failed to open .gpg-id for writing. - Selhalo otevření .gpg-id pro zápis. + Selhalo otevření .gpg-id pro zápis. - Check selected users! - Zaškrtnout vybrané uživatele! + Zaškrtnout vybrané uživatele! - None of the selected keys have a secret key available. You will not be able to decrypt any newly added passwords! - Pro žádný z vybraných klíčů není dostupný tajný klíč. + Pro žádný z vybraných klíčů není dostupný tajný klíč. Nebudete moci dešifrovat žádná nově přidaná hesla! - + Generating GPG key pair Generování páru GPG klíčů - + Profile changed to %1 Profil změněn na %1 - + Add folder Přidat adresář - + Add password Přidat heslo - + New Folder: (Will be placed in %1 ) Nový adresář: (Bude umístěn do %1 ) - + No characters chosen Znaky nebyly vybrány - + Can't generate password, there are no characters to choose from set in the configuration! Nelze generovat heslo, v nastavení nebyla vybrána skladba znaků pro heslo! - Timed out - Vypršelo + Vypršelo - Can't start process, previous one is still running! - Nelze spustit, předchozí proces stále běží! + Nelze spustit, předchozí proces stále běží! - + Copied to clipboard zkopírovat do schránky - Re-encrypting from folder %1 - Nově šifrováno z adresáře %1 + Nově šifrováno z adresáře %1 + + + + Pass + + + Timed out + Vypršelo + + + + Can't start process, previous one is still running! + Nelze spustit, předchozí proces stále běží! diff --git a/localization/localization_de_DE.ts b/localization/localization_de_DE.ts index 147fd563d..b873b9017 100755 --- a/localization/localization_de_DE.ts +++ b/localization/localization_de_DE.ts @@ -364,6 +364,54 @@ email Kein Profil zum Löschen ausgewählt + + ImitatePass + + + + Can not edit + Ändern nicht möglich + + + + + Could not read encryption key to use, .gpg-id file missing or invalid. + Schlüssel nicht lesbar, .gpg-id Datei fehlt oder ist ungültig. + + + + Cannot update + Update nicht möglich + + + + Failed to open .gpg-id for writing. + Schreibzugrif auf .gpg-id fehlgeschlagen. + + + + Check selected users! + Ausgewählte Benutzer prüfen! + + + + None of the selected keys have a secret key available. +You will not be able to decrypt any newly added passwords! + Der Partnerschlüssel der selektierten Schlüssel fehlt. +Hiermit können keine neu hinzugefügefügten Passwörter entschlüsselt werden! + + + + Re-encrypting from folder %1 + + + + + + Updating password-store + Passwort Speicher aktualisieren + + KeygenDialog @@ -468,14 +516,14 @@ Expire-Date: 0 - + Edit Ändern - + Delete Löschen @@ -506,7 +554,7 @@ Expire-Date: 0 - + Users Benutzer @@ -571,212 +619,199 @@ p, li { white-space: pre-wrap; } qtpass - - + + Updating password-store Passwort Speicher aktualisieren - + Clipboard cleared Zwischenablage gelöscht - + New Folder: (Will be placed in %1 ) Neuer Ordner: (Wird in %1 platziert werden) - + Failed to connect WebDAV: Verbindung zu WebDAV fehlgeschlagen: - + Add Password Passwort Hinzufügen - + Add Folder Ordner Hinzufügen - + QtPass WebDAV password QtPass WebDAV Passwort - + Enter password to connect to WebDAV: Passwort für WebDAV eingeben: - + fusedav exited unexpectedly Unerwarteter Abbruch durch fusedav - + Failed to start fusedav to connect WebDAV: fusedav konnte nicht gestartet werden, WebDav Verbindung fehlgeschlagen: - + Password hidden Passwort ausgeblendet - + Content hidden Inhalt ausgeblendet - - + + Password Passwort - + Clipboard not cleared Zwischenablage nicht geleert - + Password and Content hidden Password und Inhalt ausgeblendet - + QProcess::FailedToStart QProcess::FailedToStart - + QProcess::Crashed QProcess::Crashed - + QProcess::Timedout QProcess::Timedout - + QProcess::ReadError QProcess::ReadError - + QProcess::WriteError QProcess::WriteError - + QProcess::UnknownError QProcess::UnknownError - + Copied to clipboard in Zwischenablage kopiert - - Re-encrypting from folder %1 - Erneut verschlüsseln aus dem Ordner %1 - - - - + Add folder Ordner hinzufügen - + Add password Passwort hinzufügen - + No characters chosen Keine Zeichen ausgewählt - + Can't generate password, there are no characters to choose from set in the configuration! Passwortgenerierung nicht möglich: Keine Zeichen zur Generierung ausgewählt! - Timed out - Zeitüberschreitung + Zeitüberschreitung - Can't start process, previous one is still running! - Prozess kann nicht starten, vorheriger Prozess läuft noch! + Prozess kann nicht starten, vorheriger Prozess läuft noch! - + Welcome to QtPass %1 Willkommen bei QtPass %1 - + Looking for: %1 Suche nach: %1 - - - - + + Can not edit Ändern nicht möglich - - Could not read encryption key to use, .gpg-id file missing or invalid. - Schlüssel nicht lesbar, .gpg-id Datei fehlt oder ist ungültig. + Schlüssel nicht lesbar, .gpg-id Datei fehlt oder ist ungültig. - - + + New file Neue Datei - + Delete password? Passwort löschen? - - + Are you sure you want to delete %1? Sind Sie sicher, dass Sie %1 löschen wollen? - + Delete folder? Ordner löschen? - - + + Selected password file does not exist, not able to edit Gewählte Passwort-Datei existiert nicht, Änderung nicht möglich - + New password file: (Will be placed in %1 ) @@ -784,53 +819,62 @@ Neues Passwort-Datei: (Wird in %1 platziert werden) - + Can not get key list Schlüssel-Liste nicht gefunden - + Unable to get list of available gpg keys gpg Schlüssel-Liste konnte nicht gefunden werden - + Key not found in keyring Schlüssel nicht in Keyring gefunden - Cannot update - Update nicht möglich + Update nicht möglich - Failed to open .gpg-id for writing. - Schreibzugrif auf .gpg-id fehlgeschlagen. + Schreibzugrif auf .gpg-id fehlgeschlagen. - Check selected users! - Ausgewählte Benutzer prüfen! + Ausgewählte Benutzer prüfen! - None of the selected keys have a secret key available. You will not be able to decrypt any newly added passwords! - Der Partnerschlüssel der selektierten Schlüssel fehlt. + Der Partnerschlüssel der selektierten Schlüssel fehlt. Hiermit können keine neu hinzugefügefügten Passwörter entschlüsselt werden! - + Generating GPG key pair GPG Schlüssel-Paar wird generiert - + Profile changed to %1 Profil geändert zu %1 + + Pass + + + Timed out + Zeitüberschreitung + + + + Can't start process, previous one is still running! + Prozess kann nicht starten, vorheriger Prozess läuft noch! + + PasswordDialog diff --git a/localization/localization_de_LU.ts b/localization/localization_de_LU.ts index 4e8bfa32b..cea59cd79 100755 --- a/localization/localization_de_LU.ts +++ b/localization/localization_de_LU.ts @@ -364,6 +364,54 @@ email Kein Profil zum Löschen ausgewählt + + ImitatePass + + + + Can not edit + Ändern nicht möglich + + + + + Could not read encryption key to use, .gpg-id file missing or invalid. + Schlüssel nicht lesbar, .gpg-id Datei fehlt oder ist ungültig. + + + + Cannot update + Update nicht möglich + + + + Failed to open .gpg-id for writing. + Schreibzugrif auf .gpg-id fehlgeschlagen. + + + + Check selected users! + Ausgewählte Benutzer prüfen! + + + + None of the selected keys have a secret key available. +You will not be able to decrypt any newly added passwords! + Der Partnerschlüssel der selektierten Schlüssel fehlt. +Hiermit können keine neu hinzugefügefügten Passwörter entschlüsselt werden! + + + + Re-encrypting from folder %1 + + + + + + Updating password-store + Password Store aktualisieren + + KeygenDialog @@ -467,14 +515,14 @@ Expire-Date: 0 - + Edit Ändern - + Delete Löschen @@ -505,7 +553,7 @@ Expire-Date: 0 - + Users Benutzer @@ -570,212 +618,199 @@ p, li { white-space: pre-wrap; } qtpass - - + + Updating password-store Password Store aktualisieren - + Clipboard cleared Zwischenablage gelöscht - + New Folder: (Will be placed in %1 ) Neuer Ordner: (Wird in %1 platziert werden) - + Failed to connect WebDAV: Verbindung zu WebDAV fehlgeschlagen: - + Add Password Kennwort Hinzufügen - + Add Folder Ordner Hinzufügen - + QtPass WebDAV password QtPass WebDAV Passwort - + Enter password to connect to WebDAV: Passwort für WebDAV eingeben: - + fusedav exited unexpectedly Unerwarteter Abbruch durch fusedav - + Failed to start fusedav to connect WebDAV: fusedav konnte nicht gestartet werden, WebDav Verbindung fehlgeschlagen: - + Password hidden Passwort ausgeblendet - + Content hidden Inhalt ausgeblendet - - + + Password Passwort - + Clipboard not cleared Zwischenablage nicht geleert - + Password and Content hidden Password und Inhalt ausgeblendet - + QProcess::FailedToStart QProcess::FailedToStart - + QProcess::Crashed QProcess::Crashed - + QProcess::Timedout QProcess::Timedout - + QProcess::ReadError QProcess::ReadError - + QProcess::WriteError QProcess::WriteError - + QProcess::UnknownError QProcess::UnknownError - + Copied to clipboard in Zwischenablage kopiert - - Re-encrypting from folder %1 - Erneut verschlüsseln aus dem Ordner %1 - - - - + Add folder Ordner hinzufügen - + Add password Passwort hinzufügen - + No characters chosen Keine Zeichen ausgewählt - + Can't generate password, there are no characters to choose from set in the configuration! Passwortgenerierung nicht möglich: Keine Zeichen zur Generierung ausgewählt! - Timed out - Zeitüberschreitung + Zeitüberschreitung - Can't start process, previous one is still running! - Prozess kann nicht starten, vorheriger Prozess läuft noch! + Prozess kann nicht starten, vorheriger Prozess läuft noch! - + Welcome to QtPass %1 Wilkommen bei QtPass %1 - + Looking for: %1 Suche nach: %1 - - - - + + Can not edit Ändern nicht möglich - - Could not read encryption key to use, .gpg-id file missing or invalid. - Schlüssel nicht lesbar, .gpg-id Datei fehlt oder ist ungültig. + Schlüssel nicht lesbar, .gpg-id Datei fehlt oder ist ungültig. - - + + New file Neue Datei - + Delete password? Passwort löschen? - - + Are you sure you want to delete %1? Sind Sie sicher, dass Sie %1 löschen wollen? - + Delete folder? Ordner löschen? - - + + Selected password file does not exist, not able to edit Gewählte Passwort-Datei existiert nicht, Änderung nicht möglich - + New password file: (Will be placed in %1 ) @@ -783,53 +818,62 @@ Neues Passwort-Datei: (Wird in %1 platziert werden) - + Can not get key list Schlüssel-Liste nicht gefunden - + Unable to get list of available gpg keys gpg Schlüssel-Liste konnte nicht gefunden werden - + Key not found in keyring Schlüssel nicht in Keyring gefunden - Cannot update - Update nicht möglich + Update nicht möglich - Failed to open .gpg-id for writing. - Schreibzugrif auf .gpg-id fehlgeschlagen. + Schreibzugrif auf .gpg-id fehlgeschlagen. - Check selected users! - Ausgewählte Benutzer prüfen! + Ausgewählte Benutzer prüfen! - None of the selected keys have a secret key available. You will not be able to decrypt any newly added passwords! - Der Partnerschlüssel der selektierten Schlüssel fehlt. + Der Partnerschlüssel der selektierten Schlüssel fehlt. Hiermit können keine neu hinzugefügefügten Passwörter entschlüsselt werden! - + Generating GPG key pair GPG Schlüssel-Paar wird generiert - + Profile changed to %1 Profil geändert zu %1 + + Pass + + + Timed out + Zeitüberschreitung + + + + Can't start process, previous one is still running! + Prozess kann nicht starten, vorheriger Prozess läuft noch! + + PasswordDialog diff --git a/localization/localization_el_GR.ts b/localization/localization_el_GR.ts index b6e9c9980..0647527c8 100644 --- a/localization/localization_el_GR.ts +++ b/localization/localization_el_GR.ts @@ -361,6 +361,53 @@ email + + 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 @@ -464,14 +511,14 @@ Expire-Date: 0 - + Edit - + Delete @@ -502,7 +549,7 @@ Expire-Date: 0 - + Users @@ -544,258 +591,226 @@ p, li { white-space: pre-wrap; } - + Welcome to QtPass %1 - + Add Password - + Add Folder - + Failed to connect WebDAV: - + QtPass WebDAV password - + Enter password to connect to WebDAV: - + fusedav exited unexpectedly - + Failed to start fusedav to connect WebDAV: - - + + Updating password-store - - - - + + Can not edit - - + + Selected password file does not exist, not able to edit - + Password hidden - + Content hidden - - + + Password - + Clipboard cleared - + Clipboard not cleared - + Password and Content hidden - + QProcess::FailedToStart - + QProcess::Crashed - + QProcess::Timedout - + QProcess::ReadError - + QProcess::WriteError - + QProcess::UnknownError - + Looking for: %1 - - - Could not read encryption key to use, .gpg-id file missing or invalid. - - - - - + + New file - + New password file: (Will be placed in %1 ) - + Delete password? - - + Are you sure you want to delete %1? - + Delete folder? - + Can not get key list - + Unable to get list of available gpg keys - + Key not found in keyring - - 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! - - - - + Generating GPG key pair - + Profile changed to %1 - + Add folder - + Add password - + New Folder: (Will be placed in %1 ) - + No characters chosen - + Can't generate password, there are no characters to choose from set in the configuration! - - Timed out - + + Copied to clipboard + copied to clipboard + + + Pass - - Can't start process, previous one is still running! + + Timed out - - Copied to clipboard - copied to clipboard - - - - Re-encrypting from folder %1 + + Can't start process, previous one is still running! diff --git a/localization/localization_en_GB.ts b/localization/localization_en_GB.ts index 368528981..620f378b7 100644 --- a/localization/localization_en_GB.ts +++ b/localization/localization_en_GB.ts @@ -363,6 +363,54 @@ email The folder %1 doesn't seem to be a password store or is not yet initialised. + + ImitatePass + + + + Can not edit + Can not edit + + + + + Could not read encryption key to use, .gpg-id file missing or invalid. + Could not read encryption key to use, .gpg-id file missing or invalid. + + + + Cannot update + Cannot update + + + + Failed to open .gpg-id for writing. + Failed to open .gpg-id for writing. + + + + Check selected users! + Check selected users! + + + + None of the selected keys have a secret key available. +You will not be able to decrypt any newly added passwords! + 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 + Re-encrypting from folder %1 + + + + + Updating password-store + Updating password-store + + KeygenDialog @@ -480,14 +528,14 @@ Expire-Date: 0 - + Edit Edit - + Delete Delete @@ -518,7 +566,7 @@ Expire-Date: 0 - + Users Users @@ -582,265 +630,266 @@ p, li { white-space: pre-wrap; } qtpass - + Welcome to QtPass %1 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 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 Content hidden - - + + Password Password - + Clipboard cleared Clipboard cleared - + Clipboard not cleared Clipboard not cleared - + Password and Content hidden 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 - + Looking for: %1 Looking for: %1 - - Could not read encryption key to use, .gpg-id file missing or invalid. - Could not read encryption key to use, .gpg-id file missing or invalid. + Could not read encryption key to use, .gpg-id file missing or invalid. - - + + New file New file - + New password file: (Will be placed in %1 ) New password file: (Will be placed in %1 ) - + Delete password? Delete password? - - + Are you sure you want to delete %1? Are you sure you want to delete %1? - + Delete folder? Delete folder? - + Can not get key list Can not get key list - + Unable to get list of available gpg keys Unable to get list of available gpg keys - + Key not found in keyring Key not found in keyring - Cannot update - Cannot update + Cannot update - Failed to open .gpg-id for writing. - Failed to open .gpg-id for writing. + Failed to open .gpg-id for writing. - Check selected users! - Check selected users! + Check selected users! - None of the selected keys have a secret key available. You will not be able to decrypt any newly added passwords! - None of the selected keys have a secret key available. + None of the selected keys have a secret key available. You will not be able to decrypt any newly added passwords! - + Generating GPG key pair Generating GPG key pair - + Profile changed to %1 Profile changed to %1 - + Add folder Add folder - + Add password Add password - + New Folder: (Will be placed in %1 ) New Folder: (Will be placed in %1 ) - + No characters chosen No characters chosen - + Can't generate password, there are no characters to choose from set in the configuration! Can't generate password, there are no characters to choose from set in the configuration! - Timed out - Timed out + Timed out - Can't start process, previous one is still running! - Can't start process, previous one is still running! + Can't start process, previous one is still running! - + Copied to clipboard copied to clipboard - Re-encrypting from folder %1 - Re-encrypting from folder %1 + Re-encrypting from folder %1 + + + + Pass + + + Timed out + Timed out + + + + Can't start process, previous one is still running! + Can't start process, previous one is still running! diff --git a/localization/localization_en_US.ts b/localization/localization_en_US.ts index f0b7a73ab..bda62918d 100644 --- a/localization/localization_en_US.ts +++ b/localization/localization_en_US.ts @@ -363,6 +363,54 @@ email The folder %1 doesn't seem to be a password store or is not yet initialised. + + ImitatePass + + + + Can not edit + Can not edit + + + + + Could not read encryption key to use, .gpg-id file missing or invalid. + Could not read encryption key to use, .gpg-id file missing or invalid. + + + + Cannot update + Cannot update + + + + Failed to open .gpg-id for writing. + Failed to open .gpg-id for writing. + + + + Check selected users! + Check selected users! + + + + None of the selected keys have a secret key available. +You will not be able to decrypt any newly added passwords! + 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 + Re-encrypting from folder %1 + + + + + Updating password-store + Updating password-store + + KeygenDialog @@ -480,14 +528,14 @@ Expire-Date: 0 - + Edit Edit - + Delete Delete @@ -518,7 +566,7 @@ Expire-Date: 0 - + Users Users @@ -582,265 +630,266 @@ p, li { white-space: pre-wrap; } qtpass - + Welcome to QtPass %1 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 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 Content hidden - - + + Password Password - + Clipboard cleared Clipboard cleared - + Clipboard not cleared Clipboard not cleared - + Password and Content hidden 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 - + Looking for: %1 Looking for: %1 - - Could not read encryption key to use, .gpg-id file missing or invalid. - Could not read encryption key to use, .gpg-id file missing or invalid. + Could not read encryption key to use, .gpg-id file missing or invalid. - - + + New file New file - + New password file: (Will be placed in %1 ) New password file: (Will be placed in %1 ) - + Delete password? Delete password? - - + Are you sure you want to delete %1? Are you sure you want to delete %1? - + Delete folder? Delete folder? - + Can not get key list Can not get key list - + Unable to get list of available gpg keys Unable to get list of available gpg keys - + Key not found in keyring Key not found in keyring - Cannot update - Cannot update + Cannot update - Failed to open .gpg-id for writing. - Failed to open .gpg-id for writing. + Failed to open .gpg-id for writing. - Check selected users! - Check selected users! + Check selected users! - None of the selected keys have a secret key available. You will not be able to decrypt any newly added passwords! - None of the selected keys have a secret key available. + None of the selected keys have a secret key available. You will not be able to decrypt any newly added passwords! - + Generating GPG key pair Generating GPG key pair - + Profile changed to %1 Profile changed to %1 - + Add folder Add folder - + Add password Add password - + New Folder: (Will be placed in %1 ) New Folder: (Will be placed in %1 ) - + No characters chosen No characters chosen - + Can't generate password, there are no characters to choose from set in the configuration! Can't generate password, there are no characters to choose from set in the configuration! - Timed out - Timed out + Timed out - Can't start process, previous one is still running! - Can't start process, previous one is still running! + Can't start process, previous one is still running! - + Copied to clipboard Copied to clipboard - Re-encrypting from folder %1 - Re-encrypting from folder %1 + Re-encrypting from folder %1 + + + + Pass + + + Timed out + Timed out + + + + Can't start process, previous one is still running! + Can't start process, previous one is still running! diff --git a/localization/localization_es_ES.ts b/localization/localization_es_ES.ts index 16cf9e616..4498a57c2 100644 --- a/localization/localization_es_ES.ts +++ b/localization/localization_es_ES.ts @@ -361,6 +361,54 @@ email Sin perfil seleccionado para borrar + + ImitatePass + + + + Can not edit + No se puede editar + + + + + Could not read encryption key to use, .gpg-id file missing or invalid. + No se pudo leer la clave de cifrado, fichero gpg-id falta o no es valido. + + + + Cannot update + No se puede actualizar + + + + Failed to open .gpg-id for writing. + No se pudo abrir .gpg-id para escribir. + + + + Check selected users! + Compruebe usuarios seleccionados! + + + + None of the selected keys have a secret key available. +You will not be able to decrypt any newly added passwords! + Ninguna de las llaves seleccionadas tiene una llave secreta disponible. +Usted no será capaz de descifrar cualquier contraseña que acaba de agregar! + + + + Re-encrypting from folder %1 + + + + + + Updating password-store + Actualizando password-store + + KeygenDialog @@ -464,14 +512,14 @@ Expire-Date: 0 - + Edit Editar - + Delete Borrar @@ -502,7 +550,7 @@ Expire-Date: 0 - + Users Usuarios @@ -544,262 +592,259 @@ p, li { white-space: pre-wrap; } qtpass - - + + Updating password-store Actualizando password-store - + Clipboard cleared Portapapeles vacío - + New Folder: (Will be placed in %1 ) - + Failed to connect WebDAV: No se pudo conectar WebDAV: - + Add Password - + Add Folder - + QtPass WebDAV password Contraseña QtPass WebDAV - + Enter password to connect to WebDAV: Introduzca contraseña para conectarse a WebDAV: - + fusedav exited unexpectedly fusedav se ha cerrado inesperadamente - + Failed to start fusedav to connect WebDAV: Error al iniciar fusedav para conectar WebDAV: - + Password hidden Contraseña oculta - + Content hidden Contenido oculto - - + + Password Contraseña - + Clipboard not cleared Portapapeles no vaciado - + Password and Content hidden Contraseña y contenido oculto - + QProcess::FailedToStart QProcess::Fallo al iniciar - + QProcess::Crashed QProcess::Roto - + QProcess::Timedout QProcess::Caducado - + QProcess::ReadError QProcess::Error de lectura - + QProcess::WriteError QProcess::Error de escritura - + QProcess::UnknownError QProcess::Error desconocido - + Copied to clipboard copiado en el portapapeles - - Re-encrypting from folder %1 - - - - + Add folder Añadir carpeta - + Add password Añadir contraseña - + No characters chosen - + Can't generate password, there are no characters to choose from set in the configuration! - Timed out - Caducado + Caducado - Can't start process, previous one is still running! - No se puede iniciar el proceso, anterior sigue funcionando! + No se puede iniciar el proceso, anterior sigue funcionando! - + Welcome to QtPass %1 Bienvenido a QtPass %1 - + Looking for: %1 Buscando %1 - - - - + + Can not edit No se puede editar - - Could not read encryption key to use, .gpg-id file missing or invalid. - No se pudo leer la clave de cifrado, fichero gpg-id falta o no es valido. + No se pudo leer la clave de cifrado, fichero gpg-id falta o no es valido. - - + + New file Nuevo fichero - + Delete password? Borrar contraseña? - - + Are you sure you want to delete %1? Está seguro que quiere borrar %1? - + Delete folder? Borrar carpeta? - - + + Selected password file does not exist, not able to edit Fichero de contraseñas seleccionado no existe, no se puede editar - + New password file: (Will be placed in %1 ) - + Can not get key list No se puede obtener lista de claves - + Unable to get list of available gpg keys No se puede obtener lista de llaves gpg disponibles - + Key not found in keyring La llave no se encuentra en el llavero - Cannot update - No se puede actualizar + No se puede actualizar - Failed to open .gpg-id for writing. - No se pudo abrir .gpg-id para escribir. + No se pudo abrir .gpg-id para escribir. - Check selected users! - Compruebe usuarios seleccionados! + Compruebe usuarios seleccionados! - None of the selected keys have a secret key available. You will not be able to decrypt any newly added passwords! - Ninguna de las llaves seleccionadas tiene una llave secreta disponible. + Ninguna de las llaves seleccionadas tiene una llave secreta disponible. Usted no será capaz de descifrar cualquier contraseña que acaba de agregar! - + Generating GPG key pair Generar par de claves GPG - + Profile changed to %1 Perfil cambiado a %1 + + Pass + + + Timed out + Caducado + + + + Can't start process, previous one is still running! + No se puede iniciar el proceso, anterior sigue funcionando! + + PasswordDialog diff --git a/localization/localization_fr_BE.ts b/localization/localization_fr_BE.ts index ab16908fe..3a7cf459c 100644 --- a/localization/localization_fr_BE.ts +++ b/localization/localization_fr_BE.ts @@ -363,6 +363,54 @@ email Le dossier %1 ne semble pas être un magasin de mots de passe ou n'as pas encore été initialisé. + + ImitatePass + + + + Can not edit + Impossible d'éditer + + + + + Could not read encryption key to use, .gpg-id file missing or invalid. + Impossible de lire la clé de chiffrement à utiliser, le fichier .gpg-id est manquant ou corrompu. + + + + Cannot update + Impossible de mettre à jour + + + + Failed to open .gpg-id for writing. + Impossible d'ouvrir .gpg-id en écriture. + + + + Check selected users! + Cocher les utilisateurs sélectionnés ! + + + + None of the selected keys have a secret key available. +You will not be able to decrypt any newly added passwords! + Aucune des clés sélectionnées n'a de clé privée disponible. +Vous ne serez pas en mesure de déchiffrer les mots de passe nouvellement ajoutés ! + + + + Re-encrypting from folder %1 + Re-chiffrement depuis le dossier %1 + + + + + Updating password-store + Mise à jour du magasin de mots de passe + + KeygenDialog @@ -480,14 +528,14 @@ Expire-Date: 0 - + Edit Editer - + Delete Supprimer @@ -518,7 +566,7 @@ Expire-Date: 0 - + Users Utilisateurs @@ -582,265 +630,266 @@ p, li { white-space: pre-wrap; } qtpass - + Welcome to QtPass %1 Bienvenue sur QtPass %1 - + Add Password Ajouter mot de passe - + Add Folder Ajouter dossier - + Failed to connect WebDAV: Impossible de se connecter au WebDAV : - + QtPass WebDAV password Mot de passe WebDAV QtPass - + Enter password to connect to WebDAV: Entrez un mot de passe pour vous connecter au WebDAV : - + fusedav exited unexpectedly fusedav s'est terminé de manière improviste - + Failed to start fusedav to connect WebDAV: Impossible de démarrer fusedav pour se connecter au WebDAV : - - + + Updating password-store Mise à jour du magasin de mots de passe - - - - + + Can not edit Impossible d'éditer - - + + Selected password file does not exist, not able to edit Le fichier de mots de passe sélectionné n'existe pas, impossible de le modifier - + Password hidden Mot de passe caché - + Content hidden Contenu caché - - + + Password Mot de passe - + Clipboard cleared Presse-papiers vidé - + Clipboard not cleared Presse-papiers non vidé - + Password and Content hidden Mot de passe et contenu cachés - + QProcess::FailedToStart QProcess::FailedToStart - + QProcess::Crashed QProcess::Crashed - + QProcess::Timedout QProcess::Timedout - + QProcess::ReadError QProcess::ReadError - + QProcess::WriteError QProcess::WriteError - + QProcess::UnknownError QProcess::UnknownError - + Looking for: %1 Recherche de : %1 - - Could not read encryption key to use, .gpg-id file missing or invalid. - Impossible de lire la clé de chiffrement à utiliser, le fichier .gpg-id est manquant ou corrompu. + Impossible de lire la clé de chiffrement à utiliser, le fichier .gpg-id est manquant ou corrompu. - - + + New file Nouveau fichier - + New password file: (Will be placed in %1 ) Enregistrement d'un nouveau mot de passe : (Sera stocké dans %1) - + Delete password? Supprimer le mot de passe ? - - + Are you sure you want to delete %1? Êtes-vous sûr de vouloir supprimer %1 ? - + Delete folder? Supprimer le dossier ? - + Can not get key list Impossible de récupérer la liste de clés - + Unable to get list of available gpg keys Impossible d'obtenir la liste des clés GPG disponibles - + Key not found in keyring Clé introuvable dans le trousseau de clés - Cannot update - Impossible de mettre à jour + Impossible de mettre à jour - Failed to open .gpg-id for writing. - Impossible d'ouvrir .gpg-id en écriture. + Impossible d'ouvrir .gpg-id en écriture. - Check selected users! - Cocher les utilisateurs sélectionnés ! + Cocher les utilisateurs sélectionnés ! - None of the selected keys have a secret key available. You will not be able to decrypt any newly added passwords! - Aucune des clés sélectionnées n'a de clé privée disponible. + Aucune des clés sélectionnées n'a de clé privée disponible. Vous ne serez pas en mesure de déchiffrer les mots de passe nouvellement ajoutés ! - + Generating GPG key pair Génération d'une paire de clés GPG - + Profile changed to %1 Profil changé vers %1 - + Add folder Ajouter un dossier - + Add password Ajouter un mot de passe - + New Folder: (Will be placed in %1 ) Nouveau dossier : (Sera créé dans %1) - + No characters chosen Pas de caractères choisis - + Can't generate password, there are no characters to choose from set in the configuration! Impossible de générer un mot de passe, il n'y a pas de caractères utilisables définis dans la configuration ! - Timed out - Délai expiré + Délai expiré - Can't start process, previous one is still running! - Impossible de démarrer le processus, le précédent est toujours en cours d'exécution ! + Impossible de démarrer le processus, le précédent est toujours en cours d'exécution ! - + Copied to clipboard copié dans le presse-papiers - Re-encrypting from folder %1 - Re-chiffrement depuis le dossier %1 + Re-chiffrement depuis le dossier %1 + + + + Pass + + + Timed out + Délai expiré + + + + Can't start process, previous one is still running! + Impossible de démarrer le processus, le précédent est toujours en cours d'exécution ! diff --git a/localization/localization_fr_FR.ts b/localization/localization_fr_FR.ts index 1cb20f8d6..167cf0999 100644 --- a/localization/localization_fr_FR.ts +++ b/localization/localization_fr_FR.ts @@ -363,6 +363,54 @@ email Le dossier %1 ne semble pas être un magasin de mots de passe ou n'as pas encore été initialisé. + + ImitatePass + + + + Can not edit + Impossible d'éditer + + + + + Could not read encryption key to use, .gpg-id file missing or invalid. + Impossible de lire la clé de chiffrement à utiliser, le fichier .gpg-id est manquant ou corrompu. + + + + Cannot update + Impossible de mettre à jour + + + + Failed to open .gpg-id for writing. + Impossible d'ouvrir .gpg-id en écriture. + + + + Check selected users! + Cocher les utilisateurs sélectionnés ! + + + + None of the selected keys have a secret key available. +You will not be able to decrypt any newly added passwords! + Aucune des clés sélectionnées n'a de clé privée disponible. +Vous ne serez pas en mesure de déchiffrer les mots de passe nouvellement ajoutés ! + + + + Re-encrypting from folder %1 + Re-chiffrement depuis le dossier %1 + + + + + Updating password-store + Mise à jour du magasin de mots de passe + + KeygenDialog @@ -480,14 +528,14 @@ Expire-Date: 0 - + Edit Editer - + Delete Supprimer @@ -518,7 +566,7 @@ Expire-Date: 0 - + Users Utilisateurs @@ -582,265 +630,266 @@ p, li { white-space: pre-wrap; } qtpass - + Welcome to QtPass %1 Bienvenue sur QtPass %1 - + Add Password Ajouter mot de passe - + Add Folder Ajouter dossier - + Failed to connect WebDAV: Impossible de se connecter au WebDAV : - + QtPass WebDAV password Mot de passe WebDAV QtPass - + Enter password to connect to WebDAV: Entrez un mot de passe pour vous connecter au WebDAV : - + fusedav exited unexpectedly fusedav s'est terminé de manière improviste - + Failed to start fusedav to connect WebDAV: Impossible de démarrer fusedav pour se connecter au WebDAV : - - + + Updating password-store Mise à jour du magasin de mots de passe - - - - + + Can not edit Impossible d'éditer - - + + Selected password file does not exist, not able to edit Le fichier de mots de passe sélectionné n'existe pas, impossible de le modifier - + Password hidden Mot de passe caché - + Content hidden Contenu caché - - + + Password Mot de passe - + Clipboard cleared Presse-papiers vidé - + Clipboard not cleared Presse-papiers non vidé - + Password and Content hidden Mot de passe et contenu cachés - + QProcess::FailedToStart QProcess::FailedToStart - + QProcess::Crashed QProcess::Crashed - + QProcess::Timedout QProcess::Timedout - + QProcess::ReadError QProcess::ReadError - + QProcess::WriteError QProcess::WriteError - + QProcess::UnknownError QProcess::UnknownError - + Looking for: %1 Recherche de : %1 - - Could not read encryption key to use, .gpg-id file missing or invalid. - Impossible de lire la clé de chiffrement à utiliser, le fichier .gpg-id est manquant ou corrompu. + Impossible de lire la clé de chiffrement à utiliser, le fichier .gpg-id est manquant ou corrompu. - - + + New file Nouveau fichier - + New password file: (Will be placed in %1 ) Enregistrement d'un nouveau mot de passe : (Sera stocké dans %1) - + Delete password? Supprimer le mot de passe ? - - + Are you sure you want to delete %1? Êtes-vous sûr de vouloir supprimer %1 ? - + Delete folder? Supprimer le dossier ? - + Can not get key list Impossible de récupérer la liste de clés - + Unable to get list of available gpg keys Impossible d'obtenir la liste des clés GPG disponibles - + Key not found in keyring Clé introuvable dans le trousseau de clés - Cannot update - Impossible de mettre à jour + Impossible de mettre à jour - Failed to open .gpg-id for writing. - Impossible d'ouvrir .gpg-id en écriture. + Impossible d'ouvrir .gpg-id en écriture. - Check selected users! - Cocher les utilisateurs sélectionnés ! + Cocher les utilisateurs sélectionnés ! - None of the selected keys have a secret key available. You will not be able to decrypt any newly added passwords! - Aucune des clés sélectionnées n'a de clé privée disponible. + Aucune des clés sélectionnées n'a de clé privée disponible. Vous ne serez pas en mesure de déchiffrer les mots de passe nouvellement ajoutés ! - + Generating GPG key pair Génération d'une paire de clés GPG - + Profile changed to %1 Profil changé vers %1 - + Add folder Ajouter un dossier - + Add password Ajouter un mot de passe - + New Folder: (Will be placed in %1 ) Nouveau dossier : (Sera créé dans %1) - + No characters chosen Pas de caractères choisis - + Can't generate password, there are no characters to choose from set in the configuration! Impossible de générer un mot de passe, il n'y a pas de caractères utilisables définis dans la configuration ! - Timed out - Délai expiré + Délai expiré - Can't start process, previous one is still running! - Impossible de démarrer le processus, le précédent est toujours en cours d'exécution ! + Impossible de démarrer le processus, le précédent est toujours en cours d'exécution ! - + Copied to clipboard copié dans le presse-papiers - Re-encrypting from folder %1 - Re-chiffrement depuis le dossier %1 + Re-chiffrement depuis le dossier %1 + + + + Pass + + + Timed out + Délai expiré + + + + Can't start process, previous one is still running! + Impossible de démarrer le processus, le précédent est toujours en cours d'exécution ! diff --git a/localization/localization_fr_LU.ts b/localization/localization_fr_LU.ts index d6bb69448..251c1880d 100644 --- a/localization/localization_fr_LU.ts +++ b/localization/localization_fr_LU.ts @@ -363,6 +363,54 @@ email Le dossier %1 ne semble pas être un magasin de mots de passe ou n'as pas encore été initialisé. + + ImitatePass + + + + Can not edit + Impossible d'éditer + + + + + Could not read encryption key to use, .gpg-id file missing or invalid. + Impossible de lire la clé de chiffrement à utiliser, le fichier .gpg-id est manquant ou corrompu. + + + + Cannot update + Impossible de mettre à jour + + + + Failed to open .gpg-id for writing. + Impossible d'ouvrir .gpg-id en écriture. + + + + Check selected users! + Cocher les utilisateurs sélectionnés ! + + + + None of the selected keys have a secret key available. +You will not be able to decrypt any newly added passwords! + Aucune des clés sélectionnées n'a de clé privée disponible. +Vous ne serez pas en mesure de déchiffrer les mots de passe nouvellement ajoutés ! + + + + Re-encrypting from folder %1 + Re-chiffrement depuis le dossier %1 + + + + + Updating password-store + Mise à jour du magasin de mots de passe + + KeygenDialog @@ -480,14 +528,14 @@ Expire-Date: 0 - + Edit Editer - + Delete Supprimer @@ -518,7 +566,7 @@ Expire-Date: 0 - + Users Utilisateurs @@ -582,265 +630,266 @@ p, li { white-space: pre-wrap; } qtpass - + Welcome to QtPass %1 Bienvenue sur QtPass %1 - + Add Password Ajouter mot de passe - + Add Folder Ajouter dossier - + Failed to connect WebDAV: Impossible de se connecter au WebDAV : - + QtPass WebDAV password Mot de passe WebDAV QtPass - + Enter password to connect to WebDAV: Entrez un mot de passe pour vous connecter au WebDAV : - + fusedav exited unexpectedly fusedav s'est terminé de manière improviste - + Failed to start fusedav to connect WebDAV: Impossible de démarrer fusedav pour se connecter au WebDAV : - - + + Updating password-store Mise à jour du magasin de mots de passe - - - - + + Can not edit Impossible d'éditer - - + + Selected password file does not exist, not able to edit Le fichier de mots de passe sélectionné n'existe pas, impossible de le modifier - + Password hidden Mot de passe caché - + Content hidden Contenu caché - - + + Password Mot de passe - + Clipboard cleared Presse-papiers vidé - + Clipboard not cleared Presse-papiers non vidé - + Password and Content hidden Mot de passe et contenu cachés - + QProcess::FailedToStart QProcess::FailedToStart - + QProcess::Crashed QProcess::Crashed - + QProcess::Timedout QProcess::Timedout - + QProcess::ReadError QProcess::ReadError - + QProcess::WriteError QProcess::WriteError - + QProcess::UnknownError QProcess::UnknownError - + Looking for: %1 Recherche de : %1 - - Could not read encryption key to use, .gpg-id file missing or invalid. - Impossible de lire la clé de chiffrement à utiliser, le fichier .gpg-id est manquant ou corrompu. + Impossible de lire la clé de chiffrement à utiliser, le fichier .gpg-id est manquant ou corrompu. - - + + New file Nouveau fichier - + New password file: (Will be placed in %1 ) Enregistrement d'un nouveau mot de passe : (Sera stocké dans %1) - + Delete password? Supprimer le mot de passe ? - - + Are you sure you want to delete %1? Êtes-vous sûr de vouloir supprimer %1 ? - + Delete folder? Supprimer le dossier ? - + Can not get key list Impossible de récupérer la liste de clés - + Unable to get list of available gpg keys Impossible d'obtenir la liste des clés GPG disponibles - + Key not found in keyring Clé introuvable dans le trousseau de clés - Cannot update - Impossible de mettre à jour + Impossible de mettre à jour - Failed to open .gpg-id for writing. - Impossible d'ouvrir .gpg-id en écriture. + Impossible d'ouvrir .gpg-id en écriture. - Check selected users! - Cocher les utilisateurs sélectionnés ! + Cocher les utilisateurs sélectionnés ! - None of the selected keys have a secret key available. You will not be able to decrypt any newly added passwords! - Aucune des clés sélectionnées n'a de clé privée disponible. + Aucune des clés sélectionnées n'a de clé privée disponible. Vous ne serez pas en mesure de déchiffrer les mots de passe nouvellement ajoutés ! - + Generating GPG key pair Génération d'une paire de clés GPG - + Profile changed to %1 Profil changé vers %1 - + Add folder Ajouter un dossier - + Add password Ajouter un mot de passe - + New Folder: (Will be placed in %1 ) Nouveau dossier : (Sera créé dans %1) - + No characters chosen Pas de caractères choisis - + Can't generate password, there are no characters to choose from set in the configuration! Impossible de générer un mot de passe, il n'y a pas de caractères utilisables définis dans la configuration ! - Timed out - Délai expiré + Délai expiré - Can't start process, previous one is still running! - Impossible de démarrer le processus, le précédent est toujours en cours d'exécution ! + Impossible de démarrer le processus, le précédent est toujours en cours d'exécution ! - + Copied to clipboard copié dans le presse-papiers - Re-encrypting from folder %1 - Re-chiffrement depuis le dossier %1 + Re-chiffrement depuis le dossier %1 + + + + Pass + + + Timed out + Délai expiré + + + + Can't start process, previous one is still running! + Impossible de démarrer le processus, le précédent est toujours en cours d'exécution ! diff --git a/localization/localization_gl_ES.ts b/localization/localization_gl_ES.ts index f0805b301..1b7df716b 100644 --- a/localization/localization_gl_ES.ts +++ b/localization/localization_gl_ES.ts @@ -361,6 +361,53 @@ email + + 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 + Actualizando password-store + + KeygenDialog @@ -464,14 +511,14 @@ Expire-Date: 0 - + Edit - + Delete Eliminar @@ -502,7 +549,7 @@ Expire-Date: 0 - + Users @@ -544,258 +591,226 @@ p, li { white-space: pre-wrap; } qtpass - - + + Updating password-store Actualizando password-store - + Clipboard cleared Portapapeis baleiro - + New Folder: (Will be placed in %1 ) - + Failed to connect WebDAV: - + Welcome to QtPass %1 - + Add Password - + Add Folder - + QtPass WebDAV password - + Enter password to connect to WebDAV: - + fusedav exited unexpectedly - + Failed to start fusedav to connect WebDAV: - + Password hidden - + Content hidden Contido oculto - - + + Password - + Clipboard not cleared - + Password and Content hidden - + QProcess::FailedToStart QProcess::Fallou o inicio - + QProcess::Crashed QProcess::Rompeu - + QProcess::Timedout QProcess::Caducou - + QProcess::ReadError QProcess::Erro de lectura - + QProcess::WriteError QProcess::Erro de escritura - + QProcess::UnknownError QProcess::Erro descoñecido - + Add folder - + Add password - + No characters chosen - + Can't generate password, there are no characters to choose from set in the configuration! - - Timed out - - - - - Can't start process, previous one is still running! - - - - + Copied to clipboard copiado en el portapapeles - - Re-encrypting from folder %1 - - - - + Looking for: %1 - - - - + + Can not edit - - - Could not read encryption key to use, .gpg-id file missing or invalid. - - - - - + + New file - + Delete password? - - + Are you sure you want to delete %1? - + Delete folder? - - + + Selected password file does not exist, not able to edit - + New password file: (Will be placed in %1 ) - + Can not get key list - + Unable to get list of available gpg keys - + Key not found in keyring - - Cannot update - - - - - Failed to open .gpg-id for writing. - - - - - Check selected users! + + Generating GPG key pair - - None of the selected keys have a secret key available. -You will not be able to decrypt any newly added passwords! + + Profile changed to %1 + + + Pass - - Generating GPG key pair + + Timed out - - Profile changed to %1 + + Can't start process, previous one is still running! diff --git a/localization/localization_he_IL.ts b/localization/localization_he_IL.ts index 2174529f2..fe9b9d620 100644 --- a/localization/localization_he_IL.ts +++ b/localization/localization_he_IL.ts @@ -361,6 +361,53 @@ email + + 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 @@ -464,14 +511,14 @@ Expire-Date: 0 - + Edit - + Delete @@ -502,7 +549,7 @@ Expire-Date: 0 - + Users @@ -544,258 +591,226 @@ p, li { white-space: pre-wrap; } - + Failed to connect WebDAV: - + QtPass WebDAV password - + Enter password to connect to WebDAV: - + fusedav exited unexpectedly - + Failed to start fusedav to connect WebDAV: - - + + Updating password-store - + New Folder: (Will be placed in %1 ) - + Password hidden - + Add Password - + Add Folder - + Content hidden - + Clipboard cleared - + Clipboard not cleared - + Password and Content hidden - + QProcess::FailedToStart - + QProcess::Crashed - + QProcess::Timedout - + QProcess::ReadError - + QProcess::WriteError - + QProcess::UnknownError - + Looking for: %1 - - - - + + Can not edit - - - Could not read encryption key to use, .gpg-id file missing or invalid. - - - - - + + New file - + Delete password? - - + Are you sure you want to delete %1? - + Delete folder? - - + + Selected password file does not exist, not able to edit - + Welcome to QtPass %1 - - + + Password - + New password file: (Will be placed in %1 ) - + Can not get key list - + Unable to get list of available gpg keys - + Key not found in keyring - - 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! - - - - + Generating GPG key pair - + Profile changed to %1 - + Add folder - + Add password - + No characters chosen - + Can't generate password, there are no characters to choose from set in the configuration! - - Timed out - - - - - Can't start process, previous one is still running! + + Copied to clipboard + + + Pass - - Copied to clipboard + + Timed out - - Re-encrypting from folder %1 + + Can't start process, previous one is still running! diff --git a/localization/localization_hu_HU.ts b/localization/localization_hu_HU.ts index ab5936a58..47b5e92c8 100644 --- a/localization/localization_hu_HU.ts +++ b/localization/localization_hu_HU.ts @@ -361,6 +361,53 @@ email + + 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 + Jelszó-tároló frissítése + + KeygenDialog @@ -464,14 +511,14 @@ Expire-Date: 0 - + Edit - + Delete @@ -502,7 +549,7 @@ Expire-Date: 0 - + Users @@ -544,258 +591,226 @@ p, li { white-space: pre-wrap; } qtpass - - + + Updating password-store Jelszó-tároló frissítése - + Clipboard cleared Vágólap tiszta - + New Folder: (Will be placed in %1 ) - + Failed to connect WebDAV: - + Welcome to QtPass %1 - + Add Password - + Add Folder - + QtPass WebDAV password - + Enter password to connect to WebDAV: - + fusedav exited unexpectedly - + Failed to start fusedav to connect WebDAV: - + Password hidden - + Content hidden Oldal elrejtve - - + + Password - + Clipboard not cleared - + Password and Content hidden - + QProcess::FailedToStart QProcess:NemIndultEl - + QProcess::Crashed QProcess:Összeomlás - + QProcess::Timedout QProcess:Időtúllépés - + QProcess::ReadError QProcess:OlvasásiHiba - + QProcess::WriteError IrásHiba - + QProcess::UnknownError IsmeretlenHiba - + Add folder - + Add password - + No characters chosen - + Can't generate password, there are no characters to choose from set in the configuration! - - Timed out - - - - - Can't start process, previous one is still running! - - - - + Copied to clipboard a vágólapra másolt - - Re-encrypting from folder %1 - - - - + Looking for: %1 - - - - + + Can not edit - - - Could not read encryption key to use, .gpg-id file missing or invalid. - - - - - + + New file - + Delete password? - - + Are you sure you want to delete %1? - + Delete folder? - - + + Selected password file does not exist, not able to edit - + New password file: (Will be placed in %1 ) - + Can not get key list - + Unable to get list of available gpg keys - + Key not found in keyring - - Cannot update - - - - - Failed to open .gpg-id for writing. - - - - - Check selected users! + + Generating GPG key pair - - None of the selected keys have a secret key available. -You will not be able to decrypt any newly added passwords! + + Profile changed to %1 + + + Pass - - Generating GPG key pair + + Timed out - - Profile changed to %1 + + Can't start process, previous one is still running! diff --git a/localization/localization_it_IT.ts b/localization/localization_it_IT.ts index cc982e559..010f12211 100644 --- a/localization/localization_it_IT.ts +++ b/localization/localization_it_IT.ts @@ -361,6 +361,54 @@ email La cartella %1 non sembra essere un archivio password, oppure non è inizializzata corretamente. + + ImitatePass + + + + Can not edit + Impossibile modificare + + + + + Could not read encryption key to use, .gpg-id file missing or invalid. + Impossibile leggere la chiave di criptazione da utilizzare, il file .gpg-id è mancante o non valido. + + + + Cannot update + Impossibile aggiornare + + + + Failed to open .gpg-id for writing. + Impossibile aprire .gpg-id in scrittura. + + + + Check selected users! + Controlla gli utenti selezionati! + + + + None of the selected keys have a secret key available. +You will not be able to decrypt any newly added passwords! + Nessuna delle chiavi selezionate ha una chiave privata disponibile. +Non sarai in grado di decifrare nessuna delle nuove password create! + + + + Re-encrypting from folder %1 + Esegui nuovamente la cifratura dalla cartella %1 + + + + + Updating password-store + Aggiornando password-store + + KeygenDialog @@ -464,14 +512,14 @@ Expire-Date: 0 - + Edit Modifica - + Delete Elimina @@ -502,7 +550,7 @@ Expire-Date: 0 - + Users Utenti @@ -566,262 +614,263 @@ p, li { white-space: pre-wrap; } <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:'Helvetica Neue,Helvetica,Segoe UI,Arial,freesans,sans-serif'; font-size:13pt; text-decoration: underline; color:#4183c4; background-color:transparent;">Codice sorgente</span></a></p></body></html> - + Welcome to QtPass %1 Benvenuto in QtPass %1 - + Add Password Aggiungi Password - + Add Folder Aggiungi Cartella - + Failed to connect WebDAV: Impossibile connettersi a WebDAV - + QtPass WebDAV password - + Enter password to connect to WebDAV: Inserisci la password per connetersi a WebDAV: - + fusedav exited unexpectedly fusedav si è chiuso in modo anomalo - + Failed to start fusedav to connect WebDAV: Impossibile connettere fusedav a WebDAV - - + + Updating password-store Aggiornando password-store - - - - + + Can not edit Impossibile modificare - - + + Selected password file does not exist, not able to edit Il file password selezionato non esiste o non è modificabile - + Password hidden Password nascosta - + Content hidden Contenuto nascosto - - + + Password - + Clipboard cleared Appunti svuotati - + Clipboard not cleared Appunti non svuotati - + Password and Content hidden Password e Contenuto nascosti - + QProcess::FailedToStart - + QProcess::Crashed - + QProcess::Timedout - + QProcess::ReadError - + QProcess::WriteError - + QProcess::UnknownError - + Looking for: %1 Cercando: %1 - - Could not read encryption key to use, .gpg-id file missing or invalid. - Impossibile leggere la chiave di criptazione da utilizzare, il file .gpg-id è mancante o non valido. + Impossibile leggere la chiave di criptazione da utilizzare, il file .gpg-id è mancante o non valido. - - + + New file Nuovo file - + New password file: (Will be placed in %1 ) Nuovo file password: (Verrà posizionato in %1 ) - + Delete password? Eliminare password? - - + Are you sure you want to delete %1? Sei sicuro di voler eliminare %1? - + Delete folder? Eliminare cartella? - + Can not get key list Impossibile ottenere la lista delle chiavi - + Unable to get list of available gpg keys Impossibile ottenere la lista delle chiavi gpg disponibili - + Key not found in keyring Chiave non trovata nel portachiavi - Cannot update - Impossibile aggiornare + Impossibile aggiornare - Failed to open .gpg-id for writing. - Impossibile aprire .gpg-id in scrittura. + Impossibile aprire .gpg-id in scrittura. - Check selected users! - Controlla gli utenti selezionati! + Controlla gli utenti selezionati! - None of the selected keys have a secret key available. You will not be able to decrypt any newly added passwords! - Nessuna delle chiavi selezionate ha una chiave privata disponibile. + Nessuna delle chiavi selezionate ha una chiave privata disponibile. Non sarai in grado di decifrare nessuna delle nuove password create! - + Generating GPG key pair Generando una coppia di chiavi GPG - + Profile changed to %1 Profilo cambiato in %1 - + Add folder Aggiungi cartella - + Add password Aggiungi password - + New Folder: (Will be placed in %1 ) Nuova cartella: (Verrà posizionata in %1 ) - + No characters chosen Nessun carattere selezionato - + Can't generate password, there are no characters to choose from set in the configuration! Impossibile generare una password, non ci sono caratteri dai quali scegliere. Cotrolla nella finestra di configurazione! - Timed out - Tempo scaduto + Tempo scaduto - Can't start process, previous one is still running! - Impossibile avviare la procedura, un altro processo è ancora attivo + Impossibile avviare la procedura, un altro processo è ancora attivo - + Copied to clipboard copiato negli appunti - Re-encrypting from folder %1 - Esegui nuovamente la cifratura dalla cartella %1 + Esegui nuovamente la cifratura dalla cartella %1 + + + + Pass + + + Timed out + Tempo scaduto + + + + Can't start process, previous one is still running! + Impossibile avviare la procedura, un altro processo è ancora attivo diff --git a/localization/localization_lb_LU.ts b/localization/localization_lb_LU.ts index 4367065b6..237dc23fd 100644 --- a/localization/localization_lb_LU.ts +++ b/localization/localization_lb_LU.ts @@ -361,6 +361,53 @@ email + + 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 @@ -464,14 +511,14 @@ Expire-Date: 0 - + Edit - + Delete @@ -502,7 +549,7 @@ Expire-Date: 0 - + Users @@ -544,258 +591,226 @@ p, li { white-space: pre-wrap; } - + Welcome to QtPass %1 - + Add Password - + Add Folder - + Failed to connect WebDAV: - + QtPass WebDAV password - + Enter password to connect to WebDAV: - + fusedav exited unexpectedly - + Failed to start fusedav to connect WebDAV: - - + + Updating password-store - - - - + + Can not edit - - + + Selected password file does not exist, not able to edit - + Password hidden - + Content hidden - - + + Password - + Clipboard cleared - + Clipboard not cleared - + Password and Content hidden - + QProcess::FailedToStart - + QProcess::Crashed - + QProcess::Timedout - + QProcess::ReadError - + QProcess::WriteError - + QProcess::UnknownError - + Looking for: %1 - - - Could not read encryption key to use, .gpg-id file missing or invalid. - - - - - + + New file - + New password file: (Will be placed in %1 ) - + Delete password? - - + Are you sure you want to delete %1? - + Delete folder? - + Can not get key list - + Unable to get list of available gpg keys - + Key not found in keyring - - 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! - - - - + Generating GPG key pair - + Profile changed to %1 - + Add folder - + Add password - + New Folder: (Will be placed in %1 ) - + No characters chosen - + Can't generate password, there are no characters to choose from set in the configuration! - - Timed out - - - - - Can't start process, previous one is still running! + + Copied to clipboard + + + Pass - - Copied to clipboard + + Timed out - - Re-encrypting from folder %1 + + Can't start process, previous one is still running! diff --git a/localization/localization_nl_BE.ts b/localization/localization_nl_BE.ts index 95f23d68d..f54fdcdc5 100644 --- a/localization/localization_nl_BE.ts +++ b/localization/localization_nl_BE.ts @@ -363,6 +363,54 @@ email De map %1 lijkt geen password store te zijn of is nog niet geïnitialiseerd. + + ImitatePass + + + + Can not edit + Kan niet bewerken + + + + + Could not read encryption key to use, .gpg-id file missing or invalid. + Geen idee waarvoor ik moet versleutelen, .gpg-id bestand mist of bevat onzin. + + + + Cannot update + Kan niet updaten + + + + Failed to open .gpg-id for writing. + Kon .gpg-id bestand niet openen om te schrijven. + + + + Check selected users! + Kontroleer geselecteerde gebruikers! + + + + None of the selected keys have a secret key available. +You will not be able to decrypt any newly added passwords! + Geen van de geselecteerde keys hebben een secret key beschikbaar. +Je kan nieuw toegevoegde wachtwoorden niet lezen! + + + + Re-encrypting from folder %1 + Her-encrypten vanaf map %1 + + + + + Updating password-store + Vernieuwen password-store + + KeygenDialog @@ -480,14 +528,14 @@ Expire-Date: 0 - + Edit Bewerken - + Delete Verwijderen @@ -518,7 +566,7 @@ Expire-Date: 0 - + Users Gebruikers @@ -607,264 +655,265 @@ p, li { white-space: pre-wrap; } qtpass - + Welcome to QtPass %1 Welkom bij QtPass %1 - + Add Password Voeg wachtwoord toe - + Add Folder Voeg map toe - + Failed to connect WebDAV: Verbinding mislukt met WebDAV: - + QtPass WebDAV password QtPass WebDAV wachtwoord - + Enter password to connect to WebDAV: Voer wachtwoord in om te verbinden met WebDAV: - + fusedav exited unexpectedly fusedav is stuk, hield er zomaar mee op - + Failed to start fusedav to connect WebDAV: Kon fusedav niet verbinden met WebDAV: - - + + Updating password-store Vernieuwen password-store - - - - + + Can not edit Kan niet bewerken - - + + Selected password file does not exist, not able to edit Geselecteerde wachtwoord bestand bestaat niet, kan niet bewerken - + Password hidden Wachtwoord verborgen - + Content hidden Inhoud verborgen - - + + Password Wachtwoord - + Clipboard cleared Klembord gewist - + Clipboard not cleared Klembord niet leeg gemaakt aangezien er geen wachtwoord in stond - + Password and Content hidden Wachtwoord en inhoud verborgen - + QProcess::FailedToStart Proces kon niet worden gestart - + QProcess::Crashed Proces is gecrashed - + QProcess::Timedout Proces duurde te lang - + QProcess::ReadError Lees fout met proces - + QProcess::WriteError Kan niet schrijven naar proces - + QProcess::UnknownError Er ging iets raars mis met proces - + Looking for: %1 Op zoek naar: %1 - - Could not read encryption key to use, .gpg-id file missing or invalid. - Geen idee waarvoor ik moet versleutelen, .gpg-id bestand mist of bevat onzin. + Geen idee waarvoor ik moet versleutelen, .gpg-id bestand mist of bevat onzin. - - + + New file Nieuw bestand - + New password file: (Will be placed in %1 ) Nieuw wachtwoord bestand: (Wordt geplaatst in %1 ) - + Delete password? Verwijder wachtwoord? - - + Are you sure you want to delete %1? Weet je zeker dat je %1 wil verwijderen? - + Delete folder? Verwijder map? - + Can not get key list Kan sleutel lijst niet verkrijgen - + Unable to get list of available gpg keys Kan lijst van beschikbare gpg sleutels niet opvragen - + Key not found in keyring Sleutel niet gevonden in keyring - Cannot update - Kan niet updaten + Kan niet updaten - Failed to open .gpg-id for writing. - Kon .gpg-id bestand niet openen om te schrijven. + Kon .gpg-id bestand niet openen om te schrijven. - Check selected users! - Kontroleer geselecteerde gebruikers! + Kontroleer geselecteerde gebruikers! - None of the selected keys have a secret key available. You will not be able to decrypt any newly added passwords! - Geen van de geselecteerde keys hebben een secret key beschikbaar. + Geen van de geselecteerde keys hebben een secret key beschikbaar. Je kan nieuw toegevoegde wachtwoorden niet lezen! - + Generating GPG key pair Nieuw GPG sleutelpaar genereren - + Profile changed to %1 Profiel veranderd naar %1 - + Add folder Voeg map toe - + Add password Voeg wachtwoord toe - + New Folder: (Will be placed in %1 ) Nieuwe map: (Wordt geplaatst in %1 ) - + No characters chosen Geen karakters gekozen - + Can't generate password, there are no characters to choose from set in the configuration! Kan wachtwoord niet genereren, er zijn geen karakters gekozen in de configuratie! - Timed out - Duurt te lang + Duurt te lang - Can't start process, previous one is still running! - Kan process niet starten, vorige loopt nog steeds! + Kan process niet starten, vorige loopt nog steeds! - + Copied to clipboard gekopieerd naar het klembord - Re-encrypting from folder %1 - Her-encrypten vanaf map %1 + Her-encrypten vanaf map %1 + + + + Pass + + + Timed out + Duurt te lang + + + + Can't start process, previous one is still running! + Kan process niet starten, vorige loopt nog steeds! diff --git a/localization/localization_nl_NL.ts b/localization/localization_nl_NL.ts index 9d1043538..36f5590c3 100644 --- a/localization/localization_nl_NL.ts +++ b/localization/localization_nl_NL.ts @@ -363,6 +363,54 @@ email De map %1 lijkt geen password store te zijn of is nog niet geïnitialiseerd. + + ImitatePass + + + + Can not edit + Kan niet bewerken + + + + + Could not read encryption key to use, .gpg-id file missing or invalid. + Geen idee waarvoor ik moet versleutelen, .gpg-id bestand mist of bevat onzin. + + + + Cannot update + Kan niet updaten + + + + Failed to open .gpg-id for writing. + Kon .gpg-id bestand niet openen om te schrijven. + + + + Check selected users! + Kontroleer geselecteerde gebruikers! + + + + None of the selected keys have a secret key available. +You will not be able to decrypt any newly added passwords! + Geen van de geselecteerde keys hebben een secret key beschikbaar. +Je kan nieuw toegevoegde wachtwoorden niet lezen! + + + + Re-encrypting from folder %1 + Her-encrypten vanaf map %1 + + + + + Updating password-store + Vernieuwen password-store + + KeygenDialog @@ -480,14 +528,14 @@ Expire-Date: 0 - + Edit Bewerken - + Delete Verwijderen @@ -518,7 +566,7 @@ Expire-Date: 0 - + Users Gebruikers @@ -607,264 +655,265 @@ p, li { white-space: pre-wrap; } qtpass - + Welcome to QtPass %1 Welkom bij QtPass %1 - + Add Password Voeg wachtwoord toe - + Add Folder Voeg map toe - + Failed to connect WebDAV: Verbinding mislukt met WebDAV: - + QtPass WebDAV password QtPass WebDAV wachtwoord - + Enter password to connect to WebDAV: Voer wachtwoord in om te verbinden met WebDAV: - + fusedav exited unexpectedly fusedav is stuk, hield er zomaar mee op - + Failed to start fusedav to connect WebDAV: Kon fusedav niet verbinden met WebDAV: - - + + Updating password-store Vernieuwen password-store - - - - + + Can not edit Kan niet bewerken - - + + Selected password file does not exist, not able to edit Geselecteerde wachtwoord bestand bestaat niet, kan niet bewerken - + Password hidden Wachtwoord verborgen - + Content hidden Inhoud verborgen - - + + Password Wachtwoord - + Clipboard cleared Klembord gewist - + Clipboard not cleared Klembord niet leeg gemaakt aangezien er geen wachtwoord in stond - + Password and Content hidden Wachtwoord en inhoud verborgen - + QProcess::FailedToStart Proces kon niet worden gestart - + QProcess::Crashed Proces is gecrashed - + QProcess::Timedout Proces duurde te lang - + QProcess::ReadError Lees fout met proces - + QProcess::WriteError Kan niet schrijven naar proces - + QProcess::UnknownError Er ging iets raars mis met proces - + Looking for: %1 Op zoek naar: %1 - - Could not read encryption key to use, .gpg-id file missing or invalid. - Geen idee waarvoor ik moet versleutelen, .gpg-id bestand mist of bevat onzin. + Geen idee waarvoor ik moet versleutelen, .gpg-id bestand mist of bevat onzin. - - + + New file Nieuw bestand - + New password file: (Will be placed in %1 ) Nieuw wachtwoord bestand: (Wordt geplaatst in %1 ) - + Delete password? Verwijder wachtwoord? - - + Are you sure you want to delete %1? Weet je zeker dat je %1 wil verwijderen? - + Delete folder? Verwijder map? - + Can not get key list Kan sleutel lijst niet verkrijgen - + Unable to get list of available gpg keys Kan lijst van beschikbare gpg sleutels niet opvragen - + Key not found in keyring Sleutel niet gevonden in keyring - Cannot update - Kan niet updaten + Kan niet updaten - Failed to open .gpg-id for writing. - Kon .gpg-id bestand niet openen om te schrijven. + Kon .gpg-id bestand niet openen om te schrijven. - Check selected users! - Kontroleer geselecteerde gebruikers! + Kontroleer geselecteerde gebruikers! - None of the selected keys have a secret key available. You will not be able to decrypt any newly added passwords! - Geen van de geselecteerde keys hebben een secret key beschikbaar. + Geen van de geselecteerde keys hebben een secret key beschikbaar. Je kan nieuw toegevoegde wachtwoorden niet lezen! - + Generating GPG key pair Nieuw GPG sleutelpaar genereren - + Profile changed to %1 Profiel veranderd naar %1 - + Add folder Voeg map toe - + Add password Voeg wachtwoord toe - + New Folder: (Will be placed in %1 ) Nieuwe map: (Wordt geplaatst in %1 ) - + No characters chosen Geen karakters gekozen - + Can't generate password, there are no characters to choose from set in the configuration! Kan wachtwoord niet genereren, er zijn geen karakters gekozen in de configuratie! - Timed out - Duurt te lang + Duurt te lang - Can't start process, previous one is still running! - Kan process niet starten, vorige loopt nog steeds! + Kan process niet starten, vorige loopt nog steeds! - + Copied to clipboard gekopieerd naar het klembord - Re-encrypting from folder %1 - Her-encrypten vanaf map %1 + Her-encrypten vanaf map %1 + + + + Pass + + + Timed out + Duurt te lang + + + + Can't start process, previous one is still running! + Kan process niet starten, vorige loopt nog steeds! diff --git a/localization/localization_pl_PL.ts b/localization/localization_pl_PL.ts index c6cd37b76..e74991071 100644 --- a/localization/localization_pl_PL.ts +++ b/localization/localization_pl_PL.ts @@ -361,6 +361,53 @@ email + + 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 @@ -464,14 +511,14 @@ Expire-Date: 0 - + Edit - + Delete @@ -502,7 +549,7 @@ Expire-Date: 0 - + Users @@ -544,258 +591,226 @@ p, li { white-space: pre-wrap; } - - + + Updating password-store - + Clipboard cleared - + New Folder: (Will be placed in %1 ) - + Failed to connect WebDAV: - + Welcome to QtPass %1 - + Add Password - + Add Folder - + QtPass WebDAV password - + Enter password to connect to WebDAV: - + fusedav exited unexpectedly - + Failed to start fusedav to connect WebDAV: - + Password hidden - + Content hidden - - + + Password - + Clipboard not cleared - + Password and Content hidden - + QProcess::FailedToStart - + QProcess::Crashed - + QProcess::Timedout - + QProcess::ReadError - + QProcess::WriteError - + QProcess::UnknownError - + Add folder - + Add password - + No characters chosen - + Can't generate password, there are no characters to choose from set in the configuration! - - Timed out - - - - - Can't start process, previous one is still running! - - - - + Copied to clipboard skopiowany do schowka - - Re-encrypting from folder %1 - - - - + Looking for: %1 - - - - + + Can not edit - - - Could not read encryption key to use, .gpg-id file missing or invalid. - - - - - + + New file - + Delete password? - - + Are you sure you want to delete %1? - + Delete folder? - - + + Selected password file does not exist, not able to edit - + New password file: (Will be placed in %1 ) - + Can not get key list - + Unable to get list of available gpg keys - + Key not found in keyring - - Cannot update - - - - - Failed to open .gpg-id for writing. - - - - - Check selected users! + + Generating GPG key pair - - None of the selected keys have a secret key available. -You will not be able to decrypt any newly added passwords! + + Profile changed to %1 + + + Pass - - Generating GPG key pair + + Timed out - - Profile changed to %1 + + Can't start process, previous one is still running! diff --git a/localization/localization_ru_RU.ts b/localization/localization_ru_RU.ts index 7de38d6ef..23dac2725 100644 --- a/localization/localization_ru_RU.ts +++ b/localization/localization_ru_RU.ts @@ -364,6 +364,54 @@ email Не выбран ни один профиль для удаления + + ImitatePass + + + + Can not edit + Невозможно изменить содержимое + + + + + Could not read encryption key to use, .gpg-id file missing or invalid. + Не удалось прочитать ключ шифрования: .gpg-id файл не существует или повреждён. + + + + Cannot update + Не удалось обновить + + + + Failed to open .gpg-id for writing. + Не получилось записать .gpg-id файла. + + + + 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 + Перешифровании из папки %1 + + + + + Updating password-store + Обновление password-store + + KeygenDialog @@ -491,14 +539,14 @@ Expire-Date: 0 - + Edit Изменить - + Delete Удалить @@ -519,7 +567,7 @@ Expire-Date: 0 - + Users Пользователи @@ -583,265 +631,266 @@ p, li { white-space: pre-wrap; } qtpass - + Welcome to QtPass %1 QtPass %1 приветствует Вас - + Failed to connect WebDAV: Не удалось подключить WebDAV: - + QtPass WebDAV password Пароль QtPass для WebDAV - + Enter password to connect to WebDAV: Введите пароль для подключения к WebDAV: - + fusedav exited unexpectedly fusedav непредвиденно завершился - + Failed to start fusedav to connect WebDAV: Не удалось запустить fusedav для подключения к WebDAV: - - + + Updating password-store Обновление password-store - + New Folder: (Will be placed in %1 ) Новая папка: (будет добавлена в %1) - + Password hidden Пароль скрыт - + Add Password Добавить пароль - + Add Folder Добавить папку - + Content hidden Содержимое скрыто - - + + Password Пароль - + Clipboard cleared Буфер обмена очищен - + Clipboard not cleared Буфер обмена не очищен - + Password and Content hidden Пароль и содержимое скрыто - + QProcess::FailedToStart QProsess::Не удалось запустить - + QProcess::Crashed QProsess::Аварийное завершение - + QProcess::Timedout QProsess::Превышено время ожидания - + QProcess::ReadError QProsess::Ошибка чтения - + QProcess::WriteError QProsess::Ошибка записи - + QProcess::UnknownError QProsess::Неизвестная ошибка - + Looking for: %1 Ищем: %1 - + Delete folder? Удалить папку? - + Generating GPG key pair Генерирую ключевую пару GPG - + Profile changed to %1 Профиль изменён на %1 - + Add folder Добавить папку - + Add password Добавить пароль - + No characters chosen Ни одного символа не выбрано - + Can't generate password, there are no characters to choose from set in the configuration! Не могу сгенерировать пароль: набор допустимых символов задан пустым в Настройках! - Timed out - Время ожидания истекло + Время ожидания истекло - Can't start process, previous one is still running! - Не могу запустить процесс, предыдущий всё ещё не завершился! + Не могу запустить процесс, предыдущий всё ещё не завершился! - + Copied to clipboard скопировать в буфер обмена - Re-encrypting from folder %1 - Перешифровании из папки %1 + Перешифровании из папки %1 - - - - + + Can not edit Невозможно изменить содержимое - - Could not read encryption key to use, .gpg-id file missing or invalid. - Не удалось прочитать ключ шифрования: .gpg-id файл не существует или повреждён. + Не удалось прочитать ключ шифрования: .gpg-id файл не существует или повреждён. - + New password file: (Will be placed in %1 ) Новый файл для пароля: (будет создан в %1 ) - + Can not get key list Не удалось получить список ключей - + Unable to get list of available gpg keys Не удалось получить список доступных ключей GPG - + Key not found in keyring Ключ не найден в хранилище ключей GPG - Cannot update - Не удалось обновить + Не удалось обновить - Failed to open .gpg-id for writing. - Не получилось записать .gpg-id файла. + Не получилось записать .gpg-id файла. - Check selected users! - Отметьте выбранных пользователей! + Отметьте выбранных пользователей! - None of the selected keys have a secret key available. You will not be able to decrypt any newly added passwords! - Ни один из выбранных ключей не имеет секретного ключа. + Ни один из выбранных ключей не имеет секретного ключа. Вы не сможете расшифровать ни один вновь добавленный пароль! - - + + New file Новый файл - + Delete password? Удалить пароль? - - + Are you sure you want to delete %1? Вы в самом деле хотите удалить %1? - - + + Selected password file does not exist, not able to edit Выбранный файл с паролем не существует + + Pass + + + Timed out + Время ожидания истекло + + + + Can't start process, previous one is still running! + Не могу запустить процесс, предыдущий всё ещё не завершился! + + PasswordDialog diff --git a/localization/localization_sv_SE.ts b/localization/localization_sv_SE.ts index 88d5ca10b..2c9b09799 100644 --- a/localization/localization_sv_SE.ts +++ b/localization/localization_sv_SE.ts @@ -361,6 +361,54 @@ email Ingen profil vald att tas bort + + ImitatePass + + + + Can not edit + Kan inte ändra + + + + + Could not read encryption key to use, .gpg-id file missing or invalid. + Kunde inte läsa krypteringsnyckel, .gpg-id fil saknas eller är ogiltig. + + + + Cannot update + Kan inte uppdatera + + + + Failed to open .gpg-id for writing. + Kunde inte skriva till .gpg-id. + + + + Check selected users! + Kolla valda användare! + + + + None of the selected keys have a secret key available. +You will not be able to decrypt any newly added passwords! + Ingen av de valda nycklarna har en tillgänglig hemlig nyckel. +Du kommer inte att kunna avkryptera några nyligen tillagda lösenord! + + + + Re-encrypting from folder %1 + + + + + + Updating password-store + Uppdaterar lösenordsutrymmet + + KeygenDialog @@ -465,14 +513,14 @@ Expire-Date: 0 - + Edit Ändra - + Delete Ta bort @@ -503,7 +551,7 @@ Expire-Date: 0 - + Users Användare @@ -545,262 +593,259 @@ p, li { white-space: pre-wrap; } qtpass - - + + Updating password-store Uppdaterar lösenordsutrymmet - + Clipboard cleared Urklippet rensat - + New Folder: (Will be placed in %1 ) - + Failed to connect WebDAV: Kunde inte ansluta till WebDAV: - + Add Password - + Add Folder - + QtPass WebDAV password QtPass WebDAV lösenord - + Enter password to connect to WebDAV: Mata in WebDAV lösenord: - + fusedav exited unexpectedly fusedav avslutades oväntat - + Failed to start fusedav to connect WebDAV: Kunde inte starta fusedav för att ansluta till WebDAV: - + Password hidden Gömt lösenord - + Content hidden Gömt innehåll - - + + Password Lösenord - + Clipboard not cleared Urklippet ej rensat - + Password and Content hidden Gömt lösenord och innehåll - + QProcess::FailedToStart - + QProcess::Crashed - + QProcess::Timedout - + QProcess::ReadError - + QProcess::WriteError - + QProcess::UnknownError - + Copied to clipboard kopieras till Urklipp - - Re-encrypting from folder %1 - - - - + Add folder Lägg till mapp - + Add password Lägg till lösenord - + No characters chosen Inga valda tecken - + Can't generate password, there are no characters to choose from set in the configuration! Kan inte skapa lösenord. Konfigurationen saknar tecken att välja från! - Timed out - Tajmade ut + Tajmade ut - Can't start process, previous one is still running! - Kan inte starta process, den förra körs fortfarande! + Kan inte starta process, den förra körs fortfarande! - + Welcome to QtPass %1 Välkommen till QtPass %1 - + Looking for: %1 Söker efter: %1 - - - - + + Can not edit Kan inte ändra - - Could not read encryption key to use, .gpg-id file missing or invalid. - Kunde inte läsa krypteringsnyckel, .gpg-id fil saknas eller är ogiltig. + Kunde inte läsa krypteringsnyckel, .gpg-id fil saknas eller är ogiltig. - - + + New file Ny fil - + Delete password? Ta bort lösenord? - - + Are you sure you want to delete %1? Vill du verkligen ta bort %1? - + Delete folder? Ta bort mapp? - - + + Selected password file does not exist, not able to edit Kan inte ändra då vald lösenordsfil inte finns - + New password file: (Will be placed in %1 ) - + Can not get key list Kan inte hämta nyckellista - + Unable to get list of available gpg keys Kunde inte hämta gpgnycklar - + Key not found in keyring Kunde inte hitta nyckel i nyckelring - Cannot update - Kan inte uppdatera + Kan inte uppdatera - Failed to open .gpg-id for writing. - Kunde inte skriva till .gpg-id. + Kunde inte skriva till .gpg-id. - Check selected users! - Kolla valda användare! + Kolla valda användare! - None of the selected keys have a secret key available. You will not be able to decrypt any newly added passwords! - Ingen av de valda nycklarna har en tillgänglig hemlig nyckel. + Ingen av de valda nycklarna har en tillgänglig hemlig nyckel. Du kommer inte att kunna avkryptera några nyligen tillagda lösenord! - + Generating GPG key pair Skapar GPG nyckelpar - + Profile changed to %1 Profil ändrad till %1 + + Pass + + + Timed out + Tajmade ut + + + + Can't start process, previous one is still running! + Kan inte starta process, den förra körs fortfarande! + + PasswordDialog diff --git a/localization/localization_zh_CN.ts b/localization/localization_zh_CN.ts index bf2bbf004..fae1bf21e 100644 --- a/localization/localization_zh_CN.ts +++ b/localization/localization_zh_CN.ts @@ -363,6 +363,53 @@ email 文件夹 %1 不是一个密码库或未初始化 + + ImitatePass + + + + Can not edit + 无法编辑 + + + + + Could not read encryption key to use, .gpg-id file missing or invalid. + 无法读取加密密钥,.gpg-id 文件丢失或无效 + + + + Cannot update + 无法更新 + + + + Failed to open .gpg-id for writing. + .gpg-id 无法写入 + + + + 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 + 重新从文件夹 %1 加密 + + + + + Updating password-store + 正在更新密码库... + + KeygenDialog @@ -480,14 +527,14 @@ Expire-Date: 0 - + Edit 编辑 - + Delete 删除 @@ -518,7 +565,7 @@ Expire-Date: 0 - + Users 用户 @@ -583,264 +630,265 @@ p, li { white-space: pre-wrap; } qtpass - + Welcome to QtPass %1 欢迎使用 QtPass %1 - + Add Password 新密码 - + Add Folder 新文件夹 - + Failed to connect WebDAV: 无法连接 WebDAV: - + QtPass WebDAV password QtPass WebDAV 密码 - + Enter password to connect to WebDAV: 输入 WebDAV 密码以连接: - + fusedav exited unexpectedly fusedav 意外退出 - + Failed to start fusedav to connect WebDAV: 无法连接 WebDAV,fusedav无法启动: - - + + Updating password-store 正在更新密码库... - - - - + + Can not edit 无法编辑 - - + + Selected password file does not exist, not able to edit 选定的密码文件不存在,不可编辑 - + Password hidden 密码已隐藏 - + Content hidden 内容已隐藏 - - + + Password 密码 - + Clipboard 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 - + Looking for: %1 搜索:%1 - - Could not read encryption key to use, .gpg-id file missing or invalid. - 无法读取加密密钥,.gpg-id 文件丢失或无效 + 无法读取加密密钥,.gpg-id 文件丢失或无效 - - + + New file 新密码 - + New password file: (Will be placed in %1 ) 新建密码: (将被放在 %1 ) - + Delete password? 删除密码? - - + Are you sure you want to delete %1? 确定删除 %1 ? - + Delete folder? 删除文件夹? - + Can not get key list 无法获取密钥列表 - + Unable to get list of available gpg keys 无法获取可用的 GPG 密钥列表 - + Key not found in keyring 所选密钥未找到 - Cannot update - 无法更新 + 无法更新 - Failed to open .gpg-id for writing. - .gpg-id 无法写入 + .gpg-id 无法写入 - Check selected users! - 请核对所选用户! + 请核对所选用户! - None of the selected keys have a secret key available. You will not be able to decrypt any newly added passwords! - 警告:所选用户都没有私钥,任何新添加的密码将无法解密! + 警告:所选用户都没有私钥,任何新添加的密码将无法解密! - + Generating GPG key pair 正在生成 GPG 密钥对 - + Profile changed to %1 用户已更改为 %1 - + Add folder 新文件夹 - + Add password 新密码 - + New Folder: (Will be placed in %1 ) 新建文件夹: (将被放在 %1 ) - + No characters chosen 未选择任何字符 - + Can't generate password, there are no characters to choose from set in the configuration! 未选择任何字符,无法生成密码! - Timed out - 超时 + 超时 - Can't start process, previous one is still running! - 程序已经运行,无法启动! + 程序已经运行,无法启动! - + Copied to clipboard 复制到剪贴板 - Re-encrypting from folder %1 - 重新从文件夹 %1 加密 + 重新从文件夹 %1 加密 + + + + Pass + + + Timed out + 超时 + + + + Can't start process, previous one is still running! + 程序已经运行,无法启动!