authd/provider: add options handlers for providers

This allows providers to create handlers for changing their
configuration.
This commit is contained in:
Elizabeth Myers 2016-03-25 23:04:00 -05:00
parent db821ee9ba
commit a51487e0e7
4 changed files with 67 additions and 4 deletions

View file

@ -27,11 +27,13 @@
static void handle_reload(int parc, char *parv[]);
static void handle_stat(int parc, char *parv[]);
static void handle_options(int parc, char *parv[]);
rb_helper *authd_helper = NULL;
authd_cmd_handler authd_cmd_handlers[256] = {
['C'] = handle_new_connection,
['D'] = resolve_dns,
['O'] = handle_options,
['R'] = handle_reload,
['S'] = handle_stat,
};
@ -44,6 +46,8 @@ authd_reload_handler authd_reload_handlers[256] = {
['D'] = reload_nameservers,
};
rb_dictionary *authd_option_handlers;
static void
handle_stat(int parc, char *parv[])
{
@ -61,6 +65,32 @@ handle_stat(int parc, char *parv[])
handler(parv[1], parv[2][0]);
}
static void
handle_options(int parc, char *parv[])
{
struct auth_opts_handler *handler;
if(parc < 4)
{
warn_opers(L_CRIT, "BUG: handle_options received too few parameters (at least 4 expected, got %d)", parc);
return;
}
if((handler = rb_dictionary_retrieve(authd_option_handlers, parv[1])) == NULL)
{
warn_opers(L_CRIT, "BUG: handle_options got a bad option type %s", parv[1]);
return;
}
if((parc - 2) < handler->min_parc)
{
warn_opers(L_CRIT, "BUG: handle_options received too few parameters (at least %d expected, got %d)", handler->min_parc, parc);
return;
}
handler->handler(parv[1], parc - 2, (const char **)(parv + 3));
}
static void
handle_reload(int parc, char *parv[])
{
@ -69,7 +99,7 @@ handle_reload(int parc, char *parv[])
if(parc < 2)
{
/* Reload all handlers */
for(size_t i = 0; i < sizeof(authd_reload_handlers); i++)
for(size_t i = 0; i < 256; i++)
{
if ((handler = authd_reload_handlers[(unsigned char) i]) != NULL)
handler(parv[1][0]);
@ -163,6 +193,9 @@ main(int argc, char *argv[])
rb_set_time();
setup_signals();
authd_option_handlers = rb_dictionary_create("authd options handlers", strcasecmp);
init_resolver();
init_providers();
rb_init_prng(NULL, RB_PRNG_DEFAULT);

View file

@ -21,12 +21,22 @@
#ifndef _AUTHD_H
#define _AUTHD_H
#include <rb_lib.h>
#include <stdio.h>
#include "stdinc.h"
#include "rb_lib.h"
#include "rb_dictionary.h"
#include "setup.h"
#include "ircd_defs.h"
typedef void (*provider_opts_handler_t)(const char *, int, const char **);
struct auth_opts_handler
{
const char *option;
int min_parc;
provider_opts_handler_t handler;
};
extern rb_helper *authd_helper;
typedef void (*authd_cmd_handler)(int parc, char *parv[]);
@ -37,4 +47,6 @@ extern authd_cmd_handler authd_cmd_handlers[256];
extern authd_stat_handler authd_stat_handlers[256];
extern authd_reload_handler authd_reload_handlers[256];
extern rb_dictionary *authd_option_handlers;
#endif

View file

@ -65,12 +65,27 @@ void load_provider(struct auth_provider *provider)
return;
}
if(provider->opt_handlers != NULL)
{
struct auth_opts_handler *handler;
for(handler = provider->opt_handlers; handler->option != NULL; handler++)
rb_dictionary_add(authd_option_handlers, handler->option, handler);
}
provider->init();
rb_dlinkAdd(provider, &provider->node, &auth_providers);
}
void unload_provider(struct auth_provider *provider)
{
if(provider->opt_handlers != NULL)
{
struct auth_opts_handler *handler;
for(handler = provider->opt_handlers; handler->option != NULL; handler++)
rb_dictionary_delete(authd_option_handlers, handler->option);
}
provider->destroy();
rb_dlinkDelete(&provider->node, &auth_providers);
}

View file

@ -22,6 +22,7 @@
#define __CHARYBDIS_AUTHD_PROVIDER_H__
#include "stdinc.h"
#include "authd.h"
#include "rb_dictionary.h"
#define MAX_PROVIDERS 32 /* This should be enough */
@ -61,7 +62,7 @@ typedef void (*provider_destroy_t)(void);
typedef bool (*provider_start_t)(struct auth_client *);
typedef void (*provider_cancel_t)(struct auth_client *);
typedef void (*provider_complete_t)(struct auth_client *, provider_t provider);
typedef void (*provider_complete_t)(struct auth_client *, provider_t);
struct auth_provider
{
@ -75,6 +76,8 @@ struct auth_provider
provider_start_t start; /* Perform authentication */
provider_cancel_t cancel; /* Authentication cancelled */
provider_complete_t completed; /* Callback for when other performers complete (think dependency chains) */
struct auth_opts_handler *opt_handlers;
};
extern rb_dlink_list auth_providers;