Como continuação desta pergunta ( Como posso enviar uma notificação com o polkit 0.106? , descobri que preciso executar notify-send
como o usuário para quem quero enviar uma notificação.
Mas, com a minha configuração atual, não posso fazer isso, porque o polkit executa o script como polkitd
user e não posso fazer su $user
sem a senha do usuário conhecida.
Por esse motivo, preciso criar uma nova ação do polkit, para permitir executar notify-send
como outro usuário do polkitd.
Minha regra de polkit é esta:
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.consolekit.system.stop" ||
action.id == "org.freedesktop.login1.power-off" ||
action.id == "org.freedesktop.login1.power-off-multiple-sessions" ||
action.id == "org.xfce.session.xfsm-shutdown-helper")
{
try{
polkit.spawn(["/usr/bin/pendrive-reminder/check_pendrive.sh", subject.user]);
return polkit.Result.YES;
}catch(error){
polkit.spawn(["/usr/bin/pendrive-reminder/send_notify.sh", subject.user]);
return polkit.Result.NO;
}
}
});
Esta regra do polkit deve bloquear a opção de desligamento no menu de desligamento e mostra uma notificação com notify-send
, com o script send_notify.sh
, que executa isso:
#!/bin/bash
export DISPLAY=":0"
user=$1
pkexec --user $user notify-send "Pendrive Reminder" "Shutdown lock enabled. Disconnect pendrive to enable shutdown" -u critical
exit 0
Eu tentei adicionar este arquivo de políticas do polkit:
<policyconfig>
<action id="org.freedesktop.notify-send">
<description>Launch notify-send command</description>
<defaults>
<allow_any>yes</allow_any>
<allow_inactive>yes</allow_inactive>
<allow_active>yes</allow_active>
</defaults>
<annotate key="org.freedesktop.policykit.exec.path">/usr/bin/notify-send</annotate>
<annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
</action>
</policyconfig>
Eu coloquei este arquivo em /usr/share/polkit-1/actions/org.freedesktop.policykit.notify-send.policy
Mas, depois de colocar o arquivo de políticas em /usr/share/polkit-1/rules.d/
e pressionar o botão de desligamento, o menu de desligamento demorou a ser exibido e a notificação não apareceu. A opção de desligamento está bloqueada corretamente
Como posso obter que o polkit possa chamar o envio de notificação do meu script?