O Brasil.IO ofusca parte dos dados que publica, com o objetivo de proteger a privacidade de pessoas eventualmente descritas em nossos datasets. Exemplos:
- Na tabela
empresa (novo nome para a tabela empresas) do dataset socios-brasil deixamos em branco o endereço caso a empresa seja do tipo "individual" (de acordo com o código da natureza jurídica) - se a empresa é o próprio indivíduo, o endereço dela então provavelmente é o endereço residencial.
- Na tabela
candidatura (novo nome para a tabela candidatos) do dataset eleicoes-brasil, ofuscamos o CPF de quem se candidatou, de maneira que o Brasil.IO não publique nenhum CPF completo em conjunto com outros dados como nome completo.
No primeiro exemplo acima a ofuscação dos dados é feita durante a conversão dos dados, ou seja, no script que baixa e converte os dados da Receita Federal. Já no segundo exemplo, a ofuscação acontece na hora de servir os dados pelo backend do Brasil.IO, porque precisamos do dado completo na nossa base para fazer alguns cruzamentos (exemplo: identificar todas as candidaturas dessa pessoa) - isso é necessário pois a versão ofuscada desse dado pode aparecer também para outras pessoas e gerar ambiguidades.
O problema relatado nessa issue é relativo ao segundo exemplo, ou seja: o dado está completo em nossa base e ofuscamos na hora de serví-lo (seja via interface ou via API).
Se um determinado Field (core.models.Field) tem o campo obfuscate como True, ele não será exibido integralmente (exemplo: o cpf 12345678901 seria exibido como ***456789**). Porém, se esse Field possui o campo frontend_filter como True, o usuário do site e da API poderá filtrar os registros por esse campo e, aí, temos 2 possíveis cenários:
- Cenário A: usuário digita dados ofuscados (ex:
***456789**)
- Cenário B: usuário digita dados completos (ex:
12345678901)
Hoje apenas o cenário B funcionará, dado que o filtro da query-string ignora se o Field é ofuscado ou não e faz a consulta equivalente a algo como: X.objects.filter(fieldname="12345678901") (onde X é o model criado dinamicamente para a tabela com os dados).
Para contornar esse problema, precisamos:
- Durante a aplicação dos filtros na query string (método
core.models.DatasetTableModelQuerySet.apply_filters), verificar se algum dos campos de filtro é ofuscado;
- Para todos os campos ofuscados, aplicar um filtro diferente. Hoje o filtro só dá match caso o valor seja igual (
.filter(campo=valor), mas no caso de valores ofuscados teríamos que aplicar os dois cenários:
- Se o dado não veio ofuscado do usuário (nesse caso, não possui
*), faz o filtro normalmente;
- Se o dado veio ofuscado (nesse caso, se possui
*), executa um filtro diferente, como: .filter(campo__contains=valor.replace("*", "")) -- talvez o ideal seja executar substring em vez do __contains, por conta do desempenho.
O Brasil.IO ofusca parte dos dados que publica, com o objetivo de proteger a privacidade de pessoas eventualmente descritas em nossos datasets. Exemplos:
empresa(novo nome para a tabelaempresas) do datasetsocios-brasildeixamos em branco o endereço caso a empresa seja do tipo "individual" (de acordo com o código da natureza jurídica) - se a empresa é o próprio indivíduo, o endereço dela então provavelmente é o endereço residencial.candidatura(novo nome para a tabelacandidatos) do dataseteleicoes-brasil, ofuscamos o CPF de quem se candidatou, de maneira que o Brasil.IO não publique nenhum CPF completo em conjunto com outros dados como nome completo.No primeiro exemplo acima a ofuscação dos dados é feita durante a conversão dos dados, ou seja, no script que baixa e converte os dados da Receita Federal. Já no segundo exemplo, a ofuscação acontece na hora de servir os dados pelo backend do Brasil.IO, porque precisamos do dado completo na nossa base para fazer alguns cruzamentos (exemplo: identificar todas as candidaturas dessa pessoa) - isso é necessário pois a versão ofuscada desse dado pode aparecer também para outras pessoas e gerar ambiguidades.
O problema relatado nessa issue é relativo ao segundo exemplo, ou seja: o dado está completo em nossa base e ofuscamos na hora de serví-lo (seja via interface ou via API).
Se um determinado
Field(core.models.Field) tem o campoobfuscatecomoTrue, ele não será exibido integralmente (exemplo: o cpf12345678901seria exibido como***456789**). Porém, se esseFieldpossui o campofrontend_filtercomoTrue, o usuário do site e da API poderá filtrar os registros por esse campo e, aí, temos 2 possíveis cenários:***456789**)12345678901)Hoje apenas o cenário B funcionará, dado que o filtro da query-string ignora se o
Fieldé ofuscado ou não e faz a consulta equivalente a algo como:X.objects.filter(fieldname="12345678901")(ondeXé o model criado dinamicamente para a tabela com os dados).Para contornar esse problema, precisamos:
core.models.DatasetTableModelQuerySet.apply_filters), verificar se algum dos campos de filtro é ofuscado;.filter(campo=valor), mas no caso de valores ofuscados teríamos que aplicar os dois cenários:*), faz o filtro normalmente;*), executa um filtro diferente, como:.filter(campo__contains=valor.replace("*", ""))-- talvez o ideal seja executar substring em vez do__contains, por conta do desempenho.