Componente Firefox XPCOM: autorizzazione negata per chiamare il metodo senza nome classe

StackOverflow https://stackoverflow.com/questions/127693

  •  02-07-2019
  •  | 
  •  

Domanda

Un componente XPCOM di Firefox può leggere e scrivere il contenuto di una pagina su più pagine?

Scenario: Un mucchio di file HTML e javascript locali. A " Main.html " il file apre una finestra " pluginWindow " ;, e crea un plugin usando:

netscape.security.PrivilegeManager.enablePrivilege ( 'UniversalXPConnect');
var obj = Components.classes [cid] .createInstance ();
plugin = obj.QueryInterface (Components.interfaces.IPlugin);
plugin.addObserver (handleEvent);

Il plugin che ha 3 metodi.

IPlugin.Read - Leggi i dati dal plugin
IPlugin.Write - Scrivi i dati nel plugin
IPlugin.addObserver - Aggiungi un gestore di callback per la lettura.

Il " Main.html " quindi chiama nella finestra plugin e prova a chiamare il metodo plugin Scrivi.

Ricevo un errore:

Autorizzazione negata per chiamare il metodo UnnamedClass.Write

È stato utile?

Soluzione

Innanzitutto, il tuo codice C ++ è davvero un plugin o un componente XPCOM , eventualmente installato come parte di un extension ? Sembra che sia il più tardi.

In tal caso, non è utilizzabile da codice JS non attendibile: qualsiasi pagina Web o file HTML locale. È completamente utilizzabile dal codice privilegiato, il cui tipo più comune è il extension .

Stai risolvendo questo problema quando crei il componente usando la chiamata enablePrivilege ('UniversalXPConnect') . Questo non è davvero raccomandato, a meno che non venga distribuito agli utenti (poiché questa chiamata apre una finestra confusa e se si imposta una preferenza per consentire sempre il file: // gli script utilizzano XPCOM, potrebbe essere un problema di sicurezza, poiché non tutti i locali le pagine sono affidabili - pensa alle pagine Web salvate).

La tua chiamata Write non riesce per lo stesso motivo - file: // pagine non sono affidabili per utilizzare i componenti XPCOM. Probabilmente puoi farlo funzionare se aggiungi un'altra chiamata enablePrivilege nella stessa funzione della chiamata Write stessa.

A seconda della situazione, potrebbe esserci una soluzione migliore.

Se i tuoi file devono essere considerati affidabili, potresti volerli impacchettare come estensione e accedervi tramite un URL chrome: //. Questo dà al codice in quelle pagine le autorizzazioni per chiamare qualsiasi componente XPCOM, incluso il tuo.

Se i metodi del componente sono sicuri da qualsiasi pagina o se l'ambiente è controllato e nel browser non vengono caricate pagine non attendibili, è possibile rendere il componente accessibile al contenuto (cercare nsSidebar in codice mozilla per un esempio e anche per nsISecurityCheckedComponent ).

Oh, e quando non ottieni buone risposte qui, dovresti assolutamente provare i newsgroup / mailing list di mozilla.

[modifica in risposta a un commento] Valuta di inserire il codice che deve chiamare il componente in uno script chrome: //. In alternativa, dovresti essere in grado di " benedire " le tue pagine con i privilegi di Chrome usando codice come this (nota che fa il contrario di quello che ti serve - togliendo i privilegi di Chrome).

Altri suggerimenti

Main.html e quell'altra finestra funzionano con i privilegi di Chrome? Se accedi a Main.html "normalmente", semplicemente inserendolo nella barra degli indirizzi di Firefox, avrà delle restrizioni su ciò che può fare (altrimenti una pagina web arbitraria potrebbe fare esattamente lo stesso).

Se stai creando un plugin firefox, inserisci il tuo codice in un overlay XUL.

Se vuoi davvero consentire a qualsiasi pagina web di fare qualunque cosa faccia il tuo plugin, puoi stabilire un meccanismo attraverso il quale la pagina può chiedere al plugin di fare l'operazione con i suoi privilegi di Chrome e inviare il risultato alla pagina in seguito .

Se NON stai realizzando un'estensione firefox ... allora temo di aver frainteso qualcosa, potresti spiegarlo di più?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top