Vai al contenuto

Riferimento dell’SDK frontend per i plugin ​

Il codice frontend dei plugin viene eseguito in un iframe con isolamento sandbox. Questo documento è il riferimento di basso livello. Per un’introduzione di livello superiore, consulta README.md.


Modello di sicurezza ​

ProprietàValore
Sandbox dell’iframeSolo allow-scripts (senza allow-same-origin)
CSP script-srcVincolata a un nonce; viene caricato solo lo script del punto di ingresso
CSP connect-src'self' - il plugin può inviare POST a /plugins/{id}/api/* e interrogare periodicamente /plugins/{id}/events/poll
CSP default-src'none'
Accesso al DOM della pagina principaleBloccato (senza allow-same-origin)
Cookie di sessione OgmaInaccessibili al plugin
Comunicazione tra pluginNon disponibile

Le chiamate dati del bridge vengono autorizzate sul server a ogni richiesta; le azioni di visualizzazione e navigazione vengono gestite dall’interfaccia dell’applicazione principale. La cache delle autorizzazioni mostrata nella scheda Autorizzazioni è solo informativa; non controlla l’accesso ai dati.


Protocollo del bridge ​

Il JavaScript del plugin comunica con l’applicazione principale Ogma tramite postMessage. Il componente principale si trova in PluginsView.vue e gestisce i messaggi bridge_request.

Struttura della richiesta ​

ts
interface BridgeRequest {
  type: 'bridge_request'
  sessionId: string     // nonce assigned when the bridge is set up; prevents stale messages
  requestId: string     // caller-generated correlation id (max 128 chars)
  command: string       // e.g. "ogma.requests.get"
  payload?: unknown     // command-specific input
}

Dimensione totale massima del messaggio: 65 536 byte.

Struttura della risposta ​

ts
interface BridgeResponse {
  type: 'bridge_response'
  requestId: string
  ok: boolean
  result?: unknown
  error?: string
  code?: string
}

Non inviare manualmente richieste grezze al bridge tramite postMessage. Usa l’oggetto globale ogmaSDK:

js
ogmaSDK.ready(function(sdk) {
  sdk.meta.get().then(function(meta) {
    sdk.log.info("running as " + meta.pluginId);
  });
});

L’SDK incapsula tutta la comunicazione del bridge e gestisce la correlazione delle richieste, la gestione di sessionId e la risoluzione delle promesse.


Riferimento dei comandi ​

ogma.meta.get ​

Non è richiesto alcun payload.

Restituisce { pluginId, packageId, name, version, ogmaVersion }.

ogma.requests.get ​

Payload: { id: string }

Restituisce una voce HTTP proiettata. Campi: id, method, host, port, path, query, req_len, resp_status, resp_len, roundtrip_ms, created_at. Questa proiezione non include intestazioni o byte del corpo.

Richiede: read_http_history (concessa automaticamente).

ogma.requests.getRaw ​

Payload: { id: string }. Effettua la chiamata tramite sdk.requests.getRaw(id).

Restituisce requestBodyBase64, responseBodyBase64, le loro lunghezze decodificate (requestBodyLength, responseBodyLength), requestBodyTruncated, responseBodyTruncated e maxBodyBytes. Nonostante il nome, questa operazione restituisce i byte del corpo, non un messaggio HTTP grezzo completo. Le codifiche del contenuto supportate vengono decodificate prima della proiezione. Ogni corpo è limitato a 256 KiB; verifica gli indicatori di troncamento prima di elaborare una risorsa completa.

Richiede: read_http_history (concessa automaticamente).

Payload: { limit?: number, offset?: number, query?: string }

query supporta espressioni di filtro HTTPQL. Valore massimo di limit: 20. Restituisce { items: [...], total: number, limit: number, offset: number }.

Richiede: read_http_history (concessa automaticamente).

ogma.findings.list ​

Payload: { limit?: number, offset?: number }

Restituisce { items: [...], total: number, limit: number, offset: number }, con al massimo 20 rilievi di sicurezza per pagina. Gli elementi sono riepiloghi; i campi includono id, title, severity, status, reporter, tags e created_at.

Richiede: read_findings (concessa automaticamente).

ogma.scope.getActive ​

Nessun payload. Restituisce la preimpostazione di ambito attiva o null.

Richiede: read_scope (concessa automaticamente).

ogma.projects.getCurrent ​

Nessun payload. Restituisce { id, name, status } o null.

Richiede: read_projects (concessa automaticamente).

ogma.log ​

Payload: { message: string }

Scrive nel buffer dei log del plugin.

ogma.ui.resize ​

Payload: { height: number } (massimo 2000)

Richiede all’applicazione principale di impostare l’altezza dell’iframe.

ogma.ui.sidebar.registerItem ​

Payload: { name: string, path: string } (nome massimo di 64 caratteri, percorso massimo di 256 caratteri)

Registra la navigazione all’interno del pannello del plugin. Massimo 20 elementi per plugin. Registra i corpi delle pagine corrispondenti con sdk.navigation.addPage(path, { title, body }); scegliendo l’elemento, quella pagina viene visualizzata nell’iframe, non come nuova rotta di livello superiore dell’area di lavoro Ogma.

ogma.backend.call ​

Payload: { method: string, args: unknown[] }

Chiama un gestore RPC backend registrato tramite sdk.api.register(method, fn). La lunghezza massima del nome del metodo è di 64 caratteri.

Restituisce ciò che il gestore backend ha restituito, serializzato come JSON.

ogma.backend.onEvent ​

Payload: non richiesto.

Viene solo confermata la ricezione. Usa ogma.events.poll per recuperare effettivamente gli eventi.

ogma.events.poll ​

Payload: { since: number } (indice dell’ultima interrogazione; inizia da 0)

Restituisce { events: [{ event: string, args: unknown[] }], next_since: number }.

ogma.navigation.addPage ​

Payload: { path: string, title?: string }

Il bridge conferma la ricezione del percorso della pagina. L’SDK iniettato accetta anche { body: HTMLElement } come opzione di sdk.navigation.addPage(path, options), inserisce il corpo nell’iframe e cambia la visibilità della pagina quando l’applicazione principale seleziona l’elemento corrispondente della barra laterale. Il nodo DOM resta locale; non viene serializzato tramite il bridge.

ogma.window.showToast ​

Payload: { message: string, variant?: "info"|"success"|"warning"|"error", duration?: number }

Mostra una notifica temporanea nel pannello del plugin. Durata in ms (massimo 10000, valore predefinito 3000).

ogma.commands.register ​

Payload: { id: string, name: string }

Registra il comando del plugin nello store dei comandi dell’applicazione principale. L’esecuzione da parte dell’applicazione principale invia all’iframe un messaggio plugin_command contenente commandId e il contesto; il plugin deve fornire il callback corrispondente. La sola registrazione non esegue il comando.

ogma.menu.registerItem ​

Payload: { type?: "Request" | "RequestRow" | "Response", commandId: string, label?: string }

Registra una voce del menu contestuale collegata a un comando del plugin. Registra prima il comando. L’etichetta usa per impostazione predefinita il nome registrato del comando e, in sua assenza, il suo ID; se type viene omesso, il valore predefinito è Request. Il bridge dell’applicazione principale non utilizza leadingIcon.

Funzioni di supporto per il tema ​

L’SDK iniettato offre anche sdk.theme.get() e sdk.theme.onChange(callback). Queste funzioni leggono il tema dell’iframe e si iscrivono agli aggiornamenti del tema dell’applicazione principale senza un comando dati del bridge separato. Usale per mantenere l’interfaccia del plugin coerente con l’aspetto chiaro/scuro di Ogma.


Codici di errore ​

CodiceSignificato
PERMISSION_DENIEDIl plugin non dispone dell’autorizzazione richiesta.
PLUGIN_DISABLEDIl plugin non è attualmente abilitato.
UNKNOWN_COMMANDIl comando non è nell’elenco di quelli supportati.
INVALID_PAYLOADUn campo obbligatorio del payload manca o ha un tipo errato.
NOT_FOUNDLa risorsa richiesta non esiste.
LIMIT_EXCEEDEDÈ stato raggiunto un limite di quantità per plugin (ad esempio, per le voci della barra laterale).
SERVER_ERRORErrore interno. Controlla i log del plugin.

Elenco dei comandi supportati ​

ogma.meta.get, ogma.log, ogma.ui.resize, ogma.ui.sidebar.registerItem, ogma.requests.get, ogma.requests.getRaw, ogma.requests.search, ogma.findings.list, ogma.scope.getActive, ogma.projects.getCurrent, ogma.backend.call, ogma.backend.onEvent, ogma.events.poll, ogma.navigation.addPage, ogma.window.showToast, ogma.commands.register, ogma.menu.registerItem.

Software proprietario. Tutti i diritti riservati.