Acho que fiz algum progresso para entender essa questão, então vou postar o que sei aqui. Esta resposta é atualmente para os sistemas que usam o PAM . Vou adicionar mais sobre outros métodos de login quando os encontrar.
Depois de digitar seu nome de usuário e senha nos campos do gerenciador de exibição, o gerenciador de exibição pega esses dois campos e inicia o processo de autenticação do PAM.
Primeiro, chama pam_start()
. Isso informa ao PAM qual função de conversa (vamos chegar ao que é isso) que você está usando e qual pam_handle_t
struct inicializar. Você passa este pam_handle_t
struct para todas as chamadas a seguir.
Em seguida, você pode definir propriedades como o nome de usuário usando pam_set_item()
. Você não precisa definir o nome de usuário aqui. Quando você chamar pam_authenticate()
, ele solicitará qualquer informação que ainda não tenha.
Em seguida, você chama pam_authenticate()
para ver se o nome de usuário e a senha são válidos. Neste ponto, pam_authenticate()
obtém qualquer informação que não tenha usando o função de conversação . Você pode olhar para esse link para os detalhes, mas em resumo, o PAM chamará a função de conversação fornecida na estrutura passada para pam_start()
depois que você chamar pam_authenticate()
. Em seguida, passará uma matriz de mensagens para essa função de conversação. Se o msg_style
for PAM_PROMPT_ECHO_ON
, ele solicitará o nome de usuário e, se o msg_style
for PAM_PROMPT_ECHO_OFF
, ele solicitará a senha. As outras duas opções são descritas na especificação e são usadas para mensagens de erro e informativas. Dependendo do tipo de mensagem, preencha a matriz resp
com as respostas e retorne o código de erro correto.
Agora, se pam_authenticate()
retornar PAM_SUCCESS
, isso significa que o usuário existe. Em seguida, precisaremos chamar pam_acct_mgmt()
para garantir que o usuário tenha permissão para efetuar login no momento (não sei onde ou como essa permissão está definida).
Neste momento, obtemos um token usando pam_setcred()
e, em seguida, abrimos uma sessão com pam_open_session()
. Eu não sei qual é o propósito disso ou como o token é realmente usado, mas isso é necessário. Deixe-me saber se você souber mais informações.
Agora podemos definir todas as variáveis bash que queremos usando pam_putenv()
. Quando nosso ambiente tem tudo o que precisamos, podemos criar um novo processo e, em seguida, exec
o comando startx
.
Quando esse processo termina, o usuário está efetuando logout. Neste ponto, chamamos pam_close_session()
, pam_setcred
(com a opção de excluir as credenciais) e pam_end()
nessa ordem.
Se alguma coisa estiver incorreta ou você tiver mais informações para adicionar, informe-nos. Você pode ver o meu gerenciador de exibição (ainda em desenvolvimento) para exemplos disso.