X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Flocate_host.c;h=64879eefbb797115d5037b89572205a702977611;hb=5e8877a241d8235ec17ab11a606a9f89614bc52c;hp=e04ce71cb4f233747fc66dbc2743e5cc15fc1bf5;hpb=8ea4feb1accb732d1ce7a208f8139c8ee91777dc;p=citadel.git diff --git a/citadel/locate_host.c b/citadel/locate_host.c index e04ce71cb..64879eefb 100644 --- a/citadel/locate_host.c +++ b/citadel/locate_host.c @@ -1,48 +1,28 @@ /* * Functions which handle hostname/address lookups and resolution * - * Copyright (c) 1987-2011 by the citadel.org team + * Copyright (c) 1987-2019 by the citadel.org team * * This program is open source software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. + * it under the terms of the GNU General Public License, version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "sysdep.h" -#include -#include +#include #include +#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" +#include "context.h" #ifdef HAVE_RESOLV_H #include #ifdef HAVE_ARPA_NAMESER_COMPAT_H @@ -51,7 +31,10 @@ #include #endif -/** START:some missing macros on OpenBSD 3.9 */ +#include "domain.h" +#include "locate_host.h" + +/* START: some missing macros on OpenBSD 3.9 */ #ifndef NS_CMPRSFLGS #define NS_CMPRSFLGS 0xc0 #endif @@ -62,7 +45,11 @@ #define NS_INT16SZ INT16SZ #define NS_INT32SZ INT32SZ #endif -/** END:some missing macros on OpenBSD 3.9 */ +#ifndef NS_GET16 +# define NS_GET16 GETSHORT +#endif +/* END: some missing macros on OpenBSD 3.9 */ + /* * Given an open client socket, return the host name and IP address at the other end. @@ -117,8 +104,7 @@ int rblcheck_backend(char *domain, char *txtbuf, int txtbufsize) { /* Make our DNS query. */ answer = fixedans; - if (server_shutting_down) - { + if (server_shutting_down) { if (txtbuf != NULL) { snprintf(txtbuf, txtbufsize, "System shutting down"); } @@ -134,39 +120,35 @@ int rblcheck_backend(char *domain, char *txtbuf, int txtbufsize) { return(0); } - if( len > PACKETSZ ) - { + 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"); + snprintf(txtbuf, txtbufsize, "Message rejected due to known spammer source IP address"); } if (need_to_free_answer) free(answer); return(1); } } - if (server_shutting_down) - { - if (txtbuf != NULL) + if (server_shutting_down) { + 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'; - + 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. */ len = res_query(domain, C_IN, T_TXT, answer, PACKETSZ); - if (server_shutting_down) - { + if (server_shutting_down) { if (txtbuf != NULL) { snprintf(txtbuf, txtbufsize, "System shutting down"); } @@ -176,11 +158,9 @@ int rblcheck_backend(char *domain, char *txtbuf, int txtbufsize) { } /* Just in case there's no TXT record... */ - if (len ==(-1)) - { + if (len ==(-1)) { if (txtbuf != NULL) { - snprintf(txtbuf, txtbufsize, - "Message rejected due to known spammer source IP address"); + snprintf(txtbuf, txtbufsize, "Message rejected due to known spammer source IP address"); } if (need_to_free_answer) free(answer); free(result); @@ -189,8 +169,7 @@ int rblcheck_backend(char *domain, char *txtbuf, int txtbufsize) { /* Skip the header and the address we queried. */ cp = answer + sizeof( HEADER ); - while( *cp != '\0' ) - { + while( *cp != '\0' ) { a = *cp++; while( a-- ) cp++; @@ -216,26 +195,30 @@ int rblcheck_backend(char *domain, char *txtbuf, int txtbufsize) { */ rp = (u_char *) result; rend = (u_char *) result + RESULT_SIZE - 1; - while (cp < cend && rp < rend) - { + 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 == '\\') - { + 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); + long len; + len = snprintf(txtbuf, txtbufsize, "%s", result); + + /* Remove nonprintable characters */ + for (p = txtbuf; *p != '\0'; p++) { + if (!isprint(*p)) { + memmove (p, + p + 1, + len - (p - txtbuf) - 1); + } + } } if (need_to_free_answer) free(answer); free(result); @@ -247,39 +230,47 @@ int rblcheck_backend(char *domain, char *txtbuf, int txtbufsize) { * 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' */ -int rbl_check(char *message_to_spammer) +int rbl_check(char *cs_addr, char *message_to_spammer) { char tbuf[256] = ""; int suffix_pos = 0; int rbl; + int rc; int num_rbl; char rbl_domains[SIZ]; char txt_answer[1024]; + struct timeval tx_start; + struct timeval tx_finish; + rc = 0; strcpy(message_to_spammer, "ok"); + gettimeofday(&tx_start, NULL); /* start a stopwatch for performance timing */ - if ((strchr(CC->cs_addr, '.')) && (!strchr(CC->cs_addr, ':'))) { + if ((strchr(cs_addr, '.')) && (!strchr(cs_addr, ':'))) { int a1, a2, a3, a4; - sscanf(CC->cs_addr, "%d.%d.%d.%d", &a1, &a2, &a3, &a4); + sscanf(cs_addr, "%d.%d.%d.%d", &a1, &a2, &a3, &a4); snprintf(tbuf, sizeof tbuf, "%d.%d.%d.%d.", a4, a3, a2, a1); suffix_pos = strlen(tbuf); } - else if ((!strchr(CC->cs_addr, '.')) && (strchr(CC->cs_addr, ':'))) { + else if ((!strchr(cs_addr, '.')) && (strchr(cs_addr, ':'))) { int num_colons = 0; int i = 0; char workbuf[sizeof tbuf]; char *ptr; /* tedious code to expand and reverse an IPv6 address */ - safestrncpy(tbuf, CC->cs_addr, sizeof tbuf); + safestrncpy(tbuf, cs_addr, sizeof tbuf); num_colons = haschar(tbuf, ':'); - if ((num_colons < 2) || (num_colons > 7)) return(0); /* badly formed address */ + if ((num_colons < 2) || (num_colons > 7)) + goto finish_rbl; /* badly formed address */ /* expand the "::" shorthand */ while (num_colons < 7) { ptr = strstr(tbuf, "::"); - if (!ptr) return(0); /* badly formed address */ + if (!ptr) + goto finish_rbl; /* badly formed address */ + ++ptr; strcpy(workbuf, ptr); strcpy(ptr, ":"); @@ -293,10 +284,11 @@ int rbl_check(char *message_to_spammer) for (i=0; i<8; ++i) { char tokbuf[5]; extract_token(tokbuf, workbuf, i, ':', sizeof tokbuf); - memcpy(&tbuf[ (i*4) + (4-strlen(tokbuf)) ], tokbuf, strlen(tokbuf) ); } - if (strlen(tbuf) != 32) return(0); + if (strlen(tbuf) != 32) { + goto finish_rbl; + } /* now reverse it and add dots */ strcpy(workbuf, tbuf); @@ -308,12 +300,15 @@ int rbl_check(char *message_to_spammer) suffix_pos = 64; } else { - return(0); /* unknown address format */ + goto finish_rbl; /* unknown address format */ } /* See if we have any RBL domains configured */ num_rbl = get_hosts(rbl_domains, "rbl"); - if (num_rbl < 1) return(0); + if (num_rbl < 1) + { + goto finish_rbl; + } /* Try all configured RBL's */ for (rbl=0; rbl