From a84c0f8123ae669bebe03b44773621ece101fb91 Mon Sep 17 00:00:00 2001 From: giomba Date: Sat, 1 Jan 2022 12:47:54 +0100 Subject: [PATCH 1/2] Anagrafica.hpp: introduce proper person handler To show name and surname separately, and preserve some privacy --- Anagrafica.hpp | 5 +++++ ImmuNoattri.cpp | 42 +++++++++++++++++++++++++++--------------- ImmuNoattri.hpp | 5 +++-- README.md | 11 ++++++++--- 4 files changed, 43 insertions(+), 20 deletions(-) create mode 100644 Anagrafica.hpp diff --git a/Anagrafica.hpp b/Anagrafica.hpp new file mode 100644 index 0000000..3d4923d --- /dev/null +++ b/Anagrafica.hpp @@ -0,0 +1,5 @@ +class Anagrafica { + public: + QString cognome; + QString nome; +}; diff --git a/ImmuNoattri.cpp b/ImmuNoattri.cpp index 63299c3..a34c7f4 100644 --- a/ImmuNoattri.cpp +++ b/ImmuNoattri.cpp @@ -6,16 +6,26 @@ #include "ui_ImmuNoattri.h" -bool decodeCodfis(const QString& input, QString& codfis, QString& anagrafica) { - codfis = input.mid(1, 16); +bool decodeCodfis(const QString& input, QString& codfis, Anagrafica& anagrafica) { + QStringList list = input.split('_'); + if (list.size() != 4) { + return false; + } + + codfis = list.at(1); if (codfis.length() != 16) { return false; } - int end_anagrafica = input.indexOf(0x5f); - if (end_anagrafica < 0) { + + QString anagrafica_magnetica = list.at(2); + + QStringList anagrafica_list = anagrafica_magnetica.split(" "); + if (anagrafica_list.size() != 2) { return false; } - anagrafica = input.mid(17, end_anagrafica - 17); + anagrafica.cognome = anagrafica_list.at(0); + anagrafica.nome = anagrafica_list.at(1); + return true; } @@ -65,7 +75,7 @@ void MainWindow::on_lineTessera_timer_timeout() { lineTessera_timer.stop(); QString codfis; - QString anagrafica; + Anagrafica anagrafica; // Validating input if (decodeCodfis(ui->lineTessera->text(), codfis, anagrafica)) { addVisitor(codfis, anagrafica); @@ -86,22 +96,23 @@ void MainWindow::on_pushMano_clicked() { wmanualInsert->exec(); if (wmanualInsert->validData()) { QString codfis = wmanualInsert->getCodFis(); - QString anagrafica = QString("%1 %2") - .arg(wmanualInsert->getCognome()) - .arg(wmanualInsert->getNome()); + Anagrafica anagrafica; + anagrafica.cognome = wmanualInsert->getCognome(); + anagrafica.nome = wmanualInsert->getNome(); addVisitor(codfis, anagrafica); } wmanualInsert.release(); } -void MainWindow::addVisitor(QString& codfis, QString& anagrafica) { - sqliteInterface.addVisitor(codfis, anagrafica); +void MainWindow::addVisitor(QString& codfis, Anagrafica& anagrafica) { + sqliteInterface.addVisitor(codfis, QString("%1 %2").arg(anagrafica.cognome).arg(anagrafica.nome)); int registrati = ui->lineRegistrati->text().toInt(); registrati++; ui->lineRegistrati->setText(QString::number(registrati)); ui->statusbar->showMessage("Inserimento effettuato correttamente!", MESSAGE_TIMEOUT); ui->statusbar->setStyleSheet("background-color: green;"); - ui->labelNome->setText(QString("Ciao %1!").arg(anagrafica)); + ui->labelNome->setText(QString("Ciao %1!").arg(anagrafica.nome + )); } void MainWindow::closeEvent(QCloseEvent* event) { @@ -119,11 +130,12 @@ void MainWindow::on_smartcard_check() { last_codice_fiscale = cns.getCodiceFiscale(); QString codfis = cns.getCodiceFiscale(); - QString anagrafica = QString("%1 %2").arg(cns.getCognome()).arg(cns.getNome()); + Anagrafica anagrafica; + anagrafica.cognome = cns.getCognome(); + anagrafica.nome = cns.getNome(); addVisitor(codfis, anagrafica); } catch (Ex e) { - qDebug() << "no valid smartcard"; - //qDebug() << "[E] exception: " << e; + // no valid smartcard } } \ No newline at end of file diff --git a/ImmuNoattri.hpp b/ImmuNoattri.hpp index 945e11e..3127744 100644 --- a/ImmuNoattri.hpp +++ b/ImmuNoattri.hpp @@ -9,8 +9,9 @@ #include "sqliteInterface.hpp" #include "wManualInsert.hpp" +#include "Anagrafica.hpp" -const int MESSAGE_TIMEOUT = 15e3; // 15 s +const int MESSAGE_TIMEOUT = 15e3; // 15 s namespace Ui { class MainWindow; @@ -45,7 +46,7 @@ class MainWindow : public QMainWindow { SqliteInterface sqliteInterface; void closeEvent(QCloseEvent* event); - void addVisitor(QString& codfis, QString& anagrafica); + void addVisitor(QString& codfis, Anagrafica& anagrafica); }; #endif \ No newline at end of file diff --git a/README.md b/README.md index d9a9603..93c41b6 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,12 @@ # ImmuNoattri +A terrible access monitor software based based on EU healthcare smartcard. -## Requisiti +## How it works +To record close contacts in our [Officina Informatica](https://wiki.golem.linux.it/Officina_Informatica), as initially mandated by regional law 2021-05-27/60 [Regione Toscana](https://www.regione.toscana.it/), in order to prevent diffusion of COVID-19, just remember to swipe your healthcare card in Lampredotto's totem, as soon as you enter the building. +Your name will be recorded, in order to inform health authorities in case of COVID-19 contact. +Your name will also be automatically deleted after 15 days. + +## Requirements * libqt5sql5-sqlite * sqlite3 * [cnsparser](https://git.golem.linux.it/golem/cnsparser) @@ -8,7 +14,6 @@ ## Database ``` CREATE TABLE presenze (ID INTEGER PRIMARY KEY AUTOINCREMENT, checkin TEXT, codfis TEXT, anagrafica TEXT); -CREATE TABLE sqlite_sequence(name,seq); ``` -## Formato tessera +## Magnetic card format ```_CGNNMM00A41D403C_COGNOME NOME1 NOME2_``` From f69264878be337d53a59d19cb0cb24d4bc02576c Mon Sep 17 00:00:00 2001 From: giomba Date: Sat, 1 Jan 2022 12:50:25 +0100 Subject: [PATCH 2/2] format: every contributor uses VSCodium, so let's define a common style (as long as today) --- .vscode/c_cpp_properties.json | 21 ++++ .vscode/settings.json | 11 +++ ImmuNoattri.cpp | 175 +++++++++++++++++----------------- ImmuNoattri.hpp | 52 +++++----- 4 files changed, 148 insertions(+), 111 deletions(-) create mode 100644 .vscode/c_cpp_properties.json create mode 100644 .vscode/settings.json diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..37052a3 --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,21 @@ +{ + "configurations": [ + { + "name": "Linux", + "includePath": [ + "${workspaceFolder}/**", + "/usr/include/qt/QtCore", + "/usr/include/qt/QtGui", + "/usr/include/qt", + "/usr/include/qt/QtWidgets", + "/usr/include/qt/QtSql" + ], + "defines": [], + "compilerPath": "/usr/bin/clang", + "cStandard": "c17", + "cppStandard": "c++14", + "intelliSenseMode": "linux-clang-x64" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..fc55637 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,11 @@ +{ + "C_Cpp.vcFormat.newLine.beforeOpenBrace.block": "sameLine", + "C_Cpp.vcFormat.newLine.beforeOpenBrace.function": "sameLine", + "C_Cpp.vcFormat.newLine.beforeOpenBrace.lambda": "sameLine", + "C_Cpp.vcFormat.newLine.beforeOpenBrace.namespace": "sameLine", + "C_Cpp.vcFormat.newLine.beforeOpenBrace.type": "sameLine", + "C_Cpp.clang_format_fallbackStyle": "{ BasedOnStyle: Google, IndentWidth: 4 }", + "files.associations": { + "qdebug": "cpp" + } +} \ No newline at end of file diff --git a/ImmuNoattri.cpp b/ImmuNoattri.cpp index a34c7f4..455eb63 100644 --- a/ImmuNoattri.cpp +++ b/ImmuNoattri.cpp @@ -1,90 +1,95 @@ #include "ImmuNoattri.hpp" -#include - #include // https://git.golem.linux.it/golem/cnsparser +#include + #include "ui_ImmuNoattri.h" -bool decodeCodfis(const QString& input, QString& codfis, Anagrafica& anagrafica) { - QStringList list = input.split('_'); - if (list.size() != 4) { - return false; - } - - codfis = list.at(1); - if (codfis.length() != 16) { - return false; - } +bool decodeCodfis(const QString& input, QString& codfis, + Anagrafica& anagrafica) { + QStringList list = input.split('_'); + if (list.size() != 4) { + return false; + } - QString anagrafica_magnetica = list.at(2); + codfis = list.at(1); + if (codfis.length() != 16) { + return false; + } - QStringList anagrafica_list = anagrafica_magnetica.split(" "); - if (anagrafica_list.size() != 2) { - return false; - } - anagrafica.cognome = anagrafica_list.at(0); - anagrafica.nome = anagrafica_list.at(1); + QString anagrafica_magnetica = list.at(2); - return true; + QStringList anagrafica_list = anagrafica_magnetica.split(" "); + if (anagrafica_list.size() != 2) { + return false; + } + anagrafica.cognome = anagrafica_list.at(0); + anagrafica.nome = anagrafica_list.at(1); + + return true; } MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWindow), sqliteInterface("presenze.db") { - ui->setupUi(this); + ui->setupUi(this); - qDebug() << "Pulisco db"; - sqliteInterface.cleanup(); + qDebug() << "Pulisco db"; + sqliteInterface.cleanup(); - connect(&lineTessera_timer, &QTimer::timeout, - this, &MainWindow::on_lineTessera_timer_timeout); + connect(&lineTessera_timer, &QTimer::timeout, this, + &MainWindow::on_lineTessera_timer_timeout); - connect(ui->statusbar, &QStatusBar::messageChanged, - this, &MainWindow::on_statusbar_changed); + connect(ui->statusbar, &QStatusBar::messageChanged, this, + &MainWindow::on_statusbar_changed); - int registrati = sqliteInterface.count(); - ui->lineRegistrati->setText(QString::number(registrati)); - on_statusbar_changed(); + int registrati = sqliteInterface.count(); + ui->lineRegistrati->setText(QString::number(registrati)); + on_statusbar_changed(); - connect(&smartcard_check_timer, &QTimer::timeout, - this, &MainWindow::on_smartcard_check); - smartcard_check_timer.start(std::chrono::seconds(2)); + connect(&smartcard_check_timer, &QTimer::timeout, this, + &MainWindow::on_smartcard_check); + smartcard_check_timer.start(std::chrono::seconds(2)); } void MainWindow::on_statusbar_changed() { - if ((ui->statusbar->currentMessage()).length() == 0) { - ui->statusbar->setStyleSheet("background-color: auto;"); - ui->statusbar->showMessage("Passare la tessera magnetica sul lettore, inserire una smartcard nel lettore, o effettuare un inserimento manuale.", 0); - } + if ((ui->statusbar->currentMessage()).length() == 0) { + ui->statusbar->setStyleSheet("background-color: auto;"); + ui->statusbar->showMessage( + "Passare la tessera magnetica sul lettore, inserire una smartcard " + "nel lettore, o effettuare un inserimento manuale.", + 0); + } } MainWindow::~MainWindow() {} void MainWindow::on_actionAbout_triggered() { - qDebug() << "An about string..."; + qDebug() << "An about string..."; } void MainWindow::on_lineTessera_textEdited(const QString& text) { - // The magnetic reader has three newline characters - lineTessera_timer.start(std::chrono::milliseconds(500)); + // The magnetic reader has three newline characters + lineTessera_timer.start(std::chrono::milliseconds(500)); } void MainWindow::on_lineTessera_timer_timeout() { - lineTessera_timer.stop(); + lineTessera_timer.stop(); - QString codfis; - Anagrafica anagrafica; - // Validating input - if (decodeCodfis(ui->lineTessera->text(), codfis, anagrafica)) { - addVisitor(codfis, anagrafica); - } else { - ui->statusbar->showMessage("Tessera non valida, riprovare!", MESSAGE_TIMEOUT); - ui->statusbar->setStyleSheet("background-color: red;"); - } + QString codfis; + Anagrafica anagrafica; + // Validating input + if (decodeCodfis(ui->lineTessera->text(), codfis, anagrafica)) { + addVisitor(codfis, anagrafica); + } else { + ui->statusbar->showMessage("Tessera non valida, riprovare!", + MESSAGE_TIMEOUT); + ui->statusbar->setStyleSheet("background-color: red;"); + } - ui->lineTessera->setText(""); + ui->lineTessera->setText(""); } /** @@ -92,50 +97,50 @@ void MainWindow::on_lineTessera_timer_timeout() { * */ void MainWindow::on_pushMano_clicked() { - wmanualInsert = std::make_unique(); - wmanualInsert->exec(); - if (wmanualInsert->validData()) { - QString codfis = wmanualInsert->getCodFis(); - Anagrafica anagrafica; - anagrafica.cognome = wmanualInsert->getCognome(); - anagrafica.nome = wmanualInsert->getNome(); - addVisitor(codfis, anagrafica); - } - wmanualInsert.release(); + wmanualInsert = std::make_unique(); + wmanualInsert->exec(); + if (wmanualInsert->validData()) { + QString codfis = wmanualInsert->getCodFis(); + Anagrafica anagrafica; + anagrafica.cognome = wmanualInsert->getCognome(); + anagrafica.nome = wmanualInsert->getNome(); + addVisitor(codfis, anagrafica); + } + wmanualInsert.release(); } void MainWindow::addVisitor(QString& codfis, Anagrafica& anagrafica) { - sqliteInterface.addVisitor(codfis, QString("%1 %2").arg(anagrafica.cognome).arg(anagrafica.nome)); - int registrati = ui->lineRegistrati->text().toInt(); - registrati++; - ui->lineRegistrati->setText(QString::number(registrati)); - ui->statusbar->showMessage("Inserimento effettuato correttamente!", MESSAGE_TIMEOUT); - ui->statusbar->setStyleSheet("background-color: green;"); - ui->labelNome->setText(QString("Ciao %1!").arg(anagrafica.nome - )); + sqliteInterface.addVisitor( + codfis, QString("%1 %2").arg(anagrafica.cognome).arg(anagrafica.nome)); + int registrati = ui->lineRegistrati->text().toInt(); + registrati++; + ui->lineRegistrati->setText(QString::number(registrati)); + ui->statusbar->showMessage("Inserimento effettuato correttamente!", + MESSAGE_TIMEOUT); + ui->statusbar->setStyleSheet("background-color: green;"); + ui->labelNome->setText(QString("Ciao %1!").arg(anagrafica.nome)); } -void MainWindow::closeEvent(QCloseEvent* event) { -} +void MainWindow::closeEvent(QCloseEvent* event) {} void MainWindow::on_smartcard_check() { - static QString last_codice_fiscale; - CNS cns; + static QString last_codice_fiscale; + CNS cns; - try { - cns.fromSmartCard(); + try { + cns.fromSmartCard(); - if (cns.getCodiceFiscale() == last_codice_fiscale) return; + if (cns.getCodiceFiscale() == last_codice_fiscale) return; - last_codice_fiscale = cns.getCodiceFiscale(); + last_codice_fiscale = cns.getCodiceFiscale(); - QString codfis = cns.getCodiceFiscale(); - Anagrafica anagrafica; - anagrafica.cognome = cns.getCognome(); - anagrafica.nome = cns.getNome(); + QString codfis = cns.getCodiceFiscale(); + Anagrafica anagrafica; + anagrafica.cognome = cns.getCognome(); + anagrafica.nome = cns.getNome(); - addVisitor(codfis, anagrafica); - } catch (Ex e) { - // no valid smartcard - } + addVisitor(codfis, anagrafica); + } catch (Ex e) { + // no valid smartcard + } } \ No newline at end of file diff --git a/ImmuNoattri.hpp b/ImmuNoattri.hpp index 3127744..a55cbbd 100644 --- a/ImmuNoattri.hpp +++ b/ImmuNoattri.hpp @@ -7,9 +7,9 @@ #include #include +#include "Anagrafica.hpp" #include "sqliteInterface.hpp" #include "wManualInsert.hpp" -#include "Anagrafica.hpp" const int MESSAGE_TIMEOUT = 15e3; // 15 s @@ -18,35 +18,35 @@ class MainWindow; } class MainWindow : public QMainWindow { - Q_OBJECT + Q_OBJECT - public: - /** - * @brief MainWindow Constructor - * @param parent Parent Handle - */ - explicit MainWindow(QWidget* parent = 0); - ~MainWindow(); + public: + /** + * @brief MainWindow Constructor + * @param parent Parent Handle + */ + explicit MainWindow(QWidget* parent = 0); + ~MainWindow(); - private slots: - // GUI Events - void on_pushMano_clicked(); - void on_actionAbout_triggered(); - void on_lineTessera_textEdited(const QString& text); - void on_lineTessera_timer_timeout(); - void on_statusbar_changed(); - void on_smartcard_check(); + private slots: + // GUI Events + void on_pushMano_clicked(); + void on_actionAbout_triggered(); + void on_lineTessera_textEdited(const QString& text); + void on_lineTessera_timer_timeout(); + void on_statusbar_changed(); + void on_smartcard_check(); - private: - Ui::MainWindow* ui; - std::unique_ptr wmanualInsert; - QFile* csv_file; - QTimer lineTessera_timer; - QTimer smartcard_check_timer; - SqliteInterface sqliteInterface; + private: + Ui::MainWindow* ui; + std::unique_ptr wmanualInsert; + QFile* csv_file; + QTimer lineTessera_timer; + QTimer smartcard_check_timer; + SqliteInterface sqliteInterface; - void closeEvent(QCloseEvent* event); - void addVisitor(QString& codfis, Anagrafica& anagrafica); + void closeEvent(QCloseEvent* event); + void addVisitor(QString& codfis, Anagrafica& anagrafica); }; #endif \ No newline at end of file