diff -ur pure-ftpd-1.0.22/src/Makefile.am pure-ftpd-1.0.22-geoip/src/Makefile.am --- pure-ftpd-1.0.22/src/Makefile.am Thu Apr 23 19:17:00 2009 +++ pure-ftpd-1.0.22-geoip/src/Makefile.am Sat Apr 25 18:54:48 2009 @@ -16,7 +16,7 @@ pure_ftpd_LDADD = \ ../puredb/src/libpuredb_read.a \ - @LDAP_SSL_LIBS@ @GETLOADAVG_LIBS@ @BONJOUR_LDADD@ + @LDAP_SSL_LIBS@ @GETLOADAVG_LIBS@ @BONJOUR_LDADD@ -lGeoIP pure_ftpd_CFLAGS = -DINCLUDE_IO_WRAPPERS=1 diff -ur pure-ftpd-1.0.22/src/Makefile.in pure-ftpd-1.0.22-geoip/src/Makefile.in --- pure-ftpd-1.0.22/src/Makefile.in Sat Apr 25 18:18:55 2009 +++ pure-ftpd-1.0.22-geoip/src/Makefile.in Sat Apr 25 18:54:48 2009 @@ -226,7 +226,7 @@ target_alias = @target_alias@ pure_ftpd_LDADD = \ ../puredb/src/libpuredb_read.a \ - @LDAP_SSL_LIBS@ @GETLOADAVG_LIBS@ @BONJOUR_LDADD@ + @LDAP_SSL_LIBS@ @GETLOADAVG_LIBS@ @BONJOUR_LDADD@ -lGeoIP pure_ftpd_CFLAGS = -DINCLUDE_IO_WRAPPERS=1 pure_ftpd_SOURCES = \ diff -ur pure-ftpd-1.0.22/src/ftpd.c pure-ftpd-1.0.22-geoip/src/ftpd.c --- pure-ftpd-1.0.22/src/ftpd.c Sat Apr 25 18:25:59 2009 +++ pure-ftpd-1.0.22-geoip/src/ftpd.c Sat Apr 25 18:54:48 2009 @@ -33,6 +33,7 @@ #ifdef WITH_BONJOUR # include "bonjour.h" #endif +#include "GeoIP.h" #ifdef WITH_DMALLOC # include @@ -4617,9 +4618,10 @@ die(421, LOG_ERR, MSG_GETPEERNAME ": %s" , strerror(errno)); } fourinsix(&peer); - if (checkvalidaddr(&peer) == 0) { + if (checkvalidaddr(&peer) == 0 || STORAGE_FAMILY(ctrlconn) != AF_INET) { die(425, LOG_ERR, MSG_INVALID_IP); } + resolve_hostnames = 0; #ifndef DONT_LOG_IP for (;;) { int eai; @@ -4653,6 +4655,37 @@ *host = '?'; host[1] = 0; #endif + do { + char line[LINE_MAX]; + GeoIP *gi; + const char *country; + char *sep; + int found = 0; + FILE *fp; + + gi = GeoIP_new(GEOIP_STANDARD); + country = GeoIP_country_code_by_name(gi, host); + if (country == NULL || *country == 0 || + !(fp = fopen(CONFDIR "/pureftpd-restricted-countries.txt", "r"))) { + break; + } + while (fgets(line, sizeof line, fp) != NULL) { + if (*line == '#') { + continue; + } + if ((sep = strchr(line, '\n')) != NULL) { + *sep = 0; + } + if (strcasecmp(line, country) == 0) { + found++; + break; + } + } + fclose(fp); + if (found == 0) { + die(425, LOG_ERR, MSG_INVALID_IP); + } + } while(0); iptropize(&peer); logfile(LOG_INFO, MSG_NEW_CONNECTION, host);