authd: add abiltiy to cancel connection

This commit is contained in:
Elizabeth Myers 2016-03-26 23:54:21 -05:00
parent 0da2a404fa
commit 60374ac975
5 changed files with 62 additions and 18 deletions

View file

@ -32,7 +32,8 @@ 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'] = handle_resolve_dns,
['E'] = handle_cancel_connection,
['O'] = handle_options, ['O'] = handle_options,
['R'] = handle_reload, ['R'] = handle_reload,
['S'] = handle_stat, ['S'] = handle_stat,

View file

@ -221,7 +221,7 @@ submit_dns_answer(const char *reply, bool status, query_type type, void *data)
} }
void void
resolve_dns(int parc, char *parv[]) handle_resolve_dns(int parc, char *parv[])
{ {
char *id = rb_strdup(parv[1]); char *id = rb_strdup(parv[1]);
char qtype = *parv[2]; char qtype = *parv[2];

View file

@ -54,7 +54,7 @@ extern struct dns_query *lookup_hostname(const char *ip, DNSCB callback, void *d
extern struct dns_query *lookup_ip(const char *host, int aftype, DNSCB callback, void *data); extern struct dns_query *lookup_ip(const char *host, int aftype, DNSCB callback, void *data);
extern void cancel_query(struct dns_query *query); extern void cancel_query(struct dns_query *query);
extern void resolve_dns(int parc, char *parv[]); extern void handle_resolve_dns(int parc, char *parv[]);
extern void enumerate_nameservers(const char *rid, const char letter); extern void enumerate_nameservers(const char *rid, const char letter);
extern void reload_nameservers(const char letter); extern void reload_nameservers(const char letter);

View file

@ -57,7 +57,8 @@ rb_dlink_list auth_providers;
rb_dictionary *auth_clients; rb_dictionary *auth_clients;
/* Load a provider */ /* Load a provider */
void load_provider(struct auth_provider *provider) void
load_provider(struct auth_provider *provider)
{ {
if(rb_dlink_list_length(&auth_providers) >= MAX_PROVIDERS) if(rb_dlink_list_length(&auth_providers) >= MAX_PROVIDERS)
{ {
@ -77,7 +78,8 @@ void load_provider(struct auth_provider *provider)
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) if(provider->opt_handlers != NULL)
{ {
@ -91,7 +93,8 @@ void unload_provider(struct auth_provider *provider)
} }
/* Initalise all providers */ /* Initalise all providers */
void init_providers(void) void
init_providers(void)
{ {
auth_clients = rb_dictionary_create("pending auth clients", rb_uint32cmp); auth_clients = rb_dictionary_create("pending auth clients", rb_uint32cmp);
load_provider(&rdns_provider); load_provider(&rdns_provider);
@ -100,7 +103,8 @@ void init_providers(void)
} }
/* Terminate all providers */ /* Terminate all providers */
void destroy_providers(void) void
destroy_providers(void)
{ {
rb_dlink_node *ptr; rb_dlink_node *ptr;
rb_dictionary_iter iter; rb_dictionary_iter iter;
@ -124,7 +128,8 @@ void destroy_providers(void)
} }
/* Cancel outstanding providers for a client */ /* Cancel outstanding providers for a client */
void cancel_providers(struct auth_client *auth) void
cancel_providers(struct auth_client *auth)
{ {
rb_dlink_node *ptr; rb_dlink_node *ptr;
struct auth_provider *provider; struct auth_provider *provider;
@ -143,7 +148,8 @@ void cancel_providers(struct auth_client *auth)
} }
/* Provider is done - WARNING: do not use auth instance after calling! */ /* Provider is done - WARNING: do not use auth instance after calling! */
void provider_done(struct auth_client *auth, provider_t id) void
provider_done(struct auth_client *auth, provider_t id)
{ {
rb_dlink_node *ptr; rb_dlink_node *ptr;
struct auth_provider *provider; struct auth_provider *provider;
@ -170,7 +176,8 @@ void provider_done(struct auth_client *auth, provider_t id)
} }
/* Reject a client - WARNING: do not use auth instance after calling! */ /* Reject a client - WARNING: do not use auth instance after calling! */
void reject_client(struct auth_client *auth, provider_t id, const char *reason) void
reject_client(struct auth_client *auth, provider_t id, const char *reason)
{ {
char reject; char reject;
@ -201,7 +208,8 @@ void reject_client(struct auth_client *auth, provider_t id, const char *reason)
} }
/* Accept a client, cancel outstanding providers if any - WARNING: do nto use auth instance after calling! */ /* Accept a client, cancel outstanding providers if any - WARNING: do nto use auth instance after calling! */
void accept_client(struct auth_client *auth, provider_t id) void
accept_client(struct auth_client *auth, provider_t id)
{ {
uint32_t cid = auth->cid; uint32_t cid = auth->cid;
@ -212,7 +220,8 @@ void accept_client(struct auth_client *auth, provider_t id)
} }
/* Begin authenticating user */ /* Begin authenticating user */
static void start_auth(const char *cid, const char *l_ip, const char *l_port, const char *c_ip, const char *c_port) static void
start_auth(const char *cid, const char *l_ip, const char *l_port, const char *c_ip, const char *c_port)
{ {
struct auth_provider *provider; struct auth_provider *provider;
struct auth_client *auth = rb_malloc(sizeof(struct auth_client)); struct auth_client *auth = rb_malloc(sizeof(struct auth_client));
@ -280,7 +289,8 @@ static void start_auth(const char *cid, const char *l_ip, const char *l_port, co
} }
/* Callback for the initiation */ /* Callback for the initiation */
void handle_new_connection(int parc, char *parv[]) void
handle_new_connection(int parc, char *parv[])
{ {
if(parc < 6) if(parc < 6)
{ {
@ -290,3 +300,30 @@ void handle_new_connection(int parc, char *parv[])
start_auth(parv[1], parv[2], parv[3], parv[4], parv[5]); start_auth(parv[1], parv[2], parv[3], parv[4], parv[5]);
} }
void
handle_cancel_connection(int parc, char *parv[])
{
struct auth_client *auth;
long lcid;
if(parc < 2)
{
warn_opers(L_CRIT, "BUG: received too few params for new connection (2 expected, got %d)", parc);
return;
}
if((lcid = strtol(parv[1], NULL, 16)) > UINT32_MAX)
{
warn_opers(L_CRIT, "BUG: got a request to cancel a connection that can't exist: %lx", lcid);
return;
}
if((auth = rb_dictionary_retrieve(auth_clients, RB_UINT_TO_POINTER((uint32_t)lcid))) == NULL)
{
warn_opers(L_CRIT, "BUG: tried to cancel nonexistent connection %lx", lcid);
return;
}
cancel_providers(auth);
}

View file

@ -100,32 +100,38 @@ void accept_client(struct auth_client *auth, provider_t id);
void reject_client(struct auth_client *auth, provider_t id, const char *reason); void reject_client(struct auth_client *auth, provider_t id, const char *reason);
void handle_new_connection(int parc, char *parv[]); void handle_new_connection(int parc, char *parv[]);
void handle_cancel_connection(int parc, char *parv[]);
/* Provider is operating on this auth_client (set this if you have async work to do) */ /* Provider is operating on this auth_client (set this if you have async work to do) */
static inline void set_provider_on(struct auth_client *auth, provider_t provider) static inline void
set_provider_on(struct auth_client *auth, provider_t provider)
{ {
auth->providers |= (1 << provider); auth->providers |= (1 << provider);
} }
/* Provider is no longer operating on this auth client (you should use provider_done) */ /* Provider is no longer operating on this auth client (you should use provider_done) */
static inline void set_provider_off(struct auth_client *auth, provider_t provider) static inline void
set_provider_off(struct auth_client *auth, provider_t provider)
{ {
auth->providers &= ~(1 << provider); auth->providers &= ~(1 << provider);
} }
/* Set the provider to done (you should use provider_done) */ /* Set the provider to done (you should use provider_done) */
static inline void set_provider_done(struct auth_client *auth, provider_t provider) static inline void
set_provider_done(struct auth_client *auth, provider_t provider)
{ {
auth->providers_done |= (1 << provider); auth->providers_done |= (1 << provider);
} }
/* Check if provider is operating on this auth client */ /* Check if provider is operating on this auth client */
static inline bool is_provider_on(struct auth_client *auth, provider_t provider) static inline bool
is_provider_on(struct auth_client *auth, provider_t provider)
{ {
return auth->providers & (1 << provider); return auth->providers & (1 << provider);
} }
static inline bool is_provider_done(struct auth_client *auth, provider_t provider) static inline bool
is_provider_done(struct auth_client *auth, provider_t provider)
{ {
return auth->providers_done & (1 << provider); return auth->providers_done & (1 << provider);
} }