Skip to content

Commit 69ebb7e

Browse files
committed
Merge branch 'master' into libcdoc
# Conflicts: # client/MainWindow.h # client/widgets/AddressItem.ui
2 parents dbb5cf6 + 371a2f2 commit 69ebb7e

52 files changed

Lines changed: 424 additions & 1155 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/build.yml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ jobs:
1616
steps:
1717
- &Checkout
1818
name: Checkout
19-
uses: actions/checkout@v5
19+
uses: actions/checkout@v6
2020
with:
2121
submodules: recursive
2222
- name: Download artifact
@@ -36,7 +36,7 @@ jobs:
3636
sudo installer -verboseR -pkg opensc_*.pkg -target /
3737
rm -rf libdigidocpp-pkg
3838
- name: Cache libraries
39-
uses: actions/cache@v4
39+
uses: actions/cache@v5
4040
with:
4141
path: ${{ env.LIBS_PATH }}
4242
key: vcpkg-macOS-${{ hashFiles('prepare_osx_build_environment.sh') }}
@@ -60,7 +60,7 @@ jobs:
6060
cmake --build build --target macdeployqt
6161
cmake --build build --target zip
6262
- name: Archive artifacts
63-
uses: actions/upload-artifact@v5
63+
uses: actions/upload-artifact@v6
6464
with:
6565
name: macOS
6666
path: build/qdigidoc4*.zip
@@ -70,7 +70,7 @@ jobs:
7070
container: ubuntu:${{ matrix.container }}
7171
strategy:
7272
matrix:
73-
container: ['22.04', '24.04', '25.04', '25.10']
73+
container: ['22.04', '24.04', '25.10']
7474
arch: ['amd64', 'arm64']
7575
env:
7676
DEBIAN_FRONTEND: noninteractive
@@ -106,7 +106,7 @@ jobs:
106106
- name: Lintian
107107
run: lintian *.deb;
108108
- name: Archive artifacts
109-
uses: actions/upload-artifact@v5
109+
uses: actions/upload-artifact@v6
110110
with:
111111
name: ubuntu_${{ matrix.container }}_${{ matrix.arch }}
112112
path: qdigidoc4*.*
@@ -134,7 +134,7 @@ jobs:
134134
cmake -DCMAKE_INSTALL_PREFIX=/usr -B build -S .
135135
cmake --build build --target all package
136136
- name: Archive artifacts
137-
uses: actions/upload-artifact@v5
137+
uses: actions/upload-artifact@v6
138138
with:
139139
name: fedora_${{ matrix.container }}
140140
path: build/qdigidoc4*.rpm
@@ -161,7 +161,7 @@ jobs:
161161
Rename-Item "libdigidocpp*.msi" libdigidocpp.msi
162162
msiexec /qn /i libdigidocpp.msi
163163
- name: Cache vcpkg
164-
uses: actions/cache@v4
164+
uses: actions/cache@v5
165165
with:
166166
path: ${{ github.workspace }}/vcpkg_cache
167167
key: vcpkg-${{ matrix.vcver }}-${{ hashFiles('vcpkg.json') }}
@@ -195,7 +195,7 @@ jobs:
195195
cmake --build build --target msishellext
196196
cmake --build build --target appx
197197
- name: Archive artifacts
198-
uses: actions/upload-artifact@v5
198+
uses: actions/upload-artifact@v6
199199
with:
200200
name: msi_${{ matrix.vcver }}_x64
201201
path: |

client/Application.cpp

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
#include "QSmartCard.h"
3030
#include "DigiDoc.h"
3131
#include "Settings.h"
32-
#include "Styles.h"
3332
#ifdef Q_OS_MAC
3433
#include "MacMenuBar.h"
3534
#else
@@ -58,7 +57,6 @@ class MacMenuBar {};
5857
#include <QtCore/QJsonObject>
5958
#include <QtCore/QProcess>
6059
#include <QtCore/QRegularExpression>
61-
#include <QtCore/QStandardPaths>
6260
#include <QtCore/QTimer>
6361
#include <QtCore/QTranslator>
6462
#include <QtCore/QUrl>
@@ -317,10 +315,6 @@ Application::Application( int &argc, char **argv )
317315
setWindowIcon(QIcon(QStringLiteral(":/images/Icon.svg")));
318316
if(QFile::exists(QStringLiteral("%1/%2.log").arg(QDir::tempPath(), applicationName())))
319317
qInstallMessageHandler(msgHandler);
320-
QPalette p = palette();
321-
p.setBrush(QPalette::Link, QBrush("#2F70B6"));
322-
p.setBrush(QPalette::LinkVisited, QBrush("#2F70B6"));
323-
setPalette(p);
324318

325319
#if defined(Q_OS_WIN)
326320
AllowSetForegroundWindow( ASFW_ANY );
@@ -333,10 +327,6 @@ Application::Application( int &argc, char **argv )
333327
setLibraryPaths({ applicationDirPath() + "/../PlugIns" });
334328
#endif
335329
#endif
336-
setStyleSheet(QStringLiteral(
337-
"QDialogButtonBox { dialogbuttonbox-buttons-have-icons: 0; }\n"));
338-
339-
QNetworkProxyFactory::setUseSystemConfiguration(true);
340330

341331
QStringList args = arguments();
342332
args.removeFirst();
@@ -349,7 +339,18 @@ Application::Application( int &argc, char **argv )
349339
connect(this, &Application::messageReceived, this, qOverload<const QString&>(&Application::parseArgs));
350340
#endif
351341

342+
QPalette p = palette();
343+
p.setBrush(QPalette::Link, QBrush("#2F70B6"));
344+
p.setBrush(QPalette::LinkVisited, QBrush("#2F70B6"));
345+
setPalette(p);
346+
setStyleSheet(QStringLiteral(
347+
"QDialogButtonBox { dialogbuttonbox-buttons-have-icons: 0; }\n"));
348+
QNetworkProxyFactory::setUseSystemConfiguration(true);
352349
QFontDatabase::addApplicationFont(QStringLiteral(":/fonts/Roboto-Bold.ttf"));
350+
QFontDatabase::addApplicationFont(QStringLiteral(":/fonts/Roboto-Regular.ttf"));
351+
QFont f(QStringLiteral("Roboto, Helvetica"));
352+
f.setPixelSize(14);
353+
QToolTip::setFont(f);
353354

354355
#ifdef CONFIG_URL
355356
d->conf = new Configuration(this);
@@ -409,7 +410,6 @@ Application::Application( int &argc, char **argv )
409410
qRegisterMetaType<TokenData>("TokenData");
410411
qRegisterMetaType<QSmartCardData>("QSmartCardData");
411412
qRegisterMetaType<QEventLoop*>("QEventLoop*");
412-
QToolTip::setFont(Styles::font(Styles::Regular, 14));
413413
QDesktopServices::setUrlHandler(QStringLiteral("browse"), this, "browse");
414414
QDesktopServices::setUrlHandler(QStringLiteral("mailto"), this, "mailTo");
415415
QAccessible::installFactory([](const QString &classname, QObject *object) -> QAccessibleInterface* {
@@ -896,9 +896,6 @@ void Application::showClient(QStringList files, bool crypto, bool sign, bool new
896896
i = files.erase(i);
897897
}
898898

899-
if(sign)
900-
sign = files.size() != 1 || !CONTAINER_EXT.contains(QFileInfo(files.value(0)).suffix(), Qt::CaseInsensitive);
901-
902899
MainWindow *w = nullptr;
903900
if(newWindow)
904901
w = nullptr;
@@ -952,6 +949,8 @@ void Application::showClient(QStringList files, bool crypto, bool sign, bool new
952949
return;
953950
QMetaObject::invokeMethod(w, [&] {
954951
using enum ria::qdigidoc4::Pages;
952+
if(sign)
953+
sign = files.size() != 1 || !CONTAINER_EXT.contains(QFileInfo(files.value(0)).suffix(), Qt::CaseInsensitive);
955954
w->selectPage(crypto && !sign ? CryptoIntro : SignIntro);
956955
w->openFiles(std::move(files), false, sign);
957956
});

client/CMakeLists.txt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ add_executable(${PROJECT_NAME} WIN32 MACOSX_BUNDLE
3636
${PROJECT_NAME}.rc
3737
${WIDGETS}
3838
images/images.qrc
39-
fonts/fonts.qrc
4039
mac/Info.plist.cmake
4140
common_enums.h
4241
main.cpp
@@ -82,8 +81,6 @@ add_executable(${PROJECT_NAME} WIN32 MACOSX_BUNDLE
8281
Settings.h
8382
SslCertificate.cpp
8483
SslCertificate.h
85-
Styles.cpp
86-
Styles.h
8784
TokenData.cpp
8885
TokenData.h
8986
Utils.h
@@ -103,6 +100,10 @@ qt_add_translations(${PROJECT_NAME} TS_FILES
103100
LUPDATE_OPTIONS -locations none
104101
)
105102
qt_add_resources(${PROJECT_NAME} tsl BASE ${TSL_DIR} PREFIX /TSL FILES ${TSL_LIST})
103+
qt_add_resources(${PROJECT_NAME} fonts BASE fonts PREFIX /fonts FILES
104+
fonts/Roboto-Bold.ttf
105+
fonts/Roboto-Regular.ttf
106+
)
106107

107108
target_link_libraries(${PROJECT_NAME}
108109
qdigidoccommon

client/CryptoDoc.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -403,8 +403,8 @@ bool CryptoDoc::decrypt(const libcdoc::Lock *lock, const QByteArray& secret)
403403
(lock->type == libcdoc::Lock::Type::SERVER) &&
404404
!Settings::CDOC2_NOTIFICATION.isSet()) {
405405
auto *dlg = WarningDialog::create()
406-
->withTitle(QSigner::tr("Failed to decrypt document"))
407-
->withText(tr("You must enter your PIN code twice in order to decrypt the CDOC2 container. "
406+
->withTitle(tr("You must enter your PIN code twice in order to decrypt the CDOC2 container"))
407+
->withText(tr(
408408
"The first PIN entry is required for authentication to the key server referenced in the CDOC2 container. "
409409
"Second PIN entry is required to decrypt the CDOC2 container."))
410410
->setCancelText(WarningDialog::Cancel)

client/DigiDoc.cpp

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "Application.h"
2323
#include "CheckConnection.h"
2424
#include "Common.h"
25+
#include "MainWindow.h"
2526
#include "QSigner.h"
2627
#include "TokenData.h"
2728
#include "Utils.h"
@@ -602,12 +603,25 @@ void DigiDoc::removeSignature( unsigned int num )
602603
catch( const Exception &e ) { setLastError( tr("Failed remove signature from container"), e ); }
603604
}
604605

605-
bool DigiDoc::save( const QString &filename )
606+
bool DigiDoc::save(QString filename)
606607
{
607-
if(!filename.isEmpty())
608-
m_fileName = filename;
609-
if(!saveAs(m_fileName))
608+
if(filename.isEmpty())
609+
filename = m_fileName;
610+
QWidget *parentWidget = qobject_cast<QWidget*>(parent());
611+
if(!FileDialog::fileIsWritable(filename))
612+
{
613+
auto *dlg = WarningDialog::create(parentWidget)
614+
->withTitle(MainWindow::tr("Cannot alter container"))
615+
->withText(MainWindow::tr("Cannot alter container %1. Save different location?").arg(FileDialog::normalized(filename)))
616+
->addButton(WarningDialog::YES, QMessageBox::Yes);
617+
if(dlg->exec() != QMessageBox::Yes)
618+
return false;
619+
if(filename = FileDialog::getSaveFileName(parentWidget, FileDialog::tr("Save file"), filename); filename.isEmpty())
620+
return false;
621+
}
622+
if(!saveAs(filename))
610623
return false;
624+
m_fileName = filename;
611625
Application::addRecent(m_fileName);
612626
modified = false;
613627
containerState = signatures().isEmpty() ? ContainerState::UnsignedSavedContainer : ContainerState::SignedContainer;

client/DigiDoc.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ class DigiDoc: public QObject
132132
bool move(const QString &to);
133133
bool open( const QString &file );
134134
void removeSignature( unsigned int num );
135-
bool save(const QString &filename = {});
135+
bool save(QString filename = {});
136136
bool saveAs(const QString &filename);
137137
bool sign(const QString &city,
138138
const QString &state,

client/MainWindow.cpp

Lines changed: 19 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343
#include "widgets/WarningList.h"
4444

4545
#include <QtCore/QMimeData>
46-
#include <QtCore/QStandardPaths>
4746
#include <QtGui/QDragEnterEvent>
4847
#include <QtWidgets/QMessageBox>
4948

@@ -104,15 +103,15 @@ MainWindow::MainWindow( QWidget *parent )
104103
connect(ui->signIntroButton, &QPushButton::clicked, this, [this] { openContainer(true); });
105104
connect(ui->cryptoIntroButton, &QPushButton::clicked, this, [this] { openContainer(false); });
106105
connect(ui->signContainerPage, &ContainerPage::action, this, &MainWindow::onSignAction);
107-
connect(ui->signContainerPage, &ContainerPage::addFiles, this, [this](const QStringList &files) { openFiles(files, true); } );
106+
connect(ui->signContainerPage, &ContainerPage::addFiles, this, [this](const QStringList &files) { openFiles(files); } );
108107
connect(ui->signContainerPage, &ContainerPage::removed, this, &MainWindow::removeSignature);
109108
connect(ui->signContainerPage, &ContainerPage::warning, this, [this](WarningText warningText) {
110109
ui->warnings->showWarning(std::move(warningText));
111110
ui->signature->warningIcon(true);
112111
});
113112

114113
connect(ui->cryptoContainerPage, &ContainerPage::action, this, &MainWindow::onCryptoAction);
115-
connect(ui->cryptoContainerPage, &ContainerPage::addFiles, this, [this](const QStringList &files) { openFiles(files, true); } );
114+
connect(ui->cryptoContainerPage, &ContainerPage::addFiles, this, [this](const QStringList &files) { openFiles(files); } );
116115
connect(ui->cryptoContainerPage, &ContainerPage::warning, this, [this](WarningText warningText) {
117116
ui->warnings->showWarning(std::move(warningText));
118117
ui->crypto->warningIcon(true);
@@ -404,10 +403,6 @@ void MainWindow::onSignAction(int action, const QString &idCode, const QString &
404403
if(digiDoc)
405404
convertToCDoc();
406405
break;
407-
case ContainerSave:
408-
save();
409-
ui->signContainerPage->transition(digiDoc.get());
410-
break;
411406
default:
412407
break;
413408
}
@@ -522,24 +517,19 @@ void MainWindow::openFiles(QStringList files, bool addFile, bool forceCreate)
522517
break;
523518
case ContainerState::UnsignedContainer:
524519
case ContainerState::UnsignedSavedContainer:
525-
case ContainerState::UnencryptedContainer:
526-
create = !addFile;
527-
if(addFile)
528-
{
529-
page = (state == ContainerState::UnencryptedContainer) ? CryptoDetails : SignDetails;
530-
if(page != CryptoDetails && digiDoc->isPDF() && !wrap(digiDoc->fileName(), true))
531-
return;
532-
DocumentModel* model = (current == CryptoDetails) ?
533-
cryptoDoc->documentModel() : digiDoc->documentModel();
534-
for(const auto &file: files)
535-
model->addFile(file);
536-
selectPage(page);
520+
if(digiDoc->isPDF() && !wrap(digiDoc->fileName(), true))
537521
return;
538-
}
539-
// If browsed (double-clicked in Explorer/Finder, clicked on bdoc/cdoc in opened container)
540-
// or recently opened file is opened, then new container should be created.
541-
page = (state == ContainerState::UnencryptedContainer) ? SignDetails : CryptoDetails;
542-
break;
522+
for(DocumentModel* model = digiDoc->documentModel();
523+
const auto &file: std::as_const(files))
524+
model->addFile(file);
525+
selectPage(SignDetails);
526+
return;
527+
case ContainerState::UnencryptedContainer:
528+
for(DocumentModel* model = cryptoDoc->documentModel();
529+
const auto &file: std::as_const(files))
530+
model->addFile(file);
531+
selectPage(CryptoDetails);
532+
return;
543533
default:
544534
if(addFile)
545535
{
@@ -596,36 +586,15 @@ void MainWindow::resetDigiDoc(std::unique_ptr<DigiDoc> &&doc)
596586
->addButton(tr("Save"), QMessageBox::Save);
597587
}
598588
if(dlg->exec() == QMessageBox::Save)
599-
save();
589+
digiDoc->save();
600590
}
601591
digiDoc = std::move(doc);
602592
}
603593

604-
bool MainWindow::save()
605-
{
606-
if(!digiDoc)
607-
return false;
608-
609-
QString target = digiDoc->fileName();
610-
while(!FileDialog::fileIsWritable(target))
611-
{
612-
auto *dlg = WarningDialog::create(this)
613-
->withTitle(tr("Cannot alter container"))
614-
->withText(tr("Cannot alter container %1. Save different location?").arg(FileDialog::normalized(target)))
615-
->addButton(WarningDialog::YES, QMessageBox::Yes);
616-
if(dlg->exec() != QMessageBox::Yes)
617-
return false;
618-
if(target = FileDialog::getSaveFileName(this, FileDialog::tr("Save file"), target); target.isEmpty())
619-
return false;
620-
}
621-
bool result = digiDoc->save(target);
622-
if(result)
623-
ui->signContainerPage->setHeader(target);
624-
return result;
625-
}
626-
627594
void MainWindow::selectPage(Pages page)
628595
{
596+
if(ui->startScreen->currentIndex() == page)
597+
return;
629598
auto *btn = page < CryptoIntro ? ui->signature : (page == MyEid ? ui->myEid : ui->crypto);
630599
btn->setChecked(true);
631600
ui->startScreen->setCurrentIndex(page);
@@ -692,7 +661,7 @@ void MainWindow::sign(F &&sign)
692661
else if(!sign(city, state, zip, country, role))
693662
return;
694663

695-
if(!save())
664+
if(!digiDoc->save())
696665
return;
697666

698667
ui->signContainerPage->transition(digiDoc.get());
@@ -707,7 +676,7 @@ void MainWindow::removeSignature(int index)
707676
return;
708677
WaitDialogHolder waitDialog(this, tr("Removing signature"));
709678
digiDoc->removeSignature(unsigned(index));
710-
save();
679+
digiDoc->save();
711680
ui->signContainerPage->transition(digiDoc.get());
712681
adjustDrops();
713682
}

client/MainWindow.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,9 @@ namespace Ui {
2929
class MainWindow;
3030
}
3131

32-
struct CDKey;
3332
class CryptoDoc;
3433
class DigiDoc;
35-
class DocumentModel;
36-
class PageIcon;
3734
class TokenData;
38-
class WarningList;
3935

4036
class MainWindow final : public QWidget
4137
{
@@ -72,7 +68,6 @@ class MainWindow final : public QWidget
7268
void openContainer(bool signature);
7369
void resetDigiDoc(std::unique_ptr<DigiDoc> &&doc);
7470
void removeSignature(int index);
75-
bool save();
7671
template <typename F>
7772
void sign(F &&sign);
7873
void updateSelector();

0 commit comments

Comments
 (0)