Como posso enviar uma notificação com o polkit 0.106?

2

Estou desenvolvendo um aplicativo para não esquecer o pendrive.

Este aplicativo deve bloquear o desligamento se um pendrive estiver conectado à máquina. Como este formulário, se o usuário deseja desligar o sistema enquanto um pendrive está conectado, o sistema mostra uma notificação para alertar sobre ele deve desconectar o pendrive para desbloquear o desligamento.

Para detectar o evento de desligamento, defino uma regra de polkit que chama um script para verificar se algum pendrive está conectado ao sistema.

Se houver algum pendrive conectado, a regra do polkit chama para notificar-enviar através do script send_notify.sh , que executa este comando:

notify-send "Pendrive-Reminder" "Extract Pendrive to enable shutdown" -t 5000

A regra do 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;
     }
   }
  }

Mas. depois de colocar essa regra de polkit e pressionar o botão de desligamento, meu usuário não recebe nenhuma notificação.

Depurei a regra e verifiquei o segundo script. Ele foi executado, mas o notify-send não mostra a notificação para o meu usuário.

Como posso resolver isso?

ATUALIZAÇÃO:

Eu tentei modificar o script desta forma:

#!/bin/bash

user=$1

XAUTHORITY="/home/$user/.Xauthority"
DISPLAY=$( who | grep -m1 $user.*\( | awk '{print $5}' | sed 's/[(|)]//g')

notify-send "Extract Pendrive to enable shutdown" -t 5000

exit 0

O usuário é passado como parâmetro por pòlkit

Mas o problema continua

ATUALIZAÇÃO: Acabei de ver esse bug link que não permite para enviar notificações como root.

Mais tarde, testarei para modificar a alternativa de alteração do usuário

UPDATE2: Depois de alterar o código para isso. o problema continua:

#!/bin/bash

export XAUTHORITY="/home/$user/.Xauthority"
export DISPLAY=$(cat "/tmp/display.$user")

user=$1
su $user -c 'notify-send "Pendrive Reminder" "Shutdown lock enabled. Disconnect pendrive to enable shutdown" -u critical'
    
por AlmuHS 19.02.2018 / 16:30

3 respostas

0

Finalmente, criei um cliente dbus, lançado como usuário, que recebe sinal do systembus e mostra notificação ao usuário.

O código do cliente dbus está no link

No script send-notify.sh , só adicionei

 dbus-send --system /org/preminder/mensaje org.preminder.App

Executando o cliente dbus como usuário, a notificação é mostrada corretamente

Agora estou tentando que o cliente possa ser iniciado automaticamente quando o usuário conectar pendrive

Continue em Como iniciar um cliente dbus de um script?

    
por 24.03.2018 / 00:48
0

polkit (e pkexec ) exclui as variáveis de ambiente DISPLAY e XAUTHORITY que são necessárias para o acesso X. notify-send falha porque não consegue acessar a exibição.

No pkexec manpage :

As a result, pkexec will not allow you to run X11 applications as another user since the $DISPLAY and $XAUTHORITY environment variables are not set. These two variables will be retained if the org.freedesktop.policykit.exec.allow_gui annotation on an action is set to a nonempty value

Eu não estou familiarizado com o polkit; talvez você possa definir org.freedesktop.policykit.exec.allow_gui apenas para essa regra, ou há outras possibilidades. Desculpe por não poder fornecer uma solução pronta.

No entanto, o ponto principal é fornecer DISPLAY e XAUTHORITY para notify-send .

(Não me bata: uma solução suja seria codificar DISPLAY=:0 e XAUTHORITY=... em seu script de notificação. Esteja ciente de que isso pode falhar se algo mudar).

Editar: Baseado na discussão acima, uma solução alternativa que deve funcionar com vários usuários e sem XAUTHORITY :

No login X, um script deve ser executado automaticamente (talvez alguns .desktop setup em ~/.config/autostart ):

#! /bin/bash
# allow polkitd access to X. 
# xhost is an alternative to XAUTHORITY authentication
xhost +SI:localuser:polkitd
# store DISPLAY for each user
echo $DISPLAY > /tmp/display.$USER

No seu script polkit inclua

export DISPLAY=$(cat /tmp/display.$user)
    
por 19.02.2018 / 19:11
0

@mviereck

Eu tentei criar um arquivo de políticas do polkit para notificar-enviar, com este conteúdo

<policyconfig>
<action id="org.freedesktop.notify-send">
<description>Launch notify-send command</description>
<message>Authentication is required to run the gedit</message>
<icon_name>accessories-text-editor</icon_name>
<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>

Eu coloquei este arquivo em /usr/share/polkit-1/actions/org.freedesktop.policykit.notify-send.policy

Mas, depois de pressionar o botão de desligamento, o menu de desligamento demorou a ser exibido e a notificação não apareceu

    
por 25.02.2018 / 20:20