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.
|
||||
|
||||
|
||||
Dépendances
|
||||
-----------
|
||||
|
||||
Le script requiert Python >= 3.6 avec les modules :
|
||||
|
||||
* cbor2
|
||||
* cryptography
|
||||
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@ from cryptography import x509
|
|||
from cryptography.hazmat.primitives.asymmetric import ec
|
||||
from cryptography.hazmat.primitives.asymmetric.utils import \
|
||||
encode_dss_signature
|
||||
import datetime
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
|
@ -35,6 +36,8 @@ def analyse_qrcode(qrcode: str, additional_info: bool = False,
|
|||
|
||||
Si `additional_info` est vrai, les informations de
|
||||
vaccination/test sont affichées.
|
||||
|
||||
Renvoie la validité du pass sous forme de booléen.
|
||||
"""
|
||||
|
||||
if not qrcode.startswith('HC1:'):
|
||||
|
@ -100,28 +103,62 @@ def analyse_qrcode(qrcode: str, additional_info: bool = False,
|
|||
valid = True
|
||||
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:
|
||||
print("Pass sanitaire valide")
|
||||
|
||||
# Information utile
|
||||
p = payload[-260][1]
|
||||
|
||||
print("Nom :", p['nam']['fn'])
|
||||
print("Prénom :", p['nam']['gn'])
|
||||
print("Date de naissance :", p['dob'])
|
||||
|
||||
if additional_info:
|
||||
# TODO Meilleur affichage
|
||||
if 'v' in p:
|
||||
# Vaccination
|
||||
# TODO Meilleur affichage
|
||||
print("Informations de vaccination :", p['v'])
|
||||
else:
|
||||
# TODO Gérer les tests positifs / négatifs
|
||||
print("Informations de test :", p)
|
||||
print("Informations de vaccination :",
|
||||
json.dumps(p['v'][0], indent=2))
|
||||
elif 't' in p:
|
||||
print("Informations de test :",
|
||||
json.dumps(p['t'][0], indent=2))
|
||||
elif 'r' in p:
|
||||
print("Informations de test :",
|
||||
json.dumps(p['r'][0], indent=2))
|
||||
else:
|
||||
print("Pass sanitaire invalide")
|
||||
|
||||
return valid
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser()
|
||||
|
|
Loading…
Reference in New Issue