Как получить пароль в приложении PAM - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь написать программу, аутентифицирующую пользователя с помощью pam и записывающую его пароль в файл (в данный момент просто распечатайте его).Но даже при успешной аутентификации пароль не сохраняется

#include <security/pam_appl.h>
#include <security/pam_misc.h>
#include <stdio.h>
#include <stdlib.h>   

static struct pam_conv conv = {
    misc_conv,
    NULL
};

int main(int argc, char *argv[])
{
    pam_handle_t *pamh=NULL;
    int retval;
    const char *user=argv[1];
    char *get_user;
    char *get_pass;

    retval = pam_start("check_user", user, &conv, &pamh);

    if (retval == PAM_SUCCESS)
        retval = pam_authenticate(pamh, 0);

    pam_get_item(pamh, PAM_AUTHTOK, (const void **)(const void*)&get_pass);
    pam_get_item(pamh, PAM_USER, (const void **)(const void*)&get_user);

    printf("user: %s\n", get_user);
    printf("password: %s\n", get_pass);

    if (retval == PAM_SUCCESS) {
        fprintf(stdout, "Authenticated\n");
    } else {
        fprintf(stdout, "Not Authenticated\n");
    }

    if (pam_end(pamh,retval) != PAM_SUCCESS)
        pamh = NULL;
}

Файл PAM выглядит следующим образом:

auth            required        pam_unix.so
account         required        pam_unix.so

Запуск его с правильным паролем:

./a.o kuku
Password: 
user: kuku
password: (null)
Authenticated

Запуск с неверным паролем:

./a.o kuku
Password: 
user: kuku
password: (null)
Not Authenticated

Есть идеи?

1 Ответ

0 голосов
/ 20 декабря 2018

Я думаю, что pam_get_line звонки должны быть:

 pam_get_item(pamh, PAM_AUTHTOK, (const void **)&get_pass);
 pam_get_item(pamh, PAM_USER, (const void **)&get_user);
...