Ejemplo n.º 1
0
class Main:
    def __init__(self):
        self.api_url = config.SERVER_CONFIG['prod']

        with open('zenroom/encrypt_message.lua', 'r') as input:
            self.encryption_script = input.read()

        self._init_fields()

    def _init_fields(self):
        self.session = None

        self.ocr = OCR()
        self.reader = None
        self.mrtd = None
        self.mrz = None
        self.mrtd_data = None
        self.public_key = None
        self.encrypted_data = None

        self.personal_data = None
        self.portrait_image = None

        self.i = 0

    def start(self):
        """
        1) Setup session & import Zencode script
        """
        api_url = self.api_url

        logging.info("MRTD: Connecting with {}".format(api_url))
        self.session = OnboardingSession(api_url)

    def get_mrz(self):
        """
        2) Get MRZ from ID document, should become OCR
        """
        # mrz = config.MRZ_CONFIG['mrz1']

        mrz = self.ocr.get_mrz()

        return mrz

    def get_mrtd(self):
        return self.mrtd.wait_for_card()

    def wait_for_card(self, data={}):
        # wait for nfc reader to detect a card

        mrtd = None

        if mrtd is None:
            mrtd = MRTD()

        if mrtd.wait_for_card():
            print("Card detected!")
            return {"card": True}

    def read_card(self, data={}):
        mrz = self.mrz
        if mrz is None:
            logging.info("MRTD: Trying to read MRZ...")
            mrz = self.get_mrz()

            if mrz:
                logging.info("MRTD: MRZ received [{}]".format(mrz))
                self.ocr.end_capture()
                self.mrtd = MRTD(mrz)
                self.mrz = mrz

        else:
            logging.info("MRTD: Waiting for card...")
            if self.get_mrtd():
                return {"mrtd": True}

    def setup_mrtd(self):
        """
        3) Setup MRTD and get data
        """
        output_file = False
        id_card = MRTD(self.mrz, output_file)

        personal_data = id_card.personal_data()

        if personal_data == None:
            logging.error("DG1 could not be read")
            return False

        image_base64 = id_card.photo_data()

        if image_base64 == None:
            logging.error("DG2 could not be read")
            return False

        self.mrtd_data = [{
            'personal_data': personal_data
        }, {
            'image_base64': image_base64
        }]

    def read_data(self, data={}):
        mrtd = self.mrtd

        if self.personal_data is None:
            logging.info("MRTD: Reading DG1 (personal data)...")
            self.personal_data = mrtd.personal_data()

        else:
            logging.info("MRTD: Reading DG2 (portrait image)...")
            portrait_image = mrtd.photo_data()

            self.mrtd_data = [{
                'personal_data': self.personal_data
            }, {
                'image_base64': portrait_image
            }]

            # self.show_qr()

            # qr_file = image_handler.get_qr("https://decode.amsterdam/onboarding?id=", self.session.session_id)
            qr_file = image_handler.get_qr("", self.session.session_id)

            return {'qrcode': qr_file}

    def test_loop(self):
        self.i += 1

        if self.i is 10:
            self.i = 0
            return True

    def reset_loop(self, data={}):
        self.i += 1

        if self.i is 6:
            logging.info("MRTD: Resetting...")
            self._init_fields()
            self.start()
            return {"reset": True}

    def show_qr(self):
        """
        4) Show QR code with session ID
        """
        logging.info("Displaying QR code & waiting session status update")
        image_handler.qr_image(self.session.session_id)

        # self.ready.wait()

    def wait_for_pkey(self, data={}):
        status = self.session.get_status()

        logging.info("MRTD: Session status is [{}]".format(status))
        if status == "GOT_PUB_KEY":
            self.get_pkey()
            return {"got_pkey": True}

    def get_pkey(self):
        """
        5) Retrieve public key from session
        """
        session_data = self.session.get_data()
        p_key = session_data['data']['public_key']
        self.public_key = {'public': p_key}

    def encrypt_data(self):
        """
        6) Encrypt data with public key
        """
        # for test purposes
        # self._save_data(self.mrtd_data)

        self.encrypted_data = zenroom_buffer.execute(
            self.encryption_script, json.dumps(self.public_key),
            json.dumps(self.mrtd_data))

    def wait_for_encryption(self, data={}):
        if self.encrypted_data is None:
            self.encrypt_data()
            self.attach_data()

        else:
            if self.i is 2:
                self.i = 0
                return {"data_encrypted": True}

            self.i += 1

    def _save_data(self, data):
        """
        6.2) Save encrypted data for testing purposes
        """
        with open('output/test_data.json', 'w') as output:
            json.dump(data, output)

    def attach_data(self):
        """
        7) Add encrypted data to session
        """
        self.session.attach_encrypted_data(self.encrypted_data)