Proper use of pam_get_item()

Jason Gerfen jason.gerfen at scl.utah.edu
Thu Nov 18 13:57:00 UTC 2004


Gathering username/password from PAM.  I am having a hard time 
attempting to gather the user credentials.  Here is my code:

/* PAM includes */
#include <security/pam_modules.h>
#include <security/_pam_macros.h>
#include <security/pam_appl.h>

/* PAM definitions */
#define PAM_SM_ACCOUNT
#define PAM_SM_AUTH
#define PAM_SM_PASSWORD
#define PAM_SM_SESSION

typedef struct usrData * udataptr;
struct usrData {
    const char * usrname;
    char * password;
} localUser;

/* Handle our authentication process */
PAM_EXTERN
int pam_sm_authenticate( pam_handle_t *pamh, int flags, int argc,
                         const char **argv )
{
    int retval, i;
    udataptr myUser = &localUser;
    myConfigPtr myConfig = &localConfig;
    char user[15];
    const void ** password;

    myUser->usrname=user;

    struct pam_conv *conv = NULL;
    struct pam_message message;
    const struct pam_message *msg;
    struct pam_response *response;

    /* Get our username from PAM */
    if( ( retval = pam_get_user( pamh, &( myUser->usrname ), "PAM_test 
login: " ) != PAM_SUCCESS ) ) {
        _pam_log( LOG_ERR, "Error: %s", pam_strerror( pamh, retval ) );
        return 1;
    } else {
        _pam_log( LOG_ERR, "Obtained Username: %s", myUser->usrname );

    }

    /* PAM conversion stuff just to get to the bloody password */
    if( ( retval = pam_get_item( pamh, PAM_CONV, ( const void ** ) &conv 
) != PAM_SUCCESS ) ) {
        _pam_log( LOG_ERR, "Error: %s", pam_strerror( pamh, retval ) );
        return 1;
    } else {
        message.msg_style = PAM_PROMPT_ECHO_OFF;
        message.msg = "pam_test login: ";
        msg = &message;
        retval = ( *conv->conv )( 1, &msg, &response, conv->appdata_ptr );
        if( retval == PAM_SUCCESS ) {

    // THIS IS WHERE IT CRASHES??? I am passing the 3rd argument 
correctly as a const void **
            if( ( retval = pam_get_item( pamh, PAM_AUTHTOK, password ) 
!= PAM_SUCCESS ) ) {
                _pam_log( LOG_ERR, "Error: %s", pam_strerror( pamh, 
retval ) );
                return 1;
            } else {
                strcpy( *( &( myUser->password ) ), *password );
            }
        } else {
            _pam_log( LOG_ERR, "Error: %s", pam_strerror( pamh, retval ) );
            return 1;
        }
    }

Any help is appreciated...

-- 
Jason Gerfen
jason.gerfen at scl.utah.edu

"And remember... If the ladies
 don't find you handsome, they
 should at least find you handy..."
             ~The Red Green show




More information about the Pam-list mailing list