The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"Идентификация через анализ внешних обработчиков протоколов в..."
Отправлено Аноним, 17-Май-21 03:48 
Допустим, ты получил файл в мессенджере и кликнул на него, чтобы открыть. Откуда мессенджеру знать, чем его октрывать?

Он может определить его тип файла разными путями – через libmagic (либа утилиты file – самый кошерный путь, но не подходит для интерпретируемых языков), через kmimetypefinder5 для kde, через gio info / gvfs-info / gnomevfs-info для gnome, через /usr/bin/file --mime-type -b для всего остального. Затем проверить ${XDG_DATA_DIR:-$HOME/.local/share}/applications/mimeinfo.cache и найти там имя desktop-файла, подходящего под полученный mime-type (а если такого файла нет или в нём нет нужного mime-типа, то же самое делается для /usr/share/applications/mimeinfo.cache), затем найти в том же каталоге applications указанный desktop-файл, и лишь потом выполнить указанную в нём команду, чтобы открыть целевой файл.

А теперь представь что любая, каждая программа, умеющая открывать файлы во внешних просмотрщиках, будет велосипедить для этого свой код, просто чтобы узнать, какую программу предпочитает пользователь (или какая установлена дефолтной в системе если пользователь свои преференции не устанавливал). Некоторые браузеры так делают, но это оправданно, ведь у них может быть свой, отдельный от системного список преференций, но даже для него делается fallback на системный дефолт. Это также оправданно для графических файловых менеджеров, ибо это одна из их основных функций, а чаще всего они ещё и позволяют изменить предпочитаемую программу для любого типа файла.

Чтобы не плодить дублирующийся код для всего остального софта, была придумана программа, которая делает всё вышеописанное сама, и которой максимально просто пользоваться из других программ – просто дайте ей путь к файлу (или URI со схемой, которая известна системе), и она его откроет.

Это не какое-то уникальное изобретение FDO (FreeDesktop.Org), который раньше назывался XDG (X Desktop Group). Наоборот, их утилиты xdg-open и xdg-mime являются очень простыми и понятными скриптами на shell (даже не bash), которые как раз-таки в первую очередь ничего сами не делают, а лишь определяют текущее DE и запускают сооответствующую ему утилиту, а именно gio open / gvfs-open / gnome-open, kde-open, mate-open, exo-open (XFCE) и так далее. Если пользователь не использует DE или утилиты недоступны, производится описанная мною выше процедура определения mime-типа файла, определения и поиска связанного с ним desktop-файла, и запуска команды из него. Это всё есть в предельно понятном и читабельном скрипте, почему-то мне не лень было его открыть и пересказать.

Почему этих утилит так много? Так сложилось исторически. Когда-то раньше не существовало общесистемного стандарта ассоциации destkop-файлов и mime-типов, поэтому у каждой DE был свой список преференций/ассоциаций и своя "открывашка". А когда стандарт появился, его не могли в первый же день реализовать все сразу, да и часть DE не спешила его внедрять, т.к. у них уже было своё работающее решение.

Сейчас большинство, если не все, DE при изменении "своих" настроек меняют и общие в mimeinfo.cache. Но судя по логике работы xdg-open, так было далеко не всегда, и, например, могла сложиться следующая ситуация – у пользователя есть валидный mimeinfo.cache, который автоматически сгенерировался, но пользователь сидит на DE, который этот файл игнорирует. Пользователь через настройки DE или из файлового менеджера выставляет свои любимые просмотрщики картинок, документов, любимый плеер и т.д. и ожидает что однажды настроенные ассоциации файлов будут работать всегда везде одинаково. Если бы xdg-open миновал DE-специфичные открывашки и сразу брал "единый" mimeinfo.cache, пользователь получил бы не то что ожидал. Поэтому xdg-open в первую очередь смотрит на наличие DE и по возможности определяет тип и/или открывает файл с помощью его утилиты, а если не получилось, то берёт mimeinfo.cache.

Браузеры и другой софт обычно полагаются на xdg-open когда не знаю чем открыть тот или иной файл, потому что он делает одну простую вещь, и делает её хорошо. Например, именно поэтому Firefox чаще всего не может сообщить в какой программе откроется скачиваемый файл, если выбрать "открыть в системе" вместо "скачать" – даже если ему известен mime-тип скачиваемого файла когда его сообщает сервер, Firefox не берётся определять чем его открыть, а просто берёт утилиту, которая сама всё разрулит, обычно делая это правильно. Проблемы с неправильными ассоциациями бывают если играться с переменной $DESKTOP_SESSION, по которой xdg-open определяет текущее DE, или прыгать с одного DE на другое (или использовать разные их части), т.к. они вполне могут перетирать ассоциации друг друга, чтобы "общий" mimeinfo.cache совпадал с "их" списокм преференций (что и должно происходить при отсутствии конфликтов).

Я не знаю как ещё подробнее это можно объяснить, я уже повторяться начал. Теперь стало понятнее зачем он нужен?

 

Ваше сообщение
Имя*:
EMail:
Для отправки ответов на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
  Введите код, изображенный на картинке: КОД
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру