Bug 29224 - sudo for shutdown/reboot/suspend/hibernate
Summary: sudo for shutdown/reboot/suspend/hibernate
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: xfce4-session (show other bugs)
Version: unstable
Hardware: all Linux
: P3 normal
Assignee: Mikhail Efremov
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2013-07-24 13:11 MSK by enp
Modified: 2014-03-20 08:58 MSK (History)
3 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description enp 2013-07-24 13:11:53 MSK
Некоторое время назад shutdown/reboot/suspend/hibernate в XFCE работали посредством следующей конфигурации:

# tail -3 /etc/sudoers
ALL ALL=(ALL) NOPASSWD: /usr/sbin/pm-suspend
ALL ALL=(ALL) NOPASSWD: /usr/sbin/pm-hibernate
ALL ALL=(ALL) NOPASSWD: /sbin/shutdown

Похоже, что уже не работают. Что изменилось и можно ли это исправить?
Comment 1 Mikhail Efremov 2013-07-25 16:15:09 MSK
Хм, мне тоже казалось, что там прямой запуск команд через sudo. Либо я что-то не уже помню, либо с чем-то путаю.
На самом деле там запуск через sudo helper'а, его и надо разрешать:
/usr/lib{,64}/xfce4/session/xfsm-shutdown-helper.
Остальные команды можно не разрешать, так и раньше не должно было работать.
Comment 2 enp 2013-07-26 08:11:53 MSK
# tail -1 /etc/sudoers
ALL ALL=(ALL) NOPASSWD: /usr/lib/xfce4/session/xfsm-shutdown-helper

При попытке перезагрузиться в логах ничего кроме:

Jul 26 07:58:25 bigmobile dbus[1961]: [system] Activating service name='org.freedesktop.login1' (using servicehelper)
Jul 26 07:58:25 bigmobile dbus[1961]: [system] Activated service 'org.freedesktop.login1' failed: Launch helper exited with unknown return code 1

Перезагрузки не происходит, просто выходим из xfce :(
Comment 3 Mikhail Efremov 2013-07-26 16:39:32 MSK
Выполните
echo REBOOT | sudo -H -S -p XFSM_SUDO_PASS -- /usr/lib/xfce4/session/xfsm-shutdown-helper
от пользователя.
Что происходит?
Comment 4 enp 2013-07-28 09:25:10 MSK
Происходит перезагрузка. А при выборе Выйти -> Перезагрузить не происходит.

$ rpm -qa | grep xfce
xfce4-notifyd-0.2.4-alt1
xfce4-session-engines-4.10.0-alt6.git20130610
altlinux-freedesktop-menu-xfce-0.65-alt1
libxfce4panel-4.10.1-alt0.M70P.1
xfce4-panel-4.10.1-alt0.M70P.1
xfce4-battery-plugin-1.0.5-alt1
xfce4-settings-4.10.1-alt0.M70P.1
xfce4-minimal-4.10-alt4
xfce-settings-simple-1.0-alt5
libxfce4util-4.10.1-alt0.M70P.1
xfce4-common-4.10-alt4
libxfce4ui-4.10.0-alt2
xfce4-xkb-plugin-0.5.6-alt1.M70P.1
xfce4-session-4.10.0-alt6.git20130610
xfce4-screenshooter-1.8.1-alt2
xfce4-icon-theme-4.4.3-alt1.qa1
xfce4-mixer-4.10.0-alt2.git20130324
xfce4-taskmanager-1.0.0-alt2

Что еще показать?
Comment 5 enp 2013-09-11 15:55:45 MSK
Замена бинарника /usr/lib/xfce4/session/xfsm-shutdown-helper одноименным шелл-скриптом показывает, что xfce4-session вообще его не вызывает. Я пытаюсь читать код xfce4-session и вставлять отладочный вывод. Пока выходит, что не выполняется условие if (shutdown->helper_state == SUDO_AVAILABLE). Где и как определяется shutdown->helper_state пока не пойму.
Comment 6 Mikhail Efremov 2013-09-11 16:08:52 MSK
(В ответ на комментарий №5)
> Замена бинарника /usr/lib/xfce4/session/xfsm-shutdown-helper одноименным
> шелл-скриптом показывает, что xfce4-session вообще его не вызывает. Я пытаюсь
> читать код xfce4-session и вставлять отладочный вывод. Пока выходит, что не
> выполняется условие if (shutdown->helper_state == SUDO_AVAILABLE). Где и как
> определяется shutdown->helper_state пока не пойму.

См. xfsm_shutdown_sudo_init(). Там просто запускается helper через sudo с -p XFSM_SUDO_PASS и потом проверяется ответ. Должно быть либо XFSM_SUDO_PASS от sudo (если есть пароль), либо XFSM_SUDO_DONE от helper'а (если NOPASSWD).
Helper должен запуститься уже просто при открытии диалога выхода из меню (или просто запустить xfce4-session-logout).
Comment 7 enp 2013-09-11 16:19:29 MSK
(В ответ на комментарий №6)
> (В ответ на комментарий №5)
> > Замена бинарника /usr/lib/xfce4/session/xfsm-shutdown-helper одноименным
> > шелл-скриптом показывает, что xfce4-session вообще его не вызывает. Я пытаюсь
> > читать код xfce4-session и вставлять отладочный вывод. Пока выходит, что не
> > выполняется условие if (shutdown->helper_state == SUDO_AVAILABLE). Где и как
> > определяется shutdown->helper_state пока не пойму.
> 
> См. xfsm_shutdown_sudo_init(). Там просто запускается helper через sudo с -p
> XFSM_SUDO_PASS и потом проверяется ответ. Должно быть либо XFSM_SUDO_PASS от
> sudo (если есть пароль), либо XFSM_SUDO_DONE от helper'а (если NOPASSWD).
> Helper должен запуститься уже просто при открытии диалога выхода из меню (или
> просто запустить xfce4-session-logout).

Отладочного вывода, вставленного в самое начало xfsm_shutdown_sudo_init, я не вижу - значит эта функция не вызывается.
Comment 8 enp 2013-09-11 16:22:42 MSK
> Отладочного вывода, вставленного в самое начало xfsm_shutdown_sudo_init, я не
> вижу - значит эта функция не вызывается.

Ее должна вызывать xfsm_manager_dbus_can_restart, однако прямого вызова этой функции grep уже не находит.
Comment 9 Mikhail Efremov 2013-09-11 16:40:39 MSK
Его и нет, это DBUS-интерфейс, насколько я понимаю.
Смотрите лучше xfsm_logout_dialog_init() в xfce4-session/xfsm-logout-dialog.c.
Comment 10 enp 2013-09-25 10:54:16 MSK
Проблема, видимо, в функции xfsm_systemd_can_method из xfsm-systemd.c, которая возвращает FALSE только при неудачном вызове polkit_authority_check_authorization_sync. Как бы это переписать, чтобы FALSE возвращалось еще и в том случае, если systemd не запущен?

А еще интересно, как это работает у вас. По идее не должно ;)
Comment 11 Mikhail Efremov 2013-09-25 17:27:11 MSK
(В ответ на комментарий №10)
> Проблема, видимо, в функции xfsm_systemd_can_method из xfsm-systemd.c, которая
> возвращает FALSE только при неудачном вызове
> polkit_authority_check_authorization_sync. Как бы это переписать, чтобы FALSE
> возвращалось еще и в том случае, если systemd не запущен?

Понятно, там сейчас только опрашивается polkit можно ли использовать данный метод. Нужно еще спрашивать у самого systemd-logind возможно ли использовать этот метод. С upower так и было, кстати.

> А еще интересно, как это работает у вас. По идее не должно ;)

У меня polkit разрешает только то, что я явно прописал в правилах, а не все что угодно.
Comment 12 enp 2013-09-25 20:35:38 MSK
> > А еще интересно, как это работает у вас. По идее не должно ;)
> 
> У меня polkit разрешает только то, что я явно прописал в правилах, а не все что
> угодно.

А покажите ваши правила. Я пытался разрешить только udisks2, но ничего не изменилось.
Comment 13 Mikhail Efremov 2013-09-25 22:38:50 MSK
Пожалуйста:

polkit.addRule(function(action, subject) {
        if (subject.isInGroup("wheel") && (action.id.indexOf("org.freedesktop.udisks2.") == 0 ||
                action.id.indexOf("org.fedoraproject.FirewallD1.") == 0 ||
                action.id.indexOf("org.libvirt.unix.") == 0 ||
                action.id.indexOf("org.freedesktop.policykit.") == 0)) {
                return polkit.Result.YES;
        }
});

polkit.addRule(function(action, subject) {
        if (subject.isInGroup("_nmconnect") && (action.id.indexOf("org.freedesktop.NetworkManager.") == 0 )) {
                return polkit.Result.YES;
        }
});


Но лучше проверьте xfce4-session из задания #104838. Если работает, то отправлю в Сизиф.
Comment 14 enp 2013-09-26 08:08:56 MSK
> Но лучше проверьте xfce4-session из задания #104838. Если работает, то отправлю
> в Сизиф.

Работает, спасибо! Можно и в p7 сразу отправить?
Comment 15 Mikhail Efremov 2014-03-20 02:30:19 MSK
(В ответ на комментарий №13)
>                 action.id.indexOf("org.freedesktop.policykit.") == 0)) {

Раз уж я это сюда закидывал, то стоит сказать, что этой строчки тут быть не должно. У меня это были ошметки каких-то экспериментов, видимо. Наличие такого правила позволяет запустить все что угодно через pkexec от root без всякой аутентификации.
Comment 16 enp 2014-03-20 08:58:56 MSK
> > action.id.indexOf("org.freedesktop.policykit.") == 0)) {
> 
> Раз уж я это сюда закидывал, то стоит сказать, что этой строчки тут быть не
> должно. У меня это были ошметки каких-то экспериментов, видимо. Наличие такого
> правила позволяет запустить все что угодно через pkexec от root без всякой
> аутентификации.

Ага, спасибо.