질문&답변
클라우드/리눅스에 관한 질문과 답변을 주고 받는 곳입니다.
리눅스 분류

solaris Pam 프로그램 문제

작성자 정보

  • 한민구 작성
  • 작성일

컨텐츠 정보

본문

안녕하세요.

다름이 아니라 얼마전에 PAM을 이용하여 su program을 짜는데 문제가 생겨 이렇게 글을 올립니다.

소스는 아래와 같고...(full source입니다.) Solaris에서는 이게 올바른 user name과 올바른 passwd를 쳐도 항상 no를 리턴하는게 문제입니다. 같은 파일을 linux를 이용하여 컴파일 하고 실행해보니 제대로 동작을 하는데 왜 Solaris에서는 제대로 동작을 안하는지 모르겠네요. 명괘한 답변 부탁 드립니다.

#define AUTHENTICATE_OK "ok"
#define AUTHENTICATE_NO "no"

#include <pwd.h>
#include <sys/types.h>
#include <unistd.h>
#include <security/pam_appl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static int su_conv(int num_msg, struct pam_message **msg,
        struct pam_response **resp, void *appdata_ptr);

static int stdin_conv(int num_msg, struct pam_message **msgm,
                    struct pam_response **response, void *appdata_ptr);

static struct pam_conv conv = { su_conv, NULL };

int
main( int argc, char *argv[] )
{
    pam_handle_t *pamh;
    int ret;
    const char *user="nobody";
    char newPassword[80];

  if (argc != 3)
    {
        fprintf(stderr,"Usage: chack_passwd [username] [password] ");
        exit(1);
    }

    user = argv[1];
    strcpy(newPassword,argv[2]);

    conv.conv = stdin_conv;
    conv.appdata_ptr = strdup(newPassword);

    ret = pam_start("login", user, &conv, &pamh);
    if ( ret == PAM_SUCCESS ) ret = pam_authenticate(pamh,0);
    if ( ret == PAM_SUCCESS ) fprintf(stdout, "%s ", AUTHENTICATE_OK);
    else fprintf(stdout, "%s ", AUTHENTICATE_NO);

    if (pam_end(pamh,ret) != PAM_SUCCESS)
    {
        pamh = NULL;
        fprintf(stderr, "check_user : failed to release authentication ");
        exit(1);
    }

    return ( ret == PAM_SUCCESS ? 0 : 1 );
}
       static int su_conv(int num_msg, struct pam_message **msg,
        struct pam_response **resp, void *appdata)
{
    struct pam_response *r;
    const struct pam_message *m = *msg;

    if (resp){
        *resp = calloc(num_msg, sizeof(struct pam_response));
        if (*resp == NULL) return PAM_BUF_ERR;
        r = *resp;
    }

    while ( num_msg-- )
    {
        switch(m->msg_style) {

            case PAM_PROMPT_ECHO_ON:
                fprintf(stdout, "%s", m->msg);
                r->resp = (char *)malloc(PAM_MAX_RESP_SIZE);
                fgets(r->resp, PAM_MAX_RESP_SIZE-1, stdin);
                m++; r++;
                break;

            case PAM_PROMPT_ECHO_OFF:
                r->resp = getpass(m->msg);
                m++; r++;
                break;
            case PAM_ERROR_MSG:
                fprintf(stderr, "%s ", m->msg);
                m++; r++;
                break;

            case PAM_TEXT_INFO:
                fprintf(stdout, "%s ", m->msg);
                m++; r++;
                break;

            default:
                break;
        }
    }
    return PAM_SUCCESS;
}

/* To hack PAM, I used conv structure */
static int stdin_conv(int num_msg, struct pam_message **msgm,
        struct pam_response **response, void *appdata_ptr)
{
    struct pam_response *reply;
    int count;

    if (num_msg <= 0) return PAM_CONV_ERR;
    reply = (struct pam_response *) calloc(num_msg,sizeof(struct pam_response));

      if (reply == NULL) { return PAM_CONV_ERR; }

    for (count=0; count < num_msg; ++count)
    {
        reply[count].resp_retcode = 0;
        reply[count].resp = strdup(appdata_ptr);
    }

    *response = reply;
    reply = NULL;

    return PAM_SUCCESS;
}

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,341 명
  • 현재 강좌수 :  37,019 개
  • 현재 접속자 :  367 명