Exemplo n.º 1
0
    def lineReceived(self, rawSentence):
        """
        Parses the data from the sentence and validates the checksum.

        @param rawSentence: The NMEA positioning sentence.
        @type rawSentence: C{bytes}
        """
        sentence = rawSentence.strip()

        _validateChecksum(sentence)
        splitSentence = _split(sentence)

        sentenceType = nativeString(splitSentence[0])
        contents = [nativeString(x) for x in splitSentence[1:]]

        try:
            keys = self._SENTENCE_CONTENTS[sentenceType]
        except KeyError:
            raise ValueError("unknown sentence type %s" % sentenceType)

        sentenceData = {"type": sentenceType}
        for key, value in izip(keys, contents):
            if key is not None and value != "":
                sentenceData[key] = value

        sentence = NMEASentence(sentenceData)

        if self._sentenceCallback is not None:
            self._sentenceCallback(sentence)

        self._receiver.sentenceReceived(sentence)
Exemplo n.º 2
0
    def lineReceived(self, rawSentence):
        """
        Parses the data from the sentence and validates the checksum.

        @param rawSentence: The NMEA positioning sentence.
        @type rawSentence: C{bytes}
        """
        sentence = rawSentence.strip()

        _validateChecksum(sentence)
        splitSentence = _split(sentence)

        sentenceType = nativeString(splitSentence[0])
        contents = [nativeString(x) for x in splitSentence[1:]]

        try:
            keys = self._SENTENCE_CONTENTS[sentenceType]
        except KeyError:
            raise ValueError("unknown sentence type %s" % sentenceType)

        sentenceData = {"type": sentenceType}
        for key, value in izip(keys, contents):
            if key is not None and value != "":
                sentenceData[key] = value

        sentence = NMEASentence(sentenceData)

        if self._sentenceCallback is not None:
            self._sentenceCallback(sentence)

        self._receiver.sentenceReceived(sentence)
Exemplo n.º 3
0
    def _toString_OPENSSH(self, extra):
        """
        Return a public or private OpenSSH string.  See
        _fromString_PUBLIC_OPENSSH and _fromString_PRIVATE_OPENSSH for the
        string formats.  If extra is present, it represents a comment for a
        public key, or a passphrase for a private key.

        @param extra: Comment for a public key or passphrase for a
            private key
        @type extra: L{bytes}

        @rtype: L{bytes}
        """
        data = self.data()
        if self.isPublic():
            b64Data = base64.encodestring(self.blob()).replace(b'\n', b'')
            if not extra:
                extra = b''
            return (self.sshType() + b' ' + b64Data + b' ' + extra).strip()
        else:
            lines = [b''.join((b'-----BEGIN ', self.type().encode('ascii'),
                               b' PRIVATE KEY-----'))]
            if self.type() == 'RSA':
                p, q = data['p'], data['q']
                objData = (0, data['n'], data['e'], data['d'], q, p,
                           data['d'] % (q - 1), data['d'] % (p - 1),
                           data['u'])
            else:
                objData = (0, data['p'], data['q'], data['g'], data['y'],
                           data['x'])
            asn1Sequence = univ.Sequence()
            for index, value in izip(itertools.count(), objData):
                asn1Sequence.setComponentByPosition(index, univ.Integer(value))
            asn1Data = berEncoder.encode(asn1Sequence)
            if extra:
                iv = randbytes.secureRandom(8)
                hexiv = ''.join(['%02X' % (ord(x),) for x in iterbytes(iv)])
                hexiv = hexiv.encode('ascii')
                lines.append(b'Proc-Type: 4,ENCRYPTED')
                lines.append(b'DEK-Info: DES-EDE3-CBC,' + hexiv + b'\n')
                ba = md5(extra + iv).digest()
                bb = md5(ba + extra + iv).digest()
                encKey = (ba + bb)[:24]
                padLen = 8 - (len(asn1Data) % 8)
                asn1Data += (chr(padLen) * padLen).encode('ascii')

                encryptor = Cipher(
                    algorithms.TripleDES(encKey),
                    modes.CBC(iv),
                    backend=default_backend()
                ).encryptor()

                asn1Data = encryptor.update(asn1Data) + encryptor.finalize()

            b64Data = base64.encodestring(asn1Data).replace(b'\n', b'')
            lines += [b64Data[i:i + 64] for i in range(0, len(b64Data), 64)]
            lines.append(b''.join((b'-----END ', self.type().encode('ascii'),
                                   b' PRIVATE KEY-----')))
            return b'\n'.join(lines)
Exemplo n.º 4
0
    def _toString_OPENSSH(self, extra):
        """
        Return a public or private OpenSSH string.  See
        _fromString_PUBLIC_OPENSSH and _fromString_PRIVATE_OPENSSH for the
        string formats.  If extra is present, it represents a comment for a
        public key, or a passphrase for a private key.

        @param extra: Comment for a public key or passphrase for a
            private key
        @type extra: L{bytes}

        @rtype: L{bytes}
        """
        data = self.data()
        if self.isPublic():
            b64Data = encodebytes(self.blob()).replace(b'\n', b'')
            if not extra:
                extra = b''
            return (self.sshType() + b' ' + b64Data + b' ' + extra).strip()
        else:
            lines = [b''.join((b'-----BEGIN ', self.type().encode('ascii'),
                               b' PRIVATE KEY-----'))]
            if self.type() == 'RSA':
                p, q = data['p'], data['q']
                objData = (0, data['n'], data['e'], data['d'], q, p,
                           data['d'] % (q - 1), data['d'] % (p - 1),
                           data['u'])
            else:
                objData = (0, data['p'], data['q'], data['g'], data['y'],
                           data['x'])
            asn1Sequence = univ.Sequence()
            for index, value in izip(itertools.count(), objData):
                asn1Sequence.setComponentByPosition(index, univ.Integer(value))
            asn1Data = berEncoder.encode(asn1Sequence)
            if extra:
                iv = randbytes.secureRandom(8)
                hexiv = ''.join(['%02X' % (ord(x),) for x in iterbytes(iv)])
                hexiv = hexiv.encode('ascii')
                lines.append(b'Proc-Type: 4,ENCRYPTED')
                lines.append(b'DEK-Info: DES-EDE3-CBC,' + hexiv + b'\n')
                ba = md5(extra + iv).digest()
                bb = md5(ba + extra + iv).digest()
                encKey = (ba + bb)[:24]
                padLen = 8 - (len(asn1Data) % 8)
                asn1Data += (chr(padLen) * padLen).encode('ascii')

                encryptor = Cipher(
                    algorithms.TripleDES(encKey),
                    modes.CBC(iv),
                    backend=default_backend()
                ).encryptor()

                asn1Data = encryptor.update(asn1Data) + encryptor.finalize()

            b64Data = encodebytes(asn1Data).replace(b'\n', b'')
            lines += [b64Data[i:i + 64] for i in range(0, len(b64Data), 64)]
            lines.append(b''.join((b'-----END ', self.type().encode('ascii'),
                                   b' PRIVATE KEY-----')))
            return b'\n'.join(lines)
Exemplo n.º 5
0
    def parsing_recherche_point(self, response):
        # print(response.body.decode('latin-1'))
        message_erreur = response.xpath('//ul[@class="messageErreur"]/li/text()').extract_first() or ''
        pattern = "la clé ([0-9]{1,2}|nan) n'est pas valide pour la référence de PDS"
        if re.match(pattern, message_erreur):
            if response.meta['site_en_cours']['key'] is not None:
                formdata = response.meta['formdata']
                response.meta['site_en_cours']['key'] += 1
                formdata['clePDS'] = str(response.meta['site_en_cours']['key']).zfill(2)
                self._rqId_ += 1
                formdata['_rqId_'] = str(self._rqId_)

                yield FormRequest(url=response.url,
                          method='POST',
                          formdata=formdata,
                          callback=self.parsing_recherche_point,
                          errback=self.errback,
                          meta=response.meta)
            else:
                self.logger.error("Aucune clé PDS valide ...")
                item = {'error': "Aucune clé PDS valide ..."}
                return item

        # print(response.body.decode('latin-1'))
        resultat = response.xpath('//div[@class="entete-tableau resultat-recherche"]/span/text()').extract_first()

        if resultat is None or not re.match(r"Résultat : il y a [1-9]{1,2} enregistrement\x28s\x29 correspondant à votre demande", resultat):
            return

        print(f"rae: {response.meta['site_en_cours']['rae']} : {resultat}")

        body = response.body.decode('latin-1')
        colonnes_reponse = response.xpath('//table[@class="miseEnPage"]/tr/td[@class="titreColonne"]/text()').extract()

        _dict_sites = {}
        adict = {}

        has_lines = True
        class_td_result = 'ligne'
        start_index = 1


        while has_lines:
            class_td_result += str(start_index)
            if class_td_result not in body:
                break
            if start_index > 1:
                raise Exception("Multiple results ... Not handled yet !")

            start_index += 1

            values_site = []
            colonne_ligne = response.xpath(f'//td[@class="{class_td_result}"]')
            for i, colonne in enumerate(colonne_ligne):
                if i == 0:
                    onclick = response.xpath(f'//td[@class="{class_td_result}"]/a/@onclick').extract_first()
                    values_site.append(re.search("selIdresultatRecherche.value='(.*)';", onclick).group(1))
                else:
                    values_site.append(colonne.xpath('./input/@value').extract_first() or '')
                    adict = dict(izip(colonnes_reponse, values_site))

            _dict_sites.update(adict)

        df = pd.DataFrame(data=_dict_sites, index=[0])

        if df.shape[0] == 0:
            return

        # Création de l'item
        item = dict()

        # enregistrement des premières informations
        item['reference_id'] = df.iloc[0]['réf.']
        item['pds'] = response.meta['site_en_cours']['rae']
        item['n_voie'] = df.iloc[0]['n°']
        item['voie'] = df.iloc[0]['voie']
        item['commune'] = df.iloc[0]['commune']
        item['ref_compteur'] = df.iloc[0]['réf. compteur']

        if 'key' in response.meta['site_en_cours'] and response.meta['site_en_cours']['key'] != '':
            cle_pds = response.meta['site_en_cours']['key']
            item['clePDS'] = f'"{str(cle_pds).zfill(2)}"'
        else:
            item['clePDS'] = ''

        meta = response.meta
        meta['item'] = item
        meta['_rqId_'] += 1

        form_data = self.preparation_request_consultation_point(meta['site_en_cours']['rae'], item['reference_id'], meta['_rqId_'])

        yield FormRequest(url=response.url,
                          method='POST',
                          formdata=form_data,
                          callback=self.handle_relation_client,
                          meta=meta)