Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 4 additions & 7 deletions client/CryptoDoc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -447,13 +447,10 @@ QList<CKey> 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 )
Expand Down
138 changes: 42 additions & 96 deletions client/MainWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@ MainWindow::MainWindow( QWidget *parent )

MainWindow::~MainWindow()
{
digiDoc.reset();
cryptoDoc.reset();
delete ui;
}
Expand Down Expand Up @@ -169,7 +170,7 @@ void MainWindow::changeEvent(QEvent* event)
void MainWindow::closeEvent(QCloseEvent * /*event*/)
{
cryptoDoc.reset();
resetDigiDoc();
resetDigiDoc({});
ui->startScreen->setCurrentIndex(SignIntro);
}

Expand Down Expand Up @@ -250,15 +251,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"));
Expand Down Expand Up @@ -298,8 +301,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)
Expand Down Expand Up @@ -360,9 +363,10 @@ void MainWindow::onSignAction(int action, const QString &info1, const QString &i
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:
Expand All @@ -371,26 +375,13 @@ void MainWindow::onSignAction(int action, const QString &info1, const QString &i
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);
Expand All @@ -411,27 +402,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)
Expand All @@ -441,8 +418,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:
Expand All @@ -459,33 +436,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;
}
}
Expand Down Expand Up @@ -590,9 +545,9 @@ void MainWindow::openContainer(bool signature)
openFiles(files);
}

void MainWindow::resetDigiDoc(DigiDoc *doc, bool warnOnChange)
void MainWindow::resetDigiDoc(std::unique_ptr<DigiDoc> &&doc)
{
if(warnOnChange && digiDoc && digiDoc->isModified())
if(digiDoc && digiDoc->isModified())
{
QString warning, cancelTxt, saveTxt;
if(digiDoc->state() == UnsignedContainer)
Expand All @@ -614,37 +569,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)
Expand Down Expand Up @@ -707,7 +653,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;
}
Expand All @@ -718,7 +664,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();
Expand Down Expand Up @@ -763,7 +709,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;
}

Expand All @@ -777,7 +723,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();
}

Expand All @@ -790,7 +736,7 @@ void MainWindow::removeSignatureFile(int index)
{
if(QFile::exists(digiDoc->fileName()))
QFile::remove(digiDoc->fileName());
resetDigiDoc(nullptr, false);
digiDoc.reset();
selectPage(Pages::SignIntro);
}
}
Expand All @@ -809,7 +755,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())
Expand All @@ -818,16 +764,16 @@ bool MainWindow::wrap(const QString& wrappedFile, bool enclose)
std::unique_ptr<DigiDoc> 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;
Expand Down
11 changes: 4 additions & 7 deletions client/MainWindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,38 +60,35 @@ 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 &info1, 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<DigiDoc> &&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 <typename F>
void sign(F &&sign);
bool validateFiles(const QString &container, const QStringList &files);
void updateSelector();
void updateSelectorData(TokenData data);
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> cryptoDoc;
DigiDoc* digiDoc = nullptr;
std::unique_ptr<DigiDoc> digiDoc;
Ui::MainWindow *ui;
};
2 changes: 0 additions & 2 deletions client/common_enums.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,7 @@ enum Actions : unsigned char {
ContainerCancel,
ContainerConvert,
ContainerEncrypt,
ContainerLocation,
ContainerSave,
ContainerSaveAs,

EncryptContainer,
DecryptContainer,
Expand Down
Loading
Loading