Bug 51493

Summary: lightdm (оповещение в 1 миллисекунду)
Product: Sisyphus Reporter: pashinina <pashininaaa>
Component: lightdm-kde-greeterAssignee: Anton Golubev <golubevan>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: normal    
Priority: P5 CC: anteroid1989, golubevan, klark, krf10, lepata, max.gordeef, pashininaaa, rider, shevchenkodyu, shevtsov.anton, zerg
Version: unstable   
Hardware: x86_64   
OS: Linux   
See Also: https://bugzilla.altlinux.org/show_bug.cgi?id=51598
Attachments:
Description Flags
пример всплывающего оповещения
none
delay patch
none
Стек вызовов при запуске сессии после аутентификации
none
Всплывающее уведомление Secret Net LSP сразу после логина
none
Пример отображения сообщения lightdm после ввода логина и пароля none

Description pashinina 2024-09-17 16:56:15 MSK
Имеется проблема с временем отображения оповещений при входе в учетную запись после авторизации (lightdm/pam) в домене. После ввода пароля и подтверждения оповещение появляется на ~1 миллисекунду. Данного временного интервала крайне недостаточно.
Comment 1 pashinina 2024-09-17 18:02:29 MSK
Created attachment 16862 [details]
пример всплывающего оповещения
Comment 2 Олег Соловьев 2024-09-24 11:00:46 MSK
Created attachment 16895 [details]
delay patch

Эта штука сработает?
Comment 3 Sergey V Turchin 2024-09-24 11:04:03 MSK
(Ответ для Олег Соловьев на комментарий #2)
> delay patch
> Эта штука сработает?
Да, пригодится.
Comment 4 Anton Golubev 2024-09-24 15:39:49 MSK
А секунда ожидания сообщения это не долго? Т.е. даже если сообщения не предвидится, мы висим одну секунду.
Comment 5 Anton Farygin 2024-09-24 15:41:11 MSK
долго, надо полсекунды дать. 

А можно выводить паузу только тогда, когда есть таймаут ?
Comment 6 Sergey V Turchin 2024-09-24 15:48:38 MSK
(Ответ для Anton Farygin на комментарий #5)
> долго, надо полсекунды дать. 
+1

> А можно выводить паузу только тогда, когда есть таймаут ?
Сделано, если в 1-й таймаут пришло сообщение для отображения, то 5 сек пауза.
Comment 7 Anton Golubev 2024-09-24 15:53:46 MSK
А пам точно посылает сообщения _после_ сигнала об успешной аутентификации? Насколько я знаю, там всё происходит синхронно и можно попробовать доказать (или опровергнуть), что при вызове колбэка все необходимые сообщения уже пришли и первого таймаута не нужно.
Comment 8 Олег Соловьев 2024-09-24 15:54:33 MSK
(In reply to Anton Farygin from comment #5)
> долго, надо полсекунды дать. 
> 
> А можно выводить паузу только тогда, когда есть таймаут ?

Есть риск что сообщение ещё не пришло, а lightdm уже скрывает свой гритер, т.к. я не знаю в каком порядке идут события.

Я рассматриваю вариант, когда сначала идёт loginSuccessful, а потом infoMessage
Comment 9 Sergey V Turchin 2024-09-24 16:02:01 MSK
Надо бы проверить на относительно слабом железе и медленной сети(авторизация в домене). А то может и 0.3 сек хватит.
Comment 10 Sergey V Turchin 2024-09-24 16:33:03 MSK
(Ответ для Sergey V Turchin на комментарий #9)
> и медленной сети(авторизация в домене)
Проверив, что кэширование в sssd выключено.
Comment 11 Anton Golubev 2024-09-27 15:34:04 MSK
Created attachment 16922 [details]
Стек вызовов при запуске сессии после аутентификации

Поизучав взаимодействие между гритером и модулем PAM, а также работу самого модуля, с определённой уверенностью могу заключить, что по завершению аутентификации никаких сообщений приходить не должно, и можно не использовать первый таймаут. Разумеется, нужно это хорошо потестировать.

Некоторые подробности:

Модуль PAM является so, а значит просто компонуется в исполняемый бинарь и вызывается как часть программы, в нашем случае - демона lightdm. В модуле реализована функция pam_sm_authenticate [1], в которой и происходит вся аутентификация, в т.ч. отправляются сообщения пользователю, запросы на ввод данных и т.д. Аутентификация завершается при возвращении из этой функции. Таким образом, внутри lightdm завершение аутентификации гарантированно происходит после отправки любого сообщения.

Чтоб передать сообщение, PAM-модуль вызывает колбэк, который передаёт это гритеру через pipe. При завершении аутентификации (когда PAM фактически уже завершил выполнение) lightdm также отправляет сообщение гритеру через pipe. Судя по всему внутри pipe не может произойти переупорядочивание.

В гритер событие попадает через вызов ppoll в библиотеке Glib-2, и далее подаётся Qt-сигнал, к которому подключен qml компонент, с логикой на javascript. Всё это происходит в основном цикле приложения и выполняется последовательно.

Прикладываю стек вызовов в момент, когда происходит запуск сессии по сигналу успешной аутентификации от PAM. Во фрейме 34 сработал колбэк, "следящий" за pipe, выше по стеку подаётся Glib-сигнал, который во фрейме 27 запускает Qt-сигнал, выше видна работа javascript интерпретатора, примерно 23..5 фрейм и далее из qml вызывается метод гритера для начала запуска сессии. Видно, что это всё происходит синхронно, в одном потоке.

[1] https://www.man7.org/linux/man-pages/man3/pam_sm_authenticate.3.html
Comment 12 Leonid Krivoshein 2024-09-30 14:39:27 MSK
Если изменить передачу сообщения через функцию диалога PAM на отправку его через D-Bus как-то так:

$ busctl --user --json=short call org.freedesktop.Notifications \
  /org/freedesktop/Notifications org.freedesktop.Notifications Notify \
  susssasa{sv}i "" 0 password "Ваш пароль истекает" "$(date --date=now +%c)" \
  2 "chpw" "изменить пароль" 0 10000

Было бы логично с точки зрения архитектуры PAM и его взаимодействия с greeter'ами. Сообщение будет появляться в области уведомлений уже после успешного логина пользователя.
Comment 13 Anton Golubev 2024-09-30 16:47:30 MSK

(Ответ для Leonid Krivoshein на комментарий #12)
> Если изменить передачу сообщения через функцию диалога PAM на отправку его
> через D-Bus как-то так:
>  ...
> Было бы логично с точки зрения архитектуры PAM и его взаимодействия с
> greeter'ами. Сообщение будет появляться в области уведомлений уже после
> успешного логина пользователя.

Да, это было бы удобно для пользователя, но мне пока непонятно, как это может быть в общем случае. Ведь только сам модуль pam осведомлён о таких деталях как сроки действия паролей и т.п., гритер просто выводит сообщения и запросы на ввод, как ему понять, какое именно сообщение отправить пользователю в качестве оповещения? С другой стороны, кажется, pam модуль не знает, он в графическую сессию аутентифицирует или в текстовую, в последнем случае такое оповещение наверное не нужно.
Comment 14 Sergey V Turchin 2024-10-01 09:23:25 MSK
(Ответ для Anton Golubev на комментарий #13)
> или в текстовую, в последнем
> случае такое оповещение наверное не нужно.
Нужно, но там достаточно просто не удалять оповещение с экрана.
Comment 15 Leonid Krivoshein 2024-10-01 22:58:13 MSK
Created attachment 16945 [details]
Всплывающее уведомление Secret Net LSP сразу после логина
Comment 16 Leonid Krivoshein 2024-10-01 23:08:38 MSK
(In reply to Anton Golubev from comment #13)
> Да, это было бы удобно для пользователя, но мне пока непонятно, как это
> может быть в общем случае. Ведь только сам модуль pam осведомлён о таких
> деталях как сроки действия паролей и т.п., гритер просто выводит сообщения и
> запросы на ввод, как ему понять, какое именно сообщение отправить
> пользователю в качестве оповещения?
Отправить через D-Bus, а не через PAM conversation, как это делает Secret Net LSP: см. прикреплённый скрин из нашей инструкции. Сообщение должен увидеть залогинившийся пользователь, его можно отправить даже с отсрочкой в несколько секунд, чтобы дать время сначала прогрузиться рабочему столу. Это может быть и скрипт с указанной командой, например, запускаемый в фоновом режиме из модуля PAM через: $SHELL -c "nohup /path/to/script.sh $EXPIRATIONDATE >/dev/null 2>&1 &"
Comment 17 Sergey V Turchin 2024-10-02 08:57:21 MSK
(Ответ для Leonid Krivoshein на комментарий #16)
> Отправить через D-Bus, а не через PAM conversation
Видимо, надо подружить соотв. модуль PAM и krb5-ticket-watcher, который может сразу предложить и сделать смену пароля.
Comment 18 Leonid Krivoshein 2024-10-02 13:35:04 MSK
(In reply to Sergey V Turchin from comment #17)
> Видимо, надо подружить соотв. модуль PAM и krb5-ticket-watcher, который
> может сразу предложить и сделать смену пароля.
То есть, действительно можно вообще перенести место проверки из гритера во что-то, что запускается под юзверем всегда, и krb5-ticket-watcher прекрасный кандидат. И тогда даже необязательно дружить с PAM-модулем, так как есть:

https://packages.altlinux.org/ru/sisyphus/files/?q=%2Fusr%2Fbin%2Fchage

LC_ALL=C chage -l $USER |sed -n -E 's/^Password expires\s+: //p'
Comment 19 Sergey V Turchin 2024-10-02 13:53:22 MSK
(Ответ для Leonid Krivoshein на комментарий #18)
> LC_ALL=C chage -l $USER |sed -n -E 's/^Password expires\s+: //p'
Локального пользователя достаточно в DM предупредить. Полагаю, доменного он не умеет, а через krb нужен пароль, чтоб узнать что-то.
Comment 20 Leonid Krivoshein 2024-10-02 16:58:10 MSK
(In reply to Sergey V Turchin from comment #19)
> Локального пользователя достаточно в DM предупредить. Полагаю, доменного он
> не умеет, а через krb нужен пароль, чтоб узнать что-то.
Какие-то зависимости на PAM у chage уже есть: https://packages.altlinux.org/en/p10/binary/shadow-change/x86_64/depends/3066919505232134099 , можно это просто проверить, т.е. в теории он вполне может работать и с доменом, иначе для каждого домена пришлось бы вытаскивать из атрибутов Samba или через какой-нибудь samba-tool domain passwordsettings [pso show-user $USER].
Comment 21 Repository Robot 2024-10-18 10:53:55 MSK
lightdm-kde-greeter-0.4.23-alt10 -> sisyphus:

 Fri Oct 18 2024 Anton Golubev <golubevan@altlinux> 0.4.23-alt10
 - provide some time to read messages from PAM (Closes: 51493)
Comment 22 Антон Медведев 2024-10-18 14:45:08 MSK
Добрый день,я так понимаю решение найдено?
Подскажите пожалуйста, как проверить исправление lightdm "Срок действия пароля истекает через 5 days" в 1 миллисекунду отображается при авторизации pam в домене ActiveDirectory (sssd).
Comment 23 Антон Медведев 2024-10-18 14:45:28 MSK
Добрый день,я так понимаю решение найдено?
Подскажите пожалуйста, как проверить исправление lightdm "Срок действия пароля истекает через 5 days" в 1 миллисекунду отображается при авторизации pam в домене ActiveDirectory (sssd).
Comment 24 Антон Медведев 2024-10-18 14:46:25 MSK
Created attachment 17029 [details]
Пример отображения сообщения lightdm после ввода логина и пароля
Comment 25 Anton Golubev 2024-10-18 14:52:25 MSK
(Ответ для Антон Медведев на комментарий #23)
> Добрый день,я так понимаю решение найдено?
> Подскажите пожалуйста, как проверить исправление lightdm "Срок действия
> пароля истекает через 5 days" в 1 миллисекунду отображается при авторизации
> pam в домене ActiveDirectory (sssd).

Завтра версия 0.4.23-alt10 будет в Сизифе, если у вас Сизиф - обновитесь. Если нет, боюсь, что практически никак.
Comment 26 Антон Медведев 2024-10-18 14:54:32 MSK
в ветке p10 будет же?
Comment 27 Anton Golubev 2024-10-18 15:12:14 MSK
В p10 потребуется сделать "бэкпорт", что займёт ещё некоторое время.
Comment 28 Anton Golubev 2024-10-21 10:38:10 MSK
Сделал бэкпорт для p10, версия 0.4.23-alt1.p10.1. Собрал в тестовом задании 360278.
Comment 29 Шевченко Денис 2024-10-21 10:57:40 MSK
(Ответ для Антон Медведев на комментарий #26)
> в ветке p10 будет же?

Добрый день. 
Попробуйте обновленную версию пакета lightdm-kde-greeter из задания 360278.
Можно обновить пакет командой:
# apt-repo upgrade 360278
Comment 30 Шевченко Денис 2024-10-21 10:57:40 MSK
(Ответ для Антон Медведев на комментарий #26)
> в ветке p10 будет же?

Добрый день. 
Попробуйте обновленную версию пакета lightdm-kde-greeter из задания 360278.
Можно обновить пакет командой:
# apt-repo upgrade 360278
Comment 31 Антон Медведев 2024-10-21 22:43:03 MSK
Добрый вечер, протестировал, подтверждаю. Теперь уведомление после ввода логина/пароля появляется примерно секунд на 5. Спасибо большое.
Comment 32 Шевченко Денис 2024-10-22 09:48:08 MSK
(Ответ для Антон Медведев на комментарий #31)
> Добрый вечер, протестировал, подтверждаю. Теперь уведомление после ввода
> логина/пароля появляется примерно секунд на 5. Спасибо большое.

Отлично. Попадание обновления в репозиторий займет какое-то время.
До этого момента, пожалуйста, используйте обновление lightdm-kde-greeter из задания 360278.
Comment 33 Шевченко Денис 2024-11-15 09:29:30 MSK
(Ответ для Антон Медведев на комментарий #31)
> Добрый вечер, протестировал, подтверждаю. Теперь уведомление после ввода
> логина/пароля появляется примерно секунд на 5. Спасибо большое.

Исправление уже дошло до репозитория p10.
Comment 34 Sergey V Turchin 2024-11-26 10:46:14 MSK
*** Bug 34368 has been marked as a duplicate of this bug. ***