pass-sanitaire-check/pscheck/pscheck.py

87 lines
2.5 KiB
Python

#!/usr/bin/env python
import argparse
import json
import logging
import sys
from .models import GreenCertificate
def read_qrcode(file) -> str:
"""
Lit le contenu du fichier.
Peut être combiné avec zbar pour directement lire le contenu du QRCode.
"""
with file:
content = file.readline()
content = content.replace('\n', '')
return content
def analyse_qrcode(qrcode: str, additional_info: bool = False,
check_signature: bool = True) -> None:
"""
Analyse les données du QR code pour extraire les données
et vérifier la signature.
Si `additional_info` est vrai, les informations de
vaccination/test sont affichées.
Renvoie la validité du pass sous forme de booléen.
"""
certificate = GreenCertificate.load(qrcode)
if check_signature:
# Récupération du certificat utilisé
valid = certificate.check_signature()
else:
valid = True
logging.warning("Attention : la signature du"
"QR code n'a pas été vérifiée.")
valid = valid and certificate.check()
if valid:
logging.info("Pass sanitaire valide")
logging.debug("Nom : " + certificate.family_name)
logging.debug("Prénom : " + certificate.given_name)
logging.debug("Date de naissance : " + certificate.date_of_birth)
if additional_info:
# TODO Meilleur affichage
logging.debug("Informations supplémentaires : "
+ json.dumps(certificate.result.__dict__, indent=2))
else:
logging.info("Pass sanitaire invalide")
return valid, certificate
def main():
parser = argparse.ArgumentParser()
parser.add_argument('file', nargs='?', type=argparse.FileType('r'),
default=sys.stdin,
help="QR Code à lire, en format texte.")
parser.add_argument('--full', '-f', action='store_true',
help="Affiche toutes les informations.")
parser.add_argument('--dontcheck', action='store_true',
help="Ne pas vérifier la signature.")
parser.add_argument('--logging', '-l', default=logging.DEBUG,
choices=['DEBUG', 'INFO', 'WARNING',
'ERROR', 'CRITICAL'],
help="Niveau de verbosité.")
args = parser.parse_args()
logging.basicConfig(level=args.logging)
qrcode = read_qrcode(args.file)
valid = analyse_qrcode(qrcode, args.full, not args.dontcheck)
exit(0 if valid else 2)