diff options
author | Anne Jan Brouwer <brouwer@annejan.com> | 2019-04-17 11:30:39 +0200 |
---|---|---|
committer | Anne Jan Brouwer <brouwer@annejan.com> | 2019-04-17 11:30:39 +0200 |
commit | feeb40740fc2c7362de4e60fd8a785df1af9f7cc (patch) | |
tree | a967c434878a923f9d246c252674812d61aa3908 /src | |
parent | 2cf89afa0b3185373ff92a9dd2b9c9bfa9ce6560 (diff) | |
parent | 0789259aa59a565ba6c899a8c4e8da88fd5f5637 (diff) |
Merge branch 'master' into clang-tidy-clazy
Diffstat (limited to 'src')
-rw-r--r-- | src/configdialog.cpp | 30 | ||||
-rw-r--r-- | src/configdialog.h | 2 | ||||
-rw-r--r-- | src/configdialog.ui | 15 | ||||
-rw-r--r-- | src/mainwindow.cpp | 11 | ||||
-rw-r--r-- | src/qpushbuttonasqrcode.cpp | 48 | ||||
-rw-r--r-- | src/qpushbuttonasqrcode.h | 33 | ||||
-rw-r--r-- | src/qtpass.cpp | 28 | ||||
-rw-r--r-- | src/qtpass.h | 1 | ||||
-rw-r--r-- | src/qtpasssettings.cpp | 8 | ||||
-rw-r--r-- | src/qtpasssettings.h | 3 | ||||
-rw-r--r-- | src/settingsconstants.cpp | 1 | ||||
-rw-r--r-- | src/settingsconstants.h | 1 | ||||
-rw-r--r-- | src/src.pro | 2 |
13 files changed, 181 insertions, 2 deletions
diff --git a/src/configdialog.cpp b/src/configdialog.cpp index 8d8b424b..38adc328 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()); @@ -206,6 +214,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()); @@ -540,6 +549,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; @@ -703,6 +725,14 @@ void ConfigDialog::useOtp(bool 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 b29c617e..24e2f047 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); @@ -86,6 +87,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 b0887218..93baf53e 100644 --- a/src/configdialog.ui +++ b/src/configdialog.ui @@ -6,8 +6,8 @@ <rect> <x>0</x> <y>0</y> - <width>618</width> - <height>609</height> + <width>659</width> + <height>650</height> </rect> </property> <property name="sizePolicy"> @@ -518,6 +518,17 @@ </widget> </item> <item> + <layout class="QHBoxLayout" name="horizontalLayout_16"> + <item> + <widget class="QCheckBox" name="checkBoxUseQrencode"> + <property name="text"> + <string>Use qrencode</string> + </property> + </widget> + </item> + </layout> + </item> + <item> <layout class="QHBoxLayout" name="horizontalLayout_14"> <item> <widget class="QCheckBox" name="checkBoxUseOtp"> diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 9f83b1e1..b58fcb02 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" @@ -1030,6 +1031,16 @@ void MainWindow::addToGridLayout(int position, const QString &field, frame->layout()->addWidget(fieldLabel); } + 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")) { auto *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 <QTimer> + +/** + * @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 <QPushButton> + +/*! + \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 ad8880b5..c7e9846d 100644 --- a/src/qtpass.cpp +++ b/src/qtpass.cpp @@ -3,6 +3,8 @@ #include "qtpasssettings.h" #include <QApplication> #include <QClipboard> +#include <QPixmap> +#include <QLabel> #ifndef Q_OS_WIN #include <QInputDialog> @@ -404,3 +406,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/qtpasssettings.cpp b/src/qtpasssettings.cpp index a38c3159..90405a78 100644 --- a/src/qtpasssettings.cpp +++ b/src/qtpasssettings.cpp @@ -395,6 +395,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 5a38b814..1f552011 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; 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 \ |