~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to plugin/auth_schema/auth_schema.cc

  • Committer: Daniel
  • Date: 2011-10-10 04:56:21 UTC
  • mto: This revision was merged to the branch mainline in revision 2437.
  • Revision ID: daniel@ubuntu-10-20111010045621-lav426gcxgksx0wb
Enable plugin by default.  Always escape and backtick quote the auth table name.

Show diffs side-by-side

added added

removed removed

Lines of Context:
31
31
namespace drizzle_plugin {
32
32
namespace auth_schema {
33
33
 
34
 
AuthSchema::AuthSchema() :
35
 
  plugin::Authentication("auth_schema")
 
34
AuthSchema::AuthSchema(bool enabled) :
 
35
  plugin::Authentication("auth_schema"),
 
36
    sysvar_enabled(enabled)
36
37
{
 
38
  const char *error;
 
39
  int erroffset;
 
40
  _ident_re= pcre_compile(
 
41
    "^`[^`]+`",   /* the pattern */
 
42
    0,            /* default options */
 
43
    &error,       /* for error message */
 
44
    &erroffset,   /* for error offset */
 
45
    NULL);        /* use default character tables */
37
46
}
38
47
 
39
48
bool AuthSchema::setTable(const string &table)
44
53
    return true;  // error
45
54
  }
46
55
 
47
 
  if (table.find(" ") != string::npos)
 
56
  if (table.find(".") == string::npos)
48
57
  {
49
 
    errmsg_printf(error::ERROR, _("auth_schema table cannot contain spaces"));
 
58
    errmsg_printf(error::ERROR, _("auth_schema must be schema-qualified"));
50
59
    return true;  // error
51
60
  }
52
61
 
53
 
  sysvar_table= table;
 
62
  sysvar_table= escapeQuoteAuthTable(table);
54
63
 
55
64
  return false;  // success
56
65
}
150
159
  return false;
151
160
}
152
161
 
 
162
string AuthSchema::escapeQuoteAuthTable(const string &table)
 
163
{
 
164
  int pos= table.find(".");
 
165
  string quoted_schema= escapeQuoteIdentifier(table.substr(0, pos));
 
166
  string quoted_table= escapeQuoteIdentifier(table.substr(pos + 1, table.length() - pos));
 
167
  return quoted_schema + "." + quoted_table;
 
168
}
 
169
 
 
170
string AuthSchema::escapeQuoteIdentifier(const string &input)
 
171
{
 
172
  if (input.empty())
 
173
    return "``";
 
174
 
 
175
  /**
 
176
   * The input may already be a quoted ident with no extra backticks.
 
177
   * If so, return it.
 
178
   */
 
179
  int match_result= pcre_exec(
 
180
    _ident_re, NULL, input.c_str(), input.length(), 0, 0, NULL, 0);
 
181
  if (match_result >= 0)
 
182
    return input;
 
183
 
 
184
  const char *pos= input.c_str();
 
185
  const char *end= input.c_str()+input.length();
 
186
  string ident= "`";
 
187
 
 
188
  for (; pos != end ; pos++)
 
189
  {
 
190
    switch (*pos) {
 
191
    case '`':
 
192
      ident.push_back('\\');
 
193
      ident.push_back('`');
 
194
      break;
 
195
    case '\\':
 
196
      ident.push_back('\\');
 
197
      ident.push_back('\\');
 
198
      break;
 
199
    default:
 
200
      ident.push_back(*pos);
 
201
      break;
 
202
    }
 
203
  }
 
204
 
 
205
  ident.push_back('`');
 
206
 
 
207
  return ident;
 
208
}
 
209
 
153
210
string AuthSchema::escapeString(const string &input)
154
211
{
155
 
  return input;
156
212
  if (input.empty())
157
213
    return input;
158
214
 
192
248
  return res;
193
249
}
194
250
 
 
251
AuthSchema::~AuthSchema()
 
252
{
 
253
  if (_ident_re != NULL)
 
254
    pcre_free(_ident_re);
 
255
}
 
256
 
195
257
} /* end namespace drizzle_plugin::auth_schema */
196
258
} /* end namespace drizzle_plugin */