01. O QUE É UM BROWSE?

Browse é o componente que exibe uma lista de registros para a execução de ações como Incluir, Alterar, Excluir, etc, nas rotinas de cadastros. 

Geralmente essas listagens são montadas considerando  uma tabela, como SA1 no Cadastro de Clientes, e os campos para serem exibidos são carregados a partir do dicionário de campos, avaliando regras para exibir a coluna/campo.


02. COMO FUNCIONARÁ O OFUSCAMENTO DE COLUNAS NO BROWSE?

Os componentes tentarão associar as identificação de colunas do browse (geralmente o código dos campos) com o campos cadastrados no Dados Protegidos, quando isto acontecer com sucesso as colunas serão então ofuscadas e não terão seu conteúdo exibido.

Internamente as colunas no browse são representadas pela classe FwBrwColumn e nela foi adicionada a propriedade lObfuscate para indicar que a coluna tenha seu conteúdo ofuscado.

Com isso o ofuscamento de dados no browse acontece utilizando esta propriedade. Para os componentes que utilizam dicionário esta marcação para o ofuscamento acontece utilizando o conteúdo das propriedades cId ou cReadVar, comparando com os nomes dos campos registrados nas tabelas de Dados Protegidos no momento que acontece a atribuição das colunas para o browse.

Para criar os recursos fundamentais no sistema é necessário a aplicação da lib, atualizada com label mínimo 20200214, e atualização do sistema com upddistr.

A aplicação do UPDDISTR pode acontecer com:

  • pacote diferencial para upgrade para o Release 12.1.27;
  • pacote específico para Dados Protegidos, nos Releases 12.1.23 e 12.1.25.

03. O QUE VAI ACONTECER QUANDO UM INICIALIZADOR DE BROWSE RETORNAR UM VALOR DE CAMPO SENSÍVEL OU PESSOAL?

Por padrão o conteúdo será apresentado. Os blocos de preenchimento de conteúdo não serão restringidos e portanto, os campos virtuais sendo exibidos no browse precisam ser cadastrados nos dicionários para Dados Protegidos ou a função de busca do conteúdo precisará ela mesma restringir o resultado deixando o conteúdo anônimo com asteriscos (*).


04. QUAIS SÃO OS COMPONENTES UTILIZADOS PARA MONTAGEM DE BROWSES?

Os componentes para construção de browses são separados em funções ou classes e divididas entre Baseada em Dicionário e Construídas Dinamicamente.

Os componentes disponíveis são: 

MBrowse e MarkBrow: São funções, que permitem a construção a partir de alias/dicionário ou tabelas temporárias (tabelas temporárias não são resultado direto de queries).

FwMBrowse e FwMarkBrowse: São classes, que permitem a construção a partir de alias/dicionário ou tabela temporária.

FwFormBrowse e FwBrowse: também são classes, contudo a construção de browses com essas classes é dinâmica, permitindo browses de array, resultado de query, tabelas temporárias ou alias/dicionário.


05. O QUE PRECISA SER FEITO COM MBROWSE E MARKBROW PARA OFUSCAR AS COLUNAS?

Para os browses criados utilizando alias e a configuração padrão, nada precisa ser realizado, pois na construção do browse será feita a avaliação das colunas a serem ofuscadas, conforme o cadastro para Dados Protegidos.

Para os browses construídos utilizando tabela temporária "TRB", será exigida alteração para informar os nomes das colunas que precisam ser ofuscadas. Esta alteração será adicionar um array com o formato lista de campos ({“CAMPO1”,“CAMPO2”}) na chamadas da função que monta o browse.

Exemplo:

aOfuscar := {"CAMPO1","CAMPO2"}
MBrowse(par1, par2…. aOfuscar)
MarkBrow(par1, par2…. aOfuscar)


06. O QUE PRECISA SER FEITO COM FWMBROWSE E FWMARKBROWSE?

Estes browses possuem comportamento similar ao das funções MBrowse/MarkBrow, sendo:

- A construção por alias, que confia na leitura das colunas a partir do dicionário. Nada precisa ser feito;

- A construção baseada em tabela temporária, precisa da informação da lista dos campos através de método e não parâmetro (o que diferencia das funções que recebe por parâmetro).

Exemplos:


oBrowse := FWMBrowse():New()
oBrowse:SetAlias(cAliasTmp)
oBrowse:SetTemporary(.T.)

// Define os campos
aAdd(aBrowse, {"Filial","FILIAL","C",006,0,"@!",,,,,,"FILIAL"}) 
aAdd(aBrowse, {"Numero","NUMERO","C", 006, 0, "@!",,,,,,"NUMERO"})
aAdd(aBrowse, {"Tipo","TIPO","C", 001, 0, "@!",,,,,,"TIPO"})
aAdd(aBrowse, {"Cliente","CLIENTE","C", 006, 0,"@!",,,,,,"CLIENTE"})
aAdd(aBrowse, {"Pedido Exp.","PEDEXP","C",020,0,"@!",,,,,,"PEDEXP"})

aEval := {"FILIAL", "NUMERO", "TIPO", "CLIENTE", "PEDEXP"}

// Define os campos que serão ofuscados
aOfuscar := FwProtectedDataUtil():UsrNoAccessFieldsInList(aEval)
oBrowse:SetObfuscFields(aOfuscar)
oBrowse:SetFields(aBrowse)
oBrowse:Activate()


No código de demonstração acima, a variável aBrowse é a lista de colunas para o browse, e a partir dela que são descobertas as colunas para serem ofuscadas. 

A alteração na construção padrão das colunas é para informar o ID da coluna, que permite posteriormente a associação do que deve ser ofuscado.


07. O QUE PRECISA FAZER PARA FWFORMBROWSE E FWBROWSE?

Essas duas classes estão associadas com a construção personalizada das colunas e dados a serem exibidos, portanto são casos em que é exigido que aconteça a definição e informação das colunas que precisam ser ofuscadas no objeto.

Assim como no exemplo mostrado para FwMBrowse e FwMarkBrowse, é necessário utilizar o método SetObfuscFields para definir quais colunas serão ofuscadas conforme o ID ou marcar diretamente a coluna como ofuscável com SetColObfuscate no objeto da classe FwBrwColumn.

Exemplos:

Lista de campos para ofuscar

oBrowse := FWBrowse():New()
oBrowse:SetDataArray()
oBrowse:SetArray(aDataArray)
aEval := {"C5_NUM", "C5_CLIENTE", "C5_LOJA", "C5_DATA", "C5_PEDEXP", "C5_TIPO", "C5_CONDPG"}
aOfucar:= {} //FwProtectedDataUtil():UsrNoAccessFieldsInList(aEval)
aAdd( aOfucar, "C5_CLIENTE" )
aAdd( aOfucar, "C5_PEDEXP"  )
aAdd( aOfucar, "C5_TIPO"  )
oBrowse:SetObfuscFields(aObsFields)
oBrowse:SetColumns(aColumns)
oBrowse:Activate()


Coluna marcada para ofuscar

oBrowse := FWBrowse():New()
.
.
.
aOfuscar := FwProtectedDataUtil():UsrNoAccessFieldsInList(aEval)

For nContFlds := 1 To Len( aFields )
  nCol := Len(aColumns)

  lObfuscate := aScan(aOfuscar,{|x|x:cField == aFields[nContFlds]}) > 0

  AAdd( aColumns, FWBrwColumn():New() )
  aColumns[nCol]:SetData(&("{||(cTemp)->"+aFields[nContFlds]+"}"))
  aColumns[nCol]:SetData(&("{||(cTemp)->" + aFields[nContFlds]+"}"))
  aColumns[nCol]:SetTitle( aFields[nContFlds] )
  aColumns[nCol]:SetSize( 15 )
  aColumns[nCol]:SetID( aFields[nContFlds] )
  aColumns[nCol]:SetObfuscateCol( lObfuscate )
Next nContFlds

oBrowse:SetColumns(aColumns)
oBrowse:Activate()