~maria-captains/percona-pam-for-mysql/use_dialog

« back to all changes in this revision

Viewing changes to src/lib_auth_pam_client.c

  • Committer: Sergei Golubchik
  • Date: 2011-10-27 11:14:52 UTC
  • Revision ID: sergii@pisem.net-20111027111452-hd7frf392x3lxq7d
rewrite to use dialog plugin.
simplify configure.ac.
support builds from within 5.5 tree.
fix make distcheck target.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
  (C) 2011 Percona Inc.
3
 
 
4
 
  This program is free software; you can redistribute it and/or modify
5
 
  it under the terms of the GNU General Public License as published by
6
 
  the Free Software Foundation; version 2 of the License.
7
 
 
8
 
  This program is distributed in the hope that it will be useful,
9
 
  but WITHOUT ANY WARRANTY; without even the implied warranty of
10
 
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
 
  GNU General Public License for more details.
12
 
 
13
 
  You should have received a copy of the GNU General Public License
14
 
  along with this program; if not, write to the Free Software
15
 
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16
 
*/
17
 
 
18
 
/**
19
 
 @file
20
 
 
21
 
 PAM authentication for MySQL, common code for client-side plugins.
22
 
 
23
 
 For the general description, see the top comment in auth_pam.c.
24
 
*/
25
 
#include "lib_auth_pam_client.h"
26
 
 
27
 
#include <assert.h>
28
 
#include <string.h>
29
 
 
30
 
#define MY_ASSERT_UNREACHABLE() assert(0)
31
 
 
32
 
int authenticate_user_with_pam_client_common (MYSQL_PLUGIN_VIO *vio,
33
 
                                              struct st_mysql *mysql __attribute__((unused)),
34
 
                                              prompt_fn echoless_prompt_fn,
35
 
                                              prompt_fn echo_prompt_fn,
36
 
                                              info_fn show_error_fn,
37
 
                                              info_fn show_info_fn)
38
 
{
39
 
  do {
40
 
    char *buf;
41
 
    int pkt_len;
42
 
 
43
 
    if ((pkt_len= vio->read_packet(vio, (unsigned char **)&buf)) < 0)
44
 
      return CR_ERROR;
45
 
 
46
 
    /* The first byte is the message type, followed by the message itself.  */
47
 
 
48
 
    if (buf[0] == '\2' || buf[0] == '\3')
49
 
    {
50
 
      /* '\2' - PAM_PROMPT_ECHO_OFF, '\3' - PAM_PROMPT_ECHO_ON */
51
 
      char *reply = (buf[0] == '\2')
52
 
        ? echoless_prompt_fn(&buf[1]) : echo_prompt_fn(&buf[1]);
53
 
      if (!reply)
54
 
        return CR_ERROR;
55
 
      if (vio->write_packet(vio, (unsigned char *)reply, strlen(reply) + 1))
56
 
      {
57
 
        free(reply);
58
 
        return CR_ERROR;
59
 
      }
60
 
      free(reply);
61
 
    }
62
 
    else if (buf[0] == '\4') /* PAM_ERROR_MSG */
63
 
      show_error_fn(&buf[1]);
64
 
    else if (buf[0] == '\5') /* PAM_TEXT_INFO */
65
 
      show_info_fn(&buf[1]);
66
 
    else if (buf[0] == '\0') /* end-of-authorization */
67
 
      return CR_OK;
68
 
    else
69
 
      return CR_ERROR; /* Unknown! */
70
 
  }
71
 
  while (1);
72
 
 
73
 
  /* Should not come here */
74
 
  MY_ASSERT_UNREACHABLE();
75
 
  return CR_ERROR;
76
 
}