~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to plugin/auth_pam/auth_pam.cc

  • Committer: Brian Aker
  • Date: 2008-08-03 22:14:59 UTC
  • Revision ID: brian@tangent.org-20080803221459-gz8on1zlp22dbr9d
First pass on PAM auth

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
  Sections of this where taken/modified from mod_auth_path for Apache 
 
3
*/
 
4
 
 
5
#define MYSQL_SERVER 1
 
6
#include <drizzled/mysql_priv.h>
 
7
#include <stdlib.h>
 
8
#include <ctype.h>
 
9
#include <drizzled/plugin.h>
 
10
#include <drizzled/plugin_authentication.h>
 
11
#include <security/pam_appl.h>
 
12
#include <security/pam_misc.h>
 
13
 
 
14
 
 
15
typedef struct {
 
16
    const char *name;
 
17
    const char *password;
 
18
} auth_pam_userinfo;
 
19
 
 
20
static int auth_pam_talker(int num_msg,
 
21
                           const struct pam_message **msg,
 
22
                           struct pam_response **resp,
 
23
                           void *appdata_ptr)
 
24
{
 
25
  auth_pam_userinfo *userinfo = (auth_pam_userinfo*)appdata_ptr;
 
26
  struct pam_response *response = 0;
 
27
  int x;
 
28
 
 
29
  /* parameter sanity checking */
 
30
  if(!resp || !msg || !userinfo)
 
31
    return PAM_CONV_ERR;
 
32
 
 
33
  /* allocate memory to store response */
 
34
  response= (struct pam_response*)malloc(num_msg * sizeof(struct pam_response));
 
35
  if(!response)
 
36
    return PAM_CONV_ERR;
 
37
 
 
38
  /* copy values */
 
39
  for(x= 0; x < num_msg; x++) 
 
40
  {
 
41
    /* initialize to safe values */
 
42
    response[x].resp_retcode= 0;
 
43
    response[x].resp= 0;
 
44
 
 
45
    /* select response based on requested output style */
 
46
    switch(msg[x]->msg_style) 
 
47
    {
 
48
    case PAM_PROMPT_ECHO_ON:
 
49
      /* on memory allocation failure, auth fails */
 
50
      response[x].resp = strdup(userinfo->name);
 
51
      break;
 
52
    case PAM_PROMPT_ECHO_OFF:
 
53
      response[x].resp = strdup(userinfo->password);
 
54
      break;
 
55
    default:
 
56
      if(response)
 
57
        free(response);
 
58
      return PAM_CONV_ERR;
 
59
    }
 
60
  }
 
61
 
 
62
  /* everything okay, set PAM response values */
 
63
  *resp = response;
 
64
 
 
65
  return PAM_SUCCESS;
 
66
}
 
67
 
 
68
static bool authenticate(THD *thd, const char *password)
 
69
{
 
70
  int retval;
 
71
  auth_pam_userinfo userinfo= { NULL, NULL };
 
72
  struct pam_conv conv_info= { &auth_pam_talker, (void*)&userinfo };
 
73
  pam_handle_t *pamh= NULL;
 
74
 
 
75
  userinfo.name= thd->main_security_ctx.user;
 
76
  userinfo.password= password;
 
77
 
 
78
  retval= pam_start("check_user", userinfo.name, &conv_info, &pamh);
 
79
 
 
80
  if (retval == PAM_SUCCESS)
 
81
    retval= pam_authenticate(pamh, PAM_DISALLOW_NULL_AUTHTOK);
 
82
 
 
83
  if (retval == PAM_SUCCESS)
 
84
    retval= pam_acct_mgmt(pamh, PAM_DISALLOW_NULL_AUTHTOK);
 
85
 
 
86
  pam_end(pamh, retval);
 
87
 
 
88
  return (retval == PAM_SUCCESS) ? true: false;
 
89
}
 
90
 
 
91
static int initialize(void *p)
 
92
{
 
93
  authentication_st *auth= (authentication_st *)p;
 
94
  
 
95
  auth->authenticate= authenticate;
 
96
 
 
97
  return 0;
 
98
}
 
99
 
 
100
static int finalize(void *p)
 
101
{
 
102
  (void)p;
 
103
 
 
104
  return 0;
 
105
}
 
106
 
 
107
mysql_declare_plugin(auth_pam)
 
108
{
 
109
  MYSQL_AUTH_PLUGIN,
 
110
  "pam",
 
111
  "0.1",
 
112
  "Brian Aker",
 
113
  "PAM based authenication.",
 
114
  PLUGIN_LICENSE_GPL,
 
115
  initialize, /* Plugin Init */
 
116
  finalize, /* Plugin Deinit */
 
117
  NULL,   /* status variables */
 
118
  NULL,   /* system variables */
 
119
  NULL    /* config options */
 
120
}
 
121
mysql_declare_plugin_end;