diff --git a/Makefile.in b/Makefile.in index 4a10c3654..abff53ead 100644 --- a/Makefile.in +++ b/Makefile.in @@ -89,7 +89,11 @@ XCFLAGS=@PTHREAD_CFLAGS@ @PCRE2_CFLAGS@ @ARGON2_CFLAGS@ @CARES_CFLAGS@ @SODIUM_C # you are not defining CMDLINE_CONFIG IRCDMODE = 711 +# Objects that are optional due to optional libraries: URL=@URL@ +GEOIP_CLASSIC_OBJECTS=@GEOIP_CLASSIC_OBJECTS@ +GEOIP_CLASSIC_LIBS=@GEOIP_CLASSIC_LIBS@ +GEOIP_CLASSIC_CFLAGS=@GEOIP_CLASSIC_CFLAGS@ # Where is your openssl binary OPENSSLPATH=@OPENSSLPATH@ @@ -116,7 +120,10 @@ MAKEARGS = 'CFLAGS=${CFLAGS}' 'CC=${CC}' 'IRCDLIBS=${IRCDLIBS}' \ 'SHELL=${SHELL}' \ 'CRYPTOLIB=${CRYPTOLIB}' \ 'CRYPTOINCLUDES=${CRYPTOINCLUDES}' \ - 'URL=${URL}' + 'URL=${URL}' \ + 'GEOIP_CLASSIC_OBJECTS=${GEOIP_CLASSIC_OBJECTS}' \ + 'GEOIP_CLASSIC_LIBS=${GEOIP_CLASSIC_LIBS}' \ + 'GEOIP_CLASSIC_CFLAGS=${GEOIP_CLASSIC_CFLAGS}' custommodule: @if test -z "${MODULEFILE}"; then echo "Please set MODULEFILE when calling \`\`make custommodule''. For example, \`\`make custommodule MODULEFILE=callerid''." >&2; exit 1; fi diff --git a/autoconf/m4/unreal.m4 b/autoconf/m4/unreal.m4 index 345fdf7c0..b7a37c3b3 100644 --- a/autoconf/m4/unreal.m4 +++ b/autoconf/m4/unreal.m4 @@ -312,3 +312,70 @@ else AC_MSG_RESULT([no]) fi ]) + +dnl For geoip-api-c +AC_DEFUN([CHECK_GEOIP_CLASSIC], +[ + AC_ARG_ENABLE(geoip_classic, + [AC_HELP_STRING([--enable-geoip-classic=no/yes],[enable GeoIP Classic support])], + [enable_geoip_classic=$enableval], + [enable_geoip_classic=no]) + + AS_IF([test "x$enable_geoip_classic" = "xyes"], + [ + dnl First see if the system provides it + has_system_geoip_classic="no" + PKG_CHECK_MODULES([GEOIP_CLASSIC], [geoip >= 1.6.0],[has_system_geoip_classic=yes + AS_IF([test "x$PRIVATELIBDIR" != "x"], [rm -f "$PRIVATELIBDIR/"libGeoIP.*])],[has_system_geoip_classic=no])]) + + dnl Otherwise fallback to our own.. + AS_IF([test "$has_system_geoip_classic" = "no"],[ + dnl REMEMBER TO CHANGE WITH A NEW GEOIP LIBRARY RELEASE! + geoip_classic_version="1.6.12" + AC_MSG_RESULT(extracting GeoIP Classic library) + cur_dir=`pwd` + cd extras + dnl remove old directory to force a recompile... + dnl and remove its installation prefix just to clean things up. + rm -rf GeoIP-$geoip_classic_version geoip-classic + if test "x$ac_cv_path_GUNZIP" = "x" ; then + tar xfz geoip-classic.tar.gz + else + cp geoip-classic.tar.gz geoip-classic.tar.gz.bak + gunzip -f geoip-classic.tar.gz + cp geoip-classic.tar.gz.bak geoip-classic.tar.gz + tar xf geoip-classic.tar + fi + AC_MSG_RESULT(configuring GeoIP Classic library) + cd GeoIP-$geoip_classic_version + save_cflags="$CFLAGS" + CFLAGS="$orig_cflags" + export CFLAGS + ./configure --prefix=$cur_dir/extras/geoip-classic --libdir=$PRIVATELIBDIR --enable-shared --disable-static || exit 1 + CFLAGS="$save_cflags" + AC_MSG_RESULT(compiling GeoIP Classic library) + $ac_cv_prog_MAKER || exit 1 + AC_MSG_RESULT(installing GeoIP Classic library) + $ac_cv_prog_MAKER install || exit 1 + GEOIP_CLASSIC_CFLAGS="-I$cur_dir/extras/geoip-classic/include" + AC_SUBST(GEOIP_CLASSIC_CFLAGS) + GEOIP_CLASSIC_LIBS= + dnl See c-ares's compilation section for more info on this hack. + dnl ensure that we're linking against the bundled version + dnl (we only reach this code if linking against the bundled version is desired). + AS_IF([test -n "$ac_cv_path_PKGCONFIG"], + [GEOIP_CLASSIC_LIBS="`$ac_cv_path_PKGCONFIG --libs geoip.pc`"]) + dnl For when pkg-config isn't available + AS_IF([test -z "$GEOIP_CLASSIC_LIBS"], + [GEOIP_CLASSIC_LIBS="-L$PRIVATELIBDIR -lGeoIP"]) + cd $cur_dir + ]) + + AC_SUBST(GEOIP_CLASSIC_LIBS) + AC_SUBST(GEOIP_CLASSIC_CFLAGS) + + GEOIP_CLASSIC_OBJECTS="geoip_classic.so" + AC_SUBST(GEOIP_CLASSIC_OBJECTS) + ]) dnl AS_IF(enable_geoip_classic) +]) + diff --git a/configure b/configure index e2008a973..183b12079 100755 --- a/configure +++ b/configure @@ -626,6 +626,9 @@ ac_subst_vars='LTLIBOBJS LIBOBJS UNRLINCDIR IRCDLIBS +GEOIP_CLASSIC_OBJECTS +GEOIP_CLASSIC_LIBS +GEOIP_CLASSIC_CFLAGS URL PTHREAD_CFLAGS PTHREAD_LIBS @@ -762,6 +765,7 @@ enable_dynamic_linking enable_werror enable_asan enable_libcurl +enable_geoip_classic ' ac_precious_vars='build_alias host_alias @@ -784,7 +788,9 @@ SODIUM_LIBS CARES_CFLAGS CARES_LIBS JANSSON_CFLAGS -JANSSON_LIBS' +JANSSON_LIBS +GEOIP_CLASSIC_CFLAGS +GEOIP_CLASSIC_LIBS' # Initialize some variables set by options. @@ -1423,6 +1429,8 @@ Optional Features: --disable-asan Enable address sanitizer and other debugging options, not recommended for production servers! --enable-libcurl=DIR enable libcurl (remote include) support + --enable-geoip-classic=no/yes + enable GeoIP Classic support Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] @@ -1498,6 +1506,10 @@ Some influential environment variables: C compiler flags for JANSSON, overriding pkg-config JANSSON_LIBS linker flags for JANSSON, overriding pkg-config + GEOIP_CLASSIC_CFLAGS + C compiler flags for GEOIP_CLASSIC, overriding pkg-config + GEOIP_CLASSIC_LIBS + linker flags for GEOIP_CLASSIC, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. @@ -8540,6 +8552,144 @@ rm -f core conftest.err conftest.$ac_objext \ fi + + # Check whether --enable-geoip_classic was given. +if test "${enable_geoip_classic+set}" = set; then : + enableval=$enable_geoip_classic; enable_geoip_classic=$enableval +else + enable_geoip_classic=no +fi + + + if test "x$enable_geoip_classic" = "xyes"; then : + + has_system_geoip_classic="no" + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GEOIP_CLASSIC" >&5 +$as_echo_n "checking for GEOIP_CLASSIC... " >&6; } + +if test -n "$GEOIP_CLASSIC_CFLAGS"; then + pkg_cv_GEOIP_CLASSIC_CFLAGS="$GEOIP_CLASSIC_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"geoip >= 1.6.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "geoip >= 1.6.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GEOIP_CLASSIC_CFLAGS=`$PKG_CONFIG --cflags "geoip >= 1.6.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$GEOIP_CLASSIC_LIBS"; then + pkg_cv_GEOIP_CLASSIC_LIBS="$GEOIP_CLASSIC_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"geoip >= 1.6.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "geoip >= 1.6.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GEOIP_CLASSIC_LIBS=`$PKG_CONFIG --libs "geoip >= 1.6.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + GEOIP_CLASSIC_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "geoip >= 1.6.0" 2>&1` + else + GEOIP_CLASSIC_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "geoip >= 1.6.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$GEOIP_CLASSIC_PKG_ERRORS" >&5 + + has_system_geoip_classic=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + has_system_geoip_classic=no +else + GEOIP_CLASSIC_CFLAGS=$pkg_cv_GEOIP_CLASSIC_CFLAGS + GEOIP_CLASSIC_LIBS=$pkg_cv_GEOIP_CLASSIC_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + has_system_geoip_classic=yes + if test "x$PRIVATELIBDIR" != "x"; then : + rm -f "$PRIVATELIBDIR/"libGeoIP.* +fi +fi +fi + + if test "$has_system_geoip_classic" = "no"; then : + + geoip_classic_version="1.6.12" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: extracting GeoIP Classic library" >&5 +$as_echo "extracting GeoIP Classic library" >&6; } + cur_dir=`pwd` + cd extras + rm -rf GeoIP-$geoip_classic_version geoip-classic + if test "x$ac_cv_path_GUNZIP" = "x" ; then + tar xfz geoip-classic.tar.gz + else + cp geoip-classic.tar.gz geoip-classic.tar.gz.bak + gunzip -f geoip-classic.tar.gz + cp geoip-classic.tar.gz.bak geoip-classic.tar.gz + tar xf geoip-classic.tar + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: configuring GeoIP Classic library" >&5 +$as_echo "configuring GeoIP Classic library" >&6; } + cd GeoIP-$geoip_classic_version + save_cflags="$CFLAGS" + CFLAGS="$orig_cflags" + export CFLAGS + ./configure --prefix=$cur_dir/extras/geoip-classic --libdir=$PRIVATELIBDIR --enable-shared --disable-static || exit 1 + CFLAGS="$save_cflags" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: compiling GeoIP Classic library" >&5 +$as_echo "compiling GeoIP Classic library" >&6; } + $ac_cv_prog_MAKER || exit 1 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: installing GeoIP Classic library" >&5 +$as_echo "installing GeoIP Classic library" >&6; } + $ac_cv_prog_MAKER install || exit 1 + GEOIP_CLASSIC_CFLAGS="-I$cur_dir/extras/geoip-classic/include" + + GEOIP_CLASSIC_LIBS= + if test -n "$ac_cv_path_PKGCONFIG"; then : + GEOIP_CLASSIC_LIBS="`$ac_cv_path_PKGCONFIG --libs geoip.pc`" +fi + if test -z "$GEOIP_CLASSIC_LIBS"; then : + GEOIP_CLASSIC_LIBS="-L$PRIVATELIBDIR -lGeoIP" +fi + cd $cur_dir + +fi + + + + + GEOIP_CLASSIC_OBJECTS="geoip_classic.so" + + + UNRLINCDIR="`pwd`/include" if test "$ac_cv_werror" = "yes" ; then diff --git a/configure.ac b/configure.ac index 728a802ba..08ab0aa64 100644 --- a/configure.ac +++ b/configure.ac @@ -830,6 +830,8 @@ AX_PTHREAD() CHECK_LIBCURL +CHECK_GEOIP_CLASSIC + UNRLINCDIR="`pwd`/include" dnl Moved to the very end to ensure it doesn't affect any libs or tests. diff --git a/extras/geoip-classic.tar.gz b/extras/geoip-classic.tar.gz new file mode 100644 index 000000000..8ac60a813 Binary files /dev/null and b/extras/geoip-classic.tar.gz differ diff --git a/src/modules/Makefile.in b/src/modules/Makefile.in index 4768616a9..036fa343a 100644 --- a/src/modules/Makefile.in +++ b/src/modules/Makefile.in @@ -76,7 +76,7 @@ R_MODULES= \ ident_lookup.so history.so chathistory.so \ targetfloodprot.so clienttagdeny.so watch-backend.so \ monitor.so slog.so tls_cipher.so \ - unreal_server_compat.so + unreal_server_compat.so $(GEOIP_CLASSIC_OBJECTS) MODULES=cloak.so $(R_MODULES) MODULEFLAGS=@MODULEFLAGS@ @@ -679,6 +679,10 @@ unreal_server_compat.so: unreal_server_compat.c $(INCLUDES) $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ -o unreal_server_compat.so unreal_server_compat.c +geoip_classic.so: geoip_classic.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) $(GEOIP_CLASSIC_CFLAGS) $(GEOIP_CLASSIC_LIBS) -DDYNAMIC_LINKING \ + -o geoip_classic.so geoip_classic.c + ############################################################################# # capabilities ############################################################################# diff --git a/src/modules/geoip_classic.c b/src/modules/geoip_classic.c new file mode 100644 index 000000000..0a8a8b0d1 --- /dev/null +++ b/src/modules/geoip_classic.c @@ -0,0 +1,41 @@ +/* GEOIP Classic module + * (C) Copyright 2021 Bram Matthys and the UnrealIRCd team + * License: GPLv2 + */ + +#include "unrealircd.h" +#include + +ModuleHeader MOD_HEADER + = { + "geoip_classic", + "5.0", + "GEOIP using classic databases", + "UnrealIRCd Team", + "unrealircd-6", + }; + +MOD_INIT() +{ + MARK_AS_OFFICIAL_MODULE(modinfo); + return MOD_SUCCESS; +} + +MOD_LOAD() +{ + return MOD_SUCCESS; +} + +MOD_UNLOAD() +{ + return MOD_SUCCESS; +} + +void test(void) +{ + GeoIP *gi; + const char *country; + + gi = GeoIP_open("/data/GeoIP.dat", GEOIP_STANDARD | GEOIP_CHECK_CACHE/* | GEOIP_SILENCE*/); + country = GeoIP_country_code_by_name(gi, "192.168.1.1"); +}