Bug 35210 - Не видит пользователей в /etc/tcb при составлении списка
Summary: Не видит пользователей в /etc/tcb при составлении списка
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: accountsservice (show other bugs)
Version: unstable
Hardware: all Linux
: P3 normal
Assignee: Alexey Shabalin
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2018-08-04 12:27 MSK by Fr. Br. George
Modified: 2024-02-19 18:22 MSK (History)
2 users (show)

See Also:


Attachments
Use getspent_r() instead of fgetspent_r() (TCB) (1.91 KB, patch)
2018-08-04 19:44 MSK, Fr. Br. George
no flags Details | Diff
Патч, игнорирующий несоответствие /etc/passwd и /etc/shadow (715 bytes, patch)
2018-08-14 18:06 MSK, Fr. Br. George
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Fr. Br. George 2018-08-04 12:27:34 MSK
Когда accountsservice составляет список пользователей, которых можно предлагать DM-у для логина, оно тупо открывает /etc/shadow и читает оттуда!

Поэтому lightdm, например, не показывает никакого списка пользователей, если accounts-daemon запущен.

Сейчас попробую запатчить на getspent() вместо fgetspent()
Comment 1 Yuri N. Sedunov 2018-08-04 13:05:33 MSK
Э-э-э, Гоша, не торопись, ты, наверное, не разобрался.
GDM успешно получает список от accountsservice.

ls /var/lib/AccountsService/users/
?
Comment 2 Fr. Br. George 2018-08-04 19:44:37 MSK
Created attachment 7688 [details]
Use getspent_r() instead of fgetspent_r() (TCB)

 fgetspent_r() слегка несовмевстимо с TCB (надо по многу раз вызывать для каждого /etc/tcb/<user>/shadow). В данном случае, хоть оно и встречается в итераторе, но вызывается только в первой итерации.
Comment 3 Fr. Br. George 2018-08-04 19:51:31 MSK
(В ответ на комментарий №1)
> Э-э-э, Гоша, не торопись, ты, наверное, не разобрался.
> GDM успешно получает список от accountsservice.
Возможно, он потом лезет сам куда-то.

В коде accountsservice явно написано открывать _файл_ /etc/shadow и читать оттуда с помощью fgetspent_r(). С файлами они рабоают потому что внутри итератора, открытый файл в текущем состоянии можно записать в контекст, а как обеспечить контекст для getpwent(), например, непонятно. Но именно shadow там засасывается целиком в первой итерации, так что fgetspent_r вполне можно поменять на getspent_r, что я и сделал.

> ls /var/lib/AccountsService/users/
> ?
Пусто
Comment 4 Fr. Br. George 2018-08-04 20:12:35 MSK
(В ответ на комментарий №3)
> > ls /var/lib/AccountsService/users/
> > ?
> Пусто
Точнее, один я)
Comment 5 Fr. Br. George 2018-08-13 18:28:34 MSK
(В ответ на комментарий №2)
> Created an attachment (id=7688) [details]
> Use getspent_r() instead of fgetspent_r() (TCB)

Это плохой патч, негодный. Потому что так всё идёт _мимо_ nsswitch, а с патчем getspent_r() ьуда таки ходит.

Я лучше посмотрю, так ли нужна информация из shadow по ходу.
Comment 6 Fr. Br. George 2018-08-14 18:06:13 MSK
Created attachment 7708 [details]
Патч, игнорирующий несоответствие /etc/passwd  и /etc/shadow

Как выяснилось, accountsservice вполне может работать с учётной записью в passwd, даже если в shadow такой нет. См. задание 211373
Comment 7 Repository Robot 2018-08-15 13:43:09 MSK
accountsservice-0.6.50-alt2.S1 -> sisyphus:

Tue Aug 14 2018 Fr. Br. George <george@altlinux.ru> 0.6.50-alt2.S1
- Ignore ALT-specific empty /etc/shadow (closes: #35210)