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_reload(int parc, char *parv[]);
static void handle_stat(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; rb_helper *authd_helper = NULL;
authd_cmd_handler authd_cmd_handlers[256] = { authd_cmd_handler authd_cmd_handlers[256] = {
['C'] = handle_new_connection, ['C'] = handle_new_connection,
['D'] = resolve_dns, ['D'] = resolve_dns,
['O'] = handle_options,
['R'] = handle_reload, ['R'] = handle_reload,
['S'] = handle_stat, ['S'] = handle_stat,
}; };
@ -44,6 +46,8 @@ authd_reload_handler authd_reload_handlers[256] = {
['D'] = reload_nameservers, ['D'] = reload_nameservers,
}; };
rb_dictionary *authd_option_handlers;
static void static void
handle_stat(int parc, char *parv[]) handle_stat(int parc, char *parv[])
{ {
@ -61,6 +65,32 @@ handle_stat(int parc, char *parv[])
handler(parv[1], parv[2][0]); 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 static void
handle_reload(int parc, char *parv[]) handle_reload(int parc, char *parv[])
{ {
@ -69,7 +99,7 @@ handle_reload(int parc, char *parv[])
if(parc < 2) if(parc < 2)
{ {
/* Reload all handlers */ /* 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) if ((handler = authd_reload_handlers[(unsigned char) i]) != NULL)
handler(parv[1][0]); handler(parv[1][0]);
@ -163,6 +193,9 @@ main(int argc, char *argv[])
rb_set_time(); rb_set_time();
setup_signals(); setup_signals();
authd_option_handlers = rb_dictionary_create("authd options handlers", strcasecmp);
init_resolver(); init_resolver();
init_providers(); init_providers();
rb_init_prng(NULL, RB_PRNG_DEFAULT); rb_init_prng(NULL, RB_PRNG_DEFAULT);

View file

@ -21,12 +21,22 @@
#ifndef _AUTHD_H #ifndef _AUTHD_H
#define _AUTHD_H #define _AUTHD_H
#include <rb_lib.h> #include "stdinc.h"
#include <stdio.h> #include "rb_lib.h"
#include "rb_dictionary.h"
#include "setup.h" #include "setup.h"
#include "ircd_defs.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; extern rb_helper *authd_helper;
typedef void (*authd_cmd_handler)(int parc, char *parv[]); 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_stat_handler authd_stat_handlers[256];
extern authd_reload_handler authd_reload_handlers[256]; extern authd_reload_handler authd_reload_handlers[256];
extern rb_dictionary *authd_option_handlers;
#endif #endif

View file

@ -65,12 +65,27 @@ void load_provider(struct auth_provider *provider)
return; 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(); provider->init();
rb_dlinkAdd(provider, &provider->node, &auth_providers); rb_dlinkAdd(provider, &provider->node, &auth_providers);
} }
void unload_provider(struct auth_provider *provider) 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(); provider->destroy();
rb_dlinkDelete(&provider->node, &auth_providers); rb_dlinkDelete(&provider->node, &auth_providers);
} }

View file

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