krb5, kadm5: refactor plugin API
Refactor plugin framework to use a single list of loaded plugins; add a new plugin API where DSOs export a load function that can declare dependencies and export multiple plugins; refactor kadm5 hook API to use krb5 plugin framework. More information in krb5-plugin(7).
This commit is contained in:

committed by
Nico Williams

parent
e9b3b2326d
commit
803efebca5
@@ -35,29 +35,54 @@
|
||||
|
||||
RCSID("$Id$");
|
||||
|
||||
struct delete_principal_hook_ctx {
|
||||
kadm5_server_context *context;
|
||||
enum kadm5_hook_stage stage;
|
||||
krb5_error_code code;
|
||||
krb5_const_principal princ;
|
||||
};
|
||||
|
||||
static krb5_error_code
|
||||
delete_principal_hook_cb(krb5_context context,
|
||||
const void *hook,
|
||||
void *hookctx,
|
||||
void *userctx)
|
||||
{
|
||||
krb5_error_code ret;
|
||||
const struct kadm5_hook_ftable *ftable = hook;
|
||||
struct delete_principal_hook_ctx *ctx = userctx;
|
||||
|
||||
ret = ftable->delete(context, hookctx,
|
||||
ctx->stage, ctx->code, ctx->princ);
|
||||
if (ret != 0 && ret != KRB5_PLUGIN_NO_HANDLE)
|
||||
_kadm5_s_set_hook_error_message(ctx->context, ret, "delete",
|
||||
hook, ctx->stage);
|
||||
|
||||
/* only pre-commit plugins can abort */
|
||||
if (ret == 0 || ctx->stage == KADM5_HOOK_STAGE_POSTCOMMIT)
|
||||
ret = KRB5_PLUGIN_NO_HANDLE;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static kadm5_ret_t
|
||||
delete_principal_hook(kadm5_server_context *context,
|
||||
enum kadm5_hook_stage stage,
|
||||
krb5_error_code code,
|
||||
krb5_const_principal princ)
|
||||
{
|
||||
krb5_error_code ret = 0;
|
||||
size_t i;
|
||||
krb5_error_code ret;
|
||||
struct delete_principal_hook_ctx ctx;
|
||||
|
||||
for (i = 0; i < context->num_hooks; i++) {
|
||||
kadm5_hook_context *hook = context->hooks[i];
|
||||
ctx.context = context;
|
||||
ctx.stage = stage;
|
||||
ctx.code = code;
|
||||
ctx.princ = princ;
|
||||
|
||||
if (hook->hook->delete != NULL) {
|
||||
ret = hook->hook->delete(context->context, hook->data,
|
||||
stage, code, princ);
|
||||
if (ret != 0) {
|
||||
_kadm5_s_set_hook_error_message(context, ret, "delete",
|
||||
hook->hook, stage);
|
||||
if (stage == KADM5_HOOK_STAGE_PRECOMMIT)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
ret = _krb5_plugin_run_f(context->context, &kadm5_hook_plugin_data,
|
||||
0, &ctx, delete_principal_hook_cb);
|
||||
if (ret == KRB5_PLUGIN_NO_HANDLE)
|
||||
ret = 0;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
Reference in New Issue
Block a user