~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to plugin/auth_http/auth_http.cc

  • Committer: Mark Atwood
  • Date: 2009-04-08 01:22:11 UTC
  • mto: (971.1.71 mordred)
  • mto: This revision was merged to the branch mainline in revision 990.
  • Revision ID: me@mark.atwood.name-20090408012211-rpoz0fem4exqt247
add auth_http plugin

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
 
3
 *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
 
4
*/
 
5
 
 
6
#include <drizzled/server_includes.h>
 
7
#include <drizzled/session.h>
 
8
#include <drizzled/plugin/authentication.h>
 
9
#include <drizzled/gettext.h>
 
10
 
 
11
#include <curl/curl.h>
 
12
 
 
13
CURL *curl_handle;
 
14
 
 
15
static bool sysvar_auth_http_enable= false;
 
16
static char* sysvar_auth_http_url= NULL;
 
17
 
 
18
size_t curl_cb_read(void *ptr, size_t size, size_t nmemb, void *stream)
 
19
{
 
20
  (void) ptr;
 
21
  (void) stream;
 
22
  return (size * nmemb);
 
23
}
 
24
 
 
25
 
 
26
class Auth_http : public Authentication
 
27
{
 
28
public:
 
29
  virtual bool authenticate(Session *session, const char *password)
 
30
  {
 
31
    CURLcode rv;
 
32
    long http_response_code;
 
33
 
 
34
    if (sysvar_auth_http_enable == false)
 
35
      return true;
 
36
 
 
37
    assert(session->security_ctx.user.c_str());
 
38
    assert(password);
 
39
 
 
40
    // turn off curl stuff that might mess us up
 
41
    rv= curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1);
 
42
    rv= curl_easy_setopt(curl_handle, CURLOPT_NOSIGNAL, 1);
 
43
    rv= curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 0);
 
44
 
 
45
    // do a HEAD instead of a default GET
 
46
    rv= curl_easy_setopt(curl_handle, CURLOPT_NOBODY, 1);
 
47
 
 
48
    // set the read callback.  this shouldnt get called, because we are doing a HEAD
 
49
    rv= curl_easy_setopt(curl_handle, CURLOPT_READFUNCTION, curl_cb_read);
 
50
 
 
51
    // set the parameters: url, username, password
 
52
    rv= curl_easy_setopt(curl_handle, CURLOPT_URL, sysvar_auth_http_url);
 
53
    rv= curl_easy_setopt(curl_handle, CURLOPT_USERNAME, session->security_ctx.user.c_str());
 
54
    rv= curl_easy_setopt(curl_handle, CURLOPT_PASSWORD, password);
 
55
 
 
56
    // do it
 
57
    rv= curl_easy_perform(curl_handle);
 
58
 
 
59
    // what did we get? goes into http_response_code
 
60
    rv= curl_easy_getinfo(curl_handle, CURLINFO_RESPONSE_CODE, &http_response_code);
 
61
 
 
62
    // so here is an interesting question.
 
63
    // return true if the response_code is 2XX, or return false if its 4XX
 
64
    // for now, return false for 401, true otherwise
 
65
    // this means that if the url breaks, then anyone can log in
 
66
    // this might be the wrong thing
 
67
 
 
68
    if (http_response_code == 401)
 
69
      return false;
 
70
    return true;
 
71
  }
 
72
};
 
73
 
 
74
static int initialize(void *p)
 
75
{
 
76
  Authentication **auth= static_cast<Authentication **>(p);
 
77
 
 
78
  CURLcode rv;
 
79
 
 
80
  *auth= new Auth_http();
 
81
 
 
82
  // we are trusting that plugin initializers are called singlethreaded at startup
 
83
  // if something else also calls curl_global_init() in a threadrace while we are here,
 
84
  // we will crash the server. 
 
85
  curl_handle= curl_easy_init();
 
86
 
 
87
  rv= curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1);
 
88
  rv= curl_easy_setopt(curl_handle, CURLOPT_NOSIGNAL, 1);
 
89
  rv= curl_easy_setopt(curl_handle, CURLOPT_NOBODY, 1);
 
90
 
 
91
  return 0;
 
92
}
 
93
 
 
94
static int finalize(void *p)
 
95
{
 
96
  Auth_http *auth= static_cast<Auth_http *>(p);
 
97
 
 
98
  if (auth)
 
99
    delete auth;
 
100
 
 
101
  curl_easy_cleanup(curl_handle);
 
102
 
 
103
  return 0;
 
104
}
 
105
 
 
106
static DRIZZLE_SYSVAR_BOOL(
 
107
  enable,
 
108
  sysvar_auth_http_enable,
 
109
  PLUGIN_VAR_NOCMDARG,
 
110
  N_("Enable HTTP Auth check"),
 
111
  NULL, /* check func */
 
112
  NULL, /* update func */
 
113
  false /* default */);
 
114
 
 
115
 
 
116
static DRIZZLE_SYSVAR_STR(
 
117
  url,
 
118
  sysvar_auth_http_url,
 
119
  PLUGIN_VAR_READONLY,
 
120
  N_("URL for HTTP Auth check"),
 
121
  NULL, /* check func */
 
122
  NULL, /* update func*/
 
123
  "http://localhost/" /* default */);
 
124
 
 
125
static struct st_mysql_sys_var* auth_http_system_variables[]= {
 
126
  DRIZZLE_SYSVAR(enable),
 
127
  DRIZZLE_SYSVAR(url),
 
128
  NULL
 
129
};
 
130
 
 
131
 
 
132
drizzle_declare_plugin(auth_http)
 
133
{
 
134
  DRIZZLE_AUTH_PLUGIN,
 
135
  "auth_http",
 
136
  "0.1",
 
137
  "Mark Atwood",
 
138
  "PAM based authenication.",
 
139
  PLUGIN_LICENSE_GPL,
 
140
  initialize, /* Plugin Init */
 
141
  finalize, /* Plugin Deinit */
 
142
  NULL,   /* status variables */
 
143
  auth_http_system_variables,
 
144
  NULL    /* config options */
 
145
}
 
146
drizzle_declare_plugin_end;