Vérification de validité des pass liés à des tests
Signed-off-by: Yohann D'ANELLO <ynerant@crans.org>
This commit is contained in:
parent
d985d14eb9
commit
f542f6646d
@ -6,6 +6,15 @@ européen, tel que le fait l'application TAC-Vérif lors de
|
|||||||
la crise sanitaire de Covid-19 en 2021.
|
la crise sanitaire de Covid-19 en 2021.
|
||||||
|
|
||||||
|
|
||||||
|
Dépendances
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Le script requiert Python >= 3.6 avec les modules :
|
||||||
|
|
||||||
|
* cbor2
|
||||||
|
* cryptography
|
||||||
|
|
||||||
|
|
||||||
Usage
|
Usage
|
||||||
-----
|
-----
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@ from cryptography import x509
|
|||||||
from cryptography.hazmat.primitives.asymmetric import ec
|
from cryptography.hazmat.primitives.asymmetric import ec
|
||||||
from cryptography.hazmat.primitives.asymmetric.utils import \
|
from cryptography.hazmat.primitives.asymmetric.utils import \
|
||||||
encode_dss_signature
|
encode_dss_signature
|
||||||
|
import datetime
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
@ -35,6 +36,8 @@ def analyse_qrcode(qrcode: str, additional_info: bool = False,
|
|||||||
|
|
||||||
Si `additional_info` est vrai, les informations de
|
Si `additional_info` est vrai, les informations de
|
||||||
vaccination/test sont affichées.
|
vaccination/test sont affichées.
|
||||||
|
|
||||||
|
Renvoie la validité du pass sous forme de booléen.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if not qrcode.startswith('HC1:'):
|
if not qrcode.startswith('HC1:'):
|
||||||
@ -100,28 +103,62 @@ def analyse_qrcode(qrcode: str, additional_info: bool = False,
|
|||||||
valid = True
|
valid = True
|
||||||
print("Attention : la signature du QR code n'a pas été vérifiée.")
|
print("Attention : la signature du QR code n'a pas été vérifiée.")
|
||||||
|
|
||||||
# TODO: Vérifier les données d'un test
|
# Information utile
|
||||||
|
p = payload[-260][1]
|
||||||
|
|
||||||
|
if 'v' in p:
|
||||||
|
# Les vaccins sont toujours valide
|
||||||
|
valid = valid and True
|
||||||
|
elif 't' in p:
|
||||||
|
# Les tests négatifs sont valables moins de 72h
|
||||||
|
test = p['t'][0]
|
||||||
|
assert test['tr'] in ['260373001', '260415000']
|
||||||
|
|
||||||
|
if test['tr'] == 260373001:
|
||||||
|
# Test positif
|
||||||
|
valid = False
|
||||||
|
|
||||||
|
test_date = datetime.datetime.fromisoformat(test['sc'])
|
||||||
|
tzinfo = test_date.tzinfo
|
||||||
|
delta = datetime.datetime.now(tzinfo) - test_date
|
||||||
|
valid = valid and delta.days < 3 # 3 jours de validité
|
||||||
|
elif 'r' in p:
|
||||||
|
# les tests positifs entre 11 et 182 jours après
|
||||||
|
test = p['r'][0]
|
||||||
|
valid_from = datetime.datetime.fromisoformat(test['df'])
|
||||||
|
valid_until = datetime.datetime.fromisoformat(test['du'])
|
||||||
|
tzinfo = valid_from.tzinfo
|
||||||
|
valid = valid and \
|
||||||
|
valid_from <= datetime.datetime.now(tzinfo) <= valid_until
|
||||||
|
else:
|
||||||
|
print("Type de passe inconnu.")
|
||||||
|
|
||||||
|
|
||||||
if valid:
|
if valid:
|
||||||
print("Pass sanitaire valide")
|
print("Pass sanitaire valide")
|
||||||
|
|
||||||
# Information utile
|
|
||||||
p = payload[-260][1]
|
|
||||||
|
|
||||||
print("Nom :", p['nam']['fn'])
|
print("Nom :", p['nam']['fn'])
|
||||||
print("Prénom :", p['nam']['gn'])
|
print("Prénom :", p['nam']['gn'])
|
||||||
print("Date de naissance :", p['dob'])
|
print("Date de naissance :", p['dob'])
|
||||||
|
|
||||||
if additional_info:
|
if additional_info:
|
||||||
|
# TODO Meilleur affichage
|
||||||
if 'v' in p:
|
if 'v' in p:
|
||||||
# Vaccination
|
# Vaccination
|
||||||
# TODO Meilleur affichage
|
print("Informations de vaccination :",
|
||||||
print("Informations de vaccination :", p['v'])
|
json.dumps(p['v'][0], indent=2))
|
||||||
else:
|
elif 't' in p:
|
||||||
# TODO Gérer les tests positifs / négatifs
|
print("Informations de test :",
|
||||||
print("Informations de test :", p)
|
json.dumps(p['t'][0], indent=2))
|
||||||
|
elif 'r' in p:
|
||||||
|
print("Informations de test :",
|
||||||
|
json.dumps(p['r'][0], indent=2))
|
||||||
else:
|
else:
|
||||||
print("Pass sanitaire invalide")
|
print("Pass sanitaire invalide")
|
||||||
|
|
||||||
|
return valid
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
|
Loading…
Reference in New Issue
Block a user