authd: add abiltiy to cancel connection
This commit is contained in:
parent
0da2a404fa
commit
60374ac975
5 changed files with 62 additions and 18 deletions
|
@ -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,
|
||||||
|
|
|
@ -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];
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue