#!/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)