Skip to content

Commit 7b4bbdb

Browse files
authored
Handle document extension signle place and handle asics (#1370)
IB-8624 Signed-off-by: Raul Metsma <[email protected]>
1 parent b7648da commit 7b4bbdb

File tree

9 files changed

+71
-99
lines changed

9 files changed

+71
-99
lines changed

client/CryptoDoc.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,8 @@ bool CDocumentModel::addFile(const QString &file, const QString &mime)
122122
}
123123

124124
auto data = std::make_unique<QFile>(file);
125-
data->open(QFile::ReadOnly);
125+
if(!data->open(QFile::ReadOnly))
126+
return false;
126127
d->cdoc->files.push_back({
127128
QFileInfo(file).fileName(),
128129
QStringLiteral("D%1").arg(d->cdoc->files.size()),
@@ -209,12 +210,11 @@ QString CDocumentModel::save(int row, const QString &path) const
209210
if(d->isEncrypted)
210211
return {};
211212

212-
int zone = FileDialog::fileZone(d->fileName);
213213
QString fileName = copy(row, path);
214214
QFileInfo f(fileName);
215215
if(!f.exists())
216216
return {};
217-
FileDialog::setFileZone(fileName, zone);
217+
FileDialog::setFileZone(fileName, d->fileName);
218218
return fileName;
219219
}
220220

client/DigiDoc.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -390,9 +390,8 @@ QString SDocumentModel::save(int row, const QString &path) const
390390
return {};
391391

392392
QFile::remove( path );
393-
int zone = FileDialog::fileZone(doc->fileName());
394393
doc->b->dataFiles().at(size_t(row))->saveAs(path.toStdString());
395-
FileDialog::setFileZone(path, zone);
394+
FileDialog::setFileZone(path, doc->fileName());
396395
return path;
397396
}
398397

client/MainWindow.cpp

Lines changed: 7 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -420,14 +420,14 @@ void MainWindow::convertToCDoc()
420420

421421
void MainWindow::moveCryptoContainer()
422422
{
423-
QString to = selectFile(tr("Move file"), cryptoDoc->fileName(), true);
423+
QString to = FileDialog::getSaveFileName(this, tr("Move file"), cryptoDoc->fileName());
424424
if(!to.isNull() && cryptoDoc->move(to))
425425
emit ui->cryptoContainerPage->moved(to);
426426
}
427427

428428
void MainWindow::moveSignatureContainer()
429429
{
430-
QString to = selectFile(tr("Move file"), digiDoc->fileName(), true);
430+
QString to = FileDialog::getSaveFileName(this, tr("Move file"), digiDoc->fileName());
431431
if(!to.isNull() && digiDoc->move(to))
432432
emit ui->signContainerPage->moved(to);
433433
}
@@ -463,15 +463,15 @@ void MainWindow::onCryptoAction(int action, const QString &/*id*/, const QString
463463
{
464464
if(!cryptoDoc)
465465
break;
466-
QString target = selectFile(tr("Save file"), cryptoDoc->fileName(), true);
466+
QString target = FileDialog::getSaveFileName(this, tr("Save file"), cryptoDoc->fileName());
467467
if(target.isEmpty())
468468
break;
469469
if( !FileDialog::fileIsWritable(target))
470470
{
471471
auto *dlg = new WarningDialog(tr("Cannot alter container %1. Save different location?").arg(target), this);
472472
dlg->addButton(WarningDialog::YES, QMessageBox::Yes);
473473
if(dlg->exec() == QMessageBox::Yes) {
474-
QString file = selectFile(tr("Save file"), target, true);
474+
QString file = FileDialog::getSaveFileName(this, tr("Save file"), target);
475475
if(!file.isEmpty())
476476
cryptoDoc->saveCopy(file);
477477
}
@@ -579,7 +579,7 @@ void MainWindow::openFiles(const QStringList &files, bool addFile, bool forceCre
579579

580580
void MainWindow::openContainer(bool signature)
581581
{
582-
QString filter = QFileDialog::tr("All Files (*)") + QStringLiteral(";;") + tr("Documents (%1)");
582+
QString filter = QFileDialog::tr("All Files (*)") + QStringLiteral(";;") + FileDialog::tr("Documents (%1)");
583583
if(signature)
584584
filter = filter.arg(QStringLiteral("*.bdoc *.ddoc *.asice *.sce *.asics *.scs *.edoc *.adoc%1")
585585
.arg(Application::confValue(Application::SiVaUrl).toString().isEmpty() ? QLatin1String() : QLatin1String(" *.pdf")));
@@ -631,7 +631,7 @@ bool MainWindow::save(bool saveAs)
631631

632632
QString target = digiDoc->fileName();
633633
if(saveAs)
634-
target = selectFile(tr("Save file"), target, true);
634+
target = FileDialog::getSaveFileName(this, tr("Save file"), target);
635635
if(target.isEmpty())
636636
return false;
637637

@@ -640,47 +640,13 @@ bool MainWindow::save(bool saveAs)
640640
auto *dlg = new WarningDialog(tr("Cannot alter container %1. Save different location?").arg(target), this);
641641
dlg->addButton(WarningDialog::YES, QMessageBox::Yes);
642642
if(dlg->exec() == QMessageBox::Yes) {
643-
if(QString file = selectFile(tr("Save file"), target, true); !file.isEmpty())
643+
if(QString file = FileDialog::getSaveFileName(this, tr("Save file"), target); !file.isEmpty())
644644
return saveAs ? digiDoc->saveAs(file) : digiDoc->save(file);
645645
}
646646
}
647647
return saveAs ? digiDoc->saveAs(target) : digiDoc->save(target);
648648
}
649649

650-
QString MainWindow::selectFile( const QString &title, const QString &filename, bool fixedExt )
651-
{
652-
static const QString adoc = tr("Documents (%1)").arg(QLatin1String("*.adoc"));
653-
static const QString bdoc = tr("Documents (%1)").arg(QLatin1String("*.bdoc"));
654-
static const QString cdoc = tr("Documents (%1)").arg(QLatin1String("*.cdoc"));
655-
static const QString cdoc2 = tr("Documents (%1)").arg(QLatin1String("*.cdoc2"));
656-
static const QString edoc = tr("Documents (%1)").arg(QLatin1String("*.edoc"));
657-
static const QString asic = tr("Documents (%1)").arg(QLatin1String("*.asice *.sce"));
658-
const QString ext = QFileInfo( filename ).suffix().toLower();
659-
QStringList exts;
660-
QString active;
661-
if( fixedExt )
662-
{
663-
if(ext == QLatin1String("bdoc")) exts.append(bdoc);
664-
if(ext == QLatin1String("cdoc")) exts.append(cdoc);
665-
if(ext == QLatin1String("cdoc2")) exts.append(cdoc2);
666-
if(ext == QLatin1String("asice") || ext == QLatin1String("sce")) exts.append(asic);
667-
if(ext == QLatin1String("edoc")) exts.append(edoc);
668-
if(ext == QLatin1String("adoc")) exts.append(adoc);
669-
}
670-
else
671-
{
672-
exts = QStringList{ bdoc, asic, edoc, adoc };
673-
if(ext == QLatin1String("bdoc")) active = bdoc;
674-
if(ext == QLatin1String("cdoc")) active = cdoc;
675-
if(ext == QLatin1String("cdoc2")) active = cdoc2;
676-
if(ext == QLatin1String("asice") || ext == QLatin1String("sce")) active = asic;
677-
if(ext == QLatin1String("edoc")) active = edoc;
678-
if(ext == QLatin1String("adoc")) active = adoc;
679-
}
680-
681-
return FileDialog::getSaveFileName( this, title, filename, exts.join(QLatin1String(";;")), &active );
682-
}
683-
684650
void MainWindow::selectPage(Pages page)
685651
{
686652
auto *btn = page < CryptoIntro ? ui->signature : (page == MyEid ? ui->myEid : ui->crypto);

client/MainWindow.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,6 @@ class MainWindow final : public QWidget
7979
void removeSignature(int index);
8080
void removeSignatureFile(int index);
8181
bool save(bool saveAs = false);
82-
QString selectFile( const QString &title, const QString &filename, bool fixedExt );
8382
template <typename F>
8483
void sign(F &&sign);
8584
bool validateFiles(const QString &container, const QStringList &files);

client/dialogs/FileDialog.cpp

Lines changed: 46 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919

2020
#include "FileDialog.h"
2121

22-
#include "Application.h"
2322
#include "Settings.h"
2423
#include "dialogs/WarningDialog.h"
2524

@@ -47,6 +46,8 @@ class CPtr
4746
inline operator T*() const { return d; }
4847
inline T** operator&() { return &d; }
4948
};
49+
#elif defined(Q_OS_MAC)
50+
#include <sys/xattr.h>
5051
#endif
5152

5253
#include <array>
@@ -61,7 +62,7 @@ QString FileDialog::createNewFileName(const QString &file, bool signature, QWidg
6162
const QFileInfo f(normalized(file));
6263
QString dir = defaultDir.isEmpty() ? f.absolutePath() : defaultDir;
6364
QString fileName = QDir::toNativeSeparators(dir + QDir::separator() + f.completeBaseName() + extension);
64-
#ifndef Q_OS_OSX
65+
#ifndef Q_OS_MACOS
6566
// macOS App Sandbox restricts the rights of the application to write to the filesystem outside of
6667
// app sandbox; user must explicitly give permission to write data to the specific folders.
6768
if(!QFile::exists(fileName))
@@ -107,23 +108,6 @@ bool FileDialog::fileIsWritable( const QString &filename )
107108
return result;
108109
}
109110

110-
int FileDialog::fileZone(const QString &path)
111-
{
112-
#ifdef Q_OS_WIN
113-
CPtr<IZoneIdentifier> spzi;
114-
CPtr<IPersistFile> spf;
115-
DWORD dwZone = 0;
116-
if(SUCCEEDED(CoCreateInstance(CLSID_PersistentZoneIdentifier, nullptr, CLSCTX_INPROC, IID_PPV_ARGS(&spzi))) &&
117-
SUCCEEDED(spzi->QueryInterface(&spf)) &&
118-
SUCCEEDED(spf->Load(LPCWSTR(QDir::toNativeSeparators(path).utf16()), STGM_READ)) &&
119-
SUCCEEDED(spzi->GetId(&dwZone)))
120-
return int(dwZone);
121-
#else
122-
Q_UNUSED(path)
123-
#endif
124-
return -1;
125-
}
126-
127111
bool FileDialog::isSignedPDF(const QString &path)
128112
{
129113
if(!path.endsWith(QLatin1String("pdf"), Qt::CaseInsensitive))
@@ -136,25 +120,33 @@ bool FileDialog::isSignedPDF(const QString &path)
136120
return std::any_of(list.begin(), list.end(), [&blob](const char *token) { return blob.indexOf(token) > 0; });
137121
}
138122

139-
void FileDialog::setFileZone(const QString &path, int zone)
123+
void FileDialog::setFileZone(const QString &target, const QString &source)
140124
{
141-
if(zone < 0)
142-
return;
143125
#ifdef Q_OS_WIN
144126
CPtr<IZoneIdentifier> spzi;
145127
CPtr<IPersistFile> spf;
146-
if(SUCCEEDED(CoCreateInstance(CLSID_PersistentZoneIdentifier, nullptr, CLSCTX_INPROC, IID_PPV_ARGS(&spzi))) &&
147-
SUCCEEDED(spzi->SetId(zone)) &&
148-
SUCCEEDED(spzi->QueryInterface(&spf)))
149-
spf->Save(LPCWSTR(QDir::toNativeSeparators(path).utf16()), TRUE);
128+
if(SUCCEEDED(CoCreateInstance(CLSID_PersistentZoneIdentifier, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&spzi))) &&
129+
SUCCEEDED(spzi->QueryInterface(&spf)) &&
130+
SUCCEEDED(spf->Load(LPCWSTR(QDir::toNativeSeparators(source).utf16()), STGM_READ)))
131+
spf->Save(LPCWSTR(QDir::toNativeSeparators(target).utf16()), TRUE);
132+
#elif defined(Q_OS_MACOS)
133+
QByteArray p = QFile::encodeName(source);
134+
ssize_t n = getxattr(p.constData(), "com.apple.quarantine", nullptr, 0, 0, 0);
135+
if(n <= 0)
136+
return;
137+
QByteArray value(int(n), Qt::Uninitialized);
138+
n = getxattr(p.constData(), "com.apple.quarantine", value.data(), value.size(), 0, 0);
139+
if(n > 0)
140+
setxattr(QFile::encodeName(target).constData(), "com.apple.quarantine", value.constData(), size_t(n), 0, 0);
150141
#else
151-
Q_UNUSED(path)
142+
Q_UNUSED(target)
143+
Q_UNUSED(source)
152144
#endif
153145
}
154146

155147
void FileDialog::setReadOnly(const QString &path, bool readonly)
156148
{
157-
#if defined(Q_OS_WIN)
149+
#ifdef Q_OS_WIN
158150
::SetFileAttributesW(LPCWSTR(path.utf16()), readonly ? FILE_ATTRIBUTE_READONLY : FILE_ATTRIBUTE_NORMAL);
159151
#else
160152
QFile::setPermissions(path, QFile::Permissions(QFile::Permission::ReadOwner)
@@ -164,7 +156,7 @@ void FileDialog::setReadOnly(const QString &path, bool readonly)
164156

165157
QString FileDialog::getDir( const QString &dir )
166158
{
167-
#ifdef Q_OS_OSX
159+
#ifdef Q_OS_MACOS
168160
Q_UNUSED(dir)
169161
QString path = QSettings().value(QStringLiteral("NSNavLastRootDirectory")).toString();
170162
path.replace('~', QDir::homePath());
@@ -266,14 +258,32 @@ QString FileDialog::getExistingDirectory( QWidget *parent, const QString &captio
266258
return result( res );
267259
}
268260

269-
QString FileDialog::getSaveFileName( QWidget *parent, const QString &caption,
270-
const QString &dir, const QString &filter, QString *selectedFilter, Options options )
261+
QString FileDialog::getSaveFileName(QWidget *parent, const QString &caption, const QString &filename, QString filter)
271262
{
263+
if(filename.endsWith(QLatin1String(".adoc"), Qt::CaseInsensitive))
264+
filter = tr("Documents (%1)").arg(QLatin1String("*.adoc"));
265+
else if(filename.endsWith(QLatin1String(".asice"), Qt::CaseInsensitive) ||
266+
filename.endsWith(QLatin1String(".sce"), Qt::CaseInsensitive))
267+
filter = tr("Documents (%1)").arg(QLatin1String("*.asice *.sce"));
268+
else if(filename.endsWith(QLatin1String(".asics"), Qt::CaseInsensitive) ||
269+
filename.endsWith(QLatin1String(".scs"), Qt::CaseInsensitive))
270+
filter = tr("Documents (%1)").arg(QLatin1String("*.asics *.scs"));
271+
else if(filename.endsWith(QLatin1String(".bdoc"), Qt::CaseInsensitive))
272+
filter = tr("Documents (%1)").arg(QLatin1String("*.bdoc"));
273+
else if(filename.endsWith(QLatin1String(".cdoc"), Qt::CaseInsensitive))
274+
filter = tr("Documents (%1)").arg(QLatin1String("*.cdoc"));
275+
else if(filename.endsWith(QLatin1String(".cdoc2"), Qt::CaseInsensitive))
276+
filter = tr("Documents (%1)").arg(QLatin1String("*.cdoc2"));
277+
else if(filename.endsWith(QLatin1String(".ddoc"), Qt::CaseInsensitive))
278+
filter = tr("Documents (%1)").arg(QLatin1String("*.ddoc"));
279+
else if(filename.endsWith(QLatin1String(".edoc"), Qt::CaseInsensitive))
280+
filter = tr("Documents (%1)").arg(QLatin1String("*.edoc"));
281+
else if(filename.endsWith(QLatin1String(".pdf"), Qt::CaseInsensitive))
282+
filter = tr("Documents (%1)").arg(QLatin1String("*.pdf"));
272283
QString file;
273284
while( true )
274285
{
275-
file = QFileDialog::getSaveFileName(parent,
276-
caption, normalized(dir), filter, selectedFilter, options);
286+
file = QFileDialog::getSaveFileName(parent, caption, normalized(filename), filter);
277287
if( !file.isEmpty() && !fileIsWritable( file ) )
278288
{
279289
WarningDialog::show(parent, tr( "You don't have sufficient privileges to write this file into folder %1" ).arg( file ));
@@ -301,7 +311,7 @@ QString FileDialog::normalized(const QString &data)
301311

302312
QString FileDialog::result( const QString &str )
303313
{
304-
#ifndef Q_OS_OSX
314+
#ifndef Q_OS_MACOS
305315
if(!str.isEmpty())
306316
Settings::LAST_PATH = QFileInfo(str).absolutePath();
307317
#else
@@ -322,7 +332,7 @@ QString FileDialog::tempPath(const QString &file)
322332
{
323333
QDir tmp = QDir::temp();
324334
if(!tmp.exists(file))
325-
return tmp.path() + "/" + file;
335+
return tmp.path() + '/' + file;
326336
QFileInfo info(file);
327337
int i = 0;
328338
while(tmp.exists(QStringLiteral("%1_%2.%3").arg(info.baseName()).arg(i).arg(info.suffix())))
@@ -334,7 +344,7 @@ QString FileDialog::safeName(const QString &file)
334344
{
335345
QFileInfo info(file);
336346
QString filename = info.fileName();
337-
#if defined(Q_OS_WIN)
347+
#ifdef Q_OS_WIN
338348
static const QStringList disabled { "CON", "PRN", "AUX", "NUL",
339349
"COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9",
340350
"LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9" };

client/dialogs/FileDialog.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,8 @@ class FileDialog : public QFileDialog
3636
static QString createNewFileName(const QString &file, bool signature, QWidget *parent);
3737
static FileType detect(const QString &filename);
3838
static bool fileIsWritable( const QString &filename );
39-
static int fileZone(const QString &path);
4039
static bool isSignedPDF(const QString &path);
41-
static void setFileZone(const QString &path, int zone);
40+
static void setFileZone(const QString &target, const QString &source);
4241
static void setReadOnly(const QString &path, bool readonly = true);
4342
static QString normalized(const QString &file);
4443
static QString safeName(const QString &file);
@@ -53,8 +52,7 @@ class FileDialog : public QFileDialog
5352
static QString getExistingDirectory(QWidget *parent = nullptr, const QString &caption = {},
5453
const QString &dir = {}, Options options = {});
5554
static QString getSaveFileName(QWidget *parent = nullptr, const QString &caption = {},
56-
const QString &dir = {}, const QString &filter = {},
57-
QString *selectedFilter = nullptr, Options options = {});
55+
const QString &filename = {}, QString filter = {});
5856

5957
private:
6058
static QString result( const QString &str );

client/translations/en.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -840,6 +840,10 @@
840840
<source>Create %1</source>
841841
<translation>Create %1</translation>
842842
</message>
843+
<message>
844+
<source>Documents (%1)</source>
845+
<translation>Documents (%1)</translation>
846+
</message>
843847
</context>
844848
<context>
845849
<name>FileItem</name>
@@ -1345,10 +1349,6 @@ ID-Card</translation>
13451349
<source>Cannot alter container %1. Save different location?</source>
13461350
<translation>Cannot alter container %1. Save to different location?</translation>
13471351
</message>
1348-
<message>
1349-
<source>Documents (%1)</source>
1350-
<translation>Documents (%1)</translation>
1351-
</message>
13521352
<message>
13531353
<source>Save file</source>
13541354
<translation>Save file</translation>

client/translations/et.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -840,6 +840,10 @@
840840
<source>Create %1</source>
841841
<translation>Loo %1</translation>
842842
</message>
843+
<message>
844+
<source>Documents (%1)</source>
845+
<translation>Dokumendid (%1)</translation>
846+
</message>
843847
</context>
844848
<context>
845849
<name>FileItem</name>
@@ -1345,10 +1349,6 @@ ID-kaardiga</translation>
13451349
<source>Cannot alter container %1. Save different location?</source>
13461350
<translation>Ümbriku %1 salvestamine ebaõnnestus. Salvestada teise asukohta?</translation>
13471351
</message>
1348-
<message>
1349-
<source>Documents (%1)</source>
1350-
<translation>Dokumendid (%1)</translation>
1351-
</message>
13521352
<message>
13531353
<source>Save file</source>
13541354
<translation>Salvesta fail</translation>

client/translations/ru.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -840,6 +840,10 @@
840840
<source>Create %1</source>
841841
<translation>Создайте %1</translation>
842842
</message>
843+
<message>
844+
<source>Documents (%1)</source>
845+
<translation>Документы (%1)</translation>
846+
</message>
843847
</context>
844848
<context>
845849
<name>FileItem</name>
@@ -1345,10 +1349,6 @@ ID-картой</translation>
13451349
<source>Cannot alter container %1. Save different location?</source>
13461350
<translation>Сохранение контейнера %1 не удалось. Сохранить в другой каталог?</translation>
13471351
</message>
1348-
<message>
1349-
<source>Documents (%1)</source>
1350-
<translation>Документы (%1)</translation>
1351-
</message>
13521352
<message>
13531353
<source>Save file</source>
13541354
<translation>Сохранить файл</translation>

0 commit comments

Comments
 (0)