From c6ae420c17725f0ecd3a91c48e59e8cb30561cc1 Mon Sep 17 00:00:00 2001 From: Frank Gabriel Date: Fri, 28 Sep 2018 13:17:28 +0200 Subject: Prototype for QR encoding fields --- src/mainwindow.cpp | 9 +++++++++ src/qpushbuttonasqrcode.cpp | 48 +++++++++++++++++++++++++++++++++++++++++++++ src/qpushbuttonasqrcode.h | 33 +++++++++++++++++++++++++++++++ src/qtpass.cpp | 28 ++++++++++++++++++++++++++ src/qtpass.h | 1 + src/src.pro | 2 ++ 6 files changed, 121 insertions(+) create mode 100644 src/qpushbuttonasqrcode.cpp create mode 100644 src/qpushbuttonasqrcode.h (limited to 'src') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index c92f74dc..bf905a44 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -9,6 +9,7 @@ #include "keygendialog.h" #include "passworddialog.h" #include "qpushbuttonwithclipboard.h" +#include "qpushbuttonasqrcode.h" #include "qtpass.h" #include "qtpasssettings.h" #include "settingsconstants.h" @@ -1026,6 +1027,14 @@ void MainWindow::addToGridLayout(int position, const QString &field, frame->layout()->addWidget(fieldLabel); } + QPushButtonAsQRCode *qrbutton = + new QPushButtonAsQRCode(trimmedValue, this); + connect(qrbutton, &QPushButtonAsQRCode::clicked, m_qtPass, + &QtPass::showTextAsQRCode); + qrbutton->setStyleSheet("border-style: none ; background: transparent;"); + + frame->layout()->addWidget(qrbutton); + // set the echo mode to password, if the field is "password" if (QtPassSettings::isHidePassword() && trimmedField == tr("Password")) { QLineEdit *line = new QLineEdit(); diff --git a/src/qpushbuttonasqrcode.cpp b/src/qpushbuttonasqrcode.cpp new file mode 100644 index 00000000..0d063ac5 --- /dev/null +++ b/src/qpushbuttonasqrcode.cpp @@ -0,0 +1,48 @@ +#include "qpushbuttonasqrcode.h" +#include + +/** + * @brief QPushButtonAsQRCode::QPushButtonAsQRCode + * basic constructor + * @param textToCopy + * the text to display as qrcode + * @param parent + * the parent window + */ +QPushButtonAsQRCode::QPushButtonAsQRCode(const QString &textToCopy, + QWidget *parent) + : QPushButton(parent), textToCopy(textToCopy), + iconEdit(QIcon::fromTheme("qrcode", QIcon(":/icons/qrcode.svg"))) { + setIcon(iconEdit); + connect(this, SIGNAL(clicked(bool)), this, SLOT(buttonClicked(bool))); +} + +/** + * @brief QPushButtonAsQRCode::getTextToCopy returns the text of + * associated text field + * @return QString textToCopy + */ +QString QPushButtonAsQRCode::getTextToCopy() const { return textToCopy; } + +/** + * @brief QPushButtonAsQRCode::setTextToCopy sets text from associated + * text field + * @param value QString text to be copied + */ +void QPushButtonAsQRCode::setTextToCopy(const QString &value) { + textToCopy = value; +} + +/** + * @brief QPushButtonAsQRCode::buttonClicked handles clicked event by + * emitting clicked(QString) with string provided to constructor + */ +void QPushButtonAsQRCode::buttonClicked(bool) { + emit clicked(textToCopy); +} + +/** + * @brief QPushButtonAsQRCode::changeIconDefault change the icon back to + * the default copy icon + */ +void QPushButtonAsQRCode::changeIconDefault() { this->setIcon(iconEdit); } diff --git a/src/qpushbuttonasqrcode.h b/src/qpushbuttonasqrcode.h new file mode 100644 index 00000000..d0fe5770 --- /dev/null +++ b/src/qpushbuttonasqrcode.h @@ -0,0 +1,33 @@ +#ifndef QPUSHBUTTONASQRCODE_H_ +#define QPUSHBUTTONASQRCODE_H_ + +#include + +/*! + \class QPushButtonAsQRCode + \brief Stylish widget to display the field as QR Code +*/ +class QWidget; +class QPushButtonAsQRCode : public QPushButton { + Q_OBJECT + +public: + explicit QPushButtonAsQRCode(const QString &textToCopy = "", + QWidget *parent = nullptr); + + QString getTextToCopy() const; + void setTextToCopy(const QString &value); + +signals: + void clicked(QString); + +private slots: + void changeIconDefault(); + void buttonClicked(bool); + +private: + QString textToCopy; + QIcon iconEdit; +}; + +#endif // QPUSHBUTTONASQRCODE_H_ diff --git a/src/qtpass.cpp b/src/qtpass.cpp index 2239e86d..299b7469 100644 --- a/src/qtpass.cpp +++ b/src/qtpass.cpp @@ -3,6 +3,8 @@ #include "qtpasssettings.h" #include #include +#include +#include #ifndef Q_OS_WIN #include @@ -402,3 +404,29 @@ void QtPass::copyTextToClipboard(const QString &text) { clearClipboardTimer.start(); } } + +/** + * @brief displays the text as qrcode + * @param text + */ +void QtPass::showTextAsQRCode(const QString &text) { + QProcess qrencode; + qrencode.start("/usr/bin/qrencode", QStringList() << "-o-" << "-tPNG"); + qrencode.write(text.toUtf8()); + qrencode.closeWriteChannel(); + qrencode.waitForFinished(); + QByteArray output(qrencode.readAllStandardOutput()); + + if (qrencode.exitStatus() || qrencode.exitCode()) { + QString error(qrencode.readAllStandardError()); + m_mainWindow->showStatusMessage(error); + } else { + QPixmap image; + image.loadFromData(output, "PNG"); + + QLabel *label = new QLabel(); + label->setPixmap(image); + label->setScaledContents(true); + label->show(); + } +} diff --git a/src/qtpass.h b/src/qtpass.h index f58337b1..05470d83 100644 --- a/src/qtpass.h +++ b/src/qtpass.h @@ -39,6 +39,7 @@ signals: public slots: void clearClipboard(); void copyTextToClipboard(const QString &text); + void showTextAsQRCode(const QString &text); private slots: void processError(QProcess::ProcessError); diff --git a/src/src.pro b/src/src.pro index 18d853ff..3906a0cd 100644 --- a/src/src.pro +++ b/src/src.pro @@ -17,6 +17,7 @@ SOURCES += mainwindow.cpp \ passworddialog.cpp \ qprogressindicator.cpp \ qpushbuttonwithclipboard.cpp \ + qpushbuttonasqrcode.cpp \ qtpasssettings.cpp \ settingsconstants.cpp \ pass.cpp \ @@ -38,6 +39,7 @@ HEADERS += mainwindow.h \ qprogressindicator.h \ deselectabletreeview.h \ qpushbuttonwithclipboard.h \ + qpushbuttonasqrcode.h \ qtpasssettings.h \ enums.h \ settingsconstants.h \ -- cgit v1.2.3 From 57c24f5a7cbcfc52ec3e56be7d04421669f457b8 Mon Sep 17 00:00:00 2001 From: Frank Gabriel Date: Fri, 28 Sep 2018 13:47:05 +0200 Subject: Add qrencode to settings --- src/configdialog.cpp | 30 ++++++++++++++++++++++++++++++ src/configdialog.h | 2 ++ src/configdialog.ui | 15 +++++++++++++-- src/mainwindow.cpp | 16 +++++++++------- src/qtpasssettings.cpp | 8 ++++++++ src/qtpasssettings.h | 3 +++ src/settingsconstants.cpp | 1 + src/settingsconstants.h | 1 + 8 files changed, 67 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/configdialog.cpp b/src/configdialog.cpp index ae07ad2c..459dcaa4 100644 --- a/src/configdialog.cpp +++ b/src/configdialog.cpp @@ -62,6 +62,7 @@ ConfigDialog::ConfigDialog(MainWindow *parent) #if defined(Q_OS_WIN) || defined(__APPLE__) ui->checkBoxUseOtp->hide(); + ui->checkBoxUseQrencode->hide(); ui->label_10->hide(); #endif @@ -71,6 +72,12 @@ ConfigDialog::ConfigDialog(MainWindow *parent) tr("Pass OTP extension needs to be installed")); } + if (!isQrencodeAvailable()) { + ui->checkBoxUseQrencode->setEnabled(false); + ui->checkBoxUseQrencode->setToolTip( + tr("qrencode needs to be installed")); + } + setProfiles(QtPassSettings::getProfiles(), QtPassSettings::getProfile()); setPwgenPath(QtPassSettings::getPwgenExecutable()); setPasswordConfiguration(QtPassSettings::getPasswordConfiguration()); @@ -82,6 +89,7 @@ ConfigDialog::ConfigDialog(MainWindow *parent) useGit(QtPassSettings::isUseGit()); useOtp(QtPassSettings::isUseOtp()); + useQrencode(QtPassSettings::isUseQrencode()); usePwgen(QtPassSettings::isUsePwgen()); useTemplate(QtPassSettings::isUseTemplate()); @@ -200,6 +208,7 @@ void ConfigDialog::on_accepted() { QtPassSettings::setProfiles(getProfiles()); QtPassSettings::setUseGit(ui->checkBoxUseGit->isChecked()); QtPassSettings::setUseOtp(ui->checkBoxUseOtp->isChecked()); + QtPassSettings::setUseQrencode(ui->checkBoxUseQrencode->isChecked()); QtPassSettings::setPwgenExecutable(ui->pwgenPath->text()); QtPassSettings::setUsePwgen(ui->checkBoxUsePwgen->isChecked()); QtPassSettings::setAvoidCapitals(ui->checkBoxAvoidCapitals->isChecked()); @@ -516,6 +525,19 @@ void ConfigDialog::criticalMessage(const QString &title, const QString &text) { QMessageBox::critical(this, title, text, QMessageBox::Ok, QMessageBox::Ok); } +bool ConfigDialog::isQrencodeAvailable() { +#ifdef Q_OS_WIN + return false; +#elif defined(__APPLE__) + return false; +#else + QProcess which; + which.start("which", QStringList() << "qrencode"); + which.waitForFinished(); + return which.exitCode() == 0; +#endif +} + bool ConfigDialog::isPassOtpAvailable() { #ifdef Q_OS_WIN return false; @@ -663,6 +685,14 @@ void ConfigDialog::useOtp(bool useOtp) { ui->checkBoxUseOtp->setChecked(useOtp); } +/** + * @brief ConfigDialog::useOtp set preference for using otp plugin. + * @param useOtp + */ +void ConfigDialog::useQrencode(bool useQrencode) { + ui->checkBoxUseQrencode->setChecked(useQrencode); +} + /** * @brief ConfigDialog::on_checkBoxUseGit_clicked enable or disable related * checkboxes. diff --git a/src/configdialog.h b/src/configdialog.h index 46e36272..06fa78e9 100644 --- a/src/configdialog.h +++ b/src/configdialog.h @@ -37,6 +37,7 @@ public: void useTrayIcon(bool useTrayIdon); void useGit(bool useGit); void useOtp(bool useOtp); + void useQrencode(bool useQrencode); void setPwgenPath(QString); void usePwgen(bool usePwgen); void setPasswordConfiguration(const PasswordConfiguration &config); @@ -85,6 +86,7 @@ private: void criticalMessage(const QString &title, const QString &text); bool isPassOtpAvailable(); + bool isQrencodeAvailable(); void validate(QTableWidgetItem *item = nullptr); MainWindow *mainWindow; diff --git a/src/configdialog.ui b/src/configdialog.ui index 80ae5da6..a86bd58a 100644 --- a/src/configdialog.ui +++ b/src/configdialog.ui @@ -6,8 +6,8 @@ 0 0 - 618 - 609 + 659 + 650 @@ -517,6 +517,17 @@ + + + + + + Use qrencode + + + + + diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index bf905a44..74b8e4cd 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1027,13 +1027,15 @@ void MainWindow::addToGridLayout(int position, const QString &field, frame->layout()->addWidget(fieldLabel); } - QPushButtonAsQRCode *qrbutton = - new QPushButtonAsQRCode(trimmedValue, this); - connect(qrbutton, &QPushButtonAsQRCode::clicked, m_qtPass, - &QtPass::showTextAsQRCode); - qrbutton->setStyleSheet("border-style: none ; background: transparent;"); - - frame->layout()->addWidget(qrbutton); + if (QtPassSettings::isUseQrencode()) { + QPushButtonAsQRCode *qrbutton = + new QPushButtonAsQRCode(trimmedValue, this); + connect(qrbutton, &QPushButtonAsQRCode::clicked, m_qtPass, + &QtPass::showTextAsQRCode); + qrbutton->setStyleSheet("border-style: none ; background: transparent;"); + + frame->layout()->addWidget(qrbutton); + } // set the echo mode to password, if the field is "password" if (QtPassSettings::isHidePassword() && trimmedField == tr("Password")) { diff --git a/src/qtpasssettings.cpp b/src/qtpasssettings.cpp index fadb37fc..26ca28cd 100644 --- a/src/qtpasssettings.cpp +++ b/src/qtpasssettings.cpp @@ -392,6 +392,14 @@ void QtPassSettings::setUseOtp(const bool &useOtp) { getInstance()->setValue(SettingsConstants::useOtp, useOtp); } +bool QtPassSettings::isUseQrencode(const bool &defaultValue) { + return getInstance()->value(SettingsConstants::useQrencode, defaultValue).toBool(); +} + +void QtPassSettings::setUseQrencode(const bool &useQrencode) { + getInstance()->setValue(SettingsConstants::useQrencode, useQrencode); +} + bool QtPassSettings::isUsePwgen(const bool &defaultValue) { return getInstance() ->value(SettingsConstants::usePwgen, defaultValue) diff --git a/src/qtpasssettings.h b/src/qtpasssettings.h index aad36da6..3e5ce83d 100644 --- a/src/qtpasssettings.h +++ b/src/qtpasssettings.h @@ -144,6 +144,9 @@ public: static bool isUseOtp(const bool &defaultValue = QVariant().toBool()); static void setUseOtp(const bool &useOtp); + static bool isUseQrencode(const bool &defaultValue = QVariant().toBool()); + static void setUseQrencode(const bool &useQrencode); + static bool isUsePwgen(const bool &defaultValue = QVariant().toBool()); static void setUsePwgen(const bool &usePwgen); diff --git a/src/settingsconstants.cpp b/src/settingsconstants.cpp index 066931f3..75d5c4c8 100644 --- a/src/settingsconstants.cpp +++ b/src/settingsconstants.cpp @@ -44,6 +44,7 @@ const QString SettingsConstants::profile = "profile"; const QString SettingsConstants::groupProfiles = "profiles"; const QString SettingsConstants::useGit = "useGit"; const QString SettingsConstants::useOtp = "useOtp"; +const QString SettingsConstants::useQrencode = "useQrencode"; const QString SettingsConstants::useClipboard = "useClipboard"; const QString SettingsConstants::usePwgen = "usePwgen"; const QString SettingsConstants::avoidCapitals = "avoidCapitals"; diff --git a/src/settingsconstants.h b/src/settingsconstants.h index 1b719c8e..33ff6e5e 100644 --- a/src/settingsconstants.h +++ b/src/settingsconstants.h @@ -41,6 +41,7 @@ public: const static QString groupProfiles; const static QString useGit; const static QString useOtp; + const static QString useQrencode; const static QString useClipboard; const static QString usePwgen; const static QString avoidCapitals; -- cgit v1.2.3