Merge pull request 'feature/privacy'

Reviewed-on: #1
This commit is contained in:
giuliof 2022-01-01 23:15:40 +00:00
commit 6b27082725
6 changed files with 166 additions and 106 deletions

21
.vscode/c_cpp_properties.json vendored Normal file
View File

@ -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
}

11
.vscode/settings.json vendored Normal file
View File

@ -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"
}
}

5
Anagrafica.hpp Normal file
View File

@ -0,0 +1,5 @@
class Anagrafica {
public:
QString cognome;
QString nome;
};

View File

@ -1,80 +1,95 @@
#include "ImmuNoattri.hpp" #include "ImmuNoattri.hpp"
#include <QDebug>
#include <CNS.h> // https://git.golem.linux.it/golem/cnsparser #include <CNS.h> // https://git.golem.linux.it/golem/cnsparser
#include <QDebug>
#include "ui_ImmuNoattri.h" #include "ui_ImmuNoattri.h"
bool decodeCodfis(const QString& input, QString& codfis, QString& anagrafica) { bool decodeCodfis(const QString& input, QString& codfis,
codfis = input.mid(1, 16); Anagrafica& anagrafica) {
if (codfis.length() != 16) { QStringList list = input.split('_');
return false; if (list.size() != 4) {
} return false;
int end_anagrafica = input.indexOf(0x5f); }
if (end_anagrafica < 0) {
return false; codfis = list.at(1);
} if (codfis.length() != 16) {
anagrafica = input.mid(17, end_anagrafica - 17); return false;
return true; }
QString anagrafica_magnetica = list.at(2);
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) MainWindow::MainWindow(QWidget* parent)
: QMainWindow(parent), : QMainWindow(parent),
ui(new Ui::MainWindow), ui(new Ui::MainWindow),
sqliteInterface("presenze.db") { sqliteInterface("presenze.db") {
ui->setupUi(this); ui->setupUi(this);
qDebug() << "Pulisco db"; qDebug() << "Pulisco db";
sqliteInterface.cleanup(); sqliteInterface.cleanup();
connect(&lineTessera_timer, &QTimer::timeout, connect(&lineTessera_timer, &QTimer::timeout, this,
this, &MainWindow::on_lineTessera_timer_timeout); &MainWindow::on_lineTessera_timer_timeout);
connect(ui->statusbar, &QStatusBar::messageChanged, connect(ui->statusbar, &QStatusBar::messageChanged, this,
this, &MainWindow::on_statusbar_changed); &MainWindow::on_statusbar_changed);
int registrati = sqliteInterface.count(); int registrati = sqliteInterface.count();
ui->lineRegistrati->setText(QString::number(registrati)); ui->lineRegistrati->setText(QString::number(registrati));
on_statusbar_changed(); on_statusbar_changed();
connect(&smartcard_check_timer, &QTimer::timeout, connect(&smartcard_check_timer, &QTimer::timeout, this,
this, &MainWindow::on_smartcard_check); &MainWindow::on_smartcard_check);
smartcard_check_timer.start(std::chrono::seconds(2)); smartcard_check_timer.start(std::chrono::seconds(2));
} }
void MainWindow::on_statusbar_changed() { void MainWindow::on_statusbar_changed() {
if ((ui->statusbar->currentMessage()).length() == 0) { if ((ui->statusbar->currentMessage()).length() == 0) {
ui->statusbar->setStyleSheet("background-color: auto;"); 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); ui->statusbar->showMessage(
} "Passare la tessera magnetica sul lettore, inserire una smartcard "
"nel lettore, o effettuare un inserimento manuale.",
0);
}
} }
MainWindow::~MainWindow() {} MainWindow::~MainWindow() {}
void MainWindow::on_actionAbout_triggered() { void MainWindow::on_actionAbout_triggered() {
qDebug() << "An about string..."; qDebug() << "An about string...";
} }
void MainWindow::on_lineTessera_textEdited(const QString& text) { void MainWindow::on_lineTessera_textEdited(const QString& text) {
// The magnetic reader has three newline characters // The magnetic reader has three newline characters
lineTessera_timer.start(std::chrono::milliseconds(500)); lineTessera_timer.start(std::chrono::milliseconds(500));
} }
void MainWindow::on_lineTessera_timer_timeout() { void MainWindow::on_lineTessera_timer_timeout() {
lineTessera_timer.stop(); lineTessera_timer.stop();
QString codfis; QString codfis;
QString anagrafica; Anagrafica anagrafica;
// Validating input // Validating input
if (decodeCodfis(ui->lineTessera->text(), codfis, anagrafica)) { if (decodeCodfis(ui->lineTessera->text(), codfis, anagrafica)) {
addVisitor(codfis, anagrafica); addVisitor(codfis, anagrafica);
} else { } else {
ui->statusbar->showMessage("Tessera non valida, riprovare!", MESSAGE_TIMEOUT); ui->statusbar->showMessage("Tessera non valida, riprovare!",
ui->statusbar->setStyleSheet("background-color: red;"); MESSAGE_TIMEOUT);
} ui->statusbar->setStyleSheet("background-color: red;");
}
ui->lineTessera->setText(""); ui->lineTessera->setText("");
} }
/** /**
@ -82,48 +97,50 @@ void MainWindow::on_lineTessera_timer_timeout() {
* *
*/ */
void MainWindow::on_pushMano_clicked() { void MainWindow::on_pushMano_clicked() {
wmanualInsert = std::make_unique<wManualInsert>(); wmanualInsert = std::make_unique<wManualInsert>();
wmanualInsert->exec(); wmanualInsert->exec();
if (wmanualInsert->validData()) { if (wmanualInsert->validData()) {
QString codfis = wmanualInsert->getCodFis(); QString codfis = wmanualInsert->getCodFis();
QString anagrafica = QString("%1 %2") Anagrafica anagrafica;
.arg(wmanualInsert->getCognome()) anagrafica.cognome = wmanualInsert->getCognome();
.arg(wmanualInsert->getNome()); anagrafica.nome = wmanualInsert->getNome();
addVisitor(codfis, anagrafica); addVisitor(codfis, anagrafica);
} }
wmanualInsert.release(); wmanualInsert.release();
} }
void MainWindow::addVisitor(QString& codfis, QString& anagrafica) { void MainWindow::addVisitor(QString& codfis, Anagrafica& anagrafica) {
sqliteInterface.addVisitor(codfis, anagrafica); sqliteInterface.addVisitor(
int registrati = ui->lineRegistrati->text().toInt(); codfis, QString("%1 %2").arg(anagrafica.cognome).arg(anagrafica.nome));
registrati++; int registrati = ui->lineRegistrati->text().toInt();
ui->lineRegistrati->setText(QString::number(registrati)); registrati++;
ui->statusbar->showMessage("Inserimento effettuato correttamente!", MESSAGE_TIMEOUT); ui->lineRegistrati->setText(QString::number(registrati));
ui->statusbar->setStyleSheet("background-color: green;"); ui->statusbar->showMessage("Inserimento effettuato correttamente!",
ui->labelNome->setText(QString("Ciao %1!").arg(anagrafica)); 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() { void MainWindow::on_smartcard_check() {
static QString last_codice_fiscale; static QString last_codice_fiscale;
CNS cns; CNS cns;
try { try {
cns.fromSmartCard(); 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(); 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); addVisitor(codfis, anagrafica);
} catch (Ex e) { } catch (Ex e) {
qDebug() << "no valid smartcard"; // no valid smartcard
//qDebug() << "[E] exception: " << e; }
}
} }

View File

@ -7,45 +7,46 @@
#include <QTimer> #include <QTimer>
#include <memory> #include <memory>
#include "Anagrafica.hpp"
#include "sqliteInterface.hpp" #include "sqliteInterface.hpp"
#include "wManualInsert.hpp" #include "wManualInsert.hpp"
const int MESSAGE_TIMEOUT = 15e3; // 15 s const int MESSAGE_TIMEOUT = 15e3; // 15 s
namespace Ui { namespace Ui {
class MainWindow; class MainWindow;
} }
class MainWindow : public QMainWindow { class MainWindow : public QMainWindow {
Q_OBJECT Q_OBJECT
public: public:
/** /**
* @brief MainWindow Constructor * @brief MainWindow Constructor
* @param parent Parent Handle * @param parent Parent Handle
*/ */
explicit MainWindow(QWidget* parent = 0); explicit MainWindow(QWidget* parent = 0);
~MainWindow(); ~MainWindow();
private slots: private slots:
// GUI Events // GUI Events
void on_pushMano_clicked(); void on_pushMano_clicked();
void on_actionAbout_triggered(); void on_actionAbout_triggered();
void on_lineTessera_textEdited(const QString& text); void on_lineTessera_textEdited(const QString& text);
void on_lineTessera_timer_timeout(); void on_lineTessera_timer_timeout();
void on_statusbar_changed(); void on_statusbar_changed();
void on_smartcard_check(); void on_smartcard_check();
private: private:
Ui::MainWindow* ui; Ui::MainWindow* ui;
std::unique_ptr<wManualInsert> wmanualInsert; std::unique_ptr<wManualInsert> wmanualInsert;
QFile* csv_file; QFile* csv_file;
QTimer lineTessera_timer; QTimer lineTessera_timer;
QTimer smartcard_check_timer; QTimer smartcard_check_timer;
SqliteInterface sqliteInterface; SqliteInterface sqliteInterface;
void closeEvent(QCloseEvent* event); void closeEvent(QCloseEvent* event);
void addVisitor(QString& codfis, QString& anagrafica); void addVisitor(QString& codfis, Anagrafica& anagrafica);
}; };
#endif #endif

View File

@ -1,6 +1,12 @@
# ImmuNoattri # 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 * libqt5sql5-sqlite
* sqlite3 * sqlite3
* [cnsparser](https://git.golem.linux.it/golem/cnsparser) * [cnsparser](https://git.golem.linux.it/golem/cnsparser)
@ -8,7 +14,6 @@
## Database ## Database
``` ```
CREATE TABLE presenze (ID INTEGER PRIMARY KEY AUTOINCREMENT, checkin TEXT, codfis TEXT, anagrafica TEXT); 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_``` ```_CGNNMM00A41D403C_COGNOME NOME1 NOME2_```