Npapi java

Создание плагина для браузера с помощью NPAPI

Npapi java

NPAPI это набор API, позволяющий создавать плагины для Firefox, Chrome, Safari, Opera. В этой статье я хочу дать первоначальные сведения о создании плагина на базе NPAPI.

Будет приведен пример плагина под Windows, но и разработчикам на Mac и Unix статья будет полезной, т.к. описывает общий подход к созданию плагинов, использующих NPAPI.

NPAPI плагин это модуль, который «цепляется» к браузеру и отвечает за обработку определенного content type (например application/x-shockwave-flash).

О том как появился и менялся NPAPI вы можете прочитать на странице в Wikipedia

Полное описание API можно получить на странице Gecko_Plugin_API_Reference

Для начала необходимо скачать XULRunner в состав которого входят заголовочные файлы, необходимые для создания плагина (include\plugin). Если вы работаете в Visual Studio — не забудьте добавить путь к файлам Include в VC++ Directories (пункт меню Tools -> Options -> Projects and Solutions -> VC++ Directories). Плагин представляет из себя модуль, экспортирующий следующие функции:

NP_GetEntryPoints – вызывается при загрузке плагина. С помощью данной функции браузер получает указатели на другие функции, содержащиеся в плагине, необходимые браузеру для работы с плагином.

NP_Initialize – вызывается при инициализации плагина. При вызове браузер передает указатели на свои функции, которые могут понадобиться плагину.
NP_Shutdown – вызывается при завершении работы плагина.

Порядок вызова NP_GetEntryPoints и NP_Initialize может меняться в зависимости от браузера. В часности Chrome сначала вызывает NP_GetEntryPoints, затем NP_Initialize.

Давайте рассмотрим эти функции более продобно.

NP_GetEntryPoints

Прототип:

NPError WINAPI NP_GetEntryPoints(NPPluginFuncs* pFuncs)

В качестве аргументов передается указатель на структуру NPPluginFuncs typedef struct _NPPluginFuncs {
// Размер структуры uint16_t size;

// Версия

uint16_t version;

// Вызывается при создании нового экземпляра плагина

NPP_NewProcPtr newp;

// Вызывается при удалении экземпляра плагина

NPP_DestroyProcPtr destroy;

// Вызывается когда браузер хочет сообщить плагину о том, // что окно (в котором находится объект, созданный плагином) создано,

// закрыто, изменило позицию или размер.

NPP_SetWindowProcPtr setwindow;

// Вызывается для уведомления плагина о создании нового потока данных.

NPP_NewStreamProcPtr newstream;

// Вызывается для уведомления плагина о закрытии или удалении потока данных.

NPP_DestroyStreamProcPtr destroystream;

// Вызывается для того, чтобы сообщить плагину полный путь
// к локальному файлу связанного с потоком данных.

NPP_StreamAsFileProcPtr asfile;

// Вызывается для определения максимального размера данных,
// которые готов обработать плагин.

NPP_WriteReadyProcPtr writeready;

// Вызывается для передачи данных плагину.

NPP_WriteProcPtr write;

// Вызывается когда пользователь запрашивает печать страницы,
// содержащей плагин.

NPP_PrintProcPtr print;

// Вызывается для обработки событий.

NPP_HandleEventProcPtr event;

// Вызывается после завершения URL запроса.

NPP_URLNotifyProcPtr urlnotify;

// Устаревшее, более не используется.

void* javaClass;

// Вызывается для запроса от плагина различной информации.

NPP_GetValueProcPtr getvalue;

// Вызывается для передачи плагину различной информации.

NPP_SetValueProcPtr setvalue; } NPPluginFuncs;
Структура помимо размера (uint16_t size) и версии (uint16_t version) содержит указатели на функции, реализованные плагином. Немного забегая вперед скажу, что NPP_ это префикс функций реализуемых плагином, дальше мы встретим функии начинающиеся с NPN_ — эти функции реализуются браузером. Вроде бы мелочь, но данное знание помогает лучше понять жизненный цикл плагина.

Не все из выше перечисленных функций могут использоваться плагином, я не нашел нигде информации о том, корректно ли присваивать не используемым функциям NULL, поэтому создал функции-заглушки, которые ничего не делают, а только возвращают значение означающее успешность вызова NPERR_NO_ERROR. Например для NPP_DestroyStreamProcPtr:

static NPError StubDestroyStream(NPP instance, NPStream *stream, NPReason reason) { return NPERR_NO_ERROR; }
NP_Initialize

Прототип для Windows:

NPError WINAPI NP_Initialize(NPNetscapeFuncs *aNPNFuncs)

Прототип для Unix: NPError NP_Initialize(NPNetscapeFuncs *aNPNFuncs, NPPluginFuncs *aNPPFuncs)
Вызывается при инициализации плагина. Функция должна вызываться браузером только один раз, до создания первого экземпляра плагина.

В качестве аргументов передается указатель на структуру NPNetscapeFuncs

typedef struct _NPNetscapeFuncs {
// Размер структуры uint16_t size;

// Версия

uint16_t version;

// Выполнение GET запроса

NPN_GetURLProcPtr geturl;

// Выполнение POST запроса

NPN_PostURLProcPtr posturl;

// Получение блока данных из потока

NPN_RequestReadProcPtr requestread;

// Создание нового потока данных

NPN_NewStreamProcPtr newstream;

// Запись данных в поток

NPN_WriteProcPtr write;

// Удаление и закрытия потока данных

NPN_DestroyStreamProcPtr destroystream;

// Отображение сообщения в строке состояния браузера

NPN_StatusProcPtr status;

// Получение строки “user agent”

NPN_UserAgentProcPtr uagent;

// Выделение памяти в адресном пространстве браузера

NPN_MemAllocProcPtr memalloc;

// Освобождение памяти в адресном пространстве браузера

NPN_MemFreeProcPtr memfree;

// Освобождение указанного диапазона памяти

NPN_MemFlushProcPtr memflush;

// Перезагрузка всех плагинов

NPN_ReloadPluginsProcPtr reloadplugins; NPN_GetJavaEnvProcPtr getJavaEnv; NPN_GetJavaPeerProcPtr getJavaPeer;

// Создание нового GET запроса с возможностью получать уведомления о ходе его выполнения

NPN_GetURLNotifyProcPtr geturlnotify;

// Создание нового POST запроса с возможностью получать уведомления о ходе его выполнения

NPN_PostURLNotifyProcPtr posturlnotify;

// Запрос информации от браузера

NPN_GetValueProcPtr getvalue;

// Передача информации браузеру

NPN_SetValueProcPtr setvalue;

// Запрос на повторную отрисовку области рисования

NPN_InvalidateRectProcPtr invalidaterect;

// Запрос на повторную отрисовку указанной области

NPN_InvalidateRegionProcPtr invalidateregion;

// Отправка сообщения на отрисовку плагину, не имеющему окна

NPN_ForceRedrawProcPtr forceredraw;

// Создание идентификатора из строки

NPN_GetStringIdentifierProcPtr getstringidentifier;

// Создание массива идентификаторов из массива строк

NPN_GetStringIdentifiersProcPtr getstringidentifiers;

// Создание идентификатора из числа

NPN_GetIntIdentifierProcPtr getintidentifier;

// Проверка явялется ли идентификатор строкой

NPN_IdentifierIsStringProcPtr identifierisstring;

// Преобразование идентификатора в строку

NPN_UTF8FromIdentifierProcPtr utf8fromidentifier;

// Преобразование идентификатора в число

NPN_IntFromIdentifierProcPtr intfromidentifier;

// Создание нового объекта

NPN_CreateObjectProcPtr createobject;

// Уменьшение на единицу количества ссылок на объект

NPN_RetainObjectProcPtr retainobject;

// Освобождение объекта

NPN_ReleaseObjectProcPtr releaseobject;

// Вызов метода указанного объекта

NPN_InvokeProcPtr invoke;

// Вызов метода по умолчанию для указанного объекта

NPN_InvokeDefaultProcPtr invokeDefault;

// Выполнение скрипта в контексте указанного объекта

NPN_EvaluateProcPtr evaluate;

// Получение свойства указанного объекта

NPN_GetPropertyProcPtr getproperty;

// Задание значения для свойства указанного объекта

NPN_SetPropertyProcPtr setproperty;

// Удаление свойства

NPN_RemovePropertyProcPtr removeproperty;

// Определение наличия свойства

NPN_HasPropertyProcPtr hasproperty;

// Определение наличия метода

NPN_HasMethodProcPtr hasmethod;

// Освобождение памяти, выделенной под значение NPVariant

NPN_ReleaseVariantValueProcPtr releasevariantvalue;

// С помощью данной функции плагин может уведомить браузер об ошибке

NPN_SetExceptionProcPtr setexception; NPN_PushPopupsEnabledStateProcPtr pushpopupsenabledstate; NPN_PopPopupsEnabledStateProcPtr poppopupsenabledstate;

// Получение списка имен свойств и методов указанного объекта

NPN_EnumerateProcPtr enumerate;

// Асинхронный вызов указанной функции в контексте потока плагина

NPN_PluginThreadAsyncCallProcPtr pluginthreadasynccall;

// Создание нового объекта

NPN_ConstructProcPtr construct; NPN_GetValueForURLPtr getvalueforurl; NPN_SetValueForURLPtr setvalueforurl; NPN_GetAuthenticationInfoPtr getauthenticationinfo; } NPNetscapeFuncs;
NP_Shutdown

Прототип для Windows:

void WINAPI NP_Shutdown(void);

Прототип для Unix: void NP_Shutdown(void);
Вызывается при выгрузке плагина. В данной функции плагин должен освободить выделенную память, разрушить созданные объекты и т.д. Данная функция вызывается последней, уже после того как будут удалены все экземпляры плагина.

Для создания плагина необходимо создать DLL, реализовать перечисленные экспортируемые функции и можно начинать эксперементировать. Одно важное замечание — плагин не будет загружаться браузером, если в его информации о версии отсутствует строка MIMEType, определяющая content type, обрабатываемый плагином. В файле ресурсов она выглядит так:

VALUE “MIMEType”, “application/minimize-to-tray-extension”
Без этой строки Chrome не хотел загружать плагин, а я долго не мог понять, почему не происходит вызова DllMain, не говоря уже о других экспортируемых функция.

Чтобы избавить себя от реализации всех функций, которые должен иметь плагин, в качестве отправной точки вы можете взять исходники моего проекта расширения для Google Chrome Minimize to tray

Хабы:

Источник: https://habr.com/ru/post/73003/

Включение поддержки NPAPI в браузерах Opera и Firefox

Npapi java

NPAPI — платформа разработки плагинов Netscape, до недавнего времени поддерживаемая многими браузерами. Позволяла расширить функциональность, просматривать различный контент прямо из окна программы. На ней работают такие плагины, как Adobe Flash Player, Unity, Java, Silverlight и многие другие.

В браузерах Opera и Firefox поддержку NPAPI необходимо включать самостоятельно

Отказ обосновывается тем, что плагины представляли серьёзную потенциальную опасность для компьютера, поскольку запускались с родительскими правами и часто под их видом проникали вирусы и вредоносное ПО. А также они замедляют работу браузера и иногда приводят к критическим ошибкам.

Тем не менее очень многие сайты работают с этой технологией, поэтому по желанию пользователей в браузерах осталась возможность включить поддержку платформы.

Mozilla Firefox

Браузер Firefox использует дополнения для реализации тех функций, которые сам не может выполнить. Обычно это аудио, видео, онлайн-игры, презентации, web-конференции и многое другое. Firefox осуществляет поддержку следующих plug-in:

  • Adobe Flash;
  • Java — просмотр интерактивного содержимого сайта;
  • Silverlight — воспроизведение видео и аудио;
  • QuickTime — проигрывание аудио и видео;
  • Windows Media — проигрывание WinMedia;
  • Adobe Acrobat — открытие и просмотр документов PDF.

64-битная версия Firefox поддерживает только Adobe Flash и Silverlight. Браузер Firefox начиная с версии 52 прекратил поддержку всех дополнений, кроме Adobe Flash. Во время переходного периода отказа от технологии компания выпустила браузер Firefox ESR (Extended Support Release) с поддержкой платформы Netscape до начала 2018 года.

Как альтернативу Firefox предлагает технологии WebApi. Многие сайты сейчас стали переходить на новые платформы, и необходимость в старых небезопасных дополнениях отпадает. Тем не менее по необходимости можно их включить и выключить:

  1. Нажмите кнопку Меню и выберите «Дополнения».
  2. На вкладке «Управление» выберите «Всегда включать».

В версии Firefox 52 и выше поддержка ограничена, поэтому для её включения сделайте следующее:

  1. Откройте браузер и в новой вкладке в качестве адреса введите about:config. 
  2. Подтвердите намерение.
  3. Добавьте логическую переменную plugin.load_flash_only. 
  4. Установите значение переменной false.
  5. Перезапустите браузер.

ВАЖНО. Такие действия могут привести к потере программой работоспособности, особенно после обновления. Вмешиваясь в систему его работы, осознавайте риск последствий. 

С версии Firefox 53 возможность включить поддержку NPAPI будет полностью исключена из программного кода.

Опера

Opera также использует plugins для расширения своей функциональности:

  • для отображения flash-содержимого;
  • для связи со сторонними приложениями;
  • для поддержки специальных web-функций.

Просмотреть доступные плагины в браузере Опера можно следующим образом:

  1. Введите в строке адреса opera:plugins. 
  2. Появится список с названиями, типом и путём расположения.

Начиная с версии Opera 36 отключена поддержка NPAPI, таким образом, Опера вслед за ведущими программами ступила на путь перехода к новым технологиям. Однако, в отличие от Firefox, они оставили возможность включить поддержку plugins.

И также в новой версии Opera используется PPAPI Flash. Это новый интерфейс, у которого нет таких проблем с безопасностью и производительностью. Однако пока он не на всех сайтах работает корректно.

Если у вас возникли проблемы с флеш-содержимым, смените тип следующим образом:

  1. Зайдите в Opera в «Меню», выберите «Другие инструменты», далее «Включить инструменты разработчика». 
  2. В Меню появится строка «Инструменты разработчика», выберите в ней «Плагины».
  3. Найдите Adobe Flash Player, «Показать подробности».
  4. Отключите тип PPAPI и включите NPAPI.

Включить в Опере поддержку технологии можно через команду enable npapi:

  1. Откройте браузер и в адресной строке введите opera://flags. 
  2. В строке поиска наберите npapi.
  3. В найденном пункте Disable NPAPI plug-ins выберите

То же самое можно сделать командой chrome://flags/#enable-npapi. После этого перезапустите программу.

Таким образом, пока можно обойти ограничение Firefox и Opera на использование NPAPI. Но помните, что такие действия угрожают стабильности и безопасности работы программы и компьютера в целом. Ведь не зря ведущие разработчики отказываются от этой технологии, ограничивают её использование на время переходного периода, пока web-программисты не перестроят свои сайты под новую реальность.

Источник: https://nastroyvse.ru/net/inter/kak-vklyuchit-podderzhku-npapi-v-brauzerax.html

Интернет журнал о выборе лучших товаров и услуг

Npapi java

28.07.2019 16:16:11

Эксперт: Аркадий Беркович

Интерфейс построения плагинов NPAPI, был разработан в середине 90-х годов прошлого века компанией Netscape Communications. Благодаря простоте взаимодействия с различными типами данных технология быстро стала популярной, а ее поддержка была реализована в других браузерах.

Однако, именно возможность прямой работы с внешним контентом стала главной уязвимостью NPAPI. Плагин невозможно было запустить как изолированный от кода браузера процесс, что приводило к его повышенной уязвимости.

Начиная с 42-й версии, выпущенной в 2015 году, Google перевел Chrome на использование более прогрессивного формата расширений Pepper API. Поддержка старых плагинов еще некоторое время включалась принудительно, пока не была полностью «выпилена» из кода обозревателя.

Наши эксперты рекомендуют убедиться, что без использования NPAPI никак не обойтись и только потом приступать к дальнейшим действиям.

Установка групповой политики

Прежде чем заменить установленную актуальную версию Chrome на устаревшую проведем подготовительные работы.

Отправляемся на сервера Google и загружаем правила групповой политики касающиеся обновления обозревателя. Полученный файл представляет собой архив ZIP. Находим его в папке «Загрузки» и вызываем контекстное меню. Выбираем пункт «Извлечь все».

Указываем в качестве места распаковки рабочий стол, выбрав его в меню быстрого доступа. Нажимаем кнопку «Выбор папки».

В открывшемся окне утилиты архивации проставляем галочку в указанном стрелкой месте. В результате сразу после извлечения файлы отобразятся в новом окне Проводника.

В созданной на рабочем столе папке находится два административных шаблона и папка с файлами локализации.

Открываем еще одно окно Проводника. Переходим в нем в системную директорию, расположенную по адресу «C:\Windows\PolicyDefinitions». Здесь хранятся предустановленные административные шаблоны и предназначенные для них файлы локализации. Копируем сюда содержимое размещенной на рабочем столе папки «GoogleUpdateAdmx», при этом языковой пакет помещаем в одноименную директорию «en-US».

Для записи новых элементов потребуются административные права. Проставляем в появившемся окне галочку в отмеченном стрелкой месте, разрешая таким образом системе копировать сразу два файла. Нажимаем «Продолжить».

Загрузка старой версии браузера

Google не хранит старые дистрибутивы обозревателя в открытом доступе, выкладывая на официальном сайте только актуальную сборку. Искать предыдущие версии браузера с поддержкой NPAPI придется в интернете. Наши эксперты использовали страницу IDEAProg.Download, на которой собрано несколько десятков различных инсталляторов Chrome.

Перейдя по указанной выше ссылке, попадаем на страницу посвященную разработанному Google браузеру. Пролистываем общее описание возможностей до пункта «Предыдущие версии». Нажимаем на кнопку «Показать еще».

Для тестирования выбрана сборка 42.0.2311.135, начиная с которой поддержка NPAPI была реализована в качестве дополнительной опции. Кликаем по выделенной рамкой ссылке.

В обновившейся вкладке обозревателя попадаем на страницу загрузки выбранной сборки. Нажимаем в правой части окна кнопку, обозначенную рамкой. На компьютер загрузится автономный инсталлятор 32-битной версии Google Chrome, пригодный к установке в операционную систему Windows любой разрядности.

Настройка групповой политики

После того как была загружена старая сборка браузера и стал известен ее номер, настроим ранее установленные административные шаблоны.

Вызываем диалоговое окно «Выполнить» клавиатурным сочетанием «Win+R». Набираем в текстовом поле «gpedit.msc». Кликаем по кнопке «ОК» или используем клавишу ввода запуская редактор групповой политики Windows.

Выбираем раздел «Конфигурация компьютера» и далее последовательно разворачиваем содержимое директорий: «Административные шаблоны» –> «Google» –> «Google Update» –> «Applications». В последнем находим и открываем папку «Google Chrome». В правой части окна появятся четыре доступных действия. Выбираем пункт «Target version prefix override» и дважды кликаем мышкой открывая меню настройки.

Устанавливаем показанный цифрой «1» переключатель в положение «Включено». Ниже, в окне «Параметры», активируется текстовое поле «Target version prefix». Указываем в нем первые две цифры номера загруженной сборки браузера, в данном случае это будет 42.

Внесенные изменения запрещают Google Chrome загружать и устанавливать версии с номером, превышающим указанный. Последовательно нажимаем в нижней части окна кнопки «Применить» и «ОК».

Первая записывает внесенные в политику изменения, а вторая закрывает настройки.

Удаление Chrome

Закончив с предварительной подготовкой, приступаем к замене текущей версии браузера.

Вызываем диалоговое окно «Выполнить» и в текстовом поле набираем «control». Нажимаем «ОК» запуская классическую панель управления.

В общем списке настроек находим и открываем раздел «Программы и компоненты», обозначенный на скриншоте рамкой.

Выделяем мышкой Chrome в перечне установленного на компьютере ПО. На управляющей панели активируется указанная стрелкой кнопка. Нажимаем ее для удаления браузера.

Во всплывающем окне устанавливаем показанную на скриншоте галочку. Нажимаем кнопку «Удалить» подтверждая решение. По окончании процесса запуститься Microsoft Edge, с вопросником Google. Пользователя попросят указать причину удаления обозревателя. Отвечаем по желанию или просто закрываем окно переходя к следующему шагу.

Установка старой версии обозревателя

Загруженный на предыдущих этапах подготовки автономный инсталлятор не требует подключения к интернету. Отключить сеть придется владельцам версий Windows 10 Home, у которых нет редактора групповой политики и соответственно запрета на обновление браузера.

Запускаем установщик обозревателя и дожидаемся окончания его работы.

Закрываем окно приветствия и переходим к дальнейшей настройке, которая позволит заблокировать автоматическое обновление до текущей версии.

Корректировка реестра

Владельцы Windows 10 Pro настроившие редактор групповой политики могут пропустить этот шаг, переходя сразу к следующему.

Открываем диалоговое окно «Выполнить». Набираем в текстовом поле «regedit». Нажимаем клавишу ввода или кнопку «ОК» показанную на скриншоте, запуская редактор реестра.

Разворачиваем ветку HKLM, открывая раздел SOFTWARE. Переходим к папке Policies и выделив ее вызываем контекстное меню. Раскрываем пункт «Создать». Выбираем в выпадающем списке «Раздел». Полученной таким образом папке задаем имя «Google».

Повторяем операцию для только что появившегося нового раздела. Создаем в нем вложенную папку с именем «Update». Выделив ее, переходим в правую часть окна редактора реестра. Вызывав контекстное меню, создаем четыре параметра типа DWORD (32 бита).

Последовательно присваиваем им следующие имена и значения:

  1. AutoUpdateCheckPeriodMinutes, 0;

  2. DisableAutoUpdateChecksCheckboxValue, 1;

  3. Install{8A69D345-D564-463C-AFF1-A69D9E530F96}, 0;

  4. Update{8A69D345-D564-463C-AFF1-A69D9E530F96}, 0.

В итоге, содержимое раздела «HKLM\SOFTWARE\Policies\Google\Update» должно иметь вид, показанный на следующем скриншоте.

Отключение службы обновления Google

Окончательно запретим любые попытки Chrome связаться с серверами Google, чтобы гарантировать использование только той версии, которая была установлена.

Вызвав диалоговое окно «Выполнить» вводим в текстовом поле «services.msc». Нажимаем «ОК» запуская раздел консоли MMC предназначенный для управления службами локального компьютера.

Находим в списке два рядом расположенных сервиса Google Update. Выделяем их последовательно мышкой и двойным щелчком запускаем панель свойств.

Для каждой службы в указанном стрелкой поле «Тип запуска» открываем выпадающее меню. Выставляем значение «Отключено». Нажимаем «Применить» записывая сделанные изменения и «ОК», чтобы закрыть окно свойств. Завершив эту операцию, можно снова подключать компьютер к интернету.

Активация NPAPI

Действия, выполненные в предыдущих разделах, лишили Chrome возможности связываться с серверами обновлений Google. Отойдя налить кофе можно быть спокойным, что за это время не будет установлена последняя версия обозревателя. Осталось только включить поддержу плагинов NPAPI.

Открываем браузер и вводим в адресной строке «chrome://flags». По мере набора символов ниже выводится подсказка и можно выбрать подсвеченный зеленым цветом вариант, переведя на него курсор. Нажатием клавиши ввода открываем страницу экспериментальных возможностей Chrome.

Ищем в общем списке пункт «Enable NPAPI». Все неактивные возможности имеют светло-серый фон, чтобы можно было их визуально отличать от уже включенных. Нажимаем на гиперссылку под названием пункта.

Подтверждения выполняемой операции от пользователя не требуется. Признаком включения поддержки плагинов NPAPI является замена в выбранном пункте серого фона на белый.

Вводим в адресную строку команду «chrome://plugins». Нажимаем клавишу ввода открывая страницу с установленными расширениями. Кликаем мышкой по крестику в правом углу окна обозревателя, рядом с надписью «Details».

В текущей вкладке развернется детализированная информация. На скриншоте видно, что работающий в Chrome плагин Java имеет тип NPAPI.

В заключение

Наши эксперты еще раз напоминают о причине отказа разработчиков от технологий Netscape.

Уязвимость, позволяющая плагинам взаимодействовать напрямую с контентом на веб-станицах, позволяет внедрять вредоносное содержимое непосредственно в код браузера.

В результате необходимость работать с устаревшим программным обеспечением, использующим архитектуру NPAPI, делает пользователя похожим на человека, гуляющего под дождем с ситом вместо зонтика.

Источник: https://expertology.ru/aktivatsiya-plaginov-npapi-v-brauzere-google-chrome/

Поделиться:
Нет комментариев

    Добавить комментарий

    Ваш e-mail не будет опубликован. Все поля обязательны для заполнения.