История изменений
Исправление firkax, (текущая версия) :
Я недавно на эту тему что-то создавал, и потом ещё была тема чья-то - прям с точно твоим вопросом.
Нет, нельзя. Заполнение pid в метаданных окна это целиком инициатива приложения, это окно создавшего. В тулкитах там наверно это автоматически реализовано, но никто не мешает это поле не заполнять или вписать туда любые фейковые данные. У xorg есть теоретическая возможность узнать pid инициатора подключения, если он через unix сокет (getsockopt какой-то вроде), но он её не использует (а так же надо понимать что pid инициатиора подключения может отличаться от pid настоящего его пользователя, инициатор подключения может форкнуться потом или послать свой x11-сокет кому-то другому, а сам вообще умереть), да и в x11-протоколе такое всё равно не предусмотрено.
С pid-ом из метаданных окна ещё одна проблема: даже если оно заполнено и процесс не злонамеренный и заполнил его честно - может оказаться что он на другом компе через ssh-туннель и pid опять окажется не тот.
Возможный костыль, который я придумал для своего недоделанного DE, но не реализовал и вообще не уверен что так делать хорошо: каждое приложение, запущеное «официально» через гуи, запускается в прозрачном контейнере (единственная функция которого - прицепить ему некоторый id, от которого оно не сможет избавиться форками), и ему сообщается уникальное XAUTHORITY и/или DISPLAY, на котором сидит x11-прокси и сортирует клиентов (смотрит по каким реквизитам они подключились). После этого у любого окна будет соответствие к id контейнера, через реквизиты которого оно создано. Впрочем, от опасности того что прога поделится с кем-то своим открытым сокетом или реквизитами, это не избавляет.
Исправление firkax, :
Я недавно на эту тему что-то создавал, и потом ещё была тема чья-то - прям с точно твоим вопросом.
Нет, нельзя. Заполнение pid в метаданных окна это целиком инициатива приложения, это окно создавшего. В тулкитах там наверно это автоматически реализовано, но никто не мешает это поле не заполнять или вписать туда любые фейковые данные. У xorg есть теоретическая возможность узнать pid инициатора подключения, если он через unix сокет (getsockopt какой-то вроде), но он её не использует (а так же надо понимать что pid инициатиора подключения может отличаться от pid настоящего его пользователя, инициатор подключения может форкнуться потом или послать свой x11-сокет кому-то другому, а сам вообще умереть), да и в x11-протоколе такое всё равно не предусмотрено.
С pid-ом из метаданных окна ещё одна проблема: даже если оно заполнено и процесс не злонамеренный и заполнил его честно - может оказаться что он на другом компе через ssh-туннель и pid опять окажется не тот.
Возможный костыль, который я придумал для своего недоделанного DE, но не реализовал и вообще не уверен что так делать хорошо: каждое приложение, запущеное «официально» через гуи, запускается в прозрачном контейнере (единственная функция которого - прицепить ему некоторый id, от которого оно не сможет избавиться форками), и ему сообщается уникальное XAUTHORITY и/или DISPLAY, на котором сидит x11-прокси и сортирует клиентов (смотрит по каким реквизитам они подключились). После этого у любого окна будет соответствие к id контейнера, через реквизиты которого оно создано.
Исправление firkax, :
Я недавно на эту тему что-то создавал, и потом ещё была тема чья-то - прям с точно твоим вопросом.
Нет, нельзя. Заполнение pid в метаданных окна это целиком инициатива приложения, это окно создавшего. В тулкитах там наверно это автоматически реализовано, но никто не мешает это поле не заполнять или вписать туда любые фейковые данные. У xorg есть теоретическая возможность узнать pid инициатора подключения, если он через unix сокет (getsockopt какой-то вроде), но он её не использует (а так же надо понимать что pid инициатиора подключения может отличаться от pid настоящего его пользователя, инициатор подключения может форкнуться потом или послать свой x11-сокет кому-то другому, а сам вообще умереть), да и в x11-протоколе такое всё равно не предусмотрено.
С pid-ом из метаданных окна ещё одна проблема: даже если оно заполнено и процесс не злонамеренный и заполнил его честно - может оказаться что он на другом компе через ssh-туннель и pid опять окажется не тот.
Исправление firkax, :
Я недавно на эту тему что-то создавал, и потом ещё была тема чья-то - прям с точно твоим вопросом.
Нет, нельзя. Заполнение pid в метаданных окна это целиком инициатива приложения, это окно создавшего. В тулкитах там наверно это автоматически реализовано, но никто не мешает это поле не заполнять или вписать туда любые фейковые данные. У xorg есть теоретическая возможность узнать pid инициатора подключения, если он через unix сокет (getsockopt какой-то вроде), но он её не использует (а так же надо понимать что pid инициатиора подключения может отличаться от pid настоящего его пользователя, инициатор подключения может форкнуться потом или послать свой x11-сокет кому-то другому, а сам вообще умереть), да и в x11-протоколе такое всё равно не предусмотрено.
Исходная версия firkax, :
Я недавно на эту тему что-то создавал, и потом ещё была тема чья-то - прям с точно твоим вопросом.
Нет, нельзя. Заполнение pid в метаданных окна это целиком инициатива приложения, это окно создавшего. В тулкитах там наверно это автоматически реализовано, но никто не мешает это поле не заполнять или вписать туда любые фейковые данные. У xorg есть теоретическая возможность узнать pid инициатора подключения, если он через unix сокет (getsockopt какой-то вроде), но он её не использует, да и в x11-протоколе такое всё равно не предусмотрено.