authd/provider: add options handlers for providers
This allows providers to create handlers for changing their configuration.
This commit is contained in:
parent
db821ee9ba
commit
a51487e0e7
4 changed files with 67 additions and 4 deletions
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue