Ir para o conteúdo
CatSuite

Idioma

Escolha se o site segue o navegador ou se deve forçar português do Brasil ou inglês.

Baixar grátis

Extensões

Interface, dados e achados

Comandos, menus de mensagem, abas nativas e componentes; armazenamento, configurações, credenciais e achados com evidência.

3 min de leitura

Comandos #

JavaScript
cat.commands.register('lab.analisar', {'pt-BR': 'Analisar', en: 'Analyze'}, async args => {
  await cat.storage.set('ultimaAnalise', args);
  return {ok: true};
});

const execucao = await cat.commands.execute('lab.analisar', {origem: 'aba'});

IDs seguem [a-z][a-z0-9_.-]{1,79} e não se repetem. cat.commands.execute inicia outro comando da mesma extensão e devolve o identificador da execução. Exige commands.

JavaScript
cat.ui.menu.register({
  id: 'lab.menu',
  title: {'pt-BR': 'Analisar com o laboratório', en: 'Analyze with the lab'},
  command: 'lab.analisar',
  contexts: ['request', 'response']
});

Ações de menu recebem a request e a response brutas, a url e o source. Exige ui.menu, commands e, para conteúdo HTTP, traffic.read.

Abas nativas #

JavaScript
cat.ui.tab.register({
  id: 'lab.painel',
  title: {'pt-BR': 'Laboratório', en: 'Laboratory'},
  components: [
    {type: 'text', text: {'pt-BR': 'Pronto para analisar.', en: 'Ready to analyze.'}},
    {type: 'field', id: 'nota', label: {'pt-BR': 'Nota', en: 'Note'}},
    {type: 'button', label: {'pt-BR': 'Salvar nota', en: 'Save note'}, command: 'lab.salvar'}
  ]
});

cat.commands.register('lab.salvar', {'pt-BR': 'Salvar nota', en: 'Save note'}, async args => {
  await cat.storage.set('nota', args.nota || '');
  cat.ui.update('lab.painel', [{type: 'text', text: {'pt-BR': 'Nota salva.', en: 'Note saved.'}}]);
});

Os valores dos campos são enviados como argumentos do comando do botão. Exige ui.tab.

Componentes #

Os componentes são renderizados de forma nativa, sem HTML ou JavaScript visual.

TipoCamposDesde
texttextv1
buttonlabel, command, argsv1
field e filterid, label, valuev1
listitemsv1
tablecolumns, rowsv1
httpmessagev1
progressvaluev1
jsonlabel, valueSDK 1.2
difflabel, before, afterSDK 1.2
timelinelabel, items com title, detail e timeSDK 1.2
chartlabel, values com label e valueSDK 1.2
graphlabel, nodes e edges com from e toSDK 1.2

Textos humanos precisam de pt-BR e en. Campos técnicos e identificadores permanecem como estão.

Armazenamento #

JavaScript
await cat.storage.set('contador', 1);
const contador = await cat.storage.get('contador');
await cat.storage.delete('contador');

Os dados JSON ficam separados por extensão, com quota de 10 MiB e até 128 KiB por valor. O aplicativo usa um banco versionado com transações, e os dados sobrevivem às atualizações. Exige storage.

Configurações #

JavaScript
const laboratorio = cat.settings.get('laboratory');

cat.settings.get lê os valores de settings, validados pelo settingsSchema do manifesto.

Credenciais #

Cadastre credenciais na tela da extensão e informe apenas o identificador no código ou no formulário. Elas ficam protegidas pelo Android Keystore, são adicionadas pelo host como Bearer e nunca entram nas exportações.

Achados #

JavaScript
cat.events.on('http.response', async message => {
  const cache = message.headers.find(h => h.name.toLowerCase() === 'cache-control');
  if (!cache || !cache.value.includes('public')) return;
  await cat.findings.add({
    fingerprint: 'cache-publico:' + cat.http.parseUrl(message.url).pathname,
    title: {'pt-BR': 'Resposta com cache público', en: 'Response with public cache'},
    description: {'pt-BR': 'A resposta declara Cache-Control público.', en: 'The response declares public Cache-Control.'},
    severity: 'low',
    confidence: 'observed',
    url: message.url,
    evidence: {request: message.request, response: message}
  });
});
CampoValores
severityinfo, low, medium, high, critical
confidenceobserved, confirmed, hypothesis
statusopen, resolved, false_positive

O fingerprint consolida achados repetidos e preserva o estado escolhido pelo usuário. Exige findings e, neste exemplo, traffic.read.

Exportar com .catdata #

Um .catdata contém dados e achados selecionados. Evidências são opcionais; headers sensíveis, corpos e parâmetros de URL são ocultados na exportação, e credenciais nunca são exportadas. A importação valida o formato e exige que a extensão correspondente já esteja instalada.