25
25
#include "drizzled/plugin/authorization.h"
26
#include "drizzled/security_context.h"
26
27
#include "drizzled/identifier.h"
27
28
#include "drizzled/error.h"
28
29
#include "drizzled/session.h"
29
30
#include "drizzled/gettext.h"
34
std::vector<plugin::Authorization *> authorization_plugins;
37
vector<plugin::Authorization *> authorization_plugins;
37
40
bool plugin::Authorization::addPlugin(plugin::Authorization *auth)
40
43
authorization_plugins.push_back(auth);
49
authorization_plugins.erase(std::find(authorization_plugins.begin(),
50
authorization_plugins.end(),
51
authorization_plugins.erase(find(authorization_plugins.begin(),
52
authorization_plugins.end(),
58
60
class RestrictDbFunctor :
59
public std::unary_function<plugin::Authorization *, bool>
61
public unary_function<plugin::Authorization *, bool>
61
const identifier::User &user_ctx;
62
SchemaIdentifier::const_reference schema;
63
const SecurityContext &user_ctx;
64
SchemaIdentifier &schema;
65
RestrictDbFunctor(const identifier::User &user_ctx_arg,
66
SchemaIdentifier::const_reference schema_arg) :
67
std::unary_function<plugin::Authorization *, bool>(),
66
RestrictDbFunctor(const SecurityContext &user_ctx_arg,
67
SchemaIdentifier &schema_arg) :
68
unary_function<plugin::Authorization *, bool>(),
68
69
user_ctx(user_ctx_arg),
78
79
class RestrictTableFunctor :
79
public std::unary_function<plugin::Authorization *, bool>
80
public unary_function<plugin::Authorization *, bool>
81
const identifier::User &user_ctx;
82
const SecurityContext &user_ctx;
82
83
TableIdentifier &table;
84
RestrictTableFunctor(const identifier::User &user_ctx_arg,
85
RestrictTableFunctor(const SecurityContext &user_ctx_arg,
85
86
TableIdentifier &table_arg) :
86
std::unary_function<plugin::Authorization *, bool>(),
87
unary_function<plugin::Authorization *, bool>(),
87
88
user_ctx(user_ctx_arg),
97
98
class RestrictProcessFunctor :
98
public std::unary_function<plugin::Authorization *, bool>
99
public unary_function<plugin::Authorization *, bool>
100
const identifier::User &user_ctx;
101
const identifier::User &session_ctx;
101
const SecurityContext &user_ctx;
102
const SecurityContext &session_ctx;
103
RestrictProcessFunctor(const identifier::User &user_ctx_arg,
104
const identifier::User &session_ctx_arg) :
105
std::unary_function<plugin::Authorization *, bool>(),
104
RestrictProcessFunctor(const SecurityContext &user_ctx_arg,
105
const SecurityContext &session_ctx_arg) :
106
unary_function<plugin::Authorization *, bool>(),
106
107
user_ctx(user_ctx_arg),
107
108
session_ctx(session_ctx_arg)
116
117
class PruneSchemaFunctor :
117
public std::unary_function<SchemaIdentifier&, bool>
118
public unary_function<SchemaIdentifier&, bool>
119
drizzled::identifier::User::const_shared_ptr user_ctx;
120
const SecurityContext &user_ctx;
121
PruneSchemaFunctor(drizzled::identifier::User::const_shared_ptr user_ctx_arg) :
122
std::unary_function<SchemaIdentifier&, bool>(),
122
PruneSchemaFunctor(const SecurityContext &user_ctx_arg) :
123
unary_function<SchemaIdentifier&, bool>(),
123
124
user_ctx(user_ctx_arg)
132
133
} /* namespace */
134
bool plugin::Authorization::isAuthorized(identifier::User::const_shared_ptr user_ctx,
135
SchemaIdentifier::const_reference schema_identifier,
135
bool plugin::Authorization::isAuthorized(const SecurityContext &user_ctx,
136
SchemaIdentifier &schema_identifier,
138
139
/* If we never loaded any authorization plugins, just return true */
142
143
/* Use find_if instead of foreach so that we can collect return codes */
143
std::vector<plugin::Authorization *>::const_iterator iter=
144
std::find_if(authorization_plugins.begin(),
145
authorization_plugins.end(),
146
RestrictDbFunctor(*user_ctx, schema_identifier));
144
vector<plugin::Authorization *>::const_iterator iter=
145
find_if(authorization_plugins.begin(),
146
authorization_plugins.end(),
147
RestrictDbFunctor(user_ctx, schema_identifier));
159
schema_identifier.getSQLPath(path);
161
159
my_error(ER_DBACCESS_DENIED_ERROR, MYF(0),
162
user_ctx->username().c_str(),
163
user_ctx->address().c_str(),
160
user_ctx.getUser().c_str(),
161
user_ctx.getIp().c_str(),
162
schema_identifier.getSQLPath().c_str());
171
bool plugin::Authorization::isAuthorized(drizzled::identifier::User::const_shared_ptr user_ctx,
169
bool plugin::Authorization::isAuthorized(const SecurityContext &user_ctx,
172
170
TableIdentifier &table,
179
177
/* Use find_if instead of foreach so that we can collect return codes */
180
std::vector<plugin::Authorization *>::const_iterator iter=
181
std::find_if(authorization_plugins.begin(),
178
vector<plugin::Authorization *>::const_iterator iter=
179
find_if(authorization_plugins.begin(),
182
180
authorization_plugins.end(),
183
RestrictTableFunctor(*user_ctx, table));
181
RestrictTableFunctor(user_ctx, table));
186
184
* If iter is == end() here, that means that all of the plugins returned
195
table.getSQLPath(path);
197
192
my_error(ER_DBACCESS_DENIED_ERROR, MYF(0),
198
user_ctx->username().c_str(),
199
user_ctx->address().c_str(),
193
user_ctx.getUser().c_str(),
194
user_ctx.getIp().c_str(),
195
table.getSQLPath().c_str());
207
bool plugin::Authorization::isAuthorized(drizzled::identifier::User::const_shared_ptr user_ctx,
208
const Session *session,
211
return isAuthorized(*user_ctx, session, send_error);
214
bool plugin::Authorization::isAuthorized(drizzled::identifier::User::const_reference user_ctx,
215
const Session *session,
218
drizzled::identifier::User::const_shared_ptr session_ctx= session->user();
202
bool plugin::Authorization::isAuthorized(const SecurityContext &user_ctx,
203
const Session *session,
206
const SecurityContext &session_ctx= session->getSecurityContext();
220
208
/* If we never loaded any authorization plugins, just return true */
221
209
if (authorization_plugins.empty())
224
212
/* Use find_if instead of foreach so that we can collect return codes */
225
std::vector<plugin::Authorization *>::const_iterator iter=
226
std::find_if(authorization_plugins.begin(),
227
authorization_plugins.end(),
228
RestrictProcessFunctor(user_ctx, *session_ctx));
213
vector<plugin::Authorization *>::const_iterator iter=
214
find_if(authorization_plugins.begin(),
215
authorization_plugins.end(),
216
RestrictProcessFunctor(user_ctx, session_ctx));
231
219
* If iter is == end() here, that means that all of the plugins returned
248
void plugin::Authorization::pruneSchemaNames(drizzled::identifier::User::const_shared_ptr user_ctx,
249
SchemaIdentifier::vector &set_of_schemas)
235
void plugin::Authorization::pruneSchemaNames(const SecurityContext &user_ctx,
236
SchemaIdentifiers &set_of_schemas)
251
238
/* If we never loaded any authorization plugins, just return true */
252
239
if (authorization_plugins.empty())
255
set_of_schemas.erase(std::remove_if(set_of_schemas.begin(),
256
set_of_schemas.end(),
257
PruneSchemaFunctor(user_ctx)),
242
set_of_schemas.erase(remove_if(set_of_schemas.begin(),
243
set_of_schemas.end(),
244
PruneSchemaFunctor(user_ctx)),
258
245
set_of_schemas.end());