Como continuação desta pergunta ( Como posso enviar uma notificação com o polkit 0.106? ), descobri que tenho que executar notify-send
como o usuário que desejo enviar a notificação.
Mas, com minha configuração atual, não posso fazer isso, porque o polkit executa o script como polkitd
usuário e não posso ficar su $user
sem a senha do usuário conhecido.
Por esse motivo, preciso criar uma nova ação do polkit, para permitir a execução 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 send_notify.sh
script, que executa isto:
#!/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ítica 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>
coloquei esse arquivo/usr/share/polkit-1/actions/org.freedesktop.policykit.notify-send.policy
Mas, depois de inserir o arquivo de política /usr/share/polkit-1/rules.d/
e pressionar o botão de desligamento, o menu de desligamento demorou muito para ser exibido e a notificação não apareceu. A opção de desligamento está bloqueada corretamente
Como posso fazer com que o polkit possa chamar notify-send do meu script?
Depois de fazer alguns testes, obtive este resultado:
Se eu executar este comando, para executar meu script com o usuário polkitd, apresenta um erro:
sudo su polkitd -s /bin/bash -c aux_scripts/send_notify.sh almu
Error executing command as another user: Not authorized
This incident has been reported.
Então, acho que o usuário polkitd é uma conta limitada, que não pode executar comandos como outro usuário
Como conclusão, determino que esta ação não é possível sem modificar o sistema interno. Não posso permitir isso em meu aplicativo, então não posso iniciar comandos como outro usuário do polkit