providers/ident: cleanup things
This commit is contained in:
parent
646e6567c7
commit
06f3496ab3
1 changed files with 93 additions and 81 deletions
|
@ -18,6 +18,12 @@
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* Largely adapted from old s_auth.c, but reworked for authd. rDNS code
|
||||||
|
* moved to its own provider.
|
||||||
|
*
|
||||||
|
* --Elizafox 13 March 2016
|
||||||
|
*/
|
||||||
|
|
||||||
#include "stdinc.h"
|
#include "stdinc.h"
|
||||||
#include "match.h"
|
#include "match.h"
|
||||||
#include "authd.h"
|
#include "authd.h"
|
||||||
|
@ -60,83 +66,9 @@ static struct ev_entry *timeout_ev;
|
||||||
static int ident_timeout = 5;
|
static int ident_timeout = 5;
|
||||||
|
|
||||||
|
|
||||||
bool ident_init(void)
|
|
||||||
{
|
|
||||||
timeout_ev = rb_event_addish("timeout_ident_queries_event", timeout_ident_queries_event, NULL, 1);
|
|
||||||
return (timeout_ev != NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ident_destroy(void)
|
|
||||||
{
|
|
||||||
struct auth_client *auth;
|
|
||||||
rb_dictionary_iter iter;
|
|
||||||
|
|
||||||
/* Nuke all ident queries */
|
|
||||||
RB_DICTIONARY_FOREACH(auth, &iter, auth_clients)
|
|
||||||
{
|
|
||||||
if(auth->data[PROVIDER_IDENT] != NULL)
|
|
||||||
client_fail(auth, REPORT_FAIL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ident_start(struct auth_client *auth)
|
|
||||||
{
|
|
||||||
struct ident_query *query = rb_malloc(sizeof(struct ident_query));
|
|
||||||
struct rb_sockaddr_storage l_addr, c_addr;
|
|
||||||
int family;
|
|
||||||
rb_fde_t *F;
|
|
||||||
|
|
||||||
auth->data[PROVIDER_IDENT] = query;
|
|
||||||
query->timeout = rb_current_time() + ident_timeout;
|
|
||||||
|
|
||||||
if((F = rb_socket(family, SOCK_STREAM, 0, "ident")) == NULL)
|
|
||||||
{
|
|
||||||
client_fail(auth, REPORT_FAIL);
|
|
||||||
return true; /* Not a fatal error */
|
|
||||||
}
|
|
||||||
|
|
||||||
query->F = F;
|
|
||||||
|
|
||||||
/* Build sockaddr_storages for rb_connect_tcp below */
|
|
||||||
memcpy(&l_addr, &auth->l_addr, sizeof(l_addr));
|
|
||||||
memcpy(&c_addr, &auth->c_addr, sizeof(c_addr));
|
|
||||||
|
|
||||||
/* Set the ports correctly */
|
|
||||||
#ifdef RB_IPV6
|
|
||||||
if(GET_SS_FAMILY(&l_addr) == AF_INET6)
|
|
||||||
((struct sockaddr_in6 *)&l_addr)->sin6_port = 0;
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
((struct sockaddr_in *)&l_addr)->sin_port = 0;
|
|
||||||
|
|
||||||
#ifdef RB_IPV6
|
|
||||||
if(GET_SS_FAMILY(&c_addr) == AF_INET6)
|
|
||||||
((struct sockaddr_in6 *)&c_addr)->sin6_port = htons(113);
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
((struct sockaddr_in *)&c_addr)->sin_port = htons(113);
|
|
||||||
|
|
||||||
rb_connect_tcp(F, (struct sockaddr *)&c_addr,
|
|
||||||
(struct sockaddr *)&l_addr,
|
|
||||||
GET_SS_LEN(&l_addr), ident_connected,
|
|
||||||
query, ident_timeout);
|
|
||||||
|
|
||||||
notice_client(auth->cid, messages[REPORT_LOOKUP]);
|
|
||||||
set_provider_on(auth, PROVIDER_IDENT);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ident_cancel(struct auth_client *auth)
|
|
||||||
{
|
|
||||||
struct ident_query *query = auth->data[PROVIDER_IDENT];
|
|
||||||
|
|
||||||
if(query != NULL)
|
|
||||||
client_fail(auth, REPORT_FAIL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Timeout outstanding queries */
|
/* Timeout outstanding queries */
|
||||||
static void timeout_ident_queries_event(void *notused)
|
static void
|
||||||
|
timeout_ident_queries_event(void *notused)
|
||||||
{
|
{
|
||||||
struct auth_client *auth;
|
struct auth_client *auth;
|
||||||
rb_dictionary_iter iter;
|
rb_dictionary_iter iter;
|
||||||
|
@ -161,7 +93,8 @@ static void timeout_ident_queries_event(void *notused)
|
||||||
* a write buffer far greater than this message to store it in should
|
* a write buffer far greater than this message to store it in should
|
||||||
* problems arise. -avalon
|
* problems arise. -avalon
|
||||||
*/
|
*/
|
||||||
static void ident_connected(rb_fde_t *F, int error, void *data)
|
static void
|
||||||
|
ident_connected(rb_fde_t *F, int error, void *data)
|
||||||
{
|
{
|
||||||
struct auth_client *auth = data;
|
struct auth_client *auth = data;
|
||||||
struct ident_query *query = auth->data[PROVIDER_IDENT];
|
struct ident_query *query = auth->data[PROVIDER_IDENT];
|
||||||
|
@ -240,7 +173,8 @@ read_ident_reply(rb_fde_t *F, void *data)
|
||||||
client_success(auth);
|
client_success(auth);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void client_fail(struct auth_client *auth, ident_message report)
|
static void
|
||||||
|
client_fail(struct auth_client *auth, ident_message report)
|
||||||
{
|
{
|
||||||
struct ident_query *query = auth->data[PROVIDER_IDENT];
|
struct ident_query *query = auth->data[PROVIDER_IDENT];
|
||||||
|
|
||||||
|
@ -254,7 +188,8 @@ static void client_fail(struct auth_client *auth, ident_message report)
|
||||||
provider_done(auth, PROVIDER_IDENT);
|
provider_done(auth, PROVIDER_IDENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void client_success(struct auth_client *auth)
|
static void
|
||||||
|
client_success(struct auth_client *auth)
|
||||||
{
|
{
|
||||||
struct ident_query *query = auth->data[PROVIDER_IDENT];
|
struct ident_query *query = auth->data[PROVIDER_IDENT];
|
||||||
|
|
||||||
|
@ -269,8 +204,7 @@ static void client_success(struct auth_client *auth)
|
||||||
/* get_valid_ident
|
/* get_valid_ident
|
||||||
* parse ident query reply from identd server
|
* parse ident query reply from identd server
|
||||||
*
|
*
|
||||||
* Torn out of old s_auth.c because there was nothing wrong with it
|
* Taken from old s_auth.c --Elizafox
|
||||||
* --Elizafox
|
|
||||||
*
|
*
|
||||||
* Inputs - pointer to ident buf
|
* Inputs - pointer to ident buf
|
||||||
* Outputs - NULL if no valid ident found, otherwise pointer to name
|
* Outputs - NULL if no valid ident found, otherwise pointer to name
|
||||||
|
@ -331,6 +265,84 @@ get_valid_ident(char *buf)
|
||||||
return (colon3Ptr);
|
return (colon3Ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
ident_init(void)
|
||||||
|
{
|
||||||
|
timeout_ev = rb_event_addish("timeout_ident_queries_event", timeout_ident_queries_event, NULL, 1);
|
||||||
|
return (timeout_ev != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ident_destroy(void)
|
||||||
|
{
|
||||||
|
struct auth_client *auth;
|
||||||
|
rb_dictionary_iter iter;
|
||||||
|
|
||||||
|
/* Nuke all ident queries */
|
||||||
|
RB_DICTIONARY_FOREACH(auth, &iter, auth_clients)
|
||||||
|
{
|
||||||
|
if(auth->data[PROVIDER_IDENT] != NULL)
|
||||||
|
client_fail(auth, REPORT_FAIL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool ident_start(struct auth_client *auth)
|
||||||
|
{
|
||||||
|
struct ident_query *query = rb_malloc(sizeof(struct ident_query));
|
||||||
|
struct rb_sockaddr_storage l_addr, c_addr;
|
||||||
|
int family;
|
||||||
|
rb_fde_t *F;
|
||||||
|
|
||||||
|
auth->data[PROVIDER_IDENT] = query;
|
||||||
|
query->timeout = rb_current_time() + ident_timeout;
|
||||||
|
|
||||||
|
if((F = rb_socket(family, SOCK_STREAM, 0, "ident")) == NULL)
|
||||||
|
{
|
||||||
|
client_fail(auth, REPORT_FAIL);
|
||||||
|
return true; /* Not a fatal error */
|
||||||
|
}
|
||||||
|
|
||||||
|
query->F = F;
|
||||||
|
|
||||||
|
/* Build sockaddr_storages for rb_connect_tcp below */
|
||||||
|
memcpy(&l_addr, &auth->l_addr, sizeof(l_addr));
|
||||||
|
memcpy(&c_addr, &auth->c_addr, sizeof(c_addr));
|
||||||
|
|
||||||
|
/* Set the ports correctly */
|
||||||
|
#ifdef RB_IPV6
|
||||||
|
if(GET_SS_FAMILY(&l_addr) == AF_INET6)
|
||||||
|
((struct sockaddr_in6 *)&l_addr)->sin6_port = 0;
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
((struct sockaddr_in *)&l_addr)->sin_port = 0;
|
||||||
|
|
||||||
|
#ifdef RB_IPV6
|
||||||
|
if(GET_SS_FAMILY(&c_addr) == AF_INET6)
|
||||||
|
((struct sockaddr_in6 *)&c_addr)->sin6_port = htons(113);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
((struct sockaddr_in *)&c_addr)->sin_port = htons(113);
|
||||||
|
|
||||||
|
rb_connect_tcp(F, (struct sockaddr *)&c_addr,
|
||||||
|
(struct sockaddr *)&l_addr,
|
||||||
|
GET_SS_LEN(&l_addr), ident_connected,
|
||||||
|
query, ident_timeout);
|
||||||
|
|
||||||
|
notice_client(auth->cid, messages[REPORT_LOOKUP]);
|
||||||
|
set_provider_on(auth, PROVIDER_IDENT);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ident_cancel(struct auth_client *auth)
|
||||||
|
{
|
||||||
|
struct ident_query *query = auth->data[PROVIDER_IDENT];
|
||||||
|
|
||||||
|
if(query != NULL)
|
||||||
|
client_fail(auth, REPORT_FAIL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
struct auth_provider ident_provider =
|
struct auth_provider ident_provider =
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue