diff --git a/client/CryptoDoc.cpp b/client/CryptoDoc.cpp index 585ffd4c..3da60461 100644 --- a/client/CryptoDoc.cpp +++ b/client/CryptoDoc.cpp @@ -447,13 +447,10 @@ QList CryptoDoc::keys() const bool CryptoDoc::move(const QString &to) { - if(!d->isEncrypted) - { - d->fileName = to; - return true; - } - - return false; + if(d->isEncrypted) + return false; + d->fileName = to; + return true; } bool CryptoDoc::open( const QString &file ) diff --git a/client/MainWindow.cpp b/client/MainWindow.cpp index efa5dc94..1a1b8386 100644 --- a/client/MainWindow.cpp +++ b/client/MainWindow.cpp @@ -131,6 +131,7 @@ MainWindow::MainWindow( QWidget *parent ) MainWindow::~MainWindow() { + digiDoc.reset(); cryptoDoc.reset(); delete ui; } @@ -167,7 +168,7 @@ void MainWindow::changeEvent(QEvent* event) void MainWindow::closeEvent(QCloseEvent * /*event*/) { cryptoDoc.reset(); - resetDigiDoc(); + resetDigiDoc({}); ui->startScreen->setCurrentIndex(SignIntro); } @@ -248,15 +249,17 @@ bool MainWindow::encrypt() if(!cryptoDoc) return false; - if(!FileDialog::fileIsWritable(cryptoDoc->fileName())) { + while (!FileDialog::fileIsWritable(cryptoDoc->fileName())) + { auto *dlg = new WarningDialog(tr("Cannot alter container %1. Save different location?") .arg(FileDialog::normalized(cryptoDoc->fileName())), this); dlg->addButton(WarningDialog::YES, QMessageBox::Yes); - if(dlg->exec() == QMessageBox::Yes) { - moveCryptoContainer(); - return encrypt(); - } - return false; + if(dlg->exec() != QMessageBox::Yes) + return false; + QString to = FileDialog::getSaveFileName(this, FileDialog::tr("Save file"), cryptoDoc->fileName()); + if(to.isNull() || !cryptoDoc->move(to)) + return false; + ui->cryptoContainerPage->setHeader(to); } WaitDialogHolder waitDialog(this, tr("Encrypting")); @@ -296,8 +299,8 @@ void MainWindow::navigateToPage( Pages page, const QStringList &files, bool crea navigate = signatureContainer->open(files[0]); if(navigate) { - resetDigiDoc(signatureContainer.release()); - ui->signContainerPage->transition(digiDoc); + resetDigiDoc(std::move(signatureContainer)); + ui->signContainerPage->transition(digiDoc.get()); } } else if(page == CryptoDetails) @@ -358,9 +361,10 @@ void MainWindow::onSignAction(int action, const QString &idCode, const QString & case ClearSignatureWarning: ui->signature->warningIcon(false); ui->warnings->closeWarnings(SignDetails); + ui->warnings->closeWarning(EmptyFileWarning); break; case ContainerCancel: - resetDigiDoc(); + resetDigiDoc({}); selectPage(Pages::SignIntro); break; case ContainerConvert: @@ -369,26 +373,13 @@ void MainWindow::onSignAction(int action, const QString &idCode, const QString & break; case ContainerSave: save(); - ui->signContainerPage->transition(digiDoc); - break; - case ContainerSaveAs: - save(true); - break; - case ContainerLocation: - if(digiDoc) - moveSignatureContainer(); + ui->signContainerPage->transition(digiDoc.get()); break; default: break; } } -void MainWindow::convertToBDoc() -{ - if(wrap(cryptoDoc->fileName(), cryptoDoc->state() == EncryptedContainer)) - FadeInNotification::success(ui->topBar, tr("Converted to signed document!")); -} - void MainWindow::convertToCDoc() { QString filename = FileDialog::createNewFileName(digiDoc->fileName(), false, this); @@ -409,27 +400,13 @@ void MainWindow::convertToCDoc() cryptoContainer->addKey(CKey(cardData.cert())); cryptoDoc = std::move(cryptoContainer); - resetDigiDoc(nullptr, false); + digiDoc.reset(); ui->cryptoContainerPage->transition(cryptoDoc.get(), qApp->signer()->tokenauth().cert()); selectPage(CryptoDetails); FadeInNotification::success(ui->topBar, tr("Converted to crypto container!")); } -void MainWindow::moveCryptoContainer() -{ - QString to = FileDialog::getSaveFileName(this, tr("Move file"), cryptoDoc->fileName()); - if(!to.isNull() && cryptoDoc->move(to)) - emit ui->cryptoContainerPage->moved(to); -} - -void MainWindow::moveSignatureContainer() -{ - QString to = FileDialog::getSaveFileName(this, tr("Move file"), digiDoc->fileName()); - if(!to.isNull() && digiDoc->move(to)) - emit ui->signContainerPage->moved(to); -} - void MainWindow::onCryptoAction(int action, const QString &/*id*/, const QString &/*phone*/) { switch(action) @@ -439,8 +416,8 @@ void MainWindow::onCryptoAction(int action, const QString &/*id*/, const QString selectPage(Pages::CryptoIntro); break; case ContainerConvert: - if(cryptoDoc) - convertToBDoc(); + if(cryptoDoc && wrap(cryptoDoc->fileName(), false)) + FadeInNotification::success(ui->topBar, tr("Converted to signed document!")); break; case DecryptContainer: case DecryptToken: @@ -457,33 +434,11 @@ void MainWindow::onCryptoAction(int action, const QString &/*id*/, const QString FadeInNotification::success(ui->topBar, tr("Encryption succeeded!")); } break; - case ContainerSaveAs: - { - if(!cryptoDoc) - break; - QString target = FileDialog::getSaveFileName(this, tr("Save file"), cryptoDoc->fileName()); - if(target.isEmpty()) - break; - if( !FileDialog::fileIsWritable(target)) - { - auto *dlg = new WarningDialog(tr("Cannot alter container %1. Save different location?").arg(target), this); - dlg->addButton(WarningDialog::YES, QMessageBox::Yes); - if(dlg->exec() == QMessageBox::Yes) { - QString file = FileDialog::getSaveFileName(this, tr("Save file"), target); - if(!file.isEmpty()) - cryptoDoc->saveCopy(file); - } - } - cryptoDoc->saveCopy(target); - break; - } case ClearCryptoWarning: ui->crypto->warningIcon(false); ui->warnings->closeWarnings(CryptoDetails); break; - case ContainerLocation: - if(cryptoDoc) - moveCryptoContainer(); + default: break; } } @@ -588,9 +543,9 @@ void MainWindow::openContainer(bool signature) openFiles(files); } -void MainWindow::resetDigiDoc(DigiDoc *doc, bool warnOnChange) +void MainWindow::resetDigiDoc(std::unique_ptr &&doc) { - if(warnOnChange && digiDoc && digiDoc->isModified()) + if(digiDoc && digiDoc->isModified()) { QString warning, cancelTxt, saveTxt; if(digiDoc->state() == UnsignedContainer) @@ -612,37 +567,28 @@ void MainWindow::resetDigiDoc(DigiDoc *doc, bool warnOnChange) if(dlg->exec() == QMessageBox::Save) save(); } - - ui->signature->warningIcon(false); - - ui->signContainerPage->clear(); - delete digiDoc; - ui->warnings->closeWarnings(SignDetails); - ui->warnings->closeWarning(EmptyFileWarning); - digiDoc = doc; + digiDoc = std::move(doc); } -bool MainWindow::save(bool saveAs) +bool MainWindow::save() { if(!digiDoc) return false; QString target = digiDoc->fileName(); - if(saveAs) - target = FileDialog::getSaveFileName(this, tr("Save file"), target); - if(target.isEmpty()) - return false; - - if(!FileDialog::fileIsWritable(target)) + while(!FileDialog::fileIsWritable(target)) { auto *dlg = new WarningDialog(tr("Cannot alter container %1. Save different location?").arg(target), this); dlg->addButton(WarningDialog::YES, QMessageBox::Yes); - if(dlg->exec() == QMessageBox::Yes) { - if(QString file = FileDialog::getSaveFileName(this, tr("Save file"), target); !file.isEmpty()) - return saveAs ? digiDoc->saveAs(file) : digiDoc->save(file); - } + if(dlg->exec() != QMessageBox::Yes) + return false; + if(target = FileDialog::getSaveFileName(this, FileDialog::tr("Save file"), target); target.isEmpty()) + return false; } - return saveAs ? digiDoc->saveAs(target) : digiDoc->save(target); + bool result = digiDoc->save(target); + if(result) + ui->signContainerPage->setHeader(target); + return result; } void MainWindow::selectPage(Pages page) @@ -705,7 +651,7 @@ void MainWindow::sign(F &&sign) if(!sign(city, state, zip, country, role)) { - resetDigiDoc(nullptr, false); + digiDoc.reset(); navigateToPage(SignDetails, {std::move(wrappedFile)}, false); return; } @@ -716,7 +662,7 @@ void MainWindow::sign(F &&sign) if(!save()) return; - ui->signContainerPage->transition(digiDoc); + ui->signContainerPage->transition(digiDoc.get()); FadeInNotification::success(ui->topBar, tr("The container has been successfully signed!")); adjustDrops(); @@ -761,7 +707,7 @@ bool MainWindow::removeFile(DocumentModel *model, int index) continue; ui->warnings->closeWarning(EmptyFileWarning); if(digiDoc) - ui->signContainerPage->transition(digiDoc); + ui->signContainerPage->transition(digiDoc.get()); break; } @@ -775,7 +721,7 @@ void MainWindow::removeSignature(int index) WaitDialogHolder waitDialog(this, tr("Removing signature")); digiDoc->removeSignature(unsigned(index)); save(); - ui->signContainerPage->transition(digiDoc); + ui->signContainerPage->transition(digiDoc.get()); adjustDrops(); } @@ -788,7 +734,7 @@ void MainWindow::removeSignatureFile(int index) { if(QFile::exists(digiDoc->fileName())) QFile::remove(digiDoc->fileName()); - resetDigiDoc(nullptr, false); + digiDoc.reset(); selectPage(Pages::SignIntro); } } @@ -807,7 +753,7 @@ bool MainWindow::validateFiles(const QString &container, const QStringList &file return false; } -bool MainWindow::wrap(const QString& wrappedFile, bool enclose) +bool MainWindow::wrap(const QString& wrappedFile, bool pdf) { QString filename = FileDialog::createNewFileName(wrappedFile, true, this); if(filename.isNull()) @@ -816,16 +762,16 @@ bool MainWindow::wrap(const QString& wrappedFile, bool enclose) std::unique_ptr signatureContainer(new DigiDoc(this)); signatureContainer->create(filename); - // If encrypted container or pdf, add whole file to signature container; otherwise content only - if(enclose) + // If pdf, add whole file to signature container; otherwise content only + if(pdf) signatureContainer->documentModel()->addFile(wrappedFile); else signatureContainer->documentModel()->addTempFiles(cryptoDoc->documentModel()->tempFiles()); cryptoDoc.reset(); - resetDigiDoc(signatureContainer.release()); + resetDigiDoc(std::move(signatureContainer)); - ui->signContainerPage->transition(digiDoc); + ui->signContainerPage->transition(digiDoc.get()); selectPage(SignDetails); return true; diff --git a/client/MainWindow.h b/client/MainWindow.h index 4dd9e0d9..1ff103ea 100644 --- a/client/MainWindow.h +++ b/client/MainWindow.h @@ -60,37 +60,34 @@ class MainWindow final : public QWidget private: void adjustDrops(); void changePinClicked(QSmartCardData::PinType type, QSmartCard::PinAction action); - void convertToBDoc(); void convertToCDoc(); ria::qdigidoc4::ContainerState currentState(); bool decrypt(); bool encrypt(); void loadPicture(); - void moveCryptoContainer(); - void moveSignatureContainer(); void navigateToPage( ria::qdigidoc4::Pages page, const QStringList &files = QStringList(), bool create = true ); void onCryptoAction(int action, const QString &id, const QString &phone); void onSignAction(int action, const QString &idCode, const QString &info2); void openContainer(bool signature); void pageSelected(int page, bool checked = true); - void resetDigiDoc(DigiDoc *doc = nullptr, bool warnOnChange = true); + void resetDigiDoc(std::unique_ptr &&doc); void removeCryptoFile(int index); bool removeFile(DocumentModel *model, int index); void removeSignature(int index); void removeSignatureFile(int index); - bool save(bool saveAs = false); + bool save(); template void sign(F &&sign); bool validateFiles(const QString &container, const QStringList &files); void updateSelector(); void updateMyEID(const TokenData &t); void updateMyEid(const QSmartCardData &data); - bool wrap(const QString& wrappedFile, bool enclose); + bool wrap(const QString& wrappedFile, bool pdf); bool wrapContainer(bool signing); static QStringList dropEventFiles(QDropEvent *event); std::unique_ptr cryptoDoc; - DigiDoc* digiDoc = nullptr; + std::unique_ptr digiDoc; Ui::MainWindow *ui; }; diff --git a/client/common_enums.h b/client/common_enums.h index 6d772112..0d02eee6 100644 --- a/client/common_enums.h +++ b/client/common_enums.h @@ -39,9 +39,7 @@ enum Actions : unsigned char { ContainerCancel, ContainerConvert, ContainerEncrypt, - ContainerLocation, ContainerSave, - ContainerSaveAs, EncryptContainer, DecryptContainer, diff --git a/client/translations/en.ts b/client/translations/en.ts index 9a256df3..fce61f2e 100644 --- a/client/translations/en.ts +++ b/client/translations/en.ts @@ -836,6 +836,14 @@ Documents (%1) Documents (%1) + + Save file + Save file + + + Move file + Move file + FileItem @@ -852,10 +860,6 @@ FileList - - Save file - Save file - Add files Add files @@ -1337,10 +1341,6 @@ ID-Card Cannot alter container %1. Save different location? Cannot alter container %1. Save to different location? - - Save file - Save file - The container has been successfully signed! The container has been successfully signed! @@ -1365,10 +1365,6 @@ ID-Card Converted to crypto container! Converted to crypto container! - - Move file - Move file - You are about to delete the last file in the container, it is removed along with the container. You are about to delete the last file in the container, it is removed along with the container. diff --git a/client/translations/et.ts b/client/translations/et.ts index 790c438d..36f1e50c 100644 --- a/client/translations/et.ts +++ b/client/translations/et.ts @@ -836,6 +836,14 @@ Documents (%1) Dokumendid (%1) + + Save file + Salvesta fail + + + Move file + Liiguta fail + FileItem @@ -852,10 +860,6 @@ FileList - - Save file - Salvesta fail - Add files Lisa faile @@ -1337,10 +1341,6 @@ ID-kaardiga Cannot alter container %1. Save different location? Ümbriku %1 salvestamine ebaõnnestus. Salvestada teise asukohta? - - Save file - Salvesta fail - The container has been successfully signed! Ümbrik on edukalt allkirjastatud! @@ -1365,10 +1365,6 @@ ID-kaardiga Converted to crypto container! Konverteeritud turvaümbrikuks! - - Move file - Liiguta fail - You are about to delete the last file in the container, it is removed along with the container. Oled kustutamas viimast faili ümbrikus, koos sellega eemaldatakse ka ümbrik. diff --git a/client/translations/ru.ts b/client/translations/ru.ts index a90bf53a..0a25e33a 100644 --- a/client/translations/ru.ts +++ b/client/translations/ru.ts @@ -836,6 +836,14 @@ Documents (%1) Документы (%1) + + Save file + Сохранить файл + + + Move file + Переместить файл + FileItem @@ -852,10 +860,6 @@ FileList - - Save file - Сохранить файл - Add files Добавить файлы @@ -1337,10 +1341,6 @@ ID-картой Cannot alter container %1. Save different location? Сохранение контейнера %1 не удалось. Сохранить в другой каталог? - - Save file - Сохранить файл - The container has been successfully signed! Контейнер успешно подписан! @@ -1365,10 +1365,6 @@ ID-картой Converted to crypto container! Переделан в контейнер для зашифровывания! - - Move file - Переместить файл - You are about to delete the last file in the container, it is removed along with the container. Вы собираетесь удалить последний файл в контейнере, он удаляется вместе с контейнером. diff --git a/client/widgets/ContainerPage.cpp b/client/widgets/ContainerPage.cpp index 00f85af6..bb1e37cd 100644 --- a/client/widgets/ContainerPage.cpp +++ b/client/widgets/ContainerPage.cpp @@ -60,15 +60,12 @@ ContainerPage::ContainerPage(QWidget *parent) connect(btn, &QAbstractButton::clicked, this, [this,code] { emit action(code); }); }; - connect(this, &ContainerPage::moved,this, &ContainerPage::setHeader); - connectCode(ui->changeLocation, Actions::ContainerLocation); connect(ui->cancel, &QPushButton::clicked, this, [this] { window()->setWindowFilePath({}); window()->setWindowTitle(tr("DigiDoc4 Client")); emit action(Actions::ContainerCancel); }); connectCode(ui->convert, Actions::ContainerConvert); - connectCode(ui->saveAs, Actions::ContainerSaveAs); connectCode(ui->save, Actions::ContainerSave); connect(ui->leftPane, &FileList::addFiles, this, &ContainerPage::addFiles); connect(ui->leftPane, &ItemList::removed, this, &ContainerPage::fileRemoved); @@ -110,11 +107,11 @@ void ContainerPage::cardChanged(const SslCertificate &cert, bool isBlocked) emit certChanged(cert); } -void ContainerPage::clear() +void ContainerPage::clear(int code) { ui->leftPane->clear(); ui->rightPane->clear(); - isSupported = false; + emit action(code); } void ContainerPage::clearPopups() @@ -271,14 +268,23 @@ void ContainerPage::transition(CryptoDoc *container, const QSslCertificate &cert if(container->state() & EncryptedContainer) updateDecryptionButton(); }); - disconnect(container, &CryptoDoc::destroyed, this, &ContainerPage::clear); + disconnect(ui->changeLocation, &QPushButton::clicked, container, nullptr); + connect(ui->changeLocation, &QPushButton::clicked, container, [container, this] { + QString to = FileDialog::getSaveFileName(this, FileDialog::tr("Move file"), container->fileName()); + if(!to.isNull() && container->move(to)) + setHeader(to); + }); + disconnect(ui->saveAs, &QPushButton::clicked, container, nullptr); + connect(ui->saveAs, &QPushButton::clicked, container, [container, this] { + if(QString target = FileDialog::getSaveFileName(this, FileDialog::tr("Save file"), container->fileName()); !target.isEmpty()) + container->saveCopy(target); + }); + disconnect(container, &CryptoDoc::destroyed, this, nullptr); connect(container, &CryptoDoc::destroyed, this, [this] { - clear(); - emit action(ClearCryptoWarning); + clear(ClearCryptoWarning); }); - clear(); - emit action(ClearCryptoWarning); + clear(ClearCryptoWarning); isSupported = container->state() & UnencryptedContainer || container->canDecrypt(cert); setHeader(container->fileName()); ui->leftPane->init(fileName, QT_TRANSLATE_NOOP("ItemList", "Encrypted files")); @@ -321,9 +327,23 @@ void ContainerPage::transition(DigiDoc* container) dialog->exec(); dialog->deleteLater(); }); + disconnect(ui->changeLocation, &QPushButton::clicked, container, nullptr); + connect(ui->changeLocation, &QPushButton::clicked, container, [container, this] { + QString to = FileDialog::getSaveFileName(this, FileDialog::tr("Move file"), container->fileName()); + if(!to.isNull() && container->move(to)) + setHeader(to); + }); + disconnect(ui->saveAs, &QPushButton::clicked, container, nullptr); + connect(ui->saveAs, &QPushButton::clicked, container, [container, this] { + if(QString target = FileDialog::getSaveFileName(this, FileDialog::tr("Save file"), container->fileName()); !target.isEmpty()) + container->saveAs(target); + }); + disconnect(container, &DigiDoc::destroyed, this, nullptr); + connect(container, &DigiDoc::destroyed, this, [this] { + clear(ClearSignatureWarning); + }); - clear(); - emit action(ClearSignatureWarning); + clear(ClearSignatureWarning); std::map errors; setHeader(container->fileName()); ui->leftPane->init(fileName, QT_TRANSLATE_NOOP("ItemList", "Container files")); @@ -419,17 +439,15 @@ void ContainerPage::updatePanes(ContainerState state) case UnencryptedContainer: cancelText = QT_TR_NOOP("Start"); convertText = QT_TR_NOOP("Sign"); - - ui->changeLocation->show(); showMainAction({ EncryptContainer }); + setButtonsVisible({ ui->changeLocation, ui->convert }, true); setButtonsVisible({ ui->saveAs, ui->email }, false); break; case EncryptedContainer: cancelText = QT_TR_NOOP("Start"); convertText = QT_TR_NOOP("Sign"); - - ui->changeLocation->hide(); updateDecryptionButton(); + setButtonsVisible({ ui->changeLocation, ui->convert }, false); setButtonsVisible({ ui->saveAs, ui->email }, true); break; default: diff --git a/client/widgets/ContainerPage.h b/client/widgets/ContainerPage.h index 52b56a63..b88be81e 100644 --- a/client/widgets/ContainerPage.h +++ b/client/widgets/ContainerPage.h @@ -45,26 +45,25 @@ class ContainerPage final : public QWidget ~ContainerPage() final; void cardChanged(const SslCertificate &cert, bool isBlocked = false); - void clear(); void clearPopups(); + void setHeader(const QString &file); void togglePrinting(bool enable); void transition(CryptoDoc *container, const QSslCertificate &cert); void transition(DigiDoc* container); -signals: +Q_SIGNALS: void action(int code, const QString &idCode = {}, const QString &info2 = {}); void addFiles(const QStringList &files); void certChanged(const SslCertificate &cert); void fileRemoved(int row); - void moved(const QString &to); void removed(int row); void warning(const WarningText &warningText); private: void changeEvent(QEvent* event) final; + void clear(int code); void elideFileName(); bool eventFilter(QObject *o, QEvent *e) final; - void setHeader(const QString &file); void showMainAction(const QList &actions); void showSigningButton(); void handleAction(int type); diff --git a/client/widgets/FileList.cpp b/client/widgets/FileList.cpp index 0600f87d..fdfed636 100644 --- a/client/widgets/FileList.cpp +++ b/client/widgets/FileList.cpp @@ -128,7 +128,7 @@ void FileList::save(FileItem *item) { QString extension = QFileInfo(item->getFile()).suffix(); QString capitalized = extension[0].toUpper() + extension.mid(1); - QString dest = FileDialog::getSaveFileName(this, tr("Save file"), + QString dest = FileDialog::getSaveFileName(this, FileDialog::tr("Save file"), QFileInfo(container).dir().absolutePath() + QDir::separator() + FileDialog::safeName(item->getFile()), QStringLiteral("%1 (*%2)").arg(capitalized, extension)); @@ -174,7 +174,7 @@ void FileList::saveAll() continue; if(b == QMessageBox::Save) { - dest = FileDialog::getSaveFileName( this, tr("Save file"), dest ); + dest = FileDialog::getSaveFileName(this, FileDialog::tr("Save file"), dest); if( dest.isEmpty() ) continue; } @@ -209,15 +209,12 @@ void FileList::setModel(DocumentModel *documentModel) auto count = documentModel->rowCount(); for(int i = 0; i < count; i++) addFile(documentModel->data(i)); - if(state == EncryptedContainer && count == 0) - addWidget(new LabelItem(QT_TRANSLATE_NOOP("LabelItem", - "The container must be decrypted in order to see the contents of an encrypted container."))); } void FileList::stateChange(ria::qdigidoc4::ContainerState state) { ItemList::stateChange(state); - updateDownload(); + updateDownload(); } void FileList::updateDownload() @@ -226,4 +223,7 @@ void FileList::updateDownload() ui->download->setVisible(state & (UnsignedSavedContainer | SignedContainer | UnencryptedContainer) && c); ui->count->setVisible(state & (UnsignedSavedContainer | SignedContainer | UnencryptedContainer) && c); ui->count->setText(QString::number(c)); + if(state == EncryptedContainer && c == 0) + addWidget(new LabelItem(QT_TRANSLATE_NOOP("LabelItem", + "The container must be decrypted in order to see the contents of an encrypted container."))); }