X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Flocate_host.c;h=64879eefbb797115d5037b89572205a702977611;hb=HEAD;hp=282bf55afc0dc5358d5e09672296329ff1d122cf;hpb=b5f894f3ab14bff8305c4bd8353e0f9d128923f6;p=citadel.git diff --git a/citadel/locate_host.c b/citadel/locate_host.c deleted file mode 100644 index 282bf55af..000000000 --- a/citadel/locate_host.c +++ /dev/null @@ -1,268 +0,0 @@ -/* - * $Id$ - * - * Functions which handle hostname/address lookups and resolution - * - */ - -#include "sysdep.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "citadel.h" -#include "server.h" -#include "locate_host.h" -#include "sysdep_decls.h" -#include "config.h" -#include "domain.h" -#include "context.h" -#include "ctdl_module.h" - -#ifdef HAVE_RESOLV_H -#include -#ifdef HAVE_ARPA_NAMESER_COMPAT_H -#include -#endif -#include -#endif - - -/* - * Given an open client socket, return the host name and IP address at the other end. - * (IPv4 and IPv6 compatible) - */ -void locate_host(char *tbuf, size_t n, char *abuf, size_t na, int client_socket) -{ - struct sockaddr_in6 clientaddr; - unsigned int addrlen = sizeof(clientaddr); - - tbuf[0] = 0; - abuf[0] = 0; - - getpeername(client_socket, (struct sockaddr *)&clientaddr, &addrlen); - getnameinfo((struct sockaddr *)&clientaddr, addrlen, tbuf, n, NULL, 0, 0); - getnameinfo((struct sockaddr *)&clientaddr, addrlen, abuf, na, NULL, 0, NI_NUMERICHOST); - - /* Convert IPv6-mapped IPv4 addresses back to traditional dotted quad */ - if ( (strlen(abuf) > 7) && (!strncasecmp(abuf, "::ffff:", 7)) ) { - strcpy(abuf, &abuf[7]); - } -} - - -/* - * RBL check written by Edward S. Marshall [http://rblcheck.sourceforge.net] - */ -#define RESULT_SIZE 4096 /* What is the longest result text we support? */ -int rblcheck_backend(char *domain, char *txtbuf, int txtbufsize) { - int a, b, c; - char *result = NULL; - u_char fixedans[ PACKETSZ ]; - u_char *answer; - int need_to_free_answer = 0; - const u_char *cp; - u_char *rp; - const u_char *cend; - const u_char *rend; - int len; - char *p = NULL; - - /* Make our DNS query. */ - //res_init(); - answer = fixedans; - if (CtdlThreadCheckStop()) - { - if (txtbuf != NULL) - snprintf(txtbuf, txtbufsize, "System shutting down"); - return (1); - } - len = res_query( domain, C_IN, T_A, answer, PACKETSZ ); - - /* Was there a problem? If so, the domain doesn't exist. */ - if( len == -1 ) { - if (txtbuf != NULL) { - strcpy(txtbuf, ""); - } - return(0); - } - - if( len > PACKETSZ ) - { - answer = malloc( len ); - need_to_free_answer = 1; - len = res_query( domain, C_IN, T_A, answer, len ); - if( len == -1 ) { - if (txtbuf != NULL) { - snprintf(txtbuf, txtbufsize, - "Message rejected due to known spammer source IP address"); - } - if (need_to_free_answer) free(answer); - return(1); - } - } - if (CtdlThreadCheckStop()) - { - if (txtbuf != NULL) - snprintf(txtbuf, txtbufsize, "System shutting down"); - if (need_to_free_answer) free(answer); - return (1); - } - - result = ( char * )malloc( RESULT_SIZE ); - result[ 0 ] = '\0'; - - - /* Make another DNS query for textual data; this shouldn't - be a performance hit, since it'll now be cached at the - nameserver we're using. */ - res_init(); - len = res_query( domain, C_IN, T_TXT, answer, PACKETSZ ); - if (CtdlThreadCheckStop()) - { - if (txtbuf != NULL) - snprintf(txtbuf, txtbufsize, "System shutting down"); - if (need_to_free_answer) free(answer); - free(result); - return (1); - } - - /* Just in case there's no TXT record... */ - if( len == -1 ) - { - if (txtbuf != NULL) { - snprintf(txtbuf, txtbufsize, - "Message rejected due to known spammer source IP address"); - } - if (need_to_free_answer) free(answer); - free(result); - return(1); - } - - /* Skip the header and the address we queried. */ - cp = answer + sizeof( HEADER ); - while( *cp != '\0' ) - { - a = *cp++; - while( a-- ) - cp++; - } - - /* This seems to be a bit of magic data that we need to - skip. I wish there were good online documentation - for programming for libresolv, so I'd know what I'm - skipping here. Anyone reading this, feel free to - enlighten me. */ - cp += 1 + NS_INT16SZ + NS_INT32SZ; - - /* Skip the type, class and ttl. */ - cp += ( NS_INT16SZ * 2 ) + NS_INT32SZ; - - /* Get the length and end of the buffer. */ - NS_GET16( c, cp ); - cend = cp + c; - - /* Iterate over any multiple answers we might have. In - this context, it's unlikely, but anyway. */ - rp = (u_char *) result; - rend = (u_char *) result + RESULT_SIZE - 1; - while( cp < cend && rp < rend ) - { - a = *cp++; - if( a != 0 ) - for( b = a; b > 0 && cp < cend && rp < rend; - b-- ) - { - if( *cp == '\n' || *cp == '"' || - *cp == '\\' ) - { - *rp++ = '\\'; - } - *rp++ = *cp++; - } - } - *rp = '\0'; - if (txtbuf != NULL) { - snprintf(txtbuf, txtbufsize, "%s", result); - } - /* Remove nonprintable characters */ - for (p=txtbuf; *p; ++p) { - if (!isprint(*p)) strcpy(p, p+1); - } - if (need_to_free_answer) free(answer); - free(result); - return(1); -} - - -/* - * Check to see if the client host is on some sort of spam list (RBL) - * If spammer, returns nonzero and places reason in 'message_to_spammer' - * - * FIXME: support IPv6 RBL as specified in http://tools.ietf.org/html/draft-irtf-asrg-dnsbl-08 - */ -int rbl_check(char *message_to_spammer) -{ - int a1, a2, a3, a4; - char tbuf[256]; - int rbl; - int num_rbl; - char rbl_domains[SIZ]; - char txt_answer[1024]; - - strcpy(message_to_spammer, "ok"); - sscanf(CC->cs_addr, "%d.%d.%d.%d", &a1, &a2, &a3, &a4); - - /* See if we have any RBL domains configured */ - num_rbl = get_hosts(rbl_domains, "rbl"); - if (num_rbl < 1) return(0); - - /* Try all configured RBL's */ - for (rbl=0; rblh_addr_list[0]; - a1 = ((*i++) & 0xff); - a2 = ((*i++) & 0xff); - a3 = ((*i++) & 0xff); - a4 = ((*i++) & 0xff); - sprintf(addr, "%d.%d.%d.%d", a1, a2, a3, a4); - return(0); -}