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 <QDebug>
#include <CNS.h> // https://git.golem.linux.it/golem/cnsparser
#include <QDebug>
#include "ui_ImmuNoattri.h"
bool decodeCodfis(const QString& input, QString& codfis, QString& anagrafica) {
codfis = input.mid(1, 16);
if (codfis.length() != 16) {
return false;
}
int end_anagrafica = input.indexOf(0x5f);
if (end_anagrafica < 0) {
return false;
}
anagrafica = input.mid(17, end_anagrafica - 17);
return true;
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;
}
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)
: 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;
QString 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("");
}
/**
@ -82,48 +97,50 @@ void MainWindow::on_lineTessera_timer_timeout() {
*
*/
void MainWindow::on_pushMano_clicked() {
wmanualInsert = std::make_unique<wManualInsert>();
wmanualInsert->exec();
if (wmanualInsert->validData()) {
QString codfis = wmanualInsert->getCodFis();
QString anagrafica = QString("%1 %2")
.arg(wmanualInsert->getCognome())
.arg(wmanualInsert->getNome());
addVisitor(codfis, anagrafica);
}
wmanualInsert.release();
wmanualInsert = std::make_unique<wManualInsert>();
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, QString& anagrafica) {
sqliteInterface.addVisitor(codfis, anagrafica);
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));
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));
}
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();
QString anagrafica = QString("%1 %2").arg(cns.getCognome()).arg(cns.getNome());
QString codfis = cns.getCodiceFiscale();
Anagrafica anagrafica;
anagrafica.cognome = cns.getCognome();
anagrafica.nome = cns.getNome();
addVisitor(codfis, anagrafica);
} catch (Ex e) {
qDebug() << "no valid smartcard";
//qDebug() << "[E] exception: " << e;
}
addVisitor(codfis, anagrafica);
} catch (Ex e) {
// no valid smartcard
}
}

View File

@ -7,45 +7,46 @@
#include <QTimer>
#include <memory>
#include "Anagrafica.hpp"
#include "sqliteInterface.hpp"
#include "wManualInsert.hpp"
const int MESSAGE_TIMEOUT = 15e3; // 15 s
const int MESSAGE_TIMEOUT = 15e3; // 15 s
namespace Ui {
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> wmanualInsert;
QFile* csv_file;
QTimer lineTessera_timer;
QTimer smartcard_check_timer;
SqliteInterface sqliteInterface;
private:
Ui::MainWindow* ui;
std::unique_ptr<wManualInsert> wmanualInsert;
QFile* csv_file;
QTimer lineTessera_timer;
QTimer smartcard_check_timer;
SqliteInterface sqliteInterface;
void closeEvent(QCloseEvent* event);
void addVisitor(QString& codfis, QString& anagrafica);
void closeEvent(QCloseEvent* event);
void addVisitor(QString& codfis, Anagrafica& anagrafica);
};
#endif

View File

@ -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_```