Skip to content

Commit

Permalink
Move QPCSC to digidoc
Browse files Browse the repository at this point in the history
IB-7927

Signed-off-by: Raul Metsma <[email protected]>
  • Loading branch information
metsma committed Nov 8, 2024
1 parent fbe6fab commit 610b08b
Show file tree
Hide file tree
Showing 6 changed files with 73 additions and 93 deletions.
3 changes: 0 additions & 3 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,3 +0,0 @@
[submodule "cmake"]
path = cmake
url = ../cmake
15 changes: 11 additions & 4 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,8 +1,15 @@
cmake_minimum_required(VERSION 3.10)
project(qdigidoccommon VERSION 1.0.0)
if(NOT VERSION)
set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules)
include(VersionInfo)
macro(set_env)
set(${ARGN})
endmacro()
add_compile_definitions(
MAJOR_VER=${PROJECT_VERSION_MAJOR}
MINOR_VER=${PROJECT_VERSION_MINOR}
RELEASE_VER=${PROJECT_VERSION_PATCH}
BUILD_VER=$<IF:$<BOOL:$ENV{BUILD_NUMBER}>,$ENV{BUILD_NUMBER},0>
)
endif()
set_env( CONFIG_URL "https://id.eesti.ee/config.json" CACHE STRING "Set Config URL" )
find_package(OpenSSL 1.1.1 REQUIRED)
Expand All @@ -22,7 +29,7 @@ configure_file( translations/common_tr.qrc common_tr.qrc COPYONLY )
qt_add_translation(SOURCES translations/qtbase_et.ts translations/qtbase_ru.ts
translations/common_en.ts translations/common_et.ts translations/common_ru.ts)
qt_add_resources(SOURCES ${CMAKE_CURRENT_BINARY_DIR}/common_tr.qrc)
add_library(qdigidoccommon STATIC ${SOURCES} Common.cpp QPCSC.cpp)
add_library(qdigidoccommon STATIC ${SOURCES} Common.cpp)
target_include_directories(qdigidoccommon PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
target_compile_definitions(qdigidoccommon PUBLIC QT_DEPRECATED_WARNINGS_SINCE=051200)
target_link_libraries(qdigidoccommon PUBLIC Qt${QT_VERSION_MAJOR}::Network Qt${QT_VERSION_MAJOR}::Widgets OpenSSL::SSL)
Expand All @@ -35,7 +42,7 @@ elseif(APPLE)
else()
find_package(PkgConfig REQUIRED)
pkg_check_modules(PCSCLITE REQUIRED libpcsclite IMPORTED_TARGET)
target_link_libraries(qdigidoccommon PRIVATE PkgConfig::PCSCLITE)
target_link_libraries(qdigidoccommon PUBLIC PkgConfig::PCSCLITE)
endif()

if(NOT APPLE)
Expand Down
110 changes: 52 additions & 58 deletions Common.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,48 +19,20 @@

#include "Common.h"

#include <QtCore/QDateTime>
#include <QtCore/QDebug>
#include <QtCore/QDir>
#include <QtCore/QFileInfo>
#include <QtCore/QOperatingSystemVersion>
#include <QtGui/QIcon>
#include <QtNetwork/QNetworkProxyFactory>

#ifdef Q_OS_WIN
#include <qt_windows.h>
#endif

#ifndef COMMON_STATIC
Common::Common( int &argc, char **argv, const QString &app, const QString &icon )
: BaseApplication( argc, argv )
{
setApplicationName( app );
setApplicationVersion(QStringLiteral("%1.%2.%3.%4")
.arg( MAJOR_VER ).arg( MINOR_VER ).arg( RELEASE_VER ).arg( BUILD_VER ) );
setOrganizationDomain(QStringLiteral("ria.ee"));
setOrganizationName(QStringLiteral("RIA"));
setWindowIcon( QIcon( icon ) );
if(QFile::exists(QStringLiteral("%1/%2.log").arg(QDir::tempPath(), app)))
qInstallMessageHandler(msgHandler);

Q_INIT_RESOURCE(common_tr);
#if defined(Q_OS_WIN)
AllowSetForegroundWindow( ASFW_ANY );
#ifdef NDEBUG
setLibraryPaths({ applicationDirPath() });
#endif
#include <Regstr.h>
#include <Setupapi.h>
#elif defined(Q_OS_MAC)
qputenv("OPENSSL_CONF", applicationDirPath().toUtf8() + "../Resources/openssl.cnf");
#ifdef NDEBUG
setLibraryPaths({ applicationDirPath() + "/../PlugIns" });
#endif
#endif
setStyleSheet(QStringLiteral(
"QDialogButtonBox { dialogbuttonbox-buttons-have-icons: 0; }\n"));

QNetworkProxyFactory::setUseSystemConfiguration(true);
}
#include <PCSC/wintypes.h>
#include <PCSC/winscard.h>
#include <arpa/inet.h>
#else
#include <wintypes.h>
#include <winscard.h>
#include <arpa/inet.h>
#endif

QString Common::applicationOs()
Expand Down Expand Up @@ -93,28 +65,50 @@ QString Common::applicationOs()
#endif
}

void Common::msgHandler(QtMsgType type, const QMessageLogContext &ctx, const QString &msg)
QStringList Common::drivers()
{
QFile f(QStringLiteral("%1/%2.log").arg(QDir::tempPath(), applicationName()));
if(!f.open( QFile::Append ))
return;
f.write(QDateTime::currentDateTime().toString(QStringLiteral("yyyy-MM-dd hh:mm:ss ")).toUtf8());
switch(type)
{
case QtDebugMsg: f.write("D"); break;
case QtWarningMsg: f.write("W"); break;
case QtCriticalMsg: f.write("C"); break;
case QtFatalMsg: f.write("F"); break;
default: f.write("I"); break;
}
f.write(QStringLiteral(" %1 ").arg(QLatin1String(ctx.category)).toUtf8());
if(ctx.line > 0)
QStringList list;
#ifdef Q_OS_WIN
GUID guid {0x50dd5230L, 0xba8a, 0x11d1, 0xbf, 0x5d, 0x00, 0x00, 0xf8, 0x05, 0xf5, 0x30}; // SmartCardReader
HDEVINFO h = SetupDiGetClassDevs(&guid, nullptr, 0, DIGCF_PRESENT);
if(!h)
return list;

SP_DEVINFO_DATA info { sizeof(SP_DEVINFO_DATA) };
DWORD size = 0;
WCHAR data[1024];
for(DWORD i = 0; SetupDiEnumDeviceInfo(h, i, &info); ++i)
{
f.write(QStringLiteral("%1:%2 \"%3\" ")
.arg(QFileInfo(QString::fromLatin1(ctx.file)).fileName())
.arg(ctx.line)
.arg(QLatin1String(ctx.function)).toUtf8());
DWORD conf = 0;
SetupDiGetDeviceRegistryPropertyW(h, &info,
SPDRP_CONFIGFLAGS, 0, LPBYTE(&conf), sizeof(conf), &size);
if(conf & CONFIGFLAG_DISABLED)
continue;

SetupDiGetDeviceRegistryPropertyW(h, &info,
SPDRP_DEVICEDESC, 0, LPBYTE(data), sizeof(data), &size);
QString name = QString::fromWCharArray(data);

SetupDiGetDeviceRegistryPropertyW(h, &info,
SPDRP_HARDWAREID, 0, LPBYTE(data), sizeof(data), &size);

list.append(QStringLiteral("%1 (%2)").arg(name, QString::fromWCharArray(data)));
}
f.write(msg.toUtf8());
f.write("\n");
SetupDiDestroyDeviceInfoList(h);
#else
SCARDCONTEXT context{};
SCardEstablishContext(DWORD(SCARD_SCOPE_USER), nullptr, nullptr, &context);
if(!context)
return list;
DWORD size{};
if(SCardListReaders(context, nullptr, nullptr, &size) != SCARD_S_SUCCESS || !size)
return list;
QByteArray data(int(size), 0);
if(SCardListReaders(context, nullptr, data.data(), &size) != SCARD_S_SUCCESS)
data.clear();
SCardReleaseContext(context);
list = QString::fromLatin1(data).split('\0');
list.removeAll({});
#endif
return list;
}
22 changes: 3 additions & 19 deletions Common.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,28 +19,12 @@

#pragma once

#include <QtCore/QtGlobal>
#include <QtCore/QStringList>

#ifdef Q_OS_MAC
#include <QtWidgets/QApplication>
typedef QApplication BaseApplication;
#else
#include "qtsingleapplication/src/QtSingleApplication"
typedef QtSingleApplication BaseApplication;
#endif

class QLabel;

class Common: public BaseApplication
class Common
{
Q_OBJECT
public:
#ifndef COMMON_STATIC
Common( int &argc, char **argv, const QString &app, const QString &icon );
#endif

static QString applicationOs();
static QStringList drivers();

private:
static void msgHandler(QtMsgType type, const QMessageLogContext &ctx, const QString &msg);
};
15 changes: 7 additions & 8 deletions Configuration.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,7 @@
#include "Configuration.h"

#include "Common.h"
#include "QPCSC.h"

#include <QtCore/QCoreApplication>
#include <QtCore/QCryptographicHash>
#include <QtCore/QDir>
#include <QtCore/QFile>
Expand Down Expand Up @@ -175,8 +174,8 @@ Configuration::Configuration(QObject *parent)
d->url.adjusted(QUrl::RemoveFilename).toString(),
QFileInfo(d->url.fileName()).baseName());
d->req.setRawHeader("User-Agent", QStringLiteral("%1/%2 (%3) Lang: %4 Devices: %5")
.arg(QApplication::applicationName(), QApplication::applicationVersion(),
Common::applicationOs(), QLocale().uiLanguages().first(), QPCSC::instance().drivers().join('/')).toUtf8());
.arg(QCoreApplication::applicationName(), QCoreApplication::applicationVersion(),
Common::applicationOs(), QLocale().uiLanguages().first(), Common::drivers().join('/')).toUtf8());
#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
d->req.setTransferTimeout();
#endif
Expand All @@ -185,7 +184,7 @@ Configuration::Configuration(QObject *parent)
[](QNetworkReply *reply, const QList<QSslError> &errors){
reply->ignoreSslErrors(errors);
});
connect(d->net, &QNetworkAccessManager::finished, this, [=](QNetworkReply *reply){
connect(d->net, &QNetworkAccessManager::finished, this, [this](QNetworkReply *reply){
QScopedPointer<QNetworkReply, QScopedPointerDeleteLater> replyScoped(reply);
if(reply->error() != QNetworkReply::NoError)
{
Expand Down Expand Up @@ -244,7 +243,7 @@ Configuration::Configuration(QObject *parent)
});

QByteArray key = readFile(QStringLiteral(":/config.pub"));
BIO *bio = BIO_new_mem_buf(key.constData(), key.size());
BIO *bio = BIO_new_mem_buf(key.constData(), int(key.size()));
if(!bio)
{
qWarning() << "Failed to parse public key";
Expand Down Expand Up @@ -295,7 +294,7 @@ Configuration::Configuration(QObject *parent)
// Scheduled update or DigiDoc4 updated
else if(lastCheck < QDate::currentDate().addDays(-LAST_CHECK_DAYS) ||
QVersionNumber::fromString(QSettings().value(QStringLiteral("LastVersion")).toString()) <
QVersionNumber::fromString(QApplication::applicationVersion()))
QVersionNumber::fromString(QCoreApplication::applicationVersion()))
update();
#endif
}
Expand Down Expand Up @@ -340,5 +339,5 @@ void Configuration::update(bool force)
{
d->initCache(force);
sendRequest(d->rsaurl);
QSettings().setValue(QStringLiteral("LastVersion"), QApplication::applicationVersion());
QSettings().setValue(QStringLiteral("LastVersion"), QCoreApplication::applicationVersion());
}
1 change: 0 additions & 1 deletion cmake
Submodule cmake deleted from 7b34cc

0 comments on commit 610b08b

Please sign in to comment.