Como permitir a execução de notificação-envio como outro usuário com o pkexec?

2

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?

    
por AlmuHS 25.02.2018 / 20:59

1 resposta

0

Depois de fazer alguns testes, obtive os seguintes resultados:

  • polkitd é um usuário nologin
  • Se eu executar este comando, para executar meu script com o usuário polkitd, será exibido 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, eu acho que o usuário do polkitd é uma conta limitada, que não pode executar comandos como outro usuário

Como conclusão, determinei que essa ação não é possível sem o sistema interno de modificação. Eu não posso permitir isso no meu aplicativo, por isso não posso iniciar comandos como outro usuário do polkit

    
por 27.02.2018 / 08:12