[P1][feature] feat(connector): HubSpot CRM connector — PII em contacts/companies/deals object properties
Contexto
CRMs são um dos maiores reservatórios de PII fora do banco: nome, email, telefone, e frequentemente CPF/documento em custom fields. O Data Boar escaneia DBs e filesystem; um conector CRM cobre um vector de alto valor que DBAs não monitoram.
Totalmente opt-in. Zero Trust. Least privilege (private app token read-only). Enterprise/Pro tier.
Encaixe na arquitetura (ref: docs/ADDING_CONNECTORS.md)
Extensão limpa do contrato de conector existente — não reinvenção:
- Novo módulo
connectors/hubspot_connector.py, classe HubSpotConnector
__init__(self, target_config, scanner, db_manager, sample_limit=5)
connect() — cliente REST a partir de target_config (token injetado via env, nunca no config commitado)
run() — para cada object type habilitado (contacts / companies / deals):
- lê as object properties (schema do objeto)
- trata cada propriedade como uma "coluna"
- amostra os valores (respeitando
sample_limit)
scanner.scan_column(prop_name, sample_text)
db_manager.save_finding(source_type="filesystem", path=<object_type>, file_name=<prop_name>, ...)
close() — encerra o cliente
- registro:
register("hubspot", HubSpotConnector, ["name","type"]) + ramo em connector_for_target() para type: hubspot
API HubSpot (referência)
- REST
/crm/v3/objects/{contacts|companies|deals} com parâmetro properties= para trazer os campos
- Schema de propriedades via
/crm/v3/properties/{objectType} (para descobrir custom fields dinamicamente)
- Paginação via cursor
after
- Rate limit da API respeitado (backoff)
Config (exemplo)
targets:
- name: crm-hubspot
type: hubspot
objects: [contacts, companies, deals]
# token via env: HUBSPOT_PRIVATE_APP_TOKEN (nunca no arquivo)
Least privilege
- Private app token com escopo read-only nos objetos escaneados (
crm.objects.contacts.read, etc.)
- Zero write. Zero delete.
Patterns a aplicar
Todos os patterns existentes via YAML: CPF, CNPJ, email, telefone, endereço, cartão, dados sensíveis — zero mudança de código de detecção. Custom fields de CRM (onde CPF costuma esconder) entram automaticamente porque cada property vira coluna.
Fixtures
Sintéticos (gerador de dados sintéticos BR): simular contacts com CPF-dígito-válido em custom field, para testar detecção sem dado real.
Definição de pronto
— claude.ai · Auditor R.O. externo (steering/altitude) · Sonnet 5 · A.I.I.D.C.O.B.P.P. v1.4
[P1][feature] feat(connector): HubSpot CRM connector — PII em contacts/companies/deals object properties
Contexto
CRMs são um dos maiores reservatórios de PII fora do banco: nome, email, telefone, e frequentemente CPF/documento em custom fields. O Data Boar escaneia DBs e filesystem; um conector CRM cobre um vector de alto valor que DBAs não monitoram.
Totalmente opt-in. Zero Trust. Least privilege (private app token read-only). Enterprise/Pro tier.
Encaixe na arquitetura (ref:
docs/ADDING_CONNECTORS.md)Extensão limpa do contrato de conector existente — não reinvenção:
connectors/hubspot_connector.py, classeHubSpotConnector__init__(self, target_config, scanner, db_manager, sample_limit=5)connect()— cliente REST a partir detarget_config(token injetado via env, nunca no config commitado)run()— para cada object type habilitado (contacts / companies / deals):sample_limit)scanner.scan_column(prop_name, sample_text)db_manager.save_finding(source_type="filesystem", path=<object_type>, file_name=<prop_name>, ...)close()— encerra o clienteregister("hubspot", HubSpotConnector, ["name","type"])+ ramo emconnector_for_target()paratype: hubspotAPI HubSpot (referência)
/crm/v3/objects/{contacts|companies|deals}com parâmetroproperties=para trazer os campos/crm/v3/properties/{objectType}(para descobrir custom fields dinamicamente)afterConfig (exemplo)
Least privilege
crm.objects.contacts.read, etc.)Patterns a aplicar
Todos os patterns existentes via YAML: CPF, CNPJ, email, telefone, endereço, cartão, dados sensíveis — zero mudança de código de detecção. Custom fields de CRM (onde CPF costuma esconder) entram automaticamente porque cada property vira coluna.
Fixtures
Sintéticos (gerador de dados sintéticos BR): simular contacts com CPF-dígito-válido em custom field, para testar detecção sem dado real.
Definição de pronto
HubSpotConnectorimplementado, registrado, resolvível viatype: hubspotdocs/ADDING_CONNECTORSreferenciado; entrada no config de exemplo— claude.ai · Auditor R.O. externo (steering/altitude) · Sonnet 5 · A.I.I.D.C.O.B.P.P. v1.4