From fdc1f5d9c83f765e8b0af4b1e686e05759f8e7e4 Mon Sep 17 00:00:00 2001 From: Nicolas Mailloux Date: Sun, 10 Oct 2021 09:54:59 -0400 Subject: [PATCH] encfs improvements --- eink.qrc | 1 + encryptionmanager.cpp | 70 ++++++++++++++++++++++-- encryptionmanager.h | 3 + encryptionmanager.ui | 124 +++++++++++++++++++++++++++++++++++++++++- resources/error.png | Bin 0 -> 45413 bytes 5 files changed, 191 insertions(+), 7 deletions(-) create mode 100644 resources/error.png diff --git a/eink.qrc b/eink.qrc index dbeec80..fd2180a 100644 --- a/eink.qrc +++ b/eink.qrc @@ -66,5 +66,6 @@ resources/check-display.png resources/hourglass-bottom.png resources/hourglass-top.png + resources/error.png diff --git a/encryptionmanager.cpp b/encryptionmanager.cpp index a2bddce..5280181 100644 --- a/encryptionmanager.cpp +++ b/encryptionmanager.cpp @@ -24,9 +24,12 @@ encryptionManager::encryptionManager(QWidget *parent) : ui->descriptionLabel->setStyleSheet("font-size: 9pt"); ui->successLabel->setStyleSheet("font-size: 15pt"); ui->successDescriptionLabel->setStyleSheet("font-size: 9pt"); + ui->failureLabel->setStyleSheet("font-size: 15pt"); + ui->failureDescriptionLabel->setStyleSheet("font-size: 9pt"); ui->setupContinueBtn->setStyleSheet("font-size: 10pt; padding: 10px; font-weight: bold; background: lightGrey"); ui->setupAbortBtn->setStyleSheet("font-size: 10pt; padding: 10px; font-weight: bold; background: lightGrey"); ui->exitSuccessBtn->setStyleSheet("background: lightGrey; border: 3px solid black; color: black; padding: 10px; outline: none; font-size: 10pt; font-weight: bold"); + ui->failureContinueBtn->setStyleSheet("background: lightGrey; border: 3px solid black; color: black; padding: 10px; outline: none; font-size: 10pt; font-weight: bold"); // Getting the screen's size float sW = QGuiApplication::screens()[0]->size().width(); @@ -47,10 +50,22 @@ encryptionManager::encryptionManager(QWidget *parent) : QPixmap scaledPixmap = pixmap.scaled(stdIconWidth, stdIconHeight, Qt::KeepAspectRatio); ui->checkImageLabel->setPixmap(scaledPixmap); } + { + stdIconWidth = sW / 1.65; + stdIconHeight = sH / 1.65; + QPixmap pixmap(":/resources/error.png"); + QPixmap scaledPixmap = pixmap.scaled(stdIconWidth, stdIconHeight, Qt::KeepAspectRatio); + ui->failureImageLabel->setPixmap(scaledPixmap); + } hourglassAnimationWidgetWindow = new hourglassAnimationWidget(); ui->hourglassWidget->insertWidget(0, hourglassAnimationWidgetWindow); ui->hourglassWidget->setCurrentIndex(0); + + setDefaultWorkDir(); + if(checkconfig(".config/18-encrypted_storage/initial_setup_done") == true) { + setupPassphraseDialog(1); + } } encryptionManager::~encryptionManager() @@ -60,7 +75,16 @@ encryptionManager::~encryptionManager() void encryptionManager::on_setupContinueBtn_clicked() { - ui->activityWidget->setCurrentIndex(3); + setupPassphraseDialog(0); +} + +void encryptionManager::setupPassphraseDialog(int mode) { + /* + * Mode can be: + * 0: Initial setup + * 1: Normal behavior + */ + ui->activityWidget->hide(); this->setStyleSheet("background-color: black"); global::keyboard::keyboardDialog = true; global::keyboard::encfsDialog = true; @@ -68,7 +92,12 @@ void encryptionManager::on_setupContinueBtn_clicked() generalDialogWindow = new generalDialog(); generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose); connect(generalDialogWindow, SIGNAL(refreshScreen()), SLOT(refreshScreen())); - connect(generalDialogWindow, SIGNAL(destroyed(QObject*)), SLOT(setupEncryptedStorage())); + if(mode == 0) { + connect(generalDialogWindow, SIGNAL(destroyed(QObject*)), SLOT(setupEncryptedStorage())); + } + else { + connect(generalDialogWindow, SIGNAL(destroyed(QObject*)), SLOT(unlockEncryptedStorage())); + } connect(generalDialogWindow, SIGNAL(showToast(QString)), SLOT(showToast(QString))); generalDialogWindow->show(); } @@ -125,6 +154,28 @@ void encryptionManager::setupEncryptedStorage() { t->start(); } +void encryptionManager::unlockEncryptedStorage() { + this->setStyleSheet("background-color: white"); + ui->activityWidget->show(); + mkEncfsDirs(); + std::string passphrase = global::encfs::passphrase.toStdString(); + global::encfs::passphrase = ""; + string_writeconfig("/external_root/run/encfs/encrypted_storage_archive", "/data/onboard/data.encfs"); + string_writeconfig("/external_root/run/encfs/encrypted_storage_mountpoint", "/data/onboard/books"); + string_writeconfig("/external_root/run/encfs/encrypted_storage_passphrase", passphrase); + bool exitStatus; + ui->activityWidget->setCurrentIndex(3); + QTimer * t = new QTimer(this); + t->setInterval(1000); + connect(t, &QTimer::timeout, [&]() { + if(QFile::exists("/external_root/run/encfs_mounted")) { + exitStatus = checkconfig("/external_root/run/encfs_mounted"); + quit_restart(); + } + } ); + t->start(); +} + void encryptionManager::mkEncfsDirs() { QDir encfsDir; QString encfsPath("/external_root/run/encfs"); @@ -138,7 +189,9 @@ void encryptionManager::mkEncfsDirs() { void encryptionManager::on_exitSuccessBtn_clicked() { - + setDefaultWorkDir(); + string_writeconfig(".config/18-encrypted_storage/initial_setup_done", "true"); + quit_restart(); } void encryptionManager::setupExitWidget(bool exitStatus) { @@ -152,7 +205,12 @@ void encryptionManager::setupExitWidget(bool exitStatus) { } setupExitWidgetRan = true; } - else { - qDebug() << "setupExitWidgetRan"; - } } + +void encryptionManager::on_failureContinueBtn_clicked() +{ + setDefaultWorkDir(); + string_writeconfig(".config/18-encrypted_storage/initial_setup_done", "true"); + quit_restart(); +} + diff --git a/encryptionmanager.h b/encryptionmanager.h index 9312231..e660edb 100644 --- a/encryptionmanager.h +++ b/encryptionmanager.h @@ -29,6 +29,9 @@ private slots: void mkEncfsDirs(); void on_exitSuccessBtn_clicked(); void setupExitWidget(bool exitStatus); + void on_failureContinueBtn_clicked(); + void setupPassphraseDialog(int mode); + void unlockEncryptedStorage(); private: Ui::encryptionManager *ui; diff --git a/encryptionmanager.ui b/encryptionmanager.ui index 2cdf26f..8cc10af 100644 --- a/encryptionmanager.ui +++ b/encryptionmanager.ui @@ -280,7 +280,129 @@ Would you like to enable it? - + + + + + + + + + Inter + 75 + true + + + + There was an error + + + Qt::AlignCenter + + + true + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Continue + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Something wrong happened during the storage encryption process. Please try again later. + + + Qt::AlignCenter + + + true + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Failure image + + + Qt::AlignCenter + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + diff --git a/resources/error.png b/resources/error.png new file mode 100644 index 0000000000000000000000000000000000000000..0685b7140608ab96a945884ea12c30e47d785263 GIT binary patch literal 45413 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