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)
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)
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)
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)