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 Oct 14, 2024
1 parent 8e4034f commit 66649ec
Show file tree
Hide file tree
Showing 8 changed files with 80 additions and 837 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
19 changes: 13 additions & 6 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,20 +29,20 @@ 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)

if(WIN32)
target_compile_definitions(qdigidoccommon PUBLIC UNICODE WIN32_LEAN_AND_MEAN)
target_link_libraries(qdigidoccommon PRIVATE Version SetupApi winscard)
target_link_libraries(qdigidoccommon PUBLIC Version SetupApi winscard)
elseif(APPLE)
target_link_libraries(qdigidoccommon PRIVATE "-framework PCSC")
target_link_libraries(qdigidoccommon PUBLIC "-framework PCSC")
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
68 changes: 65 additions & 3 deletions Configuration.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
#include "Configuration.h"

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

#include <QtCore/QCryptographicHash>
#include <QtCore/QDir>
Expand All @@ -43,6 +42,20 @@

#include <memory>

#ifdef Q_OS_WIN
#include <qt_windows.h>
#include <Regstr.h>
#include <Setupapi.h>
#elif defined(Q_OS_MAC)
#include <PCSC/wintypes.h>
#include <PCSC/winscard.h>
#include <arpa/inet.h>
#else
#include <wintypes.h>
#include <winscard.h>
#include <arpa/inet.h>
#endif

static QVariant headerValue(const QJsonObject &obj, QLatin1String key) {
return obj.value(QLatin1String("META-INF")).toObject().value(key);
}
Expand Down Expand Up @@ -176,7 +189,7 @@ Configuration::Configuration(QObject *parent)
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());
Common::applicationOs(), QLocale().uiLanguages().first(), drivers().join('/')).toUtf8());
#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
d->req.setTransferTimeout();
#endif
Expand All @@ -185,7 +198,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 @@ -307,6 +320,55 @@ Configuration::~Configuration()
delete d;
}


QStringList Configuration::drivers()
{
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)
{
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)));
}
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;
}

QJsonObject Configuration::object() const
{
return d->dataobject;
Expand Down
2 changes: 2 additions & 0 deletions Configuration.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ class Configuration final : public QObject
QJsonObject object() const;
void update(bool force = false);

static QStringList drivers();

Q_SIGNALS:
void finished(bool changed, const QString &error);

Expand Down
Loading

0 comments on commit 66649ec

Please sign in to comment.