Skip to content

Commit

Permalink
Extend signature to LTA
Browse files Browse the repository at this point in the history
Signed-off-by: Raul Metsma <raul@metsma.ee>
  • Loading branch information
metsma committed Dec 10, 2024
1 parent c945e57 commit 65fcd18
Show file tree
Hide file tree
Showing 8 changed files with 134 additions and 103 deletions.
109 changes: 80 additions & 29 deletions client/DigiDoc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -448,6 +448,52 @@ DocumentModel* DigiDoc::documentModel() const
return m_documentModel.get();
}

bool DigiDoc::extend()
{
try {
auto *signer = qApp->signer();
signer->setProfile("time-stamp-token");
signer->setUserAgent(QStringLiteral("%1/%2 (%3) Devices: %4").arg(
QCoreApplication::applicationName(),
QCoreApplication::applicationVersion(),
Common::applicationOs(),
Common::drivers().join(',')).toUtf8().constData());
qApp->waitForTSL(fileName());
QWidget *parent = qobject_cast<QWidget *>(QObject::parent());
if(parent == nullptr)
parent = Application::activeWindow();
ServiceConfirmation cb(parent);
QString current = m_fileName;
if(waitFor([&] {
if(auto container = Container::extendContainerValidity(*b, signer))
load(std::move(container), cb);
return true;
}))
{
const QString asics = QCoreApplication::translate("MainWindow", "Documents (%1)").arg(QLatin1String("*.asics *.scs"));
QFileInfo f(current);
QString name = f.absolutePath() + '/' + f.completeBaseName() + QStringLiteral(".asics");
return save(FileDialog::getSaveFileName(Application::mainWindow(), QCoreApplication::translate("MainWindow", "Save file"), name, asics));
}
}
catch(const Exception &e)
{
Exception::ExceptionCode code = Exception::General;
QStringList causes = parseException(e, code);
switch(code)
{
case Exception::NetworkError:
case Exception::HostNotFound:
WarningDialog::show(tr("Failed to sign container. Please check the access to signing services and network settings."), causes.join('\n')); break;
case Exception::InvalidUrl:
WarningDialog::show(tr("Failed to sign container. Signing service URL is incorrect."), causes.join('\n')); break;
default:
setLastError(tr("Failed to sign container."), e); break;
}
}
return false;
}

QString DigiDoc::fileName() const { return m_fileName; }

bool DigiDoc::isError(bool failure, const QString &msg) const
Expand Down Expand Up @@ -485,6 +531,39 @@ bool DigiDoc::isSupported() const
return b && b->mediaType() == "application/vnd.etsi.asic-e+zip" && !isCades();
}

void DigiDoc::load(std::unique_ptr<Container> &&doc, ServiceConfirmation &cb)
{
clear();
b = std::move(doc);
if(b && b->mediaType() == "application/vnd.etsi.asic-s+zip" &&
b->dataFiles().size() == 1 &&
b->signatures().size() == 1)
{
const DataFile *f = b->dataFiles().at(0);
if(from(f->fileName()).endsWith(QStringLiteral(".ddoc"), Qt::CaseInsensitive))
{
const QString tmppath = FileDialog::tempPath(FileDialog::safeName(from(f->fileName())));
f->saveAs(to(tmppath));
if(QFileInfo::exists(tmppath))
{
m_tempFiles.append(tmppath);
try {
parentContainer = std::exchange(b, Container::openPtr(to(tmppath), &cb));
} catch(const Exception &) {}
}
}
}
bool isTimeStamped = parentContainer && parentContainer->signatures().at(0)->trustedSigningTime().compare("2018-07-01T00:00:00Z") < 0;
for(const Signature *signature: b->signatures())
m_signatures.append(DigiDocSignature(signature, this, isTimeStamped));
if(parentContainer)
{
for(const Signature *signature: parentContainer->signatures())
m_timestamps.append(DigiDocSignature(signature, this));
}
containerState = signatures().isEmpty() ? ContainerState::UnsignedSavedContainer : ContainerState::SignedContainer;
}

QString DigiDoc::mediaType() const
{ return b ? from( b->mediaType() ) : QString(); }

Expand Down Expand Up @@ -513,40 +592,12 @@ bool DigiDoc::open( const QString &file )
parent = Application::activeWindow();
ServiceConfirmation cb(parent);
qApp->waitForTSL( file );
clear();
try {
WaitDialogHolder waitDialog(parent, tr("Opening"), false);
return waitFor([&] {
b = Container::openPtr(to(file), &cb);
if(b && b->mediaType() == "application/vnd.etsi.asic-s+zip" &&
b->dataFiles().size() == 1 &&
b->signatures().size() == 1)
{
const DataFile *f = b->dataFiles().at(0);
if(from(f->fileName()).endsWith(QStringLiteral(".ddoc"), Qt::CaseInsensitive))
{
const QString tmppath = FileDialog::tempPath(FileDialog::safeName(from(f->fileName())));
f->saveAs(to(tmppath));
if(QFileInfo::exists(tmppath))
{
m_tempFiles.append(tmppath);
try {
parentContainer = std::exchange(b, Container::openPtr(to(tmppath), &cb));
} catch(const Exception &) {}
}
}
}
bool isTimeStamped = parentContainer && parentContainer->signatures().at(0)->trustedSigningTime().compare("2018-07-01T00:00:00Z") < 0;
for(const Signature *signature: b->signatures())
m_signatures.append(DigiDocSignature(signature, this, isTimeStamped));
if(parentContainer)
{
for(const Signature *signature: parentContainer->signatures())
m_timestamps.append(DigiDocSignature(signature, this));
}
load(Container::openPtr(to(file), &cb), cb);
Application::addRecent(file);
m_fileName = file;
containerState = signatures().isEmpty() ? ContainerState::UnsignedSavedContainer : ContainerState::SignedContainer;
return true;
});
} catch(const Exception &e) {
Expand Down
3 changes: 3 additions & 0 deletions client/DigiDoc.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ class SDocumentModel final: public DocumentModel
friend class DigiDoc;
};

struct ServiceConfirmation;

class DigiDoc: public QObject
{
Expand All @@ -122,6 +123,7 @@ class DigiDoc: public QObject
void create( const QString &file );
void clear();
DocumentModel *documentModel() const;
bool extend();
QString fileName() const;
bool isAsicS() const;
bool isCades() const;
Expand Down Expand Up @@ -149,6 +151,7 @@ class DigiDoc: public QObject

private:
bool isError(bool failure, const QString &msg = {}) const;
void load(std::unique_ptr<digidoc::Container> &&doc, ServiceConfirmation &cb);
static void setLastError( const QString &msg, const digidoc::Exception &e );

std::unique_ptr<digidoc::Container> b;
Expand Down
29 changes: 4 additions & 25 deletions client/MainWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -124,8 +124,6 @@ MainWindow::MainWindow( QWidget *parent )
updateSelectorData(token);
updateMyEID(token);
ui->cryptoContainerPage->cardChanged(token.cert());
if(cryptoDoc)
ui->cryptoContainerPage->update(cryptoDoc, token.cert());
});
QPCSC::instance().start();

Expand All @@ -151,8 +149,6 @@ MainWindow::MainWindow( QWidget *parent )
connect(ui->cryptoContainerPage, &ContainerPage::action, this, &MainWindow::onCryptoAction);
connect(ui->cryptoContainerPage, &ContainerPage::addFiles, this, [this](const QStringList &files) { openFiles(files, true); } );
connect(ui->cryptoContainerPage, &ContainerPage::fileRemoved, this, &MainWindow::removeCryptoFile);
connect(ui->cryptoContainerPage, &ContainerPage::keysSelected, this, &MainWindow::updateKeys);
connect(ui->cryptoContainerPage, &ContainerPage::removed, this, &MainWindow::removeAddress);
connect(ui->cryptoContainerPage, &ContainerPage::warning, this, [this](WarningText warningText) {
ui->warnings->showWarning(warningText);
ui->crypto->warningIcon(true);
Expand Down Expand Up @@ -417,6 +413,10 @@ void MainWindow::onSignAction(int action, const QString &info1, const QString &i
digiDoc->sign(city, state, zip, country, role, &s);
});
break;
case SignatureExtend:
if(digiDoc && digiDoc->extend())
ui->signContainerPage->transition(digiDoc);
break;
case ClearSignatureWarning:
ui->signature->warningIcon(false);
ui->warnings->closeWarnings(SignDetails);
Expand Down Expand Up @@ -886,15 +886,6 @@ void MainWindow::sign(F &&sign)
adjustDrops();
}

void MainWindow::removeAddress(int index)
{
if(cryptoDoc)
{
cryptoDoc->removeKey(index);
ui->cryptoContainerPage->update(cryptoDoc, qApp->signer()->tokenauth().cert());
}
}

void MainWindow::removeCryptoFile(int index)
{
if(!cryptoDoc)
Expand Down Expand Up @@ -1077,18 +1068,6 @@ void MainWindow::updateSelectorData(TokenData data)
showCardMenu(false);
}

void MainWindow::updateKeys(const QList<CKey> &keys)
{
if(!cryptoDoc)
return;

for(auto i = cryptoDoc->keys().size() - 1; i >= 0; i--)
cryptoDoc->removeKey(i);
for(const auto &key: keys)
cryptoDoc->addKey(key);
ui->cryptoContainerPage->update(cryptoDoc, qApp->signer()->tokenauth().cert());
}

void MainWindow::containerSummary()
{
#ifdef Q_OS_WIN
Expand Down
2 changes: 0 additions & 2 deletions client/MainWindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,6 @@ private Q_SLOTS:
void pinPukChange( QSmartCardData::PinType type );
void resetCryptoDoc(CryptoDoc *doc = nullptr);
void resetDigiDoc(DigiDoc *doc = nullptr, bool warnOnChange = true);
void removeAddress(int index);
void removeCryptoFile(int index);
bool removeFile(DocumentModel *model, int index);
void removeSignature(int index);
Expand All @@ -102,7 +101,6 @@ private Q_SLOTS:
void showPinBlockedWarning(const QSmartCardData& t);
void updateSelector();
void updateSelectorData(TokenData data);
void updateKeys(const QList<CKey> &keys);
void updateMyEID(const TokenData &t);
void updateMyEid(const QSmartCardData &data);
bool wrap(const QString& wrappedFile, bool enclose);
Expand Down
3 changes: 2 additions & 1 deletion client/common_enums.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,13 +49,14 @@ enum Actions {
EncryptContainer,
DecryptContainer,
DecryptToken,
ClearCryptoWarning,

SignatureAdd,
SignatureMobile,
SignatureSmartID,
SignatureToken,
SignatureExtend,
ClearSignatureWarning,
ClearCryptoWarning,
};

enum ItemType {
Expand Down
Loading

0 comments on commit 65fcd18

Please sign in to comment.