diff --git a/authd/Makefile.am b/authd/Makefile.am index 6cb60b410..6dac4f485 100644 --- a/authd/Makefile.am +++ b/authd/Makefile.am @@ -3,5 +3,5 @@ AM_CFLAGS=$(WARNFLAGS) AM_CPPFLAGS = -I../include -I../libratbox/include -authd_SOURCES = authd.c res.c reslib.c +authd_SOURCES = authd.c res.c reslib.c dns.c authd_LDADD = ../libratbox/src/libratbox.la diff --git a/authd/Makefile.in b/authd/Makefile.in index 85e1a5de6..20a2646ef 100644 --- a/authd/Makefile.in +++ b/authd/Makefile.in @@ -107,7 +107,8 @@ CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(pkglibexecdir)" PROGRAMS = $(pkglibexec_PROGRAMS) -am_authd_OBJECTS = authd.$(OBJEXT) res.$(OBJEXT) reslib.$(OBJEXT) +am_authd_OBJECTS = authd.$(OBJEXT) res.$(OBJEXT) reslib.$(OBJEXT) \ + dns.$(OBJEXT) authd_OBJECTS = $(am_authd_OBJECTS) authd_DEPENDENCIES = ../libratbox/src/libratbox.la AM_V_lt = $(am__v_lt_@AM_V@) @@ -358,7 +359,7 @@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CFLAGS = $(WARNFLAGS) AM_CPPFLAGS = -I../include -I../libratbox/include -authd_SOURCES = authd.c res.c reslib.c +authd_SOURCES = authd.c res.c reslib.c dns.c authd_LDADD = ../libratbox/src/libratbox.la all: all-am @@ -454,6 +455,7 @@ distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authd.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dns.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/res.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reslib.Po@am__quote@ diff --git a/authd/authd.c b/authd/authd.c index f8007a289..36f5dae76 100644 --- a/authd/authd.c +++ b/authd/authd.c @@ -24,7 +24,9 @@ #define MAXPARA 10 rb_helper *authd_helper = NULL; -authd_cmd_handler authd_cmd_handlers[255] = {}; +authd_cmd_handler authd_cmd_handlers[255] = { + ['D'] = resolve_dns, +}; static void parse_request(rb_helper *helper) @@ -103,6 +105,11 @@ main(int argc, char *argv[]) exit(1); } + rb_set_time(); + setup_signals(); + init_resolver(); + rb_init_prng(NULL, RB_PRNG_DEFAULT); + rb_helper_loop(authd_helper, 0); return 0; diff --git a/authd/authd.h b/authd/authd.h new file mode 100644 index 000000000..c94c534c8 --- /dev/null +++ b/authd/authd.h @@ -0,0 +1,35 @@ +/* authd/dns.h - header for authd DNS functions + * Copyright (c) 2016 William Pitcock + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice is present in all copies. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _AUTHD_H +#define _AUTHD_H + +#include +#include + +#include "setup.h" +#include "common.h" + +extern rb_helper *authd_helper; + +typedef void (*authd_cmd_handler)(int parc, char *parv[]); +extern authd_cmd_handler authd_cmd_handlers[255]; + +#endif diff --git a/authd/dns.c b/authd/dns.c new file mode 100644 index 000000000..9c993560c --- /dev/null +++ b/authd/dns.c @@ -0,0 +1,137 @@ +/* authd/dns.h - header for authd DNS functions + * Copyright (c) 2016 William Pitcock + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice is present in all copies. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "authd.h" +#include "dns.h" + +static void +submit_dns_answer(void *userdata, struct DNSReply *reply) +{ + struct dns_request *req = userdata; + char response[64] = "*"; + char status = 'E'; + + if (reply == NULL) + { + rb_helper_write(authd_helper, "E %s E %c *\n", req->reqid, req->type); + goto cleanup; + } + + switch (req->type) + { + case '4': + if (GET_SS_FAMILY(&reply->addr) == AF_INET) + { + status = 'O'; + rb_inet_ntop_sock((struct sockaddr *) &reply->addr, response, sizeof(response)); + } + break; +#ifdef RB_IPV6 + case '6': + if (GET_SS_FAMILY(&reply->addr) == AF_INET6) + { + char tmpres[63]; + rb_inet_ntop_sock((struct sockaddr *) &reply->addr, tmpres, sizeof(tmpres)); + + if (*tmpres == ':') + { + rb_strlcpy(response, "0", sizeof(response)); + rb_strlcat(response, tmpres, sizeof(response)); + } + else + rb_strlcpy(response, tmpres, sizeof(response)); + + status = 'O'; + } + break; +#endif + case 'R': + { + struct sockaddr_in *ip, *ip_fwd; + ip = (struct sockaddr_in *) &req->addr; + ip_fwd = (struct sockaddr_in *) &reply->addr; + + if(ip->sin_addr.s_addr == ip_fwd->sin_addr.s_addr && strlen(reply->h_name) < 63) + { + rb_strlcpy(response, reply->h_name, sizeof(response)); + status = 'O'; + } + } + break; +#ifdef RB_IPV6 + case 'S': + { + struct sockaddr_in6 *ip, *ip_fwd; + ip = (struct sockaddr_in6 *) &req->addr; + ip_fwd = (struct sockaddr_in6 *) &reply->addr; + + if(memcmp(&ip->sin6_addr, &ip_fwd->sin6_addr, sizeof(struct in6_addr)) == 0 && strlen(reply->h_name) < 63) + { + rb_strlcpy(response, reply->h_name, sizeof(response)); + status = 'O'; + } + } + break; +#endif + default: + exit(7); + } + + rb_helper_write(authd_helper, "E %s %c %c %s\n", req->reqid, status, req->type, response); +cleanup: + rb_free(req); +} + +void +resolve_dns(int parc, char *parv[]) +{ + struct dns_request *req; + char *requestid = parv[1]; + char *qtype = parv[2]; + char *rec = parv[3]; + int type; + + req = rb_malloc(sizeof(*req)); + rb_strlcpy(req->reqid, requestid, sizeof(req->reqid)); + req->type = *qtype; + + switch (req->type) + { + case '4': + type = T_A; + if(!rb_inet_pton_sock(rec, (struct sockaddr *) &req->addr)) + exit(6); + break; + case '6': + type = T_AAAA; + if(!rb_inet_pton_sock(rec, (struct sockaddr *) &req->addr)) + exit(6); + break; + case 'R': + case 'S': + type = T_PTR; + break; + } + + req->query.ptr = req; + req->query.callback = submit_dns_answer; + + gethost_byname_type(rec, &req->query, type); +} diff --git a/authd/dns.h b/authd/dns.h new file mode 100644 index 000000000..9527bc0f5 --- /dev/null +++ b/authd/dns.h @@ -0,0 +1,39 @@ +/* authd/dns.h - header for authd DNS functions + * Copyright (c) 2016 William Pitcock + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice is present in all copies. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _AUTHD_DNS_H +#define _AUTHD_DNS_H + +#define DNS_REQ_IDLEN 10 + +#include "res.h" +#include "reslib.h" + +struct dns_request +{ + struct DNSQuery query; + char reqid[DNS_REQ_IDLEN]; + struct rb_sockaddr_storage addr; + char type; +}; + +extern void resolve_dns(int parc, char *parv[]); + +#endif