Example #1
0
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
Example #2
0
        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]] = {}