def fichier_post(data: str) -> str: """Fonction de conversion un fichier posté, en fonction de son type -si image: retourne meta_donnees spécifiques(dimensions, EXIF) + donnees en Array RVB -si texte simple: retourne aucune meta_donnees spécifique -si YAML: transforme les donnees en JSON -si CSV, fonctionne pas encore :param data: donnees reçues via requête POST """ # pylint: disable=too-many-locals #================"" # informations de base, peu importe le type de fichier #==================== adresseip = request.remote_addr contenu = request.files['data'].read() #type(contenu)=bytes mimetype = data.mimetype taille = request.headers.get('Content-Length') nomfic = secure_filename(data.filename) extension = nomfic.split(".")[-1].lower() #creation objet Fichier fichiercourant = Fichier(ip_origine=adresseip, nom_fic=nomfic, mime_type=mimetype,\ taille=taille, extension=extension) donnees = {} meta = {} code_retour = 201 #==================== # rajouter en plus des donnees dans un format particulier à chaque type # + meta_donnees adaptées à chaque type de fichier # + informations de type HATEOAS (voir fichier hateoas.py) #==================== if extension in ['jpg', 'jpeg', 'gif', 'bmp', 'png', 'tiff', 'ico'] or\ mimetype in ['image/jpeg', 'image/gif', 'image/x-icon', 'image/png', 'image/tiff']: # convert string of image data to uint8 img = Image.open(data) width, height = img.size dimensions = {'height':height, 'width':width} if extension != 'png': exif = recuperer_exiftags(img) else: exif = "" #pour transformer la photo en liste de pixels RVB #npimg = np.array(img) #type=ndarray #donnees = npimg.tolist() #type=list donnees = "".join(map(chr, contenu)) #mettre a True si le service fonctionne avec RosettaHUB activation_aws_rekognition = True if activation_aws_rekognition: temp = BytesIO(contenu)#1types=BytesIO deposer_fichier(temp, fichiercourant.id_fichier) #depot format bytes pour reko reko = reconnaitre_image(fichiercourant.id_fichier) supprimer_fichier(fichiercourant.id_fichier) #supprimer objet pour reko else: reko = {'aws-rekognition':'desactive'} meta = {'dimensions':dimensions, 'exif':exif, 'reconnaissance':reko} elif extension in ['txt', 'md', 'rst', 'css'] or\ mimetype in ['text/plain']: donnees = contenu.decode('utf-8') elif extension == 'json' or \ mimetype == 'application/json': contenu = contenu.decode('utf-8') donnees = json.loads(contenu) elif extension == 'yaml': contenu = contenu.decode('utf-8') donnees = yaml.load(contenu, Loader=yaml.FullLoader) elif extension == 'csv' or \ mimetype == 'text/csv': #permet de décoder le fichier, détecter les libellés de la ligne de titre #puis convertir le tableau de données en dictionnaire temp = contenu.decode('utf-8') temp = StringIO(temp) next(temp) dialect = csv.Sniffer().sniff(next(temp)) temp.seek(0) reader = csv.DictReader(temp, dialect=dialect) temp = [] for row in reader: temp.append(dict(row)) donnees = temp #ajouter en meta-données le délimiteur qui a été détecté meta = {'delimiter': dialect.delimiter} elif extension == 'pdf' or \ mimetype == 'application/pdf': #créé un objet pdffile, détecte le nombre de pages et le texte de toutes les pages temp = BytesIO(contenu) input_pdf = PdfFileReader(temp) pdf_info = input_pdf.getDocumentInfo() if pdf_info.author is not None: meta.update({"auteur":pdf_info.author}) if pdf_info.title is not None: meta.update({"titre":pdf_info.title}) if pdf_info.subject is not None: meta.update({"sujet":pdf_info.subject}) nbpages = input_pdf.getNumPages() meta.update({"nb_pages":nbpages}) temp = "" for page in range(nbpages): temp += input_pdf.getPage(page).extractText() + "\n" donnees = {"texte":temp} elif extension in ['xml', 'svg'] or \ mimetype in ['application/xml', 'image/svg+xml']: contenu = contenu.decode('utf-8') donnees = xmltodict.parse(contenu) elif extension == 'zip' or \ mimetype == 'application/zip': try: tempzip = zipfile.ZipFile(BytesIO(contenu)) donnees = "".join(map(chr,contenu)) meta = {"archive_liste_fichiers": tempzip.namelist()} except zipfile.BadZipFile: meta = {"erreur:": "Fichier zip erroné"} else: code_retour = 415 message = "Unsupported Media Type" #enregistrement donnees fichiercourant.donnees = donnees #enregistrement metadonnees particulières fichiercourant.meta_donnees = meta #enregistrement hateoas fichiercourant.hateoas = recuperer_hateoas(request.url,\ fichiercourant.id_fichier) #REUPLOAD FICHIER #result = fichiercourant.serialise() #temp = json.dumps(result) #temp = jsonify(result) if code_retour >= 400: result = {"code_erreur:": code_retour, "erreur": message} else: result = fichiercourant.serialise() pour_aws = BytesIO(json.dumps(result).encode('utf-8')) deposer_fichier(pour_aws, fichiercourant.id_fichier) return jsonify(result), code_retour
captures = self.sorted_capture_cache(self.indexing.get_captures_url(url)) to_return: List[Dict] = [] for capture in captures[:limit]: ct = self.get_crawled_tree(capture.uuid) to_append: Dict[str, Union[str, Dict]] = {'capture_uuid': capture.uuid, 'start_timestamp': capture.timestamp.isoformat(), 'title': capture.title} urlnodes: Dict[str, Dict[str, str]] = {} for urlnode in ct.root_hartree.url_tree.search_nodes(name=url): urlnodes[urlnode.uuid] = {'start_time': urlnode.start_time.isoformat(), 'hostnode_uuid': urlnode.hostnode_uuid} if hasattr(urlnode, 'body_hash'): urlnodes[urlnode.uuid]['hash'] = urlnode.body_hash to_append['urlnodes'] = urlnodes to_return.append(to_append) return to_return def get_hostname_occurrences(self, hostname: str, /, with_urls_occurrences: bool=False, limit: int=20) -> List[Dict]: '''Get the most recent captures and URL nodes where the hostname has been seen.''' captures = self.sorted_capture_cache(self.indexing.get_captures_hostname(hostname)) to_return: List[Dict] = [] for capture in captures[:limit]: ct = self.get_crawled_tree(capture.uuid) to_append: Dict[str, Union[str, List, Dict]] = {'capture_uuid': capture.uuid, 'start_timestamp': capture.timestamp.isoformat(), 'title': capture.title} hostnodes: List[str] = [] if with_urls_occurrences: urlnodes: Dict[str, Dict[str, str]] = {}