مكون Firefox XPCOM - تم رفض الإذن لاستدعاء الأسلوب NameClass

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

  •  02-07-2019
  •  | 
  •  

سؤال

هل يمكن لمكون Firefox XPCOM قراءة محتوى الصفحة وكتابته عبر صفحات متعددة؟

سيناريو:مجموعة من ملفات HTML وجافا سكريبت المحلية.يفتح ملف "Main.html" نافذة "pluginWindow"، ويقوم بإنشاء مكون إضافي باستخدام:

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

البرنامج المساعد الذي يحتوي على 3 طرق.

IPlugin.Read - قراءة البيانات من البرنامج المساعد
IPlugin.Write - كتابة البيانات إلى البرنامج المساعد
IPlugin.addObserver - إضافة معالج رد الاتصال للقراءة.

يقوم "Main.html" بعد ذلك بالاتصال بـ pluginWindow ويحاول استدعاء أسلوب البرنامج المساعد Write.

أتلقى خطأ:

Permission denied to call method UnnamedClass.Write

هل كانت مفيدة؟

المحلول

أولاً، هل رمز C++ الخاص بك حقًا هو توصيل في أو مكون XPCOM, ، ربما تم تثبيته كجزء من امتداد؟يبدو وكأنه في وقت لاحق.

إذا كان الأمر كذلك، فهو غير قابل للاستخدام من كود JS غير الموثوق به - أي صفحة ويب أو ملف HTML محلي.إنه قابل للاستخدام بالكامل من خلال التعليمات البرمجية المميزة، والنوع الأكثر شيوعًا منها هو امتداد شفرة.

أنت تعمل على حل هذه المشكلة عند إنشاء المكون باستخدام ملف enablePrivilege('UniversalXPConnect') يتصل.لا يُنصح بهذا حقًا، إلا إذا لم يتم توزيعه على المستخدمين (نظرًا لأن هذا الاستدعاء ينبثق مربعًا مربكًا وإذا قمت بتعيين تفضيل للسماح دائمًا باستخدام البرامج النصية file:// التي تستخدم XPCOM، فقد تكون مشكلة أمنية، حيث أنه ليست كل البرامج النصية المحلية الصفحات موثوقة - فكر في صفحات الويب المحفوظة).

لك Write فشل الاتصال لنفس السبب - صفحات file:// غير موثوقة لاستخدام مكونات XPCOM.ربما يمكنك تشغيله إذا أضفت آخر enablePrivilege استدعاء في نفس وظيفة استدعاء الكتابة نفسها.

اعتمادا على الوضع، قد يكون هناك حل أفضل.

إذا كان يجب التعامل مع ملفاتك على أنها موثوقة، فقد ترغب في تجميعها كملحق والوصول إليها عبر عنوان URL الخاص بـ chrome://.وهذا يمنح التعليمات البرمجية الموجودة في تلك الصفحات أذونات للاتصال بأي مكون XPCOM، بما في ذلك المكون الخاص بك.

إذا كانت أساليب المكون آمنة للاستخدام من أي صفحة أو إذا تم التحكم في البيئة ولم يتم تحميل أي صفحات غير موثوق بها في المتصفح، فيمكنك جعل المكون الخاص بك قابلاً للوصول إلى المحتوى (ابحث عن nsSidebar في كود موزيلا على سبيل المثال وأيضا ل nsISecurityCheckedComponent).

أوه، وعندما لا تحصل على إجابات جيدة هنا، يجب عليك بالتأكيد تجربة مجموعات الأخبار/القوائم البريدية من موزيلا.

[تحرير ردًا على تعليق] فكر في وضع الكود الذي يحتاج إلى استدعاء المكون في برنامج نصي chrome://.وبدلاً من ذلك، يجب أن تكون قادرًا على "مباركة" صفحاتك بامتيازات Chrome باستخدام رمز مثل هذا (لاحظ أنه يفعل عكس ما تحتاجه، وهو إزالة امتيازات Chrome).

نصائح أخرى

هل يعمل Main.html وتلك النافذة الأخرى بامتيازات Chrome؟إذا قمت بالوصول إلى Main.html "بشكل طبيعي"، فما عليك سوى وضعه على شريط الموقع في Firefox، ثم سيكون هناك قيود على ما يمكنه فعله (وإلا، يمكن لصفحة ويب عشوائية أن تفعل الشيء نفسه تمامًا).

إذا كنت تقوم بإنشاء مكون إضافي لمتصفح فايرفوكس، فضع الكود الخاص بك في تراكب XUL.

إذا كنت تريد حقًا السماح لأي صفحة ويب بالقيام بكل ما يفعله المكون الإضافي الخاص بك، فيمكنك إنشاء آلية ما من خلالها يمكن للصفحة أن تطلب من المكون الإضافي إجراء العملية باستخدام امتيازات Chrome الخاصة به وإرسال النتيجة إلى الصفحة بعد ذلك.

إذا لم تكن تنشئ امتدادًا لمتصفح فايرفوكس...فأخشى أنني أساءت فهم شيء ما، هل يمكنك توضيحه أكثر؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top