Como os gerentes de exibição registram um usuário?

3

Estou prestes a começar a trabalhar no meu próprio gerenciador de exibição / login. Acho que vou conseguir lidar com todas as coisas do X11, mas percebi que não tenho ideia do que fazer quando o usuário digita seu nome de usuário e senha.

Quando um gerenciador de exibição tem um nome de usuário e uma senha, o que ele faz? Como você log in? Existem outros requisitos específicos que um gerenciador de login precisa fazer, como o fornecimento de arquivos de configuração ou tudo isso deixado para o ambiente de área de trabalho?

    
por gsingh2011 30.04.2014 / 00:09

1 resposta

3

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.

    
por 08.05.2014 / 19:05