Перейти к содержанию

Публикация плагина: пакет, подпись, каналы распространения, новая версия

Редакция 2026-11-02. Путь разработчика плагина Dune HD от готового кода до установки у пользователя на прошивках r24 и r25: что собрать, нужна ли подпись, какими каналами доставить, как выпустить новую версию и почему установка или обновление не срабатывают. Источники и их вес:

  • наблюдения на tv188b 261021_0117_r25 (device, тестовые плагины kb_probe*) — самое сильное, но одна прошивка;
  • код tv188b 260827_0003_r24 (code: строки libduneshell.so, PHP встроенных плагинов) и tv188b 261021_0117_r25 (code: PHP dunestore);
  • код APK DMC 260724_0207_r24 (code, класс android-atv): листингов .so tv188b по этой теме нет, поэтому на tv188b этот код не переносится;
  • пакеты и дескрипторы обновлений сторонних плагинов (code, прошивка исполнения в большинстве не установлена);
  • SDK (doc): факт только из SDK помечен «по SDK, на r24+ не подтверждено»;
  • сообщения форумов (forum) помечены «по сообщениям пользователей».

Каждое фактическое предложение ссылается на claim id.

Рядом: формат пакета, установка и каталоги — «Пакет плагина»; механика онлайн-обновления — «Онлайн-обновление плагина»; приёмы сборки и обновления в плагинах — «Приёмы разработки плагинов Dune HD» и §12 там же; сводка по прошивкам — «Матрица совместимости возможностей плагина».

Коротко: вопрос → ответ

Вопрос Ответ Где
Что выпускать? для первой установки ZIP с dune_plugin.xml в корне (SDK)1, для онлайн-обновления .tar.gz с тем же содержимым (SDK)2 §2.1
Нужна ли подпись на r24/r25? на tv188b r25 (device, два зонда) ZIP без dune_plugin.sign и dune_plugin_signer_id.txt установился штатно и зарегистрирован (устройство r25)3; общая политика и механизм подписи этим не установлены; в строках r24 есть отказы неподписанным (код r24)4, а срабатывают ли они — §6; по коду tv188b r25 populate_plugins проверяет подпись только при strict_verify_needed в <params> манифеста (код r25)5, а в режиме signed проверка отдельная (код r25)6 §2.2
Ставить ли в свой манифест strict_verify_needed? без подписи — не ставить: на tv188b r25 (device, запрос 13, один прогон) зонд с этим флагом и без dune_plugin_signer_id.txt не зарегистрирован (устройство r25)7, а зонд без флага с испорченным dune_plugin.sign зарегистрирован и работал (устройство r25)8 §2.2, §2.13
Чем подписывать? по SDK, на r24+ не подтверждено: DSA-ключ 2048 и plugin_sign.x86, публичный ключ — в кастомной прошивке (SDK)9; по коду r25 ключ com.dune-hd встроен в libduneshell.so, а другой signer ID принимается, только если равен customer ID, с ключом plugin_key.pem (код r25)10 §2.3
Что проверяет прошивка? по SDK, на r24+ не подтверждено: подпись и допустимость signer ID (SDK)11; строки r24: [plugin_signer], DSA, plugin_key.pem (код r24)12; код r25: dune_plugin_signer_id.txt (код r25)13, список допустимых signer ID (код r25)14, dune_plugin.sign (код r25)15, SHA-дайджест файлов каталога (код r25)16 и DSA (код r25)10 §2.2, §3.3
Как кастомная прошивка ограничивает плагины? по SDK, на r24+ не подтверждено: external_plugins_enabled, allowed_plugin_signer_ids и plugin_config.xml (SDK)17; код r25 читает первые два: signed — 1, none — 2, иначе 0 (код r25)18, none пропускает загрузку из /flashdata/plugins и /tmp/mnt/D/dune_plugins (код r25)19, signed — отдельная проверка с .bad_signature (код r25)6, список signer ID — в ro_config+0x1f0 (код r25)20; что искали на tv188b r25 — §2.2 (устройство r25)21 §2.2, §2.3, §3.3
Как поставить с накопителя? r25, device: запуск ZIP в файловом браузере плеера (устройство r25)22 §2.5
Как поставить по ссылке? из плагина — launch_media_url с plugin_installer://… (код r25)23; на tv188b r25 (device) форма schema=zip сработала по IP Control (устройство r25)24 §2.6
Как попасть в Dune Store? формат элемента и источники известны из кода r25 (код r25)25; порядок приёма в каталог — §6; по SDK, на r24+ не подтверждено: кастомную конфигурацию Dune Store включают файлом dsconfig.xml в кастомной прошивке (SDK)26 §2.7, §3.5
Как выпустить новую версию? поднять version_index, выложить пакет и обновить дескриптор по check_update/url (SDK)27 §2.9, §2.10
Когда пользователь получит обновление? r25, device: при запуске точки входа (SDK)28, в том числе по IP Control (устройство r25)29, не раньше срока из next_check_update_timeout (устройство r25)30 §2.12, «Онлайн-обновление плагина»
Годится ли adb push для пользователей? на r25 install при нём не выполняется (устройство r25)31, а сам он идёт под adb root (устройство r25)32 §2.8

1. Как плагин доходит до пользователя

Публикация связывает три вещи: пакет с кодом, канал доставки и дескриптор, по которому оболочка узнаёт о новой версии. Первая установка и обновление идут разными путями, но заканчиваются в одном месте.

Первая установка — это пакет, который запускает пользователь (SDK)1 или другой плагин (код r25)23. На tv188b r25 (device) штатный установщик распаковывает архив во временный каталог и копирует его в /flashdata/plugins/<p>, удалив прежний (устройство r25)33. Фактически плагин лежит в /data/data/com.dunehd.app/flashdata/plugins/<p> (устройство r25)22. Затем оболочка регистрирует плагин в том же процессе, без перезапуска приложения (устройство r25)34.

Проверку обновления запускает сама оболочка при запуске точки входа (SDK)28, а доступным обновление считается по version_index в дескрипторе на сервере (код APK r24, schema 1) (код r24)35. На r25 (device) пакет скачивается по url из update_info и ставится через временный каталог /tmp/plugin_tmp (устройство r25)36. Поэтому check_update нужно закладывать уже в первый выпуск: без url проверка отключается (код r24)37, и установленная копия не получит следующие версии.

Подпись — отдельный слой поверх пакета, два дополнительных файла в нём (SDK)38. Плагин идентифицируют name и version_index: на r25 name обязан совпасть с именем каталога (устройство r25)39, а версия новее только при большем version_index (код APK r24, schema 1) (код r24)35.

2. Задачи

2.1. Собрать установочный ZIP и пакет обновления .tar.gz

Выпуск плагина для r24/r25 — это обычно два архива одного каталога (SDK)40. Установочный архив — ZIP с dune_plugin.xml на верхнем уровне (SDK)1, файл называют dune_plugin*.zip (SDK)41. Пакет обновления — .tar.gz с тем же содержимым; в update_info указывают его md5 и size — место после установки (du -sk × 1024) (SDK)2. На tv188b r24 установщик скачивает пакет как tgz или zip и сверяет md5 (код r24)42. Состав каталога — «Пакет плагина».

Права файлов в двух архивах на r25 (device) ведут себя по-разному (устройство r25)43. При установке ZIP на r25 (device) файл в bin/ с правами -rw-r--r-- получил -rwxr-xr-x, а файлы в корне остались -rw-r--r-- (устройство r25)44. В запросе 11 на tv188b r25 штатная установка изменила mode файлов bin/ga.sh и www/cgi-bin/ping.sh с 644 в ZIP на 755 в каталоге плагина (устройство r25)45. При обновлении из tgz на r25 (device) файлы оказались с -rw-r--r--, как в архиве (устройство r25)46. Становятся ли исполняемыми файлы bin/ из tgz, — вопрос §6.

Каталоги .platform.* тоже обрабатывает установщик на r25 (device) (устройство r25)47. На r25 (device) он применил к корню .platform.android, затем .platform.android-arm-api19, а все каталоги .platform.* удалил до копирования (устройство r25)47. Подробности и расхождение с текстом SDK — «Пакет плагина».

Перед выпуском проверьте три поля манифеста. На r25 name должен совпасть с именем каталога, иначе плагин не регистрируется (устройство r25)48. На r25 точка входа без icon_url в разделе «Приложения» не появляется (устройство r25)49. По SDK version_index растёт с каждой версией и в интерфейсе не показывается, а version — подпись для интерфейса (SDK)27.

Приёмы сборки (права в архиве, воспроизводимый ZIP, подстановка версии) — «Приёмы разработки плагинов Dune HD».

2.2. Нужна ли подпись на r24 и r25

На tv188b r25 штатный установщик принял ZIP без файлов подписи в двух зондах и зарегистрировал оба плагина, но это наблюдения на одной прошивке, а не общая политика. На tv188b 261021_0117_r25 (device) dune_plugin_kb_probe5_plat.zip без dune_plugin.sign и dune_plugin_signer_id.txt установлен штатно в /flashdata/plugins/kb_probe5_plat (путь из лога) и зарегистрирован как Plugin 'kb_probe5_plat' of type 'plain' (устройство r25)50. Гипотезы о политике и их условия собраны в §6.

Второй зонд проверил и то, что идёт после установки (tv188b r25, device, запрос 11, один прогон). Штатный установщик принял dune_plugin_kb_probe11z.zip без этих двух файлов и зарегистрировал kb_probe11z как php (устройство r25)51. Оболочка выполнила install как sh bin/ga.sh install, а маркер ga_install.txt записал event=install и uid=1000(system) (устройство r25)52. ENTER пультом на «KB11 zip» в «Приложения» → DUNE HD вызвал handle_user_input с control_id=enter и диалог зонда (устройство r25)53. В сохранённом фрагменте shell.log этой установки есть [plugin_installer], регистрация и install, но нет сообщений [plugin_signer] и DSA-проверки зонда (устройство r25)54. Отсутствие строк во фрагменте лога не означает, что проверки не было, а политику signed и механизм подписи этот прогон не испытывал (§6).

Подпись на r25 видна с двух сторон: по файлам и по логу. На tv188b r25 (device) поиск dune_plugin.sign в flashdata/plugins и firmware_ext/plugins нашёл ровно 10 файлов: dune-hd.tv, dunemdb_supplier_youtube, smotreshka.tv, dunemdb_supplier_online_movies, dunestore, dunemdb_supplier_generic, android_apps, ktv_start, widget, shell_ext (устройство r25)55. Screenshoter и widget_ext, которые на r25 проверяются на обновление (устройство r25)56, в этом перечне не названы (устройство r25)55. В shell.log r25 строка «[plugin_signer] DSA verification for signer_id com.dune-hd: OK» записана для dune-hd.tv из /flashdata/plugins (устройство r25)57 и для shell_ext из /firmware_ext/plugins (устройство r25)58. Почему именно эти два, объяснение есть для dune-hd.tv: в его dune_plugin.xml на плеере есть strict_verify_needed (устройство r25)59, а populate_plugins r25 вызывает plugin_signer только при этом флаге (код r25)60; у shell_ext этой строки нет, хотя DSA-проверка в логе есть (устройство r25)61. Разбор кода — ниже в этом разделе, расхождение — §5.

На r24 наблюдение косвенное: речь о загрузке, а не об установке. На tv188b 260827_0003_r24 (device) поиск по /system, /vendor и /data/data/com.dunehd.app не нашёл plugin_config.xml (устройство r24)62. В /tmp/run/installed_plugins.xml там загружены плагины, для которых поиск не нашёл dune_plugin_signer_id.txt, в том числе melange, play_in_apps, Filmix_api, Screenshoter, VPN и test_php-cgi; наличие dune_plugin.sign у них не проверялось (устройство r24)63. Поэтому «без signer ID» здесь не значит «без подписи».

По SDK, на r24+ не подтверждено: запрет неподписанных связан с настройками ro_config (SDK)64. В строках libduneutil.so есть external_plugins_enabled, signed и allowed_plugin_signer_ids на r25 (код r25)65 и r24 (код r24)66; что они делают, сами строки не показывают; разбор кода r25 — ниже. По SDK, на r24+ не подтверждено: external_plugins_enabled по умолчанию равен all, а незаданный allowed_plugin_signer_ids разрешает все signer ID (SDK)67. В образах tv188b r24 и r25 ro_config.properties начинается с записи check_fw_upgrade_in_wizard = yes (код r22, r24, r25)68. На tv188b r25 (device, запрос 11, один прогон) чтение /config/ro_config.properties и /data/data/com.dunehd.app/config/ro_config.properties вернуло No such file or directory (устройство r25)69, а find по /system, /vendor и /data/data/com.dunehd.app не вывел совпадений для plugin_config.xml (устройство r25)70. Какая политика действует на устройстве, это не показывает (§6). Значения настроек — §3.3.

Код проверки в оболочке r24 виден по строкам. В libduneshell.so r24 есть строки [plugin_signer]: файлы dune_plugin.sign и dune_plugin_signer_id.txt, signer_id com.dune-hd, ключ /firmware/config/plugin_key.pem или /config/plugin_key.pem, DSA-проверка (код r24)12. Там же есть сообщения установщика о запретах, включая «install not allowed for unsigned plugin» и «unsigned plugins not allowed» (код r24)4. Загрузчик имеет строки strict_verify_needed и «signature verification failed for '%s', but required» (код r24)71. Строки доказывают наличие кода, но не то, что ветка срабатывает. Параметр params/strict_verify_needed = yes задан в манифесте Dune HD TV (код)72.

Проверка подписи при загрузке на r25 (код tv188b 261021_0117_r25). На r25 код загрузчика в libduneshell.so разобран, и он показывает, когда подпись проверяет populate_plugins. populate_plugins вызывает plugin_signer, только если в свойствах плагина истинно strict_verify_needed; при ложном значении плагин регистрируется без проверки (код r25)60. Эти свойства — содержимое <params> манифеста dune_plugin.xml, а без флага его значение по умолчанию ложно (код r25)73. Если при флаге plugin_signer вернул отказ, загрузчик пишет «signature verification failed for '%s', but required» и не регистрирует плагин (код r25)74. Флаг стоит в <params> манифеста Dune HD TV версии 240718_1541 (код)75 и в установленном на tv188b r25 dune-hd.tv (устройство r25)59.

Сам plugin_signer r25 идёт по шагам, и у каждого отказа своё сообщение и результат 0 (код r25)76 (перечень — §3.3). Сначала он читает dune_plugin_signer_id.txt; без файла — «the required signer_id is missing» (код r25)13. Затем сверяет signer ID со списком допустимых: из поля ro_config+0x1f0, а при пустом поле — com.dune-hd или com.dune-hd,<customer ID> (код r25)14; поле заполняется из allowed_plugin_signer_ids (код r25)20. Дальше читает dune_plugin.sign (до 256 байт) (код r25)15, считает SHA-дайджест файлов каталога (код r25)16 и проверяет DSA-подпись ключом signer ID (код r25)10.

Вторая сторона — политика прошивки в ro_config. ro_config_load_if_needed сохраняет external_plugins_enabled в ro_config+0x1ec: signed (без учёта регистра) — 1, none — 2, отсутствующее или любое другое значение — 0 (код r25)18. В функции загрузки FUN_00215ed4 каталоги /flashdata/plugins и /tmp/mnt/D/dune_plugins передаются в populate_plugins со вторым аргументом 0, а /fconfig/plugins, /firmware/plugins и /firmware_ext/plugins — с 1 (код r25)77. При none эта функция пропускает вызовы для первых двух каталогов и продолжает для трёх других (код r25)19. В режиме signed отдельная функция вызывает plugin_signer, а при отказе пытается создать <каталог>/.bad_signature и пишет «[plugin] %s: marked as bad» (код r25)6; в режиме 0 она возвращает успех без вызова plugin_signer (код r25)78. Где эта функция вызывается — §6. Файл .bad_signature загрузчик проверяет только в ветке /flashdata/plugins и /tmp/mnt/D/dune_plugins: плагин с ним пропускается с сообщением «bad_signature flag is set» (код r25)79. Ещё один отказ — «plugin %s is not permitted» от функции-фильтра; в той же ветке каталог плагина после него удаляется (код r25)80, а адрес фильтра ставит отдельная функция (код r25)81. Условия фильтра — §6.

Запрос 13: что показало устройство (tv188b r25, device, один прогон). Два сторонних зонда с одинаково испорченным dune_plugin.sign повели себя по-разному (устройство r25)82. kb_probe13v со strict_verify_needed=yes в <params> не зарегистрирован: plugin_signer остановился на «the required signer_id is missing», загрузчик написал «signature verification failed for 'kb_probe13v', but required», в installed_plugins.xml зонда нет (устройство r25)7. Проверка остановилась до сверки подписи, поэтому отказ именно из-за испорченного dune_plugin.sign этот прогон не показал (устройство r25)7. kb_probe13n без флага зарегистрирован без строк plugin_signer, и его точка входа вызвала handle_user_input (устройство r25)8. Для стороннего плагина без подписи вывод практический: strict_verify_needed в <params> не ставить — с флагом plugin_signer требует dune_plugin.sign (код r25)15, а при его отказе плагин не регистрируется (код r25)74; в запросе 13 зонд с флагом и без signer ID не зарегистрирован (устройство r25)7. Тот же прогон не нашёл строки strict_verify_needed в dune_plugin.xml встроенных плагинов firmware_ext/plugins, включая shell_ext, хотя DSA-проверка shell_ext в логе есть (устройство r25)61; каким путём проверяется shell_ext, не установлено (§5, §6).

SDK описывает политику так (по SDK, на r24+ не подтверждено). Плагины, встроенные в розничную прошивку и доступные в ней через Dune Store, подписаны Dune HD (SDK)38. Подписанный плагин система проверяет и отказывается использовать при несовпадении подписи или недопустимом signer ID (SDK)11; на r25 populate_plugins без strict_verify_needed подпись не проверяет (устройство r25, код r25)83 — расхождение в §5. Разрешать только подписанные плагины могут быть настроены кастомные (операторские) прошивки (SDK)84.

В образе подписаны 6 из 13 встроенных плагинов tv188b r24 (код r24)85. Подпись есть и в разобранных пакетах Online services (код)86, Megogo (код)87, Okko (код)88, Dune HD TV (код)89.

Подпись и содержимое пакета связаны: по SDK плагин с несовпадающей подписью система не использует (SDK)11, поэтому правка файлов подписанного пакета — отдельный риск. По коду r25 дайджест подписи охватывает все обычные файлы каталога плагина рекурсивно, имена в каждом каталоге сортируются, кроме dune_plugin.sign на верхнем уровне и каталога icons у shell_ext (код r25)16. При загрузке на r25 отказ plugin_signer при strict_verify_needed ведёт к отказу в регистрации (код r25)74, без флага populate_plugins подпись не проверяет (код r25)60, а режим signed — выше в этом разделе.

2.3. Подписать плагин своим ключом: кастомная прошивка

Раздел до последнего абзаца — по SDK, на r24+ не подтверждено; что подтверждает код r25 — в последнем абзаце. Значение signer ID com.dune-hd зарезервировано за Dune HD, второе допустимое значение — customer ID кастомной прошивки (с 150326_r10) (SDK)90. Собственная подпись делается DSA-ключами 2048 через openssl и утилитой plugin_sign.x86 <dir> <signer_id> <key>, а публичный ключ кладётся в прошивку как /firmware/config/plugin_key.pem (SDK)9.

Публичный ключ кладётся в прошивку, а signer ID равен customer ID кастомной прошивки, поэтому этот маршрут описан для кастомных прошивок (SDK)91. Получить подпись com.dune-hd для стороннего плагина — вопрос §6.

Какие плагины разрешены, прошивка задаёт параметрами ro_config или файлом plugin_config.xml, и вместе их применять не рекомендуется (SDK)92; значения — §3.3. Чтобы запретить установку и запуск произвольных сторонних плагинов, раздел «Secure firmware» рекомендует external_plugins_enabled = signed (SDK)64. Сторонний плагин для кастомного каталога dunestore тогда подписывают собственным ключом, а прошивку настраивают разрешать этот ключ (SDK)93. Подписью Dune HD такой плагин не получить: та же страница говорит, что сторонние приложения кастомного каталога не будут подписаны, потому что подписывать сейчас могут только приложения, выпускаемые и поддерживаемые Dune HD (SDK)94. Это два разных случая — подпись Dune HD и свой ключ на своей прошивке, а не противоречие; claims связаны related.

На r24 путь к ключу подтверждается только строками (код r24)12; роль второго пути и приоритет на r24 — §6. На r25 их показывает код plugin_signer: подпись com.dune-hd проверяется ключом, встроенным в libduneshell.so, другой signer ID принимается, только если равен get_customer_id(), и тогда ключ берётся из /config/plugin_key.pem, а без него — из /firmware/config/plugin_key.pem; иначе — «unsupported signer_id» или «plugin_key.pem not found» (код r25)10. Если allowed_plugin_signer_ids задан, signer ID должен быть в этом списке (код r25)95. Это та же схема «com.dune-hd или customer ID с ключом в прошивке», что в SDK (SDK)91. В режиме external_plugins_enabled = signed код r25 проверяет подпись отдельной функцией (код r25)6; что этот режим делает на устройстве — вопрос §6. Проверку при загрузке включает и флаг strict_verify_needed в <params> самого плагина (код r25)60 (§2.2).

2.4. Выбрать канал распространения

Каналы делятся на четыре группы и дополняют друг друга: файл нужен для первой установки вручную, ссылка plugin_installer:// — чтобы поставить плагин из другого плагина, каталог dunestore — чтобы плагин находили на самом устройстве, а check_update — чтобы установленная копия получала новые версии (код r25, SDK)96. Полная таблица — §3.2.

В разобранных пакетах встречаются облачная ссылка в посте форума (код)97, GitHub Release (код)98, общий хост dune-club.info (код)99 и Dune Store (код)100. Как устроены эти варианты в конкретных плагинах — §4.

2.5. Как ставит пользователь: файл на носителе

На tv188b r25 (device) dune_plugin_kb_probe5_plat.zip, запущенный в файловом браузере плеера из /sdcard/DuneHD, был установлен; рядом появились каталоги plugins_archive, plugins_data и /tmp/plugins/<p> (устройство r25)22. Перезапускать приложение не понадобилось (устройство r25)34.

Что видит пользователь, показал запрос 11 на tv188b r25 (device, по одному прогону на архив). После ENTER на dune_plugin_kb_probe5.zip в файловом браузере установщик сразу показал диалог «Установка приложения» с текстом «KB probe 5: установлено успешно.» и кнопками «Запустить» и «Закрыть»; вопроса перед установкой не было (устройство r25)101. С dune_plugin_kb_probe11z.zip было то же окно с текстом «KB probe 11z: установлено успешно.», вопроса перед установкой тоже не было (устройство r25)102. Инструкцию для пользователя стоит писать с учётом этого окна после установки.

SDK называет любой носитель, например USB-флешку (SDK)41. По SDK, на r24+ не подтверждено: для ручной установки обычно нужно активированное «Flash memory storage» или «System storage», иначе устройство предложит его активировать (SDK)103; при совпадении имени с установленным вручную плагином система предложит перезаписать или отменить, а встроенные перезаписать нельзя (SDK)104. По сообщениям пользователей (Dune HD TV-175L SmartBox 4K), Screenshoter ставится выбором ZIP в файловом браузере с флешки, а архив 7z не подходит (форум)105.

Инструкцию для пользователя стоит писать с этими оговорками: наблюдение на r25 относится к запуску из /sdcard/DuneHD (устройство r25)22, запуск с USB — вопрос §6.

Имя архива в инструкции лучше брать в форме dune_plugin*.zip, которую называет SDK (SDK)41. В запросе 11 на tv188b r25 (device) после ENTER на kb11_other.zip в файловом браузере изменений на экране и диалога не было видно, а проверка установки показала отсутствие каталога kb_probe11z; архив был копией dune_plugin_kb_probe11z.zip (устройство r25)106, который штатный установщик принял (устройство r25)51. В том же запросе браузер показал kb11_other.zip со значком «?» (неизвестный тип), а лежащие рядом dune_plugin_*.zip — со значком файла (устройство r25)107. Это наблюдение одного имени: причина и правило не установлены (§6).

2.6. Поставить плагин из другого плагина: plugin_installer://

Встроенный dunestore r25 запускает установку действием launch_media_url с URL plugin_installer://… (код r25)108. В коде r25 так работает ensure_tv_app_installed: для неустановленного плагина — plugin_installer://<update_url>:::schema=2&name=<plugin>&need_confirm_replace=0&close_on_success=1 с необязательным signer_id, для установленного при force_check_update — plugin_installer://<name>:::schema=update (код r25)23. YouTube указывает и прямой пакет .tar.gz (код)109. Разбор URL в коде APK r24 и schema=update без подтверждения — «Онлайн-обновление плагина». Ключи — §3.4.

На устройстве установщик проверен без кода плагина, по IP Control (tv188b r25, device, запрос 11, один прогон). Команда launch_media_url с plugin_installer://<HTTP-URL>:::schema=zip&name=kb_probe11z&need_confirm_replace=0&close_on_success=1 заменила уже установленный kb_probe11z и зарегистрировала его как php (устройство r25)24. После этого оболочка выполнила install, а ga_install.txt дополнился событием install (устройство r25)110. Когда после завершения установки проверили экран, диалога не было: остался раздел «Приложения», ничего не спрашивалось; краткое окно хода установки до проверки этим не исключено (устройство r25)111. Это наблюдение формы schema=zip на r25 (устройство r25)24: оно дополняет общий синтаксис URL и ветвь прямого ZIP-пакета из кода r24 (код r24)112, но r24 не проверялся. Формы schema=2, schema=update и ключ signer_id из кода выше этот прогон не посылал, а вызовов dunestore (код r25)108 не выполнял; они и запуск из действия плагина или с сайта — вопросы §6.

2.7. Попасть в каталог dunestore (Dune Store и community)

dunestore — встроенный PHP-плагин с точкой входа в root://applications (код r25)113, и на r25 он читает несколько источников каталога. Его модель задаёт стандартный каталог http://online.dune-hd.com/dune_store/v1/catalog.xml и community-каталог http://dune-club.info/plugins/update/community_catalog.xml (код r25)114. Источники можно переопределить в /config/dsconfig.xml, иначе /firmware/config/dsconfig.xml; без файла используются standard_source и community_source, а source задаёт свой catalog_url, signer_id и community=yes (код r25)115.

Каталоги различаются условиями. Плагин стандартного источника (signer_id com.dune-hd) попадает в список, только если его имя перечислено в категории plugins этого каталога и он не скрыт по типу устройства (код r25)116. Для community-плагина кнопка установки сначала показывает диалог подтверждения (код r25)117; в режиме расширений community-каталог игнорируется целиком, если community выключен (код r25)118.

Чтобы плагин был виден на нужных устройствах, в элементе каталога задают условия: expr либо apk, strict_country, country, language, product, а затем всегда проверяется firmware_features (код r25)119. В режиме расширений при наличии /config/dunestore_ext_devel каталог заменяется на dev_catalog.xml, community — на dev_community_catalog.xml (код r25)120.

Установку из карточки dunestore строит сам: при update_url — plugin_installer со schema 1 или 2, иначе с download_url и space_needed, добавляя need_confirm_replace=0 и signer_id, если он задан (код r25)117. Как получить место в стандартном или community-каталоге — вопрос §6. По сообщениям пользователей (Real Vision 4K, R21), Screenshoter есть в Dune Store и после установки обновляется автоматически (форум)121.

Страница SDK о Dune Store добавляет к этому требования к записи (этот абзац и следующий — по SDK, на r24+ не подтверждено; при расхождении см. §5). Каталог скачивается при запуске Dune Store пользователем (SDK)122, а обновления идут механизмом плагинов: Dune Store предполагает, что все его плагины настроены на онлайн-обновление (SDK)123. Запись должна совпадать с манифестом: name (SDK)124, caption (SDK)125, version_index и version (SDK)126; остальные поля — §3.5. Категорию задаёт catalog.xml, а раздел главного меню — parent_media_url в dune_plugin.xml (SDK)127. Список разделов определяет не каталог, а /firmware/config/menu_config.xml (SDK)128, и новая категория его не меняет (SDK)129.

Свой каталог описан для кастомной прошивки: она включает dsconfig.xml (SDK)26; если точка входа ссылается на раздел, которого нет в её конфигурации, после установки точка не будет видна и доступна (SDK)130. В примере SDK свой сервер хранит только урезанный каталог, а иконки, пакеты и спецификации обновлений остаются на стандартном (SDK)131. Полный клон стандартного сервера не поддерживается и не рекомендуется без договорённости с Dune HD (SDK)132. Параметры dsconfig.xml — §3.5.

2.8. Ставить при разработке: adb push и чем он отличается от установки

adb push удобен для отладки, но это другой путь, и результаты на нём отличаются от того, что получит пользователь. На tv188b r25 (device) каталог копируется под adb root в /data/data/com.dunehd.app/flashdata/plugins/, затем нужны chown -R system:system, chmod -R +x для bin и www/cgi-bin и am force-stop com.dunehd.app (устройство r25)32.

Два отличия важны перед выпуском: install при таком размещении не выполняется (устройство r25)31, и update не выполняется при смене version_index на месте (устройство r25)133. Поэтому код этих обработчиков проверяют реальной установкой ZIP и реальным обновлением: при штатной установке dune_plugin_kb_probe11z.zip на tv188b r25 install выполнился (device, запрос 11, §2.2) (устройство r25)52. Другие подробности — «Пакет плагина».

Механизм dune_plugins на накопителе SDK описывает для разработки (SDK)134, но на Android накопители монтируются с noexec, что ему мешает (SDK)135 (по SDK, на r24+ не подтверждено).

2.9. Выпустить новую версию: update_info.xml (schema 2)

SDK рекомендует schema = 2, а схему 1 называет устаревшей (по SDK, на r24+ не подтверждено) (SDK)136. На r25 (device) проверяются обе: лог показывает плагины как [schema1] и [schema2] (устройство r25)56. Порядок выпуска:

  1. В dune_plugin.xml новой версии поднимите version_index и обновите version (SDK)27.
  2. Соберите .tar.gz с тем же содержимым, что у ZIP, посчитайте md5 и size (SDK)2.
  3. Добавьте plugin_version_descriptor с version_index, version, beta, critical, url, md5, size, caption (код)137; корень — dune_plugin_update_info с schema и name (код)138. Значение name должно совпасть с именем плагина (код r24)139. Подробнее о полях — «Онлайн-обновление плагина».
  4. Старые дескрипторы можно оставить: из прошедших условия берётся наибольший version_index (код APK r24) (код r24)140. В снятых файлах их 6–20 на плагин, и часть номеров пропущена (код)141.
  5. Положите пакет и файл на сервер по URL из check_update манифеста (SDK)27. На r25 (device) запрос приходит GET-ом с дописанным ?dune_auth=… и заголовками User-Agent, X-Dune-Interface-Language, X-Dune-Serial-Number (устройство r25)142, так что сервер должен принимать такой URL.

beta по SDK зарезервирован и игнорируется (по SDK, на r24+ не подтверждено) (SDK)143. Дескриптор можно ограничить функциями прошивки через required_firmware_features и require: по коду APK r24 дескриптор без нужной функции не проходит (код r24)140. Так версию адресуют прошивкам с нужной функцией: у GlobalTV условие стоит на 16 дескрипторах из 20 (код)144.

Новая версия приезжает на место старой с сохранением данных: на r25 (device) cookies и data_dir_path пережили два обновления (устройство r25)145. Плагин получает confirm_update (устройство r25)146, going_to_update (устройство r25)36 и update, а install при обновлении не вызывается (устройство r25)147. Поэтому код миграции данных вешают на update, а не только на install. Порядок событий — «Онлайн-обновление плагина».

Откатить выпуск дескриптором с меньшим номером не получится: обновление доступно, только если version_index больше установленного (код APK r24, schema 1) (код r24)35, а в schema 2 «newer» — тоже больше установленного (код r24)140. Старый код выпускают под новым номером.

2.10. Выпустить новую версию: update.txt (schema 1)

Этот формат встречается в собранных дескрипторах чаще: из 29 снятых с серверов 23 — update.txt, 6 — update_info.xml (код)148. Все 23 — ровно пять строк ключ=значение: version_index, version, download_url, space_needed, last_critical_version_index (код)149. Полей md5 и size среди них нет (код)149.

Код APK r24 требует version_index не меньше 1, download_url на http или https и space_needed больше 0 (код r24)150. Обновление критическое, если last_critical_version_index ≥ 1 и установленный version_index меньше него (код r24)35.

В last_critical_version_index пишите целое число. У 9 из 41 дескриптора там стоит строка версии вроде «1.0.0» (код)151, а код APK r24 для «1.0.0» вернёт 1 (код r24)152. Окончания CRLF и LF для разбора равнозначны (код APK r24) (код r24)153. Подробно о формате — «Онлайн-обновление плагина».

2.11. Сделать обновление обязательным

Обязательность складывается из двух механизмов. По SDK, на r24+ не подтверждено: при critical = yes, timeout = 0 и required = yes старую версию не дадут запустить, если на сервере есть обновление (SDK)154. Код APK r24 ведёт себя так: при ошибке проверки и required=yes (кроме schema 3) запуск запрещается (код r24)155; отказ от критического обновления или его неудачная установка запрещают запуск, отказ от некритического запуску не мешает (код r24)156.

Значит, на коде APK r24 required=yes связывает запуск плагина с успехом проверки: её сбой запрещает запуск (код r24)155. В практике это редкость: required yes задан у двух манифестов из 43 (код)157, а critical равен no во всех 73 снятых дескрипторах schema 2 (код)158.

Обновить без вопроса пользователю можно через dont_ask_confirmations=yes: на r25 (device) диалога нет, установка идёт сразу, но confirm_update всё равно вызывается (устройство r25)159. Значение берётся из манифеста установленной версии (устройство r25)159.

2.12. Проверить выпуск на устройстве r25

Проверять нужно цепочку целиком, потому что adb push её не запускает (§2.8). Поставьте старую версию из ZIP, выложите новую и запустите точку входа: на r25 (device) запуск по IP Control тоже вызывает проверку (launch_media_url plugin_launcher://{name=…}{ep_media_url=…}) (устройство r25)29.

Если запроса к серверу нет, первым проверьте срок. Он хранится в /tmp/plugin_updater_<name>.txt (устройство r25)160, а до срока в shell.log пишется «remote check skipped by timeout» и запроса нет (устройство r25)161. Диалог и его вид — «Онлайн-обновление плагина».

Итог проверки виден в логах r25: установка — строки цепочки (устройство r25)36, фоновая автопроверка — отдельный лог /tmp/run/plugin_online_upgrade.log (устройство r25)162, а итог по плагину schema 2 — «N candidates», «N matches (0 newer)», «have_better_version = no» (устройство r25)163. На экране сообщений о ходе и завершении установки нет (устройство r25)164.

2.13. Почему плагин не ставится или не обновляется

Таблица идёт от симптома к причине. Строки r24 — это сообщения из libduneshell.so; условие, при котором они появляются, там не всегда установлено.

Симптом Причина Что сделать Claim
Плагин не зарегистрирован, в shell.log «invalid plugin manifest … is not equal to directory name» (r25, device) name не равен имени каталога привести name и каталог к одному значению (устройство r25)48
Установлен, но в «Приложениях» нет (r25, device) у точки входа нет icon_url; launch_capable в installed_plugins.xml равен 0 добавить icon_url (устройство r25)165
Ошибка о манифесте (строки r24) dune_plugin.xml не найден или не разбирается проверить, что файл в корне архива (код r24, SDK)166
«declared plugin name is '%s', real is '%s'» (строки r24) name в манифесте не совпал с ожидаемым сверить name пакета и установленного плагина (код r24)167
«suitable storage not found; cancelled» (строки r24) не найдено подходящее хранилище; условие не установлено по SDK, на r24+ не подтверждено: активировать Flash memory storage (код r24, SDK)168
«install not allowed for unsigned plugin», «unsigned plugins not allowed» (строки r24) запрет неподписанных; условие — §6 проверить политику прошивки; по SDK, на r24+ не подтверждено: external_plugins_enabled, allow_install (§3.3) (код r24, SDK)169
«replace not allowed for plugin '%s' because of signer_id mismatch» (строки r24) замена плагина с другим signer_id не менять подписанта у выпущенного плагина; по SDK, на r24+ не подтверждено: онлайн-обновление всегда ограничено логикой same_signer_id (код r24, SDK)170
Плагин не зарегистрирован, в shell.log «the required signer_id is missing» и «signature verification failed for '%s', but required» (tv188b r25, device, запрос 13, один прогон) в <params> манифеста strict_verify_needed=yes, а dune_plugin_signer_id.txt нет убрать strict_verify_needed из <params> либо подписать плагин (§2.3) (устройство r25, код r25)171
Плагин из /flashdata/plugins не загружается, в shell.log «bad_signature flag is set» (код r25) в каталоге плагина есть файл .bad_signature; его пытается создать проверка режима signed искать причину отметки (§2.2); снятие отметки на устройстве не проверялось (код r25)172
Каталог плагина в /flashdata/plugins исчез, в shell.log «plugin %s is not permitted» (код r25) имя отверг фильтр прошивки; условия фильтра — §6 проверить политику прошивки (§3.3) (код r25)173
«replace hard-coded plugin '%s' not allowed» (строки r24) замена «hard-coded» плагина дать плагину своё name (код r24)4
Архив не запускается (по сообщениям пользователей) архив 7z вместо ZIP упаковать в ZIP (форум)105
После ENTER на kb11_other.zip в файловом браузере изменений на экране не видно, каталога kb_probe11z нет; в браузере у файла значок «?» (tv188b r25, device, запрос 11) не установлена; так было с копией dune_plugin_kb_probe11z.zip (одно имя, правило не выведено) назвать архив dune_plugin*.zip и повторить (§2.5) (устройство r25, SDK)174
«md5 does not match» (строки r24) md5 в дескрипторе не совпал с пакетом пересчитать md5 после последней сборки (код r24)42
«remote check skipped by timeout» (r25, device) срок следующей проверки не наступил дождаться срока; срок задаёт next_check_update_timeout (устройство r25)175
«0 newer», «have_better_version = no» (r25, device) на сервере нет дескриптора новее поднять version_index (устройство r25)163
Дескриптор не подходит (код APK r24) не выполнено require или required_firmware_features проверить условия дескриптора (код r24)140
Проверка не запускается (код APK r24) schema больше 3 либо нет url при schema 1 или 2 исправить check_update (код r24)176
Плагин перестал запускаться (код APK r24) required=yes и ошибка проверки либо отказ от критического обновления вернуть доступность сервера, пересмотреть required (код r24)177
update или install не вызваны после adb push (r25, device) этот путь их не вызывает проверять настоящей установкой (§2.8) (устройство r25)178
Диалог обновления появляется снова после «Напомнить позже» (r25, device) «Напомнить позже» не сдвигает срок проверки это штатно; при частых показах увеличить next_check_update_timeout (устройство r25)179
Копия из flashdata заменена встроенной (r25, device) в логе «prefer_new_builtin (41 vs 34)»; version_index копии в firmware_ext больше не использовать имя встроенного плагина (устройство r25)180

2.14. Удалить плагин

Штатно плагин удаляют URL plugin_uninstaller://<имя>: так делает dunestore через ActionFactory::launch_media_url, без собственного удаления каталогов в PHP (код r25)181, и GlobalTV при установке в стране CN (код)182. Карточка установленного плагина в dunestore всегда показывает кнопку «Удалить» справа (код r25)117.

На устройстве этот URL проверен по IP Control (tv188b r25, device, запрос 11, один прогон, зонд kb_probe11z). plugin_uninstaller://kb_probe11z вызвал uninstall через sh bin/ga.sh uninstall, и оболочка записала «uninstall action finished with status 0» (устройство r25)183. После этого ls показал No such file or directory для каталогов plugins/kb_probe11z, plugins_data/kb_probe11z, plugins_archive/kb_probe11z и /tmp/plugins/kb_probe11z; перед удалением эти каталоги существовали (устройство r25)184. На экране после удаления диалога не было, ничего не спрашивалось; краткое окно хода удаления до проверки экрана этим не исключено (устройство r25)185. Цепочку удаления dunestore прогон не выполнял, удаление cookies не проверено (§6).

По SDK, на r24+ не подтверждено: вручную установленные плагины удаляются в «Setup / Misc / Plugins» (ENTER → Delete) (SDK)186. Среди системных событий плагина SDK называет uninstall (SDK)187. Widget Ext вызывает в нём bin/uninstall.sh синхронно (код)188. По коду APK r24 каталоги данных и cookies при замене пакета не удаляются, их удаление есть только в ветке флага 0 (код r24)189; что происходит с cookies при штатном удалении — §6.

3. Справочник

3.1. Что требуется от пакета на r24 и r25

«Обязательно» здесь значит: без этого на указанной прошивке наблюдался отказ или этого прямо требует источник.

Требование Статус Где наблюдалось Claim
dune_plugin.xml в корне ZIP обязательно SDK; строки об отсутствующем манифесте на r24 (код r24, SDK)190
name равен имени каталога обязательно r25, device; для r24 — §6 (устройство r25)39
PHP-программа с hd_create_plugin() по SDK обязательно для PHP-плагина; зонды kb_probe5 и kb_probe10 без hd_create_plugin(), с наследником DunePluginFw, работали (§5) SDK; без функции — tv188b r25, device (устройство r25, SDK)191
params/program у типа plain не обязательно r25, device (устройство r25)192
icon_url у точки входа в root://applications нужно, чтобы пункт был виден r25, device (устройство r25)49
version_index нужен для обновлений, больше установленного код APK r24 (код r24)193
check_update/url без него проверка отключается код APK r24 (код r24)37
Имя файла dune_plugin*.zip так называет SDK; после ENTER на kb11_other.zip каталога kb_probe11z нет (одно имя, §2.5); обязательность — §6 SDK; так назван зонд на tv188b r25; kb11_other.zip — tv188b r25, device (устройство r25, SDK)194
dune_plugin.sign, dune_plugin_signer_id.txt два зонда без них установлены и зарегистрированы; по коду r25 populate_plugins проверяет их только при strict_verify_needed в <params>, режим signed — отдельная проверка; зонд с испорченным dune_plugin.sign без флага зарегистрирован, с флагом и без dune_plugin_signer_id.txt — нет; общая политика не установлена — §2.2, §6 tv188b r25, device (четыре зонда); код r25; SDK; строки r24 (устройство r25, код, SDK)195

3.2. Каналы распространения

Канал Как устроен Что нужно от автора Где работает Claim
ZIP на носителе запуск файла в файловом браузере ZIP, инструкция r25, device: /sdcard/DuneHD; USB — по SDK (устройство r25, SDK)196
Вложение или ссылка на форуме пользователь скачивает ZIP сам хостинг файла разобранные пакеты; по сообщениям пользователей (код, форум)197
GitHub Release ZIP на каждый тег workflow сборки код ProIPTV (код)98
plugin_installer:// из плагина launch_media_url URL пакета или дескриптора код r25, сторонние пакеты; tv188b r25, device: schema=zip по IP Control, не из плагина (§2.6) (устройство r25, код)198
dunestore, стандартный каталог элемент в catalog.xml запись в каталоге (порядок — §6) код r25 (код r25)199
dunestore, community элемент в community_catalog.xml, диалог при установке запись в каталоге (порядок — §6) код r25 (код r25)200
dunestore, свой источник source в dsconfig.xml файл на устройстве; по SDK его включает кастомная прошивка, другие пути — §6 код r25; SDK (код r25, SDK)201
check_update при запуске оболочка опрашивает дескриптор сервер с дескриптором и пакетом r25, device (устройство r25)29
check_update/auto в фоне фоновая автопроверка auto = yes в манифесте код APK r24; процесс на r25, device (устройство r25, код r24)202
adb push копирование каталога под adb root только для разработки (§2.8) r25, device (устройство r25)32

3.3. Файлы и строки подписи (r24, r25)

Первая таблица — строки libduneshell.so tv188b 260827_0003_r24, а не наблюдаемое поведение; вторая — код libduneshell.so и libduneutil.so tv188b 261021_0117_r25 с условием каждого сообщения; третья — настройки по SDK.

Имя Назначение Где Claim
dune_plugin.sign файл подписи корень плагина (SDK r24)203
dune_plugin_signer_id.txt signer ID; у встроенного shell_ext — com.dune-hd без перевода строки корень плагина (код r24)204
/firmware/config/plugin_key.pem, /config/plugin_key.pem строки ключа в блоке [plugin_signer] оболочка (код r24)12
/config/plugin_config.xml, /firmware/config/plugin_config.xml parse_plugin_config(), имена allow_install, signed и др. оболочка (код r24)205
strict_verify_needed строка загрузчика и параметр манифеста Dune HD TV оболочка, манифест (код)206
«install not allowed for unsigned plugin», «unsigned plugins not allowed», «signer_id '%s' not allowed by firmware», «signature verification failed» сообщения установщика о запрете оболочка (код r24)4
%s/.bad_signature, «bad_signature flag is set» путь-шаблон и сообщение загрузчика оболочка (код r24)207
«plugin %s is not permitted», «marked as bad» сообщения загрузчика оболочка (код r24)208

Код tv188b r25 (code; на устройстве наблюдались только строки с пометкой device). Каталоги «ветки 0» — /flashdata/plugins и /tmp/mnt/D/dune_plugins (код r25)77.

Сообщение или поле Когда Итог Claim
strict_verify_needed в <params> читается из свойств манифеста, умолчание — ложь при истине populate_plugins вызывает plugin_signer, иначе регистрирует без проверки (код r25)5
«[populate_plugins] ERROR: signature verification failed for '%s', but required» plugin_signer вернул 0 при strict_verify_needed плагин не регистрируется; device, запрос 13, один прогон (устройство r25, код r25)209
«[plugin_signer] %s: the required signer_id is missing» нет dune_plugin_signer_id.txt отказ; device, запрос 13, один прогон (устройство r25, код r25)210
«invalid signer_id: requied(%s) != actual(%s)» задан требуемый signer ID и не совпал; populate_plugins его не задаёт отказ (код r25)13
«[plugin_signer] %s: signer_id '%s' not allowed» signer ID не в списке ro_config+0x1f0 (allowed_plugin_signer_ids), при пустом — не com.dune-hd и не com.dune-hd,<customer ID> отказ (код r25)95
«the required signature not found for plugin '%s'», «invalid signature file for plugin '%s'» нет dune_plugin.sign; размер файла не равен прочитанному (читается до 256 байт) отказ (код r25)15
дайджест SHA по обычным файлам каталога рекурсивно, имена в каждом каталоге сортируются; без dune_plugin.sign на верхнем уровне и icons у shell_ext — (код r25)16
«unsupported signer_id», «plugin_key.pem not found», «DSA verification for signer_id %s: OK|failed» com.dune-hd — встроенный ключ; customer ID — /config/plugin_key.pem, иначе /firmware/config/plugin_key.pem; другой signer ID — отказ итог проверки; «OK» для dune-hd.tv и shell_ext — device (устройство r25, код r25)211
external_plugins_enabled → ro_config+0x1ec signed без учёта регистра — 1, none — 2, нет или другое — 0 — (код r25)18
allowed_plugin_signer_ids → ro_config+0x1f0 разборщик ro_config_load_if_needed список для «not allowed» выше (код r25)20
none (+0x1ec = 2) загрузка каталогов каталоги ветки 0 пропускаются, /fconfig/plugins, /firmware/plugins, /firmware_ext/plugins загружаются (код r25)19
«[plugin] %s: marked as bad» режим signed, plugin_signer вернул 0 (функция FUN_00215e08) попытка создать <каталог>/.bad_signature, результат 0; при режиме 0 — 1 без проверки, при none — сразу 0 (код r25)212
«[populate_plugins] %s: bad_signature flag is set» ветка 0, в каталоге есть файл .bad_signature плагин пропускается без загрузки (код r25)213
«plugin %s is not permitted» фильтр по адресу из 0x00ee9e68 вернул ненулевое для имени в ветке 0 каталог плагина удаляется, иначе пропуск (код r25)173

Настройки кастомной прошивки ниже описаны в SDK (всё по SDK, на r24+ не подтверждено; разбор external_plugins_enabled и allowed_plugin_signer_ids кодом r25 — в таблице выше; применение на устройстве — §6; что искали на tv188b r25 — §2.2). Имена полей plugin_config.xml в SDK те же, что в строках libduneshell.so r24 (код r24, SDK)214. В синтаксисе и примере SDK есть опечатки: закрывающий </plugin_name> и <plugin name="MyPlugin""> (SDK)215.

Имя Назначение Значения С какой прошивки Claim
external_plugins_enabled (ro_config.properties) какие сторонние плагины разрешены all (умолчание) — все; signed — только подписанные Dune HD, signer_id в allowed_plugin_signer_ids, если список задан; none — только включённые в прошивку, без обновлений, включая онлайн-обновление 130803_b8+ (SDK)216
allowed_plugin_signer_ids (ro_config.properties) допустимые signer ID список через запятую; не задан (умолчание) — разрешены все 130803_b8+ (SDK)217
plugins_installation_enabled (ro_config.properties) делает то же, что plugin_config.xml, но менее гибко; как и external_plugins_enabled в разобранной части SDK не описаны не указано (SDK)92
/firmware/config/plugin_config.xml ограничивает установку, замену и удаление отдельных плагинов корень plugin_config, раздел plugins с default_external, default_embedded и записями plugin name="..." 150113_b9+ (SDK)218
default_embedded, default_external, plugin name="..." умолчания для встроенных и внешних; запись плагина перекрывает часть умолчаний по умолчанию разрешено всё; embedded — входит в прошивку, например /firmware_ext/plugins/<plugin_name>, и остаётся им после замены или обновления, остальные — external не указано (SDK)219
install, replace, update термины файла install — развёртывание нового; replace — любое изменение существующего, кроме update; update — онлайн-обновление не указано (SDK)220
allow_install, allow_delete установка новых внешних плагинов; удаление плагина allow_install: yes, signed (только подписанных), no; allow_delete: yes, no не указано (SDK)221
allow_replace замена; на онлайн-обновление не влияет, оно всегда ограничено логикой same_signer_id yes, no, same_signer_id: прежний подписан — новый с тем же signer ID; прежний не подписан — новый любой не указано (SDK)222

3.4. Ключи URL plugin_installer://

Форма URL из встроенных PHP-плагинов r24 — plugin_installer://<адрес>:::<ключ>=<значение>&… (код r24)223; расхождение с более ранней гипотезой о формате — §5. На tv188b r25 (device, запрос 11, один прогон) эта форма сработала с schema=zip, name, need_confirm_replace=0 и close_on_success=1 (устройство r25)24; действие каждого ключа по отдельности не проверялось, остальные значения schema на устройстве тоже, r24 не проверялся.

Ключ Значения и смысл Где Claim
schema update — обновить установленный плагин; tgz, zip — прямой пакет; 1 и 2 — дескриптор; иначе «schema %d is not supported» код APK r24; zip — tv188b r25, device (устройство r25, код r24)224
name имя плагина; для schema 1 обязателен код APK r24 (код r24)225
caption, title ключи в URL встроенных плагинов; caption dunestore ставит вне ТВ-режима PHP r24, r25 (код)226
need_confirm_replace dunestore и ensure_tv_app_installed передают 0 PHP r25 (код r25)227
close_on_success dunestore и ensure_tv_app_installed передают 1 PHP r25 (код r25)227
signer_id добавляется, если задан PHP r25 (код r25)117
space_needed в URL с download_url PHP r25, YouTube (код)228
ignore_existing параметр установщика (ключ ли это URL, не установлено); при ≠ 0 и schema 2 отключает сравнение с установленной версией код APK r24 (код r24)225

Выбор schema в dunestore: адрес на .txt или с «.txt?» — 1, иначе 2; без update_url — download_url без schema (код r24)229.

3.5. Элемент плагина в каталоге dunestore (r25)

Элемент plugins/plugin задаёт name, version_index, version, caption, icon_path, icon_fit_scale_factor, badge_icon_url, poster_path, archive_path, update_url, space_needed, short_description, long_description, interface_language, language, country, preferred_language, suggested/language+country, required_plugins, always_install, target_plugin, target_app, target_update_url, strict_country, apk, expr, auto_apply_expr, product, firmware_features (код r25)230. Категории каталога описаны отдельно (код r25)231. Кэш — на срок до 604800 с с запросом по If-Modified-Since (код r25)232.

Зависимости из required_plugins ставятся перед самим плагином через plugin_installer:// (код r25)108.

Смысл полей описывает страница SDK (всё ниже — по SDK, на r24+ не подтверждено; расхождения с кодом r25 — §5). Каталог — XML с иерархией catalog/categories/category, catalog/plugins/plugin и catalog/skins/skin (SDK)233; приложение принадлежит ровно одной категории (SDK)234. Совпадение name, caption, version_index, version с манифестом — §2.7.

Поле plugin Смысл и требования по SDK Claim
archive_path относительно download_url_prefix, .tar.gz, содержимое как у dune_plugin*.zip, манифест с check_update (SDK)235
space_needed байты после установки во flash-память: du -sk × 1024 (SDK)236
language фильтр по Interface language, any — все (SDK)237
country, strict_country страны показа по GeoIP, any — все; strict_country — строже (SDK)238
product продукты Dune HD или платформы 8644, 8654, 8670, 8672, 8674 (SDK)239
short_description, long_description, icon_path, badge_icon_url, poster_path, interface_language оформление карточки и списка (SDK)240

dsconfig.xml поддерживается с прошивок 130716_b6+ (SDK)241; по умолчанию список источников содержит только стандартный (SDK)242.

Параметр dsconfig.xml Что задаёт Claim
sources: standard_source, source у source — catalog_url, download_url_prefix, icon_url_prefix; без префиксов они выводятся из catalog_url; при описании одного ресурса в нескольких источниках используется первый (SDK)243
enabled_plugins, disabled_plugins имена через запятую: показать только перечисленные или скрыть их (SDK)244
enabled_plugins_url, disabled_plugins_url HTTP-URL такого списка, скачивается при каждом входе; не скачался — список плагинов пуст, поэтому нужен надёжный сервер; из четырёх параметров списка действует один (SDK)245

3.6. Старые прошивки и Sigma

Справка без подробностей. По SDK собственная подпись и customer ID есть с 150326_r10 (SDK)91, фоновая автопроверка — с 150430_r10 (SDK)246. Платформенные файлы для SMP87xx лежат в .platform.87xx/, основная копия — для SMP86xx (SDK)247. По сообщениям пользователей, в Dune 301 (150721_0136_B9) предустановленные плагины лежат в firmware_ext и удаляются только модификацией прошивки (форум)248.

4. Как это делают плагины

4.1. Релиз по тегу и свой сервер обновлений: ProIPTV

ProIPTV разделяет два выхода сборки. Workflow на каждый тег N.N.N публикует dune_plugin_proiptv.<тег>.zip как GitHub Release (код)98, а build/make_update.php упаковывает update_proiptv.tar.gz и заполняет в update_proiptv.xml поля version, version_index, md5 и size (код)249. Манифест ссылается на свой хост: schema 2, https, timeout 0, auto false (код)250. Приём снимает ручной пересчёт md5; остальное о сборке — «Приёмы разработки плагинов Dune HD».

4.2. Семейство на общем хосте и update.txt: dune-club.info

Из 23 download_url schema 1 — 18 на dune-club.info (код)251; все 43 адреса обновлений загрузчиков начинаются с http:// (код)252. Пример манифеста: schema 1, http://dune-club.info/plugins/update/Screenshoter/update.txt (код)253. Рядом Screenshoter держит info.txt, который показывает кнопка whats_new (код)254. Сервер с https тоже бывает: у GlobalTV адрес пакета https (код)255.

4.3. Пакет-заготовка, который дозаливается обновлением

Для форумного распространения кладут только манифест, PHP и значок: в 37 из 43 пакетов ровно три файла (код)256. У всех 41 дескриптора version_index выше, чем в манифесте того же плагина, у 39 манифестов он равен 0 (код)257. По сообщениям пользователей, автор liteIPTV пишет, что приложенная версия обновится до актуальной (форум)258. Запустится ли такой пакет без сервера — §6 и «Приёмы разработки плагинов Dune HD».

4.4. Community-плагины с подписью Dune HD: GlobalTV, Online Movies

Подпись и community-метка бывают вместе. GlobalTV содержит dune_plugin.sign и signer ID com.dune-hd (код)259, а его dune_plugin_metadata.xml помечает community_plugin = yes и secure_update = yes (код)260. Online Movies в метаданных несёт community_extension и signed_community (код)261, а подписант в commit.txt — com.dune-hd (код)262. GlobalTV задаёт timeout 86400, auto yes, dont_ask_confirmations yes (код)263. Смысл этих меток для оболочки — §6.

4.5. Плагин ставит зависимость: YouTube, Entware, altIPTV

Плагин может доставить другой плагин сам. Экран настроек YouTube по кнопке installPlug возвращает plugin_installer://…Codec_install.tar.gz с name, space_needed, need_confirm_replace=0 и запускает результат plugin_launcher:// (код)109. На Android он подставляет другой пакет, ffmpeg_install (код)264. Entware проверяет наличие RemTor по installed_plugins.xml и либо предлагает установку, либо открывает плагин (код)265. altIPTV ставит Codec_install тем же путём с refresh (код)266. Запуск и удаление других плагинов — «Приёмы разработки плагинов Dune HD».

5. Расхождения

hd_create_plugin() в PHP-программе. SDK требует от PHP-плагина программу с этой функцией (SDK)267; на tv188b r25 (device) зонды kb_probe5 и kb_probe10 без неё, с классом-наследником DunePluginFw, работали, и handle_user_input выполнялся (устройство r25)268. Claims связаны conflicts_with; подробнее — «Пакет плагина».

Формат URL plugin_installer://. Встроенные PHP-плагины r24 формируют его как <адрес>:::<ключ>=<значение>&… (код r24)223. Вторая сторона — гипотеза по строкам о синтаксисе {ключ=значение} (inference, её claim и суть — в §6). Claims связаны conflicts_with; в этой главе использована форма из кода PHP. На tv188b r25 (device, запрос 11) форма с ::: и schema=zip сработала (устройство r25)24; форму с фигурными скобками этот прогон для установщика не посылал, r24 не проверялся.

Схема обновления. SDK называет schema 1 устаревшей (SDK)136, а в снятых дескрипторах она преобладает: 23 из 29 (код)148; на r25 (device) плагины со схемой 1 проверяются (устройство r25)56. Связи conflicts_with нет.

Развёртывание через adb на Android. SDK приводит adb push в /flashdata/plugins/ (SDK)269, а на r25 каталога /flashdata в корне ФС нет, и плагины лежат в /data/data/com.dunehd.app/flashdata/plugins (устройство r25)270. Claims связаны conflicts_with.

Что перечитывает плагины без перезапуска. Лог r25 расходится с SDK и сам с собой: новый плагин перечитывание по IP Control не подхватило (устройство r25)271, а удалённые после него в одном прогоне остались (устройство r25)272, в другом исчезли (устройство r25)273. Утверждение SDK (disputed) — в §6.

Установка .platform.* и замена встроенного плагина. SDK буквально говорит, что на Android содержимое .platform.android удаляется, а .platform.87xx переносится в корень (SDK)274; на r25 (device) установщик применил .platform.android, затем .platform.android-arm-api19, а все .platform.* удалил (устройство r25)47. Встроенные плагины по SDK перезаписать нельзя (SDK)104, а гипотеза о замене встроенного загрузчиком — в «Пакет плагина». Подробности — «Пакет плагина». Срок проверки разобран в «Онлайн-обновление плагина».

Каталог dunestore: SDK и код r25. Значения type категории: страница SDK допускает только plugins и skins (SDK)275, код r25 знает ещё categories (код r25)231. Поля plugin: SDK перечисляет 16 (SDK)276, код r25 читает больше, например update_url, required_plugins, expr, firmware_features (код r25)230. Обе пары связаны conflicts_with; для r25 в этой главе основа — код. Префикс загрузок: SDK называет http://online.dune-hd.com/dune_store/v1/ (SDK)277, код r25 — http://files3.dune-hd.com/dune_store/v1/ (код r25)114; связи conflicts_with нет (related).

Проверка подписи при загрузке: SDK и r25. По SDK подписанный плагин система проверяет и при несовпадении подписи не использует (SDK)11. populate_plugins tv188b r25 вызывает plugin_signer только при strict_verify_needed в <params> (код r25)60, и в запросе 13 (device, один прогон) сторонний kb_probe13n без флага с испорченным dune_plugin.sign зарегистрирован и работал (устройство r25)8. Первые два claims связаны conflicts_with. Как ведёт себя режим external_plugins_enabled = signed, это расхождение не решает (§6).

Почему проверяется shell_ext. В запросе 13 (tv188b r25, device) у shell_ext строки strict_verify_needed в dune_plugin.xml нет, а DSA-проверка его подписи в shell.log есть (устройство r25)61. Вторая сторона — гипотеза (disputed, её claim — в §6), что DSA-проверку в логе вызывает только этот флаг. Claims связаны conflicts_with; путь вызова plugin_signer для shell_ext не установлен.

Незаданный allowed_plugin_signer_ids. По SDK без этого параметра разрешены все signer ID (SDK)278. В коде r25 при пустом поле списка plugin_signer подставляет com.dune-hd или com.dune-hd,<customer ID> и отвергает остальные signer ID (код r25)14; ключ для проверки у него есть только для этих двух (код r25)10. Связи conflicts_with нет; проявляется ли различие на устройстве — §6.

6. Не проверено

Здесь гипотезы (inference), ослабленные верификатором утверждения (disputed) и вопросы, на которые в базе нет ответа. Опираться на них без проверки нельзя.

Подпись и политика установки.

Claim Суть Что мешает
(вывод r25)279 на tv188b r25 отсутствие файлов подписи не помешало установке и регистрации kb_probe5_plat; это не доказывает, что подпись не проверяется у других плагинов, и не задаёт политику кастомных прошивок inference; лог запроса 11 этот claim не проверил: там другой зонд, kb_probe11z (§2.2). Для загрузки на r25 ответ дали код и запрос 13: подпись проверяется при strict_verify_needed (код r25)60, зонд без флага с испорченной подписью работал (устройство r25)8; политика кастомных прошивок не испытана
(вывод r24)280 на tv188b r24 без plugin_config.xml плагины без dune_plugin_signer_id.txt загружались; «подпись не нужна» верно только для розничной r24 без plugin_config.xml inference; не проверено на других моделях, кастомных прошивках и для dune_plugin.sign
(вывод r25)281 лог r25 показывает DSA-проверку для dune-hd.tv и shell_ext; проверяются ли остальные и почему выбраны эти два, из него не следует inference. Для dune-hd.tv флаг есть на плеере (устройство r25)59, а код связывает проверку с ним (код r25)60; у shell_ext флага нет (устройство r25)61, путь его проверки не найден
(вывод r25)282 DSA-проверка в логе r25 видна у dune-hd.tv и shell_ext, вероятно, потому, что plugin_signer вызывается только при strict_verify_needed=yes inference, disputed (weakened): для dune-hd.tv согласуется, но у shell_ext флага нет, а проверка есть (устройство r25)61 (conflicts_with, §5). Нужен листинг второй ветки populate_plugins для /firmware_ext/plugins
(вывод r25)283 без strict_verify_needed populate_plugins r25 подпись стороннего плагина не проверяет; external_plugins_enabled=signed, если действует, работает через фильтр «not permitted», .bad_signature или установщик — какой механизм, не установлено inference, disputed (unclear): первая часть подтверждена на устройстве (устройство r25)8, режим signed не проверялся. Нужны вызывающая сторона FUN_00215e08 и тело фильтра 0x00690bf0
(вывод r24)284 ro_config_load_if_needed в libduneutil.so r24 читает external_plugins_enabled и allowed_plugin_signer_ids из /config/ro_config.properties или /firmware/config/ro_config.properties и различает signed и none inference: только псевдокод Ghidra, подтверждающего r2-листинга нет; на r25 разбор этих двух параметров подтверждён кодом (код r25)285, на r24 это не переносится
(вывод r24)286 запрет неподписанных — настройка кастомных прошивок; механизм r24 неизвестен. Наблюдения на розничной tv188b r24 — в §2.2 (устройство r24)287 inference, verified; dune_plugin.sign в том прогоне не искали
(вывод r24)288 установщик может отказать неподписанному, при другом signer_id и при замене «hard-coded»; что действует по умолчанию, неизвестно disputed: запреты установщика на устройстве не испытывались
(вывод r24)289 что делает загрузчик с неверной подписью без strict_verify_needed inference; на r24 не проверено. На tv188b r25 по коду без флага подпись не проверяется (код r25)60, в запросе 13 зонд без флага с испорченной подписью работал (устройство r25)8
(вывод r24)290 .bad_signature помечает плагин, и загрузчик его пропускает disputed для r24. Код r25 это показывает для каталогов ветки 0 (§3.3) (код r25)213, а создать файл пытается проверка режима signed (код r25)6; на устройстве не проверялось
(вывод r24)291 plugin_config.xml задаёт политику по имени плагина с умолчаниями disputed: файла нет на устройстве и в четырёх прошивках, а поиск запроса 11 в /system, /vendor и /data/data/com.dunehd.app его тоже не нашёл (устройство r25)70; формат описан в SDK (§3.3), применение на r24+ не проверено
(вывод r24)292 /config/plugin_config.xml дополняет или перекрывает /firmware/config/plugin_config.xml disputed: приоритет не виден
(вывод r24)293 подпись считается по DSA по обычным файлам каталога плагина для r24 порядок файлов и исключение dune_plugin.sign не установлены; для r25 — код (код r25)16
(вывод r24)294 ключ ищется в двух путях plugin_key.pem disputed: для r24 роль /config/plugin_key.pem и приоритет не установлены; на устройстве r24 файла нет. На r25 по коду пути plugin_key.pem нужны только для signer ID, равного customer ID, /config — первым (код r25)10
(вывод r24)295 signer_id сравнивается с требуемым и может быть отклонён для r24 условие не установлено; для r25 — код (код r25)296

Установка и обновление.

Claim Суть Что мешает
(SDK)297 LaunchMediaUrl выбирает установщик и деинсталлятор по URL disputed: запись верификатора подтвердила на r25 только plugin_launcher://. Установщик и деинсталлятор потом наблюдались по IP Control (устройство r25)298, но claim о выборе по плейлисту заново не проверялся
(вывод r24)299 параметры plugin_installer:// — в синтаксисе {ключ=значение} гипотеза по строкам, связана conflicts_with с кодом PHP (§5)
(вывод r24)300 пакет скачивается как __plugin__.zip, распаковывается и копируется в <хранилище>/plugins/<name> вывод из строк r24; на r25 близкая цепочка наблюдалась (устройство r25)33
(вывод r24)301 на r24 name сравнивается с каталогом, этап отказа вероятен в populate_plugins отказ установщика не установлен; на r25 — §2.13
(вывод r24)302 require и required_firmware_features отсеивают дескрипторы по прошивке на tv188b для APK r24 — код, на tv188b не проверено
(вывод)303 заготовки без lib/ без обновления не выполнятся вывод из состава пакета; запуск без сети не проверялся
(SDK)304 перечитать плагины: ANGLE/ROTATE, Refresh или IP Control disputed: на r25 новый плагин не появился (устройство r25)271

В базе нет данных о следующем. Это вопросы, а не утверждения о Дюне.

  • Ставится и запускается ли неподписанный ZIP штатным установщиком на r24, а на r25 — на других моделях и прошивках; на tv188b r25 есть два зонда (§2.2).
  • Что делает на устройстве external_plugins_enabled = signed: код r25 описывает проверку с .bad_signature (§2.2), но откуда она вызывается (установщик, загрузка или оба), в листингах не видно.
  • Что делает загрузчик tv188b r25 с плагином со strict_verify_needed, dune_plugin_signer_id.txt и испорченным dune_plugin.sign: зонд запроса 13 отвергнут раньше, на отсутствии signer ID (устройство r25)7, так что сам DSA-отказ не наблюдался.
  • Каким путём plugin_signer вызывается для shell_ext без strict_verify_needed (§5) и проверяются ли так другие плагины /firmware_ext/plugins.
  • Условия фильтра «plugin %s is not permitted» (функция 0x00690bf0) и связь его с ro_config.
  • Проявляется ли на устройстве расхождение SDK и кода r25 о незаданном allowed_plugin_signer_ids (§5).
  • Какая политика задана на устройстве: /firmware/config/ro_config.properties прогон запроса 11 не читал, а plugin_config.xml вне трёх каталогов его поиска не искал (§2.2).
  • Как получить подпись com.dune-hd и как попасть в стандартный и community-каталог dunestore; порядка приёма стороннего плагина в разобранных страницах SDK нет.
  • Попадает ли dsconfig.xml на устройство пользователя иначе, чем в составе прошивки, и работает ли свой source на практике.
  • Что значат для оболочки community_plugin, community_extension, signed_community, secure_update и читает ли она dune_plugin_metadata.xml.
  • Что signer_id в URL plugin_installer:// меняет при установке.
  • Ставится ли ZIP с USB-накопителя на r24 и r25 и обязательна ли форма имени dune_plugin*.zip: на tv188b r25 проверено одно другое имя, и не установлено, в нём ли причина (§2.5).
  • Становятся ли исполняемыми файлы bin/ и www/cgi-bin/ при установке из tgz.
  • Вызывается ли install при установке ZIP на r24 и на других моделях r25; на tv188b r25 есть один прогон (§2.2).
  • Удаляются ли cookies плагина при штатном удалении на tv188b r25 (§2.14) и что остаётся от plugins_data и cookies на других прошивках.
  • Работают ли на устройстве schema=2 и schema=update и запуск plugin_installer:// из действия плагина или с сайта; по IP Control на tv188b r25 проверена только форма schema=zip (§2.6).

  1. doc-sdk-plugins.c016 · doc · any-documented; прошивка — · Установщик плагина — ZIP-архив с файлом dune_plugin.xml на верхнем уровне и прочими файлами плагина ↩↩↩

  2. doc-sdk-plugins.c111 · doc · any-documented; прошивка — · Пакет обновления — .tar.gz с тем же содержимым, что у установочного dune_plugin*.zip; md5 — сумма .tar.gz; size — место после установки (du -sk × 1024) ↩↩↩

    • fw-tv188b-261021-0117-r25--plugin-loader.c037 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 ZIP dune_plugin_kb_probe5_plat.zip без dune_plugin.sign и dune_plugin_signer_id.txt установлен штатно в /flashdata/plugins/kb_probe5_plat (в логе; фактически /data/data/com.dunehd.app/flashdata/plugins/kb_probe5_plat) и зарегистрирован как Plugin 'kb_probe5_plat' of type 'plain'.
    • fw-tv188b-261021-0117-r25--plugin-loader.c046 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 штатный установщик принял dune_plugin_kb_probe11z.zip без dune_plugin.sign и dune_plugin_signer_id.txt и зарегистрировал kb_probe11z как php.

    ↩

  3. fw-tv188b-260827-0003-r24--plugin-loader.c040 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит сообщения установщика плагинов о запретах: «install not allowed for plugin», «install not allowed for unsigned plugin», «replace hard-coded plugin '%s' not allowed», «replace not allowed for plugin '%s' because of signer_id mismatch», «unsigned plugins not allowed», «signer_id '%s' not allowed by firmware», «signature verification failed» ↩↩↩↩

    • fw-tv188b-261021-0117-r25--plugin-loader.c066 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В populate_plugins (0x00215450) r25 после разбора манифеста plugin_signer (0x002aa204) вызывается только если properties_get_bool(<свойства плагина>, "strict_verify_needed", 0) истинно; при ложном значении плагин регистрируется без вызова plugin_signer.
    • fw-tv188b-261021-0117-r25--plugin-loader.c085 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Свойства, из которых populate_plugins r25 читает strict_verify_needed, поступают из манифеста dune_plugin.xml: FUN_00215304 передаёт прочитанный XML в FUN_0029006c, тот передаёт результат xml_utils_get_child_element_params с именем params восьмым аргументом FUN_0028ff44, который сохраняет его в +0x1c возвращаемого описателя; populate_plugins читает свойства из того же +0x1c.

    ↩↩

  4. fw-tv188b-261021-0117-r25--plugin-loader.c082 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В режиме external_plugins_enabled=signed FUN_00215e08 r25 вызывает plugin_signer (0x002aa204) для переданных имени и каталога плагина с третьим аргументом 0; при результате 0 пытается создать <каталог>/.bad_signature, пишет «[plugin] %s: marked as bad» и возвращает 0. ↩↩↩↩↩

  5. fw-tv188b-261021-0117-r25--plugin-loader.c086 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 (один прогон) сторонний kb_probe13v с yes в params и испорченным dune_plugin.sign не зарегистрирован: plugin_signer остановился на «the required signer_id is missing», populate_plugins — «signature verification failed for 'kb_probe13v', but required»; в installed_plugins.xml его нет. ↩↩↩↩↩

  6. fw-tv188b-261021-0117-r25--plugin-loader.c087 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 (один прогон) сторонний kb_probe13n с тем же испорченным dune_plugin.sign, но без strict_verify_needed, зарегистрирован без строк plugin_signer, есть в installed_plugins.xml, и его точка входа KB13N dlg вызвала handle_user_input(dlg). ↩↩↩↩↩↩

  7. doc-sdk-plugins.c119 · doc · any-documented; прошивка — · Собственная подпись (150326_r10+): DSA-ключи 2048 через openssl, подпись утилитой plugin_sign.x86

    , публичный ключ кладётся в прошивку как /firmware/config/plugin_key.pem ↩↩

  8. fw-tv188b-261021-0117-r25--plugin-loader.c075 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · plugin_signer r25 проверяет подпись signer_id «com.dune-hd» встроенным в libduneshell.so ключом (dsa_sign_verify_dsa_signature с константами DAT_00e8e8c8…); другой signer_id принимается, только если равен get_customer_id(), и тогда ключ берётся из /config/plugin_key.pem, а без него — из /firmware/config/plugin_key.pem; иначе «unsupported signer_id» или «plugin_key.pem not found» и 0. Итог пишется «DSA verification for signer_id %s: OK|failed». ↩↩↩↩↩↩

  9. doc-sdk-plugins.c117 · doc · any-documented; прошивка — · Для подписанного плагина система проверяет подпись и отказывается его использовать при несовпадении подписи или недопустимом signer ID ↩↩↩↩

  10. fw-tv188b-260827-0003-r24--plugin-loader.c050 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит строки [plugin_signer]: файлы dune_plugin.sign и dune_plugin_signer_id.txt, signer_id com.dune-hd, ключ /firmware/config/plugin_key.pem или /config/plugin_key.pem, DSA-проверку ↩↩↩↩

  11. fw-tv188b-261021-0117-r25--plugin-loader.c070 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · plugin_signer (0x002aa204) r25 читает signer_id из файла dune_plugin_signer_id.txt в каталоге плагина (FUN_002aa164); если его нет — «[plugin_signer] %s: the required signer_id is missing» и результат 0; если третий аргумент задан и не равен signer_id — «invalid signer_id: requied(%s) != actual(%s)» и 0 (populate_plugins передаёт 0, т. е. без требуемого signer_id). ↩↩↩

  12. fw-tv188b-261021-0117-r25--plugin-loader.c071 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · plugin_signer r25 проверяет signer_id по списку через запятую (FUN_002a9f64); список берётся из поля ro_config по смещению 0x1f0, а если оно пусто — «com.dune-hd» или «com.dune-hd,»; signer_id не из списка — «[plugin_signer] %s: signer_id '%s' not allowed» и 0. ↩↩↩

  13. fw-tv188b-261021-0117-r25--plugin-loader.c073 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · plugin_signer r25 открывает <каталог>/dune_plugin.sign; нет файла — «the required signature not found for plugin '%s'» и 0; файл читается до 256 байт, и если его размер (ftell после fseek в конец) не равен прочитанному — «invalid signature file for plugin '%s'» и 0. ↩↩↩↩

  14. fw-tv188b-261021-0117-r25--plugin-loader.c074 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Дайджест подписи в plugin_signer r25 (FUN_002a9ab4) — SHA по содержимому всех обычных файлов каталога плагина рекурсивно, имена в каждом каталоге сортируются qsort; на верхнем уровне пропускаются dune_plugin.sign и, у плагина shell_ext, каталог icons; не-обычные файлы пропускаются с WARNING. ↩↩↩↩↩

    • doc-sdk-dune-custom-firmware.c001 · doc · any-documented; прошивка — · Параметр external_plugins_enabled в /firmware/config/ro_config.properties задаёт, какие сторонние плагины разрешены; умолчание — all, доступен с прошивок 130803_b8+.
    • doc-sdk-dune-custom-firmware.c004 · doc · any-documented; прошивка — · allowed_plugin_signer_ids задаёт разделённый запятыми список допустимых signer ID; если параметр не задан, разрешены все signer ID; умолчание — не задан, доступен с прошивок 130803_b8+.
    • doc-sdk-dune-custom-firmware.c006 · doc · any-documented; прошивка — · Файл /firmware/config/plugin_config.xml позволяет ограничить действия с отдельными плагинами — указать, какие нельзя устанавливать, заменять или удалять; доступен с прошивок 150113_b9+.

    ↩

  15. fw-tv188b-261021-0117-r25--plugin-loader.c079 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ro_config_load_if_needed r25 сохраняет external_plugins_enabled в ro_config+0x1ec: signed (без учёта регистра) — 1, none — 2, отсутствующее или любое другое значение — 0. ↩↩↩

  16. fw-tv188b-261021-0117-r25--plugin-loader.c081 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · При external_plugins_enabled=none (ro_config+0x1ec == 2) FUN_00215ed4 r25 пропускает вызовы populate_plugins для /flashdata/plugins и /tmp/mnt/D/dune_plugins, но продолжает вызовы для /fconfig/plugins, /firmware/plugins и /firmware_ext/plugins. ↩↩↩

  17. fw-tv188b-261021-0117-r25--plugin-loader.c072 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Поле ro_config по смещению 0x1f0, из которого plugin_signer r25 берёт список допустимых signer_id, заполняется разборщиком ro_config_load_if_needed из свойства allowed_plugin_signer_ids. ↩↩↩

    • fw-tv188b-261021-0117-r25--plugin-loader.c049 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 чтение /config/ro_config.properties и /data/data/com.dunehd.app/config/ro_config.properties вернуло No such file or directory для обоих путей.
    • fw-tv188b-261021-0117-r25--plugin-loader.c050 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 команда find /system /vendor /data/data/com.dunehd.app -name plugin_config.xml не вывела совпадений между метками начала и конца поиска.

    ↩

  18. fw-tv188b-261021-0117-r25.c219 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 dune_plugin_kb_probe5_plat.zip, запущенный в файловом браузере плеера из /sdcard/DuneHD, установлен в /data/data/com.dunehd.app/flashdata/plugins/kb_probe5_plat; после установки есть также каталоги /data/data/com.dunehd.app/flashdata/plugins_archive/kb_probe5_plat, …/flashdata/plugins_data/kb_probe5_plat и /tmp/plugins/kb_probe5_plat. ↩↩↩↩

  19. fw-tv188b-261021-0117-r25--shell-ext--search-tv.c026 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ensure_tv_app_installed r25 для type=plugin: если плагин уже установлен и force_check_update — запускает plugin_installer://:::schema=update (при need_launch с launch после), иначе если не установлен — требует update_url и запускает plugin_installer://:::schema=2&name=&need_confirm_replace=0&close_on_success=1 с необязательным signer_id (при need_launch с launch после). ↩↩↩

  20. fw-tv188b-261021-0117-r25--plugin-loader.c053 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 IP Control launch_media_url с plugin_installer://HTTP-URL:::schema=zip&name=kb_probe11z&need_confirm_replace=0&close_on_success=1 заменил уже установленный kb_probe11z и зарегистрировал его как php. ↩↩↩↩↩

    • fw-tv188b-261021-0117-r25--builtin-plugins-misc.c031 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Элемент plugins/plugin каталога задаёт name, version_index, version, caption, icon_path, icon_fit_scale_factor (по умолчанию 0.9), badge_icon_url, poster_path, archive_path, update_url, space_needed, short_description, long_description, interface_language, language, country, preferred_language, suggested/language+country, required_plugins, always_install, target_plugin, target_app, target_update_url, strict_country, apk, expr, auto_apply_expr, product, firmware_features; skins/skin — name, caption, icon_path, archive_path, space_needed, short_description.
    • fw-tv188b-261021-0117-r25--builtin-plugins-misc.c028 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В обычном режиме источники каталога dunestore: /config/dsconfig.xml, иначе /firmware/config/dsconfig.xml; без файла, при ошибке разбора или без элемента sources используются standard_source и community_source. В sources допустимы standard_source, community_source и source (обязателен непустой catalog_url с «/»; signer_id; icon_url_prefix и download_url_prefix по умолчанию — каталог catalog_url; community=yes); неизвестный элемент и source без непустого catalog_url, содержащего «/», пропускаются.

    ↩

  21. doc-sdk-dune-store.c048 · doc · any-documented; прошивка — · Чтобы применить кастомную конфигурацию Dune Store, прошивка должна включать файл dsconfig.xml (описание — в документе Custom firmware images). ↩↩

  22. doc-sdk-plugins.c105 · doc · any-documented; прошивка — · Онлайн-обновление: в манифесте задаются version_index (число, растёт с каждой версией, в UI не показывается), version (подпись для UI) и check_update (schema, url, timeout, required, auto) ↩↩↩↩

  23. doc-sdk-plugins.c106 · doc · any-documented; прошивка — · Проверка обновления выполняется при запуске любой точки входа плагина; найденное обновление предлагается пользователю, после установки запускается исходная точка входа ↩↩

  24. fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c078 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 запуск точки входа плагина по IP Control (launch_media_url plugin_launcher://{name=…}{ep_media_url=…}) вызывает проверку обновления check_update schema 2: оболочка грузит update info из check_update/url с тайм-аутом 1 («loading update info with timeout 1»), тогда как фоновая автопроверка — с тайм-аутом 5. ↩↩↩

  25. fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c080 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после удалённой проверки обновления на запуске (schema 2) /tmp/plugin_updater_.txt содержит время проверки + next_check_update_timeout из update_info.xml (20), а не + check_update/timeout манифеста (3600): проверка в 1793207761 записала 1793207781, проверка в 1793207784 — 1793207804. ↩

  26. fw-tv188b-261021-0117-r25.c082 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 global_action install не выполняется, если плагин положен в $FS_PREFIX/flashdata/plugins через adb push и приложение перезапущено: маркеров install от kb_probe5 и kb_probe6_sup нет, тогда как boot, boot_end и gui_start kb_probe5 выполнились. ↩↩

  27. fw-tv188b-261021-0117-r25.c206 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 плагин разворачивается без установщика: каталог копируется adb push (под adb root) в /data/data/com.dunehd.app/flashdata/plugins/, затем chown -R system:system и chmod -R +x для bin и www/cgi-bin; после перезапуска приложения (am force-stop com.dunehd.app) оболочка регистрирует такой плагин («Plugin '

    ' of type '' is registered»). ↩↩↩

  28. fw-tv188b-261021-0117-r25.c217 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 штатный установщик ZIP перед распаковкой выполняет rm -rf '/tmp/plugin_tmp' и mkdir, затем распаковывает архив командой «unzip '' -d /data/data/com.dunehd.app/tmp/plugin_tmp» и копирует оттуда каталог в /flashdata/plugins/

    , предварительно удаляя прежний (FS_remove_recursively_if_exists). ↩↩

  29. fw-tv188b-261021-0117-r25.c218 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после штатной установки ZIP оболочка пишет «[plugin_installer] reloading plugin», регистрирует плагин («Plugin 'kb_probe5_plat' of type 'plain' is registered») и «[plugin_installer] Done.» в том же процессе приложения (pid 19586), без перезапуска приложения. ↩↩

  30. fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c059 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 разбор schema 1 (fcn.002c5968) считает обновление доступным, только если version_index из update.txt больше установленного (иначе результат «нет обновления», download_url и space_needed не проверяются); обновление критическое, если last_critical_version_index ≥ 1 и установленный version_index меньше него ↩↩↩↩

  31. fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c087 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 установка обновления после «Обновить» идёт так: «loading tgz-archive» (пакет по url из update info), распаковка «tar -x -z -C /tmp/plugin_tmp», глобальное действие going_to_update у установленной старой версии (в её php_server), остановка этого php_server, удаление /flashdata/plugins/ и /tmp/plugins/, копирование /tmp/plugin_tmp в /flashdata/plugins/ (cp_r) и перерегистрация плагина («reloading plugin»). ↩↩↩

  32. fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c045 · code · tv188b, android-atv; прошивка 260724_0207_r24 · В APK r24 check_update/url читается только для schema 1 и 2 (при schema 0 и 3 — нет); для schema 1–2 без url или с пустым url проверка отключается сообщением «invalid or missing 'check_update/check_update_url'» ↩↩

  33. doc-sdk-plugins.c115 · doc · any-documented; прошивка — · Встроенные в розничную прошивку и распространяемые через Dune Store плагины подписаны Dune HD; подписанный плагин содержит dune_plugin.sign и dune_plugin_signer_id.txt ↩↩

  34. fw-tv188b-261021-0117-r25.c210 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 плагин, у которого name в dune_plugin.xml (kb_probe5_other) не равен имени каталога (kb_probe5_badname), не регистрируется: строки «Plugin … is registered» для него нет, в /tmp/run/installed_plugins.xml и /tmp/www/plugins его нет ни под тем, ни под другим именем. ↩↩

    • doc-sdk-plugins.c016 · doc · any-documented; прошивка — · Установщик плагина — ZIP-архив с файлом dune_plugin.xml на верхнем уровне и прочими файлами плагина
    • doc-sdk-plugins.c111 · doc · any-documented; прошивка — · Пакет обновления — .tar.gz с тем же содержимым, что у установочного dune_plugin*.zip; md5 — сумма .tar.gz; size — место после установки (du -sk × 1024)

    ↩

  35. doc-sdk-plugins.c017 · doc · any-documented; прошивка — · Плагин устанавливается запуском файла dune_plugin*.zip с любого носителя (например, USB-флешки) и ставится во флеш-память устройства ↩↩↩

  36. fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c034 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Пакет обновления скачивается установщиком как «%s-archive» (tgz или zip), md5 сверяется («md5 does not match», expected/actual); zip распаковывается командой unzip plugin.zip во временном каталоге ↩↩

    • fw-tv188b-261021-0117-r25.c216 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после штатной установки ZIP файл bin/marker.txt, который в ZIP имел права -rw-r--r--, получил -rwxr-xr-x, а dune_plugin.xml и only_android.txt в корне плагина остались -rw-r--r--.
    • fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c089 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 файлы плагина, установленные онлайн-обновлением из tgz, — владелец system, -rw-r--r--, метка u:object_r:system_app_data_file:s0; в архиве у них тоже -rw-r--r--, а файлы v1, положенные adb push, были -rw-rw-rw-.

    ↩

  37. fw-tv188b-261021-0117-r25.c216 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после штатной установки ZIP файл bin/marker.txt, который в ZIP имел права -rw-r--r--, получил -rwxr-xr-x, а dune_plugin.xml и only_android.txt в корне плагина остались -rw-r--r--. ↩

  38. fw-tv188b-261021-0117-r25--plugin-loader.c052 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 штатная установка kb_probe11z изменила mode файлов bin/ga.sh и www/cgi-bin/ping.sh с 644 в ZIP на 755 в каталоге плагина. ↩

  39. fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c089 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 файлы плагина, установленные онлайн-обновлением из tgz, — владелец system, -rw-r--r--, метка u:object_r:system_app_data_file:s0; в архиве у них тоже -rw-r--r--, а файлы v1, положенные adb push, были -rw-rw-rw-. ↩

    • fw-tv188b-261021-0117-r25.c214 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 штатный установщик ZIP применил к корню плагина сначала .platform.android (скопировал only_android.txt и bin/marker.txt в корень), затем поверх — .platform.android-arm-api19 (bin/marker.txt перезаписан); в установленном плагине bin/marker.txt = «.platform.android-arm-api19» и есть only_android.txt. В shell.log — «[plugin_installer] applying /tmp/plugin_tmp/.platform.».
    • fw-tv188b-261021-0117-r25.c215 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 штатный установщик ZIP не применил .platform.87xx и .platform.foo и удалил все четыре каталога .platform.* (android-arm-api19, 87xx, android, foo: «[plugin_installer] removing /tmp/plugin_tmp/.platform.») до копирования; в установленном плагине нет ни каталогов .platform.*, ни only_87xx.txt.

    ↩↩↩

    • fw-tv188b-261021-0117-r25.c209 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25, если name в dune_plugin.xml не равен имени каталога плагина, оболочка при загрузке пишет в shell.log «[populate_plugins] invalid plugin manifest from '<путь>/dune_plugin.xml': name '' is not equal to directory name '<каталог>'».
    • fw-tv188b-261021-0117-r25.c210 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 плагин, у которого name в dune_plugin.xml (kb_probe5_other) не равен имени каталога (kb_probe5_badname), не регистрируется: строки «Plugin … is registered» для него нет, в /tmp/run/installed_plugins.xml и /tmp/www/plugins его нет ни под тем, ни под другим именем.

    ↩↩

  40. fw-tv188b-261021-0117-r25.c213 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 точки входа плагина kb_probe5 (root://applications), заданные без icon_url, в разделе «Приложения» не появлялись. ↩↩

  41. fw-tv188b-261021-0117-r25--plugin-loader.c037 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 ZIP dune_plugin_kb_probe5_plat.zip без dune_plugin.sign и dune_plugin_signer_id.txt установлен штатно в /flashdata/plugins/kb_probe5_plat (в логе; фактически /data/data/com.dunehd.app/flashdata/plugins/kb_probe5_plat) и зарегистрирован как Plugin 'kb_probe5_plat' of type 'plain'. ↩

  42. fw-tv188b-261021-0117-r25--plugin-loader.c046 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 штатный установщик принял dune_plugin_kb_probe11z.zip без dune_plugin.sign и dune_plugin_signer_id.txt и зарегистрировал kb_probe11z как php. ↩↩

  43. fw-tv188b-261021-0117-r25--plugin-loader.c047 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 после установки kb_probe11z оболочка выполнила global action install как sh bin/ga.sh install; маркер ga_install.txt записал event=install и uid=1000(system). ↩↩

  44. fw-tv188b-261021-0117-r25--plugin-loader.c048 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 после установки неподписанного kb_probe11z ENTER пультом на «KB11 zip» в «Приложения» → DUNE HD вызвал handle_user_input с control_id=enter и диалог «KB probe 11z / OK: zip». ↩

  45. fw-tv188b-261021-0117-r25--plugin-loader.c051 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 сохранённый фрагмент shell.log установки kb_probe11z содержит [plugin_installer], регистрацию и install action, но не содержит сообщений [plugin_signer] или DSA-проверки этого зонда. ↩

  46. fw-tv188b-261021-0117-r25--plugin-loader.c034 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 поиск dune_plugin.sign в $P/flashdata/plugins и $P/firmware_ext/plugins нашёл ровно 10 файлов: dune-hd.tv, dunemdb_supplier_youtube, smotreshka.tv, dunemdb_supplier_online_movies, dunestore, dunemdb_supplier_generic, android_apps, ktv_start, widget, shell_ext. ↩↩

  47. fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c026 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В том же логе r25 плагины с URL update.txt (Screenshoter, widget_ext) проверяются как [schema1]: лог показывает current и available version_index/version и «last_critical_version_index = 1, critical = no»; плагины с update_info.xml — как [schema2] ↩↩↩

  48. fw-tv188b-261021-0117-r25--plugin-loader.c035 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В shell.log r25 при загрузке плагинов из /flashdata/plugins для dune-hd.tv записаны num_files=224, num_bytes=2701081, digest A8235D91EA8D8DB2E60845D3B2826327CFB300FB и «[plugin_signer] DSA verification for signer_id com.dune-hd: OK». ↩

  49. fw-tv188b-261021-0117-r25--plugin-loader.c036 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В shell.log r25 при загрузке плагинов из /firmware_ext/plugins для shell_ext записаны num_files=292, num_bytes=3942977, digest 39A76B386D5C62C25A753DE2E92F5EE4363C2966 и «[plugin_signer] DSA verification for signer_id com.dune-hd: OK». ↩

  50. fw-tv188b-261021-0117-r25--plugin-loader.c089 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 (один прогон) установленный на плеере dune-hd.tv содержит в dune_plugin.xml строку yes, и при каждом запуске оболочки его подпись проходит DSA-проверку (signer_id com.dune-hd: OK). ↩↩↩

  51. fw-tv188b-261021-0117-r25--plugin-loader.c066 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В populate_plugins (0x00215450) r25 после разбора манифеста plugin_signer (0x002aa204) вызывается только если properties_get_bool(<свойства плагина>, "strict_verify_needed", 0) истинно; при ложном значении плагин регистрируется без вызова plugin_signer. ↩↩↩↩↩↩↩↩

  52. fw-tv188b-261021-0117-r25--plugin-loader.c088 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 (один прогон) grep strict_verify_needed не нашёл строки в dune_plugin.xml встроенных плагинов (firmware_ext/plugins/*, в том числе shell_ext), а нашёл только у dune-hd.tv и зондов в flashdata; при этом shell.log пишет DSA-проверку подписи shell_ext («DSA verification for signer_id com.dune-hd: OK»). ↩↩↩↩↩

  53. fw-tv188b-260827-0003-r24--plugin-loader.c108 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 поиск по /system, /vendor и /data/data/com.dunehd.app не нашёл plugin_config.xml; в выводе только 10 файлов dune_plugin_signer_id.txt. ↩

  54. fw-tv188b-260827-0003-r24--plugin-loader.c109 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в /tmp/run/installed_plugins.xml загружены плагины, для которых поиск не нашёл dune_plugin_signer_id.txt, в том числе melange, play_in_apps, Filmix_api, Screenshoter, VPN и test_php-cgi; наличие dune_plugin.sign у них не проверялось. ↩

  55. doc-sdk-dune-custom-firmware.c005 · doc · any-documented; прошивка — · В разделе «Secure firmware» для запрета установки и запуска произвольных сторонних плагинов рекомендуется выставить external_plugins_enabled = signed в /firmware/config/ro_config.properties. ↩↩

  56. fw-tv188b-261021-0117-r25--plugin-loader.c038 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В strings libduneutil.so r25 присутствуют имена external_plugins_enabled, signed и allowed_plugin_signer_ids. ↩

  57. fw-tv188b-260827-0003-r24--plugin-loader.c112 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · В strings libduneutil.so r24 присутствуют имена external_plugins_enabled, signed и allowed_plugin_signer_ids. ↩

    • fw-tv188b-260827-0003-r24--plugin-loader.c110 · doc · any-documented; прошивка — · SDK описывает ro_config-параметр external_plugins_enabled: all — разрешены все сторонние плагины, signed — только подписанные Dune HD (signer_id должен быть в allowed_plugin_signer_ids, если список задан), none — сторонние плагины запрещены; по умолчанию all.
    • fw-tv188b-260827-0003-r24--plugin-loader.c111 · doc · any-documented; прошивка — · SDK описывает ro_config-параметр allowed_plugin_signer_ids: список разрешённых signer id через запятую; если параметр не задан, разрешены все signer id.

    ↩

  58. fw-tv188b-260827-0003-r24--firmware-config.c012 · code · android-dune-fw; прошивка 260827_0003_r24, 250815_1012_r22, 261021_0117_r25 · ro_config.properties задаёт следующие 1 начальных записей: check_fw_upgrade_in_wizard = yes. ↩

  59. fw-tv188b-261021-0117-r25--plugin-loader.c049 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 чтение /config/ro_config.properties и /data/data/com.dunehd.app/config/ro_config.properties вернуло No such file or directory для обоих путей. ↩

  60. fw-tv188b-261021-0117-r25--plugin-loader.c050 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 команда find /system /vendor /data/data/com.dunehd.app -name plugin_config.xml не вывела совпадений между метками начала и конца поиска. ↩↩

  61. fw-tv188b-260827-0003-r24--plugin-loader.c013 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит строки «strict_verify_needed» и «[populate_plugins] ERROR: signature verification failed for '%s', but required» ↩

  62. plg-ds-dune-hd-tv.c003 · code · unknown; прошивка — · Тип плагина — php, программа i24h.php; в params заданы strict_verify_needed = yes и pf_allowed = yes. ↩

  63. fw-tv188b-261021-0117-r25--plugin-loader.c085 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Свойства, из которых populate_plugins r25 читает strict_verify_needed, поступают из манифеста dune_plugin.xml: FUN_00215304 передаёт прочитанный XML в FUN_0029006c, тот передаёт результат xml_utils_get_child_element_params с именем params восьмым аргументом FUN_0028ff44, который сохраняет его в +0x1c возвращаемого описателя; populate_plugins читает свойства из того же +0x1c. ↩

  64. fw-tv188b-261021-0117-r25--plugin-loader.c067 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Если при strict_verify_needed plugin_signer вернул 0, populate_plugins r25 пишет «[populate_plugins] ERROR: signature verification failed for '%s', but required» и не регистрирует плагин (переход к освобождению описателя, минуя регистрацию). ↩↩↩

  65. fw-tv188b-261021-0117-r25--plugin-loader.c076 · code · unknown; прошивка — · Манифест dune_plugin.xml плагина dune-hd.tv (версия 240718_1541) содержит в строку yes. ↩

    • fw-tv188b-261021-0117-r25--plugin-loader.c070 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · plugin_signer (0x002aa204) r25 читает signer_id из файла dune_plugin_signer_id.txt в каталоге плагина (FUN_002aa164); если его нет — «[plugin_signer] %s: the required signer_id is missing» и результат 0; если третий аргумент задан и не равен signer_id — «invalid signer_id: requied(%s) != actual(%s)» и 0 (populate_plugins передаёт 0, т. е. без требуемого signer_id).
    • fw-tv188b-261021-0117-r25--plugin-loader.c071 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · plugin_signer r25 проверяет signer_id по списку через запятую (FUN_002a9f64); список берётся из поля ro_config по смещению 0x1f0, а если оно пусто — «com.dune-hd» или «com.dune-hd,»; signer_id не из списка — «[plugin_signer] %s: signer_id '%s' not allowed» и 0.
    • fw-tv188b-261021-0117-r25--plugin-loader.c073 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · plugin_signer r25 открывает <каталог>/dune_plugin.sign; нет файла — «the required signature not found for plugin '%s'» и 0; файл читается до 256 байт, и если его размер (ftell после fseek в конец) не равен прочитанному — «invalid signature file for plugin '%s'» и 0.
    • fw-tv188b-261021-0117-r25--plugin-loader.c075 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · plugin_signer r25 проверяет подпись signer_id «com.dune-hd» встроенным в libduneshell.so ключом (dsa_sign_verify_dsa_signature с константами DAT_00e8e8c8…); другой signer_id принимается, только если равен get_customer_id(), и тогда ключ берётся из /config/plugin_key.pem, а без него — из /firmware/config/plugin_key.pem; иначе «unsupported signer_id» или «plugin_key.pem not found» и 0. Итог пишется «DSA verification for signer_id %s: OK|failed».

    ↩

  66. fw-tv188b-261021-0117-r25--plugin-loader.c080 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В FUN_00215ed4 r25 второй аргумент populate_plugins равен 0 для /flashdata/plugins и /tmp/mnt/D/dune_plugins, а для /fconfig/plugins, /firmware/plugins и /firmware_ext/plugins — 1. ↩↩

  67. fw-tv188b-261021-0117-r25--plugin-loader.c083 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · FUN_00215e08 r25 возвращает 0 сразу при external_plugins_enabled=none; при режиме 0 возвращает 1 без вызова plugin_signer, при signed с успешным plugin_signer также возвращает 1. ↩

    • fw-tv188b-261021-0117-r25--plugin-loader.c068 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В ветке populate_plugins r25 со вторым аргументом 0 плагин пропускается без загрузки, если в его каталоге есть обычный файл .bad_signature (лог «[populate_plugins] %s: bad_signature flag is set»); в ветке с ненулевым вторым аргументом этот файл не проверяется.
    • fw-tv188b-261021-0117-r25--plugin-loader.c080 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В FUN_00215ed4 r25 второй аргумент populate_plugins равен 0 для /flashdata/plugins и /tmp/mnt/D/dune_plugins, а для /fconfig/plugins, /firmware/plugins и /firmware_ext/plugins — 1.

    ↩

  68. fw-tv188b-261021-0117-r25--plugin-loader.c069 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В populate_plugins r25 «plugin %s is not permitted» пишется, когда глобальный указатель на функцию-фильтр (DAT_00ee9e68) не нулевой и вернул ненулевое значение для имени плагина; в ветке со вторым аргументом 0 каталог плагина затем удаляется FS_remove_recursively_if_exists, в другой ветке — только пропуск. ↩

  69. fw-tv188b-261021-0117-r25--plugin-loader.c084 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · FUN_0069b808 r25 устанавливает в ячейку 0x00ee9e68, используемую фильтром «not permitted» в populate_plugins, адрес 0x00690bf0 (инструкция записи 0x0069bd68). ↩

    • fw-tv188b-261021-0117-r25--plugin-loader.c086 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 (один прогон) сторонний kb_probe13v с yes в params и испорченным dune_plugin.sign не зарегистрирован: plugin_signer остановился на «the required signer_id is missing», populate_plugins — «signature verification failed for 'kb_probe13v', but required»; в installed_plugins.xml его нет.
    • fw-tv188b-261021-0117-r25--plugin-loader.c087 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 (один прогон) сторонний kb_probe13n с тем же испорченным dune_plugin.sign, но без strict_verify_needed, зарегистрирован без строк plugin_signer, есть в installed_plugins.xml, и его точка входа KB13N dlg вызвала handle_user_input(dlg).

    ↩

    • fw-tv188b-261021-0117-r25--plugin-loader.c066 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В populate_plugins (0x00215450) r25 после разбора манифеста plugin_signer (0x002aa204) вызывается только если properties_get_bool(<свойства плагина>, "strict_verify_needed", 0) истинно; при ложном значении плагин регистрируется без вызова plugin_signer.
    • fw-tv188b-261021-0117-r25--plugin-loader.c087 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 (один прогон) сторонний kb_probe13n с тем же испорченным dune_plugin.sign, но без strict_verify_needed, зарегистрирован без строк plugin_signer, есть в installed_plugins.xml, и его точка входа KB13N dlg вызвала handle_user_input(dlg).

    ↩

  70. doc-sdk-plugins.c118 · doc · any-documented; прошивка — · Кастомные (операторские) прошивки могут быть настроены разрешать только подписанные плагины ↩

  71. fw-tv188b-260827-0003-r24--plugin-loader.c052 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Во встроенных плагинах прошивки 6 из 13 (android_apps, dunemdb_supplier_generic, dunestore, ktv_start, shell_ext, widget) имеют dune_plugin.sign и dune_plugin_signer_id.txt ↩

  72. plg-ds-dunemdb-supplier-generic.c013 · code · unknown; прошивка — · В пакете есть dune_plugin.sign (46 байт, sha256 e1c2a4207fdf5f756ee522a11b15c551a1da20f0a33257284082449f24c5fd4d) и dune_plugin_signer_id.txt с содержимым com.dune-hd; сам .sign в базу не копировался (извлечение только текстовых файлов), поэтому его содержимое недоступно. ↩

  73. plg-ds-dunemdb-supplier-megogo.c014 · code · android; прошивка — · В пакете есть dune_plugin.sign (47 байт, sha256 606f5a7ec786ff7239b59770eb08d8d0e4539e0af0a24006f1ef4ff8de46c64c) и dune_plugin_signer_id.txt с содержимым com.dune-hd; сам .sign в базу не копировался (извлечение только текстовых файлов), поэтому его содержимое недоступно. ↩

  74. plg-ds-dunemdb-supplier-okko.c014 · code · android; прошивка — · В пакете есть dune_plugin.sign (47 байт, sha256 e94dd19c6f576666b5aeef9c2423cf98d59b934707e24bcf059d2c9489fd609d) и dune_plugin_signer_id.txt с содержимым com.dune-hd; сам .sign в базу не копировался (извлечение только текстовых файлов), поэтому его содержимое недоступно. ↩

  75. plg-ds-dune-hd-tv.c014 · code · unknown; прошивка — · dune_plugin_signer_id.txt содержит идентификатор подписанта com.dune-hd; в пакете есть dune_plugin.sign. ↩

  76. doc-sdk-plugins.c116 · doc · any-documented; прошивка — · Допустимые signer ID: «com.dune-hd» (только Dune HD) и customer ID кастомной прошивки (с 150326_r10) ↩

    • doc-sdk-plugins.c116 · doc · any-documented; прошивка — · Допустимые signer ID: «com.dune-hd» (только Dune HD) и customer ID кастомной прошивки (с 150326_r10)
    • doc-sdk-plugins.c119 · doc · any-documented; прошивка — · Собственная подпись (150326_r10+): DSA-ключи 2048 через openssl, подпись утилитой plugin_sign.x86 , публичный ключ кладётся в прошивку как /firmware/config/plugin_key.pem

    ↩↩↩

  77. doc-sdk-dune-custom-firmware.c007 · doc · any-documented; прошивка — · Параметры ro_config external_plugins_enabled и plugins_installation_enabled делают то же самое, но менее гибко; совместное использование с plugin_config.xml не рекомендуется, а если возможностей ro_config не хватает, использовать plugin_config.xml. ↩↩

  78. doc-sdk-dune-store.c053 · doc · any-documented; прошивка — · Сторонние плагины можно добавить в кастомный каталог Dune Store; если прошивка требует только подписанные плагины, их подписывают собственным ключом подписи плагинов, а прошивку настраивают разрешать этот ключ. ↩

  79. doc-sdk-dune-store.c049 · doc · any-documented; прошивка — · Добавлять сторонние приложения в кастомный каталог Dune Store потенциально можно, но они не будут подписаны, так как сейчас подписывать могут только приложения, выпускаемые и поддерживаемые Dune HD. ↩

    • fw-tv188b-261021-0117-r25--plugin-loader.c071 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · plugin_signer r25 проверяет signer_id по списку через запятую (FUN_002a9f64); список берётся из поля ro_config по смещению 0x1f0, а если оно пусто — «com.dune-hd» или «com.dune-hd,»; signer_id не из списка — «[plugin_signer] %s: signer_id '%s' not allowed» и 0.
    • fw-tv188b-261021-0117-r25--plugin-loader.c072 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Поле ro_config по смещению 0x1f0, из которого plugin_signer r25 берёт список допустимых signer_id, заполняется разборщиком ro_config_load_if_needed из свойства allowed_plugin_signer_ids.

    ↩↩

    • doc-sdk-plugins.c017 · doc · any-documented; прошивка — · Плагин устанавливается запуском файла dune_plugin*.zip с любого носителя (например, USB-флешки) и ставится во флеш-память устройства
    • fw-tv188b-261021-0117-r25--shell-ext--search-tv.c026 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ensure_tv_app_installed r25 для type=plugin: если плагин уже установлен и force_check_update — запускает plugin_installer://:::schema=update (при need_launch с launch после), иначе если не установлен — требует update_url и запускает plugin_installer://:::schema=2&name=&need_confirm_replace=0&close_on_success=1 с необязательным signer_id (при need_launch с launch после).
    • fw-tv188b-261021-0117-r25--builtin-plugins-misc.c028 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В обычном режиме источники каталога dunestore: /config/dsconfig.xml, иначе /firmware/config/dsconfig.xml; без файла, при ошибке разбора или без элемента sources используются standard_source и community_source. В sources допустимы standard_source, community_source и source (обязателен непустой catalog_url с «/»; signer_id; icon_url_prefix и download_url_prefix по умолчанию — каталог catalog_url; community=yes); неизвестный элемент и source без непустого catalog_url, содержащего «/», пропускаются.
    • doc-sdk-plugins.c105 · doc · any-documented; прошивка — · Онлайн-обновление: в манифесте задаются version_index (число, растёт с каждой версией, в UI не показывается), version (подпись для UI) и check_update (schema, url, timeout, required, auto)

    ↩

  80. plg-hdtv-duneplexcatalog.c074 · code · unknown; прошивка — · Пакет распространялся ссылкой Dropbox в посте p325463, а не через check_update: в dune_plugin.xml нет элемента check_update, version_index и global_actions. ↩

  81. plg-gh-kocourkuba-proiptv.c018 · code · unknown; прошивка — · Workflow .github/workflows/release.yml на каждый тег вида N.N.N собирает пакет make_update.php и публикует dune_plugin_proiptv.<тег>.zip как GitHub Release. ↩↩↩

  82. plg-hdtv-update-bootstrap.c014 · code · unknown; прошивка — · Из 43 манифестов 22 указывают хост обновлений dune-club.info, 19 — zlostnyi.tech (18 заготовок плюс shura), один (sunduk) — dunetv.ru и один (shara-tv) — update.shara-tv.org; адресов ott-play.com среди них нет. ↩

  83. plg-ds-dunemdb-supplier-generic.c007 · code · unknown; прошивка — · check_update задаёт schema 2, url http://online.dune-hd.com/dune_store_ext/apk/plugins/dunemdb_supplier_generic/update_info.xml, timeout 86400, required no, auto yes, dont_ask_confirmations yes и prefer_builtin_if_url_differ yes. ↩

  84. fw-tv188b-261021-0117-r25--plugin-loader.c060 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 после ENTER на dune_plugin_kb_probe5.zip в файловом браузере установщик сразу показал диалог «Установка приложения» с текстом «KB probe 5: установлено успешно.» и кнопками «Запустить» и «Закрыть»; вопроса перед установкой не было. ↩

  85. fw-tv188b-261021-0117-r25--plugin-loader.c061 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 после ENTER на dune_plugin_kb_probe11z.zip в файловом браузере установщик сразу показал диалог «Установка приложения» с текстом «KB probe 11z: установлено успешно.» и кнопками «Запустить»/«Закрыть»; вопроса перед установкой не было, нажата «Закрыть». ↩

  86. doc-sdk-plugins.c019 · doc · any-documented; прошивка — · Для ручной установки плагинов обычно требуется активированное «Flash memory storage» или «System storage»; если ни то ни другое не активно, устройство предложит активировать Flash memory storage ↩

  87. doc-sdk-plugins.c018 · doc · any-documented; прошивка — · При установке плагина с тем же именем, что у уже установленного вручную, предлагается перезаписать или отменить; встроенные в прошивку плагины перезаписать нельзя ↩↩

  88. thr-hdtv-19055.c023 · forum · Dune HD TV-175L SmartBox 4K, unknown; прошивка — · Плагин Screenshoter распространяется как ZIP-файл dune_plugin_Screenshoter.zip и ставится выбором ZIP в файловом браузере Dune с флешки (архив 7z не подходит) ↩↩

  89. fw-tv188b-261021-0117-r25--plugin-loader.c059 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 после ENTER на kb11_other.zip в файловом браузере lead не увидел изменения экрана или диалога, а проверка установки показала отсутствие каталога kb_probe11z; архив был копией dune_plugin_kb_probe11z.zip. ↩

  90. fw-tv188b-261021-0117-r25--plugin-loader.c064 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 файл kb11_other.zip показан в файловом браузере со значком «?» (неизвестный тип), тогда как рядом лежащие dune_plugin_*.zip — со значком файла. ↩

  91. fw-tv188b-261021-0117-r25--builtin-plugins-misc.c035 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Перед установкой dunestore разворачивает required_plugins: неустановленная зависимость ставится через plugin_installer://plugins//update_info.xml:::schema=2&name= (в обычном режиме download_url_prefix — http://files3.dune-hd.com/dune_store/v1/), установленная — через plugin_installer://:::schema=update. Для самого плагина: update_url → schema=1, если адрес оканчивается на .txt или содержит «.txt?», иначе schema=2; без update_url — download_url без schema; при !ext_tv_mode в URL самого плагина и неустановленной зависимости добавляется &caption=; затем добавляются need_confirm_replace=0, close_on_success=1 и signer_id (если задан), и URL отдаётся ActionFactory::launch_media_url с next_action apply_install. ↩↩↩

  92. plg-hdtv-youtube.c090 · code · unknown; прошивка — · При control_id=installPlug экран настроек YouTube возвращает launch_media_url с plugin_installer://http://dune-club.info/plugins/update/Codec_install/dune_plugin_Codec_install.tar.gz:::name=Codec_install&space_needed=2000000&need_confirm_replace=0 и post_action launch_media_url('plugin_launcher://Codec_install'). ↩↩

  93. fw-tv188b-261021-0117-r25--plugin-loader.c054 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 после установки по plugin_installer:// оболочка выполнила install зонда kb_probe11z, а ga_install.txt дополнился событием install в 03:36:15. ↩

  94. fw-tv188b-261021-0117-r25--plugin-loader.c062 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 при проверке экрана после завершения установки plugin_installer:// по IP Control диалога не было: остался раздел «Приложения», ничего не спрашивалось, кнопки не нажимались. ↩

    • fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c035 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Встроенные PHP-плагины r24 формируют URL установщика как plugin_installer://<адрес>:::<ключ>=<значение>&… с ключами schema, name, caption, title, need_confirm_replace, close_on_success, signer_id
    • fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c075 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 URL установщика plugin_installer://…:::schema=… разбирается так (fcn.0057096c): schema = update — обновление установленного плагина (c076), tgz и zip — прямой пакет, иначе atoi; в fcn.002c7a40 schema < 1 — «schema should be > 0», 1 — нужен name (по нему берётся установленный version_index или −1, update.txt разбирается fcn.002c5968), 2 — update_info.xml разбирается fcn.002c5ef4 без сверки имени с name из URL, а ignore_existing ≠ 0 отключает сравнение с установленной версией; прочие — «schema %d is not supported»

    ↩

  95. fw-tv188b-261021-0117-r25--builtin-plugins-misc.c024 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Манифест dunestore: тип php с program main.php и active_hidden=yes; точка входа root://applications (media_url category_list) стоит после section_after plugin:android_apps:apps_all_android, plugin:android_apps:apps_atv и plugin:android_apps:apps, не является default (is_default_section no), show_by_default=yes и ip_address_required=yes; key_enter — plugin_handle_user_input entry/root, в контекстном меню — entry/clear_cache и entry/open_community_settings. ↩

  96. fw-tv188b-261021-0117-r25--builtin-plugins-misc.c027 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · DuneStoreModel задаёт каталог http://online.dune-hd.com/dune_store/v1/catalog.xml, префикс иконок http://online.dune-hd.com/dune_store/v1/ и загрузок http://files3.dune-hd.com/dune_store/v1/; community-каталог http://dune-club.info/plugins/update/community_catalog.xml, префиксы иконок и загрузок community — http://dune-club.info/plugins/update/; файл установленных плагинов /tmp/run/installed_plugins.xml; конфиг меню /firmware/config/menu_config.xml. ↩↩

  97. fw-tv188b-261021-0117-r25--builtin-plugins-misc.c028 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В обычном режиме источники каталога dunestore: /config/dsconfig.xml, иначе /firmware/config/dsconfig.xml; без файла, при ошибке разбора или без элемента sources используются standard_source и community_source. В sources допустимы standard_source, community_source и source (обязателен непустой catalog_url с «/»; signer_id; icon_url_prefix и download_url_prefix по умолчанию — каталог catalog_url; community=yes); неизвестный элемент и source без непустого catalog_url, содержащего «/», пропускаются. ↩

  98. fw-tv188b-261021-0117-r25--builtin-plugins-misc.c044 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Плагин попадает в каталог dunestore, только если он не отключён через dsconfig и не отключён plugin_is_disabled_by_special_conditions; при совпадении имени в разных источниках берётся первый, дубль пропускается с предупреждением «plugin ... declared in different sources». Плагин стандартного источника (signer_id com.dune-hd) дополнительно попадает в каталог, только если его имя перечислено в категории plugins этого каталога и он не скрыт plugin_is_hidden_by_box_type. ↩

  99. fw-tv188b-261021-0117-r25--builtin-plugins-misc.c037 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · DuneStorePluginScreen для установленного плагина показывает «Обновить», только если плагин не launch_capable и installed version_index < доступного, иначе «Запустить»; справа всегда «Удалить». Для неустановленного — «Установить»; для community-плагина установка сначала показывает диалог подтверждения и продолжается действием confirmed_install. Установка/обновление строит plugin_installer URL (update_url → schema 1/2, иначе download_url с space_needed), добавляет need_confirm_replace=0 и signer_id (если задан); удаление — plugin_uninstaller://; после действия refresh перечитывает installed_plugins.xml и инвалидирует списки. ↩↩↩↩

  100. fw-tv188b-261021-0117-r25--builtin-plugins-misc.c043 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В режиме расширений установка неустановленного community-плагина (dep=0, не в ТВ-режиме) требует подтверждения: показывается диалог с msg_you_are_going_to_install_community_app__1 и community_app_message_line1..5; «продолжить» запускает apply_install с community_confirmed=1, отказ (cb_result != 1) помечает плагин пройденным; community-каталог игнорируется целиком, если community выключен. ↩

  101. fw-tv188b-261021-0117-r25--builtin-plugins-misc.c033 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Видимость плагина в dunestore: скрываются установленная версия из hidden-файла и tvrain:4; expr (если не any) должен дать true; при отсутствии expr проверяются apk (точное совпадение с HD::is_apk), strict_country, country (widget_country из /config/settings.properties важнее), language и product; затем всегда firmware_features. Для плагина стандартного источника box_type=2 (/tmp/ebxt.txt) скрывает категорию tv, box_type=1 — плагины с flags&1. ↩

  102. fw-tv188b-261021-0117-r25--builtin-plugins-misc.c041 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В режиме расширений dunestore подменяет источники каталога переданными URL; при наличии /config/dunestore_ext_devel каталог заменяется на dev_catalog.xml, а community-каталог — на dev_community_catalog.xml в том же каталоге; community-источник добавляется только при with_community. ↩

  103. thr-hdtv-19055.c024 · forum · Dune HD Real Vision 4K, unknown; прошивка R21 · Screenshoter доступен в Dune Store и после установки обновляется автоматически ↩

  104. doc-sdk-dune-store.c008 · doc · any-documented; прошивка — · Каталог Dune Store (XML) скачивается приложением Dune Store при запуске пользователем; стандартный URL — http://online.dune-hd.com/dune_store/v1/catalog.xml, кастомная прошивка может использовать другой URL. ↩

  105. doc-sdk-dune-store.c012 · doc · any-documented; прошивка — · Онлайн-обновление плагинов — часть механизма плагинов, а не Dune Store; Dune Store предполагает, что все устанавливаемые через него плагины настроены на онлайн-обновление. ↩

  106. doc-sdk-dune-store.c020 · doc · any-documented; прошивка — · name плагина в каталоге — внутренний идентификатор, не показывается пользователю; должен точно совпадать с name в dune_plugin.xml. ↩

  107. doc-sdk-dune-store.c021 · doc · any-documented; прошивка — · caption плагина в каталоге — видимое имя, поддерживает lang и должен точно совпадать с caption в dune_plugin.xml; если в каталоге несколько языков, те же языки должны быть в манифесте. ↩

  108. doc-sdk-dune-store.c030 · doc · any-documented; прошивка — · version_index в каталоге задаёт текущий индекс версии плагина и используется, чтобы определить, что установленная версия старше доступной; должен точно совпадать с version_index в dune_plugin.xml. version — текущая версия для показа, должна точно совпадать с version в dune_plugin.xml. ↩

  109. doc-sdk-dune-store.c035 · doc · any-documented; прошивка — · Каждое приложение каталога само определяет две вещи: категорию в каталоге Dune Store (через catalog.xml) и раздел главного меню, где появится после установки (через parent_media_url в dune_plugin.xml). ↩

  110. doc-sdk-dune-store.c034 · doc · any-documented; прошивка — · Главное меню стандартных прошивок включает разделы, соответствующие всем категориям стандартного каталога Dune Store, но список разделов меню определяется не каталогом, а конфигурацией прошивки /firmware/config/menu_config.xml; стандартные прошивки настроены так, что списки совпадают. ↩

  111. doc-sdk-dune-store.c036 · doc · any-documented; прошивка — · Изменение списка категорий в каталоге Dune Store не меняет список разделов главного меню; для изменения меню нужна прошивка с изменённой конфигурацией меню. ↩

  112. doc-sdk-dune-store.c037 · doc · any-documented; прошивка — · Кастомная прошивка с собственным Dune Store может иметь любые списки разделов меню и категорий каталога при условии, что конфигурация прошивки включает все разделы меню, на которые ссылаются приложения каталога; если точка входа ссылается на отсутствующий раздел, после установки она не будет видна и доступна. ↩

    • doc-sdk-dune-store.c051 · doc · any-documented; прошивка — · Пример кастомизации: свой сервер хранит только урезанный каталог, а все остальные ресурсы (иконки, файлы плагинов/скинов, спецификации обновлений) скачиваются со стандартного сервера Dune Store, поэтому обновления со стандартного сервера автоматически доступны и в кастомной прошивке.
    • doc-sdk-dune-store.c052 · doc · any-documented; прошивка — · Для такого примера нужно скачать стандартный catalog.xml, оставить нужные приложения и скины, выложить каталог на своём сервере и включить в прошивку dsconfig.xml с catalog_url своего каталога и icon/download-префиксами стандартного сервера.

    ↩

  113. doc-sdk-dune-store.c050 · doc · any-documented; прошивка — · Полный клон стандартного сервера Dune Store (включая файлы плагинов и спецификации обновлений) сейчас не поддерживается и не рекомендуется без отдельной договорённости с Dune HD; технически возможен, но нетривиален. ↩

  114. fw-tv188b-261021-0117-r25.c083 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 global_action update не выполняется, если version_index в dune_plugin.xml изменён на месте (1 → 2) и приложение перезапущено через am force-stop, хотя оболочка регистрирует плагин с version_index 2 и заново запускает movie_suppliers_update.sh. ↩

  115. doc-sdk-plugins.c023 · doc · any-documented; прошивка — · Механизм dune_plugins предназначен в основном для разработки; чтобы применить изменения в папке, нужно дважды нажать POWER (уход в standby и включение) ↩

  116. doc-sdk-plugins.c136 · doc · android; прошивка — · На Android пользовательские накопители монтируются с noexec, что мешает механизму dune_plugins ↩

  117. doc-sdk-plugins.c107 · doc · any-documented; прошивка — · Схема обновления 1 устарела и не должна использоваться; нужно использовать schema = 2 ↩↩

  118. plg-upd-descriptors.c012 · code · unknown; прошивка — · Дескриптор schema 2 содержит восемь базовых элементов в порядке version_index, version, beta, critical, url, md5, size, caption. ↩

  119. plg-upd-descriptors.c009 · code · unknown; прошивка — · У всех шести update_info.xml корень dune_plugin_update_info с 2; кроме массива plugin_version_descriptor, в корне только элементы schema и name, а элементов redirect и next_check_update_timeout нет ни в одном файле. ↩

  120. fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c006 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Разбор update info schema 2 проверяет schema, совпадение name с именем плагина и в каждом plugin_version_descriptor — version_index, beta, critical, url, md5, size; считает кандидатов и «matches (newer)» и итог have_better_version ↩

  121. fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c064 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 у plugin_version_descriptor (fcn.002c5ef4) дочерние элементы require — пары «имя единицы версии → шаблон» (текст обязателен: «require '%s': text content is expected»), required_firmware_features — список, разбитый str_next_token; дескриптор проходит, только если каждая единица найдена (иначе «required version unit '%s' not found»), её шаблон совпал (fcn.0017228c, «match<%s> … => YES/NO») и каждая функция есть (has_firmware_feature); из прошедших берётся наибольший version_index, «newer» — больше установленного ↩↩↩↩

    • plg-upd-descriptors.c010 · code · unknown; прошивка — · Шесть файлов schema 2 содержат 73 элемента plugin_version_descriptor: globaltv — 20, dunemdb_supplier_movies_rus — 13, dune-hd.tv — 16, dunemdb_supplier_generic — 10, amediateka — 8, first_muz_ru — 6.
    • plg-upd-descriptors.c011 · code · unknown; прошивка — · В каждом файле schema 2 version_index дескрипторов возрастает, но часть номеров пропущена: movies-rus — 10, globaltv — 37 и 41, amediateka — 9, dune-hd.tv — 80–85, 89, 97 и 98, dunemdb_supplier_generic — 13 и 14; у first_muz_ru идут 2–7 без пропусков.

    ↩

  122. fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c079 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 оболочка при проверке обновления на запуске запрашивает update_info.xml GET-запросом с адреса 127.0.0.1, дописав к URL «?dune_auth=…», с заголовками User-Agent «DuneHD/1.0 (product_id: tv188b; firmware_version: 261021_0117_r25)», X-Dune-Interface-Language (russian) и X-Dune-Serial-Number. ↩

  123. doc-sdk-plugins.c112 · doc · any-documented; прошивка — · Флаг beta в update_info зарезервирован и игнорируется (рекомендуется 'no') ↩

  124. plg-upd-descriptors.c014 · code · unknown; прошивка — · required_firmware_features есть у 26 из 73 дескрипторов: у globaltv — у 16 из 20 (начиная с version_index 31) со значением dunemdb_supplier_plugin_api_v6, у dunemdb_supplier_generic — у всех 10 со значением newgui2021. ↩

  125. fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c090 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 онлайн-обновление сохраняет cookies плагина и его data_dir_path: v2 и v3 получили в plugin_cookies значение kbp7u_mark, записанное v1, файл kbp7u_mark.txt v1 в flashdata/plugins_data/ остался с прежним mtime. ↩

  126. fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c086 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 перед диалогом обновления оболочка вызывает глобальное действие confirm_update установленной версии плагина и передаёт в user_input поля check_update_plugin_name, check_update_url (URL пакета), check_update_version, check_update_prev_version, check_update_version_index и check_update_prev_version_index; при ответе null — «confirm_update action finished with status 0» и «plugin_updater I: enabled by custom action», обновление идёт обычным путём. ↩

  127. fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c088 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после установки обновления новая версия плагина получает глобальное действие update (в новом php_server), затем запускается исходная точка входа, с которой началась проверка; глобальное действие install при обновлении не вызывается. ↩

  128. plg-upd-descriptors.c001 · code · unknown; прошивка — · В наборе 29 дескрипторов обновления, снятых с серверов 2026-11-01, 23 — update.txt schema 1 (пять строк «ключ=значение») и 6 — update_info.xml schema 2 (корень dune_plugin_update_info). ↩↩

  129. plg-upd-descriptors.c002 · code · unknown; прошивка — · Все 23 дескриптора update.txt (schema 1) состоят ровно из пяти строк «ключ=значение» в одном порядке: version_index, version, download_url, space_needed, last_critical_version_index; других ключей, пустых строк и комментариев нет. ↩↩

  130. fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c058 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 разбор update info schema 1 (fcn.002c5968) загружает файл в properties (properties_build_from_buffer) и читает ключи: next_check_update_timeout (по умолчанию −1), version_index (меньше 1 или нет — «invalid available version_index»), last_critical_version_index, version (необязателен), download_url (нужен http или https, иначе «invalid or missing download url»), space_needed (нужно больше 0, иначе «invalid or missing 'space_needed'») и все ключи, имена которых начинаются с confirm_dialog_line (strncmp на 0x13 = 19 символов), — они собираются в список строк ↩

  131. plg-hdtv-update-bootstrap.c036 · code · unknown; прошивка — · last_critical_version_index в 32 из 41 дескриптора — целое число (1 у 31, 5 у 101-ru), а в 9 — строка версии: «1.0.0» у 8 (1cent, 1usd, bcu, fox, great, lightiptv, tvteam, viplime) и «1.0.1» у smile. ↩

  132. fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c097 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 properties_get_int при libc bionic android12-release (atoi вызывает strtol с основанием 10) возвращает 1 для найденного значения «1.0.0», а для существующей пустой строки и строки «abc» — 0; это не возврат переданного значения по умолчанию. ↩

  133. fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c098 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 при libc bionic android12-release str_seg_strip обрезает по краям сегмента пробел (0x20), TAB (0x09), LF (0x0a), VT (0x0b), FF (0x0c) и CR (0x0d), поэтому замена окончаний LF на CRLF в update.txt не меняет разобранные ключи и значения. ↩

  134. doc-sdk-plugins.c113 · doc · any-documented; прошивка — · При critical = yes, timeout = 0 и required = yes система не даёт запустить старую версию плагина, если на сервере есть обновление ↩

  135. fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c014 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 при ошибке проверки обновления в fcn.002635b0, если check_update/schema отличается от 3 и check_update/required=yes, выставляется выходной флаг запрета запуска (6-й аргумент = 1); при required=no эта ветка запрета пропускается. ↩↩

  136. fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c077 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 при проверке обновления при запуске (fcn.002635b0) отказ от критического обновления на шаге подтверждения («critical update cancelled, access denied») и неудачная установка критического («critical update failed, access denied») удаляют /tmp/plugin_updater_.txt и запрещают запуск (флаг access denied); отказ от некритического ничего не удаляет и запуск продолжается ↩

  137. plg-hdtv-update-bootstrap.c017 · code · unknown; прошивка — · check_update/required yes задан только у sunduk и ottclub; у остальных 41 манифеста элемента required нет. ↩

  138. plg-upd-descriptors.c015 · code · unknown; прошивка — · beta и critical во всех 73 дескрипторах schema 2 равны no; значения yes нет ни в одном файле. ↩

  139. fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c091 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25, если у установленной версии в check_update задано dont_ask_confirmations=yes, проверка на запуске всё равно вызывает confirm_update, но диалог обновления не показывается: «installing application» идёт сразу за «enabled by custom action», на экране ни диалога, ни сообщений. ↩↩

  140. fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c028 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 каждый /tmp/plugin_updater_.txt содержит одно 10-значное число (unix-время), у 9 файлов значения 1792536168…1792622569 ↩

  141. fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c081 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 повторный запуск точки входа до срока из /tmp/plugin_updater_.txt не обращается к источнику обновления: в shell.log «[plugin_updater] remote check skipped by timeout», GET update_info.xml нет. ↩

  142. fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c025 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 лог /tmp/run/plugin_online_upgrade.log: grand-child процесс по очереди проверяет 9 плагинов — «Checking updates for plugin X», «autocheck of X: iteration 1/5, attempt 1/5», загрузка update info «with timeout 5», итог «plugin X is up-to-date» ↩

  143. fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c027 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В логе r25 итог schema 2 по плагину — «N candidates», «N matches (0 newer)», «have_better_version = no»: у dune-hd.tv 16 кандидатов, у widget 2, у melange и play_in_apps по 1 ↩↩

  144. fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c092 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 установка обновления после «Обновить» не показывает на экране сообщений о ходе и завершении: через ~2 и ~5 с после нажатия — сетка «Приложения» без окон, хотя в логе есть «dialog D: push progress.plugin_installer». ↩

    • fw-tv188b-261021-0117-r25.c213 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 точки входа плагина kb_probe5 (root://applications), заданные без icon_url, в разделе «Приложения» не появлялись.
    • fw-tv188b-261021-0117-r25.c212 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 у плагина kb_probe5, все 6 точек входа которого (parent_media_url root://applications) были без icon_url, в /tmp/run/installed_plugins.xml launch_capable 0 и нет category; после добавления в каждую точку входа icon_url gui_skin://large_icons/apps.aai и перезапуска приложения — launch_capable 1 и category applications.

    ↩

    • fw-tv188b-260827-0003-r24--plugin-loader.c007 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит путь-шаблон «%s/dune_plugin.xml» и сообщения об отсутствующем и неразбираемом манифесте (ключи plugin_installer_error_missing_manifest, plugin_installer_error_invalid_manifest)
    • doc-sdk-plugins.c016 · doc · any-documented; прошивка — · Установщик плагина — ZIP-архив с файлом dune_plugin.xml на верхнем уровне и прочими файлами плагина

    ↩

  145. fw-tv188b-260827-0003-r24--plugin-loader.c041 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Установщик сверяет name в манифесте с ожидаемым: есть сообщение «declared plugin name is '%s', real is '%s'» и ключ plugin_installer_error_name_changed__1 ↩

    • fw-tv188b-260827-0003-r24--plugin-loader.c043 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит строки установщика: /tmp/plugin_tmp, %s/plugin.zip, команду «cd %s%s && ls -la plugin.zip && unzip plugin.zip && rm -f plugin.zip», «md5 does not match», «suitable storage not found; cancelled»
    • doc-sdk-plugins.c019 · doc · any-documented; прошивка — · Для ручной установки плагинов обычно требуется активированное «Flash memory storage» или «System storage»; если ни то ни другое не активно, устройство предложит активировать Flash memory storage

    ↩

    • fw-tv188b-260827-0003-r24--plugin-loader.c040 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит сообщения установщика плагинов о запретах: «install not allowed for plugin», «install not allowed for unsigned plugin», «replace hard-coded plugin '%s' not allowed», «replace not allowed for plugin '%s' because of signer_id mismatch», «unsigned plugins not allowed», «signer_id '%s' not allowed by firmware», «signature verification failed»
    • doc-sdk-dune-custom-firmware.c002 · doc · any-documented; прошивка — · external_plugins_enabled: all разрешает все сторонние плагины; signed — только подписанные Dune HD, причём signer_id должен быть указан в allowed_plugin_signer_ids, если этот список задан.
    • doc-sdk-dune-custom-firmware.c012 · doc · any-documented; прошивка — · allow_install = yes|signed|no определяет, разрешена ли установка новых внешних плагинов; значение signed — только подписанных.

    ↩

    • fw-tv188b-260827-0003-r24--plugin-loader.c040 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит сообщения установщика плагинов о запретах: «install not allowed for plugin», «install not allowed for unsigned plugin», «replace hard-coded plugin '%s' not allowed», «replace not allowed for plugin '%s' because of signer_id mismatch», «unsigned plugins not allowed», «signer_id '%s' not allowed by firmware», «signature verification failed»
    • doc-sdk-dune-custom-firmware.c015 · doc · any-documented; прошивка — · allow_replace не влияет на онлайн-обновление: обновление всегда ограничено логикой same_signer_id.

    ↩

    • fw-tv188b-261021-0117-r25--plugin-loader.c086 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 (один прогон) сторонний kb_probe13v с yes в params и испорченным dune_plugin.sign не зарегистрирован: plugin_signer остановился на «the required signer_id is missing», populate_plugins — «signature verification failed for 'kb_probe13v', but required»; в installed_plugins.xml его нет.
    • fw-tv188b-261021-0117-r25--plugin-loader.c070 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · plugin_signer (0x002aa204) r25 читает signer_id из файла dune_plugin_signer_id.txt в каталоге плагина (FUN_002aa164); если его нет — «[plugin_signer] %s: the required signer_id is missing» и результат 0; если третий аргумент задан и не равен signer_id — «invalid signer_id: requied(%s) != actual(%s)» и 0 (populate_plugins передаёт 0, т. е. без требуемого signer_id).
    • fw-tv188b-261021-0117-r25--plugin-loader.c087 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 (один прогон) сторонний kb_probe13n с тем же испорченным dune_plugin.sign, но без strict_verify_needed, зарегистрирован без строк plugin_signer, есть в installed_plugins.xml, и его точка входа KB13N dlg вызвала handle_user_input(dlg).

    ↩

    • fw-tv188b-261021-0117-r25--plugin-loader.c068 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В ветке populate_plugins r25 со вторым аргументом 0 плагин пропускается без загрузки, если в его каталоге есть обычный файл .bad_signature (лог «[populate_plugins] %s: bad_signature flag is set»); в ветке с ненулевым вторым аргументом этот файл не проверяется.
    • fw-tv188b-261021-0117-r25--plugin-loader.c080 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В FUN_00215ed4 r25 второй аргумент populate_plugins равен 0 для /flashdata/plugins и /tmp/mnt/D/dune_plugins, а для /fconfig/plugins, /firmware/plugins и /firmware_ext/plugins — 1.
    • fw-tv188b-261021-0117-r25--plugin-loader.c082 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В режиме external_plugins_enabled=signed FUN_00215e08 r25 вызывает plugin_signer (0x002aa204) для переданных имени и каталога плагина с третьим аргументом 0; при результате 0 пытается создать <каталог>/.bad_signature, пишет «[plugin] %s: marked as bad» и возвращает 0.

    ↩

    • fw-tv188b-261021-0117-r25--plugin-loader.c069 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В populate_plugins r25 «plugin %s is not permitted» пишется, когда глобальный указатель на функцию-фильтр (DAT_00ee9e68) не нулевой и вернул ненулевое значение для имени плагина; в ветке со вторым аргументом 0 каталог плагина затем удаляется FS_remove_recursively_if_exists, в другой ветке — только пропуск.
    • fw-tv188b-261021-0117-r25--plugin-loader.c084 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · FUN_0069b808 r25 устанавливает в ячейку 0x00ee9e68, используемую фильтром «not permitted» в populate_plugins, адрес 0x00690bf0 (инструкция записи 0x0069bd68).

    ↩↩

    • fw-tv188b-261021-0117-r25--plugin-loader.c059 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 после ENTER на kb11_other.zip в файловом браузере lead не увидел изменения экрана или диалога, а проверка установки показала отсутствие каталога kb_probe11z; архив был копией dune_plugin_kb_probe11z.zip.
    • fw-tv188b-261021-0117-r25--plugin-loader.c064 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 файл kb11_other.zip показан в файловом браузере со значком «?» (неизвестный тип), тогда как рядом лежащие dune_plugin_*.zip — со значком файла.
    • doc-sdk-plugins.c017 · doc · any-documented; прошивка — · Плагин устанавливается запуском файла dune_plugin*.zip с любого носителя (например, USB-флешки) и ставится во флеш-память устройства

    ↩

    • fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c081 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 повторный запуск точки входа до срока из /tmp/plugin_updater_.txt не обращается к источнику обновления: в shell.log «[plugin_updater] remote check skipped by timeout», GET update_info.xml нет.
    • fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c080 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после удалённой проверки обновления на запуске (schema 2) /tmp/plugin_updater_.txt содержит время проверки + next_check_update_timeout из update_info.xml (20), а не + check_update/timeout манифеста (3600): проверка в 1793207761 записала 1793207781, проверка в 1793207784 — 1793207804.

    ↩

    • fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c044 · code · tv188b, android-atv; прошивка 260724_0207_r24 · В APK r24 разбор манифеста читает check_update/schema (по умолчанию 0); schema больше 3 отключает проверку обновлений; check_update/timeout по умолчанию 0x15180 = 86400 с, отрицательный заменяется на 86400
    • fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c045 · code · tv188b, android-atv; прошивка 260724_0207_r24 · В APK r24 check_update/url читается только для schema 1 и 2 (при schema 0 и 3 — нет); для schema 1–2 без url или с пустым url проверка отключается сообщением «invalid or missing 'check_update/check_update_url'»

    ↩

    • fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c014 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 при ошибке проверки обновления в fcn.002635b0, если check_update/schema отличается от 3 и check_update/required=yes, выставляется выходной флаг запрета запуска (6-й аргумент = 1); при required=no эта ветка запрета пропускается.
    • fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c077 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 при проверке обновления при запуске (fcn.002635b0) отказ от критического обновления на шаге подтверждения («critical update cancelled, access denied») и неудачная установка критического («critical update failed, access denied») удаляют /tmp/plugin_updater_.txt и запрещают запуск (флаг access denied); отказ от некритического ничего не удаляет и запуск продолжается

    ↩

    • fw-tv188b-261021-0117-r25.c082 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 global_action install не выполняется, если плагин положен в $FS_PREFIX/flashdata/plugins через adb push и приложение перезапущено: маркеров install от kb_probe5 и kb_probe6_sup нет, тогда как boot, boot_end и gui_start kb_probe5 выполнились.
    • fw-tv188b-261021-0117-r25.c083 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 global_action update не выполняется, если version_index в dune_plugin.xml изменён на месте (1 → 2) и приложение перезапущено через am force-stop, хотя оболочка регистрирует плагин с version_index 2 и заново запускает movie_suppliers_update.sh.

    ↩

  146. fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c085 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 после «Напомнить позже» оболочка запускает исходную точку входа установленной старой версии, а срок следующей проверки остаётся прежним — время проверки + next_check_update_timeout (20 с): запуск через 38 с снова загрузил update info и снова показал диалог обновления. ↩

  147. fw-tv188b-261021-0117-r25.c224 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 при загрузке плагинов shell.log содержит «plugin D: (dunemdb_supplier_youtube) prefer_new_builtin (41 vs 34)» и сразу за ним «[populate_plugins] dup dunemdb_supplier_youtube: replacing»; version_index копии в $FS_PREFIX/firmware_ext/plugins — 41, в $FS_PREFIX/flashdata/plugins — 34. ↩

  148. fw-tv188b-261021-0117-r25--builtin-plugins-misc.c036 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Удаление в dunestore — только ActionFactory::launch_media_url('plugin_uninstaller://') для каждого выбранного плагина, сцепленное в обратном порядке и завершающееся действием apply_install с install=false; собственного удаления каталогов или данных плагина в PHP нет. ↩

  149. plg-dc-globaltv.c029 · code · unknown; прошивка — · При установке в стране CN плагин, если установлен tv_app_supplier_globaltv, удаляет его (и сам globaltv) действиями launch_media_url с URL plugin_uninstaller://<имя>. ↩

  150. fw-tv188b-261021-0117-r25--plugin-loader.c055 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 plugin_uninstaller://kb_probe11z по IP Control вызвал uninstall через sh bin/ga.sh uninstall; оболочка записала uninstall action finished with status 0. ↩

  151. fw-tv188b-261021-0117-r25--plugin-loader.c056 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 после plugin_uninstaller://kb_probe11z ls показал No such file or directory для каталогов plugins/kb_probe11z, plugins_data/kb_probe11z, plugins_archive/kb_probe11z и /tmp/plugins/kb_probe11z; перед удалением эти каталоги существовали. ↩

  152. fw-tv188b-261021-0117-r25--plugin-loader.c063 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 при проверке экрана после завершения удаления plugin_uninstaller://kb_probe11z по IP Control диалога не было: ничего не спрашивалось, кнопки не нажимались. ↩

  153. doc-sdk-plugins.c020 · doc · any-documented; прошивка — · Все установленные плагины перечислены в меню «Setup / Misc / Plugins», где вручную установленные можно удалить (ENTER → Delete) ↩

  154. doc-sdk-plugins.c143 · doc · any-documented; прошивка — · Global plugin actions поддерживают системные события boot, install, update и uninstall ↩

  155. plg-dc-widget-ext.c006 · code · unknown; прошивка — · global_actions/uninstall вызывает bin/uninstall.sh без «&», в отличие от остальных global_actions ↩

  156. fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c074 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 при замене пакета вызов nav_plugin_delete_plugin_data(…, 1) не удаляет каталоги данных /config/plugins_data/ и <хранилище>/plugins_data/, а также /config/_plugin_cookies.properties: удаление соответствующих полей +0x10 и +0x18 и вызов fcn.0027ee94 с FS_unlink находятся только в ветке флага 0. ↩

    • doc-sdk-plugins.c016 · doc · any-documented; прошивка — · Установщик плагина — ZIP-архив с файлом dune_plugin.xml на верхнем уровне и прочими файлами плагина
    • fw-tv188b-260827-0003-r24--plugin-loader.c007 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит путь-шаблон «%s/dune_plugin.xml» и сообщения об отсутствующем и неразбираемом манифесте (ключи plugin_installer_error_missing_manifest, plugin_installer_error_invalid_manifest)

    ↩

    • doc-sdk-plugins.c026 · doc · any-documented; прошивка — · PHP-плагин обязан содержать PHP-программу с функцией hd_create_plugin(); путь к ней задаётся в dune_plugin.xml
    • fw-tv188b-261021-0117-r25.c372 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 PHP-зонды kb_probe5 и kb_probe10 работали без hd_create_plugin(): их main.php объявляет класс, унаследованный от DunePluginFw, и handle_user_input выполнялся.

    ↩

  157. fw-tv188b-261021-0117-r25.c221 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 плагин с type plain без params/program (зонды-поставщики kb_probe5_sup и kb_probe6_sup: в каталоге только dune_plugin.xml и bin/) регистрируется; его запись в /tmp/run/installed_plugins.xml — launch_capable 0 и movie_suppliers со значением params/movie_suppliers. ↩

    • fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c059 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 разбор schema 1 (fcn.002c5968) считает обновление доступным, только если version_index из update.txt больше установленного (иначе результат «нет обновления», download_url и space_needed не проверяются); обновление критическое, если last_critical_version_index ≥ 1 и установленный version_index меньше него
    • fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c064 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 у plugin_version_descriptor (fcn.002c5ef4) дочерние элементы require — пары «имя единицы версии → шаблон» (текст обязателен: «require '%s': text content is expected»), required_firmware_features — список, разбитый str_next_token; дескриптор проходит, только если каждая единица найдена (иначе «required version unit '%s' not found»), её шаблон совпал (fcn.0017228c, «match<%s> … => YES/NO») и каждая функция есть (has_firmware_feature); из прошедших берётся наибольший version_index, «newer» — больше установленного

    ↩

    • doc-sdk-plugins.c017 · doc · any-documented; прошивка — · Плагин устанавливается запуском файла dune_plugin*.zip с любого носителя (например, USB-флешки) и ставится во флеш-память устройства
    • fw-tv188b-261021-0117-r25.c219 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 dune_plugin_kb_probe5_plat.zip, запущенный в файловом браузере плеера из /sdcard/DuneHD, установлен в /data/data/com.dunehd.app/flashdata/plugins/kb_probe5_plat; после установки есть также каталоги /data/data/com.dunehd.app/flashdata/plugins_archive/kb_probe5_plat, …/flashdata/plugins_data/kb_probe5_plat и /tmp/plugins/kb_probe5_plat.
    • fw-tv188b-261021-0117-r25--plugin-loader.c059 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 после ENTER на kb11_other.zip в файловом браузере lead не увидел изменения экрана или диалога, а проверка установки показала отсутствие каталога kb_probe11z; архив был копией dune_plugin_kb_probe11z.zip.

    ↩

    • fw-tv188b-261021-0117-r25--plugin-loader.c037 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 ZIP dune_plugin_kb_probe5_plat.zip без dune_plugin.sign и dune_plugin_signer_id.txt установлен штатно в /flashdata/plugins/kb_probe5_plat (в логе; фактически /data/data/com.dunehd.app/flashdata/plugins/kb_probe5_plat) и зарегистрирован как Plugin 'kb_probe5_plat' of type 'plain'.
    • fw-tv188b-261021-0117-r25--plugin-loader.c046 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 на tv188b r25 штатный установщик принял dune_plugin_kb_probe11z.zip без dune_plugin.sign и dune_plugin_signer_id.txt и зарегистрировал kb_probe11z как php.
    • fw-tv188b-261021-0117-r25--plugin-loader.c066 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В populate_plugins (0x00215450) r25 после разбора манифеста plugin_signer (0x002aa204) вызывается только если properties_get_bool(<свойства плагина>, "strict_verify_needed", 0) истинно; при ложном значении плагин регистрируется без вызова plugin_signer.
    • fw-tv188b-261021-0117-r25--plugin-loader.c082 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В режиме external_plugins_enabled=signed FUN_00215e08 r25 вызывает plugin_signer (0x002aa204) для переданных имени и каталога плагина с третьим аргументом 0; при результате 0 пытается создать <каталог>/.bad_signature, пишет «[plugin] %s: marked as bad» и возвращает 0.
    • fw-tv188b-261021-0117-r25--plugin-loader.c087 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 (один прогон) сторонний kb_probe13n с тем же испорченным dune_plugin.sign, но без strict_verify_needed, зарегистрирован без строк plugin_signer, есть в installed_plugins.xml, и его точка входа KB13N dlg вызвала handle_user_input(dlg).
    • fw-tv188b-261021-0117-r25--plugin-loader.c086 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 (один прогон) сторонний kb_probe13v с yes в params и испорченным dune_plugin.sign не зарегистрирован: plugin_signer остановился на «the required signer_id is missing», populate_plugins — «signature verification failed for 'kb_probe13v', but required»; в installed_plugins.xml его нет.
    • doc-sdk-plugins.c115 · doc · any-documented; прошивка — · Встроенные в розничную прошивку и распространяемые через Dune Store плагины подписаны Dune HD; подписанный плагин содержит dune_plugin.sign и dune_plugin_signer_id.txt
    • fw-tv188b-260827-0003-r24--plugin-loader.c050 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит строки [plugin_signer]: файлы dune_plugin.sign и dune_plugin_signer_id.txt, signer_id com.dune-hd, ключ /firmware/config/plugin_key.pem или /config/plugin_key.pem, DSA-проверку

    ↩

    • fw-tv188b-261021-0117-r25.c219 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 dune_plugin_kb_probe5_plat.zip, запущенный в файловом браузере плеера из /sdcard/DuneHD, установлен в /data/data/com.dunehd.app/flashdata/plugins/kb_probe5_plat; после установки есть также каталоги /data/data/com.dunehd.app/flashdata/plugins_archive/kb_probe5_plat, …/flashdata/plugins_data/kb_probe5_plat и /tmp/plugins/kb_probe5_plat.
    • doc-sdk-plugins.c017 · doc · any-documented; прошивка — · Плагин устанавливается запуском файла dune_plugin*.zip с любого носителя (например, USB-флешки) и ставится во флеш-память устройства

    ↩

    • plg-hdtv-duneplexcatalog.c074 · code · unknown; прошивка — · Пакет распространялся ссылкой Dropbox в посте p325463, а не через check_update: в dune_plugin.xml нет элемента check_update, version_index и global_actions.
    • plg-hdtv-update-bootstrap.c029 · forum · unknown; прошивка — · Автор liteIPTV в первом посте пишет, что приложенная версия обновится до последней актуальной.

    ↩

    • fw-tv188b-261021-0117-r25--shell-ext--search-tv.c026 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ensure_tv_app_installed r25 для type=plugin: если плагин уже установлен и force_check_update — запускает plugin_installer://:::schema=update (при need_launch с launch после), иначе если не установлен — требует update_url и запускает plugin_installer://:::schema=2&name=&need_confirm_replace=0&close_on_success=1 с необязательным signer_id (при need_launch с launch после).
    • plg-hdtv-youtube.c090 · code · unknown; прошивка — · При control_id=installPlug экран настроек YouTube возвращает launch_media_url с plugin_installer://http://dune-club.info/plugins/update/Codec_install/dune_plugin_Codec_install.tar.gz:::name=Codec_install&space_needed=2000000&need_confirm_replace=0 и post_action launch_media_url('plugin_launcher://Codec_install').
    • fw-tv188b-261021-0117-r25--plugin-loader.c053 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 IP Control launch_media_url с plugin_installer://HTTP-URL:::schema=zip&name=kb_probe11z&need_confirm_replace=0&close_on_success=1 заменил уже установленный kb_probe11z и зарегистрировал его как php.

    ↩

    • fw-tv188b-261021-0117-r25--builtin-plugins-misc.c027 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · DuneStoreModel задаёт каталог http://online.dune-hd.com/dune_store/v1/catalog.xml, префикс иконок http://online.dune-hd.com/dune_store/v1/ и загрузок http://files3.dune-hd.com/dune_store/v1/; community-каталог http://dune-club.info/plugins/update/community_catalog.xml, префиксы иконок и загрузок community — http://dune-club.info/plugins/update/; файл установленных плагинов /tmp/run/installed_plugins.xml; конфиг меню /firmware/config/menu_config.xml.
    • fw-tv188b-261021-0117-r25--builtin-plugins-misc.c044 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Плагин попадает в каталог dunestore, только если он не отключён через dsconfig и не отключён plugin_is_disabled_by_special_conditions; при совпадении имени в разных источниках берётся первый, дубль пропускается с предупреждением «plugin ... declared in different sources». Плагин стандартного источника (signer_id com.dune-hd) дополнительно попадает в каталог, только если его имя перечислено в категории plugins этого каталога и он не скрыт plugin_is_hidden_by_box_type.

    ↩

    • fw-tv188b-261021-0117-r25--builtin-plugins-misc.c027 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · DuneStoreModel задаёт каталог http://online.dune-hd.com/dune_store/v1/catalog.xml, префикс иконок http://online.dune-hd.com/dune_store/v1/ и загрузок http://files3.dune-hd.com/dune_store/v1/; community-каталог http://dune-club.info/plugins/update/community_catalog.xml, префиксы иконок и загрузок community — http://dune-club.info/plugins/update/; файл установленных плагинов /tmp/run/installed_plugins.xml; конфиг меню /firmware/config/menu_config.xml.
    • fw-tv188b-261021-0117-r25--builtin-plugins-misc.c037 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · DuneStorePluginScreen для установленного плагина показывает «Обновить», только если плагин не launch_capable и installed version_index < доступного, иначе «Запустить»; справа всегда «Удалить». Для неустановленного — «Установить»; для community-плагина установка сначала показывает диалог подтверждения и продолжается действием confirmed_install. Установка/обновление строит plugin_installer URL (update_url → schema 1/2, иначе download_url с space_needed), добавляет need_confirm_replace=0 и signer_id (если задан); удаление — plugin_uninstaller://; после действия refresh перечитывает installed_plugins.xml и инвалидирует списки.

    ↩

    • fw-tv188b-261021-0117-r25--builtin-plugins-misc.c028 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В обычном режиме источники каталога dunestore: /config/dsconfig.xml, иначе /firmware/config/dsconfig.xml; без файла, при ошибке разбора или без элемента sources используются standard_source и community_source. В sources допустимы standard_source, community_source и source (обязателен непустой catalog_url с «/»; signer_id; icon_url_prefix и download_url_prefix по умолчанию — каталог catalog_url; community=yes); неизвестный элемент и source без непустого catalog_url, содержащего «/», пропускаются.
    • doc-sdk-dune-store.c048 · doc · any-documented; прошивка — · Чтобы применить кастомную конфигурацию Dune Store, прошивка должна включать файл dsconfig.xml (описание — в документе Custom firmware images).

    ↩

    • fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c065 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 фоновая автопроверка (fcn.00299d58) берёт плагины со schema 1 или 2 (0 и 3 пропускаются), у которых check_update/auto = yes или имя есть в списке; список читается один раз за процесс: /config/auto_updating_plugins.txt, а если его нет — /firmware/config/auto_updating_plugins.txt, по имени на строку (str_strip, is_valid_plugin_name_seg); перед каждой попыткой /tmp/plugin_updater_.txt удаляется; итераций 5, при принудительной проверке (аргумент 1) — 3
    • fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c025 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 лог /tmp/run/plugin_online_upgrade.log: grand-child процесс по очереди проверяет 9 плагинов — «Checking updates for plugin X», «autocheck of X: iteration 1/5, attempt 1/5», загрузка update info «with timeout 5», итог «plugin X is up-to-date»

    ↩

  158. fw-tv188b-260827-0003-r24--plugin-loader.c085 · doc · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Подпись плагина хранится в файле dune_plugin.sign, signer ID — в dune_plugin_signer_id.txt; оба имени есть в strings r24 ↩

  159. fw-tv188b-260827-0003-r24--plugin-loader.c053 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Файл dune_plugin_signer_id.txt встроенного shell_ext содержит com.dune-hd (без перевода строки) ↩

  160. fw-tv188b-260827-0003-r24--plugin-loader.c021 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит пути /config/plugin_config.xml и /firmware/config/plugin_config.xml, функцию parse_plugin_config() и имена allow_install, signed, allow_delete, allow_replace, same_signer_id, default_embedded, default_external ↩

    • fw-tv188b-260827-0003-r24--plugin-loader.c013 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит строки «strict_verify_needed» и «[populate_plugins] ERROR: signature verification failed for '%s', but required»
    • plg-ds-dune-hd-tv.c003 · code · unknown; прошивка — · Тип плагина — php, программа i24h.php; в params заданы strict_verify_needed = yes и pf_allowed = yes.

    ↩

  161. fw-tv188b-260827-0003-r24--plugin-loader.c011 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит путь-шаблон «%s/.bad_signature» и сообщение «[populate_plugins] %s: bad_signature flag is set» ↩

  162. fw-tv188b-260827-0003-r24--plugin-loader.c015 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит сообщения «[populate_plugins] plugin %s is not permitted» и «[plugin] %s: marked as bad» ↩

    • fw-tv188b-261021-0117-r25--plugin-loader.c067 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Если при strict_verify_needed plugin_signer вернул 0, populate_plugins r25 пишет «[populate_plugins] ERROR: signature verification failed for '%s', but required» и не регистрирует плагин (переход к освобождению описателя, минуя регистрацию).
    • fw-tv188b-261021-0117-r25--plugin-loader.c086 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 (один прогон) сторонний kb_probe13v с yes в params и испорченным dune_plugin.sign не зарегистрирован: plugin_signer остановился на «the required signer_id is missing», populate_plugins — «signature verification failed for 'kb_probe13v', but required»; в installed_plugins.xml его нет.

    ↩

    • fw-tv188b-261021-0117-r25--plugin-loader.c070 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · plugin_signer (0x002aa204) r25 читает signer_id из файла dune_plugin_signer_id.txt в каталоге плагина (FUN_002aa164); если его нет — «[plugin_signer] %s: the required signer_id is missing» и результат 0; если третий аргумент задан и не равен signer_id — «invalid signer_id: requied(%s) != actual(%s)» и 0 (populate_plugins передаёт 0, т. е. без требуемого signer_id).
    • fw-tv188b-261021-0117-r25--plugin-loader.c086 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 13 (один прогон) сторонний kb_probe13v с yes в params и испорченным dune_plugin.sign не зарегистрирован: plugin_signer остановился на «the required signer_id is missing», populate_plugins — «signature verification failed for 'kb_probe13v', but required»; в installed_plugins.xml его нет.

    ↩

    • fw-tv188b-261021-0117-r25--plugin-loader.c075 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · plugin_signer r25 проверяет подпись signer_id «com.dune-hd» встроенным в libduneshell.so ключом (dsa_sign_verify_dsa_signature с константами DAT_00e8e8c8…); другой signer_id принимается, только если равен get_customer_id(), и тогда ключ берётся из /config/plugin_key.pem, а без него — из /firmware/config/plugin_key.pem; иначе «unsupported signer_id» или «plugin_key.pem not found» и 0. Итог пишется «DSA verification for signer_id %s: OK|failed».
    • fw-tv188b-261021-0117-r25--plugin-loader.c035 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В shell.log r25 при загрузке плагинов из /flashdata/plugins для dune-hd.tv записаны num_files=224, num_bytes=2701081, digest A8235D91EA8D8DB2E60845D3B2826327CFB300FB и «[plugin_signer] DSA verification for signer_id com.dune-hd: OK».
    • fw-tv188b-261021-0117-r25--plugin-loader.c036 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В shell.log r25 при загрузке плагинов из /firmware_ext/plugins для shell_ext записаны num_files=292, num_bytes=3942977, digest 39A76B386D5C62C25A753DE2E92F5EE4363C2966 и «[plugin_signer] DSA verification for signer_id com.dune-hd: OK».

    ↩

    • fw-tv188b-261021-0117-r25--plugin-loader.c082 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В режиме external_plugins_enabled=signed FUN_00215e08 r25 вызывает plugin_signer (0x002aa204) для переданных имени и каталога плагина с третьим аргументом 0; при результате 0 пытается создать <каталог>/.bad_signature, пишет «[plugin] %s: marked as bad» и возвращает 0.
    • fw-tv188b-261021-0117-r25--plugin-loader.c083 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · FUN_00215e08 r25 возвращает 0 сразу при external_plugins_enabled=none; при режиме 0 возвращает 1 без вызова plugin_signer, при signed с успешным plugin_signer также возвращает 1.

    ↩

  163. fw-tv188b-261021-0117-r25--plugin-loader.c068 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В ветке populate_plugins r25 со вторым аргументом 0 плагин пропускается без загрузки, если в его каталоге есть обычный файл .bad_signature (лог «[populate_plugins] %s: bad_signature flag is set»); в ветке с ненулевым вторым аргументом этот файл не проверяется. ↩↩

    • doc-sdk-dune-custom-firmware.c008 · doc · any-documented; прошивка — · Синтаксис plugin_config.xml: корень plugin_config, раздел plugins с default_external, default_embedded и записями plugin name="..."; действия allow_install (yes|signed|no), allow_delete (yes|no), allow_replace (yes|same_signer_id|no).
    • fw-tv188b-260827-0003-r24--plugin-loader.c021 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · libduneshell.so содержит пути /config/plugin_config.xml и /firmware/config/plugin_config.xml, функцию parse_plugin_config() и имена allow_install, signed, allow_delete, allow_replace, same_signer_id, default_embedded, default_external

    ↩

  164. doc-sdk-dune-custom-firmware.c016 · doc · any-documented; прошивка — · В синтаксисе plugin_config.xml документ закрывает элемент plugin тегом , а в примере 3 имя записано как <plugin name="MyPlugin""> — опечатки SDK. ↩

    • doc-sdk-dune-custom-firmware.c001 · doc · any-documented; прошивка — · Параметр external_plugins_enabled в /firmware/config/ro_config.properties задаёт, какие сторонние плагины разрешены; умолчание — all, доступен с прошивок 130803_b8+.
    • doc-sdk-dune-custom-firmware.c002 · doc · any-documented; прошивка — · external_plugins_enabled: all разрешает все сторонние плагины; signed — только подписанные Dune HD, причём signer_id должен быть указан в allowed_plugin_signer_ids, если этот список задан.
    • doc-sdk-dune-custom-firmware.c003 · doc · any-documented; прошивка — · external_plugins_enabled: none запрещает сторонние плагины — доступны только включённые в прошивку, и обновлять их, включая онлайн-обновление, нельзя.

    ↩

  165. doc-sdk-dune-custom-firmware.c004 · doc · any-documented; прошивка — · allowed_plugin_signer_ids задаёт разделённый запятыми список допустимых signer ID; если параметр не задан, разрешены все signer ID; умолчание — не задан, доступен с прошивок 130803_b8+. ↩

    • doc-sdk-dune-custom-firmware.c006 · doc · any-documented; прошивка — · Файл /firmware/config/plugin_config.xml позволяет ограничить действия с отдельными плагинами — указать, какие нельзя устанавливать, заменять или удалять; доступен с прошивок 150113_b9+.
    • doc-sdk-dune-custom-firmware.c008 · doc · any-documented; прошивка — · Синтаксис plugin_config.xml: корень plugin_config, раздел plugins с default_external, default_embedded и записями plugin name="..."; действия allow_install (yes|signed|no), allow_delete (yes|no), allow_replace (yes|same_signer_id|no).

    ↩

    • doc-sdk-dune-custom-firmware.c011 · doc · any-documented; прошивка — · default_embedded задаёт умолчания для встроенных плагинов, default_external — для внешних; по умолчанию разрешено всё; секция plugin name="..." перекрывает часть умолчаний для указанного плагина.
    • doc-sdk-dune-custom-firmware.c009 · doc · any-documented; прошивка — · В plugin_config.xml встроенным (embedded) считается плагин, входящий в прошивку (например, есть каталог /firmware_ext/plugins/), остальные — external; заменённый или обновлённый встроенный плагин всё равно считается embedded.

    ↩

  166. doc-sdk-dune-custom-firmware.c010 · doc · any-documented; прошивка — · Термины plugin_config.xml: install — развёртывание нового плагина, replace — любое изменение существующего, кроме update, update — вызов механизма онлайн-обновления. ↩

    • doc-sdk-dune-custom-firmware.c012 · doc · any-documented; прошивка — · allow_install = yes|signed|no определяет, разрешена ли установка новых внешних плагинов; значение signed — только подписанных.
    • doc-sdk-dune-custom-firmware.c013 · doc · any-documented; прошивка — · allow_delete = yes|no определяет, разрешено ли удаление плагина.

    ↩

    • doc-sdk-dune-custom-firmware.c014 · doc · any-documented; прошивка — · allow_replace = yes|same_signer_id|no определяет, разрешена ли замена; same_signer_id: если прежний плагин подписан — новый должен быть подписан тем же signer ID, если не подписан — новый может быть неподписан или подписан любым signer ID.
    • doc-sdk-dune-custom-firmware.c015 · doc · any-documented; прошивка — · allow_replace не влияет на онлайн-обновление: обновление всегда ограничено логикой same_signer_id.

    ↩

  167. fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c035 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Встроенные PHP-плагины r24 формируют URL установщика как plugin_installer://<адрес>:::<ключ>=<значение>&… с ключами schema, name, caption, title, need_confirm_replace, close_on_success, signer_id ↩↩

    • fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c075 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 URL установщика plugin_installer://…:::schema=… разбирается так (fcn.0057096c): schema = update — обновление установленного плагина (c076), tgz и zip — прямой пакет, иначе atoi; в fcn.002c7a40 schema < 1 — «schema should be > 0», 1 — нужен name (по нему берётся установленный version_index или −1, update.txt разбирается fcn.002c5968), 2 — update_info.xml разбирается fcn.002c5ef4 без сверки имени с name из URL, а ignore_existing ≠ 0 отключает сравнение с установленной версией; прочие — «schema %d is not supported»
    • fw-tv188b-261021-0117-r25--plugin-loader.c053 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 IP Control launch_media_url с plugin_installer://HTTP-URL:::schema=zip&name=kb_probe11z&need_confirm_replace=0&close_on_success=1 заменил уже установленный kb_probe11z и зарегистрировал его как php.

    ↩

  168. fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c075 · code · android-atv; прошивка 260724_0207_r24 · В APK r24 URL установщика plugin_installer://…:::schema=… разбирается так (fcn.0057096c): schema = update — обновление установленного плагина (c076), tgz и zip — прямой пакет, иначе atoi; в fcn.002c7a40 schema < 1 — «schema should be > 0», 1 — нужен name (по нему берётся установленный version_index или −1, update.txt разбирается fcn.002c5968), 2 — update_info.xml разбирается fcn.002c5ef4 без сверки имени с name из URL, а ignore_existing ≠ 0 отключает сравнение с установленной версией; прочие — «schema %d is not supported» ↩↩

    • fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c035 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Встроенные PHP-плагины r24 формируют URL установщика как plugin_installer://<адрес>:::<ключ>=<значение>&… с ключами schema, name, caption, title, need_confirm_replace, close_on_success, signer_id
    • fw-tv188b-261021-0117-r25--builtin-plugins-misc.c035 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Перед установкой dunestore разворачивает required_plugins: неустановленная зависимость ставится через plugin_installer://plugins//update_info.xml:::schema=2&name= (в обычном режиме download_url_prefix — http://files3.dune-hd.com/dune_store/v1/), установленная — через plugin_installer://:::schema=update. Для самого плагина: update_url → schema=1, если адрес оканчивается на .txt или содержит «.txt?», иначе schema=2; без update_url — download_url без schema; при !ext_tv_mode в URL самого плагина и неустановленной зависимости добавляется &caption=; затем добавляются need_confirm_replace=0, close_on_success=1 и signer_id (если задан), и URL отдаётся ActionFactory::launch_media_url с next_action apply_install.

    ↩

    • fw-tv188b-261021-0117-r25--builtin-plugins-misc.c035 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Перед установкой dunestore разворачивает required_plugins: неустановленная зависимость ставится через plugin_installer://plugins//update_info.xml:::schema=2&name= (в обычном режиме download_url_prefix — http://files3.dune-hd.com/dune_store/v1/), установленная — через plugin_installer://:::schema=update. Для самого плагина: update_url → schema=1, если адрес оканчивается на .txt или содержит «.txt?», иначе schema=2; без update_url — download_url без schema; при !ext_tv_mode в URL самого плагина и неустановленной зависимости добавляется &caption=; затем добавляются need_confirm_replace=0, close_on_success=1 и signer_id (если задан), и URL отдаётся ActionFactory::launch_media_url с next_action apply_install.
    • fw-tv188b-261021-0117-r25--shell-ext--search-tv.c026 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ensure_tv_app_installed r25 для type=plugin: если плагин уже установлен и force_check_update — запускает plugin_installer://:::schema=update (при need_launch с launch после), иначе если не установлен — требует update_url и запускает plugin_installer://:::schema=2&name=&need_confirm_replace=0&close_on_success=1 с необязательным signer_id (при need_launch с launch после).

    ↩↩

    • fw-tv188b-261021-0117-r25--builtin-plugins-misc.c037 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · DuneStorePluginScreen для установленного плагина показывает «Обновить», только если плагин не launch_capable и installed version_index < доступного, иначе «Запустить»; справа всегда «Удалить». Для неустановленного — «Установить»; для community-плагина установка сначала показывает диалог подтверждения и продолжается действием confirmed_install. Установка/обновление строит plugin_installer URL (update_url → schema 1/2, иначе download_url с space_needed), добавляет need_confirm_replace=0 и signer_id (если задан); удаление — plugin_uninstaller://; после действия refresh перечитывает installed_plugins.xml и инвалидирует списки.
    • plg-hdtv-youtube.c090 · code · unknown; прошивка — · При control_id=installPlug экран настроек YouTube возвращает launch_media_url с plugin_installer://http://dune-club.info/plugins/update/Codec_install/dune_plugin_Codec_install.tar.gz:::name=Codec_install&space_needed=2000000&need_confirm_replace=0 и post_action launch_media_url('plugin_launcher://Codec_install').

    ↩

  169. fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c036 · code · tv188b, android-dune-fw; прошивка 260827_0003_r24 · dunestore выбирает schema по update_url: адрес, оканчивающийся на .txt или содержащий «.txt?», ставится со schema=1, иначе schema=2; без update_url — plugin_installer://:::name=… без schema ↩

  170. fw-tv188b-261021-0117-r25--builtin-plugins-misc.c031 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Элемент plugins/plugin каталога задаёт name, version_index, version, caption, icon_path, icon_fit_scale_factor (по умолчанию 0.9), badge_icon_url, poster_path, archive_path, update_url, space_needed, short_description, long_description, interface_language, language, country, preferred_language, suggested/language+country, required_plugins, always_install, target_plugin, target_app, target_update_url, strict_country, apk, expr, auto_apply_expr, product, firmware_features; skins/skin — name, caption, icon_path, archive_path, space_needed, short_description. ↩↩

  171. fw-tv188b-261021-0117-r25--builtin-plugins-misc.c030 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Каталог dunestore — XML с categories/category: name, type (categories|plugins|skins), caption_t_key или caption, icon_path, badge_icon_url, icon_margin_left/top/right/bottom, description, skip_if_single; при type=categories подкатегории — список имён, при plugins — список имён плагинов, при skins — список имён скинов. ↩↩

  172. fw-tv188b-261021-0117-r25--builtin-plugins-misc.c029 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Кэш каталога — /cache/.xml плюс .tm (Last-Modified); при наличии кэша и отсутствии интернета используется кэш; иначе при наличии .tm и непустом кэше запрос идёт с If-Modified-Since, если кэш не старше CACHE_EXPIRE_TIMEOUT = 604800 с (иначе заголовок не ставится — полное перечитывание), а 304 — кэш; при отсутствии Last-Modified XML пишется без .tm. ↩

  173. doc-sdk-dune-store.c013 · doc · any-documented; прошивка — · Каталог Dune Store — XML-документ с иерархией catalog/categories/category, catalog/plugins/plugin и catalog/skins/skin. ↩

  174. doc-sdk-dune-store.c003 · doc · any-documented; прошивка — · Каждое приложение в каталоге Dune Store реализовано как Dune-плагин; все приложения сгруппированы по категориям, каждое принадлежит ровно одной категории, а список категорий и их описания определяются каталогом Dune Store. ↩

  175. doc-sdk-dune-store.c031 · doc · any-documented; прошивка — · archive_path задаётся относительно download_url_prefix и ведёт на .tar.gz; содержимое архива совпадает с обычным установочным dune_plugin*.zip; dune_plugin.xml в архиве согласован с каталогом и содержит check_update. ↩

  176. doc-sdk-dune-store.c032 · doc · any-documented; прошивка — · space_needed — размер в байтах, который плагин займёт после установки во flash-память; вычисляется как du -sk /path/to/folder * 1024. ↩

  177. doc-sdk-dune-store.c027 · doc · any-documented; прошивка — · language — список идентификаторов языков через запятую для фильтрации по настройке Interface language (Setup / General); any означает все языки; идентификаторы те же, что в языковых файлах Dune; в документе перечислены 24 идентификатора для прошивки 130515_2104_b6. ↩

  178. doc-sdk-dune-store.c028 · doc · any-documented; прошивка — · country — список стран через запятую, где приложение показывается; в других странах оно не показывается, страна определяется по GeoIP; any означает все страны; идентификаторы — названия стран из базы MaxMind GeoIP. strict_country — то же, но с более строгой проверкой GeoIP. ↩

  179. doc-sdk-dune-store.c029 · doc · any-documented; прошивка — · product — список спецификаций продуктов Dune HD (идентификатор из Setup / Information) или платформ 8644, 8654, 8670, 8672, 8674; для WebKit-браузера указывают 8670, для Opera — 8672,8674, для любого из них — 8670,8672,8674. ↩

    • doc-sdk-dune-store.c022 · doc · any-documented; прошивка — · short_description плагина показывается в правой панели списка приложений и на экране описания; это короткая фраза (несколько слов), рекомендуется с точкой на конце, поддерживает lang.
    • doc-sdk-dune-store.c023 · doc · any-documented; прошивка — · long_description плагина показывается на экране описания; это одно или несколько предложений, переводы строк не допускаются, рекомендуется уместить без прокрутки; поддерживает lang.
    • doc-sdk-dune-store.c024 · doc · any-documented; прошивка — · icon_path плагина — путь относительно icon_url_prefix на PNG; при наличии точек входа рекомендуется совпадение с иконкой главной точки входа из dune_plugin.xml; badge_icon_url — gui_skin:// или http:// URL на PNG.
    • doc-sdk-dune-store.c025 · doc · any-documented; прошивка — · poster_path задаёт постер на экране описания приложения; обрабатывается так же, как icon_path, с теми же требованиями и может совпадать с icon_path.
    • doc-sdk-dune-store.c026 · doc · any-documented; прошивка — · interface_language — список названий языков через запятую и пробел, только для показа в Dune Store; international означает все языки; названия языков задаются по-английски.

    ↩

  180. doc-sdk-dune-store.c042 · doc · any-documented; прошивка — · Файл dsconfig.xml поддерживается начиная с прошивок 130716_b6+. ↩

  181. doc-sdk-dune-store.c039 · doc · any-documented; прошивка — · По умолчанию список источников приложений содержит только стандартный источник, соответствующий стандартному серверу Dune Store; кастомный список может содержать или не содержать стандартный источник и один или несколько своих. ↩

    • doc-sdk-dune-store.c040 · doc · any-documented; прошивка — · В dsconfig.xml источники задаются в dsconfig/sources элементами standard_source и source; для нестандартного источника указывают catalog_url, download_url_prefix и icon_url_prefix, а если префиксы не заданы, они выводятся из catalog_url отбрасыванием имени файла.
    • doc-sdk-dune-store.c041 · doc · any-documented; прошивка — · Если несколько источников описывают один и тот же ресурс (приложение, скин, категорию), приоритет определяется порядком источников в списке: используется описание из первого источника.

    ↩

  182. doc-sdk-dune-store.c043 · doc · any-documented; прошивка — · dsconfig.xml может ограничить список плагинов: enabled_plugins — через запятую имена, плагин не показывается, если его нет в списке; disabled_plugins — через запятую имена, плагин не показывается, если он в списке. ↩

    • doc-sdk-dune-store.c044 · doc · any-documented; прошивка — · enabled_plugins_url и disabled_plugins_url — HTTP-URL файла со списком имён через запятую, который скачивается при каждом входе в Dune Store; если скачать не удалось, Dune Store всегда показывает пустой список плагинов; enabled-вариант скрывает плагин, которого нет в списке, disabled-вариант — плагин, который в списке есть.
    • doc-sdk-dune-store.c046 · doc · any-documented; прошивка — · URL-варианты списка плагинов позволяют менять его на лету, но файлы должны лежать на надёжном сервере: если их не удаётся загрузить, Dune Store становится недоступен; inline-варианты не добавляют HTTP-запросов, но их труднее обновлять.
    • doc-sdk-dune-store.c045 · doc · any-documented; прошивка — · В dsconfig.xml должно присутствовать не более одного из параметров enabled_plugins, disabled_plugins, enabled_plugins_url, disabled_plugins_url; если задано несколько, используется только один, остальные игнорируются.

    ↩

  183. doc-sdk-plugins.c109 · doc · any-documented; прошивка — · check_update/auto включает фоновую автопроверку обновлений (по умолчанию выключена), доступно с прошивки 150430_r10 ↩

  184. doc-sdk-plugins.c132 · doc · sigma-smp86xx, sigma-smp87xx; прошивка — · Платформенные файлы для SMP87xx (ARM) кладутся в .platform.87xx/ в корне плагина; основная копия (bin/, www/cgi-bin/) — для SMP86xx (MIPS) ↩

  185. thr-mydune-108.c011 · forum · hdtv_301, unknown; прошивка 150721_0136_B9 · В прошивке Dune 301 предустановленные плагины лежат в firmware_ext, и их можно удалить, модифицировав прошивку ↩

  186. plg-gh-kocourkuba-proiptv.c017 · code · unknown; прошивка — · build/make_update.php (кроме отладочной сборки) упаковывает dune_plugin/ в update_proiptv.tar.gz (PharData, GZ) и заполняет в update_proiptv.xml поля plugin_version_descriptor version, version_index, md5 и size архива; шаблон update_proiptv.xml.tpl — dune_plugin_update_info schema 2, url https://iptv.proiptv.info/update/update_proiptv.tar.gz. ↩

  187. plg-gh-kocourkuba-proiptv.c011 · code · unknown; прошивка — · check_update манифеста: schema 2, url https://iptv.proiptv.info/update/update_proiptv.xml, timeout 0, required no, auto false. ↩

  188. plg-upd-descriptors.c021 · code · unknown; прошивка — · Все 23 download_url schema 1 — http:// (не https) и ведут на пять хостов: dune-club.info (18), ott-play.com (2), iptv.moi-dom.tv, ddaaff.mydune.ru и app.xsmart.tv (по 1). ↩

  189. plg-hdtv-update-bootstrap.c019 · code · unknown; прошивка — · Все 43 адреса обновлений начинаются с http://; ни один не использует https. ↩

    • plg-dc-screenshoter.c007 · code · unknown; прошивка — · Блок check_update задаёт schema = 1
    • plg-dc-screenshoter.c008 · code · unknown; прошивка — · Адрес проверки обновлений check_update/url — http://dune-club.info/plugins/update/Screenshoter/update.txt

    ↩

  190. plg-dc-screenshoter.c042 · code · unknown; прошивка — · Кнопка whats_new загружает http://dune-club.info/plugins/update//info.txt и показывает текст в диалоге ↩

  191. plg-upd-descriptors.c020 · code · unknown; прошивка — · В schema 2 url пакета ведёт на files7.dune-hd.com у amediateka, dune-hd.tv, dunemdb_supplier_generic и first_muz_ru и на dune-club.info у globaltv и dunemdb_supplier_movies_rus; у globaltv адрес https, у остальных пяти — http. ↩

  192. plg-hdtv-update-bootstrap.c021 · code · unknown; прошивка — · В 37 из 43 пакетов ровно три файла — dune_plugin.xml, один PHP и один значок; у liteiptv четыре файла (два значка), ещё у edem, glanz, ilook, itv и smile — три файла и icons/Thumbs.db. ↩

  193. plg-hdtv-update-bootstrap.c040 · code · unknown; прошивка — · У всех 41 дескриптора version_index больше, чем version_index манифеста того же плагина: у 39 манифестов 0, у shura 5, у ottclub 7, а минимальный version_index дескриптора — 1 (great). ↩

  194. plg-hdtv-update-bootstrap.c029 · forum · unknown; прошивка — · Автор liteIPTV в первом посте пишет, что приложенная версия обновится до последней актуальной. ↩

  195. plg-dc-globaltv.c026 · code · unknown; прошивка — · Пакет содержит файл подписи dune_plugin.sign (бинарный, 48 байт) и dune_plugin_signer_id.txt со значением com.dune-hd. ↩

  196. plg-dc-globaltv.c023 · code · unknown; прошивка — · dune_plugin_metadata.xml помечает плагин как community_plugin = yes и secure_update = yes. ↩

  197. plg-dc-dunemdb-supplier-online-movies.c017 · code · unknown; прошивка — · Метаданные требуют firmware feature dunemdb_supplier_plugin_api_v6 и помечают плагин как community_extension и signed_community. ↩

  198. plg-dc-dunemdb-supplier-online-movies.c020 · code · unknown; прошивка — · В commit.txt пакета записан хеш 25042e182f8a6ecb0547d7a1df4a091b6d888ef5, идентификатор подписанта — com.dune-hd. ↩

  199. plg-dc-globaltv.c016 · code · unknown; прошивка — · Параметры check_update: timeout 86400, required no, auto yes, dont_ask_confirmations yes. ↩

  200. plg-hdtv-youtube.c091 · code · android; прошивка — · При control_id=installPlug и HD::is_android() == true экран настроек YouTube подставляет plugin_installer:// для http://dune-club.info/plugins/update/ffmpeg_install/dune_plugin_ffmpeg_install.tar.gz (name=ffmpeg_install) и post_action reset_controls вместо запуска плагина. ↩

  201. plg-dc-entware.c044 · code · unknown; прошивка — · Если /tmp/run/installed_plugins.xml не содержит rem_tor, экран transmission предлагает установить RemTor через plugin_installer://http://dune-club.info/plugins/update/_other/RemTor/rem_tor.tar.gz с name=rem_tor, space_needed=1009680 и need_confirm_replace=0; если содержит — открывает plugin_launcher://rem_tor. ↩

  202. plg-gh-mdpuma-dune-plugin-altiptv.c081 · code · unknown; прошивка — · Обработчик do_new_install возвращает launch_media_url с plugin_installer:// для Codec_install_v4.0.3.tar.gz и callback refresh. ↩

  203. doc-sdk-plugins.c026 · doc · any-documented; прошивка — · PHP-плагин обязан содержать PHP-программу с функцией hd_create_plugin(); путь к ней задаётся в dune_plugin.xml ↩

  204. fw-tv188b-261021-0117-r25.c372 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 PHP-зонды kb_probe5 и kb_probe10 работали без hd_create_plugin(): их main.php объявляет класс, унаследованный от DunePluginFw, и handle_user_input выполнялся. ↩

  205. doc-sdk-plugins.c140 · doc · android; прошивка — · В SDK для Android приведены команды развёртывания плагина: adb push в /flashdata/plugins/ и chmod -R +x для bin и www/cgi-bin внутри каталога плагина. ↩

  206. fw-tv188b-261021-0117-r25.c207 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 в корне ФС каталога /flashdata нет, а оболочка в shell.log называет каталог плагинов /flashdata/plugins («Loading plugins from '/flashdata/plugins'», «invalid plugin manifest from '/flashdata/plugins/kb_probe5_badname/dune_plugin.xml'», «copying recursively '/tmp/plugin_tmp' to '/flashdata/plugins/kb_probe5_plat'»); файлы этих плагинов лежат в /data/data/com.dunehd.app/flashdata/plugins. ↩

  207. fw-tv188b-261021-0117-r25.c203 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 каталоги плагинов, положенные adb push в /data/data/com.dunehd.app/flashdata/plugins, не подхватились перечитыванием по IP Control (cmd=main_screen, затем cmd=ir_code&ir_code=B24DBF00; обе команды ответили command_status ok): в shell.log после них нет ни строк kb_probe5, ни «Loading plugins from», ни populate_plugins, а kb_probe5 нет в /tmp/run/installed_plugins.xml. kb_probe5 и kb_probe5_sup зарегистрировались после am force-stop com.dunehd.app. ↩↩

  208. fw-tv188b-261021-0117-r25.c204 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 (collect6) плагины, удалённые rm -rf из /data/data/com.dunehd.app/flashdata/plugins, после перечитывания по IP Control (cmd=main_screen + cmd=ir_code&ir_code=B24DBF00) остались в /tmp/run/installed_plugins.xml (grep -c kb_probe6 = 4) и в меню «Приложения»; исчезли они только после am force-stop com.dunehd.app. ↩

  209. fw-tv188b-261021-0117-r25.c205 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 (collect5) после rm -rf каталогов зондов kb_probe5* из /data/data/com.dunehd.app/flashdata/plugins и перечитывания по IP Control (cmd=main_screen + cmd=ir_code&ir_code=B24DBF00) в /tmp/run/installed_plugins.xml не было ни одной строки с kb_probe5 (grep -c = 0). ↩

  210. doc-sdk-plugins.c137 · doc · android; прошивка — · Текст документа буквально говорит: при установке на Android содержимое .platform.android удаляется, а содержимое .platform.87xx переносится в корень ↩

  211. doc-sdk-dune-store.c016 · doc · any-documented; прошивка — · type категории в документе принимает только значения plugins или skins. ↩

  212. doc-sdk-dune-store.c019 · doc · any-documented; прошивка — · Документ описывает элемент catalog/plugins/plugin полями name, caption, short_description, long_description, icon_path, badge_icon_url, poster_path, interface_language, language, country, strict_country, product, version_index, version, archive_path, space_needed. ↩

  213. doc-sdk-dune-store.c010 · doc · any-documented; прошивка — · Файлы плагинов и скинов скачиваются, когда приложение Dune Store просит STB запустить установку; URL строится из содержимого каталога и download URL prefix; стандартный префикс — http://online.dune-hd.com/dune_store/v1/ (примеры .../plugins/plugin_name/1.tgz и .../skins/Black/dune_skin_black.zip), кастомная прошивка может задать другой. ↩

    • doc-sdk-dune-custom-firmware.c004 · doc · any-documented; прошивка — · allowed_plugin_signer_ids задаёт разделённый запятыми список допустимых signer ID; если параметр не задан, разрешены все signer ID; умолчание — не задан, доступен с прошивок 130803_b8+.
    • fw-tv188b-260827-0003-r24--plugin-loader.c111 · doc · any-documented; прошивка — · SDK описывает ro_config-параметр allowed_plugin_signer_ids: список разрешённых signer id через запятую; если параметр не задан, разрешены все signer id.

    ↩

  214. fw-tv188b-261021-0117-r25--plugin-loader.c039 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · На tv188b r25 отсутствие dune_plugin.sign и dune_plugin_signer_id.txt не помешало штатной установке и регистрации kb_probe5_plat; это не доказывает, что подпись не проверяется у других плагинов, и не задаёт политику кастомных прошивок. ↩

  215. fw-tv188b-260827-0003-r24--plugin-loader.c114 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 без plugin_config.xml плагины без dune_plugin_signer_id.txt загружались; это согласуется с SDK (external_plugins_enabled по умолчанию all), но обобщение «подпись не нужна» верно только для розничной r24 без plugin_config.xml и не проверено на других моделях, кастомных прошивках и для dune_plugin.sign. ↩

  216. fw-tv188b-261021-0117-r25--plugin-loader.c040 · inference · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Лог r25 показывает DSA-проверку для dune-hd.tv и shell_ext; из него нельзя вывести, проверяются ли остальные плагины и почему выбраны эти два — нужен дизассемблер или эксперимент. ↩

  217. fw-tv188b-261021-0117-r25--plugin-loader.c077 · inference, disputed · tv188b, android-dune-fw; прошивка 261021_0117_r25 · DSA-проверка в логе r25 видна только у dune-hd.tv и shell_ext, вероятно, потому, что populate_plugins вызывает plugin_signer лишь для плагинов с strict_verify_needed=yes в манифеста (у dune-hd.tv флаг есть), а у остальных, включая kb_probe5_plat, флага нет; что свойства puVar3[7] — именно , и что у shell_ext r25 флаг есть, по листингам не видно. ↩

  218. fw-tv188b-261021-0117-r25--plugin-loader.c078 · inference, disputed · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Для стороннего плагина без strict_verify_needed populate_plugins r25 не проверяет dune_plugin.sign при загрузке, и в самой populate_plugins ro_config не читается; поэтому external_plugins_enabled=signed, если действует, должен действовать через фильтр «not permitted», через .bad_signature или в установщике, а не через проверку подписи загрузчиком — какой механизм, не установлено. Это расходится с SDK, по которому подписанный плагин с неверной подписью не используется всегда. ↩

  219. fw-tv188b-260827-0003-r24--plugin-loader.c113 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · По псевдокоду Ghidra ro_config_load_if_needed в libduneutil.so r24 читает external_plugins_enabled и allowed_plugin_signer_ids из /config/ro_config.properties или /firmware/config/ro_config.properties и различает значения signed и none; подтверждающего r2-листинга нет, поэтому это вывод. ↩

    • fw-tv188b-261021-0117-r25--plugin-loader.c079 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · ro_config_load_if_needed r25 сохраняет external_plugins_enabled в ro_config+0x1ec: signed (без учёта регистра) — 1, none — 2, отсутствующее или любое другое значение — 0.
    • fw-tv188b-261021-0117-r25--plugin-loader.c072 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · Поле ro_config по смещению 0x1f0, из которого plugin_signer r25 берёт список допустимых signer_id, заполняется разборщиком ro_config_load_if_needed из свойства allowed_plugin_signer_ids.

    ↩

  220. fw-tv188b-260827-0003-r24--plugin-loader.c071 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Плагин без подписи: по SDK запрет неподписанных плагинов — настройка кастомных (операторских) прошивок; каким механизмом r24 его включает (strict_verify_needed, «signed» в plugin_config.xml), не установлено ↩

    • fw-tv188b-260827-0003-r24--plugin-loader.c108 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 поиск по /system, /vendor и /data/data/com.dunehd.app не нашёл plugin_config.xml; в выводе только 10 файлов dune_plugin_signer_id.txt.
    • fw-tv188b-260827-0003-r24--plugin-loader.c109 · device · tv188b, android-dune-fw; прошивка 260827_0003_r24 · На tv188b r24 в /tmp/run/installed_plugins.xml загружены плагины, для которых поиск не нашёл dune_plugin_signer_id.txt, в том числе melange, play_in_apps, Filmix_api, Screenshoter, VPN и test_php-cgi; наличие dune_plugin.sign у них не проверялось.

    ↩

  221. fw-tv188b-260827-0003-r24--plugin-loader.c042 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Установщик может отказать в установке неподписанного плагина, в замене плагина с другим signer_id и в замене «hard-coded» плагина; что из этого действует по умолчанию (без plugin_config.xml), из строк не следует ↩

  222. fw-tv188b-260827-0003-r24--plugin-loader.c070 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Плагин с подписью, не прошедшей проверку: в r24 при загрузке есть ошибка «signature verification failed … but required» при флаге strict_verify_needed; по SDK подписанный плагин с неверной подписью система не использует вообще — что делает загрузчик r24 без этого флага, не установлено ↩

  223. fw-tv188b-260827-0003-r24--plugin-loader.c012 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Файл-флаг .bad_signature в каталоге плагина помечает плагин как не прошедший проверку подписи, и populate_plugins его пропускает ↩

  224. fw-tv188b-260827-0003-r24--plugin-loader.c075 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · plugin_config.xml задаёт политику для плагинов по имени (элементы с name; allow_install, signed, allow_delete, allow_replace, same_signer_id) с умолчаниями default_embedded и default_external ↩

  225. fw-tv188b-260827-0003-r24--plugin-loader.c076 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Файл /config/plugin_config.xml, вероятно, дополняет или перекрывает /firmware/config/plugin_config.xml; приоритет по строкам не виден ↩

  226. fw-tv188b-260827-0003-r24--plugin-loader.c084 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Подпись плагина считается по DSA по обычным файлам каталога плагина; нерегулярные файлы пропускаются ↩

  227. fw-tv188b-260827-0003-r24--plugin-loader.c086 · inference, disputed · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Загрузчик r24 ищет открытый ключ проверки подписи в /firmware/config/plugin_key.pem и /config/plugin_key.pem; путь /firmware/config совпадает с SDK для кастомного signer ID, роль /config/plugin_key.pem и приоритет не установлены ↩

  228. fw-tv188b-260827-0003-r24--plugin-loader.c087 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Проверка signer_id в r24 сравнивает требуемый signer_id с фактическим и может отклонить signer_id как не разрешённый; это согласуется с SDK (допустимы «com.dune-hd» и customer ID кастомной прошивки); при каком условии выдаётся «unsupported signer_id», не установлено ↩

    • fw-tv188b-261021-0117-r25--plugin-loader.c070 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · plugin_signer (0x002aa204) r25 читает signer_id из файла dune_plugin_signer_id.txt в каталоге плагина (FUN_002aa164); если его нет — «[plugin_signer] %s: the required signer_id is missing» и результат 0; если третий аргумент задан и не равен signer_id — «invalid signer_id: requied(%s) != actual(%s)» и 0 (populate_plugins передаёт 0, т. е. без требуемого signer_id).
    • fw-tv188b-261021-0117-r25--plugin-loader.c071 · code · tv188b, android-dune-fw; прошивка 261021_0117_r25 · plugin_signer r25 проверяет signer_id по списку через запятую (FUN_002a9f64); список берётся из поля ro_config по смещению 0x1f0, а если оно пусто — «com.dune-hd» или «com.dune-hd,»; signer_id не из списка — «[plugin_signer] %s: signer_id '%s' not allowed» и 0.

    ↩

  229. doc-sdk-plugins--gui-actions.c089 · doc, disputed · any-documented; прошивка — · LaunchMediaUrl выбирает установщик, деинсталлятор или запускатель плагинов, если плейлист состоит из одного URL plugin_installer://, plugin_uninstaller:// или plugin_launcher://* соответственно ↩

    • fw-tv188b-261021-0117-r25--plugin-loader.c053 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 IP Control launch_media_url с plugin_installer://HTTP-URL:::schema=zip&name=kb_probe11z&need_confirm_replace=0&close_on_success=1 заменил уже установленный kb_probe11z и зарегистрировал его как php.
    • fw-tv188b-261021-0117-r25--plugin-loader.c055 · device · tv188b, android-dune-fw; прошивка 261021_0117_r25 · В запросе 11 plugin_uninstaller://kb_probe11z по IP Control вызвал uninstall через sh bin/ga.sh uninstall; оболочка записала uninstall action finished with status 0.

    ↩

  230. fw-tv188b-260827-0003-r24--plugin-loader.c096 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Поля data_url, name, caption, space_needed, need_confirm_replace, need_launch, close_on_success, вероятно, — параметры URL plugin_installer:// (в синтаксисе {ключ=значение}, как у plugin_launcher://); точный формат installer-URL в строках не найден ↩

  231. fw-tv188b-260827-0003-r24--plugin-loader.c044 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Пакет плагина для установщика — ZIP-архив: он скачивается по URL во временный каталог как plugin.zip, распаковывается unzip, может сверяться по md5; затем каталог копируется или переименовывается в <хранилище>/plugins/ ↩

  232. fw-tv188b-260827-0003-r24--plugin-loader.c068 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · При разборе манифеста name сравнивается с именем каталога плагина; вероятный этап отказа — populate_plugins (строка 10497 «invalid plugin manifest from …»); отказ установщика не установлен. ↩

  233. fw-tv188b-260827-0003-r24--plugin-loader--online-upgrade.c008 · inference · tv188b, android-dune-fw; прошивка 260827_0003_r24 · Вероятно, require / required_firmware_features в plugin_version_descriptor задают условия на прошивку: дескриптор, не прошедший условия, отсеивается, и из кандидатов остаются «matches»; redirect, вероятно, отсылает к другому update info при совпадении условия ↩

  234. plg-hdtv-update-bootstrap.c022 · inference · unknown; прошивка — · Пакеты 22 каркасов неполные: PHP требует lib/default_dune_plugin_fw.php и starnet_plugin.php, но в пакете только dune_plugin.xml, PHP и значок, каталога lib/ нет; без обновления точка входа не выполнится. ↩

  235. doc-sdk-plugins.c142 · doc, disputed · any-documented; прошивка — · Перечитать плагины без перезапуска оболочки: в верхнем меню нажать ANGLE/ROTATE (или Refresh в POP UP MENU) либо по IP Control: cmd=main_screen, затем cmd=ir_code&ir_code=B24DBF00 ↩