Exemplo n.º 1
0
 def verify_password(username, password):
     username = mongo_sanitizar(username)
     # Não aceitar senha vazia!!
     password = mongo_sanitizar(password)
     user = authenticate(username, password)
     if user is not None:
         logger.info('Usuário %s %s autenticou via API' %
                     (user.id, user.name))
     return user
Exemplo n.º 2
0
 def valida(self):
     """Lê formulário e adiciona campos ao filtro se necessário."""
     if self.validate():  # configura filtro básico
         self.filtro = {}
         # pagina_atual = self.pagina_atual.data
         numero = self.numero.data
         start = self.start.data
         end = self.end.data
         alerta = self.alerta.data
         zscore = self.zscore.data
         if numero == 'None':
             numero = None
         if start and end:
             start = datetime.combine(start, datetime.min.time())
             end = datetime.combine(end, datetime.max.time())
             self.filtro['metadata.dataescaneamento'] = {'$lte': end, '$gte': start}
         if numero:
             self.filtro['metadata.numeroinformado'] = \
                 {'$regex': '^' + mongo_sanitizar(self.numero), '$options': 'i'}
         if alerta:
             self.filtro['metadata.xml.alerta'] = True
         if zscore:
             self.filtro['metadata.zscore'] = {'$gte': zscore}
         # Auditoria
         filtro_escolhido = self.filtro_auditoria.data
         if filtro_escolhido and filtro_escolhido != '0':
             auditoria_object = Auditoria(self.db)
             filtro_auditoria = \
                 auditoria_object.dict_auditoria.get(filtro_escolhido)
             if filtro_auditoria:
                 self.filtro.update(filtro_auditoria.get('filtro'))
                 order = filtro_auditoria.get('order')
         tag_escolhida = self.filtro_tags.data
         tag_usuario = self.tag_usuario.data
         if tag_escolhida and tag_escolhida != '0':
             filtro_tag = {'tag': tag_escolhida}
             if tag_usuario:
                 filtro_tag.update({'usuario': current_user.id})
             self.filtro['metadata.tags'] = {'$elemMatch': filtro_tag}
         texto_ocorrencia = self.texto_ocorrencia.data
         if texto_ocorrencia:
             self.filtro.update(
                 {'metadata.ocorrencias': {'$exists': True},
                  'metadata.ocorrencias.texto':
                      {'$regex':
                           '^' + mongo_sanitizar(texto_ocorrencia), '$options': 'i'
                       }
                  })
         print('FILTRO: ', self.filtro)
         return True
     return False
Exemplo n.º 3
0
def file(_id=None):
    """Tela para exibição de um 'arquivo' do GridFS.

    Exibe o arquivo e os metadados associados a ele.
    """
    db = app.config['mongodb']
    fs = GridFS(db)
    tags_object = Tags(db)
    form_tags = TagsForm()
    form_tags.tags.choices = tags_object.tags_text
    if request.args.get('filename'):
        filename = mongo_sanitizar(request.args.get('filename'))
        logger.warn('Filename %s ' % filename)
        grid_data = fs.find_one({'filename': filename})
    else:
        if not _id:
            _id = request.args.get('_id')
        grid_data = fs.get(ObjectId(_id))
    # print(grid_data)
    if grid_data:
        summary_ = dict_to_html(summary(grid_data=grid_data))
        summary_carga = dict_to_html(carga.summary(grid_data=grid_data))
        tags = tags_object.list(_id)
        ocorrencias = Ocorrencias(db).list(_id)
    else:
        summary_ = summary_carga = 'Arquivo não encontrado.'
        ocorrencias = []
    return render_template('view_file.html',
                           myfile=grid_data,
                           summary=summary_,
                           summary_carga=summary_carga,
                           form_tags=form_tags,
                           tags=tags,
                           ocorrencias=ocorrencias)
Exemplo n.º 4
0
def get_dues_container(mongodb,
                       numero: str,
                       datainicio: datetime,
                       datafim: datetime,
                       limit=40) -> List[dict]:
    if numero is None or numero == '':
        raise ValueError('get_dues: Informe o número do contêiner!')
    query = {
        'metadata.numeroinformado': mongo_sanitizar(numero.strip()).upper(),
        'metadata.dataescaneamento': {
            '$gte': datainicio,
            '$lte': datafim
        },
        'metadata.contentType': 'image/jpeg'
    }
    projection = {'metadata.due': 1}
    cursor = mongodb['fs.files'].find(query, projection). \
        sort('metadata.dataescaneamento', pymongo.DESCENDING).limit(limit)
    result = []
    for row in cursor:
        metadata = row.get('metadata')
        if metadata:
            due = metadata.get('due')
            if due:
                result.append(due[0])
    return result
Exemplo n.º 5
0
def filtro():
    """Configura filtro personalizado."""
    _, user_filtros = recupera_user_filtros()
    if user_filtros is None:
        return jsonify([])
    # print(request.form)
    # print(request.args)
    campo = request.args.get('campo')
    if campo:
        valor = request.args.get('valor')
        if valor:  # valor existe, adiciona
            if campos_chave_tipos().get(campo) == bool:
                valor = valor.lower()
                user_filtros[campo] = (valor == 's' or valor == 'true'
                                       or valor == 'sim')
            elif campos_chave_tipos().get(campo) == date:
                # print('DATE!!!', valor)
                ldata = datetime.strptime(valor, '%Y/%m/%d')
                start = datetime.combine(ldata, datetime.min.time())
                end = datetime.combine(ldata, datetime.max.time())
                user_filtros[campo] = {'$lte': end, '$gte': start}
            else:
                user_filtros[campo] = mongo_sanitizar(valor)
        else:  # valor não existe, exclui chave
            user_filtros.pop(campo)
    result = [{'campo': k, 'valor': v} for k, v in user_filtros.items()]
    return jsonify(result)
Exemplo n.º 6
0
def valida_form_files(form, filtro, db):
    """Lê formulário e adiciona campos ao filtro se necessário."""
    order = None
    pagina_atual = None
    if form.validate():  # configura filtro básico
        numero = form.numero.data
        start = form.start.data
        end = form.end.data
        alerta = form.alerta.data
        ranking = form.ranking.data
        pagina_atual = form.pagina_atual.data
        filtro_escolhido = form.filtro_auditoria.data
        if filtro_escolhido and filtro_escolhido != '0':
            auditoria_object = Auditoria(db)
            filtro_auditoria = \
                auditoria_object.dict_auditoria.get(filtro_escolhido)
            # logger.debug(auditoria_object.dict_auditoria)
            # logger.debug(filtro_escolhido)
            # logger.debug(filtro_auditoria)
            if filtro_auditoria:
                filtro.update(filtro_auditoria.get('filtro'))
                order = filtro_auditoria.get('order')
        tag_escolhida = form.filtro_tags.data
        tag_usuario = form.tag_usuario.data
        # print('****************************', tag_escolhida)
        if tag_escolhida and tag_escolhida != '0':
            filtro_tag = {'tag': tag_escolhida}
            if tag_usuario:
                filtro_tag.update({'usuario': current_user.id})
            filtro.update({'metadata.tags': {'$elemMatch': filtro_tag}})
        texto_ocorrencia = form.texto_ocorrencia.data
        if texto_ocorrencia:
            filtro.update({
                'metadata.ocorrencias': {
                    '$exists': True
                },
                'metadata.ocorrencias.texto': {
                    '$regex': texto_ocorrencia
                }
            })
        if numero == 'None':
            numero = None
        if start and end:
            start = datetime.combine(start, datetime.min.time())
            end = datetime.combine(end, datetime.max.time())
            filtro['metadata.dataescaneamento'] = {'$lte': end, '$gte': start}
        if numero:
            filtro['metadata.numeroinformado'] = mongo_sanitizar(
                numero).upper()
        if alerta:
            filtro['metadata.xml.alerta'] = True
        if ranking:
            filtro['metadata.ranking'] = {'$exists': True, '$gte': .5}
            order = [('metadata.ranking', -1)]
    # print(filtro)
    return filtro, pagina_atual, order
Exemplo n.º 7
0
 def login():
     """View para efetuar login."""
     message = request.args.get('message')
     if request.method == 'POST':
         username = mongo_sanitizar(request.form.get('username'))
         # Não aceitar senha vazia!!
         password = mongo_sanitizar(request.form.get('senha', '*'))
         registered_user = authenticate(username, password)
         if registered_user is not None:
             flash('Usuário autenticado.')
             login_user(registered_user)
             logger.info('Usuário %s autenticou' % current_user.name)
             # g['username'] = current_user.name
             return redirect(url_for('index'))
         else:
             return abort(401)
     else:
         if message:
             flash(message)
         return render_template('login.html', form=request.form)
Exemplo n.º 8
0
def get_imagens_container(mongodb, numero: str) -> list:
    if numero is None or numero == '':
        raise ValueError('get_imagens: Informe o número do contêiner!')
    query = {
        'metadata.numeroinformado': mongo_sanitizar(numero.strip()).upper(),
        'metadata.contentType': 'image/jpeg'
    }
    projection = {
        'metadata.numeroinformado': 1,
        'metadata.dataescaneamento': 1
    }
    cursor = mongodb['fs.files'].find(query, projection)
    return list(cursor)
Exemplo n.º 9
0
def api_image(_id):
    db = current_app.config['mongodb']
    _id = mongo_sanitizar(_id)
    try:
        current_app.logger.warning(_id)
        image = mongo_image(db, _id)
        if image:
            return jsonify(dict(
                content=b64encode(image).decode(),
                mimetype='image/jpeg'
            )), 200
        return jsonify({}), 404
    except Exception as err:
        current_app.logger.error(err, exc_info=True)
        return jsonify({'msg': 'Erro inesperado: %s' % str(err)}), 400
Exemplo n.º 10
0
def image():
    """Executa uma consulta no banco.

    Monta um dicionário de consulta a partir dos argumentos do get.
    Se encontrar registro, chama image_id.
    """
    db = app.config['mongodb']
    filtro = {
        key: value
        for key, value in mongo_sanitizar(request.args.items())
    }
    linha = db['fs.files'].find_one(filtro, {'_id': 1})
    if linha:
        return image_id(linha['_id'])
    return ''
Exemplo n.º 11
0
def auditoria():
    """Permite editar e gravar filtro de auditoria"""
    # TODO: Passar lógica para caso de Uso ou para form e classe
    # TODO: Criar perfil para acesso restrito e SANITIZAR ENTRADA
    form = FormAuditoria()
    select = SelectAuditoria()
    auditoria = Auditoria(app.config['mongodb'])
    select.filtro_auditoria.choices = auditoria.filtros_auditoria_desc
    if request.method == 'POST':
        if form.validate_on_submit():
            filtro = json.loads(form.filtro.data)
            try:
                order = json.loads(form.order.data)
            except JSONDecodeError as err:
                order = form.order.data.split(',')
            filtro = filtro.replace('function', 'XXXX')
            order = order.replace('function', 'XXXX')
            form.descricao.data = mongo_sanitizar(form.descricao.data)
            auditoria.add_relatorio(form.id.data, filtro, order,
                                    form.descricao.data)
            flash('Filtro incluído!', 'success')
            return redirect(url_for('auditoria'))

    return render_template('auditoria.html', form=form, select=select)
Exemplo n.º 12
0
 def sanitize(cls, username, password):
     """Sanitização das entradas."""
     return mongo_sanitizar(username), mongo_sanitizar(password)
Exemplo n.º 13
0
def api_grid_data():
    """Executa uma consulta no banco.

    Monta um dicionário de consulta a partir dos argumentos do get.
    Se encontrar registro, retorna registro inteiro via JSON (metadados),
    o arquivo (campo content) fica em fs.chunks e é recuperado pela view
    image_id.
    """
    # TODO: Refatorar conversões de/para MongoDB - dict - JSON
    #  (Ver Bhadrasana, tem algo feito nesse sentido)
    db = current_app.config['mongodb']
    result = []
    try:
        if request.method == 'POST':
            try:
                current_app.logger.info('grid_data request_data ' +
                                        str(request.data))
                if request.is_json:
                    request_dict = request.get_json()
                else:
                    request_dict = request.form
                current_app.logger.info(
                    str(type(request.json)) + str(request.json))
            except Exception as err:
                request_dict = {}
                current_app.logger.error(str(err))
                current_app.logger.error(request.data)
            if isinstance(request_dict, str):
                try:
                    request_dict = request_dict.replace('\'', '"')
                    request_dict = json.loads(request_dict)
                except Exception as err:
                    request_dict = {}
                    current_app.logger.error(str(err))
            query = request_dict['query']
            projection = request_dict.get('projection')
            query_processed = {}
            for key, value in query.items():
                if isinstance(value, dict):
                    value_processed = {}
                    for key2, value2 in value.items():
                        if isinstance(value2, str):
                            try:
                                value_processed[key2] = \
                                    datetime.datetime.strptime(value2,
                                                               '%Y-%m-%d  %H:%M:%S')
                            except Exception:  # TODO: See specific exception
                                value_processed[key2] = mongo_sanitizar(value2)
                        else:
                            value_processed[key2] = value2
                    query_processed[key] = value_processed
                else:
                    try:
                        query_processed[key] = \
                            datetime.datetime.strptime(value, '%Y-%m-%d  %H:%M:%S')
                    except Exception:
                        query_processed[key] = mongo_sanitizar(value)
            current_app.logger.info(query)
            current_app.logger.info(query_processed)
            current_app.logger.info(projection)
            # TODO: limit and skip
            linhas = db['fs.files'].find(query_processed,
                                         projection).limit(1000)
            result = list(linhas)
            # current_app.logger.warning(result)
            # print(result)
            for linha in result:
                converte_ids(linha)
            # print(result)
        else:
            current_app.logger.warning(
                'Filtro %s' %
                {key: value
                 for key, value in request.args.items()})
            filtro = {
                mongo_sanitizar(key): mongo_sanitizar(value)
                for key, value in request.args.items()
            }
            current_app.logger.warning('Filtro %s' % filtro)
            linhas = db['fs.files'].find(filtro).limit(1000)
            for linha in linhas:
                result.append({
                    '_id':
                    str(linha['_id']),
                    'contentType':
                    str(linha['metadata'].get('contentType'))
                })
        if len(result) > 0:
            return jsonify(result), 200
        return jsonify({}), 404
    except Exception as err:
        current_app.logger.error(err, exc_info=True)
        current_app.logger.error(request.data)
        return jsonify({'msg': 'Erro: %s' % err}), 400
Exemplo n.º 14
0
def api_summary(ce_mercante):
    """Fornece um sumário dos dados para visualização."""
    db = current_app.config['mongodb']
    loader = CargaLoader()
    ce_mercante = mongo_sanitizar(ce_mercante)
    # print('Consultando CE-Mercante %s' % ce_mercante)
    try:
        cursor = db.fs.files.find(
            {'metadata.carga.conhecimento.conhecimento': ce_mercante})
        summary = []
        registro_pai = OrderedDict()
        # print('Consultou!!!')
        ind = 0
        for linha in cursor:
            metadata = linha.get('metadata')
            carga = metadata.get('carga')
            predictions = metadata.get('predictions')
            carga_load = loader.load_from_gridfs(linha)
            if ind == 0:
                manifesto = carga_load.manifestos[0]
                registro_pai['Manifesto Mercante'] = manifesto.manifesto
                registro_pai['Tipo Manifesto'] = manifesto.tipomanifesto
                conhecimento = carga.get('conhecimento')
                if isinstance(conhecimento, list):
                    conhecimento = conhecimento[0]
                registro_pai['NIC CE Mercante'] = conhecimento.get(
                    'conhecimento')
                registro_pai['Tipo CE Mercante'] = conhecimento.get('tipo')
                registro_pai['Descricao mercadoria CE Mercante'] = \
                    conhecimento.get('descricaomercadoria')
                if manifesto.tipomanifesto != 'lce':
                    registro_pai['Consignatario carga'] = \
                        '%s - %s ' % (conhecimento.get('cpfcnpjconsignatario'),
                                      conhecimento.get('nomeconsignatario'))
                ind = 1
            registro = OrderedDict()
            registro['imagem'] = str(linha['_id'])
            registro['Numero Container'] = metadata.get('numeroinformado')
            try:
                registro['Data Escaneamento'] = datetime.datetime.strftime(
                    metadata.get('dataescaneamento'), '%d/%m/%Y %H:%M')
            except Exception as err:
                current_app.logger.error(err, exc_info=True)
                registro['Data Escaneamento'] = str(err)
            if predictions:
                peso = predictions[0].get('peso')
                if peso and isinstance(peso, float):
                    registro['Peso estimado imagem'] = '{:0.2f}'.format(peso)
            conteiner = carga.get('container')
            if isinstance(conteiner, list):
                conteiner = conteiner[0]
            for campo in ['taracontainer', 'pesobrutoitem', 'volumeitem']:
                try:
                    valor_str = conteiner.get(campo, '0')
                    registro[campo] = float(valor_str.replace(',', '.'))
                except Exception as err:
                    current_app.logger.error(err, exc_info=True)
                    registro[campo] = str(err)
            registro['NCM'] = ' '.join(
                set([ncm.get('ncm') for ncm in carga.get('ncm')]))
            summary.append(registro)
        status_code = 404
        if len(summary) > 0:
            status_code = 200
            registro_pai['Containers'] = summary
        return jsonify(registro_pai), status_code
    except Exception as err:
        current_app.logger.error(err, exc_info=True)
        return jsonify({'msg': 'Erro inesperado: %s' % str(err)}), 400
Exemplo n.º 15
0
 def test_mongo_sanitizar(self):
     teste = '{$where: \'atacking\': "DANGEROUS! Test. 2.53"}function();}'
     esperado = 'where atacking DANGEROUS! Test. 2.53function'
     resultado = mongo_sanitizar(teste)
     print(resultado)
     assert resultado == esperado
Exemplo n.º 16
0
def files():
    """Recebe parâmetros, aplica no GridFS, retorna a lista de arquivos."""
    db = app.config['mongodb']
    PAGE_ROWS = 50
    PAGES = 100
    lista_arquivos = []
    campos = campos_chave()
    npaginas = 1
    pagina_atual = 1
    count = 0
    order = None
    tags_object = Tags(db)
    auditoria_object = Auditoria(db)
    form_files = FilesForm(start=date.today() - timedelta(days=10),
                           end=date.today())
    form_files.filtro_tags.choices = tags_object.tags_text
    form_files.filtro_auditoria.choices = auditoria_object.filtros_auditoria_desc
    filtro, user_filtros = recupera_user_filtros()
    if request.method == 'POST':
        # print('****************************', request.form)
        form_files = FilesForm(**request.form)
        form_files.filtro_tags.choices = tags_object.tags_text
        form_files.filtro_auditoria.choices = auditoria_object.filtros_auditoria_desc
        filtro, pagina_atual, order = valida_form_files(form_files, filtro, db)
    else:
        numero = request.args.get('numero')
        if numero:
            form_files = FilesForm(numero=numero)
            form_files.filtro_tags.choices = tags_object.tags_text
            form_files.filtro_auditoria.choices = auditoria_object.filtros_auditoria_desc
            filtro['metadata.numeroinformado'] = mongo_sanitizar(
                numero).upper()
    if filtro:
        filtro['metadata.contentType'] = 'image/jpeg'
        if order is None:
            order = [('metadata.dataescaneamento', 1)]
        if pagina_atual is None:
            pagina_atual = 1

        projection = {
            '_id': 1,
            'filename': 1,
            'metadata.numeroinformado': 1,
            'metadata.predictions': 1,
            'metadata.pesagens': 1,
            'metadata.dataescaneamento': 1,
            'metadata.carga': 1
        }
        skip = (pagina_atual - 1) * PAGE_ROWS
        logger.debug(filtro)
        logger.debug(projection)
        logger.debug('order: %s' % order)
        logger.debug(PAGE_ROWS)
        logger.debug(skip)
        count = db['fs.files'].count_documents(filtro, limit=PAGES * PAGE_ROWS)
        # print(count)
        # count = 100
        npaginas = (count - 1) // PAGE_ROWS + 1
        # print('**Página:', pagina_atual, skip, type(skip))
        # print(count, skip)
        for grid_data in db['fs.files'] \
                .find(filter=filtro, projection=projection) \
                .sort(order) \
                .limit(PAGE_ROWS).skip(skip):
            linha = {}
            linha['_id'] = grid_data['_id']
            linha['filename'] = grid_data['filename']
            linha['dataescaneamento'] = datetime.strftime(
                grid_data['metadata'].get('dataescaneamento'),
                '%-d/%m/%Y %H:%M:%S')
            linha['ncms'] = carga.get_dados_ncm(grid_data)
            linha['infocarga'] = carga.get_dados_conteiner(grid_data)
            linha['pesocarga'] = carga.get_peso_conteiner(grid_data)
            linha['infodue'] = due_mongo.get_dados(grid_data)
            linha['peso'] = carga.get_pesos(grid_data)
            linha['numero'] = grid_data['metadata'].get('numeroinformado')
            linha['conhecimento'] = carga.get_conhecimento(grid_data)
            lista_arquivos.append(linha)
        # print(lista_arquivos)
        if len(lista_arquivos) < 50:
            npaginas = pagina_atual
    return render_template('search_files.html',
                           paginated_files=lista_arquivos,
                           oform=form_files,
                           campos=campos,
                           filtros=user_filtros,
                           npaginas=npaginas,
                           nregistros=count)
Exemplo n.º 17
0
def grid_data():
    """Executa uma consulta no banco.

    Monta um dicionário de consulta a partir dos argumentos do get.
    Se encontrar registro, retorna registro inteiro via JSON (metadados),
    o arquivo (campo content) fica em fs.chunks e é recuperado pela view
    image_id.
    """
    # TODO: Refatorar conversões de/para MongoDB - dict - JSON (Ver Bhadrasana, tem algo feito nesse sentido)
    db = app.config['mongodb']
    if request.method == 'POST':
        # print(request.json)
        query = request.json['query']
        projection = request.json['projection']
        query_processed = {}
        for key, value in query.items():
            if isinstance(value, dict):
                value_processed = {}
                for key2, value2 in value.items():
                    try:
                        value_processed[key2] = datetime.strptime(
                            value2, '%Y-%m-%d  %H:%M:%S')
                    except:
                        value_processed[key2] = mongo_sanitizar(value2)
                query_processed[key] = value_processed
            else:
                try:
                    query_processed[key] = datetime.strptime(
                        value, '%Y-%m-%d  %H:%M:%S')
                except:
                    query_processed[key] = mongo_sanitizar(value)

        # logger.warning(query)
        # logger.warning(query_processed)
        # query = {mongo_sanitizar(key): mongo_sanitizar(value)
        #          for key, value in query.items()}
        # projection = {mongo_sanitizar(key): mongo_sanitizar(value)
        #          for key, value in projection.items()}
        # logger.warning(projection)
        linhas = db['fs.files'].find(query_processed, projection)
        result = []
        for linha in linhas:
            dict_linha = {}
            for key, value in linha.items():
                if isinstance(value, dict):
                    value_processed = {}
                    for key2, value2 in value.items():
                        try:
                            value_processed[key2] = datetime.strptime(
                                value2, '%Y-%m-%d  %H:%M:%S')
                        except:
                            value_processed[key2] = str(value2)
                    dict_linha[key] = value_processed
                else:
                    try:
                        dict_linha[key] = datetime.strptime(
                            value, '%Y-%m-%d  %H:%M:%S')
                    except:
                        dict_linha[key] = str(value)
            result.append(dict_linha)

    else:
        filtro = {
            mongo_sanitizar(key): mongo_sanitizar(value)
            for key, value in request.args.items()
        }
        logger.warning(filtro)
        linhas = db['fs.files'].find(filtro)
        result = [{
            '_id': str(linha['_id']),
            'contentType': str(linha['metadata'].get('contentType'))
        } for linha in linhas]
    status_code = 404
    if len(result) > 0:
        status_code = 200
    return jsonify(result), status_code