Re: verifying a username AND password...?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> Subject: Re: verifying a username AND password...?
> Date: 01 Mar 2002 20:58:35 +0800
> From: John Breen <locutus@borg.apana.org.au>
> Reply-To: pam-list@redhat.com
> To: pam-list@redhat.com
> References: <1014980314.388.26.camel@developer> <3C7F6F13.B8D4938B@gnet.tn>
> 
> On Fri, 2002-03-01 at 20:07, Fathi Ben Nasr wrote:
> 
> the USER is NOT connecting to the host.
> 
> situation is, A user is connecting to the host for purposes of
> maintaining a database connection.  the user won't be that user.
> 
> the actual user needs to authenticate to the client-side application.
> the authentication tokens will come from the local machine, BUT the
> user's login name for the application may be different to the login name
> for the database.
> 
> I hope that makes some kind of sense - it's sort of confusing to me now
> i come to think about it...


This does make sense to me, I had exactly this same problem with PAM and
Jabber. The issue was that the jabber client (running on a PC over the network)
was passing a user name and password pair to Jabber which I wanted to get
authenticated by PAM.

I wrote my own "conversation" function (the one that does the password
prompting) and used the "appdata_ptr" feature to pass the password through to
it (for it to return back again!). I never found out if there was a better way.

Here's some code, if it helps :-

----------------------------------------------------------------------------------
int my_conversation(
    int num_msg, 
    const struct pam_message **msgm,
    struct pam_response **response, 
    void *appdata_ptr)
{
int count=0;
struct pam_response *reply;

    log_debug(ZONE,"JAMES conversation, %d items",num_msg);
    reply = (struct pam_response *) calloc(num_msg, sizeof(struct
pam_response));
    for (count=0; count < num_msg; ++count) 
    {
    switch (msgm[count]->msg_style)
        {
        case PAM_PROMPT_ECHO_OFF:
        case PAM_PROMPT_ECHO_ON:
            log_debug(ZONE,"JAMES conversation '%s'",appdata_ptr);
            reply[count].resp_retcode = 0;
            reply[count].resp = strdup(appdata_ptr);
            break;
        }
    }
    *response = reply;
    return PAM_SUCCESS;
}


int pam_authentication_ok(char * user, char * pass)
{
struct pam_conv conv;
pam_handle_t *pamh=NULL;
int ret,so_far=0;

    log_debug(ZONE,"JAMES pam_authentication_ok '%s','%s'",pass,user);

    conv.appdata_ptr = (void *) pass;
    conv.conv = my_conversation;

    ret = pam_start("jabberd", user, &conv, &pamh);
    if (ret == PAM_SUCCESS) { so_far=1; ret = pam_fail_delay(pamh, 1); }
    if (ret == PAM_SUCCESS) { so_far=2; ret = pam_authenticate(pamh, 0);  }
    if (ret == PAM_SUCCESS) { so_far=3; ret = pam_acct_mgmt(pamh, 0); }
    if (ret == PAM_SUCCESS) { so_far=4; ret = pam_end(pamh,ret); }

    log_debug(ZONE,"JAMES pam_authentication_ok(so_far=%d, ret=%d) return %d",
        so_far,ret,((ret==PAM_SUCCESS) ? 1:0));

    return ((ret==PAM_SUCCESS) ? 1:0);
}


int pam_new_user_ok(char * user,char * pass)
{
    log_debug(ZONE,"JAMES pam_new_user_ok '%s','%s'",pass,user);
    return pam_authentication_ok(user,pass);
}
----------------------------------------------------------------------------------



James





[Index of Archives]     [Fedora Users]     [Kernel]     [Red Hat Install]     [Linux for the blind]     [Gimp]

  Powered by Linux