From 4e71d6feade725e626f1a0e2edd4a8eeafa47f26 Mon Sep 17 00:00:00 2001 From: acidvegas Date: Sat, 15 Jan 2022 00:16:34 -0500 Subject: [PATCH] Updated to 6.0.1.1 --- BSDmakefile | 4 + CONTRIBUTING.md | 5 + Config | 247 +- Makefile.in | 26 +- Makefile.windows | 1619 +++-- README.md | 5 + SECURITY.md | 3 +- autoconf/config.guess | 1680 +++-- autoconf/config.sub | 2962 ++++---- autoconf/m4/unreal.m4 | 105 +- configure | 660 +- configure.ac | 117 +- doc/Config.header | 8 +- doc/RELEASE-NOTES.md | 1200 +--- doc/conf/badwords.conf | 68 +- doc/conf/except.conf | 48 +- doc/conf/modules.conf | 98 +- doc/conf/snomasks.conf | 228 + doc/conf/tls/curl-ca-bundle.crt | 496 +- doc/conf/unrealircd.hub.conf | 7 +- doc/conf/unrealircd.remote.conf | 114 +- doc/translations.txt | 2 +- extras/build-tests/nix/build | 18 +- extras/build-tests/nix/configs/default | 14 +- extras/build-tests/nix/run-tests | 7 +- extras/build-tests/windows/build.bat | 54 +- .../build-tests/windows/compilecmd/vs2019.bat | 39 +- extras/c-ares.tar.gz | Bin 1518701 -> 1538276 bytes extras/curlinstall | 2 +- extras/doxygen/Developers.md | 2 +- extras/doxygen/Doxyfile | 2 +- extras/geoip-classic.tar.gz | Bin 0 -> 859708 bytes extras/jansson.tar.gz | Bin 0 -> 531924 bytes extras/security/apparmor/unrealircd | 4 +- .../tls/cipherscan_profiles/openssl-300.txt | 27 + extras/tls.cnf | 2 +- extras/unrealircd-upgrade-script.in | 44 +- include/channel.h | 2 +- include/common.h | 14 +- include/config.h | 47 +- include/dbuf.h | 2 +- include/dynconf.h | 80 +- include/fdlist.h | 8 +- include/h.h | 850 ++- include/ircsprintf.h | 2 +- include/modules.h | 720 +- include/msg.h | 1 - include/numeric.h | 298 +- include/proto.h | 68 - include/setup.h.in | 9 +- include/struct.h | 694 +- include/sys.h | 3 - include/unrealircd.h | 2 - include/url.h | 13 - include/version.h | 5 +- include/whowas.h | 2 +- include/windows/setup.h | 8 +- src/Makefile.in | 173 +- src/aliases.c | 44 +- src/api-channelmode.c | 977 ++- src/api-clicap.c | 36 +- src/api-command.c | 20 +- src/api-efunctions.c | 135 +- src/api-event.c | 36 +- src/api-extban.c | 441 +- src/api-history-backend.c | 39 +- src/api-isupport.c | 11 +- src/api-messagetag.c | 27 +- src/api-moddata.c | 33 +- src/api-usermode.c | 438 +- src/auth.c | 83 +- src/buildmod | 3 +- src/channel.c | 706 +- src/conf.c | 6120 ++++++++--------- src/conf_preprocessor.c | 28 +- src/crashreport.c | 6 +- src/crule.c | 7 +- src/dbuf.c | 2 +- src/debug.c | 14 +- src/dispatch.c | 94 +- src/dns.c | 105 +- src/fdlist.c | 95 +- src/hash.c | 358 +- src/ircd.c | 380 +- src/list.c | 100 +- src/log.c | 1871 +++++ src/macosx/UnrealIRCd/AppModel.swift | 2 +- src/match.c | 41 +- src/misc.c | 1077 +-- src/modulemanager.c | 178 +- src/modules.c | 187 +- src/modules/Makefile.in | 617 +- src/modules/account-notify.c | 4 +- src/modules/account-tag.c | 14 +- src/modules/addmotd.c | 4 +- src/modules/addomotd.c | 4 +- src/modules/admin.c | 4 +- src/modules/antimixedutf8.c | 69 +- src/modules/antirandom.c | 171 +- src/modules/authprompt.c | 87 +- src/modules/away.c | 71 +- src/modules/batch.c | 6 +- src/modules/blacklist.c | 192 +- src/modules/bot-tag.c | 10 +- src/modules/botmotd.c | 4 +- src/modules/cap.c | 48 +- src/modules/certfp.c | 37 +- src/modules/chanmodes/Makefile.in | 92 +- src/modules/chanmodes/censor.c | 112 +- src/modules/chanmodes/chanadmin.c | 88 + src/modules/chanmodes/chanop.c | 78 + src/modules/chanmodes/chanowner.c | 88 + src/modules/chanmodes/delayjoin.c | 88 +- src/modules/chanmodes/floodprot.c | 210 +- src/modules/chanmodes/halfop.c | 88 + src/modules/chanmodes/history.c | 212 +- src/modules/chanmodes/inviteonly.c | 77 + src/modules/chanmodes/isregistered.c | 72 + src/modules/chanmodes/issecure.c | 60 +- src/modules/chanmodes/key.c | 232 + src/modules/chanmodes/limit.c | 198 + src/modules/chanmodes/link.c | 178 +- src/modules/chanmodes/moderated.c | 117 + src/modules/chanmodes/nocolor.c | 26 +- src/modules/chanmodes/noctcp.c | 12 +- src/modules/chanmodes/noexternalmsgs.c | 89 + src/modules/chanmodes/noinvite.c | 16 +- src/modules/chanmodes/nokick.c | 10 +- src/modules/chanmodes/noknock.c | 22 +- src/modules/chanmodes/nonickchange.c | 8 +- src/modules/chanmodes/nonotice.c | 12 +- src/modules/chanmodes/operonly.c | 35 +- src/modules/chanmodes/permanent.c | 15 +- .../dccreject.c => chanmodes/private.c} | 51 +- src/modules/chanmodes/regonly.c | 13 +- src/modules/chanmodes/regonlyspeak.c | 24 +- src/modules/chanmodes/secret.c | 73 + src/modules/chanmodes/secureonly.c | 39 +- src/modules/chanmodes/stripcolor.c | 24 +- src/modules/chanmodes/topiclimit.c | 82 + src/modules/chanmodes/voice.c | 88 + src/modules/channeldb.c | 100 +- src/modules/charsys.c | 58 +- src/modules/chathistory.c | 171 +- src/modules/chghost.c | 209 +- src/modules/chgident.c | 20 +- src/modules/chgname.c | 18 +- src/modules/clienttagdeny.c | 4 +- src/modules/{cloak.c => cloak_md5.c} | 75 +- src/modules/cloak_none.c | 87 + src/modules/cloak_sha256.c | 411 ++ src/modules/close.c | 7 +- src/modules/connect.c | 25 +- src/modules/connthrottle.c | 173 +- src/modules/cycle.c | 10 +- src/modules/dccallow.c | 17 +- src/modules/dccdeny.c | 163 +- src/modules/echo-message.c | 10 +- src/modules/eos.c | 8 +- src/modules/extbans/Makefile.in | 70 +- src/modules/extbans/account.c | 34 +- src/modules/extbans/certfp.c | 42 +- src/modules/extbans/country.c | 124 + src/modules/extbans/inchannel.c | 57 +- src/modules/extbans/join.c | 21 +- src/modules/extbans/msgbypass.c | 110 +- src/modules/extbans/nickchange.c | 23 +- src/modules/extbans/operclass.c | 31 +- src/modules/extbans/partmsg.c | 15 +- src/modules/extbans/quiet.c | 20 +- src/modules/extbans/realname.c | 30 +- src/modules/extbans/securitygroup.c | 54 +- src/modules/extbans/textban.c | 111 +- src/modules/extbans/timedban.c | 178 +- src/modules/extended-monitor.c | 153 + src/modules/extjwt.c | 1151 ++++ src/modules/geoip_base.c | 326 + src/modules/geoip_classic.c | 297 + src/modules/geoip_csv.c | 838 +++ src/modules/geoip_maxmind.c | 239 + src/modules/globops.c | 6 +- src/modules/help.c | 12 +- src/modules/hideserver.c | 70 +- src/modules/history.c | 13 +- src/modules/history_backend_mem.c | 126 +- src/modules/history_backend_null.c | 18 +- src/modules/ident_lookup.c | 10 +- src/modules/invite.c | 519 +- src/modules/ircops.c | 2 +- src/modules/ison.c | 8 +- src/modules/join.c | 459 +- src/modules/jointhrottle.c | 28 +- src/modules/json-log-tag.c | 90 + src/modules/jumpserver.c | 103 +- src/modules/kick.c | 388 +- src/modules/kill.c | 36 +- src/modules/knock.c | 26 +- src/modules/labeled-response.c | 14 +- src/modules/lag.c | 4 +- src/modules/link-security.c | 62 +- src/modules/links.c | 4 +- src/modules/list.c | 42 +- src/modules/locops.c | 6 +- src/modules/lusers.c | 16 +- src/modules/map.c | 12 +- src/modules/md.c | 159 +- src/modules/mdex.c | 317 - src/modules/message-ids.c | 14 +- src/modules/message-tags.c | 20 +- src/modules/message.c | 267 +- src/modules/mkpasswd.c | 12 +- src/modules/mode.c | 1812 ++--- src/modules/monitor.c | 232 + src/modules/motd.c | 8 +- src/modules/names.c | 63 +- src/modules/netinfo.c | 66 +- src/modules/nick.c | 1330 ++-- src/modules/nocodes.c | 8 +- src/modules/oper.c | 149 +- src/modules/operinfo.c | 99 + src/modules/opermotd.c | 2 +- src/modules/part.c | 48 +- src/modules/pass.c | 6 +- src/modules/pingpong.c | 8 +- src/modules/plaintext-policy.c | 4 +- src/modules/protoctl.c | 174 +- src/modules/quit.c | 46 +- src/modules/reply-tag.c | 12 +- src/modules/reputation.c | 166 +- src/modules/require-module.c | 120 +- src/modules/restrict-commands.c | 100 +- src/modules/rmtkl.c | 26 +- src/modules/rules.c | 6 +- src/modules/sajoin.c | 142 +- src/modules/samode.c | 4 +- src/modules/sapart.c | 74 +- src/modules/sasl.c | 53 +- src/modules/sdesc.c | 10 +- src/modules/sendsno.c | 34 +- src/modules/sendumode.c | 20 +- src/modules/server-time.c | 10 +- src/modules/server.c | 1642 +++-- src/modules/sethost.c | 6 +- src/modules/setident.c | 5 +- src/modules/setname.c | 76 +- src/modules/silence.c | 7 +- src/modules/sinfo.c | 50 +- src/modules/sjoin.c | 581 +- src/modules/slog.c | 190 + src/modules/snomasks/Makefile.in | 55 - src/modules/sqline.c | 6 +- src/modules/squit.c | 18 +- src/modules/staff.c | 233 +- src/modules/starttls.c | 9 +- src/modules/stats.c | 347 +- src/modules/sts.c | 6 +- src/modules/svsjoin.c | 4 +- src/modules/svskill.c | 6 +- src/modules/svslusers.c | 4 +- src/modules/svsmode.c | 218 +- src/modules/svsmotd.c | 96 +- src/modules/svsnick.c | 40 +- src/modules/svsnline.c | 2 +- src/modules/svsnolag.c | 6 +- src/modules/svsnoop.c | 12 +- src/modules/svspart.c | 6 +- src/modules/svssilence.c | 8 +- src/modules/svssno.c | 46 +- src/modules/svswatch.c | 4 +- src/modules/swhois.c | 4 +- src/modules/targetfloodprot.c | 72 +- src/modules/third/Makefile.in | 9 +- src/modules/time.c | 4 +- src/modules/tkl.c | 1323 ++-- src/modules/tkldb.c | 62 +- src/modules/tls_antidos.c | 11 +- src/modules/tls_cipher.c | 91 + src/modules/topic.c | 128 +- src/modules/trace.c | 22 +- src/modules/tsctl.c | 8 +- src/modules/typing-indicator.c | 10 +- src/modules/umode2.c | 4 +- src/modules/unreal_server_compat.c | 319 + src/modules/unsqline.c | 6 +- src/modules/user.c | 22 +- src/modules/userhost-tag.c | 16 +- src/modules/userhost.c | 8 +- src/modules/userip-tag.c | 16 +- src/modules/userip.c | 11 +- src/modules/usermodes/Makefile.in | 53 +- src/modules/usermodes/bot.c | 25 +- src/modules/usermodes/censor.c | 90 +- src/modules/usermodes/noctcp.c | 8 +- src/modules/usermodes/nokick.c | 10 +- src/modules/usermodes/privacy.c | 2 +- src/modules/usermodes/privdeaf.c | 6 +- src/modules/usermodes/regonlymsg.c | 8 +- src/modules/usermodes/secureonlymsg.c | 18 +- src/modules/usermodes/servicebot.c | 31 +- src/modules/usermodes/showwhois.c | 6 +- src/modules/{ => usermodes}/wallops.c | 50 +- src/modules/vhost.c | 67 +- src/modules/watch-backend.c | 382 + src/modules/watch.c | 256 +- src/modules/webirc.c | 110 +- src/modules/webredir.c | 36 +- src/modules/websocket.c | 383 +- src/modules/who_old.c | 121 +- src/modules/whois.c | 602 +- src/modules/whowas.c | 18 +- src/modules/whox.c | 122 +- src/numeric.c | 1056 --- src/openssl_hostname_validation.c | 24 +- src/operclass.c | 6 +- src/parse.c | 161 +- src/random.c | 14 +- src/send.c | 488 +- src/serv.c | 580 +- src/socket.c | 512 +- src/support.c | 160 +- src/tls.c | 453 +- src/unrealdb.c | 43 +- src/updconf.c | 1730 ----- src/{url.c => url_curl.c} | 347 +- src/url_unreal.c | 1068 +++ src/user.c | 428 +- src/utf8.c | 60 +- src/version.c.SH | 12 +- src/whowas.c | 34 +- src/windows/UnrealIRCd.exe.manifest | 6 +- src/windows/gui.c | 119 +- src/windows/service.c | 5 +- src/windows/unrealinst.iss | 83 +- src/windows/unrealsvc.c | 4 +- src/windows/win.c | 32 +- src/windows/wingui.rc | 6 +- unrealircd.in | 17 +- 337 files changed, 33201 insertions(+), 26248 deletions(-) create mode 100644 BSDmakefile create mode 100644 CONTRIBUTING.md create mode 100644 doc/conf/snomasks.conf create mode 100644 extras/geoip-classic.tar.gz create mode 100644 extras/jansson.tar.gz create mode 100644 extras/tests/tls/cipherscan_profiles/openssl-300.txt delete mode 100644 include/proto.h delete mode 100644 include/url.h create mode 100644 src/log.c create mode 100644 src/modules/chanmodes/chanadmin.c create mode 100644 src/modules/chanmodes/chanop.c create mode 100644 src/modules/chanmodes/chanowner.c create mode 100644 src/modules/chanmodes/halfop.c create mode 100644 src/modules/chanmodes/inviteonly.c create mode 100644 src/modules/chanmodes/isregistered.c create mode 100644 src/modules/chanmodes/key.c create mode 100644 src/modules/chanmodes/limit.c create mode 100644 src/modules/chanmodes/moderated.c create mode 100644 src/modules/chanmodes/noexternalmsgs.c rename src/modules/{snomasks/dccreject.c => chanmodes/private.c} (52%) create mode 100644 src/modules/chanmodes/secret.c create mode 100644 src/modules/chanmodes/topiclimit.c create mode 100644 src/modules/chanmodes/voice.c rename src/modules/{cloak.c => cloak_md5.c} (84%) create mode 100644 src/modules/cloak_none.c create mode 100644 src/modules/cloak_sha256.c create mode 100644 src/modules/extbans/country.c create mode 100644 src/modules/extended-monitor.c create mode 100644 src/modules/extjwt.c create mode 100644 src/modules/geoip_base.c create mode 100644 src/modules/geoip_classic.c create mode 100644 src/modules/geoip_csv.c create mode 100644 src/modules/geoip_maxmind.c create mode 100644 src/modules/json-log-tag.c delete mode 100644 src/modules/mdex.c create mode 100644 src/modules/monitor.c create mode 100644 src/modules/operinfo.c create mode 100644 src/modules/slog.c delete mode 100644 src/modules/snomasks/Makefile.in create mode 100644 src/modules/tls_cipher.c create mode 100644 src/modules/unreal_server_compat.c rename src/modules/{ => usermodes}/wallops.c (51%) create mode 100644 src/modules/watch-backend.c delete mode 100644 src/numeric.c delete mode 100644 src/updconf.c rename src/{url.c => url_curl.c} (51%) create mode 100644 src/url_unreal.c mode change 100644 => 100755 src/windows/unrealinst.iss diff --git a/BSDmakefile b/BSDmakefile new file mode 100644 index 0000000..f0efc9d --- /dev/null +++ b/BSDmakefile @@ -0,0 +1,4 @@ +.DONE: + @echo "Please use GNU Make (gmake) to build UnrealIRCd" +.DEFAULT: + @echo "Please use GNU Make (gmake) to build UnrealIRCd" diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..c1a2873 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,5 @@ +Help out and make UnrealIRCd a better product! + +You can do so by reporting issues, testing, programming, documenting, +translating, helping others, and more. +See https://www.unrealircd.org/docs/Contributing diff --git a/Config b/Config index 68a5906..8625041 100755 --- a/Config +++ b/Config @@ -1,7 +1,7 @@ #!/bin/sh # # Config script for UnrealIRCd -# (C) 2001-2019 The UnrealIRCd Team +# (C) 2001-2021 The UnrealIRCd Team # # This configure script is free software; the UnrealIRCd Team gives # unlimited permission to copy, distribute and modify as long as the @@ -37,9 +37,6 @@ mkdir -p $TMPDIR mkdir -p $PRIVATELIBDIR # Do this even if we're not in advanced mode -if [ "$SHOWLISTMODES" = "1" ] ; then - ARG="$ARG--with-showlistmodes " -fi if [ "$ADVANCED" = "1" ] ; then if [ "$NOOPEROVERRIDE" = "1" ] ; then ARG="$ARG--with-no-operoverride " @@ -53,12 +50,21 @@ ARG="$ARG--enable-ssl " else ARG="$ARG--enable-ssl=$SSLDIR " fi +# Ensure we install curl even if someone does ./Config -quick... +if [ "x$CURLDIR" = "x$UNREALCWD/extras/curl" ]; then + INSTALLCURL=1 +else + # And that the path does not refer to eg an old unrealircd-1.2.3 either ;) + if echo "$CURLDIR"|egrep -qi extras.*curl; then + echo "WARNING: Potentially old cURL directory encountered ($CURLDIR)." + echo "I am changing the cURL directory to $UNREALCWD/extras/curl and forcing a rebuild of cURL." + CURLDIR="$UNREALCWD/extras/curl" + INSTALLCURL=1 + fi +fi if [ "$REMOTEINC" = "1" ] ; then ARG="$ARG--enable-libcurl=$CURLDIR " fi -if [ "$PREFIXAQ" != "1" ]; then -ARG="$ARG--disable-prefixaq " -fi if [ "$MAXCONNECTIONS_REQUEST" != "auto" ]; then ARG="$ARG--with-maxconnections=$MAXCONNECTIONS_REQUEST " fi @@ -77,14 +83,19 @@ ARG="$ARG--with-scriptdir=$BASEPATH " ARG="$ARG--with-nick-history=$NICKNAMEHISTORYLENGTH " ARG="$ARG--with-permissions=$DEFPERM " ARG="$ARG--enable-dynamic-linking " +if [ "$GEOIP" = "classic" ]; then + ARG="$ARG--enable-geoip-classic " +fi +if [ "$GEOIP" = "libmaxminddb" ]; then + ARG="$ARG--enable-libmaxminddb " +fi +if [ "$SANITIZER" = "asan" ]; then + ARG="$ARG--enable-asan " +fi ARG="$ARG $EXTRAPARA " CONF="./configure $ARG" # remove possibly old instances of curl in ~/unrealircd/lib/ rm -f $PRIVATELIBDIR/*curl* 1>/dev/null 2>&1 -# Ensure we install curl even if someone does ./Config -quick... -if [ "x$CURLDIR" = "x$UNREALCWD/extras/curl" ]; then - INSTALLCURL=1 -fi if [ "x$INSTALLCURL" = "x1" ]; then extras/curlinstall "$PRIVATELIBDIR" || exit 1 fi @@ -127,8 +138,8 @@ if [ "$QUICK" != "1" ] ; then TEST="No" fi echo "" - echo "UnrealIRCd requires an SSL certificate in order to work." - echo "Do you want to generate an SSL certificate for the IRCd?" + echo "UnrealIRCd requires a TLS certificate in order to work." + echo "Do you want to generate a TLS certificate for the IRCd?" echo "Only answer No if you already have one." echo $n "[$TEST] -> $c" read cc @@ -152,60 +163,31 @@ if [ "$QUICK" != "1" ] ; then if [ "$GENCERTIFICATE" = 1 ]; then echo echo "*******************************************************************************" - echo "Next you will be asked some questions in order to generate the SSL certificate." + echo "Next you will be asked some questions in order to generate the TLS certificate." echo "IMPORTANT: If you don't own a domain or don't know what to answer, then you can" echo " simply press ENTER or use fictional names for each question!" echo "*******************************************************************************" echo "Press ENTER to continue" read cc - make pem + $MAKE pem echo "Certificate created successfully." sleep 1 else - echo "Ok, not generating SSL certificate. Make sure that the certificate and key" + echo "Ok, not generating TLS certificate. Make sure that the certificate and key" echo "are installed in conf/tls/server.cert.pem and conf/tls/server.key.pem prior to starting the IRCd." fi else - echo "SSL certificate already exists in configuration directory, no need to regenerate." + echo "TLS certificate already exists in configuration directory, no need to regenerate." fi fi # Silently force a 'make clean' as otherwise part (or whole) of the # compiled source could be using different settings than the user # just requested when re-running ./Config. -make clean 1>/dev/null 2>&1 +$MAKE clean 1>/dev/null 2>&1 } RUN_ADVANCED () { -TEST="" -while [ -z "$TEST" ] ; do - if [ "$SHOWLISTMODES" = "1" ] ; then - TEST="Yes" - else - TEST="No" - fi - echo "" - echo "Do you want to show the modes a channel has set in the /list output?" - echo $n "[$TEST] -> $c" - read cc - if [ -z "$cc" ] ; then - cc=$TEST - fi - case "$cc" in - [Yy]*) - SHOWLISTMODES="1" - ;; - [Nn]*) - SHOWLISTMODES="" - ;; - *) - echo "" - echo "You must enter either Yes or No" - TEST="" - ;; - esac -done - TEST="" while [ -z "$TEST" ] ; do if [ "$NOOPEROVERRIDE" = "1" ] ; then @@ -271,16 +253,16 @@ UNREALCWD="`pwd`" BASEPATH="$HOME/unrealircd" DEFPERM="0600" SSLDIR="" -NICKNAMEHISTORYLENGTH="100" +NICKNAMEHISTORYLENGTH="2000" MAXCONNECTIONS_REQUEST="auto" REMOTEINC="1" CURLDIR="" -PREFIXAQ="0" -SHOWLISTMODES="0" NOOPEROVERRIDE="" OPEROVERRIDEVERIFY="" GENCERTIFICATE="1" EXTRAPARA="" +SANITIZER="" +GEOIP="classic" if [ "`eval echo -n 'a'`" = "-n a" ] ; then c="\c" else @@ -333,6 +315,33 @@ if [ "`id -u`" = "0" ]; then exit fi +# Check for gmake early... +if [ "$MAKE" = "" ]; then + MAKE="make" +fi + +if ! $MAKE --version 2>&1|grep -q "GNU Make"; then + # So $MAKE is not GNU make, but do we have gmake? + if gmake --version 2>&1|grep -q "GNU Make"; then + # Great, use that one! + MAKE="gmake" + else + # Both $MAKE and gmake are not GNU make, do we have a working $MAKE at all? + if $MAKE --version 1>/dev/null 2>&1; then + echo "Your system has 'make' but UnrealIRCd requires GNU Make ('gmake')" + echo "Please install 'gmake' (eg 'pkg install gmake' on BSD)." + exit 1 + else + echo "Your system does not have the required tools installed to build UnrealIRCd." + echo "Please check https://www.unrealircd.org/docs/Installing_from_source" + echo "and install the required tools listed under 'Prerequisites'." + echo "After that, you can run ./Config again" + exit 1 + fi + fi +fi + + clear if [ -f "doc/Config.header" -a -z "$NOINTRO" ] ; then @@ -347,7 +356,7 @@ echo "We will now ask you a number of questions. You can just press ENTER to acc echo "" # This needs to be updated each release so auto-upgrading works for settings, modules, etc!!: -UNREALRELEASES="unrealircd-5.2.0 unrealircd-5.2.0-rc1 unrealircd-5.0.9.1 unrealircd-5.0.9 unrealircd-5.0.9-rc1 unrealircd-5.0.8 unrealircd-5.0.8-rc1 unrealircd-5.0.7 unrealircd-5.0.7-rc1 unrealircd-5.0.6 unrealircd-5.0.5.1 unrealircd-5.0.5 unrealircd-5.0.4 unrealircd-5.0.3.1 unrealircd-5.0.3 unrealircd-5.0.2 unrealircd-5.0.1 unrealircd-5.0.0" +UNREALRELEASES="unrealircd-6.0.1 unrealircd-6.0.0 unrealircd-6.0.0-rc2 unrealircd-6.0.0-rc1 unrealircd-6.0.0-beta4 unrealircd-6.0.0-beta3 unrealircd-6.0.0-beta2 unrealircd-6.0.0-beta1 unrealircd-5.2.3 unrealircd-5.2.2 unrealircd-5.2.1.1 unrealircd-5.2.1 unrealircd-5.2.1-rc1 unrealircd-5.2.0.2 unrealircd-5.2.0.1 unrealircd-5.2.0 unrealircd-5.2.0-rc1 unrealircd-5.0.9.1 unrealircd-5.0.9 unrealircd-5.0.9-rc1 unrealircd-5.0.8 unrealircd-5.0.8-rc1 unrealircd-5.0.7 unrealircd-5.0.7-rc1 unrealircd-5.0.6" if [ -f "config.settings" ]; then . ./config.settings else @@ -421,7 +430,7 @@ fi TEST="$BASEPATH" echo "" echo "In what directory do you want to install UnrealIRCd?" -echo "(Note: UnrealIRCd 5 will need to be installed somewhere." +echo "(Note: UnrealIRCd 6 will need to be installed somewhere." echo " If this directory does not exist it will be created.)" echo $n "[$TEST] -> $c" read cc @@ -507,9 +516,12 @@ while [ -z "$TEST" ] ; do TEST="No" fi echo "" - echo "Do you want to enable remote includes?" - echo "This allows stuff like this in your configuration file:" - echo "include \"https://www.somesite.org/files/opers.conf\";" + echo "UnrealIRCd comes with support for 'remote includes', this allows things like:" + echo "include \"https://www.example.org/files/opers.conf\";" + echo "Do you want to compile with the libcurl library to enable additional protocols?" + echo "If you answer 'No' then only https:// links will work for remote includes." + echo "Answer 'Yes' if you need other protocols, such as plaintext http, ftp, tftp or smb." + echo "Most people answer 'No' here because they don't use remote includes or only need https." echo $n "[$TEST] -> $c" read cc if [ -z "$cc" ] ; then @@ -661,39 +673,6 @@ if [ "$REMOTEINC" = "1" ] ; then fi -TEST="" -while [ -z "$TEST" ] ; do - if [ "$PREFIXAQ" = "1" ] ; then - TEST="Yes" - else - TEST="No" - fi - echo "" - echo "Do you want to enable prefixes for chanadmin and chanowner?" - echo "This will give +a the & prefix and ~ for +q (just like +o is @)" - echo "Supported by the major clients (mIRC, xchat, epic, eggdrop, Klient," - echo "PJIRC, irssi, CGI:IRC, etc.)" - echo "This feature should be enabled/disabled network-wide." - echo $n "[$TEST] -> $c" - read cc - if [ -z "$cc" ] ; then - cc=$TEST - fi - case "$cc" in - [Yy]*) - PREFIXAQ="1" - ;; - [Nn]*) - PREFIXAQ="" - ;; - *) - echo "" - echo "You must enter either Yes or No" - TEST="" - ;; - esac -done - TEST="" while [ -z "$TEST" ] ; do TEST="$NICKNAMEHISTORYLENGTH" @@ -717,6 +696,41 @@ while [ -z "$TEST" ] ; do esac done +TEST="" +while [ -z "$TEST" ] ; do + TEST="$GEOIP" + echo "" + echo "GeoIP is a feature that allows converting an IP address to a location (country)" + echo "You have three options in UnrealIRCd:" + echo " classic: This is the DEFAULT geoip engine that should work on all systems" + echo "libmaxminddb: This uses the libmaxminddb library. If you want to use it then" + echo " you need to install the libmaxminddb library on your system first" + echo " none: Don't built with any geoip feature" + echo "Choose one of: classic, libmaxminddb, none" + echo $n "[$TEST] -> $c" + read cc + if [ -z "$cc" ] ; then + GEOIP=$TEST + break + fi + case "$cc" in + classic) + GEOIP="$cc" + ;; + libmaxminddb) + GEOIP="$cc" + ;; + none) + GEOIP="$cc" + ;; + *) + echo "" + echo "Invalid choice: $cc" + TEST="" + ;; + esac +done + echo "" TEST="" while [ -z "$TEST" ] ; do @@ -753,6 +767,42 @@ if [ -n "$ADVANCED" ] ; then RUN_ADVANCED fi +TEST="" +while [ -z "$TEST" ] ; do + if [ "$SANITIZER" = "asan" ] ; then + TEST="Yes" + else + TEST="No" + fi + echo "" + echo "Are you running UnrealIRCd as a test, debugging a problem or developing a module?" + echo "Then it is possible to run with AddressSanitizer enabled. This will make it" + echo "catch bugs such as out-of-bounds and other memory corruption issues, which can" + echo "be really helpful in some cases. The downside is that it will consume a lot" + echo "more memory and run slower too. So, only answer 'Yes' if you are OK with this." + echo "Also, on some systems (notably FreeBSD), when you enable AddressSanitizer," + echo "UnrealIRCd may fail to start. So when in doubt, answer 'No'." + echo "Do you want to enable AddressSanitizer?" + echo $n "[$TEST] -> $c" + read cc + if [ -z "$cc" ] ; then + cc=$TEST + fi + case "$cc" in + [Yy]*) + SANITIZER="asan" + ;; + [Nn]*) + SANITIZER="" + ;; + *) + echo "" + echo "You must enter either Yes or No" + TEST="" + ;; + esac +done + TEST="$EXTRAPARA" echo "" echo "Would you like to pass any custom parameters to configure?" @@ -784,17 +834,17 @@ CACHEDIR="$CACHEDIR" DOCDIR="$DOCDIR" TMPDIR="$TMPDIR" PRIVATELIBDIR="$PRIVATELIBDIR" -PREFIXAQ="$PREFIXAQ" MAXCONNECTIONS_REQUEST="$MAXCONNECTIONS_REQUEST" NICKNAMEHISTORYLENGTH="$NICKNAMEHISTORYLENGTH" +GEOIP="$GEOIP" DEFPERM="$DEFPERM" SSLDIR="$SSLDIR" REMOTEINC="$REMOTEINC" CURLDIR="$CURLDIR" -SHOWLISTMODES="$SHOWLISTMODES" NOOPEROVERRIDE="$NOOPEROVERRIDE" OPEROVERRIDEVERIFY="$OPEROVERRIDEVERIFY" GENCERTIFICATE="$GENCERTIFICATE" +SANITIZER="$SANITIZER" EXTRAPARA="$EXTRAPARA" ADVANCED="$ADVANCED" __EOF__ @@ -808,16 +858,17 @@ cat << __EOF__ |_______________________________________________________________________| |_______________________________________________________________________| | | -| Now all you have to do is type 'make' and let it compile. When that's | -| done, you will receive other instructions on what to do next. | -| | -|_______________________________________________________________________| -|_______________________________________________________________________| | - The UnrealIRCd Team - | | | -| * Bram Matthys (Syzop) syzop@unrealircd.org | -| * Gottem gottem@unrealircd.org | -| * i i@unrealircd.org | +| Bram Matthys (Syzop) - syzop@unrealircd.org | +| Krzysztof Beresztant (k4be) - k4be@unrealircd.org | +| Gottem - gottem@unrealircd.org | +| i - i@unrealircd.org | +|_______________________________________________________________________| +|_______________________________________________________________________| +| | +| Now all you have to do is type '$MAKE' and let it compile. When that's | +| done, you will receive other instructions on what to do next. | |_______________________________________________________________________| __EOF__ diff --git a/Makefile.in b/Makefile.in index 1857495..7ce1dd2 100644 --- a/Makefile.in +++ b/Makefile.in @@ -34,11 +34,11 @@ FROMDOS=/home/cmunk/bin/4dos # #XCFLAGS=-O -g -export-dynamic -IRCDLIBS=@IRCDLIBS@ @PCRE2_LIBS@ @ARGON2_LIBS@ @CARES_LIBS@ @SODIUM_LIBS@ @PTHREAD_LIBS@ +IRCDLIBS=@IRCDLIBS@ @PCRE2_LIBS@ @ARGON2_LIBS@ @CARES_LIBS@ @SODIUM_LIBS@ @JANSSON_LIBS@ @PTHREAD_LIBS@ CRYPTOLIB=@CRYPTOLIB@ OPENSSLINCLUDES= -XCFLAGS=@PTHREAD_CFLAGS@ @PCRE2_CFLAGS@ @ARGON2_CFLAGS@ @CARES_CFLAGS@ @SODIUM_CFLAGS@ @CFLAGS@ @HARDEN_CFLAGS@ @CPPFLAGS@ +XCFLAGS=@PTHREAD_CFLAGS@ @PCRE2_CFLAGS@ @ARGON2_CFLAGS@ @CARES_CFLAGS@ @SODIUM_CFLAGS@ @JANSSON_CFLAGS@ @CFLAGS@ @HARDEN_CFLAGS@ @CPPFLAGS@ # # use the following on MIPS: #CFLAGS= -systype bsd43 -DSYSTYPE_BSD43 -I$(INCLUDEDIR) @@ -89,7 +89,14 @@ 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@ +GEOIP_MAXMIND_OBJECTS=@GEOIP_MAXMIND_OBJECTS@ +LIBMAXMINDDB_CFLAGS=@LIBMAXMINDDB_CFLAGS@ +LIBMAXMINDDB_LIBS=@LIBMAXMINDDB_LIBS@ # Where is your openssl binary OPENSSLPATH=@OPENSSLPATH@ @@ -116,7 +123,13 @@ 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}' \ + 'GEOIP_MAXMIND_OBJECTS=${GEOIP_MAXMIND_OBJECTS}' \ + 'LIBMAXMINDDB_CFLAGS=${LIBMAXMINDDB_CFLAGS}' \ + 'LIBMAXMINDDB_LIBS=${LIBMAXMINDDB_LIBS}' custommodule: @if test -z "${MODULEFILE}"; then echo "Please set MODULEFILE when calling \`\`make custommodule''. For example, \`\`make custommodule MODULEFILE=callerid''." >&2; exit 1; fi @@ -135,7 +148,7 @@ build: Makefile done @echo '' @echo '* UnrealIRCd compiled successfully' - @echo '* YOU ARE NOT DONE YET! Run "make install" to install UnrealIRCd !' + @echo '* YOU ARE NOT DONE YET! Run "${MAKE} install" to install UnrealIRCd !' @echo '' clean: @@ -183,9 +196,6 @@ install: all $(INSTALL) -m 0700 -d $(DESTDIR)@MODULESDIR@/chanmodes @rm -f $(DESTDIR)@MODULESDIR@/chanmodes/*.so 1>/dev/null 2>&1 $(INSTALL) -m 0700 src/modules/chanmodes/*.so $(DESTDIR)@MODULESDIR@/chanmodes - $(INSTALL) -m 0700 -d $(DESTDIR)@MODULESDIR@/snomasks - @rm -f $(DESTDIR)@MODULESDIR@/snomasks/*.so 1>/dev/null 2>&1 - $(INSTALL) -m 0700 src/modules/snomasks/*.so $(DESTDIR)@MODULESDIR@/snomasks $(INSTALL) -m 0700 -d $(DESTDIR)@MODULESDIR@/extbans @rm -f $(DESTDIR)@MODULESDIR@/extbans/*.so 1>/dev/null 2>&1 $(INSTALL) -m 0700 src/modules/extbans/*.so $(DESTDIR)@MODULESDIR@/extbans @@ -248,7 +258,7 @@ pem: extras/tls.cnf -config extras/tls.cnf -sha256 -out server.req.pem \ -key server.key.pem -nodes @echo "Generating self-signed certificate..." - $(OPENSSLPATH) req -x509 -days 3650 -sha256 -in server.req.pem \ + $(OPENSSLPATH) req -x509 -days 3650 -sha256 -nodes -in server.req.pem \ -key server.key.pem -out server.cert.pem @echo "Setting permissions on server.*.pem files..." chmod o-rwx server.req.pem server.key.pem server.cert.pem diff --git a/Makefile.windows b/Makefile.windows index f63f1ec..39cb1c9 100644 --- a/Makefile.windows +++ b/Makefile.windows @@ -25,15 +25,25 @@ MT=mt #ARGON2LIB="Argon2RefDll.lib" ### SODIUM ### -#SODIUM_LIB_DIR="C:\dev\unrealircd-5-libs\libsodium\......." -#SODIUM_INC_DIR="C:\dev\unrealircd-5-libs\libsodium\......." +#SODIUM_LIB_DIR="C:\dev\unrealircd-6-libs\libsodium\......." +#SODIUM_INC_DIR="C:\dev\unrealircd-6-libs\libsodium\......." #SODIUMLIB="libsodium.lib" +### JANSSON ### +#JANSSON_LIB_DIR="C:\dev\unrealircd-6-libs\jansson\lib" +#JANSSON_INC_DIR="C:\dev\unrealircd-6-libs\jansson\include" +#JANSSONLIB="jansson.lib" + ### C-ARES #### #CARES_LIB_DIR="C:\dev\c-ares\vc\cares\dll-release" #CARES_INC_DIR="C:\dev\c-ares" #CARESLIB="cares.lib" +### GEOIP CLASSIC ### +#GEOIPCLASSIC_LIB_DIR="c:\dev\unrealircd-6-libs\GeoIP\libGeoIP" ^ +#GEOIPCLASSIC_INC_DIR="c:\dev\unrealircd-6-libs\GeoIP\libGeoIP" ^ +#GEOIPCLASSICLIB="GeoIP.lib" + ##### REMOTE INCLUDES #### #To enable remote include support you must have libcurl installed on your #system and it must have ares support enabled. @@ -106,9 +116,16 @@ SODIUM_INC=/I "$(SODIUM_INC_DIR)" SODIUM_LIB=/LIBPATH:"$(SODIUM_LIB_DIR)" !ENDIF +!IFDEF JANSSON_INC_DIR +JANSSON_INC=/I "$(JANSSON_INC_DIR)" +!ENDIF +!IFDEF JANSSON_LIB_DIR +JANSSON_LIB=/LIBPATH:"$(JANSSON_LIB_DIR)" +!ENDIF + !IFDEF USE_REMOTEINC CURLCFLAGS=/D USE_LIBCURL -CURLOBJ=SRC/URL.OBJ +CURLOBJ=SRC/URL_CURL.OBJ CURLLIB=libcurl.lib !IFDEF LIBCURL_INC_DIR LIBCURL_INC=/I "$(LIBCURL_INC_DIR)" @@ -137,15 +154,15 @@ DBGLFLAG=/debug MODDBGCFLAG=/LDd /MD /Zi !ENDIF -STDOPTIONS=$(PCRE2_INC) $(ARGON2_INC) $(SODIUM_INC) $(CARES_INC) $(LIBCURL_INC) $(LIBRESSL_INC) /J /I ./INCLUDE /nologo \ +STDOPTIONS=$(PCRE2_INC) $(ARGON2_INC) $(SODIUM_INC) $(JANSSON_INC) $(CARES_INC) $(LIBCURL_INC) $(LIBRESSL_INC) \ + /J /I ./INCLUDE /nologo \ $(CURLCFLAGS) /D FD_SETSIZE=16384 $(SSLCFLAGS) /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE \ /D FAKELAG_CONFIGURABLE=1 \ - /W3 /wd4267 /wd4101 /wd4018 /wd4244 /wd4996 /WX \ - /analyze:ruleset extras\VStudioAnalyze.ruleset + /W3 /wd4267 /wd4101 /wd4018 /wd4244 /wd4996 /WX /analyze:ruleset extras\VStudioAnalyze.ruleset STDLIBS=$(CARES_LIB) $(CARESLIB) $(PCRE2_LIB) $(PCRE2LIB) $(ARGON2_LIB) $(ARGON2LIB) \ - $(SODIUM_LIB) $(SODIUMLIB) $(LIBRESSL_LIB) $(SSLLIB) $(LIBCURL_LIB) $(CURLLIB) -CFLAGS=$(DBGCFLAG) $(STDOPTIONS) /c /Fosrc/ -CFLAGSST=$(DBGCFLAGST) $(STDOPTIONS) /c /Fosrc/ + $(SODIUM_LIB) $(SODIUMLIB) $(JANSSON_LIB) $(JANSSONLIB) $(LIBRESSL_LIB) $(SSLLIB) $(LIBCURL_LIB) $(CURLLIB) +CFLAGS=$(DBGCFLAG) $(STDOPTIONS) /FS /MP1 /c /Fosrc/ +CFLAGSST=$(DBGCFLAGST) $(STDOPTIONS) /FS /MP1 /c /Fosrc/ LFLAGS=kernel32.lib user32.lib gdi32.lib shell32.lib ws2_32.lib advapi32.lib \ dbghelp.lib oldnames.lib comctl32.lib comdlg32.lib $(STDLIBS) \ /def:UnrealIRCd.def /implib:UnrealIRCd.lib \ @@ -157,203 +174,249 @@ INCLUDES=./include/struct.h ./include/config.h ./include/sys.h \ ./include/common.h ./include/version.h ./include/h.h ./include/numeric.h \ ./include/msg.h ./include/setup.h ./include/dynconf.h -EXP_OBJ_FILES=SRC/CHANNEL.OBJ SRC/SEND.OBJ SRC/SOCKET.OBJ \ - SRC/CONF.OBJ SRC/CONF_PREPROCESSOR.OBJ \ - SRC/FDLIST.OBJ SRC/DBUF.OBJ \ - SRC/HASH.OBJ SRC/PARSE.OBJ SRC/IRCD.OBJ \ - SRC/WHOWAS.OBJ \ - SRC/MISC.OBJ SRC/MATCH.OBJ SRC/CRULE.OBJ \ - SRC/DEBUG.OBJ SRC/SUPPORT.OBJ SRC/LIST.OBJ \ - SRC/NUMERIC.OBJ \ - SRC/SERV.OBJ SRC/USER.OBJ \ - SRC/VERSION.OBJ SRC/IRCSPRINTF.OBJ \ - SRC/SCACHE.OBJ SRC/DNS.OBJ SRC/MODULES.OBJ \ - SRC/ALIASES.OBJ SRC/API-EVENT.OBJ SRC/API-USERMODE.OBJ SRC/AUTH.OBJ SRC/TLS.OBJ \ - SRC/RANDOM.OBJ SRC/API-CHANNELMODE.OBJ SRC/API-MODDATA.OBJ SRC/MEMPOOL.OBJ \ - SRC/DISPATCH.OBJ SRC/API-ISUPPORT.OBJ SRC/API-COMMAND.OBJ \ - SRC/API-CLICAP.OBJ SRC/API-MESSAGETAG.OBJ SRC/API-HISTORY-BACKEND.OBJ \ - SRC/API-EXTBAN.OBJ SRC/API-EFUNCTIONS.OBJ SRC/CRYPT_BLOWFISH.OBJ \ - SRC/OPERCLASS.OBJ SRC/UPDCONF.OBJ SRC/CRASHREPORT.OBJ SRC/UNREALDB.OBJ \ - SRC/OPENSSL_HOSTNAME_VALIDATION.OBJ \ - SRC/UTF8.OBJ $(CURLOBJ) +EXP_OBJ_FILES=src/channel.obj src/send.obj src/socket.obj \ + src/conf.obj src/conf_preprocessor.obj \ + src/fdlist.obj src/dbuf.obj \ + src/hash.obj src/parse.obj src/ircd.obj \ + src/whowas.obj \ + src/misc.obj src/match.obj src/crule.obj \ + src/debug.obj src/support.obj src/list.obj \ + src/serv.obj src/user.obj \ + src/version.obj src/ircsprintf.obj \ + src/scache.obj src/dns.obj src/modules.obj \ + src/aliases.obj src/api-event.obj src/api-usermode.obj src/auth.obj src/tls.obj \ + src/random.obj src/api-channelmode.obj src/api-moddata.obj src/mempool.obj \ + src/dispatch.obj src/api-isupport.obj src/api-command.obj \ + src/api-clicap.obj src/api-messagetag.obj src/api-history-backend.obj \ + src/api-extban.obj src/api-efunctions.obj src/crypt_blowfish.obj \ + src/operclass.obj src/crashreport.obj src/unrealdb.obj \ + src/openssl_hostname_validation.obj \ + src/utf8.obj src/log.obj $(CURLOBJ) -OBJ_FILES=$(EXP_OBJ_FILES) SRC/GUI.OBJ SRC/SERVICE.OBJ SRC/WINDEBUG.OBJ SRC/RTF.OBJ \ - SRC/EDITOR.OBJ SRC/WIN.OBJ +OBJ_FILES=$(EXP_OBJ_FILES) src/gui.obj src/service.obj src/windebug.obj src/rtf.obj \ + src/editor.obj src/win.obj -DLL_FILES=SRC/MODULES/CLOAK.DLL \ - SRC/MODULES/CHGHOST.DLL SRC/MODULES/SDESC.DLL SRC/MODULES/SETIDENT.DLL \ - SRC/MODULES/SETNAME.DLL SRC/MODULES/SETHOST.DLL SRC/MODULES/CHGIDENT.DLL \ - SRC/MODULES/SVSMOTD.DLL SRC/MODULES/SVSNLINE.DLL SRC/MODULES/WHO_OLD.DLL \ - SRC/MODULES/WHOX.DLL \ - SRC/MODULES/SWHOIS.DLL SRC/MODULES/SVSMODE.DLL SRC/MODULES/AWAY.DLL \ - SRC/MODULES/SVSNOOP.DLL SRC/MODULES/MKPASSWD.DLL \ - SRC/MODULES/SVSNICK.DLL \ - SRC/MODULES/CHGNAME.DLL \ - SRC/MODULES/LAG.DLL SRC/MODULES/MESSAGE.DLL \ - SRC/MODULES/OPER.DLL SRC/MODULES/PINGPONG.DLL SRC/MODULES/QUIT.DLL \ - SRC/MODULES/SENDUMODE.DLL \ - SRC/MODULES/SQLINE.DLL SRC/MODULES/KILL.DLL SRC/MODULES/TSCTL.DLL \ - SRC/MODULES/UNSQLINE.DLL \ - SRC/MODULES/WHOIS.DLL SRC/MODULES/TKL.DLL SRC/MODULES/VHOST.DLL \ - SRC/MODULES/CYCLE.DLL SRC/MODULES/SVSJOIN.DLL SRC/MODULES/SVSPART.DLL \ - SRC/MODULES/SVSLUSERS.DLL SRC/MODULES/SVSWATCH.DLL SRC/MODULES/SVSSILENCE.DLL \ - SRC/MODULES/SENDSNO.DLL SRC/MODULES/SVSSNO.DLL SRC/MODULES/SAJOIN.DLL \ - SRC/MODULES/SAPART.DLL SRC/MODULES/SAMODE.DLL SRC/MODULES/KICK.DLL \ - SRC/MODULES/TOPIC.DLL SRC/MODULES/INVITE.DLL SRC/MODULES/LIST.DLL \ - SRC/MODULES/TIME.DLL SRC/MODULES/SVSKILL.DLL SRC/MODULES/KNOCK.DLL \ - SRC/MODULES/UMODE2.DLL SRC/MODULES/SQUIT.DLL SRC/MODULES/PROTOCTL.DLL \ - SRC/MODULES/SJOIN.DLL SRC/MODULES/PASS.DLL SRC/MODULES/USERHOST.DLL \ - SRC/MODULES/ISON.DLL SRC/MODULES/SILENCE.DLL \ - SRC/MODULES/ADDMOTD.DLL SRC/MODULES/ADDOMOTD.DLL SRC/MODULES/WALLOPS.DLL \ - SRC/MODULES/GLOBOPS.DLL SRC/MODULES/LOCOPS.DLL \ - SRC/MODULES/ADMIN.DLL SRC/MODULES/TRACE.DLL SRC/MODULES/NETINFO.DLL \ - SRC/MODULES/LINKS.DLL SRC/MODULES/HELP.DLL SRC/MODULES/RULES.DLL \ - SRC/MODULES/CLOSE.DLL SRC/MODULES/MAP.DLL SRC/MODULES/EOS.DLL \ - SRC/MODULES/SERVER.DLL SRC/MODULES/STATS.DLL \ - SRC/MODULES/DCCDENY.DLL SRC/MODULES/WHOWAS.DLL \ - SRC/MODULES/CONNECT.DLL SRC/MODULES/DCCALLOW.DLL SRC/MODULES/USERIP.DLL \ - SRC/MODULES/NICK.DLL SRC/MODULES/USER.DLL SRC/MODULES/MODE.DLL \ - SRC/MODULES/WATCH.DLL SRC/MODULES/PART.DLL SRC/MODULES/JOIN.DLL \ - SRC/MODULES/MOTD.DLL SRC/MODULES/OPERMOTD.DLL SRC/MODULES/BOTMOTD.DLL \ - SRC/MODULES/LUSERS.DLL SRC/MODULES/NAMES.DLL SRC/MODULES/SVSNOLAG.DLL \ - SRC/MODULES/STARTTLS.DLL \ - SRC/MODULES/WEBREDIR.DLL \ - SRC/MODULES/CAP.DLL \ - SRC/MODULES/SASL.DLL \ - SRC/MODULES/TLS_ANTIDOS.DLL \ - SRC/MODULES/MD.DLL \ - SRC/MODULES/CERTFP.DLL \ - SRC/MODULES/WEBIRC.DLL \ - SRC/MODULES/WEBSOCKET.DLL \ - SRC/MODULES/BLACKLIST.DLL \ - SRC/MODULES/JOINTHROTTLE.DLL \ - SRC/MODULES/ANTIRANDOM.DLL \ - SRC/MODULES/HIDESERVER.DLL \ - SRC/MODULES/JUMPSERVER.DLL \ - SRC/MODULES/IRCOPS.DLL \ - SRC/MODULES/STAFF.DLL \ - SRC/MODULES/NOCODES.DLL \ - SRC/MODULES/CHARSYS.DLL \ - SRC/MODULES/ANTIMIXEDUTF8.DLL \ - SRC/MODULES/AUTHPROMPT.DLL \ - SRC/MODULES/SINFO.DLL \ - SRC/MODULES/REPUTATION.DLL \ - SRC/MODULES/CONNTHROTTLE.DLL \ - SRC/MODULES/CHANMODES/CENSOR.DLL \ - SRC/MODULES/CHANMODES/DELAYJOIN.DLL \ - SRC/MODULES/CHANMODES/FLOODPROT.DLL \ - SRC/MODULES/CHANMODES/ISSECURE.DLL \ - SRC/MODULES/CHANMODES/LINK.DLL \ - SRC/MODULES/CHANMODES/NOCOLOR.DLL \ - SRC/MODULES/CHANMODES/NOCTCP.DLL \ - SRC/MODULES/CHANMODES/NOINVITE.DLL \ - SRC/MODULES/CHANMODES/NOKICK.DLL \ - SRC/MODULES/CHANMODES/NOKNOCK.DLL \ - SRC/MODULES/CHANMODES/NONICKCHANGE.DLL \ - SRC/MODULES/CHANMODES/NONOTICE.DLL \ - SRC/MODULES/CHANMODES/OPERONLY.DLL \ - SRC/MODULES/CHANMODES/PERMANENT.DLL \ - SRC/MODULES/CHANMODES/REGONLY.DLL \ - SRC/MODULES/CHANMODES/REGONLYSPEAK.DLL \ - SRC/MODULES/CHANMODES/SECUREONLY.DLL \ - SRC/MODULES/CHANMODES/STRIPCOLOR.DLL \ - SRC/MODULES/CHANMODES/HISTORY.DLL \ - SRC/MODULES/USERMODES/CENSOR.DLL \ - SRC/MODULES/USERMODES/NOCTCP.DLL \ - SRC/MODULES/USERMODES/BOT.DLL \ - SRC/MODULES/USERMODES/SERVICEBOT.DLL \ - SRC/MODULES/USERMODES/SHOWWHOIS.DLL \ - SRC/MODULES/USERMODES/PRIVACY.DLL \ - SRC/MODULES/USERMODES/NOKICK.DLL \ - SRC/MODULES/USERMODES/REGONLYMSG.DLL \ - SRC/MODULES/USERMODES/PRIVDEAF.DLL \ - SRC/MODULES/USERMODES/SECUREONLYMSG.DLL \ - SRC/MODULES/SNOMASKS/DCCREJECT.DLL \ - SRC/MODULES/EXTBANS/ACCOUNT.DLL \ - SRC/MODULES/EXTBANS/INCHANNEL.DLL \ - SRC/MODULES/EXTBANS/JOIN.DLL \ - SRC/MODULES/EXTBANS/NICKCHANGE.DLL \ - SRC/MODULES/EXTBANS/QUIET.DLL \ - SRC/MODULES/EXTBANS/REALNAME.DLL \ - SRC/MODULES/EXTBANS/OPERCLASS.DLL \ - SRC/MODULES/EXTBANS/CERTFP.DLL \ - SRC/MODULES/EXTBANS/TEXTBAN.DLL \ - SRC/MODULES/EXTBANS/MSGBYPASS.DLL \ - SRC/MODULES/EXTBANS/TIMEDBAN.DLL \ - SRC/MODULES/EXTBANS/PARTMSG.DLL \ - SRC/MODULES/EXTBANS/SECURITYGROUP.DLL \ - SRC/MODULES/ACCOUNT-NOTIFY.DLL \ - SRC/MODULES/MESSAGE-TAGS.DLL \ - SRC/MODULES/BATCH.DLL \ - SRC/MODULES/ACCOUNT-TAG.DLL \ - SRC/MODULES/LABELED-RESPONSE.DLL \ - SRC/MODULES/LINK-SECURITY.DLL \ - SRC/MODULES/MESSAGE-IDS.DLL \ - SRC/MODULES/PLAINTEXT-POLICY.DLL \ - SRC/MODULES/SERVER-TIME.DLL \ - SRC/MODULES/STS.DLL \ - SRC/MODULES/TKLDB.DLL \ - SRC/MODULES/CHANNELDB.DLL \ - SRC/MODULES/HISTORY_BACKEND_MEM.DLL \ - SRC/MODULES/HISTORY_BACKEND_NULL.DLL \ - SRC/MODULES/RESTRICT-COMMANDS.DLL \ - SRC/MODULES/RMTKL.DLL \ - SRC/MODULES/ECHO-MESSAGE.DLL \ - SRC/MODULES/USERIP-TAG.DLL \ - SRC/MODULES/USERHOST-TAG.DLL \ - SRC/MODULES/BOT-TAG.DLL \ - SRC/MODULES/REPLY-TAG.DLL \ - SRC/MODULES/REQUIRE-MODULE.DLL \ - SRC/MODULES/IDENT_LOOKUP.DLL \ - SRC/MODULES/HISTORY.DLL \ - SRC/MODULES/CHATHISTORY.DLL \ - SRC/MODULES/TARGETFLOODPROT.DLL \ - SRC/MODULES/TYPING-INDICATOR.DLL \ - SRC/MODULES/CLIENTTAGDENY.DLL +DLL_FILES=\ + src/modules/account-notify.dll \ + src/modules/account-tag.dll \ + src/modules/addmotd.dll \ + src/modules/addomotd.dll \ + src/modules/admin.dll \ + src/modules/antimixedutf8.dll \ + src/modules/antirandom.dll \ + src/modules/authprompt.dll \ + src/modules/away.dll \ + src/modules/batch.dll \ + src/modules/blacklist.dll \ + src/modules/botmotd.dll \ + src/modules/bot-tag.dll \ + src/modules/cap.dll \ + src/modules/certfp.dll \ + src/modules/chanmodes/chanowner.dll \ + src/modules/chanmodes/chanadmin.dll \ + src/modules/chanmodes/chanop.dll \ + src/modules/chanmodes/halfop.dll \ + src/modules/chanmodes/voice.dll \ + src/modules/chanmodes/censor.dll \ + src/modules/chanmodes/delayjoin.dll \ + src/modules/chanmodes/floodprot.dll \ + src/modules/chanmodes/history.dll \ + src/modules/chanmodes/inviteonly.dll \ + src/modules/chanmodes/isregistered.dll \ + src/modules/chanmodes/issecure.dll \ + src/modules/chanmodes/key.dll \ + src/modules/chanmodes/limit.dll \ + src/modules/chanmodes/link.dll \ + src/modules/chanmodes/moderated.dll \ + src/modules/chanmodes/nocolor.dll \ + src/modules/chanmodes/noctcp.dll \ + src/modules/chanmodes/noexternalmsgs.dll \ + src/modules/chanmodes/noinvite.dll \ + src/modules/chanmodes/nokick.dll \ + src/modules/chanmodes/noknock.dll \ + src/modules/chanmodes/nonickchange.dll \ + src/modules/chanmodes/nonotice.dll \ + src/modules/chanmodes/operonly.dll \ + src/modules/chanmodes/permanent.dll \ + src/modules/chanmodes/private.dll \ + src/modules/chanmodes/regonly.dll \ + src/modules/chanmodes/regonlyspeak.dll \ + src/modules/chanmodes/secret.dll \ + src/modules/chanmodes/secureonly.dll \ + src/modules/chanmodes/stripcolor.dll \ + src/modules/chanmodes/topiclimit.dll \ + src/modules/channeldb.dll \ + src/modules/charsys.dll \ + src/modules/chathistory.dll \ + src/modules/chghost.dll \ + src/modules/chgident.dll \ + src/modules/chgname.dll \ + src/modules/clienttagdeny.dll \ + src/modules/close.dll \ + src/modules/connect.dll \ + src/modules/connthrottle.dll \ + src/modules/cycle.dll \ + src/modules/dccallow.dll \ + src/modules/dccdeny.dll \ + src/modules/echo-message.dll \ + src/modules/eos.dll \ + src/modules/extbans/account.dll \ + src/modules/extbans/certfp.dll \ + src/modules/extbans/country.dll \ + src/modules/extbans/inchannel.dll \ + src/modules/extbans/join.dll \ + src/modules/extbans/msgbypass.dll \ + src/modules/extbans/nickchange.dll \ + src/modules/extbans/operclass.dll \ + src/modules/extbans/partmsg.dll \ + src/modules/extbans/quiet.dll \ + src/modules/extbans/realname.dll \ + src/modules/extbans/securitygroup.dll \ + src/modules/extbans/textban.dll \ + src/modules/extbans/timedban.dll \ + src/modules/extended-monitor.dll \ + src/modules/extjwt.dll \ + src/modules/geoip_base.dll \ + src/modules/geoip_classic.dll \ + src/modules/geoip_csv.dll \ + src/modules/globops.dll \ + src/modules/help.dll \ + src/modules/hideserver.dll \ + src/modules/history_backend_mem.dll \ + src/modules/history_backend_null.dll \ + src/modules/history.dll \ + src/modules/ident_lookup.dll \ + src/modules/invite.dll \ + src/modules/ircops.dll \ + src/modules/ison.dll \ + src/modules/join.dll \ + src/modules/jointhrottle.dll \ + src/modules/json-log-tag.dll \ + src/modules/jumpserver.dll \ + src/modules/kick.dll \ + src/modules/kill.dll \ + src/modules/knock.dll \ + src/modules/labeled-response.dll \ + src/modules/lag.dll \ + src/modules/links.dll \ + src/modules/link-security.dll \ + src/modules/list.dll \ + src/modules/locops.dll \ + src/modules/lusers.dll \ + src/modules/map.dll \ + src/modules/md.dll \ + src/modules/message.dll \ + src/modules/message-ids.dll \ + src/modules/message-tags.dll \ + src/modules/mkpasswd.dll \ + src/modules/mode.dll \ + src/modules/monitor.dll \ + src/modules/motd.dll \ + src/modules/names.dll \ + src/modules/netinfo.dll \ + src/modules/nick.dll \ + src/modules/nocodes.dll \ + src/modules/cloak_md5.dll \ + src/modules/cloak_none.dll \ + src/modules/cloak_sha256.dll \ + src/modules/oper.dll \ + src/modules/operinfo.dll \ + src/modules/opermotd.dll \ + src/modules/part.dll \ + src/modules/pass.dll \ + src/modules/pingpong.dll \ + src/modules/plaintext-policy.dll \ + src/modules/protoctl.dll \ + src/modules/quit.dll \ + src/modules/reply-tag.dll \ + src/modules/reputation.dll \ + src/modules/require-module.dll \ + src/modules/restrict-commands.dll \ + src/modules/rmtkl.dll \ + src/modules/rules.dll \ + src/modules/sajoin.dll \ + src/modules/samode.dll \ + src/modules/sapart.dll \ + src/modules/sasl.dll \ + src/modules/sdesc.dll \ + src/modules/sendsno.dll \ + src/modules/sendumode.dll \ + src/modules/server.dll \ + src/modules/server-time.dll \ + src/modules/sethost.dll \ + src/modules/setident.dll \ + src/modules/setname.dll \ + src/modules/silence.dll \ + src/modules/sinfo.dll \ + src/modules/sjoin.dll \ + src/modules/slog.dll \ + src/modules/sqline.dll \ + src/modules/squit.dll \ + src/modules/staff.dll \ + src/modules/starttls.dll \ + src/modules/stats.dll \ + src/modules/sts.dll \ + src/modules/svsjoin.dll \ + src/modules/svskill.dll \ + src/modules/svslusers.dll \ + src/modules/svsmode.dll \ + src/modules/svsmotd.dll \ + src/modules/svsnick.dll \ + src/modules/svsnline.dll \ + src/modules/svsnolag.dll \ + src/modules/svsnoop.dll \ + src/modules/svspart.dll \ + src/modules/svssilence.dll \ + src/modules/svssno.dll \ + src/modules/svswatch.dll \ + src/modules/swhois.dll \ + src/modules/targetfloodprot.dll \ + src/modules/time.dll \ + src/modules/tkl.dll \ + src/modules/tkldb.dll \ + src/modules/tls_antidos.dll \ + src/modules/tls_cipher.dll \ + src/modules/topic.dll \ + src/modules/trace.dll \ + src/modules/tsctl.dll \ + src/modules/typing-indicator.dll \ + src/modules/umode2.dll \ + src/modules/unreal_server_compat.dll \ + src/modules/unsqline.dll \ + src/modules/user.dll \ + src/modules/userhost.dll \ + src/modules/userhost-tag.dll \ + src/modules/userip.dll \ + src/modules/userip-tag.dll \ + src/modules/usermodes/bot.dll \ + src/modules/usermodes/censor.dll \ + src/modules/usermodes/noctcp.dll \ + src/modules/usermodes/nokick.dll \ + src/modules/usermodes/privacy.dll \ + src/modules/usermodes/privdeaf.dll \ + src/modules/usermodes/regonlymsg.dll \ + src/modules/usermodes/secureonlymsg.dll \ + src/modules/usermodes/servicebot.dll \ + src/modules/usermodes/showwhois.dll \ + src/modules/usermodes/wallops.dll \ + src/modules/vhost.dll \ + src/modules/watch-backend.dll \ + src/modules/watch.dll \ + src/modules/webirc.dll \ + src/modules/webredir.dll \ + src/modules/websocket.dll \ + src/modules/whois.dll \ + src/modules/who_old.dll \ + src/modules/whowas.dll \ + src/modules/whox.dll ALL: CONF UNREALSVC.EXE UnrealIRCd.exe MODULES CLEAN: - -@erase *.obj >NUL - -@erase src\*.obj >NUL - -@erase src\win.res >NUL - -@erase src\version.c >NUL - -@erase src\windows\*.obj >NUL - -@erase src\modules\*.obj >NUL - -@erase src\modules\*.lib >NUL - -@erase src\modules\*.pdb >NUL - -@erase src\modules\*.dll >NUL - -@erase src\modules\*.exp >NUL - -@erase src\modules\*.ilk >NUL - -@erase src\modules\chanmodes\*.obj >NUL - -@erase src\modules\chanmodes\*.lib >NUL - -@erase src\modules\chanmodes\*.pdb >NUL - -@erase src\modules\chanmodes\*.dll >NUL - -@erase src\modules\chanmodes\*.exp >NUL - -@erase src\modules\chanmodes\*.ilk >NUL - -@erase src\modules\usermodes\*.obj >NUL - -@erase src\modules\usermodes\*.lib >NUL - -@erase src\modules\usermodes\*.pdb >NUL - -@erase src\modules\usermodes\*.dll >NUL - -@erase src\modules\usermodes\*.exp >NUL - -@erase src\modules\usermodes\*.ilk >NUL - -@erase src\modules\snomasks\*.obj >NUL - -@erase src\modules\snomasks\*.lib >NUL - -@erase src\modules\snomasks\*.pdb >NUL - -@erase src\modules\snomasks\*.dll >NUL - -@erase src\modules\snomasks\*.exp >NUL - -@erase src\modules\snomasks\*.ilk >NUL - -@erase src\modules\extbans\*.obj >NUL - -@erase src\modules\extbans\*.lib >NUL - -@erase src\modules\extbans\*.pdb >NUL - -@erase src\modules\extbans\*.dll >NUL - -@erase src\modules\extbans\*.exp >NUL - -@erase src\modules\extbans\*.ilk >NUL - -@erase .\*.exe >NUL - -@erase UnrealIRCd.lib >NUL + -@del /Q /S *.dll *.exe *.obj *.pdb *.res *.lib *.exp *.ilk src\version.c >NUL -./UNREALSVC.EXE: SRC/UNREALSVC.OBJ SRC/WINDOWS/UNREALSVC.RES +UNREALSVC.EXE: SRC/UNREALSVC.OBJ SRC/WINDOWS/UNREALSVC.RES $(LINK) $(DBGLFLAGST) advapi32.lib src/unrealsvc.obj src/windows/unrealsvc.res CONF: @@ -361,9 +424,7 @@ CONF: $(CC) src/windows/config.c -@config.exe - - -./UnrealIRCd.exe: $(OBJ_FILES) src/windows/win.res +UnrealIRCd.exe: $(OBJ_FILES) src/windows/win.res $(LINK) $(LFLAGS) $(OBJ_FILES) src/windows/win.res /MAP -@erase src\windows\win.res $(MT) -manifest src\windows\UnrealIRCd.exe.manifest -outputresource:UnrealIRCd.exe;1 @@ -430,9 +491,6 @@ src/conf_preprocessor.obj: src/conf_preprocessor.c $(INCLUDES) src/debug.obj: src/debug.c $(INCLUDES) $(CC) $(CFLAGS) src/debug.c -src/numeric.obj: src/numeric.c $(INCLUDES) - $(CC) $(CFLAGS) src/numeric.c - src/misc.obj: src/misc.c $(INCLUDES) ./include/dbuf.h $(CC) $(CFLAGS) src/misc.c @@ -509,8 +567,8 @@ src/mempool.obj: src/mempool.c $(INCLUDES) src/dispatch.obj: src/dispatch.c $(INCLUDES) $(CC) $(CFLAGS) src/dispatch.c -src/url.obj: src/url.c $(INCLUDES) ./include/url.h - $(CC) $(CFLAGS) src/url.c +src/url_curl.obj: src/url_curl.c $(INCLUDES) + $(CC) $(CFLAGS) src/url_curl.c src/api-extban.obj: src/api-extban.c $(INCLUDES) $(CC) $(CFLAGS) src/api-extban.c @@ -542,9 +600,6 @@ src/crypt_blowfish.obj: src/crypt_blowfish.c $(INCLUDES) src/operclass.obj: src/operclass.c $(INCLUDES) ./include/dbuf.h $(CC) $(CFLAGS) src/operclass.c -src/updconf.obj: src/updconf.c $(INCLUDES) ./include/dbuf.h - $(CC) $(CFLAGS) src/updconf.c - src/crashreport.obj: src/crashreport.c $(INCLUDES) ./include/dbuf.h $(CC) $(CFLAGS) src/crashreport.c @@ -554,6 +609,12 @@ src/unrealdb.obj: src/unrealdb.c $(INCLUDES) ./include/dbuf.h src/utf8.obj: src/utf8.c $(INCLUDES) ./include/dbuf.h $(CC) $(CFLAGS) src/utf8.c +src/openssl_hostname_validation.obj: src/openssl_hostname_validation.c $(INCLUDES) ./include/dbuf.h + $(CC) $(CFLAGS) src/openssl_hostname_validation.c + +src/log.obj: src/log.c $(INCLUDES) ./include/dbuf.h + $(CC) $(CFLAGS) src/log.c + src/windows/win.res: src/windows/wingui.rc $(RC) /l 0x409 /fosrc/windows/win.res /i ./include /i ./src \ /d NDEBUG src/windows/wingui.rc @@ -575,556 +636,642 @@ SYMBOLFILE: MODULES: $(DLL_FILES) -src/modules/cloak.dll: src/modules/cloak.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/cloak.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/chghost.dll: src/modules/chghost.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/chghost.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/chgident.dll: src/modules/chgident.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/chgident.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/sdesc.dll: src/modules/sdesc.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/sdesc.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/sethost.dll: src/modules/sethost.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/sethost.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/setident.dll: src/modules/setident.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/setident.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/setname.dll: src/modules/setname.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/setname.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/svsmotd.dll: src/modules/svsmotd.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/svsmotd.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/svsmode.dll: src/modules/svsmode.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/svsmode.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/tkl.dll: src/modules/tkl.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/tkl.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/swhois.dll: src/modules/swhois.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/swhois.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/svsnline.dll: src/modules/svsnline.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/svsnline.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/who_old.dll: src/modules/who_old.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/who_old.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/whox.dll: src/modules/whox.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/whox.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/away.dll: src/modules/away.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/away.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/mkpasswd.dll: src/modules/mkpasswd.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/mkpasswd.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/svsnoop.dll: src/modules/svsnoop.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/svsnoop.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/svsnick.dll: src/modules/svsnick.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/svsnick.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/chgname.dll: src/modules/chgname.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/chgname.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/kill.dll: src/modules/kill.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/kill.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/lag.dll: src/modules/lag.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/lag.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/message.dll: src/modules/message.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/message.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/oper.dll: src/modules/oper.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/oper.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/pingpong.dll: src/modules/pingpong.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/pingpong.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/quit.dll: src/modules/quit.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/quit.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/sendumode.dll: src/modules/sendumode.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/sendumode.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/sqline.dll: src/modules/sqline.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/sqline.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/tsctl.dll: src/modules/tsctl.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/tsctl.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/unsqline.dll: src/modules/unsqline.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/unsqline.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/whois.dll: src/modules/whois.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/whois.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/vhost.dll: src/modules/vhost.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/vhost.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/cycle.dll: src/modules/cycle.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/cycle.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/svsjoin.dll: src/modules/svsjoin.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/svsjoin.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/svspart.dll: src/modules/svspart.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/svspart.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/svslusers.dll: src/modules/svslusers.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/svslusers.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/svswatch.dll: src/modules/svswatch.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/svswatch.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/svssilence.dll: src/modules/svssilence.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/svssilence.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/sendsno.dll: src/modules/sendsno.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/sendsno.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/svssno.dll: src/modules/svssno.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/svssno.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/sajoin.dll: src/modules/sajoin.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/sajoin.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/sapart.dll: src/modules/sapart.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/sapart.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/samode.dll: src/modules/samode.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/samode.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/kick.dll: src/modules/kick.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/kick.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/topic.dll: src/modules/topic.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/topic.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/invite.dll: src/modules/invite.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/invite.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/list.dll: src/modules/list.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/list.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/time.dll: src/modules/time.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/time.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/svskill.dll: src/modules/svskill.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/svskill.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/sjoin.dll: src/modules/sjoin.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/sjoin.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/pass.dll: src/modules/pass.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/pass.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/userhost.dll: src/modules/userhost.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/userhost.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/ison.dll: src/modules/ison.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/ison.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/silence.dll: src/modules/silence.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/silence.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/knock.dll: src/modules/knock.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/knock.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/umode2.dll: src/modules/umode2.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/umode2.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/squit.dll: src/modules/squit.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/squit.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/protoctl.dll: src/modules/protoctl.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/protoctl.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/addmotd.dll: src/modules/addmotd.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/addmotd.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/addomotd.dll: src/modules/addomotd.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/addomotd.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/wallops.dll: src/modules/wallops.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/wallops.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/admin.dll: src/modules/admin.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/admin.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/globops.dll: src/modules/globops.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/globops.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/locops.dll: src/modules/locops.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/locops.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/trace.dll: src/modules/trace.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/trace.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/netinfo.dll: src/modules/netinfo.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/netinfo.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/links.dll: src/modules/links.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/links.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/help.dll: src/modules/help.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/help.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/rules.dll: src/modules/rules.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/rules.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/close.dll: src/modules/close.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/close.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/map.dll: src/modules/map.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/map.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/eos.dll: src/modules/eos.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/eos.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/server.dll: src/modules/server.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/server.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/stats.dll: src/modules/stats.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/stats.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/dccdeny.dll: src/modules/dccdeny.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/dccdeny.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/whowas.dll: src/modules/whowas.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/whowas.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/connect.dll: src/modules/connect.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/connect.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/dccallow.dll: src/modules/dccallow.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/dccallow.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/userip.dll: src/modules/userip.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/userip.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/nick.dll: src/modules/nick.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/nick.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/user.dll: src/modules/user.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/user.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/mode.dll: src/modules/mode.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/mode.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/watch.dll: src/modules/watch.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/watch.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/part.dll: src/modules/part.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/part.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/join.dll: src/modules/join.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/join.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/motd.dll: src/modules/motd.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/motd.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/opermotd.dll: src/modules/opermotd.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/opermotd.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/botmotd.dll: src/modules/botmotd.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/botmotd.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/lusers.dll: src/modules/lusers.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/lusers.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/names.dll: src/modules/names.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/names.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/md.dll: src/modules/md.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/md.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/certfp.dll: src/modules/certfp.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/certfp.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/webirc.dll: src/modules/webirc.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/webirc.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/websocket.dll: src/modules/websocket.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/websocket.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/blacklist.dll: src/modules/blacklist.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/blacklist.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/jointhrottle.dll: src/modules/jointhrottle.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/jointhrottle.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/svsnolag.dll: src/modules/svsnolag.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/svsnolag.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/starttls.dll: src/modules/starttls.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/starttls.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/webredir.dll: src/modules/webredir.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/webredir.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/cap.dll: src/modules/cap.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/cap.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/sasl.dll: src/modules/sasl.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/sasl.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/tls_antidos.dll: src/modules/tls_antidos.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/tls_antidos.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/antirandom.dll: src/modules/antirandom.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/antirandom.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/hideserver.dll: src/modules/hideserver.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/hideserver.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/jumpserver.dll: src/modules/jumpserver.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/jumpserver.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/ircops.dll: src/modules/ircops.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/ircops.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/staff.dll: src/modules/staff.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/staff.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/nocodes.dll: src/modules/nocodes.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/nocodes.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/charsys.dll: src/modules/charsys.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/charsys.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/antimixedutf8.dll: src/modules/antimixedutf8.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/antimixedutf8.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/authprompt.dll: src/modules/authprompt.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/authprompt.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/sinfo.dll: src/modules/sinfo.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/sinfo.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/reputation.dll: src/modules/reputation.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/reputation.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/connthrottle.dll: src/modules/connthrottle.c $(INCLUDES) - $(CC) $(MODCFLAGS) src/modules/connthrottle.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS) - -src/modules/chanmodes/censor.dll: src/modules/chanmodes/censor.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/censor.c $(MODLFLAGS) - -src/modules/chanmodes/delayjoin.dll: src/modules/chanmodes/delayjoin.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/delayjoin.c $(MODLFLAGS) - -src/modules/chanmodes/floodprot.dll: src/modules/chanmodes/floodprot.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/floodprot.c $(MODLFLAGS) - -src/modules/chanmodes/issecure.dll: src/modules/chanmodes/issecure.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/issecure.c $(MODLFLAGS) - -src/modules/chanmodes/link.dll: src/modules/chanmodes/link.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/link.c $(MODLFLAGS) - -src/modules/chanmodes/nocolor.dll: src/modules/chanmodes/nocolor.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/nocolor.c $(MODLFLAGS) - -src/modules/chanmodes/noctcp.dll: src/modules/chanmodes/noctcp.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/noctcp.c $(MODLFLAGS) - -src/modules/chanmodes/noinvite.dll: src/modules/chanmodes/noinvite.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/noinvite.c $(MODLFLAGS) - -src/modules/chanmodes/nokick.dll: src/modules/chanmodes/nokick.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/nokick.c $(MODLFLAGS) - -src/modules/chanmodes/noknock.dll: src/modules/chanmodes/noknock.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/noknock.c $(MODLFLAGS) - -src/modules/chanmodes/nonickchange.dll: src/modules/chanmodes/nonickchange.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/nonickchange.c $(MODLFLAGS) - -src/modules/chanmodes/nonotice.dll: src/modules/chanmodes/nonotice.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/nonotice.c $(MODLFLAGS) - -src/modules/chanmodes/operonly.dll: src/modules/chanmodes/operonly.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/operonly.c $(MODLFLAGS) - -src/modules/chanmodes/permanent.dll: src/modules/chanmodes/permanent.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/permanent.c $(MODLFLAGS) - -src/modules/chanmodes/regonly.dll: src/modules/chanmodes/regonly.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/regonly.c $(MODLFLAGS) - -src/modules/chanmodes/regonlyspeak.dll: src/modules/chanmodes/regonlyspeak.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/regonlyspeak.c $(MODLFLAGS) - -src/modules/chanmodes/secureonly.dll: src/modules/chanmodes/secureonly.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/secureonly.c $(MODLFLAGS) - -src/modules/chanmodes/stripcolor.dll: src/modules/chanmodes/stripcolor.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/stripcolor.c $(MODLFLAGS) - -src/modules/chanmodes/history.dll: src/modules/chanmodes/history.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/history.c $(MODLFLAGS) - -src/modules/usermodes/censor.dll: src/modules/usermodes/censor.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/usermodes/ /Fesrc/modules/usermodes/ src/modules/usermodes/censor.c $(MODLFLAGS) - -src/modules/usermodes/noctcp.dll: src/modules/usermodes/noctcp.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/usermodes/ /Fesrc/modules/usermodes/ src/modules/usermodes/noctcp.c $(MODLFLAGS) - -src/modules/usermodes/bot.dll: src/modules/usermodes/bot.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/usermodes/ /Fesrc/modules/usermodes/ src/modules/usermodes/bot.c $(MODLFLAGS) - -src/modules/usermodes/servicebot.dll: src/modules/usermodes/servicebot.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/usermodes/ /Fesrc/modules/usermodes/ src/modules/usermodes/servicebot.c $(MODLFLAGS) - -src/modules/usermodes/showwhois.dll: src/modules/usermodes/showwhois.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/usermodes/ /Fesrc/modules/usermodes/ src/modules/usermodes/showwhois.c $(MODLFLAGS) - -src/modules/usermodes/privacy.dll: src/modules/usermodes/privacy.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/usermodes/ /Fesrc/modules/usermodes/ src/modules/usermodes/privacy.c $(MODLFLAGS) - -src/modules/usermodes/nokick.dll: src/modules/usermodes/nokick.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/usermodes/ /Fesrc/modules/usermodes/ src/modules/usermodes/nokick.c $(MODLFLAGS) - -src/modules/usermodes/regonlymsg.dll: src/modules/usermodes/regonlymsg.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/usermodes/ /Fesrc/modules/usermodes/ src/modules/usermodes/regonlymsg.c $(MODLFLAGS) - -src/modules/usermodes/privdeaf.dll: src/modules/usermodes/privdeaf.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/usermodes/ /Fesrc/modules/usermodes/ src/modules/usermodes/privdeaf.c $(MODLFLAGS) - -src/modules/usermodes/secureonlymsg.dll: src/modules/usermodes/secureonlymsg.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/usermodes/ /Fesrc/modules/usermodes/ src/modules/usermodes/secureonlymsg.c $(MODLFLAGS) - -src/modules/snomasks/dccreject.dll: src/modules/snomasks/dccreject.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/snomasks/ /Fesrc/modules/snomasks/ src/modules/snomasks/dccreject.c $(MODLFLAGS) - -src/modules/extbans/account.dll: src/modules/extbans/account.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/extbans/ /Fesrc/modules/extbans/ src/modules/extbans/account.c $(MODLFLAGS) - -src/modules/extbans/inchannel.dll: src/modules/extbans/inchannel.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/extbans/ /Fesrc/modules/extbans/ src/modules/extbans/inchannel.c $(MODLFLAGS) - -src/modules/extbans/join.dll: src/modules/extbans/join.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/extbans/ /Fesrc/modules/extbans/ src/modules/extbans/join.c $(MODLFLAGS) - -src/modules/extbans/nickchange.dll: src/modules/extbans/nickchange.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/extbans/ /Fesrc/modules/extbans/ src/modules/extbans/nickchange.c $(MODLFLAGS) - -src/modules/extbans/quiet.dll: src/modules/extbans/quiet.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/extbans/ /Fesrc/modules/extbans/ src/modules/extbans/quiet.c $(MODLFLAGS) - -src/modules/extbans/realname.dll: src/modules/extbans/realname.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/extbans/ /Fesrc/modules/extbans/ src/modules/extbans/realname.c $(MODLFLAGS) - -src/modules/extbans/operclass.dll: src/modules/extbans/operclass.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/extbans/ /Fesrc/modules/extbans/ src/modules/extbans/operclass.c $(MODLFLAGS) - -src/modules/extbans/certfp.dll: src/modules/extbans/certfp.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/extbans/ /Fesrc/modules/extbans/ src/modules/extbans/certfp.c $(MODLFLAGS) - -src/modules/extbans/textban.dll: src/modules/extbans/textban.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/extbans/ /Fesrc/modules/extbans/ src/modules/extbans/textban.c $(MODLFLAGS) - -src/modules/extbans/msgbypass.dll: src/modules/extbans/msgbypass.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/extbans/ /Fesrc/modules/extbans/ src/modules/extbans/msgbypass.c $(MODLFLAGS) - -src/modules/extbans/timedban.dll: src/modules/extbans/timedban.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/extbans/ /Fesrc/modules/extbans/ src/modules/extbans/timedban.c $(MODLFLAGS) - -src/modules/extbans/partmsg.dll: src/modules/extbans/partmsg.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/extbans/ /Fesrc/modules/extbans/ src/modules/extbans/partmsg.c $(MODLFLAGS) - -src/modules/extbans/securitygroup.dll: src/modules/extbans/securitygroup.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/extbans/ /Fesrc/modules/extbans/ src/modules/extbans/securitygroup.c $(MODLFLAGS) - src/modules/account-notify.dll: src/modules/account-notify.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/account-notify.c $(MODLFLAGS) - -src/modules/message-tags.dll: src/modules/message-tags.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/message-tags.c $(MODLFLAGS) - -src/modules/batch.dll: src/modules/batch.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/batch.c $(MODLFLAGS) + $(CC) $(MODCFLAGS) src/modules/account-notify.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/account-notify.pdb $(MODLFLAGS) src/modules/account-tag.dll: src/modules/account-tag.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/account-tag.c $(MODLFLAGS) + $(CC) $(MODCFLAGS) src/modules/account-tag.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/account-tag.pdb $(MODLFLAGS) -src/modules/labeled-response.dll: src/modules/labeled-response.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/labeled-response.c $(MODLFLAGS) +src/modules/addmotd.dll: src/modules/addmotd.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/addmotd.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/addmotd.pdb $(MODLFLAGS) -src/modules/link-security.dll: src/modules/link-security.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/link-security.c $(MODLFLAGS) +src/modules/addomotd.dll: src/modules/addomotd.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/addomotd.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/addomotd.pdb $(MODLFLAGS) -src/modules/message-ids.dll: src/modules/message-ids.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/message-ids.c $(MODLFLAGS) +src/modules/admin.dll: src/modules/admin.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/admin.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/admin.pdb $(MODLFLAGS) -src/modules/plaintext-policy.dll: src/modules/plaintext-policy.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/plaintext-policy.c $(MODLFLAGS) +src/modules/antimixedutf8.dll: src/modules/antimixedutf8.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/antimixedutf8.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/antimixedutf8.pdb $(MODLFLAGS) -src/modules/server-time.dll: src/modules/server-time.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/server-time.c $(MODLFLAGS) +src/modules/antirandom.dll: src/modules/antirandom.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/antirandom.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/antirandom.pdb $(MODLFLAGS) -src/modules/sts.dll: src/modules/sts.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/sts.c $(MODLFLAGS) +src/modules/authprompt.dll: src/modules/authprompt.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/authprompt.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/authprompt.pdb $(MODLFLAGS) -src/modules/tkldb.dll: src/modules/tkldb.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/tkldb.c $(MODLFLAGS) +src/modules/away.dll: src/modules/away.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/away.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/away.pdb $(MODLFLAGS) -src/modules/channeldb.dll: src/modules/channeldb.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/channeldb.c $(MODLFLAGS) +src/modules/batch.dll: src/modules/batch.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/batch.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/batch.pdb $(MODLFLAGS) -src/modules/history_backend_mem.dll: src/modules/history_backend_mem.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/history_backend_mem.c $(MODLFLAGS) +src/modules/blacklist.dll: src/modules/blacklist.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/blacklist.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/blacklist.pdb $(MODLFLAGS) -src/modules/history_backend_null.dll: src/modules/history_backend_null.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/history_backend_null.c $(MODLFLAGS) - -src/modules/restrict-commands.dll: src/modules/restrict-commands.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/restrict-commands.c $(MODLFLAGS) - -src/modules/rmtkl.dll: src/modules/rmtkl.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/rmtkl.c $(MODLFLAGS) - -src/modules/echo-message.dll: src/modules/echo-message.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/echo-message.c $(MODLFLAGS) - -src/modules/userip-tag.dll: src/modules/userip-tag.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/userip-tag.c $(MODLFLAGS) - -src/modules/userhost-tag.dll: src/modules/userhost-tag.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/userhost-tag.c $(MODLFLAGS) +src/modules/botmotd.dll: src/modules/botmotd.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/botmotd.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/botmotd.pdb $(MODLFLAGS) src/modules/bot-tag.dll: src/modules/bot-tag.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/bot-tag.c $(MODLFLAGS) + $(CC) $(MODCFLAGS) src/modules/bot-tag.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/bot-tag.pdb $(MODLFLAGS) -src/modules/reply-tag.dll: src/modules/reply-tag.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/reply-tag.c $(MODLFLAGS) +src/modules/cap.dll: src/modules/cap.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/cap.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/cap.pdb $(MODLFLAGS) -src/modules/require-module.dll: src/modules/require-module.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/require-module.c $(MODLFLAGS) +src/modules/certfp.dll: src/modules/certfp.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/certfp.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/certfp.pdb $(MODLFLAGS) -src/modules/ident_lookup.dll: src/modules/ident_lookup.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/ident_lookup.c $(MODLFLAGS) +src/modules/chanmodes/chanowner.dll: src/modules/chanmodes/chanowner.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chanmodes/chanowner.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/chanowner.pdb $(MODLFLAGS) -src/modules/history.dll: src/modules/history.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/history.c $(MODLFLAGS) +src/modules/chanmodes/chanadmin.dll: src/modules/chanmodes/chanadmin.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chanmodes/chanadmin.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/chanadmin.pdb $(MODLFLAGS) + +src/modules/chanmodes/chanop.dll: src/modules/chanmodes/chanop.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chanmodes/chanop.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/chanop.pdb $(MODLFLAGS) + +src/modules/chanmodes/halfop.dll: src/modules/chanmodes/halfop.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chanmodes/halfop.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/halfop.pdb $(MODLFLAGS) + +src/modules/chanmodes/voice.dll: src/modules/chanmodes/voice.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chanmodes/voice.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/voice.pdb $(MODLFLAGS) + +src/modules/chanmodes/censor.dll: src/modules/chanmodes/censor.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chanmodes/censor.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/censor.pdb $(MODLFLAGS) + +src/modules/chanmodes/delayjoin.dll: src/modules/chanmodes/delayjoin.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chanmodes/delayjoin.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/delayjoin.pdb $(MODLFLAGS) + +src/modules/chanmodes/floodprot.dll: src/modules/chanmodes/floodprot.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chanmodes/floodprot.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/floodprot.pdb $(MODLFLAGS) + +src/modules/chanmodes/history.dll: src/modules/chanmodes/history.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chanmodes/history.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/history.pdb $(MODLFLAGS) + +src/modules/chanmodes/inviteonly.dll: src/modules/chanmodes/inviteonly.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chanmodes/inviteonly.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/inviteonly.pdb $(MODLFLAGS) + +src/modules/chanmodes/isregistered.dll: src/modules/chanmodes/isregistered.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chanmodes/isregistered.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/isregistered.pdb $(MODLFLAGS) + +src/modules/chanmodes/issecure.dll: src/modules/chanmodes/issecure.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chanmodes/issecure.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/issecure.pdb $(MODLFLAGS) + +src/modules/chanmodes/key.dll: src/modules/chanmodes/key.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chanmodes/key.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/key.pdb $(MODLFLAGS) + +src/modules/chanmodes/limit.dll: src/modules/chanmodes/limit.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chanmodes/limit.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/limit.pdb $(MODLFLAGS) + +src/modules/chanmodes/link.dll: src/modules/chanmodes/link.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chanmodes/link.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/link.pdb $(MODLFLAGS) + +src/modules/chanmodes/moderated.dll: src/modules/chanmodes/moderated.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chanmodes/moderated.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/moderated.pdb $(MODLFLAGS) + +src/modules/chanmodes/nocolor.dll: src/modules/chanmodes/nocolor.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chanmodes/nocolor.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/nocolor.pdb $(MODLFLAGS) + +src/modules/chanmodes/noctcp.dll: src/modules/chanmodes/noctcp.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chanmodes/noctcp.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/noctcp.pdb $(MODLFLAGS) + +src/modules/chanmodes/noexternalmsgs.dll: src/modules/chanmodes/noexternalmsgs.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chanmodes/noexternalmsgs.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/noexternalmsgs.pdb $(MODLFLAGS) + +src/modules/chanmodes/noinvite.dll: src/modules/chanmodes/noinvite.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chanmodes/noinvite.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/noinvite.pdb $(MODLFLAGS) + +src/modules/chanmodes/nokick.dll: src/modules/chanmodes/nokick.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chanmodes/nokick.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/nokick.pdb $(MODLFLAGS) + +src/modules/chanmodes/noknock.dll: src/modules/chanmodes/noknock.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chanmodes/noknock.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/noknock.pdb $(MODLFLAGS) + +src/modules/chanmodes/nonickchange.dll: src/modules/chanmodes/nonickchange.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chanmodes/nonickchange.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/nonickchange.pdb $(MODLFLAGS) + +src/modules/chanmodes/nonotice.dll: src/modules/chanmodes/nonotice.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chanmodes/nonotice.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/nonotice.pdb $(MODLFLAGS) + +src/modules/chanmodes/operonly.dll: src/modules/chanmodes/operonly.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chanmodes/operonly.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/operonly.pdb $(MODLFLAGS) + +src/modules/chanmodes/permanent.dll: src/modules/chanmodes/permanent.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chanmodes/permanent.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/permanent.pdb $(MODLFLAGS) + +src/modules/chanmodes/private.dll: src/modules/chanmodes/private.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chanmodes/private.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/private.pdb $(MODLFLAGS) + +src/modules/chanmodes/regonly.dll: src/modules/chanmodes/regonly.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chanmodes/regonly.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/regonly.pdb $(MODLFLAGS) + +src/modules/chanmodes/regonlyspeak.dll: src/modules/chanmodes/regonlyspeak.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chanmodes/regonlyspeak.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/regonlyspeak.pdb $(MODLFLAGS) + +src/modules/chanmodes/secret.dll: src/modules/chanmodes/secret.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chanmodes/secret.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/secret.pdb $(MODLFLAGS) + +src/modules/chanmodes/secureonly.dll: src/modules/chanmodes/secureonly.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chanmodes/secureonly.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/secureonly.pdb $(MODLFLAGS) + +src/modules/chanmodes/stripcolor.dll: src/modules/chanmodes/stripcolor.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chanmodes/stripcolor.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/stripcolor.pdb $(MODLFLAGS) + +src/modules/chanmodes/topiclimit.dll: src/modules/chanmodes/topiclimit.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chanmodes/topiclimit.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/topiclimit.pdb $(MODLFLAGS) + +src/modules/channeldb.dll: src/modules/channeldb.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/channeldb.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/channeldb.pdb $(MODLFLAGS) + +src/modules/charsys.dll: src/modules/charsys.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/charsys.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/charsys.pdb $(MODLFLAGS) src/modules/chathistory.dll: src/modules/chathistory.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/chathistory.c $(MODLFLAGS) + $(CC) $(MODCFLAGS) src/modules/chathistory.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/chathistory.pdb $(MODLFLAGS) -src/modules/targetfloodprot.dll: src/modules/targetfloodprot.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/targetfloodprot.c $(MODLFLAGS) +src/modules/chghost.dll: src/modules/chghost.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chghost.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/chghost.pdb $(MODLFLAGS) -src/modules/typing-indicator.dll: src/modules/typing-indicator.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/typing-indicator.c $(MODLFLAGS) +src/modules/chgident.dll: src/modules/chgident.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chgident.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/chgident.pdb $(MODLFLAGS) + +src/modules/chgname.dll: src/modules/chgname.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/chgname.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/chgname.pdb $(MODLFLAGS) src/modules/clienttagdeny.dll: src/modules/clienttagdeny.c $(INCLUDES) - $(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/clienttagdeny.c $(MODLFLAGS) + $(CC) $(MODCFLAGS) src/modules/clienttagdeny.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/clienttagdeny.pdb $(MODLFLAGS) + +src/modules/close.dll: src/modules/close.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/close.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/close.pdb $(MODLFLAGS) + +src/modules/connect.dll: src/modules/connect.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/connect.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/connect.pdb $(MODLFLAGS) + +src/modules/connthrottle.dll: src/modules/connthrottle.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/connthrottle.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/connthrottle.pdb $(MODLFLAGS) + +src/modules/cycle.dll: src/modules/cycle.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/cycle.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/cycle.pdb $(MODLFLAGS) + +src/modules/dccallow.dll: src/modules/dccallow.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/dccallow.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/dccallow.pdb $(MODLFLAGS) + +src/modules/dccdeny.dll: src/modules/dccdeny.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/dccdeny.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/dccdeny.pdb $(MODLFLAGS) + +src/modules/echo-message.dll: src/modules/echo-message.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/echo-message.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/echo-message.pdb $(MODLFLAGS) + +src/modules/eos.dll: src/modules/eos.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/eos.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/eos.pdb $(MODLFLAGS) + +src/modules/extbans/account.dll: src/modules/extbans/account.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/extbans/account.c /Fesrc/modules/extbans/ /Fosrc/modules/extbans/ /Fdsrc/modules/extbans/account.pdb $(MODLFLAGS) + +src/modules/extbans/certfp.dll: src/modules/extbans/certfp.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/extbans/certfp.c /Fesrc/modules/extbans/ /Fosrc/modules/extbans/ /Fdsrc/modules/extbans/certfp.pdb $(MODLFLAGS) + +src/modules/extbans/country.dll: src/modules/extbans/country.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/extbans/country.c /Fesrc/modules/extbans/ /Fosrc/modules/extbans/ /Fdsrc/modules/extbans/country.pdb $(MODLFLAGS) + +src/modules/extbans/inchannel.dll: src/modules/extbans/inchannel.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/extbans/inchannel.c /Fesrc/modules/extbans/ /Fosrc/modules/extbans/ /Fdsrc/modules/extbans/inchannel.pdb $(MODLFLAGS) + +src/modules/extbans/join.dll: src/modules/extbans/join.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/extbans/join.c /Fesrc/modules/extbans/ /Fosrc/modules/extbans/ /Fdsrc/modules/extbans/join.pdb $(MODLFLAGS) + +src/modules/extbans/msgbypass.dll: src/modules/extbans/msgbypass.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/extbans/msgbypass.c /Fesrc/modules/extbans/ /Fosrc/modules/extbans/ /Fdsrc/modules/extbans/msgbypass.pdb $(MODLFLAGS) + +src/modules/extbans/nickchange.dll: src/modules/extbans/nickchange.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/extbans/nickchange.c /Fesrc/modules/extbans/ /Fosrc/modules/extbans/ /Fdsrc/modules/extbans/nickchange.pdb $(MODLFLAGS) + +src/modules/extbans/operclass.dll: src/modules/extbans/operclass.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/extbans/operclass.c /Fesrc/modules/extbans/ /Fosrc/modules/extbans/ /Fdsrc/modules/extbans/operclass.pdb $(MODLFLAGS) + +src/modules/extbans/partmsg.dll: src/modules/extbans/partmsg.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/extbans/partmsg.c /Fesrc/modules/extbans/ /Fosrc/modules/extbans/ /Fdsrc/modules/extbans/partmsg.pdb $(MODLFLAGS) + +src/modules/extbans/quiet.dll: src/modules/extbans/quiet.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/extbans/quiet.c /Fesrc/modules/extbans/ /Fosrc/modules/extbans/ /Fdsrc/modules/extbans/quiet.pdb $(MODLFLAGS) + +src/modules/extbans/realname.dll: src/modules/extbans/realname.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/extbans/realname.c /Fesrc/modules/extbans/ /Fosrc/modules/extbans/ /Fdsrc/modules/extbans/realname.pdb $(MODLFLAGS) + +src/modules/extbans/securitygroup.dll: src/modules/extbans/securitygroup.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/extbans/securitygroup.c /Fesrc/modules/extbans/ /Fosrc/modules/extbans/ /Fdsrc/modules/extbans/securitygroup.pdb $(MODLFLAGS) + +src/modules/extbans/textban.dll: src/modules/extbans/textban.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/extbans/textban.c /Fesrc/modules/extbans/ /Fosrc/modules/extbans/ /Fdsrc/modules/extbans/textban.pdb $(MODLFLAGS) + +src/modules/extbans/timedban.dll: src/modules/extbans/timedban.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/extbans/timedban.c /Fesrc/modules/extbans/ /Fosrc/modules/extbans/ /Fdsrc/modules/extbans/timedban.pdb $(MODLFLAGS) + +src/modules/extended-monitor.dll: src/modules/extended-monitor.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/extended-monitor.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/extended-monitor.pdb $(MODLFLAGS) + +src/modules/geoip_base.dll: src/modules/geoip_base.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/geoip_base.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/geoip_base.pdb $(MODLFLAGS) + +src/modules/extjwt.dll: src/modules/extjwt.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/extjwt.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/extjwt.pdb $(MODLFLAGS) + +src/modules/geoip_classic.dll: src/modules/geoip_classic.c $(INCLUDES) + $(CC) $(MODCFLAGS) /I "$(GEOIPCLASSIC_INC_DIR)" src/modules/geoip_classic.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/geoip_classic.pdb $(MODLFLAGS) /LIBPATH:"$(GEOIPCLASSIC_LIB_DIR)" $(GEOIPCLASSICLIB) + +src/modules/geoip_csv.dll: src/modules/geoip_csv.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/geoip_csv.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/geoip_csv.pdb $(MODLFLAGS) + +src/modules/geoip_maxmind.dll: src/modules/geoip_maxmind.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/geoip_maxmind.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/geoip_maxmind.pdb $(MODLFLAGS) + +src/modules/globops.dll: src/modules/globops.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/globops.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/globops.pdb $(MODLFLAGS) + +src/modules/help.dll: src/modules/help.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/help.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/help.pdb $(MODLFLAGS) + +src/modules/hideserver.dll: src/modules/hideserver.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/hideserver.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/hideserver.pdb $(MODLFLAGS) + +src/modules/history_backend_mem.dll: src/modules/history_backend_mem.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/history_backend_mem.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/history_backend_mem.pdb $(MODLFLAGS) + +src/modules/history_backend_null.dll: src/modules/history_backend_null.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/history_backend_null.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/history_backend_null.pdb $(MODLFLAGS) + +src/modules/history.dll: src/modules/history.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/history.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/history.pdb $(MODLFLAGS) + +src/modules/ident_lookup.dll: src/modules/ident_lookup.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/ident_lookup.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/ident_lookup.pdb $(MODLFLAGS) + +src/modules/invite.dll: src/modules/invite.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/invite.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/invite.pdb $(MODLFLAGS) + +src/modules/ircops.dll: src/modules/ircops.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/ircops.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/ircops.pdb $(MODLFLAGS) + +src/modules/ison.dll: src/modules/ison.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/ison.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/ison.pdb $(MODLFLAGS) + +src/modules/join.dll: src/modules/join.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/join.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/join.pdb $(MODLFLAGS) + +src/modules/jointhrottle.dll: src/modules/jointhrottle.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/jointhrottle.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/jointhrottle.pdb $(MODLFLAGS) + +src/modules/json-log-tag.dll: src/modules/json-log-tag.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/json-log-tag.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/json-log-tag.pdb $(MODLFLAGS) + +src/modules/jumpserver.dll: src/modules/jumpserver.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/jumpserver.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/jumpserver.pdb $(MODLFLAGS) + +src/modules/kick.dll: src/modules/kick.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/kick.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/kick.pdb $(MODLFLAGS) + +src/modules/kill.dll: src/modules/kill.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/kill.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/kill.pdb $(MODLFLAGS) + +src/modules/knock.dll: src/modules/knock.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/knock.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/knock.pdb $(MODLFLAGS) + +src/modules/labeled-response.dll: src/modules/labeled-response.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/labeled-response.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/labeled-response.pdb $(MODLFLAGS) + +src/modules/lag.dll: src/modules/lag.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/lag.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/lag.pdb $(MODLFLAGS) + +src/modules/links.dll: src/modules/links.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/links.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/links.pdb $(MODLFLAGS) + +src/modules/link-security.dll: src/modules/link-security.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/link-security.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/link-security.pdb $(MODLFLAGS) + +src/modules/list.dll: src/modules/list.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/list.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/list.pdb $(MODLFLAGS) + +src/modules/locops.dll: src/modules/locops.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/locops.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/locops.pdb $(MODLFLAGS) + +src/modules/lusers.dll: src/modules/lusers.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/lusers.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/lusers.pdb $(MODLFLAGS) + +src/modules/map.dll: src/modules/map.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/map.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/map.pdb $(MODLFLAGS) + +src/modules/md.dll: src/modules/md.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/md.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/md.pdb $(MODLFLAGS) + +src/modules/message.dll: src/modules/message.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/message.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/message.pdb $(MODLFLAGS) + +src/modules/message-ids.dll: src/modules/message-ids.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/message-ids.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/message-ids.pdb $(MODLFLAGS) + +src/modules/message-tags.dll: src/modules/message-tags.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/message-tags.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/message-tags.pdb $(MODLFLAGS) + +src/modules/mkpasswd.dll: src/modules/mkpasswd.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/mkpasswd.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/mkpasswd.pdb $(MODLFLAGS) + +src/modules/mode.dll: src/modules/mode.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/mode.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/mode.pdb $(MODLFLAGS) + +src/modules/monitor.dll: src/modules/monitor.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/monitor.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/monitor.pdb $(MODLFLAGS) + +src/modules/motd.dll: src/modules/motd.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/motd.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/motd.pdb $(MODLFLAGS) + +src/modules/names.dll: src/modules/names.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/names.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/names.pdb $(MODLFLAGS) + +src/modules/netinfo.dll: src/modules/netinfo.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/netinfo.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/netinfo.pdb $(MODLFLAGS) + +src/modules/nick.dll: src/modules/nick.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/nick.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/nick.pdb $(MODLFLAGS) + +src/modules/nocodes.dll: src/modules/nocodes.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/nocodes.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/nocodes.pdb $(MODLFLAGS) + +src/modules/cloak_md5.dll: src/modules/cloak_md5.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/cloak_md5.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/cloak_md5.pdb $(MODLFLAGS) + +src/modules/cloak_none.dll: src/modules/cloak_none.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/cloak_none.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/cloak_none.pdb $(MODLFLAGS) + +src/modules/cloak_sha256.dll: src/modules/cloak_sha256.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/cloak_sha256.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/cloak_sha256.pdb $(MODLFLAGS) + +src/modules/oper.dll: src/modules/oper.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/oper.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/oper.pdb $(MODLFLAGS) + +src/modules/operinfo.dll: src/modules/operinfo.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/operinfo.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/operinfo.pdb $(MODLFLAGS) + +src/modules/opermotd.dll: src/modules/opermotd.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/opermotd.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/opermotd.pdb $(MODLFLAGS) + +src/modules/part.dll: src/modules/part.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/part.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/part.pdb $(MODLFLAGS) + +src/modules/pass.dll: src/modules/pass.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/pass.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/pass.pdb $(MODLFLAGS) + +src/modules/pingpong.dll: src/modules/pingpong.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/pingpong.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/pingpong.pdb $(MODLFLAGS) + +src/modules/plaintext-policy.dll: src/modules/plaintext-policy.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/plaintext-policy.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/plaintext-policy.pdb $(MODLFLAGS) + +src/modules/protoctl.dll: src/modules/protoctl.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/protoctl.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/protoctl.pdb $(MODLFLAGS) + +src/modules/quit.dll: src/modules/quit.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/quit.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/quit.pdb $(MODLFLAGS) + +src/modules/reply-tag.dll: src/modules/reply-tag.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/reply-tag.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/reply-tag.pdb $(MODLFLAGS) + +src/modules/reputation.dll: src/modules/reputation.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/reputation.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/reputation.pdb $(MODLFLAGS) + +src/modules/require-module.dll: src/modules/require-module.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/require-module.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/require-module.pdb $(MODLFLAGS) + +src/modules/restrict-commands.dll: src/modules/restrict-commands.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/restrict-commands.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/restrict-commands.pdb $(MODLFLAGS) + +src/modules/rmtkl.dll: src/modules/rmtkl.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/rmtkl.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/rmtkl.pdb $(MODLFLAGS) + +src/modules/rules.dll: src/modules/rules.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/rules.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/rules.pdb $(MODLFLAGS) + +src/modules/sajoin.dll: src/modules/sajoin.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/sajoin.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/sajoin.pdb $(MODLFLAGS) + +src/modules/samode.dll: src/modules/samode.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/samode.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/samode.pdb $(MODLFLAGS) + +src/modules/sapart.dll: src/modules/sapart.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/sapart.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/sapart.pdb $(MODLFLAGS) + +src/modules/sasl.dll: src/modules/sasl.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/sasl.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/sasl.pdb $(MODLFLAGS) + +src/modules/sdesc.dll: src/modules/sdesc.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/sdesc.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/sdesc.pdb $(MODLFLAGS) + +src/modules/sendsno.dll: src/modules/sendsno.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/sendsno.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/sendsno.pdb $(MODLFLAGS) + +src/modules/sendumode.dll: src/modules/sendumode.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/sendumode.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/sendumode.pdb $(MODLFLAGS) + +src/modules/server.dll: src/modules/server.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/server.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/server.pdb $(MODLFLAGS) + +src/modules/server-time.dll: src/modules/server-time.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/server-time.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/server-time.pdb $(MODLFLAGS) + +src/modules/sethost.dll: src/modules/sethost.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/sethost.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/sethost.pdb $(MODLFLAGS) + +src/modules/setident.dll: src/modules/setident.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/setident.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/setident.pdb $(MODLFLAGS) + +src/modules/setname.dll: src/modules/setname.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/setname.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/setname.pdb $(MODLFLAGS) + +src/modules/silence.dll: src/modules/silence.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/silence.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/silence.pdb $(MODLFLAGS) + +src/modules/sinfo.dll: src/modules/sinfo.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/sinfo.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/sinfo.pdb $(MODLFLAGS) + +src/modules/sjoin.dll: src/modules/sjoin.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/sjoin.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/sjoin.pdb $(MODLFLAGS) + +src/modules/slog.dll: src/modules/slog.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/slog.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/slog.pdb $(MODLFLAGS) + +src/modules/sqline.dll: src/modules/sqline.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/sqline.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/sqline.pdb $(MODLFLAGS) + +src/modules/squit.dll: src/modules/squit.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/squit.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/squit.pdb $(MODLFLAGS) + +src/modules/staff.dll: src/modules/staff.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/staff.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/staff.pdb $(MODLFLAGS) + +src/modules/starttls.dll: src/modules/starttls.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/starttls.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/starttls.pdb $(MODLFLAGS) + +src/modules/stats.dll: src/modules/stats.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/stats.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/stats.pdb $(MODLFLAGS) + +src/modules/sts.dll: src/modules/sts.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/sts.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/sts.pdb $(MODLFLAGS) + +src/modules/svsjoin.dll: src/modules/svsjoin.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/svsjoin.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/svsjoin.pdb $(MODLFLAGS) + +src/modules/svskill.dll: src/modules/svskill.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/svskill.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/svskill.pdb $(MODLFLAGS) + +src/modules/svslusers.dll: src/modules/svslusers.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/svslusers.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/svslusers.pdb $(MODLFLAGS) + +src/modules/svsmode.dll: src/modules/svsmode.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/svsmode.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/svsmode.pdb $(MODLFLAGS) + +src/modules/svsmotd.dll: src/modules/svsmotd.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/svsmotd.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/svsmotd.pdb $(MODLFLAGS) + +src/modules/svsnick.dll: src/modules/svsnick.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/svsnick.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/svsnick.pdb $(MODLFLAGS) + +src/modules/svsnline.dll: src/modules/svsnline.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/svsnline.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/svsnline.pdb $(MODLFLAGS) + +src/modules/svsnolag.dll: src/modules/svsnolag.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/svsnolag.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/svsnolag.pdb $(MODLFLAGS) + +src/modules/svsnoop.dll: src/modules/svsnoop.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/svsnoop.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/svsnoop.pdb $(MODLFLAGS) + +src/modules/svspart.dll: src/modules/svspart.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/svspart.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/svspart.pdb $(MODLFLAGS) + +src/modules/svssilence.dll: src/modules/svssilence.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/svssilence.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/svssilence.pdb $(MODLFLAGS) + +src/modules/svssno.dll: src/modules/svssno.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/svssno.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/svssno.pdb $(MODLFLAGS) + +src/modules/svswatch.dll: src/modules/svswatch.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/svswatch.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/svswatch.pdb $(MODLFLAGS) + +src/modules/swhois.dll: src/modules/swhois.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/swhois.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/swhois.pdb $(MODLFLAGS) + +src/modules/targetfloodprot.dll: src/modules/targetfloodprot.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/targetfloodprot.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/targetfloodprot.pdb $(MODLFLAGS) + +src/modules/time.dll: src/modules/time.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/time.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/time.pdb $(MODLFLAGS) + +src/modules/tkl.dll: src/modules/tkl.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/tkl.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/tkl.pdb $(MODLFLAGS) + +src/modules/tkldb.dll: src/modules/tkldb.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/tkldb.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/tkldb.pdb $(MODLFLAGS) + +src/modules/tls_antidos.dll: src/modules/tls_antidos.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/tls_antidos.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/tls_antidos.pdb $(MODLFLAGS) + +src/modules/tls_cipher.dll: src/modules/tls_cipher.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/tls_cipher.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/tls_cipher.pdb $(MODLFLAGS) + +src/modules/topic.dll: src/modules/topic.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/topic.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/topic.pdb $(MODLFLAGS) + +src/modules/trace.dll: src/modules/trace.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/trace.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/trace.pdb $(MODLFLAGS) + +src/modules/tsctl.dll: src/modules/tsctl.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/tsctl.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/tsctl.pdb $(MODLFLAGS) + +src/modules/typing-indicator.dll: src/modules/typing-indicator.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/typing-indicator.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/typing-indicator.pdb $(MODLFLAGS) + +src/modules/umode2.dll: src/modules/umode2.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/umode2.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/umode2.pdb $(MODLFLAGS) + +src/modules/unreal_server_compat.dll: src/modules/unreal_server_compat.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/unreal_server_compat.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/unreal_server_compat.pdb $(MODLFLAGS) + +src/modules/unsqline.dll: src/modules/unsqline.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/unsqline.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/unsqline.pdb $(MODLFLAGS) + +src/modules/user.dll: src/modules/user.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/user.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/user.pdb $(MODLFLAGS) + +src/modules/userhost.dll: src/modules/userhost.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/userhost.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/userhost.pdb $(MODLFLAGS) + +src/modules/userhost-tag.dll: src/modules/userhost-tag.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/userhost-tag.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/userhost-tag.pdb $(MODLFLAGS) + +src/modules/userip.dll: src/modules/userip.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/userip.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/userip.pdb $(MODLFLAGS) + +src/modules/userip-tag.dll: src/modules/userip-tag.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/userip-tag.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/userip-tag.pdb $(MODLFLAGS) + +src/modules/usermodes/bot.dll: src/modules/usermodes/bot.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/usermodes/bot.c /Fesrc/modules/usermodes/ /Fosrc/modules/usermodes/ /Fdsrc/modules/usermodes/bot.pdb $(MODLFLAGS) + +src/modules/usermodes/censor.dll: src/modules/usermodes/censor.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/usermodes/censor.c /Fesrc/modules/usermodes/ /Fosrc/modules/usermodes/ /Fdsrc/modules/usermodes/censor.pdb $(MODLFLAGS) + +src/modules/usermodes/noctcp.dll: src/modules/usermodes/noctcp.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/usermodes/noctcp.c /Fesrc/modules/usermodes/ /Fosrc/modules/usermodes/ /Fdsrc/modules/usermodes/noctcp.pdb $(MODLFLAGS) + +src/modules/usermodes/nokick.dll: src/modules/usermodes/nokick.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/usermodes/nokick.c /Fesrc/modules/usermodes/ /Fosrc/modules/usermodes/ /Fdsrc/modules/usermodes/nokick.pdb $(MODLFLAGS) + +src/modules/usermodes/privacy.dll: src/modules/usermodes/privacy.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/usermodes/privacy.c /Fesrc/modules/usermodes/ /Fosrc/modules/usermodes/ /Fdsrc/modules/usermodes/privacy.pdb $(MODLFLAGS) + +src/modules/usermodes/privdeaf.dll: src/modules/usermodes/privdeaf.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/usermodes/privdeaf.c /Fesrc/modules/usermodes/ /Fosrc/modules/usermodes/ /Fdsrc/modules/usermodes/privdeaf.pdb $(MODLFLAGS) + +src/modules/usermodes/regonlymsg.dll: src/modules/usermodes/regonlymsg.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/usermodes/regonlymsg.c /Fesrc/modules/usermodes/ /Fosrc/modules/usermodes/ /Fdsrc/modules/usermodes/regonlymsg.pdb $(MODLFLAGS) + +src/modules/usermodes/secureonlymsg.dll: src/modules/usermodes/secureonlymsg.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/usermodes/secureonlymsg.c /Fesrc/modules/usermodes/ /Fosrc/modules/usermodes/ /Fdsrc/modules/usermodes/secureonlymsg.pdb $(MODLFLAGS) + +src/modules/usermodes/servicebot.dll: src/modules/usermodes/servicebot.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/usermodes/servicebot.c /Fesrc/modules/usermodes/ /Fosrc/modules/usermodes/ /Fdsrc/modules/usermodes/servicebot.pdb $(MODLFLAGS) + +src/modules/usermodes/showwhois.dll: src/modules/usermodes/showwhois.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/usermodes/showwhois.c /Fesrc/modules/usermodes/ /Fosrc/modules/usermodes/ /Fdsrc/modules/usermodes/showwhois.pdb $(MODLFLAGS) + +src/modules/usermodes/wallops.dll: src/modules/usermodes/wallops.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/usermodes/wallops.c /Fesrc/modules/usermodes/ /Fosrc/modules/usermodes/ /Fdsrc/modules/usermodes/wallops.pdb $(MODLFLAGS) + +src/modules/vhost.dll: src/modules/vhost.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/vhost.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/vhost.pdb $(MODLFLAGS) + +src/modules/watch-backend.dll: src/modules/watch-backend.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/watch-backend.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/watch-backend.pdb $(MODLFLAGS) + +src/modules/watch.dll: src/modules/watch.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/watch.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/watch.pdb $(MODLFLAGS) + +src/modules/webirc.dll: src/modules/webirc.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/webirc.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/webirc.pdb $(MODLFLAGS) + +src/modules/webredir.dll: src/modules/webredir.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/webredir.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/webredir.pdb $(MODLFLAGS) + +src/modules/websocket.dll: src/modules/websocket.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/websocket.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/websocket.pdb $(MODLFLAGS) + +src/modules/whois.dll: src/modules/whois.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/whois.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/whois.pdb $(MODLFLAGS) + +src/modules/who_old.dll: src/modules/who_old.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/who_old.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/who_old.pdb $(MODLFLAGS) + +src/modules/whowas.dll: src/modules/whowas.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/whowas.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/whowas.pdb $(MODLFLAGS) + +src/modules/whox.dll: src/modules/whox.c $(INCLUDES) + $(CC) $(MODCFLAGS) src/modules/whox.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/whox.pdb $(MODLFLAGS) -dummy: diff --git a/README.md b/README.md index cf4a267..86b1427 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,11 @@ Key features include SSL/TLS, cloaking, its advanced anti-flood and anti-spam sy swear filtering and module support. We are also particularly proud on our extensive online documentation. +## Versions +* UnrealIRCd 6 is the *stable* series since December 2021. All new features go in there. +* UnrealIRCd 5 is the *oldstable* series. It will receive bug fixes until + July 1, 2022 plus another 12 months of security fixes. + ## How to get started Please consult our excellent online documentation at https://www.unrealircd.org/docs/ when setting up the IRCd! diff --git a/SECURITY.md b/SECURITY.md index 7708d00..0b6e8db 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,7 +1,8 @@ # Security Policy ## Supported Versions -* The latest *stable* release of the 5.x branch +* The latest *stable* release of UnrealIRCd 5 (until 2023-07-01) +* The latest *stable* release of UnrealIRCd 6 See [UnrealIRCd releases](https://www.unrealircd.org/docs/UnrealIRCd_releases) for information on older versions and End Of Life dates. diff --git a/autoconf/config.guess b/autoconf/config.guess index f7eb141..e81d3ae 100644 --- a/autoconf/config.guess +++ b/autoconf/config.guess @@ -1,8 +1,10 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright 1992-2015 Free Software Foundation, Inc. +# Copyright 1992-2021 Free Software Foundation, Inc. -timestamp='2015-03-04' +# shellcheck disable=SC2006,SC2268 # see below for rationale + +timestamp='2021-06-03' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -15,7 +17,7 @@ timestamp='2015-03-04' # General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, see . +# along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a @@ -27,11 +29,19 @@ timestamp='2015-03-04' # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD +# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess # # Please send patches to . +# The "shellcheck disable" line above the timestamp inhibits complaints +# about features and limitations of the classic Bourne shell that were +# superseded or lifted in POSIX. However, this script identifies a wide +# variety of pre-POSIX systems that do not have POSIX shells at all, and +# even some reasonably current systems (Solaris 10 as case-in-point) still +# have a pre-POSIX /bin/sh. + + me=`echo "$0" | sed -e 's,.*/,,'` usage="\ @@ -39,7 +49,7 @@ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. -Operation modes: +Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit @@ -50,7 +60,7 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright 1992-2015 Free Software Foundation, Inc. +Copyright 1992-2021 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -84,7 +94,8 @@ if test $# != 0; then exit 1 fi -trap 'exit 1' 1 2 15 +# Just in case it came from the environment. +GUESS= # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires @@ -96,66 +107,90 @@ trap 'exit 1' 1 2 15 # Portable tmp directory creation inspired by the Autoconf team. -set_cc_for_build=' -trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; -trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; -: ${TMPDIR=/tmp} ; - { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || - { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || - { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || - { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; -dummy=$tmp/dummy ; -tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; -case $CC_FOR_BUILD,$HOST_CC,$CC in - ,,) echo "int x;" > $dummy.c ; - for c in cc gcc c89 c99 ; do - if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then - CC_FOR_BUILD="$c"; break ; - fi ; - done ; - if test x"$CC_FOR_BUILD" = x ; then - CC_FOR_BUILD=no_compiler_found ; - fi - ;; - ,,*) CC_FOR_BUILD=$CC ;; - ,*,*) CC_FOR_BUILD=$HOST_CC ;; -esac ; set_cc_for_build= ;' +tmp= +# shellcheck disable=SC2172 +trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 + +set_cc_for_build() { + # prevent multiple calls if $tmp is already set + test "$tmp" && return 0 + : "${TMPDIR=/tmp}" + # shellcheck disable=SC2039,SC3028 + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } + dummy=$tmp/dummy + case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in + ,,) echo "int x;" > "$dummy.c" + for driver in cc gcc c89 c99 ; do + if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then + CC_FOR_BUILD=$driver + break + fi + done + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; + esac +} # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) -if (test -f /.attbin/uname) >/dev/null 2>&1 ; then +if test -f /.attbin/uname ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown -UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown -case "${UNAME_SYSTEM}" in +case $UNAME_SYSTEM in Linux|GNU|GNU/*) - # If the system lacks a compiler, then just pick glibc. - # We could probably try harder. - LIBC=gnu + LIBC=unknown - eval $set_cc_for_build - cat <<-EOF > $dummy.c + set_cc_for_build + cat <<-EOF > "$dummy.c" #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc - #else + #elif defined(__GLIBC__) LIBC=gnu + #else + #include + /* First heuristic to detect musl libc. */ + #ifdef __DEFINED_va_list + LIBC=musl + #endif #endif EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` + cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` + eval "$cc_set_libc" + + # Second heuristic to detect musl libc. + if [ "$LIBC" = unknown ] && + command -v ldd >/dev/null && + ldd --version 2>&1 | grep -q ^musl; then + LIBC=musl + fi + + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + if [ "$LIBC" = unknown ]; then + LIBC=gnu + fi ;; esac # Note: order is significant - the case branches are not exclusive. -case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in +case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, @@ -167,29 +202,32 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". - sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ - /sbin/$sysctl 2>/dev/null || \ - /usr/sbin/$sysctl 2>/dev/null || \ + /sbin/sysctl -n hw.machine_arch 2>/dev/null || \ + /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \ echo unknown)` - case "${UNAME_MACHINE_ARCH}" in + case $UNAME_MACHINE_ARCH in + aarch64eb) machine=aarch64_be-unknown ;; armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; earmv*) - arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'` - endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'` + arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` machine=${arch}${endian}-unknown ;; - *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + *) machine=$UNAME_MACHINE_ARCH-unknown ;; esac # The Operating System including object format, if it has switched - # to ELF recently, or will in the future. - case "${UNAME_MACHINE_ARCH}" in - arm*|earm*|i386|m68k|ns32k|sh3*|sparc|vax) - eval $set_cc_for_build + # to ELF recently (or will in the future) and ABI. + case $UNAME_MACHINE_ARCH in + earm*) + os=netbsdelf + ;; + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then @@ -205,10 +243,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in ;; esac # Determine ABI tags. - case "${UNAME_MACHINE_ARCH}" in + case $UNAME_MACHINE_ARCH in earm*) expr='s/^earmv[0-9]/-eabi/;s/eb$//' - abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"` + abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` ;; esac # The OS release @@ -216,40 +254,68 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. - case "${UNAME_VERSION}" in + case $UNAME_VERSION in Debian*) release='-gnu' ;; *) - release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "${machine}-${os}${release}${abi}" - exit ;; + GUESS=$machine-${os}${release}${abi-} + ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` - echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE + ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` - echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE + ;; + *:SecBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE + ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE + ;; + *:MidnightBSD:*:*) + GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE + ;; *:ekkoBSD:*:*) - echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE + ;; *:SolidBSD:*:*) - echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE + ;; + *:OS108:*:*) + GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE + ;; macppc:MirBSD:*:*) - echo powerpc-unknown-mirbsd${UNAME_RELEASE} - exit ;; + GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE + ;; *:MirBSD:*:*) - echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE + ;; + *:Sortix:*:*) + GUESS=$UNAME_MACHINE-unknown-sortix + ;; + *:Twizzler:*:*) + GUESS=$UNAME_MACHINE-unknown-twizzler + ;; + *:Redox:*:*) + GUESS=$UNAME_MACHINE-unknown-redox + ;; + mips:OSF1:*.*) + GUESS=mips-dec-osf1 + ;; alpha:OSF1:*:*) + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + trap '' 0 case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` @@ -263,163 +329,158 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` - case "$ALPHA_CPU_TYPE" in + case $ALPHA_CPU_TYPE in "EV4 (21064)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "EV4.5 (21064)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "LCA4 (21066/21068)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "EV5 (21164)") - UNAME_MACHINE="alphaev5" ;; + UNAME_MACHINE=alphaev5 ;; "EV5.6 (21164A)") - UNAME_MACHINE="alphaev56" ;; + UNAME_MACHINE=alphaev56 ;; "EV5.6 (21164PC)") - UNAME_MACHINE="alphapca56" ;; + UNAME_MACHINE=alphapca56 ;; "EV5.7 (21164PC)") - UNAME_MACHINE="alphapca57" ;; + UNAME_MACHINE=alphapca57 ;; "EV6 (21264)") - UNAME_MACHINE="alphaev6" ;; + UNAME_MACHINE=alphaev6 ;; "EV6.7 (21264A)") - UNAME_MACHINE="alphaev67" ;; + UNAME_MACHINE=alphaev67 ;; "EV6.8CB (21264C)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.8AL (21264B)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.8CX (21264D)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.9A (21264/EV69A)") - UNAME_MACHINE="alphaev69" ;; + UNAME_MACHINE=alphaev69 ;; "EV7 (21364)") - UNAME_MACHINE="alphaev7" ;; + UNAME_MACHINE=alphaev7 ;; "EV7.9 (21364A)") - UNAME_MACHINE="alphaev79" ;; + UNAME_MACHINE=alphaev79 ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - # Reset EXIT trap before exiting to avoid spurious non-zero exit code. - exitcode=$? - trap '' 0 - exit $exitcode ;; - Alpha\ *:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # Should we change UNAME_MACHINE based on the output of uname instead - # of the specific Alpha model? - echo alpha-pc-interix - exit ;; - 21064:Windows_NT:50:3) - echo alpha-dec-winnt3.5 - exit ;; + OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + GUESS=$UNAME_MACHINE-dec-osf$OSF_REL + ;; Amiga*:UNIX_System_V:4.0:*) - echo m68k-unknown-sysv4 - exit ;; + GUESS=m68k-unknown-sysv4 + ;; *:[Aa]miga[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-amigaos - exit ;; + GUESS=$UNAME_MACHINE-unknown-amigaos + ;; *:[Mm]orph[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-morphos - exit ;; + GUESS=$UNAME_MACHINE-unknown-morphos + ;; *:OS/390:*:*) - echo i370-ibm-openedition - exit ;; + GUESS=i370-ibm-openedition + ;; *:z/VM:*:*) - echo s390-ibm-zvmoe - exit ;; + GUESS=s390-ibm-zvmoe + ;; *:OS400:*:*) - echo powerpc-ibm-os400 - exit ;; + GUESS=powerpc-ibm-os400 + ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - echo arm-acorn-riscix${UNAME_RELEASE} - exit ;; + GUESS=arm-acorn-riscix$UNAME_RELEASE + ;; arm*:riscos:*:*|arm*:RISCOS:*:*) - echo arm-unknown-riscos - exit ;; + GUESS=arm-unknown-riscos + ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) - echo hppa1.1-hitachi-hiuxmpp - exit ;; + GUESS=hppa1.1-hitachi-hiuxmpp + ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. - if test "`(/bin/universe) 2>/dev/null`" = att ; then - echo pyramid-pyramid-sysv3 - else - echo pyramid-pyramid-bsd - fi - exit ;; + case `(/bin/universe) 2>/dev/null` in + att) GUESS=pyramid-pyramid-sysv3 ;; + *) GUESS=pyramid-pyramid-bsd ;; + esac + ;; NILE*:*:*:dcosx) - echo pyramid-pyramid-svr4 - exit ;; + GUESS=pyramid-pyramid-svr4 + ;; DRS?6000:unix:4.0:6*) - echo sparc-icl-nx6 - exit ;; + GUESS=sparc-icl-nx6 + ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in - sparc) echo sparc-icl-nx7; exit ;; - esac ;; + sparc) GUESS=sparc-icl-nx7 ;; + esac + ;; s390x:SunOS:*:*) - echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL + ;; sun4H:SunOS:5.*:*) - echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-hal-solaris2$SUN_REL + ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-sun-solaris2$SUN_REL + ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) - echo i386-pc-auroraux${UNAME_RELEASE} - exit ;; + GUESS=i386-pc-auroraux$UNAME_RELEASE + ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) - eval $set_cc_for_build - SUN_ARCH="i386" + set_cc_for_build + SUN_ARCH=i386 # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if test "$CC_FOR_BUILD" != no_compiler_found; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then - SUN_ARCH="x86_64" + SUN_ARCH=x86_64 fi fi - echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=$SUN_ARCH-pc-solaris2$SUN_REL + ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. - echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-sun-solaris3$SUN_REL + ;; sun4*:SunOS:*:*) - case "`/usr/bin/arch -k`" in + case `/usr/bin/arch -k` in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. - echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'` + GUESS=sparc-sun-sunos$SUN_REL + ;; sun3*:SunOS:*:*) - echo m68k-sun-sunos${UNAME_RELEASE} - exit ;; + GUESS=m68k-sun-sunos$UNAME_RELEASE + ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 - case "`/bin/arch`" in + test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 + case `/bin/arch` in sun3) - echo m68k-sun-sunos${UNAME_RELEASE} + GUESS=m68k-sun-sunos$UNAME_RELEASE ;; sun4) - echo sparc-sun-sunos${UNAME_RELEASE} + GUESS=sparc-sun-sunos$UNAME_RELEASE ;; esac - exit ;; + ;; aushp:SunOS:*:*) - echo sparc-auspex-sunos${UNAME_RELEASE} - exit ;; + GUESS=sparc-auspex-sunos$UNAME_RELEASE + ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor @@ -429,44 +490,44 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - echo m68k-milan-mint${UNAME_RELEASE} - exit ;; + GUESS=m68k-milan-mint$UNAME_RELEASE + ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - echo m68k-hades-mint${UNAME_RELEASE} - exit ;; + GUESS=m68k-hades-mint$UNAME_RELEASE + ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - echo m68k-unknown-mint${UNAME_RELEASE} - exit ;; + GUESS=m68k-unknown-mint$UNAME_RELEASE + ;; m68k:machten:*:*) - echo m68k-apple-machten${UNAME_RELEASE} - exit ;; + GUESS=m68k-apple-machten$UNAME_RELEASE + ;; powerpc:machten:*:*) - echo powerpc-apple-machten${UNAME_RELEASE} - exit ;; + GUESS=powerpc-apple-machten$UNAME_RELEASE + ;; RISC*:Mach:*:*) - echo mips-dec-mach_bsd4.3 - exit ;; + GUESS=mips-dec-mach_bsd4.3 + ;; RISC*:ULTRIX:*:*) - echo mips-dec-ultrix${UNAME_RELEASE} - exit ;; + GUESS=mips-dec-ultrix$UNAME_RELEASE + ;; VAX*:ULTRIX*:*:*) - echo vax-dec-ultrix${UNAME_RELEASE} - exit ;; + GUESS=vax-dec-ultrix$UNAME_RELEASE + ;; 2020:CLIX:*:* | 2430:CLIX:*:*) - echo clipper-intergraph-clix${UNAME_RELEASE} - exit ;; + GUESS=clipper-intergraph-clix$UNAME_RELEASE + ;; mips:*:*:UMIPS | mips:*:*:RISCos) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { @@ -475,95 +536,96 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) - printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) - printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) - printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF - $CC_FOR_BUILD -o $dummy $dummy.c && - dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && - SYSTEM_NAME=`$dummy $dummyarg` && + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && + dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`"$dummy" "$dummyarg"` && { echo "$SYSTEM_NAME"; exit; } - echo mips-mips-riscos${UNAME_RELEASE} - exit ;; + GUESS=mips-mips-riscos$UNAME_RELEASE + ;; Motorola:PowerMAX_OS:*:*) - echo powerpc-motorola-powermax - exit ;; + GUESS=powerpc-motorola-powermax + ;; Motorola:*:4.3:PL8-*) - echo powerpc-harris-powermax - exit ;; + GUESS=powerpc-harris-powermax + ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) - echo powerpc-harris-powermax - exit ;; + GUESS=powerpc-harris-powermax + ;; Night_Hawk:Power_UNIX:*:*) - echo powerpc-harris-powerunix - exit ;; + GUESS=powerpc-harris-powerunix + ;; m88k:CX/UX:7*:*) - echo m88k-harris-cxux7 - exit ;; + GUESS=m88k-harris-cxux7 + ;; m88k:*:4*:R4*) - echo m88k-motorola-sysv4 - exit ;; + GUESS=m88k-motorola-sysv4 + ;; m88k:*:3*:R3*) - echo m88k-motorola-sysv3 - exit ;; + GUESS=m88k-motorola-sysv3 + ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` - if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110 then - if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ - [ ${TARGET_BINARY_INTERFACE}x = x ] + if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \ + test "$TARGET_BINARY_INTERFACE"x = x then - echo m88k-dg-dgux${UNAME_RELEASE} + GUESS=m88k-dg-dgux$UNAME_RELEASE else - echo m88k-dg-dguxbcs${UNAME_RELEASE} + GUESS=m88k-dg-dguxbcs$UNAME_RELEASE fi else - echo i586-dg-dgux${UNAME_RELEASE} + GUESS=i586-dg-dgux$UNAME_RELEASE fi - exit ;; + ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) - echo m88k-dolphin-sysv3 - exit ;; + GUESS=m88k-dolphin-sysv3 + ;; M88*:*:R3*:*) # Delta 88k system running SVR3 - echo m88k-motorola-sysv3 - exit ;; + GUESS=m88k-motorola-sysv3 + ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) - echo m88k-tektronix-sysv3 - exit ;; + GUESS=m88k-tektronix-sysv3 + ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) - echo m68k-tektronix-bsd - exit ;; + GUESS=m68k-tektronix-bsd + ;; *:IRIX*:*:*) - echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` - exit ;; + IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'` + GUESS=mips-sgi-irix$IRIX_REL + ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. - echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id - exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + GUESS=romp-ibm-aix # uname -m gives an 8 hex-code CPU id + ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) - echo i386-ibm-aix - exit ;; + GUESS=i386-ibm-aix + ;; ia64:AIX:*:*) - if [ -x /usr/bin/oslevel ] ; then + if test -x /usr/bin/oslevel ; then IBM_REV=`/usr/bin/oslevel` else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + IBM_REV=$UNAME_VERSION.$UNAME_RELEASE fi - echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} - exit ;; + GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV + ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" #include main() @@ -574,77 +636,77 @@ EOF exit(0); } EOF - if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` then - echo "$SYSTEM_NAME" + GUESS=$SYSTEM_NAME else - echo rs6000-ibm-aix3.2.5 + GUESS=rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then - echo rs6000-ibm-aix3.2.4 + GUESS=rs6000-ibm-aix3.2.4 else - echo rs6000-ibm-aix3.2 + GUESS=rs6000-ibm-aix3.2 fi - exit ;; + ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` - if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi - if [ -x /usr/bin/lslpp ] ; then - IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + if test -x /usr/bin/lslpp ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \ awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + IBM_REV=$UNAME_VERSION.$UNAME_RELEASE fi - echo ${IBM_ARCH}-ibm-aix${IBM_REV} - exit ;; + GUESS=$IBM_ARCH-ibm-aix$IBM_REV + ;; *:AIX:*:*) - echo rs6000-ibm-aix - exit ;; - ibmrt:4.4BSD:*|romp-ibm:BSD:*) - echo romp-ibm-bsd4.4 - exit ;; + GUESS=rs6000-ibm-aix + ;; + ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) + GUESS=romp-ibm-bsd4.4 + ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and - echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to - exit ;; # report: romp-ibm BSD 4.3 + GUESS=romp-ibm-bsd$UNAME_RELEASE # 4.3 with uname added to + ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) - echo rs6000-bull-bosx - exit ;; + GUESS=rs6000-bull-bosx + ;; DPX/2?00:B.O.S.:*:*) - echo m68k-bull-sysv3 - exit ;; + GUESS=m68k-bull-sysv3 + ;; 9000/[34]??:4.3bsd:1.*:*) - echo m68k-hp-bsd - exit ;; + GUESS=m68k-hp-bsd + ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) - echo m68k-hp-bsd4.4 - exit ;; + GUESS=m68k-hp-bsd4.4 + ;; 9000/[34678]??:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - case "${UNAME_MACHINE}" in - 9000/31? ) HP_ARCH=m68000 ;; - 9000/[34]?? ) HP_ARCH=m68k ;; + HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` + case $UNAME_MACHINE in + 9000/31?) HP_ARCH=m68000 ;; + 9000/[34]??) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) - if [ -x /usr/bin/getconf ]; then + if test -x /usr/bin/getconf; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` - case "${sc_cpu_version}" in - 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 - 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + case $sc_cpu_version in + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 - case "${sc_kernel_bits}" in - 32) HP_ARCH="hppa2.0n" ;; - 64) HP_ARCH="hppa2.0w" ;; - '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + case $sc_kernel_bits in + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 esac ;; esac fi - if [ "${HP_ARCH}" = "" ]; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + if test "$HP_ARCH" = ""; then + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" #define _HPUX_SOURCE #include @@ -677,13 +739,13 @@ EOF exit (0); } EOF - (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac - if [ ${HP_ARCH} = "hppa2.0w" ] + if test "$HP_ARCH" = hppa2.0w then - eval $set_cc_for_build + set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler @@ -694,23 +756,23 @@ EOF # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 - if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then - HP_ARCH="hppa2.0w" + HP_ARCH=hppa2.0w else - HP_ARCH="hppa64" + HP_ARCH=hppa64 fi fi - echo ${HP_ARCH}-hp-hpux${HPUX_REV} - exit ;; + GUESS=$HP_ARCH-hp-hpux$HPUX_REV + ;; ia64:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - echo ia64-hp-hpux${HPUX_REV} - exit ;; + HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` + GUESS=ia64-hp-hpux$HPUX_REV + ;; 3050*:HI-UX:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" #include int main () @@ -735,38 +797,38 @@ EOF exit (0); } EOF - $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } - echo unknown-hitachi-hiuxwe2 - exit ;; - 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) - echo hppa1.1-hp-bsd - exit ;; + GUESS=unknown-hitachi-hiuxwe2 + ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) + GUESS=hppa1.1-hp-bsd + ;; 9000/8??:4.3bsd:*:*) - echo hppa1.0-hp-bsd - exit ;; + GUESS=hppa1.0-hp-bsd + ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) - echo hppa1.0-hp-mpeix - exit ;; - hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) - echo hppa1.1-hp-osf - exit ;; + GUESS=hppa1.0-hp-mpeix + ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) + GUESS=hppa1.1-hp-osf + ;; hp8??:OSF1:*:*) - echo hppa1.0-hp-osf - exit ;; + GUESS=hppa1.0-hp-osf + ;; i*86:OSF1:*:*) - if [ -x /usr/sbin/sysversion ] ; then - echo ${UNAME_MACHINE}-unknown-osf1mk + if test -x /usr/sbin/sysversion ; then + GUESS=$UNAME_MACHINE-unknown-osf1mk else - echo ${UNAME_MACHINE}-unknown-osf1 + GUESS=$UNAME_MACHINE-unknown-osf1 fi - exit ;; + ;; parisc*:Lites*:*:*) - echo hppa1.1-hp-lites - exit ;; + GUESS=hppa1.1-hp-lites + ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) - echo c1-convex-bsd - exit ;; + GUESS=c1-convex-bsd + ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd @@ -774,139 +836,145 @@ EOF fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) - echo c34-convex-bsd - exit ;; + GUESS=c34-convex-bsd + ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) - echo c38-convex-bsd - exit ;; + GUESS=c38-convex-bsd + ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) - echo c4-convex-bsd - exit ;; + GUESS=c4-convex-bsd + ;; CRAY*Y-MP:*:*:*) - echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=ymp-cray-unicos$CRAY_REL + ;; CRAY*[A-Z]90:*:*:*) - echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) - echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=t90-cray-unicos$CRAY_REL + ;; CRAY*T3E:*:*:*) - echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=alphaev5-cray-unicosmk$CRAY_REL + ;; CRAY*SV1:*:*:*) - echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=sv1-cray-unicos$CRAY_REL + ;; *:UNICOS/mp:*:*) - echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=craynv-cray-unicosmp$CRAY_REL + ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` - echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` + GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} + ;; 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` - echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` + GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} + ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) - echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE + ;; sparc*:BSD/OS:*:*) - echo sparc-unknown-bsdi${UNAME_RELEASE} - exit ;; + GUESS=sparc-unknown-bsdi$UNAME_RELEASE + ;; *:BSD/OS:*:*) - echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE + ;; + arm:FreeBSD:*:*) + UNAME_PROCESSOR=`uname -p` + set_cc_for_build + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi + else + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf + fi + ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` - case ${UNAME_PROCESSOR} in + case $UNAME_PROCESSOR in amd64) - echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - *) - echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; esac - exit ;; + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL + ;; i*:CYGWIN*:*) - echo ${UNAME_MACHINE}-pc-cygwin - exit ;; + GUESS=$UNAME_MACHINE-pc-cygwin + ;; *:MINGW64*:*) - echo ${UNAME_MACHINE}-pc-mingw64 - exit ;; + GUESS=$UNAME_MACHINE-pc-mingw64 + ;; *:MINGW*:*) - echo ${UNAME_MACHINE}-pc-mingw32 - exit ;; + GUESS=$UNAME_MACHINE-pc-mingw32 + ;; *:MSYS*:*) - echo ${UNAME_MACHINE}-pc-msys - exit ;; - i*:windows32*:*) - # uname -m includes "-pc" on this system. - echo ${UNAME_MACHINE}-mingw32 - exit ;; + GUESS=$UNAME_MACHINE-pc-msys + ;; i*:PW*:*) - echo ${UNAME_MACHINE}-pc-pw32 - exit ;; + GUESS=$UNAME_MACHINE-pc-pw32 + ;; *:Interix*:*) - case ${UNAME_MACHINE} in + case $UNAME_MACHINE in x86) - echo i586-pc-interix${UNAME_RELEASE} - exit ;; + GUESS=i586-pc-interix$UNAME_RELEASE + ;; authenticamd | genuineintel | EM64T) - echo x86_64-unknown-interix${UNAME_RELEASE} - exit ;; + GUESS=x86_64-unknown-interix$UNAME_RELEASE + ;; IA64) - echo ia64-unknown-interix${UNAME_RELEASE} - exit ;; + GUESS=ia64-unknown-interix$UNAME_RELEASE + ;; esac ;; - [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) - echo i${UNAME_MACHINE}-pc-mks - exit ;; - 8664:Windows_NT:*) - echo x86_64-pc-mks - exit ;; - i*:Windows_NT*:* | Pentium*:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we - # UNAME_MACHINE based on the output of uname instead of i386? - echo i586-pc-interix - exit ;; i*:UWIN*:*) - echo ${UNAME_MACHINE}-pc-uwin - exit ;; + GUESS=$UNAME_MACHINE-pc-uwin + ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) - echo x86_64-unknown-cygwin - exit ;; - p*:CYGWIN*:*) - echo powerpcle-unknown-cygwin - exit ;; + GUESS=x86_64-pc-cygwin + ;; prep*:SunOS:5.*:*) - echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=powerpcle-unknown-solaris2$SUN_REL + ;; *:GNU:*:*) # the GNU system - echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` - exit ;; + GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'` + GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'` + GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL + ;; *:GNU/*:*:*) # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} - exit ;; - i*86:Minix:*:*) - echo ${UNAME_MACHINE}-pc-minix - exit ;; + GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"` + GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC + ;; + *:Minix:*:*) + GUESS=$UNAME_MACHINE-unknown-minix + ;; aarch64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; alpha:Linux:*:*) - case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; @@ -916,175 +984,226 @@ EOF EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 - if test "$?" = 0 ; then LIBC="gnulibc1" ; fi - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - arc:Linux:*:* | arceb:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; arm*:Linux:*:*) - eval $set_cc_for_build + set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then - echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi + GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi else - echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf + GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf fi fi - exit ;; + ;; avr32*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; cris:Linux:*:*) - echo ${UNAME_MACHINE}-axis-linux-${LIBC} - exit ;; + GUESS=$UNAME_MACHINE-axis-linux-$LIBC + ;; crisv32:Linux:*:*) - echo ${UNAME_MACHINE}-axis-linux-${LIBC} - exit ;; + GUESS=$UNAME_MACHINE-axis-linux-$LIBC + ;; e2k:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; frv:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; hexagon:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; i*86:Linux:*:*) - echo ${UNAME_MACHINE}-pc-linux-${LIBC} - exit ;; + GUESS=$UNAME_MACHINE-pc-linux-$LIBC + ;; ia64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + k1om:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; m32r*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; m68*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; mips:Linux:*:* | mips64:Linux:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + set_cc_for_build + IS_GLIBC=0 + test x"${LIBC}" = xgnu && IS_GLIBC=1 + sed 's/^ //' << EOF > "$dummy.c" #undef CPU - #undef ${UNAME_MACHINE} - #undef ${UNAME_MACHINE}el + #undef mips + #undef mipsel + #undef mips64 + #undef mips64el + #if ${IS_GLIBC} && defined(_ABI64) + LIBCABI=gnuabi64 + #else + #if ${IS_GLIBC} && defined(_ABIN32) + LIBCABI=gnuabin32 + #else + LIBCABI=${LIBC} + #endif + #endif + + #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa64r6 + #else + #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa32r6 + #else + #if defined(__mips64) + CPU=mips64 + #else + CPU=mips + #endif + #endif + #endif + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=${UNAME_MACHINE}el + MIPS_ENDIAN=el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=${UNAME_MACHINE} + MIPS_ENDIAN= #else - CPU= + MIPS_ENDIAN= #endif #endif EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } + cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'` + eval "$cc_set_vars" + test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } + ;; + mips64el:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; openrisc*:Linux:*:*) - echo or1k-unknown-linux-${LIBC} - exit ;; + GUESS=or1k-unknown-linux-$LIBC + ;; or32:Linux:*:* | or1k*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; padre:Linux:*:*) - echo sparc-unknown-linux-${LIBC} - exit ;; + GUESS=sparc-unknown-linux-$LIBC + ;; parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-${LIBC} - exit ;; + GUESS=hppa64-unknown-linux-$LIBC + ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; - PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; - *) echo hppa-unknown-linux-${LIBC} ;; + PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;; + PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;; + *) GUESS=hppa-unknown-linux-$LIBC ;; esac - exit ;; + ;; ppc64:Linux:*:*) - echo powerpc64-unknown-linux-${LIBC} - exit ;; + GUESS=powerpc64-unknown-linux-$LIBC + ;; ppc:Linux:*:*) - echo powerpc-unknown-linux-${LIBC} - exit ;; + GUESS=powerpc-unknown-linux-$LIBC + ;; ppc64le:Linux:*:*) - echo powerpc64le-unknown-linux-${LIBC} - exit ;; + GUESS=powerpc64le-unknown-linux-$LIBC + ;; ppcle:Linux:*:*) - echo powerpcle-unknown-linux-${LIBC} - exit ;; + GUESS=powerpcle-unknown-linux-$LIBC + ;; + riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; s390:Linux:*:* | s390x:Linux:*:*) - echo ${UNAME_MACHINE}-ibm-linux-${LIBC} - exit ;; + GUESS=$UNAME_MACHINE-ibm-linux-$LIBC + ;; sh64*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; sh*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; sparc:Linux:*:* | sparc64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; tile*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; vax:Linux:*:*) - echo ${UNAME_MACHINE}-dec-linux-${LIBC} - exit ;; + GUESS=$UNAME_MACHINE-dec-linux-$LIBC + ;; x86_64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; + set_cc_for_build + LIBCABI=$LIBC + if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_X32 >/dev/null + then + LIBCABI=${LIBC}x32 + fi + fi + GUESS=$UNAME_MACHINE-pc-linux-$LIBCABI + ;; xtensa*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. - echo i386-sequent-sysv4 - exit ;; + GUESS=i386-sequent-sysv4 + ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. - echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} - exit ;; + GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION + ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. - echo ${UNAME_MACHINE}-pc-os2-emx - exit ;; + GUESS=$UNAME_MACHINE-pc-os2-emx + ;; i*86:XTS-300:*:STOP) - echo ${UNAME_MACHINE}-unknown-stop - exit ;; + GUESS=$UNAME_MACHINE-unknown-stop + ;; i*86:atheos:*:*) - echo ${UNAME_MACHINE}-unknown-atheos - exit ;; + GUESS=$UNAME_MACHINE-unknown-atheos + ;; i*86:syllable:*:*) - echo ${UNAME_MACHINE}-pc-syllable - exit ;; + GUESS=$UNAME_MACHINE-pc-syllable + ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) - echo i386-unknown-lynxos${UNAME_RELEASE} - exit ;; + GUESS=i386-unknown-lynxos$UNAME_RELEASE + ;; i*86:*DOS:*:*) - echo ${UNAME_MACHINE}-pc-msdosdjgpp - exit ;; - i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) - UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + GUESS=$UNAME_MACHINE-pc-msdosdjgpp + ;; + i*86:*:4.*:*) + UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then - echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL else - echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL fi - exit ;; + ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in @@ -1092,12 +1211,12 @@ EOF *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac - echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} - exit ;; + GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 @@ -1107,43 +1226,43 @@ EOF && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 - echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL else - echo ${UNAME_MACHINE}-pc-sysv32 + GUESS=$UNAME_MACHINE-pc-sysv32 fi - exit ;; + ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub - # prints for the "djgpp" host, or else GDB configury will decide that + # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. - echo i586-pc-msdosdjgpp - exit ;; + GUESS=i586-pc-msdosdjgpp + ;; Intel:Mach:3*:*) - echo i386-pc-mach3 - exit ;; + GUESS=i386-pc-mach3 + ;; paragon:*:*:*) - echo i860-intel-osf1 - exit ;; + GUESS=i860-intel-osf1 + ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then - echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + GUESS=i860-stardent-sysv$UNAME_RELEASE # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. - echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + GUESS=i860-unknown-sysv$UNAME_RELEASE # Unknown i860-SVR4 fi - exit ;; + ;; mini*:CTIX:SYS*5:*) # "miniframe" - echo m68010-convergent-sysv - exit ;; + GUESS=m68010-convergent-sysv + ;; mc68k:UNIX:SYSTEM5:3.51m) - echo m68k-convergent-sysv - exit ;; + GUESS=m68k-convergent-sysv + ;; M680?0:D-NIX:5.3:*) - echo m68k-diab-dnix - exit ;; + GUESS=m68k-diab-dnix + ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) @@ -1151,9 +1270,9 @@ EOF test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; @@ -1162,248 +1281,438 @@ EOF test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) - echo m68k-unknown-lynxos${UNAME_RELEASE} - exit ;; + GUESS=m68k-unknown-lynxos$UNAME_RELEASE + ;; mc68030:UNIX_System_V:4.*:*) - echo m68k-atari-sysv4 - exit ;; + GUESS=m68k-atari-sysv4 + ;; TSUNAMI:LynxOS:2.*:*) - echo sparc-unknown-lynxos${UNAME_RELEASE} - exit ;; + GUESS=sparc-unknown-lynxos$UNAME_RELEASE + ;; rs6000:LynxOS:2.*:*) - echo rs6000-unknown-lynxos${UNAME_RELEASE} - exit ;; + GUESS=rs6000-unknown-lynxos$UNAME_RELEASE + ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) - echo powerpc-unknown-lynxos${UNAME_RELEASE} - exit ;; + GUESS=powerpc-unknown-lynxos$UNAME_RELEASE + ;; SM[BE]S:UNIX_SV:*:*) - echo mips-dde-sysv${UNAME_RELEASE} - exit ;; + GUESS=mips-dde-sysv$UNAME_RELEASE + ;; RM*:ReliantUNIX-*:*:*) - echo mips-sni-sysv4 - exit ;; + GUESS=mips-sni-sysv4 + ;; RM*:SINIX-*:*:*) - echo mips-sni-sysv4 - exit ;; + GUESS=mips-sni-sysv4 + ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` - echo ${UNAME_MACHINE}-sni-sysv4 + GUESS=$UNAME_MACHINE-sni-sysv4 else - echo ns32k-sni-sysv + GUESS=ns32k-sni-sysv fi - exit ;; + ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says - echo i586-unisys-sysv4 - exit ;; + GUESS=i586-unisys-sysv4 + ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm - echo hppa1.1-stratus-sysv4 - exit ;; + GUESS=hppa1.1-stratus-sysv4 + ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. - echo i860-stratus-sysv4 - exit ;; + GUESS=i860-stratus-sysv4 + ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. - echo ${UNAME_MACHINE}-stratus-vos - exit ;; + GUESS=$UNAME_MACHINE-stratus-vos + ;; *:VOS:*:*) # From Paul.Green@stratus.com. - echo hppa1.1-stratus-vos - exit ;; + GUESS=hppa1.1-stratus-vos + ;; mc68*:A/UX:*:*) - echo m68k-apple-aux${UNAME_RELEASE} - exit ;; + GUESS=m68k-apple-aux$UNAME_RELEASE + ;; news*:NEWS-OS:6*:*) - echo mips-sony-newsos6 - exit ;; + GUESS=mips-sony-newsos6 + ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) - if [ -d /usr/nec ]; then - echo mips-nec-sysv${UNAME_RELEASE} + if test -d /usr/nec; then + GUESS=mips-nec-sysv$UNAME_RELEASE else - echo mips-unknown-sysv${UNAME_RELEASE} + GUESS=mips-unknown-sysv$UNAME_RELEASE fi - exit ;; + ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. - echo powerpc-be-beos - exit ;; + GUESS=powerpc-be-beos + ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. - echo powerpc-apple-beos - exit ;; + GUESS=powerpc-apple-beos + ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. - echo i586-pc-beos - exit ;; + GUESS=i586-pc-beos + ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. - echo i586-pc-haiku - exit ;; + GUESS=i586-pc-haiku + ;; x86_64:Haiku:*:*) - echo x86_64-unknown-haiku - exit ;; + GUESS=x86_64-unknown-haiku + ;; SX-4:SUPER-UX:*:*) - echo sx4-nec-superux${UNAME_RELEASE} - exit ;; + GUESS=sx4-nec-superux$UNAME_RELEASE + ;; SX-5:SUPER-UX:*:*) - echo sx5-nec-superux${UNAME_RELEASE} - exit ;; + GUESS=sx5-nec-superux$UNAME_RELEASE + ;; SX-6:SUPER-UX:*:*) - echo sx6-nec-superux${UNAME_RELEASE} - exit ;; + GUESS=sx6-nec-superux$UNAME_RELEASE + ;; SX-7:SUPER-UX:*:*) - echo sx7-nec-superux${UNAME_RELEASE} - exit ;; + GUESS=sx7-nec-superux$UNAME_RELEASE + ;; SX-8:SUPER-UX:*:*) - echo sx8-nec-superux${UNAME_RELEASE} - exit ;; + GUESS=sx8-nec-superux$UNAME_RELEASE + ;; SX-8R:SUPER-UX:*:*) - echo sx8r-nec-superux${UNAME_RELEASE} - exit ;; + GUESS=sx8r-nec-superux$UNAME_RELEASE + ;; + SX-ACE:SUPER-UX:*:*) + GUESS=sxace-nec-superux$UNAME_RELEASE + ;; Power*:Rhapsody:*:*) - echo powerpc-apple-rhapsody${UNAME_RELEASE} - exit ;; + GUESS=powerpc-apple-rhapsody$UNAME_RELEASE + ;; *:Rhapsody:*:*) - echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE + ;; + arm64:Darwin:*:*) + GUESS=aarch64-apple-darwin$UNAME_RELEASE + ;; *:Darwin:*:*) - UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown - eval $set_cc_for_build - if test "$UNAME_PROCESSOR" = unknown ; then - UNAME_PROCESSOR=powerpc + UNAME_PROCESSOR=`uname -p` + case $UNAME_PROCESSOR in + unknown) UNAME_PROCESSOR=powerpc ;; + esac + if command -v xcode-select > /dev/null 2> /dev/null && \ + ! xcode-select --print-path > /dev/null 2> /dev/null ; then + # Avoid executing cc if there is no toolchain installed as + # cc will be a stub that puts up a graphical alert + # prompting the user to install developer tools. + CC_FOR_BUILD=no_compiler_found + else + set_cc_for_build fi - if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then - if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - case $UNAME_PROCESSOR in - i386) UNAME_PROCESSOR=x86_64 ;; - powerpc) UNAME_PROCESSOR=powerpc64 ;; - esac - fi + if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc fi elif test "$UNAME_PROCESSOR" = i386 ; then - # Avoid executing cc on OS X 10.9, as it ships with a stub - # that puts up a graphical alert prompting to install - # developer tools. Any system running Mac OS X 10.7 or - # later (Darwin 11 and later) is required to have a 64-bit - # processor. This is not true of the ARM version of Darwin - # that Apple uses in portable devices. - UNAME_PROCESSOR=x86_64 + # uname -m returns i386 or x86_64 + UNAME_PROCESSOR=$UNAME_MACHINE fi - echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE + ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` - if test "$UNAME_PROCESSOR" = "x86"; then + if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi - echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE + ;; *:QNX:*:4*) - echo i386-pc-qnx - exit ;; - NEO-?:NONSTOP_KERNEL:*:*) - echo neo-tandem-nsk${UNAME_RELEASE} - exit ;; + GUESS=i386-pc-qnx + ;; + NEO-*:NONSTOP_KERNEL:*:*) + GUESS=neo-tandem-nsk$UNAME_RELEASE + ;; NSE-*:NONSTOP_KERNEL:*:*) - echo nse-tandem-nsk${UNAME_RELEASE} - exit ;; - NSR-?:NONSTOP_KERNEL:*:*) - echo nsr-tandem-nsk${UNAME_RELEASE} - exit ;; + GUESS=nse-tandem-nsk$UNAME_RELEASE + ;; + NSR-*:NONSTOP_KERNEL:*:*) + GUESS=nsr-tandem-nsk$UNAME_RELEASE + ;; + NSV-*:NONSTOP_KERNEL:*:*) + GUESS=nsv-tandem-nsk$UNAME_RELEASE + ;; + NSX-*:NONSTOP_KERNEL:*:*) + GUESS=nsx-tandem-nsk$UNAME_RELEASE + ;; *:NonStop-UX:*:*) - echo mips-compaq-nonstopux - exit ;; + GUESS=mips-compaq-nonstopux + ;; BS2000:POSIX*:*:*) - echo bs2000-siemens-sysv - exit ;; + GUESS=bs2000-siemens-sysv + ;; DS/*:UNIX_System_V:*:*) - echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE + ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. - if test "$cputype" = "386"; then + if test "${cputype-}" = 386; then UNAME_MACHINE=i386 - else - UNAME_MACHINE="$cputype" + elif test "x${cputype-}" != x; then + UNAME_MACHINE=$cputype fi - echo ${UNAME_MACHINE}-unknown-plan9 - exit ;; + GUESS=$UNAME_MACHINE-unknown-plan9 + ;; *:TOPS-10:*:*) - echo pdp10-unknown-tops10 - exit ;; + GUESS=pdp10-unknown-tops10 + ;; *:TENEX:*:*) - echo pdp10-unknown-tenex - exit ;; + GUESS=pdp10-unknown-tenex + ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) - echo pdp10-dec-tops20 - exit ;; + GUESS=pdp10-dec-tops20 + ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) - echo pdp10-xkl-tops20 - exit ;; + GUESS=pdp10-xkl-tops20 + ;; *:TOPS-20:*:*) - echo pdp10-unknown-tops20 - exit ;; + GUESS=pdp10-unknown-tops20 + ;; *:ITS:*:*) - echo pdp10-unknown-its - exit ;; + GUESS=pdp10-unknown-its + ;; SEI:*:*:SEIUX) - echo mips-sei-seiux${UNAME_RELEASE} - exit ;; + GUESS=mips-sei-seiux$UNAME_RELEASE + ;; *:DragonFly:*:*) - echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` - exit ;; + DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL + ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` - case "${UNAME_MACHINE}" in - A*) echo alpha-dec-vms ; exit ;; - I*) echo ia64-dec-vms ; exit ;; - V*) echo vax-dec-vms ; exit ;; + case $UNAME_MACHINE in + A*) GUESS=alpha-dec-vms ;; + I*) GUESS=ia64-dec-vms ;; + V*) GUESS=vax-dec-vms ;; esac ;; *:XENIX:*:SysV) - echo i386-pc-xenix - exit ;; + GUESS=i386-pc-xenix + ;; i*86:skyos:*:*) - echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' - exit ;; + SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'` + GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL + ;; i*86:rdos:*:*) - echo ${UNAME_MACHINE}-pc-rdos - exit ;; - i*86:AROS:*:*) - echo ${UNAME_MACHINE}-pc-aros - exit ;; + GUESS=$UNAME_MACHINE-pc-rdos + ;; + *:AROS:*:*) + GUESS=$UNAME_MACHINE-unknown-aros + ;; x86_64:VMkernel:*:*) - echo ${UNAME_MACHINE}-unknown-esx - exit ;; + GUESS=$UNAME_MACHINE-unknown-esx + ;; + amd64:Isilon\ OneFS:*:*) + GUESS=x86_64-unknown-onefs + ;; + *:Unleashed:*:*) + GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE + ;; +esac + +# Do we have a guess based on uname results? +if test "x$GUESS" != x; then + echo "$GUESS" + exit +fi + +# No uname command or uname output not recognized. +set_cc_for_build +cat > "$dummy.c" < +#include +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#include +#if defined(_SIZE_T_) || defined(SIGLOST) +#include +#endif +#endif +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); +#endif + +#if defined (vax) +#if !defined (ultrix) +#include +#if defined (BSD) +#if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +#else +#if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#endif +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#else +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname un; + uname (&un); + printf ("vax-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("vax-dec-ultrix\n"); exit (0); +#endif +#endif +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname *un; + uname (&un); + printf ("mips-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("mips-dec-ultrix\n"); exit (0); +#endif +#endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`"$dummy"` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. +test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } + +echo "$0: unable to guess system type" >&2 + +case $UNAME_MACHINE:$UNAME_SYSTEM in + mips:Linux | mips64:Linux) + # If we got here on MIPS GNU/Linux, output extra information. + cat >&2 <&2 < in order to provide the needed -information to handle your system. +our_year=`echo $timestamp | sed 's,-.*,,'` +thisyear=`date +%Y` +# shellcheck disable=SC2003 +script_age=`expr "$thisyear" - "$our_year"` +if test "$script_age" -lt 3 ; then + cat >&2 </dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` -UNAME_MACHINE = ${UNAME_MACHINE} -UNAME_RELEASE = ${UNAME_RELEASE} -UNAME_SYSTEM = ${UNAME_SYSTEM} -UNAME_VERSION = ${UNAME_VERSION} +UNAME_MACHINE = "$UNAME_MACHINE" +UNAME_RELEASE = "$UNAME_RELEASE" +UNAME_SYSTEM = "$UNAME_SYSTEM" +UNAME_VERSION = "$UNAME_VERSION" EOF +fi exit 1 # Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) +# eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" diff --git a/autoconf/config.sub b/autoconf/config.sub index 8f1229c..d74fb6d 100644 --- a/autoconf/config.sub +++ b/autoconf/config.sub @@ -1,8 +1,10 @@ #! /bin/sh # Configuration validation subroutine script. -# Copyright 1992-2015 Free Software Foundation, Inc. +# Copyright 1992-2021 Free Software Foundation, Inc. -timestamp='2015-03-08' +# shellcheck disable=SC2006,SC2268 # see below for rationale + +timestamp='2021-08-14' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -15,7 +17,7 @@ timestamp='2015-03-08' # General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, see . +# along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a @@ -33,7 +35,7 @@ timestamp='2015-03-08' # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD +# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases @@ -50,15 +52,21 @@ timestamp='2015-03-08' # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. +# The "shellcheck disable" line above the timestamp inhibits complaints +# about features and limitations of the classic Bourne shell that were +# superseded or lifted in POSIX. However, this script identifies a wide +# variety of pre-POSIX systems that do not have POSIX shells at all, and +# even some reasonably current systems (Solaris 10 as case-in-point) still +# have a pre-POSIX /bin/sh. + me=`echo "$0" | sed -e 's,.*/,,'` usage="\ -Usage: $0 [OPTION] CPU-MFR-OPSYS - $0 [OPTION] ALIAS +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. -Operation modes: +Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit @@ -68,7 +76,7 @@ Report bugs and patches to ." version="\ GNU config.sub ($timestamp) -Copyright 1992-2015 Free Software Foundation, Inc. +Copyright 1992-2021 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -90,12 +98,12 @@ while test $# -gt 0 ; do - ) # Use stdin as input. break ;; -* ) - echo "$me: invalid option $1$help" + echo "$me: invalid option $1$help" >&2 exit 1 ;; *local*) # First pass through any local machine types. - echo $1 + echo "$1" exit ;; * ) @@ -111,1231 +119,1181 @@ case $# in exit 1;; esac -# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). -# Here we must recognize all the valid KERNEL-OS combinations. -maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` -case $maybe_os in - nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ - linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ - knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ - kopensolaris*-gnu* | \ - storm-chaos* | os2-emx* | rtmk-nova*) - os=-$maybe_os - basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` - ;; - android-linux) - os=-linux-android - basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown - ;; - *) - basic_machine=`echo $1 | sed 's/-[^-]*$//'` - if [ $basic_machine != $1 ] - then os=`echo $1 | sed 's/.*-/-/'` - else os=; fi - ;; -esac +# Split fields of configuration type +# shellcheck disable=SC2162 +saved_IFS=$IFS +IFS="-" read field1 field2 field3 field4 <&2 + exit 1 ;; - -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ - -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ - -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ - -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ - -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ - -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ - -apple | -axis | -knuth | -cray | -microblaze*) - os= - basic_machine=$1 + *-*-*-*) + basic_machine=$field1-$field2 + basic_os=$field3-$field4 ;; - -bluegene*) - os=-cnk + *-*-*) + # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two + # parts + maybe_os=$field2-$field3 + case $maybe_os in + nto-qnx* | linux-* | uclinux-uclibc* \ + | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ + | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ + | storm-chaos* | os2-emx* | rtmk-nova*) + basic_machine=$field1 + basic_os=$maybe_os + ;; + android-linux) + basic_machine=$field1-unknown + basic_os=linux-android + ;; + *) + basic_machine=$field1-$field2 + basic_os=$field3 + ;; + esac ;; - -sim | -cisco | -oki | -wec | -winbond) - os= - basic_machine=$1 + *-*) + # A lone config we happen to match not fitting any pattern + case $field1-$field2 in + decstation-3100) + basic_machine=mips-dec + basic_os= + ;; + *-*) + # Second component is usually, but not always the OS + case $field2 in + # Prevent following clause from handling this valid os + sun*os*) + basic_machine=$field1 + basic_os=$field2 + ;; + zephyr*) + basic_machine=$field1-unknown + basic_os=$field2 + ;; + # Manufacturers + dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ + | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ + | unicom* | ibm* | next | hp | isi* | apollo | altos* \ + | convergent* | ncr* | news | 32* | 3600* | 3100* \ + | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ + | ultra | tti* | harris | dolphin | highlevel | gould \ + | cbm | ns | masscomp | apple | axis | knuth | cray \ + | microblaze* | sim | cisco \ + | oki | wec | wrs | winbond) + basic_machine=$field1-$field2 + basic_os= + ;; + *) + basic_machine=$field1 + basic_os=$field2 + ;; + esac + ;; + esac ;; - -scout) - ;; - -wrs) - os=-vxworks - basic_machine=$1 - ;; - -chorusos*) - os=-chorusos - basic_machine=$1 - ;; - -chorusrdb) - os=-chorusrdb - basic_machine=$1 - ;; - -hiux*) - os=-hiuxwe2 - ;; - -sco6) - os=-sco5v6 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco5) - os=-sco3.2v5 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco4) - os=-sco3.2v4 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2.[4-9]*) - os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2v[4-9]*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco5v6*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco*) - os=-sco3.2v2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -udk*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -isc) - os=-isc2.2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -clix*) - basic_machine=clipper-intergraph - ;; - -isc*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -lynx*178) - os=-lynxos178 - ;; - -lynx*5) - os=-lynxos5 - ;; - -lynx*) - os=-lynxos - ;; - -ptx*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` - ;; - -windowsnt*) - os=`echo $os | sed -e 's/windowsnt/winnt/'` - ;; - -psos*) - os=-psos - ;; - -mint | -mint[0-9]*) - basic_machine=m68k-atari - os=-mint + *) + # Convert single-component short-hands not valid as part of + # multi-component configurations. + case $field1 in + 386bsd) + basic_machine=i386-pc + basic_os=bsd + ;; + a29khif) + basic_machine=a29k-amd + basic_os=udi + ;; + adobe68k) + basic_machine=m68010-adobe + basic_os=scout + ;; + alliant) + basic_machine=fx80-alliant + basic_os= + ;; + altos | altos3068) + basic_machine=m68k-altos + basic_os= + ;; + am29k) + basic_machine=a29k-none + basic_os=bsd + ;; + amdahl) + basic_machine=580-amdahl + basic_os=sysv + ;; + amiga) + basic_machine=m68k-unknown + basic_os= + ;; + amigaos | amigados) + basic_machine=m68k-unknown + basic_os=amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + basic_os=sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + basic_os=sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + basic_os=bsd + ;; + aros) + basic_machine=i386-pc + basic_os=aros + ;; + aux) + basic_machine=m68k-apple + basic_os=aux + ;; + balance) + basic_machine=ns32k-sequent + basic_os=dynix + ;; + blackfin) + basic_machine=bfin-unknown + basic_os=linux + ;; + cegcc) + basic_machine=arm-unknown + basic_os=cegcc + ;; + convex-c1) + basic_machine=c1-convex + basic_os=bsd + ;; + convex-c2) + basic_machine=c2-convex + basic_os=bsd + ;; + convex-c32) + basic_machine=c32-convex + basic_os=bsd + ;; + convex-c34) + basic_machine=c34-convex + basic_os=bsd + ;; + convex-c38) + basic_machine=c38-convex + basic_os=bsd + ;; + cray) + basic_machine=j90-cray + basic_os=unicos + ;; + crds | unos) + basic_machine=m68k-crds + basic_os= + ;; + da30) + basic_machine=m68k-da30 + basic_os= + ;; + decstation | pmax | pmin | dec3100 | decstatn) + basic_machine=mips-dec + basic_os= + ;; + delta88) + basic_machine=m88k-motorola + basic_os=sysv3 + ;; + dicos) + basic_machine=i686-pc + basic_os=dicos + ;; + djgpp) + basic_machine=i586-pc + basic_os=msdosdjgpp + ;; + ebmon29k) + basic_machine=a29k-amd + basic_os=ebmon + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + basic_os=ose + ;; + gmicro) + basic_machine=tron-gmicro + basic_os=sysv + ;; + go32) + basic_machine=i386-pc + basic_os=go32 + ;; + h8300hms) + basic_machine=h8300-hitachi + basic_os=hms + ;; + h8300xray) + basic_machine=h8300-hitachi + basic_os=xray + ;; + h8500hms) + basic_machine=h8500-hitachi + basic_os=hms + ;; + harris) + basic_machine=m88k-harris + basic_os=sysv3 + ;; + hp300 | hp300hpux) + basic_machine=m68k-hp + basic_os=hpux + ;; + hp300bsd) + basic_machine=m68k-hp + basic_os=bsd + ;; + hppaosf) + basic_machine=hppa1.1-hp + basic_os=osf + ;; + hppro) + basic_machine=hppa1.1-hp + basic_os=proelf + ;; + i386mach) + basic_machine=i386-mach + basic_os=mach + ;; + isi68 | isi) + basic_machine=m68k-isi + basic_os=sysv + ;; + m68knommu) + basic_machine=m68k-unknown + basic_os=linux + ;; + magnum | m3230) + basic_machine=mips-mips + basic_os=sysv + ;; + merlin) + basic_machine=ns32k-utek + basic_os=sysv + ;; + mingw64) + basic_machine=x86_64-pc + basic_os=mingw64 + ;; + mingw32) + basic_machine=i686-pc + basic_os=mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + basic_os=mingw32ce + ;; + monitor) + basic_machine=m68k-rom68k + basic_os=coff + ;; + morphos) + basic_machine=powerpc-unknown + basic_os=morphos + ;; + moxiebox) + basic_machine=moxie-unknown + basic_os=moxiebox + ;; + msdos) + basic_machine=i386-pc + basic_os=msdos + ;; + msys) + basic_machine=i686-pc + basic_os=msys + ;; + mvs) + basic_machine=i370-ibm + basic_os=mvs + ;; + nacl) + basic_machine=le32-unknown + basic_os=nacl + ;; + ncr3000) + basic_machine=i486-ncr + basic_os=sysv4 + ;; + netbsd386) + basic_machine=i386-pc + basic_os=netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + basic_os=linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + basic_os=newsos + ;; + news1000) + basic_machine=m68030-sony + basic_os=newsos + ;; + necv70) + basic_machine=v70-nec + basic_os=sysv + ;; + nh3000) + basic_machine=m68k-harris + basic_os=cxux + ;; + nh[45]000) + basic_machine=m88k-harris + basic_os=cxux + ;; + nindy960) + basic_machine=i960-intel + basic_os=nindy + ;; + mon960) + basic_machine=i960-intel + basic_os=mon960 + ;; + nonstopux) + basic_machine=mips-compaq + basic_os=nonstopux + ;; + os400) + basic_machine=powerpc-ibm + basic_os=os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + basic_os=ose + ;; + os68k) + basic_machine=m68k-none + basic_os=os68k + ;; + paragon) + basic_machine=i860-intel + basic_os=osf + ;; + parisc) + basic_machine=hppa-unknown + basic_os=linux + ;; + psp) + basic_machine=mipsallegrexel-sony + basic_os=psp + ;; + pw32) + basic_machine=i586-unknown + basic_os=pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + basic_os=rdos + ;; + rdos32) + basic_machine=i386-pc + basic_os=rdos + ;; + rom68k) + basic_machine=m68k-rom68k + basic_os=coff + ;; + sa29200) + basic_machine=a29k-amd + basic_os=udi + ;; + sei) + basic_machine=mips-sei + basic_os=seiux + ;; + sequent) + basic_machine=i386-sequent + basic_os= + ;; + sps7) + basic_machine=m68k-bull + basic_os=sysv2 + ;; + st2000) + basic_machine=m68k-tandem + basic_os= + ;; + stratus) + basic_machine=i860-stratus + basic_os=sysv4 + ;; + sun2) + basic_machine=m68000-sun + basic_os= + ;; + sun2os3) + basic_machine=m68000-sun + basic_os=sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + basic_os=sunos4 + ;; + sun3) + basic_machine=m68k-sun + basic_os= + ;; + sun3os3) + basic_machine=m68k-sun + basic_os=sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + basic_os=sunos4 + ;; + sun4) + basic_machine=sparc-sun + basic_os= + ;; + sun4os3) + basic_machine=sparc-sun + basic_os=sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + basic_os=sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + basic_os=solaris2 + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + basic_os= + ;; + sv1) + basic_machine=sv1-cray + basic_os=unicos + ;; + symmetry) + basic_machine=i386-sequent + basic_os=dynix + ;; + t3e) + basic_machine=alphaev5-cray + basic_os=unicos + ;; + t90) + basic_machine=t90-cray + basic_os=unicos + ;; + toad1) + basic_machine=pdp10-xkl + basic_os=tops20 + ;; + tpf) + basic_machine=s390x-ibm + basic_os=tpf + ;; + udi29k) + basic_machine=a29k-amd + basic_os=udi + ;; + ultra3) + basic_machine=a29k-nyu + basic_os=sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + basic_os=none + ;; + vaxv) + basic_machine=vax-dec + basic_os=sysv + ;; + vms) + basic_machine=vax-dec + basic_os=vms + ;; + vsta) + basic_machine=i386-pc + basic_os=vsta + ;; + vxworks960) + basic_machine=i960-wrs + basic_os=vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + basic_os=vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + basic_os=vxworks + ;; + xbox) + basic_machine=i686-pc + basic_os=mingw32 + ;; + ymp) + basic_machine=ymp-cray + basic_os=unicos + ;; + *) + basic_machine=$1 + basic_os= + ;; + esac ;; esac -# Decode aliases for certain CPU-COMPANY combinations. +# Decode 1-component or ad-hoc basic machines case $basic_machine in - # Recognize the basic CPU types without company name. - # Some are omitted here because they have special meanings below. - 1750a | 580 \ - | a29k \ - | aarch64 | aarch64_be \ - | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ - | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ - | am33_2.0 \ - | arc | arceb \ - | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ - | avr | avr32 \ - | be32 | be64 \ - | bfin \ - | c4x | c8051 | clipper \ - | d10v | d30v | dlx | dsp16xx \ - | e2k | epiphany \ - | fido | fr30 | frv | ft32 \ - | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ - | hexagon \ - | i370 | i860 | i960 | ia64 \ - | ip2k | iq2000 \ - | k1om \ - | le32 | le64 \ - | lm32 \ - | m32c | m32r | m32rle | m68000 | m68k | m88k \ - | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ - | mips | mipsbe | mipseb | mipsel | mipsle \ - | mips16 \ - | mips64 | mips64el \ - | mips64octeon | mips64octeonel \ - | mips64orion | mips64orionel \ - | mips64r5900 | mips64r5900el \ - | mips64vr | mips64vrel \ - | mips64vr4100 | mips64vr4100el \ - | mips64vr4300 | mips64vr4300el \ - | mips64vr5000 | mips64vr5000el \ - | mips64vr5900 | mips64vr5900el \ - | mipsisa32 | mipsisa32el \ - | mipsisa32r2 | mipsisa32r2el \ - | mipsisa32r6 | mipsisa32r6el \ - | mipsisa64 | mipsisa64el \ - | mipsisa64r2 | mipsisa64r2el \ - | mipsisa64r6 | mipsisa64r6el \ - | mipsisa64sb1 | mipsisa64sb1el \ - | mipsisa64sr71k | mipsisa64sr71kel \ - | mipsr5900 | mipsr5900el \ - | mipstx39 | mipstx39el \ - | mn10200 | mn10300 \ - | moxie \ - | mt \ - | msp430 \ - | nds32 | nds32le | nds32be \ - | nios | nios2 | nios2eb | nios2el \ - | ns16k | ns32k \ - | open8 | or1k | or1knd | or32 \ - | pdp10 | pdp11 | pj | pjl \ - | powerpc | powerpc64 | powerpc64le | powerpcle \ - | pyramid \ - | riscv32 | riscv64 \ - | rl78 | rx \ - | score \ - | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ - | sh64 | sh64le \ - | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ - | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ - | spu \ - | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ - | ubicom32 \ - | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ - | visium \ - | we32k \ - | x86 | xc16x | xstormy16 | xtensa \ - | z8k | z80) - basic_machine=$basic_machine-unknown + # Here we handle the default manufacturer of certain CPU types. It is in + # some cases the only manufacturer, in others, it is the most popular. + w89k) + cpu=hppa1.1 + vendor=winbond ;; - c54x) - basic_machine=tic54x-unknown + op50n) + cpu=hppa1.1 + vendor=oki ;; - c55x) - basic_machine=tic55x-unknown + op60c) + cpu=hppa1.1 + vendor=oki ;; - c6x) - basic_machine=tic6x-unknown + ibm*) + cpu=i370 + vendor=ibm + ;; + orion105) + cpu=clipper + vendor=highlevel + ;; + mac | mpw | mac-mpw) + cpu=m68k + vendor=apple + ;; + pmac | pmac-mpw) + cpu=powerpc + vendor=apple + ;; + + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + cpu=m68000 + vendor=att + ;; + 3b*) + cpu=we32k + vendor=att + ;; + bluegene*) + cpu=powerpc + vendor=ibm + basic_os=cnk + ;; + decsystem10* | dec10*) + cpu=pdp10 + vendor=dec + basic_os=tops10 + ;; + decsystem20* | dec20*) + cpu=pdp10 + vendor=dec + basic_os=tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + cpu=m68k + vendor=motorola + ;; + dpx2*) + cpu=m68k + vendor=bull + basic_os=sysv3 + ;; + encore | umax | mmax) + cpu=ns32k + vendor=encore + ;; + elxsi) + cpu=elxsi + vendor=elxsi + basic_os=${basic_os:-bsd} + ;; + fx2800) + cpu=i860 + vendor=alliant + ;; + genix) + cpu=ns32k + vendor=ns + ;; + h3050r* | hiux*) + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + cpu=m68000 + vendor=hp + ;; + hp9k3[2-9][0-9]) + cpu=m68k + vendor=hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + i*86v32) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv32 + ;; + i*86v4*) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv4 + ;; + i*86v) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv + ;; + i*86sol2) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=solaris2 + ;; + j90 | j90-cray) + cpu=j90 + vendor=cray + basic_os=${basic_os:-unicos} + ;; + iris | iris4d) + cpu=mips + vendor=sgi + case $basic_os in + irix*) + ;; + *) + basic_os=irix4 + ;; + esac + ;; + miniframe) + cpu=m68000 + vendor=convergent + ;; + *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) + cpu=m68k + vendor=atari + basic_os=mint + ;; + news-3600 | risc-news) + cpu=mips + vendor=sony + basic_os=newsos + ;; + next | m*-next) + cpu=m68k + vendor=next + case $basic_os in + openstep*) + ;; + nextstep*) + ;; + ns2*) + basic_os=nextstep2 + ;; + *) + basic_os=nextstep3 + ;; + esac + ;; + np1) + cpu=np1 + vendor=gould + ;; + op50n-* | op60c-*) + cpu=hppa1.1 + vendor=oki + basic_os=proelf + ;; + pa-hitachi) + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 + ;; + pbd) + cpu=sparc + vendor=tti + ;; + pbb) + cpu=m68k + vendor=tti + ;; + pc532) + cpu=ns32k + vendor=pc532 + ;; + pn) + cpu=pn + vendor=gould + ;; + power) + cpu=power + vendor=ibm + ;; + ps2) + cpu=i386 + vendor=ibm + ;; + rm[46]00) + cpu=mips + vendor=siemens + ;; + rtpc | rtpc-*) + cpu=romp + vendor=ibm + ;; + sde) + cpu=mipsisa32 + vendor=sde + basic_os=${basic_os:-elf} + ;; + simso-wrs) + cpu=sparclite + vendor=wrs + basic_os=vxworks + ;; + tower | tower-32) + cpu=m68k + vendor=ncr + ;; + vpp*|vx|vx-*) + cpu=f301 + vendor=fujitsu + ;; + w65) + cpu=w65 + vendor=wdc + ;; + w89k-*) + cpu=hppa1.1 + vendor=winbond + basic_os=proelf + ;; + none) + cpu=none + vendor=none ;; leon|leon[3-9]) - basic_machine=sparc-$basic_machine + cpu=sparc + vendor=$basic_machine ;; - m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) - basic_machine=$basic_machine-unknown - os=-none - ;; - m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) - ;; - ms1) - basic_machine=mt-unknown + leon-*|leon[3-9]-*) + cpu=sparc + vendor=`echo "$basic_machine" | sed 's/-.*//'` ;; - strongarm | thumb | xscale) - basic_machine=arm-unknown + *-*) + # shellcheck disable=SC2162 + saved_IFS=$IFS + IFS="-" read cpu vendor <&2 - exit 1 - ;; - # Recognize the basic CPU types with company name. - 580-* \ - | a29k-* \ - | aarch64-* | aarch64_be-* \ - | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ - | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ - | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ - | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ - | avr-* | avr32-* \ - | be32-* | be64-* \ - | bfin-* | bs2000-* \ - | c[123]* | c30-* | [cjt]90-* | c4x-* \ - | c8051-* | clipper-* | craynv-* | cydra-* \ - | d10v-* | d30v-* | dlx-* \ - | e2k-* | elxsi-* \ - | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ - | h8300-* | h8500-* \ - | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ - | hexagon-* \ - | i*86-* | i860-* | i960-* | ia64-* \ - | ip2k-* | iq2000-* \ - | k1om-* \ - | le32-* | le64-* \ - | lm32-* \ - | m32c-* | m32r-* | m32rle-* \ - | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ - | microblaze-* | microblazeel-* \ - | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ - | mips16-* \ - | mips64-* | mips64el-* \ - | mips64octeon-* | mips64octeonel-* \ - | mips64orion-* | mips64orionel-* \ - | mips64r5900-* | mips64r5900el-* \ - | mips64vr-* | mips64vrel-* \ - | mips64vr4100-* | mips64vr4100el-* \ - | mips64vr4300-* | mips64vr4300el-* \ - | mips64vr5000-* | mips64vr5000el-* \ - | mips64vr5900-* | mips64vr5900el-* \ - | mipsisa32-* | mipsisa32el-* \ - | mipsisa32r2-* | mipsisa32r2el-* \ - | mipsisa32r6-* | mipsisa32r6el-* \ - | mipsisa64-* | mipsisa64el-* \ - | mipsisa64r2-* | mipsisa64r2el-* \ - | mipsisa64r6-* | mipsisa64r6el-* \ - | mipsisa64sb1-* | mipsisa64sb1el-* \ - | mipsisa64sr71k-* | mipsisa64sr71kel-* \ - | mipsr5900-* | mipsr5900el-* \ - | mipstx39-* | mipstx39el-* \ - | mmix-* \ - | mt-* \ - | msp430-* \ - | nds32-* | nds32le-* | nds32be-* \ - | nios-* | nios2-* | nios2eb-* | nios2el-* \ - | none-* | np1-* | ns16k-* | ns32k-* \ - | open8-* \ - | or1k*-* \ - | orion-* \ - | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ - | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ - | pyramid-* \ - | rl78-* | romp-* | rs6000-* | rx-* \ - | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ - | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ - | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ - | sparclite-* \ - | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ - | tahoe-* \ - | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ - | tile*-* \ - | tron-* \ - | ubicom32-* \ - | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ - | vax-* \ - | visium-* \ - | we32k-* \ - | x86-* | x86_64-* | xc16x-* | xps100-* \ - | xstormy16-* | xtensa*-* \ - | ymp-* \ - | z8k-* | z80-*) - ;; - # Recognize the basic CPU types without company name, with glob match. - xtensa*) - basic_machine=$basic_machine-unknown - ;; - # Recognize the various machine names and aliases which stand - # for a CPU type and a company and sometimes even an OS. - 386bsd) - basic_machine=i386-unknown - os=-bsd - ;; - 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) - basic_machine=m68000-att - ;; - 3b*) - basic_machine=we32k-att - ;; - a29khif) - basic_machine=a29k-amd - os=-udi - ;; - abacus) - basic_machine=abacus-unknown - ;; - adobe68k) - basic_machine=m68010-adobe - os=-scout - ;; - alliant | fx80) - basic_machine=fx80-alliant - ;; - altos | altos3068) - basic_machine=m68k-altos - ;; - am29k) - basic_machine=a29k-none - os=-bsd - ;; - amd64) - basic_machine=x86_64-pc - ;; - amd64-*) - basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - amdahl) - basic_machine=580-amdahl - os=-sysv - ;; - amiga | amiga-*) - basic_machine=m68k-unknown - ;; - amigaos | amigados) - basic_machine=m68k-unknown - os=-amigaos - ;; - amigaunix | amix) - basic_machine=m68k-unknown - os=-sysv4 - ;; - apollo68) - basic_machine=m68k-apollo - os=-sysv - ;; - apollo68bsd) - basic_machine=m68k-apollo - os=-bsd - ;; - aros) - basic_machine=i386-pc - os=-aros - ;; - asmjs) - basic_machine=asmjs-unknown - ;; - aux) - basic_machine=m68k-apple - os=-aux - ;; - balance) - basic_machine=ns32k-sequent - os=-dynix - ;; - blackfin) - basic_machine=bfin-unknown - os=-linux - ;; - blackfin-*) - basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - bluegene*) - basic_machine=powerpc-ibm - os=-cnk - ;; - c54x-*) - basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c55x-*) - basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c6x-*) - basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c90) - basic_machine=c90-cray - os=-unicos - ;; - cegcc) - basic_machine=arm-unknown - os=-cegcc - ;; - convex-c1) - basic_machine=c1-convex - os=-bsd - ;; - convex-c2) - basic_machine=c2-convex - os=-bsd - ;; - convex-c32) - basic_machine=c32-convex - os=-bsd - ;; - convex-c34) - basic_machine=c34-convex - os=-bsd - ;; - convex-c38) - basic_machine=c38-convex - os=-bsd - ;; - cray | j90) - basic_machine=j90-cray - os=-unicos - ;; - craynv) - basic_machine=craynv-cray - os=-unicosmp - ;; - cr16 | cr16-*) - basic_machine=cr16-unknown - os=-elf - ;; - crds | unos) - basic_machine=m68k-crds - ;; - crisv32 | crisv32-* | etraxfs*) - basic_machine=crisv32-axis - ;; - cris | cris-* | etrax*) - basic_machine=cris-axis - ;; - crx) - basic_machine=crx-unknown - os=-elf - ;; - da30 | da30-*) - basic_machine=m68k-da30 - ;; - decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) - basic_machine=mips-dec - ;; - decsystem10* | dec10*) - basic_machine=pdp10-dec - os=-tops10 - ;; - decsystem20* | dec20*) - basic_machine=pdp10-dec - os=-tops20 - ;; - delta | 3300 | motorola-3300 | motorola-delta \ - | 3300-motorola | delta-motorola) - basic_machine=m68k-motorola - ;; - delta88) - basic_machine=m88k-motorola - os=-sysv3 - ;; - dicos) - basic_machine=i686-pc - os=-dicos - ;; - djgpp) - basic_machine=i586-pc - os=-msdosdjgpp - ;; - dpx20 | dpx20-*) - basic_machine=rs6000-bull - os=-bosx - ;; - dpx2* | dpx2*-bull) - basic_machine=m68k-bull - os=-sysv3 - ;; - ebmon29k) - basic_machine=a29k-amd - os=-ebmon - ;; - elxsi) - basic_machine=elxsi-elxsi - os=-bsd - ;; - encore | umax | mmax) - basic_machine=ns32k-encore - ;; - es1800 | OSE68k | ose68k | ose | OSE) - basic_machine=m68k-ericsson - os=-ose - ;; - fx2800) - basic_machine=i860-alliant - ;; - genix) - basic_machine=ns32k-ns - ;; - gmicro) - basic_machine=tron-gmicro - os=-sysv - ;; - go32) - basic_machine=i386-pc - os=-go32 - ;; - h3050r* | hiux*) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - h8300hms) - basic_machine=h8300-hitachi - os=-hms - ;; - h8300xray) - basic_machine=h8300-hitachi - os=-xray - ;; - h8500hms) - basic_machine=h8500-hitachi - os=-hms - ;; - harris) - basic_machine=m88k-harris - os=-sysv3 - ;; - hp300-*) - basic_machine=m68k-hp - ;; - hp300bsd) - basic_machine=m68k-hp - os=-bsd - ;; - hp300hpux) - basic_machine=m68k-hp - os=-hpux - ;; - hp3k9[0-9][0-9] | hp9[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k2[0-9][0-9] | hp9k31[0-9]) - basic_machine=m68000-hp - ;; - hp9k3[2-9][0-9]) - basic_machine=m68k-hp - ;; - hp9k6[0-9][0-9] | hp6[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k7[0-79][0-9] | hp7[0-79][0-9]) - basic_machine=hppa1.1-hp - ;; - hp9k78[0-9] | hp78[0-9]) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][13679] | hp8[0-9][13679]) - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][0-9] | hp8[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hppa-next) - os=-nextstep3 - ;; - hppaosf) - basic_machine=hppa1.1-hp - os=-osf - ;; - hppro) - basic_machine=hppa1.1-hp - os=-proelf - ;; - i370-ibm* | ibm*) - basic_machine=i370-ibm - ;; - i*86v32) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv32 - ;; - i*86v4*) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv4 - ;; - i*86v) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv - ;; - i*86sol2) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-solaris2 - ;; - i386mach) - basic_machine=i386-mach - os=-mach - ;; - i386-vsta | vsta) - basic_machine=i386-unknown - os=-vsta - ;; - iris | iris4d) - basic_machine=mips-sgi - case $os in - -irix*) - ;; - *) - os=-irix4 - ;; - esac - ;; - isi68 | isi) - basic_machine=m68k-isi - os=-sysv - ;; - leon-*|leon[3-9]-*) - basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'` - ;; - m68knommu) - basic_machine=m68k-unknown - os=-linux - ;; - m68knommu-*) - basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - m88k-omron*) - basic_machine=m88k-omron - ;; - magnum | m3230) - basic_machine=mips-mips - os=-sysv - ;; - merlin) - basic_machine=ns32k-utek - os=-sysv - ;; - microblaze*) - basic_machine=microblaze-xilinx - ;; - mingw64) - basic_machine=x86_64-pc - os=-mingw64 - ;; - mingw32) - basic_machine=i686-pc - os=-mingw32 - ;; - mingw32ce) - basic_machine=arm-unknown - os=-mingw32ce - ;; - miniframe) - basic_machine=m68000-convergent - ;; - *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; - mips3*-*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` - ;; - mips3*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown - ;; - monitor) - basic_machine=m68k-rom68k - os=-coff - ;; - morphos) - basic_machine=powerpc-unknown - os=-morphos - ;; - moxiebox) - basic_machine=moxie-unknown - os=-moxiebox - ;; - msdos) - basic_machine=i386-pc - os=-msdos - ;; - ms1-*) - basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` - ;; - msys) - basic_machine=i686-pc - os=-msys - ;; - mvs) - basic_machine=i370-ibm - os=-mvs - ;; - nacl) - basic_machine=le32-unknown - os=-nacl - ;; - ncr3000) - basic_machine=i486-ncr - os=-sysv4 - ;; - netbsd386) - basic_machine=i386-unknown - os=-netbsd - ;; - netwinder) - basic_machine=armv4l-rebel - os=-linux - ;; - news | news700 | news800 | news900) - basic_machine=m68k-sony - os=-newsos - ;; - news1000) - basic_machine=m68030-sony - os=-newsos - ;; - news-3600 | risc-news) - basic_machine=mips-sony - os=-newsos - ;; - necv70) - basic_machine=v70-nec - os=-sysv - ;; - next | m*-next ) - basic_machine=m68k-next - case $os in - -nextstep* ) - ;; - -ns2*) - os=-nextstep2 - ;; - *) - os=-nextstep3 - ;; - esac - ;; - nh3000) - basic_machine=m68k-harris - os=-cxux - ;; - nh[45]000) - basic_machine=m88k-harris - os=-cxux - ;; - nindy960) - basic_machine=i960-intel - os=-nindy - ;; - mon960) - basic_machine=i960-intel - os=-mon960 - ;; - nonstopux) - basic_machine=mips-compaq - os=-nonstopux - ;; - np1) - basic_machine=np1-gould - ;; - neo-tandem) - basic_machine=neo-tandem - ;; - nse-tandem) - basic_machine=nse-tandem - ;; - nsr-tandem) - basic_machine=nsr-tandem - ;; - op50n-* | op60c-*) - basic_machine=hppa1.1-oki - os=-proelf - ;; - openrisc | openrisc-*) - basic_machine=or32-unknown - ;; - os400) - basic_machine=powerpc-ibm - os=-os400 - ;; - OSE68000 | ose68000) - basic_machine=m68000-ericsson - os=-ose - ;; - os68k) - basic_machine=m68k-none - os=-os68k - ;; - pa-hitachi) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - paragon) - basic_machine=i860-intel - os=-osf - ;; - parisc) - basic_machine=hppa-unknown - os=-linux - ;; - parisc-*) - basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - pbd) - basic_machine=sparc-tti - ;; - pbb) - basic_machine=m68k-tti - ;; - pc532 | pc532-*) - basic_machine=ns32k-pc532 + cpu=$basic_machine + vendor=pc ;; + # These rules are duplicated from below for sake of the special case above; + # i.e. things that normalized to x86 arches should also default to "pc" pc98) - basic_machine=i386-pc + cpu=i386 + vendor=pc ;; - pc98-*) - basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + x64 | amd64) + cpu=x86_64 + vendor=pc ;; - pentium | p5 | k5 | k6 | nexgen | viac3) - basic_machine=i586-pc + # Recognize the basic CPU types without company name. + *) + cpu=$basic_machine + vendor=unknown ;; - pentiumpro | p6 | 6x86 | athlon | athlon_*) - basic_machine=i686-pc +esac + +unset -v basic_machine + +# Decode basic machines in the full and proper CPU-Company form. +case $cpu-$vendor in + # Here we handle the default manufacturer of certain CPU types in canonical form. It is in + # some cases the only manufacturer, in others, it is the most popular. + craynv-unknown) + vendor=cray + basic_os=${basic_os:-unicosmp} ;; - pentiumii | pentium2 | pentiumiii | pentium3) - basic_machine=i686-pc + c90-unknown | c90-cray) + vendor=cray + basic_os=${Basic_os:-unicos} ;; - pentium4) - basic_machine=i786-pc + fx80-unknown) + vendor=alliant ;; - pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) - basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + romp-unknown) + vendor=ibm ;; - pentiumpro-* | p6-* | 6x86-* | athlon-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + mmix-unknown) + vendor=knuth ;; - pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + microblaze-unknown | microblazeel-unknown) + vendor=xilinx ;; - pentium4-*) - basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + rs6000-unknown) + vendor=ibm ;; - pn) - basic_machine=pn-gould + vax-unknown) + vendor=dec ;; - power) basic_machine=power-ibm + pdp11-unknown) + vendor=dec ;; - ppc | ppcbe) basic_machine=powerpc-unknown + we32k-unknown) + vendor=att ;; - ppc-* | ppcbe-*) - basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + cydra-unknown) + vendor=cydrome ;; - ppcle | powerpclittle | ppc-le | powerpc-little) - basic_machine=powerpcle-unknown + i370-ibm*) + vendor=ibm ;; - ppcle-* | powerpclittle-*) - basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + orion-unknown) + vendor=highlevel ;; - ppc64) basic_machine=powerpc64-unknown - ;; - ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64le | powerpc64little | ppc64-le | powerpc64-little) - basic_machine=powerpc64le-unknown - ;; - ppc64le-* | powerpc64little-*) - basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ps2) - basic_machine=i386-ibm - ;; - pw32) - basic_machine=i586-unknown - os=-pw32 - ;; - rdos | rdos64) - basic_machine=x86_64-pc - os=-rdos - ;; - rdos32) - basic_machine=i386-pc - os=-rdos - ;; - rom68k) - basic_machine=m68k-rom68k - os=-coff - ;; - rm[46]00) - basic_machine=mips-siemens - ;; - rtpc | rtpc-*) - basic_machine=romp-ibm - ;; - s390 | s390-*) - basic_machine=s390-ibm - ;; - s390x | s390x-*) - basic_machine=s390x-ibm - ;; - sa29200) - basic_machine=a29k-amd - os=-udi - ;; - sb1) - basic_machine=mipsisa64sb1-unknown - ;; - sb1el) - basic_machine=mipsisa64sb1el-unknown - ;; - sde) - basic_machine=mipsisa32-sde - os=-elf - ;; - sei) - basic_machine=mips-sei - os=-seiux - ;; - sequent) - basic_machine=i386-sequent - ;; - sh) - basic_machine=sh-hitachi - os=-hms - ;; - sh5el) - basic_machine=sh5le-unknown - ;; - sh64) - basic_machine=sh64-unknown - ;; - sparclite-wrs | simso-wrs) - basic_machine=sparclite-wrs - os=-vxworks - ;; - sps7) - basic_machine=m68k-bull - os=-sysv2 - ;; - spur) - basic_machine=spur-unknown - ;; - st2000) - basic_machine=m68k-tandem - ;; - stratus) - basic_machine=i860-stratus - os=-sysv4 - ;; - strongarm-* | thumb-*) - basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - sun2) - basic_machine=m68000-sun - ;; - sun2os3) - basic_machine=m68000-sun - os=-sunos3 - ;; - sun2os4) - basic_machine=m68000-sun - os=-sunos4 - ;; - sun3os3) - basic_machine=m68k-sun - os=-sunos3 - ;; - sun3os4) - basic_machine=m68k-sun - os=-sunos4 - ;; - sun4os3) - basic_machine=sparc-sun - os=-sunos3 - ;; - sun4os4) - basic_machine=sparc-sun - os=-sunos4 - ;; - sun4sol2) - basic_machine=sparc-sun - os=-solaris2 - ;; - sun3 | sun3-*) - basic_machine=m68k-sun - ;; - sun4) - basic_machine=sparc-sun - ;; - sun386 | sun386i | roadrunner) - basic_machine=i386-sun - ;; - sv1) - basic_machine=sv1-cray - os=-unicos - ;; - symmetry) - basic_machine=i386-sequent - os=-dynix - ;; - t3e) - basic_machine=alphaev5-cray - os=-unicos - ;; - t90) - basic_machine=t90-cray - os=-unicos - ;; - tile*) - basic_machine=$basic_machine-unknown - os=-linux-gnu - ;; - tx39) - basic_machine=mipstx39-unknown - ;; - tx39el) - basic_machine=mipstx39el-unknown - ;; - toad1) - basic_machine=pdp10-xkl - os=-tops20 - ;; - tower | tower-32) - basic_machine=m68k-ncr - ;; - tpf) - basic_machine=s390x-ibm - os=-tpf - ;; - udi29k) - basic_machine=a29k-amd - os=-udi - ;; - ultra3) - basic_machine=a29k-nyu - os=-sym1 - ;; - v810 | necv810) - basic_machine=v810-nec - os=-none - ;; - vaxv) - basic_machine=vax-dec - os=-sysv - ;; - vms) - basic_machine=vax-dec - os=-vms - ;; - vpp*|vx|vx-*) - basic_machine=f301-fujitsu - ;; - vxworks960) - basic_machine=i960-wrs - os=-vxworks - ;; - vxworks68) - basic_machine=m68k-wrs - os=-vxworks - ;; - vxworks29k) - basic_machine=a29k-wrs - os=-vxworks - ;; - w65*) - basic_machine=w65-wdc - os=-none - ;; - w89k-*) - basic_machine=hppa1.1-winbond - os=-proelf - ;; - xbox) - basic_machine=i686-pc - os=-mingw32 - ;; - xps | xps100) - basic_machine=xps100-honeywell - ;; - xscale-* | xscalee[bl]-*) - basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` - ;; - ymp) - basic_machine=ymp-cray - os=-unicos - ;; - z8k-*-coff) - basic_machine=z8k-unknown - os=-sim - ;; - z80-*-coff) - basic_machine=z80-unknown - os=-sim - ;; - none) - basic_machine=none-none - os=-none + xps-unknown | xps100-unknown) + cpu=xps100 + vendor=honeywell ;; -# Here we handle the default manufacturer of certain CPU types. It is in -# some cases the only manufacturer, in others, it is the most popular. - w89k) - basic_machine=hppa1.1-winbond + # Here we normalize CPU types with a missing or matching vendor + dpx20-unknown | dpx20-bull) + cpu=rs6000 + vendor=bull + basic_os=${basic_os:-bosx} ;; - op50n) - basic_machine=hppa1.1-oki + + # Here we normalize CPU types irrespective of the vendor + amd64-*) + cpu=x86_64 ;; - op60c) - basic_machine=hppa1.1-oki + blackfin-*) + cpu=bfin + basic_os=linux ;; - romp) - basic_machine=romp-ibm + c54x-*) + cpu=tic54x ;; - mmix) - basic_machine=mmix-knuth + c55x-*) + cpu=tic55x ;; - rs6000) - basic_machine=rs6000-ibm + c6x-*) + cpu=tic6x ;; - vax) - basic_machine=vax-dec + e500v[12]-*) + cpu=powerpc + basic_os=${basic_os}"spe" ;; - pdp10) - # there are many clones, so DEC is not a safe bet - basic_machine=pdp10-unknown + mips3*-*) + cpu=mips64 ;; - pdp11) - basic_machine=pdp11-dec + ms1-*) + cpu=mt ;; - we32k) - basic_machine=we32k-att + m68knommu-*) + cpu=m68k + basic_os=linux ;; - sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) - basic_machine=sh-unknown + m9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*) + cpu=s12z ;; - sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) - basic_machine=sparc-sun + openrisc-*) + cpu=or32 ;; - cydra) - basic_machine=cydra-cydrome + parisc-*) + cpu=hppa + basic_os=linux ;; - orion) - basic_machine=orion-highlevel + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + cpu=i586 ;; - orion105) - basic_machine=clipper-highlevel + pentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*) + cpu=i686 ;; - mac | mpw | mac-mpw) - basic_machine=m68k-apple + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + cpu=i686 ;; - pmac | pmac-mpw) - basic_machine=powerpc-apple + pentium4-*) + cpu=i786 ;; - *-unknown) - # Make sure to match an already-canonicalized machine name. + pc98-*) + cpu=i386 ;; + ppc-* | ppcbe-*) + cpu=powerpc + ;; + ppcle-* | powerpclittle-*) + cpu=powerpcle + ;; + ppc64-*) + cpu=powerpc64 + ;; + ppc64le-* | powerpc64little-*) + cpu=powerpc64le + ;; + sb1-*) + cpu=mipsisa64sb1 + ;; + sb1el-*) + cpu=mipsisa64sb1el + ;; + sh5e[lb]-*) + cpu=`echo "$cpu" | sed 's/^\(sh.\)e\(.\)$/\1\2e/'` + ;; + spur-*) + cpu=spur + ;; + strongarm-* | thumb-*) + cpu=arm + ;; + tx39-*) + cpu=mipstx39 + ;; + tx39el-*) + cpu=mipstx39el + ;; + x64-*) + cpu=x86_64 + ;; + xscale-* | xscalee[bl]-*) + cpu=`echo "$cpu" | sed 's/^xscale/arm/'` + ;; + arm64-*) + cpu=aarch64 + ;; + + # Recognize the canonical CPU Types that limit and/or modify the + # company names they are paired with. + cr16-*) + basic_os=${basic_os:-elf} + ;; + crisv32-* | etraxfs*-*) + cpu=crisv32 + vendor=axis + ;; + cris-* | etrax*-*) + cpu=cris + vendor=axis + ;; + crx-*) + basic_os=${basic_os:-elf} + ;; + neo-tandem) + cpu=neo + vendor=tandem + ;; + nse-tandem) + cpu=nse + vendor=tandem + ;; + nsr-tandem) + cpu=nsr + vendor=tandem + ;; + nsv-tandem) + cpu=nsv + vendor=tandem + ;; + nsx-tandem) + cpu=nsx + vendor=tandem + ;; + mipsallegrexel-sony) + cpu=mipsallegrexel + vendor=sony + ;; + tile*-*) + basic_os=${basic_os:-linux-gnu} + ;; + *) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 + # Recognize the canonical CPU types that are allowed with any + # company name. + case $cpu in + 1750a | 580 \ + | a29k \ + | aarch64 | aarch64_be \ + | abacus \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \ + | alphapca5[67] | alpha64pca5[67] \ + | am33_2.0 \ + | amdgcn \ + | arc | arceb | arc32 | arc64 \ + | arm | arm[lb]e | arme[lb] | armv* \ + | avr | avr32 \ + | asmjs \ + | ba \ + | be32 | be64 \ + | bfin | bpf | bs2000 \ + | c[123]* | c30 | [cjt]90 | c4x \ + | c8051 | clipper | craynv | csky | cydra \ + | d10v | d30v | dlx | dsp16xx \ + | e2k | elxsi | epiphany \ + | f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \ + | h8300 | h8500 \ + | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | hexagon \ + | i370 | i*86 | i860 | i960 | ia16 | ia64 \ + | ip2k | iq2000 \ + | k1om \ + | le32 | le64 \ + | lm32 \ + | loongarch32 | loongarch64 | loongarchx32 \ + | m32c | m32r | m32rle \ + | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \ + | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \ + | m88110 | m88k | maxq | mb | mcore | mep | metag \ + | microblaze | microblazeel \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64eb | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa32r3 | mipsisa32r3el \ + | mipsisa32r5 | mipsisa32r5el \ + | mipsisa32r6 | mipsisa32r6el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64r3 | mipsisa64r3el \ + | mipsisa64r5 | mipsisa64r5el \ + | mipsisa64r6 | mipsisa64r6el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipsr5900 | mipsr5900el \ + | mipstx39 | mipstx39el \ + | mmix \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nds32 | nds32le | nds32be \ + | nfp \ + | nios | nios2 | nios2eb | nios2el \ + | none | np1 | ns16k | ns32k | nvptx \ + | open8 \ + | or1k* \ + | or32 \ + | orion \ + | picochip \ + | pdp10 | pdp11 | pj | pjl | pn | power \ + | powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \ + | pru \ + | pyramid \ + | riscv | riscv32 | riscv32be | riscv64 | riscv64be \ + | rl78 | romp | rs6000 | rx \ + | s390 | s390x \ + | score \ + | sh | shl \ + | sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \ + | sh[1234]e[lb] | sh[12345][lb]e | sh[23]ele | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \ + | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \ + | spu \ + | tahoe \ + | thumbv7* \ + | tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \ + | tron \ + | ubicom32 \ + | v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \ + | vax \ + | visium \ + | w65 \ + | wasm32 | wasm64 \ + | we32k \ + | x86 | x86_64 | xc16x | xgate | xps100 \ + | xstormy16 | xtensa* \ + | ymp \ + | z8k | z80) + ;; + + *) + echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2 + exit 1 + ;; + esac ;; esac # Here we canonicalize certain aliases for manufacturers. -case $basic_machine in - *-digital*) - basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` +case $vendor in + digital*) + vendor=dec ;; - *-commodore*) - basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + commodore*) + vendor=cbm ;; *) ;; @@ -1343,200 +1301,215 @@ esac # Decode manufacturer-specific aliases for certain operating systems. -if [ x"$os" != x"" ] +if test x$basic_os != x then + +# First recognize some ad-hoc caes, or perhaps split kernel-os, or else just +# set os. +case $basic_os in + gnu/linux*) + kernel=linux + os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'` + ;; + os2-emx) + kernel=os2 + os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'` + ;; + nto-qnx*) + kernel=nto + os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'` + ;; + *-*) + # shellcheck disable=SC2162 + saved_IFS=$IFS + IFS="-" read kernel os <&2 - exit 1 + # No normalization, but not necessarily accepted, that comes below. ;; esac + else # Here we handle the default operating systems that come with various machines. @@ -1549,261 +1522,362 @@ else # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. -case $basic_machine in +kernel= +case $cpu-$vendor in score-*) - os=-elf + os=elf ;; spu-*) - os=-elf + os=elf ;; *-acorn) - os=-riscix1.2 + os=riscix1.2 ;; arm*-rebel) - os=-linux + kernel=linux + os=gnu ;; arm*-semi) - os=-aout + os=aout ;; c4x-* | tic4x-*) - os=-coff + os=coff ;; c8051-*) - os=-elf + os=elf + ;; + clipper-intergraph) + os=clix ;; hexagon-*) - os=-elf + os=elf ;; tic54x-*) - os=-coff + os=coff ;; tic55x-*) - os=-coff + os=coff ;; tic6x-*) - os=-coff + os=coff ;; # This must come before the *-dec entry. pdp10-*) - os=-tops20 + os=tops20 ;; pdp11-*) - os=-none + os=none ;; *-dec | vax-*) - os=-ultrix4.2 + os=ultrix4.2 ;; m68*-apollo) - os=-domain + os=domain ;; i386-sun) - os=-sunos4.0.2 + os=sunos4.0.2 ;; m68000-sun) - os=-sunos3 + os=sunos3 ;; m68*-cisco) - os=-aout + os=aout ;; mep-*) - os=-elf + os=elf ;; mips*-cisco) - os=-elf + os=elf ;; mips*-*) - os=-elf + os=elf ;; or32-*) - os=-coff + os=coff ;; *-tti) # must be before sparc entry or we get the wrong os. - os=-sysv3 + os=sysv3 ;; sparc-* | *-sun) - os=-sunos4.1.1 + os=sunos4.1.1 + ;; + pru-*) + os=elf ;; *-be) - os=-beos - ;; - *-haiku) - os=-haiku + os=beos ;; *-ibm) - os=-aix + os=aix ;; *-knuth) - os=-mmixware + os=mmixware ;; *-wec) - os=-proelf + os=proelf ;; *-winbond) - os=-proelf + os=proelf ;; *-oki) - os=-proelf + os=proelf ;; *-hp) - os=-hpux + os=hpux ;; *-hitachi) - os=-hiux + os=hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) - os=-sysv + os=sysv ;; *-cbm) - os=-amigaos + os=amigaos ;; *-dg) - os=-dgux + os=dgux ;; *-dolphin) - os=-sysv3 + os=sysv3 ;; m68k-ccur) - os=-rtu + os=rtu ;; m88k-omron*) - os=-luna - ;; - *-next ) - os=-nextstep - ;; - *-sequent) - os=-ptx - ;; - *-crds) - os=-unos - ;; - *-ns) - os=-genix - ;; - i370-*) - os=-mvs + os=luna ;; *-next) - os=-nextstep3 + os=nextstep + ;; + *-sequent) + os=ptx + ;; + *-crds) + os=unos + ;; + *-ns) + os=genix + ;; + i370-*) + os=mvs ;; *-gould) - os=-sysv + os=sysv ;; *-highlevel) - os=-bsd + os=bsd ;; *-encore) - os=-bsd + os=bsd ;; *-sgi) - os=-irix + os=irix ;; *-siemens) - os=-sysv4 + os=sysv4 ;; *-masscomp) - os=-rtu + os=rtu ;; f30[01]-fujitsu | f700-fujitsu) - os=-uxpv + os=uxpv ;; *-rom68k) - os=-coff + os=coff ;; *-*bug) - os=-coff + os=coff ;; *-apple) - os=-macos + os=macos ;; *-atari*) - os=-mint + os=mint + ;; + *-wrs) + os=vxworks ;; *) - os=-none + os=none ;; esac + fi +# Now, validate our (potentially fixed-up) OS. +case $os in + # Sometimes we do "kernel-libc", so those need to count as OSes. + musl* | newlib* | relibc* | uclibc*) + ;; + # Likewise for "kernel-abi" + eabi* | gnueabi*) + ;; + # VxWorks passes extra cpu info in the 4th filed. + simlinux | simwindows | spe) + ;; + # Now accept the basic system types. + # The portable systems comes first. + # Each alternative MUST end in a * to match a version number. + gnu* | android* | bsd* | mach* | minix* | genix* | ultrix* | irix* \ + | *vms* | esix* | aix* | cnk* | sunos | sunos[34]* \ + | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \ + | sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \ + | hiux* | abug | nacl* | netware* | windows* \ + | os9* | macos* | osx* | ios* \ + | mpw* | magic* | mmixware* | mon960* | lnews* \ + | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \ + | aos* | aros* | cloudabi* | sortix* | twizzler* \ + | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \ + | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \ + | mirbsd* | netbsd* | dicos* | openedition* | ose* \ + | bitrig* | openbsd* | secbsd* | solidbsd* | libertybsd* | os108* \ + | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \ + | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \ + | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \ + | udi* | lites* | ieee* | go32* | aux* | hcos* \ + | chorusrdb* | cegcc* | glidix* | serenity* \ + | cygwin* | msys* | pe* | moss* | proelf* | rtems* \ + | midipix* | mingw32* | mingw64* | mint* \ + | uxpv* | beos* | mpeix* | udk* | moxiebox* \ + | interix* | uwin* | mks* | rhapsody* | darwin* \ + | openstep* | oskit* | conix* | pw32* | nonstopux* \ + | storm-chaos* | tops10* | tenex* | tops20* | its* \ + | os2* | vos* | palmos* | uclinux* | nucleus* | morphos* \ + | scout* | superux* | sysv* | rtmk* | tpf* | windiss* \ + | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \ + | skyos* | haiku* | rdos* | toppers* | drops* | es* \ + | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ + | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ + | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr*) + ;; + # This one is extra strict with allowed versions + sco3.2v2 | sco3.2v[4-9]* | sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + ;; + none) + ;; + *) + echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2 + exit 1 + ;; +esac + +# As a final step for OS-related things, validate the OS-kernel combination +# (given a valid OS), if there is a kernel. +case $kernel-$os in + linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \ + | linux-musl* | linux-relibc* | linux-uclibc* ) + ;; + uclinux-uclibc* ) + ;; + -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* ) + # These are just libc implementations, not actual OSes, and thus + # require a kernel. + echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2 + exit 1 + ;; + kfreebsd*-gnu* | kopensolaris*-gnu*) + ;; + vxworks-simlinux | vxworks-simwindows | vxworks-spe) + ;; + nto-qnx*) + ;; + os2-emx) + ;; + *-eabi* | *-gnueabi*) + ;; + -*) + # Blank kernel with real OS is always fine. + ;; + *-*) + echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2 + exit 1 + ;; +esac + # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. -vendor=unknown -case $basic_machine in - *-unknown) - case $os in - -riscix*) +case $vendor in + unknown) + case $cpu-$os in + *-riscix*) vendor=acorn ;; - -sunos*) + *-sunos*) vendor=sun ;; - -cnk*|-aix*) + *-cnk* | *-aix*) vendor=ibm ;; - -beos*) + *-beos*) vendor=be ;; - -hpux*) + *-hpux*) vendor=hp ;; - -mpeix*) + *-mpeix*) vendor=hp ;; - -hiux*) + *-hiux*) vendor=hitachi ;; - -unos*) + *-unos*) vendor=crds ;; - -dgux*) + *-dgux*) vendor=dg ;; - -luna*) + *-luna*) vendor=omron ;; - -genix*) + *-genix*) vendor=ns ;; - -mvs* | -opened*) + *-clix*) + vendor=intergraph + ;; + *-mvs* | *-opened*) vendor=ibm ;; - -os400*) + *-os400*) vendor=ibm ;; - -ptx*) + s390-* | s390x-*) + vendor=ibm + ;; + *-ptx*) vendor=sequent ;; - -tpf*) + *-tpf*) vendor=ibm ;; - -vxsim* | -vxworks* | -windiss*) + *-vxsim* | *-vxworks* | *-windiss*) vendor=wrs ;; - -aux*) + *-aux*) vendor=apple ;; - -hms*) + *-hms*) vendor=hitachi ;; - -mpw* | -macos*) + *-mpw* | *-macos*) vendor=apple ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*) vendor=atari ;; - -vos*) + *-vos*) vendor=stratus ;; esac - basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac -echo $basic_machine$os +echo "$cpu-$vendor-${kernel:+$kernel-}$os" exit # Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) +# eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" diff --git a/autoconf/m4/unreal.m4 b/autoconf/m4/unreal.m4 index 345fdf7..73d37a9 100644 --- a/autoconf/m4/unreal.m4 +++ b/autoconf/m4/unreal.m4 @@ -130,9 +130,13 @@ AC_DEFUN([CHECK_LIBCURL], LIBS="$LIBS_SAVEDA" CFLAGS="$CFLAGS_SAVEDA" - URL="url.o" - AC_SUBST(URL) + dnl Finally, choose the cURL implementation of url.c + URL="url_curl.o" + ],[ + dnl Choose UnrealIRCds internal implementation of url.c + URL="url_unreal.o" ]) dnl AS_IF(enable_curl) + AC_SUBST(URL) ]) dnl the following 2 macros are based on CHECK_SSL by Mark Ethan Trostler @@ -178,7 +182,11 @@ AS_IF([test $enable_ssl != "no"], else CRYPTOLIB="-lssl -lcrypto"; if test ! "$ssldir" = "/usr" ; then - LDFLAGS="$LDFLAGS -L$ssldir/lib"; + if test -d "$ssldir/lib64" ; then + LDFLAGS="$LDFLAGS -L$ssldir/lib64"; + else + LDFLAGS="$LDFLAGS -L$ssldir/lib"; + fi dnl check if binary path exists if test -f "$ssldir/bin/openssl"; then OPENSSLPATH="$ssldir/bin/openssl"; @@ -312,3 +320,94 @@ 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 + dnl Try pkg-config first... + AS_IF([test -n "$ac_cv_path_PKGCONFIG"], + [GEOIP_CLASSIC_LIBS="`$ac_cv_path_PKGCONFIG --libs geoip.pc`" + GEOIP_CLASSIC_CFLAGS="`$ac_cv_path_PKGCONFIG --cflags geoip.pc`"]) + dnl In case the system does not have pkg-config, fallback to hardcoded settings... + AS_IF([test -z "$GEOIP_CLASSIC_LIBS"], + [GEOIP_CLASSIC_LIBS="-L$PRIVATELIBDIR -lGeoIP" + GEOIP_CLASSIC_CFLAGS="-I$cur_dir/extras/geoip-classic/include"]) + 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) +]) + +AC_DEFUN([CHECK_LIBMAXMINDDB], +[ + AC_ARG_ENABLE(libmaxminddb, + [AC_HELP_STRING([--enable-libmaxminddb=no/yes],[enable GeoIP libmaxminddb support])], + [enable_libmaxminddb=$enableval], + [enable_libmaxminddb=no]) + + AS_IF([test "x$enable_libmaxminddb" = "xyes"], + [ + dnl see if the system provides it + has_system_libmaxminddb="no" + PKG_CHECK_MODULES([LIBMAXMINDDB], [libmaxminddb >= 1.4.3], + [has_system_libmaxminddb=yes]) + AS_IF([test "x$has_system_libmaxminddb" = "xyes"], + [ + + AC_SUBST(LIBMAXMINDDB_LIBS) + AC_SUBST(LIBMAXMINDDB_CFLAGS) + + GEOIP_MAXMIND_OBJECTS="geoip_maxmind.so" + AC_SUBST(GEOIP_MAXMIND_OBJECTS) + ]) + ]) +]) + diff --git a/configure b/configure index 11fec73..3b7068c 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for unrealircd 5.2.0.1. +# Generated by GNU Autoconf 2.69 for unrealircd 6.0.1.1. # # Report bugs to . # @@ -580,8 +580,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='unrealircd' PACKAGE_TARNAME='unrealircd' -PACKAGE_VERSION='5.2.0.1' -PACKAGE_STRING='unrealircd 5.2.0.1' +PACKAGE_VERSION='6.0.1.1' +PACKAGE_STRING='unrealircd 6.0.1.1' PACKAGE_BUGREPORT='https://bugs.unrealircd.org/' PACKAGE_URL='https://unrealircd.org/' @@ -626,6 +626,12 @@ ac_subst_vars='LTLIBOBJS LIBOBJS UNRLINCDIR IRCDLIBS +GEOIP_MAXMIND_OBJECTS +LIBMAXMINDDB_LIBS +LIBMAXMINDDB_CFLAGS +GEOIP_CLASSIC_OBJECTS +GEOIP_CLASSIC_LIBS +GEOIP_CLASSIC_CFLAGS URL PTHREAD_CFLAGS PTHREAD_LIBS @@ -639,6 +645,8 @@ build_os build_vendor build_cpu build +JANSSON_LIBS +JANSSON_CFLAGS CARES_LIBS CARES_CFLAGS SODIUM_LIBS @@ -746,19 +754,20 @@ with_docdir with_pidfile with_privatelibdir with_maxconnections -enable_prefixaq -with_showlistmodes with_no_operoverride with_operoverride_verify with_system_pcre2 with_system_argon2 with_system_sodium with_system_cares +with_system_jansson enable_ssl enable_dynamic_linking enable_werror enable_asan enable_libcurl +enable_geoip_classic +enable_libmaxminddb ' ac_precious_vars='build_alias host_alias @@ -779,7 +788,13 @@ ARGON2_LIBS SODIUM_CFLAGS SODIUM_LIBS CARES_CFLAGS -CARES_LIBS' +CARES_LIBS +JANSSON_CFLAGS +JANSSON_LIBS +GEOIP_CLASSIC_CFLAGS +GEOIP_CLASSIC_LIBS +LIBMAXMINDDB_CFLAGS +LIBMAXMINDDB_LIBS' # Initialize some variables set by options. @@ -1330,7 +1345,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures unrealircd 5.2.0.1 to adapt to many kinds of systems. +\`configure' configures unrealircd 6.0.1.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1396,7 +1411,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of unrealircd 5.2.0.1:";; + short | recursive ) echo "Configuration of unrealircd 6.0.1.1:";; esac cat <<\_ACEOF @@ -1406,7 +1421,6 @@ Optional Features: --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-hardening Enable compiler and linker options to frustrate memory corruption exploits [yes] - --disable-prefixaq Disable chanadmin (+a) and chanowner (+q) prefixes --enable-ssl= enable ssl will check /usr/local/opt/openssl /usr/local/ssl /usr/lib/ssl /usr/ssl /usr/pkg /usr/sfw /usr/local /usr @@ -1418,6 +1432,10 @@ Optional Features: --enable-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 + --enable-libmaxminddb=no/yes + enable GeoIP libmaxminddb support Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] @@ -1447,7 +1465,6 @@ Optional Packages: stored. Disable when building a package for a distro --with-maxconnections=size Specify the max file descriptors to use - --with-showlistmodes Specify whether modes are shown in /list --with-no-operoverride Disable OperOverride --with-operoverride-verify Require opers to invite themselves to +s/+p channels @@ -1459,6 +1476,9 @@ Optional Packages: library. Normally autodetected via pkg-config --without-system-cares Use bundled version instead of system c-ares. Normally autodetected via pkg-config. + --without-system-jansson + Use bundled version instead of system jansson. + Normally autodetected via pkg-config. Some influential environment variables: CC C compiler command @@ -1486,6 +1506,18 @@ Some influential environment variables: CARES_CFLAGS C compiler flags for CARES, overriding pkg-config CARES_LIBS linker flags for CARES, overriding pkg-config + JANSSON_CFLAGS + 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 + LIBMAXMINDDB_CFLAGS + C compiler flags for LIBMAXMINDDB, overriding pkg-config + LIBMAXMINDDB_LIBS + linker flags for LIBMAXMINDDB, 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. @@ -1554,7 +1586,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -unrealircd configure 5.2.0.1 +unrealircd configure 6.0.1.1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -1923,7 +1955,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by unrealircd $as_me 5.2.0.1, which was +It was created by unrealircd $as_me 6.0.1.1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -2315,7 +2347,7 @@ orig_cflags="$CFLAGS" BUILDDIR_NOW="`pwd`" # Generation version number (e.g.: X in X.Y.Z) -UNREAL_VERSION_GENERATION="5" +UNREAL_VERSION_GENERATION="6" cat >>confdefs.h <<_ACEOF #define UNREAL_VERSION_GENERATION $UNREAL_VERSION_GENERATION @@ -2323,7 +2355,7 @@ _ACEOF # Major version number (e.g.: Y in X.Y.Z) -UNREAL_VERSION_MAJOR="2" +UNREAL_VERSION_MAJOR="0" cat >>confdefs.h <<_ACEOF #define UNREAL_VERSION_MAJOR $UNREAL_VERSION_MAJOR @@ -2331,7 +2363,7 @@ _ACEOF # Minor version number (e.g.: Z in X.Y.Z) -UNREAL_VERSION_MINOR="0" +UNREAL_VERSION_MINOR="1" cat >>confdefs.h <<_ACEOF #define UNREAL_VERSION_MINOR $UNREAL_VERSION_MINOR @@ -5121,6 +5153,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu CFLAGS="$CFLAGS -funsigned-char" + CFLAGS="$CFLAGS -Wall" ac_ext=c @@ -5217,6 +5250,54 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Wformat-nonliteral" >&5 +$as_echo_n "checking whether C compiler accepts -Wformat-nonliteral... " >&6; } +if ${ax_cv_check_cflags__Werror___Wformat_nonliteral+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CFLAGS + CFLAGS="$CFLAGS -Werror -Wformat-nonliteral" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_check_cflags__Werror___Wformat_nonliteral=yes +else + ax_cv_check_cflags__Werror___Wformat_nonliteral=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags__Werror___Wformat_nonliteral" >&5 +$as_echo "$ax_cv_check_cflags__Werror___Wformat_nonliteral" >&6; } +if test x"$ax_cv_check_cflags__Werror___Wformat_nonliteral" = xyes; then : + CFLAGS="$CFLAGS -Wformat-nonliteral" +else + : +fi + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -5312,6 +5393,55 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Wparentheses" >&5 +$as_echo_n "checking whether C compiler accepts -Wparentheses... " >&6; } +if ${ax_cv_check_cflags__Werror___Wparentheses+:} false; then : + $as_echo_n "(cached) " >&6 +else + + ax_check_save_flags=$CFLAGS + CFLAGS="$CFLAGS -Werror -Wparentheses" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ax_cv_check_cflags__Werror___Wparentheses=yes +else + ax_cv_check_cflags__Werror___Wparentheses=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$ax_check_save_flags +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags__Werror___Wparentheses" >&5 +$as_echo "$ax_cv_check_cflags__Werror___Wparentheses" >&6; } +if test x"$ax_cv_check_cflags__Werror___Wparentheses" = xyes; then : + CFLAGS="$CFLAGS -Wparentheses" +else + : +fi + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -5791,20 +5921,24 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu +if $CC --version | grep -q "clang version 3."; then : + CFLAGS="$CFLAGS -Wno-tautological-compare -Wno-pragmas" +fi + ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Waddress" >&5 -$as_echo_n "checking whether C compiler accepts -Waddress... " >&6; } -if ${ax_cv_check_cflags__Werror___Waddress+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Wpragmas" >&5 +$as_echo_n "checking whether C compiler accepts -Wpragmas... " >&6; } +if ${ax_cv_check_cflags__Werror___Wpragmas+:} false; then : $as_echo_n "(cached) " >&6 else ax_check_save_flags=$CFLAGS - CFLAGS="$CFLAGS -Werror -Waddress" + CFLAGS="$CFLAGS -Werror -Wpragmas" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -5817,19 +5951,19 @@ main () } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : - ax_cv_check_cflags__Werror___Waddress=yes + ax_cv_check_cflags__Werror___Wpragmas=yes else - ax_cv_check_cflags__Werror___Waddress=no + ax_cv_check_cflags__Werror___Wpragmas=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS=$ax_check_save_flags fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags__Werror___Waddress" >&5 -$as_echo "$ax_cv_check_cflags__Werror___Waddress" >&6; } -if test x"$ax_cv_check_cflags__Werror___Waddress" = xyes; then : - CFLAGS="$CFLAGS -Wno-address" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags__Werror___Wpragmas" >&5 +$as_echo "$ax_cv_check_cflags__Werror___Wpragmas" >&6; } +if test x"$ax_cv_check_cflags__Werror___Wpragmas" = xyes; then : + no_pragmas=1 else - : + no_pragmas=0 fi ac_ext=c @@ -5838,21 +5972,20 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu - ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Wcast-function-type" >&5 -$as_echo_n "checking whether C compiler accepts -Wcast-function-type... " >&6; } -if ${ax_cv_check_cflags__Werror___Wcast_function_type+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Wunknown-warning-option" >&5 +$as_echo_n "checking whether C compiler accepts -Wunknown-warning-option... " >&6; } +if ${ax_cv_check_cflags__Werror___Wunknown_warning_option+:} false; then : $as_echo_n "(cached) " >&6 else ax_check_save_flags=$CFLAGS - CFLAGS="$CFLAGS -Werror -Wcast-function-type" + CFLAGS="$CFLAGS -Werror -Wunknown-warning-option" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -5865,19 +5998,19 @@ main () } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : - ax_cv_check_cflags__Werror___Wcast_function_type=yes + ax_cv_check_cflags__Werror___Wunknown_warning_option=yes else - ax_cv_check_cflags__Werror___Wcast_function_type=no + ax_cv_check_cflags__Werror___Wunknown_warning_option=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS=$ax_check_save_flags fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags__Werror___Wcast_function_type" >&5 -$as_echo "$ax_cv_check_cflags__Werror___Wcast_function_type" >&6; } -if test x"$ax_cv_check_cflags__Werror___Wcast_function_type" = xyes; then : - CFLAGS="$CFLAGS -Wno-cast-function-type" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags__Werror___Wunknown_warning_option" >&5 +$as_echo "$ax_cv_check_cflags__Werror___Wunknown_warning_option" >&6; } +if test x"$ax_cv_check_cflags__Werror___Wunknown_warning_option" = xyes; then : + unknown_warning_option=1 else - : + unknown_warning_option=0 fi ac_ext=c @@ -5887,6 +6020,14 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test "$unknown_warning_option" = "1"; then + CFLAGS="$CFLAGS -Wno-unknown-warning-option" +else + if test "$no_pragmas" = "1"; then + CFLAGS="$CFLAGS -Wno-pragmas" + fi +fi + @@ -6008,6 +6149,19 @@ $as_echo "#define HAVE_STRLNCAT /**/" >>confdefs.h fi done +for ac_func in strlncpy +do : + ac_fn_c_check_func "$LINENO" "strlncpy" "ac_cv_func_strlncpy" +if test "x$ac_cv_func_strlncpy" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STRLNCPY 1 +_ACEOF + +$as_echo "#define HAVE_STRLNCPY /**/" >>confdefs.h + +fi +done + for ac_func in getrusage do : @@ -6448,29 +6602,6 @@ cat >>confdefs.h <<_ACEOF _ACEOF -# Check whether --enable-prefixaq was given. -if test "${enable_prefixaq+set}" = set; then : - enableval=$enable_prefixaq; -else - enable_prefixaq=yes -fi - -if test $enable_prefixaq = "yes"; then : - -$as_echo "#define PREFIX_AQ /**/" >>confdefs.h - -fi - - -# Check whether --with-showlistmodes was given. -if test "${with_showlistmodes+set}" = set; then : - withval=$with_showlistmodes; if test $withval = "yes"; then : - -$as_echo "#define LIST_SHOW_MODES /**/" >>confdefs.h - -fi -fi - # Check whether --with-no-operoverride was given. if test "${with_no_operoverride+set}" = set; then : @@ -6524,6 +6655,14 @@ else fi +# Check whether --with-system-jansson was given. +if test "${with_system_jansson+set}" = set; then : + withval=$with_system_jansson; +else + with_system_jansson=yes +fi + + # Check whether --enable-ssl was given. if test "${enable_ssl+set}" = set; then : enableval=$enable_ssl; @@ -6570,7 +6709,11 @@ $as_echo "not found" >&6; } else CRYPTOLIB="-lssl -lcrypto"; if test ! "$ssldir" = "/usr" ; then - LDFLAGS="$LDFLAGS -L$ssldir/lib"; + if test -d "$ssldir/lib64" ; then + LDFLAGS="$LDFLAGS -L$ssldir/lib64"; + else + LDFLAGS="$LDFLAGS -L$ssldir/lib"; + fi if test -f "$ssldir/bin/openssl"; then OPENSSLPATH="$ssldir/bin/openssl"; fi @@ -7655,7 +7798,7 @@ fi if test "$has_system_cares" = "no"; then : -cares_version="1.17.1" +cares_version="1.17.2" { $as_echo "$as_me:${as_lineno-$LINENO}: result: extracting c-ares resolver library" >&5 $as_echo "extracting c-ares resolver library" >&6; } cur_dir=`pwd` @@ -7716,6 +7859,130 @@ cd $cur_dir fi +has_system_jansson="no" +if test "x$with_system_jansson" = "xyes"; then : + + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for JANSSON" >&5 +$as_echo_n "checking for JANSSON... " >&6; } + +if test -n "$JANSSON_CFLAGS"; then + pkg_cv_JANSSON_CFLAGS="$JANSSON_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"jansson >= 2.0.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "jansson >= 2.0.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_JANSSON_CFLAGS=`$PKG_CONFIG --cflags "jansson >= 2.0.0" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$JANSSON_LIBS"; then + pkg_cv_JANSSON_LIBS="$JANSSON_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"jansson >= 2.0.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "jansson >= 2.0.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_JANSSON_LIBS=`$PKG_CONFIG --libs "jansson >= 2.0.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 + JANSSON_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "jansson >= 2.0.0" 2>&1` + else + JANSSON_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "jansson >= 2.0.0" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$JANSSON_PKG_ERRORS" >&5 + + has_system_jansson=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + has_system_jansson=no +else + JANSSON_CFLAGS=$pkg_cv_JANSSON_CFLAGS + JANSSON_LIBS=$pkg_cv_JANSSON_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + has_system_jansson=yes +if test "x$PRIVATELIBDIR" != "x"; then : + rm -f "$PRIVATELIBDIR/"libjansson* +fi +fi +fi + +if test "$has_system_jansson" = "no"; then : + +jansson_version="2.13.1" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: extracting jansson library" >&5 +$as_echo "extracting jansson library" >&6; } +cur_dir=`pwd` +cd extras +rm -rf jansson-$jansson_version jansson +if test "x$ac_cv_path_GUNZIP" = "x" ; then + tar xfz jansson.tar.gz +else + cp jansson.tar.gz jansson.tar.gz.bak + gunzip -f jansson.tar.gz + cp jansson.tar.gz.bak jansson.tar.gz + tar xf jansson.tar +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: compiling jansson library" >&5 +$as_echo "compiling jansson library" >&6; } +cd jansson-$jansson_version +save_cflags="$CFLAGS" +CFLAGS="$orig_cflags" +export CFLAGS +./configure --prefix=$cur_dir/extras/jansson --libdir=$PRIVATELIBDIR --enable-shared --disable-static --enable-opt || exit 1 +CFLAGS="$save_cflags" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: compiling jansson resolver library" >&5 +$as_echo "compiling jansson resolver library" >&6; } +$ac_cv_prog_MAKER || exit 1 +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: installing jansson resolver library" >&5 +$as_echo "installing jansson resolver library" >&6; } +$ac_cv_prog_MAKER install || exit 1 +JANSSON_CFLAGS="-I$cur_dir/extras/jansson/include" + +JANSSON_LIBS= +if test -n "$ac_cv_path_PKGCONFIG"; then : + JANSSON_LIBS="`$ac_cv_path_PKGCONFIG --libs jansson.pc`" +fi +if test -z "$JANSSON_LIBS"; then : + JANSSON_LIBS="-L$PRIVATELIBDIR -ljansson" +fi + +cd $cur_dir + +fi + + # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 @@ -8338,11 +8605,269 @@ rm -f core conftest.err conftest.$ac_objext \ LIBS="$LIBS_SAVEDA" CFLAGS="$CFLAGS_SAVEDA" - URL="url.o" + URL="url_curl.o" + +else + + URL="url_unreal.o" + +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 + + 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 + if test -n "$ac_cv_path_PKGCONFIG"; then : + GEOIP_CLASSIC_LIBS="`$ac_cv_path_PKGCONFIG --libs geoip.pc`" + GEOIP_CLASSIC_CFLAGS="`$ac_cv_path_PKGCONFIG --cflags geoip.pc`" +fi + if test -z "$GEOIP_CLASSIC_LIBS"; then : + GEOIP_CLASSIC_LIBS="-L$PRIVATELIBDIR -lGeoIP" + GEOIP_CLASSIC_CFLAGS="-I$cur_dir/extras/geoip-classic/include" +fi + cd $cur_dir + +fi + + + + + GEOIP_CLASSIC_OBJECTS="geoip_classic.so" fi + + # Check whether --enable-libmaxminddb was given. +if test "${enable_libmaxminddb+set}" = set; then : + enableval=$enable_libmaxminddb; enable_libmaxminddb=$enableval +else + enable_libmaxminddb=no +fi + + + if test "x$enable_libmaxminddb" = "xyes"; then : + + has_system_libmaxminddb="no" + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBMAXMINDDB" >&5 +$as_echo_n "checking for LIBMAXMINDDB... " >&6; } + +if test -n "$LIBMAXMINDDB_CFLAGS"; then + pkg_cv_LIBMAXMINDDB_CFLAGS="$LIBMAXMINDDB_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libmaxminddb >= 1.4.3\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libmaxminddb >= 1.4.3") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBMAXMINDDB_CFLAGS=`$PKG_CONFIG --cflags "libmaxminddb >= 1.4.3" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$LIBMAXMINDDB_LIBS"; then + pkg_cv_LIBMAXMINDDB_LIBS="$LIBMAXMINDDB_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libmaxminddb >= 1.4.3\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libmaxminddb >= 1.4.3") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBMAXMINDDB_LIBS=`$PKG_CONFIG --libs "libmaxminddb >= 1.4.3" 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 + LIBMAXMINDDB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libmaxminddb >= 1.4.3" 2>&1` + else + LIBMAXMINDDB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libmaxminddb >= 1.4.3" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$LIBMAXMINDDB_PKG_ERRORS" >&5 + + as_fn_error $? "Package requirements (libmaxminddb >= 1.4.3) were not met: + +$LIBMAXMINDDB_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +Alternatively, you may set the environment variables LIBMAXMINDDB_CFLAGS +and LIBMAXMINDDB_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details." "$LINENO" 5 +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +Alternatively, you may set the environment variables LIBMAXMINDDB_CFLAGS +and LIBMAXMINDDB_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details. + +To get pkg-config, see . +See \`config.log' for more details" "$LINENO" 5; } +else + LIBMAXMINDDB_CFLAGS=$pkg_cv_LIBMAXMINDDB_CFLAGS + LIBMAXMINDDB_LIBS=$pkg_cv_LIBMAXMINDDB_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + has_system_libmaxminddb=yes +fi + if test "x$has_system_libmaxminddb" = "xyes"; then : + + + + + + GEOIP_MAXMIND_OBJECTS="geoip_maxmind.so" + + +fi + +fi + + UNRLINCDIR="`pwd`/include" if test "$ac_cv_werror" = "yes" ; then @@ -8358,7 +8883,7 @@ fi -ac_config_files="$ac_config_files Makefile src/Makefile src/modules/Makefile src/modules/chanmodes/Makefile src/modules/usermodes/Makefile src/modules/snomasks/Makefile src/modules/extbans/Makefile src/modules/third/Makefile extras/unrealircd-upgrade-script unrealircd" +ac_config_files="$ac_config_files Makefile src/Makefile src/modules/Makefile src/modules/chanmodes/Makefile src/modules/usermodes/Makefile src/modules/extbans/Makefile src/modules/third/Makefile extras/unrealircd-upgrade-script unrealircd" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure @@ -8866,7 +9391,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by unrealircd $as_me 5.2.0.1, which was +This file was extended by unrealircd $as_me 6.0.1.1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -8929,7 +9454,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -unrealircd config.status 5.2.0.1 +unrealircd config.status 6.0.1.1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" @@ -9056,7 +9581,6 @@ do "src/modules/Makefile") CONFIG_FILES="$CONFIG_FILES src/modules/Makefile" ;; "src/modules/chanmodes/Makefile") CONFIG_FILES="$CONFIG_FILES src/modules/chanmodes/Makefile" ;; "src/modules/usermodes/Makefile") CONFIG_FILES="$CONFIG_FILES src/modules/usermodes/Makefile" ;; - "src/modules/snomasks/Makefile") CONFIG_FILES="$CONFIG_FILES src/modules/snomasks/Makefile" ;; "src/modules/extbans/Makefile") CONFIG_FILES="$CONFIG_FILES src/modules/extbans/Makefile" ;; "src/modules/third/Makefile") CONFIG_FILES="$CONFIG_FILES src/modules/third/Makefile" ;; "extras/unrealircd-upgrade-script") CONFIG_FILES="$CONFIG_FILES extras/unrealircd-upgrade-script" ;; diff --git a/configure.ac b/configure.ac index 4246558..9dff663 100644 --- a/configure.ac +++ b/configure.ac @@ -7,7 +7,7 @@ dnl src/windows/unrealinst.iss dnl doc/Config.header dnl src/version.c.SH -AC_INIT([unrealircd], [5.2.0.1], [https://bugs.unrealircd.org/], [], [https://unrealircd.org/]) +AC_INIT([unrealircd], [6.0.1.1], [https://bugs.unrealircd.org/], [], [https://unrealircd.org/]) AC_CONFIG_SRCDIR([src/ircd.c]) AC_CONFIG_HEADER([include/setup.h]) AC_CONFIG_AUX_DIR([autoconf]) @@ -26,15 +26,15 @@ BUILDDIR_NOW="`pwd`" dnl Calculate the versions. Perhaps the use of expr is a little too extravagant # Generation version number (e.g.: X in X.Y.Z) -UNREAL_VERSION_GENERATION=["5"] +UNREAL_VERSION_GENERATION=["6"] AC_DEFINE_UNQUOTED([UNREAL_VERSION_GENERATION], [$UNREAL_VERSION_GENERATION], [Generation version number (e.g.: X for X.Y.Z)]) # Major version number (e.g.: Y in X.Y.Z) -UNREAL_VERSION_MAJOR=["2"] +UNREAL_VERSION_MAJOR=["0"] AC_DEFINE_UNQUOTED([UNREAL_VERSION_MAJOR], [$UNREAL_VERSION_MAJOR], [Major version number (e.g.: Y for X.Y.Z)]) # Minor version number (e.g.: Z in X.Y.Z) -UNREAL_VERSION_MINOR=["0"] +UNREAL_VERSION_MINOR=["1"] AC_DEFINE_UNQUOTED([UNREAL_VERSION_MINOR], [$UNREAL_VERSION_MINOR], [Minor version number (e.g.: Z for X.Y.Z)]) # The version suffix such as a beta marker or release candidate @@ -189,18 +189,26 @@ CFLAGS="$CFLAGS -funsigned-char" dnl Compiler -W checks... +dnl == ADD THESE WARNINGS == + dnl We should be able to turn this on unconditionally: CFLAGS="$CFLAGS -Wall" dnl More warnings (if the compiler supports it): check_cc_flag([-Wextra], [CFLAGS="$CFLAGS -Wextra"]) check_cc_flag([-Waggregate-return], [CFLAGS="$CFLAGS -Waggregate-return"]) +check_cc_flag([-Wformat-nonliteral], [CFLAGS="$CFLAGS -Wformat-nonliteral"]) + dnl The following few are more experimental, if they have false positives we'll have dnl to disable them: dnl Can't use this, too bad: check_cc_flag([-Wlogical-op], [CFLAGS="$CFLAGS -Wlogical-op"]) check_cc_flag([-Wduplicated-cond], [CFLAGS="$CFLAGS -Wduplicated-cond"]) check_cc_flag([-Wduplicated-branches], [CFLAGS="$CFLAGS -Wduplicated-branches"]) +check_cc_flag([-Wparentheses], [CFLAGS="$CFLAGS -Wparentheses"]) + +dnl == REMOVE THESE WARNINGS == + dnl And now to filter out certain warnings: dnl [!] NOTE REGARDING THE check_cc_flag used by these: dnl We check for the -Woption even though we are going to use -Wno-option. @@ -247,12 +255,31 @@ check_cc_flag([-Wsign-compare], [CFLAGS="$CFLAGS -Wno-sign-compare"]) dnl Don't warn about empty body, we use this, eg via Debug(()) or in if's. check_cc_flag([-Wempty-body], [CFLAGS="$CFLAGS -Wno-empty-body"]) -dnl This one fails with ircstrdup(var, staticstring) -dnl Shame we have to turn it off completely... -check_cc_flag([-Waddress], [CFLAGS="$CFLAGS -Wno-address"]) +dnl Yeah this old clang version is a bit problematic +dnl (ships in Ubuntu 16.04 for example) +dnl -Wtautological-compare has false positives +dnl -Wno-pragmas is needed, despite -Wno-unknown-warning-option +AS_IF([$CC --version | grep -q "clang version 3."], + [CFLAGS="$CFLAGS -Wno-tautological-compare -Wno-pragmas"]) -dnl This one breaks our TO_INTFUNC() that is used in m_tkl for tkl_typetochar -check_cc_flag([-Wcast-function-type], [CFLAGS="$CFLAGS -Wno-cast-function-type"]) +dnl This one MUST be LAST!! +dnl It disables -Wsomeunknownoption being an error. Which is needed for +dnl the pragma's in individual files to selectively disable some warnings +dnl on clang/gcc (that may exist in eg gcc but not in clang or vice versa). +check_cc_flag([-Wpragmas], [no_pragmas=1],[no_pragmas=0]) +check_cc_flag([-Wunknown-warning-option], [unknown_warning_option=1], [unknown_warning_option=0]) + +if test "$unknown_warning_option" = "1"; then + dnl This is the best option + CFLAGS="$CFLAGS -Wno-unknown-warning-option" +else + if test "$no_pragmas" = "1"; then + dnl This is a fallback needed for older gcc/clang, it also + dnl disables several other useful warnings/errors related + dnl to pragma's unfortunately. + CFLAGS="$CFLAGS -Wno-pragmas" + fi +fi dnl End of -W... compiler checks. @@ -352,6 +379,8 @@ AC_CHECK_FUNCS(strlcat, AC_DEFINE([HAVE_STRLCAT], [], [Define if you have strlcat])) AC_CHECK_FUNCS(strlncat, AC_DEFINE([HAVE_STRLNCAT], [], [Define if you have strlncat])) +AC_CHECK_FUNCS(strlncpy, + AC_DEFINE([HAVE_STRLNCPY], [], [Define if you have strlncpy])) AC_CHECK_FUNCS([getrusage], [AC_DEFINE([GETRUSAGE_2], [], [Define if you have getrusage])], @@ -492,17 +521,6 @@ AC_ARG_WITH(maxconnections, [AS_HELP_STRING([--with-maxconnections=size], [Speci [ac_fd=0]) AC_DEFINE_UNQUOTED([MAXCONNECTIONS_REQUEST], [$ac_fd], [Set to the maximum number of connections you want]) -AC_ARG_ENABLE([prefixaq], - [AS_HELP_STRING([--disable-prefixaq],[Disable chanadmin (+a) and chanowner (+q) prefixes])], - [], - [enable_prefixaq=yes]) -AS_IF([test $enable_prefixaq = "yes"], - [AC_DEFINE([PREFIX_AQ], [], [Define if you want +a/+q prefixes])]) - -AC_ARG_WITH(showlistmodes, - [AS_HELP_STRING([--with-showlistmodes], [Specify whether modes are shown in /list])], - [AS_IF([test $withval = "yes"], - [AC_DEFINE([LIST_SHOW_MODES], [], [Define if you want modes shown in /list])])]) AC_ARG_WITH(no-operoverride, [AS_HELP_STRING([--with-no-operoverride], [Disable OperOverride])], [AS_IF([test $withval = "yes"], [AC_DEFINE([NO_OPEROVERRIDE], [], [Define if you want OperOverride disabled])])]) @@ -513,6 +531,7 @@ AC_ARG_WITH(system-pcre2, [AS_HELP_STRING([--without-system-pcre2], [Use the sys AC_ARG_WITH(system-argon2, [AS_HELP_STRING([--without-system-argon2], [Use bundled version instead of system argon2 library. Normally autodetected via pkg-config])], [], [with_system_argon2=yes]) AC_ARG_WITH(system-sodium, [AS_HELP_STRING([--without-system-sodium], [Use bundled version instead of system sodium library. Normally autodetected via pkg-config])], [], [with_system_sodium=yes]) AC_ARG_WITH(system-cares, [AS_HELP_STRING([--without-system-cares], [Use bundled version instead of system c-ares. Normally autodetected via pkg-config.])], [], [with_system_cares=yes]) +AC_ARG_WITH(system-jansson, [AS_HELP_STRING([--without-system-jansson], [Use bundled version instead of system jansson. Normally autodetected via pkg-config.])], [], [with_system_jansson=yes]) CHECK_SSL CHECK_SSL_CTX_SET1_CURVES_LIST CHECK_SSL_CTX_SET_MIN_PROTO_VERSION @@ -697,7 +716,7 @@ AS_IF([test "$has_system_cares" = "no"], [ dnl REMEMBER TO CHANGE WITH A NEW C-ARES RELEASE! dnl NOTE: when changing this here, ALSO change it in extras/curlinstall dnl and in the comment in this file around line 400! -cares_version="1.17.1" +cares_version="1.17.2" AC_MSG_RESULT(extracting c-ares resolver library) cur_dir=`pwd` cd extras @@ -763,10 +782,65 @@ AC_SUBST(CARES_LIBS) cd $cur_dir ]) +dnl Use system jansson when available, unless --without-system-jansson +has_system_jansson="no" +AS_IF([test "x$with_system_jansson" = "xyes"],[ +PKG_CHECK_MODULES([JANSSON], [jansson >= 2.0.0],[has_system_jansson=yes +AS_IF([test "x$PRIVATELIBDIR" != "x"], [rm -f "$PRIVATELIBDIR/"libjansson*])],[has_system_jansson=no])]) + +AS_IF([test "$has_system_jansson" = "no"],[ +dnl REMEMBER TO CHANGE WITH A NEW JANSSON RELEASE! +jansson_version="2.13.1" +AC_MSG_RESULT(extracting jansson library) +cur_dir=`pwd` +cd extras +dnl remove old jansson directory to force a recompile... +dnl and remove its installation prefix just to clean things up. +rm -rf jansson-$jansson_version jansson +if test "x$ac_cv_path_GUNZIP" = "x" ; then + tar xfz jansson.tar.gz +else + cp jansson.tar.gz jansson.tar.gz.bak + gunzip -f jansson.tar.gz + cp jansson.tar.gz.bak jansson.tar.gz + tar xf jansson.tar +fi +AC_MSG_RESULT(compiling jansson library) +cd jansson-$jansson_version +save_cflags="$CFLAGS" +CFLAGS="$orig_cflags" +export CFLAGS +./configure --prefix=$cur_dir/extras/jansson --libdir=$PRIVATELIBDIR --enable-shared --disable-static --enable-opt || exit 1 +CFLAGS="$save_cflags" +AC_MSG_RESULT(compiling jansson resolver library) +$ac_cv_prog_MAKER || exit 1 +AC_MSG_RESULT(installing jansson resolver library) +$ac_cv_prog_MAKER install || exit 1 +JANSSON_CFLAGS="-I$cur_dir/extras/jansson/include" +AC_SUBST(JANSSON_CFLAGS) +JANSSON_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"], + [JANSSON_LIBS="`$ac_cv_path_PKGCONFIG --libs jansson.pc`"]) +dnl ^^^ FIXME FIXME this is likely incorrect the .pc etc +dnl For when pkg-config isn't available +AS_IF([test -z "$JANSSON_LIBS"], + [JANSSON_LIBS="-L$PRIVATELIBDIR -ljansson"]) +AC_SUBST(JANSSON_LIBS) +cd $cur_dir +]) + + AX_PTHREAD() CHECK_LIBCURL +CHECK_GEOIP_CLASSIC + +CHECK_LIBMAXMINDDB + UNRLINCDIR="`pwd`/include" dnl Moved to the very end to ensure it doesn't affect any libs or tests. @@ -789,7 +863,6 @@ AC_CONFIG_FILES([Makefile src/modules/Makefile src/modules/chanmodes/Makefile src/modules/usermodes/Makefile - src/modules/snomasks/Makefile src/modules/extbans/Makefile src/modules/third/Makefile extras/unrealircd-upgrade-script diff --git a/doc/Config.header b/doc/Config.header index 849ed60..98ec32f 100644 --- a/doc/Config.header +++ b/doc/Config.header @@ -7,7 +7,7 @@ \___/|_| |_|_| \___|\__,_|_|\___/\_| \_| \____/\__,_| Configuration Program - for UnrealIRCd 5.2.0.1 + for UnrealIRCd 6.0.1.1 This program will help you to compile your IRC server, and ask you questions regarding the compile-time settings of it during the process. @@ -16,15 +16,15 @@ A short installation guide is available online at: https://www.unrealircd.org/docs/Installing_from_source Full documentation is available at: -https://www.unrealircd.org/docs/UnrealIRCd_5_documentation +https://www.unrealircd.org/docs/UnrealIRCd_6_documentation -------------------------------------------------------------------------------------- The full release notes are available in doc/RELEASE-NOTES.md For easier viewing, check out the latest online release notes at: -https://github.com/unrealircd/unrealircd/blob/unreal52/doc/RELEASE-NOTES.md +https://github.com/unrealircd/unrealircd/blob/unreal60_dev/doc/RELEASE-NOTES.md -UnrealIRCd 5 is compatible with the following services: +UnrealIRCd 6 is compatible with the following services: * anope with the "unreal4" protocol module - version 2.0.7 or higher required! * atheme with the "unreal4" protocol module - tested with version 7.2.9 diff --git a/doc/RELEASE-NOTES.md b/doc/RELEASE-NOTES.md index 5379a77..e0ac30d 100644 --- a/doc/RELEASE-NOTES.md +++ b/doc/RELEASE-NOTES.md @@ -1,1000 +1,254 @@ -UnrealIRCd 5.2.0.1 Release Notes -================================= - -About 5.2.0.1 --------------- -5.2.0.1 fixes an issue with spamfilter that was present in 5.2.0. -In channels spamfilters were processed for type ```p``` instead of ```c```. -Existing 5.2.0 users on *NIX can upgrade without restart by running -```./unrealircd hot-patch wrongspamfilter520``` - -UnrealIRCd 5.2.0 is out! -------------------------- - -This is UnrealIRCd 5.2.0, a release with lots of new features. -The two main new features are: an improved and more flexible anti-flood block -and channel history which can now be stored encrypted on disk and allows -clients to fetch hundreds/thousands of lines. - -Upgrading and the 5.0.x series -------------------------------- -UnrealIRCd 5.2.0 is the direct successor to 5.0.9/5.0.9.1. -There will be [no further 5.0.x releases](https://www.unrealircd.org/docs/FAQ#About_the_new_5.2.x_series), -in particular there will be no 5.0.10. - -Only four bugs that affect a limited number of people/networks were fixed. -UnrealIRCd 5.2.0 is mostly a feature release. -Admins wishing to take a conservative approach don't need to rush an -upgrade from 5.0.x to 5.2.0, they can wait for a 5.2.1 or 5.2.2 release. - -If you are upgrading from 5.0.9(.1) to 5.2.0 then feel free to try the new -```./unrealircd upgrade``` command. - -The only configuration change is in the set::anti-flood block (as explained -further down under *Enhancements*). When starting UnrealIRCd will give you -clear instructions if anything needs to be changed (and what). -This process is really minor, the server will usually tell you to just -delete a few old lines from the configuration file. - -Enhancements -------------- -* The set::anti-flood block has been redone so you can have different limits - for *unknown-users* and *known-users*. - * As a reminder, by default, *known-users* are users who are identified - to services OR are on an IP that has been connected for over 2 hours - in the past X days. The exact definition of "known-users" is in the - [security-group block](https://www.unrealircd.org/docs/Security-group_block). - * See [here](https://www.unrealircd.org/docs/Anti-flood_settings) - for more information on the layout of the new set::anti-flood block. - * All violations of target-flood, nick-flood, join-flood, away-flood, - invite-flood, knock-flood, max-concurrent-conversations are now - reported to opers with the snomask ```f``` (flood). -* Add support for database encryption. The way this works - is that you define an encryption password in a - [secret { } block](https://www.unrealircd.org/docs/Secret_block). - Then from the various modules you can refer to this secret - block, from - [set::reputation::db-secret](https://www.unrealircd.org/docs/Set_block#set::reputation), - [set::tkldb::db-secret](https://www.unrealircd.org/docs/Set_block#set::tkldb) - and [set::channeldb::db-secret](https://www.unrealircd.org/docs/Set_block#set::channeldb). - This way you can encrypt the reputation, TKL and channel - database for increased privacy. -* Add optional support for - [persistent channel history](https://www.unrealircd.org/docs/Set_block#Persistent_channel_history): - * This stores channel history on disk for channels that have - both ```+H``` and ```+P``` set. - * If you enable this then we ALWAYS require you to set an - encryption password, as we do not allow storing of - channel history in plain text. - * If you enable the option, then the history is stored in - ```data/history/``` in individual .db files. No channel - names are visible in the filenames for optimal privacy. - * See [Persistent channel history](https://www.unrealircd.org/docs/Set_block#Persistent_channel_history) - on how to enable this. By default it is off. -* Add support for IRCv3 - [draft/chathistory](https://ircv3.net/specs/extensions/chathistory). -* The maximums for channel mode ```+H``` have been raised and are now - different for ```+r``` (registered) and ```-r``` channels. For unregistered - channels the limit is now 200 lines / 31 days. For registered channels - the limit is 5000 lines / 31 days. The old limit for both was 200 lines / 7 days. - These maximums can be changed in the now slightly different - [set::history::channel::max-storage-per-channel](https://www.unrealircd.org/docs/Set_block#set::history) - block. -* Add c-ares and libsodium version output to boot screen and /VERSION. -* WHOX now supports displaying the - [reputation score](https://www.unrealircd.org/docs/Reputation_score). - If you are an IRCOp then you can use e.g. ```WHO * %cuhsnfmdaRr```. -* Add ability to [spamfilter](https://www.unrealircd.org/docs/Spamfilter) - message tags via the new ```T``` target. Right now it would be unusual - to use this, but some day when we have more - [message tags](https://www.unrealircd.org/docs/Message_tags) it - may come in handy. -* Support [```+draft/reply```](https://ircv3.net/specs/client-tags/reply) IRCv3 - client tag. Can be used by bots (and others) to indicate to what message - people are replying to. This module, reply-tag, is loaded by default. -* Send [```draft/bot```](https://ircv3.net/specs/extensions/bot-mode) IRCv3 - message tag if the user has mode ```+B``` set. -* [Websockets](https://www.unrealircd.org/docs/WebSocket_support): - add support for clients to negotiate an explicit type via - ```Sec-WebSocket-Protocol```, instead of only the default type from - [listen::websocket::type](https://www.unrealircd.org/docs/WebSocket_support#2._Enable_websocket_on_the_port). - This is based on an IRCv3 websocket draft specification. - Note that UnrealIRCd refuses type text if your configuration allows - non-UTF8 characters in channel or nick names because it would lead - to security and compatibility issues. -* [set::restrict-commands](https://www.unrealircd.org/docs/Set_block#set::restrict-commands): - new option *exempt-tls* which allows SSL/TLS users to bypass a restriction. - -Fixes ------- -* Server squiting the wrong side. Often harmless, but when (re)connecting - rapidly to multiple servers with autoconnect this could cause the - network to fall apart. -* Forbid using [extended server bans](https://www.unrealircd.org/docs/Extended_server_bans) - in ZLINE/GZLINE since they won't work there. -* Extended server ban ```~a:accname``` was not working for shun, and only - partially working for kline/gline. -* More accurate /ELINE error message. - -Changed --------- -* Channel mode ```+H``` always showed time in minutes (```m```) until now. - From now on it will show it in minutes (```m```), hours (```h```) or - days (```d```) depending on the actual value. Eg ```+H 50:7d```. -* If you ran ```./unrealircd stop``` we used to wait only 1 second. - From now on we will wait up to 10 seconds max. This gives UnrealIRCd - plenty of time to write database files. -* If you have zero [log blocks](https://www.unrealircd.org/docs/Log_block) - then we already automatically logged errors to ```ircd.log```. - From now on we will log everything (not only errors) to that file. - -Removed --------- -* Version check for curl and openssl as nowadays they have ABI guarantees. - -Module coders / Developers ---------------------------- -* New UnrealDB API and disk format, see - https://www.unrealircd.org/docs/Dev:UnrealDB -* We now use libsodium for file encryption routines as well - as some helpers to lock/clear passwords in memory. -* Updated ```HOOKTYPE_LOCAL_NICKCHANGE``` and - ```HOOKTYPE_REMOTE_NICKCHANGE``` to include an - ```MessageTag *mtags``` argument in the middle. - You can use ```#if UNREAL_VERSION_TIME>=202115``` to detect this. -* Updated channel mode ```conv_param``` function to - include a ```Channel *channel``` argument at the end. - You can use ```#if UNREAL_VERSION_TIME>=202120``` to detect this. -* New: ```ModuleSetOptions(modinfo->handle, MOD_OPT_UNLOAD_PRIORITY, priority);```. - This can be used for modules to indicate they wish to be unloaded - before or after others. It is used by for example the channel - and history modules so they can save their databases before - channel mode modules or other modules get unloaded. -* New CAP [```draft/chathistory```](https://ircv3.net/specs/extensions/chathistory). - If a client REQ's this CAP then UnrealIRCd won't send history on-join as - it assumes the client will fetch it when they feel the need for it. -* New informative CAP: - [```unrealircd.org/history-backend```](https://www.unrealircd.org/history-backend) - -Reminder: UnrealIRCd 4 is no longer supported ----------------------------------------------- - -UnrealIRCd 4.x is [no longer supported](https://www.unrealircd.org/docs/UnrealIRCd_4_EOL). -Admins must [upgrade to UnrealIRCd 5](https://www.unrealircd.org/docs/Upgrading_from_4.x). - -UnrealIRCd 5.0.9.1 -------------------- -The only change between 5.0.9 and 5.0.9.1 is: -* Build improvements on *NIX (faster compiling and lower memory requirements) -* Windows version is unchanged and still 5.0.9 - -UnrealIRCd 5.0.9 ------------------ -The 5.0.9 release comes with several nice feature enhancements. There are no major bug fixes. - -Enhancements: -* Changes to the "Client connecting" notice on IRC (for IRCOps): - * The format changed slightly, instead of ```{clients}``` it - now shows ```[class: clients]``` - * SSL/TLS information is still shown via ```[secure]``` - * New: ```[reputation: NNN]``` to show the current - [reputation score](https://www.unrealircd.org/docs/Reputation_score) - * New: ```[account: abcdef]``` to show the services account, - but only if [SASL](https://www.unrealircd.org/docs/SASL) was used. -* In the log file the format also changed slightly: - * IP information is now added as ```[127.0.0.1]``` in both the - connect and disconnect log messages. - * The vhost is logged as ```[vhost: xyz]``` instead of ```[VHOST xyz]``` - * All the other values are now logged as well on-connect, - similar to the "Client connecting" notice, so: secure, reputation, - account (if applicable). -* New option [allow::global-maxperip](https://www.unrealircd.org/docs/Allow_block): - this imposes a global (network-wide) restriction on the number of - connections per IP address. - If you don't have a global-maxperip setting in the allow block then it - will default to maxperip plus one. So, if you currently have an - allow::maxperip of 3 then global-maxperip will be 4. -* [Handshake delay](https://www.unrealircd.org/docs/Set_block#set::handshake-delay) - is automatically disabled for users that are exempt from blacklist checking. -* Always exempt 127.* from gline, kline, etc. -* You can now have dated logfiles thanks to strftime formatting. - For example ```log "ircd.%Y-%m-%d.log" { }``` will create a log - file like called ircd.2020-01-31.log, a new one every day. -* The Windows build now supports TLSv1.3 too. +UnrealIRCd 6.0.1.1 +=================== +If you are already running UnrealIRCd 6 then read below on the +changes between 6.0.0 and 6.0.1(.1). Otherwise, jump straight to the +[summary about UnrealIRCd 6](#Summary) to learn more about UnrealIRCd 6. Fixes: -* Windows: some warnings and error messages on boot were previously - missing. +* In 6.0.1.1: extended bans were not properly synced between U5 and U6. + This caused missing extended bans on the U5 side (MODE was working OK, + this only happened when linking servers) +* Text extbans did not have any effect (`+b ~text:censor:*badword*`) +* Timed bans were not expiring if all servers on the network were on U6 +* Channel mode `+f` could place a timed extban with `~t` instead of `~time` +* Crash when unloading any of the vhoaq modules at runtime +* `./unrealircd upgrade` not working on FreeBSD and not with self-compiled cURL +* Some log messages being wrong (`CHGIDENT`, `CHGNAME`) +* Remove confusing high cpu load warning -Changes: -* Add ```doc/KEYS``` which contains the public key(s) used to sign UnrealIRCd releases -* The options set::anti-flood::unknown-flood-* have been renamed and -integrated in a new block called -[set::anti-flood::handshake-data-flood](https://www.unrealircd.org/docs/Set_block#set::anti-flood::handshake-data-flood). -The ban-action can now also be changed. Note that almost nobody will have to -change this setting since it has a good default. -* On *NIX bump the default maximum connections from 8192 to 16384. -That is, when in "auto" mode, which is like for 99% of the users. -Note that the system may still limit the actual number of connections -to a lower value, epending on the value of ```ulimit -n -H```. +Enhancements: +* Error on unknown snomask in set::snomask-on-oper and oper::snomask. +* TKL add/remove/expire messages now show `[duration: 60m]` instead of + the `[expires: ZZZ GMT]` string since that is what people are more + interested in and is not affected by time zones. The format in all the + 3 notices is also consistent now. -UnrealIRCd 5.0.8 +UnrealIRCd 6.0.0 ----------------- -The main purpose of this release is to enhance the -[reputation](https://www.unrealircd.org/docs/Reputation_score) -functionality. There have also been some other changes and minor -bug fixes. For more information, see below. - -Enhancements: -* Support for [security groups](https://www.unrealircd.org/docs/Security-group_block), - of which four groups always exist by default: known-users, unknown-users, - tls-users and tls-and-known-users. -* New extended ban ```~G:securitygroupname```. Typical usage would be - ```MODE #chan +b ~G:unknown-users``` which will ban all users from the - channel that are not identified to services and have a reputation - score below 25 (by default). The exact settings can be tweaked in the - [security group block](https://www.unrealircd.org/docs/Security-group_block). -* The reputation command (IRCOp-only) has been extended to make it - easier to look for potential troublemakers: - * ```REPUTATION Nick``` shows reputation about the nick name - * ```REPUTATION IP``` shows reputation about the IP address - * ```REPUTATION #channel``` lists users in channel with their reputation score - * ```REPUTATION chname` is `channel->name` now. +* get_channel() is now make_channel() and creates if needed, otherwise use find_channel() +* The Extended Ban API has been changed a lot. We use a `BanContext` struct now + that we pass around a lot. You also don't need to do `+3` magic anymore on the + string as it is handled in another layer. When registering the extended ban, + `.flag` is now `.letter`, and you also need to set a `.name` to a string due + to named extended bans. Have a look at the built-in extban modules to see + how to handle the changes. +* ModData now has an option `MODDATA_SYNC_EARLY`. See under *Server protocol*. +* If you want to lag someone up, don't touch `client->since`, but instead use: + `add_fake_lag(client, msec)` +* Some client/user struct changes, with `client->user->account` (instead of svid) + and `client->uplink->name` being the most important ones. +* Possibly more, but above is like 90%+ of the changes that you will encounter. Server protocol ---------------- -* UnrealIRCd 5 now assumes you support the following PROTOCTL options: - ```NOQUIT EAUTH SID NICKv2 SJOIN SJ3 NICKIP TKLEXT2```. - If you fail to use ```SID``` or ```EAUTH``` then you will receive an - error. For the other options, support is *assumed*, no warning or - error is shown when you lack support. These are options that most, - if not all, services support since UnrealIRCd 4.x so it shouldn't be - a problem. More information [here](https://www.unrealircd.org/docs/FAQ#old-server-protocol) -* ```PROTOCTL MTAGS``` indicates that the server is capable of handling - message tags and that the server can cope with 4K lines. (Note that - the ordinary non-message-tag part is still limited to 512 bytes). -* Pseudo ID support in SASL was removed. We now use real UID's. - This breaks services who rely on the old pseudo ID format. +* When multiple related `SJOIN` messages are generated for the same channel + then we now only send the current channel modes (eg `+sntk key`) in the + first SJOIN and not in the other ones as they are unneeded for the + immediate followup SJOINs, they waste unnecessary bytes and CPU. + Such messages may be generated when syncing a channel that has dozens + of users and/or bans/exempts/invexes. Ideally this should not need any + changes in other software, since we already supported such messages in the + past and code for handling it exists way back to 3.2.x, but you better + check to be sure! +* If you send `PROTOCTL NEXTBANS` then you will receive extended bans + with Named EXTended BANs instead of letters (eg: `+b ~account:xyz`), + otherwise you receive them with letters (eg: `+b ~a:xyz`). +* Some ModData of users is (also) communicated in the `UID` message while + syncing using a message tag that only appears in server-to-server traffic, + `s2s-md/moddataname=value`. Thus, data such as operinfo, tls cipher, + geoip, certfp, sasl and webirc is communicated at the same time as when + a remote connection is added. + This makes it that a "connecting from" server notice can include all this + information and also so code can make an immediate decission on what to do + with the user in hooks. ModData modules need to set + `mreq.sync = MODDATA_SYNC_EARLY;` if they want this. + Servers of course need to enable `MTAGS` in PROTOCTL to see this. +* The `SLOG` command is used to broadcast logging messages. This is done + for log::destination remote, as used in doc/conf/snomasks.default.conf, + for example for link errors, oper ups, flood messages, etc. + It also includes all JSON data in a message tag when `PROTOCTL MTAGS` is used. +* Bounced modes are gone: these were MODEs that started with a `&` which + servers were to act on with reversed logic (add becoming remove and + vice versa) and never to send something back to that server. + In practice this was almost never used and complicated the code (way) + too much. Client protocol ---------------- -* Support for message tags and other IRCv3 features. See the IRCv3 - specifications for more details. -* When a message is blocked, for whatever reason, we now use a generic - numeric response: ```:server 531 yourname targetname :reason``` for the block - This replaces all the various NOTICEs, ```ERR_NOCTCP```, ```ERR_NONONREG```, etc. - with just one single numeric. - The only other numerics that you may still encounter when PM'ing are - ```ERR_NOSUCHNICK```, ```ERR_TOOMANYTARGETS``` and ```ERR_TARGETTOOFAST```, which are - generic errors to any command involving targets. And ```ERR_SERVICESDOWN```. - Note that channel messages already had a generic numeric for signaling - blocked messages for a very long time, ```ERR_CANNOTSENDTOCHAN```. -* The 271 response to the SILENCE command is now: - ```:server 271 yournick listentry!*@*``` - Previously the nick name appeared twice, which was a mistake. -* The 470 numeric, which is sent on /JOIN #channel redirect to #redirect - now uses the following format: - ```:server 470 yournick #channel #redirect :[Link] Cannot join channel...etc..``` -* Clients are recommended to implement and enable the - [server-time](https://ircv3.net/specs/extensions/server-time-3.2) - extension by default. When enabled, channel history is played back - on-join (if any) when the channel has channel mode +H. - Otherwise your users will not see channel history. +* Extended bans now have names instead of letters. If a client sends the + old format with letters (eg `+b ~a:XYZ`) then the server will + convert it to the new format with names (eg: `+b ~account:XYZ`) +* Support for `MONITOR` and the other IRCv3 features (see *Enhancements*) diff --git a/doc/conf/badwords.conf b/doc/conf/badwords.conf index e11623e..56b5b7b 100644 --- a/doc/conf/badwords.conf +++ b/doc/conf/badwords.conf @@ -1,27 +1,44 @@ -badword channel { word "bitch"; replace "wombat"; } -badword channel { word "bro"; replace "bo"; } -badword channel { word "(brother)"; replace "bredda"; } -badword channel { word "car"; replace "taxi"; } -badword channel { word "discord"; replace "dicsord"; } -badword channel { word "efnet"; replace "efrael"; } -badword channel { word "hate"; replace "04 hate "; } -badword channel { word "hello"; replace "smello"; } -badword channel { word "house"; replace "flat"; } -badword channel { word "gaming"; replace "gaymen"; } -badword channel { word "im"; replace "m"; } -badword channel { word "i'm"; replace "m"; } -badword channel { word "i am"; replace "m"; } -badword channel { word "ima"; replace "m"; } -badword channel { word "my"; replace "me"; } -badword channel { word "(nigger)"; replace "angel"; } -badword channel { word "np"; replace "mp"; } -badword channel { word "on"; replace "pon"; } -badword channel { word "same"; replace "salami"; } -badword channel { word "(skyp)"; replace "skik"; } -badword channel { word "(ss)"; replace "ϟϟ"; } -badword channel { word "(troll)"; replace "papillion"; } -badword channel { word "uber"; replace "HELLS ANGELS"; } -badword channel { word "(year)"; replace "yonk"; } +badword channel { word "apartment"; replace "flat"; } +badword channel { word "banana"; replace "bogoya"; } +badword channel { word "bitch"; replace "wombat"; } +badword channel { word "bro"; replace "bo"; } +badword channel { word "(brother)"; replace "bredda"; } +badword channel { word "bruh"; replace "bredda"; } +badword channel { word "car"; replace "taxi"; } +badword channel { word "cool"; replace "safe"; } +badword channel { word "drunk"; replace "buck"; } +badword channel { word "dude"; replace "blud"; } +badword channel { word "discord"; replace "dicksword"; } +badword channel { word "elaborate"; replace "ebloggerate"; } +badword channel { word "efnet"; replace "efrael"; } +badword channel { word "fuckin"; replace "blood clot"; } +badword channel { word "fucking"; replace "blood clot"; } +badword channel { word "fuckn"; replace "blood clot"; } +badword channel { word "hate"; replace "04 hate "; } +badword channel { word "hello"; replace "smello"; } +badword channel { word "high"; replace "HIE"; } +badword channel { word "home"; replace "flat"; } +badword channel { word "house"; replace "flat"; } +badword channel { word "gaming"; replace "gaymen"; } +badword channel { word "im"; replace "m"; } +badword channel { word "i'm"; replace "m"; } +badword channel { word "i am"; replace "m"; } +badword channel { word "ima"; replace "m"; } +badword channel { word "jfc"; replace "bloody hell"; } +badword channel { word "my"; replace "me"; } +badword channel { word "nice"; replace "safe"; } +badword channel { word "(nigger)"; replace "angel"; } +badword channel { word "np"; replace "mp"; } +badword channel { word "on"; replace "pon"; } +badword channel { word "same"; replace "salami"; } +badword channel { word "shitfaced"; replace "buck"; } +badword channel { word "shit faced"; replace "buck"; } +badword channel { word "shoes"; replace "kicks"; } +badword channel { word "(skyp)"; replace "skik"; } +badword channel { word "(ss)"; replace "ϟϟ"; } +badword channel { word "(troll)"; replace "papillion"; } +badword channel { word "uber"; replace "HELLS ANGELS"; } +badword channel { word "(year)"; replace "yonk"; } badword channel { word "sup"; replace "wah gwaan"; } badword channel { word "wussup"; replace "wah gwaan"; } @@ -33,15 +50,18 @@ badword channel { word "what's up"; replace "wah gwaan"; } badword channel { word "wuddup"; replace "wah gwaan"; } badword channel { word "gal"; replace "bint"; } +badword channel { word "gf"; replace "bint"; } badword channel { word "(girl)"; replace "bint"; } badword channel { word "lady"; replace "bint"; } badword channel { word "ladies"; replace "bints"; } badword channel { word "(woman)"; replace "bint"; } +badword channel { word "wife"; replace "bint"; } badword channel { word "women"; replace "bints"; } badword channel { word "ganja"; replace "bobby brown"; } badword channel { word "marijuana"; replace "bobby brown"; } badword channel { word "pot"; replace "bobby brown"; } +badword channel { word "reefer"; replace "bobby brown"; } badword channel { word "weed"; replace "bobby brown"; } badword channel { word "kek"; replace "%%"; } diff --git a/doc/conf/except.conf b/doc/conf/except.conf index 5f6c0f6..18fa552 100644 --- a/doc/conf/except.conf +++ b/doc/conf/except.conf @@ -1,28 +1,34 @@ # IRCCloud -except ban { mask *@5.254.36.56/29; } -except ban { mask *@192.184.9.108/32; } -except ban { mask *@192.184.9.112/32; } -except ban { mask *@192.184.10.118/32; } -except ban { mask *@192.184.10.9/32; } -except ban { mask *@192.184.8.103/32; } -except ban { mask *@2001:67c:2f08::/48; } -except ban { mask *@2a03:5180:f::/62; } -except ban { mask *@2a03:5180:f:4::/63; } -except ban { mask *@2a03:5180:f:6::/64; } +except ban { + mask *@5.254.36.56/29; + mask *@192.184.9.108/32; + mask *@192.184.9.112/32; + mask *@192.184.10.118/32; + mask *@192.184.10.9/32; + mask *@192.184.8.103/32; + mask *@2001:67c:2f08::/48; + mask *@2a03:5180:f::/62; + mask *@2a03:5180:f:4::/63; + mask *@2a03:5180:f:6::/64; +} # KiwiIRC -except ban { mask *@107.161.19.53; } -except ban { mask *@107.161.19.109; } -except ban { mask *@109.169.31.4; } -except ban { mask *@109.169.31.13; } # KiwiIRC Verify Bot (out.kiwiirc.com) +except ban { + mask *@107.161.19.53; + mask *@107.161.19.109; + mask *@109.169.31.4; + mask *@109.169.31.13; # KiwiIRC Verify Bot (out.kiwiirc.com) +} # Mibbit -except ban { mask *@207.192.75.252; } # ircip1.mibbit.com -except ban { mask *@64.62.228.82; } # ircip2.mibbit.com -except ban { mask *@78.129.202.38; } # ircip3.mibbit.com -except ban { mask *@109.169.29.95; } # ircip4.mibbit.com -except ban { mask *@97.107.138.109; } # bot.search.mibbit.com -except ban { mask *@2600:3c03::f03c:91ff:fe96:c1fa; } # bot.search.mibbit.com +except ban { + mask *@207.192.75.252; # ircip1.mibbit.com + mask *@64.62.228.82; # ircip2.mibbit.com + mask *@78.129.202.38; # ircip3.mibbit.com + mask *@109.169.29.95; # ircip4.mibbit.com + mask *@97.107.138.109; # bot.search.mibbit.com + mask *@2600:3c03::f03c:91ff:fe96:c1fa; # bot.search.mibbit.com +} # Netsplit -except ban { mask *@85.25.10.40; } # anaconda.netsplit.de \ No newline at end of file +except ban { mask *@85.25.10.40; } # anaconda.netsplit.de \ No newline at end of file diff --git a/doc/conf/modules.conf b/doc/conf/modules.conf index f1831d2..9cbe21b 100644 --- a/doc/conf/modules.conf +++ b/doc/conf/modules.conf @@ -1,5 +1,5 @@ // Cloaking (+x) -loadmodule "cloak"; +loadmodule "cloak_sha256"; // User Commands (Minimal) #loadmodule "admin"; @@ -63,6 +63,7 @@ loadmodule "kill"; #loadmodule "locops"; loadmodule "mkpasswd"; loadmodule "oper"; +loadmodule "operinfo"; #loadmodule "opermotd"; loadmodule "sajoin"; loadmodule "samode"; @@ -76,7 +77,6 @@ loadmodule "tkl"; loadmodule "trace"; loadmodule "tsctl"; loadmodule "unsqline"; -#loadmodule "wallops"; // Server-2-Server Commands loadmodule "eos"; @@ -86,9 +86,11 @@ loadmodule "netinfo"; loadmodule "server"; loadmodule "sinfo"; loadmodule "sjoin"; +loadmodule "slog"; loadmodule "sqline"; loadmodule "swhois"; loadmodule "umode2"; +loadmodule "unreal_server_compat"; // Services Commands loadmodule "sendsno"; @@ -108,25 +110,39 @@ loadmodule "svssno"; loadmodule "svswatch"; // Channel Modes -loadmodule "chanmodes/censor"; /* +G */ -loadmodule "chanmodes/delayjoin"; /* +D */ -loadmodule "chanmodes/floodprot"; /* +f */ -loadmodule "chanmodes/history"; /* +H */ -loadmodule "chanmodes/issecure"; /* +Z */ -loadmodule "chanmodes/link"; /* +L */ -loadmodule "chanmodes/nocolor"; /* +c */ -loadmodule "chanmodes/noctcp"; /* +C */ -loadmodule "chanmodes/noinvite"; /* +V */ -loadmodule "chanmodes/nokick"; /* +Q */ -loadmodule "chanmodes/noknock"; /* +K */ -loadmodule "chanmodes/nonickchange"; /* +N */ -loadmodule "chanmodes/nonotice"; /* +T */ -loadmodule "chanmodes/operonly"; /* +O */ -loadmodule "chanmodes/permanent"; /* +P */ -loadmodule "chanmodes/regonly"; /* +R */ -loadmodule "chanmodes/regonlyspeak"; /* +M */ -loadmodule "chanmodes/secureonly"; /* +z */ -loadmodule "chanmodes/stripcolor"; /* +S */ +loadmodule "chanmodes/chanowner"; /* +q */ +loadmodule "chanmodes/chanadmin"; /* +a */ +loadmodule "chanmodes/chanop"; /* +o */ +loadmodule "chanmodes/halfop"; /* +h */ +loadmodule "chanmodes/voice"; /* +v */ +loadmodule "chanmodes/censor"; /* +G */ +loadmodule "chanmodes/delayjoin"; /* +D */ +loadmodule "chanmodes/floodprot"; /* +f */ +loadmodule "chanmodes/history"; /* +H */ +loadmodule "chanmodes/inviteonly"; /* +i */ +loadmodule "chanmodes/isregistered"; /* +r */ +loadmodule "chanmodes/issecure"; /* +Z */ +loadmodule "chanmodes/key"; /* +k */ +loadmodule "chanmodes/limit"; /* +l */ +loadmodule "chanmodes/link"; /* +L */ +loadmodule "chanmodes/moderated"; /* +m */ +loadmodule "chanmodes/nocolor"; /* +c */ +loadmodule "chanmodes/noctcp"; /* +C */ +loadmodule "chanmodes/noexternalmsgs"; /* +n */ +loadmodule "chanmodes/noinvite"; /* +V */ +loadmodule "chanmodes/nokick"; /* +Q */ +loadmodule "chanmodes/noknock"; /* +K */ +loadmodule "chanmodes/nonickchange"; /* +N */ +loadmodule "chanmodes/nonotice"; /* +T */ +loadmodule "chanmodes/operonly"; /* +O */ +loadmodule "chanmodes/permanent"; /* +P */ +loadmodule "chanmodes/private"; /* +p */ +loadmodule "chanmodes/regonly"; /* +R */ +loadmodule "chanmodes/regonlyspeak"; /* +M */ +loadmodule "chanmodes/secret"; /* +s */ +loadmodule "chanmodes/secureonly"; /* +z */ +loadmodule "chanmodes/stripcolor"; /* +S */ +loadmodule "chanmodes/topiclimit"; /* +t */ // User Modes loadmodule "usermodes/bot"; /* +B */ @@ -139,24 +155,23 @@ loadmodule "usermodes/regonlymsg"; /* +R */ loadmodule "usermodes/secureonlymsg"; /* +Z */ loadmodule "usermodes/servicebot"; /* +S */ #loadmodule "usermodes/showwhois"; /* +W */ - -// Snomasks -#loadmodule "snomasks/dccreject"; /* +D */ +#loadmodule "usermodes/wallops"; /* +w */ // Extended Bans -loadmodule "extbans/account"; /* +b ~a */ -#loadmodule "extbans/certfp"; /* +b ~S */ -#loadmodule "extbans/inchannel"; /* +b ~c */ -loadmodule "extbans/join"; /* +b ~j */ -loadmodule "extbans/msgbypass"; /* +e ~m */ -#loadmodule "extbans/nickchange"; /* +b ~n */ -#loadmodule "extbans/operclass"; /* +b ~O */ -#loadmodule "extbans/partmsg"; /* +b ~p */ -loadmodule "extbans/quiet"; /* +b ~q */ -#loadmodule "extbans/realname"; /* +b ~r */ -#loadmodule "extbans/textban"; /* +b ~T */ -loadmodule "extbans/timedban"; /* +b ~t */ -loadmodule "extbans/securitygroup"; /* +b ~G */ +loadmodule "extbans/account"; /* +b ~account */ +loadmodule "extbans/certfp"; /* +b ~certfp */ +#loadmodule "extbans/country"; /* +b ~country */ +loadmodule "extbans/inchannel"; /* +b ~channel */ +loadmodule "extbans/join"; /* +b ~join */ +loadmodule "extbans/msgbypass"; /* +e ~msgbypass */ +#loadmodule "extbans/nickchange"; /* +b ~nickchange */ +#loadmodule "extbans/operclass"; /* +b ~operclass */ +#loadmodule "extbans/partmsg"; /* +b ~partmsg */ +loadmodule "extbans/quiet"; /* +b ~quiet */ +#loadmodule "extbans/realname"; /* +b ~realname */ +loadmodule "extbans/textban"; /* +b ~text */ +loadmodule "extbans/timedban"; /* +b ~time */ +loadmodule "extbans/securitygroup"; /* +b ~security-group */ // IRCv3 Extensions loadmodule "account-notify"; @@ -166,10 +181,12 @@ loadmodule "bot-tag"; loadmodule "chathistory"; loadmodule "clienttagdeny"; loadmodule "echo-message"; +loadmodule "extended-monitor"; loadmodule "labeled-response"; loadmodule "link-security"; loadmodule "message-ids"; loadmodule "message-tags"; +loadmodule "monitor"; loadmodule "plaintext-policy"; loadmodule "reply-tag"; loadmodule "server-time"; @@ -178,24 +195,29 @@ loadmodule "typing-indicator"; // Other loadmodule "antimixedutf8"; -loadmodule "authprompt"; +#loadmodule "authprompt"; loadmodule "blacklist"; loadmodule "certfp"; loadmodule "channeldb"; loadmodule "charsys"; loadmodule "connthrottle"; +#loadmodule "geoip_base"; +#loadmodule "geoip_classic"; loadmodule "hideserver"; loadmodule "history_backend_mem"; #loadmodule "history_backend_null"; loadmodule "ident_lookup"; loadmodule "jointhrottle"; +loadmodule "json-log-tag"; loadmodule "targetfloodprot"; loadmodule "tkldb"; loadmodule "tls_antidos"; +loadmodule "tls_cipher"; loadmodule "userhost-tag"; loadmodule "userip-tag"; loadmodule "reputation"; loadmodule "restrict-commands"; loadmodule "rmtkl"; +loadmodule "watch-backend"; #loadmodule "webirc"; #loadmodule "websocket"; \ No newline at end of file diff --git a/doc/conf/snomasks.conf b/doc/conf/snomasks.conf new file mode 100644 index 0000000..5872ccc --- /dev/null +++ b/doc/conf/snomasks.conf @@ -0,0 +1,228 @@ +/* Server bans snomask - 'b' */ +log { + source { + tkl.BAN_REALNAME; + tkl.TKL_ADD; + tkl.TKL_DEL; + tkl.TKL_ADD_TEMPSHUN; + tkl.TKL_DEL_TEMPSHUN; + tkl.TKL_EXPIRE; + tkl.RMTKL_COMMAND; + } + destination { + snomask b; + } +} + +/* Blacklist snomask: 'B' */ +log { + source { + blacklist; + } + destination { + snomask B; + } +} + +/* Local client connects snomask - 'c' */ +log { + source { + connect.LOCAL_CLIENT_CONNECT; + connect.LOCAL_CLIENT_DISCONNECT; + } + destination { + snomask c; + } +} + +/* Remote client connects snomask - 'C' */ +log { + source { + connect.REMOTE_CLIENT_CONNECT; + connect.REMOTE_CLIENT_DISCONNECT; + } + destination { + snomask C; + } +} + +/* DCC rejections snomask - 'd' */ +log { + source { + dcc; + } + destination { + snomask d; + } +} + +/* Debug snomask (not recommended) - 'D' */ +log { + source { + debug; + } + destination { + snomask D; + } +} + +/* Floods snomask - 'f' */ +log { + source { + flood; + } + destination { + snomask f; + } +} + +/* Join, parts, kicks - 'j' */ +log { + source { + // TODO: these don't exist yet.. + join.LOCAL_CLIENT_JOIN; + join.REMOTE_CLIENT_JOIN; + part.LOCAL_CLIENT_PART; + part.REMOTE_CLIENT_PART; + kick.LOCAL_CLIENT_KICK; + kick.REMOTE_CLIENT_KICK; + } + destination { + snomask j; + } +} + +/* Kill snomask */ +log { + source { + kill; + } + destination { + snomask k; + } +} + +/* Local nick changes snomask - 'n' */ +log { + source { + nick.LOCAL_NICK_CHANGE; + } + destination { + snomask n; + } +} + +/* Remote nick changes snomask - 'N' */ +log { + source { + nick.REMOTE_NICK_CHANGE; + } + destination { + snomask N; + } +} + +/* Deny nick (QLINE) rejections snomask - 'q' */ +log { + source { + nick.QLINE_NICK_LOCAL_ATTEMPT; + nick.QLINE_NICK_REMOTE; + } + destination { + snomask q; + } +} + +/* Spamfilter hits snomask - 'S' */ +log { + source { + tkl.SPAMFILTER_MATCH; + } + destination { + snomask S; + } +} + +/* IRCOp overriding in channels (OperOverride) - 'o' */ +log { + source { + operoverride; + } + destination { + snomask o; + } +} + +/* IRCOp changing user properties or forcing users to do things - 'O' */ +log { + source { + chgcmds; + sacmds; + } + destination { + snomask O; + } +} + +/* VHOST usage - 'v' */ +log { + source { + vhost; + } + destination { + snomask v; + } +} + +/* Snomask s (server notices) - the "catch all" snomask for all other things */ +log { + source { + link; + oper; + !debug; + nomatch; + } + destination { + snomask s; + } +} + +/* These log sources are sent to all servers (globally). + * These are generally two categories: + * 1) Things that affect the network as a whole, eg linking + * 2) Things that otherwise cannot be logged by a remote server + * that may interest ircops. Eg: a spamfilter match, + * since that would otherwise not be propagated. + */ +log { + source { + /* All link messages affect the network so + * these should be global. Except for the + * link connecting... and timeout while + * connecting.. messages, which can be noisy. + */ + link; + !link.LINK_CONNECTING; + !link.LINK_CONNECT_TIMEOUT; + !link.SERVER_LINKED_REMOTE; + !link.SERVER_LINKED; + /* All oper up/downs */ + oper; + /* Flood messages, important to keep an eye on, network-wide */ + flood; + /* TEMPSHUN: these are otherwise missing for snomask 'b' */ + tkl.TKL_ADD_TEMPSHUN; + tkl.TKL_DEL_TEMPSHUN; + /* Spamfilter matches: needed for snomask 'S' */ + tkl.SPAMFILTER_MATCH; + /* Critical issue: */ + tls.TLS_CERT_EXPIRING; + /* SAMODE: needed for snomask 'o' */ + samode.SAMODE_COMMAND; + /* Never any debug messages */ + !debug; + } + destination { + remote; + } +} diff --git a/doc/conf/tls/curl-ca-bundle.crt b/doc/conf/tls/curl-ca-bundle.crt index 3c79c59..0bf312f 100644 --- a/doc/conf/tls/curl-ca-bundle.crt +++ b/doc/conf/tls/curl-ca-bundle.crt @@ -1,7 +1,7 @@ ## ## Bundle of CA Root Certificates ## -## Certificate data from Mozilla as of: Tue Jan 19 04:12:04 2021 GMT +## Certificate data from Mozilla as of: Tue Oct 26 03:12:05 2021 GMT ## ## This is a bundle of X.509 certificates of public Certificate Authorities ## (CA). These were automatically extracted from Mozilla's root certificates @@ -14,7 +14,7 @@ ## Just configure this file as the SSLCACertificateFile. ## ## Conversion done with mk-ca-bundle.pl version 1.28. -## SHA256: 3bdc63d1de27058fec943a999a2a8a01fcc6806a611b19221a7727d3d9bbbdfd +## SHA256: bb36818a81feaa4cca61101e6d6276cd09e972efcb08112dfed846918ca41d7f ## @@ -156,38 +156,6 @@ Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z 12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== -----END CERTIFICATE----- -QuoVadis Root CA -================ ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE -ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz -MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp -cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD -EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk -J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL -F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL -YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen -AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w -PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y -ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 -MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj -YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs -ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW -Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu -BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw -FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 -tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo -fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul -LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x -gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi -5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi -5nrQNiOKSnQ2+Q== ------END CERTIFICATE----- - QuoVadis Root CA 2 ================== -----BEGIN CERTIFICATE----- @@ -275,26 +243,6 @@ s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ FL39vmwLAw== -----END CERTIFICATE----- -Sonera Class 2 Root CA -====================== ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG -U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw -NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh -IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 -/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT -dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG -f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P -tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH -nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT -XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt -0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI -cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph -Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx -EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH -llpwrN9M ------END CERTIFICATE----- - XRamp Global CA Root ==================== -----BEGIN CERTIFICATE----- @@ -433,26 +381,6 @@ mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K -----END CERTIFICATE----- -DST Root CA X3 -============== ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK -ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X -DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 -cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT -rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 -UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy -xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d -utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ -MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug -dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE -GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw -RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS -fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- - SwissSign Gold CA - G2 ====================== -----BEGIN CERTIFICATE----- @@ -718,51 +646,6 @@ vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD -----END CERTIFICATE----- -GeoTrust Primary Certification Authority - G2 -============================================= ------BEGIN CERTIFICATE----- -MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu -Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 -OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg -MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl -b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG -BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc -KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ -EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m -ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 -npaqBA+K ------END CERTIFICATE----- - -VeriSign Universal Root Certification Authority -=============================================== ------BEGIN CERTIFICATE----- -MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO -ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk -IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u -IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj -1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP -MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 -9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I -AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR -tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G -CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O -a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud -DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 -Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx -Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx -P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P -wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 -mJO37M2CYfE45k+XmCpajQ== ------END CERTIFICATE----- - NetLock Arany (Class Gold) Főtanúsítvány ======================================== -----BEGIN CERTIFICATE----- @@ -938,82 +821,6 @@ Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== -----END CERTIFICATE----- -Chambers of Commerce Root - 2008 -================================ ------BEGIN CERTIFICATE----- -MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD -MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv -bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu -QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy -Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl -ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF -EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl -cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA -XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj -h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ -ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk -NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g -D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 -lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ -0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj -ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 -EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI -G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ -BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh -bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh -bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC -CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH -AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 -wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH -3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU -RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 -M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 -YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF -9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK -zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG -nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg -OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ ------END CERTIFICATE----- - -Global Chambersign Root - 2008 -============================== ------BEGIN CERTIFICATE----- -MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD -MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv -bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu -QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx -NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg -Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ -QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD -aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf -VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf -XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 -ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB -/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA -TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M -H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe -Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF -HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh -wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB -AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT -BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE -BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm -aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm -aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp -1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 -dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG -/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 -ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s -dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg -9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH -foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du -qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr -P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq -c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z -09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B ------END CERTIFICATE----- - Go Daddy Root Certificate Authority - G2 ======================================== -----BEGIN CERTIFICATE----- @@ -1315,27 +1122,6 @@ OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== -----END CERTIFICATE----- -Trustis FPS Root CA -=================== ------BEGIN CERTIFICATE----- -MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG -EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 -IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV -BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ -RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk -H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa -cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt -o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA -AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd -BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c -GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC -yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P -8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV -l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl -iB6XzCGcKQENZetX2fNXlrtIzYE= ------END CERTIFICATE----- - Buypass Class 2 Root CA ======================= -----BEGIN CERTIFICATE----- @@ -1980,36 +1766,6 @@ uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 -----END CERTIFICATE----- -Staat der Nederlanden Root CA - G3 -================================== ------BEGIN CERTIFICATE----- -MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE -CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g -Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC -TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l -ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y -olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t -x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy -EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K -Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur -mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5 -1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp -07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo -FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE -41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB -AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu -yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD -U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq -KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1 -v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA -8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b -8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r -mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq -1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI -JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV -tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk= ------END CERTIFICATE----- - Staat der Nederlanden EV Root CA ================================ -----BEGIN CERTIFICATE----- @@ -3226,3 +2982,251 @@ qqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oG I/hGoiLtk/bdmuYqh7GYVPEi92tF4+KOdh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmg kpzNNIaRkPpkUZ3+/uul9XXeifdy -----END CERTIFICATE----- + +AC RAIZ FNMT-RCM SERVIDORES SEGUROS +=================================== +-----BEGIN CERTIFICATE----- +MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQswCQYDVQQGEwJF +UzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgwFgYDVQRhDA9WQVRFUy1RMjgy +NjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1SQ00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4 +MTIyMDA5MzczM1oXDTQzMTIyMDA5MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQt +UkNNMQ4wDAYDVQQLDAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNB +QyBSQUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuBBAAiA2IA +BPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LHsbI6GA60XYyzZl2hNPk2 +LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oKUm8BA06Oi6NCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqG +SM49BAMDA2kAMGYCMQCuSuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoD +zBOQn5ICMQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJyv+c= +-----END CERTIFICATE----- + +GlobalSign Root R46 +=================== +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUAMEYxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJv +b3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAX +BgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08Es +CVeJOaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQGvGIFAha/ +r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud316HCkD7rRlr+/fKYIje +2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo0q3v84RLHIf8E6M6cqJaESvWJ3En7YEt +bWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSEy132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvj +K8Cd+RTyG/FWaha/LIWFzXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD4 +12lPFzYE+cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCNI/on +ccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzsx2sZy/N78CsHpdls +eVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqaByFrgY/bxFn63iLABJzjqls2k+g9 +vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEM +BQADggIBAHx47PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg +JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti2kM3S+LGteWy +gxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIkpnnpHs6i58FZFZ8d4kuaPp92 +CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRFFRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZm +OUdkLG5NrmJ7v2B0GbhWrJKsFjLtrWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qq +JZ4d16GLuc1CLgSkZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwye +qiv5u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP4vkYxboz +nxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6N3ec592kD3ZDZopD8p/7 +DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3vouXsXgxT7PntgMTzlSdriVZzH81Xwj3 +QEUxeCp6 +-----END CERTIFICATE----- + +GlobalSign Root E46 +=================== +-----BEGIN CERTIFICATE----- +MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYxCzAJBgNVBAYT +AkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJvb3Qg +RTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNV +BAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkB +jtjqR+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGddyXqBPCCj +QjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQxCpCPtsad0kRL +gLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZk +vLtoURMMA/cVi4RguYv/Uo7njLwcAjA8+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+ +CAezNIm8BZ/3Hobui3A= +-----END CERTIFICATE----- + +GLOBALTRUST 2020 +================ +-----BEGIN CERTIFICATE----- +MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkGA1UEBhMCQVQx +IzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVT +VCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYxMDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAh +BgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAy +MDIwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWi +D59bRatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9ZYybNpyrO +VPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3QWPKzv9pj2gOlTblzLmM +CcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPwyJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCm +fecqQjuCgGOlYx8ZzHyyZqjC0203b+J+BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKA +A1GqtH6qRNdDYfOiaxaJSaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9OR +JitHHmkHr96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj04KlG +DfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9MedKZssCz3AwyIDMvU +clOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIwq7ejMZdnrY8XD2zHc+0klGvIg5rQ +mjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1Ud +IwQYMBaAFNwuH9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA +VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJCXtzoRlgHNQIw +4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd6IwPS3BD0IL/qMy/pJTAvoe9 +iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf+I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS +8cE54+X1+NZK3TTN+2/BT+MAi1bikvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2 +HcqtbepBEX4tdJP7wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxS +vTOBTI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6CMUO+1918 +oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn4rnvyOL2NSl6dPrFf4IF +YqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+IaFvowdlxfv1k7/9nR4hYJS8+hge9+6jl +gqispdNpQ80xiEmEU5LAsTkbOYMBMMTyqfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg== +-----END CERTIFICATE----- + +ANF Secure Server Root CA +========================= +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Certum EC-384 CA +================ +-----BEGIN CERTIFICATE----- +MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQswCQYDVQQGEwJQ +TDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2 +MDcyNDU0WhcNNDMwMzI2MDcyNDU0WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERh +dGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx +GTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATEKI6rGFtq +vm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7TmFy8as10CW4kjPMIRBSqn +iBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68KjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFI0GZnQkdjrzife81r1HfS+8EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNo +ADBlAjADVS2m5hjEfO/JUG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0 +QoSZ/6vnnvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k= +-----END CERTIFICATE----- + +Certum Trusted Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIFwDCCA6igAwIBAgIQHr9ZULjJgDdMBvfrVU+17TANBgkqhkiG9w0BAQ0FADB6MQswCQYDVQQG +EwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0g +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0Ew +HhcNMTgwMzE2MTIxMDEzWhcNNDMwMzE2MTIxMDEzWjB6MQswCQYDVQQGEwJQTDEhMB8GA1UEChMY +QXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQDRLY67tzbqbTeRn06TpwXkKQMlzhyC93yZn0EGze2jusDbCSzBfN8p +fktlL5On1AFrAygYo9idBcEq2EXxkd7fO9CAAozPOA/qp1x4EaTByIVcJdPTsuclzxFUl6s1wB52 +HO8AU5853BSlLCIls3Jy/I2z5T4IHhQqNwuIPMqw9MjCoa68wb4pZ1Xi/K1ZXP69VyywkI3C7Te2 +fJmItdUDmj0VDT06qKhF8JVOJVkdzZhpu9PMMsmN74H+rX2Ju7pgE8pllWeg8xn2A1bUatMn4qGt +g/BKEiJ3HAVz4hlxQsDsdUaakFjgao4rpUYwBI4Zshfjvqm6f1bxJAPXsiEodg42MEx51UGamqi4 +NboMOvJEGyCI98Ul1z3G4z5D3Yf+xOr1Uz5MZf87Sst4WmsXXw3Hw09Omiqi7VdNIuJGmj8PkTQk +fVXjjJU30xrwCSss0smNtA0Aq2cpKNgB9RkEth2+dv5yXMSFytKAQd8FqKPVhJBPC/PgP5sZ0jeJ +P/J7UhyM9uH3PAeXjA6iWYEMspA90+NZRu0PqafegGtaqge2Gcu8V/OXIXoMsSt0Puvap2ctTMSY +njYJdmZm/Bo/6khUHL4wvYBQv3y1zgD2DGHZ5yQD4OMBgQ692IU0iL2yNqh7XAjlRICMb/gv1SHK +HRzQ+8S1h9E6Tsd2tTVItQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSM+xx1 +vALTn04uSNn5YFSqxLNP+jAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQADggIBAEii1QAL +LtA/vBzVtVRJHlpr9OTy4EA34MwUe7nJ+jW1dReTagVphZzNTxl4WxmB82M+w85bj/UvXgF2Ez8s +ALnNllI5SW0ETsXpD4YN4fqzX4IS8TrOZgYkNCvozMrnadyHncI013nR03e4qllY/p0m+jiGPp2K +h2RX5Rc64vmNueMzeMGQ2Ljdt4NR5MTMI9UGfOZR0800McD2RrsLrfw9EAUqO0qRJe6M1ISHgCq8 +CYyqOhNf6DR5UMEQGfnTKB7U0VEwKbOukGfWHwpjscWpxkIxYxeU72nLL/qMFH3EQxiJ2fAyQOaA +4kZf5ePBAFmo+eggvIksDkc0C+pXwlM2/KfUrzHN/gLldfq5Jwn58/U7yn2fqSLLiMmq0Uc9Nneo +WWRrJ8/vJ8HjJLWG965+Mk2weWjROeiQWMODvA8s1pfrzgzhIMfatz7DP78v3DSk+yshzWePS/Tj +6tQ/50+6uaWTRRxmHyH6ZF5v4HaUMst19W7l9o/HuKTMqJZ9ZPskWkoDbGs4xugDQ5r3V7mzKWmT +OPQD8rv7gmsHINFSH5pkAnuYZttcTVoP0ISVoDwUQwbKytu4QTbaakRnh6+v40URFWkIsr4WOZck +bxJF0WddCajJFdr60qZfE2Efv4WstK2tBZQIgx51F9NxO5NQI1mg7TyRVJ12AMXDuDjb +-----END CERTIFICATE----- + +TunTrust Root CA +================ +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +HARICA TLS RSA Root CA 2021 +=========================== +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBsMQswCQYDVQQG +EwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u +cyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0EgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUz +OFoXDTQ1MDIxMzEwNTUzN1owbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRl +bWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNB +IFJvb3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569lmwVnlskN +JLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE4VGC/6zStGndLuwRo0Xu +a2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uva9of08WRiFukiZLRgeaMOVig1mlDqa2Y +Ulhu2wr7a89o+uOkXjpFc5gH6l8Cct4MpbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K +5FrZx40d/JiZ+yykgmvwKh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEv +dmn8kN3bLW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcYAuUR +0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqBAGMUuTNe3QvboEUH +GjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYqE613TBoYm5EPWNgGVMWX+Ko/IIqm +haZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHrW2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQ +CPxrvrNQKlr9qEgYRtaQQJKQCoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAUX15QvWiWkKQU +EapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3f5Z2EMVGpdAgS1D0NTsY9FVq +QRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxajaH6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxD +QpSbIPDRzbLrLFPCU3hKTwSUQZqPJzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcR +j88YxeMn/ibvBZ3PzzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5 +vZStjBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0/L5H9MG0 +qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pTBGIBnfHAT+7hOtSLIBD6 +Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79aPib8qXPMThcFarmlwDB31qlpzmq6YR/ +PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YWxw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnn +kf3/W9b3raYvAwtt41dU63ZTGI0RmLo= +-----END CERTIFICATE----- + +HARICA TLS ECC Root CA 2021 +=========================== +-----BEGIN CERTIFICATE----- +MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQswCQYDVQQGEwJH +UjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBD +QTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoX +DTQ1MDIxMzExMDEwOVowbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWlj +IGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJv +b3QgQ0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7KKrxcm1l +AEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9YSTHMmE5gEYd103KUkE+b +ECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW +0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAi +rcJRQO9gcS3ujwLEXQNwSaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/Qw +CZ61IygNnxS2PFOiTAZpffpskcYqSUXm7LcT4Tps +-----END CERTIFICATE----- diff --git a/doc/conf/unrealircd.hub.conf b/doc/conf/unrealircd.hub.conf index b55d85e..1e11620 100644 --- a/doc/conf/unrealircd.hub.conf +++ b/doc/conf/unrealircd.hub.conf @@ -16,9 +16,10 @@ link services.supernets.org { class servers; } -log "ircd.log" { flags { errors; } maxsize 1K; } - -except ban { mask *@127.0.0.1; } +log { + source { error; fatal; warn; } + destination { file "ircd.log" { maxsize 10M; } } +} ulines { services.supernets.org; } diff --git a/doc/conf/unrealircd.remote.conf b/doc/conf/unrealircd.remote.conf index 3091611..80b1a05 100644 --- a/doc/conf/unrealircd.remote.conf +++ b/doc/conf/unrealircd.remote.conf @@ -14,8 +14,8 @@ alias os { target operserv; type services; } class clients { pingfreq 120; maxclients 100; sendq 1M; options { nofakelag; } } class servers { pingfreq 120; maxclients 10; sendq 1M; connfreq 30; } -allow { ip *; class clients; maxperip 2; global-maxperip 2; } -allow { ip 127.0.0.1; class clients; maxperip 10; global-maxperip 10; } +allow { mask *; class clients; maxperip 2; global-maxperip 2; } +allow { mask 127.0.0.1; class clients; maxperip 10; global-maxperip 10; } #require authentication { # mask *@*; @@ -26,9 +26,10 @@ listen { ip *; port 6667; options { clientsonly; } } listen { ip *; port 6697; options { clientsonly; tls; } } listen { ip *; port REDACTED; options { serversonly; tls; } } -deny channel { channel "#pumpcoin"; reason "This channel has moved to #exchange"; redirect "#exchange"; } deny channel { channel "#dev"; reason "This channel has moved to #superbowl"; redirect "#superbowl"; } deny channel { channel "#help"; reason "This channel has moved to #superbowl"; redirect "#superbowl"; } +deny channel { channel "#mensa"; reason "This channel has been closed"; redirect "#superbowl"; } +deny channel { channel "#pumpcoin"; reason "This channel has moved to #exchange"; redirect "#exchange"; } link irc.supernets.org { incoming { mask REDACTED; } @@ -42,7 +43,15 @@ link irc.supernets.org { class servers; } -log "errors.log" { flags { errors; } maxsize 10K; } +log { + source { error; fatal; warn; } + destination { file "ircd.log" { maxsize 10M; } } +} + +log { + source { all; } + destination { channel "#REDACTED" } +} tld { mask *@*; motd remote.motd; rules remote.motd; options { remote; } } @@ -81,39 +90,28 @@ blacklist torbl { reason "8,4 E N T E R T H E V O I D "; } -webirc { mask 107.161.19.53; password "REDACTED"; } # KiwiIRC -webirc { mask 107.161.19.109; password "REDACTED"; } -webirc { mask 107.161.31.4; password "REDACTED"; } - -webirc { mask 207.192.75.252; password "REDACTED"; } # Mibbit -webirc { mask 64.62.228.82; password "REDACTED"; } -webirc { mask 78.129.202.38; password "REDACTED"; } -webirc { mask 109.169.29.95 ; password "REDACTED"; } - set { kline-address "enterthevoid@supernets.org"; gline-address "enterthevoid@supernets.org"; modes-on-connect "+iIpTx"; modes-on-oper "+Hq"; - snomask-on-oper "+bcFfkGsSo"; + snomask-on-oper "+bBcCfksSoO"; modes-on-join "+ns"; level-on-join "op"; restrict-usermodes "ips"; restrict-channelmodes "nLpPs"; restrict-commands { - channel-message { connect-delay 60; exempt-identified yes; exempt-reputation-score 100; } - channel-notice { connect-delay 60; exempt-identified yes; exempt-reputation-score 100; } - invite { connect-delay 3600; exempt-identified yes; exempt-reputation-score 100; } - join { connect-delay 15; exempt-identified yes; exempt-reputation-score 100; } - list { connect-delay 30; exempt-identified yes; exempt-reputation-score 100; } - private-message { connect-delay 300; exempt-identified yes; exempt-reputation-score 100; } - private-notice { connect-delay 3600; exempt-identified yes; exempt-reputation-score 100; } + channel-message { connect-delay 60; exempt-identified yes; exempt-reputation-score 100; } + channel-notice { connect-delay 60; exempt-identified yes; exempt-reputation-score 100; } + invite { connect-delay 300; exempt-identified yes; exempt-reputation-score 100; } + join { connect-delay 15; exempt-identified yes; exempt-reputation-score 100; } + list { connect-delay 30; exempt-identified yes; exempt-reputation-score 100; } + private-message { connect-delay 300; exempt-identified yes; exempt-reputation-score 100; } + private-notice { connect-delay 300; exempt-identified yes; exempt-reputation-score 100; } } - #auto-join "#superbowl"; - oper-auto-join "#superbowl"; + auto-join "#superbowl"; static-quit "EMO-QUIT"; static-part "EMO-PART"; - who-limit 100; nick-length 20; maxchannelsperuser 10; channel-command-prefix "`!@$."; @@ -134,15 +132,15 @@ set { user warn; oper deny; server deny; - user-message "4WARNING: You are not using a secure (SSL/TLS) connection"; - oper-message "Network operators must connect using SSL/TLS"; + user-message "4WARNING: You are not on a secure TLS connection"; + oper-message "Network operators must be on a secure TLS connection"; } outdated-tls-policy { user warn; oper deny; server deny; user-message "4WARNING: You are using an outdated SSL/TLS protocol or cipher"; - oper-message "Network operators must connect using an up-to-date SSL/TLS protocol or cipher"; + oper-message "Network operators must be using an up-to-date SSL/TLS protocol & cipher"; } anti-flood { everyone { @@ -152,14 +150,14 @@ set { ban-action gzline; ban-time 1h; } - target-flood { - channel-notice 15:5; - channel-privmsg 45:5; - channel-tagmsg 15:5; - private-notice 10:5; - private-privmsg 30:5; - private-tagmsg 10:5; - } + #target-flood { + # channel-notice 15:5; + # channel-privmsg 45:5; + # channel-tagmsg 15:5; + # private-notice 10:5; + # private-privmsg 30:5; + # private-tagmsg 10:5; + #} } known-users { away-flood 3:300; @@ -171,6 +169,8 @@ set { users 5; new-user-every 60s; } + lag-penalty 10; # update? + lag-penalty-bytes 0; } unknown-users { away-flood 3:300; @@ -182,6 +182,8 @@ set { users 3; new-user-every 60s; } + lag-penalty 1000; + lag-penalty-bytes 90; } } default-bantime 30d; @@ -207,32 +209,50 @@ set { ban-reason "8,4 E N T E R T H E V O I D "; } connthrottle { - known-users { minimum-reputation-score 100; sasl-bypass yes; } - new-users { local-throttle 20:60; global-throttle 30:60; } - disabled-when { reputation-gathering 1w; start-delay 3m; } + known-users { minimum-reputation-score 25; sasl-bypass yes; } + new-users { local-throttle 20:60; global-throttle 30:60; } + disabled-when { reputation-gathering 1w; start-delay 3m; } } history { channel { - playback-on-join { lines 100; time 1d; } + playback-on-join { lines 1000; time 1d; } max-storage-per-channel { - registered { lines 100; time 1d; } - unregistered { lines 50; time 1h; } + registered { lines 1000; time 1d; } + unregistered { lines 100; time 1h; } } } } - hide-idle-time { policy usermode; } + hide-idle-time { policy always; } + whois-details { + basic { everyone full; } + modes { everyone none; self full; oper full; } + realhost { everyone none; self full; oper full; } + registered-nick { everyone full; } + channels { everyone limited; self full; oper full; } + server { everyone full; } + away { everyone full; } + oper { everyone limited; self full; oper full; } + secure { everyone limited; self full; oper full; } + bot { everyone full; } + services { everyone full; } + reputation { everyone none; self none; oper full; } + geo { everyone none; self none; oper full; } + certfp { everyone full; } + shunned { everyone none; self none; oper full; } + account { everyone full; } + swhois { everyone full; } + idle { everyone limited; self full; oper full; } + } } hideserver { disable-map yes; disable-links yes; - map-deny-message "Denied"; - links-deny-message "Denied"; + map-deny-message "8,4 E N T E R T H E V O I D "; + links-deny-message "8,4 E N T E R T H E V O I D "; } security-group known-users { identified yes; - webirc no; - tls no; - reputation-score 100; + reputation-score 25; } \ No newline at end of file diff --git a/doc/translations.txt b/doc/translations.txt index 800c00a..a89c6d8 100644 --- a/doc/translations.txt +++ b/doc/translations.txt @@ -1,6 +1,6 @@ ==[ Translations ]=========================================================== -In UnrealIRCd 5 we support the following translations: +In UnrealIRCd we support the following translations: * on-line documentation at https://www.unrealircd.org/docs/ (wiki!) * help.conf * example.conf diff --git a/extras/build-tests/nix/build b/extras/build-tests/nix/build index c589458..caab490 100755 --- a/extras/build-tests/nix/build +++ b/extras/build-tests/nix/build @@ -16,7 +16,7 @@ else export MAKE="make -j4" fi -export CPPFLAGS="-DFAKELAG_CONFIGURABLE -DNOREMOVETMP" +export CPPFLAGS="-DFAKELAG_CONFIGURABLE -DNOREMOVETMP -DRAWCMDLOGGING" # !! skipped for now: extras/build-tests/nix/select-config $BUILDCONFIG !! # !! temporary use this: @@ -27,6 +27,16 @@ if lsb_release -av 2>&1|egrep 'Debian.*jessie'; then echo "Disabling ASan due to false positives on deb8" echo 'EXTRAPARA="--enable-werror --disable-asan"' >>config.settings fi +if uname -s|grep -i freebsd; then + echo "Disabling ASan on FreeBSD due to 100% CPU loop in OpenSSL initialization routine" + echo 'EXTRAPARA="--enable-werror --disable-asan"' >>config.settings +fi + +# If SSLDIR is set the environment, this overrides config.settings +# Used for example in the openssl3 build tests. +if [ "$SSLDIR" != "" ]; then + echo 'SSLDIR="'"$SSLDIR"'"' >>config.settings +fi # Read config.settings, this makes a couple of variables available to us. . ./config.settings @@ -36,10 +46,10 @@ if [ "$SSLDIR" != "" ]; then fi ./Config -quick || (tail -n 5000 config.log; exit 1) $MAKE -yes ''|make pem -make +yes ''|$MAKE pem +$MAKE || exit 1 ./unrealircd module install third/dumpcmds -make install +$MAKE install || exit 1 set +x echo "" diff --git a/extras/build-tests/nix/configs/default b/extras/build-tests/nix/configs/default index 3a7c28a..648a3ea 100644 --- a/extras/build-tests/nix/configs/default +++ b/extras/build-tests/nix/configs/default @@ -1,3 +1,9 @@ +# These are the settings saved from running './Config'. +# Note that it is not recommended to edit config.settings by hand! +# Chances are you misunderstand what a variable does or what the +# supported values are. You better just re-run the ./Config script +# and answer appropriately there, to get a correct config.settings +# file. # BASEPATH=$HOME/unrealircd BINDIR=$HOME/unrealircd/bin @@ -9,16 +15,16 @@ CACHEDIR=$HOME/unrealircd/cache DOCDIR=$HOME/unrealircd/doc TMPDIR=$HOME/unrealircd/tmp PRIVATELIBDIR=$HOME/unrealircd/lib -PREFIXAQ="1" -MAXCONNECTIONS="1024" +MAXCONNECTIONS_REQUEST="auto" NICKNAMEHISTORYLENGTH="2000" +GEOIP="classic" DEFPERM="0600" SSLDIR="" REMOTEINC="" CURLDIR="" -SHOWLISTMODES="1" NOOPEROVERRIDE="" OPEROVERRIDEVERIFY="" GENCERTIFICATE="0" -EXTRAPARA="--enable-werror --enable-asan" +SANITIZER="asan" +EXTRAPARA="--enable-werror" ADVANCED="" diff --git a/extras/build-tests/nix/run-tests b/extras/build-tests/nix/run-tests index a25c101..02df361 100755 --- a/extras/build-tests/nix/run-tests +++ b/extras/build-tests/nix/run-tests @@ -19,8 +19,13 @@ if [ ! -d ~/cipherscan ]; then git clone -q https://github.com/mozilla/cipherscan fi +if [ "$HOSTNAME" = "deb8" ]; then + echo "Not running tests on Debian 8. It's LTS is EOL and trouble with running tests." + exit 0 +fi + # Install 'unrealircd-tests' -git clone -q https://github.com/unrealircd/unrealircd-tests.git +git clone -q --branch unreal60 https://github.com/unrealircd/unrealircd-tests.git unrealircd-tests cd unrealircd-tests # FreeBSD has various issues with the tests from us and others, diff --git a/extras/build-tests/windows/build.bat b/extras/build-tests/windows/build.bat index 9eee847..6f8ed3c 100644 --- a/extras/build-tests/windows/build.bat +++ b/extras/build-tests/windows/build.bat @@ -16,35 +16,44 @@ rem cinst innosetup -y rem Installing UnrealIRCd dependencies cd \projects -mkdir unrealircd-5-libs -cd unrealircd-5-libs -curl -fsS -o unrealircd-libraries-5-devel.zip https://www.unrealircd.org/files/dev/win/libs/unrealircd-libraries-5-devel.zip -unzip unrealircd-libraries-5-devel.zip -copy dlltool.exe \users\user\worker\unreal5-w10\build /y +mkdir unrealircd-6-libs +cd unrealircd-6-libs +curl -fsS -o unrealircd-libraries-6-devel.zip https://www.unrealircd.org/files/dev/win/libs/unrealircd-libraries-6-devel.zip +unzip unrealircd-libraries-6-devel.zip +copy dlltool.exe \users\user\worker\unreal6-w10\build /y -rem for appveyor: cd \projects\unrealircd -cd \users\user\worker\unreal5-w10\build +rem for appveyor, use: cd \projects\unrealircd +cd \users\user\worker\unreal6-w10\build + +rem Install 'unrealircd-tests' +cd .. +rd /q/s unrealircd-tests +git clone -q --branch unreal60 https://github.com/unrealircd/unrealircd-tests.git unrealircd-tests +if %ERRORLEVEL% NEQ 0 EXIT /B 1 +cd build rem Now the actual build -call extras\build-tests\windows\compilecmd\%SHORTNAME%.bat - -rem The above command will fail, due to missing symbol file -rem However the symbol file can only be generated after the above command -rem So... we create the symbolfile... +rem - First this, otherwise JOM will fail +IF NOT EXIST src\version.c nmake -f Makefile.windows CONF +rem - Then build most of UnrealIRCd.exe etc +call extras\build-tests\windows\compilecmd\%SHORTNAME%.bat UNREALSVC.EXE UnrealIRCd.exe +rem - It will fail due to missing symbolfile, which we create here.. nmake -f makefile.windows SYMBOLFILE - -rem And we re-run the exact same command: -call extras\build-tests\windows\compilecmd\%SHORTNAME%.bat +rem - Then we finalize building UnrealIRCd.exe: should be no error +call extras\build-tests\windows\compilecmd\%SHORTNAME%.bat UNREALSVC.EXE UnrealIRCd.exe +if %ERRORLEVEL% NEQ 0 EXIT /B 1 +rem - Build all the modules (DLL files): should be no error +call extras\build-tests\windows\compilecmd\%SHORTNAME%.bat MODULES if %ERRORLEVEL% NEQ 0 EXIT /B 1 rem Compile dependencies for unrealircd-tests -- this doesn't belong here though.. -curl -fsS -o src\modules\third\fakereputation.c https://raw.githubusercontent.com/unrealircd/unrealircd-tests/master/serverconfig/unrealircd/modules/fakereputation.c +copy ..\unrealircd-tests\serverconfig\unrealircd\modules\fakereputation.c src\modules\third /Y call extras\build-tests\windows\compilecmd\%SHORTNAME%.bat CUSTOMMODULE MODULEFILE=fakereputation if %ERRORLEVEL% NEQ 0 EXIT /B 1 -rem Convert c:\dev to c:\projects\unrealircd-5-libs +rem Convert c:\dev to c:\projects\unrealircd-6-libs rem TODO: should use environment variable in innosetup script? -sed -i "s/c:\\dev\\unrealircd-5-libs/c:\\projects\\unrealircd-5-libs/gi" src\windows\unrealinst.iss +sed -i "s/c:\\dev\\unrealircd-6-libs/c:\\projects\\unrealircd-6-libs/gi" src\windows\unrealinst.iss rem Build installer file "c:\Program Files (x86)\Inno Setup 5\iscc.exe" /Q- src\windows\unrealinst.iss @@ -60,7 +69,7 @@ taskkill -im unrealircd.exe -f sleep 2 rem Just a safety measure so we don't end up testing rem some old version... -del "C:\Program Files\UnrealIRCd 5\bin\unrealircd.exe" +del "C:\Program Files\UnrealIRCd 6\bin\unrealircd.exe" echo Running installer... start /WAIT unrealircd-dev-build.exe /VERYSILENT /LOG=setup.log @@ -70,12 +79,7 @@ rem Upload artifact rem appveyor PushArtifact unrealircd-dev-build.exe rem if %ERRORLEVEL% NEQ 0 EXIT /B 1 -rem Install 'unrealircd-tests' -cd .. -rd /q/s unrealircd-tests -git clone https://github.com/unrealircd/unrealircd-tests.git -if %ERRORLEVEL% NEQ 0 EXIT /B 1 -cd unrealircd-tests +cd ..\unrealircd-tests dir rem All tests except db: diff --git a/extras/build-tests/windows/compilecmd/vs2019.bat b/extras/build-tests/windows/compilecmd/vs2019.bat index 690194c..238b808 100644 --- a/extras/build-tests/windows/compilecmd/vs2019.bat +++ b/extras/build-tests/windows/compilecmd/vs2019.bat @@ -1,21 +1,30 @@ rem Build command for Visual Studio 2019 -nmake -f makefile.windows ^ -LIBRESSL_INC_DIR="c:\projects\unrealircd-5-libs\libressl\include" ^ -LIBRESSL_LIB_DIR="c:\projects\unrealircd-5-libs\libressl\lib" ^ -SSLLIB="crypto-46.lib ssl-48.lib" ^ +rem This used to start with: +rem nmake -f makefile.windows ^ +rem But nowadays we use JOM for parallel builds: +jom /j32 -f makefile.windows ^ +LIBRESSL_INC_DIR="c:\projects\unrealircd-6-libs\libressl\include" ^ +LIBRESSL_LIB_DIR="c:\projects\unrealircd-6-libs\libressl\lib" ^ +SSLLIB="crypto-47.lib ssl-50.lib" ^ USE_REMOTEINC=1 ^ -LIBCURL_INC_DIR="c:\projects\unrealircd-5-libs\curl\include" ^ -LIBCURL_LIB_DIR="c:\projects\unrealircd-5-libs\curl\builds\libcurl-vc-x64-release-dll-ssl-dll-cares-dll-ipv6-obj-lib" ^ -CARES_LIB_DIR="c:\projects\unrealircd-5-libs\c-ares\msvc\cares\dll-release" ^ -CARES_INC_DIR="c:\projects\unrealircd-5-libs\c-ares\include" ^ +LIBCURL_INC_DIR="c:\projects\unrealircd-6-libs\curl\include" ^ +LIBCURL_LIB_DIR="c:\projects\unrealircd-6-libs\curl\builds\libcurl-vc-x64-release-dll-ssl-dll-cares-dll-ipv6-obj-lib" ^ +CARES_LIB_DIR="c:\projects\unrealircd-6-libs\c-ares\msvc\cares\dll-release" ^ +CARES_INC_DIR="c:\projects\unrealircd-6-libs\c-ares\include" ^ CARESLIB="cares.lib" ^ -PCRE2_INC_DIR="c:\projects\unrealircd-5-libs\pcre2\include" ^ -PCRE2_LIB_DIR="c:\projects\unrealircd-5-libs\pcre2\lib" ^ +PCRE2_INC_DIR="c:\projects\unrealircd-6-libs\pcre2\include" ^ +PCRE2_LIB_DIR="c:\projects\unrealircd-6-libs\pcre2\lib" ^ PCRE2LIB="pcre2-8.lib" ^ -ARGON2_LIB_DIR="c:\projects\unrealircd-5-libs\argon2\vs2015\build" ^ -ARGON2_INC_DIR="c:\projects\unrealircd-5-libs\argon2\include" ^ +ARGON2_LIB_DIR="c:\projects\unrealircd-6-libs\argon2\vs2015\build" ^ +ARGON2_INC_DIR="c:\projects\unrealircd-6-libs\argon2\include" ^ ARGON2LIB="Argon2RefDll.lib" ^ -SODIUM_LIB_DIR="c:\projects\unrealircd-5-libs\libsodium\bin\x64\Release\v142\dynamic" ^ -SODIUM_INC_DIR="c:\projects\unrealircd-5-libs\libsodium\src\libsodium\include" ^ -SODIUMLIB="libsodium.lib" %* +SODIUM_LIB_DIR="c:\projects\unrealircd-6-libs\libsodium\bin\x64\Release\v142\dynamic" ^ +SODIUM_INC_DIR="c:\projects\unrealircd-6-libs\libsodium\src\libsodium\include" ^ +SODIUMLIB="libsodium.lib" ^ +JANSSON_LIB_DIR="c:\projects\unrealircd-6-libs\jansson\lib" ^ +JANSSON_INC_DIR="c:\projects\unrealircd-6-libs\jansson\include" ^ +JANSSONLIB="jansson.lib" ^ +GEOIPCLASSIC_LIB_DIR="c:\projects\unrealircd-6-libs\GeoIP\libGeoIP" ^ +GEOIPCLASSIC_INC_DIR="c:\projects\unrealircd-6-libs\GeoIP\libGeoIP" ^ +GEOIPCLASSICLIB="GeoIP.lib" %* diff --git a/extras/c-ares.tar.gz b/extras/c-ares.tar.gz index b59d17abcbdc06ea85014fdad36d5ec445262a5f..bb16c09dde32f802bde7a9384dcfcf4664c06dcb 100644 GIT binary patch literal 1538276 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%0DS@)Lwnt2o8cJ@hUrwN4bkS2l^vx_9VSE> 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

Gn~(Z5pQ(I!H#43r=2@ndF%N4`oWaZLY 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%0DMv4US1)|Z9! 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

-Q6Yzjb(JHxcM|%FK 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%0DD6L5rEz*SG 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,CQEgOl*OvomM6_tfqEjwO_m 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

xMMMdYI@|4Dl@N`2tmqXO84kA>QCA2+#7{A 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±R8iR2Z{Rx=V_QdX|q3AUxia~a-CuV>x| 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%0Ah`1c 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⪼W;kj!hak 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

uUYtJw)}gvuJ{+S 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

w<2&`WQOmorx*Ia^IPJE1+p!zS1Uh zotCqPx_Oz)zU=k~wRWr4Z}y>f0ym8AiB9AGj}(aDw&!gg6CW9lgXU$3mv8%6)`G?L z1q^-jV^}v@)DIoMT7`>mm5Ki#JggkGx(#>vFbiYXJh1U{HeSku*;DI$?i8mZWWwwN z|1IOc6BEx3nV?>Fxe7^>t71DzZoyqjNoL~iP1y5TPp zxIe!8gKQFm#0%Y@z&@@$*S(Payeb{*Rw@&VW?6O4w29-_M@qsNM4*vymy%n(doCb>uQ*E_HP|DCFQQ?o{esK4Q*hZY*k^%7B*K|(O&LeZur2pUu9W?B`}9iJPq)vQOZ$lg`SNb6Ea;}&r&h{tx_xq` z>!#c1%LU!!Pf22R`ZuhKBg*$dH9x542i5$Is%G@Ji@F_%|vbK?>z!`AM;|g%sPOLn!CPi=tuP zP8oOrZEt4>|CXQZmejxaZ>Lfz{iVE9hKKFF?Mme@rE+EON#!r>yCS4$jQ96D`M0&f zl>RO<_Ch!Dw2?mMHUXb$;c9SPuEolT@XDI= zu;YmN=kerhWEL-;GF}6Q`$xqvu15Q?-Wk4Jjt%C&?$u0pmLY6)27_OYVV;@-CqLM= z4C7JrsN4G`4L(zM$EVBCb((|5^OV@&qr2sfW+`yuHqQ`Lc@VRT^tjt^y#ds?73#2w zacXPipN&V^6y#0>`|;pquUTsl-j{@lCk&5!tu7G!WwX~BB;^VKEpN2rj-jWQwYNWL zKtHD;BH)9Troh*3Jx_;^Holf4?6o>C`sp#ILzoKRm9vGLxJxnq(g&=yL0X)tMjs+g zJ^bdT0o}6<Un-6Qb5zR>ARHHkM7)fN~Sx@)Ea2T}WgLV#8xv=JwF*~J8Bwe)tsQce*FPg*WCog)<<8E&d zQxJw|=l4ihX92u%h>#)+aiDm?Ss9*)O@WUydJIMk`R-gzPm!7z(CpMT9MpOVmAtS3 z!wd-)reGYNlU_Rp#|lk*)$H|K-A)LJspICm1}r05X9!Gm@K-ZkWOiUpW?E(e6ULf7 z7LCU+U^u8ieP21QJ`I#Avena zB1`A)xH`FF$OVQrF@EDQ2n;-mH@N~SL+8a&&V4k@vGoxQ{kbt2JLppHd({6ZW(RzA zuGtuNx}8?1HDL0z!~ow~wRY>*W+U?>#!_99N9;;@j$*;NJ^P#qt^hy+?VaV?yge;w z&L(?~a}vH&=I>R7%M%-4f)GQG5c)Wm&oA9CQ?v2!Xb~dbVXfU>5kaurz~|9K*Ub4W z7ecsVW4^{w>BN-bBkH`68&mAQYTjt|Q8zV)EtBF0kdvKv^VOi+=vLXxni#+&XA|ul z4Yl(*dUK-+i*{c=#>w${t?`eOX786&-Hm>1mHf>bnoPY|5_Ew1_3?MhF(ORgLnzLo0m=&4 z3`uzgt)pi5WN@V9qh%Jzm6)a1YWm0^S=NKPph(`|*NjVWqzgz$Nu-|DsKRFB|g2}ROTeXMVxb(5<%$(ma%2DN~#BRY&ndAPiK9$90q0%oit(_KpHg6*Trl&7JbD=f z=Oaf&iF>fo&=BQPrLY8$-3YZze)n3& zp_CR02xt)?fp(8!TnB90kv5a^`lo`}dRMe$r>| zyyT$<(PB+5aqWCK)7%TCh%Mb6ZSl`V{GI?`K%l=|BK+;PU)8&vL;qmy&BUzUNxSkKNX>T%CugGA$S5 zUr`+jj_$g&j(2A0Fwx;LssQ?e{1EXA#MEZ=fZBxjluc~0m2XABYRm>)D zGJgqK3aZ|aaN;!<(xy#h0f#SfP^2Iv6urbjNxdKe<$G+oqadt&55bnbLWP_X$G!*l z+#Jy^)ag}JxkihN$V7=Z@*$!5Bvlj&(0d40Ij52f$*ue*3xBPspVMM0FUC|}j!8(h zSTyq6G8`fC6^knj6FvSPaok+=xst;43w@|0n|{LP3q>Q16I=@d8&-CMK@HQ!DU21) zTx{7RNR2UzIRyE6>5yxBs@q=RJsuyDjdcuqM`4gKal&--(y%QP=d2V_Z)}?^}X84o_Ok7OLcROWc7Yi`{pU)la%VthZC-Vdht zgX#TXddExm1P$`j^%O`{Q!KaK_wPc~Ctl1n%I`1N28o*RtB4FAq{ltZU_jB<#$!;L zQ=Q4dkDJOGlhNs^M?tk*T64RYT(dwRc0a_ua2g&tmpQMV^6sWhloJ@peWzO5E$vlH zPf9;kOMfeus^xOIQY~+ncdF&x^4_L6vz$$_m>CyW-!GA=n9|MP68O1%O@>amS8CyG zPz_z2%(oQL%09Tret?^2D`Y3=ba_GvTouXPtjt&A?a0L4rw$R7tyF9UW@w;`IxAMcT~=~gp{iTm4n?n#Lw&5H z7ZVxX)oqFwdxd{_APs!gOs87O=C8ADu^Mj+TBMwU{?4RGlJ}*1o&ksKmq>X1MRU)E zri*u#;V3j!l}-er3q?q!&;=*1IFz9~N-v_)r7js7vmNC;Y-lEcL59iEZtrb*PsVJF ziOom9yY#z9zfVL&$4tT%O@E{B8vUNq?}&cK^sCeF8QpWmC(w~f?ii z5N14|POq{7u1_FYU)Upu{2l=(R=9h?GNWdUC!PFDGOuR{VYNS9{r1}x+h>!HA8rE; z(6q9h&96d+SDI~Trt75Gluf+a>gIHi7U4d-p>@e`h5TEwjQ`yT$=@nBM^dTm+y;_e z1xf0T4GH)JNxFUehV$~vI`Mi)?~cx`of7joNVS@|YDdj}(r*qyyW_eH_b(8RB$nc5 zkXpG%s;)YEC23h-Ad4#T<00M70F+^~m*GpK4)^SGK#fhVa7C1ynNN+0!7tiDzgF9_ z$j_DE3^D>c3*|7wV6v8rc;*;CkhKkS{z-AzE@m>K5YPWjILj&*`4}d2^OU>8IWR*+ zM{g*^_tKz(xap4A43o_?+cie>iDo0@SO;T#YM6QzKeGbNLh%xInYh^|9sol`OhB;%?BbW9ezGV@63|ihw5Q#}6Bko3{nS z;3IYo&BF}`n>ChnB3u8|pLyh~xZ*7@obj%Z$2()@&`=}i# z1;fmWjm8R3WuN7crzSebk@uk$6Ahu`>%nO}#HFclJ!CiV(^$M0mCA%yw)`4x3Rc*Z ze6s2F*=C>`J|5F?J{s=m!o$QdgrG1O+hPdkauf&Pw|C41D|OXArPb{NdSI+UP#GzW;SU$m-Uv3 z1gyMo5;W?!x2jY_fy(BAmrNrb!~i00(*uGg0m;XA^`4`%j9{ z#xQoj49EpE^#Z|>+>bURJH3+Cz+$FXyep_${6aZN>uYL>rE@U#`VM7J@+s3s?p#CU zFLW0ffQQ0y0+WQq%-$Voz#*QQ^)*;O39~7RTI{Znuw%7sg+~da6S)~Eu%f?U2REw( z=Z|jOrreay`kc8Ci`i*~=oO5ID%5wj_=B9n4ZOH-Baz~0-~zV4oG%swH%z*^bvl1Nz*1~xJ8m-KREE(u zG|q!m3ms-;r@9wi0i6mX!()2o?`8V~#GTHz;VT6Q7$k7!aACPdi+87bzLnS*O zA>=e6W0k+fHQbnP*uRNRq`#h86bZ?$46-iy=zxm#VYt2u<5v?aT1-*Vas$=Y^;|-g z^NX9)Icc|-Z~P}q241_Rktcmp#H&63`y!LrBYH&2#I}5iKO{aZc6m&zMUj<*BI4Gj zw>~JDMN@5p>s}OTz|?PPmg`lKuO6Xbp(d?3aiv+o%0pgJi;|3gFr|35Tr1wWo#$MR zZks_#ZMv2&1vf3hS(Eu+dKCkUD&&Mm*3`LSnsXl%RTAPBuw{n)3Wt( zk)dDG)w+$oNfTGMWe{Y|yh3!`Rf!JUsz#szNE~)C>5BEPWc4is(j6KZ){7#dM~RO4aHZLZK3pGBg@KBc1BTHS0Gs5H_>}S-B-;@_j`Odsx z?tY~TZ#P(Rv%6faR@gpc`}>QmlzSXqbVb7rx1SY4e8)~=7{YYP2!j7B*@xkCOIrvO zjCh=40IfDNxaQdT_uTv-O^E9Zq&{!X4Tn;IC=dHqx6X9jdkmOOEclxi@9VU^+{FAz zy-RBt0mp-E;Ef9Zp516GPw)^57#-iO3{?8#2A;GxUlF_xFUw;z4|gIx{97^p``B~} zGuv{l;>CU3|5SdmQ{E26f3G~*+kS}uelPbwZLz{ef#D@;RW^G37~i~;{*6w5c--p_ zy2F=VOm;O5*PdNGb%!Cb(8F=YJ@9c?5D%Em_)WAUu2UU6)Tc(9$0LmM8HSq=reg}A zZizIC>JB!W^WS_TDFPP192)Md&akg=@H{G4bUy zcySHVXKp&ixrrOX=pl$Fy+K;5Tca=aPmTF>mQz(Gf<0wp&DB6s#{u&VU^+Lxfnb}Y z04KV+5S~YN3d097^j*!JI|HlF)eu5CloUeT!;l~WFuI{Q4AmO|8G>LoQYHjf$DQy1 z*nenqJOn0=*n5DyRhO1A-e5eSqtYti4zRMoGI4`!fX&C94tb|iCJ@WhrIVv)b92P) z3talc_@2;}I`rhFzKG^aWp zRm3|~@C?Bx&ajiKf_K_eWQKaFE$8<&hZ-K?m`7qXg~%pvX-=DcNr)1k_ck_|$4nbB z+y~u%(;^oaM!kHbnZ|5B!Lz%OjxJ`9JJ|8uxoDa0b|pH>6s+P%=6)bgc`sd_=zuwhONz)b-=%!xcO zg;~AS)k>-lTOCo(rD4-7;=gKvp>OdL5um7Ip)*)axR)@ccHXO~0Czs|>D}u=)w#D# z9Qk{_RSD0ZU3VhsqPC7_l$iw8HxYW6!z^A0tWs`@vZ7_E#D~IGBDxNscX^iBfxREQ= z^m?Ns071wiJr?RKzXxTPEh7OoJ9UrvWaS73!`ddt;CDx`A66)SIhhw1Po;*)qiNbw z3K7iR5()k-q0?%WxE85`m58BMpMo3UvQVM~P(f}sw1T5c=C?4M#qxngV8a}TzKP=D zh{B_)ZboSkAdaAhfLpEGlA0PIt?aZq-a{yQ&2Me6wjC!$RXfg|*0a-JQpsc2PEkvO zy2EN74|+@LIr!uzGCzI0))-ZnQ6Dk)lN-n4gW=%KKyo<1fY$%y-bir-R&Nnwn9+|u zB{mj6rD!WYU^tk~l}7Vmc=SfL6mt)A_E3VezjY zb>sZP74)Hd5@L|KntiS(@It@$%BPTFA%zSJUO3`mj{n84fE~W#$?;8r5jclqz8(dk zH2ES*^S)tOVd{!9BjmNTWb#_ts^pCWb~t#X+c1N4v{^(cC<=>z zU5!b^UJ{-(R76u|nbpBBWmyV_+s?*FUk+&N=RkuraI=Xv(lHK2Jdbs1Qe&ZP#AbnP z#6KaqDN3St40HTinN3+=;y8RD{=%9egW+FF@T!2RetoVZI(Q8iieg^HaH_0ngb8_d zqse}y!(7FKpb!^fC2$#M7(b!H7Q|&wWJ&s#;~ehNk|}4h`FKXx{RFx&o5c?79uGEY z5!M(DN1EgQ4De5LGQ*~a=tgSZYc)k4i!PP$1xU}vqPLu^?SG8%Fjpc@aAtrV4;^U} z2P5wO@jxV z^Okq{ny>ajXVynkx19@PhQaC14Gf1pvuH>?+<#S*%dun(2Jh?HuPTzfhjMtjJz( z#lq(9MYJeLy!C>{V*_cSO`^q($2TqwS>Qr5OghSdmvlut7NcbXEA#ya18+qo&SnSr zXFrHF+yaL#H{sl$JGHC{Ll-0%J~%A>aRF(UDKKeT6bFo$l)2qeG&hW~l)3G3O#R2H zbH~)&PF?fgqM3h7O|zJKYpLr!ipf1n-)a;($}Si-n&c4Vr-vvG&XPTz%40|(;8<*k z6cg2rFTv&FHt;A#k;eLaoaQ^lc4z>-ZvlWgh%LLjE88Hu%x#Zv8(>Pqxc@A^(q^(vv3- z{vY@8FX%48dpzKfp?CuYTqu&=BZAIm=r2LBq*1IQo=vfNDkX*piSFB>vkzp!!k?nl z+7xhoCtnO`V*U#1l$)x>fbC}L9|N0a>YY|aGQDg0RQW!B{8&`)!}6EP>%;oXTDR}H z$;JtE?-&NQ0E6*w?`)C`f>w$2pCAPiWV6^~6rlDM{H@jC$F$tSpe`PI4Uwr-+T+aP0AZLDESavK(k(N0SL%s%f59f0e-7@H)aYOThWX2P;zM6~UbXR*U__ z!#1=!k(yQ1!alAmKX+Q?a$T)5{KM5s3IULd?((pu*1{y6ks4%u7p$d3pITFW=5E=e%^+gM61)116a`XqJ!i zr0ZDl{OF(^%>SI{x2ex3x_RziNPt~gH5Y#_)@9r5^i4n#dE_nsJ^}|Xk-0PS9VU}6 zv6VNb>-D9e*dzaaL}0vw$K{T=K`7?#ps&f2v$j}ja?JVQeMOhi3yY$^m6+dncR#PT z(chiuZ?G-?>XB>@cZXOa!Fek-S$XfzEWFd%XytE1c$e=``s^f2pSYX2yoUSa_?={O z`3_}rxs*(ml?VN5V?3>FemKK)zw1938VFBW6t(Gnoc}3pmv?p}=YPt359>eo@sG}n zK5sXMjaCm7;abkMX2a9DF#)M(=eLT*3_nrYs|O$)dnCVSYA1v4QSI+d?}noTJT0Lc z=O%OJrvO&4PX7%`*8znG8rU#LtX%wCaW7M=(=AHF+Rw}4C}re*pz8|R`H?mHuysy>U+CIf;|v$zZG9ahvoL`a zFNgw*4upC!Q$IfDr9Z~v*K#UB@>_Db>s`R8iNXOrwkF1D5}Y94QhXj)@b`)qiK49y;2fEO0Y&zrlbe3tp8T4wv4gCQQD1}I@ zjugcc>Q2%96j7AP`Dz$qKK3ZByDYkQc10DZDeFs6+*A& zs0aCbUc8E~&-)qLjas7->^hb(Xz>3Lo%-PUkL$;{8BQXBT4m`P4A+5@QT4#&0g(AbJ#m+H~Y`j zhRCj7%LO6D7pP+As8-zzHxGN z?4gzbD`7?ARr#%h4`$i-Y5y7KJ=lNc-JR`SvHw@u-rFueA^UHq^kDzp%l@CLp4qu> zf^0-7dwPYd1=bYZr+_*3irYLCo-#Qof^2>!Z?Msaq)DEkz^+@fD;xcSS+1UE<-h%H zr%)+XO6<_qb=J4e+>dzj_RyM}W4c3i6OVcqG3VgIZ~_%F9J*hGIU*OG&`m@H7|^@R zVRLh0Obu+u3{T!VXzI}=s8BOBR<0z4LE{uh{w0O#k0J z+u!%zHu6j#U05u;2zk{HfuQ3`A->b$^lZrZXDrK076uM9IZ~H(|Ek<9d-|xduj0@@ z0aunq{d7kg@uv%oBJ&)W7Jqj%Q>WUJ%kIJ28WNo>qJ7!zYq=0l28p$VhaCmM)?+0eB$V*<2fIbP|{lHVrh zF;#=qtXh$Babs<5YYR%IY+ps0Fo*#XX|uK#Z0dGSX&DWZ>WzPtB8o5 z+Pd~31|ME`%AW*Rh+Lc}d`UO9uRtC_YA#UBfw?aRc#_D<=Y1p}bbWSi;mj<8=R*oS zvk&LEBn*0n<{#oYzxC|6R{uLp#-1UBSa6U){%Z&h<|z_}KSsanpY)LeBVJWFtndg! zoz)wt2oGSOe*U%pQfi&Y#jh}xg%87i6Le{9(Cy{3IL=1nj97&lIv2x6ZBP@Hm1%ia z7_q{XfyJysiUouiU=^xg@3oExaX_t3e^6_;hkU9|5HblXkM)~8G5Nh zegR3R+dHbYhaxM0Rx`)FX7C*}bs$0HIq8IRg;FqIFo{+zhB&w;I`ZW+N_du`t9O-T ze18^MT3X9B-!z+V2KnF`Q}T+8pFz&1{gii^AJi$f|3S=-y@U*3^aQj;Z-w({C$e&? zjcCQPINc#u60gJQ&Ty>HoS22yt?AB|_Gw7X7=p2A553I~K!WvKoWpfeXTaTPxlFPI z^b>+lXJD=m9e0ecUc0vl#+jdM_Cg4`3cLvBzt*W^ z0iO{if*{`Hr>Kp%K=5WmUMI$MZl0EsI)|+nCol*a&EsaL(d^V)xSmGU@YyDx!3Dr! zy?b=j?GQd$wlWb*suf2Ttyf-DOF_*gHLnz<*W1lnXL#6Z(}EDsU*yrE#YOb;6=H*9(R55g)|6j9CLP}j~Rv-%D zh3koxiAO+%#(c_WYDdFY!-?xv>=Isv&oK2F?`KMger_}mYbWhN5UhlY+yw{kcyj&J zGNjU**xI24&x5#tQnI*~!x~9x8cM^=-jZmjQ9e>-*)#+bPFEn+0hMyKQZ2L+X-R=% z?xt=It-vNVsS;YLO=y<-EtKPi&D#z%j{=;AT1Fo*Xsq%7XG+2w_|Bb0Sb6!#9|=(azQ2BPf0yh zm>SL~Hs{2+)Dtt|c1>I+l1!SBluxctDBu0V1A#oD6DEOC*Bi^vW*O zHm+AO4b9+SXUd(Uq`uqrHT6oLRu2^Qpz+- zA^b0z9R&%zh04H`7=UOw_ytRP#@7THL(Kf9hqY(>3J~dFDqB-^y%yH>T0qxpNxEL+ zy8fB}N(D&3R;S)RX%NjbU__$PPgwgen{8rS)dUp)V)}n|3e$R>uO;X+3Zaf%Bp$gj zC0+<_jBCfmt+gEVHFc`5aF1~z>xam0ba>g7OOVW)sg)5LVBq=rrfnFb1!`En>! z>Pw*#yErDRC!j-lLb^CUBbWC4n>umvp%zVHj$sZ%k^m22!%yK1rff&YFh%2D6?GIJ zAZPmGZ$RGUX`#x0Mr|hCZ=^Q!Uinw=Mfx(e2WoK(G;Mt~MJpCQLQNp}m0F=TftwX^ zt)R+66@5`&uZJW(Bt$<)B|UryC>TH*Q7`~Q;=f*RH)Jnm(pW3?>lrI`-&P5?+@ndd zg(7Gpsw!ImHbIy^kQ4_JM6zN=^H`1u8E}gAhKwC7 z_7<&3g}K$X+!A-kHi!2jR8;AqH*dmy2q`fDF+B)hf*lB$BOM4pvi~HbLv!i%cQ?&b zu)J4muQ^esr?gn0SfWMvp2~=jO)|dfH5TKVDW@2!bDU^uoNrrTMxvyJeAL9U=qc*_3k;5)IPkVcI<`>iY(&^@fgMr+d+sHGy5LzIF zg@Rb1&a%N=!&l%v=_Ik@VM6p_T^SB5(12gDf=&C73$im4VKwr}{{n zJ310hFP;}SIZ@FWnCIu0UQEfQ>J$<$G`yNro1#0CHwe%v8v`IA?as)*>Fi9m$xn#y z7iZ8%uxQbYZWo-_EJH|XGBSeU{64ls-2ZQwcOoS`3s zkrmz_Bw65npF4T*S8rp3K1dG=+@oe+gy;%(e*RyX=74+V>QFr=Qx|U|{?@N|k5Ma* zoRKxtQC{|%^^;z|^{P1>)Os(PwAjGEaz9mO>)c6IYL^xQlE zxbXoyx8Z4mucwna{MhFQc);+0SDf#a%hPo!P_c`6V#QCyE`!8!AQ8KeC+_%( z({q`9SAm3nMo2#eI~`JFg6b)DIn&&Wp*H?Ezv>3+&AFWXMGpSORjkMQ(#vPv`BH@c z&e#97AH;(E%C*bPS0?_*0sV32AzhpKPD5Y*xwfVhy!GXa;AVN;IugsI$N($w0nPsYtQ)_I>d!)c@VPjW6%F z-od{|TR@ozYJrq)Aqoj2pCbEGpokU#X(E(SF_RdVmQ%DL`TgZ(vOu}iZr&#>R5JUr zpIv8Lthn)RYwNELKEVH5`^?#Vm&4Tj*4uw>z28_{+k98vTo=fs{*$_oB=p;CF^gI* zn}y*g)7I81n5MjB(WYA~@B7j^_xQ0X0A;I{KF#|scAtd~1lUalC1_PyPH8__F4g6$ zK*04Z=~d(}x`7ili@*wL5-U8uXJ6N;Q`9bzgj`=+`)g-^@sG3h&fH?aHA)ApF9ejf zhG;uqnnZI)42RFY+f?B<^3g*G={or3ixh!>WrZ<*hFn?C3-zx;ABGccnYi!Ki7*L6 zJjX^x77 zN^b;pK7mm%Au)`RnC25Vkb!^ZOH}-`k{7+NfuAIfiFF>xi=V;nEeIU&S>*kZ)fh}i zr)X57*Yu`{;i<*grqb{tqLRN0v&az|u!PK1!E9)2(ZMTjq%y8y$U7Uo%UugiE?X~v zwGTMvGeDOm|7Jm)EH|dGV2_4UOUcp6`9*x?1}7$byg<7ym$OIc6?d+?*ce7XKeHT| zsw`V{Z6}+Dkp~L4B*))pucL9yLhhgaZ^7>pCV;%+V+SGwcA5VNu1RGrO96%weuPTW zSMQnZI4p1Y{;k=0|F&zr-%76M9Tj}_%lo%_^Zi?=|Nq(h^Sw5bYylAN zf6-G!%iI>Ckw9$5qNqX!+172gi@;^K?Uqwg0@+APRc4B%%AVgm!o0!!F>f;SLf<2N zXNfI0A?$M9+qdoRLYa{fC-xKPoH)z0%5&@ZtZ9)22~`167*MvhH}Ih?_N-;3(|8ko zQ2J)ex(8i}m<{2rBv3g=F>8Rouyw?tk=7330$#&h(%PTa5{5P_*Sf&A0$N-chL<=L zJdQjVMfy?~us=}MbAGoDhzs%o;w=KBhpOfhOGzbj90?mT9ENbT((}R<@S*7CKVAi= zGLV6bYN_nBKxH>aGO%p4(>(D5Wx}T&`0uZx7Mnsq#yhfA>izxb{ivuK$F--Cm)XZ@ zq=*OJ>G@Id+wOBY5isf=+B5^ILd`m!YCIVdD^UT8@0Co9UY@d5!bx|bIIS$kGKT-K zn(}tKC?WOv`TSg&!-@GGg#$8A8^%NaaU2z7&aFm576wRXOiz`)gfn_ltn<`ZeV%1` zFrtnxkNCvoERk8(h{j5)3~#mgkbgFhW}6ffgY*SR@YH2boS{uZ4)XW702qOH2TvwXQd-oArpLADX_a!EuI(oX1+_laox11Io8QCkru zJibdZgrkdUt^*DMBBH?2&R#ed*-w!td1(g*pvLHGrC4!`IGXAPoWY$Ow_9(->dML% zTVMt5FB30t*<`FL#Ls?k4P*sctO*b8w7U0bAm(%jh%bR7S(t>%eEChg#g<-Vy;cN{ zL;Te(mT{uJs1%}eVjiUMs^e4dcK=0jDQ5@@Op#($4axKN&)Ko*lT zC<^b%ay!`i-UV5UyM4&thOZQTRv-;cS#%))(Bn|=bk;X#(GrPbApyyDB-}8tTIXHgVk(W-V(8CLW z5MAAiE9VAiXh7z2@elzv4qRF?jFQblEpN}^KlLFYCs7(*I=O7+HIgz7g!$+lEj`%A z5F>sNNfE;~WulEyoZl_Nq|C{JLM)=xgjA9cf)qnkmob|b#wfm<1RdLRT5O_=Rbh8Y zh$KFlQ}9_xcE?NDCoXJ9+yQrvoE@`|eYL{*GeQ4^63@fG?YB-lC*}Be_(Y`B{QOVb zSc5HMg=WuRC?PAgYni)lnMV@m8OyXS8;++az8fLTa*+hFvMXVkr10{X^3U3y_wmeciYw?G0i23Y-;-| z-x~2m;u^v$cQ7!#gD=q9Q}MB3oRL*qnXH=uZD7n4U?yBRZSlH6pD%$s^lxCjFL+hA zx+L)2x^YnHdvL#$4I39h$hSF!0$fqTqrH>{TBchMStjZj3oJcSqe{0IbqH zih9D5x-7Z!M|gAqii$jB)ZsV^ygo(lx?sFVhc7;L06Vo2^ErKJI3hPV51bLkXGTXs zp+9utD8`U7bg)wxpc{X1gGqe%QsiMLKy~cU4iL1+W_cK1gyaHz6GL}4c)0?N9`g9I zO?2Si23{mXqKA`<3-7K1JXXjvf@bq=*A>nn^hJpzC9tMP@V!F#t|E(9!>bZ?i}L_6 zRe@3QdYCTHeK(TJhK5U?&Gd}-Ho6z;!iK-t_cfGa$Nm?%hXdOm`vXk ztYeL@{jFn8-Nr+bxsTT`dNR896)>VlBc-QvM$ymm`(nv9ozN$sxrbu0lI_(rLq-Qamf3;4NlacvR zbEON}6P8R=v!>H+J&QzQAz=@dZEA&kCM&haFyjVTbe%4g8jVc5oFE=hMp2WlP^z>5 zKwbTZS7H#6k|;cp^9rP4t=?lhm1Pzkw%UqIy~f-#y+H*8dNwYl$^~>wp)6eG#w=In z7nIY40uH^MM?ROOtQhgS^*!e20ZAI2zZm!O;Em#6MTK0O_fY_j{wzcVm?vO_fJzp< ztD)Z)lfT}I-#&}dc1f>eDaj5l;-J)LlA4DD*By(EoV;50O=M3U=^X0V*e6as(K{tn zw3DR@O5=3z6|CEKY>cXr6I3sMExi1D>jY14GNI}sQlc{E_8ALQE`RmLa3(bG(4!Yn z(1Uv^be88_A4U(@L_8_c>=Vbi?}osI^s9(?$y$%l=>F@LgpHtYJep&Di@^jr3KG>N zKTSqe&cFqXKeF}Gwry%b?rB~I#y6UJ{>S_3@~3$UMCaX=mp>u)x(r}$DmO?gqM{4y zj3d=mqBi#it}~joz0z0`4*>ay%26;5l!6bWETwgwny1f!Nk4nbpVR4(n~P$(^Rr{L zE~Iz)%&Gct+cj^y+7+ToXJ09epZ`V)KmTpFKnk3@dwck_-#j@y-fwb(e1UZ3Z)}&J zASLE@%=(^@p3L1mLP~r;on3xN<~Q!nb~8WhqQgY`dUCS+$2n)@3b_SS-89bS`(~Wx zjd3pD1!LOjqV8r4>nA)cQj_1j*(J?TIb`%iDfZOsw_W3zk<(Rwb9^-Jy?sf>u0KiOZx^VSh1^5bp+Xtv`H ztzv$XDMva*)WG=8KsmB4RmmgS>PLnErT^?}~;>&Y>v zo*cv5QHS%u?=G84>l)8Yoj`27ZFksU`fW$~gvvjow z={ftmOu{_2dlJrKr$7#cacIArH|vXDn(-8qL#;~teYbGhID!XE=cnC5n@_1Wo=M8j z7$+#7W5gCv5RF}osH$h3%4dguQRx;gjwMLPYw{?=ujZA%S&j+RcPokW{4&9FTz;jO zU8z_cs8o2|m5MP|D!o9ucI+XYP0;sb;%=b}G#rlWpR@@u2JZrUwOQ+<=!S2<0mtylOK4F|Gu@^QBi^P044 z-tY^N=A2BAyOysZPF8Qb1?^R7m!Bxb_)*$5Z}0`_K~<%Gk?H6wB=$`u>=sbo$shO$ zQm)~rGo~bd+%5Qne!Nq$gx$ipe<45c6Qtqp%Cmp}4VBs(#xoNEcgrE!pq81&zh5WtmK~a!L4c+!x1t zHqQHcpYq?5M@myX%Z}GKbDdM^oyIPuk8~ z)o#pS&BUi7rLuc_Wc?i$(YST*> zw0wWZoIThhL6*eW-v|Bm|4X^+|L$}Dc^u$_zVE-0UudA=636a%=?PE$aN%_dApJ6L=M1{nVHL`4?jt}uQ`3al~qXIc+E+_rI5C$ z6^{j9LY7d^T{i^f_b_^r9za7{NeIxL=3G+O{o!(0Y7RBSP>W*40%Ey6o-=Mz=aiS! zIlFNdxsqRz8bWTV-Nr<5s&G1tf_kXu-b=-ateD?Dm?}9ZKbZ+wjAb#?Ap5Cr;i_?1 zX58~~s3A;&)I(=PsWf=mV8r~c_6wWgL8fdP^83Q&=Cc{p)cwHrq4h#x>e$zFy)!B& zke&8f)wHKe2q%W0svc-cHEa=cu~ z1_ooOaAsYQ-^9vQ4Hm6ZS%Mk+^hp}8wYoq-J=uH6zN>v`4<#G$$aSZWh0NOX z=1dgk7N+11o;juk$}lU*Hb(xWcZL1}%*9&esvpz~a~002nqZ9+=VHoEIm?6syUHLq z=|>Y)yQK10kxk%?p4y7Roke4^#Ab5uRdYEZrrU-e4N!I3CE-$wK0d+SG3?XR)+FSQ&+G`fwB5&TiE)H z_y)hrq2IwBNm`DBv?hcM-mo=AzG>(465F6g>o@%RS>or6#LtDe6CvB3 zY8h9WrTu7==RnYiAH|fig>2_UGuL3sWY(1fuQ0nW*Sbi%P>R9I_pp?#v|y3>^@IZq z$NqBJ)dU6eO1agp+b%jRD4EV&O_Osz zYaE@b$Mj^6I>Nnppl%}kGg=?>|84gm=Cw7MKD{RySyH`;)%#G7rnV)kXEC;-Zu>$> zKuLMVjQ1wvbF3$^dQvMa<{7j6P%D!CNcv*0Tkcz|@>#wlO((Ly>OQ3Wz2|O{sdXot zKJ>$AaL*@EEh;^FTD-=+XEDu|pe3V(JRhtTiN+39(6H+GX`-wfsX zX0)=1CjyyLS-LWGf@?SULg*>)j^DbTZ(N0RGWl(*&~7TfWi`^#<+rRtddvK#Rj|L! zZ(4dW9lJ)w%@)U_K5q<>-n~Id=u!FYu|4JJmw$x8&>hVLH{Bj#Sd03rI!g`lpErmk0SM}=!YUPC!Mv!4| zkH^8Vf@MfWn=ECZwQKb7mC(nG$6r2eho9b8eQDYHJ`c9Erzwld;TeLg9PYz^C-C13 zL3cPO2`1pMReCYzn7))9bgKx6^2M_Ll?LYkw!~lcecLiXO z)Bm|kz#iZ@7D%J~H*XS?{^rf^i1aP!#D!B>EY$Yawu<$;kDNXpsjs4Lpf$c0V5>T1^z`fWQ?1@Z-s(PtE*rk$t&`V2B3q% zJJRbxTmGGomiuq0=~p)iOW7s2Z-EiPUB22vRVz zbkAfiTm&*Y#r!;}X+o8EQXk1g6?h_G8K5SabWkF-TB+)?daxIBJi%(B(U*co>=yMv zD`jHc)~|-2fXu-L<}SQKkLR?fCY8fs$b>@g3+8o}>9b~R&z>%r6u(uV|tjl3>ktJx~4TK)%QyrA5rn(^GmA%Fq>FYvA|(M>M~qN zl>=AKDbMX;EZy!j1t9@^*AtxRx+)c*lP~PnI0HsPC8mNp&XRP`MdY;m&w!KPj!AQi!knSuqZ6$@lg77B!fTH ze^ZlYX=u~p&x}7amm7Y@R!T2g@F_=XzbZviY>k~q?mW`C{PD-M?yx;87OJORs^^X( z)&OFrH78!4@=yEiA^as*3bc6>GmW8>kT*!t0ldkstI+=$eo`(qN@}BuqFbwxSJT zg}G>Y8j%OZv2?;n2Mvq>YI@^HUZIoK5qTBl7E^=S$359|?UcxopR7FQ{!XNv5Muwz zYD1E99p&Y|%rG!XSq9X}_NO3$XfJwH-tw`B_f{E>1R1qcJstmAER=ObAKFMY6Sab4 zR@9U`t+~MM`<-cS2K70n{^?p^Ymr}i03Az111Lq)k$=Jj2;6`l;{*he0;VakeNV~g zi7wValR4%Lk=MMbK^A8>ma{>CF2x~u7uxy+txke_*g@qivc_mm>o(gVJnWWet@v7! zEXWub>B@{e^b^$B_%OOlxbaUfqp=@`9&ASF`~|ABsiU50AXtSH^56vMCITkR?HAGY zKcnqI#yq8(k!mEdWV!p+J9@E0yY*ohXnDmxVIqCywB0A)RipQ`$-YgEb6aV1Wkqf7Zf=9Wfb2 zc-TVHZ)%UK#^3R|i_XI<6|!4o5Bv$5RtUCfq;KA@u8OJ0l`6vq;r(-Ak~ zR=Y)v_2P|goBb?9> zenJ$KpLRUvAFB57!2dRvd7@yW{ApE>?@vN=`jI`QX%fg^s+M3Jj$~FU)-wKc>c@8V$!5 zMIdtyZ$x&^R4PX;Ao^`yB3czazzm>2*iq}%>Yx=kAeN8Tg`KVuAv=C;5<0|2W1On2 z7BPyqVB1^#Gh_7M0C(U<&dhSA<{A!<;m`^0i^lPPhU4^dQNx?Dw){0^ofzARra>Y@ z17Jn7LepcfNaob`;3lC<`zhPP^kptCn;F>~Ogm6iZlldoj8%3ra8bx4`$tiD(ja2P zCq#Vm48V*5NKLgK3bU#U1>&?T>@Hnc7QD7sdlZS8f42RsvXYKj7-s{q1OVF9dMXf0 zDx1bm#t=F24GPLwLDPtGjH6}Du5;rEBw1%@{7l6XXn*?^SaRD!yF$YBAs&OXCrX>(R=em%?Rba%W{N+mO!*);%KK&8K5Vvbu>I3pGMfx{Khr7PJ*p?5$E ztwY|VF?wl*qP8PXicEKfB6#Q|$>l4T52-*~R>TReDIRzto>r;E<5kf3LSrIC4_0)U z7yF&l=6(xs3k-to-iimxPT?`KQ}pnp6aTjkk&abS=i!+D!R{|b{3z!QKq9Wiw;qK= zb)ERm%NdVk#Eh8+h4c`3%djp)+#wYYS1OY|e(8_N0nN+t_z_M+nsvx?+wkq@AYJuC zlcK_TAZzmcymeqgfaGIkS%j|r%yV7F5TO7g`W84D`(iFD(g&U~3lHc4P_0b)I;4 zFgiy3@(_!CG2~RPo1sOv#LZkfrW>au6rZS?aZV)}*|RRn za5rlwPQ;PYd35cKJE$dx+CvmyXb#HH5W?u`#s=-7)L1QD`hN}Nh@l1?wc*cc0PE}P zqB8JC*P*DzM%?*pFhl9YG|g5BtE560lSjGrW>vkR0>Myt92j=xl)l9fzK&{CS7!`h za3^4O4wcPl<-n&h>{s{383>G+v?H)AYU0T7Nz{lR)8Uom*_08pNgjxmE&y76R4blC zovSEDoLmLK<9SAId)j=Z;a0HG|&Zr&9>Ibuoz}>Hps{75~ zu{!KOKUFI3XL0vyR`2g-ss2}ZdsG9kfb9I=+h_Zoy@TfK=0QchQj==WKBq_HSCo7_ z*dECFcdI>Yr2BK@^r&_8vM!44$(STcxo_LVAc7C6$@aR$Vl(r&#py~ZaTbCp${1cmnq zW#DUQ3LUVd@DzA3t&R+Ns+?Am3qg+dIs!;=(q2xSz!^m@MZ9(*4M{H%R6TPC7Zn*x z8$)^DE42$}L~+?s3Csz|{VJ={u_Uff(oW@VI2MjiI~rb;hlO%RJ9Q!Sd+8v4TB=4P zfy##(D&T(wR-O@Q0FY-2gn@1sBmH#w!L$b4>Eei@(}nM*75=*_I~mz1B8ee#Ajn>7NH$uH63uh%F5?Oy6eB9KhcbqQ`FNrL%URNV_VULoU~J! zskNv|=GD?E%NWwrPDM&eK~2_W=>8)b9a0~4gxo&j{wD5z7)$nwe16)r0=9Cthx1e_G8Q~l1+N^-1bdel#-i2wY?S)Y_e8Tz z^v#EhT2k#Pxny%^%{LoR9kuhpoEb4bTDy1um?Ye0*vhbS)aiQ1eg@a!v zLnpizD^H)|i;^|Xn`KHz+VU@spUFtE_9)EE{o0o z%<6tR7_MD%TXV&q&En0>In%01f=C|DGXXI{V9f&RD+N}-LB_a5UdT?PYUXwql*~|5 zg_<_S0A=?nnjdISIeNC#(4sK5MV943{C=*SkP+6d=x?}OUEW!~q~|gHy(4TrKR+(X zhr3cn_};p{cpM?glf5d+rKDfx5-Yv{&2~?*q}^P25p@ zZ`I9SgSDlaZ;U5PVnlpOk$(L3~~T#Twi2wq8J1s2J~QYi-ge?R#TQ2{W*K8 zrp^>>OQxov8*VT1gL^r7x{k!;O{?9`7ava60>OI|8PsKN>Y>m2A_Y12s&IkJn%FI< z(4ySy5kmM>m?#17}KM)j*PTO z%FJ#lKxG%SGGu_5Q8lNKXu4&!m)#v1zGd&A**NO(bz-c7jPD9S70_zz4)l}A15Ehy zLGX62Oc&t!fdsO1CxQ*28)g#E1eN5Fu*9xNQX{+^N9mA<7nPAa>I2z>RFWwkBKa`^ zYF`%wY|2)Np+w&#CmK3%inzZ_0C|gW?DjloAkZeB$_Fl?_G*#mOj){;0jqpcX|kOn zW@#^SB6-l2Yew`FVXtj{-d> z^GrFF*XG$W&pZH+0BYPH&zgPatmK4vrmXBoc$TaWX3NW9Ipod#9`mU?J(r!~%RKC; z(mI@+jkFB*6sZUiB6S9mMA8l=B~pG&MBLoHfFZE~Pu_TpI_VdVSByYi7xrVl4A#)bMWeIJ#wo(2P*!4tbIS$ zz8`DfkG22CV=V*2#R+tg$H&BcfYnp$%O-d-0 z4qcY6mbJQpSwcaZxo9Zic>}Lfw zd#&U1wiWst)p(Blh=ed?&D2MEIQfBcE?shEgyN>2-*=ZpcM=IyHl@3vE0;fYy^#~# zi;?U0S^dWp9^>^`VK*KT{`4Fu#oa;y3roQ^=@PlnUMPs(U_$Y3t-A4SX|1}sR>n5G zJUVBmNRf};l+c$Fs*+(BZ=Aq$x`30a0OS~zfNs6e6^;n+p*KTl@6e0H0?L-!_u*^d zKo?vmjLIZ9>bd}{2TgbT)k5{?xcLSxLhFS;egBvE2m2O}{aUs5w7R;Clees*M25@1 zQynYt@9D+{{??vutk}Qm-=AvhwUzbt+WHziuhdqbu5bKFZ2T(?r0R(J{ogSE_;+RV zcNv<^_4WMuuWkORwg%I`@^q!P0_&uHWX{egFRv|J<$ftgUZsKHYlu_@^qc!QUCJ|2_M^_6N}aYpMOe`F;QY zA^%2xFmwh){eRyK-}isU{(tuE_y1bz{C~Rgo&Nu0`2R2pVE>N?&d9A!qKhpS1pNR0 zumAJ^top&__YLxIzyH_&fc;-f)Bm;a`~Q#lN3=hh0ZBo?dy)jef8V#p_x(@%f9u=t z|JBv>{@?h%|Nn@8bmafP|Ih#X|5Wk*A9?rhd*b{4xA*_kKY;&V|GxkKoBomIZ2S{`Zvizg9Lj zH#XK_|F3TXOYnXF{{jD=c%$B6(sxDCsQ+IT3ntm9>qD|h{~-*cz;%W{T1hwLX5q&| zfliOH({su9zWB{bAl=g63I#I0ez9=ibpt23$IvKC;slr5QF!W(2lvN+D?>IR_K(^p zPVd@{#P~Yeh6MPjqNDI%y#B(<9o{;Y=^ZK>`=iiZ;8(|4C>PM4z3TM)onIzUf#;7F zM(!>KMK;f-k~nw;{s%(e8Hp_i7P+EP(ET2A0QV-r5i^9LTbJ_Y3`kMn*X)X zIBm8&?eo38X1l#aquZfP+8Koy?PYMkKx`aCU!n@Dq4%qcFMmP6+_Xl!-8_ZPHWy?q zOH{pSHfm6hE_sSY7*cvDe)vJWf^5xEw4k$_wiSOXS%Xj#&cLHM7VqMt^FhGK29W&W zGmKvtR-u*!ZWi_DB5>V~91K;>=Z6=};bahbP{j<(255|xTIQ+=`s!iE<#Xx#mycRK zu>u>3Wd^GtA7r@~pE8BT2~oYk4(tWAZp$#DKn(SsS87DT9bQVlT9n9dlGz6|T3f)TbkJyR1mA1h^zeh- zN=o|cU-=CBn(YB#Vm~&_3-<{j@ZHnGv9l-5pV)R1}sF|jr6Q6c%Dp6Z-~R@;TP@)q~JVHuaUxM zTG(;sJ(Y+xeb@K>Uo8Jq?k&Dp2>5{f|LHpF|HR~f8yg$n<^TVl^1rt4G)DLTtunyI z(c5zQecs8@NFO~bcPq7()s?lCb>#Jz)|S?nHa_Q{J&&gR9t~(!0$QCB5Da=Yq=K0C zuL!82mN-I-z;XBEY14t!pt*2*F9{gDjV}_7&{+pf;bU$QD0Ao00uo((+9?T{as?## zEg|s87#&M`vVeH?$5DuTqns?79>jD}JhO)m&>2Cpc#WD<`7v|@&lw~>uF8+n&r9O# zn*JIE_la-o@|$}%_5wHYaYKF_0%a2o5&{?+P9CApv+e!=P5}(<|9|PNvOV+W_@m@J zkK135=g(=*{@VmSvi3i8e10#{wt5jzlN~qciL<-_vC*R{`qYpVQ5 zh877Y-QQa@lI#Dgwz9dtA^m@?u5AJn{il^$ZS%YQ=MR$q{8=n_z0q=bRd^!y>?oe% z#u<2heuM=P_>;&RxgzWZ-Z(<9e6XSY@qOT3UPYqz?AdB%b)~i?UI4!*+Wtj!3kyrU z@FydNu_RifUbRq&JlJL!RAQ%u`70|>ZndPtj&fLe_(d?G1hXyf{RssZ0@SBMbh#K^ z)EV`cF}#EiwCg=202rvy4Wu8#U>K6GLwG@7gD=q&qcadElkULli36|aj?k%KD8`r) zUQzH-j5Z1d@;b6DT#sVUO0R}uO;sV`EeRhZmM%CEHan3163fumdoge#QxXPIbz6lD z_CgbbjD0pD;45^5N>MR96AgC~x)+lHd2a+LKex_a9iN{GIE65H?rG!b?Cmzi_kwv7 z?v2ZkJUBEwj9u&m7?t%Nnhu2zo2PrPphV+&>!5Y^7TPafw9by2?Y4Mvd@35^q;Y!I z+B-jJoQjk4)05+Nvx>;uRU->9a>kZ|fA}zfeK$hP&wYLi(-}g`27Phm++bwip6gL) zU(tg#_3)el3g<; z)4({kD#i%XxjHvrv3_a&WU&ELX{6=?S{|eNx!dEb`ePNfn9EZO40&Nyosf;<)-XKW=?E{J^w9TdwIFvIB2J9ujO7sl!L+L> zpxMF*%)II_WLq6dsami6|< zjv*vcn4JRLVK_vXpRQ|`EiOy+{E90FSrQnh5VtvW2+)InIihKU3|M0Chp1N=cW2~{E&*TiI4=S&UZk4T5rbpibb42+YHX=w47~1uTL%=UA4KRS z_x8$ztTfH>#SwDQ>%I?dL65dFnjc5R#@!bvya!!J|F$>^xM2b6#G^yl5f^|cF+47O zlI0;WqcRm?PxfvAiz|svsyzIzxb$JksM%Ii0Tm3Lu^v?Px$93t_PtBJVbpaAs2QVq z4`F=RM!=ucg48zx41XHPb*!^t{kDD9JVYcyk=;XohzmZ%Sw=9xOTqYEz?oVhygD81--_7_l#)Itc@%$;wcYFd?j|9&d7_KX8jf^?cxk zym%W9;ou-uo>P|#_dv7KV!EVvi%KhDE?=gBP@!U_GO2SZ+kMLH#s z1=f+)2CyRwfR6_9Zgu{Ns9Z*3MPLA0m_Xb=V!j4o3LGHYS__}#>moiyqFjiDCN+bO zaWd(U+TNBx)a*mKn^ZaZFH|t~@OU0iqN*ws&%Kyx(a^1{16|cTUz^8{6brF< zpa_Ff76(4;=0y$YiFkow^k5f+NQeP-a(TtP0Or$3mCmnfqV`(65?zI9rqzB5ZI3~R z3k9C^Cp76RWxFp#xWV#PlnZx-BAHsTO#xi3Oi&kNr6V6t3~0M59_E#&#vncA0;)z- zbBkwjqz=JLr26UPK)kqje0YM43$Ev5LXHY~x5a{oQuq5Z9?-9F7XmpnoWOXdi2|M_ zQxvucda;)Zt3Wn)-Hsn>EM8Msyc90~sUbm+c;538xMG6otWEymAV2Vt7 zSODMgDLX}0dX0#!8}=7f0>Zo=xsjcg^XfWXPZt4Ba}@dmpa4Rhu{ZE1easZg8b*MY zD!nVm4>8FPS1az2h9iiE*Oiff`o#D{o_bzQ^>F!xAz;B^<#)Ih8I1SR6V zizXkiG_PIzZ0@@~I3sY6Rn}@NE8^Aw#sovVbC(IPBUjJyfwXMl$`l8*z(N@xAR zA;uWV=_^9SRko4@1dT?yhcrtpoy0-p70hj>Y=nv_W*X7@l zdl%8sO6RN>a;?r7yGl=kh_@@2hgpQ9`cgG~)C(kx+mM>WO<&to&8x|WD=)(J1J4BI zU2S!Z+Qb0wR9h(}=o2h|2-G(B?GpdO+yxF%9g(M+a|MKzN4fj{U<|8`>$5Z<{x6q?z^gO7adU@^P&#l{|A8*tJBJ$xXp!6gvtG8PUVoX)t z+~IBtrxXR`5KKb3w5fG6;lVONzZ)+D2~!GPd6PR`3BKIAt5*9r)hBq~xYzVuw-6qeyd4$)l*ZNK_I3T>bjFx!L@0sdq6kgR5T$anipgh+hE$ z_PuHoJg!#1vPD4B-DNZhlE-k&ah%G_z!_gz^?z*_2KPY1)}C&ue&D+wLP9LVM*Q|^|!`ZSL2zMyULAhjAewz1ndG!>wtA!GAV^ln9MhIn&h>1%wi$>brGd(eK4;Zo921*-Ba^v+;cYGZ9e^A0b%g`lmLVY1{A)vzZvZLMt7h%2IP$)EbQl^aOwukp_SGxo!AZS(GqGq|hQ zkmQa%=rT+^rCoS^BpWV*wH5loq8E{B(A5@@g93jy_;);ZZFOwI!G4(7F2s6T0|EQ)RIiqWp$PQsb{XroWMMDFFZl zF8HVG$_KZr9tQGZ;F{dfRsBq>mLJ@Ko$U7_m!wSGZ59AsqJjAhtNWYCj9 z|#czjD|*o9kfOV_XTm({Pb0Jnp;GX)rnb`1 zzw^|BjO1@PhUw$yQ9q;+r(fDX^rUe1$Rqj^e^%8mt$2QtRgYkuV~0jiQtmaB>};W+ zCZMk3&!|riYWt4+;~KVh{7?ELL5+Q&-p07Ellz9~|>U{l@1tItu7%{ew)EKVAMZ za4lH!Wz8Mvny6Fwqm#yb_RueX<)^NByit!^n|JDQ;70n&wTk6BjGxO9nk2fl_ z9KFc7^0B3n$0rZ`Zs>;%`LHQ}w{Yg7Kq2}`7i9x#W^dpO5&Yw--L3h`K{ERj6k8&}{c+qYiNN9eU?AAUN13yPnG{*RP%D#Yv=r*w4It?$pvnNRNZch9 zPh*LN)iUt|w|>wUMG31YV6XJ)S`_7}2(jy4dLtz4>6Qc-jX7_Tx7yZbXA?yjNqKW( z;Kn`7f+O`r9C!ce_9EoR=^l~#0V5e>KBz@d&0+=qhoeONS!*yz!QklKciNN4+VuDH4;N2YxPIiF_#u$31OADB z@61Xe9*Rrt~W?QT8)3RQlbFnPjTeEACRtg^U$HJW~(AT*(Jh92qQ5 z{KXz}WU|!rKuy)ankrpLpSdpnfM>#rJQP&Q+NOE@X;nSyjl~BF zCvRNnBKNIKlKhWnlKalEbIH%h!NsyLOP9*Fmdv)6m2G1sk&Riq zRJLcyY^kObQ>ODs7B7_{NMs2zGi@d^ZKg6=lP1}{REBs}%<`o(Z6-2hRRx@0JQuNk z>1@dBB{DMmXJ?I%WyU}v=cm6j8>l}IJ&odkpjxz$N!W+yl2O}nTQ?K z#h5oVACPN|zsb&OE>af_Ci;;%N%bmuNh&6}N&N}f*-<7wOs-|58)LhD3(yY zAX{la%aN5#rg|nWQ@-d2Gfl{D#-Qt0WI5%d90cY$b;+?J1tg1UKX>hy8}kC(r+ESX zGX@Nq&{)FFmdSkc%zp0LFB1L@&vSUE*938;`o&Yk0WqoSX~TNl(2tw?$(+!UH*gK; zz^pdKz^Zp-OsP0=sOG6=9z*lEYCYbpX&8>4e&%e|8}qjM&9yeiojlo@0_R8Md-(|t zC3AdhKA67|C#?H+Pm59U#gyY$9ES2EXyWA6!4gx-mjk~GXLHoM0y|@ZbNg|wl=$AKiyhyjc%$W z2MAeYL)S={_moAS_=9Q`Nbp8cMW&8>@*#9Cpc|+xHS+Gpz0B*O6^5XpXAB%K2a^fe zk1OvYgQrBk#2NNwqbGe&mFPOXNtjW9(i2nR^nIYtx306B3mBL(n5)o&hVI0W z1Wp$x!dPa~MIw?W((l^J=2qSn8h%%0hS1HN&Pz@`K4mZ>#JVO5$PGnvtg}@Xb2F-| z!-U$DQQu;%tz~m}2oRmC4Bj7EN&cor@jkrKWxPwe62sq0-j!lv#xO6BBR=*0@WEnO zt1M;%!G+3T?q&jk4PRFPNXaLE3h8r3hh?$MU6?LuO>2G9IV}2DxPZt}}2(y$q=mQ#tZZSr+Tx!x*cA1E+Tl+;6%h@x<}5CY8cO!K?*B zMIX0V)8H+gqd0U$O?lm6N*{@j-CW7(<2Mi=-nsJCF95ii2XFI>z&*=AbC5`yUJ47N zlAKzEJ@>NLdq_-4gNhkdA<}BA^fIKQy_(c{OYII-Xf>nI>O+OrvP!KzTx>n7*!qLT zwz7(C3)0O3{$wp4N{`Q;JGjtgN&j#%%Eif; zLud9vzMzs%EQ^W)=k6lRteJD6qM-#smN$iSipI;`Wo5d{?O5L-r2+iOJ*DuY%C5C^ zu~0%~7f7a|b0>e86B~Lmqs$pRv4=W#vsCTd`(`GOFi03@}2X&N2xjf;{sakmTHF#Iw5DI)n~i%t*n!HE1p@M z#cQe{F8qu`b<;jn`_`uF|MPO3acksl*ae0mkR+5-l^Wlz(yZcd*7A`Yb9XXOBvRK8 z@2t{!OU^1`_siW_S-AmL_(T4I7F+1^epn30ZZTQBGUY^k^pTsaq&xIS`J}C(>nWou zgo5gH36@{e-xU62{cuD|yy=GUlSjI6UR5xxZPDUAZZ}zx#t&Wn!09>D;s#zX41I-0 zAiIQlakmOEGZqlavE#e~5F}o1Lq}>sUXsu^&;Y`Lp3Ns@CG#MRi&mQVXrzWDm35?A9~8eJE`Jf_U`Gg8u|KXjd9z30u~irvm< z*Q-eg*K4($@{+TU6<>R|nqOgZRGwXLCTiP!bbFsd=BG9YJ7LPIjltNmif`$XPsEGX zo5N;Z1TI}RtD7q-I|JA)yn3t=RO=DaS5WH7>E;phKi&H9Oy<{*kp66q6Q8a9KFy*r z#`v$Y&#{#9qoC+<+j`{8je#q_c%UvuqZg)37ScSi?M^ds3tClyzkAt;9nF7OLa z(PYT?K?7#A zi)GSMF%Cjzix=v-vj|3XW>eU^2+)Of-WhDH3}unUwB-i8EgpJDXX^J0>^bIe#?}@q zQ?Oa)a$(#-g_rr3+*-o~^7jCkkZ=M6;Q(MFD`VcV0@LuA7=7U6`5TZ zzVqC!pGCFdmsDBKtyKg24-0!KlhGyo(wTsg%fqN*%>rzu2Uj%YQQ2?8sV6CAzfrkI zPA}tzfRt|%N{EnAmFWdQ0%vhe>(D0nnsGF;u|15}OeYEFHbrke^s|+@KX29tmB8(~ zgA7b3EqU?hDRGYYw56Y(W%YqpAet%brra8%D}1S~ zd^08UO)~S{l+1VW%>H;|g*9vZ@#adeGDYO!Uwc`+2CDerz7wqNLt8Kd3fh7sjw(M~ z&styUdnn2%3z3A1ZI4Jsm5VZfKFF0#`C;BIcOeloDYA*dzjy%j> z;)eGdBZJY)u5SvJ%f<4h@+(Q)akrmG#Yd5+Gj(%D*UEz)EJ&wf1Fu8!C|~-li#*$! zMk=U0mBpM~kG}_m6&-m*(vLUL84mr~q*Lw=2v5`m@|@nRn5v__wv+zw%676`GPS0GWYu#-rFFM+mo^ zg@r8%(U|S@#=Wjvevn6y1$daS$nST%B0~3nk`uGAQ#ro+blGb)} zVc*Ry0kj5uPANTvu9r9Zt`=>&o+g8&=2y_i7`n3y_@JZlN~}edVVqgT^A2 zYxtb<;zWhV;nUeJ&sTMcNsv|3BuKU^TFvJnV+=(Y1x}QukxF!~{F))f(6*nf$c@&Y zSql&|JRY%xlhJA}mjEBFY_Q)S$Vn|nwV$zP$$ma^;0zFSEZi(jB%&u|XmCs#Tjo2my|reG48%?}=#ZaDp5G8$#cym;@L z(l;5X3e6Vs^w7fl;gEtGK7}~mV{iIk>*wxW$DR9Q}pD>BI1!2(%KiOf^oO@ zEE`jjl~NpSu&q*l_7vuhV0LPG`dD|@gDicl2x$()8AP$Jt>*FdBs`@8Xzh@j@p$pm%^mzdYeQbFt<)+PlYe?qsMdx&j`AgWc_){A%hfP{pj`g+ znI^94WBA7hqy>~0nVg}cn#lW8|=cjTOijf67bv+>Xs z^x*#19SmYF4%mc<-4~#%t4H6a;1SE^m*F@zr|kVOLthY$lk)Hpj&O$D2W<;2DV&)H z%TF`;Qe}f8<*?Ou{)+DBEnjQW1-6j>`8^CdU_t;86n`|hkAYaiI059hKU|V-2QlB! zM~B<~cmju4l~=|r>q5&~ACj+f#?6)9EE$p5e~<+jW}AGV;VAhpRj^1gGgo2Lz`My( zDl|BRm^8HF%tqriD;t?VJ!};B9v*31lcrlY;^L3(G}K z51OuKNw`t%S$mbWGuKu&@|`axOTc%$S{mPyS$wYoPY>9v(2#Snac&7EZm|n3szG24 zt3&771yYIQgOJr9MWPu5uG7D-*guRAu-ox*TsJ)Cn!|#gdG92B7$9-O_umik82#;Eka&&Fv+IvXRG|-8wbVNfY zon%|eE5wemL;fliU$98gp`@{@m21fg%!NK@bX2V>dT5>mejts!*piFiwXau(U1NvY z{9K*tWcQQG_KDe?PnP3Y{!-57XYi=I!&o53xh%4~)z!(Z$^lgMGSS!5TcERj(!{uF z#SATOkg-J+^S;HLOF>5 zFmhGE;L(ym>=1Kd>P50Lih#EyoC^$uhxvo`DvvU`2gis6?9{t=C4H>J4AB!Qpf4)# z;qsAmoF3I1^ zzk|uhkxtEJ7PXWYt+g9(9xxR2F&1fooW&2E(X)77X(76(pZoHKRBg1gcKOIu8)x<} z5|Gq~KtAZ04&2ZnN)97k{L|N)yU-iTCnC>zRM858-NDQ89^NFnO8$)T0dG1@BgcbD zsOF9zf`}*oj%PSF_?{e070iOyM4%p3s$Hh*!ScA|nSw!9Sz)lfzIqvWuxO+ER9W}> z+E;mWPz`*spRqr(YwYwmQNJJFX>a_jL4u=kr`Cu+k&yxhyo`LB2O9!9PiBYu7o5e_ zPe83ofBk)b2xkOOOo;IUYzV;UazQo6D3p}L?z$YF08J|7s!fc#b}MgQf_|6Z&@z&X z!*C|2t9O5SE8B!BS-h}iFa!k;h;#XYSTMN)++kuAhX8#nM_IB}=6Q2ncFKx@Qb|N! zv4JH+u2kajRx0uEDzSmQ8{aTya#j1suEIn8YuO{#mW!7pf88pl9u>KLf-46GMDDP@ z6VP|NG@%EzcKq<#i&TgO3399kMC;5X5KTNji!`z0M|UK{G_Z_@mqnDA06%2-Hxj_u z84T4f=IAqAJ-oP+Zbac1LKTkQ-2CwHn zX=+?xJnC4lukU5GSB`hh>mulzA%LcYvb-;Yceu%ZkK7BH-wPtu`72)^KNpkURp>G1 z58S@bsa=etl~}+dB&-l?l-b3`(B)uhZss}LJlYqnBeA$N^_XR<+$q7odXc@&M}c~cMr0B zqMEGE#p64bVJ(c3RN__*M7*elS4d z*P`?}L1i$mXcE=+B8A1HFvch7UBR)gRDLr(hi6UGp9F5`1~<|f zPYeZ6Y)T}GH>$L==;;CO2s3@c7RUCaJ-YTSABxrW2P0yy096$M%~#H_Hmu;8p7{X@ z{Onrb%UX63;tI0L$WXEr|E)(M6Nrtd7(RkHkg{o&o53S$u+y%Ly=zxTpgJE#-hgc6#K?tNf*Cz->wu#==<9_aP<9M<>h(~T zDK1%GLdIK{F9-9uxox;LoEgiwY;gJZuz6u=uu~HH;QlRmM3*TT(SF_i6DO`@-CC?<= zlKe3y00Nv{o`vDo9uRS-W0J|3-{@|aWhyb}S{M_Z*mG#{#I@oB>yU{zz=5MwXcC}A zU~rG2F2|ujcVJYp4 z^AzvA6kt4IkE7>C!M!0@im?#9MHT@pgitMjDdGWCEXz=_7>%4lnjj2UMsTE6iH;^v zmnMScjrWBP`tZQ7K)$J<&UQ7z3o#6llNOg%g&jwmp_*FcZu=Lb$D)Q zC`W#KxCXqNpgPFMGpvNt05|gu#p!&|zrgc5Y z!_BQl=@d(&dSb;bBU4=J<(TG0b;SlCHBQP|Djfu$V#;OA)6gAf4Kzg}j2B9N%qT_b z{#oO^h$`S1IhRJdtH+sxBG4EkZUOwK;>vS0ZH=R22fA@;xtK97wW_*cCwHG&Yrdq~z1uf3cvSL1Tp7PasN~O*(6PX3?mNIv{0w0F^6qsga=^n#)%`1b1W8 zaHFf5+M|oW7iWH;+rzT4WVc3?jAygR+6;6^1kZ(+L+;R#c6%j1-~}aL(T98@;ZTQM7+*P zfOMEr0@1LNMULlTRWqFfFAYA?6+$c*-@NNwT{j7aTz2a3bf*yePCg>^ca||u$)G*o znD5%INoPuTMtVEbIq2ddmZN`Zf2SLc*mv6gb{4*tiRBr^>Y#f8DbbYTgS=rg@`Jn_ zDy*QH9<8sZ^C6L@NhA?sepcP!JQ=A;|?U zs4ft6gNiocvGAw=rT=;rAdbQc5MfWNtIK<+Tyo%rQCN-c zqTj0yAa++a*VpkE!&KV8@bBr`W^Lt9we{M{`g(1Bb@l0=R%)y3>uY}!|55|VomtVp z|04hP4jX@Kb`D!dt;6%f&S~?%&ReI=eX;PmdD?CrABi=f&sWNYLhESn;C#O+7WS^( z-gRr#8%+A{3)qxE1I53c!GYiQesz=SFXZNJ-r@R6er?|myZ#{i+g{tB1U+{TNUE#~ z+fgv-MX#LjkZxC!pAWol-~{&ybm8Rm_&=L_XJUbuzBp(cy*zKcY_`RoP`xhlekh7E zVyQOqIKX!*L9FD40(am7kx^(j0oq>UwAtPm!u*?(nkYg z*e#jkvN!)}gxE@@|?a@r*F5f}-YFenv$KwN`pz3O0tkd7o>q5)EK*uVk_Gf@vJ zWbg4;D4ZF1*DjtD@1W>^^eAziBp zbo&BSb07KU;tb>U{JeFr-#Kfx&)Ryx00jgS=mk(i;p2vCdM$g$M`w-JQS&srKDl)< zfF9N?7Cczy9_*-8OP9m}3Moms8^pA=B>lsg#Nm8xgb|;pLz4Z zRoz8YDes?n$&?GtqkZfP4H)bSVDte;Un5lK60vh+uVt8fB%}43h8;5uZ+bKuhwayU z(AxOqVxsEM>G{!F>#!+`up+K!fG$_doEhp2Xnf7Ygbpm)7p<4)rwwdD=j`nX9Q$|< z4#&|w&h!WllNKD-66gA`%@>Zm(LbFfafIg;!(#b{4E%VH;tyv4_!spYxf(g)0G^{e z;NUWt>@yR-#4BA&!+};#!U=iRq}D>o7ssc~#@;JHOmxZBA;sSL-*S8U zS${NeKNC~fK0C!#vv78Nesa=0g?tvs&tigVGaW053*maa7&w<5VBi3CaUxubnjK`b@TTEdeYeY8{jDmPBxga)4N6@iIwKV$Q#M)>aQwV+&{28hDF9_2%*!Z(R>AylghF04 z4#;+%kYiA0F_(W$OIMH8vLrba5etM-A%D0QfKTn9 zK9JXQDQYjg`-2(*ZLsBzd-<(lo|gV$v`c4x@Oqd^&Us;Jp$4SyOZ zCkIVEUvSPIpP%mGQFD0GI%wkf6y}~NruK(0>U)0m>PI{6jCSXqKVrQxI5sH*$~f@` zb)hVND?EX<$Gfw04Eyus)$vhN?Cgk@!V|uxKl14=-aA3lNx9+S8^F9M$ThsOU6_M? z1np^|{lwHJXSDctYOwh9Npxfaev+IOid&4R-GdR%NIJzZJs9yk7Nn+f60t8#u}9w584E-ZVWSK0~2&N6I`C|z~q z^rQjVA1X{?7Ksu?F&=<1g%N23{-*8Sm<^0+MjA|R`49@mJD|(Ap-)({xg?Cy@$td5qNt~rS?Sq6ET(BC zfr85`iL_^a$pBcGFuS?P|F$0}no}tjomSExM|qVVpPWs{jh^32Y*mdLTgQ7-wkj4z z=c>c(!Y7T>#^H3V><-*s4pwd+ApbbEbmT-CSb|EQHKv!vlPRYxG4a#NPCP$zsG;n6 zD<31KtJFoOR@ol_F3m<0`v-taa|=#J9xUX{1$BM|tj|7{gwyzVB#wcDdEVY%A_ZPj z4^#xDee%j1GKGGk-ne>Yh>O@kEJS9LiWa!-7@T4@9y{ARL2!zN%K;mMlp`C?1Z&B6 z8Pu$n#MMaYDxZWVeb^V>aBt@s(3eZYFFxic4o z6RtwHym1^P!)dQVM_MNj!pUt;tUbA4blF_Ny8^R+{4-6zx?p8(YU2)}$G5$KKxvy4 zrjz&s7SCDpkO&z8I14z3#(^mAlL;j<_6M+DiB&~&I>=1&NKx7E>^DxKUd<@+Qh5k2 zT}?~{`|{{qLd3U|<96$fu4AY6?AhANvjhC{<`{~q^i6c)GE4pK$>_K}wf;`?%~|sZ zS*3QTg9)e2=F!<{AHz*^<{s`rbKc zHjX;L4g!JJIKqDI0R`M{?wy|khB)r*H&0HRdyTWE`g8=daJIjf`o_@U@6p-L%H0Z2 zghDBeeOR2$7p{S}5ui$ji?n8@>==PDsN-#VI#oC-} ztc%QyLF3>B)(LTKQl4Zr$%aGR=?p-Cqs@V!dBul;F!`4Q=X5q0L9%@2TxS*q6xvx^ z6^;IlGxpYE;sTh4pHVlUhe{>5m=NL1yS^p710qu{GKEnNdTvoMg72@!0h*2gj4N1` z=TYsHrHykjjRX(Nuo zQ5zRKdF!H)PaoxL+9XJ~W{J&R0M2A2`!}o>Viz14trD?i9iNJv=Ay_uW0r7N#6-;0 z5!H{@3v38pNlC&)N`|$Rb}pmtjG=(aC4hXH>)EG-#PbmlU`z&)wg;Tqff@86P>hfrWf)|up*JU^vL|(-SdRI&OZZobw5%e#&| z7ME9b>{=#P94Ub*95T@j*(Jl!`_;{8vuZVNrJSP00a|I|pJG?hZP=Yh1uNw!< zhcFgJq%;m(UF^?(+la z`iTD39shq zs(xxVyu-&M8a*mF_ac5H%%_5K?d-sj?OaQyn~fOABeWz8yb-pkwz5o>GGubjz|fg$ za6~U~!YlMKqLfLgbr^1dT#bx`kNVw88y_7~x39gixIp_r$gqdQ(K$RmIzBr-YVGL) zC?0Q@fI1+(0@Uzjbs4-nm)aWm7*j@=%bcoY4YN!YmwDMdBf3>UH5Ywc?r8?jf8Lgs=%sO>L?3Ix(&GY{4D{Lu&)v`3A>-to~9@OU{8iK(&3gPAZm z@X$1NjhzLiJsu{+rS+Fl{#E&~d-rH2gag08|D<)+igeGCqmli@q!8j^dyLV$a z;LxQNdVKRo6_n-E6@ql_HM)@N8q%%_j(FA zvf6zlxEH6#hdCfayit5)3)?X5x!@w4Ab%V^2HY7AM>8l|gBd2vi2YKH0gBjNV<#Hy~?1!$Ih0N&>M=7B|q8RUz2d#)|+r-mCK6Xb}>psj;&5+ zQ@Cp#rS)-g3hdzN*;}MXsHf+Aee4e5JVwp#z7sk2HFCyyl^?oh&d#8(l#v%iPQHW6 zSyF<3+Bn)jJ|y^J5;$;_55;ody(t%lPH^3E!j99wL4OAQbO92`{m%bjWDub*35C{| z(7yt#28#-&7e#18fyU{}^TXzmG%!AGo}Hf_iPw#T^Jcs7MEVzPOd|h`+%T|lVx;s( zx~`&)0A%1#F0aUQC*P6`Clo(M`iwxY43Trqaca=rB`+yiyidA2+9;k2L5>5o$YZ?- z^xBB(I!;7O^K#;b7>B0ogiMg(8lbywO%FM2r$Rmw;7p>s7#Z;k$vuKt3Z0Q#0(jC1 zD@tw1orCeFO8xj{;=z#-5TKFk1Oqau7g{{QgCD$yfGxPt`dMQY+dNiDPcZ&>QL7ayzd()E!*lBdq~+P zI9{=G{78O4+|gxp6-sLrb;Ps485YHBRj!TplQIGz|=WjT_sf??rel zu(R?ug)Y#b(~RKyH1ynGKI(CTEC;!g>_+N7uO&61Dx20J%4nJ#YjOVE>FXmoUFhEg z*t2_HYtG=-xetw&8i&EjtA0}y4ZOvoYNo}+>a44#=4sj1H|=~6^d725LE1wVTXUXM zWyZY6{2E}*7QkZf$_c32bOY^d6f9{m;f&x#jK_nugRTQ%qVTug-IU$aB3Yk5Ri`8`CLMbgA?Vg#g0q z*}$V35>)h2AICjwIK10thybZ0!C624+E28nwdeeKxcNql>Gtlu?vN{8I2so z@hN&Jn3D0;$@!ZZvK_e*s@*@Fk*yFO&ZiXlAI^yu2AoUp8EY7=VdEG^=u?wRGaqORrqK$o|T z%~GW;#nQ~Omcd)PtWjspDXXl?vWiNrRNGwx#$@aH0ZPNhZhx%|hr#>a;vQ zIcUBHtiInmHDbNJ^V3tbO^}KT(%}(NyQht#_KV}w!wzOdc@avpq(BB8>L{;0$gxa@ zGRk>Td&cxey`tqk6Vq4-!T|vy^4){(Ezv(ltXQ>&;+7)1m82(arHL7~+21D$|2W=> zhu$PnF@w9%7CXGMI;79gVdgum_U7J`OG*BA=|&xtKmqFnU*=-pFc@_QJ$YJRfZL)< z1Uuw3wenoas^NVuvu^VtRMT5&!`jsFE@aPxXdR(bE0X(32Ujf8nM9y`Fv zm`v!a%#`k&HQykq$cps~+DqB|0xYIZ81(vHKu#Nr?~Riydx@l>L2aqD&$(65w&zOh zDl9)*vsYo&5p%ir9{&NwQT+e@??3;4|M!QTco4gM3)2JnMW|EWdjn zi4TiA{Il@xAMZzy2(_ZV@%#5R@&5g4`76dtHok~G`T7x=fB$|VuOsi@%h`Zd&p!Nk zNr0$mJV2MR^9yA*x|;v(b6zWU^BS=G)z$Cr>e`otasG>8!kv2x;=tl!idMbH(dc`D zhh7Eb#-Y0mC~xhl&pD&)j{16&vbQ%cfaBi}?xm|Y>FNbdB-`iDjo-KhZQPYAgnq?{ z9Yvg(Q4+Q$m-2gApZkz(e1qnA@jN~iQ+%P)Io@~W#e3)u;;x!a(np79bmjv z)De*0B%2-O!cW#s$a5h9w!&T$`3!>7NKE^V+_LI`En+7|K7 z%DzA@$aHkv;maz03xq0!$47We(jmKm!W`~%TCSbvjW&8zmAzBWr?7iDy;IJoxfjND zxUyN439t>>Wl!sQ>!5Y^R3^|R*xyFChp!be;$ipQZzn@#V_n3&f*g>zP@CjT7z^>X%5-mq&4}z zcXEQ(s2$s-F6viLdZJ^D{uv0&a%3%ICc=}vS z`zp1BH)aFUk}TqFE|NXfaZeAwl~xqH$43WmA341-0Mn)-7t825C?@dQfqUun?ghEf zu4qdwBST!!AqWwL$K2TSapVvB6v2<2%(IUGt?UKo)E&iA9&nI9b3-&4_wk|;CCY(& zfzGJ;K0q;2eL6XSJ6mw8m(?Y)huyE&X%v*FQ0czx`21*J)L7_kx==K!DD5?>2+aX>OvvSI{=MeHFi(+G`t*+c_G zIWPBXm^(P)iu=yUgQ;%=soiyh%c8)j1utPbCSB#qU--8pH^>77i)Qb%MgE@Q>^nTf zF)B91o^}sSOl){R>Rko?2!mqoAGMXE>advK!dJ(K%@ce$KZPN?ilT8?UtZ>r4%I8? z?yefT%TvnJiM=Pyx4xjf_FmZd&*M{TU}Nc@XDHt~$}W%TGn79;@5veEDgEK{h{*E$ z^|_k+nVOgT`Jvh^`3psP^JyU`di+4MHOsB`7JNc0Kn`WQAGU>38U+caOWs*yEDPk4mNAkaucG@ zZa97N#}t;8!oCz|0AzQ-20)IHG@|zgwkvtL1!n-S`?MnSrbu-R7{H%$L6JU8c9+jM z#K3F-Vspj98tC4Hyv`)L^Z=+-x6C<;Z{Ed%wgI-}l%G>Ri_{|JLSlgycWf7um+7-6 z#kd7B)c~+t%Et_b0Iu`N8T76^6w#uC6M4|8$j9<<9Z*y+J0okPc~Jr?a0VFTPY1JR z&-ScQgtvy`J@y)v7U|%{R@xbD*sNo9s2)?FA%b4)H=j zLDC6PAS!)PdOs>D;SVqrE#%rn{xDesL(XOwtU}l@0HM#D!`4|bKfBq>itMgU&kV?_ zt>QC?;@z*s8OHh?R@Le8YhEHbnHAnwg%s_jhGFVyGi5xIa5E=9Z)H3JE+b;ak0{2; zicTa6l;Xo6>3nB+kX+eszG$2uoE4`G9v?4e7Z5%M)`=PYA9pnVO@>X=JpWQ`EV4TH zS;EO8pQiOH-nRT{O`X7>XNCEDO=%n|Pe8K6EDGpj&IkKE!#qAf0AzsXBR4(OzuWXZ zSZDqerYMWgkAeHe)A%6dX;T>`X{KCg`O~S7aw9)5=iq+x`J>OlzT3?`2LWEIarBi( zVFHLcTfXGb0Z_A_BC_7hgJhP5wqK##rg_qipCv>sPCvyBt$4S!+1Xs5GUbUnW9zc$ z4Et1AO|1$lC^ZA6ghx_*rI3h9K`QT>3>$>*!WUIOE1fcp(39}3#SAIdVuo&=hpr}& zq2lx-bQx3Ote!-#mnrrZ#e)C{aU7q2yAZY74U*Yh`n;O=;(61uPRemWxx@ za=eiboEl$&{AG2N>36|wnE=fOJAUzkRzrV$eOU>wfU@bk<4}6MLW30MoV+gCJ)nRz zdQ?q%I)C2@iu0bh*KGb1HGkPkHV2y>wOj3uyb3!%(m|1$DC5@14e0#*!ZFS~TS$~u zYzDDsRx!ZK9a1`LJO`d|Cj1@44pOay++rK$=7AGNe`e;LFD*1pGo{v-Z9S^WL}6-e9dpO!a~PN$=v1pTkW zY4}G5@iqUJA^B4WKf%*S@kx|A9e5J&=|eL6C$Ye}JM<*@e~@$eJwSM$g8rUz%BLkL z`bnlCkmbUY!Z>g*yt|#<_{|njRxes_b_?#E+v~_I^S|-K=jGk3aBsT>MDJdZpO3H0 zb_)_8OwDWVw08@IBOrb1QlMA>EL0acR~LnSm$fo5ym9)5W#IeQld+N^7vxoRUF^p0 zu6GNk9HuO+3;kFf2i}c?;=sZl`DU++N=y67g|2)CDA`x5y9FRyF#iF?QKP(-0bv~a zVnFYvZ%TIyfBOFK8{_|>7ox=a8=%Ig8yh+JzqYZqw#oQ^b!~HH4bp41)u$WZ@&6x! z|NktOyWVIyyh8O)e>n6<Q2j1ls+Mkp~?b)-<%IeDM3c2+cZT}*=MN7UH z7-!O9SL3Zw4{!XBp_DhG2B3L8GzZnsUIfl)spkX9b%K{-eeuJXes{gVuTG#Z5gH~} zd(MwbR9Us4G;d|gDXJyb9m=}5DXs~S?+f4_LR%+cP}P`CGx2o2{e~L zYPfOqR{Y#J#mEwGw@E1j0}+shAVT8!-hBamfLXzC$`=6OunAl>lxRrpCushQ*4a_B z-4-t}?w&YloWkL7e$Y4-C+DXp$L%JXox8;ML-{FVc|o%gkYjqs8-w=jG1R*GzN z1GndTHyGzs^kD5hJVg}a8oi`SzxQSYp9pTB4-3M2k1${ms+E0 z^a=&kBgHTCPejH21%32I=(!nqsNR(?YCryERTR&Hdr_KS5tRzc@=9is(dj`jq@EP9 z$Q?AWR=DsA1#~ka=Fxl`nXpR53o8ReF}E)MRf;m_A@>;fjU#&v9mcSi6r-D565d|9 zwBP8WQ@I^b7*7I{!-#C2592ce4iG&i@HHegYlR-Sx4AjNWTe{g9GJce>o%FN3OyOi zm{j^lG_(`dR&q3jttB}pUx;6M7m;1T)u#&o=hB}6{~b&26i2rBz5pZoj>E2hK%-~i zhhLsH4#hj=HUd)%h11DMlrq1SmZWDzx~i99D1_6;h_uqXCoN9ghoV1m3oxV#P}e1= z-16AKCF1+oHK_2I_Cr{wek{pJXL23Z+IZmHGh9k0#|(FLiCnqC%nBxI%)*1gl~N$2hZ z_fB&k<{A64I&@&MN~&A>y=1#*)iej?K!A;%P=*h2IZFvJO$BBHe@h(BqjXs!`*-hh zEUrFQ5x=vp*!rNBakTMq8Mpz0!LACez&*{Z#&S10(p(V zkCR@{b^GYo;?|`(!w4(Y0%Jw^kIa5L^SnCk`T$gM*n za|+H~X7iwu9{m!21~3>6-R*B<6Ryw=J`WUPG5!L>5n@!KYZtx1_|iz*Mu-T+kP@&U zLsaD<|GIu~4P9nDj6NdF-c-m)PG=Zx15G2xw24WiuerG4dBe%j z5K#KKk`uGJrVp%Pc)3&5W{VP^6$|blSq2yxU5KP3G=4B83LjP#G>soeOxv+LC4?Ee zslptHol%?HLwb%iYUAe3J2*u)Da67^C*lok7YNxGg@ zIJ1^-pliH@R}Q{WUWq%uIQ-1Lql)KK2}8??+ixG7W(i^^fhg!qE8*L4oyPwJ#tv6J z#{xt(V>Q!x)10ghnYB9el4J9u5R zQ!MF(s?#eWF$Lqu>Xb?VhlFE1TT$<|bWil=lXJHiUnmwkMJ`mybsXB9UNFOe%rG*2 z@d}sXbCcIfFRH4HNeod^?J1>~I4|fgZ77guY_xKP!xwMpe0;d4w~m{U(LTf{U)nlt z!s`sbvU%8wWaAjYe)-7B$*T_6zov2Aig?=;#>!~hkidglhq|r~ zg)w5}{G9lWnK3gpbvb!nz)8ON3D5JdX#U{Q&41wlZFB%s3G!Qwku$je6=pE6D~cjX zwq0>iU)*$#ndy#t_eJsEzG^QLxd@=4O_z_Imshe`vrmoch?*VQKgC;q#nePF#wF=9 zAh}ynUPw+9nHt8>7Sa&Pxwt^@OpUY787%73h^4)IUF3V&WDa?<0k{>X*Q=VyB>iO+z`;e)(s!f#DT_i^VMH`kQ@58nT-ZsPs##`@;>``VzwcYPE>(GQ&MqQ z9h=oPQCX}QsQ|ou#f7eRfJD?s>JE0=r6@X$1_T|7$!OpWJ#09fc!b^gYK`vsDL$YOVB7hqUC1(d)uxN-a6_-1uU-43EjJJ1)@w@6;s z4V+tj^GfJB|L*m{n^!!A(s!?g!f?IgT>xc#vGA_3r`&vyy9~5qYkyc0?;s0&pNtmX zbsC4+Sw56araUm2g%{>`%OBu>iFTmX6XsQ_NgtNr;KhdEY%kzLLXQ?R+X z44D=0mD#xt3eu&iBrQF0IdO14*ai z+4MX9)$swWWL!U_xF^@og8W6Ys50drmR54>H`TZ3nyu$5nicP-u@CMj#ECKIGb{qs zEhabh)(XTx55%b{c^itmhGU?kk@U6eL8Y1niN;9jPF5zlOX=qcry9NXPNLB3TN((} zasjr?e)Glo5p14x=V5!kbB3LcGxj=)^ef>pQYygigJ~S{?M=wK?->wCIy}UXOxJwj zMbzyr-U#~yLkfDNEGTh#BgBc1{>&+Wl0>MyE~%GQx&PnI*AP$e`9^4KNz(I(5neRT z8V3vS_I(-+;x*@2c)vh{G2n!5H9;y@6?Wmx(2?D;vC6Eg0+)q4elu5uwi(bTvc9;I zdx-*O#wQmzK^U5I;)59XVHlB+jt^iiL#gaRUYqe8lPy@%%dbNU%?`WFg*g4}E9+TmoWH??xzl`ef@brx{(G2Mgwvt+ z?{PZ3ph(T686QfY5QZj_?I@} zMoQ`-D^S65DYOnc22~|cYeW?$jUH%~m4InH*2fnxDw6=!(DaExCM{R~h%~$ax)Kx6 zWjw}#!CDbT@?|>Rw(HXfn(qxfitwX6_0i3~red(YL@LYXhy_$^A!HPg#342cQa7fo zwy{)_bh@EGz`27q0*wQcbmJ~jNEnp#%DeR||JGcpVYR_zq_hk?9lygFjeI;YmoN-& z&t+}TA%(rM8v+LqR5uw-I9i{FsytoQMGv*+B`*;9V+?N$gW7Y=7%Y)|i$X9Fe}Lp4 z;&tUNBMFX1R`rZr(-O_6LijlSf5Ido72pLJj^;^x@hIhPHjH3REmjrcGoEJ4v8%jC zv9jG?94=Ws!ZvKm`o`Jbd}abMbo9*!9vt3Dk7DR7;TX>U5^ zIED{aE!P4sLDMZdM`D0TX{QStPHAM(=^$4v??wmp&nj}RWuPUwx@0IH0CVL8LyCf} zf>x@954lRXH@hTOg<%XO?-=;kQqzw0LP@-q7!L9{!zwUpFQ}%mqg@Iz*&_l^g-)VM z@KpB(4k4Harge$pB9R&rBFnJ~fYfKbF75?Qo>iE37%DwVzif4O6+BemcS`SLZgZDQ zAKkk#hD|jvilPqhvSG`M?-#0z@5{xHr2I^j&Z>-UV)Sxn!Q>zUeU2g0n!9D%%aH%h%g|VV!b39e&mzx z6ONuYG9ZvBdF9^{W+g1hVN98aR3h3XQrHrEdx}7#JS3tg6;f|xDFJKG(Gyyc3bA4* zm;;0!6=_KqV^c>fry>Xj=61#>zVoUU*#3d^afPUcIcF`76 zZ9jQGqp~8FBeZ-&+GcitFo2osO5`{6QOR4K)6AA?)n_<_6WoeT(hz~B$vsZuD z&ztaTbC{^c>Wyxkf!8-x)djMYnjsak_>0CtyD91Y8H!T_AZz>ldHW2T(4qR%$qZMs z3-qCLbbO|`TdQ35cMCv*3B)n#P%Od@_hDWR43Y(_T0c_OvBQr9Zm0C5q%n(6Rgig-4=j&*nZh*o}L~9W&X~Zf4&h! z!5@>oGE!Z&a4zHYF`G{6tbAvVj5p?|3wxL+ILQ0@)3`n6yT;h@VS{j`*B5OAs1Cs^^aA>K`XcGe@Rmjf*5)gZP z#U=Rr<_-QFKmX4?^~)*eCzt?DF200MSn_8S!`#aWkKEqX$V2C^D$*s73`~1Sfyaqod9Q(`yTH{2loy`fbro2|PAk7Zkt?6Oh+beGyYLf;0 zqUQy@2@uhm<-}3q<-%qI+!d*}t_Vo`nm?F~EGZwZL*(d?r@2So)wJC{gp!R*kuxlw zf-FGFXvA-SmhKNVkhdC*W@eYx>136jnE?O+qHXN`jlafat$TZT_=$HgM7`claUK>7 zvjS?hbq0W5c8nla7JKuC4ozJQ*3%5daOL5zDn=_ZU95E3>#Yg+Q_2EBRmVVJ<&OXY zt3K9v+yyf<{^j0(#)`pvR%J~~M80z)7Z-lVZO>snjG92FXnT^`# zeNoyk0e;q!fl}oV68M-Xj-|F08@$QJi2Wj}sRu(*2`-2~qEOu^un=N+jiZ%FWEw-r zaVGT2qpB+P?Lp*_$8_Pqs)o02DPW@%rA?>BE=ItIO6TMFd?uUG>!%y`vpiCzM5D_> zQ<`mSaj_^UCLB^MH;qX|3ZkK9$>fck@pu442}gS1X2_`qG&d27K-^u z3Unj!t`si+bu@yYPcsyC)b}haa71SksZ$Fh26-2?rRXUlZ6Q}^wLGZ2W zAP-VV%mGMTlL#_3(%XQhq%CpVjV5E<11xAH5`2jAWP2vHAc}8E6|7LgAn6gTVRZNa zL{M-U+Zk9PaxGA7Fd2@-){0o5YTmPzp#*a4+IPmiE8j;VTjLh$3zOeK*x+_o*3C%i zuubz53F>FpQevQp1~R~drpc4!Qzb8 z#Hv^m>taJ}>baC^tfeQ)^u9=?!>Baxm8w_8lK3$bC|k8-SBkM}!)V@vVjL2}m3*i5 zwN|}i!MOs`_F?X!tF;y73#1xr*z%%0q!v+uHCYj5?K6(h#vs4pa+m$V*iZQS%LMqI z&#{i2`1YqF0LM?mi-K7Y(l8$fy;SLyq=R0V@|J3|xS$ zVuSYUpn7MM~3j9t)_S3Hw{KV&yqQtC|_T zC0>24QREIJ40%V7%L>Jp{)Dd3XeIJFqAz{qD#XzNOuiEvw)x+H2yMPOtN5RFrlB{Q zgp{>d@d{#no-7mraS7C@LG(n<;Qf(v zt+x-}^hlivxoNQoLtAr)iQF+g2q=Rk-om1KiQcby~?#>J|B?r z4b+p=(T>_DCOeeJ!)7Oer$jUyXMQ?^Z@Tb237ZWGqX-0;toc~y68PLUBlr;t-z<+N zK+>)LsI$010Bn-VbqO3t5~U{_{G+e|{iQag_~sWB*CY3cf*b>|f{ff}Q3;XXV|}DC*;|vxE&e1vdw*Ha*2zzoqE=KF>s&9XIdEIxpek+S z{UQ){q|T{S=K2atIP6A@*_3pqI7<`o zltg(HH01+Fev8Q;lcHx7acho2^R{G#FL@!wjSvT*RrUB*C84JW>ozG2&Ct`6g3xR! z=|Qux-#U8P**`u@-jS(t;+-UKrP4#E??<1}$t;FB`mD+txa6cY#2XcBh}}EP4Konp zLdt^Q_rmEFgkw@j0?rf`HrZ^kAcwBDW+bzC>FE=|$d7jH8+3KVB85w`#OE-C?Sn@9 z)lTVsNlFbyuye*cCHO7TJz-*VP&pjX*_##HsPTGpFGsVo86diyx#bf%_>%CY((xw` zI`V=9#@(7v)%NNaXbe32_s|&VOuhbiP*ost4Kw8;1@<=k962VRZhHKQ^94$%!hZea zNi9VkH>i4z1U_zB;$jF35*#AhJ<|76W57UQwh!E>1U*IfX`yrB5?w(Y5wCAHF9P5! zDH>Ct&F#Qyt3wKpMw9 zUBTHSmz7u%V4J;08x;wxxWet&Rl~c*_oYSLtk`l|?RRh_+1ZPU{Fs^Z#i1g5rQGOA z$AG9%KX5K-q*$6Sy1oyjF}gyuw^2ECmXDX)XK;RR6!N-{@kafdIMU6L|? zBQ~PLP0A~1z7z{Tyx92&_7YwTrPlw* z=fV*VEswz7s6h+lZ zVn$>gD!w^HL~2PSU;rGI)s^)v#nj>~_e&HIf$nAKo|T+ZqL{vKL~`pZD=X4FB8!CMu(B-F6Npi)ELBxy*^i6zArcno;~I!U5g0#X3)yzPnlsPbWz zI^%O#*4a4$VVs^Hbq=g)TRZZ+T1kf%xYa|j|!}B!Ra<_EUNgEG` zVW)V>fs)B-9x!jLw$2S2xjkg>g8Q=cMSy6Hd=a2_f>nosuXZ$*FHI$mlw(5DUs0qQ#BtDC0>2M-OA)a3~*!Sf>^ZHbJK%Zt9oKB(1`{xZBs zrv*JqL*B=*J{5BNGrTT*1`6fDlU0()Uw-z+IRV=z3d)|OmK7aFl?o}6+<1<~Em*V* z5m26#lPeaPkK3uEjAi&hH6}z#=1#X1rRs?<1=iJ*0X(KQgSve#0rp{6E=U$>Uub$O z#qS31jsK1wiD6^>#B?Ggttv-c24e+zd@?zF7r&!N^0!z-wDBONBMs|j+>(&?Za^p=9b?$8)=~3A zIje;9p4|R0v;J@bRmq69G{v%dLJitvQIq~2Uu$B(ds4kYop&s{Fb-U8G+tS)Zmg7- z%*`r$Ssnvr#rC>r0?XA%3khulsigF`h$*G_SC|hNNbIsCfti>`vj%AsN=?9QDN9JY zrc-AVX-!aGYI~@!=>Uzvp&hYtE?x3Sz$4%#48008CmfEhWd?@_F@2&tS8gO3;;8XL zfuy7Csf;BEmSdF3ZeK_4tp>_=R4%E5qGn0pkM)>y^ zhreRLmG*q5Lf%yK)N}#4qhtUYt*XsJ60~GcW7;K=%w?Al8o$~lr1 z%FcTFDAdPJk~GCdYFOEU4Ny(^-m*Qhh-ILGlv$E=Ey*sN(uA{ACr{b|W`N(O+qxpH zdpssklX+B>mOy0Rrzkx1>MNVA_&``R#47dfFVPUC5YxNcd;1d2Z#qAlsY3C*%xgS1 zC#388+3J-BwNui?Z&CE7#qTBu>ILWqoB7fiNb*T zMRe;|BxZqAzY>$t$XjW^GccF9CacPG30JkI{G8wx)-nWpSBtOYD_Hd#s3 zQeQ1|Z?vJne#C*d7j!WmC%W5lt-(=fo_3NMCEG$Bzbg+3tZ3z3DARO1upTzUzy46J zXXdclikV0}>|fX6c}bbGUpNttl4_DXnT*>BYNMh-a0Zn36g>yiN3diy=d3{tduiI3 zmeS2HsTxQy+j@~PiA!=d5%mCE(tn*FpEdVm4Jppcmmau&^YVqt ztGEH93HhG4A<4ErVfv08|LL=pjD@SI!=V9V|CaTBGYsw;0xlV}^KL zZvYq(6*&Bq$W_mBt@^BbM}cEpR(3)P?9%u9QpuI#9w6k)fL#Z|QHS=pI-U*b{b?`m z()Hpp22j@S(wA3PYO9r%r_00elAO3veB~d%4oYoZLNR-jbX7ZJ+MDwWa-i@mFBoM( z=k{6?nMLAg;G9HV#)!NK0PO(G7rE(2cchIIp!QHlsmyvXXi3ekk%|DQNR+fg6eH|s*JK@ z=Pq3m6RF(XoGEBN-#q=m?zghgow@W?NDm6WZtcU7@uGRqZYFp%tRZEdvVfYpW%V_W zy;H5rWb^W18f(YgW|0POUc2Dq)P~8zc`d`@xnLh|8=I=+HIBYcYn?8h(>w-{4|%o* zP8&b@{h>xqA4LUZ8hqnqDY>ay2gu@_p3^OlB7)A8i3oY?;N2f{m}VJ$G~YCvZ_bD# zar(qd5{MF>H2ke(n{FcM%oeVPCs6mP%tPX8KL2*J=Q3+OkMur^fPA$eT9uw9@-lD%*-P(uRv-t<@(xK!RkIh8mn|tG(`rVdC^aCV$Ni$R z?eAgqHfcQq^^k`Kw3gKIpt_UGC$*KW)h&_+%buX(7^|YuxqIW`S>!IUjxD<-OI<9e z0bv!Y0BS&$zbB~gsshM+%nX%+p%uG>ygg|BICAYv!^NhBEIr(oA$-X6koIGv~{ zA85~RD0Re0W>5>u_JP5thd@0A7fQ*Brcp9_!1G295fHjFbn=jY58l-vnBR?sp9~ZDi}xpaaVcFAhQOa0!1mifdZ{1)IY%#-X3%(3B+2R zX&@khV2Y7T1u|<4Ya^_V+-Uj6b8oBTtMN}>e`jNT^~XZtgym4^Q(I&O1uA57CiF(> zQYUVmd+CVDxW6RtR#z@N)HZCi!PFDx`EpX=ku}(!U)Ie5Wrj*Nq$b9!$?9LZ3(g6G>UfOgl-NV)JzaAvRjg zZm8`Q>e;a=)eXk722N2brBhLbib?m>)sD$C`YDb6_=14_ccB=+KuilXuA)pm>{*IZJnmc}+r%j01l1ou@-V5X^p!13rBZRFmP zMyqGrUzcpphUDbe9e7>RrdUFbgTQ37Xe=)BS)yyIDM5*n5=#L-qw8>l;z*;1v|~xS z7~vbBYQ}N1xwT%a(k%yqd4(R?J)|p28H7cNDGO{D`b8MYpmk%E%ac@|9bIyRnD~j& zI((HT@nV=sx*%26byb)FN%o+{ek|B1&+B9)jX19m^Vt=l_>|Uo!ky$^24$lO$gIz0 zi#p0CjpV%}DP+flw_0%q6;)VbKtcP+58h$8O@?%yj;ZXM7J2H&q=5%D;)j|h-Ed`f5^EG;;8aq9IGKzL;1(Xh8 zsto3tE{`hXq`t+5Qn9>*Y33z-)Toh<^+ln~bYey+COO#;2!$??xz`?v87l@QxyUgMf8h$=O-hOb^0|$jsz?!|;!4@RKa+EeH)d<#`b#qr>%l}lez8>t;H(T-E zwsF|0T81sL4;@?>!7vke{A$)Jr4~&CC=G46U_!c8$cWEq%^CVHU*+csEE9hy{?i+Z zL-*cAmE(VBH6U`;(>gkX|KLbPdm=PqAy0-CvM!oUm4!wS*k^xWMck`M{=6q}L6b!@ zhMbV{8M4#aS0W3o{vcJ)fq#WzK}Mp)(_XT|5CioLqyzdylUE_(J_zWUyQNdCVYKOe8#EM()|5Vyc0Ayu$`PmEUJ8&8FV&PqQ51HvQVKUMV ztF&1mX$9^6CE87nk@7)UkenLbF`_lmJB=)TWs@-T+M@O`XAwgd%&w^=XBJEDT4Ti# z+uSMvQ91iam_og)R6b;k;JZq8an|imW@hQ2(X5X-evz8a7ZYXBP8V6^trtl`=|uw- zeN}7&ScVf6NAsEN272b-owu9GY1xr>PB+eATCNYQ0g%!9C3`iGeEfTl6H_*x6Hl9M zz%#HNG9a@;aY7!Q+Fnv9odrPbh~sLqFYbAdBs zjjA$ekQQe@)juXO*c9wXb~wBS~zkTS93o@D1uFc)VUOr*VFIbu#@=NR&Qc=*iy<~ zevEBv0#b&^Lw$Y)OCR=_8%D6h;mCXU5AE==^MSO|6tYifM^9@8X1NMZ$`6aiF$v?DX79h*p?n z+kpC$c6C!VNrm#XHoD1DwtHh#|M&;i{fi0|0|4-F zbbMAJ&Bn(WLs9Guw}*?Fp&@c+_%dP@RU@GryqoN^Zk+6~cL7DG%oA$-3slDcw|21q zBxzljo;-{Kj#RtRw#0mFkFUH#8S7)R$^02_I@#BzDMb;$5*B`JKt}99d^W9`zUJ7J zZisY_g9ef-=j~Su@Ah<}?c*A?;xwm+e)F|wfe;-bW+PF9Dvm}gCL4Wk;sZ3;Dbw1T3L62*tQTB?7bsgK?*W zd1)O4t(rpmn84J*oGOhPl#?$pq?nN=!H}Z{`H^~!1p<@fAs~5gk9kwfWfQh43x*Pq zSCqWg<=%V#`v?Hl{*`*kIrIReo&rlH zGr`h!ZZv-%38_;;;buGh!m3{b{}LK(0u`%}$HM75V;$~TQS>F&aFH#NaefnFiseW0 z#-v;oJ7H(&*5?meN6n*Sys;>XAO8Ye++nlbMnf>j-+4g_XUMB&eM84FnFVxz*vU#x zjqm4w5<3)4j5FugPs3$0mbb;{4{=%cP#-Q@<(VDn+e&yyYB?jmN&W6OA-0}vW4H|R zD1P&98_rD=Bj?Tl(a)#sj1SHZbkzk^7W&}BQyTS@r2VlpZ_@GQkZd4j0i{m{a8REB z??6dUo!JRSwN6)sp0a}7P;|P%#ZIYEDv-JfnQu!)lXvglzkgqR|K$Dr`@g&|z5h5* zc|UxRx+8JDOWE-Jwo%JIl()AFq(s8XEh^mQl=|L__jA+hlt4)Txo+azn!4DfND0oD zl8zX``i88m#s^|=;CH)Hb3+AMpj;HlN!yyj;2xs(A36l89IzEOMVZ15#bU~8lLCj# z%Z3AQbiK_6WvmGzowMD#9vnvKXE`)SJS<*8juYWHmSwRS3+^TD9+d9~F1s>MW+w`P zil zG#r^~un%T9;NOUk10bvqA``_^4_Yx^2oS3A2h7g0EW!4>#Sav5;*AnR%{{^S=zD#f zOk94|!kks(3>C^cl*jHwT_`+%BT_KpAkgpDoN<+E6^wT+-4xji>_+QCjAS%pGUGsJ zSBg}UQKl#m>_`kkW!^vv`xK-AA$S){9Bn`<4=o9)S;?NMNhLbGVtsR5y-*dZ0XtY$ zgBH%fb3zlp*+N~aR=UBH%N)yc3rJtJJ;6w%%B-?y`vg~xyU@l45nvH!D!#LM!Vs7f zkm3kB-ou?|9c(V|GK8td0~ru%vo~VJbgRiqp&?^-S7{~1C+O2B;{%Phy8DY*jj<56 zb6^GZiTKZnK?l;+Gi(WWENVI?irH<<8|knKQ`&={%LT(H9A6Xgx{|LZFe7TR-%Hl4 zuTNs1oK6BsFtQF${v7_fz|@0fV1gL2cg;fA#QhH6yVFWV{KIMAx*W#l*}o4VXql2~wYdl6ohaU9 zWhT-%0_MGozBicsBUPVmbIdDUB{F34g{%P&dNO{I{+w(;OQJaPi`YGPIF9aR4*9X1 zR139DVbhMKLsUSGD%7Z1JW9v&oOBR}VRP3iaNe2)b= zyysC}`M{S1iX7G6p(xm;)Hh1$RJhg4>XJC}NA1WTi{myO)<^DL)Q;S7nE*&X-bzJg zMA1x)ag{de3E5pv%5Lb{v(+sE%Qma4YflNi;`bd}lOh!sP|HhYZle{GXoFOIkOEW8 z+L2j1oU@b6i2_08{q|jn{07c1Ja3%NFT5_73-GWaLw~_zjRI&DU~$ECYvvcQSUIIN zQ~E$|bakW2A8Ow5Fhh&!_>Ot`pPn66SZtBt{0xOeTtbM`$ibdU^RG)p-nrvr9bJF3 z^J|Dx$|dt;mRBv(aN>^QV})k%<(|y+-LNL*>n87%#5>QCt3tD218!VE=>e*Sk>YAe z24#79bY5mPD~Bwfk;y5c`v6uAW?wGK%yS|g7>49`yX%c$3%Q|X{q0gI;#5%jJo3pf z14;G355o$}k1@$&8p0)M_@+f@rI2f2Ck8m?*DhOA%D`Y`4CjaFdR;ey1<%oB1hgTE zV3bV_U!h$2BV@P*jT(-l#-Gxh4jVkU#TYZBjADv=$~&A+!?sDAS+ZFLe&|;$Z(wWM zg9Ii@U_jr^*|C5GN%vms(3hv0Kappn^rc;goQ_$SbQG9ajuERtRIyo+mE8BA2Y zQ95i6sz)26Y^E0ydL?#)wT9l8bOU=a=?=V}2vM7pd~T#_NU|@n+LhKytn&HYvVHkM zLF;{WDea(AZr35Jps#Tn4U2UB-%K|I-GIF~K0R!lO;N*|I_9|g&|3ZO$sa$x?U>7qzx>6n|3|^9&Q*AOu*H*+X|s&A z1pHI)3J-ZbcIXL~H#sz(w=P+r+Yo+;*P5YD1Cz-1^9`mRln3rZ_&{e&u4}=!E=AHK zY6lNEq^=52gyj)Q)GG_5_ao<$0)so!`-p(*I2x+-h>E9GwOWnQ+0;68={NryJmRc; zE=flW+&tAPKsfh1cIz=HA@Y>PdAWRwC86glp7Rd!p>n@; zfoeinvmusjmh_>|j>Fl%Q0>{)mf9z3dwHQ&dnPn+;oZ6YN(h7>Ji3E^ShYj_X|cJ} zB|q(}HK448#H38P@8O75UKRT`JIx4Ej6aO9+hXH$wOC zmoRkzXBo;PL79*~Y^|-YX;@kcv9__bRj%45b9bGI*WX!PdG@rnQG=|j|9}=(lssMK zxkRb0$sdbtIIlW0k1a90wTdK*oVP`7ThXUc3C8r7m8)nTD(r3?-Q@QdYGpM7FicH! zwWR%hlspVqh>kZj81m*O{RNX>8Dt5JK_z>gV~;VC+6|R`8k)^&I13W%0dl|by}pW5 z8Mx9K$sgI{h-3H>a#bdHwL!OdGIHielj%}ry3EUzd%KN8Op4|c>@nVKYd>m0UeJ1# z%T-&J+H#Ny);e&7HHGoZmXzRHnf@h|xY8LZTATi8@WDt0tF~hF=63I;>fYrSb?-9K zy~{7}-n8E3bWY+KasYvLQlj?Sj6Z(g?+TK z;@Oo__+idd`#X2=ij$Q{`#vsz#p2wu%A(qj(%TmoH!%fD5*N!LD;ndL%vQ&ZUD)ajD=YrH%R4Jr_p+D=ZaN{LLX5x6-bjYYF(O?{MIDhs~k^aTplew!H)gVyHl>kfqA>4Gpl5sT5-6YuLhg} zm(N5CFrJ9Tc(7-6CYwOmq>1>`9m7Zl{-F^i)e+!$T)Z9WVJ}PR1RPuaYt5er&gZM zo8JV=8zdTl^iiq>L;{*>MP(eo{E1IYO;zCkuc*F*bc1BkN0pTA<1C)a(l2F13{SL_ zZx9k~NG39PJJk+2E+f{pE-ZwG{$3fG!6A;fHh@wYtx+s$^sQ(4>XH=~3<0ETMNG#F z(OeLxan|Re!3h!yd{|}(j_6N@!+XQjuuPDeCEbTAUz(CqrYLF|ag50Y1o@0fB@=~! z(fF!PijP3y4im$a= zW@e0gqhzw^<84}=(S<*bre)FAf>ZJ+ZTl%%0@p=HvZE+7&%o>A6l8ykl>Jur*Kl&_ z1UcX2QIzxb|4_k8GQZ#TD$cOt0sof!y$AnCaZcX%K{UNQMRo!nDDOM$@yf;EGP~!$ z{<^+WflU5Qkn?@xf$y97-<_U(_CE{(f~}govjb z8~9s$y0K#a!qe*J+S9c^)z)h(>#J*3^S87`iNy!UZeR!vY`70|> zZoO1^KzJ^1fJwq(NxzjyoFv}&kbwTpM}4Wujdn_*y5vNrfg`35)Mdnh*KE0_S(RkiEXq~-95&VnR*-^9IMzOhQh?BH}?j)!5mu+QlITFQ=z9tJwq^)Qf)!#5od&Kcc``_dPC>^^l{ zdV}Eb37KxN2MmLpUt?<;Y<*1{0>ZsR>j`=7GQAN?SQSh$Dc9>&8R=z=>&gkphTG9I z%-)Uo_8}zmfVhio=>);3lUi<*muMdhDF6dI((xi*?{dvb7sIkG)Ct-HT8m;Lr-W|8 zUA8aBk5FFSM@y}VrXB~5C+_sMcV_EqiZ@%xGDqB_<`T%6(7AC&Bj-x597w!%yURa~chouQMcd9!ci?wBB(d1O z*s)JgYKL_1A7UKJG3oS^Q1=JUSdmG}**`jDFAUwCkJ40ZrD%tLU#c!HFD;cm777%{ zVyF1NaE=dkF~1^YgwhX%!ZE8$rX9H3q30z!fB$iQ$WHN4tpW$Hz}^7DIxrHIt0hsX zP&fefkNI;NJ4~1M322#y`6JAaNWQ|3i&cK|mkl)!Fz~f~LzyUlvt&dsc6~RokY{$G z!l}!FM<#|z-lA};*Cne50DeV_BNF;7o zM2a#(2=78xZj$#oN5=()&$mesM(7^PeF0Q zz#9%Ma_N|!g6=5883zO7K^aAP>R?Pu(wP)C18+G{=*RcnjtuThc82O=QCv8%1_-U9 zIR_k10lULk5+CisC}}N5Xau6^zWDg+xP8{y+bdP+t{pGqIew4%f)t3n|79N?p1cy) z(MV}?s_qUj$U{)>@I5-Wsev00^h# zZ)b-m`>oTRWhn3&lEiN~C_5h)CPOE@7AsGmVsnPqxH!-sc5$8yEcY(o(7$3i<{Qv> zo>n9z*I9oUy&d2Te4l)TLfCRfyT;L=I5su z#Nnnb{WIGY)#XAUjaVS%$Y9I0R|@TKt3nGS^iZ2NvJ^7(rZVdc@6fn;3XsA~0;hn4 z)jQa>WtLmR%*(mnDb7<;wI}3*uO0$-ARl3TrS*rspO)t39$A_vClm#-v{W`Y6iJG^ zZ8TQZRUn)>I&DcIv?ng%zuwj}(R=oc53V_mlsw-fwMSnU^@|pi^nH;sQYGALw-LJ6 zE9%1mGhBH1i})CSE!S^$F$$w(L5+bN`AWJPz=j2qgL>r^<`CU4EiIOlZNTB7Z;SLX z{!NadkoGGAsgndQ5Zi`(N97XN?K2*udz}eWoQM%m?t#4kTz%ZWV~t)J00uD*+B8o_ z7?&?3*}}r*mGi5&JMw$gU=m%T^w;fAkhWT{tZY?Q*U6M(LHT@Ht~ybKLJX=de+Dox z)((Zos;eTj8i{_yWIDUf(XUwNu(9{5b<{-EKz*nT6FdLYClSvn^(AEa)8;|5(YDG5 zdF55kc=`6*_F41L6b}={O?jC!UR;I?Hsx>fs#iHxdEQLLc^h~UchG@1n%sQ?S{eUa zUMx#{Ws8>>IK6ABiYI;85SdO_U}LX$EiMOM7f9bZ3f{_w!5Bb_)REBC_R0zRNKVfk zw4U$n0JUBy%t=>-$%R)e%;6=?4?k3z$1h_07{Dw3_=gL?OMuYA>eY{!tWV2@PUn0N zE9rE~vbISN8wa`EK`dY2b0hp>a;g-{8@g6&Apt1#i^3eVNwxgre4OZM+9=1G5}-cW zp7kFHt|Zw$;Q3(NUY0%>AjV==WpE0- zFU-viDENY+oN2SjW>kI=|3GMkIfK2ZpPVRBigL1mlv*A53ksP71e|v{A`TDGY(@De z2LcM16k^Sk`jvYJ^MvsltBGYN_f$Q$3e}t3FzQuB##ZdaV*SXC0Hf3w>%2($RV<9U zVZSV$^@d6SwZK*$&Uie4_5zhuRsj@IJvG4c#PUe4Ihu^&V5*D7%3@{YMgY+rTr4hG z?~Xr-7MHM`m8a)lTr3iIY7!S^m=Dz;j-cuG$d@6O=O_e>O`8WV>`E4;^QF)o;Iw1Q z{6QZJp~tJ945r9TniA>AI9Sr#7<@zZPb`v-T;{N$KDyq8HRYn`H!mC#|Hm~-#o3$+ zA(_UV7KI#rrHFwdF|RinP$V+ERFh`SbeB%XKv+~d{#T=@EMT4Cp|01Dvbz2<*g$`S}gIY>}8)ECL(*Oq9;K*@&KYqe3f-9=H9OCIR&v1*m zxh7#SQ%+mGuKW=ZS$gSH(`Zdo5hobBU0j;fnH_qqNDz2Dt4xcrJgFSv)tWmnS;DJ9 zW|pp+}3?4E1wSbpSG{E?8rkSzWBpgbC+Z z>+~3dn9?3;^TBAsb*kM$8)ZqVFrhCEwb>B{?{|$0!~$vevtB)J2M)(srmfm|-m1>D zf?Qf1&^7c=F^60C?b_AY4bLPB}@T9HX2U)wEdC7LCS`BL_aYxp(~H1>kjq zW6R{Xj$F7e7<62&YG9}2IY;m}LTFO?OQ1KspJYBgMA%_E;^WCYa(D(>i^U#V`9Up; zeHR7sq=5gt1qlB#eB_*AvX;4?Qq%c&Mz;QaHn;>**02n9sw3V zCYniWw+-u#MAqE!F6<5z=PyerR21$uko>$WJ(ObEx)UDK2#TBx=_Py zf>MGia4@x{)#O~X>3U=Drj%n1VDA)Gj(O6ue{xYlkQlac>lJLpwHAJD(oDu=>VyMjj=7)ewgph5Qcvo~eHbkHGIEbs>MQ0AWjw0nK+ z&k7dv&H%FQ54`@YFhk7zAW&Gz<8cqhAxOX-1C|QLJ*(%zOye2MK9s>sT?T^qZpIE{ z)+B&ax9`tZKERxb(ecJ%{kZ+2R$r_x8lwY(gWoD}`d0k#qGmo>rJcd}%8|vXeiqlo zI!s7+alN{N_%tCwF?2N=HU-GdeiF{@wJ80@mxJ?bpGyjVE^bs8zX-;aIyJ%T`a8DRyNnmMKiBT=EilY!x%GHH)hX%u-A~lH<$76 z)=X7U1+^&^xHlWI{MAiaqA{(=W_FpAz1%|Mo|7!~bhc7Y?NU_J>eT+kYT4vkR;Tx8 zGhRn^Ywx)%wKuKQR-#nnK$d#`m{NOhWU2i}lzP^Xg_hy%+0?#0vrE!wtW6!i*jPNR zK9eP;)$#OMjIC^llTmeK=wTGIvQ|Ui=#x>t*QtDxEK6oQ%g;!*qr%pgk!9W_%b*UB zE{2ATfk&>a2IyuI(r?@W6|GfQk#-D45uS>~cqzGfHSa)@he~kT0U|8{VAbbRt(r|q-z*FV2``*-1Vdwuuf^2+u?yF(;9hlbHd+;H|xm*{$0cQfMDJo z`ybx5!w)l^^$wQs!xXH;;Rin$Up)%e5KE+C9k-X)o~_srytSt*6|XxaQrTsVmSm}4 zmtP;+WkP^KWq!RG`fj?8^_7(@s*P$1;bXi6FwynXR(o%;UaP)asjYs1qMtA^@WLLD zSteBhL}8i()Buo2lw~@-hHN{*^253Wy+{=vx9bU@n(Ct5aWL)E)t^>s^;fOR`J3g# zlM^fp>$`orwF2FZB`c6uQ%iD z1AnJiP7?f0kl1Sbr|q9MaRQ*#ceG14%`!z%S;gxODxrY3hx~sP*qxd>ZZE4&#AqRC_odx~A z`$zQy3N=0^_CYuqt-q4>0bO2CjMJ4fc&M6BvsJQaSAs`?(;xc-cQLWZV=$sW(Ba5LtiHkAQP@3-aiRG(YsvHZ2SC(B??%xxwnyhgEgMV-&QYHK;eC4RT4++UXpeY_4}Y9BHJ+K|wEN zwkk^<(H{|_0}h5m-bwI^%9wr;#&{=^dJyE-Dyi@A!Pd7xEdh=_`oz0{V;`F14Evkw zrET6ct#$`U%hnlX zP*F4(nB;Ml>yL&%ZM*2jZt+ulJxl7KbT5*Eh5vNM&IssCao~(DC(fm-XlgB1kLx@0 zFnnCE)~aij|2!yV^nNn(!-u3kKUz z`$a6fQEz$ZNBxBOg(3w83-cRGwWYQ4=Te*!01}$Wg}Wq%Mop-{{3W4Cvt}kvO`0`h z*xRzA6dvlMmhIG}@7mO1lyW-;6al0t`F7(n3P5c7gdmYrn32E|F#rjqQsR9aS5^lgT! zuADv`39+hFl3kTb%c_dL%`%Gd;fq(04cgp0JUC>Ky^eSz0#Y+I?&I;mt;ny_;YemY z3zXv19|4W|_Cv@TYm>T#Ko}ih_|~gyS>?_T&Q4ozGD}Vdz^*<(i@$EXQ7{&5AUDq4 z%rMZKWPR^|TLJU5y1r)K6~NvAJ>dowm?Ss244m;*1(NO_TH|AqH`LD$TPJN=;W7a` z?}t-)1a-+cheEU;eh?|ON=-rc#sfI3;J<=Vv_w-Dzk2nf5X*~nAkndYu|PKfkx$nP zi_1XAqe7YEjl=>zIl*Obi9%k9MR>k>_n|C)D@d(Mla;e!hO$t_wqwP%sTk{CT56tR z0sS#|a2QDOT_@xCG@q9fnem$Y?Fp$HzAodr&z%qpMOq~EhvhW?5u(`P{rgdo+eJ?P znde?uDQ_D^&}{gxPuCxWe-o^KDSV*8*4N6YaHiB)tuGH%40~smdgZUY>07AO@ayLS zDZVDyB&{iL>&e4(U}<`VnjX-d7~#@MaHcS#>56xL7ZV9}kA$;tqFQDqdy ze8DOst-H3xXB#J2qcVNl9l`<+fcvPQAT~Q}yy?Wzu0nD{nXf_#L+36B4ARkS^^=3G zN(uxld1z4%fFrz-@4N!Cn)bZa8WbAdj{uR}Kh(xqDu6+ za?kyj&|n>TjdO6gG~i~*1s-0eqO!SSeoju0_nPhY@##*63{Q(R5_yrQ8TPieYAY+^ z18(7Id1{cyR?wCp&l;yMn`fQpt)s^2+fM7~tazj~wf=BN6*+UkdDt-f03c*LzYVzs(jtsx7_FEw}p_UiO( z`D721l$Zoq$uY^a9q6!h04R-mq~mSigtx>Mu-|kmhe{Bh>0-iZxFz>7 zOlB(9A2}7-z}Mr~ZK(`tguEyh^t<(q&8Ht=kZ}p2wohx{)-4)@&<;_dNbp)_Br0u7 zvx*7A+AmsuC>=!1*90kWL3eFo2RAR0l+dOpyxiub`zz` zb-_JOZPh_I7>}oKRL)X4_@#$4R1G4xiuPOL6HYElWuTLl7j>(nYtT_S4B;|U#PiE5 z%U`$ERflHWj`2S# ztCJ#ns)iJkfn|Z@W)*VASo02n^$&1jLfz2SdaargEsfLX_thAv06i-t zmB@g#ngc5}W2)@t(=9Ci>ZEe6djIO={0;AbnQm#S?^d4kT}`&Vgc0jgoolt9VoT!H z3GY&tHftp;t8eA3yw{1G*bhTUl^MUsclxCpk;?>q`^dKjy-sgD=_pq-A5+=edxVnY z4o%#7C=hH5(Lq=J*&x^+0BH8Jb`}UZaPh|Q$Vtk7V|A^p2Y^*baI^$l2AniHC_k!o zR;&VB$pW>E0yR@$ZMB@YcdR0-RL7iYvDJ6kVgQJ+?8;ZGD{O>?A2-)iA8+-?QYrP3 z_x2M(t5nohs;krlr8dDG;JX~Q_>oMO1VfRii-~!kLc(w~?1#u0q+?{rjt*^^_VM}Y zUNcVKM143Z$g$7|D4wY61#FI zra;w`nc0Ta(0^77-AD#C?Mpt?b9E-N>ENV87_~=Z1hMgo{j0tItnAoU+NPH7Y$|8RHz zXT|b;*RkALFqw;6SblMdp@8WoHpx8TRp2yuT6B49xITgt@!~9$7Sw#p98#eiZkfz@ zEJcAh);8B9h{bi+aDa)Y@vfz;rv&Z({kucJu7{_zxA*;!m|(U z96a6;$=fg84L2C4sq9Nsa%#?$pbJ&0K;k&Yy!_yF%*}zW69`<3eHhS(ae9~0J}k_i zz3uYQM8-fL-;gXka))7p50m8%8*2B^b?&W4rnEpGarzmjVwTuQpiyPdvvYjdEGN~B z1`qLP<^gl-8^e)PpXmNq-7uJZ#Kyn?!6i`}zLxAs@H%6sUk`WC;WLE)#_WZMi6q%YsJ1)wPIhYT7t+DeLEi} zyA{5uuWj7UTgOS_!sk-1VS4vNbqp^W$vT4j#yUDcUSWqHhqbAfunz*t&V8c&-e0Za zZL5A&Z(OI`&)D1Wb}#Z+ksd%R-hTQAoGw3+QaUnpp8kmUT}%@gZA8-h0g}l9s4?+b zR05;43}A;s7SqwY_NUzM@73|_cRLJb)i@p6{yqK$B-1z;oqA?O+gfr=|M~r2OO45) zV^+?8VZeyl9}JIbE%@Z_FCr=0wbgDfFf7OXtQ=2A7GB=hN_?C=1NU&d#I7A1tx8oT zZMGxmky1i=Gzz7PWyqm5bQ(OQ#NZ@xfi4-7L>Ob}854Uk#MGE~N^~iXs_VRLXrm!r zyd?Sa(vo{jmKkT8&+ z%2&)RvtH=sh?g5}I;<;lqM(`TWZnYwe9O!APvk1)7*lTzUSDeW-RY;ulubnFV8#(* z7;=%rB;q?))!H=z^6hN>7By`XF+t0kwNvB8@>*4kU5i}`tRuiqNE?gIBz-vEXbOa} z{E3U&lx&Vbu#NCkzg&H(T~izl#^^S#x-+!3?p|-;ck(BJ@4v0EFR@|B<6C{(DS_=_ z8%6qLt)oRDtStiFU5aTiT(gb5mT+QUM^=Jf3U?yP^dmJ9)Q?;V^I;Z7ytOZQF*tQi zYf>XXt1btM;n*-Ql^WW8)F2n0Mun&I@kIx-b`~uu)Q;y`n}%2q}W+RlX9!G>K~nGa(5fPm4w^jh5MB~^@5Iys zS8GVV_M2}|`BCS$A&LMk#&nn zdpk~PLF8$=_ghVMJyUJ~vs;3a{%8kfWbRwdHBhpeckAid*uP&7p_*wtObovw${wAJ+2v?iypN3V$zI%Ub5B_^cD?nm@=7?o|zap2hZ%|8>( z{9gFLnxtX!$y4gX*RKh8B9WX-%t_-(m8Z~}SGkq3ohYZygZw%Va_T(D)_G7+XH+9T z%(yfC5NtnCBnelzs>5%Bs2~sZNQnfgsYSxph@?=G*2!+$nyhElA=Z-6N~FlSe&cQ_ z6282dLdUV-nqCS|H+?HhDtXPausn87ev3#O<>hWl+}>bmvKgWYlFyV6u6rjG&9w~nXGbOP zqU>rM7KgOE#d))U2A*f+jW0jJE;+=WQAlCQ^1JPcwV)N!NqRAz1yq)!fs5rn^^#E9 zx>zFuI3=hvM5l7vX!^W}?k!$~t*42%>muZ(PZgB1uAvNV#D`i7se65yDM0`51w{B| zl1vAfVszvi=bZ7Z$+*?5Lc!{8yIjYe7T+G}wy;Feot630g8yS^If1UOQ4&4+_4MSj z=7o>lw%B3ehtk&S3|mV0S_wNI45mkyMNvTx`tDlw#!rO1VWf`KM@53o1~1_}s&NC`p=t0Dp-H#Lnqexm48LgMn= zzz*$uj@8Ak*|3uMuFb{REG+O1LX_;V;uN`wFkC{H(1|sQed$jbau>z0#7=9?*#p$c z08aFfC8~^`h0WI%oGBs-X(0Ywn~z#EV!J0}L^6J$@I4%6g@TST)!7!0K6Tu`q_Iwh zxgp4@AdWs|J1~Tki41O^ZK)eHtJd@}r(Kul!)l8lD2L}C2jvjmq3h*P(V@W%F|r)E zld|T}2<8)Vlqx&PiF|n{!MTHm4^2%{w(+zU0%Klh)7y}qz{{i;BYNQ>Q<)PzQB#k~ zm3Gs>bOZDE8!vAJ)kv2b)wNj3ON!C{V3X-ag|FPH3o_g!=_?1j)?M0FP6{|#avK9L zA9LA}+Od&zqbqthk|omHFYk7zOI|AR*76H(EqmJI4o0JKa0{Xh41WwQ9|4tiwFqHS zQWRba{<86<&mf~VV!TPUy}zq&GrNxDb*0_jk3pi<0V;!L)BK#BbWZh~dT327-*wWL zp!RODMlpTsk3%I+dwi0=i{DHK@cqx^29v93R$+}d1^0~t4B|pyp>~6sG173TqA8bF zT8vepsTbV*tVZ|Rc@%zIH1i-erk9G%Wq@d=0!fm>C-*-M z&k^@5a&!O@hX5jD=t&X)TtK70`r;;I&JEi1Hxz{Q*+Hj&vOs)ybPxlTGH6Kr2FEDRnr-&Jdbw+SDj8}Ak4RjjQgtzNL z3Vo>MO}%?mMH(HgmGYD|ZGBWVGiu)cF2@$Rxatu9recik_zF(&#qPdzf4Ief=ww`x zt?1@3a{IVywL9o|s}eeO3(ig7C=t?nd5Jq}UTQ6w+GY^zQo?>GnK1mh*G{Dz4V%e? z_wP~(d!2eist9`jaY!s{YfBmkL=DB5&$fxXFN_Dzq)9CI>Wgx%D(qhl6%|DhjMd9A zC17$13#q(Y-2}5^n!yt4A8x?)R*_+B8tyaarsaHy(Hw@)kV}k1H>^U9z|sbX z>ETNy%V+D2Q>|-pkiLE;!5~}8aJ~_D) zgawBuD-}r>0BI<9(HEb6GEv;UG_Z7m{4KXglG7d7C+)N7@7-=1GGdFd_UEWfjSePSx_tp^M0y~U58 zP+>UL{W~kv;8^jRWcv3g-%+^c$g9|9F32M*e83QBC^m+(API=~MyZ;=Pg5>XJZFA; z@qfuC2A1xOe+nKT3IQ{!HPC@$dUr;7C= z%w5mgvFpOGL*XHErpiH0WPd!9omL#nkl-=mCO~@8ej@`0V%9~+h3rdsU>&%R-2*E| z{=@GPx*f1Ye68s2eX5&ud_Aysl)>PT!s2PEJ$7Wl|I-t6V8NMiVIA-s52^TJOk8I{ z1#Cw1>HrR~s0uoqDnK>H8c&~V3#h)=?Yo&EOFvemdy8dq6<9Ipd|T+8lEcetyF2_e zI6kW;7ku#8X3J#eS$^4y2P&NcDxH<6>=sbjU5UzG0hPU#sO%R|*6do~(Qjx0rvP09lAr>9T(xNjFth{%`*jlwYY2rkvG!auvP z$pY^|G-UznLbse;>R0YQyp-NqKZ<(- zNvx_wzk9gtvDll?2t+9)WjS=rHYfsD-pq-3R2ioL$&ZiirzX`{wwq#4oX}MxZ_WQa zz3gI)#TEjB?!UM$+hFuIYEOs9i)jVc3bf8jX!$G9x+tM_ zzXGkx5?YT-(*ioKGYnlXCC1QMgJj-6s*dZRmBuVJZ3n|99(M*Ghbg@4QGgGsfo)CU zc%GvmI2zW}Tu=IZX(i>pRxRt%V4^!OqBH1*(EDwOO~ZixV2mawB>f#CENvRFCt_d@ z-198m)D#{akj4IkZ6#!z6K%;%zsQLgbGFYiRnQ|VhT9~&4d7-)a->gD8NRKp_-)Ox z51>ZGc4^6{F`Y$7)#9w-;h>~P3f9jMxNt)1G`&WAr3cd8g72q+B86-v#k0so&dvpyE<`2~e<+nlc6?U5m&Ytz2kbu=Y5w$R zWptCwoa}C1Vv&ZH3Yck`!-t}&o4J1cP?K+#SA= zN<%d>xA2p|p196uknydz!v%LAAoh=?R?q>V!fUK|@p7BnF|y#9T+C$K=IeiJRw{Wb ztDACkhIN*7GfKG_Nw$+WE;k;*`zj0>h5p!-X-9EqAzH;+k7Nko!1h0-aD!wu7GiUh zmoL#_rgHl6{J5JcA6b@iAs1xZ!x$A4Ej4Eo0`fE58wW#(O40bRznU^2<0K)EC(EN8 z9r|-cztL@I5V`F{DNaSt#&Ff9-DOrj5_f_rkE=uR13^J6S`z#fMJ}vTRiVhChh|c zEIiQ}#;G%}NDGaI8V!-|_)&ReDKHx_8EByr1*)xj%*yyD-ed%AhvUXQGXb(dkj68V z?$6~#%#K`+32z&lKAKz&7LPnV(INqvC0;R=N@P^^N{N`jbUUes{ievcfWL_{zFfv% zu1p}836?8!FPFJ5DO1Uy#Zc)?YKqS#jS=yWO3A6I5*4)FBDbgHAC?o3@+)ES;gcm6 zgpRMIL-xwWQjhW~q(_-1Mvsar6QNmhD&vpxN-{*bngqfZmCQU!4`_lDAQX9ub5#=D zSjrHISTgfaqzs&$R1zk$((}klpLSVdX^lz+o#F6i!dAR>w2PAgfqq3*WFR+mxYD{EN)i!mhFry@Ic{Hj+8miw#-+-kn$fUT;qE zA2XE+wjRhqMUUZY<;nm5J$ZtXkrh-MT4PUZ*82LLh0~%JH4Y{>nr*hFpMRegY4uxO$6h;;?nS9|JB zY{&$paE9j^@{{UX|7Zn^U5=VdDml_B&`yYGQ@-wt)e!*Wn2_;1EII*7)gN9QYDDQ% zpx;bc8D6@1X5m@SqyduOFZh(2#!y{rC}r-5bRxlt_gaMWfPews{?eR zDsc7i#cJ`_jRUju*8<*JmKP1p$>azoE{q~@MpP5iIH$v8z}i43K`}$oKyf7tR7xS| z*&-jAwy!+U(b%R1JOQaDL^F0I)Pwp&IzC^Ae$N3^}q7cKoLG}0lxDLZq1xS%i(+cM!?igVY?Z@3dBtrhY>r+d^E(;q@uJi zgM*AFKLD6T^Ppe38nv9H^eqhC*@2O?EuKRS3vsZ#N6Gb$sVN;Kf< zYVCvE2iV)V|9k+C;01w=40u62a4V9oob(5Y&dCjp9;SN%zqc260v?{hyAKj^^m+s^ zX(WFyE?7A`hbr)RQ0pJDA4lv5jN9K%-omNiIip=bGhWXS^3-X z|FHM8%ZVGy{@!_tS=*^&1_4xC^qM7Tdjgct6=JofDZf{q=3Ipp31pNxJ_rY?S>6XS`bADFub}PqqUNt>& zJYGxzJmvj}=>RO05F<$#xl2)*)bM%=Da?{X3gX67iJS<;gpzK>LFF;`27B3{CZMc$ zI_(awoY*)`*|&~A4=Hg07#;cxjGkp}mgyIv?gLCqK-^f297`?w3D8gs6Z~fVWhh~X z6&NG6Mh6Cnkio}%B7kt-It-c_27S|6sBZoLN-995d#x|(s~$tGbmZ()3MsgMkkEpgpB z#^zE03B!81c4TL7WohYkF6v1pV!b4YL_j3dEi)0`*LY`OQfZ(^p%jd=P!r`z(5JW@ z`IuhV2}xppL2o3V_LuZeR<`gQk0pWWnXXHkJTWI!M?M8f#4t)5+WO1bRp&xaMta`y z2KLnU=y-6nj-^Jk_$;)Po@E_XE1h~*D!H9qH4$i6!ml~+w2$B9lqwk_fKna+NEQ_u zd4(u%PvliJ+k|pzM43o)CT5yR>#XiQ#)m|zLNo}x{7$4LG+H_%0e<4#`jA>e?X@L2 z-oEH5#zbA9T?uU^*`5H2`XL2U%7T=ZK#VMikphvl9KKD{BI;;Y{`GH)mKY>STntjm zf|Qm(j4X(e0(o7hdFFy9#v~o;U9#ciyHd_OBl9l#p&5Kj?@BrEjOg9t20DtXJ;NAf zD9mvooVfa*^n5l(r=%-(YNTwv0l_+IR*t*m_hG($@OO$e>G%{IJG=PU@3h-JvLaah zJ(?-q$l*;CqXEAF56+r`Hv*0|UXLEZDCvX}CVpq}q^zzCaX%jL@Ap}!*Qc4XUp=W;Pa7@llj8BeWlOoGonAGZZ`dao z1jLQm81q9f35*F5FTQcj;W|dcJXh^k&uUV-ELXShz?AcR*B|;^22wPTO!)l6i(_7F zmsAZQT=_L>Sf#J340!S14i#lSRU=%{I6&Qt&rrD$dCc^zuKO%r8oXFP2`yecsxj6{ z(jHiX5|{7aeY5{hUL5c(LG_jb6eQ;X_9Y-|Hd?0yD_j-Iv?ZXC6!DcY5C+(iKm*Lw zC0T)~Q39KmUR;nuu#cTPdjL;y_4@mIs`|Q`ya*PM*dHQg)@CVekMb8KxI0 z(OSBmQeK&Q!k(sDS-ICX(iKa-R&0ZWQvGj)=3zHWPS?Fk=a{^qbg-55n}CqAhALOQ zpz|gmi3r@ObUs7{fS}i?qW>y>H)T!M#aV9|Q4B8tnh^lBJ~d~fa>j-LA`_ZjTTL@| z3FqnF!9l4S$|;tTpvj>cDMV6Fa>Qs^cQMaNUCmgG@IH^R@P-B*L4F1MMOxsz&hiWF-$cNl7?e^P>3(^-tY;f} zpcg>LK3~?+EW`$m8qK;2mvpifI-3lRL=0wSr;%(uqSGE43b7JS3G({>Qvxo`pk=re zu>i74%|E-#<-p6*^}H@$Kky#Y<*AYSIMXz-hL4LAYI^~OPQn>&vz1YLgm|po%aUs# zY6&6PT(+D}2Bsm_n~#UM?I5NXd`=9uY(npPr=9?QsaH?hv8&lV_%)IiavsU;?zS&F z)q1y_bhoMWSM5sUKfwo5=%o+jh4^9r!B+N@3`m!YmTO=TE!9+AEp2@f$2t%EYuBEr z6?6!XhuuAqe=+#f*s2!G@j)R5wBy^DXEkMPa{{Ic$#$F zk*D3t*?F^`Vr&v5Vk~YcdGi2c)8$FVW@>KA*qH1zV-xRF#3mTK8l-q|^+2)4v;0x9 zI>ejhX(`3i(t4hj@_1TW!_(4Ao|c}*)6xo_meL$4-Yx!_Rz>h@ZK|8qe~FBEpiPa`103g)ltg@7{Af zPGHT$nLoh;2bd!X=AmG|**wIU-n}?FYP^STNj!4h;(7qn%17usT8h-v%=8J~f6QpF zPpG)cw9chwTQFXZe7^HD-}x~gOAZp?fI?E0NW_y27^n(S0O81o28u_6o!y^n+7&Na zd9BfGDcVb^hE3W_nnh1+uk@MQGhVzsOxRpfvv<$*U>aA3Nu1pf{?b9 zD48x&sPeSprqK~CW%(0nFD1?)$(1N)7TWHO&iN&tr%@RTfCw|7Y#^7eQR(F_McT4uDcFTVZfLgx%u z@QPht{8w^Km;cndXi^qz#^fFxStDv!MSVA6mr4oqXbchMPr{I5+>Frb9Q2sMT#S1u=il>Oo8^+%HDXdhZwqkJ13q{uA1LBK86hkC8t+yC*00 zO0C`z#*Va?H74qovrgkGmr?|0lm?FiFfl|^DQNLlBW74j(o)vYNlV(dkrEIaTO`;Hq*R)pe=EJHG;Kl-=yj?&sW#_fzE1@ z=eQAz0We~3)&X7Ro<4=Y@kR}zE#_@$1KuuI-iWUcRmZu;W84g!)x|6` zHp;1OO}S`O@DbXyDq$J%D5thUtwdYOMO(_EHL_@phtV3jXpJP=)cjS>ow8Q2S4wJz zz2a?xy)ouxrMrT|8O*7-2@a<*m)2q~JR&PC zVS64PigLaH9(9gsv<{ERdaAB&jAv8YP8vBn3C}QJlw-$H4dCcatR$6Ah>KQ_iX7FL z){C1Vi(xa`Fs%wVM^@_RD8RJ#+Z>tE&(V1T870`DL+;7({w3kY-#-6G<)U}e?sWej zQe&*n|FK^(zAa_)f9!t`ufF8}_-y@;CuQ(dx7a`oFI3VB8&8=8;vDVN_AwWN2=-&X z;)NfKMHS4x3@Tital3)nd|`%kyF!_==cpZ9k3T-EuR9|Zn_Rl<=I zj(B%u1{0GV+8)QdIiMCkwtPPrjOI?r4*g-x^!Ph-764RW4)}>b4{h<-o#GlxfIlXn z*k-fQeaNb#09aRnSEk3X?h#NQIM#^C)G2TMkr(*Mj?SV7j*a*`3YJ zV8&{;2S^V=Z+c^&)!^HC&j~$y49~#YGt&#<`)fX4b!WkEd+0g<=g)`y*mnov%mz-= z&(j5xHTNu_?9y>9|Blri&*!~4R<=D>51cXZ9-i5eJ@5mVO$YOtch8Oj8+yU9@NSri z3HXj}?8J-v*~|_`zKtQfW7`jgHgDOE>#}1f1mSpRdiI1J`~DDqG@Dfhd>#VYw`K@P zkMW*t>}=1R-@q@&9RYTm9|8+Jlhc){z$Yk4fSuSL64{;kxOYBaZ_V-inx6#zAHa~e zbo~Bs9)u=)``4erUw=;SL3CV(eCJ(jWaBm2>=aLOVfQas({|v&VP|GA_W3DZ(ZbH~ zrXA>=ORyubi8E(x^C}3A%~}qvwOPJ37SCsR_3{F{6n^?Hh~w6|b7#9-AV+wgatoIn zYQ8sQZPy<1bFgae?OS#ZGKJOOnQmxX77##h#=JM0g8>ux6NY!j@UCfIvvV6iA1@$< z4}iKO$K{9a9L5DO`rHSw-pHRo(@lRe^4%HhfcWt9z?_*=*72_$k5_#>XyD94);0h7 zAD1_-F{ui^4(!?RuRmGWh5sgOA_;QywiZs zFs6&5Wd{62=f_A+fPCoQVmcmvY6fnIzkB}8oHy~j7(P$<$$SWU1RetzDBdiD*YBM1 z41RY1FvsRBWba%UUp2==`_Y;+kW|-!K~@3j@Yn|v7}|qTIGXxXEJuQ!JIBNeb>Khd zI)P1JaqHYVp)>L6tp|fToXvv?3(etZ?tZa89+m&gD1Em1|C`dA?EL@cd*k~r^Z)1g zxBZ-dn9F8WIwjY+7MtiynKTJrUK%C7dt9v+485db)r-(B(+Ot0WjiT+{Fi|}@x%YH zZEE6QbJU%*<>30B%W32XI(lQ{9lE%L-!Wb<;N30pezmpUuN~86TUc8 zzQ*$(hp!HJ7+AF5BK}k`b~>+UZ(*n1?Vfk)M~(Lym>JdT(%YeBv1Tpzb*Iu24Wx?# z)59&i+nqBg3MRlZRy~JDYsw4e%`KCs+g=@{cjol#?|Yp}SL20ti5GB+bO)oWzwe`co$IXq!zjTEWh8;ce4LIn-Y3{4*TB#%m3Sq{cr5=f3g4n{`UW-J^u(MmWQyo;OhxhftGp?yH`4{c> za?v9=sQ?uuPCF{;7yJcCT_=TEps7Ka*)sh)nBpC+aP4>nZ=uj6=)Eqsyqt=O)=KW}$>;IFVq;^bC%&z78YsFT4^ zfTD#dB*68}0s1kRkP*{G&SyT}G+}|6h#7F3wN9gT42>As?#YoRk|4?)lDI@Wk|X$R zyx@|_zt9cHh`8@n$}Ri%x#=Q0nMDG|B|RuSwL?}zA5#>|`rEucojDWd4@w+R2AA7jR=7aKAU~3vh-r-VrI$_D=3eU3@BWFEGp|y9>naWZX3aV43#@6SgjJJ zAd8VR)ypH_9oPYTbyn|n@RH3_d0(#cS1FU{9f%9L3(32 zO)E+T(G^+4p{1u(E1m&Y@Q%%K7-OnpqQ1$(vT&>lzSAoVET~R4xd$DLD>#m4l(@MV zb6g<+sTueS4`o>~8V_~g6%JVq3#z#&@5aO-Qk(`uX@xGvg%Zr(``_-r(f@F!ta6EC z4PLVk6$*n~J0VU0_vzrp*{Ki+T2979wQ-PRTa7q1*zj6<5)rAzOfXn!fD0&0NJ*zu zOgid-ObNgEA0gDm)s+biA>Vxz3npVgPTziZe)_&v zrLTflD2&Ihe+@V(O-y_mK?-1)2(^GXpZ7qW)o7H#-&VbM3F;1>PAc!{xcE`yxPO9M z@Ip|FDC=rifD|;eQw#g7HnN z*T1;|EYlgNX;6~^xZsWz@&cxA<=_7IcS$^;bj-UxsZ-?XcA{v(eJ^5@)S%iPDo{{h zk_{r|M(wmuuZtp=b4WqHDd=Gz#*;XRj|ffI8G8I1IncIw76%5&VjLD8+!r{uQIJi# z*cPR)Px)#4U-Ke74s7{jG4fGa;Y5SUjG-#2IvSZ^MJY0a;}*W{NGD zroBZd3z5&6LS!~u*-`Q|vmmsQ>MWVw7O%@&2UPUN;bwpfk!w7~pIV)y&?ghU$of>TKwg{#R7gVt$I5SKIr5Z(qT52lE!knIJNf z(r~SI3Tz%bKTD&v7>;1Hc2DZfCJb2k1^z)3l*2#R_Cq4&S<@SFAU(1xpS#?!;W9&P zgRWj^5Hl<}L2<-SRZGPL8Pm^C+N}>|at6>3gV9C4HJ3qhaW$fd?=j3w6GMQY%e}aa zLDf`=^!1=by)4Hx@N`r+&#D$6GGaK2-w7`OQsQ({(*WTQ=k>vjlKgC4Rt|XU8 zS`RyCIr54oDVYf$I+BvgWhFF3LKJKg-~ymz?Pl+@U;nyiK!7A9(8=nyuAJIzM4+cJ z)6>(hndv@~IR7(tB4;n77v$HL-<6stME;bwsbuxWZIySeDge{#Jr_6|Yz`$(7 z%hp(;2iUag=YBABU~8AZ_tTQyBkUWA#TmyE2R@C zf*3a_)T+Do+u9-pg}oDPXrZw4yuNv)-9&n_mEJpve{F3)PxcOOaF6D1=jG!~_m($( zv9tR?TVv~$9&rzDiUZ5Xe(^h6B_}b>A7XHA; zVW2+JeC!RTBwhMklIa01HuLmyKMm6)u%`o$ED?Lm>pl%m&sg2LDrcHC1|*5~5G0={ z5YRIIJmcV3Hj*uRblJ(BY^yax26E#oX;P=rs+`rUon_5PS;@;(k)^}lb7bT$BdH+2 zOl@3iEH>8TnDoaN4YS4D2Y1Y^6c!+UK(!ho}ug zYDVBRSG(s~TO7ArjnxT|XeC5gx!K-VeQf`$TD?#bSyeDCtifRQ-o9M@yIH59Q*Bmy z|9w`fGchwkuQXwa7Fjtq(P(ew&+M<(Vi~CxY`JC92Nua{(x*~CE;oDcGD@FHy>(h` zW&}R&w$GYn6q?8ee^TvsYmI8_xKetbu?a~w5Ui7V0QFY$1pj81wiWtBX6z)K%cV|r zC23wK3atWt`aU~!w^grag?``ZotE0AM)tu{i%zv(EoY|>si8)#m3_8K$27y$?#qne zr>lVC(!=9 z|Fx?251fD4y??&}5M=+(pJD`n7GGfmd}S~H@9coD>F^(#klkL5e1uk(1@y$GL^k%H zGbOT7;SXCAOQ^jVd`t@8_GyXbX?Ahl=~Ua|dv$YCzW>_+5y7kP^B-E?T^X$Oy zTAl9O_bUkFs0|l}U#ZP%El%65ZfmvAG+=V|+L`SwVuuw*UTc-R^;KYd$K?6Ht!34& z^;)CWUBUXRXEqbdrTR*gX_V^JD05GUj!es1cH0|*a0O7v%&f)&TXC6zo0(0QYWL^H zX?BCMcG4`>R{~xIcdyiKHEQKvcLmF>n%y+7pt8#fjzZ;Z1t;McyqFyvg>_cw3jJ?2 zvvO4%SXyBW=cQE~5)lb2IV9aucclir$TRyds{o&^AcoJHHR7P`s8?Wzvz0o1(XMr? z=UH5ZE-fjT7nuxQ8XU<+eVpe}lHTc13CTdj{Bm;XDl!v4+HVK5mv;b!r&P^4$Nvs*Me zfyasX=dW|p$o$}z`bW;2*e;G6ZmYGQmM5K{q5S?kcWB_)YOQa%8=*ool>+}-kT$Cq z=Y;jmawy58Ks~*?Av0j}C+fl*L$mdsI{Y6M6o0!ksw8o&p;7v|)mDXP#fM(Y_=~SI zA*?kYM98m&hS?CFmb&G4=?LYu%tJPWa4=KR;pOF;nf%K&LK$N{Oaq|@BlXEZvN732 zcKI7G>4#?02WH9`ILw?8&-Zm*ZhHy4yD%Tw+yqp_)E^7Q=;23nO1H2Ee8ql!c1@NS zNc4q*)n|i|5q(5z&%CWRf?}!Mt2Jv~B98uR^MmMsU$@ltE#(={z(& zAKxx*k$i>`{y=8@_ldQ;m-l_`C)K_<9_tR?t4BS08-_5NENEzRiQ|jcD4Ian2a!6@|}o}VpL{9 z-w*lzy5(QtD#_f47z{0?o6%2my6e#JieUEbv3E;&Z5&Fp?zI9LaQ>f(MP1S;@_}5Y z$!h?Vwcz(LIx#N3MJ(9-`?NJjjJIsXq~n>p*O0*UfT)Re4wqdHn2@106o%1P@I?`4 z&i^v_^mO^3_xE;REaZROfBwz>dlLJPmWR#(oyg%b_%xhMaO<;pVTECSZ?`~zO1-^T zu|&V>r{OLBdvtHzcwWKv-l$!gPnD^`R!kL2r%F5mH0I#MBW$2fxCPTZZF11B_O zZ=#q?1b^qa1Me>A;plOpKi4{UuJbFHY==?mtQ_*hsJ1pI?SAOdVgwOr=wuIjo(lVu zqB8*rE=t|5+)X8kHysTSMhQp+52k!&Q4`DD%>xP0VsCeLpOx%_5$BOv-;9t^_cR#p zwlY|(*_O#Nc}LihWU}@4XJpzZIG!eRPZRekhmz(oCBfsYEC=8FOnifH+w=YAI8;So z7Sax=Bve3BrXL>4e|khwePs+?3TBr(Tb-@#3q48AE@}(>fPa;KrjT)lfRi64NoGLBeUUsuMzTRL8_ZFS zPNmf;Xvn#|9DFsj+?8A-v&F#Y+PSa-t%n%VxwcAlKs_qu&IOSCdRo@ynPd zCUs$t`lwQiR7Nba3ViETcS>Ud1*wJQD`aOpia*RPrNTi(9C?zb*~XPmWG2Z^C$MgC zTM)6~rP(agQ{pYfq0@NI^7j3u&`%{%jOMs1*^gxl=@Fy%a66F1+|jn=_MFL(Ev~{* zhB0F@pCH)E<$ZC}*}M8g3pIdzimtndh@F+GL>I za~fU34|&JmP`Am1gyw^>Tes1l2cXhnVQfuIu2NmUg<9!~BS-NUvumag<|7qGLYh`K znCD5ElN!6yW^*TwC7w+6Vzdo|m@FCK$qwrnCT@L4O?!?ESi`8JI+qBXv z)zek}TfX?<^c zMOf&2!cGTCW{Q2rOjy3rNRT_y+~hvsB4|V~P&eYy+$;f9?Af=l?pMZtNoIH3wYO*8 zTJxkZ9z2cx&%xfEy`9~c`_K1xcVYkU?(BZE|DWWavWIL+S5rxhWfW`faOpo}4S4Wr zr3I%$?B5`fhH1C0CQ`82=p2$3CruBUDvH&LyT6W%knx12dc(u7GyD-QX@Ln)-_Z5LO-bjjuDC#t7} z^e_1;V{c%8g#LvHx7}bWm34fnvEzFD^*hUVB_|`O?TnGGL`H!4NuS8=UCU2#+h+LT z><1Ii9q74a%4nhpSxck9BXvX6hnB__G?TtEab=CD{!y?W^~pvtch){Cxt@Ooz}SW| zlZg7NXB1?#g23xLY;=$%)Sm{3S47-_j48llo3DR}fBx4^b6+m@ZN4uzw%j5hkP@&c z9o#B>llFg}{3omZtX=EA|MO)3&kz@8 zgbYoD&37e(AZRdq(El2#ndj zsqGf)MKocdZH;ME=dr=ut9O_ycynpgN5mt%pCI2Yka9PmQEzlZy%n;QE$%TGE6~~l zYOm>W(pNp@u|OLN${B)LSBU&sbEuH*a3m+Ba*Sa_W4Bz_BbAPfpkhwgQk|0H9u!$LzRASOWY|tH z=(he#)<9y0bG&7GOQQl)d&W-5o4y_yTSX=mnOu#f!-*kfB51bQaJ2{>c=UQY!ssM? z2|mFB@uw^vr0gM&qG3qONCt8~59vn3h-T7pj7{oGSVR8%8r_(>7(4cnVF0Er2G3OlL@>2x8FOaTMRPVTp3g32Y8yn}pRQ!~h(@S-Xz6 z`>h}<05sNItVi8Qki(ZV6C8XeOP?mp8{OJ-ihC6dv>IxSx&s{1QS-x;Qy$FguuXT1ytSyR#rs2o#eR*b|GLR@?GN z4s)!ufI5g~5hX}zZeoKrQ>EA71=xzw=@!<2oLB5A4Sef5)S4?ki#%4%!DN7Fwqj8y z01oLSh;3m4;+7kSW=U@Y^NO;rud%qciTa~y$WJ}+F8IpwNf-|TG_zej;SnjA<=la& zfj}QBAa#aQ$JlvSGl$>vSzY3cm@Klk_?9%*@_ALC_~QK;YV`pTaNi4#aJK1=Fhy=1 zu|*`V3+8RX^M}Pd=d)APDlHF{78ErWL{Pc+7F3+@9@`Z#_I%8nRwv^qp?AblTEj*r zu9}m$ab-o0tQCf&9OMu}a^iqF#`Xo&inE!0Xu>vhPdA9>6k;-A zV6(xbm)-nVMVK(=Kuv?G7+07O9y`Z`pxLxQolztaTtM)}M1IEjH4W^j%W-1@{BMk- zIdh^U>xW2a#1XG_&DPs`am5GD^2hdva)R2#JV?P~k!TR{90C%Z1=WHbBtNznE586Vg&_Aq|KS2M)LVJP8-y9Kim%tMpMLb{yC(XzY=cc@J+ zY5nC3*>ot1vX$cK#9f|?8;`}OYYIaK;os0%9n7<65l!Jf5P$Ze5PZkt@&xQPjBPuN zN^FzSV&}%3AkzvyGZ4}3lcyIT(@Nr;T%`dp<~^BCAh<8f)(IeZu=l2YpMtvJ!ZcEc zL>xhFE(-SmCvO8;ES>VyP0lhLup1y9$R%BK?se3T=*}*;l4`)ACBa7{gX3)=nV@co zAlg(asP~#68@DK~0`bnON}{o9=y?Oh$6ce3>UrjGyIu~eoju`O%hkaGO*NNvIGM{* zIwf~u8*4o}U?ya}CUzooePW@okd`(uQ;1MkcHe?%!tEQjn~CVRp=hll)UU z>$V!DU#h*DxE5tbgoEec-gEJ#6F+V{t1`=~2xiR#uaiB%yG?2AxBzR;K z@!8JdbVO@ij%-Q`UArR3MQD4KS_dbuXr%92?T$Hksw8`OK?;CSmP%v} z|L!uU)mPq>PJ{@dQO(X~O#1RL@q_@PQ71A_6GDB>Ms-`2mgxuRg+!f(gj-6NpDc_A z5zIik}GNY z!BH+Z`8<@F!YL7SNXnyb6{8n3kY1(KEya&EO}I*r$nVgLQtZdV!-ls^litWOADR^y zMLl7uI-t+oAieTHJ(C08#_7}U412zBrm%4nN`;Gyf@bIHwA57a_kmxi-Ks9eP0 z@T1%cTxYo7&5@O$_*;a!Sd=H1jJjA9+zJ(*bhBCS*Vh?qtW4^+ow)xf{qML>rvHE3 z+uhj}{lB~S^7-ELZ|A?C^89zawn^-$;MKh@Vn`y4nB!$(PpSsREJPfKK8nsi^f+Nx75z7SNnOK2Uo|wZL5xVt?$pn(r15q8+HE*QmfAi5*NN|^ zG(;%#=G>CFow~du#?gC!>~QFl<66`+SO`U&aF1dZWa4i_>cgm@7e*S7y@7L0t`kSo zwh_^UkED1H!C{NU>2nB;9VY*lJxe_XZNMlAzM9yGaZYZ$iE-b*U21mUZySG_HAE<53-xS`th?8y>x9F;)uBFz3@QgEljZy5<#52H zQEkHt>XzQt>TrK)(8slIv)bt(tAQ#}`_odpTPy!>dtchsMv^Rgzf!*GmR@VBO@cX$jHoy z$k%(@$Li?y@zEiO96?Y!**$Hbv{H+G@`h1(VsME)NHA*q^lTpc;PO6 zQ3ZTy`&SUJ-t6ub3!A+8Wqrm@vm1w-6bQQ}OJ8Scplhl`mhosZD~Em(qJYL;P9n%J zs8Kl`7wq{`G<72U0e>lg*7uGoiM4BpB~k-hyfNShE4B!f)QR%>uk7DJ(n@#O_gZ!H zm!jI-G@+HEqQx~g3wf39-A8y!LtYgyeAVnm?OaMBG$+p@3RQ(PEd>=1!xjwg5VAl0 zX=BsHLEiJ%g}yLuw)pF^8Dsvf{(!@AvmX+*^p@dPK97w~JA+N#?fK=zm?(N}p2py0 zce+6u)Zlkpa^>vo-I+RDdJm0g>u?@#ot?RrN)+{xly^I-@Za%Szo2psa=$rQ(8 zeEvMf|K8yrg@2&PO63A1C|!ZfSfz=KKKXejkG#-nD`#kUNXndq;2ymc=! zNQ2m%OUQb8C7-WUSawtDPRc|Xu6w~EoL^lL`QTeDJxW^b_97(D>w{#jL=5Khqv%kefs+d_^>O%=OdXF0Ia2Th+dygv3&yCig9X3d7rFjuTR@}E{!hJ?qHY$Og zE(X`vr@^=6R7oEHy$`J4f$4A$l-69n2MjARirV39DAcgV{vS^RgPDOQOqiTb8}sCy zN=bJdPcE9HDVeo}^VH1$SHEXD4dgTIYcYH4vnkC(6JOcz| zwGuGysm<}_%cHdtzzwcO(?K5J5AwtXNsfGBiJ7@wQ+4KUW@l$6M#h98Qynr2eGN1E z`R>u~!SmgNojRWXQ5kkB7Wr&%=Wu`j@POYrm$IErrJ6z&BTLg&6tW!DyzGdjsyTIR z=wnAY#s%&;p2RxTLVYkDK#vD_>}y&C4HNnUKc_?ny-&hvf!;XHdE0?DnYD};D@dG- zsyNLwb14a!d0r~m{VKZ0nH~Ub+B8_Oz2A7#I5ItZ)i`R@Fs{Zeh~ZSCyhP^#t>L8s z?v+f;II3+J+%V+V6{oG2M0 z(#h#^A%TjuK`KDoqHoEGwFw^M3HeDKop&13Sr`t$PFoXTYFB8-0UXB-$F0FI#M?tB z5(YqP4AQ$3)xL_H5Go)$LDWz1v&%R{{~S#ZP@+9-4m?Ub8SshnoD7Mgb@Z^^$%Y@s z8PKViWGh(&IMbX2zZ?%a&J&BM_BP*m-eC=J!Sj z@89+Zw+FB#;S&QbYl9@d?6#3Am9)bt^%Ni3uJqAtY2)cn?sl8U8QP*Zn(coz;&40} zvIRHR+c}KS83wBNhlTjI4F9_*eBAW0Alu_=3@z1`{{o>MgET+1+s)e#uvxSPS8i{e z4KL*aaQCQyiskJP%VHgKb1<~m20-VB@(N(ngld-AYkr12kJc!%KR5@P1)FXL+C|UR z6qR@H%kO~xv$K`k_mwmF{ZxULNud^`xPcz>_8Dg)ZJKS1Y_hJisR1-is%2cv{PLGD zmvlvnoA;NgymG1D+$Sngvbx>O6;wr)SI#PxA7cD~|0=L+T|HaI*ka|~hst}{C$65Y zuNDNEJd0a+w)?Vv0Na1Mr+Sww=iUR|xtzK)aryiP#yNo;^4$Eo9tcrKEkAhB7eHNW zr%#LaaOSIcyaL!&2j!;H+11*nUoO#dCkW6L_*ZJTWgK77bOc)ztPrQM!smN+SD;RD zyF@o+A)o)@U~~4LxN_F7C>S+P2NY%kQgMdIG>DW29-PZ`_-Z%Yr7v{4gAn@A>Gl=? zDDel7955Mj<;?lz4``vC5joP4o2H!zlPr|Wu<1my0is|WV&&vgE>^i>&O84TDXU#{ zixNwH&SK7l?%c^M@(;h-ORqx1HqyC^E#?BV-SsbEi_V(Ka*AC!Ss91DGC3=zA6}yK z4Cvn^oMU^LNFvHjsKG}Pv5b%Wa%vGTrV>0#buwZNKf`_?jk}04NtSTHxl-^|OYBxr zo#Mgg4*f;RfFuSb*Qxs7604Vw=}!sot*K3L9i{5RQg{)zc~DZh;vXAjXk%@UE*M^( zG(-mheczrO712FT*fcs$gAQugp#WUcI@4`B1nXbKd`(0ugQyMG9O13Ua6&gMtgVX^ z740uXb+e}i{Z_bYu3g%bVHa;*P?=EG>CMi;s2z^b+TlmF(jSah+#45}aDPss&JEu| zQPr5aVW(&Y*9S)08;)<7#oWosYcvjf$ZFP*)c{9xpw=}MGack|I<=^oP^3r;4{&G} z6w&O!j0LR%pzVB3<7r(LRHH@GL#QcT8n7uc3Z`>~wmy=wbYg8Y%LOw)VrEfJE(JtPfcB%afAK=BMHEWV2kWvXG7)~~7e5BO zr>ve7qUaawNT|gjdJ7AKG=qY~)-iimij^?22^}Apj9OLZVE4BZR_T#59lc?^n1r#} zX~vUtBlE_z&+CqnO_d=)HE!USWwB&m zN)K>z>B4B;4B?FEG0#c&Zt`$xGVnS79uL(`+*DPf*Vfy(P~nB8Ds8N-iMmSbvNvd} z$%AXuS}AN=-zKu+j5tKnEP1a^bJou;pU&6T^h;O!Mjd04dIiqac@gxRda*tsq37o zY({l6%E58r7n2}Y&_H`uGMYqlMW=yu(^MSNG>8SaUpNx(8y7B>_U;Jg2Y_$sy76HM zI?D$c=fvYHWsqyi7hi&xf7Fi}`25ut?1#_M8wlmG@(@Wc7hj?wELppsQMpk}m3 zxK>B8pC?`zXJ_P^P6J>8(QMN{oRurLc+G+?-ino5++kddfS;AFP)7kz3uv{0Klywi zFtY8u^vbC#o?FRh4VneofnxBZ7PzNfyT{KCPf!(vlGE`3%~>%Ysa5`8Kh-GN;?8b$nIB0ZJx8p0{r){q0-&)`id)#kh@ZLX=`DkZ*|n z{UsfP|3=X|Pzzwt6D0nNp(A#&S>rE=+1ookJft}#pAZMV@%psRk@5|(ulJ9h)ek6= zKWoA6&a1-)jSK#gm;)1|VNOlVDa7C#^Av#}5PrK01Dqo0s}{V_5HA?wC3Fe~@!uNy zfJ7Z^ir`O(lMD>cZav?=UB^@Hnhn(gdlOrePZOsvu4``CrrOKuS|ZBAn5*iVALBrr zLO2VTmrx7#q{e$x<2@SAd(Uf*3(}eypD>&bpZ$~L_>=^SGrU`b1&kSGiD`gqSx zhoDW{pn;St)aKoI+`&6A~lr!Pmy-n2VZk&bkao8AuXf;~n2Fn8aTgURMr@u`s z^KKK+@eYslB1Dl?%sw#H200DnAT%;;psl8)J5dbt=VUN8xhYVSBe0Qt36bR_}fs9)moOlUB+CcXxe?iPuq+{r-7T}h=Ax?+!n$-qb?m3D$zxPJ>v_13qSSv-mN!z;X}GHCQu?`d>aF?k2_)F%4-# zwLsJZ&G>S|wZL#JXQ(FQ94Nu>^Esc#x%}<#G>2SRL;f$chMdnBaz0zgxlAFa@0I^E z3?a$KyRUB%luus2cu{}5ds2l3xCAL3$nU(d87$SRLFPexRb*uNZ}+%?yS&Ef@$22% z6lF4%sWJxW=_(}TyZ2wLts^N(6f!dvSaD)WRIVY8Ob(Xhzz&bj3V6|KO)Y==3GbnV zp%j5J2q!6Q+I;r1_5OUAYY7s`Kx558;#h1fSq<+ceMqx~R%NF5B+YAaoO^P@1MQWOCzW zqv2-8W>#!O}Mm zhahnEBSaq?A4y<+jg@kD5CoZtqmC*=RID2KH?SwnX)F?9v}4DCQRLIh2d*B~484w} zT7KC#8NfJwg`9v!i#&68l~5hQD?iFcL)@|U%klNHy?R+vTJHtK2R;TVB1@m5lv2oT zYA$A=XQ;3s9l~zOay~K!^uyF$_fqnzd#I^wZ^*NKIjK2N*fO396iO{y#~m-jwGZZl8Hvn zB=4APdzHZgnE~zdyD-{RQOr~+ljbwd)w(1oU(tXhCeu1(+bEH|7)wLtbRnf?Pvf>N zKMhzz8VN;l5n%)L2)G>f9fAm7Z3l zSJ8}x$<;E2;&VYze_mA?np;{Fnx^>$W4re$0`AzUKZm-ohF5_4R8{4x*9WL<#gPF4 z0BKdNQs^58WzvBxIo=H;ImYV}St3bZymO(4+&1-1Kt zoX=b3#FR~CpO(>`%c;4usbs@ouF_ffRVqxhnlBwWTQM;W8%( z<$H*9GE*a4GaLIzF7_?WHRtK|!8YNN%BcV}mn z_b6ffQsvL0idien!a5QKr9sk!k0b5wJ43LD?%!5L2@%0q1Zn&Pk(#}Fi-pvKyx_J;V8t*XViB?!+{%eiUx|X zEAimh>ICCF&z2ahoq)+MgTZJV8!nMlhF!{1{lz)K&oR2OATNKjiI!ub#cXIW%*5eL z^||o4@-0_TpS~fv4QGRBJ>Vtxh?wFSVl64h3M^$Hw>i#P7H?qu>Y(bMKdLaBBgC^8 zKGC~3$DU}X=NwZw`kERx#{@1dDKS>6ph;MJ6KJ@#9R#Jts}-v~>}H}@+$SHirlRj6 zu#q@uaOR};5_oIW#dRCX=||Zdf0#kxoP9WI=1^3{%d2+*z(Az>lAd#S@NVTknq5M+ z`nt~V7m!wDH|3=C*?&&yvyZMnvmZuNwyB(7J;%I(noJvYLA_DU+G!o1IDA*OGdxZs z$hkfiNqqG81^?!{8M;ir%|TI0rY&_ci4zdWj>Qb86p{h%mFBQ_=Y+}M{{Ed(x^q~- zo^%`u(3v5A4K!94(m$ZQ2RPB?q~EO}H$|H~3(2NWwzYmJnv{Nctycv=$@<^-73A2O z6z46&$&)Ten>ON!`5e1*7Z-F|0)0*;(oFo>SuR;5{?hB?R+S>jhf_D~UyLssbQ|Kv z|-+lIiEikE!-44!L?UcrX$^iH}JW1wW(_JbLs< zmAdp?&AP{Dn-4~F`7&XVlqt*Wl%QZN+zyPpbWCZUm}d+%%z&oTN|x?Tmz%vB zB;j=hors|k$dtgK`Q^p$?0>nrhc=#SJFWuY5gB}>DGXZbI=2je>n88&zRq~j}Phx zFRLndG8xjlU>(;FEIP|q#WTlyXVKSwmoWs34 zc8_6vVz@as&8GX#4&F@2xkgPAMRIYT3yHOBw*!cLUkMMgSB^~kOsQt6wybXoj8tf3 zQ`C>UNy+>mdrIqhhk;hY;M2e;`)(lOi-BU|W?=o2{>GJZWvg;Q-$VNQnYeX6KP_eGw6VT>Dc9E zfFw!(|@h0;^))PdP_`e3tH)bDvWQ57^9Y z+8z0Gt7_*Oj4e%m!CW8|@B~|>wP>Yf5)&1b68U9A7+>V@OK%WJ7%+{+6e+FPAcOiN z*DA}QMRr%s>?v(pWECu>^Gq3u&YM-b3+Fc{yCcQhQdD4V_5x|vgqzZUQ>`rvGDXsb zcHHDuRi-CX7X)$ewVT{Q%uu(r7ZZ-km%eK8t_||$jGqo#_25oBVGUeour}Ry4I8)~ zW-XBKZ`Nx4Rx_Qi8YE8BqCW6U5r_$)XXl+V@mkyCqElSSnj+~kw(99Cp|Td5Upw!^ z%uvBgcsIaf=S(LBMYGVSUHZ?;hg4 zfN8iE4x|ShwW`{v!G!ghKI<(R%R1Ij&<8e7ysNn}1xd=Wb^=*CT_Y&78%(RFaI2;v zb{ulgK<`5NRQiU5K8i$I5Tx{fZOz50Hk}A*t!VT|*vF@DLw=CgW{>6B?wrX8oU$FF zJN{T$Go1nTn)bb6dU2@PRcJ~=`9~q!Ip(-8t4XJxx{r}Bc;qV2PQ~*Osuf!VV}?sm z=lpKEm-wQAGFEIBm8D1AZTiHe3~AViz*Q3p(D=UUyYr?vV)|tLUQM|7=2%WgBll{; z-#5qVbdM)m#_U;LIB-ZzrdMze#z!s;*ok4Xv%Q7;P<}pLoh)DCK9rvi#;6k-wma2q z&*L79k75`*dE(40v6sUL0qMz9o#kxyTLvBNqr7(;@ZkH=IOInP(nB*u$gzs+@9TPXocn_@H+1Z7;>s?)sZT2aA~ z5@@}LoJX$?4}PDKm3@Y??jHTYUB2Lg+3eUX%L$Jj7t9zETAE%%p@x^o9a6fSgocz? zwTiFVYkPiu`O?#R%d3<#HzFvm@_e1b2ixoJo1?$REy5es0MGt8%v*%HLpM)+B3~$}8L{P8sLp z0yzJb)D$W*)aB9$(c{}5rMYu|#?(JL-rcDmzCLkW1}q+2{^i)i`x^58Xj=0H&mPiw-@bp4B+WK0Fotng49-KnOEZ{l&-Q}p(#TE<$Q z+{AAbNP;jV&{!1(!gGATv=xSJbk$itINW`Uj=-vm7oh(G-hcKy(|o7*pV!vc9{tSk zKd(K0^7!$?|5{t$c=+(=#rx0S>e4A3a8bm-tRU7NWauwFnoQ41^CnP^K-F?o4$EpkYK;c?&U3Ns z)4`mQogQh=G7uQ4J~0v6oANL&pgUsVG$Ccy=l-hz7?Bo<3)yZ)-5VA6o5T2WFgCzt zko7xw^amAwSwAh28^((P))^$HaifjKzT~J=$x)=G5#%i3j&v@n+lmj~waXlAEn1gh z?I{O@6}Hz6bQV>0(IW}WbCC?G^O@@#h!-x4!6Y><1A64T^81W@St&s^g-D`+x&?Fo z-@*UUhty4SKV08<@@VbR#s>2LwTDk0FZloW_>tGLE%*fi&HYgr^`r4J z$cH8L7y*-iaE&*I&EXJvJaEt!N_wNPG!hpPm2ljuK-NL`s!ZCuo+EPZ1UT!7*%$d%>MQe1`5p%@c_ihr=3IKM&p8L9aVPvem_jcEmvwWEG?^<)+G z&u}rIbH!#iw#i2?8m|vdj&^tOjr$nn(r$CKif<_l_=J*cM(@oa1$eK8iU+t*H2b9C zIUclN7sH^{faO!nYLFTvdC9=dGuqI(`<#i5QUv3q1TI_)_r z1<2XN0+~eaJj4o}K7mMd)a*uIkje#P|4aPe@yz)B_&>1xNB;%f|M5D)Jt6sj4WbtO z|2zDCR4aeq58vlf>S#3hSJ*;BbQ)V28T{SFpzF}MHHwB~#V&+8A)Z>snm@~_hU!mx z=i!KW3cpXr+6wek6uyY1wVba<(U@+n!XC1ulhfyiuTRVB6>eL!7baAb#`OV;*64Aa z_$}%`+^7Pw%kg+vtyHeBuge#o`q$`P6upsz-N6ujwN{3s3)=To07Gd5gq*d<8xKi& z{Kr5ZDKn4wEH6W8=$1(RAK-#7-@IFYUsO-kT9IHB+9odN&PKUamCF^?k9<pjtadLW`QK~d} zy3B`ArY-Uz6#301?r;C|@L0WDEB)jBgN!13&3}=L>iolRMqEFbi8$*2MZ`zjr#r8v zBOVe0L3{`Q@ym3%z4|lnwGzChPE<3unoH2<#t`D^_^9t(oZMR(8O#7PS(3vlxLa&G zzyJD=PuP9`{omt_CyDic?cvXh^S|%%+ox&I(s&Fzq<$-`1}iEKdB3LJgYy-O4;=ON zahrnSQ(nh>wD^jY5BnkW5+VrdI}aW}upQznnyNbh6eBz%L$zFf%M(|vHZY4^tJ{p@ zT(J!Jw%d5ZcXIs3?C5ZZhwjoz2}UgN5b{Oz8BNAO5V%(1XasZune8sF7Uz=-qV~^8 zIHElrZb%@Zd{2$ms)hpE%5+9yDC`OLGG^PV_maJ^hsuX2D!>K@f$`~6a?Gyy-Og_F z28EFr_p4D%n`^R(TLrqwQ6aff?1arRT1`ZVx`&y={#7&@^ihh4sa2?!{Cp~t*6zpU zOOOKa2$kGPcBna6O^3js+CwP(JR0L=4Isr}b37Qijn^7X(BV8_?u0NBP{leHR8gNx zf~_pHD?KK#Tr9+Z=zK8gx8o8WY*MSPsCr*Fb7LI!!og$=Th&!XFXOhx+!3Xxv|~IE z(PK1iFL|xN*anS=5wtQr89RXPI)}Y8wki9#45c%nHzqA?Ei84X8IP&2E+*7eSp62+ zKTE^37yw(PA4eBxg9cqcTIF$%TS?i=W2|-=iLD8rk-TF|Sn+7WU~RTqFmOfTdi&s{ z{{PeV)93$=_x!Z3=g+>Fu)EOmA&3CJo0rPDGGcUt`{6EN2IRjK@)5|-fEb_J5xWxd)A+Ac0uHY+J zm&|pQ>=!37dAU7#LkER#qIlBms*~}g9SxHCx4!ik5Di|bPI2bBY}XlWfEI4w@WTQQ zhhd*sIHLjn+r!;))Nj)XZW~q+d5Bu9bDdQMS0i2^x;KH+*L%S7`Q>d{Mlzd6FYzPR z>?|WGJK|?}pqp1eSUu<>I=&P1AKlQGe6k{HAIDWh_f++1f9oi{Q6@~I+c!2GrEQ&8_h3vz^E7f2X6Ks^X zZN8hI7wyl|+}=M}w$A3{8G( z@*N6|d?8CeF~o8#5-B>|oo?8YGdQ~E;e&ZSHd)S{h_G$Bpi%ewoB1Gf!n(t^_yP+W z>;?+MO9^QG)Yyy0S~ICN=wF5X2wCD7Ilm?}%~H(6O3Jt@XXcAL0_)!WhSVcm1_Q%1 zg^dP2-D2FC8<;5Xjt5rRdqhd(jM%%6H=BOR7 zvUS-2dk~vLR}@znUFv488yb?wic=-q;Ovne6)946q{~OAX$p{3 zkeYi>BiVuB!;AJs!C5Ap)(~K7D!TH#um7}a40ks$Os|*FAIy;G8}f3t7Sg(z6yM(($guK)7Y7D z&xgC6Ky0f`Jg)w4rjSTUhR)C!%pU!7={<{y5LAD z9y)wI1m&oaUdLBSsv=%SD-11ZvMdZop&ZemW(3zN`6f5tMUk+C<$9=5kTI&irWm{< zqtmyTw0@&LDFOhM7s&jBS4hQ+N&kn%;r`;c_$_{m-{QCUEq;sN; literal 1518701 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
  • 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

    o3MEB=g}q1cMqY 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

    F7`r=U^xR(-7R0iez3({+Ed|h5j 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 z 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 ~NKBParIOpbhZS~_M5mgb5re)K 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%0A#lK#He?9TRj?HAzVl4I`pp%>#J8U;&oMnT|c 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 z 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


    p_9=iPbR-T7-w5D4_zc$$yY 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

    mS2i~#CKeQ~+T!Whv{{C9 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 V-v8^7<^6*cmLymfqRj>3{{R?f=#u~d diff --git a/extras/curlinstall b/extras/curlinstall index 6715ed9..85bce4e 100755 --- a/extras/curlinstall +++ b/extras/curlinstall @@ -4,7 +4,7 @@ OUTF="curl-latest.tar.gz" OUTD="curl-latest" ARESPATH="`pwd`/extras/c-ares" UNREALDIR="`pwd`" -CARESVERSION="1.17.1" +CARESVERSION="1.17.2" LIBDIR="$1" if [ "x$1" = "x" ]; then diff --git a/extras/doxygen/Developers.md b/extras/doxygen/Developers.md index 85be6d1..2344f7d 100644 --- a/extras/doxygen/Developers.md +++ b/extras/doxygen/Developers.md @@ -1,4 +1,4 @@ -Welcome to the doxygen-generated documentation for the UnrealIRCd 5.x API. +Welcome to the doxygen-generated documentation for the UnrealIRCd 6.x API. This is intended **for developers only!** If you are creating a 3rd party module for UnrealIRCd or are interested diff --git a/extras/doxygen/Doxyfile b/extras/doxygen/Doxyfile index 579e7ca..f9e71a9 100644 --- a/extras/doxygen/Doxyfile +++ b/extras/doxygen/Doxyfile @@ -38,7 +38,7 @@ PROJECT_NAME = "UnrealIRCd" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 5.2.0.1 +PROJECT_NUMBER = 6.0.1.1 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/extras/geoip-classic.tar.gz b/extras/geoip-classic.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..ded9ebdc37612423f63ed0b11b5944dcfff26df7 GIT binary patch literal 859708 zcmV((K;XY0iwFP!000001ME9#bK*#{^L6wqsxiAjKadS}yI*_45v#_s%?<{ZW4im{ z4p~SAXsmY8AZ1xl`6BcGPClk;)(~IL8Gajs?FBnH^0qw z1lQ}MBf1~$-s!n{(rg_czdmWcKK|yY3D2*-VXuB8dbX}4ip`L*Z^9smKh^JZ-~U6e ztD^j^z@IydB;=}T{fc9tfKQ*7|4FlXn#up@=oQHS_*JX<4LkZ3X?XVflgr=sU8da_ z?SAjFb7frX+J!!>3O!JlHAT_d#$c!q^?y~TE%o&HV+~t6z0SBgCDr*@XH%g)AM4X7 zS*?OF{)cBidX8_aR^UOa=tqEZ7;W<2xabV4Q+2C(G;C9=>&yt|kp8OHR;L@SJ?sl; z?*zZx5IKNz+`rMj*Q-snd88f@$W?D*jQW#dTUW01erI6(pbtl#eh(ln`{#GuS_Z5v z+t~jxbA8Vmmny6L#8#o>$8%Qtn|((AN_AFl{#UsLw`2It1?Py%xMV@l5 ze`U1W*<-i!cHHlG>0A3+Z+~x$KMeHhY!mbP6xuHI%T7HyK^`hvQE}x`Dsg1?={FSD%J!p6)_5Pd^QF+}edXZaslPAZ#)EmzTyk zdmDBBM=!oUd7pH8V??#paC!m_M1=9SbEWq#I$EzT(P~`xN8@@ENytBUJL7Rz zf7+u~5ZUFV*RC#j9IWCxdor^tecT_6Yqj0pvE%VzZkwBZFyqdR-oL!iKI}lQLT=hS zAh05}i=Dm?W+c>hr~ePyXfOocT<*d|{&O&+-m@^zf@Bc83|IzHJlpuD$M-U(7#2*`kK8)@8U)I>05&==m4Cwf&#d7_fpyPgcmQ0b&roNCV9|(#XGbuG zFvbCU$C(=h_iP@7EM9UJ_#EzL%t9U~p&zk3;8I1!uGhhe&lA_(KnEvc){tT(c)2c z$~^8xz#6z&%aD1A@0lwW#bJoAl5g-zZ*gcR^b!6si4E}>H#gdV-n1buF70hsuTE_< zHXC!t<z+ouBy{U!*(Kb=JH0dE1PzFaLKOAzzu|ExM6Dt=AXpO z5$%q@Urz4Hc1t=!Sror+BR#vbL)-9(pfAU z+>gUxwP`$<%$YMMu0%|FOKz(fuI|NUSGz*pl~16vYm~xqi=J8rJ`h$L)xoi5NTX=+ zAHmw*UjVO)8kW&|BqX* z{)+#9kL#d^K{NBD7^X7G!KPg0-r_P!uv1A479P8Yg*u?1GWN(f=)ZL_~cW_nvyX)U@u<0U;~$9 z%RT2S>fK_ux6B02I3W-fz~m#oGJ(z@j1WLM5Q)ZxHr60TIWM)(Zf_+!Z*NB*Mq~Zv zxK&bclA}!&a}V5#RYz9V$!p9UKSS>DNO|GReVfl&r#Bh{LPg#QF_B(UUU1)b<~X@- zUQcDh zy{KnTQL7p5POn|W-SI6qvH33kRTwNn)B9@tZ#%sr{A1IQva+dV|_FxIP}8c;RgeHLwBvnbQiz?B+~=Y2{X~5b~A!6 z`p#FBqnPDI-2d zB$@klc#xtq0?0W~VA6gnw>XXsPne#gm&$*(jX&r7K2}>0f^PR0i$yN`yw6Km;Q1$5 zwK=PAx7i_47B#Dg6&BYM+`_~@hGx1;Rr1|Pe{MR}@IsPmD z`#r9M1J>~{4K@83GFa1JfK#Vf3BI6O95M1zcVvQ+6}TgQN2Lqy1rOki=V9RGkrZpE zVIeG889gNtrw$M*aqylPeg!U@77%`{F5`F=ogE%7AlFZ3SU5hEMdZUmzZynv5KH-P zVA^aGBq1cxv&aga6*}XHLGTKV$~@#ei{~OWoy@CrGFLfDhz2x7Is9wgJ(cd zql3i&=!=sQQ2_-*>@bPKLl*)W_mIa{TD^u2N)a(a5n}k>b>hMRX-hju{5agyvv()n zP;@BYwNWqeKqPl}O4qTtAMx+`h81?xj+9Bn!;a0~(4~mjJ?_{Mdv$cmUL7B^SIyUi zK)FOxVD@1aYgr*j#zY&>b^QA%t8WPb7uazLANZr`tz3R4$N^hjU_!JsLoV2$xISw{ z#R*Z&P2bYDCw&AH3f=OC?ViMrykGVz<~Lr7GF`G_^TfA=o&a4iC9JKo$ei;`Lypx` zp&=UR(wsd2S1{P45A}Uojw_*nsE)}2R@dRK+zB@;>TPWe?zC|HASP`q3@X)foZ%nx z1&*7gBm_o?c?b#EDggb1rx~cD>4P#hqBsNrConBD3_+u#fWi-aK zbZPj4HHS8Y@S(F<#;n?|vF4jMr;XN8^S>Fnl~FK{*Jx`maT(KctTV{@(TK1y`cd+m zc*pLM?EW3C(&sP$=)!pbZ<+Y6<2gt;#1)*864g*v{M$wTGx^zJ;F$GXx$MDFpiiPVzz6Z9%*&QsCEo92?9r(Z387Va7ahkr1@q?>gh_{$$Lw-Us$h8xFPJ_(Pq^$bvt{V8g`R;#ibDTyy+LNv} zWP{0Y&>!hAIq$>}MJL)deY)#D!W|mu0^bwAIyLgM1KV9b*78ozq1g*uE&rqT5%;UM z>A>xM?3?bg(^d`=g3`vL0LDOTf3IEXc?Y%^4p7^^E3j7ujsE@-YJj1op1%25uPZnJ zFxLkUS)In2=B`0c^7TVoKk52FNLBd|By4FufLjJlLSLJP6d<6qtIE*7VH~;+!uvXD zhKv&yiHY*$6q~9_XO2OyKnTh=bGZjPi%kgai*D$;B}t?kv&4a*E)vy7&?qP5E=1?F zX$4EJp2g>Y(c(775O!cC=s<K2Q5hMzQ`OL z{HNOk(B$+0N~%9qd9T6e#wRX>Cc}Hr*?aW^i$fF3>@=KbT48{5fFPfOyUam@5=3B7 zI88s-z%&_y4x&D5TC^$XZ!oqijsr|*RcXeY2ayTkU@{4i@s}kkuE3edu{p~$U!_9< z7y9J{4_E9?9+v0S^bEsXIfhjE^9s6=ih?JOMuC?m9dpR>_OXu=9*|;8h2B^!E?97& zj{)Hb`M(p;WzZ791(~AbC0@F`U`Y)yaz$QvsX-NbNwZYt`k$7Y;s6u+H!@pwxp|5f z;ZhrG-RkrrAZ{QlSouh-mz`5bh^eNg)YBd2pu z*OG&KHQU04%o|uUiBK7Y?Q?wKAi0k@?l&9|N;gc%Vj4TcDtyDP*=AG09QZiW$3}ZH9O}LCj`%;v9%4`%Me>~P>}!um6GVmq+D(kL zGlr$9333j^Kh*y<=?rzUfluYFZma*NW`av$pLs~NE_X-2nX}ugh@bX-wM1cC7Caw9_X>s%5KB;Gkq%HtYY8Oau^up$2N^`Ao&&2Yya82(25b|&?$3cMNf_~Z z?lC+(r?d=wss#b|2Qzf=lnw6J`4ESOI4YV*Fgj>Ou*8>nBOu>#9W0k*8>c||c$q~p zqKpEevLuI9K_bE!g?x^NrpN_g_nNzIEnUXkAqJSUC~#4BKqJIBAfyM5LbUk`w@88M zAn|3e&UW%hQeol~Ey7@e++r%W`2l*&I+#1(!rfperakg#ix6-?FkIp%bc_iNW|Yhd z+qY+FE)WMRz!3pcK|L}a;Fj+O9h)ce0}TJru5%d!K1D~IO=kun8R#a)d=aVzu)(x{ z1R-G*fCV2R$^x~Ar1bs*TH%_T4u}ecm-={;mRTHfgJqfGe5vd!hDY2mD?_T!XU5sZ zlM1W;Rpfw2Vm}PD@wJR6PHTI5Hz z5K-lD1`7@~W$rwR2w7^aSdFqECuA+ijHPxZQG%f}pjn!s2jLlpaF&SyMXLDFtAcBD zCMwPTB9ggd7~G4+hVecsQ*4Iu6Lx^&BQBsITMH>^;>bY&3kTOW^u>-CI?*8L)g9L) z1M?ZNqQIQ_91)?h6z3vbZqfovXF>YfGP1|fyaptL70o1orPIa4DScbcyI)?qTNmdH0m>tffcl$;rNBaG+dl85z@~Mt1L$g z9W9Ycm$pPlnxo0|m9&aHGYx=P>a=nKX1WlZM-1flWYy3|q$E>HR9Wc&?9g1#OmP~P zmY;BsSy!}jWR@SW7-AOZ1G7MVWCbOmUlPRVnEAon=2!=D+`)t=9IPlEqmt=0#@=!I#$k;vnmb;;iPIH?RL3 zan?2$t9TB&&S;@Gvi8p=UWNSPLYNT~bgtrHmH9cr&^(^x?1%k@>VB ze*kEfsPHGkUNKS7zlm_}GEE1Q9*If}CEnOS@G)=pAHb2@MU8Sd>PN5wb7y}M4VLel zKg04BF`9IACY$p$M#>P3FTp)vpyWd69?LC0h&W=}uB_xgv#LNJBqqdixli5{;*zkA zPig%Eqa&Hp)I~HE%Frb*t%(_d>&MXO9wYyV)4A7|;PYPA({MxjPtg;^MO(A*jA#2% zi0S!$)Br%lDd*ALh^k5X&OoXu@P?E{kkiz0KoLQ=+l6GFbjGR#H_Jm%KYcmACqyM0^6 zB_`&vl+K!%jxAg)OTyq;93)i#9oDV=N?a)2$XSG-Wvf7>fCWBLYFEqz))XcRDGippmiKtj9(*^R8+Cw`&IhkA$^ z9p*F}%w2QZi%#e%aXaCRC{IBb2xT(EU;He78ImLUkeSiF-KmPz>9xC)3w>_~Km>+X zYkx1kZr57dZFGKY3M{g$^HLcUMx+9%wizy%m-D<3E5Y8sC#RW#fj)f!7-}BgQ!vuV zU9if+vW^-2sq8~QLvNwL!M_3tX#E!PxC*|2_^b9mx4__iAK0F8x33HVdaixr${&W| z5fyP693JI^#G4gIt=#g)+Ko_?iC%EWa}1I_ zM1#P&JEql5b*Qu=K+DP&g?)sLgh>Vy+sB8s1EvFWT`-M!csp4U7C?bUU=}QrNN$kO zqFkr8dPP`G<5V9jR)@RnphMOKjad~V5MFU8k6@#8;C{B zjSTiKDJHWM&)W!}jX&_SS>>Vv_BpEzR2nzXAlyVL{n-K#2#=B&c2UBgkcA#=gmcP| za6}ag7L0lK$gL-hBF12n&tzT&SJOd*A`{od8rpEc(jw;mm5>t}nXTnzm%P9S->ucQ zJfD(b*}H_jlP*il7Cz?A(nY3~)x&?&T|5A|P|lhBKFMRuhT&1GNS9!1+*( zm;d?j(Z_`ktbWs||GrZH@zbM^wc7mh$JOOw^^^0Hv$QPHVfZ8s};x5L5)_cgCH57$TFM(H1@y!G5FX zGi-ORIcf_*Nw~f~l%Qbm=SB?D3>A<{`eX@9R2Nu3j);pwo+z-X12&R?fLuo?2gq>? zh3`Nx{L0W#2rccngUVlkF~AM(1Ea1wC4{LykPR12MibO>azYOE_{Hn~Z@}fN)O)U>LpgK2cAQk_z3NhbuIl`3 z1d3f0SGjYgX5(bugKE-_SIV7*ud7Rap*UASnjx$`40UzIS#Ep5a@=1kb!_>OJft2i zSM`Q?(XOBovIfZ1i0*Pc-yHGyX9{x9x6(jP!{Vno0FIvq7nK|#gxMya^lH6R8 z538A3a*S+&RO!!kS==AQNf)T{oP>c0C`@dGSANLpq~ye#X>bbS`SuS#A`|BKI^WiKFM%_uWhihi z?(szdPBCJx_L5VA_vF~MjDU$*mDTfOA*XP7CU8paeEo`x3R^C9WqC>Wf)I~KaXRKb zX7Qa2z8+C?5`2|0WtxL8Hf)VRQ;U(?`frZ=#oFg08HX#;-Vl;ggXK--ZP`Vts ziBP=9u3By}uRhXR5r;xC5Ir7hLlJt;&fxtKyUex^-tZ+0D$jFebI!sj1_2gpzBITodY(gYoS&ic)pC#mOSkrOR>X}W5R+7?9!MPHBz?TY zKRZQ0e_x$Y{n;I=XEQfN#reNbcTh(`?i)IA)Gs8x*D4j6N#y5Y4v{P)`ojT(1RseJ zN^5}=4yB$^+1YZXi5JHy8fbEx&3q$p+W_>hjGYB;KFf)3{T zU1-=qQgGv#_1p{;-vu$=c`?-qE)5FPD1IA@TR{u+0mm8=B%u?kADu4p;XPkk;U~)T zrB%M+ea5#TIy|gr6&)%5SbxH{S^=m=3AS#r=m5bNP zTSXy_v;NYNR|XkXxmCtdWFxC&AmscHXLKscE7dG?%hs)BD*!CwW@WcAJG-YxCp)`R z?IZ}Bjgp0jLn~f^aU;wNhL}7Qa#F>yI_pHh98Q;%c4p3|3wTPRJ_@>mB28}SC-jfw zs%KPjXA(mu+oB#s$wEpR;SxY*swZw$#_aR}Z^xCP20J~e2sLX-4|f|o`^S5&os;wN zJ2F+z`5@U_Y4p(QhRHYRXgrtOeu`mddeE^^m;01!OGTGTF_g0L*VWQ+oWPEiqbZ?* zV7)F@v~H}1CAz|tHFELrb7H(vDNM2Z1xsTr3q&Ln{48J-)j&Mt21y{90%F%O=$TOD z@T)CLHcOyhb^_%3qmAMXx;kQ!!{xffEttaQVWataqx!KbwFUv~oZ&_l{#N-t;n?Qj z^>9M%yH(n#<#x%-QB$!TNY+oX{#XfdNw}wM{5#0)$O{sf_riLrzArhYe^wR){}xw{ z;)0C6{6cO5dasuQf|wYNv|&N62I2t9Ky-Y z$vWOgV*Aot)QbhF;5W0%2vhlkho~3l#$hZH+DE~4DE|ZL9P@kyR}ZBQt~mi}v)yQ- zA%VQe$8ZqM(pAHUM<1(?aI<31Ikta+BdJ(?Zmc{O7UjxNQM`)#-i7Gi8|nFd;jzf= z;OnJC_`$`-A21KQ+pkX+KJdeKZ~a>N?eUd41{8{PJ@3580FmIagX4kF%qh z-EQt1qVA5BGEOLGlq%3b(S=eUYDTFqFJx6Er6JpcxvFAO9L#k;^u>_mQSOg2KPFT~ zt#geTXY0`Ljd3P2(?kLVz*$*adGbODwYbXNDjNHWdl`Pu3gp9$P)*;>RdP>OR#rrp zq?)-JFaDDa>UAlx#V~D)zby`{j+$1ORNj%_#(Bt05*t@r;4$PyLqKZ2O27)>op*7e z{!rzx$*kZOptZRq5R9`o$F0MYy@e0LJS=NsF6#y`UuyN2VbjByD&YhT zM-;lCtu!Ztpm?asRaZW@_8L8a)U5@q{hMRpDf#&=*Oh-QeNfA$ ze;Hip@1hQWheAg#bKtn+rNL$88?Xkq9%+&{z5Ah8X2GS-N9o&?c@sYc>UD0xapkcB zn_gfVIOpO?1+|h*#W^=|ma&dF$#UNvrR?U{1J$L|P-=>oPJQ^PVWGPAt-`kF3S4d~ z8%B6GBU&gNE?>%xgbr9>BkDg(jQr%&U$;@??0qpns^mkzlrP7T@0^>%{dy~lA%NtS zH_DKZ7GPN1TnRI$OwM*fPH#CG=Uxb5l${}C?Bm$Kdvpr_KhI4T_65jM!W@v_CM03# z4AM@Y>z4-dQbQQ6gTu<3@?l2B9hoU~FY!Xt+iUP#;@jPTT7N zvZ9SD_mDhur5$|1=n3gy$<4oD;v~zowp%A9N4~r|;8@XZOuemDK8)4R&6>+@lG1N& z(UFd3z@Z(V)I|W}Pc>7G4=1N6t~Ebd8}5#gD&fQ`mRL5=Nkir4tnPnFNFAaUR}oVj>R}|+0hn= z?}i~a5)4|r@WO|G0=N&2`tP59;DMUwjh1i|{X+E$a!1M7d6|v0&`zKWf%31B&I9~# znEQkOEZ9oD!I04V^9#z&gp(M4tmf~a;*z{MW5Ttq8kek!`>B#KQ8IG5L@-z1 zU*d|Fk`}`Q;3#udi>+5b)d-aaFD?w^QJc=g6@^^XgfS}zEFbN2M+K*k0+$Lrkn#tT z87nX{Z5rzwtF+@Dcfd1%f61@OM0im=CV1GvIq8DK9qSZ_2mfD@-Btn^APtvMI-?$X zfK*BbZ`<$p(C?-7E?+9ti_5Y=+T`8vm|8pgT^LmcYNMJ}zeb%`ruWWE;DvnF;e5Ta z0`mM92L+EM(#0SVB8EtTDPH3HW5?sh6R8*Xfrus7E+7@`-MX+56ee@m@`-zcN>6(b z*%#34Uu@l-{l?z$35xq6dd#?qJ8o3SeHxPMur4VJoci^WaztJS1D%1jM4VhwAwxt{ zk5zyX+=Ai=S@;lyb#bOC$A|&~OPbBy6IQja1wU(aUchmbfj1YjYGR)FrHWga97X2& zPReJg=o*gSRcL~WBiu%mPq^~gUK^kEp+F+!6oJDq&cnX-LI+^xJGpUm0=MVB{p&H0i>i~ z-<+K9?vy$*H!mON@ab5pUgXGdC!6XQIyR@$!|?iV*{q#X_onEUs_;MRB;;7x#xsVcu8wWRwYe~*O@PqxwX$oU}s7wY0}q7ZlEo46Gk zt0*1*c};m_Qsu;%E6U+;rf5Q>u~3!!Kx^H|R2G}Sv^hMu5H#Th7gEz+oUr2I*eWQ} z=`!bMn0bggXO9lhx$jiD^`QkQ&@>)c50(`KjIJXxDtK+r#~_6chL{`Ib!Mx)y7c4H z7c~Ay+f9@rkOS+5VOLt04$xf$A@?E_Tez18I>P>>f?sljyQN-`E`?EV87&7vqFL@I z1Ake~{W8c=YxR}q%Y(Sbqo*z5=byh1%IXsdCEuIeNVGNNdvkt4P86QymE1}X(7yk*3?A}s~dOtNI!E#DZ4fl<_XTsU=zaIiqg7CwmAcmO<*CzYY@kbTi> z;!9rd!GpYF{`uun;@kZlI5J-C9yWK!WHf9+^9xx(6WN;jN{M%> zcSbRff|6(fFp?KSUAd>O9OE{psT zC(FXyaEWp(#R1|h52Nr3*k$hBWay2!5;s|7sP9taR|kn>Uc8&jrx_^Z=}B|{H(}Hi zGa3KlBIR*j6-OpAPDvg49M=rbNggw|{Hbt(?&RR5GFnCHScMIds&FalqaR`%rvsrj zhZa#CmF4(B@x9{>xeVP5vuG2&UgQF?mtpBRI2CR+b9qBnQnl>GJiL`uk!AKh&YUzo zgb{b=lv91D;|>$)wgK(%&YB5ao)qM<2l5{w_K!s1q=K{b#2$ipmThG_$qbozX{gioK)9&)h_<3OO# z9}l3F;BumcdX$A!L#-nw0E1S9ZXX1E{v%Sqq6=l+#FtSDdLa2YKmUEr`RS)B?AL1L zBpk+nt6h6S)ncQNtCXEw+lrRXfE%!TpzGZKu@VN#ygoDeS`;BCg&jRk zNBttZVNu%9ASuMt!7DV3lU$K8*xD`#$R2hNnCC%=&W(dS*@rOAc2%ef?oSY6{EUGz z*spM0Lc3KialnQLt5O5=23fyG*%5$%mhW+6`yza)+Cu=`v z;mH%1dmHuY3ZFJ5?<6Uc2s6%El|^|0s%|`a1mQ|}ARZn9b2Ngh_J?^Y4-3V`U=^H5QM z1H2bwb;U!bx){gl25v_+722R*GHoI}=D6pP$;n&yK84s>*FqSjm%RfV3 zWHe7jin-CJD}#0#$0@z-#07x}oP}!q3h$pkvl6lNJ$5HXKmqXq6YHzoCoj?dL%NI@Q5*Y&+N zH)B{tiGzbNi)cb!6bg-Q-b@v0RFzr^=o!C=ys?&9+&5F)E%0lv{0apF;^7R9=U8sNJ~=sX7Whdj zLx|L5j{$%mhC`VNt2{aCnj428`W`PzJ0m1(s`q%8ji*+j^TIv4WUxl`3YD99hdUVZ z0Aj0EoXW2Ig?l85?zCjvOO+M|If{B4^Q-(PZ&8H(-&n1nb^zas(uVqItIh4Egoje8 zET=T{5(8ySJtw>uj6wZRtKt;n+&O&ng zR}d`ZBv&PWf(jJQh;TiDH0*$_E)6!kt``pC%;)$*WV^b>R?c9kRtn%Fs3@}Y{342H z=2m?z`RiqSh<8Q0s%QNMoZ^C;;8$RM2bUnhIYNX(4D5zpvR-+x$xm2isf?i1M|F4b zvx0y*E|yMTpB%qm&kAu7q~Ke=G52t;l6jDCz(j2|cf=fX(D!}zfx9L?icj%2!tLZQR9x6C3Os8n{`ZcR8w zGYgOmoTvKy8c-khBrN0n>IO!ZtP5vB8Ctjn!uPlNwYhKk>d&v{q4vk1+`=hmk%%w2 zrc_FiC=FgP5g&{11o$ih!lN5$6i6q36q)zsmqig=uhdIiBvfw0isZqdxS|as0dw~t z{`xb48A@ur?ccmAL|ISS(S=lyvVJXRtz5`LXJV zY?&fvbI9#3(KJC#x%5TG;M1-@bfZGLKF)3kRll-=H(Q4Phes^?7alc^_YQZ}h5qCS zoZ}varMkGOgr6aQY<(I$X|;#Itf%cb0YU;N>xX}4akW~XxDA3jQ^suJCUt|~uO(`+ zu_W3wi@P0e&cTD+`6C&WPUvcR7&z`jccF4b2ms@;D)UZ!5_z?xo>8AFZc&HndCX&I zF37)=XgTt4qLj#o6AxJj#6tAB;g+muErW+^X2m0;NzlD+%5LLD4(s$=*V6Zs*OTUh zy6s_Jq*feFZs;NY0N%f)eiII@9+GhA4MCh|B^So&f^BObo)CkR6-Z?r;qm+`#Ji(%tYEP`JW8meB91!AHLiX!z#gxk z1=)iIyWqA4VIdwJ#v}bAjHsQZP-YS2A!x!yVF%Am0eC@ycjxVNnd&%rc1fQpiV=i z3zy;E;Is)b>l!L|cxWL`fF+cM%<^1MfNa5Je93aAWH(OPMI^Vr0of7ORNbE<6TB!O zm0WT-3^{919=X_3z7;ti4!qvp79uc~Dss502u5s{3Td(RPEPsOm!fM(TF++msC9C@ zU9i?wG|3sy!jah>{@Y)nsQoLg&$F94cztl!~Nsk;}c9yG3WgJ zcMukjcAHH!`-k$aSKPb+MPk!8^v^d|$i^dl*@+fE&i}*N;7MCVVY+=jU3tOUOXu5| z%6yO=E}4Owh*w-Rxj)e2WoaA!TKn)vYHTh)sKJ7^Rk~lNsU9<%0_ma?i=sfr`pSx z6|Q{{>JXJxY(jeeYq#}0onYRUa3HV3`BKdSa|`PdVVWQg#Eu`f+wz`H z#k1z6c)pCxvj`^l2yHzuD@6TJ_}uYi9yp*<>b}f?lyPT*f$s&EFNOPnxc8GWaIRes z4kHX_8RthlAg{yYQ^9d8>tZ(++#cUOc#RObB4X@#an2!#Dpg_P$hZJpDMZ??abr#% z5*m#ffEL9*AdKXAB)67`oOVTi%^9;m04k34*157N1EV74avqKw=JL9D!2jm_;R9oR znB>XQvPqjOR|0~Xhg}pgNecS&505_az}~+pHPnNLxE@`vi;Icqw^VshXwjlU*@g;? zI@T8I=znuG7-bL`-sC|Zk*-j&JT$#4auhg>{R=0MNh7(@uG?MASS6XvgXh}|96wgZ ztlT`4$AU%(-o>H_>MXB{7aeIwBLaYO1Gu;^tP2r)p(!-_Vpul=?J(bCah@i#K)O_` z{Gw2zIo1_D;MPga6cfHFCz?(vYctSe;AhcHX$}eC9IRA%XNv_xU@YRMju_tvcV6LO zbHy%0m})*y0O5W10%3+&=<=r;xw>l{lgbP9^=lq#hHrKEPiL(pLKI^#DxeRYU(%c$ z$cUP-CETI2T2VqqzT1RsltrhW&>#FN3qDT5E_8cGQq6n_#slX+<=_@BsoM^-% z*+9{7OypB7WD3tL+OVHIRuha#9$37g*3j#2AQ2ORI3*bh!s^&U8iR1cj4h~jaca)r zh2)yUo&VdUyj?=nFQ4+9(K7X)cUw$)w%G+PX7&|TS>${F2R(8_6VdS1e<>oJ=vJ!5Qf;4c@`(?J5jwU z92s~9RS@3W=xHt3KOU>>Wq!;n{|%81*^w>aLC;N{W%Q0Bphagc2Z=E!Ojo(-i)|x>`d|y@8oW%E1 zE~$~2)s;`;l0dPeSu7BqQ%ssQX{HY-rh+GJUBmog3eb^+DQK zNQEgDZONi7QL;5&5*30f$l!-6j}kS%u+=!5UwB)qRp7^p%&-DKS9zY23Lsa>glB#M ztJO5)oa!eYtuX5}4?9O44;DS<$9E~1^5o)ZDN|Gl&RbM+${IpkMv+saI{&uH**h1# zk}u#HCa5ZSlGxcl+y9Mg0hWXv&f5*~T|8xIi*HS6T+6ar^1Ab;GUK4kg-Vv82rP>f zpar4Lz7@-75GT|dFJr8)dX&K_$Kx$kvI&_xUg+Om2dGCjpiW7=^9)=S0UtYX#5h0+fL6u2EeYdDV?{gloV*kO^rn%lhO)jbspD0_!}lO9ssLkZ-e8?2wh&Ug>5 zFi{Ev{yjfC7LXxnkECxbMn#xp?9Ss@=$CfJfEXY&h`yrlkDMURD9h~gVtR*eSGto` z`ExaQ>csA#qi<>+JFK`$Os=X9_>PpqCwHyI7yNcI^fODMG9n1iwlXRtSyokb9bb7^ zTtV(~$|s|0c5ahbZOD>{{UniB1}_r#GI%s_zYgA=R*skaD9BT0VRBYJFc=gt5u>(S zT`F8Rjn(FAh(g$MJks$nZ=Ii<94>s2OXz&yQwBfQx!6})VRehiZ)b8V{~F%d)#JGW z4K-FH?@9hm^ve1%^0sldkBs;&_7m{+R3@0u%s{wOMli(uu2z8pB-vEIHxZ|mYy6TI z=-CO-3Ojef6a2!MT}iRSnIYg^hJm9<+rHOvVl*1%9@bh5jkTeVW^6KR5sBu2Q3~S`Ia81LEdMX z(gNhCP9G2XZ0<1bpV;Kkd9iizUkSobg|l8?;C4T9EqVS`CVkBvXig-ZlkxBHw8E_4MLwJN4g)yN{{=sB zRlZfF+bs`#%)LzUyyUTeMKUD}=pA8`WNrV$qU_ zo`q5335|H{BnJ@B=?uM)=k%(M<%hm{o|ypQ+HVwlkGY>vrktCX=rdP!vh^yL`~v0B zhd>6r%QJ;??Skr-(CmE>VPZuziPaxpyiof@Z7(m*tgAU0xbVKX-Fgg+AN+Lvu2K;? zDuulu0IbcU@~*7{9|oekh;gqXX1&?pQ6?JB-u@0|D1_|{xVo6Z;_MFYQU`+upm)2t zguwJk0S5cUl=A>*8R{cLIi`Jh@%YK(3|6Lvc>MImi&`Nk+kky(rCxVqZRN-3t4~*< z=-NM_$91JoS7myrwav>H2kgwN!OUY%a@krX>_f@Bz-iSMf8>RFs!)$AMBZ-W6mt*L z6i19V+ga2cU@thnN_15hF{Nn!DYojnPGJelmo1v&T3kVhPo;cX;{|zAoa|#x4+51F zw2%ss9NwN9UhhuB>x~VsclY5<8XYk>NoRQ2H$h)=$|FNTA$B8e^Z%`)f;Ytk$ujt!tL+(3ahhdu24@bVp$(8C@3iku%_it`F% zGsC{r#+ya9rG5w#i951>J+X1UEZqfOHX7>y@<&<^I189J>(qx4te^8$a8q^o|JS^| zL%lQpsl|3nc_73q%klqY5#>#54oUh2d6O98(4wwTwoB2Z}mqCn6vx}P9saERlr z4Ukkp)_BTKjHFbE%px0>fOuRk)hbdtfr$A9u}-tT&E+&fLV*v<0s@mcu``iH=mdGU zWUx3DIZblP2*H#t65opm0orTMAz+fFBe!VrgN7}c)lZSGNinKe5Qo71%;wcXIC)lC z&W}&*SaydVJH=Y1!?i?N^Ev*>(9BrYBk6Wr8dO%2+a1WkYo$!|f;J)_ADPt8@hi8t zGALtt?WLP?`Q=7-8VMKbG1p%m2tVS>j=o|p%I{Jk7*&9%mo)@JHWE(53&2e*`(7KH zUm84-;m(WS66L#O{u-w}77^bh8798|e=1D7`2Ju2`S<_KzdbkHKdrAWJzH8`TQ2A_ z@3RdIRQ+sah5udA{yuy5`1$kyT79y*_W1GhC#$RQe)aL=)o1_ZtlVcOsDFY-asDd` z!(>vq+rIxF{r9k_z%JNVfzZYBz~-xf9zt7|mBvezht6hZas?z~m?oP>!*)B}u2St5 zJM@20!+T!1cjB6(f+e6-TJ*!A^c+wr%iCNLagqAi5p)B5w}1ZndeYp5!EK^LE8YsgGQZ`~PB)xQ zVQ9N4qO!y-5Wj@=$A3?AIV8E;8X=?z{~ zh^_N~iKr;@Tm2iZz4E2|M-5or?CDWW8huX!zK%X*ZiG=9d1P692CmNQ7V|xde{(XB zj!Mg}_obRg`9&|7wUp3$zD_ZEG=LFDI|CV48PmulIC zGQEHkwbGpH5DL``%OEE-gI}Dx*E^0v(nsa^G zeAY2><&7KUud&`L+54qxAX^97O11(UkG|IHF#TDL;>6bcWG#UcIi>4HBQyos;2N8}nT_D3+~5?+s?~BJm##bP zg~G^U49=wmoZ)2;PI!jm>;{yUziZ2zGP}-?{l@UMn@9r13Qz#=J zi{-Gxoh}sE-ob-#12*bkzc*j2Q|E`JZ}SU0!B%q@j?%{Y$ytqS6FS{WZrRb=X`DA? zXUoe35Y=gskWt+6*)ul$M|gtc&Uf$)jE27j?xLG!QT zYkc0U#Hn0YyanZXky=Mj_-Klr&N5FDNV0qlm$$uWng z+AatJ4$&(COz&4scB=qdkP7Jxg73EvcN@ndU%PbGDFi_lPh1nI9?*#yXjwiZ7*;$8 z%QfZ8%HUG&4(M;J@0M;wd8L#(!A0dI=)PO~+*YMr(= z@!h5vD?V!fE#W+8Omw=g_1bCyutL~Loc*2BOg-1+CR<5p$BJnIL z6_l?_&D10clQvwck#^x{$v<3xT zVga7)E%_CPRF;+iH{P7WL4-%is}qbwle0L%*C70Q3=E%;#}p?6e9l5~jwW0t6@(dq zXP7dx#k!wcv74kr=!&3SoR8c1L>Kq)u_))%fcY{9mv7$ICJlBv4`)!@SoyrG$=N zWI*SKIWzzDpY!vDhL^v7Er=7m78EZEV!TJak!NryZ)VhoP{O8gmfTlXCh}(dD zfjUoC_{$({L!TuyH4R)wv6_nI51*DkK>t5}eDw9x@<;gh_hpzF4YUM`;>l15C%6;2 zNRrRUOU{huBY>&VW~K<42klbCMIT7*kM{ z_yhj83^Kvu#|3;_TmJCRThQ2$fIn}M*z5QbluDHA6hqPv}xT z=X}fF&CjplyTZd9(%kt~g$U?I{=*M}ET~3ZSkqcA`u^pJdp#(-SOEFbQPrK5m*sYO zU%p8Izz1NzVBQu))BsVoCZWPR1r>gNa=wYkzQrX`6Iq>~|J(7)$^VI$KL*PVU`=5G zjP(Xj#?HIaLbasa4u9q13{SZ`&r2wg{_9sLz(4*CLvF)oeif>;Lw`emCBw@| zy?mL?6Ne-Z$^~HQvD+9CAxqnY3n)BP=W25$?TX}wy0v0c!ZlP@$t3P?#my@@71)Y9 zyUlY{U;&eU*%Ryy-{?_nPID z=9^S+c^HcWD9#E}93X6kQmd+zpglX1aLui&VMkWjAm(7_UNZe-_Re=rgCLm)=GczcFa>1__ zR8ANbvl)fRNct*qcS&we%I9<(V{kHX4Cp&Jj!>wz#_wW48-MT+6k|tRc50|tZ9r%| z>GAGJZov~7y!h^OZE$tikDh#e$Z z_%~ZXwZvAGzl97y37EOKg%?2v!IQIE5AqL6D8mnpH|MWUpf%{odyJF2&7&$Ff{>{6 z3%J2$L^CNP_EPkd6Qx z9UgahspQnxR#qG?s(?6!p>NV3uARTWIn|fd>@dp`6P7`#&-{!O5g?utWwVox8$Ze6^Bsv9|q{3Q<&4$)B4Q;pBsF@CQEY&hX;1 z{vJw;s#x#M`3b5K`Lp~j-e$V`&HPDx;Ry=mdvPBRtQdds?qIXBy^TM&xAE7`?&;CV z&aQYNAK<;XNX3`@7rZ$=<&USQ{CECc{)V^j_qcxZ9e=GJHY+eVUK0P}(x@nLGkd3Qe>RKH`Pcl$XLIaTUM9Qm*(|@=G&>fT3Kls5rWig#$VS$HoW;ajLyPW*y5SDt#q ze{EJ!`e_M{0$&#%#RasJT|D#a=xpfull&qFu71n6VO}^?CG$ZS9^qRu@MY)Z&&^87 z*kLn&!Y`cJ5wH2r&4P)5c&(l`E15CGrufC*OJvn#_8{N$+`+|f>cwUS zogl;q@oQ5gL~ITDEAex)62ibrgDSn)tPHys@`LyVZ?eTv>tZ%r5G71sphm2K#vEpp z2E~yS9ycp-z71lv4}?OfSf%_1N@P?*QHOXGqn1Iv&7L+Z(lRE)rQ-8uC8I(Gv>bm| zC?(;SX;+zU6=@dc0?rw~`a4u@)-k?WW=+vJ%D(P9gC`j$suH6h`y58D*9$7Sw&!Ez z0pJi<<~)GkY&eV`;13kh_z%E|N~NgEc8Zoc*@xwdQLPPyv&;BgvjT4q_qTVCo4d~O z?z`sFpzE9g`+T%p_;u3!&1nNchyf*r#moJ&;we)%UE#GqZpvthU0=#py-w&9^-f4- zq~;2KR$va-%h%JD%2M;qt5^HK?Kane+}7dC1xRiE^{k=FgU$7dQQfufnABiwkliYj zttk*qs^SLofwU}xcigg4CIJxhWdpirSE`~ndN zxWePX_^rq7^{^I3_~mw}D+M40!_)`4A=?8b=RPQQu3(QsH>9Re^t9N=vFg0R$uKJF z$2y^^6hPHRR8}(5Fa?%MuE{_01$a~{k}rcC=llX^h-%JK8CE{;R0%bO8pv$wvTlmW zGlOyFH#5t z?pJZwQz1aFle=-^Ccy60Dkama4AQvy)+A7(dM*E{s5SyO0b8%+^lp7JmQu?3%7dvF zxT1)reUk+;dzS_)#Y;|U(zjlDP#1TvkCyzfQZatSgwF6Pc3Sw~O0GQ8p~x4ROR~)ywXNyuRvg&#C6e^v99PRn`yz)i{#M4WS^zZe z$cUFByaxi!8bjx?Hez}1+W_zPv0@mGfhB^P6)SKb8}I%qXi_y#P0*c3Sbm8#w9$zokly zf6Ta9p6Xi|vKt7ZAV;vIh(^lqL;C#iN{Z?f?!e>+r+g#G`Lb+wxTA=CDcA!!QFE%1 zIvXh1`OH&=RmqGVFBBLS*&%UW3wD|ZNzPobuuKuI2{oe__OGSbWSu zSQ<3dWNDy=W2$IW2F=e^D*HR@j=@4hF=v#82jKSL5~CGe?C-!>ge6A>?IzZpvNdf5 zjVi>;3NHX%TUVw-WvhK-Kahlc;RC>!WchtKP8BQ&x8OighMREIm5OnK6>VV}WohNZ zGX_K<3R>|%cfM>ajcr-2I#sc_m$kj~(wV$ljGJId4rBdg36XOXKvj5|+q8WBnhT&f zp#Td=0-Ds6hcG{nle}E2JhlxoRJ|2JpiJENE|N00hR7#Y4RZ`MYxDDu6#mSa236qk zWGNhtG##3s&n9_{WX#V$bm~1WdKYO$hA{Gn+N!vZ$}b9C%;!$bo9c;yl6)upG02Lu z^eP>(wZ^RdE5c++z88h2++H@TSXj92;=-x*P=rl>uBjiz!Ixib8wQ_Ik;)z)l-ls) z8jX^y#Pg7G2wA92UH75B_i%nN2GIP%UZDeX0_*20!q9778hr8GCb1m--+1Vl!u#T& zxuF=)pte*0Q;wFu%7dw6WYk%^Z-y`cCs42w^NrlCi;lv{814|C%^+~;PFA-4z4s!L?ZOan72F>bZ? zz+|I`dqTv4D!v7Nd1{Z0fRamXS#G~1h>Rql}MYo)S(xPBkrOM8U4nBC`NZ*8I z^Z@C;gg$)D7YJI57ngH0zhWgGColcOv=#FS${RH9Nikztx-`HUHHT6cvXm)9GNdSI zLJIbv(A09Nu95|PsO;10* z%-YTdR~}x$jG0fF^5KASqdjC{cFLXW3}K#!XF7mFho!GZSuU9I*s^|Q>t@j-ji;?& z7&|A6eErIs84`^cikDg|koSV3sVx59CzoDO7KpF}1rD&VL&_siP>UtY>dIRRk1cr@ z4KY>8m(uLh1mtD8+qs!?E&CF<*XmRNkit;&wuTBu;WgVf3U%~$lqVA^)h(p+A}m<6 zG4ONF*thKc$B%R4P2xZOeB2NzrFcLL-wk?6zs2uditl0nxLiV9cl5a+)D5|?K#VLa z;M_XMLQ!(Oa10m+r#_elSo&5Nq~2bQ#?jKYtQXX~8f0#;{{ZS+_yjzE`jmH1BVmiZ z@P|keGK?k4`|vj%z>_CWoH|dm>#UXtA^Rb+s69qK?J8lDypk!#h6Ev?hu3C1 zi4V(6o->T&>O{eQXKPZ&Drl3Q-)SimQ#jBiFxzl66IAhHk(P|{U}VyRGS$q+wJD^Mv_8o z0TMb{Jm8xr`g81k(If2EhBAlMby}vCyj$jPOF-PHZmw4+wG92q#-FWf;BCb!D0Kw1tC5WtE-=EZhFIjaYiF)NPlPdqN>ZU=FM2u4i0)pHncbHaL(?Nwc->4EI zRLgr*-XeU*@M1g=$bvpn`4`{tmR_>OYlG@#p4FAs$|6E69qEIO=E`unaDR%*M*Uebizs`@)Z>PST z42Iv9*#PFfJ`ewv=dudC;p?urQ8Ma~O*5j(EiElCEtP{r37#Asr7-dn&zhIVrz-R2 zVuwyHQ?Cm_euFm!kHR#TJHVBvajww&2_nIS@7*i!)-s&X+*(TZ%eI^y(9DwJ_JMes zx1GcY^PJ_fNV!(lP-%Njn)-#m3J_5U70U)+(gBMvot5X$@j7@!si{EktH{~IqaEpIIM`0pYA?-x#%=jVr2`QuB~;7E(MGKIj!W~=}ng|GC-%s!;L zdvja-6c^po58UE^AgV^u?0dxMRvm(b|h~*K5Mu z3~^s1mFE+zMstmN!B$D#5tQ`Z^O%jsu^JUba<=@L846{P$`;r$b$3@JI zSJ#a}0y7|msYQF%i7b%l2u9g2wu$$#B`QjUJj|Npw}|T{LmRX*LhsT-l=ug<+IY-8 z8+G(XFY8)%(CdMHCsiuH$3{2magL%A*qDjc|H{tJjkS)V-A0x!m_^tpfIUD6`_pc5GxDW?+0{CL7N<}j# z%?BVuvT}WjGP1=mRzZTM&0Wry4{WAq}DY5}D zpQme&MPg1)Oqb@w46l#Jf>Se(yS3C^r{oz?3M{AWBqYRqsdA{f_KS`NT+2#ju2(sz zygxEZTe)-j8`VLifnL$-q=KHn>*Zju{2eF7+!c3yEI6!qE54)0?fO`>Sn*bUFHx$T zT$)V!3&pWd#?Z2*GUYZTbu7FQy*G!PEte|SQ=>8kq%D^!*8@~7JPo@SIgnCV*;1J@ zh+$l)6C10(v34{MN(F%E=gF4y(4)&-k(C@ zDG;V&T@%_CDV0+uPsOUk*eMaBG6rkPx-lYElmJT7fPo@lb&5(9H@9)~V_kj!F zm|!4c031scK9|&6#a(~FJM)kC&c3uAzq% zCY|NCa7oCM&AMOstsu5vNHzS>IZ@6@AaTZ{IB^FuyZQn$L(NhA)&Uj=hKeqJ$mz5( zX;#N|yBN)M>G)*#Hw>$@{-0EarTl+cIE4Fc1GD@+C-eWUtUP=A zb}n7id?GD4X*$1&`h(O@yrDnhnqZk6t%?zQvpk2G=79)4 z#QU$w6$+(rN}#%oh_?Ux?#BFrBiuCQTw>7DUg7swhbMKfuR68L!}+`-OzcdERcZgr zfVlVF#^n9K`t0%Ac>d3|XRD9@v;Y4U{~rF$Q3T+j^A1S=(2e-Uk+=YSiNM#cIFVD> zWf2cL?o`o;F03w9DscyR9hJ#w19N@WS02|_o-eIDe(5}P-kfh6(}MnJl@=7cg;_2G zwCFew2hMpE4&0IRQ^Nmlc1ExR<0a_t&rsNqfO9N?sPY4k-0c1bGk~hJpgim6NLZcl z!E&;cxX~b%vD7)2vd5jMedjc7`@mlvdL1`Fb_80+H*ud^ph%)djqs)8dfWg>PMx#1 zh`BfyfOmmjMv_R?cu;rD@R{UA%|p#c^u4)8vs|JRGl^pG^;>d@nlgzxPSfRQ3)G)5 znOw022MbVlV0!&njQKsRUkp9-yCTgy96YYa4Z1{n*IO3}r;}%L<;Ox&m_m$&e}QPe z=)};$pZZAxGVt>9_4V}D}y$`SjpoW-{xkD*15_;{o$PhW-L>g2^p zX(gK~f%LplteeUu!NM45Sj;rbg52lXZ-sM9oQp8sqKVz2GepiDfgpF!k+8?rjz7VV zx;kAq<&6J~C>6Vy)qtT4j3uGYPpVv9zRt=+KLUTFTB%}x-nmZTqKp5KVg7@JwYl9{ z;9m1U1&i1*G#&(50$2k+9G(aPP~q1!GdK5OK0xPjoFR-5bhUw@ye7(BIIfNa9A<&VYsk(OU*?tsGCNZiU3B(@9N}@W9+>1f^K*n zI|w0OLc|v#9&pw9l682avB;~;4Xa^EQSTv^b0Oi`*9HT?f0du2<{UPDf4}I6#A}MG zA=Tl=cfc~iM0H>~#zwqQtNg_ir~2;3{A!jKN;*mL@Yl=08ZCeL8~2BV4UB2=aK~Vg zMX{tI&d;0UZT@a7Ym|oTL5Yy?2jl%6msGE5PbqihVV$tgU6iZ*1+a~~Hl-4VQf zG{5|Db-DV7f+ogL1~=+qdMvcEpHn_%UyH!!vf4PhQeAu@Dqr7LS>Dm+Gs55T=Wp50 z>iDfLi~EPT*$ zGW-$N73H8hpJ$wfbST(9zf!I)M-A1)&b&bGWg`fA3g|1hg@kP${sYhWv-+|sQ*SAE zFEu6yr5PTVo{yT>QxH@ZgL#=>CCk{221#9XDF!G@UEjw@T*X;c{lSd2;+c1Jyo&tB zQ{h$$8>i&^oK>2#jcMRRSzd=(HjtG!x4`f3$LF$A^r_>Jc|Hgp8-?Bjv=ZuE zOGyB>2#b14OUQ;dx}QNcjf}x2eJTh7M*_Oie=p6sNW(IE8K%>SM3`Z?-@V>CPNxoe?GV z<_=|Zhu`vI80yRG)I>{spNO2W>iauip6;+uHh67#^Nklry5L>l$pO>>b_yrci&fq# z&l=A}+IXmmHbepkIKMit>Pjr3&!KsQ!b=IKLn8p*(ceV1^88EyT$m~`z|!om>T~~S z2{tM2y6tWLr}O2Dc>L`*u^BttpMLnkjC!l%>svn`QV0i-1^nSqz&}0Ze*q!*Ukr55 z|H|i+tzY=xu>CnB3REwQxKDP(W?IG=C3!xH64^OYBCCZ}DDyFerQ+V4rILze;dghu zH^t8tWlx8v4JXr;0%3NXYPBYMDtWz?b>}!#Ck;9T0pn7gUvcVn)C*U04FO*8MFZhC zH0P|Msh)r%toJH8Z&>fc>_h!WqNNT9d_Vp4arfj^lxYqAR76EKcpn{$x(?k zK48e1PnF6YHD+hrU>Tl6jH#C_g;gO*BGg5G_^5`Yj)J?b2@$gb`xFk-Ac=+C1Hv6j zBv=MSPfX1R2bTL~=yuQ_u2R|OdIlaAF}Da7QY3?(hA>nRR4-Xisvj^tUdTPHDneT) zwF=@?Tvx(7s!bDAFhnBR0Pg^o8miLB3pImhT*SXcz+bB1^k>U8|Bp((T339vuHBGl{#AyiLa0l(rB4VY8y5JN0)vuC z!4ERZ26Pxbx0D9qfkqBx^}Isu)PyoC_hk#)bAi~R~;t^4S83y^{7|B?8Az{0chUNW1tqc&G#9gX%1Olm` zJ)L6E8WD4r`?-Dn`qF`?53GLEsQ>@xwh~VYxhgi(L+920 zZ%4c9PK3%*pjsFs7Y5EJ85)84jGRl)_wiCVxkhXg?F#Qq}4 z3Ah1g%~^elYkiiA8I>rtRN>eM6nXc&U_dz9Lw;rbHVZ|J7yMxt@R}}=`O*4UXPXJKW_k6pzxdX?Uk|5ZqVhvTl|_4zwN?{|Je1| z{wv-8t3)l!_uIy8_CNT0{Qm#xv;T6Q-fuU||NhPI|IO>q|Jy?`g~>eKlUI0ihmEi3!wcMj>u%We|)}scHB5@y{j z>CaVUdd$Y@K89oPdg8`6sk8(l0h4%%*4ts!ZT0*G{?d8W^A_{c{6gLv2I*i?Bw#ue zcM^|!e(mKH;IE#IwZPMcz}v(IdR|z9h66BaC1DF{0_X+cPf!Dn_S%o|6I3?!jSogb z5O*tB*p1^70K9me+7v)m=UMdk|{}_wf38><2Q$g3pv!QXXXB0g*(m~cngk@C}9AF z^G4$XcJm?d5Z-Le>;BjOGt>V<(zAPL;}-hAhQ_{d@W2FC2obFLo_fq`FgDi0r?MqxMY@NiAyHX^%A7W)e|-!&{*D7bTY zsJ?c6zvhSpA$qNfQ`tT_I^93qJ=^H`4nA^!)s6bjyZz(GYfgPfY#~84BftX2@PKaWZ4paU zJv9aEg&8r{mtP7nZe3qdBfN5f64>%;tQS{j98~F32}p76*7KDd2T=G>s-9ul zxX94KdZGa9~JM}F9?M(tSKp#^E<4e3= zYBRolD`>sc^L-m|hqurDxfij(wSaYW+l;+;Bln607NCwTM!B6vtiwVJXeX1PU2tHB zDeOs`3Hx;tER4|ENf2HWc&L8sH1usI?#uwQP*Q9rD7dm}C}>20sOJJk1#EdMb%QW& zHN41;=U!%&zKPrb#zxkrZe*J!Yycx?mMuJxefl4so|e_VQUZX`g)=5 zG(DYun!>0XwrwZr*^DRY`M&~}Ui>Q>`Ej;0wYoAj{9n?~>BtiL^n1F=g4SW`Sx(RD z^!xdcwO~Vhw#3xc>9_Nd3+MTbE&S=X^YloxI{kK@av7%I&vzKb^qacL{KR%4rr*st zN57=jJ8k-%Jl!I!O}~|=KN;5k6{qyt%ungH>9_TpxSul57XI|xnk3ss0J+4%OWw+b zH79U(r>x^$c%9`_)(czs9}BMT{C3v*t>*@T4cGbR-Z;b*qm=l-j5kN!z_mQ2Zs!T_ z2KH7I%fRli=-RtC{x1W&6?t(xmu_wYeCr{R0d90%pLtzdz_%U_8Q|BzK}N}a@pu{7 zBiC<-@Xofww;lx<^U=aFn)fw%BjCZ`UJqbL_K$jRgDqZNl&tyG(C~ zv(>o0TTK?R&+e54P1@SBn6NDtwOKbi?IwYnq`48wmOi_*nEb6tS{pgattgFSKphKc z6IC}t-akoM4+fd`LYqaHq{2~)5MFpTBYk~4Ui2g8S)ka~L{*R&<`xJdgLZ18IotZ> zc5tU*l!W!;&CFRj2I60@y?y)3n;Jt$WulAxpd!v7n<`=RLRwjnWb8xSlOgTlTcc zkYh`ITe!At=@AQ9df&<-*!;Hqv$cZg6>M7OySC!CwPI-6iM5p;r-W;*K-p%4A;@xo zxVCJWwPs@r>DN7LGqzKY*(wXIwHMRQtu2mCGXb{vb>@Q1WxG-{LN05C!IYcKT1PN# ze{D(aG?Qzs37EFCwp)R-9j&*n-?xQqO>aZidh5lu8n89n{V?rJ%!uZ$*=~zzPTncoD~^;odH9d>L~f!iik;N7$g;*>b>Fga~(E41Fq_udKWt&H!Tpx(;%DwCvkI%u=F z?^(jVmFc}B+*_I6JI%taEbkqAdn?O(r{3Pm^WLqux7(K75w7Jfn;Nd=KAQyhUMQD^ zihqlt8Ked2nrNUYVMXlbhFy8SjXmG?BpttGTYpahZr=iyg_6I~_PU>K%qq7{r`h-w z_Zf>q;6!^C-2S$eiXWBoRyXF`6Seyiu~^UQI5M#=cRP+yoND#~m-@_>1l_tx?f~=F zqv#GWZ#{_a0Q1&E2w}cvQQP`9|JLINA#V2pW&iX7OOfRE)8`IDzxCvqdg!;FI@9;^ z_7mq0Fs(MxluLB`QFDimTJ54YQ9Ah37NXT2ns(?`n`l~~v)D(s>)r1H)C%pV*+{pm z@u!A33zWZIdp~tIXK-xXuC~9+(5+B@%8t$g<8N1~-=U*c2tQ> zPYcuv^Ctkk7cs@gEMzO}g^3NfZ8GH0ZjHk@LF@gF4M3CXP}jm;F&h)r?THr&$~0%2 z4c*pTH|pAmQ8w0n)@Cr-4P365IFUMGxgOv1J&T}?=F@f2^T zEaq&-#*og9d>i|+9Sei7ozEU-ZLyHDcP7c6vS-`ypPm*7VeDpo3(A*v~Xv%FRV?`riDABePM0lHZ9y4;jgvT*aW!u!Q1azuv+KL2Ug31 zo7uIvgV<(XWWjapPV_JkpmzOMgL$b<$0iCLl81>0%*MlD*JN68rz0!#$LU61*Ai`J z0rR#kc?X!cO4xUSdD~XJ3(VWL;ayjIJv!=q}j+E(ZhZ)wDC-P zHBqslI`@i2p@n+s)g*2}sj67yS?DufS@_#pg4&zpBdhENymsVT+HdSl@{*NZI}C$v zXu&`2O>~h}oGK=wvT<14o5XVp!|%4|d$9#x>`k2TV-KV1`U#6Hz?m#w?q*k_Y-jtaZ|ih#Em4Ktq|e&-t$(AS-p6UN zXJPxZ#e&Z^5%=~cy7fwSFAUgaWP^*RHXAr)UDprOq0LsA=-qoE-En-@wvhGqEa-6q z6Xw`Z(TN@^*(t{3+U>bv)U&zU*qg`%()wwH3A-$SPQnp&2bOl((2bMZq3z$FVLL9}X^7U4Kzr_s$~ zri8x$%*a+EwzDLh4y2Vq$aEmB>_MgjX=O(^9Y`w!lj%TO*_ZsnMr@de3b_TQogLv+ z-Lx|!oN@=*nGsI6gY3)*r-W&>g{Fjg|9i;Jig3zqT5X~!VOs5?DPdY|qbc#z&NOkl zj@lU~P6=}c`^e5ZaY~r?e-zo-CQiHVRvT$rpq6LHG=$#HIB~i~va?N`YLVKIZiB4*K(%mSHSsuV>60k{XD%r99*mqmuMeE4MC2#-M5OfEjf5~j@ zgZC$C`ZEhxJO8=;iApLFrm)xVvaSWFi53K0XYKYQtGTk$P@TD>%g^k}vj_^ZZxN#R zEF4(q9DcDtSU@u??e{M>maV_A0kbk}{bl0)4^Dq$FtC~ZUnVL-`8tM|BMYVF!Ng09 z3mFN=i^8_WHO9e2!x@gKUfjQQEwJI>*3g`%{U98)PTj!5ara=-#e>pRp0kMAgw;8i zgc4bxhCyg!A9P@&5o{){120J|D8<38XmL6UgWibQXe$qHr4>y#w7CK}n5f+4WHr5J zo`wGJz(%#Z%|=#x=)hzVes^VJ!ymBZ-a>d!4bh5~{dIIR^24ZmubRZhpGnxhx1im3 z>82Gc3*F3a4{if!#mAmRwt;Kxw20G=+KPvrV$^m@#3_4er$(Fx)9rMK({|Hp`%HuB zb}GbayJ@w3rkYLLy<+~yuy7*o7u-P9t+_2I3ToZF!v4s0&L4=qfTkHR1dudK#6QOHo&^D&5w z7O<>RfcSxzS}=xFzv`9Q{{Hwi@m_cXyC{~W;_kMy)d#8^p0!{x-f%9 zFSMW>N0a0#DRE$U&;YHGJ)3+0N0Y=WB@i84v(L+RTrw({WibQg3|5f;MBx{a*J?-C4V!A>oy+ zZ-*6YI`!b~uI8o(YsIBa1bZKB(9x~RrX$v|qK%WZ3W``XnK!hNx{qw~X#izRyuka@ z#>@W5g5x+2Q+C&U?QUGK`Zfo5aFhkD^rWV5U$lk~f3XVjXxU%XD(+V<{GOQTHoyw54K4LECU;``c- z24U>^_n#~U{#a`nY#n~5pIuuQdtl=FDeI^AW(8K*!?1;|^W#~E@1J@mY@LaxhHUL- zf5dJW-r3w2FLLJ&TW2Sl8nW%Sn;x=#lA@_5*>>kmxj(Ga$V@*G);n)%$o8o-rkY~w zjW->su=e7gdLpb-)l3h0W;@S1W6d@TI;m|eJ^RCM+U{DPcvIn;b+(#mkA3TOHPamX z_PJ`N+!-@F>Z}viOb^+9&)HA#?bd9!Pw>46i6(X7-7i58Qs%SPVLBM5whjaO$-aII8Q)5EpX%N?Yh{yhgh1|5g)Mm;iU3@49;z11T zK-b2n_IQ&1SAsiK(z}cAnl5>}|*C z9l_29Z(rSZqTUg#?RMDi1L5gB`W;eW=&2HG6&2HG6&2HHH{@rjN?A6JwH~vRy z+_Aa0JDtc}sdxx*xDPDOc4MN&abSm@6(}2S=!ivsrfzH#J^geNKa_{Kijvk*7`buV zf?+$o)p{S8BF`qq$my-7X$LG~oh-H4Bv2OY)jJl&?AijBja$eOUSRt+wk4;N+yJsA z@RAPmA{%fv$q7zV7ZZ7(c{avYrxP#5aT)g5jm>hJ?!xb+7E(rbUfj0L)O)K+=q@lV zgE~$H(=w>zR4^@rI!*=CGN|KJFfD^RP6g94sN*y+Z@*bpE^tSz>w4CKJS+pwPSw>J zp#7~XpS!@E0gB#wC3zQ^GeFT>ZzAsi^VVC)yTF_Qe%^ZXco&$~5qujr$kfb+7d@S1 z5tSY5%(pSZJGF6rYs6{L@oYGbUvKr1_?1}&VLY3}*h(9+GdB&adUa-@vf4^JeHK}T z3p<;{wPXo+{9eRtQXrj~ludWKDpTGDq2CL!am!=O>RMnwx=fSUHlmr;jlgku6<(${ zfol)f>P7(J#$MZttif7c2)y-K*8|8&XbaXh;B^>x!fQ*ImIu$YIAD49G+7}Fz-=&X zV_r`&{9Dzw7qvPSpsxBXy-0Mw*j`=SJO>_ol9ZBx+B|b zJIn1f4UXFKanml8-DPvc;vgI`YdU4;t}xXy*)m?!Y$#jCYsyKzmG_ch518)-UN8k< zOQB=h{@UhHm}YA2?wQ#Dc$wtV)+lQ>o8VSkue*%j%GzRj#=UA(fX>406x zvXg-|yjh(qc2Udj0@&(wxeH)Bzx64Oty_ba-C-Nt8oTUnJJv3I+0^K27s2cfi*;)h zvpY=f6WhE$)4;Smxu$|?84$3?y0)goPb?3tX&9_0Gho`D%wR`7nZaT8WCjAz(^>7M zTT^J=rL!~GOSk9Hx|0gv)+Aa}9;vnow5Gv(>jYZUOsC~unyQ~x($8IR)arbinoF}y zq&2l*@oY8e&po)w9_!ea~ia zNX z=T_&{RQkFXv*Q0=Se{kWpzDkKzgc=Q15xV5Z1jJ(8g$>Kt25YAFRVPSrr!N8W*||$ zm<KVuFL!m3z$XJ;^ri8s4O^6-@uF9hxKPAD2|Jhl z(6<41Ys~H@h*E4A+63)sPPF^Ylkc`(yS{6aey?c}ZQG~mu=g&ZQI<-wr$(CZQHhO+c;}xYHrQF zb5F;LL+ZeZvK%CWpOWrE3Ws4wNcB~Tg*wLr{w{CeSUhw*URy1v%QI%zYP zo!mGDw~5jd$ZbX z2b7huCBfTKYuvCGN~2XfbJ(ph`GFrw5GsnAhqr}JI`&L(9(&KyM=AV^hi@Iqa>NPB z;4>GrWqf^(EJ3sSHzeDuT7NLg;`8V7BHV`^(1mFN_WmZz6;<(_8BCfq+xmmJ5QAVe zlOC#>K|^^9NiCbn_H2`%5&xXC+M>N7(eC8%)JIfU2+R7Lx;YFC*UPvJMxE1q8c=@G z`tFo;52{FB)ly;6{;rFW!$8LOY4@)Wja*&ytT(P+t28FPrK$Owy0zWwubE}B2rla1 z!0E88QYgv#&Cz6;ne;AmIfbLwHcd5zuoZMURcN1QJ^NN!oiBDZb%~~<08_mzFMf5s zbp5-qV!DD_#psrqQ=HId#x_>h>{@?Wus4xjn@PK@(7e*V3H_Z+t~pj`R!LLXdK(sq z<p@BpKWP$V*?fMqFI*J_X%I=$o4bUn8nX!@FtiOR{it zskK6Al;Vrox>)|8tM5Eqr9V@?2CNjH`uh6)$QfKY>b+RX>vPoBNT1&js0lObgz%r1 zbpI=E@!HsyX&QT$ey_a|)-defy}2nDZ!++wK(blWolG}s3xbt;eCyz}mhyf3ay6bz zecsAqHja7!p2k4r-2z@+gUc+~XuienTQ|6Mq%`)pmI8Ak(dmKKr=Q|0~u0;{jl?U)qBSDRpj$I9rC^aj-Ufldx8~7FKmihwPuV zTK}pzQ%!HM@gh60W+~P>*L#T5I~}-;MqAL0TYh%_){)npHZ*qY%+mVg%p$PXkrq~b zW63(8B>6m@yf4EJ-F%qbALucMwT?Dfww1UpoVT|; zlCoSUc(p$(wI)w#_-4jwe&o#cPqgaNz2vGisp_+luWHi01jIbW+530QrdOe(mS%yv zTU!Vf|lwV;dGsr7OeqJ|NY09k!qUViB6kGJj`XXk@2LFKozZfHNa^;3oBE zBbBf#!$>o2WauKOY9TWq72xJe2x(76RU5OQ?Il4fjv?VjK6Q0+)guDw?z!*8yJht8 zPIA?Re|OlbBJrU|mPt7Q#oug_hWfeh289Q(Mn58YEp`GSjMdhrzt>CsP35hI^LxW# z;A`Rie7>P*sp;R2#e<1jrQ}Qh!xk}ZE9Gu~5Ay5Fe`7gb_3xi=K2<#G+8&>;ZwX7v zu08LEZwVv+f#nEpw0uh*1PVt#=*pv!B#du8fBl^HgvjVuWo2Ww!p}BUFW|6KN&CL* zv`?SUQ{;v?zy}3%GGS6F<8WkT(Y4;Xn;kZH>ir5j$gXYJFrslQ7o^ku&Qt1NcO#@v zO-W0rFzY*2XQ3l+-m~ic=_g*aG)~|+w6!W!7F~|<-I72+;M|jK zmxX>e&|Fv}vr(WrSOcP@5LqyflYrg-*dsHm!8YbBN+9Ua#t4+Up5wcLac^x>Nv82G z3HXm<4}?R8qH#gFKQr`L1K?zwQ9alqH&>&oH?4Vs^#h|Ffj`q*7M%2iR)2VA>0bK~ zOwrRHyh^S(%r12bd7MGUIc}b3baOh{T`)#&vRtAX8iw!QK7_G=mR)*?dVxagi0zv^ zoxc>Eu=QG1t4${`p}b(jdzFM!1=k^HGYhtUQ`rD@bxl64KHoTCU*Y@9ng-VUp54l+BLS=mf3`nDNUTMx_f2YRT%<>W^EsZk)mw#F?!T>{ zc(N>|gR5(Gho8e%6{qj-m;L_-`~mbR{crHc&asLNnodOkvZNCk23}lmPz~vod?hXC z2l7;6M*6VjomJ~ICVup%;JDK>jhnli-MR#q!y&=9M(}Ge3h0>A8Yu{#N0)x*V)~!$ zVh{UVJ)wv4(uac6eqO|-Kjf0n_s9AK0n`hm-ck8w4rW92>yiom@(#Gb9acl{QCHWk zI_-99&WN~=)9R{4x6%Yp4_)y8uLSgZ>gjn4K|+r!$hrOcTE|veSNx48LYMJh8W8_d z8YKX&?1?IAa2F#g?aWMz;pYz6XH3A4A4y7zhl7t1ABySIJZ3Y{YSmjIAURrd ze5f1G|BVD9365uDeRw$9>vn9<6L8oBz14Ptl5+-mL|_@!HSGG+pX~~09d1KAae=2f zrlNN+x8jan%v&L!`TAb)wfi0B#I@b=FFM(AYM7rvFOqbd6lZRlZ5`fd z_K!$@?Vz&|I|a|EnT#a1q>J*yR0+e6TO-VL9`}B*q`-mXT@~|*%7YN>V_N9!+oHsn zs=fr373^P0s1GqQI-YJ2qt*=PGzZbIiXMf|Gim`R;&fcqI#7#3{_O{H!wx*aDGGpr z#52qZ#K2g~jRkE0&*IkomY0E;OcA3Sh_JzR=29Y0k)#S%iht^ zesZs@84`%U`-CW&oNd)P&%27DHE|UJ&j4Gq19|Rut>``LgVrbWAKR8Q%S2uKXU2~} zYAtB=Sg7T%&2WAm93ZthQJGBEZ#XKIWjm)rm4h0|Tc56TT-ph_-0s4bfz0*e15gT& zIKV92W75YJpZ>RW*3Qo-3qR4_rd-#!j{T`{M4{Xo{|IWxQYX}px0xbQ0BI+ssn!3l zmXmo``+v}KxJKk`v3SJTGiOFk4vBg7@8NqFO&JvfBk>rNmcSG|+&nU5%Cvc`>qw^6 zCZ<>HzkPqG2l#tl?ErU{lX*WK-Vm{>B5+kvD-h5wLtVg_OWK<{ zT700e5cj=4^{vgW5g$FQr{9vhGIDeWT!KQ_UwL=8kO*=)PD5~k)a9buYm1vQbG|0_ zxbT&9HK}|(&q~jy$0zJNI%#)^09Kb)X;WMN4AQ1@==={aNBJ!uDMd({NDRS;)0_Q` z_wIf~Zw;`LoXWROM~{UM<-QBf32$Qq7`@kT!Vk^dDkQXLNad z-P}%ihH5oixy&8RGF ze!_?w*=FyxEgn&T&!u?Wa9md=A#1QEzO|0uiieKq)0-aJfH0~uO(LpR~?#Wpri9Av|>5q=$qAK`x+wyt|uaq?IjoUDVrS2wG%`Cu(oXT|D3&*TKISwri|4?zNcdMm<0$ z)iTYKAt`0TS0(V!4pM`?2HMlvYG!70W6XPG<~_vTd&K1wg-IFPXV=yN5S%N91@I2q z-_xsIR7*3(YfLbF2W*hYqknmDx)9qel+|pQx^^lWb|O`5h?L!Fy!W6=eP0Jx1FW2$ zE{iWIEI}v)=awn}Eu4FLqZy{%+uVoXaz;f)faI-_>v*xP0)Op83~p@L&Piztaa`MI z%)644?GCc{yR}g?FOZzWpObIO6zj?wV}_*JbUJE*p_dx4A$A7Is&i#;bKd{Z$%&Tq z(%sG3*c{C2_ov_6nC+WuagF*As^ny&)Uo?89dN;w892PO?AW^L^^XMiPRKHc@56z# zSYZ6Qp>m`j8N0foPYgnRH^Kh5CumjzAZJy=haNp5CbdYR{7q_x(w`|+USC}fk9BSO z09+#_Ead=_Gi(geYtaBw^vcC7yPauu5~3%fbL2tZw5bt}yG_Nn6~K|!wM#&C;gC0A zBg3yGqW`i4G0JGtrUvH;-Cr|8%3MZIWBVadTjt>V)Q$F>^P{8G zqEdLPq-0TGQZ9q$q`k{$2yjORo*+6@fjIW(JIx)H&@OE-goMpH6LZK3jBg8c zz=-H|+eRVaocJ2xZ3p?#$8U-zQA4>1gfz0U`zG*CMnSrr z4@wF=QY(*~QU8igD{|X`Ham>Fn#xLI`;Q@Vcbq-sYD)a5J5gKzyA?*4%h;arCl~2Z zK@KsCjMn=qW}JqA?r}NjdML^2ZE;W5km65+1Q4ec*H&Gz680{Hf}C{e$Ue*Z7qko4 zPuIuBn|c7Nmf|>Zp~^jJ{NTedx=#QvTi9gj=JndLIAYDltH~F4B8qa|cE$sulFO~h zn`Y_H?neQy6bxN&s>7ggo4i60s@-FX>HpMpnEEq@PChNF|7>GTKX%$*Q)Q4ejNV~O$Tox?0=8xY$4fOfj)4B{QbD|Y9I#Le4%!_vvloJ=bu!i z%=13jIQUYIA-DElq5 zpYW@)C|Qu^BY*!IhnG_gq#4L=dA>LG9e>^mnw~)Kjt(z7Z<&44QaG)#kO6N`J}GI= z?{w}uToY0N6qsQIy2mFv**U4aLq3?9wA8a61L$}b}>M{9n5^OYw3qC@)?Y$S^Az(DX;W`yL8@6=FedK6 z+d}Gj&G?jXWc2Z;buB1NpTs%z07y&hEo0#sZj^zO@$d|kk}SKU7`CJyvV0#$ae zQ%85EJp{Xh+%}3RSRV3BB9}<*=8IATjAECHg^VC1=dxDW_rx4D#|4M!{-3VSK~Up_N;(fb>(7B;dJI=b?5tzCE^@qduucvBdr%@QHuDa zzIg@QBd%rb^U)r!>c3RBiBH(mO!zgxAveP#ZEr!J!#&S-(`5x=jzf5zoDyDJb4@E* z{`c(%NQ=fac9z214wJqB{y20a0_*`NZm=NuBPsP)}(uz~WGoTV^&0TTbp z-j0_lzIL25E`oAk9$}a-Bwv57W{?Zi8m?0Zu~|l~2_#;6n#Kd9X&Bn~_kYctU=KVe zOl8BOayc8WSQ3)k=nOS(I1Nf~eu6;CAW`PdN4RDeg|b9+>ZCKXlP_ z+!SK*4;d1XLX3^b7> zL>s)1{ci(4twjU+G@AgF#v#9m3sKFWDo9h#aNp9oD3HfgkEbj0N$A0t zdE5-)irziTHr288C@jr?J)I7m037X7bdu*c4^22h1eeRCFvZSmI8fxYAduV1s0Y@m z`Xr&FzN`{WCov1Vtjz%zn+l_`IA%I)=zA~fRJ>|cqy+g8Zh1D*W$Bb;Se6si@nhjv znXv%3|HPo^~}+fB;(tT%n*%<(z}rEEmy<-&h{xr}0Q z%SkAdB`iUd<~k-aTI3NN0y)qQKCiHy21z((Sq!@DW85aa7U`z(Cb z^49PwlxQIkNdPLP?B+DqXYao&0S>G0alfjR84ZIRn5queP0n9>)I|=`)R8kxWUs%} zD6!C)Y3XT%9=*Lq+-OGLsYp3QRZado)h%=6>x6ndt3L4%$k618niuOAf+neixW1}I zggk1T!w9uGnS>Fmhn(NO$eC|ExtL!`k@-|sfA>6+y>(%S(G(kPW!_mahY&#Pvz_N{ z{DSG4YwlnGc!TVrXdb#nplj|`u8G-FAomEXTlwd}U6fWVIl94Rr>~0HAhOEKIW zTYoY*pXAih8EBf;@*0mH4(d#>Bm)Mtp#0(C)0i6`D!kUgH~!VwyFsC^8EMgJWb-e$ zURIH9SHFi_-#*A+OPh$iziV_m%x~eqBfdILfz8mlQiljTsiqI zZG6LL#iy8`$}O+TEHeW;dan$t6m+<+87r_flzwzmb=vG7uWLq>N<*sE5O~$142S)nff0X5^}9T#T+OU8Vt< zghv-5YaPI<^*se_$?@vZ^Fj*7+)XLdyYs(|_40;~HRw&|Pt?C<>`&VA%(*}jE@g`Q zt#$?^OjI%`?9i>jxBih;7ebeVm_4VL82@NTftmjTd+tRJ4e(p;&6ub80J3s?3OTCb ze7=hAL4K)%mKv&{2vX>z|7rJBOVLoc8Z9tC6_`$Ic*~y}(EJr3 zWjU!2qbU!*2Kz=c5@zd^5Un&5r7o|HjHji@;;gKgx<^*A>}WMG$9E;|A!u7uDcHur zb$T0W)?Y;5R(XESMJkS>+>`t(AtVThj|l4M)b+kS@Md?8_& zw=fWC-1Ekjf)mEgu~vQ!sCtOXU6aW3GcXb}k%I#$|2ES8s_t-mZC9YyoST2L^Ecd9 zd6fLLbBVnG^TzBXl2vsZBP}4+e@4<2t$G^kQo2rxpZ@&U;qmV1JFydAokeW~z^Y-K z_RshLBtNJ)yvz#Yoq7?y)wKpB8bwn9D{aO4Pkm>CTgakeUqfZjBK=1vrP!xm4<$Oj zO#ApRj)TEOpdeu+kcLK|JX_L>%vP4(jb;#G1ZF&jEcK^?O6ZY}Tl&EMueMVn_#fI% za!)iZrOF54h`nQ=Lf1r1)vQf@FUvoeM7K5exjr!1#C~gZ?ZLPIY{%9Rov3m}n`SAAF@jSKM%O!s z@*ZiZ?<-C_33+!KnM81zmeu!zjxO2Ze9RPFTU3+{ir`=|r>2sxL3cBH;S9FFI^i2m z+sE$v{n*npttkt-nyb_QA8ii9krCK|^S27!1on-V3HSpS*8(6C2UXVDFfFGsM{}j_ zTD$sVsTi_Dd%24Yir@L_WUT3+T<4;OU$+W}SBt~gSPB#6F757R{0-&)le=+_U;4T~ z%hp&I7{#BOL8m(1_I`aw39ungQDmh<^KA)%1jjz5fH>^lRTlrNknf6|R{u9JPYQ2g z&A3lWp1qaG2^|-Ed7v@xZ_W(XYI~+^R6{HCDl$|1;|SRy8vFV-9RnY~(uavE0XhPF z6^svhKkxxunQM34>ifBWxd&stY6Xv5*A9#azsLQP0V|H{P_L!3kM!4I zASeVOY?^~XB=`a2pV25}cs6Q|gl`1lnAc-?*KcK)yL>5tN8v5grOsi~UY?RV7pmk) zP`_Q9r4~gx_TBrlwo4=Qmk(|Qv>=6zrq?V&h2*$-Y6d-poHvb+D(8?bKqMlPxCsSv z_pW(f!=K@xB*=1<`cY3L^|sLEr=V9RF}@O?dGGAII}#7l7zRY0`V9!sjL<)`7=|A zL^xAf8N(D#JXv)-RYD~JJqDo^v30GQQzqx3Hbw#S(7mCB?mZ$-0o#zdp@n>|knlXC zNN_knuwB|^B7NCl7fSiRP=!b>hHmIL5&ULjJ41BV?Nt&+rHNZWFfuUE0{8+xFGzwA zfsW14veviLF0dz3%btaXt*fsD)+w#XawUqRR&q&O$4%q#?!}ZQCBCFj{-xyQbM-s> z&ZK@sC9?EJRf-@rsx~jqM2gjRLst#dVj+z3k?D{TNm(B)&(6n7JLs>pm*^cfE@#SH zWByd%MRuWof2R$OeIoUJWck#>s<~qUQxRkK2eH|>cB>nFr3@U9dYpWp0+EW$+O;1abvSs|zM#2Rmv69|-+6zo&vMwmT>uep@}kD>dRB01c--!FD`Hlbvw3wj zwLR{k4t#h$J}-IidVW0yiisGC=>mc?KT%IbnEkHi`gbU?ofJaa({bCae6$o4;a$Ht ze2o_}sVo?{&r#~24Hf!Ux6mv2Za&&{a6kjgz`-ccx=4yXv-v#C5o?gH!P~=bhxBGI zHVl}qXiPk4e@1|vK`;2fnCAFI6cVqJBTup3GAI$t4HniFhO5NJmwYa?~d6Tp8&i7;-asKC~xaeu~@C!bJ7BZq&=v02%~i?spr9F zZkaQT(yiFO$^nPY2Vm#5VXKf;QOP{|cVdM&Iy%09n;A)q5T1{x<(NBjO$nS&&{GG1?ZoMT z`hE1~5;vzs2el$#5uQj%drr-bV+i5E=y+nAW1V-~18hkns3|8QI?h3ujei+kj~A13 zP0ejBD1t^IDndA<1Q9UY$qv4w*IK$w0n&4vjR{bH&g}Xc=XV<8go`=M_3U$io=L-D zIqThA`WfAX_=b9i>s+vsW@F^QsZXCFaEyFQkN$wjtkhA+s%u z?i@(ptW7sQ)Cob&!n2{bha<*)n*a-~ZUvIfNg4~wpQ>S0m#d#`{a)H4RfwYJueYL& zU^la{P7;(x3G8Msp*o1j->r!Tfv6;N;1BG^(E1|3PzKrtn%=cppvY_DQ}?d;o*yc2 zXTjVs8XP7a0L_*Asrf_jSJfH8x%U5j!oCmA5Yn>dLR}~2b)FvR_yuSu9 z8oag&Qu$Bh1J(oF%&PF)WBqEqhKLDa%#$wKChT-S1{ScIW^&4cj*E)LeSrR9JwztO zHXZOCD(T-4-ArU)P$XOlH}r8tB?02gux>_kH;Vdsj`6D*ae^D1oL+49@b!H)meBd0 zP8Y<8v#dHlij@3Wo6KH;9Uq263*daf2ft61(KLqaO`tH*Iyn0z$b$rJQ&LL8?r5*H z#4Rf>%uEe?Et1Qd)!D~sNui5iYbs&mm<5jM4DdmEXyf&0lw$Q=_2?Ae12IfU0C_iRTPdj=v`uX&NG#t>cOljC^shD1=S*w(iuX=i3WBYp7O#V>e#iXxra;P>g z)(iSa?cM2xywqd2)^8xa)MFF;z36ic(D20ps!esrCQ3vxZZPcr!>uAa*J`=MMDu0C zLCPC8Fqu}$TGto=FDk%4N@XyXdTC~Et;G|hpEQ&#U~|!)dKd6pIQRD;vH*dxM}D7a zI4WMxy<0y0xSZ7ntuR1X{*4Zbb^$-}UipW7Y=h|Kck*p|roP>KPtAY*?F@S(M{{^Lm!ZDdHCaDte9kO zPd12KaBPKGT)U1SD5W*J)z^MZFNsKhWZrNckxF$w(YA6jrIct}=qU%76}|QqAqbk+ zgW)hQN-UBRZ?GaJ)g&^2Sz|B<9IyA!@x z$Q|#~W$>ep@ZbmJTrlV6&&QDacg`xn>KqOLkYwCYm%&*P zKc_y%A2a#-cP}mUbKehd3rVCiE5nz(In_MsUol@NJ^MREkSx}>NXgVALiTjlY$^=b z@L-*KcK}nWt{{FR7l!S6GJj5-17I+rPIQtX zdFfGkjHclu3{h(D{>n}v%j8$11|9_Eq(QQxM_#8azN7*tIG~ASFHbr+Oo1BPg{B@b zo>X0YXf&Y?t{%WVbXaTs@}YdE>U0!Jm+h!jPl$$7`Q}F%TkBWeGwW3d1J)(eGC56M zcX!qBN4&6VbUMks5m}8>Osyaqof5o^v<6<1g=~g(3%6MTJP)Am#DCfKG~wX>4V3c)YHo&-FWQIPy>vsQsg_VMUETE!!gT0? zVc;M^{)tvvwaLD`Uy{tm-iemmx?)GAXlv7>dSAVtrd1)6E+02x)(KHcO+ErzgmkN< zt_pxzo(^GbX%HLV&~;wZd&LeuVmAOtyg(y|l5;(S%DWfj;j&NXPC(7Bl;#EVRXLr4 zC}a&7)Af>&98&``c$X#p?zk-ct%6UmAE!aQQP9jE0Wr3s|54b0ih<~SC+_Tiv&5Sk zjJBx;P1N38Oc_$TL}TQ&2=gQxo0*j`Kc zs2~4E{+=@>oFWjrejSTRp!Y9*b_-lT?K*D6N^R)94SYU6Zr`UUB8zi>K^C z6T~K$Lx(T7rSq!oEB7j&RUGvKg!naFP1Ouu6Swm`I7^F4I)cR~O9Zq>(!L(IpeXp~ z`p2d49&rS8#ZO>wZ2;Z*>8ng!=i@w`3{V}+Rz^2W8ef_555ls-#gn1|^~|sN!L%zI zHspB`635AD$( zVT-5C4kJzWDfX?}OIi$qtLt~V9?jFm4P&kGb5Oj;;?y;Z=X5mk63Ar^m*PsOJ zB)dpZH!;IFh4clZ3n#Qz78*R-8^^zZ=4B5ceBF|4o~w$%PF#ApY+j46T%%sY*qjY_ zGlTn>ep(&Ti)RY@3mdMi5Dntu50_(McYTR=p%UE(a|MFpQUf(ia3vZ?07jB`nb#+)}qp4HM~E4P^; zo6jDu1E9s+mQMV1@lbpb8skL?>ttkBLkfoa%%4E7P0+*l8Gx z0S*mR(4rmiDDNca>3(n>N8ex{vx`lboeL@_w+29%GkWV$mQPOe9#GpQdP}EpfkZ*z z9XBUx2mSzAx2W2W1cA~!+j+i^DlPLN4Nf@r19&Ibj+o@xR~U_MAs!FMLrhK} z^Jnyl10z9P>PXx}fmmT;cc)RGt(hZuFeqqPNIO{wA&^#ESJX1M1%H&7CsN=7x-MYb z?HY>yWQt0t327QiY95`qbC5)qG0F-hXv zXSnYDaV}axk0_k-+$L!djOjdbubE=jQld>-FA8XwW40m+2OOCZoT}XB7lPo=6&_Sq zy+KC@+rP)VO-&H$3VZ4?1@#TMeV{kW&dihAtKXQHkii%KK__3GPsnO7f2I$=ljK`l zq(>5i&K@f3ZA3^Vrngs`VN7$KR}ZTtC)$0*^+|*z+Jaq1fM&Fp`OT-iFS|)#VisZ~ za}`~?bp29A+cxLctk|CrOiC+~@)2q0=b0so3hCnt{U{L#*hSe07p^!uXB{u(b+I;3 zAV27Jkv(Pe zhz?zRiwb&Rd`VNgxfRfZcvlbQ47{~JCD7jk_<@2OxMLWDC|7kYf~k^-V4T* zk%}%O8AgoZlm`QR$E+60uft6`|G+vG$v4al9j0}vfqRR#M|#?*FAT1 zg6hZ>b9xnT2z2K*wtg+HnDs&eDbK8)w9dS@hx>P~-^T|&_46%wcjHy1>(8KHXOU51 zzj>(^h|q$Aa0d_?q)tzV+gOlfgYes5i3nOqe^~Tt74MKLSQBPfC}NMNFJemNsqjkm zv<5hvmhx3j)7v&Qi+GUgXD;r%N9r>{5Q<3GW!LBUkYNh!mf_~;JL3jXorUaV~2HZQpt2N`|mC-WHfYoL9c(m6|JB;f?X|I4X9_n>Z z2!?div|TpD;p#jQXxB+^aag|LDYP9^EQ$k1MtV<3XI*jPUqS{%!3@3BIwR?vjW9bY zf`9#X;I~KLQTB6Z_9Yb&7t<0%eme&Icj9$$UIrdNnanXrLgm);1D-*MR#y|rqg=pa|I;uTy#j9a0@RE-e_~A*eG1(yBmt@}; z>ZT5!C(IY?>uLgLgm{?2a!`YbpZiW7v%Ntg=j4em2!eV5RkF zn6?@fGP{kH5q3h>^Wg4oR&*EmwjGO(n=a{IsYpAEY(>%N7oVJ+^exK$Sbl?utD>l; zLeps_nqhIE`#>C0qrG~;LhAXy6S6$ULm!G20%-+rGK4HaPq|Vlx&5?MVo?@S=yc2^ zv@m`c&|du4ZnQT(GdjhQYx6VY=0a6bx3dltyKH=A*bAe0I>SQ?$p zDS;`=+X^0dq-T+w*bIacPn_m|Q(*Z<8K)qL?>yxHc6L*v;MPg9kydi!M9;^Wz{!ug zVs**kk`*a%NlHuM70GY~WIsBtB1HjlVQHOVf&TMz0a;|t-17c7@_5FyBHDm?!seIH z57fqJB@G86=7AL1&ME6AEWJWccN{o;hVt5BbOV%svDbIE%R690hNoc4qjEb+Aj<1& ziCE9Z>o~>6e?AsJhpEg$m!Q7{22T0T5#Ua6fOqE9a-G)*qTWQW-n{LHb#ppZi5_@?K%)OvP+)@h; zcq(|jV@FhXO&?vx-oN@}hFZ7rELZ`Me}hi{TRC_Z7A@;z^-F(uKy4!ni0l0c7<}ZC zmID6riOQTNfEsY-{bGDFFuv8#odt1UVWIaiGQu#KSVI1E9Gp_zB1(*GPCIY6WPnQX z>ncLwmJ;}~4=2e9Y@tSnBf96Ak)y~6a`7oJ^x9^Ti>s~}BCqrAbu6(TFSG2m?(bc% zv5a`C>iXNF4Q$qB;_~f!dS@O=$FW63@*T<_)kPM0Fnbm}9EzAo<-bkoRoo(EE>)jg znWhG-0=ya(dNzHA^u*1arN77%SRb6>6aH#o7eFLdcEO!|?vF>z;(mG&osPL;>m?Ev zqh>)XP=T+-Y3K_t5l^McOvQP$;1sOt4Em!sUU2~hqan-co9o$5)MN+&M?avI;Au8` zFm=W#3a`w1?k4EfOqSC%%P5CszPAMq{*QCXFifsn`$QiM7zc!rNyEw;cCHvam-Y5B zASK_I%I-PpdIKq>?SpvfE;wK01Ms5A-E5o;p`jD53;*3`P-N9VIsvJP&9EzbgIFWa z`OyL;?}=DB;=atKCToGL^S<3WcVwu**}lL50;)}nz8yOVkF9+BJdQ8a%@eterZ}s1 zYfFyjTF|h%VkD8c`B}&H&j)#Ac^x6?h;z&hKO^9_Cvi6t#uMr^L|ZvN*=Sfo0hMqGfJ~QA#$X@uv#`AZFP#d>n)# z6bCS_#X@Tqk+{zVCcWUJyiu;dAe%DJvH zzp4-bQtc7XjDFT5rssL2I~ewv`?MMFWpv&xx6Qdr!>nj4zd>wSDJ0YC&$~3dlh3jt zUOL8pmK>|8Z*OYyR(v;>R)=366LK5oz~!P#+I1rzxsH62c_p3v+h3Cg>L)mDch%>D zR+B_G-UvKRG+^#-knb5c%x16DJhg}^i8_Zpy~Fn2Ep~QPZPK0rK`xEeuL=S$UEz{EY4rBThiTFydpzQEFO0YO<;1Gd>(@>ozFF4}Ya6n^^ z7-BxCn;pF`BglDewZ+7SA>~tnGuv!b6d9KjSo2Cqi0yc!rC>`2CqMddo$u0-s}=nt z5wj3YZtVln73QXo_=-B27OxZV)=x?#QL0WGMCFaRx%~=B*M{DrN8AQW;A!3yFnph9u z3fF1X-YKNeN4DFif2=pwPdp>EUEAN&?Kwo*E5{TKU7&*%6OR%{-wHJu6<5r+Q{FEY zC9$s0HW<-LcuExVg!X)&pw9k|ak9jMjo!)e_ra)(veuIz=07S70F>tHnRYF~I*mY3 zkgdwI*$2F{bO0d~iG~wq!MPGE8o^PptlB*d6Pm}m*r-l2*@hSUc}7Y=7f+M{hiWR^(IRGa&hcW*S-$Bx{)v!=b-x#Z0uZs1|%<@ z3?PgyapdPAHt24cBH)e8`eLE_g8r$W0u|K6<|7pAhg>!UwNVIP1Vmk+FAB=#;znGi zujCZI?5yoBs^BJH@VlK^WGpl+$WQgq0*)?5Gk=baF_LF>lqs+2(y6g@WeH2;3}gor zC@_i4Z_?&og>2=`g2!NcpES#jM!k(@-|&K6#kTM}1;5ouQ60rA4o#kp%MjY5d*n`l z#T~lJ0=9>NM!6{D1Z1a7=}v-1wfKT-5F>%=H$rbC2Xk;3l_;cZG-@}#TeNbnyUTWy%l6S_ zROl9+oSc>KG^7*^Bqlq0vC>!-UM~$MbglTuSEy7KV3DN8(J9Lfld*I7o`O^``vMb! z&#F3@bM~a2&fL6E?!)SNP~?8Cnv!2NTg}zlCC>d9iy&zX{bJIwV{})3cA<+j zuTvfLNyQ4<4Sc#T;paC+B8B;ZPhE>0XPBNDWd)mt`g(AqWa?k5PjXV{XATRvtJc)QToA*^TmZQ}0#6c8oi-NjP3IB6i= z2Ugws>BArhk{AMYG_U29RXl`(*jr_|3&@{Yt;A9UAF96R;eRlky_ikLNzQ5W-BZS( zx8jH27yBN9E}$ClW;m!RO0hTqe45Pcx{3%ZGf=^byT+ZhsKnco(j_*w5+V;LG#B-h zn8m|Dftn)$eltJ$SJO1cdmG~D!8|-wIuJn^`-zSD<{KVw8L-KcxW%KB`YI3=k&r4e zm_*s!n-eZ)PzDyJ_t$QaNqi?42?`oWOH}!jqd&eCoxZY=3^HEg#mANa26r-$E|Q>d zJN(;<3ZbdYvUZUskI;9Ah5#v}Th-hf#gkDS>u-jKeljb9B2%lG7=A>0@${V=N60u%c*LDH1tOznA@n%AsfRPq-SQA=m6`se%A}P!cgnunGVPPF_{L&9DeCO{UFjaH<_bucLi?+VywDnrKb_t&luW{8A6ZT{DoU-|}9^NUm1#+7F)b_8oCH6^5Oz4dZxjNV{ zRuZ10=66v|9#y0As#*5?TZ~PWUbYe6LR3pSI_!B$*62QN65lKh(1>h6}=9i)=-nYmm&eWOn!Ggu3xrr zKzot2qSOBdc`T4221ouE0A@g$zlt4~szn)QydA}1$FS`wlZ*qrcm~OYY==TWkbT1| zw;!>t+o9@G$cQ(%bS=sR%}2v;vKDEw!KXfqefNeOBOQ9Do3=f&Niqc54LUgzl_=dqodp?+}L2;NSO|K7%wYkoxY*YgbU%Q?|K3EOTJ(R^Ghnc3)Vt+v-&Ai zvyIKxWI#Wrh=J4W^nDi)pjQVO0GXgEGT9-=7nmlS4A%fV!xvTRZ^LL94hANpS~4T5 zapGy2gBPzifh0Vgy+ern#+qk`FP?uD*FDlFXKFSmB_`)-9#02-&)7GUTj3ksT8m_%!pIZ? zkSdMl*oItF1fgZ0SzA|;6S$e(!W^>>j9Az1P_#c~hKQ1M_)&&>JzHzJec(=p=-O$z z)1y%BkU0%MVZDf%DiMpe>w7GAPEEQU(w5#i3kN0zEvdYVJm#DOYvQ5C9rdYwS62+t zvHBC&*~Yx}*8Zob$m_yV8p1J9VwM}>mAUP)b(*>n%I>hD*4Nri=675@3Nm?SG1DBA zCzhC0=Zp=!NS|ENP6)4i4E8Fdoe-3V$&Es1#|6^a2_u6e(Jcybt^5QXB3GcFh202s zcKWEO&^gS%aw9`tWNLT%PSf>tn{hG*A_nU{Vxv&Mf~B|STSKxLG6W)!ZZ`-c=QuQ| zDychbu~UpVNnKmxdh)Fmwhho9<<(%oJXHsmrOMRy@z8tZ*V+e;% z9V$oF*l?>(9T6w#z;S&CrV@Ik@h#Lb(e%2Wvjz1U?Y6yXQ}fchG*~uKSnmR8J>m~V z>>J(4U};1-c6k9X1{eA?Q6wHKoV%!r@4JQwx>UlKATVSLCvywCNWityWCHuB`x)2G zX+)75d0kBrPNf)zIs@c7bh{AJ0@QakVnwAG#zY=$#JalHi_ZLUlDfK3Pk9yj&N++p z?obw^Fr{4sxuS9l@B6+Xehigc_yDj0Fha*8D!cHJVQW%B?~a+l_mD~}d;(HlPlrwA z6+Xj&hfF_YshhxNm|i-Keq>0iLAu`!xM_bJ8!}&!M_14dQ*CXjB*W+4km=!Rs1(EJ z9&}{@v~hNUPjBSUFoJ@*G~X3AVjsxiXPdRgj@ zS$7n@MdJYnly$Puqc8#~s!qwrbbc1tI))shl*+;b!~v>m&0(IWK@aA$Z&2z{SHTQz z6YAT%9a91kGAdsO!-*QUBISw6bZ>Twhdhb6?tgZ7DZ8_{n|{rr&*^~K>Qi5Po~bmI z4y4QKZ@tJ=gJQ&4bj1wCDX+}1=NijX;r+sX;r}FWe=Ecc1Q6D46_?r z$6*3SG_g+l#|xYKPJ5g5OmjmKwYQ%CnFU?XRE6?23CGdwo+-{Oq7pW`&JL!MH)c5} zv(14}(vL9ve4{@w2w8Nsw9iJ7-Vh~)`pzph8l{?oiOwaD5{fa;JDp2@Kfc6>G?A$m zolt&195gQcADum)3fW6kwjus=xS=^6|>YG2~bawafyEAca3u0GSk5TGdx1F{v z={7IRu07|V>W;iVr~S5JJ@ydSwpgS`Lnbo@RN1Aj{iW`T(8_W`*Y0`QzAIrMfuQIo zhKbUA7nm_!6r$a$K{C}vSxPZ|#JZ7AQ^5=kCb-UM# zbhR(F!{597h;+8Rz8k@)#Sa&bV|)lqvvI%p`|7(w+0xGPy6G(CoQ|3Yy)+p>&e!F9 z%2Y)rRC8Vl&jMS~0h6{(sz&TU^ms5=yXO^~g^fIs$B(*N6f#K?8K0$ zc=DvrZnD42=$ewG!Z^}ZVWcLn9}M+?Yh-w+G}SDPDcZw^vzxc?5>u%3REly;t{a#dqIkeCiVdZypobB+BgKHu2HR%J!a`&XnlR6lm9y{GyKbE~YKXN> z+EQX1^KRIwpM_~017ECj#4o5g>li#Gjde${7gVVA!w@7I1CG9+!mJ;8U9WzM{?x7^ z?l$Gv%VV#evKZ%M+Zdn!1?Ad%%0{t_FLD@q2Bf0Adr!R%i%jc9x%ZxiUJ|BtK*k6I z6d0n4Q&cYsuQ2&~z2OgCOd*C*xT=jCJr&vu%FXwz9|p3%w*4usTf>i8XLg}%_P#4A zBV~^dLNPO}B6abHq4Q6Ap&?j387>0D&YP=H9{jx!L@--tpX1RK3Ft&W>ibt{qGG9Y zmvs(9-!|r-tbvXQi8s*C4}u#BeK)NiCndAidq$zH@5<{*9$+lG^nxDGF2BQiZeYkO zMxSLY3Uu2d@+8CJv9AXyBG0ldmh^egI49{K_vtjlfg2etn#f~q%k5qO$&C9Zf=8Wh zTkaQQM=7Pf7Y%sGV8h%|9EZ<3mu>tB%h!jwkFE_q)1(C<)*c!%Tam}vR_G_D(~pb< z2Y=AqGSRQ9sPk+qf=&gl?>n!;$P^o#I?|vbUnA>-Y%4O@fRd-zR^;{iFnEqi=y_^= zjBRm;2Y=Do_L7kkYBw_EF}4+j0}}#KXVzBQxfBRw#8dLz+Dap>ksqmhB8=DPMqPtW z<45YIXqye%k=O0H=5A3}Mo`V*+501PRkYow;L};1gKOq%*#9GSWwec4MPisM%0zrS z3P)Xizx+sDGi|2>lfL=KXT%J_e)nO)4O{ZZXXO1$q-P2GkxBu~OPgo)8Rf0xUYWW> zc|(RlhpPkh8k8SoXd>J{KBK(g)2?9){rHU1JEoC={{HxkGBRYoAxie@%E|=gkaGqc zI~RO-Qe1g%L}TI#%*|_Xh;ARNG{iO%&o3aTJF~jgLA|KPjVWsQs0zW zb%oM)L;WE!4V1q7HRGW-41=1W>W)IqO&`kBCV`3Xn%D!VLr&b48yR;5rSQgBq$Fnr z)#wnWiRrM18dUTe4{gGF26DW*Ld6<-4RT2AnM1|E=N)|c9TO^%Xg$h)*A%^Fd5qDQ9f#lG2y9P6J zO7u8%JwYf9Rj5mPRfXyqWwq*Fd$Eaftx^KWp%-*QKOov6RcaoP2_t1$rJR=zLreid zBi$;gP)kkQYL!%{afPILx+%%y$n9S1mv&H|3^*Sd`$UNzM_w10n7AEikjXDXUyp9GHX#~Mg34(a znHlNU$k6?{_&*VA*Cs{t@84FJnp9qwQaeDsNw;5o4Pwubczul$Rd~G=qs$pEA=fC0 zMYKorrE8SvavUa!S$P3<$art64$&AT#GLqDV?&e}bMl2|G1e$ShDXF{hvrSUMhP^h z{>Z5BfErZr5TJvmZc%PHutG7_1Qi|+SaTCswnoV{XKq(W?0S{w#P)(J9To{*#CNY; zBi=ox#F{f;=m$XJC$a{QDf#9s?DS0<38+DZVh-_A*@Q%oDIw=9O^7kk0a%PI>SHqW zKtBozIp8rJy(#EkySfqsYLGDtE=;G-W6}_!?_QY2$H$aB)AWs-<}oGAG(+F(r=~$r z!VF1CA5-ECx91QChoKVfFAI1Qbn9VIZyLDk$COyZD>}CcxsNIFMpP%s{$onW;q|T! zA;zEzWyzYb3z|AUrUad4vgEvWeOJ#`3U#R2OhVK*M}}3Sq#RxamJAo*+{FAprsNx_ zdFk?MCN(eAqoy#uFmfc1DXFHJVqP0FX`p18W*S8Xx#Te=$u!f%h_{p_Lh~B$w+!Jw zDLLjG39bp%o={TExyz{=C;0Co_tFpy^$8`?VBpZm5G508P%c_w)Hbl#Pbf*|JiK-z z=QSJnZennwrNo)@NNfhZ1|`b8W0$U(IzFL9nRm>O4QgkoK=nQp;iF?PQh)_j5q2w8;bM18qj`0a4)u8beCO;=9dJM z{*;nj-h~+4j5;}=Qi997Fq(AoJ*5N}6g>>3DZAw$i9FL_$lT2a&C63tK50Y)W?*BU zQtmrju&YM{Qxff`lw=~RgeL9uQ%W$|VgbRNKc%FSEsU9DARSLBp=2A$K4-` zP8tBY2n-E8qoj~mE}F2JChHj`glqo<(~Hrdz)*pjB{$Nq zM4>q8(bogXi(R;eIOEUgoHHYXboY$1!9I4cqmdx0+yX(bNe1h2uMw?SyKUH!&nRg` zXid!MLb?$cY0EQG5=kP=Qe_wlC4w~C7#+$DxXRQ}jdC85)y#DJ86|l%0u!NlMoArw zs5kO`zC>H8A@|TT%4Mk8L8TG;_5qs)r^}*q-ZxaIM38MXd4W9_FlvC5B(jqZE+Ws3 zd7t-yY=Owlp3mZ5 zcx_&_=aj7S+Uxa=;^1>iTG<}8u1~Deb4pmjd@_cCP=bmeYb5?X zr{oo>C`Wfig1LWAMUgv+j5qbqDRJf0jpUvCffqz!YzV+iNi7qx^*JTAH2W@B13KtF z8yL9B=ak$cbUO5GQlg8fH*q#80j8OFk+l}9Pq0bs(+NXg^M=Gcyr^N zGrt`g@Q#vnfFU(%OkYrP&Z#?SN8zQ}780tFz82Spz$Gu96T1lABf4GYY>xuGuVDt9 z{gIM-n%BU58Ic9&BQb}#+)@1v)q_-)=W%uW6D`GG0BZ7pUlK0H+nvqdtS6zgePpY(a0)x z&KT6xyjiK}8tuzIyRptP+JJM^4ai0)arrYdMF=4ZLx=nxCb1wIp`>N3cUfgVyR4FR zDJ3S>P2wu14x_44{%n{1ft!%EsPJKU{`f4VM@a?|i-%s&y`k%oi4}YOE=%aCp$PC+ z=);23)yQzW(dTeLS0gE}2c0y9j3vErtC#&S3X}NHlx&QQ#aj(w<&%l)K-tW@-Edg- zy%-v1QAk#&Z0HAU;;d5aVj6>NMK2KNUjC$&k&IEw;z!n#p< zFsPSYc@yeU;u0{H9$kwvr-jq%av~|9bYjO|0K{?thX{R)Q-SvYZHbUUYuUF_CM%JS2@X{FY|4J`U@{}BjU3yPbJ~K@qA(8u; zJY7iJGB&_$(==LrKEdDoEUUjG@~;Phxqg zfN@xr#u6%M+&N66pQL(9H_CJK?F7DnvU>g;UXh0P z=J;5|)_5EGdb&Q!u1gD#HBo$fGaSOa8?{lyT8SF(%0_MXjAMs0z%h)T(*rCp=6EKU zg*c&V5NP(+HCDOj>6t}@vMm;T*7FaOc~Q_(^9()0EGI^(O^tPk9Vjr(Si?Ft+$1fF zxblR7&rq>;Jd34rM}{PGl-lD$PrOH}Nc6nebgoEtsap_H0Rvb&)O$>sWHH~6xQ)_! zctH;n5sqx*^}GTxIIs_qkJh^#R2CXs_=p+?%_61B+GAmAumq*kB6cp_u6=IF12+Qr zCi5erJj!5t=SkPzIQF17Jwt~mRYI6z>ICaF98f;O@NL#fHI7&Z=!|t*$|I(;wUlD$ zhz<0CQktDp&(H~qUv_FQg1K zBU74AN|l5`IxUgpz(a+CC4!t{@;FQEc;$zYA>j#i0D@c=nivW?&d!y|m4S>(e8cQ7 z-u4F!4ZdvImGeHP5XRI3m)5s!2keUJQ%UkSc){v*`=$mczirPoO(&IYBV<8fSS>Qm z7z}wBg^7KJ?o(VaJwGFLZPthkd<7MJ1K3sr=R|2TBk$5M^%OUBz#^FU!~mbncG<)G zMZG-DyIz_SjFa(Jt}gW?8{}me5LgT>WatjDvcI!SAfkN(&7aRcN4Y6fgER^h_vCF=M+|SD~RaWnGaZhV4tH z0*`vAHn(NS4v^NGXconhq1}a{G#Q%OklUKF;s#=9LOAN4su5kXuA%4D_0%D|G$nDN z?x%osno3jg`CXXAf&GQle#9<)gLx};A$7=N&vfWhLVq7P3J^Vjpy(TN!WEREFm>*F zmp)9t?z&FhI34s2nQ5t8rb9Qr3TMdheOG=OGQUT{oVRYohD^%`Lk1ZBOjaSyBfSCh z6JTKiJ;yO^q4Q_z4N^k_c7j0p&S@0(A~)7=eux@zCxt21TObg0FJ&Mv7>-jalwj)i zQS2>btsTioOzuB^$bbrmlvo6nEHU0a|i)3@N`!8Wg}TItz8SiQ*5Np>I$?Q0!qd z?Eq6o41?km&%*>xjt;E1wuTh5_&e*A(c_*8*t?nBZ(J|~^Gu>!U`m)}E`8!@cua@l zHVCYwJ2#-bhQVa4jX~R>%_Idy*0xSWz2$)%r({fmC~TnDW8!sf$=-H9^wY%Ek&+C?Zb+*`-WU$p zi1kuiE^RwB97uHjB15Jb%2yiLKfnr4=l&>_9i|@g;!fzGEAEZnD=J!c#5x{}9p>y9 zgae8c?Zbk#Qv+R~ohq41?X$&9`Z-c!gn7`J9m?|69SjZn7>eGUbVA98*pikLA8l)O zhLB{~kd*?u-8PXgV(H&9-w=_4SoZf}G{fya3#I(lXV(v}SQKA|^)1g2dm;R^HWY}$ zE>=7R?)1t~jf}9+j-bsB)I4_Kx zMBa^StV}77KydW}oRZ&}c_zsVAZ)Mc2A>Ue$mqgd5MfP?P;}xX{_J8qTWHW=YKbBk zr{Rr@qiXsXSjSY6Owi>GLXKQ}KnIOADbG5u?edvC2s~pw%Dv8uIc6P&K;(>TM^TgJ z(DxE-afkT>*p0?k39NYwGkViCSD^@t2b;i4_`;ut-N?9uC_?i#y;Qrl8F`=GfvGNm zH@~y4aR*TnBA{~QwoNlhI^0C8>xgQzqlVw5v7)0eck3sqA^0AtT!xbuL}C5rnexdu z=4Yg1U>g!2Oz8Tqy-B8Vlw>H`)DZKMENbiqv0VXGf^OAm1bQ+_YM&l^!*a5|dq%7` zGtne;;`)IXU#7akgcL7Xpl6?^%<$YxotdS~C4eA@-FlTFm1KyN>gHW@w&)pO_qrM^3 z36)R9y)wkFrA(Ya#EHTIY?+(Hje4OWPBn4*12Tnv$9A6`ho*&~w%DoLF~sDVb2g*geZN3HlVO^;70<}ghIKi$GD-?pf_&M)vdNkWp{j2KW4oV>`-Vg^n*}y zx2LtCzJA|N=|SHbuAFJZ@S9@1y|` zmn&v6_@M%e_4Lh5U6j8Ly94(I7@(L%eOHgWLwbs`VHjWOJDGG6g>7)@4)o~b)EzlT zAQpHxy0)IWDL)>0fYhTt(=9rv+j27nqi)M#AHecmxP3P=4V{ve&0B!FHHYGZHcO0) zK^eZV1iiTpM;sOGh1d?%^*L?_AOTT)qZ1A43cZP88$iJPtZQtjTXdY?_=f468g-Ap z8_mwmV}BNrR2m&uv+yOk7X3bfWLbjVW$J5}1f;Y4C5!MTjOiFdVE!*`(6)`9@e8|V z&N*~RH)baASJXfW+?JPk4`-hkg)J*_0Mj`@tyO?(D`w5F7wR=#A2yoxRcoQ9c{XS> zyu6}uQYhPMHW;R+$aMs{Ok=T5J(v$-QYh2uQdMIosT01L`s~_`Jz`F%v%XZVXHYs) zCwVg+pl>5FK%YQ0HJZBbtM%ug?MF9k~J#7mo7ppIR>Q;Z{_4&H3y%3Hr|(_}hi}649O2XfeBcgYI4R%5K=NQJT;EF!I8U9$r);QSflw#$nWx{o zQb%w$&D4ZZb|jGpqxl6Wv3Xgk6FHv=Q!mLgS@m+ft$RK?XA#e88`aOY;m5Ywm0=Bt zvOd$*NaQt|b?C62FmQXii4e)=w|zr85Ym3YH)hYHaK#jDoI3A3ziXHe@{sfVOE(A% zX-24vEYF;NfI8Ab-QJWEpAWr(I~J#H;wg3*20dfu5-KpfDT5d#1s}1IM%GBbIgE8_ zdlDXn7+b?&EkuO}zPMnzC_x>UXJOn42LoLuqNLxZ@9B1A)UkSw`o@Uq*hopg@9-2d ztr2yo@=PbD>7-87ckUMxeCjxT2l!PcL-$NNXW@JQn(d%w%#wD#W=C#xX>Bz6n*Gi$ ztnCn9yShI#oh`{}TzOZP^!B|QrEwnw)lrGO-1G9x#7-pWGT`@lV9{f*6SkpcB2+dN zj3emwfmu6^Sl5kp)F&#%v2F@PhSfvoO5nRS;G`RQ7dpg8gh7iO%yO;Ev!wRg*Uix> zb#(gKD7nxXy+;NgQBna7f*4?ePfaa#ih{g6NJWfw7WW69F2j*2sw0yN7U_9=2`Jya zcHN=vA&E9*5%ejsx7#>kfj2aWp=4^`9^Z!ce&*;tlQ8>hR75Fb91-e*F7ixX?9@ej z+D$us6VF5)v8QS9nYFdj)Dg=*vp6xG;1nTb1J8$j)YU~x>YR;m!K~$0nN}4=V4eL7$31=|7-8~Dl%f<~Z>gY2I>Mm^D z%RW#k+lv!mYq6uq6ZyV##YBD20Dv};Lp43G=_A(=8+3n^GBfO7dVV@``@BB0>i~D znE(jmjQ8~el(JUmNp}t4Nvdh?I~hs@XULithK?Ib6YE9H3uS2$UoaCRPYF6kY@QH| z8w52&d16W5vm2e4qj(&Q|E`~#6pJj9>TyEr8K#F~mx*D$>hi|4Qq+}=!U8zleqlkX-@;SI6orasFtLXC)MRjitYWi| ze$>|Svm1UpjEZ{0duAV+vxtus1#TRVVr&2PMjFG9`fHGAuUHb8>ryt(qHgn&T_l*! z)i>9sICRX*6kUAAn#SptD2fTDFL z>^ZLkHXH(TM&J!~l3*fSAgty(l_SCfsClgF9YZetDl7f*3)%m#I}4Dd8zN!-@1W&<1uFs zpKK4zLts8_-HZ>tUTPRQX$mlCW8P8gqZA{R7$T@pYHtj)rI)5IEIfA*28N8_QngCC|4^ zd^#wdIZ^Uz@TN{ZW)&aB@>ft8G8jkCN~+fZmFmW)PMWSea2?oi?0P>O1buPymMwHB zV&uNcxB`-Ubj4)~rR6S(T^QogIwgf1IjN49!(*VYxs!F=XgDhhE^Lbje*dr8HP)ZQ zT0Xk?S5#X!)|R>z$YG?GOf~UC2}$vBik|7F*}&TZGAS$L~7k7w#3XGe{LTog%?C!8u?tD zpcK6NBIqpna`(9h4LSh?sbp;CJ^(#D_? zj3Z21YSkY=2i2w5HW~tbV?&MaWnL}9dN*2QSne$4E0FbOH&kZFWm4;{GW{qrlhU|a z`P!&liCcHt(@~9*R=5L2Fm0)M$%y<#I|otjSxp;-bP(ZZH=U9Phr%*R4>A{AV~elX z-UE4Yl~taNs-@D#k%lp>aINfCJ8NNiYuY+;86sqC=E2#F5Hao`bM+AlHuHV2-E4^1 z-D|UtfUp0MzFH9Q^(VL07A}IlcI~5b5Fu*l)S*o}@}dKn+nf5|IW6yN1YHhNTBK_Y zqS_*_$n_lvoGOZFC?AOUHlN$#IG9{`Y$u{N0zZRJ(haq;L>_FuJNwudJ1|5ze%TU; z@4N)ghhUYlT~!;&Q-KWDD2wxv3*pEmh8T%{!+UF!yI^jlbAn(tevMp;#y`7FJ-YN_ zKY$gYyaZSoC)C$wz=bh{HY&gKlA1Zm8dI2K*sOe87N?bxxBTC_RITzuuuOd4Yr2v& z#gM{p-(^-s@orG=p1X+S4%*!9Ql6twj;<;$z5HBcaEC<5oGl$V@$E9Y+RCdMGV@h! zY>HdcW#6vd(q|W!+P5PM&YGsU zGbGDMkPVlru8V}m%U45C?V2{loz;3EOO9%j?E~TI!{PkD#wypt*_F5RS4_+f)|Le# z;M4b0KQ*?ZHk%&+pFGGfxh3lcOy9lyJcRbNb#oK?R~Eco+18*gX!}*(wDz0Q>zzkw zh#<{z`;@dqGe>8~1ZaxWguzL#44s$N%L2W39+e>qCr_(j`4`z53;cv@yQsXQV&s0e^z5)2iMj2z7xA#y1$OPTq9r>Y-@X7&Ey)> z_g*aPci!7W1SWXOO1}C=5~+rD=uOEhs~qt=$xdK1e0t{JsL1G@z%KZ^(>&G^c7*`5 zNfe%=F1N6mZRzsax5@xO1NKAueromif=2AF*M`)0Lu>R;N-Rw3^g!B7b|gM{?Kco} z=3k$q&J8k5|6T_AAV9GA$+pGRw{tN^@4Q!rD1kby%u~$YDM@F-kv>4M{{I8p`-|!W z99if-!c~ln*qCz9pKM)`Qx*$4u8ogw)PIQeYU8zjNL97neH8vZ-=>WC^$=a~eu`hUb6(7`-V>c|=|Frs@RrcOGfxM`9){BX9!d2rQBduROAD(^ z@4E5zkb8Ux0j-p~pcV(>oRrJ>OdDa%;*60Cs$|FvrGU8NBZX(Z8X4*A(R0#$&Ak66 zaTiQ3C?(6xU!?ZF^K`vU(+X@RwvBVqWPsko@a;;d3#A}HP9dp39lw1K>d zo@%4DM}$s^YT~!-^uEDk2@iv8)rNYB4IOG+oLbofrPh3H6j4G{lJ&LsbK$l?l7U`H z#YGuo{U%7}!9&x2nX&^atpX3sJ};}UzTM<9(@&C7T5b3TvU6?r+XKHCG_`5%{8GVj zk)k0VWr?(HDYGY$P^aHbMs`N$@0;z$`5?u{kYTZ_={)e|hXRg=`k}(wikkVx4Yrf7 zjt5b2>uDtcTj;SitCXUW>#+JrE2VlE*^m7AMgsv6bz*8;7VLKQRqm~R6PLdEM&gP_ zuy(aG#ImpSDenS>mlFdx>qM$jSCTaz?aOK6tvC$AX~OH_fd(JfQk6SChpnF zE5JNj{QJ3Bv3d0`IRBmZz{wB+Q1g{?Rm^rqWE%w)7UBu8JRBoUng{VOnN840I8j2H zZ~M{iM>6lU{R=4)JuoM2&XcmqMM2e}L={GGY|wT&rn>$iTUzCW$jwbX`eZ_520WHe z2Z@GsX2kC89m%1G%wTaC<5PLS)Q4;HL_L%tjY7>yV2*) z$wLrUz0G})Ii85E&n~=N?@$jrKJugUF?c?YHtn0_`Yf?T+;+$x4_394K6BWu|jti!ulmd53>iA{O*v+aCt%uhD$+=Se0 zkXhQEitIf~@!U7pegK*hw2av*?&os~D=!r|P_n|EU7Jvxzlfi`^E$tLQ=t~E7AxJ z35#3}qK~WOdL5E7Od(%WOnj6PdFb*;a%o6|8#Wq@hWJT*oA|hLjkjyt$bu&5=2%$- zfexkpz@&I|cEQho8%wB)2Sx}|AF{FCnGh&H;=n&qTFGdH!VLRE^VD>*WEE?G^S7Uy zrJ}k7W?kP+P{RJ`fSl3##4&Hek z40W=(CwB3JG2Jn&j*lh}Y{%0TE@{AQYjTn-2*-Vai8zO4hr+DUu`!iur(6h0_O z1MAkgT8JmS#A;a?gVJD3Cmsw1Fk(sTm36sQH@E|$;P!K)j3Ly?aC4)KA-eM~_~w{v zZ-egr3*-3xv(3`)&9ga9E@Eh2p^R~vU?lbVs5B@Z*wqd7EI|UF9 zqjh-aJLyg7I#|Qucx$(>5oB=1MSN6LA`ru4%E!{$L+ydCDy9_=hhP;#Yhe<@HVVcc zOb9TSabZ~XPN9mee0f;*9_K;63Mxx~a8}7AKqcnKPl>x)$_xDu9{GsT-o+}y!KckhD=$f9@wGFMJ zl;AFTCVxf|t)$>2pN=A06)maBckH-*679-$=q9!c)GMz8vl5;k>FG(vSdim3jWV2t zJT=}pG>=Z+705&TGtqVphwM(?lqQ2V@Lw2XM{`H*LT*h&&}6#NiI2``^dV^fv)3J{ zHj8RBGi_%d`w{QEPvm8^2Av3#oe?qGbE+wURdh1krEvd%T{oH}NPBb^evrQd84Z?cM7C)Pb5D{Pr8+xa zH@%uj1C=qaS+aUno9Z=fzDr0WeuOh>_EwvL6c0e)7~A-@u_9QNTE;u1qI|2J+|`v zUy-<4qQ%f&=vQ?2gv7oj6G%~>Rh*~gARmtil9qgo$jl}%vmaAvMy||X!Q6gyJ0T+3 z9vP;Nx4SYlsMIj&Gii@UEU4uCT6;daH;k8f+7U{%u-%HkRzCd*p*o9Jp|LwcymX;5 z^3fR8v9gZf2!T2_F@Vd5Lw@mehbu3GDpb5%vURD<(-8u9Jg<5A`tVfdtEnB`duf^- zA&;Zy6GWM+G0I-z6KA0u3S;DS7-!Tk9)sEa!tUP7_j%|0b_mL@-IHPk7qAHhg%zx#q<*SRINGtWz5NUQNpnPX605Z_NSwX9;+pys_&nT6Dx9J>(WBT?qKFZmE#II2a5BYQYV>5VHve4 zgH}v}Y`x_8X6vNyTNe*;l}$Q)YC3%rA;cjrO!79_*j73ri_d6U$;jU0-KRYp%qutN zrM6Y7n8Dc=*)+ONfb1EV&%pF&O$7e1%d)XXIryMr>A6zLZ}jLEq}JmZiMRUW?dSmOa+Qd zoO?E0*7-8)=Yf`8Ex#CXh&#)>Av-ho^LFj!s~|~rQ%2sNQnVFO6<_jwn-nZ1_KBzu zD9o*L4?y+El%OcfSRi%fnwAul$0HUDt8IS7R(xqYWyp2NVIymtJ!v z5R!c96@gs@8gt{Nva=9Y%+38u+gS)5zVw}uKqi{kK)q(hpowMkk`f&hwes>q0C4K$ zOG-t)5^92J7wRdBu;0sAJ0%W;CO6hG7;S=KN?>eAyDt&Kc182pYQ`jlcI~QGo{w;~ zE5FrRBcwH|&qg3C)n>_NeNDygSkcT@=;VCw%13+fl1L6F)~-`hd~wV}ECDW*Uu!y} zjWEL7ChX#^<%xvgwuvtlyBDEtlNfp>`yPR9*QWGZdjz)q)qZsAomcKCgt=Y&HOWs# zkQ=x5#nd?Ycre{Jb7!<&icq(kDoFJngt^@$?O@^7AjIt^*sX>ZqWbjC`Nllu0&cga z((WgOx9u%0#V11vypB3;n<2#QHZexX<~kXJJ^Y_==SQ5@W8*5eTtU|D&me>qmqB-LC#LY~ci(yCPs>mzj0+-u3tN9dy2 zwN}C%=%%@6uS5G_bk*Ej^(H`9&3!@&wR7MIT{ib&AH>iC6DZp=knY?cp(}@bsE5rF zx^?aYFL6=BG)9ougO&n4MrhYV3S(H!1|B28i@PZH*%(1x4?GQ0XLpRit_P>?n=wMW z9zsF`lqd|uCMD`QMv#>XWR8({pn`g1)kE86#f+;uB-!4j>0` z3_XIwuFy|E{)p^e%}D0v;8S$tj@v`%P`hxs{j09SpMHcz$lyNY9x%wL?FDX+&K7hf z{PZKjXVfE}o1;Wu!!s8AKb1}1IWl%N2zN+B3Vexnz$TlOX5v>e0*s6f_Ed8#o2Is= zuFECMzVy-Y86I+ZvS&Wkv@Lr1I;gOTvZ;kH?Mro zE>G(TFUL0V9V+3V13gAJuC(Gea2bWd2MI%#Y+dH^m+Tss3QUX4jo2==<|tCRrM2?r zP~n)LJUVv0!fuLWjuWk;Yz;Mz*V$?t+_o#F)*adyH;q1yDBa*@?ZG;OQe4UFDYJ79 zrm>n6y&~;kCXq1YfPGnKmy~{SM6LcJ$oV>nu2dwA5NTRi8YNQ{CK~Lv(&&p!1V)(# zX;F5unai|fYRE(HW`INQv#XRMS9C=#UgV~~^XCmgG4;tWtKv8AoCJSLnIR9) zi`2~(yOJ5v3D#$JN*V-QTtPWxP}W(XI-7=j7AQzDS5!K=403;>D}XIeXZqsWM_N{P zo^6oNl5mftnSyHfc4-?$^cwn|HrTHCUVoK)BP5xRmpXs%yqe#}yMzqMy*gRX$4su7 z@=sZ@T)vEdNL>v#KyTw%K}MOQMP2M@wQ}$KkK9ERCZpSaU)Ol6(U(H{sQm20TWVI$ zG^zegfjPhyzI8lXJJmN=8CfxmZvFHP#g&gT;D;`M9@WJ3S}bF6XPOnsF+jG!p0`_i ztH=;9$(fR%0wnTs`GluL+jN@Zbu!5bQcn0~uw^vEF%(ROV9l8tBc($T4_W6T;Ynj*xxB9cTPD7^NO=rIHG{IdL@KQ(}jtKk+6dxn>6Hpe8 zl*glNql(scqb0aOq8E}uM3gHyF-EQ$lqz`MqE`VEeC@qlzbI4iPA)T)AvlF&f()ig zc{l=~iPi&}z;Dut!r)*1ObQ7uY#wO2jdI08u5;U4nX!)4%c_l+iAf02Fw1O9_RPyq zgj+0lrGN*fR_f~ty%7L#f({HY+*u$iA48vyz7ihI+j+ z?g(mNv$gFvl0_c@4U=bT<<3BX;S+L-JB11vu59g<&xEjfT8|2;78G%F+Jr&@^NJh~ zi2qId^Ag=P|zb#;w*-A zPUl_%=aE`^ij*(9dmfXTvHCE0YNS5g6+d`oQg>;F03M@k0j;ndb6Mb z5r!coOD}vSW1Fa;$Sftn8p>HQ$=u1-xtkcxd;zQX+LR{PVrrT>UnjYt(_5+(@iqjw z@sbf4j^8ENL>K z^qw|pZ)#Ph$jD#CY-RYVe^kz2$picrJDU?;8sP1sbBQV)BThScA_N``u9@;dKui8)=-G z%NoTQ7eczKzIzm3^eba*ba9m%r;l<}SGyBW_r+;A2`a7e9%0TCs;lu9v2vAu9@Ow# z=aw`q9Tn8>+Lb}?g^Fo>wXdRfT~IxZ_p7*zydi!|!Sl`s_Ss%ij#N6WPKmN$Pg>Iq z;pU3|_Wi}Z8U~58W zvG1WnX~MHMH}YAiwBnkqt2T(>O)%G7eRGT`PtfgM+qP}*UE8*8+qP}nwr$(SUEBWl zCGYo=@BLLd(=(G!XKE@{U44$BY~iGaE+kdbyXpL2rzZn?*FwY76*`zZiX%)LQ9Oji zgjkb8LYT=uel+NOhYHxVd7Gbcy693rDM_1}{Jc053fiY;vptP3Z-P0YTHHK5jH<8Q z0#tdSy6|zW(Oz%{d#Uv@HKM5@^+e}4?B>gD7LRZE!UZL8B$yT}djBs{CXEO~RGLwM zI|`h|6_D%jy24Hy_|Yl76i?hVi}UbMi1~$ZJ?5f&a7z- z>UIEG{GG>XR0==-`nb+0!H7a*uMdI^a68k!ovh?Z3h6G1>ZiPI((Jf%-xO+ED%68D zGCG0I%gnieB^Dz<6JcxEyuqr&a3v_-N-HWVyom+nxD-3H1jsy0Fh970{{|eYgNC+P zXU%hJf`G7F?Wy7r_>lWCC<`K0zb>i0-Q#gE`*lnTj@MFcfc% z#x^S>C0?FMC-kXRc+>>Y5Qql3@Y_@!0{ZQog8AD3^c3uObU7a#>TlMTn=VnQ7XiG6 zs^}m}NG%l^#rS-sy$B+Z9GO}gJxvis1r}DK*KqCr2|t)V2W<;6&(Sy+A;G-3+RTe~ zwjuVo*!F@6H`vo#4ydbWMtbZRwQgv$lQy!z0}yMR0m*o`YP0RXO`cO*Y`xzzx`RBJ zeq`UqR;O&{V|haY(>>8xv3eQIIlk`H3(sj$c6i1H2WqrQhgL%&Ws9pUJ{T8jF;}fIpEyTWSEEWYr zL%NAwWmd7^7QS;WVY0)_c6G&-ka0hiXd05(d+4m>sczSs?ouIGfPedFPm3M!G#Vw3 z;f+yADDDKbd0q*naH9XguyY8hk6=mo<1zdz9>KsaFgmP;s^+h83|ojsoUOeS7oZsJ zjDdz9A(;3(V-VuXSFJs8YLxXX8XBhd0`)dAFos9yuuVq`44cPkSq0yFjrM#Hktk-} z+Di9ogD0e$*Z@BQf=8Wg;uHj;bCS(glv+Ramdd3=btWCa^>xSHaZ1QaBON^P2atP% z*USp=khJx{u)>4r0Bc&dsTX_2iB7I-%=Z`!W;l>PBQ%pI@kj7RlRO>=O+=HvgY|S4 z?m-m;T_6oN4mPd+?c!ohVxf64*baF3-?X_?Zd{RLY+!soju}y0N$nR+b+@00#m2A+ z^UrM2es9c2Z2SD4+7W}UqW#qgtur&nx)Tlg1C4Ce^Qzs5 zr&Hs-^O0}#4RfJFo1~Wg`RGgLwvdlYB}Xvjf{7#2x%JcfpNu{gCLj(#tmMpq?KzoQ znt&y)IRmbOfBfw8B86PMbY>scE=SpHBi`iU5s10-IFO!fgNtL@cO#)A>h<907d!K= z=9li9o>yM(_WP++OxHlW3GCw|)_TifxfN;kL~;*PQQM@d3e%XGa(UnGx1M>^3eb_7 zFACUXyYcm%{unn`CN@{1tqOM`22bYv!o?z~)^k1XgE2Xv_IccjJI{>k!Y%t}xad0c z58m`F%w1w_f>};5jshR2>BHoHl#E@%bx03refGYb)5APk^iWpdwAvC?i=u!g+<1Qt zei*Q1Vd=}G{)rz&2Dk6b_6=k*XR~bqBsCVrKqKIL*%!`|5QkBz(v5Pyj@GD~OtVHD z+o^&EQ&;pKO{7N0FY;9@{uOKeTH8JfN>LC*@665$E8Sw6ST933HSlF&Qo&dnE#9De zc(oSdv5%$}*l1%MHf})$Ng6GVW>Z_vPtBWUI!eTe%!uZ~AS*{daY#YdY5(y>G=IRF)G^&++u7{mvs$0R7Ukl_dw9 z5&W)2-sDh;uk8xU;sn&0`>5+M*EF=EO_SQooK{QB?`0X0+AZj`=Z?nK>S_*0-|N;S z{2H8lWJ~QEUBGjwCh8eu^_3 zXF8e^CSfXjcxj~g4wZcQoyCO36^1yAlL;I$-ir3d$>(pAI$?Cx4=ZzvByq|UAI0eq zS;9EtJpdG9j8enVJNbp(o;Q5VE0*F#bchPzqiCGdO6_{-4g6xZc>jUAV?fu-02OlMZ^p4E2r!NWAdqMtKuj!KwsZ%Q6z2t1 z<*~vfI0H!`o)ZT=C0`tqmqd&;^c&#hr0#{>SRP@ai-~myaXlI1Qi_0i`v8}T`%@vC ziDli_YhdKnk#TY~La~q&xvmz4-&f_WUNJw^Y@wHlWxq0bEm-E|WbT<)iPb>`{SaI5 znY|rrwIRMhBr@IP9T{<;7E&FS&MW)Hw4u(7AwlD*lj^!k z%Hqf5y6!Vp-uS)?Y2=KK-2^qUB$CL>7%Q^nTJAaMpeI5A<|V{iF*!2OZ;qVZJe}Ow z=T2+k1gnDGE#+_wD5f~|-@%^G8Vq<3F60URf|ho6zj*-DOWEw}P;HJU_zMF* z`37@`KwRcafmWW)BRGue_97g<|JZ&XpMsMV$9UhaG-310(yUyNM-M4+DS&4<21^t8 zFPV_r@Vukld(AY~(!dh^?k#It$t|vo#W%tj#X+LJyw3O5ZO%RaQl>lR8@`9M9=9_z z{|JaSqg$P%B%RL7p7M2!OP^%MRf`xq5pFMpY~y{A^6mqP+_s~lpO7h;9}tPSPGf)3 zMOevE2J!~_uEl<^xDZ)+hg|i|ShZ;V1RLS`4+F*QRgKI%&j{aCawB)|l7|npq$M@mb}e;isdEv}PL`$-vtcH7!mbQ17`n6gIRKxF~yOf4+wXW&KqvYghr@F*s@J z4H-FuW4S9l+BAojJ~FkXs*MK(>Do6L6p3;A)s1@iDBzmW{-2F*>`J;rrV{dMoQiT(8@_RjH>C930A+HdF&j6=_1ni+s`(y#d6vfJ zyzu7(gnHMpe=O{7O zX1;alt1oUahvu^8Nun68{}gnvV*U}Qv)@?Mvak|p(EWA3x(=1(m%wTkYB~WnL zHrZs^PZON(naB1h0%{{B74q6Ky@r`pT}up^cKgaK?XYM%nq~HO@arAn_QO)x(g|Ne zRp$L4>CH#?Pe&}zOi%8M@e_A<*Gc8)z~sPb^YB$yu7kA6B)xz~=z)bW9i}KS-H(8B zfwFxfR&ShEs5}~D>zF0qikF;sfB(xM|#JB zI<^k}ed42&`k9CDDx*8~(VP@Ad%^1G^f`5RN{WSOHXl4l2(YhPJ&jrSSO!qssS9_h z^VIlUZ+`Q3#vIJIRkU_{W9GK*d2w%wfr=HFI1}XPRCr`JzU*jBoTXcT`eNagU)V19lDh6%*k{Zovp+2z*cKEy(5}LOU{gg#e;le)J?k_%Q~d1} zVoh|jiX@VPv|i_8jGeOU3WW`x^s82dt|}6aQk8cFXA+?%)0h)5J7l>~qJ2OvxyF~G zpL0}f>MfwpZN$iL22%d*c;Jgs*uJsK4RNZ<^Kv8K&0JbkM+uQTWQT3L8&<@9IJMYE z`^YaHu2MIe2aTm+ec<5O-x7I##4yVS@w1RWXE}3X986y`HLAtG}w3N0^d@000xO9^0^x!6R7OtfJPbim4XI zs`)vS=J(E0crAsSG^N(XFN{kQ_OqNZ_ACWeI}0;*5b{`~Qe0xr3=xjU2YTRt;GCDv zbwl^~!f8ut9LrPfS$e5}kx-2CStQ6q=U)zXnyW7!|NY^lyg<*oyBdg@h+!4qqp)Dr zV>=!xW>h1iyDm!d($btyiC~A@U1;dh5O8xJHI3TWAtYV}vc9MmS;{9CW#;h&KJcg$ znw0km92J8jPhejAw{cbr(BFdFu=9yvbm2HYpN(k^yz-9CV>L{+Vi?e;8tX4%%ZHBe ze$L=fWRkrE?)F4J?F1VBH?2^VhZM6_kpO5w{fiW&1nA@Q9Ybo>_R^)rpY=WR4P$D} z)+Uh|7_Zr5tY$~WN3$-mI6AKP5ib;4eW0x*7Q7B8?R|IsXGev&{g3r8`&%~M$KKj> zcD#i!hb6WhS)c^!+pbRz%$w1X)JJhKiND&#<8`K4YCCn=7bI|<2-I=C&Dpv|TEIXU=b?eq_X5|&B{V38S3zp& zSM|>!p88K*8)IC&zK~~OSyT`ROJTi!?UDu&8V?;7&~fm;k>&cuV4ER-J)(^{GC*)e zdqQ@|9Qhxv0vHGBLjm$Kib%t6(JjMdBbSC)O7TJ8!q3vC&FB-flU^KAJZO1c^1(r0 z&Wj-t5@t~98pD+*@iOok-%e9kiCw^l(pwt#ie*|5VtM^Yo-C)~qWOE$GM)jT9d(~N(GDhm~7AVSS5&1f8U=4Kbr!vryPPe!GI0y{S8R&GrkgkIz zx@cN)sTkKAwjGl64iejxk!rpBnBLCA&(dO3KqfbloE(NhS23hyvP~Ya!?%T&uEit86U`nbot$|hDmTX`B*og%n zfQQeBBPneaAA*WZDbQ^SB~FY-HF=O=?^9yE@dp%)Ah)t02Z^)symBFyq^yZgqdX;e zmM@Ph1$)bE96|bdlumXoz-(du@Q9|`8DaZp(Gprx*}l(Q^83p>zamWC>6)T4J!t5O zdfjm9E*U%hm_ZnH(Il3iN^j-vIZodh-lB|v6bHNHGWG}1zb$94S*-ojh8is?26Kmzrth-Ny>SO!|ihTWfdm6~lwU%(qWvW_eAPKmeM^SKN8a zJ-3=x;i3x#*}1V;xq;qt%L}AQgN*{C*mSg&sW2?Hpj50WEv4acbBr9{A)}srCr&VBQ}cgd>>_;v^cPQA_RdP;bCNef`cP>f>*;c#^E(a zV|7syh{eg8xywH@9PU{b?8xoBTjCm-g`RSLh1~A(APYM?TS8pc4X#PB2z;a;DY>vsI6va7#Hu;eLt8$9}p6N3EO` z&~_l*;hzH>;6BnU2}afwW84c`_L}uC$QRTl`SKQM5L=`GU=@ttWms&5y7q6I6};7L zgeqs2a1um2q7`50P4KIq`JN7V>dVvVd#JhJQMgqM4wP6CcIuM;D0~A^BU3-8!zJMs z4uaA(hiYIA?m)wKo5SEYFSFn!e2sbssz!c8#YI5vEmJ{9JA3aMq<@4rmRI15ml*em zZa?V9Mx2k-)EXK!?g0n%>pA$6%iyTSz_09W>-N!iTl#Rjmt3GEw*QU|<2N#b_&SX; zfDZ~dl`GY9zrSjbd&RWw$^I==!KWexP0X#4;2it@>JC5AP{Z~+{Shc((AE-+M=bag z>l4-|H$mSfa|+b+JI5tC(fvWWUsi7YOK@6nsXGFg$shZI?Zp8cFDc-|N?mvawq#h} z0J&bFsSs4iinY3IH#B=4u{}n;SmL;{sLWfgCabtmk6E&5J#eUFF%QXgj-pIFSqfy* zc08WLysfdRWuHDsV>)*OhXE6E@3V}VLw2l+*s$$J$>_lnGtr#(ej&sq)bw^77%8BQ zaMR^p^UjukEzw0Es<)5F#>yz_@2oS0v@OPpNht9u6CPNIhI&Dhb3o9>_p7#S5`094~L z3fY1o@!NR%nw)pY1Elu`b&$KzAz_MGxmMfhh(91sUXN%V4$x;ax|xuctV!tUFo)f8 z9rzUEQKJBebWw>v0JQX8en%% zt!g;@xQTzi7M&r+1(E1mwW#u}OGxnC-(r!384Q< z+fV?@*dTYCkZ%fQ`9Vn99IlWqj>dHy%^>q!TD?;14=^x{XRCvei>Bor#T@BN(q+C1 zGq1Xx2w0%77j(wmM$xN|ms?w3SMby$DzI^x47{3ggZPE>0%XE@C2ufM;({#3my7k# z4#ith<#te!H}?mFx7dNcucRFuZ7qnCFczkrA8pYoydZ%9YN7Yhg8k##cXr|cLvu1V zn5KAGsLi$F__nMQsY8#jUGBf_-8h>6l`Wk8+>QnBWze5!w{0nrp%GgCEnj4-_-}gZ zUq1wGdb@=ML_^8)&sVvK(;+3cXuWQ^f(`N_MaskayzYfN?^*G#$2>9eYzZRodNpWf zN-!))fcMT7T`v%1U6wv*li4g1WZj%tG0sd3wT{g_ArI_`YVhv*lX|Py;@jYccP@@cOjyLV>IgT-^uf@5NW89Sf0jx znVnZ`RJD3Zopc_VC)%fD=B{8N$4KMgy!IQRDXkmL4q_oE%e!)Plj2W(J zXcZO(gR^85aOoO4LSa;!>F3lc-bWL%YP7SC`=BFNYroum|8?gh2W2za-jJsuwS}+i zk6u?XB0%Ki6+qaH)+9E*0~hv^g%UOEAsVuDN3st9Y7C#2%3czPQ?N2|h4?sWXblx5 zcgb2e8FoVlYt4Uoi5#lW52+;BMjwoeJNQ>QRG$C(Ktb{Bbpc?)<0)YQL&Iz3h!pBy zu#i3*D877QMsfLCn_3P$jBxp;ySZaT2BGK;{Kg!LyedAKIkU39NYTMa6%v6o1#RHb z+Ah8>KX%FLsy(sJE|7oD1?`6-_@ZFoO!yVNj8qhcg(&YedLcA}xj4MNQ8!%ftO54M zaIYjw5TR=OVWFZcl1w?24Zvh!+ zefarXH_l*3?$r>^#=F11vw>RP1u7m89irMkDqvEZrnEALk=KEwYAIfpo%k+Ss<#0- zJ(|btQfIVo`W9cO@m5}aA)=FS z@=bV$kQN<3q8)O+9Za4AT3K|ZfOPfR|f#>B#7YIk`i*a{16=UE$TDM#A-e5o)9#3l?d$2=$7duz1X=xyR<+z}^=kTP z_qiaObesZf#0F5L$fZndqdqss`ch5wt+g`|yI8s;d^O8@ISlZgce{7nqIfvI0K!2- z^Gu%v`N}kV#w4i@g_Nw^O%%(P9PZ;{PY|=eyeM?lSZjx31%GYSAt>QjT?y91uHgBwu{<~V>wPMP2ydC!eYK0j&f^*FM-Yu&X9q1U#Utoy`e~+>H|~6o}*&9dz?IcCro@!&VuH4??3{JnxU0D z?cF$PckF^kV2hD1YFx}0?k8!1dZa1Vfrw1NM3Y|}raAyyDCKmS5+ZLdvePV?sNE3^ z(+!+FOz*yG!g(JsKj?%fx+wh6mkziQ5ugQIjInR~n01mmLjXtXLDXux z#1#^XegM&!=kR8CG*HlWoth_2+J<-=M8Zn!8}RXn)W{@rn?h^G>~h?Daz@**Pt z+?(5N%`re=;9m^2;1!JfKMKrFb`}w*0Y!*{XSrr59au?TR@Ho{!Oxz56~MIL2U=M_ zy0kj7q;}0hUP_&jbu23No=2@d`-f;z3n@@bd<-`O_nk)1OK0bg+K;w^RI-vR3hg8W zV3z;A*u-MIzlEatn+Ql%5zHjTa34u1wN(*h^4WD;9_@-)gl-!m`G%bk%r9mH`TDBp z_rU$>Ew5h(0oh!)Vh-6=KO;98D^YOKFJho>i-(evIMo$GpRR~9^p|}z-xwEra?%E6 zVs*-uED=Ul9jbUV!aN!l4U*zU8b6ZJ@m8AKXJSZ^`Rr&aOxLZETy^YkdTwwC+DMmd zrB3$F$2Hl25q}o&p-npf7&u9qmMkP*#g7ETp&QkQJ8b8wQTry_AoKqxR#GDO&%=ar zW7bB~aB(G;&R&}CI+!8Ysj(R81+^YS=VJ_vdpzb?NsEo zvemd_yL@YSM4}e&@>;%E#z$#`LMlA=In)C?cokxM{aAwDCaK>3BUz-6sDXTm{FGpH zfk6V@cuCHT?vx`-b&m%8>;^XMqId=~<$C@-C(|w_XMppBqSiQp5RQx4v{?0@^Rhx8 z+@tD%Hs=zO;>8MIJeOHf#_4y?!t2*;8%1B@uW|K&;x|6+JI-}Ny1Ft6VTJ;i*HPmN zcfsyk-@kwpRQ>6M2{mRaMkVfHx#=y#3gjU1p9IFPc5!9OM$qy*3HtQiH6-w2;F(Va z$we~AHl~M0VSX6Te@$8U1jFj%1&C{qc}Ik{GGq8OL7)nD%fgb*FpknLh?u= z@sZkNsE}(Mn9rkpT)y&PjsXtiA$P?A;r9Kb^Fw^OR+%4dal>YL$UpSE9K~*6Jky;V znQOKOXUM`f>60-8NpJfg^(@-8@Mr=8!=A<;)BH=FD!;GF8p)=RxN0cK8VM(5u(L|o8p^eOrmF1p zW}eWEqRE>XFE6BP$CL#3{CF5!r@|YK)bN&Xl#r2;X4@|3 zf~>TrHkkoUY(Ysf!D4872s-tiWIj(FI-9v6EHqR}MwtRc!w7WNORnJ!ezw+G(;Qna z{V1zONR58|MUCl$)|LO@8Ibd28jQiW7ZN7E>gml3>Q;9X{n*msL{!VUSC1Rrdk zxhFXVu;9RY?HJe6l#EuX8A3&Zff}&_`5xz7pVFedWF}kNIsYVQ2an|97)?*1MQE)jw)BP~FOy5#m>!#HCyd zB8l+VEnOJA63-0Q;Au8F<#aw(!dv>CU(Z{E9Z1LMFhAStF|Oh2F&0c59I&7F6SP$u z2IQccBYr}shUs;9I2x}av}~}paZiY!Ata1*m5!h#sX`goN=sC^Y?8WpSTco`o&m2U z=04q%T1ct(l}4dRt1!q!#b_o}bB`pb!|Ql3F4o26`Q>Qw#v&Q5=^_un#}i{j%JN&m z*&_&h)lMcd3z+5QCPBg$|0QvuQFMe&{WHv$vLFJ@9G@G+{}{>3%?pA8r@M3%Z8&Ci z5W!T*wE&^`tp<-?ImBicf25&vLTEU`C)nn=;b54{!hjGMf|b>X4Ne$};Gpn4f_-oH zTNxJt58x{CaEP2V!VwidY$rH2rl>Q8VUJVssNqG_3%+)etcL8ziU6tKRxNr;T3qT* zvCV!BjJdNS*Y9>5`;_9H_+Im;{04pFvm_DTBGXU)^}of>F@7k%4A*)r9`7!0pZdAQ zGicF+c{LGW#f&id{tk4_V34|jiW!{vwWj%>#>hPJAo$HbwWnCj`uiJN8|J4);y{0J zwbjl(`}HC5y!MY%_Q{2R@}yshRugy%1E@kdQmh;4*XaRySnphrR^@#Nk~}h#V?GUz zKMF6gT1_}We8KWT8I;b=tOD9QkWOQeC(_^~mak+S{P3_cYdQ}p>Or(`M+su<#XEaf z%6DN%Zf4B=uiWrg$*p^C4OQXp!SPMb4tqd{&gXAkYSXK_skS+qQDM_>H=3^$E#*VSFI4(#K@Dz}9L9cy&rGzzS&z9c)vd+3Bn4cD}FK@-VT3zG!b z!Xl%l28iYo{GIg+Hs>rD+ArK6|dE z-@)Xmsx@0#-TCY+MrzLNd+(dI05vN!kLdEZ2+Co49iHgMhs$CvH%w~)8<<;rc8X*{ zHL@pylEr_>114FiB3xR^lgrrhw;p@efp05ot&((DH6oyIBx0}*&+zXv(dyU6+}-id zOO2MTJL3^R;BVpNR~+@tXQgP*%^*V*~k7nkPfy+_W0m3bKkQOt~^&gc6jlJq5NC99Ym|9}oFd-sS zD}D)g^~Nx0x)_c8D|oQIX$!ih%aWK%H_N-IEYu+7Z9qysoAI$y?4h>_gKz#Q+n>5m zIui}jO}~?$;ElO8l@=aR;)3ZpTV11mR*iVSC#0TkEh|1IW@eq; z`KW8sc3DvS7bHiSQ-<<*Q@JZFqxDIa*}+w7J>r)6GyY9?$itnk>=jvc1M&A!p}kl5 zITcqI{VbtJ7zT~^>UD#9n~f~qH_smi1!R5V4Ik>mEe{%S-mP8SC`5*w@xB54o3rSc zq50#VAl22wjUE2_Di3=3gs-T#kZF(gRYDQ-L}ski)LYDS)$C_$luz7sXoH{;*Nn9_ zZqyML`zK2J!ONqB2H=P4QqbK_f(0Wt#84D1J_PWU<9SMveAU4PHZI}6uKe#Z8a{x% zP;#XH(9kl+^MILtidR{&L!U=RoBUGwSpyql)Xn`&U3oB)x7upej^JHHs|0hI`NC^cYCg;A3Ez;_ZjYWk${@v z+CD)Ul_etS0Drj#X6#NSASoMSaeiVNSWeNIjAZil7O@FTozBI;oOGUN7Z4v=Yc9GN z4_=~$dqH3N^9omcxPxl$_t!u3} zT{1nakvY9zf6xtkSSQ**AgOI69DZd>jL)CurUeZ8T@`D+>IK~~Dv?d5@*lJxtmPqtY@jgITU=GcM5PSTycrcBd)EECz9L|JmWKM!x7{>m_j=zmzw> z4jg|eGM+h@2cm)YV@@RmhP|J9y;OQT6w7`Ecu*~f$=~$R*K(=$Cn1XOxm{O3YbduA zec6!B0uc=&ep+B&Z*QRhN06@dX2eALh#f=zqdGywcS^RaAV!xXa-Fw+>WkAJSZqFd zDX;=YaEoMUlWWoIC&IEv#`k5LDsrOFCv6&dq)kx;xtC4n_9)B)bLHuBIMsjk$DF1y zzf3bamYh>{2BNtN2I^lipjR*-?x~zOqfsk*mendRP(|(HgQM|JnTRA~(FDkVXBz&v zU>F?IhY^mnbh^-Mgf9+P!J!TM(8qL{nEYy7e0z)QGsh= zMW~9ioOCNnWlGBJEGFfE1{|^8lgF<@Qo$Ce1{T2PFs(X%xf&))Xx)0l{4CxIh{l$* z$$#KWdarIT$zP?=Z_52>qSXAf_lIC9(vm-hH|L#;tPMWj&!uS`o*H9@R(-Jc2PLM# z@Ok(Uln|UUn}tMy^cp}1;QFK6F1#O(qKImM;dZtO*AJH=+bhCMjyGLfADwiVCik)8 zlh}gSfPrGB*!uAoWNn{Gmo#tVo3>?sf>btCb~_=1A>N}+(0AjTZwq@dGTetRr|vgK zo6inV1U+_h^FLX6L@!f=nNhlV$JPQ5EwS^{gI=?{HJL;d3*?8mtJn@cXIxLMqBGxb@IGfdUN^d? zgJO;UNN&)h>k~Nw&L=DSmQAg-rzd$jT3yCzq_Yy*U#@Hg>arE4HYM9^uj`FXwQ}QA zch(eP{z|(ZNnaU{Tt9QMq^)7}+D>o-k*JxBDd^x@LKHNOp_}H&=xkgE+)zLCWQb|| zCV#$6AMT)KJt$T@CwJVw-hR=U+iVJcb4G?*;e&~M?KVyqWmE7z9K!IZ!eh=8`KFqcJ#5+TJ?#QfVUU6nS zvc-PynQr~b{+Kxnjl$Tf$Jh(KLYd%g9{lpY01V`6#D`WN+yPDQI%=bTVtOR=rD!y! zqKi!3`3-pSk#DEPp$=%Fal%m8)^UIq*ulm2^P5XHmQD7pe{?82_hgCiitZr2 zu6U+2b|j&3v@f=^?Rs)9EjC<6dRLNcoi3uG_Sf3`OKv@I8`GXZ=XNDFT}f@Uk6Nrf zMClQ~^yG>`KO;{hm0VF|?8j_IowwH(o;Z&7+LLbbZj58yj@VlE*0p&>3!c7?&jN8; zjyhh$0f(exxjN1&AEn9$L*K(jP5jJ{b&#NSaUYYfQ%fE?3J&#!6uS(#q?0Kfe~XdK z(?8%>Z|zo4U%yEMc|xjskNYkp*Vj|BVV#!x{t1B}DMD_+mc1@My8XwHR434|(x*AF zAp#;w0sEF~^Z`A-9rr}(IVq7`mUvB0a&dXJX$LHxK8wEAVNS6AntE@0S=xGe*)`Vl zlVhFoIR1mm>^l$z#sTxFMV_b@?erE%6i!A^YrVD=$imQZ%_Su zw0oI@q%FP|RmfR^K};Yt8g*!7;rS(`=8oXSb-HwZ+>iQ&mR-~=+%v#Jlo^Fl;uYOf znME6t_&U{hcVBm-Bkzi(oGiNx#Zl_B=Sm>!6hrUDsPx=V6sYc#b?3^T_>STNCdV}G z(vFAcb+toufWGwEXbKvT^8AN&V`oWBV^)}W`SAw2TJ^8MU=aQMg!X2H?9AfW8sM-r zh+rW7`~>!L2-r%9p|k;lsYCptc5~v`Qovw|L;10Lb7c0fetWn61NpR`MsP z=ftq!N0o_jwK04>91w5k{|i_Hhq8tTM(yDzvUdsExrrY5@!fDhbYEZw1d1H^)xkL@ zc$X1f3T7MOor4Ah^8a4qb4~!M&?R8kif7j%V%JJ!$G6hTHaZjvibfJ=l@U_Ik2mrc z3i5^*f94lj1B*Ap`~QF|T|$>9f|W;Jcmt_rE5$mjC_@69+gHHXI0$1(SHm4Bx4Pf8h*NAO(|HJz?nUuNYxC zkbnkBLX!kICr$iiQ&68ucu+Osz)Ol)PixR^H%Y?Hw$Ll4bVBXC(4InKkfb!Q1+#eB zywI3JBC#Y*kn1j?`wNW_Xr=IkUNiiiU?ehc6MWke;l2XY{&uU_jyKf4XRBC`D^xxl zO#)97e2;77k!P!qh}~=Y5J3JSO@<87T&J+W4Jx7I0->>t#_!C9@4Gj_)h!Z@%A?iJ zSj~$!!;)4mXO}Wkm8?r37p-{C5~3x{ZNbCWx()5f&&Di@fz<3`S*n*sRNe&)EJ2+`x86LAVj#-BP6%%rNRSv!S$XXV;X$Y=?MH}HU2klnGf2zRf<1r_A z&%v)%#Mdbc3Uy*qY%If{R>#k23Yuk!EVR)M$heBTbcD{G;fj}ff@fdHJN*a3u+?Le zh%N}aCUD0qFA3xdMFpa92Qts%yV7w9QLld2A9q0JMa<>hG-%{YYJnZcf9KbSoQEVX zijr3ld@5z`HJyW0%M-gKfa(`O&5L1#a%S<5-=KwL`hH6h|Ct~VMlsYezBRBwBRuFJ zRr9#t+x7jS6F?Z@QOEGr@qzZ~Fo=D}`Honi6?6uFU4vi17HA&>i+FbJzlX^5;q!%xwy}y^xM~vi)Ch3CJqm=_d``l0j_6g0N20N|52YFVt>8IO4}9Rk7x357tr&=6c|(d#~7>8$CrsAOMW@_Bi?c>amh@Ws z^~>m*^ZC~8GuSO@Uy&+xu=n_?_mk(zG})s1y~4pmgR`2ON_B?PwAr-kGx+u9lN!zc zis^akrAtq>TQ>QJ_baQ5U5_s9bQ;h5#Ra=AK+R~`;W&xGePou#8PJ4_7SOcAPogpS z1nk`1vw^F@x@_z140l5Gx9U>z{A8ai2)cVBYxJU3R9Z%f;s0 z=srT`gJM+Z3_V9yT&}p;uGfSv^;X?-@Yo7iG=xtf@;tY5YeaC8T5@!4(aCLG>#N#yDB{Q`U6KGXtz1NN4r>Wq;l+C*BCX(JI%VqotINvZhY4#Ij9)lk&csZ;R+YI4yzZEeJ9A{p_O13GBR zaP8?hpKBnTvJuPx$|g6of|bfzRqKA{jy~y7c?|F2qi)-C?c_wo4w1E!9s&TYeq=Yx zG}hB9dthmjG=*$eHNT(8lC5Po>pjbJz?&e_X5@Af^Mavr{!N>;zRPpDR@))#n6$h} z(38!p%q%{(A_ya93c`sKZY`cu@T8Ce$}@U|ia$;6iAx-}AiRIs-L7LoX2R4}8&o(s z!EsMyUY8wA`LCk<*FLY+`iJ`gcmbJ(CU5sP5x@_-Phi(0GmlThXiTAATtFShCr#L5 z0ZxY^g4i%=vi?9%Ir`)sX8_f{VJwk-7W4q0VU*!QgOYbLg*FFEj-Q_;%&BSCT7AO( z&~)@4qSXWB_Wd+2sxF%*FIqe;S6UQ%pdR>MT^_T2{!sCd(W#vYhnMeNb?F~~j4jNi zgB17ms3(=|5AFrPNU%K*;3N_Ddkj{fK~pB-Zt2s9*b;!qVdf>nXQ8vVN=ZhSKZ~Ng z3aJMb-l#bL&4T5++rda9C_JK*J!Lfx|Lz2O(V|-gd2;K@({Q-r( zOksoUZEE6C%o+xq(3pwZ)tvO0%nauQ?}xng1qB@i?d-#&9m!MGGjJO`{qvEWY!Tr2 zw+V0eK^dQX7f~LXz9KK zHylK4cRP|g2l{0oRLS|s{}Xt95fwr$ z8Re*OBrFj;)b{^Paq<;U5pnU; zzJtc62bM|4ow>o97(mDq4QK({5~Vs8tjs{K7R$i^p!SGW__q{x12;R#?RZ}TG2hjd>qpIRqpCmiPYO?Rov* z`0UF6489PLPx${Y&&p?;{(t54?3@4pSA4$Zf4=2^zU6rxC7z!!P9*> z9(dCe`=omMx?HQ)PAaFb0VK~;2`bePEm(kq=X2k_o!V^S40y;=I6M}0^Kb9P{^1eh zY>Ml+K-OfwsPYF%uUdr>s85j*KEH+@Z9KHlT!R4~I)e!t75LZU1&N?#aT<%cGbn%- zdIJcO6JseBLso?qs~2qa{JB+(7_zr)bdf0}jaHNxW2V4%wVN zAF)G=)88?ojjUkCgce4{?fE?fjEu5;d$+K{CZPudEx~_@8uEcd=qp-Q=5lgc)X(;E z#)F1Qu!9(}EvrxneM}xUdVX=&8s`#xa?Mh+`MH_YIQ|Qxu|eV{rd2hdeb4V6ioX|2 z73Ctjen#S!PW0V?Uo&RJ`tyCPobfBbxU~hV=-j!rvjXp6835Ffq>d%_^|&5?4H?x< zvr4{uy!F694!xPP`TjCZJsMZc!H~=%`|j<=U~{R3Ghl_Y$w`HC7)~4amwDwk>E3>q z-`i->(p}?i5*)%dJbci!5Eb>gM_jP>4Uv2kns?^xg+ z>-seoHPZ2<{tq1~eppK9NMahW*B_Vf$z_|*G<_}}LHe~1LX#eaXr2bSDYOhvBi;75Z?|CX(U z;CNym97ylM8@C{)F`;BF759U69*M_@_T+fX;*>%BcgzkB1l1CIy{00xIN4Go%)jtJ z0K$y7zaIXrFu%JU+JQZE{o=2OtaJtb-oe3&y*05dqubZTuv1ZwR&0k3aN(ZeaP=sB z_+q?g7 z@BY8N```KQfAhV6^v-|J_xn$&$j8MAf0e(8(vc(f-8xNlC2ObEVxq3?&+QW^3(~1e zc)%Y*$wrnFNH4s>U0grBbQ$z}lK~%DDi6xrR5!Ati)t{KyYujAJm{vZNT#exmf5xX zh9nk70VQ=6<(LYE!a6~)N@9$H5S1 zrn^!-XEz+cheIFqm}47=;DhJi0ori=g;nwQ>{YRtv#aK5 zKMfc8ctZh*o(&c?wLgXjR@U4O#;YwYu|UV0N$kPc$t>Xp`=gar9=>27#;gqIHoTQR z!E#k(Lbs#GJRqHPfV>r#bP*fJQMuXfz<>WQ5I;f5VBYN6HJ+E$QkwAxFv;t_x6mSSQr_&y=;ZaIf_ zf{p-1&_}R2bHHqOw$6iXeyoTiPm67EjHicFw!%5GVA2P7$*CDW&Yw&c-{7F0w^Zi6-Tr=^6YpS(s?)%$8HA8|j!S=~AO>fu2EJTwb-2J_gN5MmAc7 z<5+2@pc|5D$wt@WGGJ9Wg`@Hk zXMZLM?CSaoAvZg$N@`cXwnRZ}OT5GB!AN3fT~tjL$y!5tzb-mUQB;NAy5u}rVgPvX zx0S%AcC_kxH*_d>PkXnonb1k8A%|}qH@c}yEuOZBOX2Hf8LGTWjf8KQ*{D!UR^ayG ziTumdP>o)q=xi6+%H}j}ca2v$O;+jY-S^3%rDjYpxB+@9e4Q-RB-7|gQX@GpskLo% zRYBI0#p&fuPb(N5UM1Ckr7H@&Oh^(*bzcz0zAlK@y3mmOMzY%0O!3W|a)V1ivf9g| z74896L@3~_!78gU&*LQt)Q)yGjvR;#5lRV2X03Qe&hrNn_Js>bN`BU;TzP$z2hdTU zIg%cQ@y@M1U+_Jd+^^?5H@t_fSrFBXVN}aUcv2~`ibh$jq3{w~M{Ys6$yOADU4&i%I}mGfN{Vj{11YI;=Zw7e5#;!2fWTDt~? z>L+W(^A+AV>fBY^iT8pA z%|cwGr z^UuO_9v9$nyVDlH+(wYC;ND^rUZ7vx(3)|IGsq3NvB?@WwU{7R7-%jbXD8)4%tdV6 zzb{`KY?@n)C3uy`lgPtlUSraK)juU@L1Jadv|Xp}4^_3TF{p&;nh+?{F;-sAWr{ zu`uTc<&eyonf|-?AAZBse#eIA)bfX?+3UzW;esun)=W%zcWzr`RvszQqHf$W4^z-2 zU9R=q5wSD%HXL}!xD1y(7zv+_+i=7mCwdWJdo$?5qbGm~>_?_*#HxqTMV<(4N`^RP zgLnQZ`)E2Iv0LW(N5>XUyXo+bm`L-_UYy_@8s_~>O{4`5fgdxwX~<(VRBWr3(C1*L z0!76CfQTV7U^NYo_^p?%&Rg|Rua}@!V(V`1P3E*vjf>fUGJr|GZfG6Rf}R)z9N`!{=;@yQc#P7tm?IPsHQYPvTRnA{j@yDi^K;BRfd(Gy*-k?o>)DIO`PUHS{7XxM zxWBL<8I7+Y2OTrZ6WMT>Zg1;4IGrthzk$xyRnCY1ZQ|~ksMci?=|j$|Jh`iGKNPfB zI23rGp8BF>&iAA94Bxp%=F7Ox2gw}JgML|Y&cA{@IY0X4#L2nRXGyd9?CA6$F`$TW zZ-);EzcCT+;dLLtdWb$N;yi@8ZI*sd4`a-4={!YG&oU&vOklkh2N=Ewp2W#YobIseB%Ab)SS<8z5)F8QpZf)ToX-}_li>)T zKN(J9$dln4XCzyx?VUOm>_?(~4yK|o&&IK(&!41@Vy8bZ12imU4~1BV(TTM!AsvVh z^Dt-rBjwRbE?RV>84JAoY#W%yRMwx``cNM1JM*tZz{FpOc0f*w8vA;TfY`BT@l@hbbfIb2E)bMF8={>n}*yHG) zP_=ERHRuDfcYZ+r%rx-;?3u~o0l6!d_S=67x>hRhaf|rNnK(ZX7hBlay+`sz_V%6y zKetc*S~kuP%EtyqcJ_h?;Nt+!^T1p@*XJIhQx4&)56#Cjef(c%8-;a)FJK#we3f}d zSyAt)1zfi`eqvSH$G#}-P^Wd{2c$}E_mb<2a8cJHG{ zMSMnK-R)BD(tD2!x=U9+WjTD0k$j-<0>uUJ=d9@O=Z|IwSQ3X&tG4QeUu(;t`zIh zY-+{qdTW7b6VsN3K)LF*wkq~mrE8d1S53ae{?IX-+}yEf8bgc4k|o~Q^Swl##@x1G zAVc|HF*T25w~37EtnP-e7^a1 zr=sOwuwXfIzoq`qSE>K~?uQQ_-md-r&)c)}m-;_nwsf4m1}jC?5tR}I00#vH<}jf@~q-Fiv=sxJ4yo>Y*VUrl*QhM%K$N9frV;H zJc@$H%f)})YC&WK_|t!lnk$Mfb?epA$07o6!HxDao`@&m^^~pXWNEHsH)3<#YSVT_ zC99mUK_c;pGgB$tp1&I<1suB^%3Uj`Uo0O!um?`9`e>bW30Ev`qAkF~dZ4shBsJMfE4a<~{MC~T0`Kbm2Re^}(hvkw}gg7&>h==PX zq0SA6fivpX>rTzJ&a@6nprcau98{p*Ty^{Hs%mil{@kb$)^kP>y&5&^9Q37`td$21 za5|0p5gr&kv91^3j89KbcPjWq<(~d`_vMR+5sH7J>h=*acl;e?@Uno5`XTDw5Q=}- zco0g>WOP@fPYu< zTElA{uMNC5@!G~~M_emc_;>det)IOr{et&>ygGPw@k)3J`jfbpOL#5g73r0cUb&v( zDkIJE1zwSI`4X>4xoqRLi&vyqMtWtWS03W^O5ys5_ei;dlq(gyBIOFoSV4Lfq*pX`+ss z2-!plnnag*>;A=N9%r z8#UENO|`K%+K8o%619<+Hp<>cKH7r}R~!4jjkr39rGxD|C}Rit>L6bo#MME0JIGxJ zx$CGg)ImNwD1QfOc93QVX?9R|9i-Pm2|C!z9iokL*rg1Yja=BM9UJ@GMqX@`%SJA2 z)T515ZKP)-4I6QFRX_Gnt{&p*A+8?c>Y-dcl&gmrdni{A9RAkG%Aeeji~ReCuGJI4F&SI(2FpE(f`AkP8Rpa&Tlg$dQ8_ImnTN963nCp%H>Q zb%qKTa^#@oE>d%mnv3$fNXbP?F4Az3hKtx;#O|tobdj=)bX=t4Vz0R2LBMNU2FhMq70p+49ey)vS*~ky>OG>z!su65D^NR+if7 zcYGvj4u;o9>!C|jINkd4UvGaq7VDHxtB_HMelq;Y_y>13MZmrcffW5*83a*(C2|v` zKE=U-3N@uhm!Ju(PmRa`O9L4VDKwU4JS3$yDbn>RBnnS0V^<9gsa&UsNiMid{nPjHDnZBVd=pB;^8?t_+lF1Xh|9 z`nm*tAp<7G#tRuP>0zG&>i~tU^km2+$d5gRkW^BobfkKTjjFZ`p2%;tiyEzxHP{b}3@?QL!y*-nvpjpz@KxN;3GO4%?L2wJA$$Q+m*D$;d22FhRQ5=k39-ItoiL z8HXu&Ql{3aQdq9aSWE%9Me&)!d`CuG5hA5~D^V1u;Mj3xOr}6gs_e97Sf&_Vm4TTM z)?{c_L$A}70U9N@DYdjI!?WwCC!6v$yGfzDjU3vfJe%UH-B*c+-ITE!Uvw##=+Wry z5#HWM3f8ua))b;k6t8JmIz1ibD>7`O1U-ksJ&D|FQ`qjyxJ`kD25G-b|B)X0S1JW@ zDED{BUpgOU45v_hRU@NE{W|0-913R+WqHm}hH)M5shgadjOGM3knx-_Q9kB;q=#2B zo|ou9^6jpgXt?CDT^hFTCB^g>g>T9r-GL15^dBXG?m)(NYCcd|gnLC`M%jU2WJ_0v==v*vHb@4#y`=~&;~^JvVx-?hl)Fb2L+ z;tL+#^I3RnkQ7Q_(=gWe!OUk<9?#Vi?$5k*p>EUY2HIP77Ki$oKVt@qWj2qP7Z^>_ zVCrdvf$@$<3!@Xt0LeY8%Az!mna?!Y(D!Z)3K6^ae1jfaFfGG8O-%XITb@|W*asEp zhe>?L3^j0HkTh-~^HhBefSSchI0<9xsKo&$m>o;Rv3?D`eqy&dTe$T*i$do6%^AhM?Q;bTO0GaQbx1kqlq+xio#?{>O4SB%MLOsCX zWnhTshl{ac=pl?Bt8bWX#W1%DTXJj2qp3zdk6^?>Zxl3MSuG6(SMK>_z9w!1jDZC! zwOsPMHxAQ88BUc43l`m|+i>9p24C6zx*ALVj2q@zo1|d!k-8OMz>K%E)iTL$u0(mY zNDN4DYZ@f-l8CEYXK5IFEtz}aQlqPTfvJYN_q&p(&iotkF6%7osKb0QIOAjGxxGmg z1{|E@iB;!Q9^qaLC&5os;kCvTg}m73;=|uW^@}66wsaVa5*}Db)ieS9i@IuxRD+GR zNl3Ta0t=spY7jOeZjJirJN?Uw56;BkLzi+aFWl=U?7(3w=jfceuRWoS8t;G&006oL!Uh?%EH#6=o_ z<5dHu8BEDo)Psnd+HJ-WfQ|K;LFCLAxF!LyfM=ns)UO$ z(&5cvVi>f%B#E&TY*F=4wGClVpO|jD$HS%1zmGSGC!sgJN$;SOG>0p2YQNJ{ZhLc;9=vent2XsD}g!(pM=AAzcZ#S#11MX$U;)!+<9TvrNQGcbN zzz&=6sp+@DcdB0Rz))NmI7ArrP0)!Rw{{qbJuv||$4GdtbwUy3Xx<+w*H2Oy7N&B5 zKoY}XVTr*_!txEg)WGRay<2YHvpdZ_|Lhs+f_JOfq;)Txq`{93Bhc`gHovnf%+G7b z_8dTa?9y+E4}0zJriyyX%e#TxV`Hyr?61{*Y#dLDEnCl@WW z?CY`C^O6bkqP4-?OL>%pB1sB0B_C1;u$xV8vVyE@9f-(iHTuU zF3guG)>I(kh4Ff3&UA7}7LJ*T@JN~Acv|~zs3!#OoaITe-@UwjyWtHtOiS=0X0bUC zv4=?O#sycYZ#)Q|uiGLAHc@b8n=UBJn=+3%fnBWS+Sp z5)5v{6jIS0%uEB8&14?jfu4`7ZkqTjanQY>;2f-a7^UVI8{Ch1UUL`VWpIDs(NIKT z=x$N>n6Mmc!x82^1cMP3TC&8FvSick48a`l!ILQdhaRM&YOI}DGW**0dT{ET>UTT| zbSgSz0c5I5&*ImJJu4^`<&Jb%ph-*5(W;d)NSn8^qcU z;Wbv>=@>~Qj|>3nsWKCx-sg+La|-deYhKpNn%B#k*UOq$cK5R8^|I#mvgY-&=0*1} zYhDEle_8XgUe>%`*1Tlv|D$VOZ~g|63f%D+IMbD@#a3+ked1F6#40%_R&8)%*`*V! zTLFS4Ji1BhhSxalqm?eikEx0!SBXw2N%xp|gRD_s(c9C<&O;S`hj8ss6dk%5=&L-` zptSx(-4sK2NCSOH(vmZC$ayE0i-Wx@}HbdmCDF^9n;wv{+ z>TA5ziyUpXXA_r6e;uPKBf*$g&6jPAwIalS*!%X!G;XEQ{u=%Ym8P*x&D*coby{MR zgme7hf}JKeNy!=(vo)}Eck$yixqthe8A-d+K47s)oAZ6)oW`&#jYgxqlpdTE88lZxog`t53ohX?Q8M@QDg5N|7kO>iDQs4rs4J ziIF@r#x90l2~vfx1M0s~YR1bil~PbMaw&=*1YMdQ<{<3_si!GBL+^rek&4wwtuXPN zJ$i_jvw1NLSfS>tW}iL@0PJVFq)p}VBSN8rHb_YrvK-Q9`WFDh@<$7#o(h|T`oPNy z2vitbJvw5)1n}4{Bm6#RGC{l#apP-9i32bqmFc<|a4IhBTwFX5&>;q%H`y%~Z*Fc1 zBhdEqhSMEb*Jhz>kBUHN?cUtc#bh|MEw{=p!v^FFK7AyuKZf+x47j*Q1IQ zsLR5r?0f#}kvYQ55KpY}IxDTqt8La8@3F};*0|tW<4)fgS)hvht!O~HlRE@L1$m|h zLS4WUNQieT>`T(2O-h%s8p4(3)(|hhtoqRbE4^EbFOSrVeF1cge}Q}z|E82sq0xaE zP;WI3UY)kjls*c61r!9YGYpRr9k#96=`^@qb<8+5{0LMvfRj zlqrP=OahSuM&$~I6>x*m7od<6FL?}78cRZsD99xEC(!sB`+h%GmgmcoG=esSC$s?H zL=!i7?8#OM%3opbBhd!0^3MQ0&VlML5O~^nxEwOQADg$H);I<{^E)CiS<}{y(jG+z z#0WLZ88w-_$ghgksA!K?l+RyS{;Ta1B(?o@D!JzeL`(|CL^SB|04uMzI*m4k$65`R z&}&~jQR*g6Qrsl3S}-1^J!WAXtS$Ka(@*LcBXhyJ=yKWe&ibIf)Q3er`5c{SWtwF~ z6p3ZCRd3c>_0CznRX;pcFwMoHN`YjqxAM;HcOJgv_4NX@dWSt>7Bv*OoW zw9RUon(<>&iHwN~*!n<4m9_~$;&_JY{*E~H`?CJ$7#|~Dl~c9Ez}OMUYaYLi9f)j3 zb)FC_tG`4Gpm>9)SJ$kp7Z4GVXBEL5gt5TYRE24qFU@a0RD>*W@!)Iilj$h_)rsl3 z6VvR)zdf`;GlfM7bN<95E{OViEB^hF-KB0f4graSMk4{gZWrCF?pVv{p*2n~6pUnK zOpgrb(wsfAdXWg8Q8qa^o<+o@j^f}az0<}&sgO$Q)YMEWi0p!{WX`BsV2}G&&m4D?SQ_z~S4hmqdBvLOVKtmv zEP?-_BizSQ^{$+{o;~XHEXVBPxg*;bDq}{8F%N3obP_2l64t?Q3~`nS4!-Z9`G7<{D0!4w9OO=f^MQu#Ni}w>- z!R_?-;r+B+OoS4PO{ywvs5MzyM$BB*^aox!rY6g?@;b}@=oWu;v+F$kGe+e*Y_!%{ zK#4t}3`%%Jg^Owb9fs#?*3Mpi0Nr~6|NZHYUI=}PixyxHKh<3lke7@a-m%@A4$T+P zFp7=Zs{iPfG42h`Ric=PvZjE-ZYbbrb)Eo3c*lOC!DAEl41dCxd_JsR;V9)MI3g?W z->-z<$`arI8TST1*z3t&x9%>$i!{>4ihs1eDmFK++ioT1<0w`IbVyq*R<-Tv|l+aWzh&B|J z$1H~=Q}yY!$g~N;3D2Nd5J^b9DoCwJ+3uQ7H@^` zic&JHE=D@9x6-$By_K$wqtk;L0n+ zT8Qf}B!goc`645v&6$N-plOq~8AWg{)Ckl|+k_&$7HR?nSlTA^X}M4 zPMx$Z;Ue5VYt>qdv$Ag%xo1lY^~rB6ZO6{r^%g2ri}y>KYwp+1LcNkrrR`KilUb-W z)HCkeQu&Lu6kbyoRG#F*dSDKR4`^_q?x}62CMXx?2d5`57H3Iej6=g%`r*50Q!sSt z+u=I={aWHGeEPPUr|q-a(f!)umc{gK#p@J{NqnJJ=nV2Xd{|8zVe=LWyR$8Y^0Xe4 zq0meGrX8%V;*(Xs;yQccmy@{~eqm*{%THi+i>2k-ot>S{r=4<#0yJv4z)K$s9>kfR zcNMGUm1e6^2|obhr=Q{t2nhYB zedb|KN7*W(G6}Zw{9N0&3QSb!8a@CZgwaf_@N*@5y;i#IR-$$|UisNR%WrKYS^lon zzUh5bKS(ZU?J8Qf%bx7B|5v)*DCzHX7@~eROh@G%o_fZ3UrdOPl;p#1XX04bhG)vW zh8wGK$rbf;^VL;)N-3ANwlQ(uR_PqG=_`MQhNtb+NqXi)~;5nl}dFJ8q#ay^J=MF+MJDf zxmwyTZEaL5p|;B#+Z#L8t&Q#TwYBiz!b}c7k`p_2Kwu~$Ss}$Z#0-)20_4dhJ-dS` zGesszW$2QJU1qM-(CJ-tjBCRhlB-3Mb0f;ECYk;44bBtk#fUzQalVc*9x)oXCYc3A zUu1(UVi0_%I6bO%Ls?^9!{V7HEOay2= z|IGE2wuF0(Xa#1Q3Z~7Uy6;MIzWJEqiI1q0109F=WDP4jX4iIl9hlCSFnx2ZB2X{p zK$e)@D>|#QuT7^vv~Mu&e#i;{#chp>1ad+o|#=Dcl8uVA|_FlY0Swix=SkFI^u?%xn68+a%HAq+nd|Zw928`1M1>HfZuIgv3 zd|>fZ1$36pP1IrdqjL07MLvqtrWItLglW2tr^X86!MW*W}Wf~ha~N&Q67$|G8v;Xcmq z&i;&5ETNNOH#!&}_OI#KRwQT;TMunzzQPAw4{viQO0#7ToD@oywI zWr)nd#eqf08_TM3kZQ`mACTyo%Drd2eu{A~Fwp~wgoPi^Sc<34rCj=5Ho*H@-ixX7B6&e*aEt+V~AHC{mt?JKz*SUtscAIMAag0~I+}t?e1UOe9P}sU`>BBm`;cJwt$t>!jw#f&hw5q%Rn(TC zr9DVRORJyFVvO+2M9PI`Ww=_BTRMI&V6rNQTd}UrLQcZocq6*A7cUb|>K2-4vkeUD z`Qw~TOvrq#jK+-hMYGPQsuD5Ir>Ye-kgJ4y(4w;FVv=l*N?tT1`n1gyhR-xR%lMOp z=tNl%!hak2^iHTmj97`u%HA1y*2s*Sh}E+Qyd1+H%7ciWv^*zYP!a$T`n54+p13GP zOGUVXTnt_`j_PNP<2vgL--z?0)03C@AFnU3V8_+h=52pyT)OOuoDr|;2mkII)Zj06 zZ}z1s08gE^$HP0&>|CL{u}jAoPltvB+8^E|XFYqo;swK%V_l5yYI$sA!vg0Gj4^=d zn#_;@lm!pbETJ9r()5r(cE4xbtv>O1+<=I$!eRaS`OD66`{j$(SOG}A#V|IG1G)j? zf$;-X*t_gU_x(6aM@%M`T7`edc6f1*GMt98SMaVo&>Q4eYXO7MQ)tZaP%lK{eN#9e*hesNceLH8Txbr_)g%YgD z%B50C{Ly8B_vHvl6r4L7k z&$=*rBYFt|ZfvWhvu#dL*=5tQXHNm?UV%}_!5a(e-g>I>vMmtK)Ff zV33Chs`uw7jW==qlb_LaJTfK$ZtMPmV8WIPKS58Vil^K+41Z?cu@tyFCh?fhP_SUz zc=-!&;qr!Nbb+Ews3@)K$D+A4(0xfSNCXk>8SQBc@-TR9-Zou+lqDiq5#~3`KiShM zSt&%vZwBUAPzKi#zH+36rAd()Ly4cHO|Se!Z4L2HqfcmPVbksoXu=KXig4Um_Payd zHDgbj<9eo*!GmghVvfU-GwWPrXINrFFlLYMy~b520;hl*4j_q~AKlQnrWw>UgSnWY zh>OvErb^X#QVZu1Wi}+3gJudeApzbTY9W6!IVpsZ}8O3~P~; zAu%>H{75S6m+g~)j8L>D2l0x06e6dr0lQf=*3}MEmPh(DTaDMXvwF%Ji9R4H>z5LU zt*?kM{SdVmHBj9SX>*VS@7@wt%tptAL76;kKH?`lCl^>OlSR{EJQ*Z$WFRf`FV(Mxdcksn_xxA57ZuWpjpUkz?`j(9EXD?@8 z)Q%p-JnRT}X)W=DNMY=)y{zO!rs)Loocn5*i?kFCnQsXFXH#nKKJzwFgSy zxL%~FBKwo3EEmQ;1=4SV=E7b;N+*kG$6QcG|MR<}`120g7EF>KxUS4chh zK5TUd7;%IB#J1tT@>)iC+vlcwQl1)lU>i~UUfi%^-bqp1^R&QwsFqM{0>WK5@U?0{gAfE z=hZJ7WVWlUNE%YUw{uA-YO(E10{`bf7IlTzniJHY7?u+p;LY;2*UkX^)iDUY&o0#!*Vng#VuCSN0#@EKsikRxc$C?@f5r#p-TV&0Mm(gUoFnau~yl1&r zaTZK2xZ^b}bc;}#b3LZp>ueQoi>)b?iuIG2Pp}wT==2C}6Vg$@wMG-P?AmnI%ocdi z9T0A!3XcX&)PU?iMf*4B2s(hEVmKR)ZbO$xP5*x0IP1LL;#|MZ#hr}b8!^)&zo8|a zd?(Q6okvp@P}IN#S}`LZb3z|;4M2cCMwjHSJ;HowT{3TShxeiBnLys@*s+I0lV`n} zqQg5$Cj%p0M|ms8cy`N#!$=i_j{&tx+;ODD9Y>IS>f17ZTb6HQ`B$q^;WaAK5k=>* zB>OHI-Nz;-B&J@+VE#v(T#PQYc-D$%bbCznI5LGkL7EFprgDcuXhy-^XI*ubah!Z<^G* z#icyK8zIawSZr)!PHjA*yd0{(%9R~hpcTzee#C9J+qkvXR}F5Z&Ov{00ii2-;}uki zK$3H(Gcib!(D5>_1MGD*X$@Ui=gQ~0rVR_)q}uxrk*NOxB{|h1 z^o+Y}szBB*UN@Srw>o}`heY+8JDL(C%Z6~nAoj^*Z|C_oW zg>YYWpG)p1C<#G*ApZTP-G9^WziId1w0q_AO}nRG)yguId;E8fZogEWd^n9$%A*=N z&52~CT(yd7O1ZA2Mk6-OjrfGiWp|y~UC;E^nHN$O1JyTB|1b_kRY+Q@2ES#0<6^mC zv$5gaFd;%A5_zBQYY^CHaZw_43aC%@GYSzyE6V8n1u!`^5_*@<>knlA)YMpUGak#t zz~j{siE7-7pY~a7h3NAxUTj$@h0-~Q5OVD4eTn2Z7YY5Q zjDWgV1Fh*ag~Ho4`hH9={R~5)gxOy&5)PO0Sw);9M3)RlhS$Xn&eTKiaiiOX zwT9WwB`GF`i`)O8l^h1bL~s8dPeX-ea=?cDpsRGF*BIUycbpnG4hmCjPXmL?1<=g1 zF;)E#*CW>+7ud0JcR_CKed`u485o$Rb0jvCieePH5fY;1KJOo<0uH}O5fmVyj&ct& zA(Nn-mpZvc2tX4RzhFVZTWWb#17Uu3$A@M&1ydUaaoYaa$Z{;yq zBZ#NG78TP+QHIh*1-+6+tFEg zlE#W>LO9B5fPz*iijDB^nlG>blQAYQ4Y^JSln)wC_PY*BD=ycm-K-T|QFlHH`Aw4; z_DQxkXG$dWIam<__v&;NVoeU|%pPN#P$P3tM0-b4Dn4qIW5=sBLy;p&MTh%`&V zf%22giSiTSNco94BgZQAN}nR2BYt`bH+QATRNa3=7Al>5GhFWGcx>QjhCGPB8MMw_ z<6;3W;=7zUs3C8+d4r0d`2&le#KFbS9ACBYXh)}h=&G*@?IF^4F1b=l;q;`MF$dIN z^Y7H?cSWNY0^|lly20*qg(p~haVl_2j3jZb)vlj)8tqdNbUr9+-g+GgrhJa3H(rN( zh;^Pf&V<63;H_jHZEr&kvd0ug|<*Vk0?fWMuh}c=)$TLT7L6N!?8Id43qYmt`>R-&wa(U*g z@28Y}yaM59%;7m(7|r|?tHZ|({haHYIbpI|)9$-u0{zQ|2zJ$n)qQ2pveR1m8V zOEr5{dtL9mte?F)ZJ#}Vdr~{DcUnF%p}g1*Q_F3bEd`wSHPo%yv6Fh#zQ7!FMi#a@Sn1Y%B8xN$_#T|{R z!_UVr%&vhiEsr1Ype~wsjlM~zA6gYCkO6%hgBawB5|0oHomTzqymiust-+Zln0*R` zu%MA%=c6XVcKS5okKtdW`&wL#13u)7f%JhzZm%QNX^24;thZ_>FJtd{&UAB=U}Sgq z<1fI@g@I`*?CHgjyYC3cPphx}g5k1l<{~G>IKufn9DFBF%uq4%n)G>5p_HaL>XZlM z+IVc`QuHeqol=y@7UAJohZo%eGhB9TblGW}Y2kljMo>=v&?Cf7b3y z$AvaM)q4AR?j%<_snipF9DDX)DARhy`FLv*I_%}G3h8(+Z;*GFh6VFP6T=A38ux8B zuqe=R&anEHTa8GiUU&yt)SKf(LCDK z%5zDe196`<-U5CUUCBQKJcvxx9eCF42vGkGnS@OEJ@TklQcBnuS!3*SpAf2Y;)b795Qpq z-!4HG6ch&h^Nlu%dXa8())39+&R`#VZw5_azM^$yCeQLqU(49QDs5pS9Pr<3ts@lv zw!VI$j;1iy#SZHOjCB#6BE{$HV3{Qt>;7Aq=HbS=uTB~)+gSG%4duPNmQaz>Jl}i1 z$K9=6r2aB!=669~^u8!Vi0s%8iEOlB|Kis5FToi8GV;HJF}|$c@D;Mjmp$!!AlE#Y zZN3h^Sztw-Nyi6jVi7)DwEow^mUHMCY^Z|*57K7urNSlcyA7T@X3a<=khN_(>b=!e=28*+q(MY1&SymgSrts zfDTkvT*eHy!_VNS4hJ7Zp0NAE~r~HEE_#8<`^C4 z<4CdzrfbuZx%r)9*ePdZ;1Em41&ZlrQBRr0erD~n*7?ENd8^)OoV+;gU|hU*{-&8Gp_TPST&q{*1zm;(e3`2JHN7G z@{QG$mk&c!;&4G!YlN~M&;W<{&cejDEAPW0bOJ%|i{e`_j=T89C7&ndew5+j$^xq!7AJjZ%stZXY4;1MP6Al^`qZRAKF6_Iu=0#eC9Z5@ zF-O3`l5>WkW{jb0vm3|qOpLBc>yBqSBWuj>(gKZLVBfS(c4dN? zfhwalp89iW!n$mX?_f1Ehdr0)B{e`Ck6{OS=E{dY7ii@H`2|pa6g8WSNggawO z09Zh$zv{0EV^Ffv=?7$K)nB5DE>-nb{dL&oP-m=l60!f9j!l%YRaKO#xB}0&&uV9N zo&lP`>Qg{1{A{0+(?;h4zRf>VE!8~9^vZc;D#jEoQ_*%pQT~_1<3ejyLn<$DDzeHJ z=3U*4c=~E^%Jbm-7y~EvVx4L_!G8FAW#zO)X&^?xQmq*Q0fawi9MRBnga1}$gy>T+ zUzE4X^LPv6J>G-4%E`?2Gdpj0PG7ue*Uw_&qn?ki#`euP?AXq4Gf>uMHa0GS}5dv_}ox{ z&6prj>iu@wIyy`y-hnYTdIoDc_BBP?N>9Rr^dzj^n}ngUe>fRK08`5vAk_&hPv>n0 zda5AWD(iOfNQ@Rpia^GH=h%xzv)!Q!D{L)H(x}vmh@FTO3w1&t)1uPcJ!Bm8tZQGJ zn1THr%ww;E0j@s8g;HIHGz{HAPu8&>a=fY-B^TDR*aH@lf2{S!Ytg@m<_BW1++^4N2~O6#maqByvWani@J8csoG@U&gIvz9&og z`t9sf;~2#<-C6D&UEnJ_&W*!%ewg31&L&tlBpAYuqv_aX*=}~^j41TrG**0WKdL$extgJoI01r*!qvbt$dAk zlPv4CHanS)E=E>_|2^tjeIS*(tpg(qE= zgM;%{?ci;zcGx&?KgIyD{hU8WLiPt7xOq)a>foL6Q$7cXtWo}2 zL;vXI65N)RMM<6+Kvxt-kjbAz!?5?a(>A8*d(k-Hq@~eXf=r;fsz-@xs?j^FvD{nB zy|=WUFfCjA}2url*? z-~U_cf}b45;oF-3Rjm2R+cQ1+@i*Pzn{M#+=?3ccOf-FYHqQ(YW5AH~^KW3{B{+38 z?@pcI5w72qruyB+hu{e|L4(vmUr5g!uj7qRi5%8Wyiir%61@`5P)K!w13eGlHQR_> zE93Z7L1xjFCT?T?kySR;n|k!{*)u=&cEU}zDD+6*kOjojBye75*&lmZkuv_B^+6dY z*{h%Sqkxpmhjif@nvdLn6ZM7DP$A?AB;Nk?QmJ$UvY{18;i{^UpNei07r-zW8ABz}0F6=89TXK=TL5pG8j; z>Ib6)uY;l>#TD>R*#8p%sgB5{5tRO(-@sJ4SnvF--UnbnJy~Z@JUR#RVWAb+M#snt z^U@kqvSGW=po%PQO0RA+SdU%!ii_uMEqE#IyopPblKj}o^Y!;?*IiAJ=m^D93xIa;#hAvY= zk`tw-atT5enc{pxNSKM|s0T*MPvucabH@)IWr$Zv)+c;jPOe#wuPNXA{$gRxAUSmD zLPs6yA&(lsD|Eh--1NO|7Lk?{50~N^|7u*}7WL;^kjP()57&Jhkrp4-ugUr7OL)*M zIQUNdU|NSeqzYaGTW6_icpb#b?HP>NAZc)`n0d09YgDj zP)w?D&+p$;8P#-7NA(Dm++L74a^ihx(BMh5CLc2KSdD084|^ToE}=p7i5|SxUdiox z06>Ji$jMjUjSUK>hlUezOMvbNpxPA|@z%fRK#`VusuBWf%g>;2fBM8Q8Z6Knimai) zm30xiWx6RhJkjXbbWO$TeTZ~n0J_Iwov8k^y{N`@qdy%EDc2)v#IhUKn4ujBud-OK zok!bJzMRyrND%Q5YXvA^8V5E~z(wrw6+&6fi+= z5?D)={3oZ4Kq0Ot7VQ}IsSh0q$1TJctNNubsu5i=66}F79ol0*{bYqVU#{nLM-v(O zdOcQ-eOOD12}M1cZDlLzDn+mj_3>K8eWbD$#iAY?)_iDPbgoUuMSUa$q**)ockN}p z^Sa(@H%?DNiyB@kA5SN;lD~YRK|o2nijT!M)*DUu3C;5t*3dj5Esuqsh@ps<<9rjS z77|7?_kj*ps+TtBM5f3X@Gj_rxKx6`X|z84qVz zOcur=nk!&l^C2QE2ZM0Ngjq;XPT?7bgM~4OW>KHl{0ti0AA@j~dLM~k?Hn4eC(Xi% zdr4_FX6o9HFk+oP9>&mV{79ZeY#Z^&Jba4JJ*5i9b#9KNWe#%!>?EE`h1-`y>^@jk zza+`352ac4ixI7QZ>oi+{!%eZCsxwo_T>%IhA>INk- ziRWT!On8s6jD5?jM49(fvc3d%arqe^fZejkHIjpKaonn36uIisu=@f78%dxThu@r> zflCn}GqU}q!eiM;#9}Zf-QTPXc@I-I8;A%)f^hp0ytTgs%2#OFG3yO^Xo}GZ9+a7Cah`E4mM!i^;O~v9W-w2s=M({=UWNG$dvs{V)#zUhd zXWPH&&}fFQ?>}^Cv~*kMf~Q7b!p@t@zWYy~^Co?$3-bJ*eiYn^*)3S(<+U;U{J&J) zs#L!#SGFqK1NJbN4(U)^Cr8+V$ZxTjEvh6v{>lcqaum%V$Z%A z4{f7|zSYo)anE*mtz+Z%7>cg5#<*L^wC$pl*yXb$KQuhk z^$Nf=h0FhBj;yXZ7Tq~|**ve|uLTSP&wu=@?$` z_R#2HG`Q;r53x=zO*pbgmS?g9;g=_!*fWFxl$%a^=n=#Wp0QNBN@qg1?%2p4dxJve z3^NsQGIFLM!s)F@=q}}|^z7Zt%mIdfhfodZH8HwZ#w7rNCWirQa?%Y(0A#%IWYf1_0lJ^=HsEDs) zPBK5buxw0N{!e&tfh>~w5i0ks%c)~#M#dHYhf%^9QMZIAp|1bV;rNtLez@vF**xaD%|z=!V#{oX^D^piiEK_eCBkh8Z~W z6IOIDtZ{MJ8 zpgMbGU$R!cc6eMbjC$! zk->aOQ}(avkg;uSbo0TD4$ZE|WzFzTNF_e$2#sz?eiaafW2lU2a@h_~>vHH6SkuHC z2+u9k0U>5O&?L+hg423+#GZm)=$KsKv9Wn0W_TceV4~11pn~k;3-f|iwmJOP9SGdt zOye3m=)jMgU+IF(z@C`0gAJ??QX3`!qjlr&RTVY;k58n+&$il#wskLfVRVIl38n%w+&Swza|h-c6;KW`ZmIz2OaFmgmEY>_^J$DruF!O z)W808h#_FG*S|GjT{}NxwUf8(w_2-JJ2`v12W7p1J@xn{A%tX&CPNDVL!TUD4D#9T zL*?Uo>);jCs6B5SHO}7RwWSx0vy*ze&0d_gSdBGnt+U3#`BAOKn&++NX}ewkecd!A zWdTM4ZTmDj4hl-pk%lhs^II5B7cd+4*Z^cBhGR0VYZ9?t;Hmjz1~3dV9AOWkY(T<2 zyaOMyT%9N6oiQdEx>XvBk4fzo47jL-T;8@LFX+Z9T3K) zd|I%~max=wC|n=HB=+RQdMjkcrRk~L57{~)3VjmqKr7ivj{xwO23Yg`-Su`%#D z2Oi#-7sX#D`*NYQygg(8VrXA^%w$I9{ztPrut9Y$W!WdF+hci?t+?xjTycGUP@D+*E)B}TX4iIT%5oE_;_Tl;3zwwRFfWaN(1liW*Ey4)>%G3FozTW zsE8sPaoXYYbp$qsc>~fH%6nKIg?yf*yk8!*Gi(`Mrn$Vfx?*9_>R)4hIYvr*^3j;W zbgPwM_l9~S2*OL3f_bMQayF9@5Rrz+t?Ib3)yMuiwFdN<$Cri7eU?I+XVJCJ6>`-j zD+Ntg6pFaR1|0b;bZMGm>OZJ|a+;Cye2+4L`gcO_BiMm5IIR2G%o%9U#2tbIRsw0R zSQW4WFgafP#OtQGV}b4D*v#-SH8kfQ|G@H>9xJgu*2CncU7Qe)%K(OqsT#w45vwCI!hf^%0HR{T!r(<~DXp2J8q9ISB1K7vGte`{YQ%LZ*akW&I6 zs8#-E53PkzM{1rpD=%R8e6x;VEWUK3orwY!Vp2{MmO4^La7Y=7B(&ABz5zTyV)Y01 z3YRAbmFeN#I{T;+V}(YBBC#mCMa-I z?(Na!l(={>zk1O9E?{xTyGoQAyA#Wi^f!Hd14sl4K_)|S54s(g@*T2T?XU3h&Eoi? z8`%E)$G_~cRW#-F+55-P3@2&j8QSrRN5BQ!} zD0VO3&?md5w(}87)2zvlQ8=Mk@}KnNlRfsCefmUg`9(oPKRi9=r2&DUna7Xw;w8Qd zgFsILl9Gwx5cH;_(cM1cR-~^u@?xy_vybUfq07V;bIu1iML+lnx>^0SMjeX8pwh3-m4gi}D!%N{M`%)w-5t`|MVM zs(~Ea9Vr}P!h*^{y|OZoP~5Mt=hnhFAbIFrj$Z2T1P!qOt`rQllaMT6d%^A<{*O6| zxg4W&i7D4OQ6e_)V0!_w`m}w^ZcuweeN*gkpSKU8sD+C(*%nqW2gZM_U&nU0;7q+s zcw8`hQ`D_C@}-@8Wn(QvSG{RE^;xlCcpe%tru^JCX#|?Jvse3%@!wrpg}9OQM|@0c z*ZE29xZXLg9lUCs)KN50AM&Hn%>VR>=_RK;gR`jLsvp&BZKb}GR9}|V>$l&w&+5lP zbvIN!s4q(D)y1h@Q2#oqd0A4{=aVV>SOuQN8FXZgr?;O#SH}N}xwQ;vF%4}mF*LeY zWHS;RDAe>nrZ7wst9!*Rht>tCzEJTuvd|8Ds54!_;sh%Xh>C&X^iZ9Cbkul$un*dL zCiBPyMF-FcGhR0H2v#`u^UwME=?iTh19-VV{<#lw2?Uy37(Bzr{%X0}>6{;6Bc0Bg zXl>d>6q z-e(>?!l!}eOp`^Rk^htZj?glX0_jEl5X8(L_OOzD@drL33l!g^Nt4b5bCCCd`WLWk#djDY2&?E(f)GiA zoMC{+FwV@##G@n29nt=ew}{#TG@8&LJSMsmQwZw!Y}3Ug_Gl8by3?WIz?|l13k(^SQ9 zM&<>wCUs_?e&z)TT%Kj2oK_}M!W~r2VNk>!3}cI2s6}E*Z0bNZhi0UZ3C&;Q{Ck9i z_w8A6eN+uxznkw@vF5u{{^^JJYlYn7_4j48cs+WAqSY9ufi&iz3c2^I=EeIp0x=;N z66fsWzYwj@kN@IOKWAkJppfi>Ld)3Zv_6w0e1wXS$xbI|yu~>poLcyLL{1W7w$MZ& z3o@|r05+O(vLg&W-+fuYR$<R2bshj&^_DT_a&FoTYUY= zs_txk8g1=deHy#f%GD=ehTJC?=4|)VwQ-BJlb2&$aA<5g9l*ZRfzgO8eR*w0;0p98 zSZ_oQ(a7PaNMd_L^+>C*kM}Y^~aoYxCScBqLNm;kW6uiXUrpDBpfaf_?Pa2 zV+J~^v%lgNe>eTfQOujhg;m^hi{{1SVsQm$+J%*FqGcZ=!0g8mn#8+p;5#x|bHp!T zcAz=GDCD@95iUQuF<_t9r{jN*9Fm6IZZhUiotOmeN7BndSK0PW!-bM;+j;-Dpk1qmr;=l)xN1}WR(B{>Zofa&X zO#!lP53OEWm@XEc3luncGU);xoDkdzNGWI1ReJ8EqGuS+3{s{6*hYo;Hf4vgXc$1t z?Aht+V_@D;^^rAkcTd|d%DcHj&Ob-st3AHU!|I#2-F`WErPMZtlYt?sQ~TUpr*)Ww zZf>JcLU|gppagm~X3=nPH~WbhH&<-sFMc@qxcYfT%FoCbf*K$^G?idItJE=+UGjBCRh(#m6xu|9OUSSBs)%$aU&2r~)o#Cp@Ne}-Lt z`g9ZYk4E6=!38-kez5s;J-?ze<*v4#-81gwzK$YiPOORW3kF$Ei|-wO;Mmj40i9If zeyB{V=M5qVdZjQL(7qNkrork6wOI)SeC??Ds@9R~f=WNxYoZ`mx5e7_I~_{$;b!kw zLH%BnM`E@Entbtnxj4av&&MX%`{?ZjYjC#ydV{T2%B8K1wQMl1(&on7l8Z4GE^MYR zesoY1z_*I{?@p>FsDbi~2F&YCt$bli)Tqs>vK3#ad5~CX(lx@hw$s(xR%=m9m6`p~ zTG`^QRA%>QOK+pFbMRc$N=6N8?SyL8jzq2Ji_|)JBWfKkQ0r+;R4T%+r!)KZRIN$W zsLrIHMvLvjQ&D498{1E{ZDox$$AxjA52Kltdo}a|e=;ifI#N!kW#NKn$p!nCIqWgj zUq;k<6Rv|kKz=pMw&+-RFbsP{bh;g)vn*9D7b>Vbx-1Ldvb6D%cJV^ef+QA|Yznpd z_jk?LXKy}mz1nkNn{{wlfAR8F<6r+iIzBmV{-0L+?ELj_Z{Gf2W?Xc8X8&?v{c$xM zjqS;wj_XaYZ*K4Y^ASzQutP-SQvFTijL`|?h1o~@A1-KOB{1j`w>z0SmOXW0+cM6> zl4A2U52bN|uby-?`WW_<{4{)pmBgy*A9TtUvNp0Vjoj|}N#jk2n+!UycVRIMR%_go z2P^!Yd%Y1};NR7Z4+!Snsr}(y+x?Jgtv9fS?M7f7k3QJWWUvsd5!Q&pI&BxLPfIEU ztGZpvTNfizl|>STaIOCoUmvS=T!2A!{&PLD&1f4NrBa;MMy}Fc^N;Vu&~oJS@-I$?YDSuA zVvCSL2CX$J5fByX)ou?6f9rEj82q&pnrerw_AgsF0D$!^&C;!aP0>`Ax4Ogp_;xFy z8lUAjzbm=jZKSpT%5p7NK9_njSH1kxO_ra0^tB^uZjD8n-VWTA9`S=)jswo3+uinb ztn*=HO5?PFeUkx9SxF;)-~C?rfJTjvp?Tm=#~ZIid!U!^hUhdfhVz>Fl&+DS+6XQI zMsH#d&0KQZP-`h&w05>&-&mVEwqu;X@ezQ>x8^wXJP?38TX~R92ECom5hlC^y?+9H zsCS8`+4lJfwA5_n4(ank5q-kRz?xt}=>DC6CScC=JEyxp|z(EVJLB9z+ z=^Rz+we%b%eG^9N;xGeuamQs3cl0ml$}HO!tHM zexF7C9X_c37U(5FBwzW#>cg@R=oq8k*2c;npEQkj2UN?(8Bs?(Tj7VeD{G7nY#yy1 z9Go`K+WXn;9DBB`K=y16vU2ju@e%^fAD7#mEhx_4p`apR#d%Ve$s)%rceZRvnXYYg zg(s{#y;$e&coyGS!d4E{J9cB-Q7L&Z1h&&;uSAGjuqSB;a;c)`)JE3r$P_Zm5E%z;BH13?DZNg?K~qKyd%Gqzg?WAS?fl3a zeyuRs*S0J^P%N=L+Cx5*!77B7Y4 zUeMF7_ZWc{NK}7@ga?IZO(3USEn^g5#-$4xEQ{TOHt_yr7X9hzw*Vq8=nPTSr}36^ zCOZO-%F?N67M<(qCpPthd-2Qqp@y?(r|m53nb1pjaG;y&Plp6^W9cp+S&lBa5*$x{e~(SZ%$Mxh#4@BHYj)p!$Ib2^0W>KtACb?uFWkyC+O8@H)pR7#c7 z?!ghq0>-JbQ4M}efZd@r0c|T!*;pvFM;;!{flS9Vh}ZdXquC}77Z0%WwmWl=AP*TI zp%LxppIOAM($}E7lOe2C@L!NS=4ZUhViyL_C`%nKNVKf?SLp=6v*~ytR|Gwt(mGmW z$~A`fNV@AX@RW0T{f-hf39rhaC@+Qu)|jler&ZgdYTWlyar0!W7~K%Hp$)a^%}1Gyc29SOH4xla68S9E}9+QzaM8gUX);&@3~h?YkPqsXgvJa zt&O?xubqwi!Ur8}qq>F;XVQ&Tc{8tJm^*3O6@SG^-)g>$Z$D?q@inwf@;&8MKY2`3 z4z=kgv^2+eVvMZ$ew7?wa_APu&yqe0DBM4xgH`uGh8qLuSy_+;*B6vJ;&vCNXi;Q> zLY3Lm?id){f!)V$6Q$X4?M+7)yHd!FM7caY7#X(-U{H^)?lzBh@(~cg@_2B}E^5L4rd6F$E3{VBUR&1b$!_m*Dv!*6V23XOVG;Pv6(va0 zp=%oMF)TbxMQ3xl`DwOJ59;mqX=^{mhUc3!LS=DJGwSZ_luIS{0jKb+GG!>EI%o@! zXSLSL`dR0Bam@fii_Ac`X zG&)bPv}&4FOJ8(jCYH2-@JdvjOlF%qTgk12ZM(-iJGtFMdpLppi{Nt{LHPhAlmy( zSu3susIyTeiAn$LB9LfvpnR0#nq#Yctq3%}pfR$i>uP8ttPzp)bT6&Eg$hwB!^CC8 zGVzP}?A97@e%XCju6!tzcPneOZ-PgxQm7QlxCP}u%J2iWSFN*R^8g=7GYM=ZCuGw$ zpu>FEB`@``OY7RCbIct!fbBP(%Apg46?Bp5AI0psD;AR#Y3Xr4u4Dzs6~t+UTX1tb zTi6Bt5DXYv;1sg=8e1DmX`0jdTjq-p+ofYwn7sbMNaOi25cRbpXGEco{=tYW67qH| z#LuO~Qvm~YPys8l7eS;eyH$=fSwSysw_4fcxC>peC{)GpEv?{`C)vZ;*HIId)JMwY zAK>aD=j?9(5^n&J1GqI_MMKV`zwjTl4}ah3&_dOjbXV8t6?JQsG@3_`CR5K{&8i2A zK!YkU-e#5;pu#2oT_`{ZH>DC3ue*ECugnu$!W(tO4W5J<_ z2fm>nw?zs>1#(U>^t+ACt?ds$WMm=q_GuidzC}Y9@L>4^ykP0uj99*{cvf+Ru>7ZQ zKNJBX9+w$8a6xxfco@cw1Y)?D#+j#xkmiBSSmhjs>=?g zoaKrj(?>rf$}UEZ2ioigS%p7IIqW}K3kzu4xNpP($%R1h`np^eE^}P|qq90WqDNYY zY%;JesNCFzoJ(?}$FH#_Edt>s!J!}|yM8;=JlY^Q&7PmO7oT?$-7WR)5vZpUd9AYM#I0Ga%I|P2pYXIX|n3zb_G(^{LHj`4^2PUN!kF<<@53 z2}|kQT3p$yP)Y1Zph&H8`L56OOVgu}3I6FLKQ-ufx|69)%&p9NS-gEfB1z29(3yt> z!S6zJE-cTD2f^<>!7Zy zH(n1`3cA^>JcaExyb#(>U_wKt{fi1Jcbj$ASrgb%U^OH-^h^XZjTA+?NE1*{3D}DT zl^E4h*c)m|0?=hQwh9#jU5o}@=eJ#k+80~R3Z4Xwi-$|ti?2`)RVdG{0Nl1apC%f{ zNEfan63!eX=<8~`$Z>kZyjZmoE;bGo!@#xEp%*R|D)l+|L8el&xqhG212VhvPRxMn z4`wV55z>E_j2>79ecczIC;Lpq>%rlGFmjG+3NZraAs_yu&OfC%;!4w0@tuuMS6?b< zwv)s;n-NzBWi?#&29xP+jvW6D=@%nztjX)sB0!M{iC4~H(?(x+|w^f58~zng{fB z%v=c`k<`M&e;zer1Uof~*?wVmjj52+jW(=)o#TV8oqsdaaqO{aPu=02w89F*rRPj} zoIHK;fTwre{WoJdr6Oc&&xi&^UELMqflk;$FMLJ(-hS`#M;(ry}B&Hf@$ zm0~s1oOEx@iY8*?AVik81tC;II8^515Vsi2tn!%?h5pdmq!7^`N|lNNFyBr@0Q+D> zF?o2MP%>DJ7CVVbFv8HG(W6u+MhS?;?2ER84VALf+WF<(_R|l_i-<#a%(hL`{3Wqk zDYjbf=`X+Jc8{C&q9xCubFlv_sn25Ij3#Dye?ORDZ{*EB^mCYqjwrYN!ridlei+J* z0wt#9NDVTmDiyTt7{BEQyJO)F^g)ZjHTw<&-eDYFMNS`PmXBJyCg>v5#XG(pd3eN< z0TWq-{QVEgx!nVMd~M$HLkqkkPCtXESR`-~DChb6=olYV=7XyE#KZVAcP_uy*M}{q zF*KZx(d}~mh|{18ii_47PD}nqe-Wm}L3Lw3E?6e$S9K$~W7VA$&~`LvJIT;epr&Cq z1F=@^ZSHOUxVfv1_}yrd?>fdEu#6RRlC1fdzc0{Y|F~FqgYg_9(BIYa|MvsGOEbfH ze^zVnGmq2;5h_MW5rE&X;j#Kka3Tn$?uyBGsfx*Wsfrqq6n#5u>)rC6mX=1hvua%j zF7I5bEsU-n)JFStS#QI=E-#}4bSv!Ov|SucH2)xgJigZOpWL^J7uC|cQu#yZ`Wc@M zFSh*~E6NMN;>G#DV0U>=htj^I^XMVB?*f>x(E1=J4*;nXpvcu{*$7Z6O~4LD9@G9@ z`%CTj=X`(qhvm7`eDEA_{~Y`Rkl{EOo23XvHwrpU|M~terA3`|+{^hM1f#|NdHb+f zg}>tZi+tou?c8q7?V97>dsZJ^m}tB&&bi|>>7op`=J>TE(mACm-DlemJu(+i9E?P* zA`Lk7h7Jc0nd5Mx8PFAH5UlM{X*iLDe8%y z)dd#9vsH6EwZb(|3M3Hnd_KoaBm6>> zBVacYI=n0DLkTm~$v6hYjBv5{6UC8o5L0gnx4v?_FHg>WS2mfUgF8n^GQ>s>Q-H6( z%NIXjK)&^rk3MRTF(&9dwAPEFS{zozoR61HiFIVK6FQAWH0eAXEt)dISp2~GIO*uf z2)2Ga)!*O!Ui?6LH26Z7eYZPBU+diuS^Q4-N#Og(1>_PZL)^M`Y>nrH?cstVyt6jY zqY!wDg6^hTGW@{~}j0|AXJg8x*Il)x0)b`v`_19a8 zNGWBulaTTwq(GsaTx@fGkP^P4+82NHrWlw$KXI&U!!z?D)1^$|r3CLC_Ao(VS-ETf z_!m6(1)LO@#dhK~5 zWfV$mM~y=nRM$?37V3g;LDI2m9<)2JUo_JN#|+~nDo34g(_w`HBcm?4>FW;qp;Hib zn68~_CAXX*@4{l20+MlSx%0qWS1U_^WLB=0)3d&Fy&OOT^VYbu$IAgmE7g2Ruu{ze zVk~R9x+>eFmrmxkul; z944P`N*#4N+I1rNSbrGvOgzdw0&MnU8{?8Frp@Q^Z9b1_^Lez*=Lv24E#k|_b*2Y} z?FWdY;mWJ(@S8$Z&<%C}5DA`!n1u6)a-gK}$<~HBTn^V^tR;CW5dvpB<*QU6995V? z$Fbs)CdI_)Ic5};Zf2QTA3LYcB07zl#0n+hZ;%>n1gHk`2X9=4dj)HN zI{WT-BmbWdx!o0A!ws<#4+*@&R#?7Yk=k#www)6}e&qR4Eb3Bwt?j7A@sM{`aqdLx z7oSl!8qi=e>BiAl>|j%pc+yRTkh1>P#xRC=d@Pim^lUgYprnI=%yJ!?B=l@qOCttw z(xCH*PV-@->+>wQ12lv!2gSj%08PTX3VO0EQhFA~hgu4#Ya`7N;QjC!K!h<#g#(MC zzvb)4?D5QDzgo#d#r)RB{4?&b`gTj!!Z`=sQJpWW_}_Zw*fo|!Nzz0Q-<~wy6er&8 z?uL}G@Plm>N<6ldylW->crckB8H@aiBIvtgQh+JbaE4ZpcbTW38JRAsQqu{~87eZ6 zjP0ID&;bC(prUZ{cP_sY0OjO+d9#deak=K7Q*-RaT|cG%C;{J&o9IPPT{<6Ix0D%_ zhtahAeRp8nl#&rrMa5z+h+eb0A-AdjZh3~i^UT@CY`6`8=Y@eMr=gt7vvnMf7 z3_zGijGPOB7mb18-VN!Z)V!UXEEl&Eyc?tALq*1#Q=U~ZFy@Eo^9^{e#ml6L;ZJxd zH185ULCYP^KeQXUJ=^X5aTyM3$pQFhseW6t4|(Ze^tkz$pN-19awj(Ea6|pB97wIJ z@Kre_;p7}^3`{Kb{(_Pj8O!U0K*?` z)4_mBTLnMDq;gRBMy@Z}-;a67sB92#GPkj_m0RO}9lE*F+Smz#MCY1#7&INlm)s1O z%zerom_yUC$6+I=wUvCL7`FN&spM`?4Dx6Bo1X!E{!14yu?NjL;PHxFefb`Q=PZ+6k4VpB{A4E|^J9pI{L#=ogrDwnw5rgJHK9|G3JSZ5T@ zhOZTyuncULN7`-InGlYlm0wD`hk1mtS*V6?%JwYdBHxP~^B!-B*dnjrZPNNp)%ddG zFdX35TRV#VaD@k=Q{#%P_?AQe+Q+-<#wK38%~5pfD(ss+(L;Dvi+i}9i+ftspKkCF z>&k_d+6e?_P$KZ{^+yc|G+MNadOinHo!iyc2H3;+Hz;L zz_0OQGh(Hg(bVR=rqsa?#y%G_$jD*K?05u)lYV`y6C zc3+&m;rh}GjI;dGbc|t-y)ti1Xm@~re#HaBk>OmKUIDfh&q$|#h58+(YxZvyTl@<0 zh3Va33N%z3y{W4Q#QTNidw)njLwSTHO2*@h|I<-)O=H~u)xGI;3!)~XRZ#Wo84zh} z|JpY$37Ab|IxM_&0PkO8U`BaDz`u?rxmgf&m|`+2gxBma*MXo{|=-3n=_@l3%2|YilF8y70CwZ-}&VYElz_qP~MM z=ew1$*;T@01Sr7sBzdC-48)?dwhPfo_}qMM-|jv)gUEmQ-H&buOCnAyvb~Rt9&KNr zo9nFEJfO6Ag^-NBFya5<0eWu2o^WOx@E$j*_@_Ix$1@t>BO2ERtN^o`pv@@*s6njp z@V+(y>MO&#no6+rV?nqBtP^{H6@bpf`a;LlY`@8G?6%LF^;TYIc=vXLv&nQ~I`cRl zpll{U*<1+9Rsxi*g`jLFK-pdh%1#25oyDNElE63%!Koe8695@qGd(2IZa|F~7!%j- z-NhaJ^Eu&&67w#@#6gNW`7H$U&~R=n8LK>Uy(UP-^yw1|zx6Z8&-7FkPPviWIQ#N0 zxpr+i+(tO=oJglN>!?HC0~A+jSbk`-a*2h~bwULK^wm`_j+Jn)Q zWmp%oatf`VU0VjFNXk>bnF$Va9GNM0Ve>$vG^{aSmc+P-CDAsKNr?tn!VgKA%>6hB z8dLtjYLsx%yfwR1QZ|7!uu8#NNb$O!t}{9!XYK%W1(63H6j3xH^ZIlqO%WvUxSvrt zeN0`%3}9%qdczpV}`a$wso+Qf>d9^U!iA@>2Sgm#J=RJW(yeX~U zH57Y1_a-2LQ3~m>96DxoDFavB$jN+EkxK!}Jw7f^d(`4QX^K4=d$!ahbG!fNPPA`|cp?fjH$iInp!v>}wDGpTct)dR54|2dwsuBV3)dljZHi60l%1|{Me0LO%K6p*Js0W%>`h!=D>0mfc1I~tm_3} zy_o~+HZ?4OV~^XOJqf8XwAUb=_s{&;9;27WG&F3_+ZEjIG*8>1c-I#$zR0_lIfCtZ z%mKk+yBOYw&(c;x*Vpp%dej^mWkrQMPFjjqtgB1-2<+eLp!gJ+uAl@ zzD;rVJ?onE&ZaAVG{Dy*mnkV*u~b8rqRY++g^Vb@9{%RPH%ogSSF@wtu^0m%y7b0g}vhSF%Pqt zilxkOsAhgGyy03yd;A`BeDj5dNyzpAYJXqBf;I>l(PC*AjoZSHktfd-Y9<$(&z@8= znK;hc4PA5wK10lcYeu0fMvCv`r7fIC&|ZZpqwqd96kOKL2?aMKy5LL4AVSfv(NzO@9 zAJ^-n9_=}I%(yfxK!~pG`1A~6N1C(Sb*zcUR;8-^*t15kEE%K8+B$jI_5fi(p1%zM zOpBe560T60@S4W%>?yf6h}?=mM|k4M2B0Z>*juNJg*T4nnJfp$=Q3S;f^NE?p{pS< zsULyQ3tv(xr=dZMrth$f$q;ulFsuX5gHbIOFD%G8hdQ4D?X(6V>J?+{^e^fiebd zhwa8ScL6d%k;Xlg;oPZA%(q%CE%D$#&@dPXZ|8ETGP*A zKXJhFT&@9XDN_YqiexoI06Ev>2)#c^X>hbZ12TP%ZUos73~Tx9HlF z{=s_kReU2nKfGRJM(X%XIAyO|E%Yj`L3$NI(SMcHm`u$Q)0lV_SCdDSD=IpQdyl}q2T(y|eW`%IC$82iq#ZEse&dGG&A zKWBx171*&s`}m(PP1~9n6YJNJaXYfcJv#aSHc$R1f3*33)HtZ0wCl@mW6u1ql($Ra z`Cr-mHvj*Y&l&Cia7W|a*lcKZ&9Q5`>vTdTJ?{@N1eb#L}Gt}xYU;_s_b^G+i*>AO0oeB2JWDe}fokKeP>H%mprSc|-pxa}RIP0u2 z?iR$ZO}1*`4#+h9*7s;@fa&WUvxlDQ*2NT>1`PzTDgr_yyJz+9@BxOo;GOVHXXMIb z6AUYMgf~DPKpgWZ3|Vt}0lm*0aSGs((gdHl1K1W`+)*uzxyafA3HAaHLTNX#$4m#c)V zP`>uOanv|_i)g=SoSoF$ZT8}{#cHfsYn?R?&W~y>);w=DPuukZYn!GdYbKVgk_^OB zBO9*z7oUFh%&%%KXKxyhYRvzN`IfN-t=esJ1++c2hqbes-|ZrNGS z?oJU3-^t=P_>1NHCgt`ZE(fBbjh`rrTqL@SRs`ZO*dq6)T~D+PbyUKzF7})=zCSU8 z9DHbw$T0S^!3K`m-_N22VYgVkxw$DQibM8U{PUlS#n0LXHI03cMa$R9FCM|_4 znM~6>MFbLfEVL{DLRzTRCCDy0DN$-9x**9<hBJW@g+Y>8Ete# z5<}%uC*~DJv0yA3e~CBY>=KjvadM+$yt=*8@`VW(6(-9$3o!n#_9M{jyXJZ z?CAxK`npdJy7`Og(SYdPE8y9Nw*pF))GF;^&+j5Y0hNmyWVX8 zY39uB%$YOiDq*Y}(}WBdGI11r1=pQ|jL@8;37U)XX$XTt@}TCKj5Iss?yMrr;8lP- ziG(+5!^0i|j1fxfRVU5&z9>Os7z_tz6Nf@dj4KcB6TW*LO*{Z$j*&~Eyk9zS=&6-U z4VMYvHEU&>%N9F$Yb}c0O%=W5IH#e98a#YX;|T-ocPRbJX)1}c>gc176sR9UUUC6rc8uoa|p6WE)Fb~o`jv~yEW4Rh z>!`VVs?`%`714&G-bJasaaKNqOCbHi;FqN~RBY})KRr5X!sp?SyC>bF<5Q}%(vE;; zmO^lGXvZfW@DJniZNjh9E==k>;qt!BOTGTxCH!&Zf_5C;2?j*}tAW@H-rw8@@LrX`@xAtzF)?fToKe3NN zzDut~^K_@#-94;7Z|=enTc`DAGrg{sG8vGLPj-)vca!~3zRjM-#?is?eslLEa}IR@ zJB;R0<45}p&>KsyCC(!3qvj4-#qa;Ln~B@Wav4i;@^g2miDT`ycAI+Bfi=P2 zHjZ|7)ke!4T4sgWGY8+ht<#hJ_nP$=ss7u_q#^C>9>d^Z55C-O{MbF%J$-q!lLBQeG!M7srtTgdbx%%D z_h&C$s`Tttd(k|4UdOKo&k@4@@$O8Nw-jHr_s6)b3-$ciy2wfNY`w&poW13vVl&_! zwN7DKko@lKW+QK+SOT7Ts#=cj)a&f(t=*mM%J|YkQ-QKQueWy5q{2ep&9}D7YTBP4 z;m2{ae!80`$<|U9Xp*~`3CmI@2}$odp8e#glCNjr`0nW|3nLYOZ9k@XkM1=08a9q2 zQDF8i+xZ#eN;KriXA;On(M)Ehadf!1|00v0k*_UeYQIIS%3i&7n#t2x3uW*W^+VXY zZ{B3^73%Gb%6ngbJ)<(dol*Hk{`_i7&w)9z0F6xqLc@d2J6iH?Bn|JxnMIkRj{ZCi%Xwju& z&&jR@FIasa#j+{usK@i?O-WJ{GoiE`VK5!{RE*dWY4l+2`dW|2R$x&7@CaqP(jMp; zd5)5~5Z1hlX%I?z$=FI_)3T;qJj1uBPMB%Tm0@m_u;R+CE@a20J?b~fk|t%y1z;92 zDkfff*03OXV>8s2>Q0Hm#sRe{F4I@jzF}f|$ggFz{EuM%35-e%e zhH4+w!ra}iZS_v*E0k%Q9Kpg?Z8+qgVRAy~*`Uu#(y`lfJ=AQ*t=+QWqV|sHiPVX) zx{T&jpywIvPBxGGhhb@@Jhzl7=lXZG9O^wH#qu|zc}i0M9QkVyM+BT&NvcfH`J$To zBf2ysmoHK&lEa55t;^I|q4o_vA_pp5O$oLp>E6^Qu?V+$R>?{A4E!r=Q>Yo(m?bVR zivw>}e-Wv5%0Mj(8~9P(sN|%>O`B^t)4`kfTmi8~ zZEh5jLsgCbo<0JO=`3ohu*vEqm=_}ABu}77Dm(ipb7#=wrFT%hj~kof0>P%hbS8mP zey?H{(fRu*zwWNL6aHdJH&f`!vL)W2~IY zv8a}?u)SG(3Udobp`mmo5i;_wt?u4#{qz;E?=)rvCNCLu{o!j*xBlu)7bXJRslRHT z5;QFOd>3{)lq@{N(-y^9aNo*)3#8`wRd($ir8~p-upkn7tV=>=ayTfhcvs5m9%Wsb z`tHpL<5%=?B9)dJm>`MJTiC+L0oG{jV<@R}uU~5a()}I^x9in^bxQl$S6m~Aa+ls zO1Y(w3rU++kRx}*N1@c@Gqq4em#iUB2k-WC>iWO4d)(SC3?``aM>us3_D>eU$h2Jh zkxh`Svt2BdsK;edD8bTltTG@;WpyVk;dpz>G5Kc8vo;Nf`_YzLgv@O^lOsOI?JH2Z%H1O_9wMyIFt+DZNzt-mliGI1liTzEIN96DWg4G5xC&VAqnwRl75b>WgXLQ?-j>*Eh= z`TR53`SRrB_-RoQbs*|MW^l-~+nvt(*;(|Y*K>MTu~+<{timYZAF_nKo>53Y7){6M z&Jn$l4`S6j)wS4f_;o&Zop<^XomJFO;JZB7#5BNu4}sKfzb&9V2V>UoFfoWlp|!gs z^5Ivtwe_#Qf{WExzZCFB3^dkr!s=IF<=^H$5msj{zUCC7XQf8Nenuj%un$Zy@s6AQ))9b6(UPCG>036fzYRo=VQDH;y;lYS5$=q8c2&T zWJHmbzH~Vq2TcZ|6;BiZfKG<&%%CF!vu#o>$*Pz*P0U|{$fi+0MX|Bq&Tga0IyKu{ zt56OLrZB&-ku!d77cy`nXKZbhj=nnGZ?+VF(aPM}yp9+Z;+;d5nrw%LhD~(Sf-N$H zdE`AxIaH)&BV8ECo)V^&cy~YaFi{yB(-o8RmhRJ8xtN@LOCeZ-EdeLi@pit4SqAf; za`^k;r|takef0a}U^_n^@^6LYmT6Ek#HWEVDT$6q%^tCRG4`!~cyzems5iSWk6Nec zrHvIK-YRSP?IPZ#P$j3(tkg#8ODt#$;nq)&PVmVF{)1+x_zG4CGrs`$t}nxUOtZ*L z^HK?@5e>m#4;4g1*v2)}wYYr7%We=F@6%tXm%7Y|;t66fm}pZ0Y3LuMa9=u>8L zH4dhiS6X5=c83ARC=M<}2l%6&GlByiTdw7F_B&tXJB1JbYQ0pqqX*F5r@Rc{2V4~V zgqFqO5zP-@5ONnDo|q<(JHg0BE6T=lxzu!?)+6&HIi1X-N;-%o$R8%rGYLh^{cYH6rB5zM%buUQb91eqbZY@V4nQ02Kg}-6+l@GBt zk`o#4!8Sc&|BCpV9L3@lQ53RO@nR61$0N4{NJq9MM+md(^PR9u&Jq3XTQ}sp*e*00{1wgp;2zAMIoeDxlaB8ysS2~RIOJd& zMng9ak4A%z4uIP0nPDhln${qPJY=WzxuT~4~>y2J8p#@q+z0kk55suto zeRl*)6Ltw&S3-l`hDEwV=hExZo{K_&MlZU(VIL!b7Nd5G1`_MzgWg(j6*CVvG@~UK zQ|AF>MW0kF#4j{C`0F(ap7K5=)`b(9!|W8)V&~WCtnG`*M1;?j$n@FU#9^EsY^2a zStb#=_NsX9^xlO7C%nR&G%TJINtfjbGFCnt@D%qi?mk%FRcIHztg6^3_HQzVrs1Lo zo$b=IE_Hbuqs^Dv?flz9r*n4JDX(`rosIR&B5g#O_R%>H-n;D81EWFFGeOW>k^Mzn zpF&l0yY@CLO{C^708GK8m2~%2A+sG{o_tXH3MJmUX(Y&cv}UVCJ!5HObGClTqvxi};Uhnto=t>QG>Hr-%76{Rt5NOE?40W#|En+U266 z2X)uv36%4LE|xGxxrSp~!zP#lB?P5uWY2MCP)0FQ9`%Agsh)e3f1A>-vrwa`^LiGU z(J87(gA>e}Qv^`x&qk20wW=VoH-#bH&@xYfeZaimc;+Oa5>Mb`NY%lV&nzIp&h)0+ z_r``4TgQOZj)@3MW=3_wP$~IXfrrkJ=(`xAWra-Y?x;(>E8BAX+iT}Gy@w6w8L2H( z)?o7HLHZ74;H8mv@^PunlHgi+b!OZotQ==F*zIB=`cZ`CWgy$e({&Bk5Pe094+t@f z*cpFfbrs9jd%fvU$~O@!NE%5&I1DFNS$1K#?9ZsMgiQ@Nz6BCl(qzPr2qPSa(`OS2 z2hB1j&ShAkrH^{ahv^hp<}+$IYL}CQ&tZNN0Wp^0 zuc8*jV{UY>Kx z_o$mKY((l+skKD`w%_Oatc*+67q&kDl|w{llC+QR>dwIX%}w>m2D6+or@$yIK9lDB z-S^ae&aCMn-1E#CQY z?t64{Q0E@+9-i`8;LH4;=QwZjz;*g;c{P+lfX44aWeP+wE|G}1z=+}fNXFQ5#ANJv z1NLM_YE{Lw1gh5cRUoCv2oN}J49O)U{*%d>KT)2}sU?gLCyiC2jWy0k&V-KpQak>O zi~J(i@MBe&#t{mc+C^af&hR}j34ezY2w{loZdJYgx9@9b1yY^Ce>Ip&HmaCK;3fUv z+kbPgyCrtfiqA({46H3)isl>-bRx(FWla2ceL5tjl{5H9uJ zg`{BJsqg)YybF}<4Uoqs6*1|@H}T(!kT^$Wyxyb>2R1UN@7&v{9=?d`$f@fhD75lP zA-(*U&3h2|;;?DJ^z)IdYXE;ttt}3$@A47>`#}#MFWn(%4tSPJxBtENg6FP0!QZz$ zlYSuSy+P;z!*Pi(^D9gxQW3V2}7 zS80E-dLc5R!&C*Zhe$x-j4vq`UAQHnG@k*iL|LFb{I{X%@aB}5ttKvo)dmurRYa09 zNKlWK1x5Ij0c;K&TFLeqUa1mD$QSc3gobuRj5ldTMNOhMVrZyG^@V$F?RI~ees5a) zt?G7ptNk(kPBbdF4zl-Sh>56-Ecxt+SW zM32fTvJCgyKawn)%@Iy5u?D;dB~5B5-HxuDA{Fr7gp4xPNeQqN{xof{O>(k}@ciF_ z=R?&rJ<_O6H@=mX75iyN!>EWvFAVx*-jPo0r>|Ocz}8WJEmvXT6@X&@M{J=J2~BCE z^3?@6NHn!Wc^5FTNika(C}V&0#=(&|QgA;ZXB6Ta$qYuv&5~j=N@QpV2Z8C7Jx7lm z6o<=fil*2UC9KllCz9-u{1N(g9gN>)-MZtGgsW88*e+@lu`~D?*@qRfWV89V#X0j| zXM@lMBnz+gVDv?RCnHi|u`bgbe@JQH&{mX#HgR?unA%~KN=2>>3AuRY*{}=m3-Fca z(V@^}7@4ZyPl%>TmpXFCz~2iDGpCoR!ZXblXl!|gi%wTvjX8`0=(d4G>X@!YVT;rB%P$ypELr@10Mv@h77u8WzOi-uDh?(a{Up(5U7`c?G(4Al!Ua@a+;_@t#hvJ;361Q)&4Z3hF2a8!kbz<`+CDz03cHvBmNBL3` ze~+`>Hi~S{FA{&dOh3<}!N%CTE{Yo3C>k3DBg-_$Zx<#GNNO@$sSIz9Db%-XV6So7 z(vJ26zbbch)`^13t*Ix?%V6txKC-!no?Z4z3bSBG(1ug=!c<*I(UTCTvzrtp?RuJS zfNWxW()V)g%6R5Xc@k8OW+_3{^=*-Q zudk9I0`V`z&Tevn zGb`l%94Si~sxglUNsmsA&7yO`lTkS)q#Ot0Yp9(DkAB+U+3oJ{?KWF%f-AlD;9x_4 zo&AfL#9W#JAZ4OXq9UHm>_-Eq$8vJD(#=x|LZ(MXQr4fs)w;*}Xpf96IT9=-qU2eR zv(gNKV+5Obnpi2c>NJ{VEntNs>M{Vfh{G7GXz@Ud1P2iY4r>xn4tcyZZD|cmJFQ$S zsna*1sA(6-n%C^W$B&}k>h8YTKP_#PaX;x-+r_9@QR{pbm}vC*b}_@B+gGWi&1q6l z6t{I1!=JdH1jZj{pfDLcxTBWnpB3-2CqE z8))8V7RaUTxC)6UMXM!N!D1+tVIEbmJuc>E-@pC= zs?7Ju2C6PpxU)@>I?>1y8^@-D7@mAwB0VVBe!7VVBZqO5Zs&mjV(A zQ2+4{7zlZkU~0rpp?$WIGoBQ4pK@AqB8{xH4V^ScMLJ{`o3%wJcV;jcaoK5Ed+L#i zX6G&SimlJ+f{fqtd4A9-KsEZF@4Qv6eB@$Be{bmA zHEj3}7jgWFcX9b9flE<+>X}%@8y5$ppd%yfp^5L6ckWHPJ`fO9JCt2g*{$bxQFV#i ziPt8xQgRDK15CrZQJFe^_A>SVbJnTqs+Z{vjU}V^>7_I)TekRLZLu?KfDBv47rTeM zK!0|3I3^kyhTu0k6Bji9i1^DF$`H{Jy({vxVv93`C_}~%26VpBDZof^{-1yG@w`WRP;?s__s zKLaVQ{;de-%db;3&Lsn087Dr`{fT>nuP!|bG*p)mJmgYI9#}CMM=C7+-Ps6$O{Hjp zDA9#9Y(EeBGOP=m;6;{triASX=3!a9aRXn5DA34mO%$x#cgJll2Z|T*Hl87e*NG~;0X2f# z2c{#8=TL}lQ0yD5dH>qFyfNYPTPr ziMEd5bC!eQRS|mf*bNDG0iX-tzoR#&?Fr>W6+D1+iVR>B6 z=@n!;N;2(Ble7X@RSP5WAHJwrlBsUY3m3>yWmJc?+51v)6mt|uF%?D82%=aqBi9iJ zqO!8$d|zMDHfLh|w`~~g>RFC>Vs)P~Ydn+o+h>S&lrJ_|PH2jsG{HiO*C=tP6 zAZuk6o@@8y5Q|YPI?qRLNfAX2eKv4q zpLG}TI>ZWD9!M4&xTb28$tQyligxOq<+^`jWhOLH-hsT~l(J8}@aM8}Bcx)aDmajQL=9pC;=xW65u>}PC z&>~9{qMP{6QHuhTMnza^h@!}M?g&Lj!HDCn>J9=A{gP}j_?p0kUi=#f3|b zfxx%)20_Rs>Sj+!fT`GdWf~w#W4DYgBDSHp-C*-|A7Jn`bx==xc>menV$SUrW(0XR z#wKLia=ekK9;zS!g~M&$(6MJ~bLO*-`w0D{L^Osk7J$r{8hu=tn<&KU#pSIkHkM=@ z<2sBC?GMTxFHmc(48TcrRYldD0}G)TDPLXAl58d4J;@Ho=1QxXk*Ob3{G$v6Z*@n= ze_VSQaJAnj(JZSl;!OIlkdx+-1V3vyLP@_r<$6^o};TZ4*hGZbA z)x{;n1}J`GPFcQOD^vGIh8Vj*27FM%rADN0F!T$=^# zmraLUFDG7)EI0JkQU)>`5sMT5?zEP&8YBw`O^ z@e9J+5N!s!eV{%VYyks6UWwtSSQ|y@VyXx1c05 zLy{~PkR%n3#2So***%&_EvV&C4xp@@@wokm1?b0#X?Qu5zAI-{fp_PcUW*Th38R)f<$(a;DQ;x(%a(7-d3(ew3CI z&hPJ$*@kWv3%?fW4uhmBA4e|HVWJK^Mu|eW8SfNnF4M-NfNy5aJafQ#s7o+(efby# zW+Q6_c#~`kw}HVLbHNr4aQe2UwWvU7?gwUasMg&TG^LS(!62IfG=y6@SoJ2 zp=~O`ir8@38D;CnuAc+oRHn`)ag2!0I%hF=Bq6n>Sk`P6Gc%HPE;q^n`KFk0B3NL|B8YNQLooYvx z)ddP0>IRAvrU&1RMn6m^=X`NQ^lbGr{xsiis7$ocRyaK$B3s>;CaJx_l=BauAr>60 zNH;LOf{wWk6{Ehvar|25ZO5p%$~qkn3RT&Gb9vyBo3oNZ0-vG5A(O=k9+dbQJEN*=#zy)3;5REW*`2_0pn_KPFDsM1Dw5kz66 z2X+bV-5XpnepF0UEA|%U)7>w+kQQQYjU3K+}YTE0@ zPThDnS8Q`luM(3@`99;oRloxwWoisQF`jq>@t3NJ*waNCi4Q#1MC_G_64YdaKbw!J zM4`>OJ<3K@I#d&LcVsqul--`{=t*K@oLDx7SvE1w6LVvnG*keIY+{DaYMATBok+_Z zPV`{OTS?R=A}tRdlsVZ$x+v3#Xn$(vGP_2@QX#W6FR(6-jBRGwlNjVApIZK`L==gs zN#~(RP07q6jd>;HxMvkPX&6@>$z|#wyf$CO_>mP0*_)069}5s}#JonsUy`>sQ~-l^ zT{J`#0yQ2YTbTt@75#047pl>)b1Y3W`U$n8!AEWCdl@BmyYPCJK4>T$v$oeGK8Zon zt!zJ(DiGNVl?qHf_+E~Gl{0-A0~Oc6#>%EqP=wrNqfuk~Xq5Ce8dVBh`^j3Hh6}9g z*i8YUS*k_0)dY;bB0vsm`$@+94X&Y4=^-4Ypd+sY)+VV)AGOFV8{_0EG7&?WNXeB> zRX)SK5-;*P!mS?Qd4L}y3eYDVcradL>(;^|Y2L zo|OV)_f97yjlt^zLa#;PeRGlJ0r#UT`_aXMUF=3)d>5-owaDfbf63x`Hsd$U`la)8 zas8LVdjFYN|3$1lSnn4NVD5OF>vH@CwvspIZ2K(=q&$dUpb>N=-;A+Oy3z_dw!Is&bTVJcUnImpcBJl0_pLK) z@xz1N9W;^^ZGY(Yy~&KC&Hdvec2OP$Gm0IlTu%Y}7R@gB^sz3=Usd7gn8K&#sG@j| z?NbyDQs`LU8*#u<8B4t{c3#&{_SpPLz&xB|re3so6Qo(}iKCWyV{I#%5=%=xQjSs> zV22*CWg<5)AGVsq*<-i>JPjz}h0J@yW10_M&%FVE(C@FKRMZ_@$orN`S`47Bsz>77 z^PRD`D0E(>h2TF0CeEA8YDR24tUW$s8M!8MVum@%P zW3TTbjPqNSKUaoBNO>vfcnOJ)U~M$ecZZ|Nt#Bgq6E zCa*K0UCrPd%d6zpAeXmBb`Q4dksR!z;_Sw}N)D3pNSIPV78U zaz{K@WCpat_c)>K(#iH}jV*>Xz8q;bSU zR+w^d>Txi{`X(1oYG8~egxZ-Ecc2Gi!9*O5;fxT?em)vQ_6En~8_+=LEB>L;A(WPzsVmg!Qzf@wDvJ+7 zQrXRCpJMhN+6X&A^r}51ce;UKF4<&YOMpQRJPVBMQ~d;pKy1S}2CSL=m|b;&womGZ z&Hd+b2s2x>RhZSzyd}i_W3Jr81y{~It`u~$8QN+QPE~5_i;wYso3bB<@uP6TL&?}; zwi9U~A}uG?JUH~AGS7=d7y9u&Bpv=$e{6gER=e8r(XvFJDMb(eB~B8oXWs-Sqh(ee z8@2mzH&Wz{QFfv0<3_FBez>uDrltE7w#ONBQta;3XEAqwyI8m$RP|3$_;5Y=go=N3 zJ1Q!_4h3^HK8z*@W>^cu#o`I2+2%+goCIk! z2yThZR`DUEji`npW7WXbL@Ki@95PnAUEPpeS<;in2MCa&ZP{;sTj^K`Aslkm;j zM}8!Kx7*)tkemC;a_cEM<1X6tPDeE9*p|eQcDqtr20U*(Qe`HM|gn}{qa z$B0apF>d0mx@54F#X^j&W@9qBt?jL3u`2eaxF{A3w~I7;c4n)<{5Q(kFvm;*Xa`Pu zRTip2E%?gaBQiCkncoX6??9@(7+itRtz+L}dsii_$!mh_2k|+H2&!cwq|gexrXW$1 zXrQ@eAC#(Mb}B*wLk%OPZBn|Y(sPy;kDI6@v7sr7rTpPqdjR*L>6qmlyeSisR(l^P z#0_a!V*=LHK&kvAK-F) z_}L1ESFk{64bSn-u&`krmYcCX?5JS0K^Z){YJ|v>cTp?DjTGO?P)YA8Fcp~<`yK{d z=;S+;m7SYKqnHj^^S|#9TKevF*C@RWFB6Yw{~2tNto)3!qd()+=*Zh4%@XPA9gLrf zLy1`vini218UxfS28vW1kA%BiIwR( zCQ?f32&}<*5K3(Z?6~b1DkLY^+?qW8e5U~2FojW_f^D{tU+)z7J^TwR8j6m}DGA^7 zinG45ipF!eE;MhQ!Wg&XdZ!Qu@&U3m6rM*E(q~)2q@(%dAo#pXjbUEDtLN}$;4akv z*&R@`$S0855wh+NKmPKu`>`ng0brxkjU@8l!K3)G*2y^6e*f#POZ?DYXszrsRdw%m zvhE)N=8iPx48VqZ?F9Svw`I7z1$OFKRNuMos5=^a@8LRuib{9v!^--=miK9#a=_K0 zgBi_gK{Vn!VwDN$9#G3Nk$=|y`mdSIxu}YUttjD)j$ZQ^?K9I98Y~#+1edHTIwP|3 zhduJ@`)^81#Dta1YSY6Qtd1CZzBhCR+6;wQR%T>L2c=_O$(W{OH*gD+Hq>e_#q4Q+ zPJt6t!#MUsyr1IX9ahNZ07GJhVtpEpQI@oY|0s7Y8C>^fGbRdguO0!2te2l=4J20hoVjCz9pYZ!c$Y)ILN$4rQ9js)Xr2ID?^ z=}Sp~h6eMe&H!PzCQ-1Mko`-Q>v!L~piI0IV_-Oy6vSUHTuqw>K?6!P$l+wk z`5O&p5f_!$vZP|(O;_^QNwWK{3@#!b#D1qtc2Sk8%>bwOIY9deaO< zTxzGPbaf13WtBTiQ@~~s7*xQ35TbaXElJt>{*c^*_Rvka#X$(yD`+JmKA?PI{g;RG z8~%mx6L`cCD(m2iCsVPa%0Nm(Xc1*7uCt*CL~R z^Yrok4EVxR^zx4xK#V}Cs}8jvL-@s@Nk4`x+O0(p9F~oOeAQ2~+y#@)b5SJ~^v*;7 z*)F=*mf8o8TQ95pQYR=)HkLE8t{=VVQmobI^~R5_X1(=tW_0{L#I7rhs?1TgFDMzW z&x#G{{K7{36paP_@F+vWXbj}#TqRK_!t7(*#fjIO4p2%!Dr4;`v{`%lP)lqn{zJb{ zZreHpx6T5J5n1?Th+;n_6F16y#%QO(+d~EkmU?O#xfURC;95~K^B?0efeEPNgDhJ! zPse8xmj|D0s|4d;`mdOy<|t;V?VmZXxr~bNL(--F!xyFY6(3O?WK2eNC9dNXwEWiMC{r496%JX2D!F!U zLo$M($RqZM$wGW!QD;WfPi9fhl}=UQfn_p|}Aw{y%u% z>n5}J_531HISP2P&h|@t#*b$zA_av^r#DnSV*|xDjS8)RbCkJ<<29sfPTca4jxp_D z&>})E;~UV8!b9w(z%ulTPk>McCX2ve3z3(CB<|`)M0*o{Ovvm~pIan5RmZ9A=v2ol z20p=q|K#ZC)N-C0uIS0q(!(Q8fMwX4aS%+xSi=MRWI}(TK^23}|mj`cNelR+Ah% zF>+e}^z0cmvd#)|6NWShF}sA(#ie*Ip9~sKoUsDu2Oo>YvhjeyCum^|_L*5iMl?L- z+dXxk@&TR`N9Uji8U~}Jo93BpM^e;OBOjtcZB_l?Q);_K@3l`4Hq0nMW|Qdk8DS(x zTDIUNtKPXvFdZ8RE1k>FT_J@xfIdt>cvJ2k)}J@g4x{m-B_>>)n={JF9f@0xpXyv0 z)j`mECoiq3z1R0b6rog8Wudf#X0#~TAUahVQasZ0vFp4;o)~*RAf~AwG6gjCrW|%a zXT3robnIB3lOiT3v#YUO3l&1r4GH7#IG4mPOMY6bEhB9vF2!XKpfDy8eWR9(Y)kM^ z_Z+yCu2ru_(;LD=c~{V>-0IKwDSC*DLpJkIMZP&vNH+`;L@-obH!Y4qZ(nIgRm8Ky zdsZ}UvXt)#?POTB)03aOyC{N)S}7a*nTGI|u72m9zb>Pjr@U8m9syuBcAI0`X!?QTEX%&lni11k3Pv8CA4$GVtQJQ0mZ81kS!DU@1+8TH2A&C}1H zQeM#cliFTA!#GT$SZMAa?j9Z$MP6U0@}D!;cC9a-xZO*C+8rc>@yjgD%G#q%6o|0> zNONZ!*tOe${59heSi8`l}hxQ@NouG=3uxX;C6Kl5am90`=5@Q?r=KThNZkKO^B9@ zAi*T#=Ocm0oc?$OVBuwDuTGLW&kSO*!-H=EbgYTO&p@Ap1 zk|vAwQ0SYj-^AX$<`ccaQMVw-2KS^4DZ^ z0pH=w?fqfcEW}|jQGqUGE<6-jp~6H^AUzHNhHg3tBlIRynR}9%9wPyWJfw9q@D>kv z0H^bCTr-ZZihh8dXG}G-8c2yU9pl`{o^;T=Q*vA~xDUiWXiHS4uhaK*LegDRJ8X%8Wd@HkdAc??0LAu@}sBi%V^IQgra0Er6 z*vf+alS+s+s4uyR6-%R!HoM#aw7J3!Qmu^Q)JL-@?MS1ya{D}e4D4&X%htvRqfw7a z<*h�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�Mg&T{aVAD^%kI1gIlx>JX? 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 z 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

    BjMNNeDGi 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%0D{yoUHpLC%hi0Q#ndcgv#GVK7dNDF7 zW2r`5kr`c^JsUCg#y>Z|!{jP}7}ifkk&PM!yG48Pr-vsXM>f~_9 Dd~fJ`%8c($ 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 z

    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

    Nwm^( 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

    PP`nIoi<&AsxtqvlQxEtmN9a=+Rn=PN|(4x41% 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 z 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

    +4a&+TMw8o5B|_H&#_C?Zet=#o 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 literal 0 HcmV?d00001 diff --git a/extras/security/apparmor/unrealircd b/extras/security/apparmor/unrealircd index c9eb837..e6c9a0a 100644 --- a/extras/security/apparmor/unrealircd +++ b/extras/security/apparmor/unrealircd @@ -1,9 +1,9 @@ -# AppArmor profile for UnrealIRCd 5 +# AppArmor profile for UnrealIRCd 6 # # Note that you may still see some DENIED warnings in logs with # operation="chmod". These are harmless and can be safely ignored. # -# Tested on Ubuntu 16.04 LTS and Ubuntu 18.04 LTS +# Tested on Ubuntu 16.04 LTS, Ubuntu 18.04 LTS, Ubuntu 20.04 LTS # # IMPORTANT: you will have to modify the path to executable below # if it's not /home/ircd/unrealircd/bin/unrealircd ! diff --git a/extras/tests/tls/cipherscan_profiles/openssl-300.txt b/extras/tests/tls/cipherscan_profiles/openssl-300.txt new file mode 100644 index 0000000..76c368f --- /dev/null +++ b/extras/tests/tls/cipherscan_profiles/openssl-300.txt @@ -0,0 +1,27 @@ +Target: 127.0.0.1:5901 + +prio ciphersuite protocols pfs curves +1 ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 ECDH,P-521,521bits secp521r1,secp384r1 +2 ECDHE-ECDSA-AES128-GCM-SHA256 TLSv1.2 ECDH,P-521,521bits secp521r1,secp384r1 +3 ECDHE-ECDSA-AES256-SHA384 TLSv1.2 ECDH,P-521,521bits secp521r1,secp384r1 +4 ECDHE-ECDSA-AES128-SHA256 TLSv1.2 ECDH,P-521,521bits secp521r1,secp384r1 +5 ECDHE-ECDSA-AES256-SHA TLSv1.2 ECDH,P-521,521bits secp521r1,secp384r1 +6 ECDHE-ECDSA-AES128-SHA TLSv1.2 ECDH,P-521,521bits secp521r1,secp384r1 + +Certificate: untrusted, 384 bits, ecdsa-with-SHA256 signature +TLS ticket lifetime hint: None +NPN protocols: None +OCSP stapling: not supported +Cipher ordering: server +Curves ordering: server - fallback: no +Server supports secure renegotiation +Server supported compression methods: NONE +TLS Tolerance: yes + +Intolerance to: + SSL 3.254 : absent + TLS 1.0 : PRESENT + TLS 1.1 : PRESENT + TLS 1.2 : absent + TLS 1.3 : absent + TLS 1.4 : absent diff --git a/extras/tls.cnf b/extras/tls.cnf index 7a04a4a..46a9611 100644 --- a/extras/tls.cnf +++ b/extras/tls.cnf @@ -18,7 +18,7 @@ stateOrProvinceName_default = New York localityName = Locality Name (eg, city) 0.organizationName = Organization Name (eg, company) -0.organizationName_default = SuperNETs +0.organizationName_default = IRC geeks organizationalUnitName = Organizational Unit Name (eg, section) organizationalUnitName_default = IRCd diff --git a/extras/unrealircd-upgrade-script.in b/extras/unrealircd-upgrade-script.in index 6ce5743..6c3005b 100644 --- a/extras/unrealircd-upgrade-script.in +++ b/extras/unrealircd-upgrade-script.in @@ -1,11 +1,11 @@ -#!/bin/bash +#!/usr/bin/env bash # # This is stage 1 of the UnrealIRCd upgrade script # It downloads stage 2 online, verifies the integrity, and then # passes control to it to proceed with the rest of the upgrade. # -# This is a bash script, so it is less cross-platform than -# the rest of UnrealIRCd. We also mostly assume Linux here. +# This is a bash script, so it is less cross-platform than the +# rest of UnrealIRCd. We also mostly assume Linux/FreeBSD here. # BUILDDIR="@BUILDDIR@" @@ -55,13 +55,19 @@ if [ ! -d "$BUILDDIR" ]; then exit 1 fi +FETCHER="wget" if ! wget --help 1>/dev/null 2>&1; then - echo "The tool 'wget' is missing, which is used by this script." - echo "On Linux consider running 'sudo apt install wget' or 'sudo yum install wget'" - echo "and run this script again." - echo "Or, don't use this script and follow the manual upgrade procedure from" - echo "https://www.unrealircd.org/docs/Upgrading" - exit 1 + # fetch is a pain: it always returns 1 (false) even for usage info and has no --version + fetch 1>/dev/null 2>&1 + if [ "$?" -ne 1 ]; then + echo "The tool 'wget' is missing, which is used by this script." + echo "On Linux consider running 'sudo apt install wget' or 'sudo yum install wget'" + echo "and run this script again." + echo "Or, don't use this script and follow the manual upgrade procedure from" + echo "https://www.unrealircd.org/docs/Upgrading" + exit 1 + fi + FETCHER="fetch" fi # Weird way to get version, but ok. @@ -70,11 +76,16 @@ UNREALVER="`./configure --version|head -n1|awk '{ print $3 }'`" cd .. || fail "Could not cd back" # Set and export all variables with settings -export UNREALVER BUILDDIR SCRIPTDIR DOCDIR TMPDIR +export UNREALVER BUILDDIR SCRIPTDIR DOCDIR TMPDIR FETCHER # Download the install script -wget -O unrealircd-upgrade-script.stage2 "https://www.unrealircd.org/downloads/unrealircd-upgrade-script.stage2?from=$UNREALVER" || fail "Could not download online installer" -wget -O unrealircd-upgrade-script.stage2.asc "https://www.unrealircd.org/downloads/unrealircd-upgrade-script.stage2.asc" || fail "Could not download online installer signature" +if [ "$FETCHER" = "wget" ]; then + wget -O unrealircd-upgrade-script.stage2 "https://www.unrealircd.org/downloads/unrealircd-upgrade-script.stage2?from=$UNREALVER" || fail "Could not download online installer" + wget -O unrealircd-upgrade-script.stage2.asc "https://www.unrealircd.org/downloads/unrealircd-upgrade-script.stage2.asc" || fail "Could not download online installer signature" +else + fetch -o unrealircd-upgrade-script.stage2 "https://www.unrealircd.org/downloads/unrealircd-upgrade-script.stage2?from=$UNREALVER" || fail "Could not download online installer" + fetch -o unrealircd-upgrade-script.stage2.asc "https://www.unrealircd.org/downloads/unrealircd-upgrade-script.stage2.asc" || fail "Could not download online installer signature" +fi # GPG verification - if available if gpg --version 1>/dev/null 2>&1; then @@ -94,7 +105,11 @@ if gpg --version 1>/dev/null 2>&1; then fi else echo "WARNING: The GnuPG (GPG/PGP) verification tool 'gpg' is not installed." - echo "Consider running 'sudo apt install gpg' or 'yum install gnupg2'" + if [[ "$OSTYPE" == "freebsd"* ]] ; then + echo "Consider running 'sudo pkg install gnupg'" + else + echo "Consider running 'sudo apt install gpg' or 'yum install gnupg2'" + fi echo "When 'gpg' is installed then the UnrealIRCd upgrade script can" echo "verify the digital signature of the download file." warn "Unable to check download integrity" @@ -103,3 +118,6 @@ fi chmod +x unrealircd-upgrade-script.stage2 ./unrealircd-upgrade-script.stage2 $* +SAVERET="$?" +rm -f unrealircd-upgrade-script.stage2 unrealircd-upgrade-script.stage2 +exit $SAVERET diff --git a/include/channel.h b/include/channel.h index 44fe84a..f229290 100644 --- a/include/channel.h +++ b/include/channel.h @@ -26,7 +26,7 @@ #define MODEBUFLEN 200 -#define ChannelExists(n) (find_channel(n, NULL)) +#define ChannelExists(n) (find_channel(n)) /* NOTE: Timestamps will be added to MODE-commands, so never make * RESYNCMODES and MODEPARAMS higher than MAXPARA-3. DALnet servers diff --git a/include/common.h b/include/common.h index a666bb9..5a0d1d6 100644 --- a/include/common.h +++ b/include/common.h @@ -98,7 +98,6 @@ extern int myncmp(const char *, const char *, int); extern char *strtoken(char **, char *, char *); extern MODVAR int global_count, max_global_count; -extern char *myctime(time_t); #ifdef _WIN32 extern int gettimeofday(struct timeval *tp, void *tzp); #endif @@ -174,18 +173,7 @@ extern MODVAR unsigned char char_atribs[]; #define EXPAR2 extchmstr[1] #define EXPAR3 extchmstr[2] #define EXPAR4 extchmstr[3] - -#ifdef PREFIX_AQ -#define CHPFIX "(qaohv)~&@%+" -#define CHPAR1 "beI" -#else -#define CHPFIX "(ohv)@%+" -#define CHPAR1 "beIqa" -#endif /* PREFIX_AQ */ - -#define CHPAR2 "k" -#define CHPAR3 "l" -#define CHPAR4 "psmntir" +#define CHPAR1 "beI" #ifdef _WIN32 /* diff --git a/include/config.h b/include/config.h index 6becea2..9156eb7 100644 --- a/include/config.h +++ b/include/config.h @@ -98,9 +98,6 @@ */ /* #undef DEBUGMODE */ -/* Similarly, DEBUG_IOENGINE can be used to debug the I/O engine. */ -/* #undef DEBUG_IOENGINE */ - /* * Full pathnames and defaults of irc system's support files. */ @@ -126,7 +123,7 @@ * Common usage for this are: a trusted bot ran by an IRCOp, that you only * want to give "flood access" and nothing else, and other such things. */ -#define FAKELAG_CONFIGURABLE +//#undef FAKELAG_CONFIGURABLE /* The default value for class::sendq */ #define DEFAULT_SENDQ 3000000 @@ -212,10 +209,25 @@ * when there is no socket data waiting for us (no clients sending anything). * Was 2000ms in 3.2.x, 1000ms for versions below 3.4-alpha4. * 500ms in UnrealIRCd 4 (?) - * 250ms in UnrealIRCd 5. + * 250ms in UnrealIRCd 5 and UnrealIRCd 6. */ #define SOCKETLOOP_MAX_DELAY 250 +/* After how much time should we timeout downloads: + * DOWNLOAD_CONNECT_TIMEOUT: for the DNS and connect() / TLS_connect() call + * DOWNLOAD_TRANSFER_TIMEOUT: for the complete transfer (including connect) + * This can't be in the configuration file, as we need it while + * fetching the configuration file.. ;) + */ +#define DOWNLOAD_CONNECT_TIMEOUT 15 +#define DOWNLOAD_TRANSFER_TIMEOUT 45 + +/* Maximum number of HTTP redirects to follow. + * Keep this reasonably low, as this may delay booting up to + * DOWNLOAD_TRANSFER_TIMEOUT * DOWNLOAD_MAX_REDIRECTS + */ +#define DOWNLOAD_MAX_REDIRECTS 2 + /* * Max time from the nickname change that still causes KILL * automaticly to switch for the current nick of that user. (seconds) @@ -233,25 +245,34 @@ #endif /* Maximum number of ModData objects that may be attached to an object */ -/* UnrealIRCd 4.0.0 - 4.0.13: 8, 8, 4, 4 - * UnrealIRCd 4.0.14+ : 12, 8, 4, 4 - * UnrealIRCd 5.0.0 : 12, 8, 8, 4, 4, 500, 500 +/* UnrealIRCd 4.0.0 - 4.0.13: 8, 8, 4, 4 + * UnrealIRCd 4.0.14+ : 12, 8, 4, 4 + * UnrealIRCd 5.0.0 : 12, 8, 8, 4, 4, 500, 500 + * UnrealIRCd 6.0.0 : 24, 12, 8, 4, 4, 500, 500 */ -#define MODDATA_MAX_CLIENT 12 -#define MODDATA_MAX_LOCAL_CLIENT 8 +#define MODDATA_MAX_CLIENT 24 +#define MODDATA_MAX_LOCAL_CLIENT 12 #define MODDATA_MAX_CHANNEL 8 #define MODDATA_MAX_MEMBER 4 #define MODDATA_MAX_MEMBERSHIP 4 #define MODDATA_MAX_LOCAL_VARIABLE 500 #define MODDATA_MAX_GLOBAL_VARIABLE 500 +/** Size of the member modes buffer, so can be max this-1 modes + * assigned to an individual user (and thus max prefixes as well). + * The default is 8, so 7 max modes, and is a bit tight. + * It allows for vhoaq (5) and then 2 additional ones from 3rd + * party modules. + */ +#define MEMBERMODESLEN 8 + /* If EXPERIMENTAL is #define'd then all users will receive a notice about * this when they connect, along with a pointer to bugs.unrealircd.org where * they can report any problems. This is mainly to help UnrealIRCd development. */ #undef EXPERIMENTAL -/* Default SSL/TLS cipherlist (except for TLS1.3, see further down). +/* Default TLS cipherlist (except for TLS1.3, see further down). * This can be changed via set::ssl::options::ciphers in the config file. */ #define UNREALIRCD_DEFAULT_CIPHERS "TLS13-CHACHA20-POLY1305-SHA256 TLS13-AES-256-GCM-SHA384 TLS13-AES-128-GCM-SHA256 EECDH+CHACHA20 EECDH+AESGCM EECDH+AES AES256-GCM-SHA384 AES128-GCM-SHA256 AES256-SHA256 AES128-SHA256 AES256-SHA AES128-SHA" @@ -261,7 +282,7 @@ */ #define UNREALIRCD_DEFAULT_CIPHERSUITES "TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_8_SHA256:TLS_AES_128_CCM_SHA256" -/* Default SSL/TLS curves for ECDH(E) +/* Default TLS curves for ECDH(E) * This can be changed via set::ssl::options::ecdh-curve in the config file. * NOTE: This requires openssl 1.0.2 or newer, otherwise these defaults * are not applied, due to the missing openssl API call. @@ -280,10 +301,8 @@ #define IRCD_PIDFILE PIDFILE #ifdef DEBUGMODE - #define Debug(x) debug x #define LOGFILE LPATH #else - #define Debug(x) ; #define LOGFILE "/dev/null" #endif diff --git a/include/dbuf.h b/include/dbuf.h index fe1e88e..522b6c4 100644 --- a/include/dbuf.h +++ b/include/dbuf.h @@ -70,7 +70,7 @@ typedef struct dbufbuf { ** memory as needed. Bytes are copied into internal buffers ** from users buffer. */ -void dbuf_put(dbuf *, char *, size_t); +void dbuf_put(dbuf *, const char *, size_t); /* Dynamic buffer header */ /* Pointer to data to be stored */ /* Number of bytes to store */ diff --git a/include/dynconf.h b/include/dynconf.h index dbf4c4d..978f444 100644 --- a/include/dynconf.h +++ b/include/dynconf.h @@ -32,26 +32,12 @@ struct FloodSettings { long period[MAXFLOODOPTIONS]; }; -typedef struct NetworkConfiguration NetworkConfiguration; -struct NetworkConfiguration { - unsigned x_inah:1; - char *x_ircnetwork; - char *x_ircnet005; - char *x_defserv; - char *x_services_name; - char *x_hidden_host; - char *x_prefix_quit; - char *x_helpchan; - char *x_stats_server; - char *x_sasl_server; -}; - enum UHAllowed { UHALLOW_ALWAYS, UHALLOW_NOCHANS, UHALLOW_REJOIN, UHALLOW_NEVER }; struct ChMode { - long mode; + long mode; long extmodes; - char *extparams[EXTCMODETABLESZ]; + char *extparams[256]; }; typedef struct OperStat { @@ -70,10 +56,9 @@ typedef enum HideIdleTimePolicy { HIDE_IDLE_TIME_NEVER=1, HIDE_IDLE_TIME_ALWAYS= /** The set { } block configuration */ typedef struct Configuration Configuration; struct Configuration { - unsigned som:1; + unsigned show_opermotd:1; unsigned hide_ulines:1; unsigned flat_map:1; - unsigned allow_chatops:1; unsigned ident_check:1; unsigned fail_oper_warn:1; unsigned show_connect_info:1; @@ -86,8 +71,6 @@ struct Configuration { unsigned allow_part_if_shunned:1; unsigned disable_cap:1; unsigned check_target_nick_bans:1; - unsigned use_egd : 1; - char *dns_bindip; char *link_bindip; long throttle_period; char throttle_count; @@ -100,11 +83,10 @@ struct Configuration { char *oper_auto_join_chans; char *allow_user_stats; OperStat *allow_user_stats_ext; - int ping_warning; - int maxchannelsperuser; - int maxdccallow; - int anti_spam_quit_message_time; - char *egd_path; + int ping_warning; + int maxchannelsperuser; + int maxdccallow; + int anti_spam_quit_message_time; char *static_quit; char *static_part; TLSOptions *tls_options; @@ -122,12 +104,14 @@ struct Configuration { char *restrict_usermodes; char *restrict_channelmodes; char *restrict_extendedbans; + int named_extended_bans; char *channel_command_prefix; long handshake_data_flood_amount; long handshake_data_flood_ban_time; int handshake_data_flood_ban_action; struct ChMode modes_on_join; - int level_on_join; + int modes_on_join_set; + char *level_on_join; FloodSettings *floodsettings; int ident_connect_timeout; int ident_read_timeout; @@ -148,7 +132,6 @@ struct Configuration { int maxbanlength; int watch_away_notification; int uhnames; - NetworkConfiguration network; unsigned short default_ipv6_clone_mask; int ping_cookie; int min_nick_length; @@ -176,6 +159,17 @@ struct Configuration { BroadcastChannelMessagesOption broadcast_channel_messages; AllowedChannelChars allowed_channelchars; HideIdleTimePolicy hide_idle_time; + unsigned inah:1; + char *network_name; + char *network_name_005; + char *default_server; + char *services_name; + char *cloak_prefix; + char *prefix_quit; + char *helpchan; + char *stats_server; + char *sasl_server; + int server_notice_colors; }; extern MODVAR Configuration iConf; @@ -187,7 +181,7 @@ extern MODVAR int ipv6_disabled; #define CONN_MODES iConf.conn_modes #define OPER_MODES iConf.oper_modes #define OPER_SNOMASK iConf.oper_snomask -#define SHOWOPERMOTD iConf.som +#define SHOWOPERMOTD iConf.show_opermotd #define HIDE_ULINES iConf.hide_ulines #define FLAT_MAP iConf.flat_map #define ALLOW_CHATOPS iConf.allow_chatops @@ -197,7 +191,6 @@ extern MODVAR int ipv6_disabled; #define DONT_RESOLVE iConf.dont_resolve #define AUTO_JOIN_CHANS iConf.auto_join_chans #define OPER_AUTO_JOIN_CHANS iConf.oper_auto_join_chans -#define DNS_BINDIP iConf.dns_bindip #define LINK_BINDIP iConf.link_bindip #define IDENT_CHECK iConf.ident_check #define FAILOPER_WARN iConf.fail_oper_warn @@ -205,23 +198,17 @@ extern MODVAR int ipv6_disabled; #define NOCONNECTTLSLINFO iConf.no_connect_tls_info #define ALLOW_USER_STATS iConf.allow_user_stats #define ANTI_SPAM_QUIT_MSG_TIME iConf.anti_spam_quit_message_time -#ifdef HAVE_RAND_EGD -#define USE_EGD iConf.use_egd -#else -#define USE_EGD 0 -#endif -#define EGD_PATH iConf.egd_path -#define ircnetwork iConf.network.x_ircnetwork -#define ircnet005 iConf.network.x_ircnet005 -#define defserv iConf.network.x_defserv -#define SERVICES_NAME iConf.network.x_services_name -#define hidden_host iConf.network.x_hidden_host -#define helpchan iConf.network.x_helpchan -#define STATS_SERVER iConf.network.x_stats_server -#define SASL_SERVER iConf.network.x_sasl_server -#define iNAH iConf.network.x_inah -#define PREFIX_QUIT iConf.network.x_prefix_quit +#define NETWORK_NAME iConf.network_name +#define NETWORK_NAME_005 iConf.network_name_005 +#define DEFAULT_SERVER iConf.default_server +#define SERVICES_NAME iConf.services_name +#define CLOAK_PREFIX iConf.cloak_prefix +#define HELP_CHANNEL iConf.helpchan +#define STATS_SERVER iConf.stats_server +#define SASL_SERVER iConf.sasl_server +#define iNAH iConf.inah +#define PREFIX_QUIT iConf.prefix_quit #define STATIC_QUIT iConf.static_quit #define STATIC_PART iConf.static_part @@ -232,7 +219,7 @@ extern MODVAR int ipv6_disabled; #define THROTTLING_PERIOD iConf.throttle_period #define THROTTLING_COUNT iConf.throttle_count #define USE_BAN_VERSION iConf.use_ban_version -#define MODES_ON_JOIN iConf.modes_on_join.mode +#define MODES_ON_JOIN iConf.modes_on_join.extmodes #define LEVEL_ON_JOIN iConf.level_on_join #define IDENT_CONNECT_TIMEOUT iConf.ident_connect_timeout @@ -309,7 +296,6 @@ struct SetCheck { unsigned has_maxchannelsperuser:1; unsigned has_maxdccallow:1; unsigned has_anti_spam_quit_message_time:1; - unsigned has_egd_path:1; unsigned has_static_quit:1; unsigned has_static_part:1; unsigned has_allow_userhost_change:1; diff --git a/include/fdlist.h b/include/fdlist.h index 6bb0318..bb24f4f 100644 --- a/include/fdlist.h +++ b/include/fdlist.h @@ -7,6 +7,8 @@ typedef void (*IOCallbackFunc)(int fd, int revents, void *data); +typedef enum FDCloseMethod { FDCLOSE_SOCKET=0, FDCLOSE_FILE=1, FDCLOSE_NONE=3 } FDCloseMethod; + typedef struct fd_entry { int fd; char desc[FD_DESC_SZ]; @@ -15,14 +17,14 @@ typedef struct fd_entry { void *data; time_t deadline; unsigned char is_open; + FDCloseMethod close_method; unsigned int backend_flags; } FDEntry; extern MODVAR FDEntry fd_table[MAXCONNECTIONS + 1]; -extern int fd_open(int fd, const char *desc); -extern void fd_close(int fd); -extern int fd_unmap(int fd); +extern int fd_open(int fd, const char *desc, FDCloseMethod close_method); +extern int fd_close(int fd); extern void fd_unnotify(int fd); extern int fd_socket(int family, int type, int protocol, const char *desc); extern int fd_accept(int sockfd); diff --git a/include/h.h b/include/h.h index f1aa4fc..6b380f5 100644 --- a/include/h.h +++ b/include/h.h @@ -30,10 +30,6 @@ extern MODVAR char *extraflags; extern MODVAR int tainted; -/* for the new s_err.c */ -extern char *getreply(int); -#define rpl_str(x) getreply(x) -#define err_str(x) getreply(x) extern MODVAR Member *freemember; extern MODVAR Membership *freemembership; extern MODVAR Client me; @@ -52,7 +48,7 @@ extern MODVAR char umodestring[UMODETABLESZ+1]; #define get_recvq(x) ((x)->local->class->recvq ? (x)->local->class->recvq : DEFAULT_RECVQ) /* Configuration preprocessor */ -extern PreprocessorItem parse_preprocessor_item(char *start, char *end, char *filename, int linenumber, ConditionalConfig **cc); +extern PreprocessorItem parse_preprocessor_item(char *start, char *end, const char *filename, int linenumber, ConditionalConfig **cc); extern void preprocessor_cc_duplicate_list(ConditionalConfig *r, ConditionalConfig **out); extern void preprocessor_cc_free_level(ConditionalConfig **cc_list, int level); extern void preprocessor_cc_free_list(ConditionalConfig *cc); @@ -76,7 +72,6 @@ extern MODVAR ConfigItem_tld *conf_tld; extern MODVAR ConfigItem_oper *conf_oper; extern MODVAR ConfigItem_listen *conf_listen; extern MODVAR ConfigItem_allow *conf_allow; -extern MODVAR ConfigItem_except *conf_except; extern MODVAR ConfigItem_vhost *conf_vhost; extern MODVAR ConfigItem_link *conf_link; extern MODVAR ConfigItem_sni *conf_sni; @@ -85,9 +80,7 @@ extern MODVAR ConfigItem_deny_channel *conf_deny_channel; extern MODVAR ConfigItem_deny_link *conf_deny_link; extern MODVAR ConfigItem_allow_channel *conf_allow_channel; extern MODVAR ConfigItem_deny_version *conf_deny_version; -extern MODVAR ConfigItem_log *conf_log; extern MODVAR ConfigItem_alias *conf_alias; -extern MODVAR ConfigItem_include *conf_include; extern MODVAR ConfigItem_help *conf_help; extern MODVAR ConfigItem_offchans *conf_offchans; extern MODVAR SecurityGroup *securitygroups; @@ -97,10 +90,13 @@ extern EVENT(e_unload_module_delayed); extern EVENT(throttling_check_expire); extern void module_loadall(void); -extern long set_usermode(char *umode); -extern char *get_usermode_string_raw(long umodes); -extern ConfigFile *config_parse(char *filename, char *confdata); -extern ConfigFile *config_parse_with_offset(char *filename, char *confdata, unsigned int line_offset); +extern long set_usermode(const char *umode); +extern const char *get_usermode_string(Client *acptr); +extern const char *get_usermode_string_r(Client *client, char *buf, size_t buflen); +extern const char *get_usermode_string_raw(long umodes); +extern const char *get_usermode_string_raw_r(long umodes, char *buf, size_t buflen); +extern ConfigFile *config_parse(const char *filename, char *confdata); +extern ConfigFile *config_parse_with_offset(const char *filename, char *confdata, unsigned int line_offset); extern void config_error(FORMAT_STRING(const char *format), ...) __attribute__((format(printf,1,2))); extern void config_warn(FORMAT_STRING(const char *format), ...) __attribute__((format(printf,1,2))); extern void config_error_missing(const char *filename, int line, const char *entry); @@ -115,27 +111,25 @@ extern int config_is_blankorempty(ConfigEntry *cep, const char *block); extern MODVAR int config_verbose; extern void config_entry_free(ConfigEntry *ce); extern void config_entry_free_all(ConfigEntry *ce); -extern ConfigFile *config_load(char *filename, char *displayname); +extern ConfigFile *config_load(const char *filename, const char *displayname); extern void config_free(ConfigFile *cfptr); -extern void ipport_seperate(char *string, char **ip, char **port); -extern ConfigItem_class *find_class(char *name); -extern ConfigItem_deny_dcc *find_deny_dcc(char *name); -extern ConfigItem_oper *find_oper(char *name); -extern ConfigItem_operclass *find_operclass(char *name); -extern ConfigItem_listen *find_listen(char *ipmask, int port, int ipv6); -extern ConfigItem_sni *find_sni(char *name); -extern ConfigItem_ulines *find_uline(char *host); -extern ConfigItem_except *find_except(Client *, short type); +extern void ipport_seperate(const char *string, char **ip, char **port); +extern ConfigItem_class *find_class(const char *name); +extern ConfigItem_oper *find_oper(const char *name); +extern ConfigItem_operclass *find_operclass(const char *name); +extern ConfigItem_listen *find_listen(const char *ipmask, int port, int ipv6); +extern ConfigItem_sni *find_sni(const char *name); +extern ConfigItem_ulines *find_uline(const char *host); extern ConfigItem_tld *find_tld(Client *cptr); -extern ConfigItem_link *find_link(char *servername, Client *acptr); -extern ConfigItem_ban *find_ban(Client *, char *host, short type); -extern ConfigItem_ban *find_banEx(Client *,char *host, short type, short type2); -extern ConfigItem_vhost *find_vhost(char *name); -extern ConfigItem_deny_channel *find_channel_allowed(Client *cptr, char *name); -extern ConfigItem_alias *find_alias(char *name); -extern ConfigItem_help *find_Help(char *command); +extern ConfigItem_link *find_link(const char *servername, Client *acptr); +extern ConfigItem_ban *find_ban(Client *, const char *host, short type); +extern ConfigItem_ban *find_banEx(Client *,const char *host, short type, short type2); +extern ConfigItem_vhost *find_vhost(const char *name); +extern ConfigItem_deny_channel *find_channel_allowed(Client *cptr, const char *name); +extern ConfigItem_alias *find_alias(const char *name); +extern ConfigItem_help *find_Help(const char *command); -extern OperPermission ValidatePermissionsForPath(char *path, Client *client, Client *victim, Channel *channel, void *extra); +extern OperPermission ValidatePermissionsForPath(const char *path, Client *client, Client *victim, Channel *channel, const void *extra); extern void OperClassValidatorDel(OperClassValidator *validator); extern ConfigItem_ban *find_ban_ip(Client *client); @@ -144,8 +138,8 @@ extern void append_ListItem(ListStruct *item, ListStruct **list); extern void add_ListItemPrio(ListStructPrio *, ListStructPrio **, int); extern void del_ListItem(ListStruct *, ListStruct **); extern MODVAR LoopStruct loop; -extern int del_banid(Channel *channel, char *banid); -extern int del_exbanid(Channel *channel, char *banid); +extern int del_banid(Channel *channel, const char *banid); +extern int del_exbanid(Channel *channel, const char *banid); #define REPORT_DO_DNS "NOTICE * :*** Looking up your hostname...\r\n" #define REPORT_FIN_DNS "NOTICE * :*** Found your hostname\r\n" #define REPORT_FIN_DNSC "NOTICE * :*** Found your hostname (cached)\r\n" @@ -161,48 +155,66 @@ extern MODVAR struct list_head oper_list; extern MODVAR struct list_head unknown_list; extern MODVAR struct list_head global_server_list; extern MODVAR struct list_head dead_list; -extern RealCommand *find_command(char *cmd, int flags); -extern RealCommand *find_command_simple(char *cmd); +extern RealCommand *find_command(const char *cmd, int flags); +extern RealCommand *find_command_simple(const char *cmd); extern Membership *find_membership_link(Membership *lp, Channel *ptr); extern Member *find_member_link(Member *, Client *); -extern int remove_user_from_channel(Client *, Channel *); +extern int remove_user_from_channel(Client *client, Channel *channel, int dont_log); extern void add_server_to_table(Client *); extern void remove_server_from_table(Client *); -extern void iNAH_host(Client *client, char *host); -extern void set_snomask(Client *client, char *snomask); -extern char *get_snomask_string(Client *client); +extern void iNAH_host(Client *client, const char *host); +extern void set_snomask(Client *client, const char *snomask); extern int check_tkls(Client *cptr); /* for services */ extern void send_user_joins(Client *, Client *); extern int valid_channelname(const char *); -extern int valid_server_name(char *name); -extern long get_access(Client *, Channel *); -extern int ban_check_mask(Client *, Channel *, char *, int, char **, char **, int); -extern int extban_is_ok_nuh_extban(Client *, Channel *, char *, int, int, int); -extern char *extban_conv_param_nuh_or_extban(char *); -extern char *extban_conv_param_nuh(char *); -extern Ban *is_banned(Client *, Channel *, int, char **, char **); -extern Ban *is_banned_with_nick(Client *, Channel *, int, char *, char **, char **); +extern int valid_server_name(const char *name); +extern Cmode *find_channel_mode_handler(char letter); +extern int valid_channel_access_mode_letter(char letter); +extern int check_channel_access(Client *client, Channel *channel, const char *modes); +extern int check_channel_access_membership(Membership *mb, const char *modes); +extern int check_channel_access_member(Member *mb, const char *modes); +extern int check_channel_access_string(const char *current_modes, const char *modes); +extern int check_channel_access_letter(const char *current_modes, const char letter); +extern const char *get_channel_access(Client *client, Channel *channel); +extern void add_member_mode_fast(Member *mb, Membership *mbs, char letter); +extern void del_member_mode_fast(Member *mb, Membership *mbs, char letter); +extern void add_member_mode(Client *client, Channel *channel, char letter); +extern void del_member_mode(Client *client, Channel *channel, char letter); +extern char sjoin_prefix_to_mode(char s); +extern char mode_to_sjoin_prefix(char s); +extern char mode_to_prefix(char s); +extern char prefix_to_mode(char s); +extern const char *modes_to_prefix(const char *modes); +extern const char *modes_to_sjoin_prefix(const char *modes); +extern char rank_to_mode(int rank); +extern int mode_to_rank(char mode); +extern char lowest_ranking_mode(const char *modes); +extern char lowest_ranking_prefix(const char *prefix); +extern void channel_member_modes_generate_equal_or_greater(const char *modes, char *buf, size_t buflen); +extern int ban_check_mask(BanContext *b); +extern int extban_is_ok_nuh_extban(BanContext *b); +extern const char *extban_conv_param_nuh_or_extban(BanContext *b, Extban *extban); +extern const char *extban_conv_param_nuh(BanContext *b, Extban *extban); +extern Ban *is_banned(Client *, Channel *, int, const char **, const char **); +extern Ban *is_banned_with_nick(Client *, Channel *, int, const char *, const char **, const char **); -extern void ircd_log(int, FORMAT_STRING(const char *), ...) __attribute__((format(printf,2,3))); -extern Client *find_client(char *, Client *); -extern Client *find_name(char *, Client *); -extern Client *find_nickserv(char *, Client *); -extern Client *find_person(char *, Client *); -extern Client *find_server(char *, Client *); -extern Client *find_service(char *, Client *); +extern Client *find_client(const char *, Client *); +extern Client *find_name(const char *, Client *); +extern Client *find_nickserv(const char *, Client *); +extern Client *find_user(const char *, Client *); +extern Client *find_server(const char *, Client *); +extern Client *find_service(const char *, Client *); #define find_server_quick(x) find_server(x, NULL) extern char *find_or_add(char *); extern void inittoken(); extern void reset_help(); extern MODVAR char *debugmode, *configfile, *sbrk0; -extern char *getfield(char *); -extern void set_sockhost(Client *, char *); +extern void set_sockhost(Client *, const char *); #ifdef _WIN32 -extern MODFUNC char *sock_strerror(int); +extern const char *sock_strerror(int); #endif -extern int dgets(int, char *, int); #ifdef _WIN32 extern MODVAR int debuglevel; @@ -213,86 +225,111 @@ extern MODVAR int OpenFiles; /* number of files currently open */ extern MODVAR int debuglevel, portnum, debugtty, maxusersperchannel; extern MODVAR int readcalls, udpfd, resfd; extern Client *add_connection(ConfigItem_listen *, int); -extern void add_local_domain(char *, int); extern int check_server_init(Client *); extern void close_connection(Client *); extern void close_unbound_listeners(); -extern int connect_server(ConfigItem_link *, Client *, struct hostent *); -extern void get_my_name(Client *, char *, int); extern int get_sockerr(Client *); extern int inetport(ConfigItem_listen *, char *, int, int); extern void init_sys(); extern void check_user_limit(void); extern void init_modef(); -extern int verify_hostname(char *name); +extern int verify_hostname(const char *name); -extern void report_error(char *, Client *); extern int setup_ping(); extern void set_channel_mlock(Client *, Channel *, const char *, int); -extern void restart(char *); -extern void server_reboot(char *); +extern void restart(const char *); +extern void server_reboot(const char *); extern void terminate(), write_pidfile(); extern void *safe_alloc(size_t size); extern void set_socket_buffers(int fd, int rcvbuf, int sndbuf); extern int send_queued(Client *); extern void send_queued_cb(int fd, int revents, void *data); -extern void sendto_connectnotice(Client *client, int disconnect, char *comment); -extern void sendto_serv_butone_nickcmd(Client *one, Client *client, char *umodes); -extern void sendto_message_one(Client *to, Client *from, char *sender, - char *cmd, char *nick, char *msg); -#define PREFIX_ALL 0 -#define PREFIX_HALFOP 0x1 -#define PREFIX_VOICE 0x2 -#define PREFIX_OP 0x4 -#define PREFIX_ADMIN 0x08 -#define PREFIX_OWNER 0x10 +extern void sendto_serv_butone_nickcmd(Client *one, MessageTag *mtags, Client *client, const char *umodes); +extern void sendto_message_one(Client *to, Client *from, const char *sender, const char *cmd, const char *nick, const char *msg); extern void sendto_channel(Channel *channel, Client *from, Client *skip, - int prefix, long clicap, int sendflags, + char *member_modes, long clicap, int sendflags, MessageTag *mtags, FORMAT_STRING(const char *pattern), ...) __attribute__((format(printf,8,9))); extern void sendto_local_common_channels(Client *user, Client *skip, long clicap, MessageTag *mtags, FORMAT_STRING(const char *pattern), ...) __attribute__((format(printf,5,6))); extern void sendto_match_servs(Channel *, Client *, FORMAT_STRING(const char *), ...) __attribute__((format(printf,3,4))); -extern void sendto_match_butone(Client *, Client *, char *, int, MessageTag *, +extern void sendto_match_butone(Client *, Client *, const char *, int, MessageTag *, FORMAT_STRING(const char *pattern), ...) __attribute__((format(printf,6,7))); extern void sendto_all_butone(Client *, Client *, FORMAT_STRING(const char *), ...) __attribute__((format(printf,3,4))); extern void sendto_ops(FORMAT_STRING(const char *), ...) __attribute__((format(printf,1,2))); -extern void sendto_ops_butone(Client *, Client *, FORMAT_STRING(const char *), ...) __attribute__((format(printf,3,4))); extern void sendto_prefix_one(Client *, Client *, MessageTag *, FORMAT_STRING(const char *), ...) __attribute__((format(printf,4,5))); +extern void vsendto_prefix_one(Client *to, Client *from, MessageTag *mtags, const char *pattern, va_list vl); extern void sendto_opers(FORMAT_STRING(const char *), ...) __attribute__((format(printf,1,2))); extern void sendto_umode(int, FORMAT_STRING(const char *), ...) __attribute__((format(printf,2,3))); extern void sendto_umode_global(int, FORMAT_STRING(const char *), ...) __attribute__((format(printf,2,3))); -extern void sendto_snomask(int snomask, FORMAT_STRING(const char *pattern), ...) __attribute__((format(printf,2,3))); -extern void sendto_snomask_global(int snomask, FORMAT_STRING(const char *pattern), ...) __attribute__((format(printf,2,3))); extern void sendnotice(Client *to, FORMAT_STRING(const char *pattern), ...) __attribute__((format(printf,2,3))); -extern void sendnumeric(Client *to, int numeric, ...); +/** Send numeric message to a client. + * @param to The recipient + * @param numeric The numeric, one of RPL_* or ERR_*, see include/numeric.h + * @param ... The parameters for the numeric + * @note Be sure to provide the correct number and type of parameters that belong to the numeric. Check include/numeric.h when in doubt! + * @section sendnumeric_examples Examples + * @subsection sendnumeric_permission_denied Send "Permission Denied" numeric + * This numeric has no parameter, so is simple: + * @code + * sendnumeric(client, ERR_NOPRIVILEGES); + * @endcode + * @subsection sendnumeric_notenoughparameters Send "Not enough parameters" numeric + * This numeric requires 1 parameter: the name of the command. + * @code + * sendnumeric(client, ERR_NEEDMOREPARAMS, "SOMECOMMAND"); + * @endcode + * @ingroup SendFunctions + */ +#define sendnumeric(to, numeric, ...) sendnumericfmt(to, numeric, STR_ ## numeric, ##__VA_ARGS__) extern void sendnumericfmt(Client *to, int numeric, FORMAT_STRING(const char *pattern), ...) __attribute__((format(printf,3,4))); +extern void sendtxtnumeric(Client *to, FORMAT_STRING(const char *pattern), ...) __attribute__((format(printf,2,3))); +/** Build numeric message so it is ready to be sent to a client - rarely used, normally you use sendnumeric() instead. + * This function is normally only used in eg CAN_KICK and CAN_SET_TOPIC, where + * you need to set an 'errbuf' with a full IRC protocol line to reject the request + * (which then may or may not be sent depending on operoverride privileges). + * @param buf The buffer where the message should be stored to (full IRC protocol line) + * @param buflen The size of the buffer + * @param to The recipient + * @param numeric The numeric, one of RPL_* or ERR_*, see include/numeric.h + * @param ... The parameters for the numeric + * @note Be sure to provide the correct number and type of parameters that belong to the numeric. Check include/numeric.h when in doubt! + * @ingroup SendFunctions + */ +#define buildnumeric(buf, buflen, to, numeric, ...) buildnumericfmt(buf, buflen, to, numeric, STR_ ## numeric, ##__VA_ARGS__) +extern void buildnumericfmt(char *buf, size_t buflen, Client *to, int numeric, FORMAT_STRING(const char *pattern), ...) __attribute__((format(printf,5,6))); extern void sendto_server(Client *one, unsigned long caps, unsigned long nocaps, MessageTag *mtags, FORMAT_STRING(const char *format), ...) __attribute__((format(printf, 5, 6))); -extern void sendto_ops_and_log(FORMAT_STRING(const char *pattern), ...) __attribute__((format(printf,1,2))); - +extern void send_raw_direct(Client *user, FORMAT_STRING(const char *pattern), ...) __attribute__((format(printf, 2, 3))); extern MODVAR int writecalls, writeb[]; extern int deliver_it(Client *cptr, char *str, int len, int *want_read); extern int target_limit_exceeded(Client *client, void *target, const char *name); -extern char *canonize(char *buffer); +extern char *canonize(const char *buffer); extern int check_registered(Client *); extern int check_registered_user(Client *); -extern char *get_client_name(Client *, int); -extern char *get_client_host(Client *); -extern char *myctime(time_t); -extern char *short_date(time_t, char *buf); -extern char *long_date(time_t); -extern void exit_client(Client *client, MessageTag *recv_mtags, char *comment); -extern void exit_client_ex(Client *client, Client *origin, MessageTag *recv_mtags, char *comment); -extern void initstats(), tstats(Client *, char *); -extern char *check_string(char *); -extern char *make_nick_user_host(char *, char *, char *); -extern char *make_nick_user_host_r(char *namebuf, char *nick, char *name, char *host); -extern char *make_user_host(char *, char *); +extern const char *get_client_name(Client *, int); +extern const char *get_client_host(Client *); +extern const char *myctime(time_t); +extern const char *short_date(time_t, char *buf); +extern const char *long_date(time_t); +extern const char *pretty_time_val(long); +extern const char *pretty_time_val_r(char *buf, size_t buflen, long timeval); +extern const char *pretty_date(time_t t); +extern time_t server_time_to_unix_time(const char *tbuf); +extern time_t rfc2616_time_to_unix_time(const char *tbuf); +extern const char *rfc2616_time(time_t clock); +extern void exit_client(Client *client, MessageTag *recv_mtags, const char *comment); +extern void exit_client_fmt(Client *client, MessageTag *recv_mtags, FORMAT_STRING(const char *pattern), ...) __attribute__((format(printf, 3, 4))); +extern void exit_client_ex(Client *client, Client *origin, MessageTag *recv_mtags, const char *comment); +extern void initstats(); +extern const char *check_string(const char *); +extern char *make_nick_user_host(const char *, const char *, const char *); +extern char *make_nick_user_host_r(char *namebuf, size_t namebuflen, const char *nick, const char *name, const char *host); +extern char *make_user_host(const char *, const char *); extern void parse(Client *cptr, char *buffer, int length); -extern int hunt_server(Client *, MessageTag *, char *, int, int, char **); +extern int hunt_server(Client *, MessageTag *, const char *, int, int, const char **); extern int cmd_server_estab(Client *); extern void umode_init(void); #define UMODE_GLOBAL 1 @@ -309,79 +346,68 @@ extern void free_client(Client *); extern void free_link(Link *); extern void free_ban(Ban *); extern void free_user(Client *); -extern int find_str_match_link(Link *, char *); +extern int link_list_length(Link *lp); +extern int find_str_match_link(Link *, const char *); extern void free_str_list(Link *); extern Link *make_link(); extern Ban *make_ban(); extern User *make_user(Client *); extern Server *make_server(); extern Client *make_client(Client *, Client *); +extern Channel *make_channel(const char *name); extern Member *find_channel_link(Member *, Channel *); -extern char *pretty_mask(char *); +extern char *pretty_mask(const char *); extern void add_client_to_list(Client *); extern void remove_client_from_list(Client *); -extern void initlists(); -extern struct hostent *get_res(char *); -extern struct hostent *gethost_byaddr(char *, Link *); -extern struct hostent *gethost_byname(char *, Link *); +extern void initlists(void); +extern void initlist_channels(void); +extern struct hostent *get_res(const char *); +extern struct hostent *gethost_byaddr(const char *, Link *); +extern struct hostent *gethost_byname(const char *, Link *); extern void flush_cache(); extern void init_resolver(int firsttime); extern time_t timeout_query_list(time_t); extern time_t expire_cache(time_t); -extern void del_queries(char *); +extern void del_queries(const char *); /* Hash stuff */ #define NICK_HASH_TABLE_SIZE 32768 #define CHAN_HASH_TABLE_SIZE 32768 -#define WATCH_HASH_TABLE_SIZE 32768 #define WHOWAS_HASH_TABLE_SIZE 32768 #define THROTTLING_HASH_TABLE_SIZE 8192 -#define hash_find_channel find_channel extern uint64_t siphash(const char *in, const char *k); extern uint64_t siphash_raw(const char *in, size_t len, const char *k); extern uint64_t siphash_nocase(const char *in, const char *k); extern void siphash_generate_key(char *k); extern void init_hash(void); uint64_t hash_whowas_name(const char *name); -extern int add_to_client_hash_table(char *, Client *); -extern int del_from_client_hash_table(char *, Client *); -extern int add_to_id_hash_table(char *, Client *); -extern int del_from_id_hash_table(char *, Client *); -extern int add_to_channel_hash_table(char *, Channel *); -extern void del_from_channel_hash_table(char *, Channel *); -extern int add_to_watch_hash_table(char *, Client *, int); -extern int del_from_watch_hash_table(char *, Client *); -extern int hash_check_watch(Client *, int); -extern int hash_del_watch_list(Client *); -extern void count_watch_memory(int *, u_long *); -extern Watch *hash_get_watch(char *); +extern int add_to_client_hash_table(const char *, Client *); +extern int del_from_client_hash_table(const char *, Client *); +extern int add_to_id_hash_table(const char *, Client *); +extern int del_from_id_hash_table(const char *, Client *); +extern int add_to_channel_hash_table(const char *, Channel *); +extern void del_from_channel_hash_table(const char *, Channel *); extern Channel *hash_get_chan_bucket(uint64_t); extern Client *hash_find_client(const char *, Client *); extern Client *hash_find_id(const char *, Client *); extern Client *hash_find_nickatserver(const char *, Client *); -extern Channel *find_channel(char *name, Channel *channel); +extern Channel *find_channel(const char *name); extern Client *hash_find_server(const char *, Client *); extern struct MODVAR ThrottlingBucket *ThrottlingHash[THROTTLING_HASH_TABLE_SIZE]; -extern char *find_by_aln(char *); -extern char *convert2aln(int); -extern int convertfromaln(char *); -extern char *find_server_aln(char *); -extern time_t atime(char *xtime); /* Mode externs */ -extern MODVAR long UMODE_INVISIBLE; /* 0x0001 makes user invisible */ -extern MODVAR long UMODE_OPER; /* 0x0002 Operator */ -extern MODVAR long UMODE_WALLOP; /* 0x0004 send wallops to them */ -extern MODVAR long UMODE_REGNICK; /* 0x0020 Nick set by services as registered */ -extern MODVAR long UMODE_SERVNOTICE;/* 0x0100 server notices such as kill */ -extern MODVAR long UMODE_HIDE; /* 0x8000 Hide from Nukes */ -extern MODVAR long UMODE_SECURE; /* 0x800000 User is a secure connect */ -extern MODVAR long UMODE_DEAF; /* 0x10000000 Deaf */ -extern MODVAR long UMODE_HIDEOPER; /* 0x20000000 Hide oper mode */ -extern MODVAR long UMODE_SETHOST; /* 0x40000000 used sethost */ +extern MODVAR long UMODE_INVISIBLE; /* makes user invisible */ +extern MODVAR long UMODE_OPER; /* Operator */ +extern MODVAR long UMODE_REGNICK; /* Nick set by services as registered */ +extern MODVAR long UMODE_SERVNOTICE;/* server notices such as kill */ +extern MODVAR long UMODE_HIDE; /* Hide from Nukes */ +extern MODVAR long UMODE_SECURE; /* User is a secure connect */ +extern MODVAR long UMODE_DEAF; /* Deaf */ +extern MODVAR long UMODE_HIDEOPER; /* Hide oper mode */ +extern MODVAR long UMODE_SETHOST; /* used sethost */ extern MODVAR long UMODE_HIDLE; /* hides oper idle times */ extern MODVAR long AllUmodes, SendUmodes; @@ -403,24 +429,32 @@ extern MODVAR long SNO_OPER; #ifndef HAVE_STRLCPY extern size_t strlcpy(char *dst, const char *src, size_t size); #endif +#ifndef HAVE_STRLNCPY +extern size_t strlncpy(char *dst, const char *src, size_t size, size_t n); +#endif #ifndef HAVE_STRLCAT extern size_t strlcat(char *dst, const char *src, size_t size); #endif #ifndef HAVE_STRLNCAT extern size_t strlncat(char *dst, const char *src, size_t size, size_t n); #endif +extern void strlcat_letter(char *buf, char c, size_t buflen); extern char *strldup(const char *src, size_t n); extern void dopacket(Client *, char *, int); extern void debug(int, FORMAT_STRING(const char *), ...) __attribute__((format(printf,2,3))); #if defined(DEBUGMODE) -extern void send_usage(Client *, char *); -extern void count_memory(Client *, char *); -extern int checkprotoflags(Client *, int, char *, int); +extern void send_usage(Client *, const char *); +extern void count_memory(Client *, const char *); +extern int checkprotoflags(Client *, int, const char *, int); #endif -extern char *inetntop(int af, const void *in, char *local_dummy, size_t the_size); +extern const char *inetntop(int af, const void *in, char *local_dummy, size_t the_size); + +extern void delletterfromstring(char *s, char letter); +extern void addlettertodynamicstringsorted(char **str, char letter); +extern int sort_character_lowercase_before_uppercase(char x, char y); /* Internal command stuff - not for modules */ extern MODVAR RealCommand *CommandHash[256]; @@ -442,25 +476,19 @@ extern void close_connections(void); extern int b64_encode(unsigned char const *src, size_t srclength, char *target, size_t targsize); extern int b64_decode(char const *src, unsigned char *target, size_t targsize); -extern AuthenticationType Auth_FindType(char *hash, char *type); +extern AuthenticationType Auth_FindType(const char *hash, const char *type); extern AuthConfig *AuthBlockToAuthConfig(ConfigEntry *ce); extern void Auth_FreeAuthConfig(AuthConfig *as); -extern int Auth_Check(Client *cptr, AuthConfig *as, char *para); -extern char *Auth_Hash(int type, char *para); +extern int Auth_Check(Client *cptr, AuthConfig *as, const char *para); +extern const char *Auth_Hash(int type, const char *para); extern int Auth_CheckError(ConfigEntry *ce); -extern int Auth_AutoDetectHashType(char *hash); +extern int Auth_AutoDetectHashType(const char *hash); -extern void make_cloakedhost(Client *client, char *curr, char *buf, size_t buflen); -extern int channel_canjoin(Client *client, char *name); +extern void make_cloakedhost(Client *client, const char *curr, char *buf, size_t buflen); +extern int channel_canjoin(Client *client, const char *name); extern char *collapse(char *pattern); extern void dcc_sync(Client *client); -extern void report_flines(Client *client); -extern void report_network(Client *client); -extern void report_dynconf(Client *client); -extern void count_memory(Client *cptr, char *nick); -extern void list_scache(Client *client); -extern char *oflagstr(long oflag); -extern int rehash(Client *client, int sig); +extern void request_rehash(Client *client); extern void s_die(); extern int match_simple(const char *mask, const char *name); extern int match_esc(const char *mask, const char *name); @@ -468,23 +496,19 @@ extern int add_listener(ConfigItem_listen *conf); extern void link_cleanup(ConfigItem_link *link_ptr); extern void listen_cleanup(); extern int numeric_collides(long numeric); -extern u_long cres_mem(Client *client, char *nick); extern void flag_add(char ch); extern void flag_del(char ch); extern void init_dynconf(void); -extern char *pretty_time_val(long); -extern char *pretty_date(time_t t); -extern int init_conf(char *filename, int rehash); -extern void validate_configuration(void); -extern void run_configuration(void); +extern int config_read_start(void); +extern int is_config_read_finished(void); +extern int config_test(void); +extern void config_run(void); extern void rehash_motdrules(); extern void read_motd(const char *filename, MOTDFile *motd); /* s_serv.c */ extern void send_proto(Client *, ConfigItem_link *); extern void unload_all_modules(void); extern void set_sock_opts(int fd, Client *cptr, int ipv6); extern void stripcrlf(char *line); -extern time_t rfc2time(char *s); -extern char *rfctime(time_t t, char *buf); extern int strnatcmp(char const *a, char const *b); extern int strnatcasecmp(char const *a, char const *b); extern void outofmemory(size_t bytes); @@ -509,7 +533,7 @@ extern void *safe_alloc(size_t size); * @param dst The current pointer and the pointer where a new copy of the string will be stored. * @param str The string you want to copy */ -#define safe_strdup(dst,str) do { if (dst) free(dst); if (!(str)) dst = NULL; else dst = our_strdup(str); } while(0) +#define safe_strdup(dst,str) do { if (dst) free(dst); if ((str) == NULL) dst = NULL; else dst = our_strdup(str); } while(0) /** Return a copy of the string. Do not free any existing memory. * @param str The string to duplicate @@ -573,7 +597,7 @@ extern char *our_strdup(const char *str); extern char *our_strldup(const char *str, size_t max); extern char *our_strdup_sensitive(const char *str); -extern long config_checkval(char *value, unsigned short flags); +extern long config_checkval(const char *value, unsigned short flags); extern void config_status(FORMAT_STRING(const char *format), ...) __attribute__((format(printf,1,2))); extern void init_random(); extern u_char getrandom8(); @@ -581,10 +605,15 @@ extern uint16_t getrandom16(); extern uint32_t getrandom32(); extern void gen_random_alnum(char *buf, int numbytes); +/* Check config entry for empty/missing parameter */ +#define CheckNull(x) if ((!(x)->value) || (!(*((x)->value)))) { config_error("%s:%i: missing parameter", (x)->file->filename, (x)->line_number); errors++; continue; } +/* as above, but accepting empty string */ +#define CheckNullAllowEmpty(x) if ((!(x)->value)) { config_error("%s:%i: missing parameter", (x)->file->filename, (x)->line_number); errors++; continue; } + extern MODVAR char extchmstr[4][64]; -extern int extcmode_default_requirechop(Client *, Channel *, char, char *, int, int); -extern int extcmode_default_requirehalfop(Client *, Channel *, char, char *, int, int); +extern int extcmode_default_requirechop(Client *, Channel *, char, const char *, int, int); +extern int extcmode_default_requirehalfop(Client *, Channel *, char, const char *, int, int); extern Cmode_t extcmode_get(Cmode *); extern void extcmode_init(void); extern void make_extcmodestr(); @@ -592,8 +621,7 @@ extern void extcmode_duplicate_paramlist(void **xi, void **xo); extern void extcmode_free_paramlist(void **ar); extern void chmode_str(struct ChMode *, char *, char *, size_t, size_t); -extern char *get_client_status(Client *); -extern char *get_snomask_string_raw(long); +extern const char *get_client_status(Client *); extern void SocketLoop(void *); #ifdef _WIN32 extern void InitDebug(void); @@ -605,54 +633,46 @@ extern void CleanUp(void); extern int CountRTFSize(unsigned char *buffer); extern void IRCToRTF(unsigned char *buffer, unsigned char *string); #endif -extern void sendto_chmodemucrap(Client *, Channel *, char *); -extern void verify_opercount(Client *, char *); -extern int valid_host(char *host); -extern int count_oper_sessions(char *); +extern void verify_opercount(Client *, const char *); +extern int valid_host(const char *host, int strict); +extern int count_oper_sessions(const char *); extern char *unreal_mktemp(const char *dir, const char *suffix); -extern char *unreal_getpathname(char *filepath, char *path); -extern char *unreal_getfilename(char *path); -extern char *unreal_getmodfilename(char *path); -extern char *unreal_mkcache(const char *url); -extern int has_cached_version(const char *url); +extern char *unreal_getpathname(const char *filepath, char *path); +extern const char *unreal_getfilename(const char *path); +extern const char *unreal_getmodfilename(const char *path); extern int unreal_copyfile(const char *src, const char *dest); extern int unreal_copyfileex(const char *src, const char *dest, int tryhardlink); extern time_t unreal_getfilemodtime(const char *filename); extern void unreal_setfilemodtime(const char *filename, time_t mtime); extern void DeleteTempModules(void); extern MODVAR Extban *extbaninfo; -extern Extban *findmod_by_bantype(char c); +extern Extban *findmod_by_bantype(const char *str, const char **remainder); extern Extban *ExtbanAdd(Module *reserved, ExtbanInfo req); extern void ExtbanDel(Extban *); extern void extban_init(void); extern char *trim_str(char *str, int len); extern MODVAR char *ban_realhost, *ban_virthost, *ban_ip; -extern BanAction banact_stringtoval(char *s); -extern char *banact_valtostring(BanAction val); +extern BanAction banact_stringtoval(const char *s); +extern const char *banact_valtostring(BanAction val); extern BanAction banact_chartoval(char c); extern char banact_valtochar(BanAction val); -extern int spamfilter_gettargets(char *s, Client *client); +extern int spamfilter_gettargets(const char *s, Client *client); extern char *spamfilter_target_inttostring(int v); -extern Spamfilter *unreal_buildspamfilter(char *s); -extern char *our_strcasestr(char *haystack, char *needle); -extern int spamfilter_getconftargets(char *s); -extern void remove_oper_snomasks(Client *client); +extern char *our_strcasestr(const char *haystack, const char *needle); +extern int spamfilter_getconftargets(const char *s); +extern void remove_all_snomasks(Client *client); extern void remove_oper_modes(Client *client); extern char *spamfilter_inttostring_long(int v); -extern Channel *get_channel(Client *cptr, char *chname, int flag); extern MODVAR char backupbuf[]; -extern void add_invite(Client *, Client *, Channel *, MessageTag *); -extern void del_invite(Client *, Channel *); extern int is_invited(Client *client, Channel *channel); -extern void channel_modes(Client *cptr, char *mbuf, char *pbuf, size_t mbuf_size, size_t pbuf_size, Channel *channel); -extern MODVAR char modebuf[BUFSIZE], parabuf[BUFSIZE]; -extern int op_can_override(char *acl, Client *client,Channel *channel,void* extra); -extern Client *find_chasing(Client *client, char *user, int *chasing); +extern void channel_modes(Client *client, char *mbuf, char *pbuf, size_t mbuf_size, size_t pbuf_size, Channel *channel, int hide_local_modes); +extern int op_can_override(const char *acl, Client *client,Channel *channel,void* extra); +extern Client *find_chasing(Client *client, const char *user, int *chasing); extern MODVAR long opermode; extern MODVAR long sajoinmode; -extern void add_user_to_channel(Channel *channel, Client *who, int flags); -extern int add_banid(Client *, Channel *, char *); -extern int add_exbanid(Client *cptr, Channel *channel, char *banid); +extern void add_user_to_channel(Channel *channel, Client *who, const char *modes); +extern int add_banid(Client *, Channel *, const char *); +extern int add_exbanid(Client *cptr, Channel *channel, const char *banid); extern int sub1_from_channel(Channel *); extern MODVAR CoreChannelModeTable corechannelmodetable[]; extern char *unreal_encodespace(char *s); @@ -664,10 +684,9 @@ extern int callbacks_check(void); extern void callbacks_switchover(void); extern int efunctions_check(void); extern void efunctions_switchover(void); -extern char *encode_ip(char *); -extern char *decode_ip(char *); -extern void sendto_fconnectnotice(Client *client, int disconnect, char *comment); -extern void sendto_one_nickcmd(Client *server, Client *client, char *umodes); +extern const char *encode_ip(const char *); +extern const char *decode_ip(const char *); +extern void sendto_one_nickcmd(Client *server, MessageTag *mtags, Client *client, const char *umodes); extern int on_dccallow_list(Client *to, Client *from); extern int add_dccallow(Client *client, Client *optr); extern int del_dccallow(Client *client, Client *optr); @@ -677,7 +696,7 @@ extern void del_async_connects(void); extern void isupport_init(void); extern void clicap_init(void); extern void efunctions_init(void); -extern void do_cmd(Client *client, MessageTag *mtags, char *cmd, int parc, char *parv[]); +extern void do_cmd(Client *client, MessageTag *mtags, const char *cmd, int parc, const char *parv[]); extern MODVAR char *me_hash; extern MODVAR int dontspread; extern MODVAR int labeled_response_inhibit; @@ -685,33 +704,35 @@ extern MODVAR int labeled_response_inhibit_end; extern MODVAR int labeled_response_force; /* Efuncs */ -extern MODVAR void (*do_join)(Client *, int, char **); -extern MODVAR void (*join_channel)(Channel *channel, Client *client, MessageTag *mtags, int flags); -extern MODVAR int (*can_join)(Client *client, Channel *channel, char *key, char *parv[]); -extern MODVAR void (*do_mode)(Channel *channel, Client *client, MessageTag *mtags, int parc, char *parv[], time_t sendts, int samode); -extern MODVAR void (*set_mode)(Channel *channel, Client *cptr, int parc, char *parv[], u_int *pcount, - char pvar[MAXMODEPARAMS][MODEBUFLEN + 3], int bounce); -extern MODVAR void (*cmd_umode)(Client *, MessageTag *, int, char **); -extern MODVAR int (*register_user)(Client *client, char *nick, char *username, char *umode, char *virthost, char *ip); +extern MODVAR void (*do_join)(Client *, int, const char **); +extern MODVAR void (*join_channel)(Channel *channel, Client *client, MessageTag *mtags, const char *flags); +extern MODVAR int (*can_join)(Client *client, Channel *channel, const char *key, char **errmsg); +extern MODVAR void (*do_mode)(Channel *channel, Client *client, MessageTag *mtags, int parc, const char *parv[], time_t sendts, int samode); +extern MODVAR MultiLineMode *(*set_mode)(Channel *channel, Client *cptr, int parc, const char *parv[], u_int *pcount, + char pvar[MAXMODEPARAMS][MODEBUFLEN + 3]); +extern MODVAR void (*set_channel_mode)(Channel *channel, char *modes, char *parameters); +extern MODVAR void (*cmd_umode)(Client *, MessageTag *, int, const char **); +extern MODVAR int (*register_user)(Client *client); extern MODVAR int (*tkl_hash)(unsigned int c); extern MODVAR char (*tkl_typetochar)(int type); extern MODVAR int (*tkl_chartotype)(char c); -extern MODVAR char *(*tkl_type_string)(TKL *tk); -extern MODVAR TKL *(*tkl_add_serverban)(int type, char *usermask, char *hostmask, char *reason, char *setby, +extern MODVAR const char *(*tkl_type_string)(TKL *tk); +extern MODVAR const char *(*tkl_type_config_string)(TKL *tk); +extern MODVAR TKL *(*tkl_add_serverban)(int type, const char *usermask, const char *hostmask, const char *reason, const char *setby, time_t expire_at, time_t set_at, int soft, int flags); -extern MODVAR TKL *(*tkl_add_banexception)(int type, char *usermask, char *hostmask, char *reason, char *set_by, - time_t expire_at, time_t set_at, int soft, char *bantypes, int flags); -extern MODVAR TKL *(*tkl_add_nameban)(int type, char *name, int hold, char *reason, char *setby, +extern MODVAR TKL *(*tkl_add_banexception)(int type, const char *usermask, const char *hostmask, const char *reason, const char *set_by, + time_t expire_at, time_t set_at, int soft, const char *bantypes, int flags); +extern MODVAR TKL *(*tkl_add_nameban)(int type, const char *name, int hold, const char *reason, const char *setby, time_t expire_at, time_t set_at, int flags); -extern MODVAR TKL *(*tkl_add_spamfilter)(int type, unsigned short target, unsigned short action, Match *match, char *setby, +extern MODVAR TKL *(*tkl_add_spamfilter)(int type, unsigned short target, unsigned short action, Match *match, const char *setby, time_t expire_at, time_t set_at, - time_t spamf_tkl_duration, char *spamf_tkl_reason, + time_t spamf_tkl_duration, const char *spamf_tkl_reason, int flags); -extern MODVAR TKL *(*find_tkl_serverban)(int type, char *usermask, char *hostmask, int softban); -extern MODVAR TKL *(*find_tkl_banexception)(int type, char *usermask, char *hostmask, int softban); -extern MODVAR TKL *(*find_tkl_nameban)(int type, char *name, int hold); -extern MODVAR TKL *(*find_tkl_spamfilter)(int type, char *match_string, unsigned short action, unsigned short target); -extern MODVAR void (*sendnotice_tkl_del)(char *removed_by, TKL *tkl); +extern MODVAR TKL *(*find_tkl_serverban)(int type, const char *usermask, const char *hostmask, int softban); +extern MODVAR TKL *(*find_tkl_banexception)(int type, const char *usermask, const char *hostmask, int softban); +extern MODVAR TKL *(*find_tkl_nameban)(int type, const char *name, int hold); +extern MODVAR TKL *(*find_tkl_spamfilter)(int type, const char *match_string, unsigned short action, unsigned short target); +extern MODVAR void (*sendnotice_tkl_del)(const char *removed_by, TKL *tkl); extern MODVAR void (*sendnotice_tkl_add)(TKL *tkl); extern MODVAR void (*free_tkl)(TKL *tkl); extern MODVAR TKL *(*tkl_del_line)(TKL *tkl); @@ -719,50 +740,53 @@ extern MODVAR void (*tkl_check_local_remove_shun)(TKL *tmp); extern MODVAR int (*find_tkline_match)(Client *cptr, int skip_soft); extern MODVAR int (*find_shun)(Client *cptr); extern MODVAR int (*find_spamfilter_user)(Client *client, int flags); -extern MODVAR TKL *(*find_qline)(Client *cptr, char *nick, int *ishold); +extern MODVAR TKL *(*find_qline)(Client *cptr, const char *nick, int *ishold); extern MODVAR TKL *(*find_tkline_match_zap)(Client *cptr); -extern MODVAR void (*tkl_stats)(Client *cptr, int type, char *para, int *cnt); +extern MODVAR void (*tkl_stats)(Client *cptr, int type, const char *para, int *cnt); extern MODVAR void (*tkl_sync)(Client *client); -extern MODVAR void (*cmd_tkl)(Client *client, MessageTag *recv_mtags, int parc, char *parv[]); -extern MODVAR int (*place_host_ban)(Client *client, BanAction action, char *reason, long duration); -extern MODVAR int (*match_spamfilter)(Client *client, char *str_in, int type, char *cmd, char *target, int flags, TKL **rettk); -extern MODVAR int (*match_spamfilter_mtags)(Client *client, MessageTag *mtags, char *cmd); +extern MODVAR void (*cmd_tkl)(Client *client, MessageTag *recv_mtags, int parc, const char *parv[]); +extern MODVAR int (*place_host_ban)(Client *client, BanAction action, const char *reason, long duration); +extern MODVAR int (*match_spamfilter)(Client *client, const char *str_in, int type, const char *cmd, const char *target, int flags, TKL **rettk); +extern MODVAR int (*match_spamfilter_mtags)(Client *client, MessageTag *mtags, const char *cmd); extern MODVAR int (*join_viruschan)(Client *client, TKL *tk, int type); -extern MODVAR unsigned char *(*StripColors)(unsigned char *text); -extern MODVAR const char *(*StripControlCodes)(unsigned char *text); -extern MODVAR void (*spamfilter_build_user_string)(char *buf, char *nick, Client *acptr); +extern MODVAR const char *(*StripColors)(const char *text); +extern MODVAR const char *(*StripControlCodes)(const char *text); +extern MODVAR void (*spamfilter_build_user_string)(char *buf, const char *nick, Client *acptr); extern MODVAR void (*send_protoctl_servers)(Client *client, int response); -extern MODVAR int (*verify_link)(Client *client, char *servername, ConfigItem_link **link_out); +extern MODVAR int (*verify_link)(Client *client, ConfigItem_link **link_out); extern MODVAR void (*send_server_message)(Client *client); extern MODVAR void (*broadcast_md_client)(ModDataInfo *mdi, Client *acptr, ModData *md); extern MODVAR void (*broadcast_md_channel)(ModDataInfo *mdi, Channel *channel, ModData *md); extern MODVAR void (*broadcast_md_member)(ModDataInfo *mdi, Channel *channel, Member *m, ModData *md); extern MODVAR void (*broadcast_md_membership)(ModDataInfo *mdi, Client *acptr, Membership *m, ModData *md); -extern MODVAR void (*broadcast_md_client_cmd)(Client *except, Client *sender, Client *acptr, char *varname, char *value); -extern MODVAR void (*broadcast_md_channel_cmd)(Client *except, Client *sender, Channel *channel, char *varname, char *value); -extern MODVAR void (*broadcast_md_member_cmd)(Client *except, Client *sender, Channel *channel, Client *acptr, char *varname, char *value); -extern MODVAR void (*broadcast_md_membership_cmd)(Client *except, Client *sender, Client *acptr, Channel *channel, char *varname, char *value); +extern MODVAR void (*broadcast_md_client_cmd)(Client *except, Client *sender, Client *acptr, const char *varname, const char *value); +extern MODVAR void (*broadcast_md_channel_cmd)(Client *except, Client *sender, Channel *channel, const char *varname, const char *value); +extern MODVAR void (*broadcast_md_member_cmd)(Client *except, Client *sender, Channel *channel, Client *acptr, const char *varname, const char *value); +extern MODVAR void (*broadcast_md_membership_cmd)(Client *except, Client *sender, Client *acptr, Channel *channel, const char *varname, const char *value); +extern MODVAR void (*moddata_add_s2s_mtags)(Client *client, MessageTag **mtags); +extern MODVAR void (*moddata_extract_s2s_mtags)(Client *client, MessageTag *mtags); extern MODVAR void (*send_moddata_client)(Client *srv, Client *acptr); extern MODVAR void (*send_moddata_channel)(Client *srv, Channel *channel); extern MODVAR void (*send_moddata_members)(Client *srv); extern MODVAR void (*broadcast_moddata_client)(Client *acptr); extern MODVAR int (*check_banned)(Client *cptr, int exitflags); extern MODVAR void (*introduce_user)(Client *to, Client *acptr); -extern MODVAR int (*check_deny_version)(Client *cptr, char *software, int protocol, char *flags); -extern MODVAR int (*match_user)(char *rmask, Client *acptr, int options); +extern MODVAR int (*check_deny_version)(Client *cptr, const char *software, int protocol, const char *flags); +extern MODVAR int (*match_user)(const char *rmask, Client *acptr, int options); extern MODVAR void (*userhost_save_current)(Client *client); extern MODVAR void (*userhost_changed)(Client *client); extern MODVAR void (*send_join_to_local_users)(Client *client, Channel *channel, MessageTag *mtags); extern MODVAR int (*do_nick_name)(char *nick); extern MODVAR int (*do_remote_nick_name)(char *nick); -extern MODVAR char *(*charsys_get_current_languages)(void); +extern MODVAR const char *(*charsys_get_current_languages)(void); extern MODVAR void (*broadcast_sinfo)(Client *acptr, Client *to, Client *except); +extern MODVAR void (*connect_server)(ConfigItem_link *aconf, Client *by, struct hostent *hp); extern MODVAR void (*parse_message_tags)(Client *cptr, char **str, MessageTag **mtag_list); -extern MODVAR char *(*mtags_to_string)(MessageTag *m, Client *acptr); -extern MODVAR int (*can_send_to_channel)(Client *cptr, Channel *channel, char **msgtext, char **errmsg, int notice); +extern MODVAR const char *(*mtags_to_string)(MessageTag *m, Client *acptr); +extern MODVAR int (*can_send_to_channel)(Client *cptr, Channel *channel, const char **msgtext, const char **errmsg, int notice); extern MODVAR void (*broadcast_md_globalvar)(ModDataInfo *mdi, ModData *md); -extern MODVAR void (*broadcast_md_globalvar_cmd)(Client *except, Client *sender, char *varname, char *value); -extern MODVAR int (*tkl_ip_hash)(char *ip); +extern MODVAR void (*broadcast_md_globalvar_cmd)(Client *except, Client *sender, const char *varname, const char *value); +extern MODVAR int (*tkl_ip_hash)(const char *ip); extern MODVAR int (*tkl_ip_hash_type)(int type); extern MODVAR int (*find_tkl_exception)(int ban_type, Client *cptr); extern MODVAR int (*del_silence)(Client *client, const char *mask); @@ -771,109 +795,118 @@ extern MODVAR int (*is_silenced)(Client *client, Client *acptr); extern MODVAR void *(*labeled_response_save_context)(void); extern MODVAR void (*labeled_response_set_context)(void *ctx); extern MODVAR void (*labeled_response_force_end)(void); -extern MODVAR void (*kick_user)(MessageTag *mtags, Channel *channel, Client *client, Client *victim, char *comment); +extern MODVAR void (*kick_user)(MessageTag *mtags, Channel *channel, Client *client, Client *victim, const char *comment); +extern MODVAR int (*watch_add)(const char *nick, Client *client, int flags); +extern MODVAR int (*watch_del)(const char *nick, Client *client, int flags); +extern MODVAR int (*watch_del_list)(Client *client, int flags); +extern MODVAR Watch *(*watch_get)(const char *nick); +extern MODVAR int (*watch_check)(Client *client, int reply, int (*watch_notify)(Client *client, Watch *watch, Link *lp, int event)); +extern MODVAR char *(*tkl_uhost)(TKL *tkl, char *buf, size_t buflen, int options); +extern MODVAR void (*do_unreal_log_remote_deliver)(LogLevel loglevel, const char *subsystem, const char *event_id, MultiLine *msg, const char *json_serialized); +extern MODVAR char *(*get_chmodes_for_user)(Client *client, const char *flags); +extern MODVAR WhoisConfigDetails (*whois_get_policy)(Client *client, Client *target, const char *name); /* /Efuncs */ -/* SSL/TLS functions */ -extern int early_init_ssl(); -extern int init_ssl(); +/* TLS functions */ +extern int early_init_tls(); +extern int init_tls(); extern int ssl_handshake(Client *); /* Handshake the accpeted con.*/ extern int ssl_client_handshake(Client *, ConfigItem_link *); /* and the initiated con.*/ -extern int ircd_SSL_accept(Client *acptr, int fd); -extern int ircd_SSL_connect(Client *acptr, int fd); +extern int unreal_tls_accept(Client *acptr, int fd); +extern int unreal_tls_connect(Client *acptr, int fd); extern int SSL_smart_shutdown(SSL *ssl); -extern void ircd_SSL_client_handshake(int, int, void *); +extern const char *ssl_error_str(int err, int my_errno); +extern void unreal_tls_client_handshake(int, int, void *); extern void SSL_set_nonblocking(SSL *s); extern SSL_CTX *init_ctx(TLSOptions *tlsoptions, int server); -extern MODFUNC char *tls_get_cipher(SSL *ssl); +extern const char *tls_get_cipher(Client *client); extern TLSOptions *get_tls_options_for_client(Client *acptr); extern int outdated_tls_client(Client *acptr); -extern char *outdated_tls_client_build_string(char *pattern, Client *acptr); +extern const char *outdated_tls_client_build_string(const char *pattern, Client *acptr); extern int check_certificate_expiry_ctx(SSL_CTX *ctx, char **errstr); extern EVENT(tls_check_expiry); -/* End of SSL/TLS functions */ +extern MODVAR EVP_MD *sha256_function; +extern MODVAR EVP_MD *sha1_function; +extern MODVAR EVP_MD *md5_function; +/* End of TLS functions */ extern void parse_message_tags_default_handler(Client *client, char **str, MessageTag **mtag_list); -extern char *mtags_to_string_default_handler(MessageTag *m, Client *client); +extern const char *mtags_to_string_default_handler(MessageTag *m, Client *client); extern void *labeled_response_save_context_default_handler(void); extern void labeled_response_set_context_default_handler(void *ctx); extern void labeled_response_force_end_default_handler(void); extern int add_silence_default_handler(Client *client, const char *mask, int senderr); extern int del_silence_default_handler(Client *client, const char *mask); extern int is_silenced_default_handler(Client *client, Client *acptr); +extern void do_unreal_log_remote_deliver_default_handler(LogLevel loglevel, const char *subsystem, const char *event_id, MultiLine *msg, const char *json_serialized); extern MODVAR MOTDFile opermotd, svsmotd, motd, botmotd, smotd, rules; extern MODVAR int max_connection_count; -extern int add_listmode(Ban **list, Client *cptr, Channel *channel, char *banid); -extern int add_listmode_ex(Ban **list, Client *cptr, Channel *channel, char *banid, char *setby, time_t seton); -extern int del_listmode(Ban **list, Channel *channel, char *banid); +extern int add_listmode(Ban **list, Client *cptr, Channel *channel, const char *banid); +extern int add_listmode_ex(Ban **list, Client *cptr, Channel *channel, const char *banid, const char *setby, time_t seton); +extern int del_listmode(Ban **list, Channel *channel, const char *banid); extern int Halfop_mode(long mode); -extern char *clean_ban_mask(char *, int, Client *); +extern const char *clean_ban_mask(const char *, int, Client *, int); extern int find_invex(Channel *channel, Client *client); extern void DoMD5(char *mdout, const char *src, unsigned long n); extern char *md5hash(char *dst, const char *src, unsigned long n); extern char *sha256hash(char *dst, const char *src, unsigned long n); +extern void sha256hash_binary(char *dst, const char *src, unsigned long n); +extern void sha1hash_binary(char *dst, const char *src, unsigned long n); extern MODVAR TKL *tklines[TKLISTLEN]; extern MODVAR TKL *tklines_ip_hash[TKLIPHASHLEN1][TKLIPHASHLEN2]; -extern char *cmdname_by_spamftarget(int target); +extern const char *cmdname_by_spamftarget(int target); extern void unrealdns_delreq_bycptr(Client *cptr); -extern void sendtxtnumeric(Client *to, FORMAT_STRING(const char *pattern), ...) __attribute__((format(printf,2,3))); -extern void unrealdns_gethostbyname_link(char *name, ConfigItem_link *conf, int ipv4_only); +extern void unrealdns_gethostbyname_link(const char *name, ConfigItem_link *conf, int ipv4_only); extern void unrealdns_delasyncconnects(void); -extern int is_autojoin_chan(char *chname); +extern int is_autojoin_chan(const char *chname); extern void unreal_free_hostent(struct hostent *he); -extern struct hostent *unreal_create_hostent(char *name, char *ip); -extern char *unreal_time_sync_error(void); +extern struct hostent *unreal_create_hostent(const char *name, const char *ip); +extern const char *unreal_time_sync_error(void); extern int unreal_time_synch(int timeout); -extern char *getcloak(Client *client); +extern const char *getcloak(Client *client); extern MODVAR unsigned char param_to_slot_mapping[256]; -extern char *cm_getparameter(Channel *channel, char mode); -extern void cm_putparameter(Channel *channel, char mode, char *str); +extern const char *cm_getparameter(Channel *channel, char mode); +extern const char *cm_getparameter_ex(void **p, char mode); +extern void cm_putparameter(Channel *channel, char mode, const char *str); +extern void cm_putparameter_ex(void **p, char mode, const char *str); extern void cm_freeparameter(Channel *channel, char mode); -extern char *cm_getparameter_ex(void **p, char mode); -extern void cm_putparameter_ex(void **p, char mode, char *str); extern void cm_freeparameter_ex(void **p, char mode, char *str); -extern int file_exists(char *file); -extern time_t get_file_time(char *fname); -extern long get_file_size(char *fname); +extern int file_exists(const char *file); +extern time_t get_file_time(const char *fname); +extern long get_file_size(const char *fname); extern void free_motd(MOTDFile *motd); /* s_serv.c */ extern void fix_timers(void); -extern char *chfl_to_sjoin_symbol(int s); +extern const char *chfl_to_sjoin_symbol(int s); extern char chfl_to_chanmode(int s); -extern void add_pending_net(Client *client, char *str); +extern void add_pending_net(Client *client, const char *str); extern void free_pending_net(Client *client); extern Client *find_non_pending_net_duplicates(Client *cptr); -extern PendingNet *find_pending_net_by_sid_butone(char *sid, Client *exempt); +extern PendingNet *find_pending_net_by_sid_butone(const char *sid, Client *exempt); extern Client *find_pending_net_duplicates(Client *cptr, Client **srv, char **sid); extern MODVAR char serveropts[]; extern MODVAR char *ISupportStrings[]; extern void read_packet(int fd, int revents, void *data); extern int process_packet(Client *cptr, char *readbuf, int length, int killsafely); -extern void sendto_realops_and_log(FORMAT_STRING(const char *fmt), ...) __attribute__((format(printf,1,2))); -extern int parse_chanmode(ParseMode *pm, char *modebuf_in, char *parabuf_in); -extern void config_report_ssl_error(void); -extern int dead_socket(Client *to, char *notice); -extern Match *unreal_create_match(MatchType type, char *str, char **error); +extern int parse_chanmode(ParseMode *pm, const char *modebuf_in, const char *parabuf_in); +extern int dead_socket(Client *to, const char *notice); +extern Match *unreal_create_match(MatchType type, const char *str, char **error); extern void unreal_delete_match(Match *m); -extern int unreal_match(Match *m, char *str); -extern int unreal_match_method_strtoval(char *str); +extern int unreal_match(Match *m, const char *str); +extern int unreal_match_method_strtoval(const char *str); extern char *unreal_match_method_valtostr(int val); -extern int mixed_network(void); extern void unreal_delete_masks(ConfigItem_mask *m); extern void unreal_add_masks(ConfigItem_mask **head, ConfigEntry *ce); extern int unreal_mask_match(Client *acptr, ConfigItem_mask *m); -extern char *our_strcasestr(char *haystack, char *needle); -extern void update_conf(void); -extern MODVAR int need_34_upgrade; +extern int unreal_mask_match_string(const char *name, ConfigItem_mask *m); #ifdef _WIN32 extern MODVAR BOOL IsService; #endif -extern int match_ip46(char *a, char *b); extern void extcmodes_check_for_changes(void); extern void umodes_check_for_changes(void); -extern int config_parse_flood(char *orig, int *times, int *period); -extern int swhois_add(Client *acptr, char *tag, int priority, char *swhois, Client *from, Client *skip); -extern int swhois_delete(Client *acptr, char *tag, char *swhois, Client *from, Client *skip); +extern int config_parse_flood(const char *orig, int *times, int *period); +extern int swhois_add(Client *acptr, const char *tag, int priority, const char *swhois, Client *from, Client *skip); +extern int swhois_delete(Client *acptr, const char *tag, const char *swhois, Client *from, Client *skip); extern void remove_oper_privileges(Client *client, int broadcast_mode_change); extern int client_starttls(Client *acptr); extern void start_server_handshake(Client *cptr); @@ -882,21 +915,21 @@ extern void report_crash(void); extern void modulemanager(int argc, char *argv[]); extern int inet_pton4(const char *src, unsigned char *dst); extern int inet_pton6(const char *src, unsigned char *dst); -extern int unreal_bind(int fd, char *ip, int port, int ipv6); -extern int unreal_connect(int fd, char *ip, int port, int ipv6); -extern int is_valid_ip(char *str); +extern int unreal_bind(int fd, const char *ip, int port, int ipv6); +extern int unreal_connect(int fd, const char *ip, int port, int ipv6); +extern int is_valid_ip(const char *str); extern int ipv6_capable(void); extern MODVAR Client *remote_rehash_client; extern MODVAR int debugfd; -extern void convert_to_absolute_path(char **path, char *reldir); +extern void convert_to_absolute_path(char **path, const char *reldir); extern int has_user_mode(Client *acptr, char mode); extern int has_channel_mode(Channel *channel, char mode); +extern int has_channel_mode_raw(Cmode_t m, char mode); extern Cmode_t get_extmode_bitbychar(char m); -extern long get_mode_bitbychar(char m); extern long find_user_mode(char mode); extern void start_listeners(void); extern void buildvarstring(const char *inbuf, char *outbuf, size_t len, const char *name[], const char *value[]); -extern void reinit_ssl(Client *); +extern void reinit_tls(void); extern CMD_FUNC(cmd_error); extern CMD_FUNC(cmd_dns); extern CMD_FUNC(cmd_info); @@ -910,53 +943,53 @@ extern CMD_FUNC(cmd_module); extern CMD_FUNC(cmd_rehash); extern CMD_FUNC(cmd_die); extern CMD_FUNC(cmd_restart); -extern void cmd_alias(Client *client, MessageTag *recv_mtags, int parc, char *parv[], char *cmd); /* special! */ -extern char *pcre2_version(void); +extern void cmd_alias(Client *client, MessageTag *recv_mtags, int parc, const char *parv[], const char *cmd); /* special! */ +extern const char *pcre2_version(void); extern int get_terminal_width(void); extern int has_common_channels(Client *c1, Client *c2); extern int user_can_see_member(Client *user, Client *target, Channel *channel); extern int invisible_user_in_channel(Client *target, Channel *channel); -extern MODVAR int ssl_client_index; +extern MODVAR int tls_client_index; extern TLSOptions *FindTLSOptionsForUser(Client *acptr); extern int IsWebsocket(Client *acptr); -extern Policy policy_strtoval(char *s); -extern char *policy_valtostr(Policy policy); +extern Policy policy_strtoval(const char *s); +extern const char *policy_valtostr(Policy policy); extern char policy_valtochar(Policy policy); -extern int verify_certificate(SSL *ssl, char *hostname, char **errstr); -extern char *certificate_name(SSL *ssl); +extern int verify_certificate(SSL *ssl, const char *hostname, char **errstr); +extern const char *certificate_name(SSL *ssl); extern void start_of_normal_client_handshake(Client *acptr); extern void clicap_pre_rehash(void); extern void clicap_post_rehash(void); extern void unload_all_unused_mtag_handlers(void); -extern void send_cap_notify(int add, char *token); +extern void send_cap_notify(int add, const char *token); extern void sendbufto_one(Client *to, char *msg, unsigned int quick); extern MODVAR int current_serial; -extern char *spki_fingerprint(Client *acptr); -extern char *spki_fingerprint_ex(X509 *x509_cert); -extern int is_module_loaded(char *name); +extern const char *spki_fingerprint(Client *acptr); +extern const char *spki_fingerprint_ex(X509 *x509_cert); +extern int is_module_loaded(const char *name); extern void close_std_descriptors(void); -extern void banned_client(Client *acptr, char *bantype, char *reason, int global, int noexit); +extern void banned_client(Client *acptr, const char *bantype, const char *reason, int global, int noexit); extern char *mystpcpy(char *dst, const char *src); -extern size_t add_sjsby(char *buf, char *setby, time_t seton); -extern MaxTarget *findmaxtarget(char *cmd); -extern void setmaxtargets(char *cmd, int limit); +extern size_t add_sjsby(char *buf, const char *setby, time_t seton); +extern MaxTarget *findmaxtarget(const char *cmd); +extern void setmaxtargets(const char *cmd, int limit); extern void freemaxtargets(void); -extern int max_targets_for_command(char *cmd); +extern int max_targets_for_command(const char *cmd); extern void set_targmax_defaults(void); -extern void parse_chanmodes_protoctl(Client *client, char *str); -extern void concat_params(char *buf, int len, int parc, char *parv[]); +extern void parse_chanmodes_protoctl(Client *client, const char *str); +extern void concat_params(char *buf, int len, int parc, const char *parv[]); extern void charsys_check_for_changes(void); -extern int maxclients; -extern int fast_badword_match(ConfigItem_badword *badword, char *line); -extern int fast_badword_replace(ConfigItem_badword *badword, char *line, char *buf, int max); -extern char *stripbadwords(char *str, ConfigItem_badword *start_bw, int *blocked); -extern int badword_config_process(ConfigItem_badword *ca, char *str); +extern MODVAR int maxclients; +extern int fast_badword_match(ConfigItem_badword *badword, const char *line); +extern int fast_badword_replace(ConfigItem_badword *badword, const char *line, char *buf, int max); +extern const char *stripbadwords(const char *str, ConfigItem_badword *start_bw, int *blocked); +extern int badword_config_process(ConfigItem_badword *ca, const char *str); extern void badword_config_free(ConfigItem_badword *ca); -extern char *badword_config_check_regex(char *s, int fastsupport, int check_broadness); -extern AllowedChannelChars allowed_channelchars_strtoval(char *str); -extern char *allowed_channelchars_valtostr(AllowedChannelChars v); -extern HideIdleTimePolicy hideidletime_strtoval(char *str); -extern char *hideidletime_valtostr(HideIdleTimePolicy v); +extern const char *badword_config_check_regex(const char *s, int fastsupport, int check_broadness); +extern AllowedChannelChars allowed_channelchars_strtoval(const char *str); +extern const char *allowed_channelchars_valtostr(AllowedChannelChars v); +extern HideIdleTimePolicy hideidletime_strtoval(const char *str); +extern const char *hideidletime_valtostr(HideIdleTimePolicy v); extern long ClientCapabilityBit(const char *token); extern int is_handshake_finished(Client *client); extern void SetCapability(Client *acptr, const char *token); @@ -966,12 +999,12 @@ extern void new_message_special(Client *sender, MessageTag *recv_mtags, MessageT extern void generate_batch_id(char *str); extern MessageTag *find_mtag(MessageTag *mtags, const char *token); extern MessageTag *duplicate_mtag(MessageTag *mtag); +#define safe_free_message_tags(x) do { if (x) free_message_tags(x); x = NULL; } while(0) extern void free_message_tags(MessageTag *m); -extern time_t server_time_to_unix_time(const char *tbuf); -extern int history_set_limit(char *object, int max_lines, long max_t); -extern int history_add(char *object, MessageTag *mtags, char *line); -extern HistoryResult *history_request(char *object, HistoryFilter *filter); -extern int history_destroy(char *object); +extern int history_set_limit(const char *object, int max_lines, long max_t); +extern int history_add(const char *object, MessageTag *mtags, const char *line); +extern HistoryResult *history_request(const char *object, HistoryFilter *filter); +extern int history_destroy(const char *object); extern int can_receive_history(Client *client); extern void history_send_result(Client *client, HistoryResult *r); extern void free_history_result(HistoryResult *r); @@ -983,61 +1016,88 @@ extern int read_int64(FILE *fd, uint64_t *t); extern int read_int32(FILE *fd, uint32_t *t); extern int read_data(FILE *fd, void *buf, size_t len); extern int write_data(FILE *fd, const void *buf, size_t len); -extern int write_str(FILE *fd, char *x); +extern int write_str(FILE *fd, const char *x); extern int read_str(FILE *fd, char **x); -extern int char_to_channelflag(char c); extern void _free_entire_name_list(NameList *n); -extern void _add_name_list(NameList **list, char *name); -extern void _del_name_list(NameList **list, char *name); -extern NameList *find_name_list(NameList *list, char *name); -extern NameList *find_name_list_match(NameList *list, char *name); +extern void _add_name_list(NameList **list, const char *name); +extern void _del_name_list(NameList **list, const char *name); +extern NameList *find_name_list(NameList *list, const char *name); +extern NameList *find_name_list_match(NameList *list, const char *name); extern int minimum_msec_since_last_run(struct timeval *tv_old, long minimum); extern int unrl_utf8_validate(const char *str, const char **end); -extern char *unrl_utf8_make_valid(const char *str); +extern char *unrl_utf8_make_valid(const char *str, char *outputbuf, size_t outputbuflen, int strict_length_check); extern void utf8_test(void); extern MODVAR int non_utf8_nick_chars_in_use; extern void short_motd(Client *client); extern int should_show_connect_info(Client *client); -extern void send_invalid_channelname(Client *client, char *channelname); +extern void send_invalid_channelname(Client *client, const char *channelname); extern int is_extended_ban(const char *str); -extern int valid_sid(char *name); +extern int is_extended_server_ban(const char *str); +extern int empty_mode(const char *m); +extern void free_multilinemode(MultiLineMode *m); +#define safe_free_multilinemode(m) do { if (m) free_multilinemode(m); m = NULL; } while(0) +extern int valid_sid(const char *name); +extern int valid_uid(const char *name); extern void parse_client_queued(Client *client); -extern char *sha256sum_file(const char *fname); +extern const char *sha256sum_file(const char *fname); extern char *filename_strip_suffix(const char *fname, const char *suffix); extern char *filename_add_suffix(const char *fname, const char *suffix); extern int filename_has_suffix(const char *fname, const char *suffix); -extern void addmultiline(MultiLine **l, char *line); +extern void addmultiline(MultiLine **l, const char *line); extern void freemultiline(MultiLine *l); #define safe_free_multiline(x) do { if (x) freemultiline(x); x = NULL; } while(0) +extern MultiLine *line2multiline(const char *str); extern void sendnotice_multiline(Client *client, MultiLine *m); extern void unreal_del_quotes(char *i); -extern char *unreal_add_quotes(char *str); -extern int unreal_add_quotes_r(char *i, char *o, size_t len); +extern const char *unreal_add_quotes(const char *str); +extern int unreal_add_quotes_r(const char *i, char *o, size_t len); extern void user_account_login(MessageTag *recv_mtags, Client *client); extern void link_generator(void); extern void update_throttling_timer_settings(void); extern int hide_idle_time(Client *client, Client *target); -extern void lost_server_link(Client *serv, FORMAT_STRING(const char *fmt), ...); -extern char *sendtype_to_cmd(SendType sendtype); +extern void lost_server_link(Client *serv, const char *tls_error_string); +extern const char *sendtype_to_cmd(SendType sendtype); extern MODVAR MessageTagHandler *mtaghandlers; -extern int security_group_valid_name(char *name); -extern int security_group_exists(char *name); -extern SecurityGroup *add_security_group(char *name, int order); -extern SecurityGroup *find_security_group(char *name); +extern int security_group_valid_name(const char *name); +extern int security_group_exists(const char *name); +extern SecurityGroup *add_security_group(const char *name, int order); +extern SecurityGroup *find_security_group(const char *name); extern void free_security_group(SecurityGroup *s); extern void set_security_group_defaults(void); extern int user_allowed_by_security_group(Client *client, SecurityGroup *s); -extern int user_allowed_by_security_group_name(Client *client, char *secgroupname); -extern void add_nvplist(NameValuePrioList **lst, int priority, char *name, char *value); -extern void add_fmt_nvplist(NameValuePrioList **lst, int priority, char *name, FORMAT_STRING(const char *format), ...) __attribute__((format(printf,4,5))); -extern NameValuePrioList *find_nvplist(NameValuePrioList *list, char *name); +extern int user_allowed_by_security_group_name(Client *client, const char *secgroupname); +#define nv_find_by_name(stru, name) do_nv_find_by_name(stru, name, ARRAY_SIZEOF((stru))) +extern long do_nv_find_by_name(NameValue *table, const char *cmd, int numelements); +#define nv_find_by_value(stru, value) do_nv_find_by_value(stru, value, ARRAY_SIZEOF((stru))) +extern const char *do_nv_find_by_value(NameValue *table, long value, int numelements); +extern void add_nvplist(NameValuePrioList **lst, int priority, const char *name, const char *value); +extern void add_fmt_nvplist(NameValuePrioList **lst, int priority, const char *name, FORMAT_STRING(const char *format), ...) __attribute__((format(printf,4,5))); +/** Combination of add_nvplist() and buildnumeric() for convenience - only used in WHOIS response functions. + * @param lst The NameValuePrioList &head + * @param priority The priority of the item being added + * @param name The name of the item being added (eg: "certfp") + * @param to The recipient + * @param numeric The numeric, one of RPL_* or ERR_*, see include/numeric.h + * @param ... The parameters for the numeric + * @note Be sure to provide the correct number and type of parameters that belong to the numeric. Check include/numeric.h when in doubt! + */ +#define add_nvplist_numeric(lst, priority, name, to, numeric, ...) add_nvplist_numeric_fmt(lst, priority, name, to, numeric, STR_ ## numeric, ##__VA_ARGS__) +extern void add_nvplist_numeric_fmt(NameValuePrioList **lst, int priority, const char *name, Client *to, int numeric, FORMAT_STRING(const char *pattern), ...) __attribute__((format(printf,6,7))); +extern NameValuePrioList *find_nvplist(NameValuePrioList *list, const char *name); extern void free_nvplist(NameValuePrioList *lst); -extern char *get_connect_extinfo(Client *client); -extern char *unreal_strftime(char *str); -extern void strtolower_safe(char *dst, char *src, int size); +extern const char *get_connect_extinfo(Client *client); +extern char *unreal_strftime(const char *str); +extern void strtolower(char *str); +extern void strtolower_safe(char *dst, const char *src, int size); +extern void strtoupper(char *str); +extern void strtoupper_safe(char *dst, const char *src, int size); extern int running_interactively(void); +extern int terminal_supports_color(void); extern void skip_whitespace(char **p); extern void read_until(char **p, char *stopchars); +extern int is_ip_valid(const char *ip); +extern int is_file_readable(const char *file, const char *dir); +json_t *json_string_unreal(const char *s); /* src/unrealdb.c start */ extern UnrealDB *unrealdb_open(const char *filename, UnrealDBMode mode, char *secret_block); extern int unrealdb_close(UnrealDB *c); @@ -1045,30 +1105,106 @@ extern char *unrealdb_test_db(const char *filename, char *secret_block); extern int unrealdb_write_int64(UnrealDB *c, uint64_t t); extern int unrealdb_write_int32(UnrealDB *c, uint32_t t); extern int unrealdb_write_int16(UnrealDB *c, uint16_t t); -extern int unrealdb_write_str(UnrealDB *c, char *x); +extern int unrealdb_write_str(UnrealDB *c, const char *x); extern int unrealdb_write_char(UnrealDB *c, char t); extern int unrealdb_read_int64(UnrealDB *c, uint64_t *t); extern int unrealdb_read_int32(UnrealDB *c, uint32_t *t); extern int unrealdb_read_int16(UnrealDB *c, uint16_t *t); extern int unrealdb_read_str(UnrealDB *c, char **x); extern int unrealdb_read_char(UnrealDB *c, char *t); -extern char *unrealdb_test_secret(char *name); +extern const char *unrealdb_test_secret(const char *name); extern UnrealDBConfig *unrealdb_copy_config(UnrealDBConfig *src); extern UnrealDBConfig *unrealdb_get_config(UnrealDB *db); extern void unrealdb_free_config(UnrealDBConfig *c); extern UnrealDBError unrealdb_get_error_code(void); -extern char *unrealdb_get_error_string(void); +extern const char *unrealdb_get_error_string(void); /* src/unrealdb.c end */ /* secret { } related stuff */ -extern Secret *find_secret(char *secret_name); +extern Secret *find_secret(const char *secret_name); extern void free_secret_cache(SecretCache *c); extern void free_secret(Secret *s); extern Secret *secrets; /* end */ -extern int check_password_strength(char *pass, int min_length, int strict, char **err); -extern int valid_secret_password(char *pass, char **err); +extern int check_password_strength(const char *pass, int min_length, int strict, char **err); +extern int valid_secret_password(const char *pass, char **err); extern int flood_limit_exceeded(Client *client, FloodOption opt); extern FloodSettings *find_floodsettings_block(const char *name); extern FloodSettings *get_floodsettings_for_user(Client *client, FloodOption opt); -extern MODVAR char *floodoption_names[]; -extern void flood_limit_exceeded_log(Client *client, char *floodname); +extern MODVAR const char *floodoption_names[]; +extern void flood_limit_exceeded_log(Client *client, const char *floodname); +/* logging */ +extern int config_test_log(ConfigFile *conf, ConfigEntry *ce); +extern int config_run_log(ConfigFile *conf, ConfigEntry *ce); +extern LogType log_type_stringtoval(const char *str); +extern const char *log_type_valtostring(LogType v); +#ifdef DEBUGMODE +#define unreal_log(...) do_unreal_log(__VA_ARGS__, log_data_source(__FILE__, __LINE__, __FUNCTION__), NULL) +#define unreal_log_raw(...) do_unreal_log_raw(__VA_ARGS__, log_data_source(__FILE__, __LINE__, __FUNCTION__), NULL) +#else +#define unreal_log(...) do_unreal_log(__VA_ARGS__, NULL) +#define unreal_log_raw(...) do_unreal_log_raw(__VA_ARGS__, NULL) +#endif +extern void do_unreal_log(LogLevel loglevel, const char *subsystem, const char *event_id, Client *client, const char *msg, ...) __attribute__((format(printf,5,0))); +extern void do_unreal_log_raw(LogLevel loglevel, const char *subsystem, const char *event_id, Client *client, const char *msg, ...); +extern void do_unreal_log_internal_from_remote(LogLevel loglevel, const char *subsystem, const char *event_id, MultiLine *msg, const char *json_serialized, Client *from_server); +extern LogData *log_data_string(const char *key, const char *str); +extern LogData *log_data_char(const char *key, const char c); +extern LogData *log_data_integer(const char *key, int64_t integer); +extern LogData *log_data_timestamp(const char *key, time_t ts); +extern LogData *log_data_client(const char *key, Client *client); +extern LogData *log_data_channel(const char *key, Channel *channel); +extern LogData *log_data_source(const char *file, int line, const char *function); +extern LogData *log_data_socket_error(int fd); +extern LogData *log_data_link_block(ConfigItem_link *link); +extern LogData *log_data_tkl(const char *key, TKL *tkl); +extern LogData *log_data_tls_error(void); +extern void log_pre_rehash(void); +extern int log_tests(void); +extern void config_pre_run_log(void); +extern void log_blocks_switchover(void); +extern void postconf_defaults_log_block(void); +extern LogLevel log_level_stringtoval(const char *str); +extern const char *log_level_valtostring(LogLevel loglevel); +extern LogLevel log_level_stringtoval(const char *str); +extern int valid_event_id(const char *s); +extern int valid_subsystem(const char *s); +extern const char *timestamp_iso8601_now(void); +extern const char *timestamp_iso8601(time_t v); +extern int is_valid_snomask(char c); +extern int is_valid_snomask_string_testing(const char *str, char **wrong); +/* end of logging */ +extern void add_fake_lag(Client *client, long msec); +extern char *prefix_with_extban(const char *remainder, BanContext *b, Extban *extban, char *buf, size_t buflen); +extern GeoIPResult *geoip_client(Client *client); +extern GeoIPResult *geoip_lookup(const char *ip); +extern void free_geoip_result(GeoIPResult *r); +extern const char *get_operlogin(Client *client); +extern const char *get_operclass(Client *client); +/* url stuff */ +extern const char *unreal_mkcache(const char *url); +extern int has_cached_version(const char *url); +extern int url_is_valid(const char *); +extern const char *displayurl(const char *url); +extern char *url_getfilename(const char *url); +extern void download_file_async(const char *url, time_t cachetime, vFP callback, void *callback_data, char *original_url, int maxredirects); +extern void url_init(void); +extern EVENT(url_socket_timeout); +/* end of url stuff */ +extern char *collapse(char *pattern); +extern void clear_scache_hash_table(void); +extern void sendto_one(Client *, MessageTag *mtags, FORMAT_STRING(const char *), ...) __attribute__((format(printf,3,4))); +extern EVENT(garbage_collect); +extern EVENT(loop_event); +extern EVENT(check_pings); +extern EVENT(handshake_timeout); +extern EVENT(check_deadsockets); +extern EVENT(try_connections); +extern const char *my_itoa(int i); +extern void load_tunefile(void); +extern EVENT(save_tunefile); +extern void read_motd(const char *filename, MOTDFile *motd); +extern int target_limit_exceeded(Client *client, void *target, const char *name); +extern void make_umodestr(void); +extern void initwhowas(void); +extern void uid_init(void); +extern const char *uid_get(void); diff --git a/include/ircsprintf.h b/include/ircsprintf.h index fe78767..af30808 100644 --- a/include/ircsprintf.h +++ b/include/ircsprintf.h @@ -17,7 +17,7 @@ # define FORMAT_STRING(p) p #endif -extern char *ircvsnprintf(char *str, size_t size, const char *format, va_list); +extern char *ircvsnprintf(char *str, size_t size, const char *format, va_list) __attribute__((format(printf,3,0))); extern char *ircsnprintf(char *str, size_t size, FORMAT_STRING(const char *format), ...) __attribute__((format(printf,3,4))); #endif diff --git a/include/modules.h b/include/modules.h index 5bd22ec..62054cf 100644 --- a/include/modules.h +++ b/include/modules.h @@ -24,7 +24,7 @@ #define MAXCUSTOMHOOKS 30 #define MAXHOOKTYPES 150 #define MAXCALLBACKS 30 -#define MAXEFUNCTIONS 90 +#define MAXEFUNCTIONS 128 #if defined(_WIN32) #define MOD_EXTENSION "dll" #define DLLFUNC _declspec(dllexport) @@ -95,7 +95,6 @@ typedef enum ModuleObjectType { MOBJ_COMMAND = 3, MOBJ_HOOKTYPE = 4, MOBJ_VERSIONFLAG = 5, - MOBJ_SNOMASK = 6, MOBJ_UMODE = 7, MOBJ_COMMANDOVERRIDE = 8, MOBJ_EXTBAN = 9, @@ -110,23 +109,16 @@ typedef enum ModuleObjectType { MOBJ_HISTORY_BACKEND = 18, } ModuleObjectType; -typedef struct { - long mode; /**< Mode mask */ - char flag; /**< Mode character */ - int unset_on_deoper; /**< When set to 1 then this user mode will be unset on de-oper */ - int (*allowed)(Client *client, int what); /**< The 'is this user allowed to set this mode?' routine */ - char unloaded; /**< Internal flag to indicate module is being unloaded */ - Module *owner; /**< Module that owns this user mode */ -} Umode; - -typedef struct { - long mode; /**< Snomask mask */ - char flag; /**< Snomask character */ - int unset_on_deoper; /**< When set to 1 then this snomask will be unset on de-oper */ - int (*allowed)(Client *client, int what); /**< The 'is this user allowed to set this snomask?' routine */ - char unloaded; /**< Internal flag to indicate module is being unloaded */ - Module *owner; /**< Module that owns this snomask */ -} Snomask; +typedef struct Umode Umode; +struct Umode { + Umode *prev, *next; + long mode; /**< Mode mask */ + char letter; /**< Mode character */ + int unset_on_deoper; /**< When set to 1 then this user mode will be unset on de-oper */ + int (*allowed)(Client *client, int what); /**< The 'is this user allowed to set this mode?' routine */ + char unloaded; /**< Internal flag to indicate module is being unloaded */ + Module *owner; /**< Module that owns this user mode */ +}; typedef enum ModDataType { MODDATATYPE_LOCAL_VARIABLE = 1, @@ -138,6 +130,11 @@ typedef enum ModDataType { MODDATATYPE_MEMBERSHIP = 7, } ModDataType; +typedef enum ModDataSync { + MODDATA_SYNC_NORMAL = 1, /**< Sync normally via MD command */ + MODDATA_SYNC_EARLY = 2, /**< Attempt to (also) sync early in the UID command */ +} ModDataSync; + typedef struct ModDataInfo ModDataInfo; struct ModDataInfo { @@ -148,9 +145,11 @@ struct ModDataInfo { int slot; /**< Assigned slot */ char unloaded; /**< Module being unloaded? */ void (*free)(ModData *m); /**< Function will be called when the data needs to be freed (may be NULL if not using dynamic storage) */ - char *(*serialize)(ModData *m); /**< Function which converts the data to a string. May return NULL if 'm' contains no data (since for example m->ptr may be NULL). */ - void (*unserialize)(char *str, ModData *m); /**< Function which converts the string back to data */ - int sync; /**< Send in netsynch (when servers connect) */ + const char *(*serialize)(ModData *m); /**< Function which converts the data to a string. May return NULL if 'm' contains no data (since for example m->ptr may be NULL). */ + void (*unserialize)(const char *str, ModData *m); /**< Function which converts the string back to data */ + ModDataSync sync; /**< Send in netsynch (when servers connect) */ + int remote_write; /**< Allow remote servers to set/unset this moddata, even if it they target one of our own clients */ + int self_write; /**< Allow remote servers to set/unset moddata of their own server object (irc1.example.net writing the MD object of irc1.example.net) */ }; #define moddata_client(acptr, md) acptr->moddata[md->slot] @@ -191,6 +190,17 @@ typedef enum BypassChannelMessageRestrictionType { /** Channel mode bit/value */ typedef unsigned long Cmode_t; +typedef enum CmodeType { + CMODE_NORMAL=0, + CMODE_MEMBER=1, +} CmodeType; + +#define RANK_CHANOWNER 4000 +#define RANK_CHANADMIN 3000 +#define RANK_CHANOP 2000 +#define RANK_HALFOP 1000 +#define RANK_VOICE -1 + /** Channel mode handler. * This struct contains all extended channel mode information, * like the flag, mode, their handler functions, etc. @@ -199,15 +209,36 @@ typedef unsigned long Cmode_t; * and set the 'is_ok' function. All the rest is for parameter modes * or is optional. */ -typedef struct { - /** mode character (like 'Z') */ - char flag; +typedef struct Cmode Cmode; +struct Cmode { + Cmode *prev, *next; - /** unique flag (like 0x10) */ + /** mode character (like 'Z') */ + char letter; + + CmodeType type; + + /** If type is CMODE_NORMAL, then bitmask (eg: 0x10) that + * is used in channel->mode.mode + */ Cmode_t mode; + /** If type is CMODE_MEMBER, then the prefix used in NAMES etc (eg @) */ + char prefix; + + /** If type is CMODE_MEMBER, then the prefix used in SJOIN (eg @) */ + char sjoin_prefix; + + /** If type is CMODE_MEMBER, then the rank of this prefix. + * Higher ranking = more rights. + * This is used, for example, in NAMES without NAMESX when we can only + * show one symbol but not all. + * For the shipped modules vhoaq we use the RANK_* values. + */ + int rank; + /** Number of parameters (1 or 0) */ - int paracount; + int paracount; /** Check access or parameter of the channel mode. * @param client The client @@ -217,24 +248,24 @@ typedef struct { * @param what MODE_ADD or MODE_DEL * @returns EX_DENY, EX_ALLOW or EX_ALWAYS_DENY */ - int (*is_ok)(Client *client, Channel *channel, char mode, char *para, int checkt, int what); + int (*is_ok)(Client *client, Channel *channel, char mode, const char *para, int checkt, int what); /** Store parameter in memory for channel. * This function pointer is NULL (unused) for modes without parameters. - * @param list The list, this usually points to channel->mode.extmodeparams. + * @param list The list, this usually points to channel->mode.mode_params. * @param para The parameter to store. * @returns the head of the list, RTFS if you wonder why. * @note IMPORTANT: only allocate a new paramstruct if you need to. * Search for any current one first! Eg: in case of mode +y 5 and then +y 6 later without -y. */ - void *(*put_param)(void *list, char *para); + void *(*put_param)(void *list, const char *para); /** Get the stored parameter as a readable/printable string. * This function pointer is NULL (unused) for modes without parameters. * @param parastruct The parameter struct * @returns a pointer to the string (temporary storage) */ - char *(*get_param)(void *parastruct); + const char *(*get_param)(void *parastruct); /** Convert input parameter to output. * This converts stuff like where a MODE +l "1aaa" becomes "1". @@ -249,7 +280,7 @@ typedef struct { * In particular you MUST NOT SEND ERRORS to the client. * This should be done in is_ok() and not in conv_param(). */ - char *(*conv_param)(char *para, Client *client, Channel *channel); + const char *(*conv_param)(const char *para, Client *client, Channel *channel); /** Free and remove parameter from list. * This function pointer is NULL (unused) for modes without parameters. @@ -295,24 +326,28 @@ typedef struct { char unloaded; /** Slot number - Can be used instead of GETPARAMSLOT() */ - int slot; + int param_slot; /** Module owner */ Module *owner; -} Cmode; +}; /** The struct used to register a channel mode handler. * For documentation, see Cmode struct. */ typedef struct { - char flag; + char letter; + CmodeType type; + char prefix; + char sjoin_prefix; + int rank; int paracount; - int (*is_ok)(Client *,Channel *, char mode, char *para, int, int); - void * (*put_param)(void *, char *); - char * (*get_param)(void *); - char * (*conv_param)(char *, Client *, Channel *); + int (*is_ok)(Client *,Channel *, char mode, const char *para, int, int); + void * (*put_param)(void *, const char *); + const char * (*get_param)(void *); + const char * (*conv_param)(const char *, Client *, Channel *); void (*free_param)(void *); - void * (*dup_struct)(void *); + void * (*dup_struct)(void *); int (*sjoin_check)(Channel *, void *, void *); char local; char unset_with_param; @@ -328,7 +363,7 @@ typedef struct { #define GETPARAMHANDLERBYLETTER(x) ParamTable[GETPARAMSLOT(x)] /** Get paramter data struct - for like: ((aModejEntry *)GETPARASTRUCT(channel, 'j'))->t */ -#define GETPARASTRUCT(mychannel, mychar) channel->mode.extmodeparams[GETPARAMSLOT(mychar)] +#define GETPARASTRUCT(mychannel, mychar) channel->mode.mode_params[GETPARAMSLOT(mychar)] #define GETPARASTRUCTEX(v, mychar) v[GETPARAMSLOT(mychar)] @@ -341,16 +376,20 @@ typedef struct { /*** Extended bans ***/ -// TODO: These should be enums! +typedef enum ExtbanCheck { + EXBCHK_ACCESS=0, /**< Check access */ + EXBCHK_ACCESS_ERR=1, /**< Check access and send error */ + EXBCHK_PARAM=2 /**< Check if the parameter is valid */ +} ExtbanCheck; -#define EXBCHK_ACCESS 0 /* Check access */ -#define EXBCHK_ACCESS_ERR 1 /* Check access and send error */ -#define EXBCHK_PARAM 2 /* Check if the parameter is valid */ +typedef enum ExtbanType { + EXBTYPE_BAN=0, /**< Ban (channel mode +b) */ + EXBTYPE_EXCEPT=1, /**< Ban exception (channel mode +e) */ + EXBTYPE_INVEX=2, /**< Invite exception (channel mode +I) */ + EXBTYPE_TKL=3 /**< TKL or other generic matcher outside banning routines */ +} ExtbanType; -#define EXBTYPE_BAN 0 /* a ban */ -#define EXBTYPE_EXCEPT 1 /* an except */ -#define EXBTYPE_INVEX 2 /* an invite exception */ -#define EXBTYPE_TKL 3 /* TKL or other generic matcher outside banning routines */ +#define BCTX_CONV_OPTION_WRITE_LETTER_BANS 1 /* Always write letter extbans in output of conv_param */ #define EXTBANTABLESZ 32 @@ -363,54 +402,66 @@ typedef enum ExtbanOptions { } ExtbanOptions; typedef struct { - /** extbans module */ - Module *owner; + Client *client; /**< Client to check, can be a remote client */ + Channel *channel; /**< Channel to check */ + const char *banstr; /**< Mask string (ban) */ + int ban_check_types; /**< Ban types to check for, one or more of BANCHK_* OR'd together */ + const char *msg; /**< Message, only for some BANCHK_* types (for censoring text) */ + const char *error_msg; /**< Error message, can be NULL */ + int no_extbans; /**< Set to 1 to disable extended bans checking - only nick!user@host allowed */ + int what; /**< MODE_ADD or MODE_DEL (for is_ok) */ + ExtbanType ban_type; /**< EXBTYPE_BAN or EXBTYPE_EXCEPT (for is_ok) */ + ExtbanCheck is_ok_check;/**< One of EXBCHK_* (for is_ok) */ + int conv_options; /**< One of BCTX_CONV_OPTION_* (for conv_param) */ +} BanContext; + +typedef struct Extban Extban; + +struct Extban { + Extban *prev, *next; + /** extended ban character */ - char flag; + char letter; + + /** extended ban name */ + char *name; /** extban options */ ExtbanOptions options; - /** access checking [optional]. - * Client *: the client - * Channel *: the channel - * para: the ban parameter - * int: check type (see EXBCHK_*) - * int: what (MODE_ADD or MODE_DEL) - * int: what2 (EXBTYPE_BAN or EXBTYPE_EXCEPT) - * return value: 1=ok, 0=bad - * NOTE: just set this of NULL if you want only +hoaq to place/remove bans as usual. - * NOTE2: This has not been tested yet!! - */ - int (*is_ok)(Client *, Channel *, char *para, int, int, int); + unsigned int is_banned_events; /**< Which BANCHK_* events to listen on */ + + int (*is_ok)(BanContext *b); /** Convert input parameter to output [optional]. * like with normal bans '+b blah' gets '+b blah!*@*', and it allows - * you to limit the length of the ban too. You can set this to NULL however - * to use the value as-is. - * char *: the input parameter. + * you to limit the length of the ban too. * return value: pointer to output string (temp. storage) */ - char * (*conv_param)(char *); + const char *(*conv_param)(BanContext *b, Extban *handler); - /** Checks if the user is affected by this ban [required]. - * Called from is_banned. - * Client *: the client - * Channel *: the channel - * para: the ban entry - * int: a value of BANCHK_* (see struct.h) - * char **: optionally a message, can be NULL!! (for some BANCHK_ types) - * char **: optionally for setting an error message, can be NULL!! + /** Checks if the user is affected by this ban [optional]. + * This may be set to NULL if you have is_banned_events set to 0 (zero), + * this can be useful if you don't actually ban a user, eg for text bans. + * This function is called from is_banned() and two other places. */ - int (*is_banned)(Client *client, Channel *channel, char *para, int checktype, char **msg, char **errormsg); -} Extban; + int (*is_banned)(BanContext *b); + + /** extbans module */ + Module *owner; + + /* Set to 1 during rehash when module is unloading (which may be re-used, and then set to 0) */ + char unloaded; +}; typedef struct { - char flag; + char letter; + char *name; ExtbanOptions options; - int (*is_ok)(Client *, Channel *, char *para, int, int, int); - char * (*conv_param)(char *); - int (*is_banned)(Client *, Channel *, char *, int, char **, char **); + int (*is_ok)(BanContext *b); + const char *(*conv_param)(BanContext *b, Extban *handler); + int (*is_banned)(BanContext *b); + unsigned int is_banned_events; } ExtbanInfo; @@ -439,8 +490,8 @@ struct ClientCapability { char *name; /**< The name of the CAP */ long cap; /**< The acptr->user->proto we should set (if any, can be 0, like for sts) */ int flags; /**< A flag from CLICAP_FLAGS_* */ - int (*visible)(Client *); /**< Should the capability be visible? Note: parameter may be NULL. [optional] */ - char *(*parameter)(Client *); /**< CAP parameters. Note: parameter may be NULL. [optional] */ + int (*visible)(Client *); /**< Should the capability be visible? Note: parameter may be NULL. [optional] */ + const char *(*parameter)(Client *); /**< CAP parameters. Note: parameter may be NULL. [optional] */ MessageTagHandler *mtag_handler; /**< For reverse dependency */ Module *owner; /**< Module introducing this CAP. */ char unloaded; /**< Internal flag to indicate module is being unloaded */ @@ -450,7 +501,7 @@ typedef struct { char *name; int flags; int (*visible)(Client *); - char *(*parameter)(Client *); + const char *(*parameter)(Client *); } ClientCapabilityInfo; /** @defgroup MessagetagAPI Message tag API @@ -465,13 +516,13 @@ typedef struct { /** Message Tag Handler */ struct MessageTagHandler { MessageTagHandler *prev, *next; - char *name; /**< The name of the message-tag */ - int flags; /**< A flag of MTAG_HANDLER_FLAGS_* */ - int (*is_ok)(Client *, char *, char *); /**< Verify syntax and access rights */ - int (*can_send)(Client *); /**< Tag may be sent to this client (normally NULL!) */ - Module *owner; /**< Module introducing this CAP. */ - ClientCapability *clicap_handler; /**< Client capability handler associated with this */ - char unloaded; /**< Internal flag to indicate module is being unloaded */ + char *name; /**< The name of the message-tag */ + int flags; /**< A flag of MTAG_HANDLER_FLAGS_* */ + int (*is_ok)(Client *, const char *, const char *); /**< Verify syntax and access rights */ + int (*should_send_to_client)(Client *); /**< Tag may be sent to this client (normally NULL!) */ + Module *owner; /**< Module introducing this CAP. */ + ClientCapability *clicap_handler; /**< Client capability handler associated with this */ + char unloaded; /**< Internal flag to indicate module is being unloaded */ }; /** The struct used to register a message tag handler. @@ -480,8 +531,8 @@ struct MessageTagHandler { typedef struct { char *name; int flags; - int (*is_ok)(Client *, char *, char *); - int (*can_send)(Client *); + int (*is_ok)(Client *, const char *, const char *); + int (*should_send_to_client)(Client *); ClientCapability *clicap_handler; } MessageTagHandlerInfo; @@ -531,10 +582,10 @@ typedef struct HistoryBackend HistoryBackend; struct HistoryBackend { HistoryBackend *prev, *next; char *name; /**< The name of the history backend (eg: "mem") */ - int (*history_set_limit)(char *object, int max_lines, long max_time); /**< Impose a limit on a history object */ - int (*history_add)(char *object, MessageTag *mtags, char *line); /**< Add to history */ - HistoryResult *(*history_request)(char *object, HistoryFilter *filter); /**< Request history */ - int (*history_destroy)(char *object); /**< Destroy history of this object completely */ + int (*history_set_limit)(const char *object, int max_lines, long max_time); /**< Impose a limit on a history object */ + int (*history_add)(const char *object, MessageTag *mtags, const char *line); /**< Add to history */ + HistoryResult *(*history_request)(const char *object, HistoryFilter *filter); /**< Request history */ + int (*history_destroy)(const char *object); /**< Destroy history of this object completely */ Module *owner; /**< Module introducing this */ char unloaded; /**< Internal flag to indicate module is being unloaded */ }; @@ -544,10 +595,10 @@ struct HistoryBackend { */ typedef struct { char *name; - int (*history_set_limit)(char *object, int max_lines, long max_time); - int (*history_add)(char *object, MessageTag *mtags, char *line); - HistoryResult *(*history_request)(char *object, HistoryFilter *filter); - int (*history_destroy)(char *object); + int (*history_set_limit)(const char *object, int max_lines, long max_time); + int (*history_add)(const char *object, MessageTag *mtags, const char *line); + HistoryResult *(*history_request)(const char *object, HistoryFilter *filter); + int (*history_destroy)(const char *object); } HistoryBackendInfo; struct Hook { @@ -557,7 +608,8 @@ struct Hook { union { int (*intfunc)(); void (*voidfunc)(); - char *(*pcharfunc)(); + char *(*stringfunc)(); + const char *(*conststringfunc)(); } func; Module *owner; }; @@ -568,7 +620,9 @@ struct Callback { union { int (*intfunc)(); void (*voidfunc)(); - char *(*pcharfunc)(); + void *(*pvoidfunc)(); + char *(*stringfunc)(); + const char *(*conststringfunc)(); } func; Module *owner; char willberemoved; /* will be removed on next rehash? (eg the 'old'/'current' one) */ @@ -589,7 +643,8 @@ struct Efunction { int (*intfunc)(); void (*voidfunc)(); void *(*pvoidfunc)(); - char *(*pcharfunc)(); + char *(*stringfunc)(); + const char *(*conststringfunc)(); } func; Module *owner; char willberemoved; /* will be removed on next rehash? (eg the 'old'/'current' one) */ @@ -618,7 +673,6 @@ typedef struct ModuleObject { Command *command; Hooktype *hooktype; Versionflag *versionflag; - Snomask *snomask; Umode *umode; CommandOverride *cmdoverride; Extban *extban; @@ -717,31 +771,29 @@ extern MODVAR Hooktype Hooktypes[MAXCUSTOMHOOKS]; extern MODVAR Callback *Callbacks[MAXCALLBACKS], *RCallbacks[MAXCALLBACKS]; extern MODVAR ClientCapability *clicaps; -extern Event *EventAdd(Module *module, char *name, vFP event, void *data, long every_msec, int count); +extern Event *EventAdd(Module *module, const char *name, vFP event, void *data, long every_msec, int count); extern void EventDel(Event *event); extern Event *EventMarkDel(Event *event); -extern Event *EventFind(char *name); +extern Event *EventFind(const char *name); extern int EventMod(Event *event, EventInfo *mods); extern void DoEvents(void); extern void EventStatus(Client *client); extern void SetupEvents(void); -extern void Module_Init(void); -extern char *Module_Create(char *path); -extern char *Module_TransformPath(char *path_); -extern void Init_all_testing_modules(void); -extern void Unload_all_loaded_modules(void); -extern void Unload_all_testing_modules(void); -extern int Module_Unload(char *name); -extern vFP Module_Sym(char *name); -extern vFP Module_SymX(char *name, Module **mptr); -extern int Module_free(Module *mod); - +extern void Module_Init(void); +extern const char *Module_Create(const char *path); +extern const char *Module_TransformPath(const char *path_); +extern void Init_all_testing_modules(void); +extern void Unload_all_loaded_modules(void); +extern void Unload_all_testing_modules(void); +extern int Module_Unload(const char *name); +extern vFP Module_Sym(const char *name); +extern vFP Module_SymX(const char *name, Module **mptr); +extern int Module_free(Module *mod); #ifdef __OpenBSD__ -extern void *obsd_dlsym(void *handle, char *symbol); +extern void *obsd_dlsym(void *handle, const char *symbol); #endif - #ifdef _WIN32 extern const char *our_dlerror(void); #endif @@ -771,179 +823,115 @@ extern HistoryBackend *HistoryBackendAdd(Module *module, HistoryBackendInfo *mre extern void HistoryBackendDel(HistoryBackend *m); #ifndef GCC_TYPECHECKING -#define HookAdd(module, hooktype, priority, func) HookAddMain(module, hooktype, priority, func, NULL, NULL) -#define HookAddVoid(module, hooktype, priority, func) HookAddMain(module, hooktype, priority, NULL, func, NULL) -#define HookAddPChar(module, hooktype, priority, func) HookAddMain(module, hooktype, priority, NULL, NULL, func) +#define HookAdd(module, hooktype, priority, func) HookAddMain(module, hooktype, priority, func, NULL, NULL, NULL) +#define HookAddVoid(module, hooktype, priority, func) HookAddMain(module, hooktype, priority, NULL, func, NULL, NULL) +#define HookAddString(module, hooktype, priority, func) HookAddMain(module, hooktype, priority, NULL, NULL, func, NULL) +#define HookAddConstString(module, hooktype, priority, func) HookAddMain(module, hooktype, priority, NULL, NULL, NULL, func) #else #define HookAdd(module, hooktype, priority, func) \ __extension__ ({ \ ValidateHooks(hooktype, func); \ - HookAddMain(module, hooktype, priority, func, NULL, NULL); \ + HookAddMain(module, hooktype, priority, func, NULL, NULL, NULL); \ }) #define HookAddVoid(module, hooktype, priority, func) \ __extension__ ({ \ ValidateHooks(hooktype, func); \ - HookAddMain(module, hooktype, priority, NULL, func, NULL); \ + HookAddMain(module, hooktype, priority, NULL, func, NULL, NULL); \ }) -#define HookAddPChar(module, hooktype, priority, func) \ +#define HookAddString(module, hooktype, priority, func) \ __extension__ ({ \ ValidateHooks(hooktype, func); \ - HookAddMain(module, hooktype, priority, NULL, NULL, func); \ + HookAddMain(module, hooktype, priority, NULL, NULL, func, NULL); \ +}) +#define HookAddConstString(module, hooktype, priority, func) \ +__extension__ ({ \ + ValidateHooks(hooktype, func); \ + HookAddMain(module, hooktype, priority, NULL, NULL, NULL, func); \ }) #endif /* GCC_TYPCHECKING */ -extern Hook *HookAddMain(Module *module, int hooktype, int priority, int (*intfunc)(), void (*voidfunc)(), char *(*pcharfunc)()); +extern Hook *HookAddMain(Module *module, int hooktype, int priority, int (*intfunc)(), void (*voidfunc)(), char *(*stringfunc)(), const char *(*conststringfunc)()); extern Hook *HookDel(Hook *hook); -extern Hooktype *HooktypeAdd(Module *module, char *string, int *type); +extern Hooktype *HooktypeAdd(Module *module, const char *string, int *type); extern void HooktypeDel(Hooktype *hooktype, Module *module); -#define RunHook0(hooktype) do { Hook *h; for (h = Hooks[hooktype]; h; h = h->next)(*(h->func.intfunc))(); } while(0) -#define RunHook(hooktype,x) do { Hook *h; for (h = Hooks[hooktype]; h; h = h->next) (*(h->func.intfunc))(x); } while(0) -#define RunHookReturn(hooktype,x,retchk) \ +#define RunHook(hooktype,...) do { Hook *h; for (h = Hooks[hooktype]; h; h = h->next) (*(h->func.intfunc))(__VA_ARGS__); } while(0) +#define RunHookReturn(hooktype,retchk,...) \ { \ int retval; \ Hook *h; \ for (h = Hooks[hooktype]; h; h = h->next) \ { \ - retval = (*(h->func.intfunc))(x); \ + retval = (*(h->func.intfunc))(__VA_ARGS__); \ if (retval retchk) return; \ } \ } -#define RunHookReturn2(hooktype,x,y,retchk) \ +#define RunHookReturnInt(hooktype,retchk,...) \ { \ int retval; \ Hook *h; \ for (h = Hooks[hooktype]; h; h = h->next) \ { \ - retval = (*(h->func.intfunc))(x,y); \ - if (retval retchk) return; \ - } \ -} -#define RunHookReturn3(hooktype,x,y,z,retchk) \ -{ \ - int retval; \ - Hook *h; \ - for (h = Hooks[hooktype]; h; h = h->next) \ - { \ - retval = (*(h->func.intfunc))(x,y,z); \ - if (retval retchk) return; \ - } \ -} -#define RunHookReturn4(hooktype,a,b,c,d,retchk) \ -{ \ - int retval; \ - Hook *h; \ - for (h = Hooks[hooktype]; h; h = h->next) \ - { \ - retval = (*(h->func.intfunc))(a,b,c,d); \ - if (retval retchk) return; \ - } \ -} -#define RunHookReturnInt(hooktype,x,retchk) \ -{ \ - int retval; \ - Hook *h; \ - for (h = Hooks[hooktype]; h; h = h->next) \ - { \ - retval = (*(h->func.intfunc))(x); \ - if (retval retchk) return retval; \ - } \ -} -#define RunHookReturnInt2(hooktype,x,y,retchk) \ -{ \ - int retval; \ - Hook *h; \ - for (h = Hooks[hooktype]; h; h = h->next) \ - { \ - retval = (*(h->func.intfunc))(x,y); \ - if (retval retchk) return retval; \ - } \ -} -#define RunHookReturnInt3(hooktype,x,y,z,retchk) \ -{ \ - int retval; \ - Hook *h; \ - for (h = Hooks[hooktype]; h; h = h->next) \ - { \ - retval = (*(h->func.intfunc))(x,y,z); \ - if (retval retchk) return retval; \ - } \ -} -#define RunHookReturnInt4(hooktype,a,b,c,d,retchk) \ -{ \ - int retval; \ - Hook *h; \ - for (h = Hooks[hooktype]; h; h = h->next) \ - { \ - retval = (*(h->func.intfunc))(a,b,c,d); \ + retval = (*(h->func.intfunc))(__VA_ARGS__); \ if (retval retchk) return retval; \ } \ } -#define RunHookReturnVoid(hooktype,x,ret) do { Hook *hook; for (hook = Hooks[hooktype]; hook; hook = hook->next) if((*(hook->func.intfunc))(x) ret) return; } while(0) -#define RunHook2(hooktype,x,y) do { Hook *hook; for (hook = Hooks[hooktype]; hook; hook = hook->next) (*(hook->func.intfunc))(x,y); } while(0) -#define RunHook3(hooktype,a,b,c) do { Hook *hook; for (hook = Hooks[hooktype]; hook; hook = hook->next) (*(hook->func.intfunc))(a,b,c); } while(0) -#define RunHook4(hooktype,a,b,c,d) do { Hook *hook; for (hook = Hooks[hooktype]; hook; hook = hook->next) (*(hook->func.intfunc))(a,b,c,d); } while(0) -#define RunHook5(hooktype,a,b,c,d,e) do { Hook *hook; for (hook = Hooks[hooktype]; hook; hook = hook->next) (*(hook->func.intfunc))(a,b,c,d,e); } while(0) -#define RunHook6(hooktype,a,b,c,d,e,f) do { Hook *hook; for (hook = Hooks[hooktype]; hook; hook = hook->next) (*(hook->func.intfunc))(a,b,c,d,e,f); } while(0) -#define RunHook7(hooktype,a,b,c,d,e,f,g) do { Hook *hook; for (hook = Hooks[hooktype]; hook; hook = hook->next) (*(hook->func.intfunc))(a,b,c,d,e,f,g); } while(0) -#define RunHook8(hooktype,a,b,c,d,e,f,g,h) do { Hook *hook; for (hook = Hooks[hooktype]; hook; hook = hook->next) (*(hook->func.intfunc))(a,b,c,d,e,f,g,h); } while(0) +#define CallbackAdd(module, cbtype, func) CallbackAddMain(module, cbtype, func, NULL, NULL, NULL, NULL) +#define CallbackAddVoid(module, cbtype, func) CallbackAddMain(module, cbtype, NULL, func, NULL, NULL, NULL) +#define CallbackAddPVoid(module, cbtype, func) CallbackAddMain(module, cbtype, NULL, NULL, func, NULL, NULL) +#define CallbackAddString(module, cbtype, func) CallbackAddMain(module, cbtype, NULL, NULL, NULL, func, NULL) +#define CallbackAddConstString(module, cbtype, func) CallbackAddMain(module, cbtype, NULL, NULL, NULL, NULL, func) -#define CallbackAdd(cbtype, func) CallbackAddMain(NULL, cbtype, func, NULL, NULL) -#define CallbackAddEx(module, cbtype, func) CallbackAddMain(module, cbtype, func, NULL, NULL) -#define CallbackAddVoid(cbtype, func) CallbackAddMain(NULL, cbtype, NULL, func, NULL) -#define CallbackAddVoidEx(module, cbtype, func) CallbackAddMain(module, cbtype, NULL, func, NULL) -#define CallbackAddPChar(cbtype, func) CallbackAddMain(NULL, cbtype, NULL, NULL, func) -#define CallbackAddPCharEx(module, cbtype, func) CallbackAddMain(module, cbtype, NULL, NULL, func) - -extern Callback *CallbackAddMain(Module *module, int cbtype, int (*intfunc)(), void (*voidfunc)(), char *(*pcharfunc)()); +extern Callback *CallbackAddMain(Module *module, int cbtype, int (*func)(), void (*vfunc)(), void *(*pvfunc)(), char *(*stringfunc)(), const char *(*conststringfunc)()); extern Callback *CallbackDel(Callback *cb); -#define EfunctionAdd(module, cbtype, func) EfunctionAddMain(module, cbtype, func, NULL, NULL, NULL) -#define EfunctionAddVoid(module, cbtype, func) EfunctionAddMain(module, cbtype, NULL, func, NULL, NULL) -#define EfunctionAddPVoid(module, cbtype, func) EfunctionAddMain(module, cbtype, NULL, NULL, func, NULL) -#define EfunctionAddPChar(module, cbtype, func) EfunctionAddMain(module, cbtype, NULL, NULL, NULL, func) +#define EfunctionAdd(module, cbtype, func) EfunctionAddMain(module, cbtype, func, NULL, NULL, NULL, NULL) +#define EfunctionAddVoid(module, cbtype, func) EfunctionAddMain(module, cbtype, NULL, func, NULL, NULL, NULL) +#define EfunctionAddPVoid(module, cbtype, func) EfunctionAddMain(module, cbtype, NULL, NULL, func, NULL, NULL) +#define EfunctionAddString(module, cbtype, func) EfunctionAddMain(module, cbtype, NULL, NULL, NULL, func, NULL) +#define EfunctionAddConstString(module, cbtype, func) EfunctionAddMain(module, cbtype, NULL, NULL, NULL, NULL, func) -extern Efunction *EfunctionAddMain(Module *module, EfunctionType eftype, int (*intfunc)(), void (*voidfunc)(), void *(*pvoidfunc)(), char *(*pcharfunc)()); +extern Efunction *EfunctionAddMain(Module *module, EfunctionType eftype, int (*intfunc)(), void (*voidfunc)(), void *(*pvoidfunc)(), char *(*stringfunc)(), const char *(*conststringfunc)()); extern Efunction *EfunctionDel(Efunction *cb); -extern Command *CommandAdd(Module *module, char *cmd, CmdFunc func, unsigned char params, int flags); -extern Command *AliasAdd(Module *module, char *cmd, AliasCmdFunc aliasfunc, unsigned char params, int flags); +extern Command *CommandAdd(Module *module, const char *cmd, CmdFunc func, unsigned char params, int flags); +extern Command *AliasAdd(Module *module, const char *cmd, AliasCmdFunc aliasfunc, unsigned char params, int flags); extern void CommandDel(Command *command); extern void CommandDelX(Command *command, RealCommand *cmd); -extern int CommandExists(char *name); -extern CommandOverride *CommandOverrideAdd(Module *module, char *cmd, OverrideCmdFunc func); -extern CommandOverride *CommandOverrideAddEx(Module *module, char *name, int priority, OverrideCmdFunc func); +extern int CommandExists(const char *name); +extern CommandOverride *CommandOverrideAdd(Module *module, const char *name, int priority, OverrideCmdFunc func); extern void CommandOverrideDel(CommandOverride *ovr); -extern void CallCommandOverride(CommandOverride *ovr, Client *client, MessageTag *mtags, int parc, char *parv[]); +extern void CallCommandOverride(CommandOverride *ovr, Client *client, MessageTag *mtags, int parc, const char *parv[]); extern void moddata_free_client(Client *acptr); extern void moddata_free_local_client(Client *acptr); extern void moddata_free_channel(Channel *channel); extern void moddata_free_member(Member *m); extern void moddata_free_membership(Membership *m); -extern ModDataInfo *findmoddata_byname(char *name, ModDataType type); -extern int moddata_client_set(Client *acptr, char *varname, char *value); -extern char *moddata_client_get(Client *acptr, char *varname); -extern int moddata_local_client_set(Client *acptr, char *varname, char *value); -extern char *moddata_local_client_get(Client *acptr, char *varname); +extern ModDataInfo *findmoddata_byname(const char *name, ModDataType type); +extern int moddata_client_set(Client *acptr, const char *varname, const char *value); +extern const char *moddata_client_get(Client *acptr, const char *varname); +extern ModData *moddata_client_get_raw(Client *client, const char *varname); +extern int moddata_local_client_set(Client *acptr, const char *varname, const char *value); +extern const char *moddata_local_client_get(Client *acptr, const char *varname); -extern int LoadPersistentPointerX(ModuleInfo *modinfo, char *varshortname, void **var, void (*free_variable)(ModData *m)); +extern int LoadPersistentPointerX(ModuleInfo *modinfo, const char *varshortname, void **var, void (*free_variable)(ModData *m)); #define LoadPersistentPointer(modinfo, var, free_variable) LoadPersistentPointerX(modinfo, #var, (void **)&var, free_variable) -extern void SavePersistentPointerX(ModuleInfo *modinfo, char *varshortname, void *var); +extern void SavePersistentPointerX(ModuleInfo *modinfo, const char *varshortname, void *var); #define SavePersistentPointer(modinfo, var) SavePersistentPointerX(modinfo, #var, var) -extern int LoadPersistentIntX(ModuleInfo *modinfo, char *varshortname, int *var); +extern int LoadPersistentIntX(ModuleInfo *modinfo, const char *varshortname, int *var); #define LoadPersistentInt(modinfo, var) LoadPersistentIntX(modinfo, #var, &var) -extern void SavePersistentIntX(ModuleInfo *modinfo, char *varshortname, int var); +extern void SavePersistentIntX(ModuleInfo *modinfo, const char *varshortname, int var); #define SavePersistentInt(modinfo, var) SavePersistentIntX(modinfo, #var, var) -extern int LoadPersistentLongX(ModuleInfo *modinfo, char *varshortname, long *var); +extern int LoadPersistentLongX(ModuleInfo *modinfo, const char *varshortname, long *var); #define LoadPersistentLong(modinfo, var) LoadPersistentLongX(modinfo, #var, &var) -extern void SavePersistentLongX(ModuleInfo *modinfo, char *varshortname, long var); +extern void SavePersistentLongX(ModuleInfo *modinfo, const char *varshortname, long var); #define SavePersistentLong(modinfo, var) SavePersistentLongX(modinfo, #var, var) /** Hooks trigger on "events", such as a new user connecting or joining a channel, @@ -1121,8 +1109,6 @@ extern void SavePersistentLongX(ModuleInfo *modinfo, char *varshortname, long va #define HOOKTYPE_CHANNEL_SYNCED 83 /** See hooktype_can_sajoin() */ #define HOOKTYPE_CAN_SAJOIN 84 -/** See hooktype_check_init() */ -#define HOOKTYPE_CHECK_INIT 85 /** See hooktype_mode_deop() */ #define HOOKTYPE_MODE_DEOP 86 /** See hooktype_dcc_denied() */ @@ -1131,8 +1117,6 @@ extern void SavePersistentLongX(ModuleInfo *modinfo, char *varshortname, long va #define HOOKTYPE_SECURE_CONNECT 88 /** See hooktype_can_bypass_channel_message_restriction() */ #define HOOKTYPE_CAN_BYPASS_CHANNEL_MESSAGE_RESTRICTION 89 -/** See hooktype_require_sasl() */ -#define HOOKTYPE_REQUIRE_SASL 90 /** See hooktype_sasl_continuation() */ #define HOOKTYPE_SASL_CONTINUATION 91 /** See hooktype_sasl_result() */ @@ -1161,6 +1145,18 @@ extern void SavePersistentLongX(ModuleInfo *modinfo, char *varshortname, long va #define HOOKTYPE_CLOSE_CONNECTION 103 /** See hooktype_connect_extinfo() */ #define HOOKTYPE_CONNECT_EXTINFO 104 +/** See hooktype_is_invited() */ +#define HOOKTYPE_IS_INVITED 105 +/** See hooktype_post_local_nickchange() */ +#define HOOKTYPE_POST_LOCAL_NICKCHANGE 106 +/** See hooktype_post_remote_nickchange() */ +#define HOOKTYPE_POST_REMOTE_NICKCHANGE 107 +/** See hooktype_userhost_changed() */ +#define HOOKTYPE_USERHOST_CHANGED 108 +/** See hooktype_realname_changed() */ +#define HOOKTYPE_REALNAME_CHANGED 109 +/** See hooktype_can_set_topic() */ +#define HOOKTYPE_CAN_SET_TOPIC 110 /* Adding a new hook here? * 1) Add the #define HOOKTYPE_.... with a new number * 2) Add a hook prototype (see below) @@ -1193,7 +1189,7 @@ int hooktype_remote_connect(Client *client); * @param client The quit/disconnect reason * @return The quit reason (you may also return 'comment' if it should be unchanged) or NULL for an empty reason. */ -char *hooktype_pre_local_quit(Client *client, char *comment); +const char *hooktype_pre_local_quit(Client *client, const char *comment); /** Called when a local user quits or otherwise disconnects (function prototype for HOOKTYPE_PRE_LOCAL_QUIT). * @param client The client @@ -1201,7 +1197,7 @@ char *hooktype_pre_local_quit(Client *client, char *comment); * @param comment The quit/exit reason * @return The return value is ignored (use return 0) */ -int hooktype_local_quit(Client *client, MessageTag *mtags, char *comment); +int hooktype_local_quit(Client *client, MessageTag *mtags, const char *comment); /** Called when a remote user qutis or otherwise disconnects (function prototype for HOOKTYPE_REMOTE_QUIT). * @param client The client @@ -1209,7 +1205,7 @@ int hooktype_local_quit(Client *client, MessageTag *mtags, char *comment); * @param comment The quit/exit reason * @return The return value is ignored (use return 0) */ -int hooktype_remote_quit(Client *client, MessageTag *mtags, char *comment); +int hooktype_remote_quit(Client *client, MessageTag *mtags, const char *comment); /** Called when an unregistered user disconnects, so before the user was fully online (function prototype for HOOKTYPE_UNKUSER_QUIT). * @param client The client @@ -1217,7 +1213,7 @@ int hooktype_remote_quit(Client *client, MessageTag *mtags, char *comment); * @param comment The quit/exit reason * @return The return value is ignored (use return 0) */ -int hooktype_unkuser_quit(Client *client, MessageTag *mtags, char *comment); +int hooktype_unkuser_quit(Client *client, MessageTag *mtags, const char *comment); /** Called when a local or remote server connects / links in (function prototype for HOOKTYPE_SERVER_CONNECT). * @param client The client @@ -1262,7 +1258,7 @@ int hooktype_server_quit(Client *client, MessageTag *mtags); * @param newnick The new nick name * @return The return value is ignored (use return 0) */ -int hooktype_local_nickchange(Client *client, MessageTag *mtags, char *newnick); +int hooktype_local_nickchange(Client *client, MessageTag *mtags, const char *newnick); /** Called when a remote user changes the nick name (function prototype for HOOKTYPE_REMOTE_NICKCHANGE). * @param client The client @@ -1270,45 +1266,42 @@ int hooktype_local_nickchange(Client *client, MessageTag *mtags, char *newnick); * @param newnick The new nick name * @return The return value is ignored (use return 0) */ -int hooktype_remote_nickchange(Client *client, MessageTag *mtags, char *newnick); +int hooktype_remote_nickchange(Client *client, MessageTag *mtags, const char *newnick); /** Called when a user wants to join a channel, may the user join? (function prototype for HOOKTYPE_CAN_JOIN). * @param client The client * @param channel The channel the user wants to join * @param key The key supplied by the client - * @param parv The parameters from the JOIN. Normally you should not use this. * @return Return 0 to allow the user, any other value should be an IRC numeric (eg: ERR_BANNEDFROMCHAN). */ -int hooktype_can_join(Client *client, Channel *channel, char *key, char *parv[]); +int hooktype_can_join(Client *client, Channel *channel, const char *key, char **errmsg); -/** Called when a user wants to join a channel, may the user join? (function prototype for HOOKTYPE_PRE_LOCAL_JOIN). - * FIXME: It's not entirely clear why we have both hooktype_can_join() and hooktype_pre_local_join(). +/** Called when a user wants to join a channel (function prototype for HOOKTYPE_PRE_LOCAL_JOIN). + * IMPORTANT: Generally you want to use HOOKTYPE_CAN_JOIN / hooktype_can_join() instead!! * @param client The client * @param channel The channel the user wants to join - * @param parv The parameters from the JOIN. May contain channel key in parv[2]. + * @param key Channel key (can be NULL) * @retval HOOK_DENY Deny the join. * @retval HOOK_ALLOW Allow the join (stop processing other modules) * @retval HOOK_CONTINUE Allow the join, unless another module blocks it. */ -int hooktype_pre_local_join(Client *client, Channel *channel, char *parv[]); +int hooktype_pre_local_join(Client *client, Channel *channel, const char *key); /** Called when a local user joins a channel (function prototype for HOOKTYPE_LOCAL_JOIN). * @param client The client * @param channel The channel the user wants to join * @param mtags Message tags associated with the event - * @param parv The parameters from the JOIN. May contain channel key in parv[2]. * @return The return value is ignored (use return 0) */ -int hooktype_local_join(Client *client, Channel *channel, MessageTag *mtags, char *parv[]); +int hooktype_local_join(Client *client, Channel *channel, MessageTag *mtags); /** Called when a remote user joins a channel (function prototype for HOOKTYPE_REMOTE_JOIN). * @param client The client * @param channel The channel the user wants to join * @param mtags Message tags associated with the event - * @param parv The parameters from the JOIN. May contain channel key in parv[2]. * @return The return value is ignored (use return 0) */ -int hooktype_remote_join(Client *client, Channel *channel, MessageTag *mtags, char *parv[]); +int hooktype_remote_join(Client *client, Channel *channel, MessageTag *mtags); /** Called when a local user wants to part a channel (function prototype for HOOKTYPE_PRE_LOCAL_PART). * @param client The client @@ -1316,7 +1309,7 @@ int hooktype_remote_join(Client *client, Channel *channel, MessageTag *mtags, ch * @param comment The PART reason, this may be NULL. * @return The part reason (you may also return 'comment' if it should be unchanged) or NULL for an empty reason. */ -char *hooktype_pre_local_part(Client *client, Channel *channel, char *comment); +const char *hooktype_pre_local_part(Client *client, Channel *channel, const char *comment); /** Called when a local user parts a channel (function prototype for HOOKTYPE_LOCAL_PART). * @param client The client @@ -1325,7 +1318,7 @@ char *hooktype_pre_local_part(Client *client, Channel *channel, char *comment); * @param comment The PART reason, this may be NULL. * @return The return value is ignored (use return 0) */ -int hooktype_local_part(Client *client, Channel *channel, MessageTag *mtags, char *comment); +int hooktype_local_part(Client *client, Channel *channel, MessageTag *mtags, const char *comment); /** Called when a remote user parts a channel (function prototype for HOOKTYPE_REMOTE_PART). * @param client The client @@ -1334,25 +1327,25 @@ int hooktype_local_part(Client *client, Channel *channel, MessageTag *mtags, cha * @param comment The PART reason, this may be NULL. * @return The return value is ignored (use return 0) */ -int hooktype_remote_part(Client *client, Channel *channel, MessageTag *mtags, char *comment); +int hooktype_remote_part(Client *client, Channel *channel, MessageTag *mtags, const char *comment); /** Do not use this function, use hooktype_can_kick() instead! */ -char *hooktype_pre_local_kick(Client *client, Client *victim, Channel *channel, char *comment); +const char *hooktype_pre_local_kick(Client *client, Client *victim, Channel *channel, const char *comment); /** Called when a local user wants to kick another user from a channel (function prototype for HOOKTYPE_CAN_KICK). * @param client The client issuing the command * @param victim The victim that should be kicked * @param channel The channel the user should be kicked from * @param comment The KICK reason, this may be NULL. - * @param client_flags The access flags of 'client', one of CHFL_*, eg CHFL_CHANOP. - * @param victim_flags The access flags of 'victim', one of CHFL_*, eg CHFL_VOICE. - * @param error The error message that should be shown to the user (full IRC protocol line). + * @param client_member_modes The member modes of 'client' (eg "o"), never NULL but can be empty. + * @param victim_member_modes The member modes of 'victim' (eg "v"), never NULL but can be empty. + * @param errmsg The error message that should be shown to the user (full IRC protocol line). * @retval EX_DENY Deny the KICK (unless IRCOp with sufficient override rights). * @retval EX_ALWAYS_DENY Deny the KICK always (even if IRCOp). * @retval EX_ALLOW Allow the kick, unless another module blocks it. */ -int hooktype_can_kick(Client *client, Client *victim, Channel *channel, char *comment, long client_flags, long victim_flags, char **error); +int hooktype_can_kick(Client *client, Client *victim, Channel *channel, const char *comment, const char *client_member_modes, const char *victim_member_modes, const char **errmsg); /** Called when a local user is kicked (function prototype for HOOKTYPE_LOCAL_KICK). * @param client The client issuing the command @@ -1362,7 +1355,7 @@ int hooktype_can_kick(Client *client, Client *victim, Channel *channel, char *co * @param comment The KICK reason, this may be NULL. * @return The return value is ignored (use return 0) */ -int hooktype_local_kick(Client *client, Client *victim, Channel *channel, MessageTag *mtags, char *comment); +int hooktype_local_kick(Client *client, Client *victim, Channel *channel, MessageTag *mtags, const char *comment); /** Called when a remote user is kicked (function prototype for HOOKTYPE_REMOTE_KICK). * @param client The client issuing the command @@ -1372,7 +1365,7 @@ int hooktype_local_kick(Client *client, Client *victim, Channel *channel, Messag * @param comment The KICK reason, this may be NULL. * @return The return value is ignored (use return 0) */ -int hooktype_remote_kick(Client *client, Client *victim, Channel *channel, MessageTag *mtags, char *comment); +int hooktype_remote_kick(Client *client, Client *victim, Channel *channel, MessageTag *mtags, const char *comment); /** Called right before a message is sent to the channel (function prototype for HOOKTYPE_PRE_CHANMSG). * This function is only used by delayjoin. It cannot block a message. See hooktype_can_send_to_user() instead! @@ -1382,7 +1375,7 @@ int hooktype_remote_kick(Client *client, Client *victim, Channel *channel, Messa * @param text The text that will be sent * @return The return value is ignored (use return 0) */ -int hooktype_pre_chanmsg(Client *client, Channel *channel, MessageTag *mtags, char *text, SendType sendtype); +int hooktype_pre_chanmsg(Client *client, Channel *channel, MessageTag *mtags, const char *text, SendType sendtype); /** Called when a user wants to send a message to another user (function prototype for HOOKTYPE_CAN_SEND_TO_USER). * @param client The sender @@ -1393,7 +1386,7 @@ int hooktype_pre_chanmsg(Client *client, Channel *channel, MessageTag *mtags, ch * @retval HOOK_DENY Deny the message. The 'errmsg' will be sent to the user. * @retval HOOK_CONTINUE Allow the message, unless other modules block it. */ -int hooktype_can_send_to_user(Client *client, Client *target, char **text, char **errmsg, SendType sendtype); +int hooktype_can_send_to_user(Client *client, Client *target, const char **text, const char **errmsg, SendType sendtype); /** Called when a user wants to send a message to a channel (function prototype for HOOKTYPE_CAN_SEND_TO_CHANNEL). * @param client The sender @@ -1405,7 +1398,7 @@ int hooktype_can_send_to_user(Client *client, Client *target, char **text, char * @retval HOOK_DENY Deny the message. The 'errmsg' will be sent to the user. * @retval HOOK_CONTINUE Allow the message, unless other modules block it. */ -int hooktype_can_send_to_channel(Client *client, Channel *channel, Membership *member, char **text, char **errmsg, SendType sendtype); +int hooktype_can_send_to_channel(Client *client, Channel *channel, Membership *member, const char **text, const char **errmsg, SendType sendtype); /** Called when a message is sent from one user to another user (function prototype for HOOKTYPE_USERMSG). * @param client The sender @@ -1415,20 +1408,31 @@ int hooktype_can_send_to_channel(Client *client, Channel *channel, Membership *m * @param sendtype The message type, for example SEND_TYPE_PRIVMSG. * @return The return value is ignored (use return 0) */ -int hooktype_usermsg(Client *client, Client *to, MessageTag *mtags, char *text, SendType sendtype); +int hooktype_usermsg(Client *client, Client *to, MessageTag *mtags, const char *text, SendType sendtype); /** Called when a message is sent to a channel (function prototype for HOOKTYPE_CHANMSG). * @param client The sender * @param channel The channel * @param sendflags One of SEND_* (eg SEND_ALL, SKIP_DEAF). - * @param prefix Either zero, one or a combination of PREFIX_*. + * @param member_modes Either NULL, or a member mode like "h", "o", etc. * @param target Target string, usually this is "#channel", but it can also contain prefixes like "@#channel" * @param mtags Message tags associated with the event * @param text The text * @param sendtype The message type, for example SEND_TYPE_PRIVMSG. * @return The return value is ignored (use return 0) */ -int hooktype_chanmsg(Client *client, Channel *channel, int sendflags, int prefix, char *target, MessageTag *mtags, char *text, SendType sendtype); +int hooktype_chanmsg(Client *client, Channel *channel, int sendflags, const char *member_modes, const char *target, MessageTag *mtags, const char *text, SendType sendtype); + +/** Called when a user wants to set the topic (function prototype for HOOKTYPE_CAN_SET_TOPIC). + * @param client The client issuing the command + * @param channel The channel the topic should be set for + * @param topic The topic that should be set, this may be NULL for unset. + * @param errmsg The error message that should be shown to the user (full IRC protocol line). + * @retval EX_DENY Deny the TOPIC (unless IRCOp with sufficient override rights). + * @retval EX_ALWAYS_DENY Deny the TOPIC always (even if IRCOp). + * @retval EX_ALLOW Allow the TOPIC, unless another module blocks it. + */ +int hooktype_can_set_topic(Client *client, Channel *channel, const char *topic, const char **errmsg); /** Called when a local user wants to change the channel topic (function prototype for HOOKTYPE_PRE_LOCAL_TOPIC). * @param client The client @@ -1436,7 +1440,7 @@ int hooktype_chanmsg(Client *client, Channel *channel, int sendflags, int prefix * @param topic The new requested topic * @return The new topic (you may also return 'topic'), or NULL if the topic change request should be rejected. */ -char *hooktype_pre_local_topic(Client *client, Channel *channel, char *topic); +const char *hooktype_pre_local_topic(Client *client, Channel *channel, const char *topic); /** Called when the channel topic is changed (function prototype for HOOKTYPE_TOPIC). * @param client The client @@ -1445,7 +1449,7 @@ char *hooktype_pre_local_topic(Client *client, Channel *channel, char *topic); * @param topic The new topic * @return The return value is ignored (use return 0) */ -int hooktype_topic(Client *client, Channel *channel, MessageTag *mtags, char *topic); +int hooktype_topic(Client *client, Channel *channel, MessageTag *mtags, const char *topic); /** Called when a local user changes channel modes, called early (function prototype for HOOKTYPE_PRE_LOCAL_CHANMODE). * WARNING: This does not allow you to stop or reject the channel modes. It only allows you to do stuff -before- the @@ -1459,7 +1463,7 @@ int hooktype_topic(Client *client, Channel *channel, MessageTag *mtags, char *to * @param samode Is this an SAMODE? * @return The return value is ignored (use return 0) */ -int hooktype_pre_local_chanmode(Client *client, Channel *channel, MessageTag *mtags, char *modebuf, char *parabuf, time_t sendts, int samode); +int hooktype_pre_local_chanmode(Client *client, Channel *channel, MessageTag *mtags, const char *modebuf, const char *parabuf, time_t sendts, int samode); /** Called when a remote user changes channel modes, called early (function prototype for HOOKTYPE_PRE_REMOTE_CHANMODE). * WARNING: This does not allow you to stop or reject the channel modes. It only allows you to do stuff -before- the @@ -1473,7 +1477,7 @@ int hooktype_pre_local_chanmode(Client *client, Channel *channel, MessageTag *mt * @param samode Is this an SAMODE? * @return The return value is ignored (use return 0) */ -int hooktype_pre_remote_chanmode(Client *client, Channel *channel, MessageTag *mtags, char *modebuf, char *parabuf, time_t sendts, int samode); +int hooktype_pre_remote_chanmode(Client *client, Channel *channel, MessageTag *mtags, const char *modebuf, const char *parabuf, time_t sendts, int samode); /** Called when a local user changes channel modes (function prototype for HOOKTYPE_LOCAL_CHANMODE). * @param client The client @@ -1483,9 +1487,10 @@ int hooktype_pre_remote_chanmode(Client *client, Channel *channel, MessageTag *m * @param parabuf The parameter buffer, for example "NiceOp" * @param sendts Send timestamp * @param samode Is this an SAMODE? + * @param destroy_channel Module can set this to 1 to indicate 'channel' was destroyed * @return The return value is ignored (use return 0) */ -int hooktype_local_chanmode(Client *client, Channel *channel, MessageTag *mtags, char *modebuf, char *parabuf, time_t sendts, int samode); +int hooktype_local_chanmode(Client *client, Channel *channel, MessageTag *mtags, const char *modebuf, const char *parabuf, time_t sendts, int samode, int *destroy_channel); /** Called when a remote user changes channel modes (function prototype for HOOKTYPE_REMOTE_CHANMODE). * @param client The client @@ -1495,9 +1500,10 @@ int hooktype_local_chanmode(Client *client, Channel *channel, MessageTag *mtags, * @param parabuf The parameter buffer, for example "NiceOp" * @param sendts Send timestamp * @param samode Is this an SAMODE? + * @param destroy_channel Module can set this to 1 to indicate 'channel' was destroyed * @return The return value is ignored (use return 0) */ -int hooktype_remote_chanmode(Client *client, Channel *channel, MessageTag *mtags, char *modebuf, char *parabuf, time_t sendts, int samode); +int hooktype_remote_chanmode(Client *client, Channel *channel, MessageTag *mtags, const char *modebuf, const char *parabuf, time_t sendts, int samode, int *destroy_channel); /** Called when a channel mode is removed by a local or remote user (function prototype for HOOKTYPE_MODECHAR_DEL). * NOTE: This is currently not terribly useful for most modules. It is used by by the floodprot and noknock modules. @@ -1519,9 +1525,10 @@ int hooktype_modechar_add(Channel *channel, int modechar); * @param client The client * @param mtags Message tags associated with the event * @param reason The away reason, or NULL if away is unset. + * @param already_as_away Set to 1 if the user only changed their away reason. * @return The return value is ignored (use return 0) */ -int hooktype_away(Client *client, MessageTag *mtags, char *reason); +int hooktype_away(Client *client, MessageTag *mtags, const char *reason, int already_as_away); /** Called when a user wants to invite another user to a channel (function prototype for HOOKTYPE_PRE_INVITE). * @param client The client @@ -1544,14 +1551,14 @@ int hooktype_pre_invite(Client *client, Client *acptr, Channel *channel, int *ov int hooktype_invite(Client *client, Client *acptr, Channel *channel, MessageTag *mtags); /** Called when a user wants to knock on a channel (function prototype for HOOKTYPE_PRE_KNOCK). - * FIXME: where is the knock reason ? * @param client The client * @param channel The channel to knock on + * @param reason Knock reason (can be replaced if needed) * @retval HOOK_DENY Deny the knock. * @retval HOOK_ALLOW Allow the knock (stop processing other modules) * @retval HOOK_CONTINUE Allow the knock, unless another module blocks it. */ -int hooktype_pre_knock(Client *client, Channel *channel); +int hooktype_pre_knock(Client *client, Channel *channel, const char **reason); /** Called when a user knocks on a channel (function prototype for HOOKTYPE_KNOCK). * @param client The client @@ -1560,14 +1567,16 @@ int hooktype_pre_knock(Client *client, Channel *channel); * @param comment The knock reason * @return The return value is ignored (use return 0) */ -int hooktype_knock(Client *client, Channel *channel, MessageTag *mtags, char *comment); +int hooktype_knock(Client *client, Channel *channel, MessageTag *mtags, const char *comment); /** Called when a user whoises someone (function prototype for HOOKTYPE_WHOIS). * @param client The client issuing the command * @param target The user who is the target of the /WHOIS. + * @param list The name/value/prio list that you can add information to + * that will be sent to the user as the WHOIS response. * @return The return value is ignored (use return 0) */ -int hooktype_whois(Client *client, Client *target); +int hooktype_whois(Client *client, Client *target, NameValuePrioList **list); /** Called to add letters to the WHO status column (function prototype for HOOKTYPE_WHO_STATUS). * If a user does a /WHO request, then WHO will show a number of status flags @@ -1580,7 +1589,7 @@ int hooktype_whois(Client *client, Client *target); * @param cansee If 'client' can see 'target' (eg: in same channel or -i) * @return Return 0 if no WHO status flags need to be added, otherwise return the ascii character (eg: return 'B'). */ -int hooktype_who_status(Client *client, Client *target, Channel *channel, Member *member, char *status, int cansee); +int hooktype_who_status(Client *client, Client *target, Channel *channel, Member *member, const char *status, int cansee); /** Called when an IRCOp wants to kill another user (function prototype for HOOKTYPE_PRE_KILL). * @param client The client @@ -1590,7 +1599,7 @@ int hooktype_who_status(Client *client, Client *target, Channel *channel, Member * @retval EX_ALWAYS_DENY Deny the KICK always (even if IRCOp). * @retval EX_ALLOW Allow the kick, unless another module blocks it. */ -int hooktype_pre_kill(Client *client, Client *victim, char *reason); +int hooktype_pre_kill(Client *client, Client *victim, const char *reason); /** Called when a local user kills another user (function prototype for HOOKTYPE_LOCAL_KILL). * Note that kills from remote IRCOps will show up as regular quits, so use hooktype_remote_quit() and hooktype_local_quit(). @@ -1599,15 +1608,14 @@ int hooktype_pre_kill(Client *client, Client *victim, char *reason); * @param comment The kill reason * @return The return value is ignored (use return 0) */ -int hooktype_local_kill(Client *client, Client *victim, char *comment); +int hooktype_local_kill(Client *client, Client *victim, const char *comment); -/** Called when an IRCOp /REHASH'es, and passes the parameters (function prototype for HOOKTYPE_REHASHFLAG). - * FIXME: shouldn't this be merged with hooktype_rehash() ? +/** Called when an IRCOp calls /REHASH with a -parameter (function prototype for HOOKTYPE_REHASHFLAG). * @param client The client issuing the command, or NULL if rehashing due to system signal. * @param str The rehash flag (eg: "-all") * @return The return value is ignored (use return 0) */ -int hooktype_rehashflag(Client *client, char *str); +int hooktype_rehashflag(Client *client, const char *str); /** Called when the server is rehashing (function prototype for HOOKTYPE_REHASH). * @return The return value is ignored (use return 0) @@ -1667,29 +1675,29 @@ int hooktype_configrun_ex(ConfigFile *cfptr, ConfigEntry *ce, int section, void * @param str The parameter to the STATS command, eg 'something'. * @return The return value is ignored (use return 0) */ -int hooktype_stats(Client *client, char *str); +int hooktype_stats(Client *client, const char *str); /** Called when a user becomes IRCOp or is no longer an IRCOp (function prototype for HOOKTYPE_LOCAL_OPER). * @param client The client * @param add 1 if the user becomes IRCOp, 0 if the user is no longer IRCOp + * @param oper_block The name of the oper block used to oper up * @return The return value is ignored (use return 0) */ -int hooktype_local_oper(Client *client, int add); +int hooktype_local_oper(Client *client, int add, ConfigItem_oper *oper_block); /** Called when a client sends a PASS command (function prototype for HOOKTYPE_LOCAL_PASS). * @param client The client * @param password The password supplied by the client * @return The return value is ignored (use return 0) */ -int hooktype_local_pass(Client *client, char *password); +int hooktype_local_pass(Client *client, const char *password); /** Called when a channel is created (function prototype for HOOKTYPE_CHANNEL_CREATE). - * @param client The client * @param channel The channel that just got created * @note This function is not used much, use hooktype_local_join() and hooktype_remote_join() instead. * @return The return value is ignored (use return 0) */ -int hooktype_channel_create(Client *client, Channel *channel); +int hooktype_channel_create(Channel *channel); /** Called when a channel is completely destroyed (function prototype for HOOKTYPE_CHANNEL_DESTROY). * @param channel The channel that is about to be destroyed @@ -1731,13 +1739,16 @@ int hooktype_tkl_add(Client *client, TKL *tkl); */ int hooktype_tkl_del(Client *client, TKL *tkl); -/** Called when something is logged via the ircd_log() function (function prototype for HOOKTYPE_LOG). - * @param flags One of LOG_*, such as LOG_ERROR. - * @param timebuf The time buffer, such as "[2030-01-01 12:00:00]" - * @param buf The text to be logged +/** Called when something is logged via the unreal_log() function (function prototype for HOOKTYPE_LOG). + * @param loglevel Loglevel (eg ULOG_INFO) + * @param subsystem Subsystem (eg "operoverride") + * @param event_id Event ID (eg "SAJOIN_COMMAND") + * @param msg Message(s) in text form + * @param json_serialized The associated JSON text + * @param timebuf The [xxxx] time buffer, for convenience * @return The return value is ignored (use return 0) */ -int hooktype_log(int flags, char *timebuf, char *buf); +int hooktype_log(LogLevel loglevel, const char *subsystem, const char *event_id, MultiLine *msg, const char *json_serialized, const char *timebuf); /** Called when a local user matches a spamfilter (function prototype for HOOKTYPE_LOCAL_SPAMFILTER). * @param client The client @@ -1748,7 +1759,7 @@ int hooktype_log(int flags, char *timebuf, char *buf); * @param tkl The spamfilter TKL entry that matched * @return The return value is ignored (use return 0) */ -int hooktype_local_spamfilter(Client *client, char *str, char *str_in, int type, char *target, TKL *tkl); +int hooktype_local_spamfilter(Client *client, const char *str, const char *str_in, int type, const char *target, TKL *tkl); /** Called when a user sends something to a user that has the sender silenced (function prototype for HOOKTYPE_SILENCED). * UnrealIRCd support a SILENCE list. If the target user has added someone on the silence list, eg via SILENCE +BadUser, @@ -1771,7 +1782,7 @@ int hooktype_silenced(Client *client, Client *target, SendType sendtype); * @note If you want to alter the buffer contents then replace 'readbuf' with your own buffer and set 'length' appropriately. * @return The return value is ignored (use return 0) */ -int hooktype_rawpacket_in(Client *client, char *readbuf, int *length); +int hooktype_rawpacket_in(Client *client, const char *readbuf, int *length); /** Called when a packet is received or sent (function prototype for HOOKTYPE_PACKET). * @param client The locally connected sender, this can be &me @@ -1812,11 +1823,10 @@ int hooktype_free_user(Client *client); * @param client The client * @param channel The channel * @param key The channel key - * @param parv The join parameters * @note I don't think this works? * @return Unclear.. */ -int hooktype_can_join_limitexceeded(Client *client, Channel *channel, char *key, char *parv[]); +int hooktype_can_join_limitexceeded(Client *client, Channel *channel, const char *key, char **errmsg); /** Called to check if the user is visible in the channel (function prototype for HOOKTYPE_VISIBLE_IN_CHANNEL). * For example, the delayjoin module (+d/+D) will 'return 0' here if the user is hidden due to delayed join. @@ -1904,16 +1914,6 @@ int hooktype_channel_synced(Channel *channel, int merge, int removetheirs, int n */ int hooktype_can_sajoin(Client *target, Channel *channel, Client *client); -/** Called when the hostname is initialized for a client (function prototype for HOOKTYPE_CHECK_INIT). - * This is a very specific call, it is only meant for the WEBIRC module. - * @param client The client - * @param sockname The socket name - * @param size The size of the socket name? :D - * @retval HOOK_CONTINUE Proceed normally - * @retval HOOK_DENY Reject the connection(?) - */ -int hooktype_check_init(Client *client, char *sockname, size_t size); - /** May the target user be deoped? (function prototype for HOOKTYPE_MODE_DEOP). * This is for example used by the +S (Services bot) user mode to block deop requests to services bots. * @param client The client issuing the command @@ -1921,13 +1921,14 @@ int hooktype_check_init(Client *client, char *sockname, size_t size); * @param channel The channel * @param what Always MODE_DEL at the moment * @param modechar The mode character: q/a/o/h/v - * @param my_access Cached result of get_access(), so one of CHFL_*, for example CHFL_CHANOP. - * @param badmode The error string that should be sent to the client + * @param client_access Channel member modes of 'client', eg "o", never NULL but can be empty. + * @param target_access Channel member modes of 'client', eg "h", never NULL but can be empty. + * @param reject_reason The error string that should be sent to the client * @retval HOOK_CONTINUE Proceed normally (allow it) * @retval HOOK_DENY Reject the mode change * @retval HOOK_ALWAYS_DENY Reject the mode change, even if IRCOp/Services/.. */ -int hooktype_mode_deop(Client *client, Client *victim, Channel *channel, u_int what, int modechar, long my_access, char **badmode); +int hooktype_mode_deop(Client *client, Client *victim, Channel *channel, u_int what, int modechar, const char *client_access, const char *target_access, const char **reject_reason); /** Called when a DCC request was denied by the IRCd (function prototype for HOOKTYPE_DCC_DENIED). * @param client The client who tried to send a file @@ -1937,7 +1938,7 @@ int hooktype_mode_deop(Client *client, Client *victim, Channel *channel, u_int w * @param denydcc The deny dcc { ] rule that triggered. * @return The return value is ignored (use return 0) */ -int hooktype_dcc_denied(Client *client, char *target, char *realfile, char *displayfile, ConfigItem_deny_dcc *denydcc); +int hooktype_dcc_denied(Client *client, const char *target, const char *realfile, const char *displayfile, ConfigItem_deny_dcc *denydcc); /** Called in the user accept procedure, when setting the +z user mode (function prototype for HOOKTYPE_SECURE_CONNECT). * This is only meant to be used by the WEBIRC module, so it can do -z for fake secure users. @@ -1956,13 +1957,6 @@ int hooktype_secure_connect(Client *client); */ int hooktype_can_bypass_channel_message_restriction(Client *client, Channel *channel, BypassChannelMessageRestrictionType bypass_type); -/** Called when xxxx (function prototype for HOOKTYPE_REQUIRE_SASL). - * FIXME: this hook is never called!? - * @param client The client - * @return The return value is ignored (use return 0) - */ -int hooktype_require_sasl(Client *client, char *reason); - /** Called when a SASL continuation response is received (function prototype for HOOKTYPE_SASL_CONTINUATION). * This is only used by the authprompt module, it unlikely that you need it. * @param client The client for which the SASL authentication is taking place @@ -1970,7 +1964,7 @@ int hooktype_require_sasl(Client *client, char *reason); * @retval HOOK_CONTINUE Continue as normal * @retval HOOK_DENY Do not handle the SASL request, or at least don't show the response to the client. */ -int hooktype_sasl_continuation(Client *client, char *buf); +int hooktype_sasl_continuation(Client *client, const char *buf); /** Called when a SASL result response is received (function prototype for HOOKTYPE_SASL_RESULT). * This is only used by the authprompt module. @@ -1990,7 +1984,7 @@ int hooktype_sasl_result(Client *client, int success); * @param duration The duration of the ban, 0 for permanent ban * @return The magic value 99 is used to exempt the user (=do not ban!), otherwise the ban is added. */ -int hooktype_place_host_ban(Client *client, int action, char *reason, long duration); +int hooktype_place_host_ban(Client *client, int action, const char *reason, long duration); /** Called when a TKL ban is hit by this user (function prototype for HOOKTYPE_FIND_TKLINE_MATCH). * This is called when an existing TKL entry is hit by the user. @@ -2020,7 +2014,7 @@ int hooktype_welcome(Client *client, int after_numeric); * @param buf The buffer (without message tags) * @return The return value is ignored (use return 0) */ -int hooktype_pre_command(Client *from, MessageTag *mtags, char *buf); +int hooktype_pre_command(Client *from, MessageTag *mtags, const char *buf); /** Called right after finishing a client command (function prototype for HOOKTYPE_POST_COMMAND). * This is only used by labeled-reponse. If you think this hook is useful then you @@ -2030,7 +2024,7 @@ int hooktype_pre_command(Client *from, MessageTag *mtags, char *buf); * @param buf The buffer (without message tags) * @return The return value is ignored (use return 0) */ -int hooktype_post_command(Client *from, MessageTag *mtags, char *buf); +int hooktype_post_command(Client *from, MessageTag *mtags, const char *buf); /** Called when new_message() is executed (function prototype for HOOKTYPE_NEW_MESSAGE). * When a new message with message tags is prepared, code in UnrealIRCd @@ -2044,7 +2038,7 @@ int hooktype_post_command(Client *from, MessageTag *mtags, char *buf); * @param signature Special signature when used through new_message_special() * @return The return value is ignored (use return 0) */ -void hooktype_new_message(Client *sender, MessageTag *recv_mtags, MessageTag **mtag_list, char *signature); +void hooktype_new_message(Client *sender, MessageTag *recv_mtags, MessageTag **mtag_list, const char *signature); /** Is the client handshake finished? (function prototype for HOOKTYPE_IS_HANDSHAKE_FINISHED). * This is called by the is_handshake_finished() function to check if the user @@ -2067,7 +2061,7 @@ int hooktype_is_handshake_finished(Client *client); * @param comment The quit message * @return The original quit message (comment), the new quit message (pointing to your own static buffer), or NULL (no quit message) */ -char *hooktype_pre_local_quit_chan(Client *client, Channel *channel, char *comment); +const char *hooktype_pre_local_quit_chan(Client *client, Channel *channel, const char *comment); /** Called when an ident lookup should be made (function prototype for HOOKTYPE_IDENT_LOOKUP). * This is used by the ident_lookup module. @@ -2077,7 +2071,7 @@ char *hooktype_pre_local_quit_chan(Client *client, Channel *channel, char *comme int hooktype_ident_lookup(Client *client); /** Called when someone logs in/out a services account (function prototype for HOOKTYPE_ACCOUNT_LOGIN). - * The account name can be found in client->user->svid. It will be the string "0" if the user is logged out. + * The account name can be found in client->user->account. It will be the string "0" if the user is logged out. * @param client The client * @param mtags Message tags associated with the event * @return The return value is ignored (use return 0) @@ -2102,6 +2096,45 @@ int hooktype_close_connection(Client *client); */ int hooktype_connect_extinfo(Client *client, NameValuePrioList **list); +/** Called when a user wants to join a channel that require invitation. + * Use hook priorities to enforce a specific policy, especially denying the invitation. + * @param client The client + * @param channel The channel client is willing to join + * @param invited Set to 0 for user who should not be invited, set to 1 if the user is invited. + * @return The return value is ignored (use return 0) + */ +int hooktype_is_invited(Client *client, Channel *channel, int *invited); + +/** Called after a local user has changed the nick name (function prototype for HOOKTYPE_POST_LOCAL_NICKCHANGE). + * @param client The client + * @param mtags Message tags associated with the event + * @param oldnick The nick name before the nick change + * @return The return value is ignored (use return 0) + */ +int hooktype_post_local_nickchange(Client *client, MessageTag *mtags, const char *oldnick); + +/** Called after a remote user has changed the nick name (function prototype for HOOKTYPE_POST_REMOTE_NICKCHANGE). + * @param client The client + * @param mtags Message tags associated with the event + * @param oldnick The nick name before the nick change + * @return The return value is ignored (use return 0) + */ +int hooktype_post_remote_nickchange(Client *client, MessageTag *mtags, const char *oldnick); + +/** Called when user name or user host has changed. + * @param client The client whose user@host has changed + * @param olduser Old username of the client + * @param oldhost Old hostname of the client + * @return The return value is ignored (use return 0) + */ + +int hooktype_realname_changed(Client *client, const char *oldinfo); +/** Called when user realname has changed. + * @param client The client whose realname has changed + * @param oldinfo Old realname of the client + * @return The return value is ignored (use return 0) + */ +int hooktype_userhost_changed(Client *client, const char *olduser, const char *oldhost); /** @} */ #ifdef GCC_TYPECHECKING @@ -2138,6 +2171,7 @@ _UNREAL_ERROR(_hook_error_incompatible, "Incompatible hook function. Check argum ((hooktype == HOOKTYPE_REMOTE_QUIT) && !ValidateHook(hooktype_remote_quit, func)) || \ ((hooktype == HOOKTYPE_PRE_LOCAL_JOIN) && !ValidateHook(hooktype_pre_local_join, func)) || \ ((hooktype == HOOKTYPE_PRE_LOCAL_KICK) && !ValidateHook(hooktype_pre_local_kick, func)) || \ + ((hooktype == HOOKTYPE_CAN_SET_TOPIC) && !ValidateHook(hooktype_can_set_topic, func)) || \ ((hooktype == HOOKTYPE_PRE_LOCAL_TOPIC) && !ValidateHook(hooktype_pre_local_topic, func)) || \ ((hooktype == HOOKTYPE_REMOTE_NICKCHANGE) && !ValidateHook(hooktype_remote_nickchange, func)) || \ ((hooktype == HOOKTYPE_CHANNEL_CREATE) && !ValidateHook(hooktype_channel_create, func)) || \ @@ -2186,7 +2220,6 @@ _UNREAL_ERROR(_hook_error_incompatible, "Incompatible hook function. Check argum ((hooktype == HOOKTYPE_CHANNEL_SYNCED) && !ValidateHook(hooktype_channel_synced, func)) || \ ((hooktype == HOOKTYPE_CAN_SAJOIN) && !ValidateHook(hooktype_can_sajoin, func)) || \ ((hooktype == HOOKTYPE_WHOIS) && !ValidateHook(hooktype_whois, func)) || \ - ((hooktype == HOOKTYPE_CHECK_INIT) && !ValidateHook(hooktype_check_init, func)) || \ ((hooktype == HOOKTYPE_WHO_STATUS) && !ValidateHook(hooktype_who_status, func)) || \ ((hooktype == HOOKTYPE_MODE_DEOP) && !ValidateHook(hooktype_mode_deop, func)) || \ ((hooktype == HOOKTYPE_PRE_KILL) && !ValidateHook(hooktype_pre_kill, func)) || \ @@ -2196,7 +2229,6 @@ _UNREAL_ERROR(_hook_error_incompatible, "Incompatible hook function. Check argum ((hooktype == HOOKTYPE_SERVER_SYNCED) && !ValidateHook(hooktype_server_synced, func)) || \ ((hooktype == HOOKTYPE_SECURE_CONNECT) && !ValidateHook(hooktype_secure_connect, func)) || \ ((hooktype == HOOKTYPE_CAN_BYPASS_CHANNEL_MESSAGE_RESTRICTION) && !ValidateHook(hooktype_can_bypass_channel_message_restriction, func)) || \ - ((hooktype == HOOKTYPE_REQUIRE_SASL) && !ValidateHook(hooktype_require_sasl, func)) || \ ((hooktype == HOOKTYPE_SASL_CONTINUATION) && !ValidateHook(hooktype_sasl_continuation, func)) || \ ((hooktype == HOOKTYPE_SASL_RESULT) && !ValidateHook(hooktype_sasl_result, func)) || \ ((hooktype == HOOKTYPE_PLACE_HOST_BAN) && !ValidateHook(hooktype_place_host_ban, func)) || \ @@ -2211,7 +2243,12 @@ _UNREAL_ERROR(_hook_error_incompatible, "Incompatible hook function. Check argum ((hooktype == HOOKTYPE_CONFIGRUN_EX) && !ValidateHook(hooktype_configrun_ex, func)) || \ ((hooktype == HOOKTYPE_ACCOUNT_LOGIN) && !ValidateHook(hooktype_account_login, func)) || \ ((hooktype == HOOKTYPE_CLOSE_CONNECTION) && !ValidateHook(hooktype_close_connection, func)) || \ - ((hooktype == HOOKTYPE_CONNECT_EXTINFO) && !ValidateHook(hooktype_connect_extinfo, func)) ) \ + ((hooktype == HOOKTYPE_CONNECT_EXTINFO) && !ValidateHook(hooktype_connect_extinfo, func)) || \ + ((hooktype == HOOKTYPE_IS_INVITED) && !ValidateHook(hooktype_is_invited, func)) || \ + ((hooktype == HOOKTYPE_POST_LOCAL_NICKCHANGE) && !ValidateHook(hooktype_post_local_nickchange, func)) || \ + ((hooktype == HOOKTYPE_POST_REMOTE_NICKCHANGE) && !ValidateHook(hooktype_post_remote_nickchange, func)) || \ + ((hooktype == HOOKTYPE_USERHOST_CHANGED) && !ValidateHook(hooktype_userhost_changed, func)) || \ + ((hooktype == HOOKTYPE_REALNAME_CHANGED) && !ValidateHook(hooktype_realname_changed, func)) )\ _hook_error_incompatible(); #endif /* GCC_TYPECHECKING */ @@ -2222,10 +2259,11 @@ _UNREAL_ERROR(_hook_error_incompatible, "Incompatible hook function. Check argum /* Callback types */ #define CALLBACKTYPE_CLOAK 1 -#define CALLBACKTYPE_CLOAKKEYCSUM 2 +#define CALLBACKTYPE_CLOAK_KEY_CHECKSUM 2 #define CALLBACKTYPE_CLOAK_EX 3 #define CALLBACKTYPE_BLACKLIST_CHECK 4 #define CALLBACKTYPE_REPUTATION_STARTTIME 5 +#define CALLBACKTYPE_GEOIP_LOOKUP 6 /* To add a new efunction, only if you are an UnrealIRCd coder: * 1) Add a new entry here @@ -2241,6 +2279,7 @@ enum EfunctionType { EFUNC_CAN_JOIN, EFUNC_DO_MODE, EFUNC_SET_MODE, + EFUNC_SET_CHANNEL_MODE, EFUNC_CMD_UMODE, EFUNC_REGISTER_USER, EFUNC_TKL_HASH, @@ -2281,6 +2320,8 @@ enum EfunctionType { EFUNC_BROADCAST_MD_CHANNEL_CMD, EFUNC_BROADCAST_MD_MEMBER_CMD, EFUNC_BROADCAST_MD_MEMBERSHIP_CMD, + EFUNC_MODDATA_ADD_S2S_MTAGS, + EFUNC_MODDATA_EXTRACT_S2S_MTAGS, EFUNC_SEND_MODDATA_CLIENT, EFUNC_SEND_MODDATA_CHANNEL, EFUNC_SEND_MODDATA_MEMBERS, @@ -2293,10 +2334,12 @@ enum EfunctionType { EFUNC_DO_REMOTE_NICK_NAME, EFUNC_CHARSYS_GET_CURRENT_LANGUAGES, EFUNC_BROADCAST_SINFO, + EFUNC_CONNECT_SERVER, EFUNC_PARSE_MESSAGE_TAGS, EFUNC_MTAGS_TO_STRING, EFUNC_TKL_CHARTOTYPE, EFUNC_TKL_TYPE_STRING, + EFUNC_TKL_TYPE_CONFIG_STRING, EFUNC_CAN_SEND_TO_CHANNEL, EFUNC_CAN_SEND_TO_USER, EFUNC_BROADCAST_MD_GLOBALVAR, @@ -2321,6 +2364,15 @@ enum EfunctionType { EFUNC_LABELED_RESPONSE_SET_CONTEXT, EFUNC_LABELED_RESPONSE_FORCE_END, EFUNC_KICK_USER, + EFUNC_WATCH_ADD, + EFUNC_WATCH_DEL, + EFUNC_WATCH_DEL_LIST, + EFUNC_WATCH_GET, + EFUNC_WATCH_CHECK, + EFUNC_TKL_UHOST, + EFUNC_DO_UNREAL_LOG_REMOTE_DELIVER, + EFUNC_GET_CHMODES_FOR_USER, + EFUNC_WHOIS_GET_POLICY, }; /* Module flags */ @@ -2354,7 +2406,7 @@ enum EfunctionType { #define MOD_LOAD() DLLFUNC int Mod_Load(ModuleInfo *modinfo) #define MOD_UNLOAD() DLLFUNC int Mod_Unload(ModuleInfo *modinfo) -#define CLOAK_KEYCRC RCallbacks[CALLBACKTYPE_CLOAKKEYCSUM] != NULL ? RCallbacks[CALLBACKTYPE_CLOAKKEYCSUM]->func.pcharfunc() : "nil" +#define CLOAK_KEY_CHECKSUM RCallbacks[CALLBACKTYPE_CLOAK_KEY_CHECKSUM] != NULL ? RCallbacks[CALLBACKTYPE_CLOAK_KEY_CHECKSUM]->func.stringfunc() : "nil" #ifdef DYNAMIC_LINKING #include "modversion.h" diff --git a/include/msg.h b/include/msg.h index 0b97314..dcae509 100644 --- a/include/msg.h +++ b/include/msg.h @@ -51,7 +51,6 @@ #define MSG_PONG "PONG" /* PONG */ #define MSG_OPER "OPER" /* OPER */ #define MSG_PASS "PASS" /* PASS */ -#define MSG_WALLOPS "WALLOPS" /* WALL */ #define MSG_TIME "TIME" /* TIME */ #define MSG_NAMES "NAMES" /* NAME */ #define MSG_ADMIN "ADMIN" /* ADMI */ diff --git a/include/numeric.h b/include/numeric.h index fce4268..a380889 100644 --- a/include/numeric.h +++ b/include/numeric.h @@ -36,7 +36,6 @@ #define RPL_ISUPPORT 005 #define RPL_REDIR 10 -#define RPL_YOURID 42 #define RPL_REMOTEISUPPORT 105 @@ -51,29 +50,23 @@ #define ERR_TOOMANYCHANNELS 405 #define ERR_WASNOSUCHNICK 406 #define ERR_TOOMANYTARGETS 407 -#define ERR_NOSUCHSERVICE 408 #define ERR_NOORIGIN 409 #define ERR_INVALIDCAPCMD 410 #define ERR_NORECIPIENT 411 #define ERR_NOTEXTTOSEND 412 -#define ERR_NOTOPLEVEL 413 -#define ERR_WILDTOPLEVEL 414 #define ERR_TOOMANYMATCHES 416 #define ERR_UNKNOWNCOMMAND 421 #define ERR_NOMOTD 422 #define ERR_NOADMININFO 423 -#define ERR_FILEERROR 424 #define ERR_NOOPERMOTD 425 #define ERR_TOOMANYAWAY 429 #define ERR_NONICKNAMEGIVEN 431 #define ERR_ERRONEUSNICKNAME 432 #define ERR_NICKNAMEINUSE 433 #define ERR_NORULES 434 -#define ERR_SERVICECONFUSED 435 -#define ERR_NICKCOLLISION 436 #define ERR_BANNICKCHANGE 437 #define ERR_NCHANGETOOFAST 438 #define ERR_TARGETTOOFAST 439 @@ -82,53 +75,36 @@ #define ERR_USERNOTINCHANNEL 441 #define ERR_NOTONCHANNEL 442 #define ERR_USERONCHANNEL 443 -#define ERR_NOLOGIN 444 -#define ERR_SUMMONDISABLED 445 -#define ERR_USERSDISABLED 446 #define ERR_NONICKCHANGE 447 #define ERR_FORBIDDENCHANNEL 448 #define ERR_NOTREGISTERED 451 -#define ERR_HOSTILENAME 455 - -#define ERR_NOHIDING 459 #define ERR_NOTFORHALFOPS 460 #define ERR_NEEDMOREPARAMS 461 #define ERR_ALREADYREGISTRED 462 -#define ERR_NOPERMFORHOST 463 #define ERR_PASSWDMISMATCH 464 #define ERR_YOUREBANNEDCREEP 465 -#define ERR_YOUWILLBEBANNED 466 -#define ERR_KEYSET 467 #define ERR_ONLYSERVERSCANCHANGE 468 -#define ERR_LINKSET 469 #define ERR_LINKCHANNEL 470 #define ERR_CHANNELISFULL 471 #define ERR_UNKNOWNMODE 472 #define ERR_INVITEONLYCHAN 473 #define ERR_BANNEDFROMCHAN 474 #define ERR_BADCHANNELKEY 475 -#define ERR_BADCHANMASK 476 #define ERR_NEEDREGGEDNICK 477 #define ERR_BANLISTFULL 478 -#define ERR_LINKFAIL 479 #define ERR_CANNOTKNOCK 480 #define ERR_NOPRIVILEGES 481 #define ERR_CHANOPRIVSNEEDED 482 -#define ERR_CANTKILLSERVER 483 -#define ERR_ATTACKDENY 484 #define ERR_KILLDENY 485 -#define ERR_NONONREG 486 #define ERR_NOTFORUSERS 487 #define ERR_SECUREONLYCHAN 489 -#define ERR_NOSWEAR 490 #define ERR_NOOPERHOST 491 -#define ERR_NOCTCP 492 #define ERR_CHANOWNPRIVNEEDED 499 @@ -138,13 +114,11 @@ #define ERR_SILELISTFULL 511 #define ERR_TOOMANYWATCH 512 -#define ERR_NEEDPONG 513 #define ERR_TOOMANYDCC 514 #define ERR_DISABLED 517 #define ERR_NOINVITE 518 -#define ERR_ADMONLY 519 #define ERR_OPERONLY 520 #define ERR_LISTSYNTAX 521 @@ -163,7 +137,6 @@ #define RPL_WHOISREGNICK 307 #define RPL_RULESSTART 308 #define RPL_ENDOFRULES 309 -#define RPL_WHOISHELPOP 310 /* -Donwulff */ #define RPL_WHOISUSER 311 #define RPL_WHOISSERVER 312 @@ -173,7 +146,6 @@ /* rpl_endofwho below (315) */ #define RPL_ENDOFWHOWAS 369 -#define RPL_WHOISCHANOP 316 /* redundant and not needed but reserved */ #define RPL_WHOISIDLE 317 #define RPL_ENDOFWHOIS 318 @@ -198,7 +170,7 @@ #define RPL_WHOISBOT 335 #define RPL_USERIP 340 #define RPL_INVITING 341 -#define RPL_SUMMONING 342 +#define RPL_WHOISCOUNTRY 344 #define RPL_VERSION 351 @@ -211,7 +183,6 @@ #define RPL_EXLIST 348 #define RPL_ENDOFEXLIST 349 -#define RPL_KILLDONE 361 #define RPL_CLOSING 362 #define RPL_CLOSEEND 363 #define RPL_LINKS 364 @@ -223,7 +194,6 @@ #define RPL_INFO 371 #define RPL_MOTD 372 -#define RPL_INFOSTART 373 #define RPL_ENDOFINFO 374 #define RPL_MOTDSTART 375 #define RPL_ENDOFMOTD 376 @@ -232,9 +202,6 @@ #define RPL_WHOISMODES 379 #define RPL_YOUREOPER 381 #define RPL_REHASHING 382 -#define RPL_YOURESERVICE 383 -#define RPL_MYPORTIS 384 -#define RPL_NOTOPERANYMORE 385 #define RPL_QLIST 386 #define RPL_ENDOFQLIST 387 #define RPL_ALIST 388 @@ -255,7 +222,6 @@ #define RPL_TRACEOPERATOR 204 #define RPL_TRACEUSER 205 #define RPL_TRACESERVER 206 -#define RPL_TRACESERVICE 207 #define RPL_TRACENEWTYPE 208 #define RPL_TRACECLASS 209 @@ -263,37 +229,28 @@ #define RPL_STATSLINKINFO 211 #define RPL_STATSCOMMANDS 212 #define RPL_STATSCLINE 213 -#define RPL_STATSOLDNLINE 214 #define RPL_STATSILINE 215 -#define RPL_STATSKLINE 216 #define RPL_STATSQLINE 217 #define RPL_STATSYLINE 218 #define RPL_ENDOFSTATS 219 -#define RPL_STATSBLINE 220 #define RPL_UMODEIS 221 -#define RPL_SQLINE_NICK 222 #define RPL_STATSGLINE 223 #define RPL_STATSTLINE 224 -#define RPL_STATSELINE 225 #define RPL_STATSNLINE 226 #define RPL_STATSVLINE 227 #define RPL_STATSBANVER 228 #define RPL_STATSSPAMF 229 #define RPL_STATSEXCEPTTKL 230 -#define RPL_SERVICEINFO 231 #define RPL_RULES 232 #define RPL_SERVICE 233 -#define RPL_SERVLIST 234 -#define RPL_SERVLISTEND 235 #define RPL_STATSLLINE 241 #define RPL_STATSUPTIME 242 #define RPL_STATSOLINE 243 #define RPL_STATSHLINE 244 -#define RPL_STATSSLINE 245 #define RPL_STATSXLINE 247 #define RPL_STATSULINE 248 #define RPL_STATSDEBUG 249 @@ -319,14 +276,6 @@ #define RPL_STATSDLINE 275 #define RPL_WHOISCERTFP 276 -#define RPL_HELPHDR 290 -#define RPL_HELPOP 291 -#define RPL_HELPTLR 292 -#define RPL_HELPHLP 293 -#define RPL_HELPFWD 294 -#define RPL_HELPIGN 295 - - /* * New /MAP format. */ @@ -335,7 +284,6 @@ #define RPL_MAPEND 007 -#define ERR_WHOSYNTAX 522 #define ERR_WHOLIMEXCEED 523 #define ERR_OPERSPVERIFY 524 @@ -357,7 +305,6 @@ #define RPL_NOWOFF 605 #define RPL_WATCHLIST 606 #define RPL_ENDOFWATCHLIST 607 -#define RPL_CLEARWATCH 608 #define RPL_NOWISAWAY 609 #define RPL_DCCSTATUS 617 @@ -365,16 +312,18 @@ #define RPL_ENDOFDCCLIST 619 #define RPL_DCCINFO 620 -#define RPL_DUMPING 640 -#define RPL_DUMPRPL 641 -#define RPL_EODUMP 642 - #define RPL_SPAMCMDFWD 659 #define RPL_STARTTLS 670 #define RPL_WHOISSECURE 671 +#define RPL_MONONLINE 730 +#define RPL_MONOFFLINE 731 +#define RPL_MONLIST 732 +#define RPL_ENDOFMONLIST 733 +#define ERR_MONLISTFULL 734 + #define ERR_MLOCKRESTRICTED 742 #define ERR_CANNOTDOCOMMAND 972 @@ -382,15 +331,242 @@ #define ERR_STARTTLS 691 +#define ERR_INVALIDMODEPARAM 696 + #define RPL_LOGGEDIN 900 #define RPL_LOGGEDOUT 901 -#define ERR_NICKLOCKED 902 #define RPL_SASLSUCCESS 903 #define ERR_SASLFAIL 904 #define ERR_SASLTOOLONG 905 #define ERR_SASLABORTED 906 -#define ERR_SASLALREADY 907 #define RPL_SASLMECHS 908 -#define ERR_NUMERICERR 999 +/* Numeric texts */ + +#define STR_RPL_WELCOME /* 001 */ ":Welcome to the %s IRC Network %s!%s@%s" +#define STR_RPL_YOURHOST /* 002 */ ":Your host is %s, running version %s" +#define STR_RPL_CREATED /* 003 */ ":This server was created %s" +#define STR_RPL_MYINFO /* 004 */ "%s %s %s %s" +#define STR_RPL_ISUPPORT /* 005 */ "%s :are supported by this server" +#define STR_RPL_MAP /* 006 */ ":%s%-*s(%ld) %s" +#define STR_RPL_MAPEND /* 007 */ ":End of /MAP" +#define STR_RPL_SNOMASK /* 008 */ "+%s :Server notice mask" +#define STR_RPL_REDIR /* 010 */ "%s %d :Please use this Server/Port instead" +#define STR_RPL_REMOTEISUPPORT /* 105 */ "%s :are supported by this server" +#define STR_RPL_TRACELINK /* 200 */ "Link %s%s %s %s" +#define STR_RPL_TRACECONNECTING /* 201 */ "Attempt %s %s" +#define STR_RPL_TRACEHANDSHAKE /* 202 */ "Handshaking %s %s" +#define STR_RPL_TRACEUNKNOWN /* 203 */ "???? %s %s" +#define STR_RPL_TRACEOPERATOR /* 204 */ "Operator %s %s [%s] %lld" +#define STR_RPL_TRACEUSER /* 205 */ "User %s %s [%s] %lld" +#define STR_RPL_TRACESERVER /* 206 */ "Server %s %dS %dC %s %s!%s@%s %lld" +#define STR_RPL_TRACENEWTYPE /* 208 */ "%s 0 %s" +#define STR_RPL_TRACECLASS /* 209 */ "Class %s %d" +#define STR_RPL_STATSHELP /* 210 */ ":%s" +#define STR_RPL_STATSCOMMANDS /* 212 */ "%s %u %lu" +#define STR_RPL_STATSCLINE /* 213 */ "%c %s * %s %d %d %s" +#define STR_RPL_STATSILINE /* 215 */ "I %s %s %d %d %s %s %d" +#define STR_RPL_STATSQLINE /* 217 */ "%c %s %lld %lld %s :%s" +#define STR_RPL_STATSYLINE /* 218 */ "Y %s %d %d %d %d %d" +#define STR_RPL_ENDOFSTATS /* 219 */ "%c :End of /STATS report" +#define STR_RPL_UMODEIS /* 221 */ "%s" +#define STR_RPL_STATSGLINE /* 223 */ "%c %s %lld %lld %s :%s" +#define STR_RPL_STATSTLINE /* 224 */ "T %s %s %s" +#define STR_RPL_STATSNLINE /* 226 */ "n %s %s" +#define STR_RPL_STATSVLINE /* 227 */ "v %s %s %s" +#define STR_RPL_STATSBANVER /* 228 */ "%s %s" +#define STR_RPL_STATSSPAMF /* 229 */ "%c %s %s %s %lld %lld %lld %s %s :%s" +#define STR_RPL_STATSEXCEPTTKL /* 230 */ "%s %s %lld %lld %s :%s" +#define STR_RPL_RULES /* 232 */ ":- %s" +#define STR_RPL_STATSLLINE /* 241 */ "%c %s * %s %d %d" +#define STR_RPL_STATSUPTIME /* 242 */ ":Server Up %lld days, %lld:%02lld:%02lld" +#define STR_RPL_STATSOLINE /* 243 */ "%c %s * %s %s %s" +#define STR_RPL_STATSHLINE /* 244 */ "%c %s * %s %d %d" +#define STR_RPL_STATSXLINE /* 247 */ "X %s %d" +#define STR_RPL_STATSULINE /* 248 */ "U %s" +#define STR_RPL_STATSDEBUG /* 249 */ ":%s" +#define STR_RPL_STATSCONN /* 250 */ ":Highest connection count: %d (%d clients)" +#define STR_RPL_LUSERCLIENT /* 251 */ ":There are %d users and %d invisible on %d servers" +#define STR_RPL_LUSEROP /* 252 */ "%d :operator(s) online" +#define STR_RPL_LUSERUNKNOWN /* 253 */ "%d :unknown connection(s)" +#define STR_RPL_LUSERCHANNELS /* 254 */ "%d :channels formed" +#define STR_RPL_LUSERME /* 255 */ ":I have %d clients and %d servers" +#define STR_RPL_ADMINME /* 256 */ ":Administrative info about %s" +#define STR_RPL_ADMINLOC1 /* 257 */ ":%s" +#define STR_RPL_ADMINLOC2 /* 258 */ ":%s" +#define STR_RPL_ADMINEMAIL /* 259 */ ":%s" +#define STR_RPL_TRACELOG /* 261 */ "File %s %d" +#define STR_RPL_TRYAGAIN /* 263 */ "%s :Flooding detected. Please wait a while and try again." +#define STR_RPL_LOCALUSERS /* 265 */ "%d %d :Current local users %d, max %d" +#define STR_RPL_GLOBALUSERS /* 266 */ "%d %d :Current global users %d, max %d" +#define STR_RPL_SILELIST /* 271 */ "%s" +#define STR_RPL_ENDOFSILELIST /* 272 */ ":End of Silence List" +#define STR_RPL_STATSDLINE /* 275 */ "%c %s %s" +#define STR_RPL_WHOISCERTFP /* 276 */ "%s :has client certificate fingerprint %s" +#define STR_RPL_AWAY /* 301 */ "%s :%s" +#define STR_RPL_USERHOST /* 302 */ ":%s %s %s %s %s" +#define STR_RPL_ISON /* 303 */ ":" +#define STR_RPL_UNAWAY /* 305 */ ":You are no longer marked as being away" +#define STR_RPL_NOWAWAY /* 306 */ ":You have been marked as being away" +#define STR_RPL_WHOISREGNICK /* 307 */ "%s :is identified for this nick" +#define STR_RPL_RULESSTART /* 308 */ ":- %s Server Rules - " +#define STR_RPL_ENDOFRULES /* 309 */ ":End of RULES command." +#define STR_RPL_WHOISUSER /* 311 */ "%s %s %s * :%s" +#define STR_RPL_WHOISSERVER /* 312 */ "%s %s :%s" +#define STR_RPL_WHOISOPERATOR /* 313 */ "%s :is %s" +#define STR_RPL_WHOWASUSER /* 314 */ "%s %s %s * :%s" +#define STR_RPL_ENDOFWHO /* 315 */ "%s :End of /WHO list." +#define STR_RPL_WHOISIDLE /* 317 */ "%s %lld %lld :seconds idle, signon time" +#define STR_RPL_ENDOFWHOIS /* 318 */ "%s :End of /WHOIS list." +#define STR_RPL_WHOISCHANNELS /* 319 */ "%s :%s" +#define STR_RPL_WHOISSPECIAL /* 320 */ "%s :%s" +#define STR_RPL_LISTSTART /* 321 */ "Channel :Users Name" +#define STR_RPL_LIST /* 322 */ "%s %d :%s %s" +#define STR_RPL_LISTEND /* 323 */ ":End of /LIST" +#define STR_RPL_CHANNELMODEIS /* 324 */ "%s %s %s" +#define STR_RPL_CREATIONTIME /* 329 */ "%s %lld" +#define STR_RPL_WHOISLOGGEDIN /* 330 */ "%s %s :is logged in as" +#define STR_RPL_NOTOPIC /* 331 */ "%s :No topic is set." +#define STR_RPL_TOPIC /* 332 */ "%s :%s" +#define STR_RPL_TOPICWHOTIME /* 333 */ "%s %s %lld" +#define STR_RPL_LISTSYNTAX /* 334 */ ":%s" +#define STR_RPL_WHOISBOT /* 335 */ "%s :is a \2Bot\2 on %s" +#define STR_RPL_INVITELIST /* 336 */ ":%s" +#define STR_RPL_ENDOFINVITELIST /* 337 */ ":End of /INVITE list." +#define STR_RPL_USERIP /* 340 */ ":%s %s %s %s %s" +#define STR_RPL_INVITING /* 341 */ "%s %s" +#define STR_RPL_WHOISCOUNTRY /* 344 */ "%s %s :is connecting from %s" +#define STR_RPL_INVEXLIST /* 346 */ "%s %s %s %lld" +#define STR_RPL_ENDOFINVEXLIST /* 347 */ "%s :End of Channel Invite List" +#define STR_RPL_EXLIST /* 348 */ "%s %s %s %lld" +#define STR_RPL_ENDOFEXLIST /* 349 */ "%s :End of Channel Exception List" +#define STR_RPL_VERSION /* 351 */ "%s.%s %s :%s%s%s [%s=%d]" +#define STR_RPL_WHOREPLY /* 352 */ "%s %s %s %s %s %s :%d %s" +#define STR_RPL_NAMREPLY /* 353 */ "%s" +#define STR_RPL_CLOSING /* 362 */ "%s :Closed. Status = %d" +#define STR_RPL_CLOSEEND /* 363 */ "%d: Connections Closed" +#define STR_RPL_LINKS /* 364 */ "%s %s :%d %s" +#define STR_RPL_ENDOFLINKS /* 365 */ "%s :End of /LINKS list." +#define STR_RPL_ENDOFNAMES /* 366 */ "%s :End of /NAMES list." +#define STR_RPL_BANLIST /* 367 */ "%s %s %s %lld" +#define STR_RPL_ENDOFBANLIST /* 368 */ "%s :End of Channel Ban List" +#define STR_RPL_ENDOFWHOWAS /* 369 */ "%s :End of WHOWAS" +#define STR_RPL_INFO /* 371 */ ":%s" +#define STR_RPL_MOTD /* 372 */ ":- %s" +#define STR_RPL_ENDOFINFO /* 374 */ ":End of /INFO list." +#define STR_RPL_MOTDSTART /* 375 */ ":- %s Message of the Day - " +#define STR_RPL_ENDOFMOTD /* 376 */ ":End of /MOTD command." +#define STR_RPL_WHOISHOST /* 378 */ "%s :is connecting from %s@%s %s" +#define STR_RPL_WHOISMODES /* 379 */ "%s :is using modes %s %s" +#define STR_RPL_YOUREOPER /* 381 */ ":You are now an IRC Operator" +#define STR_RPL_REHASHING /* 382 */ "%s :Rehashing" +#define STR_RPL_QLIST /* 386 */ "%s %s" +#define STR_RPL_ENDOFQLIST /* 387 */ "%s :End of Channel Owner List" +#define STR_RPL_ALIST /* 388 */ "%s %s" +#define STR_RPL_ENDOFALIST /* 389 */ "%s :End of Protected User List" +#define STR_RPL_TIME /* 391 */ "%s :%s" +#define STR_RPL_HOSTHIDDEN /* 396 */ "%s :is now your displayed host" +#define STR_ERR_NOSUCHNICK /* 401 */ "%s :No such nick/channel" +#define STR_ERR_NOSUCHSERVER /* 402 */ "%s :No such server" +#define STR_ERR_NOSUCHCHANNEL /* 403 */ "%s :No such channel" +#define STR_ERR_CANNOTSENDTOCHAN /* 404 */ "%s :%s (%s)" +#define STR_ERR_TOOMANYCHANNELS /* 405 */ "%s :You have joined too many channels" +#define STR_ERR_WASNOSUCHNICK /* 406 */ "%s :There was no such nickname" +#define STR_ERR_TOOMANYTARGETS /* 407 */ "%s :Too many targets. The maximum is %d for %s." +#define STR_ERR_NOORIGIN /* 409 */ ":No origin specified" +#define STR_ERR_INVALIDCAPCMD /* 410 */ "%s :Invalid CAP subcommand" +#define STR_ERR_NORECIPIENT /* 411 */ ":No recipient given (%s)" +#define STR_ERR_NOTEXTTOSEND /* 412 */ ":No text to send" +#define STR_ERR_TOOMANYMATCHES /* 416 */ "%s :%s" +#define STR_ERR_UNKNOWNCOMMAND /* 421 */ "%s :Unknown command" +#define STR_ERR_NOMOTD /* 422 */ ":MOTD File is missing" +#define STR_ERR_NOADMININFO /* 423 */ "%s :No administrative info available" +#define STR_ERR_NOOPERMOTD /* 425 */ ":OPERMOTD File is missing" +#define STR_ERR_TOOMANYAWAY /* 429 */ ":Too Many aways - Flood Protection activated" +#define STR_ERR_NONICKNAMEGIVEN /* 431 */ ":No nickname given" +#define STR_ERR_ERRONEUSNICKNAME /* 432 */ "%s :Nickname is unavailable: %s" +#define STR_ERR_NICKNAMEINUSE /* 433 */ "%s :Nickname is already in use." +#define STR_ERR_NORULES /* 434 */ ":RULES File is missing" +#define STR_ERR_BANNICKCHANGE /* 437 */ "%s :Cannot change nickname while banned on channel" +#define STR_ERR_NCHANGETOOFAST /* 438 */ "%s :Nick change too fast. Please try again later." +#define STR_ERR_TARGETTOOFAST /* 439 */ "%s :Message target change too fast. Please wait %lld seconds" +#define STR_ERR_SERVICESDOWN /* 440 */ "%s :Services are currently down. Please try again later." +#define STR_ERR_USERNOTINCHANNEL /* 441 */ "%s %s :They aren't on that channel" +#define STR_ERR_NOTONCHANNEL /* 442 */ "%s :You're not on that channel" +#define STR_ERR_USERONCHANNEL /* 443 */ "%s %s :is already on channel" +#define STR_ERR_NONICKCHANGE /* 447 */ ":Can not change nickname while on %s (+N)" +#define STR_ERR_FORBIDDENCHANNEL /* 448 */ "%s :Cannot join channel: %s" +#define STR_ERR_NOTREGISTERED /* 451 */ ":You have not registered" +#define STR_ERR_NOTFORHALFOPS /* 460 */ ":Halfops cannot set mode %c" +#define STR_ERR_NEEDMOREPARAMS /* 461 */ "%s :Not enough parameters" +#define STR_ERR_ALREADYREGISTRED /* 462 */ ":You may not reregister" +#define STR_ERR_PASSWDMISMATCH /* 464 */ ":Password Incorrect" +#define STR_ERR_YOUREBANNEDCREEP /* 465 */ ":%s" +#define STR_ERR_ONLYSERVERSCANCHANGE /* 468 */ "%s :Only servers can change that mode" +#define STR_ERR_LINKCHANNEL /* 470 */ "%s %s :[Link] %s has become full, so you are automatically being transferred to the linked channel %s" +#define STR_ERR_CHANNELISFULL /* 471 */ "%s :Cannot join channel (+l)" +#define STR_ERR_UNKNOWNMODE /* 472 */ "%c :is unknown mode char to me" +#define STR_ERR_INVITEONLYCHAN /* 473 */ "%s :Cannot join channel (+i)" +#define STR_ERR_BANNEDFROMCHAN /* 474 */ "%s :Cannot join channel (+b)" +#define STR_ERR_BADCHANNELKEY /* 475 */ "%s :Cannot join channel (+k)" +#define STR_ERR_NEEDREGGEDNICK /* 477 */ "%s :You need a registered nick to join that channel." +#define STR_ERR_BANLISTFULL /* 478 */ "%s %s :Channel ban/ignore list is full" +#define STR_ERR_CANNOTKNOCK /* 480 */ ":Cannot knock on %s (%s)" +#define STR_ERR_NOPRIVILEGES /* 481 */ ":Permission Denied- You do not have the correct IRC operator privileges" +#define STR_ERR_CHANOPRIVSNEEDED /* 482 */ "%s :You're not channel operator" +#define STR_ERR_KILLDENY /* 485 */ ":Cannot kill protected user %s." +#define STR_ERR_NOTFORUSERS /* 487 */ ":%s is a server only command" +#define STR_ERR_SECUREONLYCHAN /* 489 */ "%s :Cannot join channel (Secure connection is required)" +#define STR_ERR_NOOPERHOST /* 491 */ ":No O-lines for your host" +#define STR_ERR_CHANOWNPRIVNEEDED /* 499 */ "%s :You're not a channel owner" +#define STR_ERR_TOOMANYJOINS /* 500 */ "%s :Too many join requests. Please wait a while and try again." +#define STR_ERR_UMODEUNKNOWNFLAG /* 501 */ ":Unknown MODE flag" +#define STR_ERR_USERSDONTMATCH /* 502 */ ":Cant change mode for other users" +#define STR_ERR_SILELISTFULL /* 511 */ "%s :Your silence list is full" +#define STR_ERR_TOOMANYWATCH /* 512 */ "%s :Maximum size for WATCH-list is 128 entries" +#define STR_ERR_TOOMANYDCC /* 514 */ "%s :Your dcc allow list is full. Maximum size is %d entries" +#define STR_ERR_DISABLED /* 517 */ "%s :%s" /* ircu */ +#define STR_ERR_NOINVITE /* 518 */ ":Cannot invite (+V) at channel %s" +#define STR_ERR_OPERONLY /* 520 */ ":Cannot join channel %s (IRCops only)" +#define STR_ERR_LISTSYNTAX /* 521 */ ":Bad list syntax, type /quote list ? or /raw list ?" +#define STR_ERR_WHOLIMEXCEED /* 523 */ ":Error, /who limit of %d exceeded. Please narrow your search down and try again" +#define STR_ERR_OPERSPVERIFY /* 524 */ ":Trying to join +s or +p channel as an oper. Please invite yourself first." +#define STR_ERR_CANTSENDTOUSER /* 531 */ "%s :%s" +#define STR_RPL_REAWAY /* 597 */ "%s %s %s %lld :%s" +#define STR_RPL_GONEAWAY /* 598 */ "%s %s %s %lld :%s" +#define STR_RPL_NOTAWAY /* 599 */ "%s %s %s %lld :is no longer away" +#define STR_RPL_LOGON /* 600 */ "%s %s %s %lld :logged online" +#define STR_RPL_LOGOFF /* 601 */ "%s %s %s %lld :logged offline" +#define STR_RPL_WATCHOFF /* 602 */ "%s %s %s %lld :stopped watching" +#define STR_RPL_WATCHSTAT /* 603 */ ":You have %d and are on %d WATCH entries" +#define STR_RPL_NOWON /* 604 */ "%s %s %s %lld :is online" +#define STR_RPL_NOWOFF /* 605 */ "%s %s %s %lld :is offline" +#define STR_RPL_WATCHLIST /* 606 */ ":%s" +#define STR_RPL_ENDOFWATCHLIST /* 607 */ ":End of WATCH %c" +#define STR_RPL_NOWISAWAY /* 609 */ "%s %s %s %lld :is away" +#define STR_RPL_MAPMORE /* 610 */ ":%s%-*s --> *more*" +#define STR_RPL_DCCSTATUS /* 617 */ ":%s has been %s your DCC allow list" +#define STR_RPL_DCCLIST /* 618 */ ":%s" +#define STR_RPL_ENDOFDCCLIST /* 619 */ ":End of DCCALLOW %s" +#define STR_RPL_DCCINFO /* 620 */ ":%s" +#define STR_RPL_SPAMCMDFWD /* 659 */ "%s :Command processed, but a copy has been sent to ircops for evaluation (anti-spam) purposes. [%s]" +#define STR_RPL_STARTTLS /* 670 */ ":STARTTLS successful, go ahead with TLS handshake" /* kineircd */ +#define STR_RPL_WHOISSECURE /* 671 */ "%s :%s" /* our variation on the kineircd numeric */ +#define STR_ERR_STARTTLS /* 691 */ ":%s" +#define STR_ERR_INVALIDMODEPARAM /* 696 */ "%s %c %s :%s" +#define STR_RPL_MONONLINE /* 730 */ ":%s!%s@%s" +#define STR_RPL_MONOFFLINE /* 731 */ ":%s" +#define STR_RPL_MONLIST /* 732 */ ":%s" +#define STR_RPL_ENDOFMONLIST /* 733 */ ":End of MONITOR list" +#define STR_ERR_MONLISTFULL /* 734 */ "%d %s :Monitor list is full." +#define STR_ERR_MLOCKRESTRICTED /* 742 */ "%s %c %s :MODE cannot be set due to channel having an active MLOCK restriction policy" +#define STR_RPL_LOGGEDIN /* 900 */ "%s!%s@%s %s :You are now logged in as %s." +#define STR_RPL_LOGGEDOUT /* 901 */ "%s!%s@%s :You are now logged out." +#define STR_RPL_SASLSUCCESS /* 903 */ ":SASL authentication successful" +#define STR_ERR_SASLFAIL /* 904 */ ":SASL authentication failed" +#define STR_ERR_SASLTOOLONG /* 905 */ ":SASL message too long" +#define STR_ERR_SASLABORTED /* 906 */ ":SASL authentication aborted" +#define STR_RPL_SASLMECHS /* 908 */ "%s :are available SASL mechanisms" +#define STR_ERR_CANNOTDOCOMMAND /* 972 */ "%s :%s" +#define STR_ERR_CANNOTCHANGECHANMODE /* 974 */ "%c :%s" diff --git a/include/proto.h b/include/proto.h deleted file mode 100644 index 037d6e6..0000000 --- a/include/proto.h +++ /dev/null @@ -1,68 +0,0 @@ -/************************************************************************ - * Unreal Internet Relay Chat Daemon, include/proto.h - * (C) Dominick Meglio 2000 - * - * See file AUTHORS in IRC package for additional names of - * the programmers. - * - * This program is free 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 1, or (at your option) - * any later version. - * - * 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., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef proto_h -#define proto_h -/* lusers.c */ -extern void init_irccounts(void); - -/* match.c */ -extern char *collapse(char *pattern); - -/* scache.c */ -extern void clear_scache_hash_table(void); - -/* send.c */ -extern void sendto_one(Client *, MessageTag *mtags, FORMAT_STRING(const char *), ...) __attribute__((format(printf,3,4))); -extern void sendto_realops(FORMAT_STRING(const char *pattern), ...) __attribute__((format(printf,1,2))); - -/* ircd.c */ -extern EVENT(garbage_collect); -extern EVENT(loop_event); -extern EVENT(check_pings); -extern EVENT(handshake_timeout); -extern EVENT(check_deadsockets); -extern EVENT(try_connections); -/* support.c */ -extern char *my_itoa(int i); - -/* s_serv.c */ -extern void load_tunefile(void); -extern EVENT(save_tunefile); -extern void read_motd(const char *filename, MOTDFile *motd); - -/* s_user.c */ -extern int target_limit_exceeded(Client *client, void *target, const char *name); -extern void make_umodestr(void); -extern char *get_usermode_string(Client *acptr); - -/* s_misc.c */ -extern char *convert_time(time_t ltime); - -/* whowas.c */ -extern void initwhowas(void); - -/* uid.c */ -extern void uid_init(void); -extern const char *uid_get(void); - -#endif /* proto_h */ diff --git a/include/setup.h.in b/include/setup.h.in index a4e0830..18f6908 100644 --- a/include/setup.h.in +++ b/include/setup.h.in @@ -115,6 +115,9 @@ /* Define to 1 if you have the `strlncat' function. */ #undef HAVE_STRLNCAT +/* Define to 1 if you have the `strlncpy' function. */ +#undef HAVE_STRLNCPY + /* Define to 1 if you have the `syslog' function. */ #undef HAVE_SYSLOG @@ -130,9 +133,6 @@ /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H -/* Define if you want modes shown in /list */ -#undef LIST_SHOW_MODES - /* Define the location of the log files */ #undef LOGDIR @@ -181,9 +181,6 @@ /* Define the path of the pid file */ #undef PIDFILE -/* Define if you want +a/+q prefixes */ -#undef PREFIX_AQ - /* Define the location of private libraries */ #undef PRIVATELIBDIR diff --git a/include/struct.h b/include/struct.h index 2e1e33e..d820f2b 100644 --- a/include/struct.h +++ b/include/struct.h @@ -39,6 +39,7 @@ #include #include #include +#include #include "common.h" #include "sys.h" #include @@ -54,6 +55,14 @@ # ifdef SYSSYSLOGH # include # endif +#ifndef UNREAL_LOGGER_CODE +/* undef these as they cause confusion with our ULOG_xxx codes */ +#undef LOG_DEBUG +#undef LOG_INFO +#undef LOG_WARNING +#undef LOG_ERROR +#undef LOG_FATAL +#endif #endif #define PCRE2_CODE_UNIT_WIDTH 8 #include "pcre2.h" @@ -92,19 +101,15 @@ typedef struct ConfigFlag_allow ConfigFlag_allow; typedef struct ConfigItem_allow_channel ConfigItem_allow_channel; typedef struct ConfigItem_allow_dcc ConfigItem_allow_dcc; typedef struct ConfigItem_vhost ConfigItem_vhost; -typedef struct ConfigItem_except ConfigItem_except; typedef struct ConfigItem_link ConfigItem_link; typedef struct ConfigItem_ban ConfigItem_ban; typedef struct ConfigItem_deny_dcc ConfigItem_deny_dcc; typedef struct ConfigItem_deny_link ConfigItem_deny_link; typedef struct ConfigItem_deny_channel ConfigItem_deny_channel; typedef struct ConfigItem_deny_version ConfigItem_deny_version; -typedef struct ConfigItem_log ConfigItem_log; -typedef struct ConfigItem_unknown ConfigItem_unknown; -typedef struct ConfigItem_unknown_ext ConfigItem_unknown_ext; typedef struct ConfigItem_alias ConfigItem_alias; typedef struct ConfigItem_alias_format ConfigItem_alias_format; -typedef struct ConfigItem_include ConfigItem_include; +typedef struct ConfigResource ConfigResource; typedef struct ConfigItem_blacklist_module ConfigItem_blacklist_module; typedef struct ConfigItem_help ConfigItem_help; typedef struct ConfigItem_offchans ConfigItem_offchans; @@ -129,9 +134,6 @@ typedef struct Mode Mode; typedef struct MessageTag MessageTag; typedef struct MOTDFile MOTDFile; /* represents a whole MOTD, including remote MOTD support info */ typedef struct MOTDLine MOTDLine; /* one line of a MOTD stored as a linked list */ -#ifdef USE_LIBCURL -typedef struct MOTDDownload MOTDDownload; /* used to coordinate download of a remote MOTD */ -#endif typedef struct RealCommand RealCommand; typedef struct CommandOverride CommandOverride; @@ -163,13 +165,11 @@ typedef OperPermission (*OperClassEntryEvalCallback)(OperClassACLEntryVar* varia #include "dbuf.h" /* THIS REALLY SHOULDN'T BE HERE!!! --msa */ #endif -#define HOSTLEN 63 /* Length of hostname. Updated to */ - /* comply with RFC1123 */ - +#define HOSTLEN 63 /* Length of hostname */ #define NICKLEN 30 #define USERLEN 10 #define REALLEN 50 -#define SVIDLEN 30 +#define ACCOUNTLEN 30 #define MAXTOPICLEN 360 /* absolute maximum permitted topic length (above this = potential desync) */ #define MAXAWAYLEN 360 /* absolute maximum permitted away length (above this = potential desync) */ #define MAXKICKLEN 360 /* absolute maximum kick length (above this = only cutoff danger) */ @@ -182,8 +182,8 @@ typedef OperPermission (*OperClassEntryEvalCallback)(OperClassACLEntryVar* varia #define READBUFSIZE 8192 /* for the read buffer */ #define MAXRECIPIENTS 20 #define MAXSILELENGTH NICKLEN+USERLEN+HOSTLEN+10 -#define IDLEN 10 -#define SIDLEN 3 +#define IDLEN 12 +#define SIDLEN 3 #define SWHOISLEN 256 #define UMODETABLESZ (sizeof(long) * 8) #define MAXCCUSERS 20 /* Maximum for set::anti-flood::max-concurrent-conversations */ @@ -203,16 +203,77 @@ typedef OperPermission (*OperClassEntryEvalCallback)(OperClassACLEntryVar* varia /* Logging types */ #define LOG_ERROR 0x0001 #define LOG_KILL 0x0002 -#define LOG_TKL 0x0004 -#define LOG_KLINE 0x0008 -#define LOG_CLIENT 0x0010 -#define LOG_SERVER 0x0020 -#define LOG_OPER 0x0040 #define LOG_SACMDS 0x0080 #define LOG_CHGCMDS 0x0100 #define LOG_OVERRIDE 0x0200 -#define LOG_SPAMFILTER 0x0400 -#define LOG_FLOOD 0x0800 + +typedef enum LogFieldType { + LOG_FIELD_INTEGER, // and unsigned? + LOG_FIELD_STRING, + LOG_FIELD_CLIENT, + LOG_FIELD_CHANNEL, + LOG_FIELD_OBJECT +} LogFieldType; + +typedef struct LogData { + LogFieldType type; + char *key; + union { + int64_t integer; + char *string; + Client *client; + Channel *channel; + json_t *object; + } value; +} LogData; + +/** New log levels for unreal_log() */ +/* Note: the reason for these high numbers is so we can easily catch + * if someone makes a mistake to use LOG_INFO (from syslog.h) instead + * of the ULOG_xxx levels. + */ +typedef enum LogLevel { + ULOG_INVALID = 0, + ULOG_DEBUG = 1000, + ULOG_INFO = 2000, + ULOG_WARNING = 3000, + ULOG_ERROR = 4000, + ULOG_FATAL = 5000 +} LogLevel; + +/** Logging types (text, json, etc) */ +typedef enum LogType { + LOG_TYPE_INVALID = 0, + LOG_TYPE_TEXT = 1, + LOG_TYPE_JSON = 2, +} LogType; + +#define LOG_CATEGORY_LEN 32 +#define LOG_EVENT_ID_LEN 64 +typedef struct LogSource LogSource; +struct LogSource { + LogSource *prev, *next; + LogLevel loglevel; + char negative; /**< 1 if negative match (eg !operoverride), 0 if normal */ + char subsystem[LOG_CATEGORY_LEN+1]; + char event_id[LOG_EVENT_ID_LEN+1]; +}; + +typedef struct Log Log; +struct Log { + Log *prev, *next; + LogSource *sources; + char destination[CHANNELLEN+1]; + char *file; + char *filefmt; + long maxsize; + int type; + int logfd; +}; + +/** This is used for deciding the in logs[] and temp_logs[] */ +typedef enum LogDestination { LOG_DEST_SNOMASK=0, LOG_DEST_OPER=1, LOG_DEST_REMOTE=2, LOG_DEST_CHANNEL=3, LOG_DEST_DISK=4 } LogDestination; +#define NUM_LOG_DESTINATIONS 5 /* ** 'offsetof' is defined in ANSI-C. The following definition @@ -251,7 +312,7 @@ typedef OperPermission (*OperClassEntryEvalCallback)(OperClassACLEntryVar* varia /** This specifies the current client status or the client type - see @link ClientStatus @endlink in particular. * You may think "server" or "client" are the only choices here, but there are many more - * such as states where the user is in the middle of an SSL/TLS handshake. + * such as states where the user is in the middle of an TLS handshake. * @defgroup ClientStatuses Client statuses / types * @{ */ @@ -259,8 +320,8 @@ typedef enum ClientStatus { CLIENT_STATUS_LOG = -7, /**< Client is a log file */ CLIENT_STATUS_TLS_STARTTLS_HANDSHAKE = -8, /**< Client is doing a STARTTLS handshake */ CLIENT_STATUS_CONNECTING = -6, /**< Client is an outgoing connect */ - CLIENT_STATUS_TLS_CONNECT_HANDSHAKE = -5, /**< Client is doing an SSL/TLS handshake - outgoing connection */ - CLIENT_STATUS_TLS_ACCEPT_HANDSHAKE = -4, /**< Client is doing an SSL/TLS handshake - incoming connection */ + CLIENT_STATUS_TLS_CONNECT_HANDSHAKE = -5, /**< Client is doing an TLS handshake - outgoing connection */ + CLIENT_STATUS_TLS_ACCEPT_HANDSHAKE = -4, /**< Client is doing an TLS handshake - incoming connection */ CLIENT_STATUS_HANDSHAKE = -3, /**< Client is doing a server handshake - outgoing connection */ CLIENT_STATUS_ME = -2, /**< Client is &me (this server) */ CLIENT_STATUS_UNKNOWN = -1, /**< Client is doing a hanshake. May become a server or user later, we don't know yet */ @@ -325,16 +386,17 @@ typedef enum ClientStatus { #define CLIENT_FLAG_DCCNOTICE 0x00200000 /**< Has the user seen a notice on how to use DCCALLOW already? */ #define CLIENT_FLAG_SHUNNED 0x00400000 /**< Connection is shunned (user cannot execute any commands) */ #define CLIENT_FLAG_VIRUS 0x00800000 /**< Tagged by spamfilter as a virus */ -#define CLIENT_FLAG_TLS 0x01000000 /**< Connection is using SSL/TLS */ +#define CLIENT_FLAG_TLS 0x01000000 /**< Connection is using TLS */ #define CLIENT_FLAG_NOFAKELAG 0x02000000 /**< Exemption from fake lag */ #define CLIENT_FLAG_DCCBLOCK 0x04000000 /**< Block all DCC send requests */ #define CLIENT_FLAG_MAP 0x08000000 /**< Show this entry in /MAP (only used in map module) */ #define CLIENT_FLAG_PINGWARN 0x10000000 /**< Server ping warning (remote server slow with responding to PINGs) */ #define CLIENT_FLAG_NOHANDSHAKEDELAY 0x20000000 /**< No handshake delay */ +#define CLIENT_FLAG_SERVER_DISCONNECT_LOGGED 0x40000000 /**< Server disconnect message is (already) logged */ + /** @} */ -#define SNO_DEFOPER "+kscfvGqobS" -#define SNO_DEFUSER "+ks" +#define OPER_SNOMASKS "+bBcdfkqsSoO" #define SEND_UMODES (SendUmodes) #define ALL_UMODES (AllUmodes) @@ -346,13 +408,14 @@ typedef enum ClientStatus { * Note that client protocol extensions have been moved * to the ClientCapability API which uses acptr->local->caps. */ -#define PROTO_VL 0x000040 /* Negotiated VL protocol */ -#define PROTO_VHP 0x000100 /* Send hostnames in NICKv2 even if not sethosted */ -#define PROTO_CLK 0x001000 /* Send cloaked host in the NICK command (regardless of +x/-x) */ -#define PROTO_MLOCK 0x002000 /* server supports MLOCK */ -#define PROTO_EXTSWHOIS 0x004000 /* extended SWHOIS support */ -#define PROTO_SJSBY 0x008000 /* SJOIN setby information (TS and nick) */ -#define PROTO_MTAGS 0x010000 /* Support message tags and big buffers */ +#define PROTO_VL 0x000001 /* Negotiated VL protocol */ +#define PROTO_VHP 0x000002 /* Send hostnames in NICKv2 even if not sethosted */ +#define PROTO_CLK 0x000004 /* Send cloaked host in the NICK command (regardless of +x/-x) */ +#define PROTO_MLOCK 0x000008 /* server supports MLOCK */ +#define PROTO_EXTSWHOIS 0x000010 /* extended SWHOIS support */ +#define PROTO_SJSBY 0x000020 /* SJOIN setby information (TS and nick) */ +#define PROTO_MTAGS 0x000040 /* Support message tags and big buffers */ +#define PROTO_NEXTBANS 0x000080 /* Server supports named extended bans */ /* For client capabilities: */ #define CAP_INVERT 1L @@ -368,41 +431,21 @@ typedef enum ClientStatus { #define IsDeaf(x) ((x)->umodes & UMODE_DEAF) #define IsOper(x) ((x)->umodes & UMODE_OPER) #define IsInvisible(x) ((x)->umodes & UMODE_INVISIBLE) -#define IsARegNick(x) ((x)->umodes & (UMODE_REGNICK)) #define IsRegNick(x) ((x)->umodes & UMODE_REGNICK) -#define SendWallops(x) (!IsMe(x) && IsUser(x) && ((x)->umodes & UMODE_WALLOP)) #define IsHidden(x) ((x)->umodes & UMODE_HIDE) #define IsSetHost(x) ((x)->umodes & UMODE_SETHOST) #define IsHideOper(x) ((x)->umodes & UMODE_HIDEOPER) #define SetOper(x) ((x)->umodes |= UMODE_OPER) #define SetInvisible(x) ((x)->umodes |= UMODE_INVISIBLE) -#define SetWallops(x) ((x)->umodes |= UMODE_WALLOP) #define SetRegNick(x) ((x)->umodes & UMODE_REGNICK) #define SetHidden(x) ((x)->umodes |= UMODE_HIDE) #define SetHideOper(x) ((x)->umodes |= UMODE_HIDEOPER) #define IsSecureConnect(x) ((x)->umodes & UMODE_SECURE) #define ClearOper(x) ((x)->umodes &= ~UMODE_OPER) #define ClearInvisible(x) ((x)->umodes &= ~UMODE_INVISIBLE) -#define ClearWallops(x) ((x)->umodes &= ~UMODE_WALLOP) #define ClearHidden(x) ((x)->umodes &= ~UMODE_HIDE) #define ClearHideOper(x) ((x)->umodes &= ~UMODE_HIDEOPER) -/* Snomask macros: */ -#define SendServNotice(x) (((x)->user) && ((x)->user->snomask & SNO_SNOTICE)) -#define IsKillsF(x) ((x)->user->snomask & SNO_KILLS) -#define IsClientF(x) ((x)->user->snomask & SNO_CLIENT) -#define IsFloodF(x) ((x)->user->snomask & SNO_FLOOD) -#define IsEyes(x) ((x)->user->snomask & SNO_EYES) -#define SetKillsF(x) ((x)->user->snomask |= SNO_KILLS) -#define SetClientF(x) ((x)->user->snomask |= SNO_CLIENT) -#define SetFloodF(x) ((x)->user->snomask |= SNO_FLOOD) -#define SetEyes(x) ((x)->user->snomask |= SNO_EYES) -#define ClearKillsF(x) ((x)->user->snomask &= ~SNO_KILLS) -#define ClearClientF(x) ((x)->user->snomask &= ~SNO_CLIENT) -#define ClearFloodF(x) ((x)->user->snomask &= ~SNO_FLOOD) -#define ClearEyes(x) ((x)->user->snomask &= ~SNO_EYES) - - /* Client flags macros: to check for via IsXX(), * to set via SetXX() and to clear the flag via ClearXX() */ @@ -416,6 +459,7 @@ typedef enum ClientStatus { #define IsDCCNotice(x) ((x)->flags & CLIENT_FLAG_DCCNOTICE) #define IsDead(x) ((x)->flags & CLIENT_FLAG_DEAD) #define IsDeadSocket(x) ((x)->flags & CLIENT_FLAG_DEADSOCKET) +#define IsServerDisconnectLogged(x) ((x)->flags & CLIENT_FLAG_SERVER_DISCONNECT_LOGGED) #define IsUseIdent(x) ((x)->flags & CLIENT_FLAG_USEIDENT) #define IsDNSLookup(x) ((x)->flags & CLIENT_FLAG_DNSLOOKUP) #define IsEAuth(x) ((x)->flags & CLIENT_FLAG_EAUTH) @@ -447,6 +491,7 @@ typedef enum ClientStatus { #define SetDCCNotice(x) do { (x)->flags |= CLIENT_FLAG_DCCNOTICE; } while(0) #define SetDead(x) do { (x)->flags |= CLIENT_FLAG_DEAD; } while(0) #define SetDeadSocket(x) do { (x)->flags |= CLIENT_FLAG_DEADSOCKET; } while(0) +#define SetServerDisconnectLogged(x) do { (x)->flags |= CLIENT_FLAG_SERVER_DISCONNECT_LOGGED; } while(0) #define SetUseIdent(x) do { (x)->flags |= CLIENT_FLAG_USEIDENT; } while(0) #define SetDNSLookup(x) do { (x)->flags |= CLIENT_FLAG_DNSLOOKUP; } while(0) #define SetEAuth(x) do { (x)->flags |= CLIENT_FLAG_EAUTH; } while(0) @@ -508,9 +553,9 @@ typedef enum ClientStatus { #define IsNotSpoof(x) ((x)->local->nospoof == 0) #define GetHost(x) (IsHidden(x) ? (x)->user->virthost : (x)->user->realhost) #define GetIP(x) (x->ip ? x->ip : "255.255.255.255") -#define IsLoggedIn(x) (IsRegNick(x) || (x->user && (*x->user->svid != '*') && !isdigit(*x->user->svid))) /* registered nick (+r) or just logged into services (may be -r) */ -#define IsSynched(x) (x->serv->flags.synced) -#define IsServerSent(x) (x->serv && x->serv->flags.server_sent) +#define IsLoggedIn(x) (x->user && (*x->user->account != '*') && !isdigit(*x->user->account)) /**< Logged into services */ +#define IsSynched(x) (x->server->flags.synced) +#define IsServerSent(x) (x->server && x->server->flags.server_sent) /* And more that access client stuff - but actually modularized */ #define GetReputation(client) (moddata_client_get(client, "reputation") ? atoi(moddata_client_get(client, "reputation")) : 0) /**< Get reputation value for a client */ @@ -527,33 +572,14 @@ typedef enum ClientStatus { #define SupportVHP(x) (CHECKSERVERPROTO(x, PROTO_VHP)) #define SupportCLK(x) (CHECKSERVERPROTO(x, PROTO_CLK)) #define SupportMTAGS(x) (CHECKSERVERPROTO(x, PROTO_MTAGS)) +#define SupportNEXTBANS(x) (CHECKSERVERPROTO(x, PROTO_NEXTBANS)) #define SetVL(x) ((x)->local->proto |= PROTO_VL) #define SetSJSBY(x) ((x)->local->proto |= PROTO_SJSBY) #define SetVHP(x) ((x)->local->proto |= PROTO_VHP) #define SetCLK(x) ((x)->local->proto |= PROTO_CLK) #define SetMTAGS(x) ((x)->local->proto |= PROTO_MTAGS) - -/* - * defined debugging levels - */ -#define DEBUG_FATAL 0 -#define DEBUG_ERROR 1 /* report_error() and other errors that are found */ -#define DEBUG_NOTICE 3 -#define DEBUG_DNS 4 /* used by all DNS related routines - a *lot* */ -#define DEBUG_INFO 5 /* general usful info */ -#define DEBUG_NUM 6 /* numerics */ -#define DEBUG_SEND 7 /* everything that is sent out */ -#define DEBUG_DEBUG 8 /* anything to do with debugging, ie unimportant :) */ -#define DEBUG_MALLOC 9 /* malloc/free calls */ -#define DEBUG_LIST 10 /* debug list use */ - -/* - * defines for curses in client - */ -#define DUMMY_TERM 0 -#define CURSES_TERM 1 -#define TERMCAP_TERM 2 +#define SetNEXTBANS(x) ((x)->local->proto |= PROTO_NEXTBANS) /* Dcc deny types (see src/s_extra.c) */ #define DCCDENY_HARD 0 @@ -576,12 +602,20 @@ union ModData #ifndef _WIN32 #define CHECK_LIST_ENTRY(list) if (offsetof(typeof(*list),prev) != offsetof(ListStruct,prev)) \ { \ - ircd_log(LOG_ERROR, "[BUG] %s:%d: List operation on struct with incorrect order (->prev must be 1st struct member)", __FILE__, __LINE__); \ + unreal_log(ULOG_FATAL, "main", "BUG_LIST_OPERATION", NULL, \ + "[BUG] $file:$line: List operation on struct with incorrect order ($error_details)", \ + log_data_string("error_details", "->prev must be 1st struct member"), \ + log_data_string("file", __FILE__), \ + log_data_integer("line", __LINE__)); \ abort(); \ } \ if (offsetof(typeof(*list),next) != offsetof(ListStruct,next)) \ { \ - ircd_log(LOG_ERROR, "[BUG] %s:%d: List operation on struct with incorrect order (->next must be 2nd struct member))", __FILE__, __LINE__); \ + unreal_log(ULOG_FATAL, "main", "BUG_LIST_OPERATION", NULL, \ + "[BUG] $file:$line: List operation on struct with incorrect order ($error_details)", \ + log_data_string("error_details", "->next must be 2nd struct member"), \ + log_data_string("file", __FILE__), \ + log_data_integer("line", __LINE__)); \ abort(); \ } #else @@ -591,17 +625,29 @@ union ModData #ifndef _WIN32 #define CHECK_PRIO_LIST_ENTRY(list) if (offsetof(typeof(*list),prev) != offsetof(ListStructPrio,prev)) \ { \ - ircd_log(LOG_ERROR, "[BUG] %s:%d: List operation on struct with incorrect order (->prev must be 1st struct member)", __FILE__, __LINE__); \ + unreal_log(ULOG_FATAL, "main", "BUG_LIST_OPERATION", NULL, \ + "[BUG] $file:$line: List operation on struct with incorrect order ($error_details)", \ + log_data_string("error_details", "->prev must be 1st struct member"), \ + log_data_string("file", __FILE__), \ + log_data_integer("line", __LINE__)); \ abort(); \ } \ if (offsetof(typeof(*list),next) != offsetof(ListStructPrio,next)) \ { \ - ircd_log(LOG_ERROR, "[BUG] %s:%d: List operation on struct with incorrect order (->next must be 2nd struct member))", __FILE__, __LINE__); \ + unreal_log(ULOG_FATAL, "main", "BUG_LIST_OPERATION", NULL, \ + "[BUG] $file:$line: List operation on struct with incorrect order ($error_details)", \ + log_data_string("error_details", "->next must be 2nd struct member"), \ + log_data_string("file", __FILE__), \ + log_data_integer("line", __LINE__)); \ abort(); \ } \ if (offsetof(typeof(*list),priority) != offsetof(ListStructPrio,priority)) \ { \ - ircd_log(LOG_ERROR, "[BUG] %s:%d: List operation on struct with incorrect order (->priority must be 3rd struct member))", __FILE__, __LINE__); \ + unreal_log(ULOG_FATAL, "main", "BUG_LIST_OPERATION", NULL, \ + "[BUG] $file:$line: List operation on struct with incorrect order ($error_details)", \ + log_data_string("error_details", "->priority must be 3rd struct member"), \ + log_data_string("file", __FILE__), \ + log_data_integer("line", __LINE__)); \ abort(); \ } #else @@ -610,7 +656,10 @@ union ModData #define CHECK_NULL_LIST_ITEM(item) if ((item)->prev || (item)->next) \ { \ - ircd_log(LOG_ERROR, "[BUG] %s:%d: List operation on item with non-NULL 'prev' or 'next' -- are you adding to a list twice?", __FILE__, __LINE__); \ + unreal_log(ULOG_FATAL, "main", "BUG_LIST_OPERATION_DOUBLE_ADD", NULL, \ + "[BUG] $file:$line: List operation on item with non-NULL 'prev' or 'next' -- are you adding to a list twice?", \ + log_data_string("file", __FILE__), \ + log_data_integer("line", __LINE__)); \ abort(); \ } @@ -711,43 +760,10 @@ struct MultiLine { char *line; }; -#ifdef USE_LIBCURL -struct MOTDDownload -{ - MOTDFile *themotd; -}; -#endif /* USE_LIBCURL */ - struct MOTDFile { struct MOTDLine *lines; struct tm last_modified; /* store the last modification time */ - -#ifdef USE_LIBCURL - /* - This pointer is used to communicate with an asynchronous MOTD - download. The problem is that a download may take 10 seconds or - more to complete and, in that time, the IRCd could be rehashed. - This would mean that TLD blocks are reallocated and thus the - aMotd structs would be free()d in the meantime. - - To prevent such a situation from leading to a segfault, we - introduce this remote control pointer. It works like this: - 1. read_motd() is called with a URL. A new MOTDDownload is - allocated and the pointer is placed here. This pointer is - also passed to the asynchrnous download handler. - 2.a. The download is completed and read_motd_async_downloaded() - is called with the same pointer. From this function, this pointer - if free()d. No other code may free() the pointer. Not even free_motd(). - OR - 2.b. The user rehashes the IRCd before the download is completed. - free_motd() is called, which sets motd_download->themotd to NULL - to signal to read_motd_async_downloaded() that it should ignore - the download. read_motd_async_downloaded() is eventually called - and frees motd_download. - */ - struct MOTDDownload *motd_download; -#endif /* USE_LIBCURL */ }; struct MOTDLine { @@ -758,16 +774,17 @@ struct MOTDLine { struct LoopStruct { unsigned do_garbage_collect : 1; unsigned config_test : 1; - unsigned ircd_booted : 1; - unsigned ircd_forked : 1; + unsigned booted : 1; + unsigned forked : 1; unsigned do_bancheck : 1; /* perform *line bancheck? */ unsigned do_bancheck_spamf_user : 1; /* perform 'user' spamfilter bancheck */ unsigned do_bancheck_spamf_away : 1; /* perform 'away' spamfilter bancheck */ - unsigned ircd_rehashing : 1; - unsigned ircd_terminating : 1; + unsigned rehashing : 1; + unsigned terminating : 1; + unsigned config_load_failed : 1; + unsigned rehash_download_busy : 1; /* don't return "all downloads complete", needed for race condition */ unsigned tainted : 1; - Client *rehash_save_cptr, *rehash_save_client; - int rehash_save_sig; + Client *rehash_save_client; void (*boot_function)(); }; @@ -801,7 +818,7 @@ typedef struct Whowas { struct Whowas *prev; /* for hash table... */ struct Whowas *cnext; /* for client struct linked list */ struct Whowas *cprev; /* for client struct linked list */ -} aWhowas; +} WhoWas; typedef struct SWhois SWhois; struct SWhois { @@ -848,7 +865,7 @@ struct SWhois { * Note that reading parv[parc] and beyond is OUT OF BOUNDS and will cause a crash. * E.g. parv[3] in the above example is out of bounds. */ -#define CMD_FUNC(x) void (x) (Client *client, MessageTag *recv_mtags, int parc, char *parv[]) +#define CMD_FUNC(x) void (x) (Client *client, MessageTag *recv_mtags, int parc, const char *parv[]) /** @} */ /** Command override function - used by all command override handlers. @@ -865,13 +882,13 @@ struct SWhois { * Note that reading parv[parc] and beyond is OUT OF BOUNDS and will cause a crash. * E.g. parv[3] in the above example. */ -#define CMD_OVERRIDE_FUNC(x) void (x)(CommandOverride *ovr, Client *client, MessageTag *recv_mtags, int parc, char *parv[]) +#define CMD_OVERRIDE_FUNC(x) void (x)(CommandOverride *ovr, Client *client, MessageTag *recv_mtags, int parc, const char *parv[]) -typedef void (*CmdFunc)(Client *client, MessageTag *mtags, int parc, char *parv[]); -typedef void (*AliasCmdFunc)(Client *client, MessageTag *mtags, int parc, char *parv[], char *cmd); -typedef void (*OverrideCmdFunc)(CommandOverride *ovr, Client *client, MessageTag *mtags, int parc, char *parv[]); +typedef void (*CmdFunc)(Client *client, MessageTag *mtags, int parc, const char *parv[]); +typedef void (*AliasCmdFunc)(Client *client, MessageTag *mtags, int parc, const char *parv[], const char *cmd); +typedef void (*OverrideCmdFunc)(CommandOverride *ovr, Client *client, MessageTag *mtags, int parc, const char *parv[]); #include @@ -1106,21 +1123,30 @@ struct SpamExcept { /** IRC Counts, used for /LUSERS */ typedef struct IRCCounts IRCCounts; struct IRCCounts { - int clients; /* total */ - int invisible; /* invisible */ - unsigned short servers; /* servers */ - int operators; /* operators */ - int unknown; /* unknown local connections */ - int channels; /* channels */ - int me_clients; /* my clients */ - unsigned short me_servers; /* my servers */ - int me_max; /* local max */ - int global_max; /* global max */ + int clients; /* total */ + int invisible; /* invisible */ + int servers; /* servers */ + int operators; /* operators */ + int unknown; /* unknown local connections */ + int channels; /* channels */ + int me_clients; /* my clients */ + int me_servers; /* my servers */ + int me_max; /* local max */ + int global_max; /* global max */ }; /** The /LUSERS stats information */ extern MODVAR IRCCounts irccounts; +typedef struct NameValue NameValue; +/** Name and value list used in a static array, such as in conf.c */ +struct NameValue +{ + long value; + char *name; +}; + +/** Name and value list used in dynamic linked lists */ typedef struct NameValueList NameValueList; struct NameValueList { NameValueList *prev, *next; @@ -1166,21 +1192,12 @@ struct CommandOverride { OverrideCmdFunc func; }; -extern MODVAR Umode *Usermode_Table; -extern MODVAR short Usermode_highest; - -extern MODVAR Snomask *Snomask_Table; -extern MODVAR short Snomask_highest; - -extern MODVAR Cmode *Channelmode_Table; -extern MODVAR unsigned short Channelmode_highest; +extern MODVAR Umode *usermodes; +extern MODVAR Cmode *channelmodes; extern Umode *UmodeAdd(Module *module, char ch, int options, int unset_on_deoper, int (*allowed)(Client *client, int what), long *mode); extern void UmodeDel(Umode *umode); -extern Snomask *SnomaskAdd(Module *module, char ch, int (*allowed)(Client *client, int what), long *mode); -extern void SnomaskDel(Snomask *sno); - extern Cmode *CmodeAdd(Module *reserved, CmodeInfo req, Cmode_t *mode); extern void CmodeDel(Cmode *cmode); @@ -1199,16 +1216,13 @@ extern void unload_all_unused_moddata(void); #define IsServersOnlyListener(x) ((x) && ((x)->options & LISTENER_SERVERSONLY)) #define CONNECT_TLS 0x000001 -//0x000002 unused (was ziplinks) -#define CONNECT_AUTO 0x000004 -#define CONNECT_QUARANTINE 0x000008 -#define CONNECT_NODNSCACHE 0x000010 -#define CONNECT_NOHOSTCHECK 0x000020 -#define CONNECT_INSECURE 0x000040 +#define CONNECT_AUTO 0x000002 +#define CONNECT_QUARANTINE 0x000004 +#define CONNECT_INSECURE 0x000008 -#define TLSFLAG_FAILIFNOCERT 0x1 -#define TLSFLAG_NOSTARTTLS 0x8 -#define TLSFLAG_DISABLECLIENTCERT 0x10 +#define TLSFLAG_FAILIFNOCERT 0x0001 +#define TLSFLAG_NOSTARTTLS 0x0002 +#define TLSFLAG_DISABLECLIENTCERT 0x0004 /** Flood counters for local clients */ typedef struct FloodCounter { @@ -1225,9 +1239,17 @@ typedef enum FloodOption { FLD_INVITE = 3, /**< invite-flood */ FLD_KNOCK = 4, /**< knock-flood */ FLD_CONVERSATIONS = 5, /**< max-concurrent-conversations */ + FLD_LAG_PENALTY = 6, /**< lag-penalty / lag-penalty-bytes */ } FloodOption; #define MAXFLOODOPTIONS 10 +typedef struct TrafficStats TrafficStats; +struct TrafficStats { + long long messages_sent; /* IRC lines sent */ + long long messages_received; /* IRC lines received */ + long long bytes_sent; /* Bytes sent */ + long long bytes_received; /* Received bytes */ +}; /** This shows the Client struct (any client), the User struct (a user), Server (a server) that are commonly accessed both in the core and by 3rd party coders. * @defgroup CommonStructs Common structs @@ -1242,7 +1264,7 @@ struct Client { struct list_head special_node; /**< For special lists (server || unknown || oper) */ LocalClient *local; /**< Additional information regarding locally connected clients */ User *user; /**< Additional information, if this client is a user */ - Server *serv; /**< Additional information, if this is a server */ + Server *server; /**< Additional information, if this is a server */ ClientStatus status; /**< Client status, one of CLIENT_STATUS_* */ struct list_head client_hash; /**< For name hash table (clientTable) */ char name[HOSTLEN + 1]; /**< Unique name of the client: nickname for users, hostname for servers */ @@ -1257,7 +1279,7 @@ struct Client { char info[REALLEN + 1]; /**< Additional client information text. For users this is gecos/realname */ char id[IDLEN + 1]; /**< Unique ID: SID or UID */ struct list_head id_hash; /**< For UID/SID hash table (idTable) */ - Client *srvptr; /**< Server on where this client is connected to (can be &me) */ + Client *uplink; /**< Server on where this client is connected to (can be &me) */ char *ip; /**< IP address of user or server (never NULL) */ ModData moddata[MODDATA_MAX_CLIENT]; /**< Client attached module data, used by the ModData system */ }; @@ -1266,10 +1288,11 @@ struct Client { */ struct LocalClient { int fd; /**< File descriptor, can be <0 if socket has been closed already. */ - SSL *ssl; /**< OpenSSL/LibreSSL struct for SSL/TLS connection */ - time_t since; /**< Time when user will next be allowed to send something (actually since0 if SASL authentication was successful */ time_t sasl_sent_time; /**< SASL: 0 or the time that the (last) AUTHENTICATE command has been sent */ - char *sni_servername; /**< Servername as sent by client via SNI (Server Name Indication) in SSL/TLS, otherwise NULL */ + char *sni_servername; /**< Servername as sent by client via SNI (Server Name Indication) in TLS, otherwise NULL */ int cap_protocol; /**< CAP protocol in use. At least 300 for any CAP capable client. 302 for 3.2, etc.. */ uint32_t nospoof; /**< Anti-spoofing random number (used in user handshake PING/PONG) */ char *passwd; /**< Password used during connect, if any (freed once connected and set to NULL) */ @@ -1315,38 +1327,27 @@ struct LocalClient { */ struct User { Membership *channel; /**< Channels that the user is in (linked list) */ - Link *invited; /**< Channels has the user been invited to (linked list) */ Link *dccallow; /**< DCCALLOW list (linked list) */ - char *away; /**< AWAY message, or NULL if not away */ - char svid[SVIDLEN + 1]; /**< Services account name or ID (SVID) */ - unsigned short joined; /**< Number of channels joined */ + char account[ACCOUNTLEN + 1]; /**< Services account name or ID (SVID) - use IsLoggedIn(client) to check if logged in */ + int joined; /**< Number of channels joined */ char username[USERLEN + 1]; /**< Username, the user portion in nick!user@host. */ char realhost[HOSTLEN + 1]; /**< Realhost, the real host of the user (IP or hostname) - usually this is not shown to other users */ char cloakedhost[HOSTLEN + 1]; /**< Cloaked host - generated by cloaking algorithm */ char *virthost; /**< Virtual host - when user has user mode +x this is the active host */ char *server; /**< Server name the user is on (?) */ SWhois *swhois; /**< Special "additional" WHOIS entries such as "a Network Administrator" */ - aWhowas *whowas; /**< Something for whowas :D :D */ - int snomask; /**< Server Notice Mask (snomask) - only for IRCOps */ - char *operlogin; /**< Which oper { } block was used to oper up, otherwise NULL - used by oper::maxlogins */ - struct { - time_t nick_t; /**< For set::anti-flood::nick-flood: time */ - time_t knock_t; /**< For set::anti-flood::knock-flood: time */ - time_t invite_t; /**< For set::anti-flood::invite-flood: time */ - unsigned char nick_c; /**< For set::anti-flood::nick-flood: counter */ - unsigned char knock_c; /**< For set::anti-flood::knock-flood: counter */ - unsigned char invite_c; /**< For set::anti-flood::invite-flood: counter */ - } flood; /**< Anti-flood counters */ - time_t lastaway; /**< Last time the user went AWAY */ + WhoWas *whowas; /**< Something for whowas :D :D */ + char *snomask; /**< Server Notice Mask (snomask) - only for IRCOps */ + char *operlogin; /**< Which oper { } block was used to oper up, otherwise NULL - used for auditting and by oper::maxlogins */ + char *away; /**< AWAY message, or NULL if not away */ + time_t away_since; /**< Last time the user went AWAY */ }; -/** Server information (local servers and remote servers), you use client->serv to access these (see also @link Client @endlink). +/** Server information (local servers and remote servers), you use client->server to access these (see also @link Client @endlink). */ struct Server { - char *up; /**< Name of uplink for this server */ char by[NICKLEN + 1]; /**< Uhhhh - who activated this connection - AGAIN? */ ConfigItem_link *conf; /**< link { } block associated with this server, or NULL */ - time_t timestamp; /**< Remotely determined connect try time */ long users; /**< Number of users on this server */ time_t boottime; /**< Startup time of server (boot time) */ struct { @@ -1424,20 +1425,29 @@ struct ConditionalConfig char *opt; /**< Only for IF_VALUE */ }; +/** Configuration file (config parser) */ struct ConfigFile { - char *cf_filename; - ConfigEntry *cf_entries; - ConfigFile *cf_next; + char *filename; /**< Filename of configuration file */ + ConfigEntry *items; /**< All items in the configuration file */ + ConfigFile *next; /**< Next configuration file */ }; +/** Configuration entry (config parser) */ struct ConfigEntry { - ConfigFile *ce_fileptr; - int ce_varlinenum, ce_fileposstart, ce_fileposend, ce_sectlinenum; - char *ce_varname, *ce_vardata; - ConfigEntry *ce_entries, *ce_prevlevel, *ce_next; - ConditionalConfig *ce_cond; + char *name; /**< Variable name */ + char *value; /**< Variable value, can be NULL */ + ConfigEntry *next; /**< Next ConfigEntry */ + ConfigEntry *items; /**< Items (children), can be NULL */ + ConfigFile *file; /**< To which configfile does this belong? */ + int line_number; /**< Line number of the variable name (this one is usually used for errors) */ + int file_position_start; /**< Position (byte) within configuration file of the start of the block, rarely used */ + int file_position_end; /**< Position (byte) within configuration file of the end of the block, rarely used */ + int section_linenumber; /**< Line number of the section (only used internally for parse errors) */ + ConfigEntry *parent; /**< Parent item, can be NULL */ + ConditionalConfig *conditional_config; /**< Used for conditional config by the main parser */ + unsigned escaped:1; }; struct ConfigFlag @@ -1524,8 +1534,7 @@ struct ConfigFlag_allow { struct ConfigItem_allow { ConfigItem_allow *prev, *next; ConfigFlag flag; - char *ip; - char *hostname; + ConfigItem_mask *mask; char *server; AuthConfig *auth; int maxperip; /**< Maximum connections permitted per IP address (locally) */ @@ -1533,7 +1542,7 @@ struct ConfigItem_allow { int port; ConfigItem_class *class; ConfigFlag_allow flags; - unsigned short ipv6_clone_mask; + int ipv6_clone_mask; }; struct OperClassACLPath @@ -1576,7 +1585,7 @@ struct OperClassCheckParams Client *client; Client *victim; Channel *channel; - void *extra; + const void *extra; }; struct ConfigItem_operclass { @@ -1596,9 +1605,10 @@ struct ConfigItem_oper { unsigned long modes, require_modes; char *vhost; int maxlogins; + int server_notice_colors; }; -/** The SSL/TLS options that are used in set::tls and otherblocks::tls-options. +/** The TLS options that are used in set::tls and otherblocks::tls-options. * NOTE: If you add something here then you must also update the * conf_tlsblock() function in s_conf.c to have it inherited * from set::tls to the other config blocks! @@ -1645,7 +1655,8 @@ struct ConfigItem_ulines { struct ConfigItem_tld { ConfigItem_tld *prev, *next; ConfigFlag_tld flag; - char *mask, *channel; + ConfigItem_mask *mask; + char *channel; char *motd_file, *rules_file, *smotd_file; char *botmotd_file, *opermotd_file; MOTDFile rules, motd, smotd, botmotd, opermotd; @@ -1663,6 +1674,7 @@ struct ConfigItem_listen { SSL_CTX *ssl_ctx; TLSOptions *tls_options; int websocket_options; /* should be in module, but lazy */ + char *websocket_forward; }; struct ConfigItem_sni { @@ -1711,13 +1723,6 @@ struct ConfigItem_link { TLSOptions *tls_options; /**< SSL Options for outgoing connection (optional) */ }; -struct ConfigItem_except { - ConfigItem_except *prev, *next; - ConfigFlag_except flag; - int type; - char *mask; -}; - struct ConfigItem_ban { ConfigItem_ban *prev, *next; ConfigFlag_ban flag; @@ -1734,7 +1739,8 @@ struct ConfigItem_deny_dcc { struct ConfigItem_deny_link { ConfigItem_deny_link *prev, *next; ConfigFlag_except flag; - char *mask, *rule, *prettyrule; + ConfigItem_mask *mask; + char *rule, *prettyrule; }; struct ConfigItem_deny_version { @@ -1764,32 +1770,6 @@ struct ConfigItem_allow_dcc { char *filename; }; -struct ConfigItem_log { - ConfigItem_log *prev, *next; - ConfigFlag flag; - char *file; /**< Filename to log to (either generated or specified) */ - char *filefmt; /**< Filename with dynamic % stuff */ - long maxsize; - int flags; - int logfd; -}; - -struct ConfigItem_unknown { - ConfigItem_unknown *prev, *next; - ConfigFlag flag; - ConfigEntry *ce; -}; - -struct ConfigItem_unknown_ext { - ConfigItem_unknown_ext *prev, *next; - ConfigFlag flag; - char *ce_varname, *ce_vardata; - ConfigFile *ce_fileptr; - int ce_varlinenum; - ConfigEntry *ce_entries; -}; - - typedef enum { ALIAS_SERVICES=1, ALIAS_STATS, ALIAS_NORMAL, ALIAS_COMMAND, ALIAS_CHANNEL, ALIAS_REAL } AliasType; @@ -1812,33 +1792,23 @@ struct ConfigItem_alias_format { Match *expr; }; -/** - * In a rehash scenario, conf_include will contain all of the included - * configs that are actually in use. It also will contain includes - * that are being processed so that the configuration may be updated. - * INCLUDE_NOTLOADED is set on all of the config files that are being - * loaded and unset on already-loaded files. See - * unload_loaded_includes() and load_includes(). - */ -#define INCLUDE_NOTLOADED 0x1 -#define INCLUDE_REMOTE 0x2 -#define INCLUDE_DLQUEUED 0x4 -/** - * Marks that an include was loaded without error. This seems to - * overlap with the INCLUDE_NOTLOADED meaning(?). --binki - */ -#define INCLUDE_USED 0x8 +#define RESOURCE_REMOTE 0x1 +#define RESOURCE_DLQUEUED 0x2 +#define RESOURCE_INCLUDE 0x4 + +typedef struct ConfigEntryWrapper ConfigEntryWrapper; +struct ConfigEntryWrapper { + ConfigEntryWrapper *prev, *next; + ConfigEntry *ce; +}; -struct ConfigItem_include { - ConfigItem_include *prev, *next; - ConfigFlag_ban flag; - char *file; -#ifdef USE_LIBCURL - char *url; - char *errorbuf; -#endif - char *included_from; - int included_from_line; +struct ConfigResource { + ConfigResource *prev, *next; + int type; + ConfigEntryWrapper *wce; /**< The place(s) where this resource is begin used */ + char *file; /**< File to read: can be a conf/something file or a downloaded file */ + char *url; /**< URL, if it is an URL */ + char *cache_file; /**< Set to filename of local cached copy, if it is available */ }; struct ConfigItem_blacklist_module { @@ -1855,7 +1825,7 @@ struct ConfigItem_help { struct ConfigItem_offchans { ConfigItem_offchans *prev, *next; - char chname[CHANNELLEN+1]; + char name[CHANNELLEN+1]; char *topic; }; @@ -1868,6 +1838,7 @@ struct SecurityGroup { int reputation_score; int webirc; int tls; + ConfigItem_mask *include_mask; }; #define HM_HOST 1 @@ -1885,14 +1856,6 @@ struct IRCStatistics { unsigned int is_cl; /* number of client connections */ unsigned int is_sv; /* number of server connections */ unsigned int is_ni; /* connection but no idea who it was */ - unsigned short is_cbs; /* bytes sent to clients */ - unsigned short is_cbr; /* bytes received to clients */ - unsigned short is_sbs; /* bytes sent to servers */ - unsigned short is_sbr; /* bytes received to servers */ - unsigned long is_cks; /* k-bytes sent to clients */ - unsigned long is_ckr; /* k-bytes received to clients */ - unsigned long is_sks; /* k-bytes sent to servers */ - unsigned long is_skr; /* k-bytes received to servers */ time_t is_cti; /* time spent connected by clients */ time_t is_sti; /* time spent connected by servers */ unsigned int is_ac; /* connections accepted */ @@ -1910,11 +1873,6 @@ struct IRCStatistics { unsigned int is_loc; /* local connections made */ }; -typedef struct MemoryInfo { - unsigned int classes; - unsigned long classesmem; -} MemoryInfo; - #define EXTCMODETABLESZ 32 /* Number of maximum paramter modes to allow. @@ -1928,13 +1886,30 @@ typedef struct MemoryInfo { * Otherwise, see the extended channel modes API, CmodeAdd(), etc. */ struct Mode { - long mode; /**< Core modes set on this channel (one of MODE_*) */ - Cmode_t extmode; /**< Other ("extended") channel modes set on this channel */ - void *extmodeparams[MAXPARAMMODES+1]; /**< Parameters for extended channel modes */ - int limit; /**< The +l limit in effect (eg: 40), if any - otherwise 0 */ - char key[KEYLEN + 1]; /**< The +k key in effect (eg: secret), if any - otherwise NULL */ + Cmode_t mode; /**< Other ("extended") channel modes set on this channel */ + void *mode_params[MAXPARAMMODES+1]; /**< Parameters for extended channel modes */ }; +/* flags for Link if used to contain Watch --k4be */ + +/* WATCH type */ +#define WATCH_FLAG_TYPE_WATCH (1<<0) /* added via /WATCH command */ +#define WATCH_FLAG_TYPE_MONITOR (1<<1) /* added via /MONITOR command */ + +/* behaviour switches */ +#define WATCH_FLAG_AWAYNOTIFY (1<<8) /* should send AWAY notifications */ + +/* watch triggering events */ +#define WATCH_EVENT_ONLINE 0 +#define WATCH_EVENT_OFFLINE 1 +#define WATCH_EVENT_AWAY 2 +#define WATCH_EVENT_NOTAWAY 3 +#define WATCH_EVENT_REAWAY 4 +#define WATCH_EVENT_USERHOST 5 +#define WATCH_EVENT_REALNAME 6 +#define WATCH_EVENT_LOGGEDIN 7 +#define WATCH_EVENT_LOGGEDOUT 8 + /* Used for notify-hash buckets... -Donwulff */ struct Watch { @@ -1962,6 +1937,8 @@ struct Link { } value; }; +#define IsInvalidChannelTS(x) ((x) <= 1000000) /**< Invalid channel creation time */ + /** * @addtogroup CommonStructs * @{ @@ -1979,13 +1956,12 @@ struct Channel { time_t topic_time; /**< Time at which the topic was last set */ int users; /**< Number of users in the channel */ Member *members; /**< List of channel members (users in the channel) */ - Link *invites; /**< List of outstanding /INVITE's from ops */ Ban *banlist; /**< List of bans (+b) */ Ban *exlist; /**< List of ban exceptions (+e) */ Ban *invexlist; /**< List of invite exceptions (+I) */ char *mode_lock; /**< Mode lock (MLOCK) applied to channel - usually by Services */ ModData moddata[MODDATA_MAX_CHANNEL]; /**< Channel attached module data, used by the ModData system */ - char chname[1]; /**< Channel name */ + char name[CHANNELLEN+1]; /**< Channel name */ }; /** user/channel member struct (channel->members). @@ -1997,7 +1973,7 @@ struct Member { struct Member *next; /**< Next entry in list */ Client *client; /**< The client */ - int flags; /**< The access of the user on this channel (one or more of CHFL_*) */ + char member_modes[MEMBERMODESLEN]; /**< The access of the user on this channel (eg "vhoqa") */ ModData moddata[MODDATA_MAX_MEMBER]; /** Member attached module data, used by the ModData system */ }; @@ -2010,7 +1986,7 @@ struct Membership { struct Membership *next; /**< Next entry in list */ struct Channel *channel; /**< The channel */ - int flags; /**< The access of the user on this channel (one or more of CHFL_*) */ + char member_modes[MEMBERMODESLEN]; /**< The (new) access of the user on this channel (eg "vhoqa") */ ModData moddata[MODDATA_MAX_MEMBERSHIP]; /**< Membership attached module data, used by the ModData system */ }; @@ -2024,97 +2000,18 @@ struct Ban { time_t when; /**< When the entry was added */ }; -/* -** Channel Related macros follow -*/ - -/* Channel related flags */ -#ifdef PREFIX_AQ - #define CHFL_CHANOP_OR_HIGHER (CHFL_CHANOP|CHFL_CHANADMIN|CHFL_CHANOWNER) - #define CHFL_HALFOP_OR_HIGHER (CHFL_CHANOWNER|CHFL_CHANADMIN|CHFL_CHANOP|CHFL_HALFOP) -#else - #define CHFL_CHANOP_OR_HIGHER (CHFL_CHANOP) - #define CHFL_HALFOP_OR_HIGHER (CHFL_CHANOP|CHFL_HALFOP) -#endif - -/** Channel flags (privileges) of users on a channel. - * This is used by Member and Membership (m->flags) to indicate the access rights of a user in a channel. - * Also used by SJOIN and MODE to set some flags while a JOIN or MODE is in process. - * @defgroup ChannelFlags Channel access flags - * @{ - */ -/** Is channel owner (+q) */ -#define is_chanowner(cptr,channel) (get_access(cptr,channel) & CHFL_CHANOWNER) -/** Is channel admin (+a) */ -#define is_chanadmin(cptr,channel) (get_access(cptr,channel) & CHFL_CHANADMIN) -/** Is channel operator or higher (+o/+a/+q) */ -#define is_chan_op(cptr,channel) (get_access(cptr,channel) & CHFL_CHANOP_OR_HIGHER) -/** Is some kind of channel op (+h/+o/+a/+q) */ -#define is_skochanop(cptr,channel) (get_access(cptr,channel) & CHFL_HALFOP_OR_HIGHER) -/** Is half-op (+h) */ -#define is_half_op(cptr,channel) (get_access(cptr,channel) & CHFL_HALFOP) -/** Has voice (+v) */ -#define has_voice(cptr,channel) (get_access(cptr,channel) & CHFL_VOICE) -/* Important: - * Do not blindly change the values of CHFL_* as they must match the - * ones in MODE_*. I already screwed this up twice. -- Syzop - * Obviously these should be decoupled in a code cleanup. - */ -#define CHFL_CHANOP 0x0001 /**< Channel operator (+o) */ -#define CHFL_VOICE 0x0002 /**< Voice (+v, can speak through bans and +m) */ -#define CHFL_DEOPPED 0x0004 /**< De-oped by a server (temporary state) */ -#define CHFL_CHANOWNER 0x0040 /**< Channel owner (+q) */ -#define CHFL_CHANADMIN 0x0080 /**< Channel admin (+a) */ -#define CHFL_HALFOP 0x0100 /**< Channel halfop (+h) */ -#define CHFL_BAN 0x0200 /**< Channel ban (+b) - not a real flag, only used in sjoin.c */ -#define CHFL_EXCEPT 0x0400 /**< Channel except (+e) - not a real flag, only used in sjoin.c */ -#define CHFL_INVEX 0x0800 /**< Channel invite exception (+I) - not a real flag, only used in sjoin.c */ -/** @} */ - -#define CHFL_REJOINING 0x8000 /* used internally by rejoin_* */ - -#define CHFL_OVERLAP (CHFL_CHANOWNER|CHFL_CHANADMIN|CHFL_CHANOP|CHFL_VOICE|CHFL_HALFOP) - /* Channel macros */ -/* Don't blindly change these MODE_* values, see comment 20 lines up! */ -#define MODE_CHANOP CHFL_CHANOP -#define MODE_VOICE CHFL_VOICE -#define MODE_PRIVATE 0x0004 -#define MODE_SECRET 0x0008 -#define MODE_MODERATED 0x0010 -#define MODE_TOPICLIMIT 0x0020 -#define MODE_CHANOWNER 0x0040 -#define MODE_CHANADMIN 0x0080 -#define MODE_HALFOP 0x0100 #define MODE_EXCEPT 0x0200 #define MODE_BAN 0x0400 -#define MODE_INVITEONLY 0x0800 -#define MODE_NOPRIVMSGS 0x1000 -#define MODE_KEY 0x2000 -#define MODE_LIMIT 0x4000 -#define MODE_RGSTR 0x8000 #define MODE_INVEX 0x8000000 -/* - * mode flags which take another parameter (With PARAmeterS) - */ -#define MODE_WPARAS (MODE_HALFOP|MODE_CHANOP|MODE_VOICE|MODE_CHANOWNER|MODE_CHANADMIN|MODE_BAN|MODE_KEY|MODE_LIMIT|MODE_EXCEPT|MODE_INVEX) -/* - * Undefined here, these are used in conjunction with the above modes in - * the source. -#define MODE_DEL 0x200000000 -#define MODE_ADD 0x400000000 - */ - -#define HoldChannel(x) (!(x)) /* name invisible */ -#define SecretChannel(x) ((x) && ((x)->mode.mode & MODE_SECRET)) +#define SecretChannel(x) ((x) && has_channel_mode((x), 's')) /* channel not shown but names are */ -#define HiddenChannel(x) ((x) && ((x)->mode.mode & MODE_PRIVATE)) +#define HiddenChannel(x) ((x) && has_channel_mode((x), 'p')) /* channel visible */ #define ShowChannel(v,c) (PubChannel(c) || IsMember((v),(c))) -#define PubChannel(x) ((!x) || ((x)->mode.mode &\ - (MODE_PRIVATE | MODE_SECRET)) == 0) +#define PubChannel(x) (!SecretChannel((x)) && !HiddenChannel((x))) #define IsChannelName(name) ((name) && (*(name) == '#')) @@ -2194,11 +2091,19 @@ struct ParseMode { char modechar; char *param; Cmode *extm; - char *modebuf; /* curr pos */ - char *parabuf; /* curr pos */ + const char *modebuf; /* curr pos */ + const char *parabuf; /* curr pos */ char buf[512]; /* internal parse buffer */ }; +#define MAXMULTILINEMODES 3 +typedef struct MultiLineMode MultiLineMode; +struct MultiLineMode { + char *modeline[MAXMULTILINEMODES+1]; + char *paramline[MAXMULTILINEMODES+1]; + int numlines; +}; + typedef struct PendingServer PendingServer; struct PendingServer { PendingServer *prev, *next; @@ -2230,15 +2135,13 @@ struct MaxTarget { #define MARK_AS_OFFICIAL_MODULE(modinf) do { if (modinf && modinf->handle) ModuleSetOptions(modinfo->handle, MOD_OPT_OFFICIAL, 1); } while(0) #define MARK_AS_GLOBAL_MODULE(modinf) do { if (modinf && modinf->handle) ModuleSetOptions(modinfo->handle, MOD_OPT_GLOBAL, 1); } while(0) -/* old.. please don't use anymore */ -#define CHANOPPFX "@" - /* used for is_banned type field: */ -#define BANCHK_JOIN 0 /* checking if a ban forbids the person from joining */ -#define BANCHK_MSG 1 /* checking if a ban forbids the person from sending messages */ -#define BANCHK_NICK 2 /* checking if a ban forbids the person from changing his/her nick */ -#define BANCHK_LEAVE_MSG 3 /* checking if a ban forbids the person from leaving a message in PART or QUIT */ -#define BANCHK_TKL 4 /* called from a server ban routine, or other match_user() usage */ +#define BANCHK_JOIN 0x0001 /* checking if a ban forbids the person from joining */ +#define BANCHK_MSG 0x0002 /* checking if a ban forbids the person from sending messages */ +#define BANCHK_NICK 0x0004 /* checking if a ban forbids the person from changing his/her nick */ +#define BANCHK_LEAVE_MSG 0x0008 /* checking if a ban forbids the person from leaving a message in PART or QUIT */ +#define BANCHK_TKL 0x0010 /* called from a server ban routine, or other match_user() usage */ +#define BANCHK_ALL (BANCHK_JOIN|BANCHK_MSG|BANCHK_NICK|BANCHK_LEAVE_MSG) /* all events except BANCHK_TKL which is special */ #define TKLISTLEN 26 #define TKLIPHASHLEN1 4 @@ -2256,8 +2159,6 @@ struct MaxTarget { #define MATCH_MASK_IS_UHOST 0x1000 #define MATCH_MASK_IS_HOST 0x2000 -#define MATCH_USE_IDENT 0x0100 - typedef enum { POLICY_ALLOW=1, POLICY_WARN=2, @@ -2303,6 +2204,19 @@ struct ConfigItem_badword { #define SKIP_DEAF 0x4 #define SKIP_CTCP 0x8 +typedef struct GeoIPResult GeoIPResult; +struct GeoIPResult { + char *country_code; + char *country_name; +}; + +typedef enum WhoisConfigDetails { + WHOIS_CONFIG_DETAILS_DEFAULT = 0, + WHOIS_CONFIG_DETAILS_NONE = 1, + WHOIS_CONFIG_DETAILS_LIMITED = 2, + WHOIS_CONFIG_DETAILS_FULL = 3, +} WhoisConfigDetails; + #endif /* __struct_include__ */ #include "dynconf.h" diff --git a/include/sys.h b/include/sys.h index dcae59d..2ea06b5 100644 --- a/include/sys.h +++ b/include/sys.h @@ -55,9 +55,6 @@ #endif /* HAVE_INTTYPES_H */ #endif /* HAVE_STDINT_H */ -#ifdef SSL -#include -#endif #ifndef _WIN32 #include #include diff --git a/include/unrealircd.h b/include/unrealircd.h index 05e77f0..abd67c7 100644 --- a/include/unrealircd.h +++ b/include/unrealircd.h @@ -10,7 +10,6 @@ #include "numeric.h" #include "msg.h" #include "mempool.h" -#include "proto.h" #include "channel.h" #include #include @@ -31,7 +30,6 @@ #include #include #include "h.h" -#include "url.h" #include "version.h" #ifdef USE_LIBCURL #include diff --git a/include/url.h b/include/url.h deleted file mode 100644 index 63584b0..0000000 --- a/include/url.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef URL_H -#define URL_H -#include "types.h" - -int MODFUNC url_is_valid(const char *); -extern const char MODFUNC *displayurl(const char *url); -char MODFUNC *url_getfilename(const char *url); -char MODFUNC *download_file(const char *, char **); -void MODFUNC download_file_async(const char *, time_t, vFP, void *callback_data); -void MODFUNC url_do_transfers_async(void); -void MODFUNC url_init(void); - -#endif diff --git a/include/version.h b/include/version.h index 281fdf9..00f5e62 100644 --- a/include/version.h +++ b/include/version.h @@ -54,9 +54,10 @@ * Can be useful if the above 3 versionids are insufficient for you (eg: you want to support CVS). * This is updated automatically on the CVS server every Monday. so don't touch it. */ -#define UNREAL_VERSION_TIME 202120 +#define UNREAL_VERSION_TIME 202148 -#define UnrealProtocol 5002 +#define UNREAL_VERSION ((UNREAL_VERSION_GENERATION << 24) + (UNREAL_VERSION_MAJOR << 16) + (UNREAL_VERSION_MINOR << 8)) +#define UnrealProtocol 6000 #define PATCH1 macro_to_str(UNREAL_VERSION_GENERATION) #define PATCH2 "." macro_to_str(UNREAL_VERSION_MAJOR) #define PATCH3 "." macro_to_str(UNREAL_VERSION_MINOR) diff --git a/include/whowas.h b/include/whowas.h index f639f89..ceaefed 100644 --- a/include/whowas.h +++ b/include/whowas.h @@ -59,7 +59,7 @@ void off_history(Client *); ** nickname within the timelimit. Returns NULL, if no ** one found... */ -Client *get_history(char *, time_t); +Client *get_history(const char *, time_t); /* Nick name */ /* Time limit in seconds */ diff --git a/include/windows/setup.h b/include/windows/setup.h index f079072..12d49c4 100644 --- a/include/windows/setup.h +++ b/include/windows/setup.h @@ -35,8 +35,6 @@ #define PIDFILE PERMDATADIR"/unrealircd.pid" #define NO_U_TYPES #define NEED_U_INT32_T -#define PREFIX_AQ -#define LIST_SHOW_MODES #define strcasecmp _stricmp #define strncasecmp _strnicmp #define HAVE_EXPLICIT_BZERO @@ -57,13 +55,13 @@ #define _WIN32_WINNT 0x0601 /* Generation version number (e.g.: 3 for Unreal3*) */ -#define UNREAL_VERSION_GENERATION 5 +#define UNREAL_VERSION_GENERATION 6 /* Major version number (e.g.: 2 for Unreal3.2*) */ -#define UNREAL_VERSION_MAJOR 2 +#define UNREAL_VERSION_MAJOR 0 /* Minor version number (e.g.: 1 for Unreal3.2.1) */ -#define UNREAL_VERSION_MINOR 0 +#define UNREAL_VERSION_MINOR 1 /* Version suffix such as a beta marker or release candidate marker. (e.g.: -rcX for unrealircd-3.2.9-rcX) */ diff --git a/src/Makefile.in b/src/Makefile.in index a50e095..62d4388 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -24,15 +24,15 @@ CC = "==== DO NOT RUN MAKE FROM THIS DIRECTORY ====" OBJS=dns.o auth.o channel.o crule.o dbuf.o \ fdlist.o hash.o ircd.o ircsprintf.o list.o \ match.o modules.o parse.o mempool.o operclass.o \ - conf_preprocessor.o conf.o debug.o dispatch.o numeric.o \ + conf_preprocessor.o conf.o debug.o dispatch.o \ misc.o serv.o aliases.o socket.o \ tls.o user.o scache.o send.o support.o \ version.o whowas.o random.o api-usermode.o api-channelmode.o \ api-moddata.o api-extban.o api-isupport.o api-command.o \ api-clicap.o api-messagetag.o api-history-backend.o api-efunctions.o \ api-event.o \ - crypt_blowfish.o unrealdb.o updconf.o crashreport.o modulemanager.o \ - utf8.o \ + crypt_blowfish.o unrealdb.o crashreport.o modulemanager.o \ + utf8.o log.o \ openssl_hostname_validation.o $(URL) SRC=$(OBJS:%.o=%.c) @@ -48,13 +48,16 @@ INCLUDES = ../include/channel.h \ ../include/ircsprintf.h \ ../include/license.h \ ../include/modules.h ../include/modversion.h ../include/msg.h \ - ../include/numeric.h ../include/proto.h \ + ../include/numeric.h \ ../include/resource.h ../include/setup.h \ ../include/struct.h ../include/sys.h \ - ../include/types.h ../include/url.h \ + ../include/types.h \ ../include/version.h ../include/whowas.h \ ../include/openssl_hostname_validation.h +.SUFFIXES: +.SUFFIXES: .c .h .o + all: build build: @@ -80,170 +83,16 @@ mods: version.c: version.c.SH $(SHELL) version.c.SH -version.o: version.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c version.c - -parse.o: parse.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c parse.c - -socket.o: socket.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c socket.c - -dispatch.o: dispatch.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c dispatch.c - -dbuf.o: dbuf.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c dbuf.c - -auth.o: auth.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c auth.c - -send.o: send.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c send.c - -tls.o: tls.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c tls.c - -match.o: match.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c match.c - -modules.o: modules.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c modules.c - -mempool.o: mempool.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c mempool.c - -support.o: support.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c support.c - -userload.o: userload.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c userload.c - -aliases.o: aliases.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c aliases.c +%.o: %.c $(INCLUDES) + $(CC) $(CFLAGS) $(BINCFLAGS) -c $< clean: $(RM) -f *.o *.so *~ core ircd version.c; \ - cd modules; make clean + cd modules; ${MAKE} clean cleandir: clean depend: makedepend -I${INCLUDEDIR} ${SRC} -channel.o: channel.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c channel.c - -ircd.o: ircd.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c ircd.c - -list.o: list.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c list.c - -dns.o: dns.c $(INCLUDES) ../include/dns.h - $(CC) $(CFLAGS) $(BINCFLAGS) -c dns.c - -fdlist.o: fdlist.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c fdlist.c - -conf_preprocessor.o: conf_preprocessor.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c conf_preprocessor.c - -conf.o: conf.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c conf.c - -debug.o: debug.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c debug.c - -numeric.o: numeric.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c numeric.c - -misc.o: misc.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c misc.c - -scache.o: scache.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c scache.c - -ircsprintf.o: ircsprintf.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c ircsprintf.c - -user.o: user.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c user.c - -serv.o: serv.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c serv.c - -whowas.o: whowas.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c whowas.c - -hash.o: hash.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c hash.c - -crule.o: crule.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c crule.c - -random.o: random.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c random.c - -operclass.o: operclass.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c operclass.c - -api-usermode.o: api-usermode.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c api-usermode.c - -api-event.o: api-event.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c api-event.c - -api-channelmode.o: api-channelmode.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c api-channelmode.c - -api-moddata.o: api-moddata.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c api-moddata.c - -api-extban.o: api-extban.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c api-extban.c - -api-command.o: api-command.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c api-command.c - -api-isupport.o: api-isupport.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c api-isupport.c - -api-clicap.o: api-clicap.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c api-clicap.c - -api-messagetag.o: api-messagetag.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c api-messagetag.c - -api-history-backend.o: api-history-backend.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c api-history-backend.c - -api-efunctions.o: api-efunctions.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c api-efunctions.c - -crypt_blowfish.o: crypt_blowfish.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c crypt_blowfish.c - -unrealdb.o: unrealdb.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c unrealdb.c - -updconf.o: updconf.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c updconf.c - -crashreport.o: crashreport.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c crashreport.c - -modulemanager.o: modulemanager.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c modulemanager.c - -utf8.o: utf8.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c utf8.c - -openssl_hostname_validation.o: openssl_hostname_validation.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c openssl_hostname_validation.c - -url.o: url.c $(INCLUDES) - $(CC) $(CFLAGS) $(BINCFLAGS) -c url.c - # DO NOT DELETE THIS LINE -- make depend depends on it. - diff --git a/src/aliases.c b/src/aliases.c index 22f299b..7ec46f3 100644 --- a/src/aliases.c +++ b/src/aliases.c @@ -42,11 +42,12 @@ void strrangetok(char *in, char *out, char tok, short first, short last) { /* cmd_alias is a special type of command, it has an extra argument 'cmd'. */ static int recursive_alias = 0; -void cmd_alias(Client *client, MessageTag *mtags, int parc, char *parv[], char *cmd) +void cmd_alias(Client *client, MessageTag *mtags, int parc, const char *parv[], const char *cmd) { ConfigItem_alias *alias; Client *acptr; int ret; + char request[BUFSIZE]; if (!(alias = find_alias(cmd))) { @@ -64,7 +65,7 @@ void cmd_alias(Client *client, MessageTag *mtags, int parc, char *parv[], char * if (alias->type == ALIAS_SERVICES) { - if (SERVICES_NAME && (acptr = find_person(alias->nick, NULL))) + if (SERVICES_NAME && (acptr = find_user(alias->nick, NULL))) { if (alias->spamfilter && match_spamfilter(client, parv[1], SPAMF_USERMSG, cmd, alias->nick, 0, NULL)) return; @@ -76,7 +77,7 @@ void cmd_alias(Client *client, MessageTag *mtags, int parc, char *parv[], char * } else if (alias->type == ALIAS_STATS) { - if (STATS_SERVER && (acptr = find_person(alias->nick, NULL))) + if (STATS_SERVER && (acptr = find_user(alias->nick, NULL))) { if (alias->spamfilter && match_spamfilter(client, parv[1], SPAMF_USERMSG, cmd, alias->nick, 0, NULL)) return; @@ -88,7 +89,7 @@ void cmd_alias(Client *client, MessageTag *mtags, int parc, char *parv[], char * } else if (alias->type == ALIAS_NORMAL) { - if ((acptr = find_person(alias->nick, NULL))) + if ((acptr = find_user(alias->nick, NULL))) { if (alias->spamfilter && match_spamfilter(client, parv[1], SPAMF_USERMSG, cmd, alias->nick, 0, NULL)) return; @@ -106,19 +107,19 @@ void cmd_alias(Client *client, MessageTag *mtags, int parc, char *parv[], char * else if (alias->type == ALIAS_CHANNEL) { Channel *channel; - if ((channel = find_channel(alias->nick, NULL))) + if ((channel = find_channel(alias->nick))) { - char *msg = parv[1]; - char *errmsg = NULL; + const char *msg = parv[1]; + const char *errmsg = NULL; if (can_send_to_channel(client, channel, &msg, &errmsg, 0)) { - if (alias->spamfilter && match_spamfilter(client, parv[1], SPAMF_CHANMSG, cmd, channel->chname, 0, NULL)) + if (alias->spamfilter && match_spamfilter(client, parv[1], SPAMF_CHANMSG, cmd, channel->name, 0, NULL)) return; new_message(client, NULL, &mtags); sendto_channel(channel, client, client->direction, - PREFIX_ALL, 0, SEND_ALL|SKIP_DEAF, mtags, + NULL, 0, SEND_ALL|SKIP_DEAF, mtags, ":%s PRIVMSG %s :%s", - client->name, channel->chname, parv[1]); + client->name, channel->name, parv[1]); free_message_tags(mtags); return; } @@ -132,7 +133,10 @@ void cmd_alias(Client *client, MessageTag *mtags, int parc, char *parv[], char * char *ptr = ""; if (!(parc < 2 || *parv[1] == '\0')) - ptr = parv[1]; + { + strlcpy(request, parv[1], sizeof(request)); + ptr = request; + } for (format = alias->format; format; format = format->next) { @@ -201,7 +205,7 @@ void cmd_alias(Client *client, MessageTag *mtags, int parc, char *parv[], char * if (format->type == ALIAS_SERVICES) { - if (SERVICES_NAME && (acptr = find_person(format->nick, NULL))) + if (SERVICES_NAME && (acptr = find_user(format->nick, NULL))) { if (alias->spamfilter && match_spamfilter(client, output, SPAMF_USERMSG, cmd, format->nick, 0, NULL)) return; @@ -212,7 +216,7 @@ void cmd_alias(Client *client, MessageTag *mtags, int parc, char *parv[], char * } else if (format->type == ALIAS_STATS) { - if (STATS_SERVER && (acptr = find_person(format->nick, NULL))) + if (STATS_SERVER && (acptr = find_user(format->nick, NULL))) { if (alias->spamfilter && match_spamfilter(client, output, SPAMF_USERMSG, cmd, format->nick, 0, NULL)) return; @@ -223,7 +227,7 @@ void cmd_alias(Client *client, MessageTag *mtags, int parc, char *parv[], char * } else if (format->type == ALIAS_NORMAL) { - if ((acptr = find_person(format->nick, NULL))) + if ((acptr = find_user(format->nick, NULL))) { if (alias->spamfilter && match_spamfilter(client, output, SPAMF_USERMSG, cmd, format->nick, 0, NULL)) return; @@ -241,19 +245,19 @@ void cmd_alias(Client *client, MessageTag *mtags, int parc, char *parv[], char * else if (format->type == ALIAS_CHANNEL) { Channel *channel; - if ((channel = find_channel(format->nick, NULL))) + if ((channel = find_channel(format->nick))) { - char *msg = output; - char *errmsg = NULL; + const char *msg = output; + const char *errmsg = NULL; if (!can_send_to_channel(client, channel, &msg, &errmsg, 0)) { - if (alias->spamfilter && match_spamfilter(client, output, SPAMF_CHANMSG, cmd, channel->chname, 0, NULL)) + if (alias->spamfilter && match_spamfilter(client, output, SPAMF_CHANMSG, cmd, channel->name, 0, NULL)) return; new_message(client, NULL, &mtags); sendto_channel(channel, client, client->direction, - PREFIX_ALL, 0, SEND_ALL|SKIP_DEAF, mtags, + NULL, 0, SEND_ALL|SKIP_DEAF, mtags, ":%s PRIVMSG %s :%s", - client->name, channel->chname, parv[1]); + client->name, channel->name, parv[1]); free_message_tags(mtags); return; } diff --git a/src/api-channelmode.c b/src/api-channelmode.c index 3237da9..1a5beee 100644 --- a/src/api-channelmode.c +++ b/src/api-channelmode.c @@ -33,10 +33,8 @@ * @{ */ -/** Table with details on each channel mode handler */ -Cmode *Channelmode_Table = NULL; -/** Highest index in Channelmode_Table */ -unsigned short Channelmode_highest = 0; +/** List of all channel modes, their handlers, etc */ +Cmode *channelmodes = NULL; /** @} */ @@ -48,6 +46,7 @@ char extchmstr[4][64]; /* Private functions (forward declaration) and variables */ static void make_cmodestr(void); static char previous_chanmodes[256]; +static char previous_prefix[256]; static Cmode *ParamTable[MAXPARAMMODES+1]; static void unload_extcmode_commit(Cmode *cmode); @@ -55,6 +54,7 @@ static void unload_extcmode_commit(Cmode *cmode); void make_extcmodestr() { char *p; + Cmode *cm; int i; extchmstr[0][0] = extchmstr[1][0] = extchmstr[2][0] = extchmstr[3][0] = '\0'; @@ -64,31 +64,30 @@ void make_extcmodestr() /* type 2: 1 par to set/unset (has .unset_with_param) */ p = extchmstr[1]; - for (i=0; i <= Channelmode_highest; i++) - if (Channelmode_Table[i].paracount && Channelmode_Table[i].flag && - Channelmode_Table[i].unset_with_param) - *p++ = Channelmode_Table[i].flag; + for (cm=channelmodes; cm; cm = cm->next) + if (cm->paracount && cm->letter && cm->unset_with_param && (cm->type != CMODE_MEMBER)) + *p++ = cm->letter; *p = '\0'; /* type 3: 1 param to set, 0 params to unset (does not have .unset_with_param) */ p = extchmstr[2]; - for (i=0; i <= Channelmode_highest; i++) - if (Channelmode_Table[i].paracount && Channelmode_Table[i].flag && - !Channelmode_Table[i].unset_with_param) - *p++ = Channelmode_Table[i].flag; + for (cm=channelmodes; cm; cm = cm->next) + if (cm->paracount && cm->letter && !cm->unset_with_param) + *p++ = cm->letter; *p = '\0'; /* type 4: paramless modes */ p = extchmstr[3]; - for (i=0; i <= Channelmode_highest; i++) - if (!Channelmode_Table[i].paracount && Channelmode_Table[i].flag) - *p++ = Channelmode_Table[i].flag; + for (cm=channelmodes; cm; cm = cm->next) + if (!cm->paracount && cm->letter) + *p++ = cm->letter; *p = '\0'; } /** Create the string that is used in numeric 004 */ static void make_cmodestr(void) { + Cmode *cm; char *p = &cmodestring[0]; CoreChannelModeTable *tab = &corechannelmodetable[0]; int i; @@ -98,35 +97,36 @@ static void make_cmodestr(void) p++; tab++; } - for (i=0; i <= Channelmode_highest; i++) - if (Channelmode_Table[i].flag) - *p++ = Channelmode_Table[i].flag; + for (cm=channelmodes; cm; cm = cm->next) + if (cm->letter) + *p++ = cm->letter; *p = '\0'; } /** Check for changes - if any are detected, we broadcast the change */ -void extcmodes_check_for_changes(void) +void extcmodes_check_for_changed_channel_modes(void) { char chanmodes[256]; ISupport *isup; + //sort_cmodes(); make_cmodestr(); make_extcmodestr(); snprintf(chanmodes, sizeof(chanmodes), "%s%s", CHPAR1, EXPAR1); - safe_strdup(me.serv->features.chanmodes[0], chanmodes); - snprintf(chanmodes, sizeof(chanmodes), "%s%s", CHPAR2, EXPAR2); - safe_strdup(me.serv->features.chanmodes[1], chanmodes); - snprintf(chanmodes, sizeof(chanmodes), "%s%s", CHPAR3, EXPAR3); - safe_strdup(me.serv->features.chanmodes[2], chanmodes); - snprintf(chanmodes, sizeof(chanmodes), "%s%s", CHPAR4, EXPAR4); - safe_strdup(me.serv->features.chanmodes[3], chanmodes); + safe_strdup(me.server->features.chanmodes[0], chanmodes); + snprintf(chanmodes, sizeof(chanmodes), "%s", EXPAR2); + safe_strdup(me.server->features.chanmodes[1], chanmodes); + snprintf(chanmodes, sizeof(chanmodes), "%s", EXPAR3); + safe_strdup(me.server->features.chanmodes[2], chanmodes); + snprintf(chanmodes, sizeof(chanmodes), "%s", EXPAR4); + safe_strdup(me.server->features.chanmodes[3], chanmodes); ircsnprintf(chanmodes, sizeof(chanmodes), "%s,%s,%s,%s", - me.serv->features.chanmodes[0], - me.serv->features.chanmodes[1], - me.serv->features.chanmodes[2], - me.serv->features.chanmodes[3]); + me.server->features.chanmodes[0], + me.server->features.chanmodes[1], + me.server->features.chanmodes[2], + me.server->features.chanmodes[3]); isup = ISupportFind("CHANMODES"); if (!isup) @@ -139,10 +139,10 @@ void extcmodes_check_for_changes(void) if (*previous_chanmodes && strcmp(chanmodes, previous_chanmodes)) { - ircd_log(LOG_ERROR, "Channel modes changed at runtime: %s -> %s", - previous_chanmodes, chanmodes); - sendto_realops("Channel modes changed at runtime: %s -> %s", - previous_chanmodes, chanmodes); + unreal_log(ULOG_INFO, "mode", "CHANNEL_MODES_CHANGED", NULL, + "Channel modes changed at runtime: $old_channel_modes -> $new_channel_modes", + log_data_string("old_channel_modes", previous_chanmodes), + log_data_string("new_channel_modes", chanmodes)); /* Broadcast change to all (locally connected) servers */ sendto_server(NULL, 0, 0, NULL, "PROTOCTL CHANMODES=%s", chanmodes); } @@ -150,40 +150,152 @@ void extcmodes_check_for_changes(void) strlcpy(previous_chanmodes, chanmodes, sizeof(previous_chanmodes)); } +void make_prefix(char **isupport_prefix, char **isupport_statusmsg) +{ + static char prefix[256]; + static char prefix_prefix[256]; + char prefix_modes[256]; + int rank[256]; + Cmode *cm; + int n; + + *prefix = *prefix_prefix = *prefix_modes = '\0'; + + for (n=0, cm=channelmodes; cm && n < ARRAY_SIZEOF(rank)-1; cm = cm->next) + { + if ((cm->type == CMODE_MEMBER) && cm->letter) + { + strlcat_letter(prefix_prefix, cm->prefix, sizeof(prefix_prefix)); + strlcat_letter(prefix_modes, cm->letter, sizeof(prefix_modes)); + rank[n] = cm->rank; + n++; + } + } + + if (*prefix_prefix) + { + int i, j; + /* Now sort the damn thing */ + for (i=0; i < n; i++) + { + for (j=i+1; j < n; j++) + { + if (rank[i] < rank[j]) + { + /* swap */ + char save; + int save_rank; + save = prefix_prefix[i]; + prefix_prefix[i] = prefix_prefix[j]; + prefix_prefix[j] = save; + save = prefix_modes[i]; + prefix_modes[i] = prefix_modes[j]; + prefix_modes[j] = save; + save_rank = rank[i]; + rank[i] = rank[j]; + rank[j] = save_rank; + } + } + } + snprintf(prefix, sizeof(prefix), "(%s)%s", prefix_modes, prefix_prefix); + } + + *isupport_prefix = prefix; + *isupport_statusmsg = prefix_prefix; +} + +void extcmodes_check_for_changed_prefixes(void) +{ + ISupport *isup; + char *prefix, *statusmsg; + + make_prefix(&prefix, &statusmsg); + ISupportSet(NULL, "PREFIX", prefix); + ISupportSet(NULL, "STATUSMSG", statusmsg); + + if (*previous_prefix && strcmp(prefix, previous_prefix)) + { + unreal_log(ULOG_INFO, "mode", "PREFIX_CHANGED", NULL, + "Prefix changed at runtime: $old_prefix -> $new_prefix", + log_data_string("old_prefix", previous_prefix), + log_data_string("new_prefix", prefix)); + /* Broadcast change to all (locally connected) servers */ + sendto_server(NULL, 0, 0, NULL, "PROTOCTL PREFIX=%s", prefix); + } + + strlcpy(previous_prefix, prefix, sizeof(previous_prefix)); +} + +/** Check for changes - if any are detected, we broadcast the change */ +void extcmodes_check_for_changes(void) +{ + extcmodes_check_for_changed_channel_modes(); + extcmodes_check_for_changed_prefixes(); +} + /** Initialize the extended channel modes system */ void extcmode_init(void) { - Cmode_t val = 1; - int i; - Channelmode_Table = safe_alloc(sizeof(Cmode) * EXTCMODETABLESZ); - for (i = 0; i < EXTCMODETABLESZ; i++) - { - Channelmode_Table[i].mode = val; - val *= 2; - } - Channelmode_highest = 0; memset(&extchmstr, 0, sizeof(extchmstr)); memset(¶m_to_slot_mapping, 0, sizeof(param_to_slot_mapping)); *previous_chanmodes = '\0'; + *previous_prefix = '\0'; } /** Update letter->slot mapping and slot->handler mapping */ -void extcmode_para_addslot(Cmode *c, int slot) +void extcmode_para_addslot(Cmode *cm, int slot) { if ((slot < 0) || (slot > MAXPARAMMODES)) abort(); - c->slot = slot; - ParamTable[slot] = c; - param_to_slot_mapping[c->flag] = slot; + cm->param_slot = slot; + ParamTable[slot] = cm; + param_to_slot_mapping[cm->letter] = slot; } /** Update letter->slot mapping and slot->handler mapping */ -void extcmode_para_delslot(Cmode *c, int slot) +void extcmode_para_delslot(Cmode *cm, int slot) { if ((slot < 0) || (slot > MAXPARAMMODES)) abort(); ParamTable[slot] = NULL; - param_to_slot_mapping[c->flag] = 0; + param_to_slot_mapping[cm->letter] = 0; +} + +void channelmode_add_sorted(Cmode *n) +{ + Cmode *m; + + if (channelmodes == NULL) + { + channelmodes = n; + return; + } + + for (m = channelmodes; m; m = m->next) + { + if (m->letter == '\0') + abort(); + if (sort_character_lowercase_before_uppercase(n->letter, m->letter)) + { + /* Insert us before */ + if (m->prev) + m->prev->next = n; + else + channelmodes = n; /* new head */ + n->prev = m->prev; + + n->next = m; + m->prev = n; + return; + } + if (!m->next) + { + /* Append us at end */ + m->next = n; + n->prev = m; + return; + } + } } /** @defgroup ChannelModeAPI Channel mode API @@ -198,19 +310,17 @@ void extcmode_para_delslot(Cmode *c, int slot) */ Cmode *CmodeAdd(Module *module, CmodeInfo req, Cmode_t *mode) { - short i = 0, j = 0; int paraslot = -1; int existing = 0; + Cmode *cm; - while (i < EXTCMODETABLESZ) + for (cm=channelmodes; cm; cm = cm->next) { - if (!Channelmode_Table[i].flag) - break; - else if (Channelmode_Table[i].flag == req.flag) + if (cm->letter == req.letter) { - if (Channelmode_Table[i].unloaded) + if (cm->unloaded) { - Channelmode_Table[i].unloaded = 0; + cm->unloaded = 0; existing = 1; break; } else { @@ -219,22 +329,67 @@ Cmode *CmodeAdd(Module *module, CmodeInfo req, Cmode_t *mode) return NULL; } } - i++; - } - if (i == EXTCMODETABLESZ) - { - Debug((DEBUG_DEBUG, "CmodeAdd failed, no space")); - if (module) - module->errorcode = MODERR_NOSPACE; - return NULL; } - if (req.paracount == 1) + if (!cm) + { + long l, found = 0; + + if (req.type == CMODE_NORMAL) + { + for (l = 1; l < LONG_MAX/2; l *= 2) + { + found = 0; + for (cm=channelmodes; cm; cm = cm->next) + { + if (cm->mode == l) + { + found = 1; + break; + } + } + if (!found) + break; + } + /* If 'found' is still true, then we are out of space */ + if (found) + { + unreal_log(ULOG_ERROR, "module", "CHANNEL_MODE_OUT_OF_SPACE", NULL, + "CmodeAdd: out of space!!!"); + if (module) + module->errorcode = MODERR_NOSPACE; + return NULL; + } + cm = safe_alloc(sizeof(Cmode)); + cm->letter = req.letter; + cm->mode = l; + *mode = cm->mode; + } else if (req.type == CMODE_MEMBER) + { + if (!req.prefix || !req.sjoin_prefix || !req.paracount || + !req.unset_with_param || !req.rank) + { + unreal_log(ULOG_ERROR, "module", "CMODEADD_API_ERROR", NULL, + "CmodeAdd(): module is missing required information. " + "Module: $module_name", + log_data_string("module_name", module->header->name)); + module->errorcode = MODERR_INVALID; + return NULL; + } + cm = safe_alloc(sizeof(Cmode)); + cm->letter = req.letter; + } else { + abort(); + } + channelmode_add_sorted(cm); + } + + if ((req.paracount == 1) && (req.type == CMODE_NORMAL)) { if (existing) { /* Re-use parameter slot of the module with the same modechar that is unloading */ - paraslot = Channelmode_Table[i].slot; + paraslot = cm->param_slot; } else { @@ -243,7 +398,8 @@ Cmode *CmodeAdd(Module *module, CmodeInfo req, Cmode_t *mode) { if (paraslot == MAXPARAMMODES - 1) { - Debug((DEBUG_DEBUG, "CmodeAdd failed, no space for parameter")); + unreal_log(ULOG_ERROR, "module", "CHANNEL_MODE_OUT_OF_SPACE", NULL, + "CmodeAdd: out of space!!! Place 2."); if (module) module->errorcode = MODERR_NOSPACE; return NULL; @@ -252,39 +408,40 @@ Cmode *CmodeAdd(Module *module, CmodeInfo req, Cmode_t *mode) } } - *mode = Channelmode_Table[i].mode; - /* Update extended channel mode table highest */ - Channelmode_Table[i].flag = req.flag; - Channelmode_Table[i].paracount = req.paracount; - Channelmode_Table[i].is_ok = req.is_ok; - Channelmode_Table[i].put_param = req.put_param; - Channelmode_Table[i].get_param = req.get_param; - Channelmode_Table[i].conv_param = req.conv_param; - Channelmode_Table[i].free_param = req.free_param; - Channelmode_Table[i].dup_struct = req.dup_struct; - Channelmode_Table[i].sjoin_check = req.sjoin_check; - Channelmode_Table[i].local = req.local; - Channelmode_Table[i].unset_with_param = req.unset_with_param; - Channelmode_Table[i].owner = module; - Channelmode_Table[i].unloaded = 0; - - for (j = 0; j < EXTCMODETABLESZ; j++) - if (Channelmode_Table[j].flag) - if (j > Channelmode_highest) - Channelmode_highest = j; + cm->letter = req.letter; + cm->type = req.type; + cm->prefix = req.prefix; + cm->sjoin_prefix = req.sjoin_prefix; + cm->rank = req.rank; + cm->paracount = req.paracount; + cm->is_ok = req.is_ok; + cm->put_param = req.put_param; + cm->get_param = req.get_param; + cm->conv_param = req.conv_param; + cm->free_param = req.free_param; + cm->dup_struct = req.dup_struct; + cm->sjoin_check = req.sjoin_check; + cm->local = req.local; + cm->unset_with_param = req.unset_with_param; + cm->owner = module; + cm->unloaded = 0; + + if (cm->type == CMODE_NORMAL) + { + *mode = cm->mode; + if (cm->paracount == 1) + extcmode_para_addslot(cm, paraslot); + } - if (Channelmode_Table[i].paracount == 1) - extcmode_para_addslot(&Channelmode_Table[i], paraslot); - if (module) { ModuleObject *cmodeobj = safe_alloc(sizeof(ModuleObject)); - cmodeobj->object.cmode = &Channelmode_Table[i]; + cmodeobj->object.cmode = cm; cmodeobj->type = MOBJ_CMODE; AddListItem(cmodeobj, module->objects); module->errorcode = MODERR_NOERROR; } - return &(Channelmode_Table[i]); + return cm; } /** Delete a previously registered channel mode - not called by modules. @@ -304,7 +461,7 @@ void CmodeDel(Cmode *cmode) } cmode->owner = NULL; } - if (loop.ircd_rehashing) + if (loop.rehashing) cmode->unloaded = 1; else unload_extcmode_commit(cmode); @@ -322,80 +479,110 @@ static void unload_extcmode_commit(Cmode *cmode) Channel *channel; if (!cmode) - return; + return; - /* Unset channel mode and send MODE to everyone */ - - if (cmode->paracount == 0) + if (cmode->type == CMODE_NORMAL) { - /* Paramless mode, easy */ - for (channel = channels; channel; channel = channel->nextch) + /* Unset channel mode and send MODE to everyone */ + if (cmode->paracount == 0) { - if (channel->mode.extmode & cmode->mode) + /* Paramless mode, easy */ + for (channel = channels; channel; channel = channel->nextch) { - MessageTag *mtags = NULL; - - new_message(&me, NULL, &mtags); - sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, - ":%s MODE %s -%c", - me.name, channel->chname, cmode->flag); - sendto_server(NULL, 0, 0, mtags, - ":%s MODE %s -%c 0", - me.id, channel->chname, cmode->flag); - free_message_tags(mtags); - - channel->mode.extmode &= ~cmode->mode; - } - } - } else - { - /* Parameter mode, more complicated */ - for (channel = channels; channel; channel = channel->nextch) - { - if (channel->mode.extmode & cmode->mode) - { - MessageTag *mtags = NULL; - - new_message(&me, NULL, &mtags); - if (cmode->unset_with_param) + if (channel->mode.mode & cmode->mode) { - char *param = cmode->get_param(GETPARASTRUCT(channel, cmode->flag)); - sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, - ":%s MODE %s -%c %s", - me.name, channel->chname, cmode->flag, param); - sendto_server(NULL, 0, 0, mtags, - ":%s MODE %s -%c %s 0", - me.id, channel->chname, cmode->flag, param); - } else { + MessageTag *mtags = NULL; + + new_message(&me, NULL, &mtags); sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s -%c", - me.name, channel->chname, cmode->flag); + me.name, channel->name, cmode->letter); sendto_server(NULL, 0, 0, mtags, ":%s MODE %s -%c 0", - me.id, channel->chname, cmode->flag); - } - free_message_tags(mtags); + me.id, channel->name, cmode->letter); + free_message_tags(mtags); - cmode->free_param(GETPARASTRUCT(channel, cmode->flag)); - channel->mode.extmode &= ~cmode->mode; + channel->mode.mode &= ~cmode->mode; + } + } + } else + { + /* Parameter mode, more complicated */ + for (channel = channels; channel; channel = channel->nextch) + { + if (channel->mode.mode & cmode->mode) + { + MessageTag *mtags = NULL; + + new_message(&me, NULL, &mtags); + if (cmode->unset_with_param) + { + const char *param = cmode->get_param(GETPARASTRUCT(channel, cmode->letter)); + sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, + ":%s MODE %s -%c %s", + me.name, channel->name, cmode->letter, param); + sendto_server(NULL, 0, 0, mtags, + ":%s MODE %s -%c %s 0", + me.id, channel->name, cmode->letter, param); + } else { + sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, + ":%s MODE %s -%c", + me.name, channel->name, cmode->letter); + sendto_server(NULL, 0, 0, mtags, + ":%s MODE %s -%c 0", + me.id, channel->name, cmode->letter); + } + free_message_tags(mtags); + + cmode->free_param(GETPARASTRUCT(channel, cmode->letter)); + channel->mode.mode &= ~cmode->mode; + } + } + extcmode_para_delslot(cmode, cmode->param_slot); + } + } else + if (cmode->type == CMODE_MEMBER) + { + for (channel = channels; channel; channel = channel->nextch) + { + Member *m; + for (m = channel->members; m; m = m->next) + { + if (strchr(m->member_modes, cmode->letter)) + { + MessageTag *mtags = NULL; + + new_message(&me, NULL, &mtags); + sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, + ":%s MODE %s -%c %s", + me.name, channel->name, cmode->letter, m->client->name); + sendto_server(NULL, 0, 0, mtags, + ":%s MODE %s -%c %s 0", + me.id, channel->name, cmode->letter, m->client->id); + free_message_tags(mtags); + del_member_mode(m->client, channel, cmode->letter); + } } } - extcmode_para_delslot(cmode, cmode->slot); } - cmode->flag = '\0'; + DelListItem(cmode, channelmodes); + safe_free(cmode); } /** Unload all unused channel modes after a REHASH */ void unload_all_unused_extcmodes(void) { - int i; + Cmode *cm, *cm_next; - for (i = 0; i < EXTCMODETABLESZ; i++) - if (Channelmode_Table[i].flag && Channelmode_Table[i].unloaded) + for (cm=channelmodes; cm; cm = cm_next) + { + cm_next = cm->next; + if (cm->letter && cm->unloaded) { - unload_extcmode_commit(&Channelmode_Table[i]); + unload_extcmode_commit(cm); } + } } @@ -407,18 +594,29 @@ void unload_all_unused_extcmodes(void) * @param channel The channel * @param mode The mode character (eg: 'f') */ -char *cm_getparameter(Channel *channel, char mode) +const char *cm_getparameter(Channel *channel, char mode) { return GETPARAMHANDLERBYLETTER(mode)->get_param(GETPARASTRUCT(channel, mode)); } +/** Get parameter for a channel mode - special version for SJOIN. + * This version doesn't take a channel, but a mode.mode_params. + * It is only used by SJOIN and should not be used in 3rd party modules. + * @param p The list, eg oldmode.mode_params + * @param mode The mode letter + */ +const char *cm_getparameter_ex(void **p, char mode) +{ + return GETPARAMHANDLERBYLETTER(mode)->get_param(GETPARASTRUCTEX(p, mode)); +} + /** Set parameter for a channel mode. * @param channel The channel * @param mode The mode character (eg: 'f') * @param str The parameter string * @note Module users should not use this function directly, it is only used by MODE and SJOIN. */ -void cm_putparameter(Channel *channel, char mode, char *str) +void cm_putparameter(Channel *channel, char mode, const char *str) { GETPARASTRUCT(channel, mode) = GETPARAMHANDLERBYLETTER(mode)->put_param(GETPARASTRUCT(channel, mode), str); } @@ -433,25 +631,15 @@ void cm_freeparameter(Channel *channel, char mode) GETPARASTRUCT(channel, mode) = NULL; } -/** Get parameter for a channel mode - special version for SJOIN. - * This version doesn't take a channel, but a mode.extmodeparams. - * It is only used by SJOIN and should not be used in 3rd party modules. - * @param p The list, eg oldmode.extmodeparams - * @param mode The mode letter - */ -char *cm_getparameter_ex(void **p, char mode) -{ - return GETPARAMHANDLERBYLETTER(mode)->get_param(GETPARASTRUCTEX(p, mode)); -} /** Set parameter for a channel mode - special version for SJOIN. - * This version doesn't take a channel, but a mode.extmodeparams. + * This version doesn't take a channel, but a mode.mode_params. * It is only used by SJOIN and should not be used in 3rd party modules. - * @param p The list, eg oldmode.extmodeparams + * @param p The list, eg oldmode.mode_params * @param mode The mode letter * @param str The mode parameter string to set */ -void cm_putparameter_ex(void **p, char mode, char *str) +void cm_putparameter_ex(void **p, char mode, const char *str) { GETPARASTRUCTEX(p, mode) = GETPARAMHANDLERBYLETTER(mode)->put_param(GETPARASTRUCTEX(p, mode), str); } @@ -465,9 +653,9 @@ void cm_putparameter_ex(void **p, char mode, char *str) * @param what MODE_ADD / MODE_DEL (???) * @returns EX_ALLOW or EX_DENY */ -int extcmode_default_requirechop(Client *client, Channel *channel, char mode, char *para, int checkt, int what) +int extcmode_default_requirechop(Client *client, Channel *channel, char mode, const char *para, int checkt, int what) { - if (IsUser(client) && is_chan_op(client, channel)) + if (IsUser(client) && check_channel_access(client, channel, "oaq")) return EX_ALLOW; if (checkt == EXCHK_ACCESS_ERR) /* can only be due to being halfop */ sendnumeric(client, ERR_NOTFORHALFOPS, mode); @@ -483,9 +671,9 @@ int extcmode_default_requirechop(Client *client, Channel *channel, char mode, ch * @param what MODE_ADD / MODE_DEL (???) * @returns EX_ALLOW or EX_DENY */ -int extcmode_default_requirehalfop(Client *client, Channel *channel, char mode, char *para, int checkt, int what) +int extcmode_default_requirehalfop(Client *client, Channel *channel, char mode, const char *para, int checkt, int what) { - if (IsUser(client) && (is_chan_op(client, channel) || is_half_op(client, channel))) + if (IsUser(client) && (check_channel_access(client, channel, "oaq") || check_channel_access(client, channel, "h"))) return EX_ALLOW; return EX_DENY; } @@ -505,10 +693,10 @@ void extcmode_duplicate_paramlist(void **xi, void **xo) handler = CMP_GETHANDLERBYSLOT(i); if (!handler) continue; /* nothing there.. */ - inx = xi[handler->slot]; /* paramter data of input is here */ + inx = xi[handler->param_slot]; /* paramter data of input is here */ if (!inx) continue; /* not set */ - xo[handler->slot] = handler->dup_struct(inx); /* call dup_struct with that input and set the output param to that */ + xo[handler->param_slot] = handler->dup_struct(inx); /* call dup_struct with that input and set the output param to that */ } } @@ -525,8 +713,8 @@ void extcmode_free_paramlist(void **ar) handler = GETPARAMHANDLERBYSLOT(i); if (!handler) continue; /* nothing here... */ - handler->free_param(ar[handler->slot]); - ar[handler->slot] = NULL; + handler->free_param(ar[handler->param_slot]); + ar[handler->param_slot] = NULL; } } @@ -535,17 +723,450 @@ void extcmode_free_paramlist(void **ar) /** Internal function: returns 1 if the specified module has 1 or more extended channel modes registered */ int module_has_extcmode_param_mode(Module *mod) { - int i = 0; + Cmode *cm; - while (i < EXTCMODETABLESZ) - { - if ((Channelmode_Table[i].flag) && - (Channelmode_Table[i].owner == mod) && - (Channelmode_Table[i].paracount)) - { + for (cm=channelmodes; cm; cm = cm->next) + if ((cm->letter) && (cm->owner == mod) && (cm->paracount)) return 1; - } - i++; - } + return 0; } + +/** Channel member privileges - getting, setting, checking vhoaq status, etc. + * These functions get or set the access rights of channel members, such as +vhoaq. + * They can also convert between modes (vhoaq), prefixes and sjoin prefixes. + * @defgroup ChannelMember Channel members access privileges + * @{ + */ + +/** Retrieve channel access for a user on a channel, returns modes eg "qao". + * @param client The client + * @param channel The channel + * @returns The modes, sorted by high ranking to lower ranking, eg "qao". + * An empty string ("") is returned when not in the channel or no modes. + */ +const char *get_channel_access(Client *client, Channel *channel) +{ + Membership *mb; + + mb = find_membership_link(client->user->channel, channel); + if (!mb) + return ""; + return mb->member_modes; +} + +/** Check channel access for user. + * @param client The client to check + * @param channel The channel to check + * @param modes Which mode(s) to check for + * @returns If the client in channel has any of the modes set, 1 is returned. + * Otherwise 0 is returned, which is also the case if the user is + * not a user or is not in the channel at all. + */ +int check_channel_access(Client *client, Channel *channel, const char *modes) +{ + Membership *mb; + const char *p; + + if (!IsUser(client)) + return 0; /* eg server */ + + mb = find_membership_link(client->user->channel, channel); + if (!mb) + return 0; /* not a member */ + + for (p = mb->member_modes; *p; p++) + if (strchr(modes, *p)) + return 1; /* match new style */ + + return 0; /* nomatch */ +} + +/** Check channel access for user. + * @param client The client to check + * @param channel The channel to check + * @param modes Which mode(s) to check for + * @returns If the client in channel has any of the modes set, 1 is returned. + * Otherwise 0 is returned, which is also the case if the user is + * not a user or is not in the channel at all. + */ +int check_channel_access_membership(Membership *mb, const char *modes) +{ + const char *p; + + if (!mb) + return 0; + + for (p = mb->member_modes; *p; p++) + if (strchr(modes, *p)) + return 1; /* match new style */ + + return 0; /* nomatch */ +} + +/** Check channel access for user. + * @param client The client to check + * @param channel The channel to check + * @param modes Which mode(s) to check for + * @returns If the client in channel has any of the modes set, 1 is returned. + * Otherwise 0 is returned, which is also the case if the user is + * not a user or is not in the channel at all. + */ +int check_channel_access_member(Member *mb, const char *modes) +{ + const char *p; + + if (!mb) + return 0; + + for (p = mb->member_modes; *p; p++) + if (strchr(modes, *p)) + return 1; /* match new style */ + + return 0; /* nomatch */ +} + +/** Check channel access for user. + * @param current Flags currently set on the client (eg mb->member_modes) + * @param modes Which mode(s) to check for + * @returns If the client in channel has any of the modes set, 1 is returned. + * Otherwise 0 is returned. + */ +int check_channel_access_string(const char *current_modes, const char *modes) +{ + const char *p; + + for (p = current_modes; *p; p++) + if (strchr(modes, *p)) + return 1; + + return 0; /* nomatch */ +} + +/** Check channel access for user. + * @param current Flags currently set on the client (eg mb->member_modes) + * @param letter Which mode letter to check for + * @returns If the client in channel has any of the modes set, 1 is returned. + * Otherwise 0 is returned. + */ +int check_channel_access_letter(const char *current_modes, const char letter) +{ + return strchr(current_modes, letter) ? 1 : 0; +} + +Cmode *find_channel_mode_handler(char letter) +{ + Cmode *cm; + + for (cm=channelmodes; cm; cm = cm->next) + if (cm->letter == letter) + return cm; + return NULL; +} + +/** Is 'letter' a valid mode used for access/levels/ranks? (vhoaq and such) + * @param letter The channel mode letter to check, eg 'v' + * @returns 1 if valid, 0 if the channel mode does not exist or is not a level mode. + */ +int valid_channel_access_mode_letter(char letter) +{ + Cmode *cm; + + if ((cm = find_channel_mode_handler(letter)) && (cm->type == CMODE_MEMBER)) + return 1; + + return 0; +} + +void addlettertomstring(char *str, char letter) +{ + Cmode *cm; + int n; + int my_rank; + char *p; + + if (!(cm = find_channel_mode_handler(letter)) || (cm->type != CMODE_MEMBER)) + return; // should we BUG on this? if something makes it this far, it can never be good right? + + my_rank = cm->rank; + + n = strlen(str); + if (n >= MEMBERMODESLEN-1) + return; // panic! + + for (p = str; *p; p++) + { + cm = find_channel_mode_handler(*p); + if (!cm) + continue; /* wtf */ + if (cm->rank < my_rank) + { + /* We need to insert us here */ + n = strlen(p); + memmove(p+1, p, n+1); // +1 for NUL byte + *p = letter; + return; + } + } + /* We should be at the end */ + str[n] = letter; + str[n+1] = '\0'; +} + +void add_member_mode_fast(Member *mb, Membership *mbs, char letter) +{ + addlettertomstring(mb->member_modes, letter); + addlettertomstring(mbs->member_modes, letter); +} + +void del_member_mode_fast(Member *mb, Membership *mbs, char letter) +{ + delletterfromstring(mb->member_modes, letter); + delletterfromstring(mbs->member_modes, letter); +} + +int find_mbs(Client *client, Channel *channel, Member **mb, Membership **mbs) +{ + *mbs = NULL; + + if (!(*mb = find_member_link(channel->members, client))) + return 0; + + if (!(*mbs = find_membership_link(client->user->channel, channel))) + return 0; + + return 1; +} + +void add_member_mode(Client *client, Channel *channel, char letter) +{ + Member *mb; + Membership *mbs; + + if (!find_mbs(client, channel, &mb, &mbs)) + return; + + add_member_mode_fast(mb, mbs, letter); +} + +void del_member_mode(Client *client, Channel *channel, char letter) +{ + Member *mb; + Membership *mbs; + + if (!find_mbs(client, channel, &mb, &mbs)) + return; + + del_member_mode_fast(mb, mbs, letter); +} + +char sjoin_prefix_to_mode(char s) +{ + Cmode *cm; + + /* Filter this out early to avoid spurious results */ + if (s == '\0') + return '\0'; + + /* First the hardcoded list modes: */ + if (s == '&') + return 'b'; + if (s == '"') + return 'e'; + if (s == '\'') + return 'I'; + + /* Now the dynamic ones (+vhoaq): */ + for (cm=channelmodes; cm; cm = cm->next) + if ((cm->sjoin_prefix == s) && (cm->type == CMODE_MEMBER)) + return cm->letter; + + /* Not found */ + return '\0'; +} + +char mode_to_sjoin_prefix(char s) +{ + Cmode *cm; + + /* Filter this out early to avoid spurious results */ + if (s == '\0') + return '\0'; + + /* First the hardcoded list modes: */ + if (s == 'b') + return '&'; + if (s == 'e') + return '"'; + if (s == 'I') + return '\''; + + /* Now the dynamic ones (+vhoaq): */ + for (cm=channelmodes; cm; cm = cm->next) + if ((cm->letter == s) && (cm->type == CMODE_MEMBER)) + return cm->sjoin_prefix; + + /* Not found */ + return '\0'; +} + +const char *modes_to_sjoin_prefix(const char *modes) +{ + static char buf[MEMBERMODESLEN]; + const char *m; + char f; + + *buf = '\0'; + for (m = modes; *m; m++) + { + f = mode_to_sjoin_prefix(*m); + if (f) + strlcat_letter(buf, f, sizeof(buf)); + } + + return buf; +} + +char mode_to_prefix(char s) +{ + Cmode *cm; + + /* Filter this out early to avoid spurious results */ + if (s == '\0') + return '\0'; + + /* Now the dynamic ones (+vhoaq): */ + for (cm=channelmodes; cm; cm = cm->next) + if ((cm->letter == s) && (cm->type == CMODE_MEMBER)) + return cm->prefix; + + /* Not found */ + return '\0'; +} + +const char *modes_to_prefix(const char *modes) +{ + static char buf[MEMBERMODESLEN]; + const char *m; + char f; + + *buf = '\0'; + for (m = modes; *m; m++) + { + f = mode_to_prefix(*m); + if (f) + strlcat_letter(buf, f, sizeof(buf)); + } + + return buf; +} + +char prefix_to_mode(char s) +{ + Cmode *cm; + + /* Filter this out early to avoid spurious results */ + if (s == '\0') + return '\0'; + + /* Now the dynamic ones (+vhoaq): */ + for (cm=channelmodes; cm; cm = cm->next) + if ((cm->prefix == s) && (cm->type == CMODE_MEMBER)) + return cm->letter; + + /* Not found */ + return '\0'; +} + +char rank_to_mode(int rank) +{ + Cmode *cm; + for (cm=channelmodes; cm; cm = cm->next) + if ((cm->type == CMODE_MEMBER) && (cm->rank == rank)) + return cm->letter; + return '\0'; +} + +int mode_to_rank(char mode) +{ + Cmode *cm; + for (cm=channelmodes; cm; cm = cm->next) + if ((cm->type == CMODE_MEMBER) && (cm->letter == mode)) + return cm->rank; + return '\0'; +} + +int prefix_to_rank(char prefix) +{ + Cmode *cm; + for (cm=channelmodes; cm; cm = cm->next) + if ((cm->type == CMODE_MEMBER) && (cm->prefix == prefix)) + return cm->rank; + return '\0'; +} + +char rank_to_prefix(int rank) +{ + Cmode *cm; + for (cm=channelmodes; cm; cm = cm->next) + if ((cm->type == CMODE_MEMBER) && (cm->rank == rank)) + return cm->prefix; + return '\0'; +} + +char lowest_ranking_prefix(const char *prefix) +{ + const char *p; + int winning_rank = INT_MAX; + + for (p = prefix; *p; p++) + { + int rank = prefix_to_rank(*p); + if (rank < winning_rank) + winning_rank = rank; + } + if (winning_rank == INT_MAX) + return '\0'; /* No result */ + return rank_to_prefix(winning_rank); +} + +char lowest_ranking_mode(const char *mode) +{ + const char *p; + int winning_rank = INT_MAX; + + for (p = mode; *p; p++) + { + int rank = mode_to_rank(*p); + if (rank < winning_rank) + winning_rank = rank; + } + if (winning_rank == INT_MAX) + return '\0'; /* No result */ + return rank_to_mode(winning_rank); +} + +/** Generate all member modes that are equal or greater than 'modes'. + * Eg calling this with "o" would generate "oaq" with the default loaded modules. + * This is used in sendto_channel() to make multiple check_channel_access_member() + * calls more easy / faster. + */ +void channel_member_modes_generate_equal_or_greater(const char *modes, char *buf, size_t buflen) +{ + const char *p; + int rank; + Cmode *cm; + + *buf = '\0'; + + /* First we must grab the lowest ranking mode, eg 'vhoaq' results in rank for 'v' */ + rank = lowest_ranking_mode(modes); + if (!rank) + return; /* zero matches */ + + for (cm=channelmodes; cm; cm = cm->next) + if ((cm->type == CMODE_MEMBER) && (cm->rank >= rank)) + strlcat_letter(buf, cm->letter, buflen); +} + +/** @} */ diff --git a/src/api-clicap.c b/src/api-clicap.c index 79daa26..f760b90 100644 --- a/src/api-clicap.c +++ b/src/api-clicap.c @@ -79,7 +79,9 @@ long ClientCapabilityBit(const char *token) #ifdef DEBUGMODE if (!clicap) { - ircd_log(LOG_ERROR, "WARNING: ClientCapabilityBit(): unknown token '%s'", token); + unreal_log(ULOG_WARNING, "main", "BUG_CLIENTCAPABILITYBIT_UNKNOWN_TOKEN", NULL, + "[BUG] ClientCapabilityBit() check for unknown token: $token", + log_data_string("token", token)); } #endif @@ -102,7 +104,7 @@ long clicap_allocate_cap(void) ClientCapability *clicap; /* The first bit (v=1) is used by the "invert" marker */ - for (v=2; v < LONG_MAX; v = v * 2) + for (v=2; v; v <<= 1) { unsigned char found = 0; for (clicap = clicaps; clicap; clicap = clicap->next) @@ -162,8 +164,8 @@ ClientCapability *ClientCapabilityAdd(Module *module, ClientCapabilityInfo *clic v = clicap_allocate_cap(); if (v == 0) { - sendto_realops("ClientCapabilityAdd: out of space!!!"); - ircd_log(LOG_ERROR, "ClientCapabilityAdd: out of space!!!"); + unreal_log(ULOG_ERROR, "module", "CLIENTCAPABILITY_OUT_OF_SPACE", NULL, + "ClientCapabilityAdd: out of space!!!"); if (module) module->errorcode = MODERR_NOSPACE; return NULL; @@ -204,8 +206,9 @@ ClientCapability *ClientCapabilityAdd(Module *module, ClientCapabilityInfo *clic void unload_clicap_commit(ClientCapability *clicap) { /* This is an unusual operation, I think we should log it. */ - ircd_log(LOG_ERROR, "Unloading client capability '%s'", clicap->name); - sendto_realops("Unloading client capability '%s'", clicap->name); + unreal_log(ULOG_INFO, "module", "UNLOAD_CLICAP", NULL, + "Unloading client capability '$token'", + log_data_string("token", clicap->name)); /* NOTE: Stripping the CAP from local clients is done * in clicap_post_rehash(), so not here. @@ -245,7 +248,7 @@ void ClientCapabilityDel(ClientCapability *clicap) clicap->owner = NULL; } - if (loop.ircd_rehashing) + if (loop.rehashing) clicap->unloaded = 1; else unload_clicap_commit(clicap); @@ -263,7 +266,12 @@ void unload_all_unused_caps(void) } } -#define MAXCLICAPS 64 +#define ADVERTISEONLYCAPS 16 +/* Advertise only caps are not counted anywhere, this only provides space in rehash temporary storage arrays. + * If exceeded, the caps just won't be stored and will be re-added safely. --k4be + */ + +#define MAXCLICAPS ((int)(sizeof(long)*8 - 1 + ADVERTISEONLYCAPS)) /* how many cap bits will fit in `long`? */ static char *old_caps[MAXCLICAPS]; /**< List of old CAP names - used for /rehash */ int old_caps_proto[MAXCLICAPS]; /**< List of old CAP protocol values - used for /rehash */ @@ -279,7 +287,9 @@ void clicap_pre_rehash(void) { if (i == MAXCLICAPS) { - ircd_log(LOG_ERROR, "More than %d caps loaded - what???", MAXCLICAPS); + unreal_log(ULOG_ERROR, "module", "BUG_TOO_MANY_CLIENTCAPABILITIES", NULL, + "[BUG] clicap_pre_rehash: More than $count caps loaded - this should never happen", + log_data_integer("count", MAXCLICAPS)); break; } safe_strdup(old_caps[i], clicap->name); @@ -318,13 +328,13 @@ void clicap_post_rehash(void) int i; int found; - if (!loop.ircd_rehashing) + if (!loop.rehashing) return; /* First boot */ /* Let's deal with CAP DEL first: * Go through the old caps and see what's missing now. */ - for (i = 0; old_caps[i]; i++) + for (i = 0; i < MAXCLICAPS && old_caps[i]; i++) { name = old_caps[i]; found = 0; @@ -351,7 +361,7 @@ void clicap_post_rehash(void) { name = clicap->name; found = 0; - for (i = 0; old_caps[i]; i++) + for (i = 0; i < MAXCLICAPS && old_caps[i]; i++) { if (!strcmp(old_caps[i], name)) { @@ -368,6 +378,6 @@ void clicap_post_rehash(void) } /* Now free the old caps. */ - for (i = 0; old_caps[i]; i++) + for (i = 0; i < MAXCLICAPS && old_caps[i]; i++) safe_free(old_caps[i]); } diff --git a/src/api-command.c b/src/api-command.c index e32b5c7..f61e2bf 100644 --- a/src/api-command.c +++ b/src/api-command.c @@ -23,8 +23,8 @@ #include "unrealircd.h" /* Forward declarations */ -static Command *CommandAddInternal(Module *module, char *cmd, CmdFunc func, AliasCmdFunc aliasfunc, unsigned char params, int flags); -static RealCommand *add_Command_backend(char *cmd); +static Command *CommandAddInternal(Module *module, const char *cmd, CmdFunc func, AliasCmdFunc aliasfunc, unsigned char params, int flags); +static RealCommand *add_Command_backend(const char *cmd); /** @defgroup CommandAPI Command API * @{ @@ -32,7 +32,7 @@ static RealCommand *add_Command_backend(char *cmd); /** Returns 1 if the specified command exists */ -int CommandExists(char *name) +int CommandExists(const char *name) { RealCommand *p; @@ -53,7 +53,7 @@ int CommandExists(char *name) * @param flags Who may execute this command - one or more CMD_* flags * @returns The newly registered command, or NULL in case of error (eg: already exist) */ -Command *CommandAdd(Module *module, char *cmd, CmdFunc func, unsigned char params, int flags) +Command *CommandAdd(Module *module, const char *cmd, CmdFunc func, unsigned char params, int flags) { if (flags & CMD_ALIAS) { @@ -75,7 +75,7 @@ Command *CommandAdd(Module *module, char *cmd, CmdFunc func, unsigned char param * @param flags Who may execute this command - one or more CMD_* flags * @returns The newly registered command (alias), or NULL in case of error (eg: already exist) */ -Command *AliasAdd(Module *module, char *cmd, AliasCmdFunc aliasfunc, unsigned char params, int flags) +Command *AliasAdd(Module *module, const char *cmd, AliasCmdFunc aliasfunc, unsigned char params, int flags) { if (!(flags & CMD_ALIAS)) flags |= CMD_ALIAS; @@ -84,7 +84,7 @@ Command *AliasAdd(Module *module, char *cmd, AliasCmdFunc aliasfunc, unsigned ch /** @} */ -static Command *CommandAddInternal(Module *module, char *cmd, CmdFunc func, AliasCmdFunc aliasfunc, unsigned char params, int flags) +static Command *CommandAddInternal(Module *module, const char *cmd, CmdFunc func, AliasCmdFunc aliasfunc, unsigned char params, int flags) { Command *command = NULL; RealCommand *c; @@ -191,7 +191,7 @@ void CommandDel(Command *command) * @note If mtags is NULL then new message tags are created for the command * (and destroyed before return). */ -void do_cmd(Client *client, MessageTag *mtags, char *cmd, int parc, char *parv[]) +void do_cmd(Client *client, MessageTag *mtags, const char *cmd, int parc, const char *parv[]) { RealCommand *cmptr; @@ -233,7 +233,7 @@ void init_CommandHash(void) CommandAdd(NULL, MSG_MODULE, cmd_module, MAXPARA, CMD_USER); } -static RealCommand *add_Command_backend(char *cmd) +static RealCommand *add_Command_backend(const char *cmd) { RealCommand *c = safe_alloc(sizeof(RealCommand)); @@ -250,7 +250,7 @@ static RealCommand *add_Command_backend(char *cmd) */ /** Find a command by name and flags */ -RealCommand *find_command(char *cmd, int flags) +RealCommand *find_command(const char *cmd, int flags) { RealCommand *p; for (p = CommandHash[toupper(*cmd)]; p; p = p->next) { @@ -269,7 +269,7 @@ RealCommand *find_command(char *cmd, int flags) } /** Find a command by name (no access rights check) */ -RealCommand *find_command_simple(char *cmd) +RealCommand *find_command_simple(const char *cmd) { RealCommand *c; diff --git a/src/api-efunctions.c b/src/api-efunctions.c index 4412af1..d6dbfdc 100644 --- a/src/api-efunctions.c +++ b/src/api-efunctions.c @@ -34,47 +34,50 @@ static Efunction *Efunctions[MAXEFUNCTIONS]; /* Efunction objects (used for reha static EfunctionsList efunction_table[MAXEFUNCTIONS]; /* Efuncs */ -void (*do_join)(Client *client, int parc, char *parv[]); -void (*join_channel)(Channel *channel, Client *client, MessageTag *mtags, int flags); -int (*can_join)(Client *client, Channel *channel, char *key, char *parv[]); -void (*do_mode)(Channel *channel, Client *client, MessageTag *mtags, int parc, char *parv[], time_t sendts, int samode); -void (*set_mode)(Channel *channel, Client *client, int parc, char *parv[], u_int *pcount, - char pvar[MAXMODEPARAMS][MODEBUFLEN + 3], int bounce); -void (*cmd_umode)(Client *client, MessageTag *mtags, int parc, char *parv[]); -int (*register_user)(Client *client, char *nick, char *username, char *umode, char *virthost, char *ip); +void (*do_join)(Client *client, int parc, const char *parv[]); +void (*join_channel)(Channel *channel, Client *client, MessageTag *mtags, const char *member_modes); +int (*can_join)(Client *client, Channel *channel, const char *key, char **errmsg); +void (*do_mode)(Channel *channel, Client *client, MessageTag *mtags, int parc, const char *parv[], time_t sendts, int samode); +MultiLineMode *(*set_mode)(Channel *channel, Client *client, int parc, const char *parv[], u_int *pcount, + char pvar[MAXMODEPARAMS][MODEBUFLEN + 3]); +void (*set_channel_mode)(Channel *channel, char *modes, char *parameters); +void (*cmd_umode)(Client *client, MessageTag *mtags, int parc, const char *parv[]); +int (*register_user)(Client *client); int (*tkl_hash)(unsigned int c); char (*tkl_typetochar)(int type); int (*tkl_chartotype)(char c); -char *(*tkl_type_string)(TKL *tk); -TKL *(*tkl_add_serverban)(int type, char *usermask, char *hostmask, char *reason, char *setby, +const char *(*tkl_type_string)(TKL *tk); +const char *(*tkl_type_config_string)(TKL *tk); +char *(*tkl_uhost)(TKL *tkl, char *buf, size_t buflen, int options); +TKL *(*tkl_add_serverban)(int type, const char *usermask, const char *hostmask, const char *reason, const char *setby, time_t expire_at, time_t set_at, int soft, int flags); -TKL *(*tkl_add_nameban)(int type, char *name, int hold, char *reason, char *setby, +TKL *(*tkl_add_nameban)(int type, const char *name, int hold, const char *reason, const char *setby, time_t expire_at, time_t set_at, int flags); -TKL *(*tkl_add_spamfilter)(int type, unsigned short target, unsigned short action, Match *match, char *setby, +TKL *(*tkl_add_spamfilter)(int type, unsigned short target, unsigned short action, Match *match, const char *setby, time_t expire_at, time_t set_at, - time_t spamf_tkl_duration, char *spamf_tkl_reason, + time_t spamf_tkl_duration, const char *spamf_tkl_reason, int flags); -TKL *(*tkl_add_banexception)(int type, char *usermask, char *hostmask, char *reason, char *set_by, - time_t expire_at, time_t set_at, int soft, char *bantypes, int flags); +TKL *(*tkl_add_banexception)(int type, const char *usermask, const char *hostmask, const char *reason, const char *set_by, + time_t expire_at, time_t set_at, int soft, const char *bantypes, int flags); TKL *(*tkl_del_line)(TKL *tkl); void (*tkl_check_local_remove_shun)(TKL *tmp); int (*find_tkline_match)(Client *client, int skip_soft); int (*find_shun)(Client *client); int(*find_spamfilter_user)(Client *client, int flags); -TKL *(*find_qline)(Client *client, char *nick, int *ishold); +TKL *(*find_qline)(Client *client, const char *nick, int *ishold); TKL *(*find_tkline_match_zap)(Client *client); -void (*tkl_stats)(Client *client, int type, char *para, int *cnt); +void (*tkl_stats)(Client *client, int type, const char *para, int *cnt); void (*tkl_sync)(Client *client); -void (*cmd_tkl)(Client *client, MessageTag *mtags, int parc, char *parv[]); -int (*place_host_ban)(Client *client, BanAction action, char *reason, long duration); -int (*match_spamfilter)(Client *client, char *str_in, int type, char *cmd, char *target, int flags, TKL **rettk); -int (*match_spamfilter_mtags)(Client *client, MessageTag *mtags, char *cmd); +void (*cmd_tkl)(Client *client, MessageTag *mtags, int parc, const char *parv[]); +int (*place_host_ban)(Client *client, BanAction action, const char *reason, long duration); +int (*match_spamfilter)(Client *client, const char *str_in, int type, const char *cmd, const char *target, int flags, TKL **rettk); +int (*match_spamfilter_mtags)(Client *client, MessageTag *mtags, const char *cmd); int (*join_viruschan)(Client *client, TKL *tk, int type); -unsigned char *(*StripColors)(unsigned char *text); -const char *(*StripControlCodes)(unsigned char *text); -void (*spamfilter_build_user_string)(char *buf, char *nick, Client *client); +const char *(*StripColors)(const char *text); +const char *(*StripControlCodes)(const char *text); +void (*spamfilter_build_user_string)(char *buf, const char *nick, Client *client); void (*send_protoctl_servers)(Client *client, int response); -int (*verify_link)(Client *client, char *servername, ConfigItem_link **link_out); +int (*verify_link)(Client *client, ConfigItem_link **link_out); void (*introduce_user)(Client *to, Client *client); void (*send_server_message)(Client *client); void (*broadcast_md_client)(ModDataInfo *mdi, Client *client, ModData *md); @@ -82,37 +85,40 @@ void (*broadcast_md_channel)(ModDataInfo *mdi, Channel *channel, ModData *md); void (*broadcast_md_member)(ModDataInfo *mdi, Channel *channel, Member *m, ModData *md); void (*broadcast_md_membership)(ModDataInfo *mdi, Client *client, Membership *m, ModData *md); int (*check_banned)(Client *client, int exitflags); -int (*check_deny_version)(Client *client, char *software, int protocol, char *flags); -void (*broadcast_md_client_cmd)(Client *except, Client *sender, Client *acptr, char *varname, char *value); -void (*broadcast_md_channel_cmd)(Client *except, Client *sender, Channel *channel, char *varname, char *value); -void (*broadcast_md_member_cmd)(Client *except, Client *sender, Channel *channel, Client *acptr, char *varname, char *value); -void (*broadcast_md_membership_cmd)(Client *except, Client *sender, Client *acptr, Channel *channel, char *varname, char *value); +int (*check_deny_version)(Client *client, const char *software, int protocol, const char *flags); +void (*broadcast_md_client_cmd)(Client *except, Client *sender, Client *acptr, const char *varname, const char *value); +void (*broadcast_md_channel_cmd)(Client *except, Client *sender, Channel *channel, const char *varname, const char *value); +void (*broadcast_md_member_cmd)(Client *except, Client *sender, Channel *channel, Client *acptr, const char *varname, const char *value); +void (*broadcast_md_membership_cmd)(Client *except, Client *sender, Client *acptr, Channel *channel, const char *varname, const char *value); +void (*moddata_add_s2s_mtags)(Client *client, MessageTag **mtags); +void (*moddata_extract_s2s_mtags)(Client *client, MessageTag *mtags); void (*send_moddata_client)(Client *srv, Client *client); void (*send_moddata_channel)(Client *srv, Channel *channel); void (*send_moddata_members)(Client *srv); void (*broadcast_moddata_client)(Client *client); -int (*match_user)(char *rmask, Client *client, int options); +int (*match_user)(const char *rmask, Client *client, int options); void (*userhost_changed)(Client *client); void (*userhost_save_current)(Client *client); void (*send_join_to_local_users)(Client *client, Channel *channel, MessageTag *mtags); int (*do_nick_name)(char *nick); int (*do_remote_nick_name)(char *nick); -char *(*charsys_get_current_languages)(void); +const char *(*charsys_get_current_languages)(void); void (*broadcast_sinfo)(Client *client, Client *to, Client *except); +void (*connect_server)(ConfigItem_link *aconf, Client *by, struct hostent *hp); void (*parse_message_tags)(Client *client, char **str, MessageTag **mtag_list); -char *(*mtags_to_string)(MessageTag *m, Client *client); -int (*can_send_to_channel)(Client *client, Channel *channel, char **msgtext, char **errmsg, int notice); +const char *(*mtags_to_string)(MessageTag *m, Client *client); +int (*can_send_to_channel)(Client *client, Channel *channel, const char **msgtext, const char **errmsg, int notice); void (*broadcast_md_globalvar)(ModDataInfo *mdi, ModData *md); -void (*broadcast_md_globalvar_cmd)(Client *except, Client *sender, char *varname, char *value); -int (*tkl_ip_hash)(char *ip); +void (*broadcast_md_globalvar_cmd)(Client *except, Client *sender, const char *varname, const char *value); +int (*tkl_ip_hash)(const char *ip); int (*tkl_ip_hash_type)(int type); -void (*sendnotice_tkl_del)(char *removed_by, TKL *tkl); +void (*sendnotice_tkl_del)(const char *removed_by, TKL *tkl); void (*sendnotice_tkl_add)(TKL *tkl); void (*free_tkl)(TKL *tkl); -TKL *(*find_tkl_serverban)(int type, char *usermask, char *hostmask, int softban); -TKL *(*find_tkl_banexception)(int type, char *usermask, char *hostmask, int softban); -TKL *(*find_tkl_nameban)(int type, char *name, int hold); -TKL *(*find_tkl_spamfilter)(int type, char *match_string, unsigned short action, unsigned short target); +TKL *(*find_tkl_serverban)(int type, const char *usermask, const char *hostmask, int softban); +TKL *(*find_tkl_banexception)(int type, const char *usermask, const char *hostmask, int softban); +TKL *(*find_tkl_nameban)(int type, const char *name, int hold); +TKL *(*find_tkl_spamfilter)(int type, const char *match_string, unsigned short action, unsigned short target); int (*find_tkl_exception)(int ban_type, Client *client); int (*is_silenced)(Client *client, Client *acptr); int (*del_silence)(Client *client, const char *mask); @@ -120,9 +126,17 @@ int (*add_silence)(Client *client, const char *mask, int senderr); void *(*labeled_response_save_context)(void); void (*labeled_response_set_context)(void *ctx); void (*labeled_response_force_end)(void); -void (*kick_user)(MessageTag *mtags, Channel *channel, Client *client, Client *victim, char *comment); +void (*kick_user)(MessageTag *mtags, Channel *channel, Client *client, Client *victim, const char *comment); +int (*watch_add)(const char *nick, Client *client, int flags); +int (*watch_del)(const char *nick, Client *client, int flags); +int (*watch_del_list)(Client *client, int flags); +Watch *(*watch_get)(const char *nick); +int (*watch_check)(Client *client, int reply, int (*watch_notify)(Client *client, Watch *watch, Link *lp, int event)); +void (*do_unreal_log_remote_deliver)(LogLevel loglevel, const char *subsystem, const char *event_id, MultiLine *msg, const char *json_serialized); +char *(*get_chmodes_for_user)(Client *client, const char *flags); +WhoisConfigDetails (*whois_get_policy)(Client *client, Client *target, const char *name); -Efunction *EfunctionAddMain(Module *module, EfunctionType eftype, int (*func)(), void (*vfunc)(), void *(*pvfunc)(), char *(*cfunc)()) +Efunction *EfunctionAddMain(Module *module, EfunctionType eftype, int (*func)(), void (*vfunc)(), void *(*pvfunc)(), char *(*stringfunc)(), const char *(*conststringfunc)()) { Efunction *p; @@ -140,8 +154,10 @@ Efunction *EfunctionAddMain(Module *module, EfunctionType eftype, int (*func)(), p->func.voidfunc = vfunc; if (pvfunc) p->func.pvoidfunc = pvfunc; - if (cfunc) - p->func.pcharfunc = cfunc; + if (stringfunc) + p->func.stringfunc = stringfunc; + if (conststringfunc) + p->func.conststringfunc = conststringfunc; p->type = eftype; p->owner = module; AddListItem(p, Efunctions[eftype]); @@ -256,7 +272,9 @@ void efunctions_switchover(void) continue; if (!efunction_table[i].funcptr) { - ircd_log(LOG_ERROR, "[BUG] efunctions_switchover(): someone forgot to initialize the function table for efunc %d", i); + unreal_log(ULOG_FATAL, "module", "BUG_EFUNCTIONS_SWITCHOVER", NULL, + "[BUG] efunctions_switchover(): someone forgot to initialize the function table for efunc $efunction_number", + log_data_integer("efunction_number", i)); abort(); } *efunction_table[i].funcptr = e->func.voidfunc; /* This is the new one. */ @@ -273,10 +291,19 @@ void efunctions_switchover(void) } } -#define efunc_init_function(what, func, default_func) efunc_init_function_(what, #func, (void *)&func, default_func) +#define efunc_init_function(what, func, default_func) efunc_init_function_(what, #func, (void *)&func, (void *)default_func) void efunc_init_function_(EfunctionType what, char *name, void *func, void *default_func) { + if (what >= MAXEFUNCTIONS) + { + /* increase MAXEFUNCTIONS if you ever encounter that --k4be */ + unreal_log(ULOG_FATAL, "module", "BUG_EFUNC_INIT_FUNCTION_TOO_MANY", NULL, + "Too many efunctions! ($efunctions_request > $efunctions_max)", + log_data_integer("efunctions_request", what), + log_data_integer("efunctions_max", MAXEFUNCTIONS)); + abort(); + } safe_strdup(efunction_table[what].name, name); efunction_table[what].funcptr = func; efunction_table[what].deffunc = default_func; @@ -290,6 +317,7 @@ void efunctions_init(void) efunc_init_function(EFUNC_CAN_JOIN, can_join, NULL); efunc_init_function(EFUNC_DO_MODE, do_mode, NULL); efunc_init_function(EFUNC_SET_MODE, set_mode, NULL); + efunc_init_function(EFUNC_SET_CHANNEL_MODE, set_channel_mode, NULL); efunc_init_function(EFUNC_CMD_UMODE, cmd_umode, NULL); efunc_init_function(EFUNC_REGISTER_USER, register_user, NULL); efunc_init_function(EFUNC_TKL_HASH, tkl_hash, NULL); @@ -327,6 +355,8 @@ void efunctions_init(void) efunc_init_function(EFUNC_BROADCAST_MD_CHANNEL_CMD, broadcast_md_channel_cmd, NULL); efunc_init_function(EFUNC_BROADCAST_MD_MEMBER_CMD, broadcast_md_member_cmd, NULL); efunc_init_function(EFUNC_BROADCAST_MD_MEMBERSHIP_CMD, broadcast_md_membership_cmd, NULL); + efunc_init_function(EFUNC_MODDATA_ADD_S2S_MTAGS, moddata_add_s2s_mtags, NULL); + efunc_init_function(EFUNC_MODDATA_EXTRACT_S2S_MTAGS, moddata_extract_s2s_mtags, NULL); efunc_init_function(EFUNC_SEND_MODDATA_CLIENT, send_moddata_client, NULL); efunc_init_function(EFUNC_SEND_MODDATA_CHANNEL, send_moddata_channel, NULL); efunc_init_function(EFUNC_SEND_MODDATA_MEMBERS, send_moddata_members, NULL); @@ -339,10 +369,12 @@ void efunctions_init(void) efunc_init_function(EFUNC_DO_REMOTE_NICK_NAME, do_remote_nick_name, NULL); efunc_init_function(EFUNC_CHARSYS_GET_CURRENT_LANGUAGES, charsys_get_current_languages, NULL); efunc_init_function(EFUNC_BROADCAST_SINFO, broadcast_sinfo, NULL); + efunc_init_function(EFUNC_CONNECT_SERVER, connect_server, NULL); efunc_init_function(EFUNC_PARSE_MESSAGE_TAGS, parse_message_tags, &parse_message_tags_default_handler); efunc_init_function(EFUNC_MTAGS_TO_STRING, mtags_to_string, &mtags_to_string_default_handler); efunc_init_function(EFUNC_TKL_CHARTOTYPE, tkl_chartotype, NULL); efunc_init_function(EFUNC_TKL_TYPE_STRING, tkl_type_string, NULL); + efunc_init_function(EFUNC_TKL_TYPE_CONFIG_STRING, tkl_type_config_string, NULL); efunc_init_function(EFUNC_CAN_SEND_TO_CHANNEL, can_send_to_channel, NULL); efunc_init_function(EFUNC_BROADCAST_MD_GLOBALVAR, broadcast_md_globalvar, NULL); efunc_init_function(EFUNC_BROADCAST_MD_GLOBALVAR_CMD, broadcast_md_globalvar_cmd, NULL); @@ -365,4 +397,13 @@ void efunctions_init(void) efunc_init_function(EFUNC_LABELED_RESPONSE_SET_CONTEXT, labeled_response_set_context, labeled_response_set_context_default_handler); efunc_init_function(EFUNC_LABELED_RESPONSE_FORCE_END, labeled_response_force_end, labeled_response_force_end_default_handler); efunc_init_function(EFUNC_KICK_USER, kick_user, NULL); + efunc_init_function(EFUNC_WATCH_ADD, watch_add, NULL); + efunc_init_function(EFUNC_WATCH_DEL, watch_del, NULL); + efunc_init_function(EFUNC_WATCH_DEL_LIST, watch_del_list, NULL); + efunc_init_function(EFUNC_WATCH_GET, watch_get, NULL); + efunc_init_function(EFUNC_WATCH_CHECK, watch_check, NULL); + efunc_init_function(EFUNC_TKL_UHOST, tkl_uhost, NULL); + efunc_init_function(EFUNC_DO_UNREAL_LOG_REMOTE_DELIVER, do_unreal_log_remote_deliver, do_unreal_log_remote_deliver_default_handler); + efunc_init_function(EFUNC_GET_CHMODES_FOR_USER, get_chmodes_for_user, NULL); + efunc_init_function(EFUNC_WHOIS_GET_POLICY, whois_get_policy, NULL); } diff --git a/src/api-event.c b/src/api-event.c index 8c328d2..799edb7 100644 --- a/src/api-event.c +++ b/src/api-event.c @@ -45,7 +45,7 @@ extern EVENT(unrealdb_expire_secret_cache); * can be later, in case of high load, in very extreme cases even up to 1000 or 2000 * msec later but that would be very unusual. Just saying, it's not a guarantee.. */ -Event *EventAdd(Module *module, char *name, vFP event, void *data, long every_msec, int count) +Event *EventAdd(Module *module, const char *name, vFP event, void *data, long every_msec, int count) { Event *newevent; @@ -56,16 +56,6 @@ Event *EventAdd(Module *module, char *name, vFP event, void *data, long every_ms return NULL; } - if ((every_msec < 100) && (count == 0)) - { - ircd_log(LOG_ERROR, "[BUG] EventAdd() '%s' from module '%s' with suspiciously low every_msec value (%ld). " - "Note that it is in milliseconds now (1000 = 1 second)!", - name, - module ? module->header->name : "???", - every_msec); - every_msec = 100; - } - newevent = safe_alloc(sizeof(Event)); safe_strdup(newevent->name, name); newevent->count = count; @@ -128,12 +118,16 @@ static void EventDelReal(Event *e) { if (!e->deleted) { - ircd_log(LOG_ERROR, "EventDelReal called while e->deleted is 0. This cannot happen. Event name: %s.", e->name); + unreal_log(ULOG_FATAL, "module", "BUG_EVENTDELREAL_ZERO", NULL, + "[BUG] EventDelReal called while e->deleted is 0. This cannot happen. Event name: $event_name", + log_data_string("event_name", e->name)); abort(); } if (e->owner) { - ircd_log(LOG_ERROR, "EventDelReal called while e->owner is non-NULL. This cannot happen. Event name: %s.", e->name); + unreal_log(ULOG_FATAL, "module", "BUG_EVENTDELREAL_NULL", NULL, + "[BUG] EventDelReal called while e->owner is NULL. This cannot happen. Event name: $event_name", + log_data_string("event_name", e->name)); abort(); } safe_free(e->name); @@ -153,7 +147,7 @@ static void CleanupEvents(void) } } -Event *EventFind(char *name) +Event *EventFind(const char *name) { Event *eventptr; @@ -173,19 +167,7 @@ int EventMod(Event *event, EventInfo *mods) } if (mods->flags & EMOD_EVERY) - { - if (mods->every_msec < 100) - { - ircd_log(LOG_ERROR, "[BUG] EventMod() for '%s' from module '%s' with suspiciously low every_msec value (%lld). " - "Note that it is in milliseconds now (1000 = 1 second)!", - event->name, - event->owner ? event->owner->header->name : "???", - (long long)mods->every_msec); - mods->every_msec = 100; - } - event->every_msec = mods->every_msec; - } if (mods->flags & EMOD_HOWMANY) event->count = mods->count; if (mods->flags & EMOD_NAME) @@ -240,7 +222,7 @@ void SetupEvents(void) EventAdd(NULL, "check_pings", check_pings, NULL, 1000, 0); EventAdd(NULL, "check_deadsockets", check_deadsockets, NULL, 1000, 0); EventAdd(NULL, "handshake_timeout", handshake_timeout, NULL, 1000, 0); - EventAdd(NULL, "try_connections", try_connections, NULL, 2000, 0); EventAdd(NULL, "tls_check_expiry", tls_check_expiry, NULL, (86400/2)*1000, 0); EventAdd(NULL, "unrealdb_expire_secret_cache", unrealdb_expire_secret_cache, NULL, 61000, 0); + EventAdd(NULL, "throttling_check_expire", throttling_check_expire, NULL, 1000, 0); } diff --git a/src/api-extban.c b/src/api-extban.c index fdf7f8b..a750689 100644 --- a/src/api-extban.c +++ b/src/api-extban.c @@ -22,144 +22,285 @@ #include "unrealircd.h" -Extban MODVAR ExtBan_Table[EXTBANTABLESZ]; /* this should be fastest */ -unsigned MODVAR short ExtBan_highest = 0; +/** List of all extbans, their handlers, etc */ +MODVAR Extban *extbans = NULL; void set_isupport_extban(void) { - int i; - char extbanstr[EXTBANTABLESZ+1], *m; + char extbanstr[512]; + Extban *e; + char *p = extbanstr; + + for (e = extbans; e; e = e->next) + *p++ = e->letter; + *p = '\0'; - m = extbanstr; - for (i = 0; i <= ExtBan_highest; i++) - { - if (ExtBan_Table[i].flag) - *m++ = ExtBan_Table[i].flag; - } - *m = 0; ISupportSetFmt(NULL, "EXTBAN", "~,%s", extbanstr); } -Extban *findmod_by_bantype(char c) +Extban *findmod_by_bantype(const char *str, const char **remainder) { -int i; + Extban *e; + int ban_name_length; + const char *p = strchr(str, ':'); - for (i=0; i <= ExtBan_highest; i++) - if (ExtBan_Table[i].flag == c) - return &ExtBan_Table[i]; + if (!p || !p[1]) + { + if (remainder) + *remainder = NULL; + return NULL; + } + if (remainder) + *remainder = p+1; + + ban_name_length = p - str - 1; + + for (e=extbans; e; e = e->next) + { + if ((ban_name_length == 1) && (e->letter == str[1])) + return e; + if (e->name) + { + int namelen = strlen(e->name); + if ((namelen == ban_name_length) && !strncmp(e->name, str+1, namelen)) + return e; + } + } return NULL; } +/* Check if this is a valid extended ban name */ +int is_valid_extban_name(const char *p) +{ + if (!*p) + return 0; /* empty name */ + for (; *p; p++) + if (!isalnum(*p) && !strchr("_-", *p)) + return 0; + return 1; +} + +static void extban_add_sorted(Extban *n) +{ + Extban *m; + + if (extbans == NULL) + { + extbans = n; + return; + } + + for (m = extbans; m; m = m->next) + { + if (m->letter == '\0') + abort(); + if (sort_character_lowercase_before_uppercase(n->letter, m->letter)) + { + /* Insert us before */ + if (m->prev) + m->prev->next = n; + else + extbans = n; /* new head */ + n->prev = m->prev; + + n->next = m; + m->prev = n; + return; + } + if (!m->next) + { + /* Append us at end */ + m->next = n; + n->prev = m; + return; + } + } +} + Extban *ExtbanAdd(Module *module, ExtbanInfo req) { - int slot; + Extban *e; + int existing = 0; - if (findmod_by_bantype(req.flag)) + if (!req.name) { - if (module) - module->errorcode = MODERR_EXISTS; - return NULL; - } - - /* TODO: perhaps some sanity checking on a-zA-Z0-9? */ - for (slot = 0; slot < EXTBANTABLESZ; slot++) - if (ExtBan_Table[slot].flag == '\0') - break; - if (slot >= EXTBANTABLESZ - 1) - { - if (module) - module->errorcode = MODERR_NOSPACE; + module->errorcode = MODERR_INVALID; + unreal_log(ULOG_ERROR, "module", "EXTBANADD_API_ERROR", NULL, + "ExtbanAdd(): name must be specified for ban (new in U6). Module: $module_name", + log_data_string("module_name", module->header->name)); return NULL; } - ExtBan_Table[slot].flag = req.flag; - ExtBan_Table[slot].is_ok = req.is_ok; - ExtBan_Table[slot].conv_param = req.conv_param; - ExtBan_Table[slot].is_banned = req.is_banned; - ExtBan_Table[slot].owner = module; - ExtBan_Table[slot].options = req.options; + + if (!req.is_banned_events && req.is_banned) + { + module->errorcode = MODERR_INVALID; + unreal_log(ULOG_ERROR, "module", "EXTBANADD_API_ERROR", NULL, + "ExtbanAdd(): module must indicate via .is_banned_events on which BANCHK_* " + "events to listen on (new in U6). Module: $module_name", + log_data_string("module_name", module->header->name)); + return NULL; + } + + if (!isalnum(req.letter)) + { + module->errorcode = MODERR_INVALID; + unreal_log(ULOG_ERROR, "module", "EXTBANADD_API_ERROR", NULL, + "ExtbanAdd(): module tried to add extban which is not alphanumeric. " + "Module: $module_name", + log_data_string("module_name", module->header->name)); + return NULL; + } + + if (!is_valid_extban_name(req.name)) + { + module->errorcode = MODERR_INVALID; + unreal_log(ULOG_ERROR, "module", "EXTBANADD_API_ERROR", NULL, + "ExtbanAdd(): module tried to add extban with an invalid name ($extban_name). " + "Module: $module_name", + log_data_string("module_name", module->header->name), + log_data_string("extban_name", req.name)); + return NULL; + } + + for (e=extbans; e; e = e->next) + { + if (e->letter == req.letter) + { + if (e->unloaded) + { + e->unloaded = 0; + existing = 1; + break; + } else { + if (module) + module->errorcode = MODERR_EXISTS; + return NULL; + } + } + } + + if (!e) + { + /* Not found, create */ + e = safe_alloc(sizeof(Extban)); + e->letter = req.letter; + extban_add_sorted(e); + } + e->letter = req.letter; + safe_strdup(e->name, req.name); + e->is_ok = req.is_ok; + e->conv_param = req.conv_param; + e->is_banned = req.is_banned; + e->is_banned_events = req.is_banned_events; + e->owner = module; + e->options = req.options; if (module) { ModuleObject *banobj = safe_alloc(sizeof(ModuleObject)); - banobj->object.extban = &ExtBan_Table[slot]; + banobj->object.extban = e; banobj->type = MOBJ_EXTBAN; AddListItem(banobj, module->objects); module->errorcode = MODERR_NOERROR; } - ExtBan_highest = slot; set_isupport_extban(); - return &ExtBan_Table[slot]; + return e; } -void ExtbanDel(Extban *eb) +static void unload_extban_commit(Extban *e) { - /* Just zero it all away.. */ + /* Should we mass unban everywhere? + * Hmmm. Not needed per se, user can always unset + * themselves. Leaning towards no atm. + */ + // noop - if (eb->owner) + /* Then unload the extban */ + DelListItem(e, extbans); + safe_free(e); + set_isupport_extban(); +} + +void ExtbanDel(Extban *e) +{ + /* Always free the module object */ + if (e->owner) { ModuleObject *banobj; - for (banobj = eb->owner->objects; banobj; banobj = banobj->next) + for (banobj = e->owner->objects; banobj; banobj = banobj->next) { - if (banobj->type == MOBJ_EXTBAN && banobj->object.extban == eb) + if (banobj->type == MOBJ_EXTBAN && banobj->object.extban == e) { - DelListItem(banobj, eb->owner->objects); + DelListItem(banobj, e->owner->objects); safe_free(banobj); break; } } } - memset(eb, 0, sizeof(Extban)); - set_isupport_extban(); - /* Hmm do we want to go trough all chans and remove the bans? - * I would say 'no' because perhaps we are just reloading, - * and else.. well... screw them? - */ -} -/* NOTE: the routines below can safely assume the ban has at - * least the '~t:' part (t=type). -- Syzop - */ + /* Whether we can actually (already) free the Extban, it depends... */ + if (loop.rehashing) + e->unloaded = 1; + else + unload_extban_commit(e); +} /** General is_ok for n!u@h stuff that also deals with recursive extbans. */ -int extban_is_ok_nuh_extban(Client *client, Channel* channel, char *para, int checkt, int what, int what2) +int extban_is_ok_nuh_extban(BanContext *b) { - char *mask = (para + 3); - Extban *p = NULL; int isok; static int extban_is_ok_recursion = 0; /* Mostly copied from clean_ban_mask - but note MyUser checks aren't needed here: extban->is_ok() according to cmd_mode isn't called for nonlocal. */ - if (is_extended_ban(mask)) + if (is_extended_ban(b->banstr)) { - if (extban_is_ok_recursion) - return 0; /* Fail: more than one stacked extban */ + const char *nextbanstr; + Extban *extban = NULL; - if ((checkt == EXBCHK_PARAM) && RESTRICT_EXTENDEDBANS && !ValidatePermissionsForPath("immune:restrict-extendedbans",client,NULL,channel,NULL)) + /* We're dealing with a stacked extended ban. + * Rules: + * 1) You can only stack once, so: ~x:~y:something and not ~x:~y:~z... + * 2) The second item may never be an action modifier, nor have the + * EXTBOPT_NOSTACKCHILD letter set (for things like a textban). + */ + + if (extban_is_ok_recursion) + return 0; /* Rule #1 violation (more than one stacked extban) */ + + if ((b->is_ok_check == EXBCHK_PARAM) && RESTRICT_EXTENDEDBANS && !ValidatePermissionsForPath("immune:restrict-extendedbans",b->client,NULL,b->channel,NULL)) { /* Test if this specific extban has been disabled. * (We can be sure RESTRICT_EXTENDEDBANS is not *. Else this extended ban wouldn't be happening at all.) */ - if (strchr(RESTRICT_EXTENDEDBANS, mask[1])) + if (strchr(RESTRICT_EXTENDEDBANS, b->banstr[1])) { - sendnotice(client, "Setting/removing of extended bantypes '%s' has been disabled.", RESTRICT_EXTENDEDBANS); + sendnotice(b->client, "Setting/removing of extended bantypes '%s' has been disabled.", RESTRICT_EXTENDEDBANS); return 0; /* Fail */ } } - p = findmod_by_bantype(mask[1]); - if (!p) + extban = findmod_by_bantype(b->banstr, &nextbanstr); + if (!extban) { - if (what == MODE_DEL) + if (b->what == MODE_DEL) { return 1; /* Always allow killing unknowns. */ } return 0; /* Don't add unknown extbans. */ } - /* Now we have to ask the stacked extban if it's ok. */ - if (p->is_ok) + + if ((extban->options & EXTBOPT_ACTMODIFIER) || (extban->options & EXTBOPT_NOSTACKCHILD)) { + /* Rule #2 violation */ + return 0; + } + + /* Now we have to ask the stacked extban if it's ok. */ + if (extban->is_ok) + { + b->banstr = nextbanstr; extban_is_ok_recursion++; - isok = p->is_ok(client, channel, mask, checkt, what, what2); + isok = extban->is_ok(b); extban_is_ok_recursion--; return isok; } @@ -171,19 +312,15 @@ int extban_is_ok_nuh_extban(Client *client, Channel* channel, char *para, int ch * to ensure the parameter is nick!user@host. * most of the code is just copied from clean_ban_mask. */ -char *extban_conv_param_nuh(char *para) +const char *extban_conv_param_nuh(BanContext *b, Extban *extban) { char *cp, *user, *host, *mask, *ret = NULL; static char retbuf[USERLEN + NICKLEN + HOSTLEN + 32]; char tmpbuf[USERLEN + NICKLEN + HOSTLEN + 32]; - char pfix[8]; - if (strlen(para)<3) - return NULL; /* normally impossible */ - - strlcpy(tmpbuf, para, sizeof(retbuf)); - mask = tmpbuf + 3; - strlcpy(pfix, tmpbuf, mask - tmpbuf + 1); + /* Work on a copy */ + strlcpy(tmpbuf, b->banstr, sizeof(retbuf)); + mask = tmpbuf; if (!*mask) return NULL; /* empty extban */ @@ -202,13 +339,13 @@ char *extban_conv_param_nuh(char *para) if (!ret) ret = make_nick_user_host(trim_str(cp,NICKLEN), trim_str(user,USERLEN), trim_str(host,HOSTLEN)); - ircsnprintf(retbuf, sizeof(retbuf), "%s%s", pfix, ret); + strlcpy(retbuf, ret, sizeof(retbuf)); return retbuf; } /** conv_param to deal with stacked extbans. */ -char *extban_conv_param_nuh_or_extban(char *para) +const char *extban_conv_param_nuh_or_extban(BanContext *b, Extban *self_extban) { #if (USERLEN + NICKLEN + HOSTLEN + 32) > 256 #error "wtf?" @@ -217,83 +354,77 @@ char *extban_conv_param_nuh_or_extban(char *para) static char printbuf[256]; char *mask; char tmpbuf[USERLEN + NICKLEN + HOSTLEN + 32]; - char bantype = para[1]; - char *ret = NULL; - Extban *p = NULL; + const char *ret = NULL; + const char *nextbanstr; + Extban *extban = NULL; static int extban_recursion = 0; - if ((strlen(para)>3) && is_extended_ban(para+3)) - { - /* We're dealing with a stacked extended ban. - * Rules: - * 1) You can only stack once, so: ~x:~y:something and not ~x:~y:~z... - * 2) The first item must be an action modifier, such as ~q/~n/~j - * 3) The second item may never be an action modifier, nor have the - * EXTBOPT_NOSTACKCHILD flag set (for things like a textban). - */ - - /* Rule #1. Yes the recursion check is also in extban_is_ok_nuh_extban, - * but it's possible to get here without the is_ok() function ever - * being called (think: non-local client). And no, don't delete it - * there either. It needs to be in BOTH places. -- Syzop - */ - if (extban_recursion) - return NULL; + if (!is_extended_ban(b->banstr)) + return extban_conv_param_nuh(b, self_extban); - /* Rule #2 */ - p = findmod_by_bantype(para[1]); - if (p && !(p->options & EXTBOPT_ACTMODIFIER)) - { - /* Rule #2 violation */ - return NULL; - } - - strlcpy(tmpbuf, para, sizeof(tmpbuf)); - mask = tmpbuf + 3; - /* Already did restrict-extended bans check. */ - p = findmod_by_bantype(mask[1]); - if (!p) - { - /* Handling unknown bantypes in is_ok. Assume that it's ok here. */ - return para; - } - if ((p->options & EXTBOPT_ACTMODIFIER) || (p->options & EXTBOPT_NOSTACKCHILD)) - { - /* Rule #3 violation */ - return NULL; - } - - if (p->conv_param) - { - extban_recursion++; - ret = p->conv_param(mask); - extban_recursion--; - if (ret) - { - /* - * If bans are stacked, then we have to use two buffers - * to prevent ircsnprintf() from going into a loop. - */ - ircsnprintf(printbuf, sizeof(printbuf), "~%c:%s", bantype, ret); /* Make sure our extban prefix sticks. */ - memcpy(retbuf, printbuf, sizeof(retbuf)); - return retbuf; - } - else - { - return NULL; /* Fail. */ - } - } - /* I honestly don't know what the deal is with the 80 char cap in clean_ban_mask is about. So I'm leaving it out here. -- aquanight */ - /* I don't know why it's 80, but I like a limit anyway. A ban of 500 characters can never be good... -- Syzop */ - if (strlen(para) > 80) - { - strlcpy(retbuf, para, 128); - return retbuf; - } - return para; - } - else + /* We're dealing with a stacked extended ban. + * Rules: + * 1) You can only stack once, so: ~x:~y:something and not ~x:~y:~z... + * 2) The second item may never be an action modifier, nor have the + * EXTBOPT_NOSTACKCHILD letter set (for things like a textban). + */ + + /* Rule #1. Yes the recursion check is also in extban_is_ok_nuh_extban, + * but it's possible to get here without the is_ok() function ever + * being called (think: non-local client). And no, don't delete it + * there either. It needs to be in BOTH places. -- Syzop + */ + if (extban_recursion) + return NULL; + + strlcpy(tmpbuf, b->banstr, sizeof(tmpbuf)); + extban = findmod_by_bantype(tmpbuf, &nextbanstr); + + if (!extban) { - return extban_conv_param_nuh(para); + /* Handling unknown bantypes in is_ok. Assume that it's ok here. */ + return b->banstr; } + + b->banstr = nextbanstr; + + if ((extban->options & EXTBOPT_ACTMODIFIER) || (extban->options & EXTBOPT_NOSTACKCHILD)) + { + /* Rule #2 violation */ + return NULL; + } + + if (extban->conv_param) + { + //BanContext *b = safe_alloc(sizeof(BanContext)); + //b->banstr = mask; <-- this is redundant right? we can use existing 'b' context?? + extban_recursion++; + ret = extban->conv_param(b, extban); + extban_recursion--; + ret = prefix_with_extban(ret, b, extban, retbuf, sizeof(retbuf)); + //safe_free(b); + return ret; + } + /* I honestly don't know what the deal is with the 80 char cap in clean_ban_mask is about. So I'm leaving it out here. -- aquanight */ + /* I don't know why it's 80, but I like a limit anyway. A ban of 500 characters can never be good... -- Syzop */ + if (strlen(b->banstr) > 80) + { + strlcpy(retbuf, b->banstr, 128); + return retbuf; + } + return b->banstr; +} + +char *prefix_with_extban(const char *remainder, BanContext *b, Extban *extban, char *buf, size_t buflen) +{ + /* Yes, we support this because it makes code at the caller cleaner */ + if (remainder == NULL) + return NULL; + + if (iConf.named_extended_bans && !(b->conv_options & BCTX_CONV_OPTION_WRITE_LETTER_BANS)) + snprintf(buf, buflen, "~%s:%s", extban->name, remainder); + else + snprintf(buf, buflen, "~%c:%s", extban->letter, remainder); + + return buf; } diff --git a/src/api-history-backend.c b/src/api-history-backend.c index 2c1668d..a569b55 100644 --- a/src/api-history-backend.c +++ b/src/api-history-backend.c @@ -60,13 +60,15 @@ HistoryBackend *HistoryBackendAdd(Module *module, HistoryBackendInfo *mreq) { HistoryBackend *m; int exists = 0; + ModuleObject *mobj; if (!mreq->history_add || !mreq->history_request || !mreq->history_destroy || !mreq->history_set_limit) { - if (module) - module->errorcode = MODERR_INVALID; - ircd_log(LOG_ERROR, "HistoryBackendAdd(): missing a handler for add/del/request/destroy/set_limit"); + module->errorcode = MODERR_INVALID; + unreal_log(ULOG_ERROR, "module", "HISTORYBACKENDADD_API_ERROR", NULL, + "HistoryBackendAdd(): missing a handler for add/del/request/destroy/set_limit. Module: $module_name", + log_data_string("module_name", module->header->name)); return NULL; } m = HistoryBackendFind(mreq->name); @@ -77,8 +79,7 @@ HistoryBackend *HistoryBackendAdd(Module *module, HistoryBackendInfo *mreq) { m->unloaded = 0; } else { - if (module) - module->errorcode = MODERR_EXISTS; + module->errorcode = MODERR_EXISTS; return NULL; } } else { @@ -97,14 +98,11 @@ HistoryBackend *HistoryBackendAdd(Module *module, HistoryBackendInfo *mreq) if (!exists) AddListItem(m, historybackends); - if (module) - { - ModuleObject *mobj = safe_alloc(sizeof(ModuleObject)); - mobj->type = MOBJ_HISTORY_BACKEND; - mobj->object.history_backend = m; - AddListItem(mobj, module->objects); - module->errorcode = MODERR_NOERROR; - } + mobj = safe_alloc(sizeof(ModuleObject)); + mobj->type = MOBJ_HISTORY_BACKEND; + mobj->object.history_backend = m; + AddListItem(mobj, module->objects); + module->errorcode = MODERR_NOERROR; return m; } @@ -138,7 +136,7 @@ void HistoryBackendDel(HistoryBackend *m) m->owner = NULL; } - if (loop.ircd_rehashing) + if (loop.rehashing) m->unloaded = 1; else unload_history_backend_commit(m); @@ -156,7 +154,7 @@ void unload_all_unused_history_backends(void) } } -int history_add(char *object, MessageTag *mtags, char *line) +int history_add(const char *object, MessageTag *mtags, const char *line) { HistoryBackend *hb; @@ -166,7 +164,7 @@ int history_add(char *object, MessageTag *mtags, char *line) return 1; } -HistoryResult *history_request(char *object, HistoryFilter *filter) +HistoryResult *history_request(const char *object, HistoryFilter *filter) { HistoryBackend *hb = historybackends; HistoryResult *r; @@ -183,7 +181,7 @@ HistoryResult *history_request(char *object, HistoryFilter *filter) return NULL; } -int history_destroy(char *object) +int history_destroy(const char *object) { HistoryBackend *hb; @@ -193,7 +191,7 @@ int history_destroy(char *object) return 1; } -int history_set_limit(char *object, int max_lines, long max_t) +int history_set_limit(const char *object, int max_lines, long max_t) { HistoryBackend *hb; @@ -230,7 +228,7 @@ int can_receive_history(Client *client) return 0; } -static void history_send_result_line(Client *client, HistoryLogLine *l, char *batchid) +static void history_send_result_line(Client *client, HistoryLogLine *l, const char *batchid) { if (BadPtr(batchid)) { @@ -238,9 +236,10 @@ static void history_send_result_line(Client *client, HistoryLogLine *l, char *ba } else { MessageTag *m = safe_alloc(sizeof(MessageTag)); m->name = "batch"; - m->value = batchid; + m->value = strdup(batchid); AddListItem(m, l->mtags); sendto_one(client, l->mtags, "%s", l->line); + safe_free(m->value); DelListItem(m, l->mtags); safe_free(m); } diff --git a/src/api-isupport.c b/src/api-isupport.c index a378e5b..29c0433 100644 --- a/src/api-isupport.c +++ b/src/api-isupport.c @@ -86,18 +86,12 @@ void isupport_init(void) { ISupportSet(NULL, "INVEX", NULL); ISupportSet(NULL, "EXCEPTS", NULL); -#ifdef PREFIX_AQ - ISupportSet(NULL, "STATUSMSG", "~&@%+"); -#else - ISupportSet(NULL, "STATUSMSG", "@%+"); -#endif ISupportSet(NULL, "ELIST", "MNUCT"); ISupportSet(NULL, "CASEMAPPING", "ascii"); - ISupportSet(NULL, "NETWORK", ircnet005); + ISupportSet(NULL, "NETWORK", NETWORK_NAME_005); ISupportSetFmt(NULL, "CHANMODES", - CHPAR1 "%s," CHPAR2 "%s," CHPAR3 "%s," CHPAR4 "%s", + CHPAR1 "%s,%s,%s,%s", EXPAR1, EXPAR2, EXPAR3, EXPAR4); - ISupportSet(NULL, "PREFIX", CHPFIX); ISupportSet(NULL, "CHANTYPES", "#"); ISupportSetFmt(NULL, "MODES", "%d", MAXMODEPARAMS); ISupportSetFmt(NULL, "SILENCE", "%d", SILENCE_LIMIT); @@ -118,7 +112,6 @@ void isupport_init(void) ISupportSetFmt(NULL, "MAXLIST", "b:%d,e:%d,I:%d", MAXBANS, MAXBANS, MAXBANS); ISupportSetFmt(NULL, "CHANLIMIT", "#:%d", MAXCHANNELSPERUSER); ISupportSetFmt(NULL, "MAXCHANNELS", "%d", MAXCHANNELSPERUSER); - ISupportSet(NULL, "HCN", NULL); ISupportSet(NULL, "SAFELIST", NULL); ISupportSet(NULL, "NAMESX", NULL); if (UHNAMES_ENABLED) diff --git a/src/api-messagetag.c b/src/api-messagetag.c index 293848d..074f8fc 100644 --- a/src/api-messagetag.c +++ b/src/api-messagetag.c @@ -52,15 +52,21 @@ MessageTagHandler *MessageTagHandlerAdd(Module *module, MessageTagHandlerInfo *m /* Some consistency checks to avoid a headache for module devs later on: */ if ((mreq->flags & MTAG_HANDLER_FLAGS_NO_CAP_NEEDED) && mreq->clicap_handler) { - ircd_log(LOG_ERROR, "MessageTagHandlerAdd(): .flags is set to MTAG_HANDLER_FLAGS_NO_CAP_NEEDED " - "but a .clicap_handler is passed as well. These options are mutually " - "exclusive, choose one or the other."); + unreal_log(ULOG_ERROR, "module", "MESSAGETAGHANDLERADD_API_ERROR", NULL, + "MessageTagHandlerAdd() from module $module_name: " + ".flags is set to MTAG_HANDLER_FLAGS_NO_CAP_NEEDED " + "but a .clicap_handler is passed as well. These options are mutually " + "exclusive, choose one or the other.", + log_data_string("module_name", module->header->name)); abort(); } else if (!(mreq->flags & MTAG_HANDLER_FLAGS_NO_CAP_NEEDED) && !mreq->clicap_handler) { - ircd_log(LOG_ERROR, "MessageTagHandlerAdd(): no .clicap_handler is passed. If the " - "message tag really does not require a cap then you must " - "set .flags to MTAG_HANDLER_FLAGS_NO_CAP_NEEDED"); + unreal_log(ULOG_ERROR, "module", "MESSAGETAGHANDLERADD_API_ERROR", NULL, + "MessageTagHandlerAdd() from module $module_name: " + "no .clicap_handler is passed. If the " + "message tag really does not require a cap then you must " + "set .flags to MTAG_HANDLER_FLAGS_NO_CAP_NEEDED", + log_data_string("module_name", module->header->name)); abort(); } @@ -85,7 +91,7 @@ MessageTagHandler *MessageTagHandlerAdd(Module *module, MessageTagHandlerInfo *m m->owner = module; m->flags = mreq->flags; m->is_ok = mreq->is_ok; - m->can_send = mreq->can_send; + m->should_send_to_client = mreq->should_send_to_client; m->clicap_handler = mreq->clicap_handler; /* Update reverse dependency (if any) */ @@ -141,7 +147,7 @@ void MessageTagHandlerDel(MessageTagHandler *m) m->owner = NULL; } - if (loop.ircd_rehashing) + if (loop.rehashing) m->unloaded = 1; else unload_mtag_handler_commit(m); @@ -152,8 +158,9 @@ void MessageTagHandlerDel(MessageTagHandler *m) static void unload_mtag_handler_commit(MessageTagHandler *m) { /* This is an unusual operation, I think we should log it. */ - ircd_log(LOG_ERROR, "Unloading message-tag handler for '%s'", m->name); - sendto_realops("Unloading message-tag handler for '%s'", m->name); + unreal_log(ULOG_INFO, "module", "UNLOAD_MESSAGE_TAG", NULL, + "Unloading message-tag handler for '$token'", + log_data_string("token", m->name)); /* Remove reverse dependency, if any */ if (m->clicap_handler) diff --git a/src/api-moddata.c b/src/api-moddata.c index 84be03b..1dd5035 100644 --- a/src/api-moddata.c +++ b/src/api-moddata.c @@ -65,6 +65,8 @@ ModDataInfo *ModDataAdd(Module *module, ModDataInfo req) ((req.type == MODDATATYPE_MEMBER) && (slotav >= MODDATA_MAX_MEMBER)) || ((req.type == MODDATATYPE_MEMBERSHIP) && (slotav >= MODDATA_MAX_MEMBERSHIP))) { + unreal_log(ULOG_ERROR, "module", "MOD_DATA_OUT_OF_SPACE", NULL, + "ModDataAdd: out of space!!!"); if (module) module->errorcode = MODERR_NOSPACE; return NULL; @@ -80,6 +82,8 @@ moddataadd_isok: m->serialize = req.serialize; m->unserialize = req.unserialize; m->sync = req.sync; + m->remote_write = req.remote_write; + m->self_write = req.self_write; m->owner = module; if (new_struct) @@ -272,7 +276,7 @@ void ModDataDel(ModDataInfo *md) md->owner = NULL; } - if (loop.ircd_rehashing) + if (loop.rehashing) md->unloaded = 1; else unload_moddata_commit(md); @@ -290,7 +294,7 @@ ModDataInfo *md, *md_next; } } -ModDataInfo *findmoddata_byname(char *name, ModDataType type) +ModDataInfo *findmoddata_byname(const char *name, ModDataType type) { ModDataInfo *md; @@ -313,7 +317,7 @@ int module_has_moddata(Module *mod) } /** Set ModData for client (via variable name, string value) */ -int moddata_client_set(Client *client, char *varname, char *value) +int moddata_client_set(Client *client, const char *varname, const char *value) { ModDataInfo *md; @@ -344,7 +348,7 @@ int moddata_client_set(Client *client, char *varname, char *value) } /** Get ModData for client (via variable name) */ -char *moddata_client_get(Client *client, char *varname) +const char *moddata_client_get(Client *client, const char *varname) { ModDataInfo *md; @@ -356,8 +360,21 @@ char *moddata_client_get(Client *client, char *varname) return md->serialize(&moddata_client(client, md)); /* can be NULL */ } +/** Get ModData for client (via variable name) */ +ModData *moddata_client_get_raw(Client *client, const char *varname) +{ + ModDataInfo *md; + + md = findmoddata_byname(varname, MODDATATYPE_CLIENT); + + if (!md) + return NULL; + + return &moddata_client(client, md); /* can be NULL */ +} + /** Set ModData for LocalClient (via variable name, string value) */ -int moddata_local_client_set(Client *client, char *varname, char *value) +int moddata_local_client_set(Client *client, const char *varname, const char *value) { ModDataInfo *md; @@ -391,7 +408,7 @@ int moddata_local_client_set(Client *client, char *varname, char *value) } /** Get ModData for LocalClient (via variable name) */ -char *moddata_local_client_get(Client *client, char *varname) +const char *moddata_local_client_get(Client *client, const char *varname) { ModDataInfo *md; @@ -407,7 +424,7 @@ char *moddata_local_client_get(Client *client, char *varname) } /** Set local variable moddata (via variable name, string value) */ -int moddata_local_variable_set(char *varname, char *value) +int moddata_local_variable_set(const char *varname, const char *value) { ModDataInfo *md; @@ -432,7 +449,7 @@ int moddata_local_variable_set(char *varname, char *value) } /** Set global variable moddata (via variable name, string value) */ -int moddata_global_variable_set(char *varname, char *value) +int moddata_global_variable_set(const char *varname, const char *value) { ModDataInfo *md; diff --git a/src/api-usermode.c b/src/api-usermode.c index b195c4f..0789840 100644 --- a/src/api-usermode.c +++ b/src/api-usermode.c @@ -24,16 +24,11 @@ char umodestring[UMODETABLESZ+1]; -Umode *Usermode_Table = NULL; -short Usermode_highest = 0; +/** User modes and their handlers */ +Umode *usermodes = NULL; -Snomask *Snomask_Table = NULL; -short Snomask_highest = 0; - -/* client->umodes (32 bits): 26 used, 6 free */ long UMODE_INVISIBLE = 0L; /* makes user invisible */ long UMODE_OPER = 0L; /* Operator */ -long UMODE_WALLOP = 0L; /* send wallops to them */ long UMODE_REGNICK = 0L; /* Nick set by services as registered */ long UMODE_SERVNOTICE = 0L; /* server notices such as kill */ long UMODE_HIDE = 0L; /* Hide from Nukes */ @@ -63,32 +58,13 @@ long SendUmodes; /* All umodes which are sent to other servers (global umodes) * /* Forward declarations */ int umode_hidle_allow(Client *client, int what); +static void unload_usermode_commit(Umode *m); -void umode_init(void) +void umode_init(void) { - long val = 1; - int i; - Usermode_Table = safe_alloc(sizeof(Umode) * UMODETABLESZ); - for (i = 0; i < UMODETABLESZ; i++) - { - Usermode_Table[i].mode = val; - val *= 2; - } - Usermode_highest = 0; - - Snomask_Table = safe_alloc(sizeof(Snomask) * UMODETABLESZ); - val = 1; - for (i = 0; i < UMODETABLESZ; i++) - { - Snomask_Table[i].mode = val; - val *= 2; - } - Snomask_highest = 0; - - /* Set up modes */ + /* Some built-in modes */ UmodeAdd(NULL, 'i', UMODE_GLOBAL, 0, umode_allow_all, &UMODE_INVISIBLE); UmodeAdd(NULL, 'o', UMODE_GLOBAL, 1, umode_allow_opers, &UMODE_OPER); - UmodeAdd(NULL, 'w', UMODE_GLOBAL, 0, umode_allow_all, &UMODE_WALLOP); UmodeAdd(NULL, 'r', UMODE_GLOBAL, 0, umode_allow_none, &UMODE_REGNICK); UmodeAdd(NULL, 's', UMODE_LOCAL, 0, umode_allow_all, &UMODE_SERVNOTICE); UmodeAdd(NULL, 'x', UMODE_GLOBAL, 0, umode_allow_all, &UMODE_HIDE); @@ -97,34 +73,17 @@ void umode_init(void) UmodeAdd(NULL, 'H', UMODE_GLOBAL, 1, umode_allow_opers, &UMODE_HIDEOPER); UmodeAdd(NULL, 't', UMODE_GLOBAL, 0, umode_allow_unset, &UMODE_SETHOST); UmodeAdd(NULL, 'I', UMODE_GLOBAL, 0, umode_hidle_allow, &UMODE_HIDLE); - SnomaskAdd(NULL, 'k', umode_allow_opers, &SNO_KILLS); - SnomaskAdd(NULL, 'c', umode_allow_opers, &SNO_CLIENT); - SnomaskAdd(NULL, 'f', umode_allow_opers, &SNO_FLOOD); - SnomaskAdd(NULL, 'F', umode_allow_opers, &SNO_FCLIENT); - SnomaskAdd(NULL, 'j', umode_allow_opers, &SNO_JUNK); - SnomaskAdd(NULL, 'v', umode_allow_opers, &SNO_VHOST); - SnomaskAdd(NULL, 'e', umode_allow_opers, &SNO_EYES); - SnomaskAdd(NULL, 'G', umode_allow_opers, &SNO_TKL); - SnomaskAdd(NULL, 'n', umode_allow_opers, &SNO_NICKCHANGE); - SnomaskAdd(NULL, 'N', umode_allow_opers, &SNO_FNICKCHANGE); - SnomaskAdd(NULL, 'q', umode_allow_opers, &SNO_QLINE); - SnomaskAdd(NULL, 'S', umode_allow_opers, &SNO_SPAMF); - SnomaskAdd(NULL, 's', umode_allow_opers, &SNO_SNOTICE); - SnomaskAdd(NULL, 'o', umode_allow_opers, &SNO_OPER); } void make_umodestr(void) { - int i; - char *m; + Umode *um; + char *p = umodestring; - m = umodestring; - for (i = 0; i <= Usermode_highest; i++) - { - if (Usermode_Table[i].flag) - *m++ = Usermode_Table[i].flag; - } - *m = '\0'; + for (um=usermodes; um; um = um->next) + if (um->letter) + *p++ = um->letter; + *p = '\0'; } static char previous_umodestring[256]; @@ -132,7 +91,7 @@ static char previous_umodestring[256]; void umodes_check_for_changes(void) { make_umodestr(); - safe_strdup(me.serv->features.usermodes, umodestring); + safe_strdup(me.server->features.usermodes, umodestring); if (!*previous_umodestring) { @@ -142,10 +101,10 @@ void umodes_check_for_changes(void) if (*previous_umodestring && strcmp(umodestring, previous_umodestring)) { - ircd_log(LOG_ERROR, "User modes changed at runtime: %s -> %s", - previous_umodestring, umodestring); - sendto_realops("User modes changed at runtime: %s -> %s", - previous_umodestring, umodestring); + unreal_log(ULOG_INFO, "mode", "USER_MODES_CHANGED", NULL, + "User modes changed at runtime: $old_user_modes -> $new_user_modes", + log_data_string("old_user_modes", previous_umodestring), + log_data_string("new_user_modes", umodestring)); /* Broadcast change to all (locally connected) servers */ sendto_server(NULL, 0, 0, NULL, "PROTOCTL USERMODES=%s", umodestring); } @@ -153,102 +112,134 @@ void umodes_check_for_changes(void) strlcpy(previous_umodestring, umodestring, sizeof(previous_umodestring)); } +void usermode_add_sorted(Umode *n) +{ + Umode *m; + + if (usermodes == NULL) + { + usermodes = n; + return; + } + + for (m = usermodes; m; m = m->next) + { + if (m->letter == '\0') + abort(); + if (sort_character_lowercase_before_uppercase(n->letter, m->letter)) + { + /* Insert us before */ + if (m->prev) + m->prev->next = n; + else + usermodes = n; /* new head */ + n->prev = m->prev; + + n->next = m; + m->prev = n; + return; + } + if (!m->next) + { + /* Append us at end */ + m->next = n; + n->prev = m; + return; + } + } +} + + /* UmodeAdd: * Add a usermode with character 'ch', if global is set to 1 the usermode is global * (sent to other servers) otherwise it's a local usermode */ Umode *UmodeAdd(Module *module, char ch, int global, int unset_on_deoper, int (*allowed)(Client *client, int what), long *mode) { - short i = 0; - short j = 0; - short save = -1; - while (i < UMODETABLESZ) + Umode *um; + int existing = 0; + + for (um=usermodes; um; um = um->next) { - if (!Usermode_Table[i].flag && save == -1) - save = i; - else if (Usermode_Table[i].flag == ch) + if (um->letter == ch) { - if (Usermode_Table[i].unloaded) + if (um->unloaded) { - save = i; - Usermode_Table[i].unloaded = 0; + um->unloaded = 0; + existing = 1; break; - } - else - { + } else { if (module) module->errorcode = MODERR_EXISTS; return NULL; } } - i++; } - i = save; - if (i != UMODETABLESZ) + + if (!um) { - Usermode_Table[i].flag = ch; - Usermode_Table[i].allowed = allowed; - Usermode_Table[i].unset_on_deoper = unset_on_deoper; - Debug((DEBUG_DEBUG, "UmodeAdd(%c) returning %04lx", - ch, Usermode_Table[i].mode)); - /* Update usermode table highest */ - for (j = 0; j < UMODETABLESZ; j++) - if (Usermode_Table[i].flag) - if (i > Usermode_highest) - Usermode_highest = i; - make_umodestr(); - AllUmodes |= Usermode_Table[i].mode; - if (global) - SendUmodes |= Usermode_Table[i].mode; - *mode = Usermode_Table[i].mode; - Usermode_Table[i].owner = module; - if (module) + /* Not found, create */ + long l, found = 0; + for (l = 1; l < LONG_MAX/2; l *= 2) { - ModuleObject *umodeobj = safe_alloc(sizeof(ModuleObject)); - umodeobj->object.umode = &(Usermode_Table[i]); - umodeobj->type = MOBJ_UMODE; - AddListItem(umodeobj, module->objects); - module->errorcode = MODERR_NOERROR; + found = 0; + for (um=usermodes; um; um = um->next) + { + if (um->mode == l) + { + found = 1; + break; + } + } + if (!found) + break; } - return &(Usermode_Table[i]); + /* If 'found' is still true, then we are out of space */ + if (found) + { + unreal_log(ULOG_ERROR, "module", "USER_MODE_OUT_OF_SPACE", NULL, + "UmodeAdd: out of space!!!"); + if (module) + module->errorcode = MODERR_NOSPACE; + return NULL; + } + um = safe_alloc(sizeof(Umode)); + um->letter = ch; + um->mode = l; + usermode_add_sorted(um); } - else + + um->letter = ch; + um->allowed = allowed; + um->unset_on_deoper = unset_on_deoper; + make_umodestr(); + AllUmodes |= um->mode; + if (global) + SendUmodes |= um->mode; + *mode = um->mode; + um->owner = module; + if (module) { - Debug((DEBUG_DEBUG, "UmodeAdd failed, no space")); - if (module) - module->errorcode = MODERR_NOSPACE; - return NULL; + ModuleObject *umodeobj = safe_alloc(sizeof(ModuleObject)); + umodeobj->object.umode = um; + umodeobj->type = MOBJ_UMODE; + AddListItem(umodeobj, module->objects); + module->errorcode = MODERR_NOERROR; } + return um; } void UmodeDel(Umode *umode) { - if (loop.ircd_rehashing) - umode->unloaded = 1; - else + /* Always free the module object */ + if (umode->owner) { - Client *client; - list_for_each_entry(client, &client_list, client_node) - { - long oldumode = 0; - if (!IsUser(client)) - continue; - oldumode = client->umodes; - client->umodes &= ~umode->mode; - if (MyUser(client)) - send_umode_out(client, 1, oldumode); - } - umode->flag = '\0'; - AllUmodes &= ~(umode->mode); - SendUmodes &= ~(umode->mode); - make_umodestr(); - } - - if (umode->owner) { ModuleObject *umodeobj; - for (umodeobj = umode->owner->objects; umodeobj; umodeobj = umodeobj->next) { - if (umodeobj->type == MOBJ_UMODE && umodeobj->object.umode == umode) { + for (umodeobj = umode->owner->objects; umodeobj; umodeobj = umodeobj->next) + { + if (umodeobj->type == MOBJ_UMODE && umodeobj->object.umode == umode) + { DelListItem(umodeobj, umode->owner->objects); safe_free(umodeobj); break; @@ -256,100 +247,13 @@ void UmodeDel(Umode *umode) } umode->owner = NULL; } - return; -} -Snomask *SnomaskAdd(Module *module, char ch, int (*allowed)(Client *client, int what), long *mode) -{ - short i = 0; - short j = 0; - short save = -1; - while (i < UMODETABLESZ) - { - if (!Snomask_Table[i].flag && save == -1) - save = i; - else if (Snomask_Table[i].flag == ch) - { - if (Snomask_Table[i].unloaded) - { - save = i; - Snomask_Table[i].unloaded = 0; - break; - } - else - { - if (module) - module->errorcode = MODERR_EXISTS; - return NULL; - } - } - i++; - } - i = save; - if (i != UMODETABLESZ) - { - Snomask_Table[i].flag = ch; - Snomask_Table[i].allowed = allowed; - /* Update usermode table highest */ - for (j = 0; j < UMODETABLESZ; j++) - if (Snomask_Table[i].flag) - if (i > Snomask_highest) - Snomask_highest = i; - *mode = Snomask_Table[i].mode; - Snomask_Table[i].owner = module; - if (module) - { - ModuleObject *snoobj = safe_alloc(sizeof(ModuleObject)); - snoobj->object.snomask = &(Snomask_Table[i]); - snoobj->type = MOBJ_SNOMASK; - AddListItem(snoobj, module->objects); - module->errorcode = MODERR_NOERROR; - } - return &(Snomask_Table[i]); - } + /* Whether we can actually (already) free the Umode depends... */ + + if (loop.rehashing) + umode->unloaded = 1; else - { - Debug((DEBUG_DEBUG, "SnomaskAdd failed, no space")); - *mode = 0; - if (module) - module->errorcode = MODERR_NOSPACE; - return NULL; - } -} - -void SnomaskDel(Snomask *sno) -{ - if (loop.ircd_rehashing) - sno->unloaded = 1; - else - { - Client *client; - - list_for_each_entry(client, &lclient_list, lclient_node) - { - long oldsno; - if (!client || !IsUser(client)) - continue; - oldsno = client->user->snomask; - client->user->snomask &= ~sno->mode; - if (oldsno != client->user->snomask) - sendnumeric(client, RPL_SNOMASK, get_snomask_string_raw(client->user->snomask)); - } - - sno->flag = '\0'; - } - if (sno->owner) { - ModuleObject *snoobj; - for (snoobj = sno->owner->objects; snoobj; snoobj = snoobj->next) { - if (snoobj->type == MOBJ_SNOMASK && snoobj->object.snomask == sno) { - DelListItem(snoobj, sno->owner->objects); - safe_free(snoobj); - break; - } - } - sno->owner = NULL; - } - return; + unload_usermode_commit(umode); } int umode_allow_all(Client *client, int what) @@ -392,68 +296,42 @@ int umode_hidle_allow(Client *client, int what) return 0; /* if set::hide-idle-time is 'never' or 'always' then +I makes no sense */ } -void unload_all_unused_umodes(void) +static void unload_usermode_commit(Umode *um) { - long removed_umode = 0; - int i; Client *client; - for (i = 0; i < UMODETABLESZ; i++) - { - if (Usermode_Table[i].unloaded) - removed_umode |= Usermode_Table[i].mode; - } - if (!removed_umode) /* Nothing was unloaded */ + long removed_umode; + + if (!um) return; + + removed_umode = um->mode; + + /* First send the -mode regarding all users */ list_for_each_entry(client, &lclient_list, lclient_node) { - long oldumode = 0; - if (!IsUser(client)) - continue; - oldumode = client->umodes; - client->umodes &= ~(removed_umode); - if (MyUser(client)) - send_umode_out(client, 1, oldumode); - } - for (i = 0; i < UMODETABLESZ; i++) - { - if (Usermode_Table[i].unloaded) + if (MyUser(client) && (client->umodes & removed_umode)) { - AllUmodes &= ~(Usermode_Table[i].mode); - SendUmodes &= ~(Usermode_Table[i].mode); - Usermode_Table[i].flag = '\0'; - Usermode_Table[i].unloaded = 0; + long oldumode = client->umodes; + client->umodes &= ~(removed_umode); + send_umode_out(client, 1, oldumode); } } + + /* Then unload the mode */ + DelListItem(um, usermodes); + safe_free(um); make_umodestr(); } -void unload_all_unused_snomasks(void) +void unload_all_unused_umodes(void) { - Client *client; - long removed_sno = 0; - int i; + Umode *um, *um_next; - for (i = 0; i < UMODETABLESZ; i++) + for (um=usermodes; um; um = um_next) { - if (Snomask_Table[i].unloaded) - { - removed_sno |= Snomask_Table[i].mode; - Snomask_Table[i].flag = '\0'; - Snomask_Table[i].unloaded = 0; - } - } - if (!removed_sno) /* Nothing was unloaded */ - return; - - list_for_each_entry(client, &lclient_list, lclient_node) - { - long oldsno; - if (!client || !IsUser(client)) - continue; - oldsno = client->user->snomask; - client->user->snomask &= ~(removed_sno); - if (oldsno != client->user->snomask) - sendnumeric(client, RPL_SNOMASK, get_snomask_string_raw(client->user->snomask)); + um_next = um->next; + if (um->letter && um->unloaded) + unload_usermode_commit(um); } } @@ -463,25 +341,24 @@ void unload_all_unused_snomasks(void) * This used to be a bit more complex but nowadays we just erase all * snomasks since all of them are IRCOp-only. Easy. */ -void remove_oper_snomasks(Client *client) +void remove_all_snomasks(Client *client) { - client->user->snomask = 0; + safe_free(client->user->snomask); + client->umodes &= ~UMODE_SERVNOTICE; } /* * This function removes any oper-only user modes from the user. - * You may also want to call remove_oper_snomasks(), see above. + * You may also want to call remove_all_snomasks(), see above. */ void remove_oper_modes(Client *client) { -int i; + Umode *um; - for (i = 0; i <= Usermode_highest; i++) + for (um = usermodes; um; um = um->next) { - if (!Usermode_Table[i].flag) - continue; - if (Usermode_Table[i].unset_on_deoper) - client->umodes &= ~Usermode_Table[i].mode; + if (um->unset_on_deoper) + client->umodes &= ~um->mode; } /* Bit of a hack, since this is a dynamic permission umode */ @@ -493,7 +370,7 @@ void remove_oper_privileges(Client *client, int broadcast_mode_change) { long oldumodes = client->umodes; remove_oper_modes(client); - remove_oper_snomasks(client); + remove_all_snomasks(client); if (broadcast_mode_change && (client->umodes != oldumodes)) send_umode_out(client, 1, oldumodes); if (MyUser(client)) /* only do if it's our client, remote servers will send a SWHOIS cmd */ @@ -501,15 +378,14 @@ void remove_oper_privileges(Client *client, int broadcast_mode_change) } /** Return long integer mode for a user mode character (eg: 'x' -> 0x10) */ -long find_user_mode(char flag) +long find_user_mode(char letter) { - int i; + Umode *um; + + for (um = usermodes; um; um = um->next) + if ((um->letter == letter) && !um->unloaded) + return um->mode; - for (i = 0; i < UMODETABLESZ; i++) - { - if ((Usermode_Table[i].flag == flag) && !(Usermode_Table[i].unloaded)) - return Usermode_Table[i].mode; - } return 0; } diff --git a/src/auth.c b/src/auth.c index 39403a5..4cf28e0 100644 --- a/src/auth.c +++ b/src/auth.c @@ -46,10 +46,10 @@ AuthTypeList MODVAR AuthTypeLists[] = { }; /* Helper function for Auth_AutoDetectHashType() */ -static int parsepass(char *str, char **salt, char **hash) +static int parsepass(const char *str, char **salt, char **hash) { static char saltbuf[512], hashbuf[512]; - char *p; + const char *p; int max; /* Syntax: $$ */ @@ -72,7 +72,7 @@ static int parsepass(char *str, char **salt, char **hash) /** Auto detect hash type for input hash 'hash'. * Will fallback to AUTHTYPE_PLAINTEXT when not found (or invalid). */ -int Auth_AutoDetectHashType(char *hash) +int Auth_AutoDetectHashType(const char *hash) { static char hashbuf[256]; char *saltstr, *hashstr; @@ -80,12 +80,12 @@ int Auth_AutoDetectHashType(char *hash) if (!strchr(hash, '$')) { - /* SHA256 SSL fingerprint perhaps? + /* SHA256 certificate fingerprint perhaps? * These are exactly 64 bytes (00112233..etc..) or 95 bytes (00:11:22:33:etc) in size. */ if ((strlen(hash) == 64) || (strlen(hash) == 95)) { - char *p; + const char *p; char *hexchars = "0123456789abcdefABCDEF"; for (p = hash; *p; p++) if ((*p != ':') && !strchr(hexchars, *p)) @@ -96,7 +96,7 @@ int Auth_AutoDetectHashType(char *hash) if (strlen(hash) == 44) { - char *p; + const char *p; char *b64chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; for (p = hash; *p; p++) if (!strchr(b64chars, *p)) @@ -134,7 +134,7 @@ int Auth_AutoDetectHashType(char *hash) * than trying to determine the type on the 'hash' parameter. * Or leave NULL, then we use hash autodetection. */ -AuthenticationType Auth_FindType(char *hash, char *type) +AuthenticationType Auth_FindType(const char *hash, const char *type) { if (type) { @@ -163,25 +163,25 @@ int Auth_CheckError(ConfigEntry *ce) AuthenticationType type = AUTHTYPE_PLAINTEXT; X509 *x509_filecert = NULL; FILE *x509_f = NULL; - if (!ce->ce_vardata) + if (!ce->value) { config_error("%s:%i: authentication module failure: missing parameter", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); return -1; } - if (ce->ce_entries && ce->ce_entries->ce_next) + if (ce->items && ce->items->next) { config_error("%s:%i: you may not have multiple authentication methods", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); return -1; } - type = Auth_FindType(ce->ce_vardata, ce->ce_entries ? ce->ce_entries->ce_varname : NULL); + type = Auth_FindType(ce->value, ce->items ? ce->items->name : NULL); if (type == -1) { config_error("%s:%i: authentication module failure: %s is not an implemented/enabled authentication method", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum, - ce->ce_entries->ce_varname); + ce->file->filename, ce->line_number, + ce->items->name); return -1; } @@ -189,19 +189,19 @@ int Auth_CheckError(ConfigEntry *ce) { case AUTHTYPE_UNIXCRYPT: /* If our data is like 1 or none, we just let em through .. */ - if (strlen(ce->ce_vardata) < 2) + if (strlen(ce->value) < 2) { config_error("%s:%i: authentication module failure: AUTHTYPE_UNIXCRYPT: no salt (crypt strings will always be >2 in length)", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); return -1; } break; case AUTHTYPE_TLS_CLIENTCERT: - convert_to_absolute_path(&ce->ce_vardata, CONFDIR); - if (!(x509_f = fopen(ce->ce_vardata, "r"))) + convert_to_absolute_path(&ce->value, CONFDIR); + if (!(x509_f = fopen(ce->value, "r"))) { config_error("%s:%i: authentication module failure: AUTHTYPE_TLS_CLIENTCERT: error opening file %s: %s", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum, ce->ce_vardata, strerror(errno)); + ce->file->filename, ce->line_number, ce->value, strerror(errno)); return -1; } x509_filecert = PEM_read_X509(x509_f, NULL, NULL, NULL); @@ -209,7 +209,7 @@ int Auth_CheckError(ConfigEntry *ce) if (!x509_filecert) { config_error("%s:%i: authentication module failure: AUTHTYPE_TLS_CLIENTCERT: PEM_read_X509 errored in file %s (format error?)", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum, ce->ce_vardata); + ce->file->filename, ce->line_number, ce->value); return -1; } X509_free(x509_filecert); @@ -226,19 +226,19 @@ int Auth_CheckError(ConfigEntry *ce) * with normally at least 5000 rounds (unless deliberately weakened * by the user). */ - if ((type == AUTHTYPE_UNIXCRYPT) && strncmp(ce->ce_vardata, "$5", 2) && - strncmp(ce->ce_vardata, "$6", 2) && !strstr(ce->ce_vardata, "$rounds")) + if ((type == AUTHTYPE_UNIXCRYPT) && strncmp(ce->value, "$5", 2) && + strncmp(ce->value, "$6", 2) && !strstr(ce->value, "$rounds")) { config_warn("%s:%i: Using simple crypt for authentication is not recommended. " "Consider using the more secure auth-type 'argon2' instead. " "See https://www.unrealircd.org/docs/Authentication_types for the complete list.", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); /* do not return, not an error. */ } - if ((type == AUTHTYPE_PLAINTEXT) && (strlen(ce->ce_vardata) > PASSWDLEN)) + if ((type == AUTHTYPE_PLAINTEXT) && (strlen(ce->value) > PASSWDLEN)) { config_error("%s:%i: passwords length may not exceed %d", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum, PASSWDLEN); + ce->file->filename, ce->line_number, PASSWDLEN); return -1; } return 1; @@ -252,12 +252,12 @@ AuthConfig *AuthBlockToAuthConfig(ConfigEntry *ce) AuthenticationType type = AUTHTYPE_PLAINTEXT; AuthConfig *as = NULL; - type = Auth_FindType(ce->ce_vardata, ce->ce_entries ? ce->ce_entries->ce_varname : NULL); + type = Auth_FindType(ce->value, ce->items ? ce->items->name : NULL); if (type == AUTHTYPE_INVALID) type = AUTHTYPE_PLAINTEXT; as = safe_alloc(sizeof(AuthConfig)); - safe_strdup(as->data, ce->ce_vardata); + safe_strdup(as->data, ce->value); as->type = type; return as; } @@ -279,7 +279,7 @@ void Auth_FreeAuthConfig(AuthConfig *as) #define RAWSALTLEN 6 #define REALSALTLEN 12 -static int authcheck_argon2(Client *client, AuthConfig *as, char *para) +static int authcheck_argon2(Client *client, AuthConfig *as, const char *para) { argon2_type hashtype; @@ -304,7 +304,7 @@ static int authcheck_argon2(Client *client, AuthConfig *as, char *para) return 0; /* NO MATCH or error */ } -static int authcheck_bcrypt(Client *client, AuthConfig *as, char *para) +static int authcheck_bcrypt(Client *client, AuthConfig *as, const char *para) { char data[512]; /* NOTE: only 64 required by BF_crypt() */ char *str; @@ -324,7 +324,7 @@ static int authcheck_bcrypt(Client *client, AuthConfig *as, char *para) return 0; /* NO MATCH */ } -static int authcheck_tls_clientcert(Client *client, AuthConfig *as, char *para) +static int authcheck_tls_clientcert(Client *client, AuthConfig *as, const char *para) { X509 *x509_clientcert = NULL; X509 *x509_filecert = NULL; @@ -358,11 +358,11 @@ static int authcheck_tls_clientcert(Client *client, AuthConfig *as, char *para) return 1; } -static int authcheck_tls_clientcert_fingerprint(Client *client, AuthConfig *as, char *para) +static int authcheck_tls_clientcert_fingerprint(Client *client, AuthConfig *as, const char *para) { int i, k; char hexcolon[EVP_MAX_MD_SIZE * 3 + 1]; - char *fp; + const char *fp; if (!client->local->ssl) return 0; @@ -389,12 +389,12 @@ static int authcheck_tls_clientcert_fingerprint(Client *client, AuthConfig *as, return 1; } -static int authcheck_spkifp(Client *client, AuthConfig *as, char *para) +static int authcheck_spkifp(Client *client, AuthConfig *as, const char *para) { - char *fp = spki_fingerprint(client); + const char *fp = spki_fingerprint(client); if (!fp) - return 0; /* auth failed: not SSL (or other failure) */ + return 0; /* auth failed: not TLS or some other failure */ if (strcasecmp(as->data, fp)) return 0; /* auth failed: mismatch */ @@ -420,7 +420,7 @@ static int authcheck_spkifp(Client *client, AuthConfig *as, char *para) * - The return value was different in versions before UnrealIRCd 5.0.0! * - In older versions a NULL 'as' was treated as an allow, now it's deny. */ -int Auth_Check(Client *client, AuthConfig *as, char *para) +int Auth_Check(Client *client, AuthConfig *as, const char *para) { extern char *crypt(); char *res; @@ -435,8 +435,9 @@ int Auth_Check(Client *client, AuthConfig *as, char *para) return 0; if (!strcmp(as->data, "changemeplease") && !strcmp(para, as->data)) { - sendto_realops("Rejecting default password 'changemeplease'. " - "Please change the password in the configuration file."); + unreal_log(ULOG_INFO, "auth", "AUTH_REJECT_DEFAULT_PASSWORD", client, + "Rejecting default password 'changemeplease'. " + "Please change the password in the configuration file."); return 0; } /* plain text compare */ @@ -479,7 +480,7 @@ int Auth_Check(Client *client, AuthConfig *as, char *para) #define UNREALIRCD_ARGON2_DEFAULT_HASH_LENGTH 32 #define UNREALIRCD_ARGON2_DEFAULT_SALT_LENGTH (128/8) -static char *mkpass_argon2(char *para) +static char *mkpass_argon2(const char *para) { static char buf[512]; char salt[UNREALIRCD_ARGON2_DEFAULT_SALT_LENGTH]; @@ -511,7 +512,7 @@ static char *mkpass_argon2(char *para) return buf; } -static char *mkpass_bcrypt(char *para) +static char *mkpass_bcrypt(const char *para) { static char buf[128]; char data[512]; /* NOTE: only 64 required by BF_crypt() */ @@ -547,7 +548,7 @@ static char *mkpass_bcrypt(char *para) * @param text The password in plaintext. * @returns The hashed password. */ -char *Auth_Hash(AuthenticationType type, char *text) +const char *Auth_Hash(AuthenticationType type, const char *text) { switch (type) { diff --git a/src/buildmod b/src/buildmod index 6fdfe22..da21717 100755 --- a/src/buildmod +++ b/src/buildmod @@ -1,4 +1,5 @@ #!/bin/sh +MAKE="$1" echo "" echo "Checking for updates for third party modules..." # We can't use the "unrealircd" script, since possibly the ircd @@ -13,7 +14,7 @@ if [ "$x" != "*.c" ]; then x="`echo $x|sed 's/\.c//'`" if [ ! -f $x.so -o $x.c -nt $x.so ]; then echo "Building 3rd party module $x..." - make custommodule MODULEFILE=$x || (echo "*****"; echo "Building 3rd party module $x failed."; echo "Contact the module author of the $x module (not the UnrealIRCd team), or simply delete the $PWD/$x.c file"; echo "*****"; exit 1) + $MAKE custommodule MODULEFILE=$x || (echo "*****"; echo "Building 3rd party module $x failed."; echo "Contact the module author of the $x module (not the UnrealIRCd team), or simply delete the $PWD/$x.c file"; echo "*****"; exit 1) fi fi done diff --git a/src/channel.c b/src/channel.c index a15fddf..a465f20 100644 --- a/src/channel.c +++ b/src/channel.c @@ -40,31 +40,15 @@ long sajoinmode = 0; */ Channel *channels = NULL; -/* some buffers for rebuilding channel/nick lists with comma's */ +/* A buffer for rebuilding channel/nick lists with comma's */ static char buf[BUFSIZE]; -/** Mode buffer (eg: "+sntkl") */ -MODVAR char modebuf[BUFSIZE]; -/** Parameter buffer (eg: "key 123") */ -MODVAR char parabuf[BUFSIZE]; + +static mp_pool_t *channel_pool = NULL; /** This describes the letters, modes and options for core channel modes. * These are +ntmispklr and also the list modes +vhoaq and +beI. */ CoreChannelModeTable corechannelmodetable[] = { - {MODE_LIMIT, 'l', 1, 1}, - {MODE_VOICE, 'v', 1, 1}, - {MODE_HALFOP, 'h', 0, 1}, - {MODE_CHANOP, 'o', 0, 1}, - {MODE_PRIVATE, 'p', 0, 0}, - {MODE_SECRET, 's', 0, 0}, - {MODE_MODERATED, 'm', 1, 0}, - {MODE_NOPRIVMSGS, 'n', 1, 0}, - {MODE_TOPICLIMIT, 't', 1, 0}, - {MODE_INVITEONLY, 'i', 1, 0}, - {MODE_KEY, 'k', 1, 1}, - {MODE_RGSTR, 'r', 0, 0}, - {MODE_CHANADMIN, 'a', 0, 1}, - {MODE_CHANOWNER, 'q', 0, 1}, {MODE_BAN, 'b', 1, 1}, {MODE_EXCEPT, 'e', 1, 1}, /* exception ban */ {MODE_INVEX, 'I', 1, 1}, /* invite-only exception */ @@ -74,14 +58,8 @@ CoreChannelModeTable corechannelmodetable[] = { /** The advertised supported channel modes in the 004 numeric */ char cmodestring[512]; -/* Some forward declarations */ -char *clean_ban_mask(char *, int, Client *); -void channel_modes(Client *client, char *mbuf, char *pbuf, size_t mbuf_size, size_t pbuf_size, Channel *channel); -int sub1_from_channel(Channel *); -void del_invite(Client *, Channel *); - /** Returns 1 if the IRCOp can override or is a remote connection */ -inline int op_can_override(char *acl, Client *client,Channel *channel,void* extra) +inline int op_can_override(const char *acl, Client *client, Channel *channel, void* extra) { #ifndef NO_OPEROVERRIDE if (MyUser(client) && !(ValidatePermissionsForPath(acl,client,NULL,channel,extra))) @@ -106,17 +84,6 @@ int Halfop_mode(long mode) return TRUE; } - -/** Returns the length (entry count) of a +beI list */ -static int list_length(Link *lp) -{ - int count = 0; - - for (; lp; lp = lp->next) - count++; - return count; -} - /** Find client in a Member linked list (eg: channel->members) */ Member *find_member_link(Member *lp, Client *ptr) { @@ -156,8 +123,6 @@ static Member *make_member(void) for (i = 1; i <= (4072/sizeof(Member)); ++i) { lp = safe_alloc(sizeof(Member)); - lp->client = NULL; - lp->flags = 0; lp->next = freemember; freemember = lp; } @@ -176,8 +141,6 @@ static void free_member(Member *lp) moddata_free_member(lp); memset(lp, 0, sizeof(Member)); lp->next = freemember; - lp->client = NULL; - lp->flags = 0; freemember = lp; } @@ -228,7 +191,7 @@ static void free_membership(Membership *m) * only after searching through the nick history. * @returns The client (if found) or NULL (if not found). */ -Client *find_chasing(Client *client, char *user, int *chasing) +Client *find_chasing(Client *client, const char *user, int *chasing) { Client *who = find_client(user, NULL); @@ -254,9 +217,10 @@ Client *find_chasing(Client *client, char *user, int *chasing) } /** Return 1 if the bans are identical, taking into account special handling for extbans */ -int identical_ban(char *one, char *two) +int identical_ban(const char *one, const char *two) { - if (is_extended_ban(one)) +#if 0 + if (is_extended_ban(one) && is_extended_ban(two)) { /* compare the first 3 characters case-sensitive and if identical then compare * the remainder of the string case-insensitive. @@ -267,6 +231,14 @@ int identical_ban(char *one, char *two) if (!mycmp(one, two)) return 1; } +#else + /* Actually I think we can live with this nowadays. + * We are pushing towards named extbans, and all the + * letter extbans that could clash no longer exist. + */ + if (!mycmp(one, two)) + return 1; +#endif return 0; } @@ -274,14 +246,14 @@ int identical_ban(char *one, char *two) * the specified channel. (Extended version with * set by nick and set on timestamp) */ -int add_listmode_ex(Ban **list, Client *client, Channel *channel, char *banid, char *setby, time_t seton) +int add_listmode_ex(Ban **list, Client *client, Channel *channel, const char *banid, const char *setby, time_t seton) { Ban *ban; int cnt = 0, len; int do_not_add = 0; - if (MyUser(client)) - collapse(banid); + //if (MyUser(client)) + // collapse(banid); len = strlen(banid); if (!*list && ((len > MAXBANLENGTH) || (MAXBANS < 1))) @@ -289,7 +261,7 @@ int add_listmode_ex(Ban **list, Client *client, Channel *channel, char *banid, c if (MyUser(client)) { /* Only send the error to local clients */ - sendnumeric(client, ERR_BANLISTFULL, channel->chname, banid); + sendnumeric(client, ERR_BANLISTFULL, channel->name, banid); } do_not_add = 1; } @@ -318,7 +290,7 @@ int add_listmode_ex(Ban **list, Client *client, Channel *channel, char *banid, c if (MyUser(client)) { /* Only send the error to local clients */ - sendnumeric(client, ERR_BANLISTFULL, channel->chname, banid); + sendnumeric(client, ERR_BANLISTFULL, channel->name, banid); } return -1; } @@ -345,20 +317,20 @@ int add_listmode_ex(Ban **list, Client *client, Channel *channel, char *banid, c /** Add a listmode (+beI) with the specified banid to * the specified channel. (Simplified version) */ -int add_listmode(Ban **list, Client *client, Channel *channel, char *banid) +int add_listmode(Ban **list, Client *client, Channel *channel, const char *banid) { char *setby = client->name; char nuhbuf[NICKLEN+USERLEN+HOSTLEN+4]; if (IsUser(client) && (iConf.ban_setter == SETTER_NICK_USER_HOST)) - setby = make_nick_user_host_r(nuhbuf, client->name, client->user->username, GetHost(client)); + setby = make_nick_user_host_r(nuhbuf, sizeof(nuhbuf), client->name, client->user->username, GetHost(client)); return add_listmode_ex(list, client, channel, banid, setby, TStime()); } /** Delete a listmode (+beI) from a channel that matches the specified banid. */ -int del_listmode(Ban **list, Channel *channel, char *banid) +int del_listmode(Ban **list, Channel *channel, const char *banid) { Ban **ban; Ban *tmp; @@ -390,43 +362,37 @@ int del_listmode(Ban **list, Channel *channel, char *banid) * @returns A pointer to the ban struct if banned, otherwise NULL. * @comments Simple wrapper for is_banned_with_nick() */ -inline Ban *is_banned(Client *client, Channel *channel, int type, char **msg, char **errmsg) +inline Ban *is_banned(Client *client, Channel *channel, int type, const char **msg, const char **errmsg) { return is_banned_with_nick(client, channel, type, NULL, msg, errmsg); } /** ban_check_mask - Checks if the user matches the specified n!u@h mask -or- run an extended ban. - * @param client Client to check (can be remote client) - * @param channel Channel to check - * @param banstr Mask string to check user - * @param type Type of ban to check for (BANCHK_*) - * @param msg Message, only for some BANCHK_* types, otherwise NULL. - * @param errmsg Error message, could be NULL - * @param no_extbans 0 to check extbans, nonzero to disable extban checking. - * @returns Nonzero if the mask/extban succeeds. Zero if it doesn't. - * @comments This is basically extracting the mask and extban check from is_banned_with_nick, but with being a bit more strict in what an extban is. - * Strange things could happen if this is called outside standard ban checking. + * This is basically extracting the mask and extban check from is_banned_with_nick, + * but with being a bit more strict in what an extban is. + * Strange things could happen if this is called outside standard ban checking. + * @param b Ban context, see BanContext + * @returns Nonzero if the mask/extban succeeds. Zero if it doesn't. */ -inline int ban_check_mask(Client *client, Channel *channel, char *banstr, int type, char **msg, char **errmsg, int no_extbans) +inline int ban_check_mask(BanContext *b) { - Extban *extban = NULL; - if (!no_extbans && is_extended_ban(banstr)) + if (!b->no_extbans && is_extended_ban(b->banstr)) { /* Is an extended ban. */ - extban = findmod_by_bantype(banstr[1]); - if (!extban) + const char *nextbanstr; + Extban *extban = findmod_by_bantype(b->banstr, &nextbanstr); + if (!extban || !(extban->is_banned_events & b->ban_check_types)) { return 0; - } - else - { - return extban->is_banned(client, channel, banstr, type, msg, errmsg); + } else { + b->banstr = nextbanstr; + return extban->is_banned(b); } } else { /* Is a n!u@h mask. */ - return match_user(banstr, client, MATCH_CHECK_ALL); + return match_user(b->banstr, b->client, MATCH_CHECK_ALL); } } @@ -438,10 +404,11 @@ inline int ban_check_mask(Client *client, Channel *channel, char *banstr, int ty * @param msg Message, only for some BANCHK_* types, otherwise NULL * @returns A pointer to the ban struct if banned, otherwise NULL. */ -Ban *is_banned_with_nick(Client *client, Channel *channel, int type, char *nick, char **msg, char **errmsg) +Ban *is_banned_with_nick(Client *client, Channel *channel, int type, const char *nick, const char **msg, const char **errmsg) { Ban *ban, *ex; char savednick[NICKLEN+1]; + BanContext *b = safe_alloc(sizeof(BanContext)); /* It's not really doable to pass 'nick' to all the ban layers, * including extbans (with stacking) and so on. Or at least not @@ -460,13 +427,20 @@ Ban *is_banned_with_nick(Client *client, Channel *channel, int type, char *nick, strlcpy(client->name, nick, sizeof(client->name)); } + b->client = client; + b->channel = channel; + b->ban_check_types = type; + if (msg) + b->msg = *msg; + /* We check +b first, if a +b is found we then see if there is a +e. * If a +e was found we return NULL, if not, we return the ban. */ for (ban = channel->banlist; ban; ban = ban->next) { - if (ban_check_mask(client, channel, ban->banstr, type, msg, errmsg, 0)) + b->banstr = ban->banstr; + if (ban_check_mask(b)) break; } @@ -475,7 +449,8 @@ Ban *is_banned_with_nick(Client *client, Channel *channel, int type, char *nick, /* Ban found, now check for +e */ for (ex = channel->exlist; ex; ex = ex->next) { - if (ban_check_mask(client, channel, ex->banstr, type, msg, errmsg, 0)) + b->banstr = ex->banstr; + if (ban_check_mask(b)) { /* except matched */ ban = NULL; @@ -491,6 +466,13 @@ Ban *is_banned_with_nick(Client *client, Channel *channel, int type, char *nick, strlcpy(client->name, savednick, sizeof(client->name)); } + /* OUT: */ + if (msg) + *msg = b->msg; + if (errmsg) + *errmsg = b->error_msg; + + safe_free(b); return ban; } @@ -499,37 +481,43 @@ Ban *is_banned_with_nick(Client *client, Channel *channel, int type, char *nick, * and also the Membership struct to the client->user->channel linked list. * @note This does NOT send the JOIN, it only does the linked list stuff. */ -void add_user_to_channel(Channel *channel, Client *who, int flags) +void add_user_to_channel(Channel *channel, Client *client, const char *modes) { Member *m; Membership *mb; + const char *p; - if (who->user) - { - m = make_member(); - m->client = who; - m->flags = flags; - m->next = channel->members; - channel->members = m; - channel->users++; + if (!client->user) + return; - mb = make_membership(); - mb->channel = channel; - mb->next = who->user->channel; - mb->flags = flags; - who->user->channel = mb; - who->user->joined++; - RunHook2(HOOKTYPE_JOIN_DATA, who, channel); - } + m = make_member(); + m->client = client; + m->next = channel->members; + channel->members = m; + channel->users++; + + mb = make_membership(); + mb->channel = channel; + mb->next = client->user->channel; + client->user->channel = mb; + client->user->joined++; + + for (p = modes; *p; p++) + add_member_mode_fast(m, mb, *p); + + RunHook(HOOKTYPE_JOIN_DATA, client, channel); } /** Remove the user from the channel. - * This doesn't send any PART etc. It does the free'ing of - * membership etc. It will also DESTROY the channel if the - * user was the last user (and the channel is not +P), - * via sub1_from_channel(), that is. + * This frees the memberships, decreases the user counts, + * destroys the channel if needed, etc. + * This does not send any PART/KICK/..! + * @param client The client that is removed from the channel + * @param channel The channel + * @param dont_log Set to 1 if it should not be logged as a part, + * for example if you are already logging it as a kick. */ -int remove_user_from_channel(Client *client, Channel *channel) +int remove_user_from_channel(Client *client, Channel *channel, int dont_log) { Member **m; Member *m2; @@ -561,56 +549,46 @@ int remove_user_from_channel(Client *client, Channel *channel) /* Update user record to reflect 1 less joined */ client->user->joined--; + if (!dont_log) + { + if (MyUser(client)) + { + unreal_log(ULOG_INFO, "part", "LOCAL_CLIENT_PART", client, + "User $client left $channel", + log_data_channel("channel", channel)); + } else { + unreal_log(ULOG_INFO, "part", "REMOTE_CLIENT_PART", client, + "User $client left $channel", + log_data_channel("channel", channel)); + } + } + /* Now sub1_from_channel() will deal with the channel record * and destroy the channel if needed. */ return sub1_from_channel(channel); } -/** Get channel access flags (CHFL_*) for a client in a channel. - * @param client The client - * @param channel The channel - * @returns One or more of CHFL_* (eg: CHFL_CHANOP|CHFL_CHANADMIN) - * @note If the user is not found, then 0 is returned. - * If the user has no access rights, then 0 is returned as well. - */ -long get_access(Client *client, Channel *channel) -{ - Membership *lp; - if (channel && IsUser(client)) - if ((lp = find_membership_link(client->user->channel, channel))) - return lp->flags; - return 0; -} - /** Returns 1 if channel has this channel mode set and 0 if not */ int has_channel_mode(Channel *channel, char mode) { - CoreChannelModeTable *tab = &corechannelmodetable[0]; - int i; + Cmode *cm; - /* Extended channel modes */ - for (i=0; i <= Channelmode_highest; i++) - { - if ((Channelmode_Table[i].flag == mode) && (channel->mode.extmode & Channelmode_Table[i].mode)) + for (cm=channelmodes; cm; cm = cm->next) + if ((cm->letter == mode) && (channel->mode.mode & cm->mode)) return 1; - } - /* Built-in channel modes */ - while (tab->mode != 0x0) - { - if ((channel->mode.mode & tab->mode) && (tab->flag == mode)) + return 0; /* Not found */ +} + +/** Returns 1 if channel has this mode is set and 0 if not */ +int has_channel_mode_raw(Cmode_t m, char mode) +{ + Cmode *cm; + + for (cm=channelmodes; cm; cm = cm->next) + if ((cm->letter == mode) && (m & cm->mode)) return 1; - tab++; - } - - /* Special handling for +l (needed??) */ - if (channel->mode.limit && (mode == 'l')) - return 1; - - /* Special handling for +k (needed??) */ - if (channel->mode.key[0] && (mode == 'k')) - return 1; return 0; /* Not found */ } @@ -618,126 +596,88 @@ int has_channel_mode(Channel *channel, char mode) /** Get the extended channel mode 'bit' value (eg: 0x20) by character (eg: 'Z') */ Cmode_t get_extmode_bitbychar(char m) { - int extm; - for (extm=0; extm <= Channelmode_highest; extm++) - { - if (Channelmode_Table[extm].flag == m) - return Channelmode_Table[extm].mode; - } + Cmode *cm; + + for (cm=channelmodes; cm; cm = cm->next) + if (cm->letter == m) + return cm->mode; + return 0; } -/** Get the extended channel mode character (eg: 'Z') by the 'bit' value (eg: 0x20) */ -long get_mode_bitbychar(char m) -{ - CoreChannelModeTable *tab = &corechannelmodetable[0]; - - while(tab->mode != 0x0) - { - if (tab->flag == m) - return tab->mode; - tab++;; - } - return 0; -} - /** Write the "simple" list of channel modes for channel channel onto buffer mbuf with the parameters in pbuf. + * @param client The client requesting the mode list (can be NULL) + * @param mbuf Modes will be stored here + * @param pbuf Mode parameters will be stored here + * @param mbuf_size Length of the mbuf buffer + * @param pbuf_size Length of the pbuf buffer + * @param channel The channel to fetch modes from + * @param hide_local_modes If set to 1 then we will hide local channel modes like Z and d + * (eg: if you intend to send the buffer to a remote server) */ -/* TODO: this function has many security issues and needs an audit, maybe even a recode */ -void channel_modes(Client *client, char *mbuf, char *pbuf, size_t mbuf_size, size_t pbuf_size, Channel *channel) +void channel_modes(Client *client, char *mbuf, char *pbuf, size_t mbuf_size, size_t pbuf_size, Channel *channel, int hide_local_modes) { - CoreChannelModeTable *tab = &corechannelmodetable[0]; - int ismember; - int i; + int ismember = 0; + Cmode *cm; - if (!(mbuf_size && pbuf_size)) return; + if (!mbuf_size || !pbuf_size) + return; - ismember = (IsMember(client, channel) || IsServer(client) || IsMe(client) || IsULine(client)) ? 1 : 0; + if (!client || IsMember(client, channel) || IsServer(client) || IsMe(client) || IsULine(client)) + ismember = 1; *pbuf = '\0'; + strlcpy(mbuf, "+", mbuf_size); - *mbuf++ = '+'; - mbuf_size--; /* Paramless first */ - while (mbuf_size && tab->mode != 0x0) + for (cm=channelmodes; cm; cm = cm->next) { - if ((channel->mode.mode & tab->mode)) - if (!tab->parameters) { - *mbuf++ = tab->flag; - mbuf_size--; - } - tab++; - } - for (i=0; i <= Channelmode_highest; i++) - { - if (!mbuf_size) break; - if (Channelmode_Table[i].flag && !Channelmode_Table[i].paracount && - (channel->mode.extmode & Channelmode_Table[i].mode)) { - *mbuf++ = Channelmode_Table[i].flag; - mbuf_size--; - } - } - if (channel->mode.limit) - { - if (mbuf_size) { - *mbuf++ = 'l'; - mbuf_size--; - } - if (ismember) { - ircsnprintf(pbuf, pbuf_size, "%d ", channel->mode.limit); - pbuf_size-=strlen(pbuf); - pbuf+=strlen(pbuf); - } - } - if (*channel->mode.key) - { - if (mbuf_size) { - *mbuf++ = 'k'; - mbuf_size--; - } - if (ismember && pbuf_size) { - ircsnprintf(pbuf, pbuf_size, "%s ", channel->mode.key); - pbuf_size-=strlen(pbuf); - pbuf+=strlen(pbuf); + if (cm->letter && + !cm->paracount && + !(hide_local_modes && cm->local) && + (channel->mode.mode & cm->mode)) + { + strlcat_letter(mbuf, cm->letter, mbuf_size); } } - for (i=0; i <= Channelmode_highest; i++) + for (cm=channelmodes; cm; cm = cm->next) { - if (Channelmode_Table[i].flag && Channelmode_Table[i].paracount && - (channel->mode.extmode & Channelmode_Table[i].mode)) { - char flag = Channelmode_Table[i].flag; - if (mbuf_size) { - *mbuf++ = flag; - mbuf_size--; - } + if (cm->letter && + cm->paracount && + !(hide_local_modes && cm->local) && + (channel->mode.mode & cm->mode)) + { + char flag = cm->letter; + + if (mbuf_size) + strlcat_letter(mbuf, flag, mbuf_size); + if (ismember) { - ircsnprintf(pbuf, pbuf_size, "%s ", cm_getparameter(channel, flag)); - pbuf_size-=strlen(pbuf); - pbuf+=strlen(pbuf); + strlcat(pbuf, cm_getparameter(channel, flag), pbuf_size); + strlcat(pbuf, " ", pbuf_size); } } } /* Remove the trailing space from the parameters -- codemastr */ - if (*pbuf) pbuf[strlen(pbuf)-1]=0; - - if (!mbuf_size) mbuf--; - *mbuf++ = '\0'; - return; + if (*pbuf) + pbuf[strlen(pbuf)-1]='\0'; } /** Make a pretty mask from the input string - only used by SILENCE */ -char *pretty_mask(char *mask) +char *pretty_mask(const char *mask_in) { - char *cp; - char *user; - char *host; + char mask[512]; + char *cp, *user, *host; + + strlcpy(mask, mask_in, sizeof(mask)); if ((user = strchr((cp = mask), '!'))) *user++ = '\0'; + if ((host = strrchr(user ? user : cp, '@'))) { *host++ = '\0'; @@ -745,7 +685,9 @@ char *pretty_mask(char *mask) return make_nick_user_host(NULL, cp, host); } else if (!user && strchr(cp, '.')) + { return make_nick_user_host(NULL, NULL, cp); + } return make_nick_user_host(cp, user, host); } @@ -772,31 +714,30 @@ char *trim_str(char *str, int len) * @param mask The ban mask * @param what MODE_DEL or MODE_ADD * @param client The client adding/removing this ban mask + * @param conv_options Options for BanContext.conv_options (eg BCTX_CONV_OPTION_WRITE_LETTER_BANS) * @returns pointer to correct banmask or NULL in case of error * @note A pointer is returned to a static buffer, which is overwritten * on next clean_ban_mask or make_nick_user_host call. */ -char *clean_ban_mask(char *mask, int what, Client *client) +const char *clean_ban_mask(const char *mask_in, int what, Client *client, int conv_options) { char *cp, *x; char *user; char *host; - Extban *p; - static char maskbuf[512]; + static char mask[512]; + + /* Strip any ':' at beginning since that would cause a desync */ + for (; (*mask_in && (*mask_in == ':')); mask_in++); + if (!*mask_in) + return NULL; /* Work on a copy */ - strlcpy(maskbuf, mask, sizeof(maskbuf)); - mask = maskbuf; + strlcpy(mask, mask_in, sizeof(mask)); cp = strchr(mask, ' '); if (cp) *cp = '\0'; - /* Strip any ':' at beginning since that would cause a desync */ - for (; (*mask && (*mask == ':')); mask++); - if (!*mask) - return NULL; - /* Forbid ASCII <= 32 in all bans */ for (x = mask; *x; x++) if (*x <= ' ') @@ -805,6 +746,9 @@ char *clean_ban_mask(char *mask, int what, Client *client) /* Extended ban? */ if (is_extended_ban(mask)) { + const char *nextbanstr; + Extban *extban; + if (RESTRICT_EXTENDEDBANS && MyUser(client) && !ValidatePermissionsForPath("immune:restrict-extendedbans",client,NULL,NULL,NULL)) { if (!strcmp(RESTRICT_EXTENDEDBANS, "*")) @@ -819,8 +763,9 @@ char *clean_ban_mask(char *mask, int what, Client *client) return NULL; } } - p = findmod_by_bantype(mask[1]); - if (!p) + + extban = findmod_by_bantype(mask, &nextbanstr); + if (!extban) { /* extended bantype not supported, what to do? * Here are the rules: @@ -833,8 +778,21 @@ char *clean_ban_mask(char *mask, int what, Client *client) return mask; /* allow it */ return NULL; /* reject */ } - if (p->conv_param) - return p->conv_param(mask); + + if (extban->conv_param) + { + const char *ret; + static char retbuf[512]; + BanContext *b = safe_alloc(sizeof(BanContext)); + b->client = client; + b->what = what; + b->banstr = nextbanstr; + b->conv_options = conv_options; + ret = extban->conv_param(b, extban); + ret = prefix_with_extban(ret, b, extban, retbuf, sizeof(retbuf)); + safe_free(b); + return ret; + } /* else, do some basic sanity checks and cut it off at 80 bytes */ if ((mask[1] != ':') || (mask[2] == '\0')) return NULL; /* require a ":" after extban type */ @@ -864,11 +822,23 @@ char *clean_ban_mask(char *mask, int what, Client *client) int find_invex(Channel *channel, Client *client) { Ban *inv; + BanContext *b = safe_alloc(sizeof(BanContext)); + + b->client = client; + b->channel = channel; + b->ban_check_types = BANCHK_JOIN; for (inv = channel->invexlist; inv; inv = inv->next) - if (ban_check_mask(client, channel, inv->banstr, BANCHK_JOIN, NULL, NULL, 0)) + { + b->banstr = inv->banstr; + if (ban_check_mask(b)) + { + safe_free(b); return 1; + } + } + safe_free(b); return 0; } @@ -924,134 +894,77 @@ int valid_channelname(const char *cname) return 1; /* Valid */ } -/** Get existing channel 'chname' or create a new one. - * @param client User creating or searching this channel - * @param chname Channel name +void initlist_channels(void) +{ + channel_pool = mp_pool_new(sizeof(Channel), 512 * 1024); +} + +/** Create channel 'name' (or if it exists, return the existing one) + * @param name Channel name * @param flag If set to 'CREATE' then the channel is * created if it does not exist. * @returns Pointer to channel (new or existing). * @note Be sure to call valid_channelname() first before * you blindly call this function! */ -Channel *get_channel(Client *client, char *chname, int flag) +Channel *make_channel(const char *name) { Channel *channel; - int len; + int len; + char *p; + char namebuf[CHANNELLEN+1]; - if (BadPtr(chname)) + if (BadPtr(name)) return NULL; - len = strlen(chname); - if (MyUser(client) && len > CHANNELLEN) + /* Copy and silently truncate */ + strlcpy(namebuf, name, sizeof(namebuf)); + + /* Copied from valid_channelname(), the minimal requirements */ + for (p = namebuf; *p; p++) { - len = CHANNELLEN; - *(chname + CHANNELLEN) = '\0'; - } - if ((channel = find_channel(chname, NULL))) - return (channel); - if (flag == CREATE) - { - channel = safe_alloc(sizeof(Channel) + len); - strlcpy(channel->chname, chname, len + 1); - if (channels) - channels->prevch = channel; - channel->topic = NULL; - channel->topic_nick = NULL; - channel->prevch = NULL; - channel->nextch = channels; - channel->creationtime = MyUser(client) ? TStime() : 0; - channels = channel; - add_to_channel_hash_table(chname, channel); - irccounts.channels++; - RunHook2(HOOKTYPE_CHANNEL_CREATE, client, channel); + if (*p < 33 || *p == ',' || *p == ':') + { + *p = '\0'; + break; + } } + + /* Exists? Return it. */ + if ((channel = find_channel(name))) + return channel; + + channel = mp_pool_get(channel_pool); + memset(channel, 0, sizeof(Channel)); + + strlcpy(channel->name, name, sizeof(channel->name)); + + if (channels) + channels->prevch = channel; + + channel->topic = NULL; + channel->topic_nick = NULL; + channel->prevch = NULL; + channel->nextch = channels; + channel->creationtime = TStime(); + channels = channel; + add_to_channel_hash_table(channel->name, channel); + irccounts.channels++; + + RunHook(HOOKTYPE_CHANNEL_CREATE, channel); + return channel; } -/** Register an invite from someone to a channel - so they can bypass +i etc. - * @param from The person sending the invite - * @param to The person who is invited to join - * @param channel The channel - * @param mtags Message tags associated with this INVITE command - */ -void add_invite(Client *from, Client *to, Channel *channel, MessageTag *mtags) -{ - Link *inv, *tmp; - - del_invite(to, channel); - /* If too many invite entries then delete the oldest one */ - if (list_length(to->user->invited) >= MAXCHANNELSPERUSER) - { - for (tmp = to->user->invited; tmp->next; tmp = tmp->next) - ; - del_invite(to, tmp->value.channel); - - } - /* We get pissy over too many invites per channel as well now, - * since otherwise mass-inviters could take up some major - * resources -Donwulff - */ - if (list_length(channel->invites) >= MAXCHANNELSPERUSER) - { - for (tmp = channel->invites; tmp->next; tmp = tmp->next) - ; - del_invite(tmp->value.client, channel); - } - /* - * add client to the beginning of the channel invite list - */ - inv = make_link(); - inv->value.client = to; - inv->next = channel->invites; - channel->invites = inv; - /* - * add channel to the beginning of the client invite list - */ - inv = make_link(); - inv->value.channel = channel; - inv->next = to->user->invited; - to->user->invited = inv; - - RunHook4(HOOKTYPE_INVITE, from, to, channel, mtags); -} - -/** Delete a previous invite of someone to a channel. - * @param client The client who was invited - * @param channel The channel to which the person was invited - */ -void del_invite(Client *client, Channel *channel) -{ - Link **inv, *tmp; - - for (inv = &(channel->invites); (tmp = *inv); inv = &tmp->next) - if (tmp->value.client == client) - { - *inv = tmp->next; - free_link(tmp); - break; - } - - for (inv = &(client->user->invited); (tmp = *inv); inv = &tmp->next) - if (tmp->value.channel == channel) - { - *inv = tmp->next; - free_link(tmp); - break; - } -} - /** Is the user 'client' invited to channel 'channel' by a chanop? * @param client The client who was invited * @param channel The channel to which the person was invited */ int is_invited(Client *client, Channel *channel) { - Link *lp; - - for (lp = client->user->invited; lp; lp = lp->next) - if (lp->value.channel == channel) - return 1; - return 0; + int invited = 0; + RunHook(HOOKTYPE_IS_INVITED, client, channel, &invited); + return invited; } /** Subtract one user from channel i. Free the channel if it became empty. @@ -1072,7 +985,7 @@ int sub1_from_channel(Channel *channel) channel->users = 0; /* to be sure */ /* If the channel is +P then this hook will actually stop destruction. */ - RunHook2(HOOKTYPE_CHANNEL_DESTROY, channel, &should_destroy); + RunHook(HOOKTYPE_CHANNEL_DESTROY, channel, &should_destroy); if (!should_destroy) return 0; @@ -1082,9 +995,6 @@ int sub1_from_channel(Channel *channel) moddata_free_channel(channel); - while ((lp = channel->invites)) - del_invite(lp->value.client, channel); - while (channel->banlist) { ban = channel->banlist; @@ -1111,7 +1021,7 @@ int sub1_from_channel(Channel *channel) } /* free extcmode params */ - extcmode_free_paramlist(channel->mode.extmodeparams); + extcmode_free_paramlist(channel->mode.mode_params); safe_free(channel->mode_lock); safe_free(channel->topic); @@ -1124,10 +1034,10 @@ int sub1_from_channel(Channel *channel) if (channel->nextch) channel->nextch->prevch = channel->prevch; - del_from_channel_hash_table(channel->chname, channel); + del_from_channel_hash_table(channel->name, channel); irccounts.channels--; - safe_free(channel); + mp_pool_release(channel); return 1; } @@ -1143,7 +1053,7 @@ void set_channel_mlock(Client *client, Channel *channel, const char *newmlock, i if (propagate) { sendto_server(client, 0, 0, NULL, ":%s MLOCK %lld %s :%s", - client->id, (long long)channel->creationtime, channel->chname, + client->id, (long long)channel->creationtime, channel->name, BadPtr(channel->mode_lock) ? "" : channel->mode_lock); } } @@ -1159,14 +1069,14 @@ void set_channel_mlock(Client *client, Channel *channel, const char *newmlock, i * int ret; * for (ret = parse_chanmode(&pm, modebuf, parabuf); ret; ret = parse_chanmode(&pm, NULL, NULL)) * { - * ircd_log(LOG_ERROR, "Got %c%c %s", - * pm.what == MODE_ADD ? '+' : '-', - * pm.modechar, - * pm.param ? pm.param : ""); + * unreal_log(ULOG_INFO, "test", "TEST", "Got %c%c %s", + * pm.what == MODE_ADD ? '+' : '-', + * pm.modechar, + * pm.param ? pm.param : ""); * } * @endcode */ -int parse_chanmode(ParseMode *pm, char *modebuf_in, char *parabuf_in) +int parse_chanmode(ParseMode *pm, const char *modebuf_in, const char *parabuf_in) { if (modebuf_in) { @@ -1196,7 +1106,7 @@ int parse_chanmode(ParseMode *pm, char *modebuf_in, char *parabuf_in) else { CoreChannelModeTable *tab = &corechannelmodetable[0]; - int i; + Cmode *cm; int eatparam = 0; /* Set some defaults */ @@ -1216,32 +1126,31 @@ int parse_chanmode(ParseMode *pm, char *modebuf_in, char *parabuf_in) /* INTERNAL MODE */ if (tab->parameters) { - if ((pm->what == MODE_DEL) && (tab->flag == 'l')) - eatparam = 0; /* -l is special: no parameter required */ - else - eatparam = 1; /* all other internal parameter modes do require a parameter on unset */ + eatparam = 1; } } else { /* EXTENDED CHANNEL MODE */ int found = 0; - for (i=0; i <= Channelmode_highest; i++) - if (Channelmode_Table[i].flag == *pm->modebuf) + for (cm=channelmodes; cm; cm = cm->next) + { + if (cm->letter == *pm->modebuf) { found = 1; break; } + } if (!found) { /* Not found. Will be ignored, just move on.. */ pm->modebuf++; continue; } - pm->extm = &Channelmode_Table[i]; - if (Channelmode_Table[i].paracount == 1) + pm->extm = cm; + if (cm->paracount == 1) { if (pm->what == MODE_ADD) eatparam = 1; - else if (Channelmode_Table[i].unset_with_param) + else if (cm->unset_with_param) eatparam = 1; /* else 0 (if MODE_DEL && !unset_with_param) */ } @@ -1252,7 +1161,7 @@ int parse_chanmode(ParseMode *pm, char *modebuf_in, char *parabuf_in) /* Hungry.. */ if (pm->parabuf && *pm->parabuf) { - char *start, *end; + const char *start, *end; for (; *pm->parabuf == ' '; pm->parabuf++); /* skip whitespace */ start = pm->parabuf; if (*pm->parabuf == '\0') @@ -1274,6 +1183,7 @@ int parse_chanmode(ParseMode *pm, char *modebuf_in, char *parabuf_in) strlcpy(pm->buf, start, sizeof(pm->buf)); pm->parabuf = pm->parabuf + strlen(pm->parabuf); /* point to \0 at end */ } + stripcrlf(pm->buf); /* needed for unreal_server_compat.c */ pm->param = pm->buf; } else { pm->modebuf++; @@ -1319,7 +1229,7 @@ int user_can_see_member(Client *user, Client *target, Channel *channel) } /* We must ensure that user is allowed to "see" target */ - if (j != 0 && !(is_skochanop(target, channel) || has_voice(target,channel)) && !is_skochanop(user, channel)) + if (j != 0 && !(check_channel_access(target, channel, "hoaq") || check_channel_access(target,channel, "v")) && !check_channel_access(user, channel, "hoaq")) return 0; return 1; @@ -1341,7 +1251,7 @@ int invisible_user_in_channel(Client *target, Channel *channel) } /* We must ensure that user is allowed to "see" target */ - if (j != 0 && !(is_skochanop(target, channel) || has_voice(target,channel))) + if (j != 0 && !(check_channel_access(target, channel, "hoaq") || check_channel_access(target,channel, "v"))) return 1; return 0; @@ -1352,9 +1262,9 @@ int invisible_user_in_channel(Client *target, Channel *channel) * @param client The client to send the message to. * @param channelname The (invalid) channel that the user tried to join. */ -void send_invalid_channelname(Client *client, char *channelname) +void send_invalid_channelname(Client *client, const char *channelname) { - char *reason; + const char *reason; if (*channelname != '#') { @@ -1383,10 +1293,60 @@ void send_invalid_channelname(Client *client, char *channelname) /** Is the provided string possibly an extended ban? * Note that it still may not exist, it just tests the first part. + * @param str The string to check (eg "~account:xyz") */ int is_extended_ban(const char *str) { - if ((str[0] == '~') && (str[1] != '\0') && (str[2] == ':')) + const char *p; + + if (*str != '~') + return 0; + for (p = str+1; *p; p++) + { + if (!isalnum(*p)) + { + if (*p == ':') + return 1; + } + } + return 0; +} + +/** Is the provided string possibly an extended server ban? + * Actually this is only a very light check. + * It may still not exist, it just tests the first part. + * @param str The string to check (eg "~account:xyz") + * The only difference between this and is_extended_ban() + * is that we allow a % at the beginning for soft-bans. + * @see is_extended_ban() + */ +int is_extended_server_ban(const char *str) +{ + if (*str == '%') + str++; + return is_extended_ban(str); +} + +/** Check if it is an empty (useless) mode, namely "", "+" or "-". + * Typically called as: empty_mode(modebuf) + */ +int empty_mode(const char *m) +{ + if (!*m || (((m[0] == '+') || (m[0] == '-')) && m[1] == '\0')) return 1; return 0; } + +/** Free everything of/in a MultiLineMode */ +void free_multilinemode(MultiLineMode *m) +{ + int i; + if (m == NULL) + return; + for (i=0; i < m->numlines; i++) + { + safe_free(m->modeline[i]); + safe_free(m->paramline[i]); + } + safe_free(m); +} diff --git a/src/conf.c b/src/conf.c index 694f266..f3d78df 100644 --- a/src/conf.c +++ b/src/conf.c @@ -31,13 +31,6 @@ struct ConfigCommand int (*testfunc)(ConfigFile *conf, ConfigEntry *ce); }; -typedef struct NameValue NameValue; -struct NameValue -{ - long flag; - char *name; -}; - /* Config commands */ @@ -65,7 +58,6 @@ static int _conf_deny_version (ConfigFile *conf, ConfigEntry *ce); static int _conf_require (ConfigFile *conf, ConfigEntry *ce); static int _conf_allow_channel (ConfigFile *conf, ConfigEntry *ce); static int _conf_loadmodule (ConfigFile *conf, ConfigEntry *ce); -static int _conf_log (ConfigFile *conf, ConfigEntry *ce); static int _conf_alias (ConfigFile *conf, ConfigEntry *ce); static int _conf_help (ConfigFile *conf, ConfigEntry *ce); static int _conf_offchans (ConfigFile *conf, ConfigEntry *ce); @@ -99,7 +91,6 @@ static int _test_deny (ConfigFile *conf, ConfigEntry *ce); static int _test_allow_channel (ConfigFile *conf, ConfigEntry *ce); static int _test_loadmodule (ConfigFile *conf, ConfigEntry *ce); static int _test_blacklist_module (ConfigFile *conf, ConfigEntry *ce); -static int _test_log (ConfigFile *conf, ConfigEntry *ce); static int _test_alias (ConfigFile *conf, ConfigEntry *ce); static int _test_help (ConfigFile *conf, ConfigEntry *ce); static int _test_offchans (ConfigFile *conf, ConfigEntry *ce); @@ -124,7 +115,7 @@ static ConfigCommand _ConfigCommands[] = { { "link", _conf_link, _test_link }, { "listen", _conf_listen, _test_listen }, { "loadmodule", NULL, _test_loadmodule}, - { "log", _conf_log, _test_log }, + { "log", config_run_log, config_test_log }, { "me", _conf_me, _test_me }, { "official-channels", _conf_offchans, _test_offchans }, { "oper", _conf_oper, _test_oper }, @@ -158,22 +149,6 @@ static NameValue _LinkFlags[] = { { CONNECT_TLS, "tls" }, }; -/* This MUST be alphabetized */ -static NameValue _LogFlags[] = { - { LOG_CHGCMDS, "chg-commands" }, - { LOG_CLIENT, "connects" }, - { LOG_ERROR, "errors" }, - { LOG_FLOOD, "flood" }, - { LOG_KILL, "kills" }, - { LOG_KLINE, "kline" }, - { LOG_OPER, "oper" }, - { LOG_OVERRIDE, "oper-override" }, - { LOG_SACMDS, "sadmin-commands" }, - { LOG_SERVER, "server-connects" }, - { LOG_SPAMFILTER, "spamfilter" }, - { LOG_TKL, "tkl" }, -}; - /* This MUST be alphabetized */ static NameValue _TLSFlags[] = { { TLSFLAG_FAILIFNOCERT, "fail-if-no-clientcert" }, @@ -194,28 +169,25 @@ struct SetCheck settings; * Utilities */ -void port_range(char *string, int *start, int *end); -long config_checkval(char *value, unsigned short flags); +void port_range(const char *string, int *start, int *end); +long config_checkval(const char *value, unsigned short flags); /* * Parser */ -ConfigFile *config_load(char *filename, char *displayname); +ConfigFile *config_load(const char *filename, const char *displayname); void config_free(ConfigFile *cfptr); -ConfigFile *config_parse_with_offset(char *filename, char *confdata, unsigned int line_offset); -ConfigFile *config_parse(char *filename, char *confdata); -ConfigEntry *config_find_entry(ConfigEntry *ce, char *name); +ConfigFile *config_parse_with_offset(const char *filename, char *confdata, unsigned int line_offset); +ConfigFile *config_parse(const char *filename, char *confdata); +ConfigEntry *config_find_entry(ConfigEntry *ce, const char *name); -extern void add_entropy_configfile(struct stat *st, char *buf); -extern void unload_all_unused_snomasks(void); +extern void add_entropy_configfile(struct stat *st, const char *buf); extern void unload_all_unused_umodes(void); extern void unload_all_unused_extcmodes(void); extern void unload_all_unused_caps(void); extern void unload_all_unused_history_backends(void); - int reloadable_perm_module_unloaded(void); - int tls_tests(void); /* Conf sub-sub-functions */ @@ -226,10 +198,11 @@ void free_tls_options(TLSOptions *tlsoptions); /* * Config parser (IRCd) */ -int init_conf(char *rootconf, int rehash); -int load_conf(char *filename, const char *original_path); +int config_read_file(const char *filename, const char *display_name); void config_rehash(); -int config_run(); +int config_run_blocks(); +int config_test_blocks(); + /* * Configuration linked lists */ @@ -247,7 +220,6 @@ ConfigItem_operclass *conf_operclass = NULL; ConfigItem_listen *conf_listen = NULL; ConfigItem_sni *conf_sni = NULL; ConfigItem_allow *conf_allow = NULL; -ConfigItem_except *conf_except = NULL; ConfigItem_vhost *conf_vhost = NULL; ConfigItem_link *conf_link = NULL; ConfigItem_ban *conf_ban = NULL; @@ -255,9 +227,8 @@ ConfigItem_deny_channel *conf_deny_channel = NULL; ConfigItem_allow_channel *conf_allow_channel = NULL; ConfigItem_deny_link *conf_deny_link = NULL; ConfigItem_deny_version *conf_deny_version = NULL; -ConfigItem_log *conf_log = NULL; ConfigItem_alias *conf_alias = NULL; -ConfigItem_include *conf_include = NULL; +ConfigResource *config_resources = NULL; ConfigItem_blacklist_module *conf_blacklist_module = NULL; ConfigItem_help *conf_help = NULL; ConfigItem_offchans *conf_offchans = NULL; @@ -274,25 +245,19 @@ MODVAR Client *remote_rehash_client = NULL; MODVAR int config_error_flag = 0; int config_verbose = 0; -MODVAR int need_34_upgrade = 0; int need_operclass_permissions_upgrade = 0; +int invalid_snomasks_encountered = 0; int have_tls_listeners = 0; char *port_6667_ip = NULL; -void add_include(const char *filename, const char *included_from, int included_from_line); -#ifdef USE_LIBCURL -void add_remote_include(const char *, const char *, int, const char *, const char *included_from, int included_from_line); -void update_remote_include(ConfigItem_include *inc, const char *file, int, const char *errorbuf); -int remote_include(ConfigEntry *ce); -#endif -void unload_notloaded_includes(void); -void load_includes(void); -void unload_loaded_includes(void); -int rehash_internal(Client *client, int sig); -int is_blacklisted_module(char *name); +int add_config_resource(const char *resource, int type, ConfigEntry *ce); +void resource_download_complete(const char *url, const char *file, const char *errorbuf, int cached, void *rs_key); +void free_all_config_resources(void); +int rehash_internal(Client *client); +int is_blacklisted_module(const char *name); /** Return the printable string of a 'cep' location, such as set::something::xyz */ -char *config_var(ConfigEntry *cep) +const char *config_var(ConfigEntry *cep) { static char buf[256]; ConfigEntry *e; @@ -305,9 +270,9 @@ char *config_var(ConfigEntry *cep) buf[0] = '\0'; /* First, walk back to the top */ - for (e = cep; e; e = e->ce_prevlevel) + for (e = cep; e; e = e->parent) { - elem[numel++] = e->ce_varname; + elem[numel++] = e->name; if (numel == 15) break; } @@ -323,9 +288,12 @@ char *config_var(ConfigEntry *cep) return buf; } -void port_range(char *string, int *start, int *end) +void port_range(const char *string, int *start, int *end) { - char *c = strchr(string, '-'); + char buf[256]; + char *c; + strlcpy(buf, string, sizeof(buf)); + c = strchr(buf, '-'); if (!c) { int tmp = atoi(string); @@ -346,18 +314,21 @@ void port_range(char *string, int *start, int *end) * RETURNS: 0 for parse error, 1 if ok. * REMARK: times&period should be ints! */ -int config_parse_flood(char *orig, int *times, int *period) +int config_parse_flood(const char *orig, int *times, int *period) { -char *x; + char buf[256]; + char *x; + + strlcpy(buf, orig, sizeof(buf)); *times = *period = 0; - x = strchr(orig, ':'); + x = strchr(buf, ':'); /* 'blah', ':blah', '1:' */ - if (!x || (x == orig) || (*(x+1) == '\0')) + if (!x || (x == buf) || (*(x+1) == '\0')) return 0; *x = '\0'; - *times = atoi(orig); + *times = atoi(buf); *period = config_checkval(x+1, CFG_TIME); *x = ':'; /* restore */ return 1; @@ -441,6 +412,12 @@ int flood_option_is_for_everyone(const char *name) return text_in_array(name, opts); } +/** Free a FloodSettings struct */ +void free_floodsettings(FloodSettings *f) +{ + safe_free(f->name); + safe_free(f); +} /** Parses a value like '5:60s' into a flood setting that we can store. * @param str The string to parse (eg: '5:60s') @@ -485,7 +462,8 @@ int config_parse_flood_generic(const char *str, Configuration *conf, char *block return 1; } -long config_checkval(char *orig, unsigned short flags) { +long config_checkval(const char *orig, unsigned short flags) +{ char *value = raw_strdup(orig); char *text; long ret = 0; @@ -594,24 +572,20 @@ long config_checkval(char *orig, unsigned short flags) { /** Free configuration setting for set::modes-on-join */ void free_conf_channelmodes(struct ChMode *store) { - int i; - - store->mode = 0; - store->extmodes = 0; - for (i = 0; i < EXTCMODETABLESZ; i++) - safe_free(store->extparams[i]); + memset(store, 0, sizeof(struct ChMode)); } /* Set configuration, used for set::modes-on-join */ -void conf_channelmodes(char *modes, struct ChMode *store, int warn) +void conf_channelmodes(const char *modes, struct ChMode *store) { - CoreChannelModeTable *tab; + Cmode *cm; + const char *m; char *params = strchr(modes, ' '); char *parambuf = NULL; - char *param = NULL; + const char *param = NULL; + const char *param_in; char *save = NULL; - - warn = 0; // warn is broken + int found; /* Free existing parameters first (no inheritance) */ free_conf_channelmodes(store); @@ -623,107 +597,86 @@ void conf_channelmodes(char *modes, struct ChMode *store, int warn) param = strtoken(&save, parambuf, " "); } - for (; *modes && *modes != ' '; modes++) + for (m = modes; *m && *m != ' '; m++) { - if (*modes == '+') + if (*m == '+') continue; - if (*modes == '-') - /* When a channel is created it has no modes, so just ignore if the - * user asks us to unset anything -- codemastr - */ + + if (*m == '-') { - while (*modes && *modes != '+') - modes++; + /* When a channel is created it has no modes, so just ignore if the + * user asks us to unset anything -- codemastr + */ + while (*m && *m != '+') + m++; continue; } - for (tab = &corechannelmodetable[0]; tab->mode; tab++) + + found = 0; + for (cm=channelmodes; cm; cm = cm->next) { - if (tab->flag == *modes) + if (!(cm->letter)) + continue; + if (*m == cm->letter) { - if (tab->parameters) + found = 1; + if (cm->paracount) { - /* INCOMPATIBLE */ - break; + if (!param) + { + config_warn("set::modes-on-join '%s'. Parameter missing for mode %c.", modes, *m); + break; + } + param_in = param; /* save it */ + param = cm->conv_param(param, NULL, NULL); + if (!param) + { + config_warn("set::modes-on-join '%s'. Parameter for mode %c is invalid (%s).", modes, *m, param_in); + break; /* invalid parameter fmt, do not set mode. */ + } + safe_strdup(store->extparams[cm->letter], param); + /* Get next parameter */ + param = strtoken(&save, NULL, " "); } - store->mode |= tab->mode; + store->extmodes |= cm->mode; break; } } - /* Try extcmodes */ - if (!tab->mode) - { - int i; - for (i=0; i <= Channelmode_highest; i++) - { - if (!(Channelmode_Table[i].flag)) - continue; - if (*modes == Channelmode_Table[i].flag) - { - if (Channelmode_Table[i].paracount) - { - if (!param) - break; - param = Channelmode_Table[i].conv_param(param, NULL, NULL); - if (!param) - break; /* invalid parameter fmt, do not set mode. */ - store->extparams[i] = raw_strdup(param); - /* Get next parameter */ - param = strtoken(&save, NULL, " "); - } - store->extmodes |= Channelmode_Table[i].mode; - break; - } - } - } + if (!found) + config_warn("set::modes-on-join '%s'. Channel mode %c not found.", modes, *m); } safe_free(parambuf); } void chmode_str(struct ChMode *modes, char *mbuf, char *pbuf, size_t mbuf_size, size_t pbuf_size) { - CoreChannelModeTable *tab; - int i; + Cmode *cm; if (!(mbuf_size && pbuf_size)) return; *pbuf = 0; *mbuf++ = '+'; - if (--mbuf_size == 0) return; - for (tab = &corechannelmodetable[0]; tab->mode; tab++) + + for (cm=channelmodes; cm; cm = cm->next) { - if (modes->mode & tab->mode) - { - if (!tab->parameters) - { - *mbuf++ = tab->flag; - if (!--mbuf_size) - { - *--mbuf=0; - break; - } - } - } - } - for (i=0; i <= Channelmode_highest; i++) - { - if (!(Channelmode_Table[i].flag)) + if (!(cm->letter)) continue; - if (modes->extmodes & Channelmode_Table[i].mode) + if (modes->extmodes & cm->mode) { if (mbuf_size) { - *mbuf++ = Channelmode_Table[i].flag; + *mbuf++ = cm->letter; if (!--mbuf_size) { *--mbuf=0; break; } } - if (Channelmode_Table[i].paracount) + if (cm->paracount) { - strlcat(pbuf, modes->extparams[i], pbuf_size); + strlcat(pbuf, modes->extparams[cm->letter], pbuf_size); strlcat(pbuf, " ", pbuf_size); } } @@ -731,87 +684,26 @@ void chmode_str(struct ChMode *modes, char *mbuf, char *pbuf, size_t mbuf_size, *mbuf=0; } -int channellevel_to_int(char *s) +const char *channellevel_to_string(const char *s) { /* Requested at http://bugs.unrealircd.org/view.php?id=3852 */ if (!strcmp(s, "none")) - return CHFL_DEOPPED; + return ""; if (!strcmp(s, "voice")) - return CHFL_VOICE; + return "v"; if (!strcmp(s, "halfop")) - return CHFL_HALFOP; + return "h"; if (!strcmp(s, "op") || !strcmp(s, "chanop")) - return CHFL_CHANOP; - if (!strcmp(s, "protect") || !strcmp(s, "chanprot")) -#ifdef PREFIX_AQ - return CHFL_CHANADMIN; -#else - return CHFL_CHANOP|CHFL_CHANADMIN; -#endif + return "o"; + if (!strcmp(s, "protect") || !strcmp(s, "chanprot") || !strcmp(s, "chanadmin") || !strcmp(s, "admin")) + return "a"; if (!strcmp(s, "owner") || !strcmp(s, "chanowner")) -#ifdef PREFIX_AQ - return CHFL_CHANOWNER; -#else - return CHFL_CHANOP|CHFL_CHANOWNER; -#endif + return "q"; - return 0; /* unknown or unsupported */ + return NULL; /* unknown or unsupported */ } -/* Channel flag (eg: CHFL_CHANOWNER) to SJOIN symbol (eg: *). - * WARNING: Do not confuse SJOIN symbols with prefixes in /NAMES! - */ -char *chfl_to_sjoin_symbol(int s) -{ - switch(s) - { - case CHFL_VOICE: - return "+"; - case CHFL_HALFOP: - return "%"; - case CHFL_CHANOP: - return "@"; - case CHFL_CHANADMIN: -#ifdef PREFIX_AQ - return "~"; -#else - return "~@"; -#endif - case CHFL_CHANOWNER: -#ifdef PREFIX_AQ - return "*"; -#else - return "*@"; -#endif - case CHFL_DEOPPED: - default: - return ""; - } - /* NOT REACHED */ -} - -char chfl_to_chanmode(int s) -{ - switch(s) - { - case CHFL_VOICE: - return 'v'; - case CHFL_HALFOP: - return 'h'; - case CHFL_CHANOP: - return 'o'; - case CHFL_CHANADMIN: - return 'a'; - case CHFL_CHANOWNER: - return 'q'; - case CHFL_DEOPPED: - default: - return '\0'; - } - /* NOT REACHED */ -} - -Policy policy_strtoval(char *s) +Policy policy_strtoval(const char *s) { if (!s) return 0; @@ -828,7 +720,7 @@ Policy policy_strtoval(char *s) return 0; } -char *policy_valtostr(Policy policy) +const char *policy_valtostr(Policy policy) { if (policy == POLICY_ALLOW) return "allow"; @@ -850,7 +742,7 @@ char policy_valtochar(Policy policy) return '?'; } -AllowedChannelChars allowed_channelchars_strtoval(char *str) +AllowedChannelChars allowed_channelchars_strtoval(const char *str) { if (!strcmp(str, "ascii")) return ALLOWED_CHANNELCHARS_ASCII; @@ -861,7 +753,7 @@ AllowedChannelChars allowed_channelchars_strtoval(char *str) return 0; } -char *allowed_channelchars_valtostr(AllowedChannelChars v) +const char *allowed_channelchars_valtostr(AllowedChannelChars v) { switch(v) { @@ -879,7 +771,7 @@ char *allowed_channelchars_valtostr(AllowedChannelChars v) } /* Used for set::automatic-ban-target and set::manual-ban-target */ -BanTarget ban_target_strtoval(char *str) +BanTarget ban_target_strtoval(const char *str) { if (!strcmp(str, "ip")) return BAN_TARGET_IP; @@ -897,7 +789,7 @@ BanTarget ban_target_strtoval(char *str) } /* Used for set::automatic-ban-target and set::manual-ban-target */ -char *ban_target_valtostr(BanTarget v) +const char *ban_target_valtostr(BanTarget v) { switch(v) { @@ -918,7 +810,7 @@ char *ban_target_valtostr(BanTarget v) } } -HideIdleTimePolicy hideidletime_strtoval(char *str) +HideIdleTimePolicy hideidletime_strtoval(const char *str) { if (!strcmp(str, "never")) return HIDE_IDLE_TIME_NEVER; @@ -931,7 +823,7 @@ HideIdleTimePolicy hideidletime_strtoval(char *str) return 0; } -char *hideidletime_valtostr(HideIdleTimePolicy v) +const char *hideidletime_valtostr(HideIdleTimePolicy v) { switch(v) { @@ -948,7 +840,7 @@ char *hideidletime_valtostr(HideIdleTimePolicy v) } } -ConfigFile *config_load(char *filename, char *displayname) +ConfigFile *config_load(const char *filename, const char *displayname) { struct stat sb; int fd; @@ -1013,10 +905,10 @@ void config_free(ConfigFile *cfptr) for(;cfptr;cfptr=nptr) { - nptr = cfptr->cf_next; - if (cfptr->cf_entries) - config_entry_free_all(cfptr->cf_entries); - safe_free(cfptr->cf_filename); + nptr = cfptr->next; + if (cfptr->items) + config_entry_free_all(cfptr->items); + safe_free(cfptr->filename); safe_free(cfptr); } } @@ -1043,7 +935,7 @@ void unreal_del_quotes(char *i) } /** Add quotes to a line, eg some"thing becomes some\"thing - extended version */ -int unreal_add_quotes_r(char *i, char *o, size_t len) +int unreal_add_quotes_r(const char *i, char *o, size_t len) { if (len == 0) return 0; @@ -1079,7 +971,7 @@ int unreal_add_quotes_r(char *i, char *o, size_t len) } /** Add quotes to a line, eg some"thing becomes some\"thing */ -char *unreal_add_quotes(char *str) +const char *unreal_add_quotes(const char *str) { static char qbuf[2048]; @@ -1088,14 +980,15 @@ char *unreal_add_quotes(char *str) return qbuf; } -ConfigFile *config_parse(char *filename, char *confdata){ +ConfigFile *config_parse(const char *filename, char *confdata) +{ return config_parse_with_offset(filename, confdata, 0); } /* This is the internal parser, made by Chris Behrens & Fred Jacobs <2005. * Enhanced (or mutilated) by Bram Matthys over the years (2015-2019). */ -ConfigFile *config_parse_with_offset(char *filename, char *confdata, unsigned int line_offset) +ConfigFile *config_parse_with_offset(const char *filename, char *confdata, unsigned int line_offset) { char *ptr; char *start; @@ -1110,8 +1003,8 @@ ConfigFile *config_parse_with_offset(char *filename, char *confdata, unsigned in ConditionalConfig *cc, *cc_list = NULL; curcf = safe_alloc(sizeof(ConfigFile)); - safe_strdup(curcf->cf_filename, filename); - lastce = &(curcf->cf_entries); + safe_strdup(curcf->filename, filename); + lastce = &(curcf->items); curce = NULL; cursection = NULL; /* Replace \r's with spaces .. ugly ugly -Stskeeps */ @@ -1131,8 +1024,8 @@ ConfigFile *config_parse_with_offset(char *filename, char *confdata, unsigned in break; } *lastce = curce; - lastce = &(curce->ce_next); - curce->ce_fileposend = (ptr - confdata); + lastce = &(curce->next); + curce->file_position_end = (ptr - confdata); curce = NULL; break; case '{': @@ -1144,7 +1037,7 @@ ConfigFile *config_parse_with_offset(char *filename, char *confdata, unsigned in errors++; continue; } - else if (curce->ce_entries) + else if (curce->items) { config_error("%s:%i: New section start but previous section did not end properly. " "Check line %d and the line(s) before, you are likely missing a '};' there.\n", @@ -1152,8 +1045,8 @@ ConfigFile *config_parse_with_offset(char *filename, char *confdata, unsigned in errors++; continue; } - curce->ce_sectlinenum = linenumber; - lastce = &(curce->ce_entries); + curce->section_linenumber = linenumber; + lastce = &(curce->items); cursection = curce; curce = NULL; break; @@ -1176,20 +1069,20 @@ ConfigFile *config_parse_with_offset(char *filename, char *confdata, unsigned in continue; } curce = cursection; - cursection->ce_fileposend = (ptr - confdata); - cursection = cursection->ce_prevlevel; + cursection->file_position_end = (ptr - confdata); + cursection = cursection->parent; if (!cursection) - lastce = &(curcf->cf_entries); + lastce = &(curcf->items); else - lastce = &(cursection->ce_entries); - for(;*lastce;lastce = &((*lastce)->ce_next)) + lastce = &(cursection->items); + for(;*lastce;lastce = &((*lastce)->next)) continue; if (*(ptr+1) != ';') { /* Simulate closing ; so you can get away with } instead of ugly }; */ *lastce = curce; - lastce = &(curce->ce_next); - curce->ce_fileposend = (ptr - confdata); + lastce = &(curce->next); + curce->file_position_end = (ptr - confdata); curce = NULL; } break; @@ -1239,17 +1132,21 @@ ConfigFile *config_parse_with_offset(char *filename, char *confdata, unsigned in } } break; + case '\'': + if (curce) + curce->escaped = 1; + /* fallthrough */ case '\"': - if (curce && curce->ce_varlinenum != linenumber && cursection) + if (curce && curce->line_number != linenumber && cursection) { config_error("%s:%i: Missing semicolon (';') at end of line. " "Line %d must end with a ; character\n", - filename, curce->ce_varlinenum, curce->ce_varlinenum); + filename, curce->line_number, curce->line_number); errors++; *lastce = curce; - lastce = &(curce->ce_next); - curce->ce_fileposend = (ptr - confdata); + lastce = &(curce->next); + curce->file_position_end = (ptr - confdata); curce = NULL; } @@ -1258,14 +1155,18 @@ ConfigFile *config_parse_with_offset(char *filename, char *confdata, unsigned in { if (*ptr == '\\') { - if ((ptr[1] == '\\') || (ptr[1] == '"')) + if (strchr("\\\"'", ptr[1])) { /* \\ or \" in config file (escaped) */ ptr++; /* skip */ continue; } } - else if ((*ptr == '\"') || (*ptr == '\n')) + else if (*ptr == '\n') + break; + else if (curce && curce->escaped && (*ptr == '\'')) + break; + else if ((!curce || !curce->escaped) && (*ptr == '"')) break; } if (!*ptr || (*ptr == '\n')) @@ -1279,7 +1180,7 @@ ConfigFile *config_parse_with_offset(char *filename, char *confdata, unsigned in } if (curce) { - if (curce->ce_vardata) + if (curce->value) { config_error("%s:%i: Extra data detected. Perhaps missing a ';' or one too many?\n", filename, linenumber); @@ -1287,22 +1188,22 @@ ConfigFile *config_parse_with_offset(char *filename, char *confdata, unsigned in } else { - safe_strldup(curce->ce_vardata, start, ptr-start+1); - preprocessor_replace_defines(&curce->ce_vardata, curce); - unreal_del_quotes(curce->ce_vardata); + safe_strldup(curce->value, start, ptr-start+1); + preprocessor_replace_defines(&curce->value, curce); + unreal_del_quotes(curce->value); } } else { curce = safe_alloc(sizeof(ConfigEntry)); - curce->ce_varlinenum = linenumber; - curce->ce_fileptr = curcf; - curce->ce_prevlevel = cursection; - curce->ce_fileposstart = (start - confdata); - safe_strldup(curce->ce_varname, start, ptr-start+1); - preprocessor_replace_defines(&curce->ce_varname, curce); - unreal_del_quotes(curce->ce_varname); - preprocessor_cc_duplicate_list(cc_list, &curce->ce_cond); + curce->line_number = linenumber; + curce->file = curcf; + curce->parent = cursection; + curce->file_position_start = (start - confdata); + safe_strldup(curce->name, start, ptr-start+1); + preprocessor_replace_defines(&curce->name, curce); + unreal_del_quotes(curce->name); + preprocessor_cc_duplicate_list(cc_list, &curce->conditional_config); } break; case '\n': @@ -1372,11 +1273,11 @@ ConfigFile *config_parse_with_offset(char *filename, char *confdata, unsigned in if (curce) config_error("%s: End of file reached but directive or block at line %i did not end properly. " "Perhaps a missing ; (semicolon) somewhere?\n", - filename, curce->ce_varlinenum); + filename, curce->line_number); else if (cursection) config_error("%s: End of file reached but the section which starts at line %i did never end properly. " "Perhaps a missing }; ?\n", - filename, cursection->ce_sectlinenum); + filename, cursection->section_linenumber); else config_error("%s: Unexpected end of file. Some line or block did not end properly. " "Look for any missing } and };\n", filename); @@ -1387,7 +1288,7 @@ ConfigFile *config_parse_with_offset(char *filename, char *confdata, unsigned in } if (curce) { - if (curce->ce_vardata) + if (curce->value) { config_error("%s:%i: Extra data detected. Check for a missing ; character at or around line %d\n", filename, linenumber, linenumber-1); @@ -1395,23 +1296,23 @@ ConfigFile *config_parse_with_offset(char *filename, char *confdata, unsigned in } else { - safe_strldup(curce->ce_vardata, start, ptr-start+1); - preprocessor_replace_defines(&curce->ce_vardata, curce); + safe_strldup(curce->value, start, ptr-start+1); + preprocessor_replace_defines(&curce->value, curce); } } else { curce = safe_alloc(sizeof(ConfigEntry)); memset(curce, 0, sizeof(ConfigEntry)); - curce->ce_varlinenum = linenumber; - curce->ce_fileptr = curcf; - curce->ce_prevlevel = cursection; - curce->ce_fileposstart = (start - confdata); - safe_strldup(curce->ce_varname, start, ptr-start+1); - preprocessor_replace_defines(&curce->ce_varname, curce); - if (curce->ce_cond) - abort(); // hmm this can be reached? FIXME! - preprocessor_cc_duplicate_list(cc_list, &curce->ce_cond); + curce->line_number = linenumber; + curce->file = curcf; + curce->parent = cursection; + curce->file_position_start = (start - confdata); + safe_strldup(curce->name, start, ptr-start+1); + preprocessor_replace_defines(&curce->name, curce); + if (curce->conditional_config) + abort(); + preprocessor_cc_duplicate_list(cc_list, &curce->conditional_config); } if ((*ptr == ';') || (*ptr == '\n')) ptr--; @@ -1425,7 +1326,7 @@ breakout: { config_error("%s: End of file reached but directive or block at line %i did not end properly. " "Perhaps a missing ; (semicolon) somewhere?\n", - filename, curce->ce_varlinenum); + filename, curce->line_number); errors++; config_entry_free_all(curce); } @@ -1433,7 +1334,7 @@ breakout: { config_error("%s: End of file reached but the section which starts at line %i did never end properly. " "Perhaps a missing }; ?\n", - filename, cursection->ce_sectlinenum); + filename, cursection->section_linenumber); errors++; } @@ -1455,13 +1356,13 @@ void config_entry_free_all(ConfigEntry *ce) for(;ce;ce=nptr) { - nptr = ce->ce_next; - if (ce->ce_entries) - config_entry_free_all(ce->ce_entries); - safe_free(ce->ce_varname); - safe_free(ce->ce_vardata); - if (ce->ce_cond) - preprocessor_cc_free_list(ce->ce_cond); + nptr = ce->next; + if (ce->items) + config_entry_free_all(ce->items); + safe_free(ce->name); + safe_free(ce->value); + if (ce->conditional_config) + preprocessor_cc_free_list(ce->conditional_config); safe_free(ce); } } @@ -1471,21 +1372,21 @@ void config_entry_free_all(ConfigEntry *ce) */ void config_entry_free(ConfigEntry *ce) { - if (ce->ce_entries) - config_entry_free_all(ce->ce_entries); - safe_free(ce->ce_varname); - safe_free(ce->ce_vardata); - if (ce->ce_cond) - preprocessor_cc_free_list(ce->ce_cond); + if (ce->items) + config_entry_free_all(ce->items); + safe_free(ce->name); + safe_free(ce->value); + if (ce->conditional_config) + preprocessor_cc_free_list(ce->conditional_config); safe_free(ce); } -ConfigEntry *config_find_entry(ConfigEntry *ce, char *name) +ConfigEntry *config_find_entry(ConfigEntry *ce, const char *name) { ConfigEntry *cep; - for (cep = ce; cep; cep = cep->ce_next) - if (cep->ce_varname && !strcmp(cep->ce_varname, name)) + for (cep = ce; cep; cep = cep->next) + if (cep->name && !strcmp(cep->name, name)) break; return cep; } @@ -1501,8 +1402,7 @@ void config_error(FORMAT_STRING(const char *format), ...) va_end(ap); if ((ptr = strchr(buffer, '\n')) != NULL) *ptr = '\0'; - ircd_log(LOG_ERROR, "config error: %s", buffer); - sendto_realops("error: %s", buffer); + unreal_log_raw(ULOG_ERROR, "config", "CONFIG_ERROR_GENERIC", NULL, buffer); if (remote_rehash_client) sendnotice(remote_rehash_client, "error: %s", buffer); /* We cannot live with this */ @@ -1560,8 +1460,7 @@ void config_status(FORMAT_STRING(const char *format), ...) va_end(ap); if ((ptr = strchr(buffer, '\n')) != NULL) *ptr = '\0'; - ircd_log(LOG_ERROR, "%s", buffer); - sendto_realops("%s", buffer); + unreal_log_raw(ULOG_INFO, "config", "CONFIG_INFO_GENERIC", NULL, buffer); if (remote_rehash_client) sendnotice(remote_rehash_client, "%s", buffer); } @@ -1577,8 +1476,7 @@ void config_warn(FORMAT_STRING(const char *format), ...) va_end(ap); if ((ptr = strchr(buffer, '\n')) != NULL) *ptr = '\0'; - ircd_log(LOG_ERROR, "[warning] %s", buffer); - sendto_realops("[warning] %s", buffer); + unreal_log_raw(ULOG_WARNING, "config", "CONFIG_WARNING_GENERIC", NULL, buffer); if (remote_rehash_client) sendnotice(remote_rehash_client, "[warning] %s", buffer); } @@ -1593,50 +1491,38 @@ int config_test_openfile(ConfigEntry *cep, int flags, mode_t mode, const char *e { int fd; - if(!cep->ce_vardata) + if (!cep->value) { - if(fatal) + if (fatal) config_error("%s:%i: %s: : no file specified", - cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, + cep->file->filename, + cep->line_number, entry); else config_warn("%s:%i: %s: : no file specified", - cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, + cep->file->filename, + cep->line_number, entry); return 1; } /* There's not much checking that can be done for asynchronously downloaded files */ -#ifdef USE_LIBCURL - if(url_is_valid(cep->ce_vardata)) + if (url_is_valid(cep->value)) { - if(allow_url) + if (allow_url) return 0; /* but we can check if a URL is used wrongly :-) */ config_warn("%s:%i: %s: %s: URL used where not allowed", - cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, - entry, cep->ce_vardata); - if(fatal) + cep->file->filename, + cep->line_number, + entry, cep->value); + if (fatal) return 1; else return 0; } -#else - if (strstr(cep->ce_vardata, "://")) - { - config_error("%s:%d: %s: UnrealIRCd was not compiled with remote includes support " - "so you cannot use URLs here.", - cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, - entry); - return 1; - } -#endif /* USE_LIBCURL */ /* * Make sure that files are created with the correct mode. This is @@ -1645,25 +1531,25 @@ int config_test_openfile(ConfigEntry *cep, int flags, mode_t mode, const char *e * and that we deal with all of the bugs that come with complexity. * The only files we may be creating are the tunefile and pidfile so far. */ - if(flags & O_CREAT) - fd = open(cep->ce_vardata, flags, mode); + if (flags & O_CREAT) + fd = open(cep->value, flags, mode); else - fd = open(cep->ce_vardata, flags); - if(fd == -1) + fd = open(cep->value, flags); + if (fd == -1) { - if(fatal) + if (fatal) config_error("%s:%i: %s: %s: %s", - cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, + cep->file->filename, + cep->line_number, entry, - cep->ce_vardata, + cep->value, strerror(errno)); else config_warn("%s:%i: %s: %s: %s", - cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, + cep->file->filename, + cep->line_number, entry, - cep->ce_vardata, + cep->value, strerror(errno)); return 1; } @@ -1673,16 +1559,16 @@ int config_test_openfile(ConfigEntry *cep, int flags, mode_t mode, const char *e int config_is_blankorempty(ConfigEntry *cep, const char *block) { - if (!cep->ce_vardata) + if (!cep->value) { - config_error_empty(cep->ce_fileptr->cf_filename, cep->ce_varlinenum, block, - cep->ce_varname); + config_error_empty(cep->file->filename, cep->line_number, block, + cep->name); return 1; } return 0; } -ConfigCommand *config_binary_search(char *cmd) { +ConfigCommand *config_binary_search(const char *cmd) { int start = 0; int stop = ARRAY_SIZEOF(_ConfigCommands)-1; int mid; @@ -1702,7 +1588,8 @@ ConfigCommand *config_binary_search(char *cmd) { void free_iConf(Configuration *i) { - safe_free(i->dns_bindip); + FloodSettings *f, *f_next; + safe_free(i->link_bindip); safe_free(i->kline_address); safe_free(i->gline_address); @@ -1711,7 +1598,6 @@ void free_iConf(Configuration *i) safe_free(i->oper_auto_join_chans); safe_free(i->allow_user_stats); // allow_user_stats_ext is freed elsewhere - safe_free(i->egd_path); safe_free(i->static_quit); safe_free(i->static_part); free_tls_options(i->tls_options); @@ -1725,6 +1611,7 @@ void free_iConf(Configuration *i) safe_free(i->restrict_channelmodes); safe_free(i->restrict_extendedbans); safe_free(i->channel_command_prefix); + safe_free(i->level_on_join); safe_free(i->spamfilter_ban_reason); safe_free(i->spamfilter_virus_help_channel); // spamexcept is freed elsewhere @@ -1734,25 +1621,30 @@ void free_iConf(Configuration *i) safe_free(i->reject_message_unauthorized); safe_free(i->reject_message_kline); safe_free(i->reject_message_gline); - // network struct: - safe_free(i->network.x_ircnetwork); - safe_free(i->network.x_ircnet005); - safe_free(i->network.x_defserv); - safe_free(i->network.x_services_name); - safe_free(i->network.x_hidden_host); - safe_free(i->network.x_prefix_quit); - safe_free(i->network.x_helpchan); - safe_free(i->network.x_stats_server); - safe_free(i->network.x_sasl_server); + safe_free(i->network_name); + safe_free(i->network_name_005); + safe_free(i->default_server); + safe_free(i->services_name); + safe_free(i->cloak_prefix); + safe_free(i->prefix_quit); + safe_free(i->helpchan); + safe_free(i->stats_server); + safe_free(i->sasl_server); + // anti-flood: + for (f = i->floodsettings; f; f = f_next) + { + f_next = f->next; + free_floodsettings(f); + } + i->floodsettings = NULL; } -int config_test(); - void config_setdefaultsettings(Configuration *i) { char tmp[512]; - safe_strdup(i->oper_snomask, SNO_DEFOPER); + safe_strdup(i->oper_snomask, OPER_SNOMASKS); + i->server_notice_colors = 1; i->ident_read_timeout = 7; i->ident_connect_timeout = 3; i->ban_version_tkl_time = 86400; /* 1d */ @@ -1765,12 +1657,11 @@ void config_setdefaultsettings(Configuration *i) i->maxchannelsperuser = 10; i->maxdccallow = 10; safe_strdup(i->channel_command_prefix, "`!."); - conf_channelmodes("+nt", &i->modes_on_join, 0); i->conn_modes = set_usermode("+ixw"); i->check_target_nick_bans = 1; i->maxbans = 60; i->maxbanlength = 2048; - i->level_on_join = CHFL_CHANOP; + safe_strdup(i->level_on_join, "o"); i->watch_away_notification = 1; i->uhnames = 1; i->ping_cookie = 1; @@ -1783,10 +1674,10 @@ void config_setdefaultsettings(Configuration *i) i->kick_length = 307; i->quit_length = 307; safe_strdup(i->link_bindip, "*"); - safe_strdup(i->network.x_hidden_host, "Clk"); + safe_strdup(i->cloak_prefix, "Clk"); if (!ipv6_capable()) DISABLE_IPV6 = 1; - safe_strdup(i->network.x_prefix_quit, "Quit"); + safe_strdup(i->prefix_quit, "Quit"); i->max_unknown_connections_per_ip = 3; i->handshake_timeout = 30; i->sasl_timeout = 15; @@ -1807,6 +1698,7 @@ void config_setdefaultsettings(Configuration *i) config_parse_flood_generic("4:60", i, "known-users", FLD_INVITE); /* INVITE flood protection: max 4 per 60s */ config_parse_flood_generic("4:120", i, "known-users", FLD_KNOCK); /* KNOCK protection: max 4 per 120s */ config_parse_flood_generic("10:15", i, "known-users", FLD_CONVERSATIONS); /* 10 users, new user every 15s */ + config_parse_flood_generic("180:750", i, "known-users", FLD_LAG_PENALTY); /* 180 bytes / 750 msec */ /* - unknown-users */ config_parse_flood_generic("2:60", i, "unknown-users", FLD_NICK); /* NICK flood protection: max 2 per 60s */ config_parse_flood_generic("2:90", i, "unknown-users", FLD_JOIN); /* JOIN flood protection: max 2 per 90s */ @@ -1814,8 +1706,9 @@ void config_setdefaultsettings(Configuration *i) config_parse_flood_generic("2:60", i, "unknown-users", FLD_INVITE); /* INVITE flood protection: max 2 per 60s */ config_parse_flood_generic("2:120", i, "unknown-users", FLD_KNOCK); /* KNOCK protection: max 2 per 120s */ config_parse_flood_generic("4:15", i, "unknown-users", FLD_CONVERSATIONS); /* 4 users, new user every 15s */ + config_parse_flood_generic("90:1000", i, "unknown-users", FLD_LAG_PENALTY); /* 90 bytes / 1000 msec */ - /* SSL/TLS options */ + /* TLS options */ i->tls_options = safe_alloc(sizeof(TLSOptions)); snprintf(tmp, sizeof(tmp), "%s/tls/server.cert.pem", CONFDIR); safe_strdup(i->tls_options->certificate_file, tmp); @@ -1862,19 +1755,8 @@ void config_setdefaultsettings(Configuration *i) i->hide_idle_time = HIDE_IDLE_TIME_OPER_USERMODE; i->who_limit = 100; -} -static void make_default_logblock(void) -{ - ConfigItem_log *ca = safe_alloc(sizeof(ConfigItem_log)); - - config_status("No log { } block found -- logging everything to 'ircd.log'"); - - safe_strdup(ca->file, "ircd.log"); - convert_to_absolute_path(&ca->file, LOGDIR); - ca->flags |= LOG_CHGCMDS|LOG_CLIENT|LOG_ERROR|LOG_KILL|LOG_KLINE|LOG_OPER|LOG_OVERRIDE|LOG_SACMDS|LOG_SERVER|LOG_SPAMFILTER|LOG_TKL; - ca->logfd = -1; - AddListItem(ca, conf_log); + i->named_extended_bans = 1; } /** Similar to config_setdefaultsettings but this one is applied *AFTER* @@ -1886,13 +1768,20 @@ void postconf_defaults(void) TKL *tk; char *encoded; + if (!iConf.modes_on_join_set) + { + /* We could not do this in config_setdefaultsettings() + * because the channel mode modules were not initialized yet. + */ + conf_channelmodes("+nt", &iConf.modes_on_join); + } if (!iConf.plaintext_policy_user_message) { /* The message depends on whether it's reject or warn.. */ if (iConf.plaintext_policy_user == POLICY_DENY) - addmultiline(&iConf.plaintext_policy_user_message, "Insecure connection. Please reconnect using SSL/TLS."); + addmultiline(&iConf.plaintext_policy_user_message, "Insecure connection. Please reconnect using TLS."); else if (iConf.plaintext_policy_user == POLICY_WARN) - addmultiline(&iConf.plaintext_policy_user_message, "WARNING: Insecure connection. Please consider using SSL/TLS."); + addmultiline(&iConf.plaintext_policy_user_message, "WARNING: Insecure connection. Please consider using TLS."); } if (!iConf.plaintext_policy_oper_message) @@ -1900,76 +1789,32 @@ void postconf_defaults(void) /* The message depends on whether it's reject or warn.. */ if (iConf.plaintext_policy_oper == POLICY_DENY) { - addmultiline(&iConf.plaintext_policy_oper_message, "You need to use a secure connection (SSL/TLS) in order to /OPER."); + addmultiline(&iConf.plaintext_policy_oper_message, "You need to use a secure connection (TLS) in order to /OPER."); addmultiline(&iConf.plaintext_policy_oper_message, "See https://www.unrealircd.org/docs/FAQ#oper-requires-tls"); } else if (iConf.plaintext_policy_oper == POLICY_WARN) - addmultiline(&iConf.plaintext_policy_oper_message, "WARNING: You /OPER'ed up from an insecure connection. Please consider using SSL/TLS."); + addmultiline(&iConf.plaintext_policy_oper_message, "WARNING: You /OPER'ed up from an insecure connection. Please consider using TLS."); } if (!iConf.outdated_tls_policy_user_message) { /* The message depends on whether it's reject or warn.. */ if (iConf.outdated_tls_policy_user == POLICY_DENY) - safe_strdup(iConf.outdated_tls_policy_user_message, "Your IRC client is using an outdated SSL/TLS protocol or ciphersuite ($protocol-$cipher). Please upgrade your IRC client."); + safe_strdup(iConf.outdated_tls_policy_user_message, "Your IRC client is using an outdated TLS protocol or ciphersuite ($protocol-$cipher). Please upgrade your IRC client."); else if (iConf.outdated_tls_policy_user == POLICY_WARN) - safe_strdup(iConf.outdated_tls_policy_user_message, "WARNING: Your IRC client is using an outdated SSL/TLS protocol or ciphersuite ($protocol-$cipher). Please upgrade your IRC client."); + safe_strdup(iConf.outdated_tls_policy_user_message, "WARNING: Your IRC client is using an outdated TLS protocol or ciphersuite ($protocol-$cipher). Please upgrade your IRC client."); } if (!iConf.outdated_tls_policy_oper_message) { /* The message depends on whether it's reject or warn.. */ if (iConf.outdated_tls_policy_oper == POLICY_DENY) - safe_strdup(iConf.outdated_tls_policy_oper_message, "Your IRC client is using an outdated SSL/TLS protocol or ciphersuite ($protocol-$cipher). Please upgrade your IRC client."); + safe_strdup(iConf.outdated_tls_policy_oper_message, "Your IRC client is using an outdated TLS protocol or ciphersuite ($protocol-$cipher). Please upgrade your IRC client."); else if (iConf.outdated_tls_policy_oper == POLICY_WARN) - safe_strdup(iConf.outdated_tls_policy_oper_message, "WARNING: Your IRC client is using an outdated SSL/TLS protocol or ciphersuite ($protocol-$cipher). Please upgrade your IRC client."); + safe_strdup(iConf.outdated_tls_policy_oper_message, "WARNING: Your IRC client is using an outdated TLS protocol or ciphersuite ($protocol-$cipher). Please upgrade your IRC client."); } - /* We got a chicken-and-egg problem here.. antries added without reason or ban-time - * field should use the config default (set::spamfilter::ban-reason/ban-time) but - * this isn't (or might not) be known yet when parsing spamfilter entries.. - * so we do a VERY UGLY mass replace here.. unless someone else has a better idea. - */ - - encoded = unreal_encodespace(SPAMFILTER_BAN_REASON); - if (!encoded) - abort(); /* hack to trace 'impossible' bug... */ - // FIXME: remove this stuff with ~server~, why not just use -config- - // which is more meaningful. - for (tk = tklines[tkl_hash('q')]; tk; tk = tk->next) - { - if (tk->type != TKL_NAME) - continue; - if (!tk->set_by) - { - if (me.name[0] != '\0') - safe_strdup(tk->set_by, me.name); - else - safe_strdup(tk->set_by, conf_me->name ? conf_me->name : "~server~"); - } - } - - for (tk = tklines[tkl_hash('f')]; tk; tk = tk->next) - { - if (tk->type != TKL_SPAMF) - continue; /* global entry or something else.. */ - if (!strcmp(tk->ptr.spamfilter->tkl_reason, "")) - { - safe_strdup(tk->ptr.spamfilter->tkl_reason, encoded); - tk->ptr.spamfilter->tkl_duration = SPAMFILTER_BAN_TIME; - } - /* This one is even more ugly, but our config crap is VERY confusing :[ */ - if (!tk->set_by) - { - if (me.name[0] != '\0') - safe_strdup(tk->set_by, me.name); - else - safe_strdup(tk->set_by, conf_me->name ? conf_me->name : "~server~"); - } - } - - if (!conf_log) - make_default_logblock(); + postconf_defaults_log_block(); } void postconf_fixes(void) @@ -2007,7 +1852,7 @@ RealCommand *cmptr; * has been read and almost all values have been set. This is to deal with * things like adding a default log { } block if there is none and that kind * of things. - * This function is called by init_conf(), both on boot and on rehash. + * This function is called by config_test(), both on boot and on rehash. */ void postconf(void) { @@ -2016,6 +1861,11 @@ void postconf(void) do_weird_shun_stuff(); isupport_init(); /* for all the 005 values that changed.. */ tls_check_expiry(NULL); + +#if OPENSSL_VERSION_NUMBER >= 0x10101000L + if (loop.rehashing) + reinit_tls(); +#endif } int isanyserverlinked(void) @@ -2044,41 +1894,11 @@ void applymeblock(void) strlcpy(me.id, conf_me->sid, sizeof(me.id)); } -void upgrade_conf_to_34(void) -{ - config_error("******************************************************************"); - config_error("This *seems* an UnrealIRCd 3.2.x configuration file."); - -#ifdef _WIN32 - if (!IsService) - config_error("In next screen you will be prompted to automatically upgrade the configuration file(s)."); - else - { - config_error("We offer a configuration file converter to convert 3.2.x conf's to 4.x, however this " - "is not available when running as a service. If you want to use it, make UnrealIRCd " - "run in GUI mode by running 'unreal uninstall'. Then start UnrealIRCd.exe and when " - "it prompts you to convert the configuration click 'Yes'. Check if UnrealIRCd boots properly. " - "Once everything is looking good you can run 'unreal install' to make UnrealIRCd run " - "as a service again."); /* TODO: make this unnecessary :D */ - } -#else - config_error("To upgrade it to the new 4.x format, run: ./unrealircd upgrade-conf"); -#endif - - config_error("******************************************************************"); - /* TODO: win32 may require a different error */ -} - -/** Reset config tests (before running the config test) */ -void config_test_reset(void) -{ -} - /** Run config test and all post config tests. */ int config_test_all(void) { - if ((config_test() < 0) || (callbacks_check() < 0) || (efunctions_check() < 0) || - reloadable_perm_module_unloaded() || !tls_tests()) + if ((config_test_blocks() < 0) || (callbacks_check() < 0) || (efunctions_check() < 0) || + reloadable_perm_module_unloaded() || !tls_tests() || !log_tests()) { return 0; } @@ -2101,19 +1921,19 @@ int config_loadmodules(void) int fatal_ret = 0, ret; - for (cfptr = conf; cfptr; cfptr = cfptr->cf_next) + for (cfptr = conf; cfptr; cfptr = cfptr->next) { if (config_verbose > 1) - config_status("Testing %s", cfptr->cf_filename); - for (ce = cfptr->cf_entries; ce; ce = ce->ce_next) + config_status("Testing %s", cfptr->filename); + for (ce = cfptr->items; ce; ce = ce->next) { - if (!strcmp(ce->ce_varname, "loadmodule")) + if (!strcmp(ce->name, "loadmodule")) { - if (ce->ce_cond) + if (ce->conditional_config) { config_error("%s:%d: Currently you cannot have a 'loadmodule' statement " "within an @if block, sorry.", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); return 0; } ret = _conf_loadmodule(cfptr, ce); @@ -2139,262 +1959,299 @@ int config_loadmodules(void) return 1; /* SUCCESS */ } -int init_conf(char *rootconf, int rehash) +/** Reject the configuration load. + * This is called both from boot and from rehash. + */ +void config_load_failed(void) { - char *old_pid_file = NULL; + if (conf) + unreal_log(ULOG_ERROR, "config", "CONFIG_NOT_LOADED", NULL, "IRCd configuration failed to load"); + Unload_all_testing_modules(); + free_all_config_resources(); + config_free(conf); + conf = NULL; + free_iConf(&tempiConf); +#ifdef _WIN32 + if (!loop.rehashing) + win_error(); /* GUI popup */ +#endif +} + +int config_read_start(void) +{ + int ret; config_status("Loading IRCd configuration.."); + loop.config_load_failed = 0; + if (conf) { config_error("%s:%i - Someone forgot to clean up", __FILE__, __LINE__); return -1; } + + /* We set this to 1 because otherwise we may call rehash_internal() + * already from config_read_file() which is too soon (race). + */ + loop.rehash_download_busy = 1; + add_config_resource(configfile, RESOURCE_INCLUDE, NULL); + ret = config_read_file(configfile, configfile); + loop.rehash_download_busy = 0; + if (ret < 0) + { + config_load_failed(); + return -1; + } + return 1; +} + +int is_config_read_finished(void) +{ + ConfigResource *rs; + + if (loop.rehash_download_busy) + return 0; + + for (rs = config_resources; rs; rs = rs->next) + { + if (rs->type & RESOURCE_DLQUEUED) + { + //config_status("Waiting for %s...", rs->url); + return 0; + } + } + + return 1; +} + +int config_test(void) +{ + char *old_pid_file = NULL; + + if (loop.config_load_failed) + { + /* An error was already printed to the user. + * This happens in case of a failed loaded remote URL + */ + config_load_failed(); + return -1; + } + + config_status("Testing IRCd configuration.."); + memset(&tempiConf, 0, sizeof(iConf)); memset(&settings, 0, sizeof(settings)); memset(&requiredstuff, 0, sizeof(requiredstuff)); memset(&nicklengths, 0, sizeof(nicklengths)); config_setdefaultsettings(&tempiConf); clicap_pre_rehash(); + log_pre_rehash(); free_config_defines(); - /* - * the rootconf must be listed in the conf_include for include - * recursion prevention code and sanity checking code to be - * made happy :-). Think of it as us implicitly making an - * in-memory config file that looks like: - * - * include "unrealircd.conf"; - */ - add_include(rootconf, "[thin air]", -1); - if ((load_conf(rootconf, rootconf) > 0) && config_loadmodules()) - { - preprocessor_resolve_conditionals_all(PREPROCESSOR_PHASE_MODULE); - config_test_reset(); - if (!config_test_all()) - { - config_error("IRCd configuration failed to pass testing"); -#ifdef _WIN32 - if (!rehash) - win_error(); -#endif - Unload_all_testing_modules(); - unload_notloaded_includes(); - config_free(conf); - conf = NULL; - free_iConf(&tempiConf); - return -1; - } - callbacks_switchover(); - efunctions_switchover(); - set_targmax_defaults(); - set_security_group_defaults(); - if (rehash) - { - Hook *h; - safe_strdup(old_pid_file, conf_files->pid_file); - unrealdns_delasyncconnects(); - config_rehash(); - Unload_all_loaded_modules(); - /* Notify permanent modules of the rehash */ - for (h = Hooks[HOOKTYPE_REHASH]; h; h = h->next) - { - if (!h->owner) - continue; - if (!(h->owner->options & MOD_OPT_PERM)) - continue; - (*(h->func.intfunc))(); - } - unload_loaded_includes(); - } - load_includes(); - Init_all_testing_modules(); - if (config_run() < 0) - { - config_error("Bad case of config errors. Server will now die. This really shouldn't happen"); -#ifdef _WIN32 - if (!rehash) - win_error(); -#endif - abort(); - } - applymeblock(); - if (old_pid_file && strcmp(old_pid_file, conf_files->pid_file)) - { - sendto_ops("pidfile is being rewritten to %s, please delete %s", - conf_files->pid_file, - old_pid_file); - write_pidfile(); - } - safe_free(old_pid_file); - } - else + if (!config_loadmodules()) { - config_error("IRCd configuration failed to load"); - Unload_all_testing_modules(); - unload_notloaded_includes(); - config_free(conf); - conf = NULL; - free_iConf(&tempiConf); -#ifdef _WIN32 - if (!rehash) - win_error(); -#endif + config_load_failed(); return -1; } + + preprocessor_resolve_conditionals_all(PREPROCESSOR_PHASE_MODULE); + + if (!config_test_all()) + { + config_error("IRCd configuration failed to pass testing"); + config_load_failed(); + return -1; + } + callbacks_switchover(); + efunctions_switchover(); + set_targmax_defaults(); + set_security_group_defaults(); + if (loop.rehashing) + { + Hook *h; + safe_strdup(old_pid_file, conf_files->pid_file); + unrealdns_delasyncconnects(); + config_rehash(); + Unload_all_loaded_modules(); + + /* Notify permanent modules of the rehash */ + for (h = Hooks[HOOKTYPE_REHASH]; h; h = h->next) + { + if (!h->owner) + continue; + if (!(h->owner->options & MOD_OPT_PERM)) + continue; + (*(h->func.intfunc))(); + } + } + config_pre_run_log(); + + Init_all_testing_modules(); + + if (config_run_blocks() < 0) + { + config_error("Bad case of config errors. Server will now die. This really shouldn't happen"); +#ifdef _WIN32 + if (!loop.rehashing) + win_error(); +#endif + abort(); + } + + applymeblock(); + + if (old_pid_file && strcmp(old_pid_file, conf_files->pid_file)) + { + write_pidfile(); + unlink(old_pid_file); + } + safe_free(old_pid_file); + config_free(conf); conf = NULL; - if (rehash) + if (loop.rehashing) { module_loadall(); - RunHook0(HOOKTYPE_REHASH_COMPLETE); + RunHook(HOOKTYPE_REHASH_COMPLETE); } postconf(); - config_status("Configuration loaded."); + unreal_log(ULOG_INFO, "config", "CONFIG_LOADED", NULL, "Configuration loaded"); clicap_post_rehash(); unload_all_unused_mtag_handlers(); return 0; } +void config_parse_and_queue_urls(ConfigEntry *ce) +{ + for (; ce; ce = ce->next) + { + if (loop.config_load_failed) + break; + if (ce->name && !strcmp(ce->name, "include")) + continue; /* handled elsewhere */ + if (ce->value && !ce->escaped && url_is_valid(ce->value)) + add_config_resource(ce->value, 0, ce); + if (ce->items) + config_parse_and_queue_urls(ce->items); + } +} + /** - * Processes filename as part of the IRCd's configuration. + * Read configuration file into ConfigEntry items and add it to the 'conf' + * list. This checks the file for parse errors, but doesn't do much + * otherwise. Only: module blacklist checking and checking for "include" + * items to see if we need to read and parse more configuration files + * that are included from this one. * - * One _must_ call add_include() or add_remote_include() before - * calling load_conf(). This way, include recursion may be detected - * and reported to the user as an error instead of causing the IRCd to - * hang in an infinite recursion, eat up memory, and eventually - * overflow its stack ;-). (reported by warg). - * - * This function will set INCLUDE_USED on the config_include list - * entry if the config file loaded without error. + * One _must_ call add_config_resource() before calling config_read_file(). + * This way, include recursion may be detected and reported to the user + * as an error instead of causing the IRCd to hang in an infinite + * recursion, eat up memory, and eventually overflow its stack ;-). * * @param filename the file where the conf may be read from - * @param original_path the path or URL used to refer to this file. + * @param display_name The path or URL used to refer to this file. * (mostly to support remote includes' URIs for recursive include detection). * @return 1 on success, a negative number on error */ -int load_conf(char *filename, const char *original_path) +int config_read_file(const char *filename, const char *display_name) { ConfigFile *cfptr, *cfptr2, **cfptr3; ConfigEntry *ce; - ConfigItem_include *inc, *my_inc; + ConfigResource *rs; int ret; int counter; if (config_verbose > 0) config_status("Loading config file %s ..", filename); - need_34_upgrade = 0; need_operclass_permissions_upgrade = 0; - /* - * Check if we're accidentally including a file a second + /* Check if we're accidentally including a file a second * time. We should expect to find one entry in this list: the * entry for our current file. + * Note that no user should be able to trigger this, this + * can only happen if we have buggy code somewhere. */ counter = 0; - my_inc = NULL; - for (inc = conf_include; inc; inc = inc->next) + for (rs = config_resources; rs; rs = rs->next) { - /* - * ignore files which were part of a _previous_ - * successful rehash. - */ - if (!(inc->flag.type & INCLUDE_NOTLOADED)) - continue; - - if (!counter) - my_inc = inc; - - if (!strcmp(filename, inc->file)) - { - counter ++; - continue; - } -#ifdef _WIN32 - if (!strcasecmp(filename, inc->file)) - { - counter ++; - continue; - } +#ifndef _WIN32 + if (rs->file && !strcmp(filename, rs->file)) +#else + if (rs->file && !strcasecmp(filename, rs->file)) #endif -#ifdef USE_LIBCURL - if (inc->url && !strcmp(original_path, inc->url)) { counter ++; continue; } -#endif + if (rs->url && !strcmp(display_name, rs->url)) + { + counter ++; + continue; + } } - if (counter < 1 || !my_inc) + if (counter > 1) { - /* - * The following is simply for debugging/[sanity - * checking]. To make sure that functions call - * add_include() or add_remote_include() before - * calling us. - */ - config_error("I don't have a record for %s being included." - " Perhaps someone forgot to call add_include()?", - filename); - abort(); - } - if (counter > 1 || my_inc->flag.type & INCLUDE_USED) - { - config_error("%s:%d:include: Config file %s has been loaded before %d time." - " You may include each file only once.", - my_inc->included_from, my_inc->included_from_line, - filename, counter - 1); + unreal_log(ULOG_ERROR, "config", "CONFIG_BUG_DUPLICATE_RESOURCE", NULL, + "[BUG] Config file $file has been loaded $counter times. " + "This should not happen. Someone forgot to call " + "add_config_resource() or check its return value!", + log_data_string("file", filename), + log_data_integer("counter", counter)); return -1; } /* end include recursion checking code */ - if ((cfptr = config_load(filename, NULL))) + if ((cfptr = config_load(filename, display_name))) { - for (cfptr3 = &conf, cfptr2 = conf; cfptr2; cfptr2 = cfptr2->cf_next) - cfptr3 = &cfptr2->cf_next; + for (cfptr3 = &conf, cfptr2 = conf; cfptr2; cfptr2 = cfptr2->next) + cfptr3 = &cfptr2->next; *cfptr3 = cfptr; if (config_verbose > 1) config_status("Loading module blacklist in %s", filename); - preprocessor_resolve_conditionals_ce(&cfptr->cf_entries, PREPROCESSOR_PHASE_INITIAL); + preprocessor_resolve_conditionals_ce(&cfptr->items, PREPROCESSOR_PHASE_INITIAL); - for (ce = cfptr->cf_entries; ce; ce = ce->ce_next) - if (!strcmp(ce->ce_varname, "blacklist-module")) + for (ce = cfptr->items; ce; ce = ce->next) + if (!strcmp(ce->name, "blacklist-module")) _test_blacklist_module(cfptr, ce); - /* Load modules */ - if (config_verbose > 1) - config_status("Loading modules in %s", filename); - if (need_34_upgrade) - upgrade_conf_to_34(); + /* Load urls */ + config_parse_and_queue_urls(cfptr->items); + + if(loop.config_load_failed) /* something bad happened while processing urls */ + return -1; /* Load includes */ if (config_verbose > 1) config_status("Searching through %s for include files..", filename); - for (ce = cfptr->cf_entries; ce; ce = ce->ce_next) - if (!strcmp(ce->ce_varname, "include")) + + for (ce = cfptr->items; ce; ce = ce->next) + { + if (!strcmp(ce->name, "include")) { - if (ce->ce_cond) + if (ce->conditional_config) { config_error("%s:%d: Currently you cannot have an 'include' statement " "within an @if block, sorry. However, you CAN do it the other " "way around, that is: put the @if within the included file itself.", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); return -1; } ret = _conf_include(cfptr, ce); - if (need_34_upgrade) - upgrade_conf_to_34(); if (ret < 0) return ret; } - my_inc->flag.type |= INCLUDE_USED; + } return 1; } else { - config_error("Could not load config file %s", filename); + unreal_log(ULOG_ERROR, "config", "CONFIG_LOAD_FILE_FAILED", NULL, + "Could not load configuration file: $resource", + log_data_string("resource", display_name), + log_data_string("filename", filename)); #ifdef _WIN32 if (!strcmp(filename, "conf/unrealircd.conf")) { @@ -2445,13 +2302,12 @@ void remove_config_tkls(void) } } -void config_rehash() +void config_rehash() { ConfigItem_oper *oper_ptr; ConfigItem_class *class_ptr; ConfigItem_ulines *uline_ptr; ConfigItem_allow *allow_ptr; - ConfigItem_except *except_ptr; ConfigItem_ban *ban_ptr; ConfigItem_link *link_ptr; ConfigItem_listen *listen_ptr; @@ -2462,7 +2318,6 @@ void config_rehash() ConfigItem_allow_channel *allow_channel_ptr; ConfigItem_admin *admin_ptr; ConfigItem_deny_version *deny_version_ptr; - ConfigItem_log *log_ptr; ConfigItem_alias *alias_ptr; ConfigItem_help *help_ptr; ConfigItem_offchans *of_ptr; @@ -2507,13 +2362,10 @@ void config_rehash() next = (ListStruct *)link_ptr->next; if (link_ptr->refcount == 0) { - Debug((DEBUG_ERROR, "s_conf: deleting block %s (refcount 0)", link_ptr->servername)); delete_linkblock(link_ptr); } else { - Debug((DEBUG_ERROR, "s_conf: marking block %s (refcount %d) as temporary", - link_ptr->servername, link_ptr->refcount)); link_ptr->flag.temporary = 1; } } @@ -2540,19 +2392,11 @@ void config_rehash() for (allow_ptr = conf_allow; allow_ptr; allow_ptr = (ConfigItem_allow *) next) { next = (ListStruct *)allow_ptr->next; - safe_free(allow_ptr->ip); - safe_free(allow_ptr->hostname); + unreal_delete_masks(allow_ptr->mask); Auth_FreeAuthConfig(allow_ptr->auth); DelListItem(allow_ptr, conf_allow); safe_free(allow_ptr); } - for (except_ptr = conf_except; except_ptr; except_ptr = (ConfigItem_except *) next) - { - next = (ListStruct *)except_ptr->next; - safe_free(except_ptr->mask); - DelListItem(except_ptr, conf_except); - safe_free(except_ptr); - } /* Free ban realname { }, ban server { } and ban version { } */ for (ban_ptr = conf_ban; ban_ptr; ban_ptr = (ConfigItem_ban *) next) { @@ -2614,7 +2458,7 @@ void config_rehash() for (deny_link_ptr = conf_deny_link; deny_link_ptr; deny_link_ptr = (ConfigItem_deny_link *) next) { next = (ListStruct *)deny_link_ptr->next; safe_free(deny_link_ptr->prettyrule); - safe_free(deny_link_ptr->mask); + unreal_delete_masks(deny_link_ptr->mask); crule_free(&deny_link_ptr->rule); DelListItem(deny_link_ptr, conf_deny_link); safe_free(deny_link_ptr); @@ -2657,14 +2501,6 @@ void config_rehash() conf_drpass->dieauth = NULL; safe_free(conf_drpass); } - for (log_ptr = conf_log; log_ptr; log_ptr = (ConfigItem_log *)next) { - next = (ListStruct *)log_ptr->next; - if (log_ptr->logfd != -1) - fd_close(log_ptr->logfd); - safe_free(log_ptr->file); - DelListItem(log_ptr, conf_log); - safe_free(log_ptr); - } for (alias_ptr = conf_alias; alias_ptr; alias_ptr = (ConfigItem_alias *)next) { RealCommand *cmptr = find_command(alias_ptr->alias, 0); ConfigItem_alias_format *fmt; @@ -2797,7 +2633,16 @@ int config_post_test() return errors; } -int config_run() +/** Make the "read" config the "live" config */ +void config_switchover(void) +{ + free_iConf(&iConf); + memcpy(&iConf, &tempiConf, sizeof(iConf)); + memset(&tempiConf, 0, sizeof(tempiConf)); + log_blocks_switchover(); +} + +int config_run_blocks() { ConfigEntry *ce; ConfigFile *cfptr; @@ -2807,13 +2652,13 @@ int config_run() ConfigItem_allow *allow; /* Stage 1: set block first */ - for (cfptr = conf; cfptr; cfptr = cfptr->cf_next) + for (cfptr = conf; cfptr; cfptr = cfptr->next) { if (config_verbose > 1) - config_status("Running %s", cfptr->cf_filename); - for (ce = cfptr->cf_entries; ce; ce = ce->ce_next) + config_status("Running %s", cfptr->filename); + for (ce = cfptr->items; ce; ce = ce->next) { - if (!strcmp(ce->ce_varname, "set")) + if (!strcmp(ce->name, "set")) { if (_conf_set(cfptr, ce) < 0) errors++; @@ -2822,13 +2667,13 @@ int config_run() } /* Stage 2: now class blocks */ - for (cfptr = conf; cfptr; cfptr = cfptr->cf_next) + for (cfptr = conf; cfptr; cfptr = cfptr->next) { if (config_verbose > 1) - config_status("Running %s", cfptr->cf_filename); - for (ce = cfptr->cf_entries; ce; ce = ce->ce_next) + config_status("Running %s", cfptr->filename); + for (ce = cfptr->items; ce; ce = ce->next) { - if (!strcmp(ce->ce_varname, "class")) + if (!strcmp(ce->name, "class")) { if (_conf_class(cfptr, ce) < 0) errors++; @@ -2837,23 +2682,23 @@ int config_run() } /* Stage 3: now all the rest */ - for (cfptr = conf; cfptr; cfptr = cfptr->cf_next) + for (cfptr = conf; cfptr; cfptr = cfptr->next) { if (config_verbose > 1) - config_status("Running %s", cfptr->cf_filename); - for (ce = cfptr->cf_entries; ce; ce = ce->ce_next) + config_status("Running %s", cfptr->filename); + for (ce = cfptr->items; ce; ce = ce->next) { /* These are already processed above (set, class) - * or via config_test() (secret). + * or via config_test_blocks() (secret). */ - if (!strcmp(ce->ce_varname, "set") || - !strcmp(ce->ce_varname, "class") || - !strcmp(ce->ce_varname, "secret")) + if (!strcmp(ce->name, "set") || + !strcmp(ce->name, "class") || + !strcmp(ce->name, "secret")) { continue; } - if ((cc = config_binary_search(ce->ce_varname))) { + if ((cc = config_binary_search(ce->name))) { if ((cc->conffunc) && (cc->conffunc(cfptr, ce) < 0)) errors++; } @@ -2870,31 +2715,15 @@ int config_run() } } - /* - * transfer default values from set::ipv6_clones_mask into - * each individual allow block. If other similar things like - * this stack up here, perhaps this shoul be moved to another - * function. - */ - for(allow = conf_allow; allow; allow = allow->next) - if(!allow->ipv6_clone_mask) - allow->ipv6_clone_mask = tempiConf.default_ipv6_clone_mask; - - /* ^^^ TODO: due to the two-stage model now we can do it in conf_allow again - * and remove it here. - */ - close_unbound_listeners(); listen_cleanup(); close_unbound_listeners(); loop.do_bancheck = 1; - free_iConf(&iConf); - memcpy(&iConf, &tempiConf, sizeof(iConf)); - memset(&tempiConf, 0, sizeof(tempiConf)); + config_switchover(); update_throttling_timer_settings(); /* initialize conf_files with defaults if the block isn't set: */ - if(!conf_files) + if (!conf_files) _conf_files(NULL, NULL); if (errors > 0) @@ -2905,26 +2734,7 @@ int config_run() } -NameValue *config_binary_flags_search(NameValue *table, char *cmd, int size) { - int start = 0; - int stop = size-1; - int mid; - while (start <= stop) { - mid = (start+stop)/2; - - if (smycmp(cmd,table[mid].name) < 0) { - stop = mid-1; - } - else if (strcmp(cmd,table[mid].name) == 0) { - return &(table[mid]); - } - else - start = mid+1; - } - return NULL; -} - -int config_test() +int config_test_blocks() { ConfigEntry *ce; ConfigFile *cfptr; @@ -2932,16 +2742,29 @@ int config_test() int errors = 0; Hook *h; - need_34_upgrade = 0; + invalid_snomasks_encountered = 0; - for (cfptr = conf; cfptr; cfptr = cfptr->cf_next) + /* First, all the log { } blocks everywhere */ + for (cfptr = conf; cfptr; cfptr = cfptr->next) { if (config_verbose > 1) - config_status("Testing %s", cfptr->cf_filename); - /* First test and run the secret { } blocks */ - for (ce = cfptr->cf_entries; ce; ce = ce->ce_next) + config_status("Testing %s", cfptr->filename); + /* First test and run the log { } blocks */ + for (ce = cfptr->items; ce; ce = ce->next) { - if (!strcmp(ce->ce_varname, "secret")) + if (!strcmp(ce->name, "log")) + errors += config_test_log(cfptr, ce); + } + } + + for (cfptr = conf; cfptr; cfptr = cfptr->next) + { + if (config_verbose > 1) + config_status("Testing %s", cfptr->filename); + /* First test and run the secret { } blocks */ + for (ce = cfptr->items; ce; ce = ce->next) + { + if (!strcmp(ce->name, "secret")) { int n = _test_secret(cfptr, ce); errors += n; @@ -2950,21 +2773,22 @@ int config_test() } } /* First test the set { } block */ - for (ce = cfptr->cf_entries; ce; ce = ce->ce_next) + for (ce = cfptr->items; ce; ce = ce->next) { - if (!strcmp(ce->ce_varname, "set")) + if (!strcmp(ce->name, "set")) errors += _test_set(cfptr, ce); } /* Now test all the rest */ - for (ce = cfptr->cf_entries; ce; ce = ce->ce_next) + for (ce = cfptr->items; ce; ce = ce->next) { /* These are already processed, so skip them here.. */ - if (!strcmp(ce->ce_varname, "secret") || - !strcmp(ce->ce_varname, "set")) + if (!strcmp(ce->name, "secret") || + !strcmp(ce->name, "set") || + !strcmp(ce->name, "log")) { continue; } - if ((cc = config_binary_search(ce->ce_varname))) { + if ((cc = config_binary_search(ce->name))) { if (cc->testfunc) errors += (cc->testfunc(cfptr, ce)); } @@ -3003,10 +2827,10 @@ int config_test() if (!used) { config_error("%s:%i: unknown directive %s", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum, - ce->ce_varname); + ce->file->filename, ce->line_number, + ce->name); errors++; - if (strchr(ce->ce_varname, ':')) + if (strchr(ce->name, ':')) { config_error("You cannot use :: in a directive, you have to write them out. " "For example 'set::auto-join #something' needs to be written as: " @@ -3023,10 +2847,12 @@ int config_test() config_error("%i errors encountered", errors); } - if (need_34_upgrade) + if (invalid_snomasks_encountered) { - upgrade_conf_to_34(); + config_error("It seems your set::snomask-on-oper and/or oper::snomask needs to be updated. Are you perhaps upgrading from an older version to UnrealIRCd 6?"); + config_error("See https://www.unrealircd.org/docs/Upgrading_from_5.x#Update_your_snomasks"); } + return (errors > 0 ? -1 : 1); } @@ -3034,7 +2860,7 @@ int config_test() * Service functions */ -ConfigItem_alias *find_alias(char *name) +ConfigItem_alias *find_alias(const char *name) { ConfigItem_alias *e; @@ -3049,7 +2875,7 @@ ConfigItem_alias *find_alias(char *name) return NULL; } -ConfigItem_class *find_class(char *name) +ConfigItem_class *find_class(const char *name) { ConfigItem_class *e; @@ -3065,7 +2891,7 @@ ConfigItem_class *find_class(char *name) } -ConfigItem_oper *find_oper(char *name) +ConfigItem_oper *find_oper(const char *name) { ConfigItem_oper *e; @@ -3080,7 +2906,7 @@ ConfigItem_oper *find_oper(char *name) return NULL; } -ConfigItem_operclass *find_operclass(char *name) +ConfigItem_operclass *find_operclass(const char *name) { ConfigItem_operclass *e; @@ -3095,7 +2921,7 @@ ConfigItem_operclass *find_operclass(char *name) return NULL; } -int count_oper_sessions(char *name) +int count_oper_sessions(const char *name) { int count = 0; Client *client; @@ -3109,7 +2935,7 @@ int count_oper_sessions(char *name) return count; } -ConfigItem_listen *find_listen(char *ipmask, int port, int ipv6) +ConfigItem_listen *find_listen(const char *ipmask, int port, int ipv6) { ConfigItem_listen *e; @@ -3126,7 +2952,7 @@ ConfigItem_listen *find_listen(char *ipmask, int port, int ipv6) /** Find an SNI match. * @param name The hostname to look for (eg: irc.xyz.com). */ -ConfigItem_sni *find_sni(char *name) +ConfigItem_sni *find_sni(const char *name) { ConfigItem_sni *e; @@ -3141,7 +2967,7 @@ ConfigItem_sni *find_sni(char *name) return NULL; } -ConfigItem_ulines *find_uline(char *host) +ConfigItem_ulines *find_uline(const char *host) { ConfigItem_ulines *ulines; @@ -3157,28 +2983,13 @@ ConfigItem_ulines *find_uline(char *host) } -ConfigItem_except *find_except(Client *client, short type) -{ - ConfigItem_except *excepts; - - for(excepts = conf_except; excepts; excepts = excepts->next) - { - if (excepts->flag.type == type) - { - if (match_user(excepts->mask, client, MATCH_CHECK_REAL)) - return excepts; - } - } - return NULL; -} - ConfigItem_tld *find_tld(Client *client) { ConfigItem_tld *tld; for (tld = conf_tld; tld; tld = tld->next) { - if (match_user(tld->mask, client, MATCH_CHECK_REAL)) + if (unreal_mask_match(client, tld->mask)) { if ((tld->options & TLD_TLS) && !IsSecureConnect(client)) continue; @@ -3192,7 +3003,7 @@ ConfigItem_tld *find_tld(Client *client) } -ConfigItem_link *find_link(char *servername, Client *client) +ConfigItem_link *find_link(const char *servername, Client *client) { ConfigItem_link *link; @@ -3209,7 +3020,7 @@ ConfigItem_link *find_link(char *servername, Client *client) /** Find a ban of type CONF_BAN_*, which is currently only * CONF_BAN_SERVER, CONF_BAN_VERSION and CONF_BAN_REALNAME */ -ConfigItem_ban *find_ban(Client *client, char *host, short type) +ConfigItem_ban *find_ban(Client *client, const char *host, short type) { ConfigItem_ban *ban; @@ -3233,7 +3044,7 @@ ConfigItem_ban *find_ban(Client *client, char *host, short type) * CONF_BAN_SERVER, CONF_BAN_VERSION and CONF_BAN_REALNAME * This is the extended version, only used by cmd_svsnline. */ -ConfigItem_ban *find_banEx(Client *client, char *host, short type, short type2) +ConfigItem_ban *find_banEx(Client *client, const char *host, short type, short type2) { ConfigItem_ban *ban; @@ -3253,7 +3064,7 @@ ConfigItem_ban *find_banEx(Client *client, char *host, short type, short type2) return NULL; } -ConfigItem_vhost *find_vhost(char *name) +ConfigItem_vhost *find_vhost(const char *name) { ConfigItem_vhost *vhost; @@ -3268,7 +3079,7 @@ ConfigItem_vhost *find_vhost(char *name) /** returns NULL if allowed and struct if denied */ -ConfigItem_deny_channel *find_channel_allowed(Client *client, char *name) +ConfigItem_deny_channel *find_channel_allowed(Client *client, const char *name) { ConfigItem_deny_channel *dchannel; ConfigItem_allow_channel *achannel; @@ -3313,29 +3124,33 @@ void init_dynconf(void) memset(&tempiConf, 0, sizeof(iConf)); } -char *pretty_time_val(long timeval) +const char *pretty_time_val_r(char *buf, size_t buflen, long timeval) { - static char buf[512]; - if (timeval == 0) return "0"; buf[0] = 0; if (timeval/86400) - snprintf(buf, sizeof(buf), "%ldd", timeval/86400); + snprintf(buf, buflen, "%ldd", timeval/86400); if ((timeval/3600) % 24) - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "%ldh", (timeval/3600)%24); + snprintf(buf+strlen(buf), buflen-strlen(buf), "%ldh", (timeval/3600)%24); if ((timeval/60)%60) - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "%ldm", (timeval/60)%60); + snprintf(buf+strlen(buf), buflen-strlen(buf), "%ldm", (timeval/60)%60); if ((timeval%60)) - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "%lds", timeval%60); + snprintf(buf+strlen(buf), buflen-strlen(buf), "%lds", timeval%60); return buf; } +const char *pretty_time_val(long timeval) +{ + static char buf[512]; + return pretty_time_val_r(buf, sizeof(buf), timeval); +} + /* This converts a relative path to an absolute path, but only if necessary. */ -void convert_to_absolute_path(char **path, char *reldir) +void convert_to_absolute_path(char **path, const char *reldir) { char *s; @@ -3345,6 +3160,11 @@ void convert_to_absolute_path(char **path, char *reldir) if (strstr(*path, "://")) return; /* URL: don't touch */ +#ifdef _WIN32 + if (!strncmp(*path, "cache/", 6)) + return; /* downloaded from URL: don't touch (is only relative path on Windows) */ +#endif + if ((**path == '/') || (**path == '\\')) return; /* already absolute path */ @@ -3371,7 +3191,7 @@ char *convert_to_absolute_path_duplicate(char *path, char *reldir) * Actual config parser funcs */ -int _conf_include(ConfigFile *conf, ConfigEntry *ce) +int _conf_include(ConfigFile *conf, ConfigEntry *ce) { int ret = 0; #ifdef GLOBH @@ -3382,75 +3202,64 @@ int _conf_include(ConfigFile *conf, ConfigEntry *ce) WIN32_FIND_DATA FindData; char cPath[MAX_PATH], *cSlash = NULL, *path; #endif - if (!ce->ce_vardata) + if (!ce->value) { config_status("%s:%i: include: no filename given", - ce->ce_fileptr->cf_filename, - ce->ce_varlinenum); + ce->file->filename, + ce->line_number); return -1; } - if (!strcmp(ce->ce_vardata, "help.conf")) - need_34_upgrade = 1; + convert_to_absolute_path(&ce->value, CONFDIR); - convert_to_absolute_path(&ce->ce_vardata, CONFDIR); - -#ifdef USE_LIBCURL - if (url_is_valid(ce->ce_vardata)) - return remote_include(ce); -#else - if (strstr(ce->ce_vardata, "://")) + if (url_is_valid(ce->value)) { - config_error("%s:%d: URL specified: %s", - ce->ce_fileptr->cf_filename, - ce->ce_varlinenum, - ce->ce_vardata); - config_error("UnrealIRCd was not compiled with remote includes support " - "so you cannot use URLs. You are suggested to re-run ./Config " - "and answer YES to the question about remote includes."); - return -1; + add_config_resource(ce->value, RESOURCE_INCLUDE, ce); + return 0; } -#endif #if !defined(_WIN32) && !defined(_AMIGA) && !defined(OSXTIGER) && DEFAULT_PERMISSIONS != 0 - (void)chmod(ce->ce_vardata, DEFAULT_PERMISSIONS); + (void)chmod(ce->value, DEFAULT_PERMISSIONS); #endif #ifdef GLOBH #if defined(__OpenBSD__) && defined(GLOB_LIMIT) - glob(ce->ce_vardata, GLOB_NOSORT|GLOB_NOCHECK|GLOB_LIMIT, NULL, &files); + glob(ce->value, GLOB_NOSORT|GLOB_NOCHECK|GLOB_LIMIT, NULL, &files); #else - glob(ce->ce_vardata, GLOB_NOSORT|GLOB_NOCHECK, NULL, &files); + glob(ce->value, GLOB_NOSORT|GLOB_NOCHECK, NULL, &files); #endif if (!files.gl_pathc) { globfree(&files); config_status("%s:%i: include %s: invalid file given", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum, - ce->ce_vardata); + ce->file->filename, ce->line_number, + ce->value); return -1; } - for (i = 0; i < files.gl_pathc; i++) { - add_include(files.gl_pathv[i], ce->ce_fileptr->cf_filename, ce->ce_varlinenum); - ret = load_conf(files.gl_pathv[i], files.gl_pathv[i]); - if (ret < 0) + for (i = 0; i < files.gl_pathc; i++) + { + if (add_config_resource(files.gl_pathv[i], RESOURCE_INCLUDE, ce)) { - globfree(&files); - return ret; + ret = config_read_file(files.gl_pathv[i], files.gl_pathv[i]); + if (ret < 0) + { + globfree(&files); + return ret; + } } } globfree(&files); #elif defined(_WIN32) memset(cPath, 0, MAX_PATH); - if (strchr(ce->ce_vardata, '/') || strchr(ce->ce_vardata, '\\')) { - strlcpy(cPath,ce->ce_vardata,MAX_PATH); + if (strchr(ce->value, '/') || strchr(ce->value, '\\')) { + strlcpy(cPath,ce->value,MAX_PATH); cSlash=cPath+strlen(cPath); while(*cSlash != '\\' && *cSlash != '/' && cSlash > cPath) cSlash--; *(cSlash+1)=0; } - if ( (hFind = FindFirstFile(ce->ce_vardata, &FindData)) == INVALID_HANDLE_VALUE ) + if ( (hFind = FindFirstFile(ce->value, &FindData)) == INVALID_HANDLE_VALUE ) { config_status("%s:%i: include %s: invalid file given", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum, - ce->ce_vardata); + ce->file->filename, ce->line_number, + ce->value); return -1; } if (cPath) { @@ -3458,15 +3267,16 @@ int _conf_include(ConfigFile *conf, ConfigEntry *ce) strcpy(path, cPath); strcat(path, FindData.cFileName); - add_include(path, ce->ce_fileptr->cf_filename, ce->ce_varlinenum); - ret = load_conf(path, path); - safe_free(path); - + if (add_config_resource(path, RESOURCE_INCLUDE, ce)) + { + ret = config_read_file(path, path); + safe_free(path); + } } else { - add_include(FindData.cFileName, ce->ce_fileptr->cf_filename, ce->ce_varlinenum); - ret = load_conf(FindData.cFileName, FindData.cFileName); + if (add_config_resource(FindData.cFileName, RESOURCE_INCLUDE, ce)) + ret = config_read_file(FindData.cFileName, FindData.cFileName); } if (ret < 0) { @@ -3481,24 +3291,26 @@ int _conf_include(ConfigFile *conf, ConfigEntry *ce) strcpy(path,cPath); strcat(path,FindData.cFileName); - add_include(path, ce->ce_fileptr->cf_filename, ce->ce_varlinenum); - ret = load_conf(path, path); - safe_free(path); - if (ret < 0) - break; + if (add_config_resource(path, RESOURCE_INCLUDE, ce)) + { + ret = config_read_file(path, path); + safe_free(path); + if (ret < 0) + break; + } } else { - add_include(FindData.cFileName, ce->ce_fileptr->cf_filename, ce->ce_varlinenum); - ret = load_conf(FindData.cFileName, FindData.cFileName); + if (add_config_resource(FindData.cFileName, RESOURCE_INCLUDE, ce)) + ret = config_read_file(FindData.cFileName, FindData.cFileName); } } FindClose(hFind); if (ret < 0) return ret; #else - add_include(ce->ce_vardata, ce->ce_fileptr->cf_filename, ce->ce_varlinenum); - ret = load_conf(ce->ce_vardata, ce->ce_vardata); + if (add_config_resource(ce->value, RESOURCE_INCLUDE, ce)) + ret = config_read_file(ce->value, ce->value); return ret; #endif return 1; @@ -3514,12 +3326,12 @@ int _conf_admin(ConfigFile *conf, ConfigEntry *ce) ConfigEntry *cep; ConfigItem_admin *ca; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { ca = safe_alloc(sizeof(ConfigItem_admin)); if (!conf_admin) conf_admin_tail = ca; - safe_strdup(ca->line, cep->ce_varname); + safe_strdup(ca->line, cep->name); AddListItem(ca, conf_admin); } return 1; @@ -3532,17 +3344,17 @@ int _test_admin(ConfigFile *conf, ConfigEntry *ce) if (requiredstuff.conf_admin) { - config_warn_duplicate(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, "admin"); + config_warn_duplicate(ce->file->filename, ce->line_number, "admin"); return 0; } - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (strlen(cep->ce_varname) > 500) + if (strlen(cep->name) > 500) { config_error("%s:%i: oversized data in admin block", - cep->ce_fileptr->cf_filename, - cep->ce_varlinenum); + cep->file->filename, + cep->line_number); errors++; continue; } @@ -3558,19 +3370,19 @@ int _conf_me(ConfigFile *conf, ConfigEntry *ce) if (!conf_me) conf_me = safe_alloc(sizeof(ConfigItem_me)); - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "name")) + if (!strcmp(cep->name, "name")) { - safe_strdup(conf_me->name, cep->ce_vardata); + safe_strdup(conf_me->name, cep->value); } - else if (!strcmp(cep->ce_varname, "info")) + else if (!strcmp(cep->name, "info")) { - safe_strdup(conf_me->info, cep->ce_vardata); + safe_strdup(conf_me->info, cep->value); } - else if (!strcmp(cep->ce_varname, "sid")) + else if (!strcmp(cep->name, "sid")) { - safe_strdup(conf_me->sid, cep->ce_vardata); + safe_strdup(conf_me->sid, cep->value); } } return 1; @@ -3584,69 +3396,69 @@ int _test_me(ConfigFile *conf, ConfigEntry *ce) if (requiredstuff.conf_me) { - config_warn_duplicate(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, "me"); + config_warn_duplicate(ce->file->filename, ce->line_number, "me"); return 0; } - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { if (config_is_blankorempty(cep, "me")) continue; /* me::name */ - if (!strcmp(cep->ce_varname, "name")) + if (!strcmp(cep->name, "name")) { if (has_name) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "me::name"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "me::name"); continue; } has_name = 1; - if (!strchr(cep->ce_vardata, '.')) + if (!strchr(cep->value, '.')) { config_error("%s:%i: illegal me::name, must be fully qualified hostname", - cep->ce_fileptr->cf_filename, - cep->ce_varlinenum); + cep->file->filename, + cep->line_number); errors++; } - if (!valid_host(cep->ce_vardata)) - { - config_error("%s:%i: illegal me::name contains invalid character(s) [only a-z, 0-9, _, -, . are allowed]", - cep->ce_fileptr->cf_filename, - cep->ce_varlinenum); - errors++; - } - if (strlen(cep->ce_vardata) > HOSTLEN) + if (strlen(cep->value) > HOSTLEN) { config_error("%s:%i: illegal me::name, must be less or equal to %i characters", - cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, HOSTLEN); + cep->file->filename, + cep->line_number, HOSTLEN); + errors++; + } + if (!valid_server_name(cep->value)) + { + config_error("%s:%i: illegal me::name contains invalid character(s) [only a-z, 0-9, _, -, . are allowed]", + cep->file->filename, + cep->line_number); errors++; } } /* me::info */ - else if (!strcmp(cep->ce_varname, "info")) + else if (!strcmp(cep->name, "info")) { char *p; char valid = 0; if (has_info) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "me::info"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "me::info"); continue; } has_info = 1; - if (strlen(cep->ce_vardata) > (REALLEN-1)) + if (strlen(cep->value) > (REALLEN-1)) { config_error("%s:%i: too long me::info, must be max. %i characters", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, + cep->file->filename, cep->line_number, REALLEN-1); errors++; } /* Valid me::info? Any data except spaces is ok */ - for (p=cep->ce_vardata; *p; p++) + for (p=cep->value; *p; p++) { if (*p != ' ') { @@ -3657,65 +3469,65 @@ int _test_me(ConfigFile *conf, ConfigEntry *ce) if (!valid) { config_error("%s:%i: empty me::info, should be a server description.", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; } } - else if (!strcmp(cep->ce_varname, "numeric")) + else if (!strcmp(cep->name, "numeric")) { config_error("%s:%i: me::numeric has been removed, you must now specify a Server ID (SID) instead. " "Edit your configuration file and change 'numeric' to 'sid' and make up " "a server id of exactly 3 characters, starting with a digit, eg: \"001\" or \"0AB\".", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; } - else if (!strcmp(cep->ce_varname, "sid")) + else if (!strcmp(cep->name, "sid")) { if (has_sid) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "me::sid"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "me::sid"); continue; } has_sid = 1; - if (!valid_sid(cep->ce_vardata)) + if (!valid_sid(cep->value)) { config_error("%s:%i: me::sid must be 3 characters long, begin with a number, " "and the 2nd and 3rd character must be a number or uppercase letter. " "Example: \"001\" and \"0AB\" is good. \"AAA\" and \"0ab\" are bad. ", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; } - if (!isdigit(*cep->ce_vardata)) + if (!isdigit(*cep->value)) { config_error("%s:%i: me::sid must be 3 characters long and begin with a number", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; } } /* Unknown entry */ else { - config_error_unknown(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, - "me", cep->ce_varname); + config_error_unknown(ce->file->filename, ce->line_number, + "me", cep->name); errors++; } } if (!has_name) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, "me::name"); + config_error_missing(ce->file->filename, ce->line_number, "me::name"); errors++; } if (!has_info) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, "me::info"); + config_error_missing(ce->file->filename, ce->line_number, "me::info"); errors++; } if (!has_sid) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, "me::sid"); + config_error_missing(ce->file->filename, ce->line_number, "me::sid"); errors++; } requiredstuff.conf_me = 1; @@ -3750,29 +3562,29 @@ int _conf_files(ConfigFile *conf, ConfigEntry *ce) * hack to allow initialization of conf_files (above) when there is no files block in * CPATH. The caller calls _conf_files(NULL, NULL); to do this. We return here because * the for loop's initialization of cep would segfault otherwise. We return 1 because - * if config_run() calls us with a NULL ce, it's got a bug...but we can't detect that. + * if config_run_blocks() calls us with a NULL ce, it's got a bug...but we can't detect that. */ - if(!ce) + if (!ce) return 1; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "motd")) - safe_strdup(conf_files->motd_file, cep->ce_vardata); - else if (!strcmp(cep->ce_varname, "shortmotd")) - safe_strdup(conf_files->smotd_file, cep->ce_vardata); - else if (!strcmp(cep->ce_varname, "opermotd")) - safe_strdup(conf_files->opermotd_file, cep->ce_vardata); - else if (!strcmp(cep->ce_varname, "svsmotd")) - safe_strdup(conf_files->svsmotd_file, cep->ce_vardata); - else if (!strcmp(cep->ce_varname, "botmotd")) - safe_strdup(conf_files->botmotd_file, cep->ce_vardata); - else if (!strcmp(cep->ce_varname, "rules")) - safe_strdup(conf_files->rules_file, cep->ce_vardata); - else if (!strcmp(cep->ce_varname, "tunefile")) - safe_strdup(conf_files->tune_file, cep->ce_vardata); - else if (!strcmp(cep->ce_varname, "pidfile")) - safe_strdup(conf_files->pid_file, cep->ce_vardata); + if (!strcmp(cep->name, "motd")) + safe_strdup(conf_files->motd_file, cep->value); + else if (!strcmp(cep->name, "shortmotd")) + safe_strdup(conf_files->smotd_file, cep->value); + else if (!strcmp(cep->name, "opermotd")) + safe_strdup(conf_files->opermotd_file, cep->value); + else if (!strcmp(cep->name, "svsmotd")) + safe_strdup(conf_files->svsmotd_file, cep->value); + else if (!strcmp(cep->name, "botmotd")) + safe_strdup(conf_files->botmotd_file, cep->value); + else if (!strcmp(cep->name, "rules")) + safe_strdup(conf_files->rules_file, cep->value); + else if (!strcmp(cep->name, "tunefile")) + safe_strdup(conf_files->tune_file, cep->value); + else if (!strcmp(cep->name, "pidfile")) + safe_strdup(conf_files->pid_file, cep->value); } return 1; } @@ -3785,120 +3597,120 @@ int _test_files(ConfigFile *conf, ConfigEntry *ce) char has_botmotd = 0, has_opermotd = 0, has_svsmotd = 0; char has_pidfile = 0, has_tunefile = 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { /* files::motd */ - if (!strcmp(cep->ce_varname, "motd")) + if (!strcmp(cep->name, "motd")) { if (has_motd) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "files::motd"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "files::motd"); continue; } - convert_to_absolute_path(&cep->ce_vardata, CONFDIR); + convert_to_absolute_path(&cep->value, CONFDIR); config_test_openfile(cep, O_RDONLY, 0, "files::motd", 0, 1); has_motd = 1; } /* files::smotd */ - else if (!strcmp(cep->ce_varname, "shortmotd")) + else if (!strcmp(cep->name, "shortmotd")) { if (has_smotd) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "files::shortmotd"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "files::shortmotd"); continue; } - convert_to_absolute_path(&cep->ce_vardata, CONFDIR); + convert_to_absolute_path(&cep->value, CONFDIR); config_test_openfile(cep, O_RDONLY, 0, "files::shortmotd", 0, 1); has_smotd = 1; } /* files::rules */ - else if (!strcmp(cep->ce_varname, "rules")) + else if (!strcmp(cep->name, "rules")) { if (has_rules) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "files::rules"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "files::rules"); continue; } - convert_to_absolute_path(&cep->ce_vardata, CONFDIR); + convert_to_absolute_path(&cep->value, CONFDIR); config_test_openfile(cep, O_RDONLY, 0, "files::rules", 0, 1); has_rules = 1; } /* files::botmotd */ - else if (!strcmp(cep->ce_varname, "botmotd")) + else if (!strcmp(cep->name, "botmotd")) { if (has_botmotd) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "files::botmotd"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "files::botmotd"); continue; } - convert_to_absolute_path(&cep->ce_vardata, CONFDIR); + convert_to_absolute_path(&cep->value, CONFDIR); config_test_openfile(cep, O_RDONLY, 0, "files::botmotd", 0, 1); has_botmotd = 1; } /* files::opermotd */ - else if (!strcmp(cep->ce_varname, "opermotd")) + else if (!strcmp(cep->name, "opermotd")) { if (has_opermotd) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "files::opermotd"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "files::opermotd"); continue; } - convert_to_absolute_path(&cep->ce_vardata, CONFDIR); + convert_to_absolute_path(&cep->value, CONFDIR); config_test_openfile(cep, O_RDONLY, 0, "files::opermotd", 0, 1); has_opermotd = 1; } /* files::svsmotd * This config stuff should somehow be inside of modules/svsmotd.c!!!... right? */ - else if (!strcmp(cep->ce_varname, "svsmotd")) + else if (!strcmp(cep->name, "svsmotd")) { if (has_svsmotd) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "files::svsmotd"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "files::svsmotd"); continue; } - convert_to_absolute_path(&cep->ce_vardata, CONFDIR); + convert_to_absolute_path(&cep->value, CONFDIR); /* svsmotd can't be a URL because we have to be able to write to it */ config_test_openfile(cep, O_RDONLY, 0, "files::svsmotd", 0, 0); has_svsmotd = 1; } /* files::pidfile */ - else if (!strcmp(cep->ce_varname, "pidfile")) + else if (!strcmp(cep->name, "pidfile")) { if (has_pidfile) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "files::pidfile"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "files::pidfile"); continue; } - convert_to_absolute_path(&cep->ce_vardata, PERMDATADIR); + convert_to_absolute_path(&cep->value, PERMDATADIR); errors += config_test_openfile(cep, O_WRONLY | O_CREAT, 0600, "files::pidfile", 1, 0); has_pidfile = 1; } /* files::tunefile */ - else if (!strcmp(cep->ce_varname, "tunefile")) + else if (!strcmp(cep->name, "tunefile")) { if (has_tunefile) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "files::tunefile"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "files::tunefile"); continue; } - convert_to_absolute_path(&cep->ce_vardata, PERMDATADIR); + convert_to_absolute_path(&cep->value, PERMDATADIR); errors += config_test_openfile(cep, O_RDWR | O_CREAT, 0600, "files::tunefile", 1, 0); has_tunefile = 1; } /* */ else { - config_error("%s:%d: Unknown directive: \"%s\" in files {}", cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, cep->ce_varname); + config_error("%s:%d: Unknown directive: \"%s\" in files {}", cep->file->filename, + cep->line_number, cep->name); errors ++; } } @@ -3915,18 +3727,18 @@ OperClassACLEntry* _conf_parseACLEntry(ConfigEntry *ce) OperClassACLEntry *entry = NULL; entry = safe_alloc(sizeof(OperClassACLEntry)); - if (!strcmp(ce->ce_varname,"allow")) + if (!strcmp(ce->name,"allow")) entry->type = OPERCLASSENTRY_ALLOW; else entry->type = OPERCLASSENTRY_DENY; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { OperClassACLEntryVar *var = safe_alloc(sizeof(OperClassACLEntryVar)); - safe_strdup(var->name, cep->ce_varname); - if (cep->ce_vardata) + safe_strdup(var->name, cep->name); + if (cep->value) { - safe_strdup(var->value, cep->ce_vardata); + safe_strdup(var->value, cep->value); } AddListItem(var,entry->variables); } @@ -3934,7 +3746,7 @@ OperClassACLEntry* _conf_parseACLEntry(ConfigEntry *ce) return entry; } -OperClassACL* _conf_parseACL(char *name, ConfigEntry *ce) +OperClassACL* _conf_parseACL(const char *name, ConfigEntry *ce) { ConfigEntry *cep; OperClassACL *acl = NULL; @@ -3942,15 +3754,15 @@ OperClassACL* _conf_parseACL(char *name, ConfigEntry *ce) acl = safe_alloc(sizeof(OperClassACL)); safe_strdup(acl->name, name); - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "deny") || !strcmp(cep->ce_varname, "allow")) + if (!strcmp(cep->name, "deny") || !strcmp(cep->name, "allow")) { OperClassACLEntry *entry = _conf_parseACLEntry(cep); AddListItem(entry,acl->entries); } else { - OperClassACL *subAcl = _conf_parseACL(cep->ce_varname,cep); + OperClassACL *subAcl = _conf_parseACL(cep->name,cep); AddListItem(subAcl,acl->acls); } } @@ -3965,19 +3777,19 @@ int _conf_operclass(ConfigFile *conf, ConfigEntry *ce) ConfigItem_operclass *operClass = NULL; operClass = safe_alloc(sizeof(ConfigItem_operclass)); operClass->classStruct = safe_alloc(sizeof(OperClass)); - safe_strdup(operClass->classStruct->name, ce->ce_vardata); + safe_strdup(operClass->classStruct->name, ce->value); - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "parent")) + if (!strcmp(cep->name, "parent")) { - safe_strdup(operClass->classStruct->ISA, cep->ce_vardata); + safe_strdup(operClass->classStruct->ISA, cep->value); } - else if (!strcmp(cep->ce_varname, "permissions")) + else if (!strcmp(cep->name, "permissions")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { - OperClassACL *acl = _conf_parseACL(cepp->ce_varname,cepp); + OperClassACL *acl = _conf_parseACL(cepp->name,cepp); AddListItem(acl,operClass->classStruct->acls); } } @@ -3993,7 +3805,7 @@ void new_permissions_system(ConfigFile *conf, ConfigEntry *ce) return; /* error already shown */ config_error("%s:%i: UnrealIRCd 4.2.1 and higher have a new operclass permissions system.", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); config_error("Please see https://www.unrealircd.org/docs/FAQ#New_operclass_permissions"); config_error("(additional errors regarding this are suppressed)"); /* @@ -4011,44 +3823,44 @@ int _test_operclass(ConfigFile *conf, ConfigEntry *ce) ConfigEntry *cep; int errors = 0; - if (!ce->ce_vardata) + if (!ce->value) { - config_error_noname(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, "operclass"); + config_error_noname(ce->file->filename, ce->line_number, "operclass"); errors++; } - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "parent")) + if (!strcmp(cep->name, "parent")) { if (has_parent) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "operclass::parent"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "operclass::parent"); continue; } has_parent = 1; continue; } else - if (!strcmp(cep->ce_varname, "permissions")) + if (!strcmp(cep->name, "permissions")) { if (has_permissions) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "oper::permissions"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "oper::permissions"); continue; } has_permissions = 1; continue; } else - if (!strcmp(cep->ce_varname, "privileges")) + if (!strcmp(cep->name, "privileges")) { new_permissions_system(conf, cep); errors++; return errors; } else { - config_error_unknown(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "operclass", cep->ce_varname); + config_error_unknown(cep->file->filename, + cep->line_number, "operclass", cep->name); errors++; continue; } @@ -4056,7 +3868,7 @@ int _test_operclass(ConfigFile *conf, ConfigEntry *ce) if (!has_permissions) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "oper::permissions"); errors++; } @@ -4075,69 +3887,75 @@ int _conf_oper(ConfigFile *conf, ConfigEntry *ce) ConfigItem_oper *oper = NULL; oper = safe_alloc(sizeof(ConfigItem_oper)); - safe_strdup(oper->name, ce->ce_vardata); + safe_strdup(oper->name, ce->value); - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + oper->server_notice_colors = tempiConf.server_notice_colors; /* default */ + + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "operclass")) - safe_strdup(oper->operclass, cep->ce_vardata); - if (!strcmp(cep->ce_varname, "password")) + if (!strcmp(cep->name, "operclass")) + safe_strdup(oper->operclass, cep->value); + if (!strcmp(cep->name, "password")) oper->auth = AuthBlockToAuthConfig(cep); - else if (!strcmp(cep->ce_varname, "class")) + else if (!strcmp(cep->name, "class")) { - oper->class = find_class(cep->ce_vardata); + oper->class = find_class(cep->value); if (!oper->class || (oper->class->flag.temporary == 1)) { config_status("%s:%i: illegal oper::class, unknown class '%s' using default of class 'default'", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - cep->ce_vardata); + cep->file->filename, cep->line_number, + cep->value); oper->class = default_class; } } - else if (!strcmp(cep->ce_varname, "swhois")) + else if (!strcmp(cep->name, "swhois")) { SWhois *s; - if (cep->ce_entries) + if (cep->items) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { s = safe_alloc(sizeof(SWhois)); - safe_strdup(s->line, cepp->ce_varname); + safe_strdup(s->line, cepp->name); safe_strdup(s->setby, "oper"); AddListItem(s, oper->swhois); } } else - if (cep->ce_vardata) + if (cep->value) { s = safe_alloc(sizeof(SWhois)); - safe_strdup(s->line, cep->ce_vardata); + safe_strdup(s->line, cep->value); safe_strdup(s->setby, "oper"); AddListItem(s, oper->swhois); } } - else if (!strcmp(cep->ce_varname, "snomask")) + else if (!strcmp(cep->name, "snomask")) { - safe_strdup(oper->snomask, cep->ce_vardata); + safe_strdup(oper->snomask, cep->value); } - else if (!strcmp(cep->ce_varname, "modes")) + else if (!strcmp(cep->name, "server-notice-colors")) { - oper->modes = set_usermode(cep->ce_vardata); + oper->server_notice_colors = config_checkval(cep->value, CFG_YESNO); } - else if (!strcmp(cep->ce_varname, "require-modes")) + else if (!strcmp(cep->name, "modes")) { - oper->require_modes = set_usermode(cep->ce_vardata); + oper->modes = set_usermode(cep->value); } - else if (!strcmp(cep->ce_varname, "maxlogins")) + else if (!strcmp(cep->name, "require-modes")) { - oper->maxlogins = atoi(cep->ce_vardata); + oper->require_modes = set_usermode(cep->value); } - else if (!strcmp(cep->ce_varname, "mask")) + else if (!strcmp(cep->name, "maxlogins")) + { + oper->maxlogins = atoi(cep->value); + } + else if (!strcmp(cep->name, "mask")) { unreal_add_masks(&oper->mask, cep); } - else if (!strcmp(cep->ce_varname, "vhost")) + else if (!strcmp(cep->name, "vhost")) { - safe_strdup(oper->vhost, cep->ce_vardata); + safe_strdup(oper->vhost, cep->value); } } AddListItem(oper, conf_oper); @@ -4152,15 +3970,15 @@ int _test_oper(ConfigFile *conf, ConfigEntry *ce) ConfigEntry *cep; int errors = 0; - if (!ce->ce_vardata) + if (!ce->value) { - config_error_noname(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, "oper"); + config_error_noname(ce->file->filename, ce->line_number, "oper"); errors++; } - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { /* Regular variables */ - if (!cep->ce_entries) + if (!cep->items) { if (config_is_blankorempty(cep, "oper")) { @@ -4168,154 +3986,157 @@ int _test_oper(ConfigFile *conf, ConfigEntry *ce) continue; } /* oper::password */ - if (!strcmp(cep->ce_varname, "password")) + if (!strcmp(cep->name, "password")) { if (has_password) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "oper::password"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "oper::password"); continue; } has_password = 1; if (Auth_CheckError(cep) < 0) errors++; - if (ce->ce_vardata && cep->ce_vardata && - !strcmp(ce->ce_vardata, "bobsmith") && - !strcmp(cep->ce_vardata, "test")) + if (ce->value && cep->value && + !strcmp(ce->value, "bobsmith") && + !strcmp(cep->value, "test")) { config_error("%s:%i: please change the the name and password of the " "default 'bobsmith' oper block", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); errors++; } continue; } /* oper::operclass */ - else if (!strcmp(cep->ce_varname, "operclass")) + else if (!strcmp(cep->name, "operclass")) { if (has_operclass) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "oper::operclass"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "oper::operclass"); continue; } has_operclass = 1; continue; } /* oper::class */ - else if (!strcmp(cep->ce_varname, "class")) + else if (!strcmp(cep->name, "class")) { if (has_class) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "oper::class"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "oper::class"); continue; } has_class = 1; } /* oper::swhois */ - else if (!strcmp(cep->ce_varname, "swhois")) + else if (!strcmp(cep->name, "swhois")) { } /* oper::vhost */ - else if (!strcmp(cep->ce_varname, "vhost")) + else if (!strcmp(cep->name, "vhost")) { if (has_vhost) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "oper::vhost"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "oper::vhost"); continue; } has_vhost = 1; } /* oper::snomask */ - else if (!strcmp(cep->ce_varname, "snomask")) + else if (!strcmp(cep->name, "snomask")) { + char *wrong_snomask; if (has_snomask) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "oper::snomask"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "oper::snomask"); continue; } + if (!is_valid_snomask_string_testing(cep->value, &wrong_snomask)) + { + config_error("%s:%i: oper::snomask contains unknown snomask letter(s) '%s'", + cep->file->filename, cep->line_number, wrong_snomask); + errors++; + invalid_snomasks_encountered++; + } has_snomask = 1; } + else if (!strcmp(cep->name, "server-notice-colors")) + { + } /* oper::modes */ - else if (!strcmp(cep->ce_varname, "modes")) + else if (!strcmp(cep->name, "modes")) { char *p; - for (p = cep->ce_vardata; *p; p++) + for (p = cep->value; *p; p++) if (strchr("orzS", *p)) { config_error("%s:%i: oper::modes may not include mode '%c'", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, *p); + cep->file->filename, cep->line_number, *p); errors++; } if (has_modes) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "oper::modes"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "oper::modes"); continue; } has_modes = 1; } /* oper::require-modes */ - else if (!strcmp(cep->ce_varname, "require-modes")) + else if (!strcmp(cep->name, "require-modes")) { char *p; - for (p = cep->ce_vardata; *p; p++) + for (p = cep->value; *p; p++) if (strchr("o", *p)) { config_warn("%s:%i: oper::require-modes probably shouldn't include mode '%c'", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, *p); + cep->file->filename, cep->line_number, *p); } if (has_require_modes) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "oper::require-modes"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "oper::require-modes"); continue; } has_require_modes = 1; } /* oper::maxlogins */ - else if (!strcmp(cep->ce_varname, "maxlogins")) + else if (!strcmp(cep->name, "maxlogins")) { int l; if (has_maxlogins) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "oper::maxlogins"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "oper::maxlogins"); continue; } has_maxlogins = 1; - l = atoi(cep->ce_vardata); + l = atoi(cep->value); if ((l < 0) || (l > 5000)) { config_error("%s:%i: oper::maxlogins: value out of range (%d) should be 0-5000", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, l); + cep->file->filename, cep->line_number, l); errors++; continue; } } - /* oper::flags */ - else if (!strcmp(cep->ce_varname, "flags")) + else if (!strcmp(cep->name, "mask")) { - config_error("%s:%i: oper::flags no longer exists. UnrealIRCd 4 uses a new style oper block.", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); - errors++; - need_34_upgrade = 1; - } - else if (!strcmp(cep->ce_varname, "mask")) - { - if (cep->ce_vardata || cep->ce_entries) + if (cep->value || cep->items) has_mask = 1; } else { - config_error_unknown(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "oper", cep->ce_varname); + config_error_unknown(cep->file->filename, + cep->line_number, "oper", cep->name); errors++; continue; } @@ -4323,39 +4144,21 @@ int _test_oper(ConfigFile *conf, ConfigEntry *ce) /* Sections */ else { - /* oper::flags {} */ - if (!strcmp(cep->ce_varname, "flags")) - { - config_error("%s:%i: oper::flags no longer exists. UnrealIRCd 4 uses a new style oper block.", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); - errors++; - need_34_upgrade = 1; - continue; - } - /* oper::from {} */ - else if (!strcmp(cep->ce_varname, "from")) - { - config_error("%s:%i: oper::from::userhost is now called oper::mask", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); - errors++; - need_34_upgrade = 1; - continue; - } - else if (!strcmp(cep->ce_varname, "swhois")) + if (!strcmp(cep->name, "swhois")) { /* ok */ } - else if (!strcmp(cep->ce_varname, "mask")) + else if (!strcmp(cep->name, "mask")) { - if (cep->ce_vardata || cep->ce_entries) + if (cep->value || cep->items) has_mask = 1; } - else if (!strcmp(cep->ce_varname, "password")) + else if (!strcmp(cep->name, "password")) { if (has_password) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "oper::password"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "oper::password"); continue; } has_password = 1; @@ -4364,8 +4167,8 @@ int _test_oper(ConfigFile *conf, ConfigEntry *ce) } else { - config_error_unknown(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "oper", cep->ce_varname); + config_error_unknown(cep->file->filename, + cep->line_number, "oper", cep->name); errors++; continue; } @@ -4373,27 +4176,26 @@ int _test_oper(ConfigFile *conf, ConfigEntry *ce) } if (!has_password) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "oper::password"); errors++; } if (!has_mask) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "oper::mask"); errors++; } if (!has_class) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "oper::class"); errors++; } if (!has_operclass) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "oper::operclass"); - need_34_upgrade = 1; errors++; } @@ -4410,10 +4212,10 @@ int _conf_class(ConfigFile *conf, ConfigEntry *ce) ConfigItem_class *class; unsigned char isnew = 0; - if (!(class = find_class(ce->ce_vardata))) + if (!(class = find_class(ce->value))) { class = safe_alloc(sizeof(ConfigItem_class)); - safe_strdup(class->name, ce->ce_vardata); + safe_strdup(class->name, ce->value); isnew = 1; } else @@ -4422,26 +4224,26 @@ int _conf_class(ConfigFile *conf, ConfigEntry *ce) class->flag.temporary = 0; class->options = 0; /* RESET OPTIONS */ } - safe_strdup(class->name, ce->ce_vardata); + safe_strdup(class->name, ce->value); class->connfreq = 15; /* default */ - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "pingfreq")) - class->pingfreq = config_checkval(cep->ce_vardata,CFG_TIME); - else if (!strcmp(cep->ce_varname, "connfreq")) - class->connfreq = config_checkval(cep->ce_vardata,CFG_TIME); - else if (!strcmp(cep->ce_varname, "maxclients")) - class->maxclients = atol(cep->ce_vardata); - else if (!strcmp(cep->ce_varname, "sendq")) - class->sendq = config_checkval(cep->ce_vardata,CFG_SIZE); - else if (!strcmp(cep->ce_varname, "recvq")) - class->recvq = config_checkval(cep->ce_vardata,CFG_SIZE); - else if (!strcmp(cep->ce_varname, "options")) + if (!strcmp(cep->name, "pingfreq")) + class->pingfreq = config_checkval(cep->value,CFG_TIME); + else if (!strcmp(cep->name, "connfreq")) + class->connfreq = config_checkval(cep->value,CFG_TIME); + else if (!strcmp(cep->name, "maxclients")) + class->maxclients = atol(cep->value); + else if (!strcmp(cep->name, "sendq")) + class->sendq = config_checkval(cep->value,CFG_SIZE); + else if (!strcmp(cep->name, "recvq")) + class->recvq = config_checkval(cep->value,CFG_SIZE); + else if (!strcmp(cep->name, "options")) { - for (cep2 = cep->ce_entries; cep2; cep2 = cep2->ce_next) - if (!strcmp(cep2->ce_varname, "nofakelag")) + for (cep2 = cep->items; cep2; cep2 = cep2->next) + if (!strcmp(cep2->name, "nofakelag")) class->options |= CLASS_OPT_NOFAKELAG; } } @@ -4457,32 +4259,32 @@ int _test_class(ConfigFile *conf, ConfigEntry *ce) char has_pingfreq = 0, has_connfreq = 0, has_maxclients = 0, has_sendq = 0; char has_recvq = 0; - if (!ce->ce_vardata) + if (!ce->value) { - config_error_noname(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, "class"); + config_error_noname(ce->file->filename, ce->line_number, "class"); return 1; } - if (!strcasecmp(ce->ce_vardata, "default")) + if (!strcasecmp(ce->value, "default")) { config_error("%s:%d: Class cannot be named 'default', this class name is reserved for internal use.", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); errors++; } - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "options")) + if (!strcmp(cep->name, "options")) { - for (cep2 = cep->ce_entries; cep2; cep2 = cep2->ce_next) + for (cep2 = cep->items; cep2; cep2 = cep2->next) { #ifdef FAKELAG_CONFIGURABLE - if (!strcmp(cep2->ce_varname, "nofakelag")) + if (!strcmp(cep2->name, "nofakelag")) ; else #endif { config_error("%s:%d: Unknown option '%s' in class::options", - cep2->ce_fileptr->cf_filename, cep2->ce_varlinenum, cep2->ce_varname); + cep2->file->filename, cep2->line_number, cep2->name); errors++; } } @@ -4493,124 +4295,124 @@ int _test_class(ConfigFile *conf, ConfigEntry *ce) continue; } /* class::pingfreq */ - else if (!strcmp(cep->ce_varname, "pingfreq")) + else if (!strcmp(cep->name, "pingfreq")) { - int v = config_checkval(cep->ce_vardata,CFG_TIME); + int v = config_checkval(cep->value,CFG_TIME); if (has_pingfreq) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "class::pingfreq"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "class::pingfreq"); continue; } has_pingfreq = 1; if ((v < 30) || (v > 600)) { config_error("%s:%i: class::pingfreq should be a reasonable value (30-600)", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; continue; } } /* class::maxclients */ - else if (!strcmp(cep->ce_varname, "maxclients")) + else if (!strcmp(cep->name, "maxclients")) { long l; if (has_maxclients) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "class::maxclients"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "class::maxclients"); continue; } has_maxclients = 1; - l = atol(cep->ce_vardata); + l = atol(cep->value); if ((l < 1) || (l > 1000000)) { config_error("%s:%i: class::maxclients with illegal value", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; } } /* class::connfreq */ - else if (!strcmp(cep->ce_varname, "connfreq")) + else if (!strcmp(cep->name, "connfreq")) { long l; if (has_connfreq) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "class::connfreq"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "class::connfreq"); continue; } has_connfreq = 1; - l = config_checkval(cep->ce_vardata,CFG_TIME); + l = config_checkval(cep->value,CFG_TIME); if ((l < 5) || (l > 604800)) { config_error("%s:%i: class::connfreq with illegal value (must be >5 and <7d)", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; } } /* class::sendq */ - else if (!strcmp(cep->ce_varname, "sendq")) + else if (!strcmp(cep->name, "sendq")) { long l; if (has_sendq) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "class::sendq"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "class::sendq"); continue; } has_sendq = 1; - l = config_checkval(cep->ce_vardata,CFG_SIZE); + l = config_checkval(cep->value,CFG_SIZE); if ((l <= 0) || (l > 2000000000)) { config_error("%s:%i: class::sendq with illegal value", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; } } /* class::recvq */ - else if (!strcmp(cep->ce_varname, "recvq")) + else if (!strcmp(cep->name, "recvq")) { long l; if (has_recvq) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "class::recvq"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "class::recvq"); continue; } has_recvq = 1; - l = config_checkval(cep->ce_vardata,CFG_SIZE); + l = config_checkval(cep->value,CFG_SIZE); if ((l < 512) || (l > 32768)) { config_error("%s:%i: class::recvq with illegal value (must be >512 and <32k)", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; } } /* Unknown */ else { - config_error_unknown(cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - "class", cep->ce_varname); + config_error_unknown(cep->file->filename, cep->line_number, + "class", cep->name); errors++; continue; } } if (!has_pingfreq) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "class::pingfreq"); errors++; } if (!has_maxclients) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "class::maxclients"); errors++; } if (!has_sendq) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "class::sendq"); errors++; } @@ -4627,16 +4429,16 @@ int _conf_drpass(ConfigFile *conf, ConfigEntry *ce) conf_drpass = safe_alloc(sizeof(ConfigItem_drpass)); } - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "restart")) + if (!strcmp(cep->name, "restart")) { if (conf_drpass->restartauth) Auth_FreeAuthConfig(conf_drpass->restartauth); conf_drpass->restartauth = AuthBlockToAuthConfig(cep); } - else if (!strcmp(cep->ce_varname, "die")) + else if (!strcmp(cep->name, "die")) { if (conf_drpass->dieauth) Auth_FreeAuthConfig(conf_drpass->dieauth); @@ -4653,7 +4455,7 @@ int _test_drpass(ConfigFile *conf, ConfigEntry *ce) int errors = 0; char has_restart = 0, has_die = 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { if (config_is_blankorempty(cep, "drpass")) { @@ -4661,12 +4463,12 @@ int _test_drpass(ConfigFile *conf, ConfigEntry *ce) continue; } /* drpass::restart */ - if (!strcmp(cep->ce_varname, "restart")) + if (!strcmp(cep->name, "restart")) { if (has_restart) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "drpass::restart"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "drpass::restart"); continue; } has_restart = 1; @@ -4675,12 +4477,12 @@ int _test_drpass(ConfigFile *conf, ConfigEntry *ce) continue; } /* drpass::die */ - else if (!strcmp(cep->ce_varname, "die")) + else if (!strcmp(cep->name, "die")) { if (has_die) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "drpass::die"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "drpass::die"); continue; } has_die = 1; @@ -4691,8 +4493,8 @@ int _test_drpass(ConfigFile *conf, ConfigEntry *ce) /* Unknown */ else { - config_error_unknown(cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - "drpass", cep->ce_varname); + config_error_unknown(cep->file->filename, cep->line_number, + "drpass", cep->name); errors++; continue; } @@ -4708,10 +4510,10 @@ int _conf_ulines(ConfigFile *conf, ConfigEntry *ce) ConfigEntry *cep; ConfigItem_ulines *ca; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { ca = safe_alloc(sizeof(ConfigItem_ulines)); - safe_strdup(ca->servername, cep->ce_varname); + safe_strdup(ca->servername, cep->name); AddListItem(ca, conf_ulines); } return 1; @@ -4730,48 +4532,48 @@ int _conf_tld(ConfigFile *conf, ConfigEntry *ce) ca = safe_alloc(sizeof(ConfigItem_tld)); - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "mask")) - safe_strdup(ca->mask, cep->ce_vardata); - else if (!strcmp(cep->ce_varname, "motd")) + if (!strcmp(cep->name, "mask")) + unreal_add_masks(&ca->mask, cep); + else if (!strcmp(cep->name, "motd")) { - safe_strdup(ca->motd_file, cep->ce_vardata); - read_motd(cep->ce_vardata, &ca->motd); + safe_strdup(ca->motd_file, cep->value); + read_motd(cep->value, &ca->motd); } - else if (!strcmp(cep->ce_varname, "shortmotd")) + else if (!strcmp(cep->name, "shortmotd")) { - safe_strdup(ca->smotd_file, cep->ce_vardata); - read_motd(cep->ce_vardata, &ca->smotd); + safe_strdup(ca->smotd_file, cep->value); + read_motd(cep->value, &ca->smotd); } - else if (!strcmp(cep->ce_varname, "opermotd")) + else if (!strcmp(cep->name, "opermotd")) { - safe_strdup(ca->opermotd_file, cep->ce_vardata); - read_motd(cep->ce_vardata, &ca->opermotd); + safe_strdup(ca->opermotd_file, cep->value); + read_motd(cep->value, &ca->opermotd); } - else if (!strcmp(cep->ce_varname, "botmotd")) + else if (!strcmp(cep->name, "botmotd")) { - safe_strdup(ca->botmotd_file, cep->ce_vardata); - read_motd(cep->ce_vardata, &ca->botmotd); + safe_strdup(ca->botmotd_file, cep->value); + read_motd(cep->value, &ca->botmotd); } - else if (!strcmp(cep->ce_varname, "rules")) + else if (!strcmp(cep->name, "rules")) { - safe_strdup(ca->rules_file, cep->ce_vardata); - read_motd(cep->ce_vardata, &ca->rules); + safe_strdup(ca->rules_file, cep->value); + read_motd(cep->value, &ca->rules); } - else if (!strcmp(cep->ce_varname, "options")) + else if (!strcmp(cep->name, "options")) { ConfigEntry *cepp; - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { - if (!strcmp(cepp->ce_varname, "ssl") || !strcmp(cepp->ce_varname, "tls")) + if (!strcmp(cepp->name, "ssl") || !strcmp(cepp->name, "tls")) ca->options |= TLD_TLS; - else if (!strcmp(cepp->ce_varname, "remote")) + else if (!strcmp(cepp->name, "remote")) ca->options |= TLD_REMOTE; } } - else if (!strcmp(cep->ce_varname, "channel")) - safe_strdup(ca->channel, cep->ce_vardata); + else if (!strcmp(cep->name, "channel")) + safe_strdup(ca->channel, cep->value); } AddListItem(ca, conf_tld); return 1; @@ -4785,189 +4587,184 @@ int _test_tld(ConfigFile *conf, ConfigEntry *ce) char has_mask = 0, has_motd = 0, has_rules = 0, has_shortmotd = 0, has_channel = 0; char has_opermotd = 0, has_botmotd = 0, has_options = 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!cep->ce_vardata && strcmp(cep->ce_varname, "options")) + if (!cep->value && strcmp(cep->name, "options")) { - config_error_empty(cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - "tld", cep->ce_varname); + config_error_empty(cep->file->filename, cep->line_number, + "tld", cep->name); errors++; continue; } /* tld::mask */ - if (!strcmp(cep->ce_varname, "mask")) + if (!strcmp(cep->name, "mask")) { - if (has_mask) - { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "tld::mask"); - continue; - } - has_mask = 1; + if (cep->value || cep->items) + has_mask = 1; } /* tld::motd */ - else if (!strcmp(cep->ce_varname, "motd")) + else if (!strcmp(cep->name, "motd")) { if (has_motd) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "tld::motd"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "tld::motd"); continue; } has_motd = 1; - convert_to_absolute_path(&cep->ce_vardata, CONFDIR); - if (((fd = open(cep->ce_vardata, O_RDONLY)) == -1)) + convert_to_absolute_path(&cep->value, CONFDIR); + if (((fd = open(cep->value, O_RDONLY)) == -1)) { config_error("%s:%i: tld::motd: %s: %s", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - cep->ce_vardata, strerror(errno)); + cep->file->filename, cep->line_number, + cep->value, strerror(errno)); errors++; } else close(fd); } /* tld::rules */ - else if (!strcmp(cep->ce_varname, "rules")) + else if (!strcmp(cep->name, "rules")) { if (has_rules) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "tld::rules"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "tld::rules"); continue; } has_rules = 1; - convert_to_absolute_path(&cep->ce_vardata, CONFDIR); - if (((fd = open(cep->ce_vardata, O_RDONLY)) == -1)) + convert_to_absolute_path(&cep->value, CONFDIR); + if (((fd = open(cep->value, O_RDONLY)) == -1)) { config_error("%s:%i: tld::rules: %s: %s", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - cep->ce_vardata, strerror(errno)); + cep->file->filename, cep->line_number, + cep->value, strerror(errno)); errors++; } else close(fd); } /* tld::channel */ - else if (!strcmp(cep->ce_varname, "channel")) + else if (!strcmp(cep->name, "channel")) { if (has_channel) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "tld::channel"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "tld::channel"); continue; } has_channel = 1; } /* tld::shortmotd */ - else if (!strcmp(cep->ce_varname, "shortmotd")) + else if (!strcmp(cep->name, "shortmotd")) { if (has_shortmotd) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "tld::shortmotd"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "tld::shortmotd"); continue; } has_shortmotd = 1; - convert_to_absolute_path(&cep->ce_vardata, CONFDIR); - if (((fd = open(cep->ce_vardata, O_RDONLY)) == -1)) + convert_to_absolute_path(&cep->value, CONFDIR); + if (((fd = open(cep->value, O_RDONLY)) == -1)) { config_error("%s:%i: tld::shortmotd: %s: %s", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - cep->ce_vardata, strerror(errno)); + cep->file->filename, cep->line_number, + cep->value, strerror(errno)); errors++; } else close(fd); } /* tld::opermotd */ - else if (!strcmp(cep->ce_varname, "opermotd")) + else if (!strcmp(cep->name, "opermotd")) { if (has_opermotd) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "tld::opermotd"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "tld::opermotd"); continue; } has_opermotd = 1; - convert_to_absolute_path(&cep->ce_vardata, CONFDIR); - if (((fd = open(cep->ce_vardata, O_RDONLY)) == -1)) + convert_to_absolute_path(&cep->value, CONFDIR); + if (((fd = open(cep->value, O_RDONLY)) == -1)) { config_error("%s:%i: tld::opermotd: %s: %s", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - cep->ce_vardata, strerror(errno)); + cep->file->filename, cep->line_number, + cep->value, strerror(errno)); errors++; } else close(fd); } /* tld::botmotd */ - else if (!strcmp(cep->ce_varname, "botmotd")) + else if (!strcmp(cep->name, "botmotd")) { if (has_botmotd) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "tld::botmotd"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "tld::botmotd"); continue; } has_botmotd = 1; - convert_to_absolute_path(&cep->ce_vardata, CONFDIR); - if (((fd = open(cep->ce_vardata, O_RDONLY)) == -1)) + convert_to_absolute_path(&cep->value, CONFDIR); + if (((fd = open(cep->value, O_RDONLY)) == -1)) { config_error("%s:%i: tld::botmotd: %s: %s", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - cep->ce_vardata, strerror(errno)); + cep->file->filename, cep->line_number, + cep->value, strerror(errno)); errors++; } else close(fd); } /* tld::options */ - else if (!strcmp(cep->ce_varname, "options")) { + else if (!strcmp(cep->name, "options")) { ConfigEntry *cep2; if (has_options) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "tld::options"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "tld::options"); continue; } has_options = 1; - for (cep2 = cep->ce_entries; cep2; cep2 = cep2->ce_next) + for (cep2 = cep->items; cep2; cep2 = cep2->next) { - if (strcmp(cep2->ce_varname, "ssl") && - strcmp(cep2->ce_varname, "tls") && - strcmp(cep2->ce_varname, "remote")) + if (strcmp(cep2->name, "ssl") && + strcmp(cep2->name, "tls") && + strcmp(cep2->name, "remote")) { - config_error_unknownopt(cep2->ce_fileptr->cf_filename, - cep2->ce_varlinenum, "tld", cep2->ce_varname); + config_error_unknownopt(cep2->file->filename, + cep2->line_number, "tld", cep2->name); errors++; } } } else { - config_error_unknown(cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - "tld", cep->ce_varname); + config_error_unknown(cep->file->filename, cep->line_number, + "tld", cep->name); errors++; continue; } } if (!has_mask) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "tld::mask"); errors++; } if (!has_motd) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "tld::motd"); errors++; } if (!has_rules) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "tld::rules"); errors++; } @@ -4985,26 +4782,26 @@ int _conf_listen(ConfigFile *conf, ConfigEntry *ce) int tmpflags =0; Hook *h; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "ip")) + if (!strcmp(cep->name, "ip")) { - ip = cep->ce_vardata; + ip = cep->value; } else - if (!strcmp(cep->ce_varname, "port")) + if (!strcmp(cep->name, "port")) { - port_range(cep->ce_vardata, &start, &end); + port_range(cep->value, &start, &end); if ((start < 0) || (start > 65535) || (end < 0) || (end > 65535)) return -1; /* this is already validated in _test_listen, but okay.. */ } else - if (!strcmp(cep->ce_varname, "options")) + if (!strcmp(cep->name, "options")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { - NameValue *ofp; - if ((ofp = config_binary_flags_search(_ListenerFlags, cepp->ce_varname, ARRAY_SIZEOF(_ListenerFlags)))) + long v; + if ((v = nv_find_by_name(_ListenerFlags, cepp->name))) { - tmpflags |= ofp->flag; + tmpflags |= v; } else { for (h = Hooks[HOOKTYPE_CONFIGRUN]; h; h = h->next) { @@ -5015,7 +4812,7 @@ int _conf_listen(ConfigFile *conf, ConfigEntry *ce) } } } else - if (!strcmp(cep->ce_varname, "ssl-options") || !strcmp(cep->ce_varname, "tls-options")) + if (!strcmp(cep->name, "ssl-options") || !strcmp(cep->name, "tls-options")) { tlsconfig = cep; } else @@ -5070,23 +4867,25 @@ int _conf_listen(ConfigFile *conf, ConfigEntry *ce) conf_tlsblock(conf, tlsconfig, listen->tls_options); listen->ssl_ctx = init_ctx(listen->tls_options, 1); } + + safe_free(listen->websocket_forward); /* For modules that hook CONFIG_LISTEN and CONFIG_LISTEN_OPTIONS. * Yeah, ugly we have this here.. * and again about 100 lines down too. */ - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "ip")) + if (!strcmp(cep->name, "ip")) ; - else if (!strcmp(cep->ce_varname, "port")) + else if (!strcmp(cep->name, "port")) ; - else if (!strcmp(cep->ce_varname, "options")) + else if (!strcmp(cep->name, "options")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { NameValue *ofp; - if (!config_binary_flags_search(_ListenerFlags, cepp->ce_varname, ARRAY_SIZEOF(_ListenerFlags))) + if (!nv_find_by_name(_ListenerFlags, cepp->name)) { for (h = Hooks[HOOKTYPE_CONFIGRUN_EX]; h; h = h->next) { @@ -5097,7 +4896,7 @@ int _conf_listen(ConfigFile *conf, ConfigEntry *ce) } } } else - if (!strcmp(cep->ce_varname, "ssl-options") || !strcmp(cep->ce_varname, "tls-options")) + if (!strcmp(cep->name, "ssl-options") || !strcmp(cep->name, "tls-options")) ; else { @@ -5153,21 +4952,23 @@ int _conf_listen(ConfigFile *conf, ConfigEntry *ce) conf_tlsblock(conf, tlsconfig, listen->tls_options); listen->ssl_ctx = init_ctx(listen->tls_options, 1); } + + safe_free(listen->websocket_forward); + /* For modules that hook CONFIG_LISTEN and CONFIG_LISTEN_OPTIONS. * Yeah, ugly we have this here.. */ - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "ip")) + if (!strcmp(cep->name, "ip")) ; - else if (!strcmp(cep->ce_varname, "port")) + else if (!strcmp(cep->name, "port")) ; - else if (!strcmp(cep->ce_varname, "options")) + else if (!strcmp(cep->name, "options")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { - NameValue *ofp; - if (!config_binary_flags_search(_ListenerFlags, cepp->ce_varname, ARRAY_SIZEOF(_ListenerFlags))) + if (!nv_find_by_name(_ListenerFlags, cepp->name)) { for (h = Hooks[HOOKTYPE_CONFIGRUN_EX]; h; h = h->next) { @@ -5178,7 +4979,7 @@ int _conf_listen(ConfigFile *conf, ConfigEntry *ce) } } } else - if (!strcmp(cep->ce_varname, "ssl-options") || !strcmp(cep->ce_varname, "tls-options")) + if (!strcmp(cep->name, "ssl-options") || !strcmp(cep->name, "tls-options")) ; else { @@ -5205,16 +5006,14 @@ int _test_listen(ConfigFile *conf, ConfigEntry *ce) char *ip = NULL; Hook *h; - if (ce->ce_vardata) + if (ce->value) { config_error("%s:%i: listen block has a new syntax, see https://www.unrealircd.org/docs/Listen_block", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); - - need_34_upgrade = 1; + ce->file->filename, ce->line_number); return 1; } - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { int used_by_module = 0; @@ -5247,19 +5046,18 @@ int _test_listen(ConfigFile *conf, ConfigEntry *ce) errors += errs; } } - if (!strcmp(cep->ce_varname, "options")) + if (!strcmp(cep->name, "options")) { if (has_options) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "listen::options"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "listen::options"); continue; } has_options = 1; - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { - NameValue *ofp; - if (!(ofp = config_binary_flags_search(_ListenerFlags, cepp->ce_varname, ARRAY_SIZEOF(_ListenerFlags)))) + if (!nv_find_by_name(_ListenerFlags, cepp->name)) { /* Check if a module knows about this listen::options::something */ int used_by_module = 0; @@ -5293,63 +5091,63 @@ int _test_listen(ConfigFile *conf, ConfigEntry *ce) } if (!used_by_module) { - config_error_unknownopt(cepp->ce_fileptr->cf_filename, - cepp->ce_varlinenum, "listen::options", cepp->ce_varname); + config_error_unknownopt(cepp->file->filename, + cepp->line_number, "listen::options", cepp->name); errors++; continue; } } - if (!strcmp(cepp->ce_varname, "ssl") || !strcmp(cepp->ce_varname, "tls")) + if (!strcmp(cepp->name, "ssl") || !strcmp(cepp->name, "tls")) have_tls_listeners = 1; /* for ssl config test */ } } else - if (!strcmp(cep->ce_varname, "ssl-options") || !strcmp(cep->ce_varname, "tls-options")) + if (!strcmp(cep->name, "ssl-options") || !strcmp(cep->name, "tls-options")) { test_tlsblock(conf, cep, &errors); } else - if (!cep->ce_vardata) + if (!cep->value) { if (!used_by_module) { - config_error_empty(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "listen", cep->ce_varname); + config_error_empty(cep->file->filename, + cep->line_number, "listen", cep->name); errors++; } continue; /* always */ } else - if (!strcmp(cep->ce_varname, "ip")) + if (!strcmp(cep->name, "ip")) { has_ip = 1; - if (strcmp(cep->ce_vardata, "*") && !is_valid_ip(cep->ce_vardata)) + if (strcmp(cep->value, "*") && !is_valid_ip(cep->value)) { config_error("%s:%i: listen: illegal listen::ip (%s). Must be either '*' or contain a valid IP.", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_vardata); + cep->file->filename, cep->line_number, cep->value); return 1; } - ip = cep->ce_vardata; + ip = cep->value; } else - if (!strcmp(cep->ce_varname, "host")) + if (!strcmp(cep->name, "host")) { config_error("%s:%i: listen: unknown option listen::host, did you mean listen::ip?", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; } else - if (!strcmp(cep->ce_varname, "port")) + if (!strcmp(cep->name, "port")) { int start = 0, end = 0; has_port = 1; - port_range(cep->ce_vardata, &start, &end); + port_range(cep->value, &start, &end); if (start == end) { if ((start < 1) || (start > 65535)) { config_error("%s:%i: listen: illegal port (must be 1..65535)", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); return 1; } } @@ -5358,21 +5156,21 @@ int _test_listen(ConfigFile *conf, ConfigEntry *ce) if (end < start) { config_error("%s:%i: listen: illegal port range end value is less than starting value", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); return 1; } if (end - start >= 100) { config_error("%s:%i: listen: you requested port %d-%d, that's %d ports " "(and thus consumes %d sockets) this is probably not what you want.", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, start, end, + cep->file->filename, cep->line_number, start, end, end - start + 1, end - start + 1); return 1; } if ((start < 1) || (start > 65535) || (end < 1) || (end > 65535)) { config_error("%s:%i: listen: illegal port range values must be between 1 and 65535", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); return 1; } } @@ -5383,8 +5181,8 @@ int _test_listen(ConfigFile *conf, ConfigEntry *ce) { if (!used_by_module) { - config_error_unknown(cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - "listen", cep->ce_varname); + config_error_unknown(cep->file->filename, cep->line_number, + "listen", cep->name); errors++; } continue; /* always */ @@ -5394,14 +5192,14 @@ int _test_listen(ConfigFile *conf, ConfigEntry *ce) if (!has_ip) { config_error("%s:%d: listen block requires an listen::ip", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); errors++; } if (!has_port) { config_error("%s:%d: listen block requires an listen::port", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); errors++; } @@ -5419,9 +5217,9 @@ int _conf_allow(ConfigFile *conf, ConfigEntry *ce) ConfigItem_allow *allow; Hook *h; - if (ce->ce_vardata) + if (ce->value) { - if (!strcmp(ce->ce_vardata, "channel")) + if (!strcmp(ce->value, "channel")) return (_conf_allow_channel(conf, ce)); else { @@ -5436,68 +5234,61 @@ int _conf_allow(ConfigFile *conf, ConfigEntry *ce) } } allow = safe_alloc(sizeof(ConfigItem_allow)); + allow->ipv6_clone_mask = tempiConf.default_ipv6_clone_mask; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "ip")) + if (!strcmp(cep->name, "mask") || !strcmp(cep->name, "ip") || !strcmp(cep->name, "hostname")) { - safe_strdup(allow->ip, cep->ce_vardata); + unreal_add_masks(&allow->mask, cep); } - else if (!strcmp(cep->ce_varname, "hostname")) - safe_strdup(allow->hostname, cep->ce_vardata); - else if (!strcmp(cep->ce_varname, "password")) + else if (!strcmp(cep->name, "password")) allow->auth = AuthBlockToAuthConfig(cep); - else if (!strcmp(cep->ce_varname, "class")) + else if (!strcmp(cep->name, "class")) { - allow->class = find_class(cep->ce_vardata); + allow->class = find_class(cep->value); if (!allow->class || (allow->class->flag.temporary == 1)) { config_status("%s:%i: illegal allow::class, unknown class '%s' using default of class 'default'", - cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, - cep->ce_vardata); + cep->file->filename, + cep->line_number, + cep->value); allow->class = default_class; } } - else if (!strcmp(cep->ce_varname, "maxperip")) - allow->maxperip = atoi(cep->ce_vardata); - else if (!strcmp(cep->ce_varname, "global-maxperip")) - allow->global_maxperip = atoi(cep->ce_vardata); - else if (!strcmp(cep->ce_varname, "redirect-server")) - safe_strdup(allow->server, cep->ce_vardata); - else if (!strcmp(cep->ce_varname, "redirect-port")) - allow->port = atoi(cep->ce_vardata); - else if (!strcmp(cep->ce_varname, "ipv6-clone-mask")) + else if (!strcmp(cep->name, "maxperip")) + allow->maxperip = atoi(cep->value); + else if (!strcmp(cep->name, "global-maxperip")) + allow->global_maxperip = atoi(cep->value); + else if (!strcmp(cep->name, "redirect-server")) + safe_strdup(allow->server, cep->value); + else if (!strcmp(cep->name, "redirect-port")) + allow->port = atoi(cep->value); + else if (!strcmp(cep->name, "ipv6-clone-mask")) { /* * If this item isn't set explicitly by the * user, the value will temporarily be - * zero. Defaults are applied in config_run(). + * zero. Defaults are applied in config_run_blocks(). */ - allow->ipv6_clone_mask = atoi(cep->ce_vardata); + allow->ipv6_clone_mask = atoi(cep->value); } - else if (!strcmp(cep->ce_varname, "options")) + else if (!strcmp(cep->name, "options")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { - if (!strcmp(cepp->ce_varname, "noident")) + if (!strcmp(cepp->name, "noident")) allow->flags.noident = 1; - else if (!strcmp(cepp->ce_varname, "useip")) + else if (!strcmp(cepp->name, "useip")) allow->flags.useip = 1; - else if (!strcmp(cepp->ce_varname, "ssl") || !strcmp(cepp->ce_varname, "tls")) + else if (!strcmp(cepp->name, "ssl") || !strcmp(cepp->name, "tls")) allow->flags.tls = 1; - else if (!strcmp(cepp->ce_varname, "reject-on-auth-failure")) + else if (!strcmp(cepp->name, "reject-on-auth-failure")) allow->flags.reject_on_auth_failure = 1; } } } - if (!allow->hostname) - safe_strdup(allow->hostname, "*@NOMATCH"); - - if (!allow->ip) - safe_strdup(allow->ip, "*@NOMATCH"); - /* Default: global-maxperip = maxperip+1 */ if (allow->global_maxperip == 0) allow->global_maxperip = allow->maxperip+1; @@ -5515,13 +5306,14 @@ int _test_allow(ConfigFile *conf, ConfigEntry *ce) ConfigEntry *cep, *cepp; int errors = 0; Hook *h; - char has_ip = 0, has_hostname = 0, has_maxperip = 0, has_global_maxperip = 0, has_password = 0, has_class = 0; + char has_ip = 0, has_hostname = 0, has_mask = 0; + char has_maxperip = 0, has_global_maxperip = 0, has_password = 0, has_class = 0; char has_redirectserver = 0, has_redirectport = 0, has_options = 0; int hostname_possible_silliness = 0; - if (ce->ce_vardata) + if (ce->value) { - if (!strcmp(ce->ce_vardata, "channel")) + if (!strcmp(ce->value, "channel")) return (_test_allow_channel(conf, ce)); else { @@ -5554,106 +5346,112 @@ int _test_allow(ConfigFile *conf, ConfigEntry *ce) } if (!used) { config_error("%s:%i: allow item with unknown type", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); return 1; } return errors; } } - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (strcmp(cep->ce_varname, "options") && config_is_blankorempty(cep, "allow")) + if (strcmp(cep->name, "options") && + strcmp(cep->name, "mask") && + config_is_blankorempty(cep, "allow")) { errors++; continue; } - if (!strcmp(cep->ce_varname, "ip")) + if (!strcmp(cep->name, "ip")) { if (has_ip) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "allow::ip"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "allow::ip"); continue; } has_ip = 1; } - else if (!strcmp(cep->ce_varname, "maxperip")) + else if (!strcmp(cep->name, "hostname")) { - int v = atoi(cep->ce_vardata); + if (has_hostname) + { + config_warn_duplicate(cep->file->filename, + cep->line_number, "allow::hostname"); + continue; + } + has_hostname = 1; + if (!strcmp(cep->value, "*@*") || !strcmp(cep->value, "*")) + hostname_possible_silliness = 1; + } + else if (!strcmp(cep->name, "mask")) + { + has_mask = 1; + } + else if (!strcmp(cep->name, "maxperip")) + { + int v = atoi(cep->value); if (has_maxperip) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "allow::maxperip"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "allow::maxperip"); continue; } has_maxperip = 1; if ((v <= 0) || (v > 1000000)) { config_error("%s:%i: allow::maxperip with illegal value (must be 1-1000000)", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; } } - else if (!strcmp(cep->ce_varname, "global-maxperip")) + else if (!strcmp(cep->name, "global-maxperip")) { - int v = atoi(cep->ce_vardata); + int v = atoi(cep->value); if (has_global_maxperip) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "allow::global-maxperip"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "allow::global-maxperip"); continue; } has_global_maxperip = 1; if ((v <= 0) || (v > 1000000)) { config_error("%s:%i: allow::global-maxperip with illegal value (must be 1-1000000)", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; } } - else if (!strcmp(cep->ce_varname, "ipv6-clone-mask")) + else if (!strcmp(cep->name, "ipv6-clone-mask")) { /* keep this in sync with _test_set() */ int ipv6mask; - ipv6mask = atoi(cep->ce_vardata); + ipv6mask = atoi(cep->value); if (ipv6mask == 0) { config_error("%s:%d: allow::ipv6-clone-mask given a value of zero. This cannnot be correct, as it would treat all IPv6 hosts as one host.", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; } if (ipv6mask > 128) { config_error("%s:%d: set::default-ipv6-clone-mask was set to %d. The maximum value is 128.", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, + cep->file->filename, cep->line_number, ipv6mask); errors++; } if (ipv6mask <= 32) { config_warn("%s:%d: allow::ipv6-clone-mask was given a very small value.", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); } } - else if (!strcmp(cep->ce_varname, "hostname")) - { - if (has_hostname) - { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "allow::hostname"); - continue; - } - has_hostname = 1; - if (!strcmp(cep->ce_vardata, "*@*") || !strcmp(cep->ce_vardata, "*")) - hostname_possible_silliness = 1; - } - else if (!strcmp(cep->ce_varname, "password")) + else if (!strcmp(cep->name, "password")) { if (has_password) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "allow::password"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "allow::password"); continue; } has_password = 1; @@ -5661,112 +5459,131 @@ int _test_allow(ConfigFile *conf, ConfigEntry *ce) if (Auth_CheckError(cep) < 0) errors++; } - else if (!strcmp(cep->ce_varname, "class")) + else if (!strcmp(cep->name, "class")) { if (has_class) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "allow::class"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "allow::class"); continue; } has_class = 1; } - else if (!strcmp(cep->ce_varname, "redirect-server")) + else if (!strcmp(cep->name, "redirect-server")) { if (has_redirectserver) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "allow::redirect-server"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "allow::redirect-server"); continue; } has_redirectserver = 1; } - else if (!strcmp(cep->ce_varname, "redirect-port")) + else if (!strcmp(cep->name, "redirect-port")) { if (has_redirectport) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "allow::redirect-port"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "allow::redirect-port"); continue; } has_redirectport = 1; } - else if (!strcmp(cep->ce_varname, "options")) + else if (!strcmp(cep->name, "options")) { if (has_options) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "allow::options"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "allow::options"); continue; } has_options = 1; - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { - if (!strcmp(cepp->ce_varname, "noident")) + if (!strcmp(cepp->name, "noident")) {} - else if (!strcmp(cepp->ce_varname, "useip")) + else if (!strcmp(cepp->name, "useip")) {} - else if (!strcmp(cepp->ce_varname, "ssl") || !strcmp(cepp->ce_varname, "tls")) + else if (!strcmp(cepp->name, "ssl") || !strcmp(cepp->name, "tls")) {} - else if (!strcmp(cepp->ce_varname, "reject-on-auth-failure")) + else if (!strcmp(cepp->name, "reject-on-auth-failure")) {} - else if (!strcmp(cepp->ce_varname, "sasl")) + else if (!strcmp(cepp->name, "sasl")) { config_error("%s:%d: The option allow::options::sasl no longer exists. " "Please use a require authentication { } block instead, which " "is more flexible and provides the same functionality. See " "https://www.unrealircd.org/docs/Require_authentication_block", - cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum); + cepp->file->filename, cepp->line_number); errors++; } else { - config_error_unknownopt(cepp->ce_fileptr->cf_filename, - cepp->ce_varlinenum, "allow", cepp->ce_varname); + config_error_unknownopt(cepp->file->filename, + cepp->line_number, "allow", cepp->name); errors++; } } } else { - config_error_unknown(cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - "allow", cep->ce_varname); + config_error_unknown(cep->file->filename, cep->line_number, + "allow", cep->name); errors++; continue; } } - if (!has_ip && !has_hostname) + if (has_mask && (has_ip || has_hostname)) { - config_error("%s:%d: allow block needs an allow::ip or allow::hostname", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + config_error("%s:%d: The allow block uses allow::mask, but you also have an allow::ip and allow::hostname.", + ce->file->filename, ce->line_number); + config_error("Please delete your allow::ip and allow::hostname entries and/or integrate them into allow::mask"); + } else + if (has_ip) + { + config_warn("%s:%d: The allow block uses allow::mask nowadays. Rename your allow::ip item to allow::mask.", + ce->file->filename, ce->line_number); + config_warn("See https://www.unrealircd.org/docs/FAQ#allow-mask for more information"); + } else + if (has_hostname) + { + config_warn("%s:%d: The allow block uses allow::mask nowadays. Rename your allow::hostname item to allow::mask.", + ce->file->filename, ce->line_number); + config_warn("See https://www.unrealircd.org/docs/FAQ#allow-mask for more information"); + } else + if (!has_mask) + { + config_error("%s:%d: allow block needs an allow::mask", + ce->file->filename, ce->line_number); errors++; } if (has_ip && has_hostname) { - config_warn("%s:%d: allow block has both allow::ip and allow::hostname which is no longer permitted.", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); - need_34_upgrade = 1; + config_error("%s:%d: allow block has both allow::ip and allow::hostname, this is no longer permitted.", + ce->file->filename, ce->line_number); + config_error("Please integrate your allow::ip and allow::hostname items into a single allow::mask block"); + errors++; } else if (hostname_possible_silliness) { - config_warn("%s:%d: allow block contains 'hostname *;'. This means means that users " - "without a valid hostname (unresolved IP's) will be unable to connect. " - "You most likely want to use 'ip *;' instead.", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + config_error("%s:%d: allow block contains 'hostname *;'. This means means that users " + "without a valid hostname (unresolved IP's) will be unable to connect. " + "You most likely want to use 'mask *;' instead.", + ce->file->filename, ce->line_number); } if (!has_class) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "allow::class"); errors++; } if (!has_maxperip) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "allow::maxperip"); errors++; } @@ -5781,21 +5598,21 @@ int _conf_allow_channel(ConfigFile *conf, ConfigEntry *ce) ConfigEntry *mask = NULL; /* First, search for ::class, if any */ - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "class")) - class = cep->ce_vardata; - else if (!strcmp(cep->ce_varname, "mask")) + if (!strcmp(cep->name, "class")) + class = cep->value; + else if (!strcmp(cep->name, "mask")) mask = cep; } - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "channel")) + if (!strcmp(cep->name, "channel")) { /* This way, we permit multiple ::channel items in one allow block */ allow = safe_alloc(sizeof(ConfigItem_allow_channel)); - safe_strdup(allow->channel, cep->ce_vardata); + safe_strdup(allow->channel, cep->value); if (class) safe_strdup(allow->class, class); if (mask) @@ -5811,7 +5628,7 @@ int _test_allow_channel(ConfigFile *conf, ConfigEntry *ce) ConfigEntry *cep; int errors = 0; char has_channel = 0, has_class = 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { if (config_is_blankorempty(cep, "allow channel")) { @@ -5819,34 +5636,34 @@ int _test_allow_channel(ConfigFile *conf, ConfigEntry *ce) continue; } - if (!strcmp(cep->ce_varname, "channel")) + if (!strcmp(cep->name, "channel")) { has_channel = 1; } - else if (!strcmp(cep->ce_varname, "class")) + else if (!strcmp(cep->name, "class")) { if (has_class) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "allow channel::class"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "allow channel::class"); continue; } has_class = 1; } - else if (!strcmp(cep->ce_varname, "mask")) + else if (!strcmp(cep->name, "mask")) { } else { - config_error_unknown(cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - "allow channel", cep->ce_varname); + config_error_unknown(cep->file->filename, cep->line_number, + "allow channel", cep->name); errors++; } } if (!has_channel) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "allow channel::channel"); errors++; } @@ -5874,20 +5691,20 @@ int _test_except(ConfigFile *conf, ConfigEntry *ce) Hook *h; int used = 0; - if (!ce->ce_vardata) + if (!ce->value) { config_error("%s:%i: except without type", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); return 1; } - if (!strcmp(ce->ce_vardata, "tkl")) + if (!strcmp(ce->value, "tkl")) { config_warn("%s:%i: except tkl { } is now called except ban { }. " "Simply rename the block from 'except tkl' to 'except ban' " "to get rid of this warning.", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); - safe_strdup(ce->ce_vardata, "ban"); /* awww */ + ce->file->filename, ce->line_number); + safe_strdup(ce->value, "ban"); /* awww */ } for (h = Hooks[HOOKTYPE_CONFIGTEST]; h; h = h->next) @@ -5920,8 +5737,8 @@ int _test_except(ConfigFile *conf, ConfigEntry *ce) if (!used) { config_error("%s:%i: unknown except type %s", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum, - ce->ce_vardata); + ce->file->filename, ce->line_number, + ce->value); return 1; } @@ -5937,12 +5754,12 @@ int _conf_vhost(ConfigFile *conf, ConfigEntry *ce) ConfigEntry *cep, *cepp; vhost = safe_alloc(sizeof(ConfigItem_vhost)); - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "vhost")) + if (!strcmp(cep->name, "vhost")) { char *user, *host; - user = strtok(cep->ce_vardata, "@"); + user = strtok(cep->value, "@"); host = strtok(NULL, ""); if (!host) safe_strdup(vhost->virthost, user); @@ -5952,31 +5769,31 @@ int _conf_vhost(ConfigFile *conf, ConfigEntry *ce) safe_strdup(vhost->virthost, host); } } - else if (!strcmp(cep->ce_varname, "login")) - safe_strdup(vhost->login, cep->ce_vardata); - else if (!strcmp(cep->ce_varname, "password")) + else if (!strcmp(cep->name, "login")) + safe_strdup(vhost->login, cep->value); + else if (!strcmp(cep->name, "password")) vhost->auth = AuthBlockToAuthConfig(cep); - else if (!strcmp(cep->ce_varname, "mask")) + else if (!strcmp(cep->name, "mask")) { unreal_add_masks(&vhost->mask, cep); } - else if (!strcmp(cep->ce_varname, "swhois")) + else if (!strcmp(cep->name, "swhois")) { SWhois *s; - if (cep->ce_entries) + if (cep->items) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { s = safe_alloc(sizeof(SWhois)); - safe_strdup(s->line, cepp->ce_varname); + safe_strdup(s->line, cepp->name); safe_strdup(s->setby, "vhost"); AddListItem(s, vhost->swhois); } } else - if (cep->ce_vardata) + if (cep->value) { s = safe_alloc(sizeof(SWhois)); - safe_strdup(s->line, cep->ce_vardata); + safe_strdup(s->line, cep->value); safe_strdup(s->setby, "vhost"); AddListItem(s, vhost->swhois); } @@ -5992,30 +5809,30 @@ int _test_vhost(ConfigFile *conf, ConfigEntry *ce) ConfigEntry *cep; char has_vhost = 0, has_login = 0, has_password = 0, has_mask = 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "vhost")) + if (!strcmp(cep->name, "vhost")) { char *at, *tmp, *host; if (has_vhost) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "vhost::vhost"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "vhost::vhost"); continue; } has_vhost = 1; - if (!cep->ce_vardata) + if (!cep->value) { - config_error_empty(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "vhost", "vhost"); + config_error_empty(cep->file->filename, + cep->line_number, "vhost", "vhost"); errors++; continue; } - if ((at = strchr(cep->ce_vardata, '@'))) + if ((at = strchr(cep->value, '@'))) { - for (tmp = cep->ce_vardata; tmp != at; tmp++) + for (tmp = cep->value; tmp != at; tmp++) { - if (*tmp == '~' && tmp == cep->ce_vardata) + if (*tmp == '~' && tmp == cep->value) continue; if (!isallowed(*tmp)) break; @@ -6023,112 +5840,103 @@ int _test_vhost(ConfigFile *conf, ConfigEntry *ce) if (tmp != at) { config_error("%s:%i: vhost::vhost contains an invalid ident", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; } host = at+1; } else - host = cep->ce_vardata; + host = cep->value; if (!*host) { config_error("%s:%i: vhost::vhost does not have a host set", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; } else { - if (!valid_host(host)) + if (!valid_host(host, 0)) { config_error("%s:%i: vhost::vhost contains an invalid host", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; } } } - else if (!strcmp(cep->ce_varname, "login")) + else if (!strcmp(cep->name, "login")) { if (has_login) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "vhost::login"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "vhost::login"); } has_login = 1; - if (!cep->ce_vardata) + if (!cep->value) { - config_error_empty(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "vhost", "login"); + config_error_empty(cep->file->filename, + cep->line_number, "vhost", "login"); errors++; continue; } } - else if (!strcmp(cep->ce_varname, "password")) + else if (!strcmp(cep->name, "password")) { if (has_password) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "vhost::password"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "vhost::password"); } has_password = 1; - if (!cep->ce_vardata) + if (!cep->value) { - config_error_empty(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "vhost", "password"); + config_error_empty(cep->file->filename, + cep->line_number, "vhost", "password"); errors++; continue; } if (Auth_CheckError(cep) < 0) errors++; } - else if (!strcmp(cep->ce_varname, "from")) - { - config_error("%s:%i: vhost::from::userhost is now called oper::mask", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); - errors++; - need_34_upgrade = 1; - continue; - } - else if (!strcmp(cep->ce_varname, "mask")) + else if (!strcmp(cep->name, "mask")) { has_mask = 1; } - else if (!strcmp(cep->ce_varname, "swhois")) + else if (!strcmp(cep->name, "swhois")) { /* multiple is ok */ } else { - config_error_unknown(cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - "vhost", cep->ce_varname); + config_error_unknown(cep->file->filename, cep->line_number, + "vhost", cep->name); errors++; } } if (!has_vhost) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "vhost::vhost"); errors++; } if (!has_login) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "vhost::login"); errors++; } if (!has_password) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "vhost::password"); errors++; } if (!has_mask) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "vhost::mask"); errors++; } - // TODO: 3.2.x -> 4.x upgrading hints return errors; } @@ -6137,22 +5945,22 @@ int _test_sni(ConfigFile *conf, ConfigEntry *ce) int errors = 0; ConfigEntry *cep; - if (!ce->ce_vardata) + if (!ce->value) { config_error("%s:%i: sni block needs a name, eg: sni irc.xyz.com {", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); errors++; } - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "ssl-options") || !strcmp(cep->ce_varname, "tls-options")) + if (!strcmp(cep->name, "ssl-options") || !strcmp(cep->name, "tls-options")) { test_tlsblock(conf, cep, &errors); } else { - config_error_unknown(cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - "sni", cep->ce_varname); + config_error_unknown(cep->file->filename, cep->line_number, + "sni", cep->name); errors++; continue; } @@ -6168,13 +5976,13 @@ int _conf_sni(ConfigFile *conf, ConfigEntry *ce) char *name; ConfigItem_sni *sni = NULL; - name = ce->ce_vardata; + name = ce->value; if (!name) return 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "ssl-options") || !strcmp(cep->ce_varname, "tls-options")) + if (!strcmp(cep->name, "ssl-options") || !strcmp(cep->name, "tls-options")) { tlsconfig = cep; } @@ -6200,15 +6008,15 @@ int _conf_help(ConfigFile *conf, ConfigEntry *ce) MOTDLine *last = NULL, *temp; ca = safe_alloc(sizeof(ConfigItem_help)); - if (!ce->ce_vardata) + if (!ce->value) ca->command = NULL; else - safe_strdup(ca->command, ce->ce_vardata); + safe_strdup(ca->command, ce->value); - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { temp = safe_alloc(sizeof(MOTDLine)); - safe_strdup(temp->line, cep->ce_varname); + safe_strdup(temp->line, cep->name); temp->next = NULL; if (!last) ca->text = temp; @@ -6224,18 +6032,18 @@ int _conf_help(ConfigFile *conf, ConfigEntry *ce) int _test_help(ConfigFile *conf, ConfigEntry *ce) { int errors = 0; ConfigEntry *cep; - if (!ce->ce_entries) + if (!ce->items) { config_error("%s:%i: empty help block", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); return 1; } - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (strlen(cep->ce_varname) > 500) + if (strlen(cep->name) > 500) { config_error("%s:%i: oversized help item", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); errors++; continue; } @@ -6243,179 +6051,47 @@ int _test_help(ConfigFile *conf, ConfigEntry *ce) { return errors; } -int _conf_log(ConfigFile *conf, ConfigEntry *ce) -{ - ConfigEntry *cep, *cepp; - ConfigItem_log *ca; - NameValue *ofp = NULL; - - ca = safe_alloc(sizeof(ConfigItem_log)); - ca->logfd = -1; - if (strchr(ce->ce_vardata, '%')) - safe_strdup(ca->filefmt, ce->ce_vardata); - else - safe_strdup(ca->file, ce->ce_vardata); - - for (cep = ce->ce_entries; cep; cep = cep->ce_next) - { - if (!strcmp(cep->ce_varname, "maxsize")) - { - ca->maxsize = config_checkval(cep->ce_vardata,CFG_SIZE); - } - else if (!strcmp(cep->ce_varname, "flags")) - { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) - { - if ((ofp = config_binary_flags_search(_LogFlags, cepp->ce_varname, ARRAY_SIZEOF(_LogFlags)))) - ca->flags |= ofp->flag; - } - } - } - AddListItem(ca, conf_log); - return 1; - -} - -int _test_log(ConfigFile *conf, ConfigEntry *ce) { - int fd, errors = 0; - ConfigEntry *cep, *cepp; - char has_flags = 0, has_maxsize = 0; - char *fname; - - if (!ce->ce_vardata) - { - config_error("%s:%i: log block without filename", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); - return 1; - } - if (!ce->ce_entries) - { - config_error("%s:%i: empty log block", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); - return 1; - } - - /* Convert to absolute path (if needed) unless it's "syslog" */ - if (strcmp(ce->ce_vardata, "syslog")) - convert_to_absolute_path(&ce->ce_vardata, LOGDIR); - - for (cep = ce->ce_entries; cep; cep = cep->ce_next) - { - if (!strcmp(cep->ce_varname, "flags")) - { - if (has_flags) - { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "log::flags"); - continue; - } - has_flags = 1; - if (!cep->ce_entries) - { - config_error_empty(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "log", cep->ce_varname); - errors++; - continue; - } - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) - { - if (!config_binary_flags_search(_LogFlags, cepp->ce_varname, ARRAY_SIZEOF(_LogFlags))) - { - config_error_unknownflag(cepp->ce_fileptr->cf_filename, - cepp->ce_varlinenum, "log", cepp->ce_varname); - errors++; - } - } - } - else if (!strcmp(cep->ce_varname, "maxsize")) - { - if (has_maxsize) - { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "log::maxsize"); - continue; - } - has_maxsize = 1; - if (!cep->ce_vardata) - { - config_error_empty(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "log", cep->ce_varname); - errors++; - } - } - else - { - config_error_unknown(cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - "log", cep->ce_varname); - errors++; - continue; - } - } - - if (!has_flags) - { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, - "log::flags"); - errors++; - } - - fname = unreal_strftime(ce->ce_vardata); - if ((fd = fd_fileopen(fname, O_WRONLY|O_CREAT)) == -1) - { - config_error("%s:%i: Couldn't open logfile (%s) for writing: %s", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum, - fname, strerror(errno)); - errors++; - } else - { - fd_close(fd); - } - - return errors; -} - int _conf_link(ConfigFile *conf, ConfigEntry *ce) { ConfigEntry *cep, *cepp, *ceppp; ConfigItem_link *link = NULL; - NameValue *ofp; link = safe_alloc(sizeof(ConfigItem_link)); - safe_strdup(link->servername, ce->ce_vardata); + safe_strdup(link->servername, ce->value); - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "incoming")) + if (!strcmp(cep->name, "incoming")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { - if (!strcmp(cepp->ce_varname, "mask")) + if (!strcmp(cepp->name, "mask")) { unreal_add_masks(&link->incoming.mask, cepp); } } } - else if (!strcmp(cep->ce_varname, "outgoing")) + else if (!strcmp(cep->name, "outgoing")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { - if (!strcmp(cepp->ce_varname, "bind-ip")) - safe_strdup(link->outgoing.bind_ip, cepp->ce_vardata); - else if (!strcmp(cepp->ce_varname, "hostname")) - safe_strdup(link->outgoing.hostname, cepp->ce_vardata); - else if (!strcmp(cepp->ce_varname, "port")) - link->outgoing.port = atoi(cepp->ce_vardata); - else if (!strcmp(cepp->ce_varname, "options")) + if (!strcmp(cepp->name, "bind-ip")) + safe_strdup(link->outgoing.bind_ip, cepp->value); + else if (!strcmp(cepp->name, "hostname")) + safe_strdup(link->outgoing.hostname, cepp->value); + else if (!strcmp(cepp->name, "port")) + link->outgoing.port = atoi(cepp->value); + else if (!strcmp(cepp->name, "options")) { - /* TODO: options still need to be split */ link->outgoing.options = 0; - for (ceppp = cepp->ce_entries; ceppp; ceppp = ceppp->ce_next) + for (ceppp = cepp->items; ceppp; ceppp = ceppp->next) { - if ((ofp = config_binary_flags_search(_LinkFlags, ceppp->ce_varname, ARRAY_SIZEOF(_LinkFlags)))) - link->outgoing.options |= ofp->flag; + long v; + if ((v = nv_find_by_name(_LinkFlags, ceppp->name))) + link->outgoing.options |= v; } } - else if (!strcmp(cepp->ce_varname, "ssl-options") || !strcmp(cepp->ce_varname, "tls-options")) + else if (!strcmp(cepp->name, "ssl-options") || !strcmp(cepp->name, "tls-options")) { link->tls_options = safe_alloc(sizeof(TLSOptions)); conf_tlsblock(conf, cepp, link->tls_options); @@ -6423,38 +6099,39 @@ int _conf_link(ConfigFile *conf, ConfigEntry *ce) } } } - else if (!strcmp(cep->ce_varname, "password")) + else if (!strcmp(cep->name, "password")) link->auth = AuthBlockToAuthConfig(cep); - else if (!strcmp(cep->ce_varname, "hub")) - safe_strdup(link->hub, cep->ce_vardata); - else if (!strcmp(cep->ce_varname, "leaf")) - safe_strdup(link->leaf, cep->ce_vardata); - else if (!strcmp(cep->ce_varname, "leaf-depth") || !strcmp(cep->ce_varname, "leafdepth")) - link->leaf_depth = atoi(cep->ce_vardata); - else if (!strcmp(cep->ce_varname, "class")) + else if (!strcmp(cep->name, "hub")) + safe_strdup(link->hub, cep->value); + else if (!strcmp(cep->name, "leaf")) + safe_strdup(link->leaf, cep->value); + else if (!strcmp(cep->name, "leaf-depth") || !strcmp(cep->name, "leafdepth")) + link->leaf_depth = atoi(cep->value); + else if (!strcmp(cep->name, "class")) { - link->class = find_class(cep->ce_vardata); + link->class = find_class(cep->value); if (!link->class || (link->class->flag.temporary == 1)) { config_status("%s:%i: illegal link::class, unknown class '%s' using default of class 'default'", - cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, - cep->ce_vardata); + cep->file->filename, + cep->line_number, + cep->value); link->class = default_class; } link->class->xrefcount++; } - else if (!strcmp(cep->ce_varname, "verify-certificate")) + else if (!strcmp(cep->name, "verify-certificate")) { - link->verify_certificate = config_checkval(cep->ce_vardata, CFG_YESNO); + link->verify_certificate = config_checkval(cep->value, CFG_YESNO); } - else if (!strcmp(cep->ce_varname, "options")) + else if (!strcmp(cep->name, "options")) { link->options = 0; - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { - if ((ofp = config_binary_flags_search(_LinkFlags, cepp->ce_varname, ARRAY_SIZEOF(_LinkFlags)))) - link->options |= ofp->flag; + long v; + if ((v = nv_find_by_name(_LinkFlags, cepp->name))) + link->options |= v; } } } @@ -6463,20 +6140,19 @@ int _conf_link(ConfigFile *conf, ConfigEntry *ce) if (!link->hub && !link->leaf) safe_strdup(link->hub, "*"); - AddListItem(link, conf_link); + AppendListItem(link, conf_link); return 0; } /** Helper function for erroring on duplicate items. - * TODO: make even more friendy for dev's? */ int config_detect_duplicate(int *var, ConfigEntry *ce, int *errors) { if (*var) { config_error("%s:%d: Duplicate %s directive", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum, - ce->ce_varname); + ce->file->filename, ce->line_number, + ce->name); (*errors)++; return 1; } else { @@ -6495,31 +6171,31 @@ int _test_link(ConfigFile *conf, ConfigEntry *ce) int has_outgoing_options = 0, has_hub = 0, has_leaf = 0, has_leaf_depth = 0; int has_password = 0, has_class = 0, has_options = 0; - if (!ce->ce_vardata) + if (!ce->value) { config_error("%s:%i: link without servername. Expected: link servername { ... }", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); return 1; } - if (!strchr(ce->ce_vardata, '.')) + if (!strchr(ce->value, '.')) { config_error("%s:%i: link: bogus server name. Expected: link servername { ... }", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); return 1; } - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "incoming")) + if (!strcmp(cep->name, "incoming")) { config_detect_duplicate(&has_incoming, cep, &errors); - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { - if (!strcmp(cepp->ce_varname, "mask")) + if (!strcmp(cepp->name, "mask")) { - if (cepp->ce_vardata || cepp->ce_entries) + if (cepp->value || cepp->items) has_incoming_mask = 1; else if (config_is_blankorempty(cepp, "link::incoming")) @@ -6530,12 +6206,12 @@ int _test_link(ConfigFile *conf, ConfigEntry *ce) } } } - else if (!strcmp(cep->ce_varname, "outgoing")) + else if (!strcmp(cep->name, "outgoing")) { config_detect_duplicate(&has_outgoing, cep, &errors); - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { - if (!strcmp(cepp->ce_varname, "bind-ip")) + if (!strcmp(cepp->name, "bind-ip")) { if (config_is_blankorempty(cepp, "link::outgoing")) { @@ -6545,7 +6221,7 @@ int _test_link(ConfigFile *conf, ConfigEntry *ce) config_detect_duplicate(&has_outgoing_bind_ip, cepp, &errors); // todo: ipv4 vs ipv6 } - else if (!strcmp(cepp->ce_varname, "hostname")) + else if (!strcmp(cepp->name, "hostname")) { if (config_is_blankorempty(cepp, "link::outgoing")) { @@ -6553,14 +6229,14 @@ int _test_link(ConfigFile *conf, ConfigEntry *ce) continue; } config_detect_duplicate(&has_outgoing_hostname, cepp, &errors); - if (strchr(cepp->ce_vardata, '*') || strchr(cepp->ce_vardata, '?')) + if (strchr(cepp->value, '*') || strchr(cepp->value, '?')) { config_error("%s:%i: hostname in link::outgoing(!) cannot contain wildcards", - cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum); + cepp->file->filename, cepp->line_number); errors++; } } - else if (!strcmp(cepp->ce_varname, "port")) + else if (!strcmp(cepp->name, "port")) { if (config_is_blankorempty(cepp, "link::outgoing")) { @@ -6569,40 +6245,39 @@ int _test_link(ConfigFile *conf, ConfigEntry *ce) } config_detect_duplicate(&has_outgoing_port, cepp, &errors); } - else if (!strcmp(cepp->ce_varname, "options")) + else if (!strcmp(cepp->name, "options")) { config_detect_duplicate(&has_outgoing_options, cepp, &errors); - for (ceppp = cepp->ce_entries; ceppp; ceppp = ceppp->ce_next) + for (ceppp = cepp->items; ceppp; ceppp = ceppp->next) { - if (!strcmp(ceppp->ce_varname, "autoconnect")) + if (!strcmp(ceppp->name, "autoconnect")) ; - else if (!strcmp(ceppp->ce_varname, "ssl") || !strcmp(ceppp->ce_varname, "tls")) + else if (!strcmp(ceppp->name, "ssl") || !strcmp(ceppp->name, "tls")) ; - else if (!strcmp(ceppp->ce_varname, "insecure")) + else if (!strcmp(ceppp->name, "insecure")) ; else { - config_error_unknownopt(ceppp->ce_fileptr->cf_filename, - ceppp->ce_varlinenum, "link::outgoing", ceppp->ce_varname); + config_error_unknownopt(ceppp->file->filename, + ceppp->line_number, "link::outgoing", ceppp->name); errors++; } - // TODO: validate more options (?) and use list rather than code here... } } - else if (!strcmp(cepp->ce_varname, "ssl-options") || !strcmp(cepp->ce_varname, "tls-options")) + else if (!strcmp(cepp->name, "ssl-options") || !strcmp(cepp->name, "tls-options")) { test_tlsblock(conf, cepp, &errors); } else { config_error("%s:%d: Unknown directive '%s'", - cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum, + cepp->file->filename, cepp->line_number, config_var(cepp)); errors++; } } } - else if (!strcmp(cep->ce_varname, "password")) + else if (!strcmp(cep->name, "password")) { config_detect_duplicate(&has_password, cep, &errors); if (Auth_CheckError(cep) < 0) @@ -6615,15 +6290,14 @@ int _test_link(ConfigFile *conf, ConfigEntry *ce) (auth->type != AUTHTYPE_TLS_CLIENTCERTFP) && (auth->type != AUTHTYPE_SPKIFP)) { config_error("%s:%i: password in link block should be plaintext OR should be the " - "SSL or SPKI fingerprint of the remote link (=better)", - /* TODO: mention some faq or wiki item for more information */ - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + "certificate or SPKI fingerprint of the remote link (=better)", + cep->file->filename, cep->line_number); errors++; } Auth_FreeAuthConfig(auth); } } - else if (!strcmp(cep->ce_varname, "hub")) + else if (!strcmp(cep->name, "hub")) { if (config_is_blankorempty(cep, "link")) { @@ -6632,7 +6306,7 @@ int _test_link(ConfigFile *conf, ConfigEntry *ce) } config_detect_duplicate(&has_hub, cep, &errors); } - else if (!strcmp(cep->ce_varname, "leaf")) + else if (!strcmp(cep->name, "leaf")) { if (config_is_blankorempty(cep, "link")) { @@ -6641,7 +6315,7 @@ int _test_link(ConfigFile *conf, ConfigEntry *ce) } config_detect_duplicate(&has_leaf, cep, &errors); } - else if (!strcmp(cep->ce_varname, "leaf-depth") || !strcmp(cep->ce_varname, "leafdepth")) + else if (!strcmp(cep->name, "leaf-depth") || !strcmp(cep->name, "leafdepth")) { if (config_is_blankorempty(cep, "link")) { @@ -6650,7 +6324,7 @@ int _test_link(ConfigFile *conf, ConfigEntry *ce) } config_detect_duplicate(&has_leaf_depth, cep, &errors); } - else if (!strcmp(cep->ce_varname, "class")) + else if (!strcmp(cep->name, "class")) { if (config_is_blankorempty(cep, "link")) { @@ -6659,14 +6333,14 @@ int _test_link(ConfigFile *conf, ConfigEntry *ce) } config_detect_duplicate(&has_class, cep, &errors); } - else if (!strcmp(cep->ce_varname, "ciphers")) + else if (!strcmp(cep->name, "ciphers")) { config_error("%s:%d: link::ciphers has been moved to link::outgoing::ssl-options::ciphers, " "see https://www.unrealircd.org/docs/FAQ#link::ciphers_no_longer_works", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; } - else if (!strcmp(cep->ce_varname, "verify-certificate")) + else if (!strcmp(cep->name, "verify-certificate")) { if (config_is_blankorempty(cep, "link")) { @@ -6674,27 +6348,27 @@ int _test_link(ConfigFile *conf, ConfigEntry *ce) continue; } } - else if (!strcmp(cep->ce_varname, "options")) + else if (!strcmp(cep->name, "options")) { config_detect_duplicate(&has_options, cep, &errors); - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { - if (!strcmp(cepp->ce_varname, "quarantine")) + if (!strcmp(cepp->name, "quarantine")) ; else { config_error("%s:%d: link::options only has one possible option ('quarantine', rarely used). " "Option '%s' is unrecognized. " "Perhaps you meant to set an outgoing option in link::outgoing::options instead?", - cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum, cepp->ce_varname); + cepp->file->filename, cepp->line_number, cepp->name); errors++; } } } else { - config_error_unknown(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "link", cep->ce_varname); + config_error_unknown(cep->file->filename, + cep->line_number, "link", cep->name); errors++; continue; } @@ -6703,9 +6377,8 @@ int _test_link(ConfigFile *conf, ConfigEntry *ce) if (!has_incoming && !has_outgoing) { config_error("%s:%d: link block needs at least an incoming or outgoing section.", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); errors++; - need_34_upgrade = 1; } if (has_incoming) @@ -6713,7 +6386,7 @@ int _test_link(ConfigFile *conf, ConfigEntry *ce) /* If we have an incoming sub-block then we need at least 'mask' and 'password' */ if (!has_incoming_mask) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, "link::incoming::mask"); + config_error_missing(ce->file->filename, ce->line_number, "link::incoming::mask"); errors++; } } @@ -6723,12 +6396,12 @@ int _test_link(ConfigFile *conf, ConfigEntry *ce) /* If we have an outgoing sub-block then we need at least a hostname and port */ if (!has_outgoing_hostname) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, "link::outgoing::hostname"); + config_error_missing(ce->file->filename, ce->line_number, "link::outgoing::hostname"); errors++; } if (!has_outgoing_port) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, "link::outgoing::port"); + config_error_missing(ce->file->filename, ce->line_number, "link::outgoing::port"); errors++; } } @@ -6736,12 +6409,12 @@ int _test_link(ConfigFile *conf, ConfigEntry *ce) /* The only other generic options that are required are 'class' and 'password' */ if (!has_password) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, "link::password"); + config_error_missing(ce->file->filename, ce->line_number, "link::password"); errors++; } if (!has_class) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "link::class"); errors++; } @@ -6756,11 +6429,11 @@ int _conf_ban(ConfigFile *conf, ConfigEntry *ce) Hook *h; ca = safe_alloc(sizeof(ConfigItem_ban)); - if (!strcmp(ce->ce_vardata, "realname")) + if (!strcmp(ce->value, "realname")) ca->flag.type = CONF_BAN_REALNAME; - else if (!strcmp(ce->ce_vardata, "server")) + else if (!strcmp(ce->value, "server")) ca->flag.type = CONF_BAN_SERVER; - else if (!strcmp(ce->ce_vardata, "version")) + else if (!strcmp(ce->value, "version")) { ca->flag.type = CONF_BAN_VERSION; tempiConf.use_ban_version = 1; /* enable CTCP VERSION on connect */ @@ -6776,16 +6449,16 @@ int _conf_ban(ConfigFile *conf, ConfigEntry *ce) } return 0; } - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "mask")) + if (!strcmp(cep->name, "mask")) { - safe_strdup(ca->mask, cep->ce_vardata); + safe_strdup(ca->mask, cep->value); } - else if (!strcmp(cep->ce_varname, "reason")) - safe_strdup(ca->reason, cep->ce_vardata); - else if (!strcmp(cep->ce_varname, "action")) - ca->action = banact_stringtoval(cep->ce_vardata); + else if (!strcmp(cep->name, "reason")) + safe_strdup(ca->reason, cep->value); + else if (!strcmp(cep->name, "action")) + ca->action = banact_stringtoval(cep->value); } AddListItem(ca, conf_ban); return 0; @@ -6799,17 +6472,17 @@ int _test_ban(ConfigFile *conf, ConfigEntry *ce) char type = 0; char has_mask = 0, has_action = 0, has_reason = 0; - if (!ce->ce_vardata) + if (!ce->value) { config_error("%s:%i: ban without type", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); return 1; } - else if (!strcmp(ce->ce_vardata, "server")) + else if (!strcmp(ce->value, "server")) {} - else if (!strcmp(ce->ce_vardata, "realname")) + else if (!strcmp(ce->value, "realname")) {} - else if (!strcmp(ce->ce_vardata, "version")) + else if (!strcmp(ce->value, "version")) type = 'v'; else { @@ -6842,53 +6515,53 @@ int _test_ban(ConfigFile *conf, ConfigEntry *ce) } if (!used) { config_error("%s:%i: unknown ban type %s", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum, - ce->ce_vardata); + ce->file->filename, ce->line_number, + ce->value); return 1; } return errors; } - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { if (config_is_blankorempty(cep, "ban")) { errors++; continue; } - if (!strcmp(cep->ce_varname, "mask")) + if (!strcmp(cep->name, "mask")) { if (has_mask) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "ban::mask"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "ban::mask"); continue; } has_mask = 1; } - else if (!strcmp(cep->ce_varname, "reason")) + else if (!strcmp(cep->name, "reason")) { if (has_reason) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "ban::reason"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "ban::reason"); continue; } has_reason = 1; } - else if (!strcmp(cep->ce_varname, "action")) + else if (!strcmp(cep->name, "action")) { if (has_action) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "ban::action"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "ban::action"); } has_action = 1; - if (!banact_stringtoval(cep->ce_vardata)) + if (!banact_stringtoval(cep->value)) { config_error("%s:%i: ban::action has unknown action type '%s'", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - cep->ce_vardata); + cep->file->filename, cep->line_number, + cep->value); errors++; } } @@ -6896,20 +6569,20 @@ int _test_ban(ConfigFile *conf, ConfigEntry *ce) if (!has_mask) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "ban::mask"); errors++; } if (!has_reason) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "ban::reason"); errors++; } if (has_action && type != 'v') { config_error("%s:%d: ban::action specified even though type is not 'version'", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); errors++; } return errors; @@ -6923,7 +6596,7 @@ int _conf_require(ConfigFile *conf, ConfigEntry *ce) char *hostmask = NULL; char *reason = NULL; - if (strcmp(ce->ce_vardata, "authentication") && strcmp(ce->ce_vardata, "sasl")) + if (strcmp(ce->value, "authentication") && strcmp(ce->value, "sasl")) { /* Some other block... run modules... */ int value; @@ -6936,12 +6609,12 @@ int _conf_require(ConfigFile *conf, ConfigEntry *ce) return 0; } - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "mask")) + if (!strcmp(cep->name, "mask")) { char buf[512], *p; - strlcpy(buf, cep->ce_vardata, sizeof(buf)); + strlcpy(buf, cep->value, sizeof(buf)); p = strchr(buf, '@'); if (p) { @@ -6949,11 +6622,11 @@ int _conf_require(ConfigFile *conf, ConfigEntry *ce) safe_strdup(usermask, buf); safe_strdup(hostmask, p); } else { - safe_strdup(hostmask, cep->ce_vardata); + safe_strdup(hostmask, cep->value); } } - else if (!strcmp(cep->ce_varname, "reason")) - safe_strdup(reason, cep->ce_vardata); + else if (!strcmp(cep->name, "reason")) + safe_strdup(reason, cep->value); } if (!usermask) @@ -6976,18 +6649,18 @@ int _test_require(ConfigFile *conf, ConfigEntry *ce) Hook *h; char has_mask = 0, has_reason = 0; - if (!ce->ce_vardata) + if (!ce->value) { config_error("%s:%i: require without type, did you mean 'require authentication'?", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); return 1; } - if (!strcmp(ce->ce_vardata, "authentication")) + if (!strcmp(ce->value, "authentication")) {} - else if (!strcmp(ce->ce_vardata, "sasl")) + else if (!strcmp(ce->value, "sasl")) { config_warn("%s:%i: the 'require sasl' block is now called 'require authentication'", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); } else { @@ -7020,36 +6693,36 @@ int _test_require(ConfigFile *conf, ConfigEntry *ce) } if (!used) { config_error("%s:%i: unknown require type '%s'", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum, - ce->ce_vardata); + ce->file->filename, ce->line_number, + ce->value); return 1; } return errors; } - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { if (config_is_blankorempty(cep, "require")) { errors++; continue; } - if (!strcmp(cep->ce_varname, "mask")) + if (!strcmp(cep->name, "mask")) { if (has_mask) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "require::mask"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "require::mask"); continue; } has_mask = 1; } - else if (!strcmp(cep->ce_varname, "reason")) + else if (!strcmp(cep->name, "reason")) { if (has_reason) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "require::reason"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "require::reason"); continue; } has_reason = 1; @@ -7058,45 +6731,43 @@ int _test_require(ConfigFile *conf, ConfigEntry *ce) if (!has_mask) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "require::mask"); errors++; } if (!has_reason) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "require::reason"); errors++; } return errors; } -#define CheckNull(x) if ((!(x)->ce_vardata) || (!(*((x)->ce_vardata)))) { config_error("%s:%i: missing parameter", (x)->ce_fileptr->cf_filename, (x)->ce_varlinenum); errors++; continue; } -#define CheckNullAllowEmpty(x) if ((!(x)->ce_vardata)) { config_error("%s:%i: missing parameter", (x)->ce_fileptr->cf_filename, (x)->ce_varlinenum); errors++; continue; } -#define CheckDuplicate(cep, name, display) if (settings.has_##name) { config_warn_duplicate((cep)->ce_fileptr->cf_filename, cep->ce_varlinenum, "set::" display); continue; } else settings.has_##name = 1 +#define CheckDuplicate(cep, name, display) if (settings.has_##name) { config_warn_duplicate((cep)->file->filename, cep->line_number, "set::" display); continue; } else settings.has_##name = 1 void test_tlsblock(ConfigFile *conf, ConfigEntry *cep, int *totalerrors) { ConfigEntry *cepp, *ceppp; int errors = 0; - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { - if (!strcmp(cepp->ce_varname, "renegotiate-timeout")) + if (!strcmp(cepp->name, "renegotiate-timeout")) { } - else if (!strcmp(cepp->ce_varname, "renegotiate-bytes")) + else if (!strcmp(cepp->name, "renegotiate-bytes")) { } - else if (!strcmp(cepp->ce_varname, "ciphers") || !strcmp(cepp->ce_varname, "server-cipher-list")) + else if (!strcmp(cepp->name, "ciphers") || !strcmp(cepp->name, "server-cipher-list")) { CheckNull(cepp); } - else if (!strcmp(cepp->ce_varname, "ciphersuites")) + else if (!strcmp(cepp->name, "ciphersuites")) { CheckNull(cepp); } - else if (!strcmp(cepp->ce_varname, "ecdh-curves")) + else if (!strcmp(cepp->name, "ecdh-curves")) { CheckNull(cepp); #ifndef HAS_SSL_CTX_SET1_CURVES_LIST @@ -7107,7 +6778,7 @@ void test_tlsblock(ConfigFile *conf, ConfigEntry *cep, int *totalerrors) errors++; #endif } - else if (!strcmp(cepp->ce_varname, "protocols")) + else if (!strcmp(cepp->name, "protocols")) { char copy[512], *p, *name; int v = 0; @@ -7115,7 +6786,7 @@ void test_tlsblock(ConfigFile *conf, ConfigEntry *cep, int *totalerrors) char modifier; CheckNull(cepp); - strlcpy(copy, cepp->ce_vardata, sizeof(copy)); + strlcpy(copy, cepp->value, sizeof(copy)); for (name = strtoken(&p, copy, ","); name; name = strtoken(&p, NULL, ",")) { modifier = '\0'; @@ -7142,11 +6813,11 @@ void test_tlsblock(ConfigFile *conf, ConfigEntry *cep, int *totalerrors) #ifdef SSL_OP_NO_TLSv1_3 config_warn("%s:%i: %s: unknown protocol '%s'. " "Valid protocols are: TLSv1,TLSv1.1,TLSv1.2,TLSv1.3", - cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum, config_var(cepp), name); + cepp->file->filename, cepp->line_number, config_var(cepp), name); #else config_warn("%s:%i: %s: unknown protocol '%s'. " "Valid protocols are: TLSv1,TLSv1.1,TLSv1.2", - cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum, config_var(cepp), name); + cepp->file->filename, cepp->line_number, config_var(cepp), name); #endif } @@ -7163,28 +6834,28 @@ void test_tlsblock(ConfigFile *conf, ConfigEntry *cep, int *totalerrors) if (v == 0) { config_error("%s:%i: %s: no protocols enabled. Hint: set at least TLSv1.2", - cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum, config_var(cepp)); + cepp->file->filename, cepp->line_number, config_var(cepp)); errors++; } } - else if (!strcmp(cepp->ce_varname, "certificate") || - !strcmp(cepp->ce_varname, "key") || - !strcmp(cepp->ce_varname, "trusted-ca-file")) + else if (!strcmp(cepp->name, "certificate") || + !strcmp(cepp->name, "key") || + !strcmp(cepp->name, "trusted-ca-file")) { char *path; CheckNull(cepp); - path = convert_to_absolute_path_duplicate(cepp->ce_vardata, CONFDIR); + path = convert_to_absolute_path_duplicate(cepp->value, CONFDIR); if (!file_exists(path)) { config_error("%s:%i: %s: could not open '%s': %s", - cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum, config_var(cepp), + cepp->file->filename, cepp->line_number, config_var(cepp), path, strerror(errno)); safe_free(path); errors++; } safe_free(path); } - else if (!strcmp(cepp->ce_varname, "dh")) + else if (!strcmp(cepp->name, "dh")) { /* Support for this undocumented option was silently dropped in 5.0.0. * Since 5.0.7 we print a warning about it, since you never know @@ -7192,10 +6863,10 @@ void test_tlsblock(ConfigFile *conf, ConfigEntry *cep, int *totalerrors) */ config_warn("%s:%d: Not reading DH file '%s'. UnrealIRCd does not support old DH(E), we use modern ECDHE/EECDH. " "Just remove the 'dh' directive from your config file to get rid of this warning.", - cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum, - cepp->ce_vardata ? cepp->ce_vardata : ""); + cepp->file->filename, cepp->line_number, + cepp->value ? cepp->value : ""); } - else if (!strcmp(cepp->ce_varname, "outdated-protocols")) + else if (!strcmp(cepp->name, "outdated-protocols")) { char copy[512], *p, *name; int v = 0; @@ -7203,7 +6874,7 @@ void test_tlsblock(ConfigFile *conf, ConfigEntry *cep, int *totalerrors) char modifier; CheckNull(cepp); - strlcpy(copy, cepp->ce_vardata, sizeof(copy)); + strlcpy(copy, cepp->value, sizeof(copy)); for (name = strtoken(&p, copy, ","); name; name = strtoken(&p, NULL, ",")) { if (!strcasecmp(name, "All")) @@ -7221,64 +6892,66 @@ void test_tlsblock(ConfigFile *conf, ConfigEntry *cep, int *totalerrors) #ifdef SSL_OP_NO_TLSv1_3 config_warn("%s:%i: %s: unknown protocol '%s'. " "Valid protocols are: TLSv1,TLSv1.1,TLSv1.2,TLSv1.3", - cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum, config_var(cepp), name); + cepp->file->filename, cepp->line_number, config_var(cepp), name); #else config_warn("%s:%i: %s: unknown protocol '%s'. " "Valid protocols are: TLSv1,TLSv1.1,TLSv1.2", - cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum, config_var(cepp), name); + cepp->file->filename, cepp->line_number, config_var(cepp), name); #endif } } } - else if (!strcmp(cepp->ce_varname, "outdated-ciphers")) + else if (!strcmp(cepp->name, "outdated-ciphers")) { CheckNull(cepp); } - else if (!strcmp(cepp->ce_varname, "options")) + else if (!strcmp(cepp->name, "options")) { - for (ceppp = cepp->ce_entries; ceppp; ceppp = ceppp->ce_next) - if (!config_binary_flags_search(_TLSFlags, ceppp->ce_varname, ARRAY_SIZEOF(_TLSFlags))) + for (ceppp = cepp->items; ceppp; ceppp = ceppp->next) + { + if (!nv_find_by_name(_TLSFlags, ceppp->name)) { - config_error("%s:%i: unknown SSL/TLS option '%s'", - ceppp->ce_fileptr->cf_filename, - ceppp->ce_varlinenum, ceppp->ce_varname); + config_error("%s:%i: unknown TLS option '%s'", + ceppp->file->filename, + ceppp->line_number, ceppp->name); errors ++; } + } } - else if (!strcmp(cepp->ce_varname, "sts-policy")) + else if (!strcmp(cepp->name, "sts-policy")) { int has_port = 0; int has_duration = 0; - for (ceppp = cepp->ce_entries; ceppp; ceppp = ceppp->ce_next) + for (ceppp = cepp->items; ceppp; ceppp = ceppp->next) { - if (!strcmp(ceppp->ce_varname, "port")) + if (!strcmp(ceppp->name, "port")) { int port; CheckNull(ceppp); - port = atoi(ceppp->ce_vardata); + port = atoi(ceppp->value); if ((port < 1) || (port > 65535)) { config_error("%s:%i: invalid port number specified in sts-policy::port (%d)", - ceppp->ce_fileptr->cf_filename, ceppp->ce_varlinenum, port); + ceppp->file->filename, ceppp->line_number, port); errors++; } has_port = 1; } - else if (!strcmp(ceppp->ce_varname, "duration")) + else if (!strcmp(ceppp->name, "duration")) { long duration; CheckNull(ceppp); - duration = config_checkval(ceppp->ce_vardata, CFG_TIME); + duration = config_checkval(ceppp->value, CFG_TIME); if (duration < 1) { config_error("%s:%i: invalid duration specified in sts-policy::duration (%ld seconds)", - ceppp->ce_fileptr->cf_filename, ceppp->ce_varlinenum, duration); + ceppp->file->filename, ceppp->line_number, duration); errors++; } has_duration = 1; } - else if (!strcmp(ceppp->ce_varname, "preload")) + else if (!strcmp(ceppp->name, "preload")) { CheckNull(ceppp); } @@ -7286,20 +6959,20 @@ void test_tlsblock(ConfigFile *conf, ConfigEntry *cep, int *totalerrors) if (!has_port) { config_error("%s:%i: sts-policy block without port", - cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum); + cepp->file->filename, cepp->line_number); errors++; } if (!has_duration) { config_error("%s:%i: sts-policy block without duration", - cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum); + cepp->file->filename, cepp->line_number); errors++; } } else { config_error("%s:%i: unknown directive %s", - cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum, + cepp->file->filename, cepp->line_number, config_var(cepp)); errors++; } @@ -7351,27 +7024,27 @@ void conf_tlsblock(ConfigFile *conf, ConfigEntry *cep, TLSOptions *tlsoptions) } /* Now process the options */ - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { - if (!strcmp(cepp->ce_varname, "ciphers") || !strcmp(cepp->ce_varname, "server-cipher-list")) + if (!strcmp(cepp->name, "ciphers") || !strcmp(cepp->name, "server-cipher-list")) { - safe_strdup(tlsoptions->ciphers, cepp->ce_vardata); + safe_strdup(tlsoptions->ciphers, cepp->value); } - else if (!strcmp(cepp->ce_varname, "ciphersuites")) + else if (!strcmp(cepp->name, "ciphersuites")) { - safe_strdup(tlsoptions->ciphersuites, cepp->ce_vardata); + safe_strdup(tlsoptions->ciphersuites, cepp->value); } - else if (!strcmp(cepp->ce_varname, "ecdh-curves")) + else if (!strcmp(cepp->name, "ecdh-curves")) { - safe_strdup(tlsoptions->ecdh_curves, cepp->ce_vardata); + safe_strdup(tlsoptions->ecdh_curves, cepp->value); } - else if (!strcmp(cepp->ce_varname, "protocols")) + else if (!strcmp(cepp->name, "protocols")) { char copy[512], *p, *name; int option; char modifier; - strlcpy(copy, cepp->ce_vardata, sizeof(copy)); + strlcpy(copy, cepp->value, sizeof(copy)); tlsoptions->protocols = 0; for (name = strtoken(&p, copy, ","); name; name = strtoken(&p, NULL, ",")) { @@ -7406,61 +7079,60 @@ void conf_tlsblock(ConfigFile *conf, ConfigEntry *cep, TLSOptions *tlsoptions) } } } - else if (!strcmp(cepp->ce_varname, "certificate")) + else if (!strcmp(cepp->name, "certificate")) { - convert_to_absolute_path(&cepp->ce_vardata, CONFDIR); - safe_strdup(tlsoptions->certificate_file, cepp->ce_vardata); + convert_to_absolute_path(&cepp->value, CONFDIR); + safe_strdup(tlsoptions->certificate_file, cepp->value); } - else if (!strcmp(cepp->ce_varname, "key")) + else if (!strcmp(cepp->name, "key")) { - convert_to_absolute_path(&cepp->ce_vardata, CONFDIR); - safe_strdup(tlsoptions->key_file, cepp->ce_vardata); + convert_to_absolute_path(&cepp->value, CONFDIR); + safe_strdup(tlsoptions->key_file, cepp->value); } - else if (!strcmp(cepp->ce_varname, "trusted-ca-file")) + else if (!strcmp(cepp->name, "trusted-ca-file")) { - convert_to_absolute_path(&cepp->ce_vardata, CONFDIR); - safe_strdup(tlsoptions->trusted_ca_file, cepp->ce_vardata); + convert_to_absolute_path(&cepp->value, CONFDIR); + safe_strdup(tlsoptions->trusted_ca_file, cepp->value); } - else if (!strcmp(cepp->ce_varname, "outdated-protocols")) + else if (!strcmp(cepp->name, "outdated-protocols")) { - safe_strdup(tlsoptions->outdated_protocols, cepp->ce_vardata); + safe_strdup(tlsoptions->outdated_protocols, cepp->value); } - else if (!strcmp(cepp->ce_varname, "outdated-ciphers")) + else if (!strcmp(cepp->name, "outdated-ciphers")) { - safe_strdup(tlsoptions->outdated_ciphers, cepp->ce_vardata); + safe_strdup(tlsoptions->outdated_ciphers, cepp->value); } - else if (!strcmp(cepp->ce_varname, "renegotiate-bytes")) + else if (!strcmp(cepp->name, "renegotiate-bytes")) { - tlsoptions->renegotiate_bytes = config_checkval(cepp->ce_vardata, CFG_SIZE); + tlsoptions->renegotiate_bytes = config_checkval(cepp->value, CFG_SIZE); } - else if (!strcmp(cepp->ce_varname, "renegotiate-timeout")) + else if (!strcmp(cepp->name, "renegotiate-timeout")) { - tlsoptions->renegotiate_timeout = config_checkval(cepp->ce_vardata, CFG_TIME); + tlsoptions->renegotiate_timeout = config_checkval(cepp->value, CFG_TIME); } - else if (!strcmp(cepp->ce_varname, "options")) + else if (!strcmp(cepp->name, "options")) { tlsoptions->options = 0; - for (ceppp = cepp->ce_entries; ceppp; ceppp = ceppp->ce_next) + for (ceppp = cepp->items; ceppp; ceppp = ceppp->next) { - ofl = config_binary_flags_search(_TLSFlags, ceppp->ce_varname, ARRAY_SIZEOF(_TLSFlags)); - if (ofl) /* this should always be true */ - tlsoptions->options |= ofl->flag; + long v = nv_find_by_name(_TLSFlags, ceppp->name); + tlsoptions->options |= v; } } - else if (!strcmp(cepp->ce_varname, "sts-policy")) + else if (!strcmp(cepp->name, "sts-policy")) { /* We do not inherit ::sts-policy if there is a specific block for this one... */ tlsoptions->sts_port = 0; tlsoptions->sts_duration = 0; tlsoptions->sts_preload = 0; - for (ceppp = cepp->ce_entries; ceppp; ceppp = ceppp->ce_next) + for (ceppp = cepp->items; ceppp; ceppp = ceppp->next) { - if (!strcmp(ceppp->ce_varname, "port")) - tlsoptions->sts_port = atoi(ceppp->ce_vardata); - else if (!strcmp(ceppp->ce_varname, "duration")) - tlsoptions->sts_duration = config_checkval(ceppp->ce_vardata, CFG_TIME); - else if (!strcmp(ceppp->ce_varname, "preload")) - tlsoptions->sts_preload = config_checkval(ceppp->ce_vardata, CFG_YESNO); + if (!strcmp(ceppp->name, "port")) + tlsoptions->sts_port = atoi(ceppp->value); + else if (!strcmp(ceppp->name, "duration")) + tlsoptions->sts_duration = config_checkval(ceppp->value, CFG_TIME); + else if (!strcmp(ceppp->name, "preload")) + tlsoptions->sts_preload = config_checkval(ceppp->value, CFG_YESNO); } } } @@ -7471,258 +7143,291 @@ int _conf_set(ConfigFile *conf, ConfigEntry *ce) ConfigEntry *cep, *cepp, *ceppp, *cep4; Hook *h; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "kline-address")) { - safe_strdup(tempiConf.kline_address, cep->ce_vardata); + if (!strcmp(cep->name, "kline-address")) { + safe_strdup(tempiConf.kline_address, cep->value); } - if (!strcmp(cep->ce_varname, "gline-address")) { - safe_strdup(tempiConf.gline_address, cep->ce_vardata); + if (!strcmp(cep->name, "gline-address")) { + safe_strdup(tempiConf.gline_address, cep->value); } - else if (!strcmp(cep->ce_varname, "modes-on-connect")) { - tempiConf.conn_modes = (long) set_usermode(cep->ce_vardata); + else if (!strcmp(cep->name, "modes-on-connect")) { + tempiConf.conn_modes = (long) set_usermode(cep->value); } - else if (!strcmp(cep->ce_varname, "modes-on-oper")) { - tempiConf.oper_modes = (long) set_usermode(cep->ce_vardata); + else if (!strcmp(cep->name, "modes-on-oper")) { + tempiConf.oper_modes = (long) set_usermode(cep->value); } - else if (!strcmp(cep->ce_varname, "modes-on-join")) { - conf_channelmodes(cep->ce_vardata, &tempiConf.modes_on_join, 0); + else if (!strcmp(cep->name, "modes-on-join")) { + conf_channelmodes(cep->value, &tempiConf.modes_on_join); + tempiConf.modes_on_join_set = 1; } - else if (!strcmp(cep->ce_varname, "snomask-on-oper")) { - safe_strdup(tempiConf.oper_snomask, cep->ce_vardata); + else if (!strcmp(cep->name, "snomask-on-oper")) { + safe_strdup(tempiConf.oper_snomask, cep->value); } - else if (!strcmp(cep->ce_varname, "level-on-join")) { - tempiConf.level_on_join = channellevel_to_int(cep->ce_vardata); + else if (!strcmp(cep->name, "server-notice-colors")) { + tempiConf.server_notice_colors = config_checkval(cep->value, CFG_YESNO); } - else if (!strcmp(cep->ce_varname, "static-quit")) { - safe_strdup(tempiConf.static_quit, cep->ce_vardata); + else if (!strcmp(cep->name, "level-on-join")) { + const char *res = channellevel_to_string(cep->value); /* 'halfop', etc */ + if (!res) + { + /* This check needs to be here, in config run, because + * now the channel modules are initialized and we know + * which ones are available. This same information is + * not available during config test, so we can't test + * for it there like we normally do. + */ + if (!valid_channel_access_mode_letter(*cep->value)) + { + config_warn("%s:%d: set::level-on-join: Unknown mode (access level) '%c'. " + "That mode does not exist or is not a valid access mode " + "like vhoaq.", + cep->file->filename, cep->line_number, + *cep->value); + config_warn("Falling back to to set::level-on-join none; now. " + "This is probably not what you want!!!"); + } + res = cep->value; /* if we reach this.. then it is a single letter */ + } + safe_strdup(tempiConf.level_on_join, res); } - else if (!strcmp(cep->ce_varname, "static-part")) { - safe_strdup(tempiConf.static_part, cep->ce_vardata); + else if (!strcmp(cep->name, "static-quit")) { + safe_strdup(tempiConf.static_quit, cep->value); } - else if (!strcmp(cep->ce_varname, "who-limit")) { - tempiConf.who_limit = atol(cep->ce_vardata); + else if (!strcmp(cep->name, "static-part")) { + safe_strdup(tempiConf.static_part, cep->value); } - else if (!strcmp(cep->ce_varname, "maxbans")) { - tempiConf.maxbans = atol(cep->ce_vardata); + else if (!strcmp(cep->name, "who-limit")) { + tempiConf.who_limit = atol(cep->value); } - else if (!strcmp(cep->ce_varname, "maxbanlength")) { - tempiConf.maxbanlength = atol(cep->ce_vardata); + else if (!strcmp(cep->name, "maxbans")) { + tempiConf.maxbans = atol(cep->value); } - else if (!strcmp(cep->ce_varname, "silence-limit")) { - tempiConf.silence_limit = atol(cep->ce_vardata); + else if (!strcmp(cep->name, "maxbanlength")) { + tempiConf.maxbanlength = atol(cep->value); } - else if (!strcmp(cep->ce_varname, "auto-join")) { - safe_strdup(tempiConf.auto_join_chans, cep->ce_vardata); + else if (!strcmp(cep->name, "silence-limit")) { + tempiConf.silence_limit = atol(cep->value); } - else if (!strcmp(cep->ce_varname, "oper-auto-join")) { - safe_strdup(tempiConf.oper_auto_join_chans, cep->ce_vardata); + else if (!strcmp(cep->name, "auto-join")) { + safe_strdup(tempiConf.auto_join_chans, cep->value); } - else if (!strcmp(cep->ce_varname, "check-target-nick-bans")) { - tempiConf.check_target_nick_bans = config_checkval(cep->ce_vardata, CFG_YESNO); + else if (!strcmp(cep->name, "oper-auto-join")) { + safe_strdup(tempiConf.oper_auto_join_chans, cep->value); } - else if (!strcmp(cep->ce_varname, "ping-cookie")) { - tempiConf.ping_cookie = config_checkval(cep->ce_vardata, CFG_YESNO); + else if (!strcmp(cep->name, "check-target-nick-bans")) { + tempiConf.check_target_nick_bans = config_checkval(cep->value, CFG_YESNO); } - else if (!strcmp(cep->ce_varname, "watch-away-notification")) { - tempiConf.watch_away_notification = config_checkval(cep->ce_vardata, CFG_YESNO); + else if (!strcmp(cep->name, "ping-cookie")) { + tempiConf.ping_cookie = config_checkval(cep->value, CFG_YESNO); } - else if (!strcmp(cep->ce_varname, "uhnames")) { - tempiConf.uhnames = config_checkval(cep->ce_vardata, CFG_YESNO); + else if (!strcmp(cep->name, "watch-away-notification")) { + tempiConf.watch_away_notification = config_checkval(cep->value, CFG_YESNO); } - else if (!strcmp(cep->ce_varname, "allow-userhost-change")) { - if (!strcasecmp(cep->ce_vardata, "always")) + else if (!strcmp(cep->name, "uhnames")) { + tempiConf.uhnames = config_checkval(cep->value, CFG_YESNO); + } + else if (!strcmp(cep->name, "allow-userhost-change")) { + if (!strcasecmp(cep->value, "always")) tempiConf.userhost_allowed = UHALLOW_ALWAYS; - else if (!strcasecmp(cep->ce_vardata, "never")) + else if (!strcasecmp(cep->value, "never")) tempiConf.userhost_allowed = UHALLOW_NEVER; - else if (!strcasecmp(cep->ce_vardata, "not-on-channels")) + else if (!strcasecmp(cep->value, "not-on-channels")) tempiConf.userhost_allowed = UHALLOW_NOCHANS; else tempiConf.userhost_allowed = UHALLOW_REJOIN; } - else if (!strcmp(cep->ce_varname, "channel-command-prefix")) { - safe_strdup(tempiConf.channel_command_prefix, cep->ce_vardata); + else if (!strcmp(cep->name, "channel-command-prefix")) { + safe_strdup(tempiConf.channel_command_prefix, cep->value); } - else if (!strcmp(cep->ce_varname, "restrict-usermodes")) { + else if (!strcmp(cep->name, "restrict-usermodes")) { int i; - char *p = safe_alloc(strlen(cep->ce_vardata) + 1), *x = p; + char *p = safe_alloc(strlen(cep->value) + 1), *x = p; /* The data should be something like 'Gw' or something, * but just in case users use '+Gw' then ignore the + (and -). */ - for (i=0; i < strlen(cep->ce_vardata); i++) - if ((cep->ce_vardata[i] != '+') && (cep->ce_vardata[i] != '-')) - *x++ = cep->ce_vardata[i]; + for (i=0; i < strlen(cep->value); i++) + if ((cep->value[i] != '+') && (cep->value[i] != '-')) + *x++ = cep->value[i]; *x = '\0'; tempiConf.restrict_usermodes = p; } - else if (!strcmp(cep->ce_varname, "restrict-channelmodes")) { + else if (!strcmp(cep->name, "restrict-channelmodes")) { int i; - char *p = safe_alloc(strlen(cep->ce_vardata) + 1), *x = p; + char *p = safe_alloc(strlen(cep->value) + 1), *x = p; /* The data should be something like 'GL' or something, * but just in case users use '+GL' then ignore the + (and -). */ - for (i=0; i < strlen(cep->ce_vardata); i++) - if ((cep->ce_vardata[i] != '+') && (cep->ce_vardata[i] != '-')) - *x++ = cep->ce_vardata[i]; + for (i=0; i < strlen(cep->value); i++) + if ((cep->value[i] != '+') && (cep->value[i] != '-')) + *x++ = cep->value[i]; *x = '\0'; tempiConf.restrict_channelmodes = p; } - else if (!strcmp(cep->ce_varname, "restrict-extendedbans")) { - safe_strdup(tempiConf.restrict_extendedbans, cep->ce_vardata); + else if (!strcmp(cep->name, "restrict-extendedbans")) { + safe_strdup(tempiConf.restrict_extendedbans, cep->value); } - else if (!strcmp(cep->ce_varname, "anti-spam-quit-message-time")) { - tempiConf.anti_spam_quit_message_time = config_checkval(cep->ce_vardata,CFG_TIME); + else if (!strcmp(cep->name, "named-extended-bans")) { + tempiConf.named_extended_bans = config_checkval(cep->value, CFG_YESNO); } - else if (!strcmp(cep->ce_varname, "allow-user-stats")) { - if (!cep->ce_entries) + else if (!strcmp(cep->name, "anti-spam-quit-message-time")) { + tempiConf.anti_spam_quit_message_time = config_checkval(cep->value,CFG_TIME); + } + else if (!strcmp(cep->name, "allow-user-stats")) { + if (!cep->items) { - safe_strdup(tempiConf.allow_user_stats, cep->ce_vardata); + safe_strdup(tempiConf.allow_user_stats, cep->value); } else { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { OperStat *os = safe_alloc(sizeof(OperStat)); - safe_strdup(os->flag, cepp->ce_varname); + safe_strdup(os->flag, cepp->name); AddListItem(os, tempiConf.allow_user_stats_ext); } } } - else if (!strcmp(cep->ce_varname, "maxchannelsperuser")) { - tempiConf.maxchannelsperuser = atoi(cep->ce_vardata); + else if (!strcmp(cep->name, "maxchannelsperuser")) { + tempiConf.maxchannelsperuser = atoi(cep->value); } - else if (!strcmp(cep->ce_varname, "ping-warning")) { - tempiConf.ping_warning = atoi(cep->ce_vardata); + else if (!strcmp(cep->name, "ping-warning")) { + tempiConf.ping_warning = atoi(cep->value); } - else if (!strcmp(cep->ce_varname, "maxdccallow")) { - tempiConf.maxdccallow = atoi(cep->ce_vardata); + else if (!strcmp(cep->name, "maxdccallow")) { + tempiConf.maxdccallow = atoi(cep->value); } - else if (!strcmp(cep->ce_varname, "max-targets-per-command")) + else if (!strcmp(cep->name, "max-targets-per-command")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { int v; - if (!strcmp(cepp->ce_vardata, "max")) + if (!strcmp(cepp->value, "max")) v = MAXTARGETS_MAX; else - v = atoi(cepp->ce_vardata); - setmaxtargets(cepp->ce_varname, v); + v = atoi(cepp->value); + setmaxtargets(cepp->name, v); } } - else if (!strcmp(cep->ce_varname, "network-name")) { + else if (!strcmp(cep->name, "network-name")) { char *tmp; - safe_strdup(tempiConf.network.x_ircnetwork, cep->ce_vardata); - for (tmp = cep->ce_vardata; *cep->ce_vardata; cep->ce_vardata++) { - if (*cep->ce_vardata == ' ') - *cep->ce_vardata='-'; + safe_strdup(tempiConf.network_name, cep->value); + for (tmp = cep->value; *cep->value; cep->value++) { + if (*cep->value == ' ') + *cep->value='-'; } - safe_strdup(tempiConf.network.x_ircnet005, tmp); - cep->ce_vardata = tmp; + safe_strdup(tempiConf.network_name_005, tmp); + cep->value = tmp; } - else if (!strcmp(cep->ce_varname, "default-server")) { - safe_strdup(tempiConf.network.x_defserv, cep->ce_vardata); + else if (!strcmp(cep->name, "default-server")) { + safe_strdup(tempiConf.default_server, cep->value); } - else if (!strcmp(cep->ce_varname, "services-server")) { - safe_strdup(tempiConf.network.x_services_name, cep->ce_vardata); + else if (!strcmp(cep->name, "services-server")) { + safe_strdup(tempiConf.services_name, cep->value); } - else if (!strcmp(cep->ce_varname, "sasl-server")) { - safe_strdup(tempiConf.network.x_sasl_server, cep->ce_vardata); + else if (!strcmp(cep->name, "sasl-server")) { + safe_strdup(tempiConf.sasl_server, cep->value); } - else if (!strcmp(cep->ce_varname, "stats-server")) { - safe_strdup(tempiConf.network.x_stats_server, cep->ce_vardata); + else if (!strcmp(cep->name, "stats-server")) { + safe_strdup(tempiConf.stats_server, cep->value); } - else if (!strcmp(cep->ce_varname, "help-channel")) { - safe_strdup(tempiConf.network.x_helpchan, cep->ce_vardata); + else if (!strcmp(cep->name, "help-channel")) { + safe_strdup(tempiConf.helpchan, cep->value); } - else if (!strcmp(cep->ce_varname, "hiddenhost-prefix")) { - safe_strdup(tempiConf.network.x_hidden_host, cep->ce_vardata); + else if (!strcmp(cep->name, "cloak-prefix") || !strcmp(cep->name, "hiddenhost-prefix")) { + safe_strdup(tempiConf.cloak_prefix, cep->value); } - else if (!strcmp(cep->ce_varname, "hide-ban-reason")) { - tempiConf.hide_ban_reason = config_checkval(cep->ce_vardata, CFG_YESNO); + else if (!strcmp(cep->name, "hide-ban-reason")) { + tempiConf.hide_ban_reason = config_checkval(cep->value, CFG_YESNO); } - else if (!strcmp(cep->ce_varname, "prefix-quit")) { - if (!strcmp(cep->ce_vardata, "0") || !strcmp(cep->ce_vardata, "no")) - safe_free(tempiConf.network.x_prefix_quit); + else if (!strcmp(cep->name, "prefix-quit")) { + if (!strcmp(cep->value, "0") || !strcmp(cep->value, "no")) + safe_free(tempiConf.prefix_quit); else - safe_strdup(tempiConf.network.x_prefix_quit, cep->ce_vardata); + safe_strdup(tempiConf.prefix_quit, cep->value); } - else if (!strcmp(cep->ce_varname, "link")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) { - if (!strcmp(cepp->ce_varname, "bind-ip")) { - safe_strdup(tempiConf.link_bindip, cepp->ce_vardata); + else if (!strcmp(cep->name, "link")) { + for (cepp = cep->items; cepp; cepp = cepp->next) { + if (!strcmp(cepp->name, "bind-ip")) { + safe_strdup(tempiConf.link_bindip, cepp->value); } } } - else if (!strcmp(cep->ce_varname, "dns")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) { - if (!strcmp(cepp->ce_varname, "bind-ip")) { - safe_strdup(tempiConf.dns_bindip, cepp->ce_vardata); - } - } - } - else if (!strcmp(cep->ce_varname, "anti-flood")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + else if (!strcmp(cep->name, "anti-flood")) { + for (cepp = cep->items; cepp; cepp = cepp->next) { - for (ceppp = cepp->ce_entries; ceppp; ceppp = ceppp->ce_next) + int lag_penalty = -1; + int lag_penalty_bytes = -1; + for (ceppp = cepp->items; ceppp; ceppp = ceppp->next) { - if (!strcmp(ceppp->ce_varname, "handshake-data-flood")) + if (!strcmp(ceppp->name, "handshake-data-flood")) { - for (cep4 = ceppp->ce_entries; cep4; cep4 = cep4->ce_next) + for (cep4 = ceppp->items; cep4; cep4 = cep4->next) { - if (!strcmp(cep4->ce_varname, "amount")) - tempiConf.handshake_data_flood_amount = config_checkval(cep4->ce_vardata, CFG_SIZE); - else if (!strcmp(cep4->ce_varname, "ban-time")) - tempiConf.handshake_data_flood_ban_time = config_checkval(cep4->ce_vardata, CFG_TIME); - else if (!strcmp(cep4->ce_varname, "ban-action")) - tempiConf.handshake_data_flood_ban_action = banact_stringtoval(cep4->ce_vardata); + if (!strcmp(cep4->name, "amount")) + tempiConf.handshake_data_flood_amount = config_checkval(cep4->value, CFG_SIZE); + else if (!strcmp(cep4->name, "ban-time")) + tempiConf.handshake_data_flood_ban_time = config_checkval(cep4->value, CFG_TIME); + else if (!strcmp(cep4->name, "ban-action")) + tempiConf.handshake_data_flood_ban_action = banact_stringtoval(cep4->value); } } - else if (!strcmp(ceppp->ce_varname, "away-flood")) + else if (!strcmp(ceppp->name, "away-flood")) { - config_parse_flood_generic(ceppp->ce_vardata, &tempiConf, cepp->ce_varname, FLD_AWAY); + config_parse_flood_generic(ceppp->value, &tempiConf, cepp->name, FLD_AWAY); } - else if (!strcmp(ceppp->ce_varname, "nick-flood")) + else if (!strcmp(ceppp->name, "nick-flood")) { - config_parse_flood_generic(ceppp->ce_vardata, &tempiConf, cepp->ce_varname, FLD_NICK); + config_parse_flood_generic(ceppp->value, &tempiConf, cepp->name, FLD_NICK); } - else if (!strcmp(ceppp->ce_varname, "join-flood")) + else if (!strcmp(ceppp->name, "join-flood")) { - config_parse_flood_generic(ceppp->ce_vardata, &tempiConf, cepp->ce_varname, FLD_JOIN); + config_parse_flood_generic(ceppp->value, &tempiConf, cepp->name, FLD_JOIN); } - else if (!strcmp(ceppp->ce_varname, "invite-flood")) + else if (!strcmp(ceppp->name, "invite-flood")) { - config_parse_flood_generic(ceppp->ce_vardata, &tempiConf, cepp->ce_varname, FLD_INVITE); + config_parse_flood_generic(ceppp->value, &tempiConf, cepp->name, FLD_INVITE); } - else if (!strcmp(ceppp->ce_varname, "knock-flood")) + else if (!strcmp(ceppp->name, "knock-flood")) { - config_parse_flood_generic(ceppp->ce_vardata, &tempiConf, cepp->ce_varname, FLD_KNOCK); + config_parse_flood_generic(ceppp->value, &tempiConf, cepp->name, FLD_KNOCK); } - else if (!strcmp(ceppp->ce_varname, "connect-flood")) + else if (!strcmp(ceppp->name, "lag-penalty")) + { + lag_penalty = atoi(ceppp->value); + } + else if (!strcmp(ceppp->name, "lag-penalty-bytes")) + { + lag_penalty_bytes = config_checkval(ceppp->value, CFG_SIZE); + if (lag_penalty_bytes <= 0) + lag_penalty_bytes = INT_MAX; + } + else if (!strcmp(ceppp->name, "connect-flood")) { int cnt, period; - config_parse_flood(ceppp->ce_vardata, &cnt, &period); + config_parse_flood(ceppp->value, &cnt, &period); tempiConf.throttle_count = cnt; tempiConf.throttle_period = period; } - if (!strcmp(ceppp->ce_varname, "max-concurrent-conversations")) + if (!strcmp(ceppp->name, "max-concurrent-conversations")) { /* We use a hack here to make it fit our storage format */ char buf[64]; int users=0; long every=0; - for (cep4 = ceppp->ce_entries; cep4; cep4 = cep4->ce_next) + for (cep4 = ceppp->items; cep4; cep4 = cep4->next) { - if (!strcmp(cep4->ce_varname, "users")) + if (!strcmp(cep4->name, "users")) { - users = atoi(cep4->ce_vardata); + users = atoi(cep4->value); } else - if (!strcmp(cep4->ce_varname, "new-user-every")) + if (!strcmp(cep4->name, "new-user-every")) { - every = config_checkval(cep4->ce_vardata, CFG_TIME); + every = config_checkval(cep4->value, CFG_TIME); } } snprintf(buf, sizeof(buf), "%d:%ld", users, every); - config_parse_flood_generic(buf, &tempiConf, cepp->ce_varname, FLD_CONVERSATIONS); + config_parse_flood_generic(buf, &tempiConf, cepp->name, FLD_CONVERSATIONS); } else { @@ -7734,52 +7439,59 @@ int _conf_set(ConfigFile *conf, ConfigEntry *ce) } } } + if ((lag_penalty != -1) && (lag_penalty_bytes != -1)) + { + /* We use a hack here to make it fit our storage format */ + char buf[64]; + snprintf(buf, sizeof(buf), "%d:%d", lag_penalty_bytes, lag_penalty); + config_parse_flood_generic(buf, &tempiConf, cepp->name, FLD_LAG_PENALTY); + } } } - else if (!strcmp(cep->ce_varname, "options")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) { - if (!strcmp(cepp->ce_varname, "hide-ulines")) { + else if (!strcmp(cep->name, "options")) { + for (cepp = cep->items; cepp; cepp = cepp->next) { + if (!strcmp(cepp->name, "hide-ulines")) { tempiConf.hide_ulines = 1; } - else if (!strcmp(cepp->ce_varname, "flat-map")) { + else if (!strcmp(cepp->name, "flat-map")) { tempiConf.flat_map = 1; } - else if (!strcmp(cepp->ce_varname, "show-opermotd")) { - tempiConf.som = 1; + else if (!strcmp(cepp->name, "show-opermotd")) { + tempiConf.show_opermotd = 1; } - else if (!strcmp(cepp->ce_varname, "identd-check")) { + else if (!strcmp(cepp->name, "identd-check")) { tempiConf.ident_check = 1; } - else if (!strcmp(cepp->ce_varname, "fail-oper-warn")) { + else if (!strcmp(cepp->name, "fail-oper-warn")) { tempiConf.fail_oper_warn = 1; } - else if (!strcmp(cepp->ce_varname, "show-connect-info")) { + else if (!strcmp(cepp->name, "show-connect-info")) { tempiConf.show_connect_info = 1; } - else if (!strcmp(cepp->ce_varname, "no-connect-tls-info")) { + else if (!strcmp(cepp->name, "no-connect-tls-info")) { tempiConf.no_connect_tls_info = 1; } - else if (!strcmp(cepp->ce_varname, "dont-resolve")) { + else if (!strcmp(cepp->name, "dont-resolve")) { tempiConf.dont_resolve = 1; } - else if (!strcmp(cepp->ce_varname, "mkpasswd-for-everyone")) { + else if (!strcmp(cepp->name, "mkpasswd-for-everyone")) { tempiConf.mkpasswd_for_everyone = 1; } - else if (!strcmp(cepp->ce_varname, "allow-insane-bans")) { + else if (!strcmp(cepp->name, "allow-insane-bans")) { tempiConf.allow_insane_bans = 1; } - else if (!strcmp(cepp->ce_varname, "allow-part-if-shunned")) { + else if (!strcmp(cepp->name, "allow-part-if-shunned")) { tempiConf.allow_part_if_shunned = 1; } - else if (!strcmp(cepp->ce_varname, "disable-cap")) { + else if (!strcmp(cepp->name, "disable-cap")) { tempiConf.disable_cap = 1; } - else if (!strcmp(cepp->ce_varname, "disable-ipv6")) { + else if (!strcmp(cepp->name, "disable-ipv6")) { /* other code handles this */ } } } - else if (!strcmp(cep->ce_varname, "cloak-keys")) + else if (!strcmp(cep->name, "cloak-keys")) { for (h = Hooks[HOOKTYPE_CONFIGRUN]; h; h = h->next) { @@ -7789,34 +7501,34 @@ int _conf_set(ConfigFile *conf, ConfigEntry *ce) break; } } - else if (!strcmp(cep->ce_varname, "ident")) + else if (!strcmp(cep->name, "ident")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { - if (!strcmp(cepp->ce_varname, "connect-timeout")) - tempiConf.ident_connect_timeout = config_checkval(cepp->ce_vardata,CFG_TIME); - if (!strcmp(cepp->ce_varname, "read-timeout")) - tempiConf.ident_read_timeout = config_checkval(cepp->ce_vardata,CFG_TIME); + if (!strcmp(cepp->name, "connect-timeout")) + tempiConf.ident_connect_timeout = config_checkval(cepp->value,CFG_TIME); + if (!strcmp(cepp->name, "read-timeout")) + tempiConf.ident_read_timeout = config_checkval(cepp->value,CFG_TIME); } } - else if (!strcmp(cep->ce_varname, "spamfilter")) + else if (!strcmp(cep->name, "spamfilter")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { - if (!strcmp(cepp->ce_varname, "ban-time")) - tempiConf.spamfilter_ban_time = config_checkval(cepp->ce_vardata,CFG_TIME); - else if (!strcmp(cepp->ce_varname, "ban-reason")) - safe_strdup(tempiConf.spamfilter_ban_reason, cepp->ce_vardata); - else if (!strcmp(cepp->ce_varname, "virus-help-channel")) - safe_strdup(tempiConf.spamfilter_virus_help_channel, cepp->ce_vardata); - else if (!strcmp(cepp->ce_varname, "virus-help-channel-deny")) - tempiConf.spamfilter_vchan_deny = config_checkval(cepp->ce_vardata,CFG_YESNO); - else if (!strcmp(cepp->ce_varname, "except")) + if (!strcmp(cepp->name, "ban-time")) + tempiConf.spamfilter_ban_time = config_checkval(cepp->value,CFG_TIME); + else if (!strcmp(cepp->name, "ban-reason")) + safe_strdup(tempiConf.spamfilter_ban_reason, cepp->value); + else if (!strcmp(cepp->name, "virus-help-channel")) + safe_strdup(tempiConf.spamfilter_virus_help_channel, cepp->value); + else if (!strcmp(cepp->name, "virus-help-channel-deny")) + tempiConf.spamfilter_vchan_deny = config_checkval(cepp->value,CFG_YESNO); + else if (!strcmp(cepp->name, "except")) { char *name, *p; SpamExcept *e; - safe_strdup(tempiConf.spamexcept_line, cepp->ce_vardata); - for (name = strtoken(&p, cepp->ce_vardata, ","); name; name = strtoken(&p, NULL, ",")) + safe_strdup(tempiConf.spamexcept_line, cepp->value); + for (name = strtoken(&p, cepp->value, ","); name; name = strtoken(&p, NULL, ",")) { if (*name == ' ') name++; @@ -7828,186 +7540,185 @@ int _conf_set(ConfigFile *conf, ConfigEntry *ce) } } } - else if (!strcmp(cepp->ce_varname, "detect-slow-warn")) + else if (!strcmp(cepp->name, "detect-slow-warn")) { - tempiConf.spamfilter_detectslow_warn = atol(cepp->ce_vardata); + tempiConf.spamfilter_detectslow_warn = atol(cepp->value); } - else if (!strcmp(cepp->ce_varname, "detect-slow-fatal")) + else if (!strcmp(cepp->name, "detect-slow-fatal")) { - tempiConf.spamfilter_detectslow_fatal = atol(cepp->ce_vardata); + tempiConf.spamfilter_detectslow_fatal = atol(cepp->value); } - else if (!strcmp(cepp->ce_varname, "stop-on-first-match")) + else if (!strcmp(cepp->name, "stop-on-first-match")) { - tempiConf.spamfilter_stop_on_first_match = config_checkval(cepp->ce_vardata, CFG_YESNO); + tempiConf.spamfilter_stop_on_first_match = config_checkval(cepp->value, CFG_YESNO); } } } - else if (!strcmp(cep->ce_varname, "default-bantime")) + else if (!strcmp(cep->name, "default-bantime")) { - tempiConf.default_bantime = config_checkval(cep->ce_vardata,CFG_TIME); + tempiConf.default_bantime = config_checkval(cep->value,CFG_TIME); } - else if (!strcmp(cep->ce_varname, "ban-version-tkl-time")) + else if (!strcmp(cep->name, "ban-version-tkl-time")) { - tempiConf.ban_version_tkl_time = config_checkval(cep->ce_vardata,CFG_TIME); + tempiConf.ban_version_tkl_time = config_checkval(cep->value,CFG_TIME); } - else if (!strcmp(cep->ce_varname, "min-nick-length")) { - int v = atoi(cep->ce_vardata); + else if (!strcmp(cep->name, "min-nick-length")) { + int v = atoi(cep->value); tempiConf.min_nick_length = v; } - else if (!strcmp(cep->ce_varname, "nick-length")) { - int v = atoi(cep->ce_vardata); + else if (!strcmp(cep->name, "nick-length")) { + int v = atoi(cep->value); tempiConf.nick_length = v; } - else if (!strcmp(cep->ce_varname, "topic-length")) { - int v = atoi(cep->ce_vardata); + else if (!strcmp(cep->name, "topic-length")) { + int v = atoi(cep->value); tempiConf.topic_length = v; } - else if (!strcmp(cep->ce_varname, "away-length")) { - int v = atoi(cep->ce_vardata); + else if (!strcmp(cep->name, "away-length")) { + int v = atoi(cep->value); tempiConf.away_length = v; } - else if (!strcmp(cep->ce_varname, "kick-length")) { - int v = atoi(cep->ce_vardata); + else if (!strcmp(cep->name, "kick-length")) { + int v = atoi(cep->value); tempiConf.kick_length = v; } - else if (!strcmp(cep->ce_varname, "quit-length")) { - int v = atoi(cep->ce_vardata); + else if (!strcmp(cep->name, "quit-length")) { + int v = atoi(cep->value); tempiConf.quit_length = v; } - else if (!strcmp(cep->ce_varname, "ssl") || !strcmp(cep->ce_varname, "tls")) { + else if (!strcmp(cep->name, "ssl") || !strcmp(cep->name, "tls")) { /* no need to alloc tempiConf.tls_options since config_defaults() already ensures it exists */ conf_tlsblock(conf, cep, tempiConf.tls_options); } - else if (!strcmp(cep->ce_varname, "plaintext-policy")) + else if (!strcmp(cep->name, "plaintext-policy")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { - if (!strcmp(cepp->ce_varname, "user")) - tempiConf.plaintext_policy_user = policy_strtoval(cepp->ce_vardata); - else if (!strcmp(cepp->ce_varname, "oper")) - tempiConf.plaintext_policy_oper = policy_strtoval(cepp->ce_vardata); - else if (!strcmp(cepp->ce_varname, "server")) - tempiConf.plaintext_policy_server = policy_strtoval(cepp->ce_vardata); - else if (!strcmp(cepp->ce_varname, "user-message")) - addmultiline(&tempiConf.plaintext_policy_user_message, cepp->ce_vardata); - else if (!strcmp(cepp->ce_varname, "oper-message")) - addmultiline(&tempiConf.plaintext_policy_oper_message, cepp->ce_vardata); + if (!strcmp(cepp->name, "user")) + tempiConf.plaintext_policy_user = policy_strtoval(cepp->value); + else if (!strcmp(cepp->name, "oper")) + tempiConf.plaintext_policy_oper = policy_strtoval(cepp->value); + else if (!strcmp(cepp->name, "server")) + tempiConf.plaintext_policy_server = policy_strtoval(cepp->value); + else if (!strcmp(cepp->name, "user-message")) + addmultiline(&tempiConf.plaintext_policy_user_message, cepp->value); + else if (!strcmp(cepp->name, "oper-message")) + addmultiline(&tempiConf.plaintext_policy_oper_message, cepp->value); } } - else if (!strcmp(cep->ce_varname, "outdated-tls-policy")) + else if (!strcmp(cep->name, "outdated-tls-policy")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { - if (!strcmp(cepp->ce_varname, "user")) - tempiConf.outdated_tls_policy_user = policy_strtoval(cepp->ce_vardata); - else if (!strcmp(cepp->ce_varname, "oper")) - tempiConf.outdated_tls_policy_oper = policy_strtoval(cepp->ce_vardata); - else if (!strcmp(cepp->ce_varname, "server")) - tempiConf.outdated_tls_policy_server = policy_strtoval(cepp->ce_vardata); - else if (!strcmp(cepp->ce_varname, "user-message")) - safe_strdup(tempiConf.outdated_tls_policy_user_message, cepp->ce_vardata); - else if (!strcmp(cepp->ce_varname, "oper-message")) - safe_strdup(tempiConf.outdated_tls_policy_oper_message, cepp->ce_vardata); + if (!strcmp(cepp->name, "user")) + tempiConf.outdated_tls_policy_user = policy_strtoval(cepp->value); + else if (!strcmp(cepp->name, "oper")) + tempiConf.outdated_tls_policy_oper = policy_strtoval(cepp->value); + else if (!strcmp(cepp->name, "server")) + tempiConf.outdated_tls_policy_server = policy_strtoval(cepp->value); + else if (!strcmp(cepp->name, "user-message")) + safe_strdup(tempiConf.outdated_tls_policy_user_message, cepp->value); + else if (!strcmp(cepp->name, "oper-message")) + safe_strdup(tempiConf.outdated_tls_policy_oper_message, cepp->value); } } - else if (!strcmp(cep->ce_varname, "default-ipv6-clone-mask")) + else if (!strcmp(cep->name, "default-ipv6-clone-mask")) { - tempiConf.default_ipv6_clone_mask = atoi(cep->ce_vardata); + tempiConf.default_ipv6_clone_mask = atoi(cep->value); } - else if (!strcmp(cep->ce_varname, "hide-list")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + else if (!strcmp(cep->name, "hide-list")) { + for (cepp = cep->items; cepp; cepp = cepp->next) { - if (!strcmp(cepp->ce_varname, "deny-channel")) + if (!strcmp(cepp->name, "deny-channel")) { tempiConf.hide_list = 1; /* if we would expand this later then change this to a bitmask or struct or whatever */ } } } - else if (!strcmp(cep->ce_varname, "max-unknown-connections-per-ip")) + else if (!strcmp(cep->name, "max-unknown-connections-per-ip")) { - tempiConf.max_unknown_connections_per_ip = atoi(cep->ce_vardata); + tempiConf.max_unknown_connections_per_ip = atoi(cep->value); } - else if (!strcmp(cep->ce_varname, "handshake-timeout")) + else if (!strcmp(cep->name, "handshake-timeout")) { - tempiConf.handshake_timeout = config_checkval(cep->ce_vardata, CFG_TIME); + tempiConf.handshake_timeout = config_checkval(cep->value, CFG_TIME); } - else if (!strcmp(cep->ce_varname, "sasl-timeout")) + else if (!strcmp(cep->name, "sasl-timeout")) { - tempiConf.sasl_timeout = config_checkval(cep->ce_vardata, CFG_TIME); + tempiConf.sasl_timeout = config_checkval(cep->value, CFG_TIME); } - else if (!strcmp(cep->ce_varname, "handshake-delay")) + else if (!strcmp(cep->name, "handshake-delay")) { - tempiConf.handshake_delay = config_checkval(cep->ce_vardata, CFG_TIME); + tempiConf.handshake_delay = config_checkval(cep->value, CFG_TIME); } - else if (!strcmp(cep->ce_varname, "automatic-ban-target")) + else if (!strcmp(cep->name, "automatic-ban-target")) { - tempiConf.automatic_ban_target = ban_target_strtoval(cep->ce_vardata); + tempiConf.automatic_ban_target = ban_target_strtoval(cep->value); } - else if (!strcmp(cep->ce_varname, "manual-ban-target")) + else if (!strcmp(cep->name, "manual-ban-target")) { - tempiConf.manual_ban_target = ban_target_strtoval(cep->ce_vardata); + tempiConf.manual_ban_target = ban_target_strtoval(cep->value); } - else if (!strcmp(cep->ce_varname, "reject-message")) + else if (!strcmp(cep->name, "reject-message")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { - if (!strcmp(cepp->ce_varname, "too-many-connections")) - safe_strdup(tempiConf.reject_message_too_many_connections, cepp->ce_vardata); - else if (!strcmp(cepp->ce_varname, "server-full")) - safe_strdup(tempiConf.reject_message_server_full, cepp->ce_vardata); - else if (!strcmp(cepp->ce_varname, "unauthorized")) - safe_strdup(tempiConf.reject_message_unauthorized, cepp->ce_vardata); - else if (!strcmp(cepp->ce_varname, "kline")) - safe_strdup(tempiConf.reject_message_kline, cepp->ce_vardata); - else if (!strcmp(cepp->ce_varname, "gline")) - safe_strdup(tempiConf.reject_message_gline, cepp->ce_vardata); + if (!strcmp(cepp->name, "too-many-connections")) + safe_strdup(tempiConf.reject_message_too_many_connections, cepp->value); + else if (!strcmp(cepp->name, "server-full")) + safe_strdup(tempiConf.reject_message_server_full, cepp->value); + else if (!strcmp(cepp->name, "unauthorized")) + safe_strdup(tempiConf.reject_message_unauthorized, cepp->value); + else if (!strcmp(cepp->name, "kline")) + safe_strdup(tempiConf.reject_message_kline, cepp->value); + else if (!strcmp(cepp->name, "gline")) + safe_strdup(tempiConf.reject_message_gline, cepp->value); } } - else if (!strcmp(cep->ce_varname, "topic-setter")) + else if (!strcmp(cep->name, "topic-setter")) { - if (!strcmp(cep->ce_vardata, "nick")) + if (!strcmp(cep->value, "nick")) tempiConf.topic_setter = SETTER_NICK; - else if (!strcmp(cep->ce_vardata, "nick-user-host")) + else if (!strcmp(cep->value, "nick-user-host")) tempiConf.topic_setter = SETTER_NICK_USER_HOST; } - else if (!strcmp(cep->ce_varname, "ban-setter")) + else if (!strcmp(cep->name, "ban-setter")) { - if (!strcmp(cep->ce_vardata, "nick")) + if (!strcmp(cep->value, "nick")) tempiConf.ban_setter = SETTER_NICK; - else if (!strcmp(cep->ce_vardata, "nick-user-host")) + else if (!strcmp(cep->value, "nick-user-host")) tempiConf.ban_setter = SETTER_NICK_USER_HOST; } - else if (!strcmp(cep->ce_varname, "ban-setter-sync") || !strcmp(cep->ce_varname, "ban-setter-synch")) + else if (!strcmp(cep->name, "ban-setter-sync") || !strcmp(cep->name, "ban-setter-synch")) { - tempiConf.ban_setter_sync = config_checkval(cep->ce_vardata, CFG_YESNO); + tempiConf.ban_setter_sync = config_checkval(cep->value, CFG_YESNO); } - else if (!strcmp(cep->ce_varname, "part-instead-of-quit-on-comment-change")) + else if (!strcmp(cep->name, "part-instead-of-quit-on-comment-change")) { - tempiConf.part_instead_of_quit_on_comment_change = config_checkval(cep->ce_vardata, CFG_YESNO); + tempiConf.part_instead_of_quit_on_comment_change = config_checkval(cep->value, CFG_YESNO); } - else if (!strcmp(cep->ce_varname, "broadcast-channel-messages")) + else if (!strcmp(cep->name, "broadcast-channel-messages")) { - if (!strcmp(cep->ce_vardata, "auto")) + if (!strcmp(cep->value, "auto")) tempiConf.broadcast_channel_messages = BROADCAST_CHANNEL_MESSAGES_AUTO; - else if (!strcmp(cep->ce_vardata, "always")) + else if (!strcmp(cep->value, "always")) tempiConf.broadcast_channel_messages = BROADCAST_CHANNEL_MESSAGES_ALWAYS; - else if (!strcmp(cep->ce_vardata, "never")) + else if (!strcmp(cep->value, "never")) tempiConf.broadcast_channel_messages = BROADCAST_CHANNEL_MESSAGES_NEVER; } - else if (!strcmp(cep->ce_varname, "allowed-channelchars")) + else if (!strcmp(cep->name, "allowed-channelchars")) { - tempiConf.allowed_channelchars = allowed_channelchars_strtoval(cep->ce_vardata); + tempiConf.allowed_channelchars = allowed_channelchars_strtoval(cep->value); } - else if (!strcmp(cep->ce_varname, "hide-idle-time")) + else if (!strcmp(cep->name, "hide-idle-time")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { - if (!strcmp(cepp->ce_varname, "policy")) - tempiConf.hide_idle_time = hideidletime_strtoval(cepp->ce_vardata); + if (!strcmp(cepp->name, "policy")) + tempiConf.hide_idle_time = hideidletime_strtoval(cepp->value); } - } - else + } else { int value; for (h = Hooks[HOOKTYPE_CONFIGRUN]; h; h = h->next) @@ -8028,62 +7739,61 @@ int _test_set(ConfigFile *conf, ConfigEntry *ce) int errors = 0; Hook *h; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "kline-address")) { + if (!strcmp(cep->name, "kline-address")) { CheckNull(cep); CheckDuplicate(cep, kline_address, "kline-address"); - if (!strchr(cep->ce_vardata, '@') && !strchr(cep->ce_vardata, ':')) + if (!strchr(cep->value, '@') && !strchr(cep->value, ':')) { config_error("%s:%i: set::kline-address must be an e-mail or an URL", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; continue; } - else if (match_simple("*@unrealircd.com", cep->ce_vardata) || match_simple("*@unrealircd.org",cep->ce_vardata) || match_simple("unreal-*@lists.sourceforge.net",cep->ce_vardata)) + else if (match_simple("*@unrealircd.com", cep->value) || match_simple("*@unrealircd.org",cep->value) || match_simple("unreal-*@lists.sourceforge.net",cep->value)) { config_error("%s:%i: set::kline-address may not be an UnrealIRCd Team address", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; continue; } } - else if (!strcmp(cep->ce_varname, "gline-address")) { + else if (!strcmp(cep->name, "gline-address")) { CheckNull(cep); CheckDuplicate(cep, gline_address, "gline-address"); - if (!strchr(cep->ce_vardata, '@') && !strchr(cep->ce_vardata, ':')) + if (!strchr(cep->value, '@') && !strchr(cep->value, ':')) { config_error("%s:%i: set::gline-address must be an e-mail or an URL", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; continue; } - else if (match_simple("*@unrealircd.com", cep->ce_vardata) || match_simple("*@unrealircd.org",cep->ce_vardata) || match_simple("unreal-*@lists.sourceforge.net",cep->ce_vardata)) + else if (match_simple("*@unrealircd.com", cep->value) || match_simple("*@unrealircd.org",cep->value) || match_simple("unreal-*@lists.sourceforge.net",cep->value)) { config_error("%s:%i: set::gline-address may not be an UnrealIRCd Team address", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; continue; } } - else if (!strcmp(cep->ce_varname, "modes-on-connect")) { + else if (!strcmp(cep->name, "modes-on-connect")) { char *p; CheckNull(cep); CheckDuplicate(cep, modes_on_connect, "modes-on-connect"); - for (p = cep->ce_vardata; *p; p++) + for (p = cep->value; *p; p++) if (strchr("orzSHqtW", *p)) { config_error("%s:%i: set::modes-on-connect may not include mode '%c'", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, *p); + cep->file->filename, cep->line_number, *p); errors++; } - set_usermode(cep->ce_vardata); } - else if (!strcmp(cep->ce_varname, "modes-on-join")) { + else if (!strcmp(cep->name, "modes-on-join")) { char *c; struct ChMode temp; memset(&temp, 0, sizeof(temp)); CheckNull(cep); CheckDuplicate(cep, modes_on_join, "modes-on-join"); - for (c = cep->ce_vardata; *c; c++) + for (c = cep->value; *c; c++) { if (*c == ' ') break; /* don't check the parameter ;p */ @@ -8097,340 +7807,340 @@ int _test_set(ConfigFile *conf, ConfigEntry *ce) case 'b': case 'e': case 'I': - case 'k': - case 'l': config_error("%s:%i: set::modes-on-join may not contain +%c", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, *c); + cep->file->filename, cep->line_number, *c); errors++; break; } } - conf_channelmodes(cep->ce_vardata, &temp, 1); - if (temp.mode & MODE_SECRET && temp.mode & MODE_PRIVATE) - { - config_error("%s:%i: set::modes-on-join has both +s and +p", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); - errors++; - } - + /* We can't really verify much here. + * The channel mode modules have not been initialized + * yet at this point, so we can't really verify much + * here. + */ } - else if (!strcmp(cep->ce_varname, "modes-on-oper")) { + else if (!strcmp(cep->name, "modes-on-oper")) { char *p; CheckNull(cep); CheckDuplicate(cep, modes_on_oper, "modes-on-oper"); - for (p = cep->ce_vardata; *p; p++) + for (p = cep->value; *p; p++) if (strchr("orzS", *p)) { config_error("%s:%i: set::modes-on-oper may not include mode '%c'", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, *p); + cep->file->filename, cep->line_number, *p); errors++; } - set_usermode(cep->ce_vardata); + set_usermode(cep->value); } - else if (!strcmp(cep->ce_varname, "snomask-on-oper")) { + else if (!strcmp(cep->name, "snomask-on-oper")) { + char *wrong_snomask; CheckNull(cep); CheckDuplicate(cep, snomask_on_oper, "snomask-on-oper"); + if (!is_valid_snomask_string_testing(cep->value, &wrong_snomask)) + { + config_error("%s:%i: set::snomask-on-oper contains unknown snomask letter(s) '%s'", + cep->file->filename, cep->line_number, wrong_snomask); + errors++; + invalid_snomasks_encountered++; + } } - else if (!strcmp(cep->ce_varname, "level-on-join")) { + else if (!strcmp(cep->name, "server-notice-colors")) { + CheckNull(cep); + } + else if (!strcmp(cep->name, "level-on-join")) { CheckNull(cep); CheckDuplicate(cep, level_on_join, "level-on-join"); - if (!channellevel_to_int(cep->ce_vardata)) + if (!channellevel_to_string(cep->value) && (strlen(cep->value) != 1)) { - config_error("%s:%i: set::level-on-join: unknown value '%s', should be one of: none, voice, halfop, op, protect, owner", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_vardata); + config_error("%s:%i: set::level-on-join: unknown value '%s', should be one of: " + "'none', 'voice', 'halfop', 'op', 'admin', 'owner', or a single letter (eg 'o')", + cep->file->filename, cep->line_number, cep->value); errors++; } } - else if (!strcmp(cep->ce_varname, "static-quit")) { + else if (!strcmp(cep->name, "static-quit")) { CheckNull(cep); CheckDuplicate(cep, static_quit, "static-quit"); } - else if (!strcmp(cep->ce_varname, "static-part")) { + else if (!strcmp(cep->name, "static-part")) { CheckNull(cep); CheckDuplicate(cep, static_part, "static-part"); } - else if (!strcmp(cep->ce_varname, "who-limit")) { + else if (!strcmp(cep->name, "who-limit")) { CheckNull(cep); CheckDuplicate(cep, who_limit, "who-limit"); - if (!config_checkval(cep->ce_vardata,CFG_SIZE)) + if (!config_checkval(cep->value,CFG_SIZE)) { config_error("%s:%i: set::who-limit: value must be at least 1", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; } } - else if (!strcmp(cep->ce_varname, "maxbans")) { + else if (!strcmp(cep->name, "maxbans")) { CheckNull(cep); CheckDuplicate(cep, maxbans, "maxbans"); } - else if (!strcmp(cep->ce_varname, "maxbanlength")) { + else if (!strcmp(cep->name, "maxbanlength")) { CheckNull(cep); CheckDuplicate(cep, maxbanlength, "maxbanlength"); } - else if (!strcmp(cep->ce_varname, "silence-limit")) { + else if (!strcmp(cep->name, "silence-limit")) { CheckNull(cep); CheckDuplicate(cep, silence_limit, "silence-limit"); } - else if (!strcmp(cep->ce_varname, "auto-join")) { + else if (!strcmp(cep->name, "auto-join")) { CheckNull(cep); CheckDuplicate(cep, auto_join, "auto-join"); } - else if (!strcmp(cep->ce_varname, "oper-auto-join")) { + else if (!strcmp(cep->name, "oper-auto-join")) { CheckNull(cep); CheckDuplicate(cep, oper_auto_join, "oper-auto-join"); } - else if (!strcmp(cep->ce_varname, "check-target-nick-bans")) { + else if (!strcmp(cep->name, "check-target-nick-bans")) { CheckNull(cep); CheckDuplicate(cep, check_target_nick_bans, "check-target-nick-bans"); } - else if (!strcmp(cep->ce_varname, "pingpong-warning")) { + else if (!strcmp(cep->name, "pingpong-warning")) { config_error("%s:%i: set::pingpong-warning no longer exists (the warning is always off)", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); - need_34_upgrade = 1; + cep->file->filename, cep->line_number); errors++; } - else if (!strcmp(cep->ce_varname, "ping-cookie")) { + else if (!strcmp(cep->name, "ping-cookie")) { CheckNull(cep); CheckDuplicate(cep, ping_cookie, "ping-cookie"); } - else if (!strcmp(cep->ce_varname, "watch-away-notification")) { + else if (!strcmp(cep->name, "watch-away-notification")) { CheckNull(cep); CheckDuplicate(cep, watch_away_notification, "watch-away-notification"); } - else if (!strcmp(cep->ce_varname, "uhnames")) { + else if (!strcmp(cep->name, "uhnames")) { CheckNull(cep); CheckDuplicate(cep, uhnames, "uhnames"); } - else if (!strcmp(cep->ce_varname, "channel-command-prefix")) { + else if (!strcmp(cep->name, "channel-command-prefix")) { CheckNullAllowEmpty(cep); CheckDuplicate(cep, channel_command_prefix, "channel-command-prefix"); } - else if (!strcmp(cep->ce_varname, "allow-userhost-change")) { + else if (!strcmp(cep->name, "allow-userhost-change")) { CheckNull(cep); CheckDuplicate(cep, allow_userhost_change, "allow-userhost-change"); - if (strcasecmp(cep->ce_vardata, "always") && - strcasecmp(cep->ce_vardata, "never") && - strcasecmp(cep->ce_vardata, "not-on-channels") && - strcasecmp(cep->ce_vardata, "force-rejoin")) + if (strcasecmp(cep->value, "always") && + strcasecmp(cep->value, "never") && + strcasecmp(cep->value, "not-on-channels") && + strcasecmp(cep->value, "force-rejoin")) { config_error("%s:%i: set::allow-userhost-change is invalid", - cep->ce_fileptr->cf_filename, - cep->ce_varlinenum); + cep->file->filename, + cep->line_number); errors++; continue; } } - else if (!strcmp(cep->ce_varname, "anti-spam-quit-message-time")) { + else if (!strcmp(cep->name, "anti-spam-quit-message-time")) { CheckNull(cep); CheckDuplicate(cep, anti_spam_quit_message_time, "anti-spam-quit-message-time"); } - else if (!strcmp(cep->ce_varname, "oper-only-stats")) + else if (!strcmp(cep->name, "oper-only-stats")) { config_warn("%s:%d: We no longer use a blacklist for stats (set::oper-only-stats) but " "have a whitelist now instead (set::allow-user-stats). ", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); config_warn("Simply delete the oper-only-stats line from your configuration file %s around line %d to get rid of this warning", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); continue; } - else if (!strcmp(cep->ce_varname, "allow-user-stats")) + else if (!strcmp(cep->name, "allow-user-stats")) { CheckDuplicate(cep, allow_user_stats, "allow-user-stats"); - if (!cep->ce_entries) - { - CheckNull(cep); - } - else - { - /* TODO: check the entries for existence? - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) - { - } */ - } + CheckNull(cep); } - else if (!strcmp(cep->ce_varname, "maxchannelsperuser")) { + else if (!strcmp(cep->name, "maxchannelsperuser")) { CheckNull(cep); CheckDuplicate(cep, maxchannelsperuser, "maxchannelsperuser"); - tempi = atoi(cep->ce_vardata); + tempi = atoi(cep->value); if (tempi < 1) { config_error("%s:%i: set::maxchannelsperuser must be > 0", - cep->ce_fileptr->cf_filename, - cep->ce_varlinenum); + cep->file->filename, + cep->line_number); errors++; continue; } } - else if (!strcmp(cep->ce_varname, "ping-warning")) { + else if (!strcmp(cep->name, "ping-warning")) { CheckNull(cep); CheckDuplicate(cep, ping_warning, "ping-warning"); - tempi = atoi(cep->ce_vardata); + tempi = atoi(cep->value); /* it is pointless to allow setting higher than 170 */ if (tempi > 170) { config_error("%s:%i: set::ping-warning must be < 170", - cep->ce_fileptr->cf_filename, - cep->ce_varlinenum); + cep->file->filename, + cep->line_number); errors++; continue; } } - else if (!strcmp(cep->ce_varname, "maxdccallow")) { + else if (!strcmp(cep->name, "maxdccallow")) { CheckNull(cep); CheckDuplicate(cep, maxdccallow, "maxdccallow"); } - else if (!strcmp(cep->ce_varname, "max-targets-per-command")) + else if (!strcmp(cep->name, "max-targets-per-command")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { CheckNull(cepp); - if (!strcasecmp(cepp->ce_varname, "NAMES") || !strcasecmp(cepp->ce_varname, "WHOWAS")) + if (!strcasecmp(cepp->name, "NAMES") || !strcasecmp(cepp->name, "WHOWAS")) { - if (atoi(cepp->ce_vardata) != 1) + if (atoi(cepp->value) != 1) { config_error("%s:%i: set::max-targets-per-command::%s: " "this command is hardcoded at a maximum of 1 " "and cannot be configured to accept more.", - cepp->ce_fileptr->cf_filename, - cepp->ce_varlinenum, - cepp->ce_varname); + cepp->file->filename, + cepp->line_number, + cepp->name); errors++; } } else - if (!strcasecmp(cepp->ce_varname, "USERHOST") || - !strcasecmp(cepp->ce_varname, "USERIP") || - !strcasecmp(cepp->ce_varname, "ISON") || - !strcasecmp(cepp->ce_varname, "WATCH")) + if (!strcasecmp(cepp->name, "USERHOST") || + !strcasecmp(cepp->name, "USERIP") || + !strcasecmp(cepp->name, "ISON") || + !strcasecmp(cepp->name, "WATCH")) { - if (strcmp(cepp->ce_vardata, "max")) + if (strcmp(cepp->value, "max")) { config_error("%s:%i: set::max-targets-per-command::%s: " "this command is hardcoded at a maximum of 'max' " "and cannot be changed. This because it is " "highly discouraged to change it.", - cepp->ce_fileptr->cf_filename, - cepp->ce_varlinenum, - cepp->ce_varname); + cepp->file->filename, + cepp->line_number, + cepp->name); errors++; } } /* Now check the value syntax in general: */ - if (strcmp(cepp->ce_vardata, "max")) /* anything other than 'max'.. */ + if (strcmp(cepp->value, "max")) /* anything other than 'max'.. */ { - int v = atoi(cepp->ce_vardata); + int v = atoi(cepp->value); if ((v < 1) || (v > 20)) { config_error("%s:%i: set::max-targets-per-command::%s: " "value should be 1-20 or 'max'", - cepp->ce_fileptr->cf_filename, - cepp->ce_varlinenum, - cepp->ce_varname); + cepp->file->filename, + cepp->line_number, + cepp->name); errors++; } } } } - else if (!strcmp(cep->ce_varname, "network-name")) { + else if (!strcmp(cep->name, "network-name")) { char *p; CheckNull(cep); CheckDuplicate(cep, network_name, "network-name"); - for (p = cep->ce_vardata; *p; p++) + for (p = cep->value; *p; p++) if ((*p < ' ') || (*p > '~')) { config_error("%s:%i: set::network-name can only contain ASCII characters 33-126. Invalid character = '%c'", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, *p); + cep->file->filename, cep->line_number, *p); errors++; break; } } - else if (!strcmp(cep->ce_varname, "default-server")) { + else if (!strcmp(cep->name, "default-server")) { CheckNull(cep); CheckDuplicate(cep, default_server, "default-server"); } - else if (!strcmp(cep->ce_varname, "services-server")) { + else if (!strcmp(cep->name, "services-server")) { CheckNull(cep); CheckDuplicate(cep, services_server, "services-server"); } - else if (!strcmp(cep->ce_varname, "sasl-server")) { + else if (!strcmp(cep->name, "sasl-server")) { CheckNull(cep); CheckDuplicate(cep, sasl_server, "sasl-server"); } - else if (!strcmp(cep->ce_varname, "stats-server")) { + else if (!strcmp(cep->name, "stats-server")) { CheckNull(cep); CheckDuplicate(cep, stats_server, "stats-server"); } - else if (!strcmp(cep->ce_varname, "help-channel")) { + else if (!strcmp(cep->name, "help-channel")) { CheckNull(cep); CheckDuplicate(cep, help_channel, "help-channel"); } - else if (!strcmp(cep->ce_varname, "hiddenhost-prefix")) { + else if (!strcmp(cep->name, "cloak-prefix") || !strcmp(cep->name, "hiddenhost-prefix")) { CheckNull(cep); - CheckDuplicate(cep, hiddenhost_prefix, "hiddenhost-prefix"); - if (strchr(cep->ce_vardata, ' ') || (*cep->ce_vardata == ':')) + CheckDuplicate(cep, hiddenhost_prefix, "cloak-prefix"); + if (strchr(cep->value, ' ') || (*cep->value == ':')) { - config_error("%s:%i: set::hiddenhost-prefix must not contain spaces or be prefixed with ':'", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + config_error("%s:%i: set::cloak-prefix must not contain spaces or be prefixed with ':'", + cep->file->filename, cep->line_number); errors++; continue; } } - else if (!strcmp(cep->ce_varname, "prefix-quit")) { + else if (!strcmp(cep->name, "prefix-quit")) { CheckNull(cep); CheckDuplicate(cep, prefix_quit, "prefix-quit"); } - else if (!strcmp(cep->ce_varname, "hide-ban-reason")) { + else if (!strcmp(cep->name, "hide-ban-reason")) { CheckNull(cep); CheckDuplicate(cep, hide_ban_reason, "hide-ban-reason"); } - else if (!strcmp(cep->ce_varname, "restrict-usermodes")) + else if (!strcmp(cep->name, "restrict-usermodes")) { CheckNull(cep); CheckDuplicate(cep, restrict_usermodes, "restrict-usermodes"); - if (cep->ce_varname) { + if (cep->name) { int warn = 0; char *p; - for (p = cep->ce_vardata; *p; p++) + for (p = cep->value; *p; p++) if ((*p == '+') || (*p == '-')) warn = 1; if (warn) { config_status("%s:%i: warning: set::restrict-usermodes: should only contain modechars, no + or -.\n", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); } } } - else if (!strcmp(cep->ce_varname, "restrict-channelmodes")) + else if (!strcmp(cep->name, "restrict-channelmodes")) { CheckNull(cep); CheckDuplicate(cep, restrict_channelmodes, "restrict-channelmodes"); - if (cep->ce_varname) { + if (cep->name) { int warn = 0; char *p; - for (p = cep->ce_vardata; *p; p++) + for (p = cep->value; *p; p++) if ((*p == '+') || (*p == '-')) warn = 1; if (warn) { config_status("%s:%i: warning: set::restrict-channelmodes: should only contain modechars, no + or -.\n", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); } } } - else if (!strcmp(cep->ce_varname, "restrict-extendedbans")) + else if (!strcmp(cep->name, "restrict-extendedbans")) { CheckDuplicate(cep, restrict_extendedbans, "restrict-extendedbans"); CheckNull(cep); } - else if (!strcmp(cep->ce_varname, "link")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) { + else if (!strcmp(cep->name, "named-extended-bans")) + { + CheckNull(cep); + } + else if (!strcmp(cep->name, "link")) { + for (cepp = cep->items; cepp; cepp = cepp->next) { CheckNull(cepp); - if (!strcmp(cepp->ce_varname, "bind-ip")) { + if (!strcmp(cepp->name, "bind-ip")) { CheckDuplicate(cepp, link_bind_ip, "link::bind-ip"); - if (strcmp(cepp->ce_vardata, "*")) + if (strcmp(cepp->value, "*")) { - if (!is_valid_ip(cepp->ce_vardata)) + if (!is_valid_ip(cepp->value)) { config_error("%s:%i: set::link::bind-ip (%s) is not a valid IP", - cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum, - cepp->ce_vardata); + cepp->file->filename, cepp->line_number, + cepp->value); errors++; continue; } @@ -8438,66 +8148,33 @@ int _test_set(ConfigFile *conf, ConfigEntry *ce) } } } - else if (!strcmp(cep->ce_varname, "dns")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) { - CheckNull(cepp); - if (!strcmp(cepp->ce_varname, "nameserver") || - !strcmp(cepp->ce_varname, "timeout") || - !strcmp(cepp->ce_varname, "retries")) - { - config_error("%s:%i: set::dns::%s no longer exist in UnrealIRCd 4. " - "Please remove it from your configuration file.", - cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum, cepp->ce_varname); - errors++; - } else - if (!strcmp(cepp->ce_varname, "bind-ip")) { - CheckDuplicate(cepp, dns_bind_ip, "dns::bind-ip"); - if (strcmp(cepp->ce_vardata, "*")) - { - if (!is_valid_ip(cepp->ce_vardata)) - { - config_error("%s:%i: set::dns::bind-ip (%s) is not a valid IP", - cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum, - cepp->ce_vardata); - errors++; - continue; - } - } - } - else - { - config_error_unknownopt(cepp->ce_fileptr->cf_filename, - cepp->ce_varlinenum, "set::dns", - cepp->ce_varname); - errors++; - } - } - } - else if (!strcmp(cep->ce_varname, "throttle")) { + else if (!strcmp(cep->name, "throttle")) { config_error("%s:%i: set::throttle has been renamed. you now use " "set::anti-flood::connect-flood :. " "Or just remove the throttle block and you get the default " "of 3 per 60 seconds.", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; - need_34_upgrade = 1; continue; } - else if (!strcmp(cep->ce_varname, "anti-flood")) + else if (!strcmp(cep->name, "anti-flood")) { int anti_flood_old = 0; int anti_flood_old_and_default = 0; - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { + int has_lag_penalty = 0; + int has_lag_penalty_bytes = 0; + /* Test for old options: */ - if (flood_option_is_old(cepp->ce_varname)) + if (flood_option_is_old(cepp->name)) { /* Special code if the user is using 100% of the defaults */ - if (cepp->ce_vardata && - ((!strcmp(cepp->ce_varname, "nick-flood") && !strcmp(cepp->ce_vardata, "3:60")) || - (!strcmp(cepp->ce_varname, "connect-flood") && cepp->ce_vardata && !strcmp(cepp->ce_vardata, "3:60")) || - (!strcmp(cepp->ce_varname, "away-flood") && cepp->ce_vardata && !strcmp(cepp->ce_vardata, "4:120")))) + if (cepp->value && + ((!strcmp(cepp->name, "nick-flood") && !strcmp(cepp->value, "3:60")) || + (!strcmp(cepp->name, "connect-flood") && cepp->value && !strcmp(cepp->value, "3:60")) || + (!strcmp(cepp->name, "away-flood") && cepp->value && !strcmp(cepp->value, "4:120")))) { anti_flood_old_and_default = 1; } else @@ -8507,219 +8184,237 @@ int _test_set(ConfigFile *conf, ConfigEntry *ce) continue; } - for (ceppp = cepp->ce_entries; ceppp; ceppp = ceppp->ce_next) + for (ceppp = cepp->items; ceppp; ceppp = ceppp->next) { - int everyone = !strcmp(cepp->ce_varname, "everyone") ? 1 : 0; - int for_everyone = flood_option_is_for_everyone(ceppp->ce_varname); + int everyone = !strcmp(cepp->name, "everyone") ? 1 : 0; + int for_everyone = flood_option_is_for_everyone(ceppp->name); if (everyone && !for_everyone) { config_error("%s:%i: %s cannot be in the set::anti-flood::everyone block. " "You can put it in 'known-users' or 'unknown-users' instead.", - ceppp->ce_fileptr->cf_filename, ceppp->ce_varlinenum, - ceppp->ce_varname); + ceppp->file->filename, ceppp->line_number, + ceppp->name); errors++; continue; } else if (!everyone && for_everyone) { config_error("%s:%i: %s must be in the set::anti-flood::everyone block, not anywhere else.", - ceppp->ce_fileptr->cf_filename, ceppp->ce_varlinenum, - ceppp->ce_varname); + ceppp->file->filename, ceppp->line_number, + ceppp->name); errors++; continue; } /* Now comes the actual config check for each element... */ - if (!strcmp(ceppp->ce_varname, "max-concurrent-conversations")) + if (!strcmp(ceppp->name, "max-concurrent-conversations")) { - for (cep4 = ceppp->ce_entries; cep4; cep4 = cep4->ce_next) + for (cep4 = ceppp->items; cep4; cep4 = cep4->next) { CheckNull(cep4); - if (!strcmp(cep4->ce_varname, "users")) + if (!strcmp(cep4->name, "users")) { - int v = atoi(cep4->ce_vardata); + int v = atoi(cep4->value); if ((v < 1) || (v > MAXCCUSERS)) { config_error("%s:%i: set::anti-flood::max-concurrent-conversations::users: " "value should be between 1 and %d", - cep4->ce_fileptr->cf_filename, cep4->ce_varlinenum, MAXCCUSERS); + cep4->file->filename, cep4->line_number, MAXCCUSERS); errors++; } } else - if (!strcmp(cep4->ce_varname, "new-user-every")) + if (!strcmp(cep4->name, "new-user-every")) { - long v = config_checkval(cep4->ce_vardata, CFG_TIME); + long v = config_checkval(cep4->value, CFG_TIME); if ((v < 1) || (v > 120)) { config_error("%s:%i: set::anti-flood::max-concurrent-conversations::new-user-every: " "value should be between 1 and 120 seconds", - cep4->ce_fileptr->cf_filename, cep4->ce_varlinenum); + cep4->file->filename, cep4->line_number); errors++; } } else { - config_error_unknownopt(cep4->ce_fileptr->cf_filename, - cep4->ce_varlinenum, "set::anti-flood", - cep4->ce_varname); + config_error_unknownopt(cep4->file->filename, + cep4->line_number, "set::anti-flood", + cep4->name); errors++; } } continue; /* required here, due to checknull directly below */ } - else if (!strcmp(ceppp->ce_varname, "unknown-flood-amount") || - !strcmp(ceppp->ce_varname, "unknown-flood-bantime")) + else if (!strcmp(ceppp->name, "unknown-flood-amount") || + !strcmp(ceppp->name, "unknown-flood-bantime")) { config_error("%s:%i: set::anti-flood::%s: this setting has been moved. " "See https://www.unrealircd.org/docs/Anti-flood_settings#handshake-data-flood", - ceppp->ce_fileptr->cf_filename, ceppp->ce_varlinenum, ceppp->ce_varname); + ceppp->file->filename, ceppp->line_number, ceppp->name); errors++; continue; } - else if (!strcmp(ceppp->ce_varname, "handshake-data-flood")) + else if (!strcmp(ceppp->name, "handshake-data-flood")) { - for (cep4 = ceppp->ce_entries; cep4; cep4 = cep4->ce_next) + for (cep4 = ceppp->items; cep4; cep4 = cep4->next) { - if (!strcmp(cep4->ce_varname, "amount")) + if (!strcmp(cep4->name, "amount")) { long v; CheckNull(cep4); - v = config_checkval(cep4->ce_vardata, CFG_SIZE); + v = config_checkval(cep4->value, CFG_SIZE); if (v < 1024) { config_error("%s:%i: set::anti-flood::handshake-data-flood::amount must be at least 1024 bytes", - cep4->ce_fileptr->cf_filename, cep4->ce_varlinenum); + cep4->file->filename, cep4->line_number); errors++; } } else - if (!strcmp(cep4->ce_varname, "ban-action")) + if (!strcmp(cep4->name, "ban-action")) { CheckNull(cep4); - if (!banact_stringtoval(cep4->ce_vardata)) + if (!banact_stringtoval(cep4->value)) { config_error("%s:%i: set::anti-flood::handshake-data-flood::ban-action has unknown action type '%s'", - cep4->ce_fileptr->cf_filename, cep4->ce_varlinenum, - cep4->ce_vardata); + cep4->file->filename, cep4->line_number, + cep4->value); errors++; } } else - if (!strcmp(cep4->ce_varname, "ban-time")) + if (!strcmp(cep4->name, "ban-time")) { CheckNull(cep4); } else { - config_error_unknownopt(cep4->ce_fileptr->cf_filename, - cep4->ce_varlinenum, "set::anti-flood::handshake-data-flood", - cep4->ce_varname); + config_error_unknownopt(cep4->file->filename, + cep4->line_number, "set::anti-flood::handshake-data-flood", + cep4->name); errors++; } } } - else if (!strcmp(ceppp->ce_varname, "away-count")) + else if (!strcmp(ceppp->name, "away-count")) { - int temp = atol(ceppp->ce_vardata); + int temp = atol(ceppp->value); CheckNull(ceppp); if (temp < 1 || temp > 255) { config_error("%s:%i: set::anti-flood::away-count must be between 1 and 255", - ceppp->ce_fileptr->cf_filename, ceppp->ce_varlinenum); + ceppp->file->filename, ceppp->line_number); errors++; } } - else if (!strcmp(ceppp->ce_varname, "away-period")) + else if (!strcmp(ceppp->name, "away-period")) { CheckNull(ceppp); - int temp = config_checkval(ceppp->ce_vardata, CFG_TIME); + int temp = config_checkval(ceppp->value, CFG_TIME); if (temp < 10) { config_error("%s:%i: set::anti-flood::away-period must be greater than 9", - ceppp->ce_fileptr->cf_filename, ceppp->ce_varlinenum); + ceppp->file->filename, ceppp->line_number); errors++; } } - else if (!strcmp(ceppp->ce_varname, "away-flood")) + else if (!strcmp(ceppp->name, "away-flood")) { int cnt, period; CheckNull(ceppp); - if (!config_parse_flood(ceppp->ce_vardata, &cnt, &period) || + if (!config_parse_flood(ceppp->value, &cnt, &period) || (cnt < 1) || (cnt > 255) || (period < 10)) { config_error("%s:%i: set::anti-flood::away-flood error. Syntax is ':' (eg 5:60), " "count should be 1-255, period should be greater than 9", - ceppp->ce_fileptr->cf_filename, ceppp->ce_varlinenum); + ceppp->file->filename, ceppp->line_number); errors++; } } - else if (!strcmp(ceppp->ce_varname, "nick-flood")) + else if (!strcmp(ceppp->name, "nick-flood")) { int cnt, period; CheckNull(ceppp); - if (!config_parse_flood(ceppp->ce_vardata, &cnt, &period) || + if (!config_parse_flood(ceppp->value, &cnt, &period) || (cnt < 1) || (cnt > 255) || (period < 5)) { config_error("%s:%i: set::anti-flood::nick-flood error. Syntax is ':' (eg 5:60), " "count should be 1-255, period should be greater than 4", - ceppp->ce_fileptr->cf_filename, ceppp->ce_varlinenum); + ceppp->file->filename, ceppp->line_number); errors++; } } - else if (!strcmp(ceppp->ce_varname, "join-flood")) + else if (!strcmp(ceppp->name, "join-flood")) { int cnt, period; CheckNull(ceppp); - if (!config_parse_flood(ceppp->ce_vardata, &cnt, &period) || + if (!config_parse_flood(ceppp->value, &cnt, &period) || (cnt < 1) || (cnt > 255) || (period < 5)) { config_error("%s:%i: join-flood error. Syntax is ':' (eg 5:60), " "count should be 1-255, period should be greater than 4", - ceppp->ce_fileptr->cf_filename, ceppp->ce_varlinenum); + ceppp->file->filename, ceppp->line_number); errors++; } } - else if (!strcmp(ceppp->ce_varname, "invite-flood")) + else if (!strcmp(ceppp->name, "invite-flood")) { int cnt, period; CheckNull(ceppp); - if (!config_parse_flood(ceppp->ce_vardata, &cnt, &period) || + if (!config_parse_flood(ceppp->value, &cnt, &period) || (cnt < 1) || (cnt > 255) || (period < 5)) { config_error("%s:%i: set::anti-flood::invite-flood error. Syntax is ':' (eg 5:60), " "count should be 1-255, period should be greater than 4", - ceppp->ce_fileptr->cf_filename, ceppp->ce_varlinenum); + ceppp->file->filename, ceppp->line_number); errors++; } } - else if (!strcmp(ceppp->ce_varname, "knock-flood")) + else if (!strcmp(ceppp->name, "knock-flood")) { int cnt, period; CheckNull(ceppp); - if (!config_parse_flood(ceppp->ce_vardata, &cnt, &period) || + if (!config_parse_flood(ceppp->value, &cnt, &period) || (cnt < 1) || (cnt > 255) || (period < 5)) { config_error("%s:%i: set::anti-flood::knock-flood error. Syntax is ':' (eg 5:60), " "count should be 1-255, period should be greater than 4", - ceppp->ce_fileptr->cf_filename, ceppp->ce_varlinenum); + ceppp->file->filename, ceppp->line_number); errors++; } } - else if (!strcmp(ceppp->ce_varname, "connect-flood")) + else if (!strcmp(ceppp->name, "lag-penalty")) + { + int v; + CheckNull(ceppp); + v = atoi(ceppp->value); + has_lag_penalty = 1; + if ((v < 0) || (v > 10000)) + { + config_error("%s:%i: set::anti-flood::%s::lag-penalty: value is in milliseconds and should be between 0 and 10000", + ceppp->file->filename, ceppp->line_number, cepp->name); + errors++; + } + } + else if (!strcmp(ceppp->name, "lag-penalty-bytes")) + { + has_lag_penalty_bytes = 1; + CheckNull(ceppp); + } + else if (!strcmp(ceppp->name, "connect-flood")) { int cnt, period; CheckNull(ceppp); - if (strcmp(cepp->ce_varname, "everyone")) + if (strcmp(cepp->name, "everyone")) { config_error("%s:%i: connect-flood must be in the set::anti-flood::everyone block, not anywhere else.", - ceppp->ce_fileptr->cf_filename, ceppp->ce_varlinenum); + ceppp->file->filename, ceppp->line_number); errors++; continue; } - if (!config_parse_flood(ceppp->ce_vardata, &cnt, &period) || + if (!config_parse_flood(ceppp->value, &cnt, &period) || (cnt < 1) || (cnt > 255) || (period < 1) || (period > 3600)) { config_error("%s:%i: set::anti-flood::connect-flood: Syntax is ':' (eg 5:60), " "count should be 1-255, period should be 1-3600", - ceppp->ce_fileptr->cf_filename, ceppp->ce_varlinenum); + ceppp->file->filename, ceppp->line_number); errors++; } } @@ -8756,21 +8451,27 @@ int _test_set(ConfigFile *conf, ConfigEntry *ce) } if (!used) { - config_error_unknownopt(ceppp->ce_fileptr->cf_filename, - ceppp->ce_varlinenum, "set::anti-flood", - ceppp->ce_varname); + config_error_unknownopt(ceppp->file->filename, + ceppp->line_number, "set::anti-flood", + ceppp->name); errors++; } continue; } } + if (has_lag_penalty+has_lag_penalty_bytes == 1) + { + config_error("%s:%i: set::anti-flood::%s: if you use lag-penalty then you must also add an lag-penalty-bytes item (and vice-versa)", + cepp->file->filename, cepp->line_number, cepp->name); + errors++; + } } /* Now the warnings: */ if (anti_flood_old == 1) { config_warn("%s:%d: the set::anti-flood block has been reorganized to be more flexible. " "Your custom anti-flood settings have NOT been read.", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); config_warn("See https://www.unrealircd.org/docs/Anti-flood_settings for the new block style,"); config_warn("OR: simply remove all the anti-flood options from the conf to get rid of this " "warning and use the built-in defaults."); @@ -8778,74 +8479,73 @@ int _test_set(ConfigFile *conf, ConfigEntry *ce) if (anti_flood_old_and_default == 1) { config_warn("%s:%d: the set::anti-flood block has been reorganized to be more flexible.", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); config_warn("To fix this warning, delete the anti-flood block from your configuration file " "(file %s around line %d), this will make UnrealIRCd use the built-in defaults.", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); config_warn("If you want to learn more about the new functionality you can visit " "https://www.unrealircd.org/docs/Anti-flood_settings"); } } - else if (!strcmp(cep->ce_varname, "options")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) { - if (!strcmp(cepp->ce_varname, "hide-ulines")) + else if (!strcmp(cep->name, "options")) { + for (cepp = cep->items; cepp; cepp = cepp->next) { + if (!strcmp(cepp->name, "hide-ulines")) { CheckDuplicate(cepp, options_hide_ulines, "options::hide-ulines"); } - else if (!strcmp(cepp->ce_varname, "flat-map")) { + else if (!strcmp(cepp->name, "flat-map")) { CheckDuplicate(cepp, options_flat_map, "options::flat-map"); } - else if (!strcmp(cepp->ce_varname, "show-opermotd")) { + else if (!strcmp(cepp->name, "show-opermotd")) { CheckDuplicate(cepp, options_show_opermotd, "options::show-opermotd"); } - else if (!strcmp(cepp->ce_varname, "identd-check")) { + else if (!strcmp(cepp->name, "identd-check")) { CheckDuplicate(cepp, options_identd_check, "options::identd-check"); } - else if (!strcmp(cepp->ce_varname, "fail-oper-warn")) { + else if (!strcmp(cepp->name, "fail-oper-warn")) { CheckDuplicate(cepp, options_fail_oper_warn, "options::fail-oper-warn"); } - else if (!strcmp(cepp->ce_varname, "show-connect-info")) { + else if (!strcmp(cepp->name, "show-connect-info")) { CheckDuplicate(cepp, options_show_connect_info, "options::show-connect-info"); } - else if (!strcmp(cepp->ce_varname, "no-connect-tls-info")) { + else if (!strcmp(cepp->name, "no-connect-tls-info")) { CheckDuplicate(cepp, options_no_connect_tls_info, "options::no-connect-tls-info"); } - else if (!strcmp(cepp->ce_varname, "dont-resolve")) { + else if (!strcmp(cepp->name, "dont-resolve")) { CheckDuplicate(cepp, options_dont_resolve, "options::dont-resolve"); } - else if (!strcmp(cepp->ce_varname, "mkpasswd-for-everyone")) { + else if (!strcmp(cepp->name, "mkpasswd-for-everyone")) { CheckDuplicate(cepp, options_mkpasswd_for_everyone, "options::mkpasswd-for-everyone"); } - else if (!strcmp(cepp->ce_varname, "allow-insane-bans")) { + else if (!strcmp(cepp->name, "allow-insane-bans")) { CheckDuplicate(cepp, options_allow_insane_bans, "options::allow-insane-bans"); } - else if (!strcmp(cepp->ce_varname, "allow-part-if-shunned")) { + else if (!strcmp(cepp->name, "allow-part-if-shunned")) { CheckDuplicate(cepp, options_allow_part_if_shunned, "options::allow-part-if-shunned"); } - else if (!strcmp(cepp->ce_varname, "disable-cap")) { + else if (!strcmp(cepp->name, "disable-cap")) { CheckDuplicate(cepp, options_disable_cap, "options::disable-cap"); } - else if (!strcmp(cepp->ce_varname, "disable-ipv6")) { + else if (!strcmp(cepp->name, "disable-ipv6")) { CheckDuplicate(cepp, options_disable_ipv6, "options::disable-ipv6"); DISABLE_IPV6 = 1; /* ugly ugly. needs to be done here because at conf runtime is too late. */ } else { - config_error_unknownopt(cepp->ce_fileptr->cf_filename, - cepp->ce_varlinenum, "set::options", - cepp->ce_varname); + config_error_unknownopt(cepp->file->filename, + cepp->line_number, "set::options", + cepp->name); errors++; continue; } } } - else if (!strcmp(cep->ce_varname, "hosts")) { - config_error("%s:%i: set::hosts has been removed in UnrealIRCd 4. You can use oper::vhost now.", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + else if (!strcmp(cep->name, "hosts")) { + config_error("%s:%i: set::hosts has been removed. You can use oper::vhost now.", + cep->file->filename, cep->line_number); errors++; - need_34_upgrade = 1; } - else if (!strcmp(cep->ce_varname, "cloak-keys")) + else if (!strcmp(cep->name, "cloak-keys")) { CheckDuplicate(cep, cloak_keys, "cloak-keys"); for (h = Hooks[HOOKTYPE_CONFIGTEST]; h; h = h->next) @@ -8867,488 +8567,486 @@ int _test_set(ConfigFile *conf, ConfigEntry *ce) errors += errs; } } - else if (!strcmp(cep->ce_varname, "ident")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + else if (!strcmp(cep->name, "ident")) { + for (cepp = cep->items; cepp; cepp = cepp->next) { int is_ok = 0; CheckNull(cepp); - if (!strcmp(cepp->ce_varname, "connect-timeout")) + if (!strcmp(cepp->name, "connect-timeout")) { is_ok = 1; CheckDuplicate(cepp, ident_connect_timeout, "ident::connect-timeout"); } - else if (!strcmp(cepp->ce_varname, "read-timeout")) + else if (!strcmp(cepp->name, "read-timeout")) { is_ok = 1; CheckDuplicate(cepp, ident_read_timeout, "ident::read-timeout"); } if (is_ok) { - int v = config_checkval(cepp->ce_vardata,CFG_TIME); + int v = config_checkval(cepp->value,CFG_TIME); if ((v > 60) || (v < 1)) { config_error("%s:%i: set::ident::%s value out of range (%d), should be between 1 and 60.", - cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum, cepp->ce_varname, v); + cepp->file->filename, cepp->line_number, cepp->name, v); errors++; continue; } } else { - config_error_unknown(cepp->ce_fileptr->cf_filename, - cepp->ce_varlinenum, "set::ident", - cepp->ce_varname); + config_error_unknown(cepp->file->filename, + cepp->line_number, "set::ident", + cepp->name); errors++; continue; } } } - else if (!strcmp(cep->ce_varname, "timesync") || !strcmp(cep->ce_varname, "timesynch")) + else if (!strcmp(cep->name, "timesync") || !strcmp(cep->name, "timesynch")) { config_warn("%s:%i: Timesync support has been removed from UnrealIRCd. " "Please remove any set::timesync blocks you may have.", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); config_warn("Use the time synchronization feature of your OS/distro instead!"); } - else if (!strcmp(cep->ce_varname, "spamfilter")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + else if (!strcmp(cep->name, "spamfilter")) { + for (cepp = cep->items; cepp; cepp = cepp->next) { CheckNull(cepp); - if (!strcmp(cepp->ce_varname, "ban-time")) + if (!strcmp(cepp->name, "ban-time")) { long x; CheckDuplicate(cepp, spamfilter_ban_time, "spamfilter::ban-time"); - x = config_checkval(cepp->ce_vardata,CFG_TIME); + x = config_checkval(cepp->value,CFG_TIME); if ((x < 0) > (x > 2000000000)) { config_error("%s:%i: set::spamfilter:ban-time: value '%ld' out of range", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, x); + cep->file->filename, cep->line_number, x); errors++; continue; } } else - if (!strcmp(cepp->ce_varname, "ban-reason")) + if (!strcmp(cepp->name, "ban-reason")) { CheckDuplicate(cepp, spamfilter_ban_reason, "spamfilter::ban-reason"); } - else if (!strcmp(cepp->ce_varname, "virus-help-channel")) + else if (!strcmp(cepp->name, "virus-help-channel")) { CheckDuplicate(cepp, spamfilter_virus_help_channel, "spamfilter::virus-help-channel"); - if ((cepp->ce_vardata[0] != '#') || (strlen(cepp->ce_vardata) > CHANNELLEN)) + if ((cepp->value[0] != '#') || (strlen(cepp->value) > CHANNELLEN)) { config_error("%s:%i: set::spamfilter:virus-help-channel: " "specified channelname is too long or contains invalid characters (%s)", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - cepp->ce_vardata); + cep->file->filename, cep->line_number, + cepp->value); errors++; continue; } } else - if (!strcmp(cepp->ce_varname, "virus-help-channel-deny")) + if (!strcmp(cepp->name, "virus-help-channel-deny")) { CheckDuplicate(cepp, spamfilter_virus_help_channel_deny, "spamfilter::virus-help-channel-deny"); } else - if (!strcmp(cepp->ce_varname, "except")) + if (!strcmp(cepp->name, "except")) { CheckDuplicate(cepp, spamfilter_except, "spamfilter::except"); } else #ifdef SPAMFILTER_DETECTSLOW - if (!strcmp(cepp->ce_varname, "detect-slow-warn")) + if (!strcmp(cepp->name, "detect-slow-warn")) { } else - if (!strcmp(cepp->ce_varname, "detect-slow-fatal")) + if (!strcmp(cepp->name, "detect-slow-fatal")) { } else #endif - if (!strcmp(cepp->ce_varname, "stop-on-first-match")) + if (!strcmp(cepp->name, "stop-on-first-match")) { } else { - config_error_unknown(cepp->ce_fileptr->cf_filename, - cepp->ce_varlinenum, "set::spamfilter", - cepp->ce_varname); + config_error_unknown(cepp->file->filename, + cepp->line_number, "set::spamfilter", + cepp->name); errors++; continue; } } } -/* TODO: FIX THIS */ - else if (!strcmp(cep->ce_varname, "default-bantime")) + else if (!strcmp(cep->name, "default-bantime")) { long x; CheckDuplicate(cep, default_bantime, "default-bantime"); CheckNull(cep); - x = config_checkval(cep->ce_vardata,CFG_TIME); + x = config_checkval(cep->value,CFG_TIME); if ((x < 0) > (x > 2000000000)) { config_error("%s:%i: set::default-bantime: value '%ld' out of range", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, x); + cep->file->filename, cep->line_number, x); errors++; } } - else if (!strcmp(cep->ce_varname, "ban-version-tkl-time")) { + else if (!strcmp(cep->name, "ban-version-tkl-time")) { long x; CheckDuplicate(cep, ban_version_tkl_time, "ban-version-tkl-time"); CheckNull(cep); - x = config_checkval(cep->ce_vardata,CFG_TIME); + x = config_checkval(cep->value,CFG_TIME); if ((x < 0) > (x > 2000000000)) { config_error("%s:%i: set::ban-version-tkl-time: value '%ld' out of range", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, x); + cep->file->filename, cep->line_number, x); errors++; } } - else if (!strcmp(cep->ce_varname, "min-nick-length")) { + else if (!strcmp(cep->name, "min-nick-length")) { int v; CheckDuplicate(cep, min_nick_length, "min-nick-length"); CheckNull(cep); - v = atoi(cep->ce_vardata); + v = atoi(cep->value); if ((v <= 0) || (v > NICKLEN)) { config_error("%s:%i: set::min-nick-length: value '%d' out of range (should be 1-%d)", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, v, NICKLEN); + cep->file->filename, cep->line_number, v, NICKLEN); errors++; } else nicklengths.min = v; } - else if (!strcmp(cep->ce_varname, "nick-length")) { + else if (!strcmp(cep->name, "nick-length")) { int v; CheckDuplicate(cep, nick_length, "nick-length"); CheckNull(cep); - v = atoi(cep->ce_vardata); + v = atoi(cep->value); if ((v <= 0) || (v > NICKLEN)) { config_error("%s:%i: set::nick-length: value '%d' out of range (should be 1-%d)", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, v, NICKLEN); + cep->file->filename, cep->line_number, v, NICKLEN); errors++; } else nicklengths.max = v; } - else if (!strcmp(cep->ce_varname, "topic-length")) { + else if (!strcmp(cep->name, "topic-length")) { int v; CheckNull(cep); - v = atoi(cep->ce_vardata); + v = atoi(cep->value); if ((v <= 0) || (v > MAXTOPICLEN)) { config_error("%s:%i: set::topic-length: value '%d' out of range (should be 1-%d)", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, v, MAXTOPICLEN); + cep->file->filename, cep->line_number, v, MAXTOPICLEN); errors++; } } - else if (!strcmp(cep->ce_varname, "away-length")) { + else if (!strcmp(cep->name, "away-length")) { int v; CheckNull(cep); - v = atoi(cep->ce_vardata); + v = atoi(cep->value); if ((v <= 0) || (v > MAXAWAYLEN)) { config_error("%s:%i: set::away-length: value '%d' out of range (should be 1-%d)", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, v, MAXAWAYLEN); + cep->file->filename, cep->line_number, v, MAXAWAYLEN); errors++; } } - else if (!strcmp(cep->ce_varname, "kick-length")) { + else if (!strcmp(cep->name, "kick-length")) { int v; CheckNull(cep); - v = atoi(cep->ce_vardata); + v = atoi(cep->value); if ((v <= 0) || (v > MAXKICKLEN)) { config_error("%s:%i: set::kick-length: value '%d' out of range (should be 1-%d)", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, v, MAXKICKLEN); + cep->file->filename, cep->line_number, v, MAXKICKLEN); errors++; } } - else if (!strcmp(cep->ce_varname, "quit-length")) { + else if (!strcmp(cep->name, "quit-length")) { int v; CheckNull(cep); - v = atoi(cep->ce_vardata); + v = atoi(cep->value); if ((v <= 0) || (v > MAXQUITLEN)) { config_error("%s:%i: set::quit-length: value '%d' out of range (should be 1-%d)", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, v, MAXQUITLEN); + cep->file->filename, cep->line_number, v, MAXQUITLEN); errors++; } } - else if (!strcmp(cep->ce_varname, "ssl") || !strcmp(cep->ce_varname, "tls")) { + else if (!strcmp(cep->name, "ssl") || !strcmp(cep->name, "tls")) { test_tlsblock(conf, cep, &errors); } - else if (!strcmp(cep->ce_varname, "plaintext-policy")) + else if (!strcmp(cep->name, "plaintext-policy")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { - if (!strcmp(cepp->ce_varname, "user") || - !strcmp(cepp->ce_varname, "oper") || - !strcmp(cepp->ce_varname, "server")) + if (!strcmp(cepp->name, "user") || + !strcmp(cepp->name, "oper") || + !strcmp(cepp->name, "server")) { Policy policy; CheckNull(cepp); - policy = policy_strtoval(cepp->ce_vardata); + policy = policy_strtoval(cepp->value); if (!policy) { config_error("%s:%i: set::plaintext-policy::%s: needs to be one of: 'allow', 'warn' or 'reject'", - cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum, cepp->ce_varname); + cepp->file->filename, cepp->line_number, cepp->name); errors++; } - } else if (!strcmp(cepp->ce_varname, "user-message") || - !strcmp(cepp->ce_varname, "oper-message")) + } else if (!strcmp(cepp->name, "user-message") || + !strcmp(cepp->name, "oper-message")) { CheckNull(cepp); } else { - config_error_unknown(cepp->ce_fileptr->cf_filename, - cepp->ce_varlinenum, "set::plaintext-policy", - cepp->ce_varname); + config_error_unknown(cepp->file->filename, + cepp->line_number, "set::plaintext-policy", + cepp->name); errors++; continue; } } } - else if (!strcmp(cep->ce_varname, "outdated-tls-policy")) + else if (!strcmp(cep->name, "outdated-tls-policy")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { - if (!strcmp(cepp->ce_varname, "user") || - !strcmp(cepp->ce_varname, "oper") || - !strcmp(cepp->ce_varname, "server")) + if (!strcmp(cepp->name, "user") || + !strcmp(cepp->name, "oper") || + !strcmp(cepp->name, "server")) { Policy policy; CheckNull(cepp); - policy = policy_strtoval(cepp->ce_vardata); + policy = policy_strtoval(cepp->value); if (!policy) { config_error("%s:%i: set::outdated-tls-policy::%s: needs to be one of: 'allow', 'warn' or 'reject'", - cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum, cepp->ce_varname); + cepp->file->filename, cepp->line_number, cepp->name); errors++; } - } else if (!strcmp(cepp->ce_varname, "user-message") || - !strcmp(cepp->ce_varname, "oper-message")) + } else if (!strcmp(cepp->name, "user-message") || + !strcmp(cepp->name, "oper-message")) { CheckNull(cepp); } else { - config_error_unknown(cepp->ce_fileptr->cf_filename, - cepp->ce_varlinenum, "set::outdated-tls-policy", - cepp->ce_varname); + config_error_unknown(cepp->file->filename, + cepp->line_number, "set::outdated-tls-policy", + cepp->name); errors++; continue; } } } - else if (!strcmp(cep->ce_varname, "default-ipv6-clone-mask")) + else if (!strcmp(cep->name, "default-ipv6-clone-mask")) { /* keep this in sync with _test_allow() */ int ipv6mask; - ipv6mask = atoi(cep->ce_vardata); + ipv6mask = atoi(cep->value); if (ipv6mask == 0) { config_error("%s:%d: set::default-ipv6-clone-mask given a value of zero. This cannnot be correct, as it would treat all IPv6 hosts as one host.", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; } if (ipv6mask > 128) { config_error("%s:%d: set::default-ipv6-clone-mask was set to %d. The maximum value is 128.", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, + cep->file->filename, cep->line_number, ipv6mask); errors++; } if (ipv6mask <= 32) { config_warn("%s:%d: set::default-ipv6-clone-mask was given a very small value.", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); } } - else if (!strcmp(cep->ce_varname, "hide-list")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + else if (!strcmp(cep->name, "hide-list")) { + for (cepp = cep->items; cepp; cepp = cepp->next) { - if (!strcmp(cepp->ce_varname, "deny-channel")) + if (!strcmp(cepp->name, "deny-channel")) { } else { - config_error_unknown(cepp->ce_fileptr->cf_filename, - cepp->ce_varlinenum, "set::hide-list", - cepp->ce_varname); + config_error_unknown(cepp->file->filename, + cepp->line_number, "set::hide-list", + cepp->name); errors++; continue; } } } - else if (!strcmp(cep->ce_varname, "max-unknown-connections-per-ip")) { + else if (!strcmp(cep->name, "max-unknown-connections-per-ip")) { int v; CheckNull(cep); - v = atoi(cep->ce_vardata); + v = atoi(cep->value); if (v < 1) { config_error("%s:%i: set::max-unknown-connections-per-ip: value should be at least 1.", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; } } - else if (!strcmp(cep->ce_varname, "handshake-timeout")) { + else if (!strcmp(cep->name, "handshake-timeout")) { int v; CheckNull(cep); - v = config_checkval(cep->ce_vardata, CFG_TIME); + v = config_checkval(cep->value, CFG_TIME); if (v < 5) { config_error("%s:%i: set::handshake-timeout: value should be at least 5 seconds.", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; } } - else if (!strcmp(cep->ce_varname, "sasl-timeout")) { + else if (!strcmp(cep->name, "sasl-timeout")) { int v; CheckNull(cep); - v = config_checkval(cep->ce_vardata, CFG_TIME); + v = config_checkval(cep->value, CFG_TIME); if (v < 5) { config_error("%s:%i: set::sasl-timeout: value should be at least 5 seconds.", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; } } - else if (!strcmp(cep->ce_varname, "handshake-delay")) + else if (!strcmp(cep->name, "handshake-delay")) { int v; CheckNull(cep); - v = config_checkval(cep->ce_vardata, CFG_TIME); + v = config_checkval(cep->value, CFG_TIME); if (v >= 10) { config_error("%s:%i: set::handshake-delay: value should be less than 10 seconds.", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; } } - else if (!strcmp(cep->ce_varname, "ban-include-username")) + else if (!strcmp(cep->name, "ban-include-username")) { config_error("%s:%i: set::ban-include-username is no longer supported. " "Use set { automatic-ban-target userip; }; instead.", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); config_error("See https://www.unrealircd.org/docs/Set_block#set::automatic-ban-target " "for more information and options."); errors++; } - else if (!strcmp(cep->ce_varname, "automatic-ban-target")) + else if (!strcmp(cep->name, "automatic-ban-target")) { CheckNull(cep); - if (!ban_target_strtoval(cep->ce_vardata)) + if (!ban_target_strtoval(cep->value)) { config_error("%s:%i: set::automatic-ban-target: value '%s' is not recognized. " "See https://www.unrealircd.org/docs/Set_block#set::automatic-ban-target", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_vardata); + cep->file->filename, cep->line_number, cep->value); errors++; } } - else if (!strcmp(cep->ce_varname, "manual-ban-target")) + else if (!strcmp(cep->name, "manual-ban-target")) { CheckNull(cep); - if (!ban_target_strtoval(cep->ce_vardata)) + if (!ban_target_strtoval(cep->value)) { config_error("%s:%i: set::manual-ban-target: value '%s' is not recognized. " "See https://www.unrealircd.org/docs/Set_block#set::manual-ban-target", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_vardata); + cep->file->filename, cep->line_number, cep->value); errors++; } } - else if (!strcmp(cep->ce_varname, "reject-message")) + else if (!strcmp(cep->name, "reject-message")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { CheckNull(cepp); - if (!strcmp(cepp->ce_varname, "password-mismatch")) + if (!strcmp(cepp->name, "password-mismatch")) ; - else if (!strcmp(cepp->ce_varname, "too-many-connections")) + else if (!strcmp(cepp->name, "too-many-connections")) ; - else if (!strcmp(cepp->ce_varname, "server-full")) + else if (!strcmp(cepp->name, "server-full")) ; - else if (!strcmp(cepp->ce_varname, "unauthorized")) + else if (!strcmp(cepp->name, "unauthorized")) ; - else if (!strcmp(cepp->ce_varname, "kline")) + else if (!strcmp(cepp->name, "kline")) ; - else if (!strcmp(cepp->ce_varname, "gline")) + else if (!strcmp(cepp->name, "gline")) ; else { - config_error_unknown(cepp->ce_fileptr->cf_filename, - cepp->ce_varlinenum, "set::reject-message", - cepp->ce_varname); + config_error_unknown(cepp->file->filename, + cepp->line_number, "set::reject-message", + cepp->name); errors++; continue; } } } - else if (!strcmp(cep->ce_varname, "topic-setter")) + else if (!strcmp(cep->name, "topic-setter")) { CheckNull(cep); - if (strcmp(cep->ce_vardata, "nick") && strcmp(cep->ce_vardata, "nick-user-host")) + if (strcmp(cep->value, "nick") && strcmp(cep->value, "nick-user-host")) { config_error("%s:%i: set::topic-setter: value should be 'nick' or 'nick-user-host'", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; } } - else if (!strcmp(cep->ce_varname, "ban-setter")) + else if (!strcmp(cep->name, "ban-setter")) { CheckNull(cep); - if (strcmp(cep->ce_vardata, "nick") && strcmp(cep->ce_vardata, "nick-user-host")) + if (strcmp(cep->value, "nick") && strcmp(cep->value, "nick-user-host")) { config_error("%s:%i: set::ban-setter: value should be 'nick' or 'nick-user-host'", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; } } - else if (!strcmp(cep->ce_varname, "ban-setter-sync") || !strcmp(cep->ce_varname, "ban-setter-synch")) + else if (!strcmp(cep->name, "ban-setter-sync") || !strcmp(cep->name, "ban-setter-synch")) { CheckNull(cep); } - else if (!strcmp(cep->ce_varname, "part-instead-of-quit-on-comment-change")) + else if (!strcmp(cep->name, "part-instead-of-quit-on-comment-change")) { CheckNull(cep); } - else if (!strcmp(cep->ce_varname, "broadcast-channel-messages")) + else if (!strcmp(cep->name, "broadcast-channel-messages")) { CheckNull(cep); - if (strcmp(cep->ce_vardata, "auto") && - strcmp(cep->ce_vardata, "always") && - strcmp(cep->ce_vardata, "never")) + if (strcmp(cep->value, "auto") && + strcmp(cep->value, "always") && + strcmp(cep->value, "never")) { config_error("%s:%i: set::broadcast-channel-messages: value should be 'auto', 'always' or 'never'", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; } } - else if (!strcmp(cep->ce_varname, "allowed-channelchars")) + else if (!strcmp(cep->name, "allowed-channelchars")) { CheckNull(cep); - if (!allowed_channelchars_strtoval(cep->ce_vardata)) + if (!allowed_channelchars_strtoval(cep->value)) { config_error("%s:%i: set::allowed-channelchars: value should be one of: 'ascii', 'utf8' or 'any'", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; } } - else if (!strcmp(cep->ce_varname, "hide-idle-time")) + else if (!strcmp(cep->name, "hide-idle-time")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { CheckNull(cepp); - if (!strcmp(cepp->ce_varname, "policy")) + if (!strcmp(cepp->name, "policy")) { - if (!hideidletime_strtoval(cepp->ce_vardata)) + if (!hideidletime_strtoval(cepp->value)) { config_error("%s:%i: set::hide-idle-time::policy: value should be one of: 'never', 'always', 'usermode' or 'oper-usermode'", - cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum); + cepp->file->filename, cepp->line_number); errors++; } } else { - config_error_unknown(cepp->ce_fileptr->cf_filename, - cepp->ce_varlinenum, "set::hide-idle-time", - cepp->ce_varname); + config_error_unknown(cepp->file->filename, + cepp->line_number, "set::hide-idle-time", + cepp->name); errors++; continue; } } - } - else + } else { int used = 0; for (h = Hooks[HOOKTYPE_CONFIGTEST]; h; h = h->next) @@ -9379,8 +9077,8 @@ int _test_set(ConfigFile *conf, ConfigEntry *ce) } if (!used) { config_error("%s:%i: unknown directive set::%s", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - cep->ce_varname); + cep->file->filename, cep->line_number, + cep->name); errors++; } } @@ -9390,44 +9088,25 @@ int _test_set(ConfigFile *conf, ConfigEntry *ce) int _conf_loadmodule(ConfigFile *conf, ConfigEntry *ce) { - char *ret; - if (!ce->ce_vardata) + const char *ret; + if (!ce->value) { config_status("%s:%i: loadmodule without filename", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); return -1; } - if (strstr(ce->ce_vardata, "commands.so") || strstr(ce->ce_vardata, "commands.dll")) - { - config_error("%s:%i: You are trying to load the 'commands' module, this is no longer supported. " - "Fix this by editing your configuration file: remove the loadmodule line for commands and add the following line instead: " - "include \"modules.default.conf\";", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); - need_34_upgrade = 1; - return -1; - } - if (strstr(ce->ce_vardata, "modules/cloak") && !strcmp(conf->cf_filename, "modules.conf")) - { - config_error("You seem to have an include for 'modules.conf'."); - config_error("If you have this because you are upgrading from 3.4-alpha3 to"); - config_error("UnrealIRCd 4 then please change the include \"modules.conf\";"); - config_error("into an include \"modules.default.conf\"; (probably in your"); - config_error("conf/unrealircd.conf). Yeah, we changed the file name."); - // TODO ^: silly win32 wrapping prevents this from being displayed otherwise. PLZ FIX! ! - /* let it continue to load anyway? */ - } - if (is_blacklisted_module(ce->ce_vardata)) + if (is_blacklisted_module(ce->value)) { /* config_warn("%s:%i: Module '%s' is blacklisted, not loading", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum, ce->ce_vardata); */ + ce->file->filename, ce->line_number, ce->value); */ return 1; } - if ((ret = Module_Create(ce->ce_vardata))) { - config_status("%s:%i: loadmodule %s: failed to load: %s", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum, - ce->ce_vardata, ret); + if ((ret = Module_Create(ce->value))) { + config_error("%s:%i: loadmodule %s: failed to load: %s", + ce->file->filename, ce->line_number, + ce->value, ret); return -1; } return 1; @@ -9440,17 +9119,17 @@ int _test_loadmodule(ConfigFile *conf, ConfigEntry *ce) int _test_blacklist_module(ConfigFile *conf, ConfigEntry *ce) { - char *path; + const char *path; ConfigItem_blacklist_module *m; - if (!ce->ce_vardata) + if (!ce->value) { config_status("%s:%i: blacklist-module: no module name given to blacklist", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); return -1; } - path = Module_TransformPath(ce->ce_vardata); + path = Module_TransformPath(ce->value); /* Is it a good idea to warn about this? * Yes, the user may have made a typo, thinking (s)he blacklisted something @@ -9462,20 +9141,20 @@ int _test_blacklist_module(ConfigFile *conf, ConfigEntry *ce) if (!file_exists(path)) { config_warn("%s:%i: blacklist-module for '%s' but module does not exist anyway", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum, ce->ce_vardata); + ce->file->filename, ce->line_number, ce->value); /* fallthrough */ } m = safe_alloc(sizeof(ConfigItem_blacklist_module)); - safe_strdup(m->name, ce->ce_vardata); + safe_strdup(m->name, ce->value); AddListItem(m, conf_blacklist_module); return 0; } -int is_blacklisted_module(char *name) +int is_blacklisted_module(const char *name) { - char *path = Module_TransformPath(name); + const char *path = Module_TransformPath(name); ConfigItem_blacklist_module *m; for (m = conf_blacklist_module; m; m = m->next) @@ -9487,37 +9166,39 @@ int is_blacklisted_module(char *name) void start_listeners(void) { - ConfigItem_listen *listenptr; + ConfigItem_listen *listener; int failed = 0, ports_bound = 0; char boundmsg_ipv4[512], boundmsg_ipv6[512]; + int last_errno = 0; *boundmsg_ipv4 = *boundmsg_ipv6 = '\0'; - for (listenptr = conf_listen; listenptr; listenptr = listenptr->next) + for (listener = conf_listen; listener; listener = listener->next) { /* Try to bind to any ports that are not yet bound and not marked as temporary */ - if (!(listenptr->options & LISTENER_BOUND) && !listenptr->flag.temporary) + if (!(listener->options & LISTENER_BOUND) && !listener->flag.temporary) { - if (add_listener(listenptr) == -1) + if (add_listener(listener) == -1) { - ircd_log(LOG_ERROR, "Failed to bind to %s:%i", listenptr->ip, listenptr->port); + /* Error already printed upstream */ failed = 1; + last_errno = ERRNO; } else { - if (loop.ircd_booted) + if (loop.booted) { - ircd_log(LOG_ERROR, "UnrealIRCd is now also listening on %s:%d (%s)%s", - listenptr->ip, listenptr->port, - listenptr->ipv6 ? "IPv6" : "IPv4", - listenptr->options & LISTENER_TLS ? " (SSL/TLS)" : ""); + unreal_log(ULOG_INFO, "listen", "LISTEN_ADDED", NULL, + "UnrealIRCd is now also listening on $listen_ip:$listen_port", + log_data_string("listen_ip", listener->ip), + log_data_integer("listen_port", listener->port)); } else { - if (listenptr->ipv6) + if (listener->ipv6) snprintf(boundmsg_ipv6+strlen(boundmsg_ipv6), sizeof(boundmsg_ipv6)-strlen(boundmsg_ipv6), - "%s:%d%s, ", listenptr->ip, listenptr->port, - listenptr->options & LISTENER_TLS ? "(SSL/TLS)" : ""); + "%s:%d%s, ", listener->ip, listener->port, + listener->options & LISTENER_TLS ? "(TLS)" : ""); else snprintf(boundmsg_ipv4+strlen(boundmsg_ipv4), sizeof(boundmsg_ipv4)-strlen(boundmsg_ipv4), - "%s:%d%s, ", listenptr->ip, listenptr->port, - listenptr->options & LISTENER_TLS ? "(SSL/TLS)" : ""); + "%s:%d%s, ", listener->ip, listener->port, + listener->options & LISTENER_TLS ? "(TLS)" : ""); } } } @@ -9525,58 +9206,83 @@ void start_listeners(void) /* NOTE: do not merge this with code above (nor in an else block), * as add_listener() affects this flag. */ - if (listenptr->options & LISTENER_BOUND) + if (listener->options & LISTENER_BOUND) ports_bound++; } if (ports_bound == 0) { - ircd_log(LOG_ERROR, "IRCd could not listen on any ports. If you see 'Address already in use' errors " - "above then most likely the IRCd is already running (or something else is using the " - "specified ports). If you are sure the IRCd is not running then verify your " - "listen blocks, maybe you have to bind to a specific IP rather than \"*\"."); +#ifdef _WIN32 + if (last_errno == WSAEADDRINUSE) +#else + if (last_errno == EADDRINUSE) +#endif + { + /* We can be specific */ + unreal_log(ULOG_FATAL, "listen", "ALL_LISTEN_PORTS_FAILED", NULL, + "Unable to listen on any ports. " + "Most likely UnrealIRCd is already running."); + } else { + unreal_log(ULOG_FATAL, "listen", "ALL_LISTEN_PORTS_FAILED", NULL, + "Unable to listen on any ports. " + "Please verify that no other process is using the ports. " + "Also, on some IRCd shells you may have to use listen::bind-ip " + "with a specific IP assigned to you (rather than \"*\")."); + } exit(-1); } - if (failed && !loop.ircd_booted) + if (failed && !loop.booted) { - ircd_log(LOG_ERROR, "Could not listen on all specified addresses/ports. See errors above. " - "Please fix your listen { } blocks and/or make sure no other programs " - "are listening on the same port."); + unreal_log(ULOG_FATAL, "listen", "SOME_LISTEN_PORTS_FAILED", NULL, + "Unable to listen on all ports (some of them succeeded, some of them failed). " + "Please verify that no other process is using the port(s). " + "Also, on some IRCd shells you may have to use listen::bind-ip " + "with a specific IP assigned to you (rather than \"*\")."); exit(-1); } - if (!loop.ircd_booted) + if (!loop.booted) { if (strlen(boundmsg_ipv4) > 2) boundmsg_ipv4[strlen(boundmsg_ipv4)-2] = '\0'; if (strlen(boundmsg_ipv6) > 2) boundmsg_ipv6[strlen(boundmsg_ipv6)-2] = '\0'; - ircd_log(LOG_ERROR, "UnrealIRCd is now listening on the following addresses/ports:"); - ircd_log(LOG_ERROR, "IPv4: %s", *boundmsg_ipv4 ? boundmsg_ipv4 : ""); - ircd_log(LOG_ERROR, "IPv6: %s", *boundmsg_ipv6 ? boundmsg_ipv6 : ""); + if (!*boundmsg_ipv4) + strlcpy(boundmsg_ipv4, "", sizeof(boundmsg_ipv4)); + if (!*boundmsg_ipv6) + strlcpy(boundmsg_ipv6, "", sizeof(boundmsg_ipv6)); + + unreal_log(ULOG_INFO, "listen", "LISTENING", NULL, + "UnrealIRCd is now listening on the following addresses/ports:\n" + "IPv4: $ipv4_port_list\n" + "IPv6: $ipv6_port_list\n", + log_data_string("ipv4_port_list", boundmsg_ipv4), + log_data_string("ipv6_port_list", boundmsg_ipv6)); } } /* Actually use configuration */ -void run_configuration(void) +void config_run(void) { + extcmodes_check_for_changes(); start_listeners(); + free_all_config_resources(); } int _conf_offchans(ConfigFile *conf, ConfigEntry *ce) { ConfigEntry *cep, *cepp; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { ConfigItem_offchans *of = safe_alloc(sizeof(ConfigItem_offchans)); - strlcpy(of->chname, cep->ce_varname, CHANNELLEN+1); - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + strlcpy(of->name, cep->name, CHANNELLEN+1); + for (cepp = cep->items; cepp; cepp = cepp->next) { - if (!strcmp(cepp->ce_varname, "topic")) - safe_strdup(of->topic, cepp->ce_vardata); + if (!strcmp(cepp->name, "topic")) + safe_strdup(of->topic, cepp->value); } AddListItem(of, conf_offchans); } @@ -9588,10 +9294,10 @@ int _test_offchans(ConfigFile *conf, ConfigEntry *ce) int errors = 0; ConfigEntry *cep, *cep2; - if (!ce->ce_entries) + if (!ce->items) { config_error("%s:%i: empty official-channels block", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); return 1; } @@ -9600,45 +9306,45 @@ int _test_offchans(ConfigFile *conf, ConfigEntry *ce) "and then making the channel permanent (MODE #channel +P). " "The channel will then be stored in a database to preserve it between restarts."); - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (strlen(cep->ce_varname) > CHANNELLEN) + if (strlen(cep->name) > CHANNELLEN) { config_error("%s:%i: official-channels: '%s' name too long (max %d characters).", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_varname, CHANNELLEN); + cep->file->filename, cep->line_number, cep->name, CHANNELLEN); errors++; continue; } - if (!valid_channelname(cep->ce_varname)) + if (!valid_channelname(cep->name)) { config_error("%s:%i: official-channels: '%s' is not a valid channel name.", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_varname); + cep->file->filename, cep->line_number, cep->name); errors++; continue; } - for (cep2 = cep->ce_entries; cep2; cep2 = cep2->ce_next) + for (cep2 = cep->items; cep2; cep2 = cep2->next) { - if (!cep2->ce_vardata) + if (!cep2->value) { - config_error_empty(cep2->ce_fileptr->cf_filename, - cep2->ce_varlinenum, "official-channels", - cep2->ce_varname); + config_error_empty(cep2->file->filename, + cep2->line_number, "official-channels", + cep2->name); errors++; continue; } - if (!strcmp(cep2->ce_varname, "topic")) + if (!strcmp(cep2->name, "topic")) { - if (strlen(cep2->ce_vardata) > MAXTOPICLEN) + if (strlen(cep2->value) > MAXTOPICLEN) { config_error("%s:%i: official-channels::%s: topic too long (max %d characters).", - cep2->ce_fileptr->cf_filename, cep2->ce_varlinenum, cep->ce_varname, MAXTOPICLEN); + cep2->file->filename, cep2->line_number, cep->name, MAXTOPICLEN); errors++; continue; } } else { - config_error_unknown(cep2->ce_fileptr->cf_filename, - cep2->ce_varlinenum, "official-channels", - cep2->ce_varname); + config_error_unknown(cep2->file->filename, + cep2->line_number, "official-channels", + cep2->name); errors++; continue; } @@ -9654,70 +9360,70 @@ int _conf_alias(ConfigFile *conf, ConfigEntry *ce) ConfigEntry *cep, *cepp; RealCommand *cmptr; - if ((cmptr = find_command(ce->ce_vardata, CMD_ALIAS))) + if ((cmptr = find_command(ce->value, CMD_ALIAS))) CommandDelX(NULL, cmptr); - if (find_command_simple(ce->ce_vardata)) + if (find_command_simple(ce->value)) { config_warn("%s:%i: Alias '%s' would conflict with command (or server token) '%s', alias not added.", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum, - ce->ce_vardata, ce->ce_vardata); + ce->file->filename, ce->line_number, + ce->value, ce->value); return 0; } - if ((alias = find_alias(ce->ce_vardata))) + if ((alias = find_alias(ce->value))) DelListItem(alias, conf_alias); alias = safe_alloc(sizeof(ConfigItem_alias)); - safe_strdup(alias->alias, ce->ce_vardata); - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + safe_strdup(alias->alias, ce->value); + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "format")) { + if (!strcmp(cep->name, "format")) { format = safe_alloc(sizeof(ConfigItem_alias_format)); - safe_strdup(format->format, cep->ce_vardata); - format->expr = unreal_create_match(MATCH_PCRE_REGEX, cep->ce_vardata, NULL); + safe_strdup(format->format, cep->value); + format->expr = unreal_create_match(MATCH_PCRE_REGEX, cep->value, NULL); if (!format->expr) abort(); /* Impossible due to _test_alias earlier */ - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) { - if (!strcmp(cepp->ce_varname, "nick") || - !strcmp(cepp->ce_varname, "target") || - !strcmp(cepp->ce_varname, "command")) { - safe_strdup(format->nick, cepp->ce_vardata); + for (cepp = cep->items; cepp; cepp = cepp->next) { + if (!strcmp(cepp->name, "nick") || + !strcmp(cepp->name, "target") || + !strcmp(cepp->name, "command")) { + safe_strdup(format->nick, cepp->value); } - else if (!strcmp(cepp->ce_varname, "parameters")) { - safe_strdup(format->parameters, cepp->ce_vardata); + else if (!strcmp(cepp->name, "parameters")) { + safe_strdup(format->parameters, cepp->value); } - else if (!strcmp(cepp->ce_varname, "type")) { - if (!strcmp(cepp->ce_vardata, "services")) + else if (!strcmp(cepp->name, "type")) { + if (!strcmp(cepp->value, "services")) format->type = ALIAS_SERVICES; - else if (!strcmp(cepp->ce_vardata, "stats")) + else if (!strcmp(cepp->value, "stats")) format->type = ALIAS_STATS; - else if (!strcmp(cepp->ce_vardata, "normal")) + else if (!strcmp(cepp->value, "normal")) format->type = ALIAS_NORMAL; - else if (!strcmp(cepp->ce_vardata, "channel")) + else if (!strcmp(cepp->value, "channel")) format->type = ALIAS_CHANNEL; - else if (!strcmp(cepp->ce_vardata, "real")) + else if (!strcmp(cepp->value, "real")) format->type = ALIAS_REAL; } } AddListItem(format, alias->format); } - else if (!strcmp(cep->ce_varname, "nick") || !strcmp(cep->ce_varname, "target")) + else if (!strcmp(cep->name, "nick") || !strcmp(cep->name, "target")) { - safe_strdup(alias->nick, cep->ce_vardata); + safe_strdup(alias->nick, cep->value); } - else if (!strcmp(cep->ce_varname, "type")) { - if (!strcmp(cep->ce_vardata, "services")) + else if (!strcmp(cep->name, "type")) { + if (!strcmp(cep->value, "services")) alias->type = ALIAS_SERVICES; - else if (!strcmp(cep->ce_vardata, "stats")) + else if (!strcmp(cep->value, "stats")) alias->type = ALIAS_STATS; - else if (!strcmp(cep->ce_vardata, "normal")) + else if (!strcmp(cep->value, "normal")) alias->type = ALIAS_NORMAL; - else if (!strcmp(cep->ce_vardata, "channel")) + else if (!strcmp(cep->value, "channel")) alias->type = ALIAS_CHANNEL; - else if (!strcmp(cep->ce_vardata, "command")) + else if (!strcmp(cep->value, "command")) alias->type = ALIAS_COMMAND; } - else if (!strcmp(cep->ce_varname, "spamfilter")) - alias->spamfilter = config_checkval(cep->ce_vardata, CFG_YESNO); + else if (!strcmp(cep->name, "spamfilter")) + alias->spamfilter = config_checkval(cep->value, CFG_YESNO); } if (BadPtr(alias->nick) && alias->type != ALIAS_COMMAND) { safe_strdup(alias->nick, alias->alias); @@ -9735,99 +9441,97 @@ int _test_alias(ConfigFile *conf, ConfigEntry *ce) { char has_type = 0, has_target = 0, has_format = 0; char type = 0; - if (!ce->ce_entries) + if (!ce->items) { config_error("%s:%i: empty alias block", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); return 1; } - if (!ce->ce_vardata) + if (!ce->value) { config_error("%s:%i: alias without name", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); errors++; } - else if (!find_command(ce->ce_vardata, CMD_ALIAS) && find_command(ce->ce_vardata, 0)) { + else if (!find_command(ce->value, CMD_ALIAS) && find_command(ce->value, 0)) { config_status("%s:%i: %s is an existing command, can not add alias", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum, ce->ce_vardata); + ce->file->filename, ce->line_number, ce->value); errors++; } - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { if (config_is_blankorempty(cep, "alias")) { errors++; continue; } - if (!strcmp(cep->ce_varname, "format")) { + if (!strcmp(cep->name, "format")) { char *err = NULL; Match *expr; char has_type = 0, has_target = 0, has_parameters = 0; has_format = 1; - expr = unreal_create_match(MATCH_PCRE_REGEX, cep->ce_vardata, &err); + expr = unreal_create_match(MATCH_PCRE_REGEX, cep->value, &err); if (!expr) { config_error("%s:%i: alias::format contains an invalid regex: %s", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, err); - config_error("Upgrading from 3.2.x to UnrealIRCd 4? Note that regex changed from POSIX Regex " - "to PCRE Regex!"); /* TODO: refer to some url ? */ + cep->file->filename, cep->line_number, err); } else { unreal_delete_match(expr); } - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) { + for (cepp = cep->items; cepp; cepp = cepp->next) { if (config_is_blankorempty(cepp, "alias::format")) { errors++; continue; } - if (!strcmp(cepp->ce_varname, "nick") || - !strcmp(cepp->ce_varname, "command") || - !strcmp(cepp->ce_varname, "target")) + if (!strcmp(cepp->name, "nick") || + !strcmp(cepp->name, "command") || + !strcmp(cepp->name, "target")) { if (has_target) { - config_warn_duplicate(cepp->ce_fileptr->cf_filename, - cepp->ce_varlinenum, + config_warn_duplicate(cepp->file->filename, + cepp->line_number, "alias::format::target"); continue; } has_target = 1; } - else if (!strcmp(cepp->ce_varname, "type")) + else if (!strcmp(cepp->name, "type")) { if (has_type) { - config_warn_duplicate(cepp->ce_fileptr->cf_filename, - cepp->ce_varlinenum, + config_warn_duplicate(cepp->file->filename, + cepp->line_number, "alias::format::type"); continue; } has_type = 1; - if (!strcmp(cepp->ce_vardata, "services")) + if (!strcmp(cepp->value, "services")) ; - else if (!strcmp(cepp->ce_vardata, "stats")) + else if (!strcmp(cepp->value, "stats")) ; - else if (!strcmp(cepp->ce_vardata, "normal")) + else if (!strcmp(cepp->value, "normal")) ; - else if (!strcmp(cepp->ce_vardata, "channel")) + else if (!strcmp(cepp->value, "channel")) ; - else if (!strcmp(cepp->ce_vardata, "real")) + else if (!strcmp(cepp->value, "real")) ; else { config_error("%s:%i: unknown alias type", - cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum); + cepp->file->filename, cepp->line_number); errors++; } } - else if (!strcmp(cepp->ce_varname, "parameters")) + else if (!strcmp(cepp->name, "parameters")) { if (has_parameters) { - config_warn_duplicate(cepp->ce_fileptr->cf_filename, - cepp->ce_varlinenum, + config_warn_duplicate(cepp->file->filename, + cepp->line_number, "alias::format::parameters"); continue; } @@ -9835,89 +9539,89 @@ int _test_alias(ConfigFile *conf, ConfigEntry *ce) { } else { - config_error_unknown(cepp->ce_fileptr->cf_filename, - cepp->ce_varlinenum, "alias::format", - cepp->ce_varname); + config_error_unknown(cepp->file->filename, + cepp->line_number, "alias::format", + cepp->name); errors++; } } if (!has_target) { - config_error_missing(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "alias::format::target"); + config_error_missing(cep->file->filename, + cep->line_number, "alias::format::target"); errors++; } if (!has_type) { - config_error_missing(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "alias::format::type"); + config_error_missing(cep->file->filename, + cep->line_number, "alias::format::type"); errors++; } if (!has_parameters) { - config_error_missing(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "alias::format::parameters"); + config_error_missing(cep->file->filename, + cep->line_number, "alias::format::parameters"); errors++; } } - else if (!strcmp(cep->ce_varname, "nick") || !strcmp(cep->ce_varname, "target")) + else if (!strcmp(cep->name, "nick") || !strcmp(cep->name, "target")) { if (has_target) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "alias::target"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "alias::target"); continue; } has_target = 1; } - else if (!strcmp(cep->ce_varname, "type")) { + else if (!strcmp(cep->name, "type")) { if (has_type) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "alias::type"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "alias::type"); continue; } has_type = 1; - if (!strcmp(cep->ce_vardata, "services")) + if (!strcmp(cep->value, "services")) ; - else if (!strcmp(cep->ce_vardata, "stats")) + else if (!strcmp(cep->value, "stats")) ; - else if (!strcmp(cep->ce_vardata, "normal")) + else if (!strcmp(cep->value, "normal")) ; - else if (!strcmp(cep->ce_vardata, "channel")) + else if (!strcmp(cep->value, "channel")) ; - else if (!strcmp(cep->ce_vardata, "command")) + else if (!strcmp(cep->value, "command")) type = 'c'; else { config_error("%s:%i: unknown alias type", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; } } - else if (!strcmp(cep->ce_varname, "spamfilter")) + else if (!strcmp(cep->name, "spamfilter")) ; else { - config_error_unknown(cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - "alias", cep->ce_varname); + config_error_unknown(cep->file->filename, cep->line_number, + "alias", cep->name); errors++; } } if (!has_type) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "alias::type"); errors++; } if (!has_format && type == 'c') { config_error("%s:%d: alias::type is 'command' but no alias::format was specified", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); errors++; } else if (has_format && type != 'c') { config_error("%s:%d: alias::format specified when type is not 'command'", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); errors++; } return errors; @@ -9927,11 +9631,11 @@ int _conf_deny(ConfigFile *conf, ConfigEntry *ce) { Hook *h; - if (!strcmp(ce->ce_vardata, "channel")) + if (!strcmp(ce->value, "channel")) _conf_deny_channel(conf, ce); - else if (!strcmp(ce->ce_vardata, "link")) + else if (!strcmp(ce->value, "link")) _conf_deny_link(conf, ce); - else if (!strcmp(ce->ce_vardata, "version")) + else if (!strcmp(ce->value, "version")) _conf_deny_version(conf, ce); else { @@ -9953,29 +9657,29 @@ int _conf_deny_channel(ConfigFile *conf, ConfigEntry *ce) ConfigEntry *cep; deny = safe_alloc(sizeof(ConfigItem_deny_channel)); - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "channel")) + if (!strcmp(cep->name, "channel")) { - safe_strdup(deny->channel, cep->ce_vardata); + safe_strdup(deny->channel, cep->value); } - else if (!strcmp(cep->ce_varname, "redirect")) + else if (!strcmp(cep->name, "redirect")) { - safe_strdup(deny->redirect, cep->ce_vardata); + safe_strdup(deny->redirect, cep->value); } - else if (!strcmp(cep->ce_varname, "reason")) + else if (!strcmp(cep->name, "reason")) { - safe_strdup(deny->reason, cep->ce_vardata); + safe_strdup(deny->reason, cep->value); } - else if (!strcmp(cep->ce_varname, "warn")) + else if (!strcmp(cep->name, "warn")) { - deny->warn = config_checkval(cep->ce_vardata,CFG_YESNO); + deny->warn = config_checkval(cep->value,CFG_YESNO); } - else if (!strcmp(cep->ce_varname, "class")) + else if (!strcmp(cep->name, "class")) { - safe_strdup(deny->class, cep->ce_vardata); + safe_strdup(deny->class, cep->value); } - else if (!strcmp(cep->ce_varname, "mask")) + else if (!strcmp(cep->name, "mask")) { unreal_add_masks(&deny->mask, cep); } @@ -9989,21 +9693,21 @@ int _conf_deny_link(ConfigFile *conf, ConfigEntry *ce) ConfigEntry *cep; deny = safe_alloc(sizeof(ConfigItem_deny_link)); - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "mask")) + if (!strcmp(cep->name, "mask")) { - safe_strdup(deny->mask, cep->ce_vardata); + unreal_add_masks(&deny->mask, cep); } - else if (!strcmp(cep->ce_varname, "rule")) + else if (!strcmp(cep->name, "rule")) { - deny->rule = (char *)crule_parse(cep->ce_vardata); - safe_strdup(deny->prettyrule, cep->ce_vardata); + deny->rule = (char *)crule_parse(cep->value); + safe_strdup(deny->prettyrule, cep->value); } - else if (!strcmp(cep->ce_varname, "type")) { - if (!strcmp(cep->ce_vardata, "all")) + else if (!strcmp(cep->name, "type")) { + if (!strcmp(cep->value, "all")) deny->flag.type = CRULE_ALL; - else if (!strcmp(cep->ce_vardata, "auto")) + else if (!strcmp(cep->value, "auto")) deny->flag.type = CRULE_AUTO; } } @@ -10017,19 +9721,19 @@ int _conf_deny_version(ConfigFile *conf, ConfigEntry *ce) ConfigEntry *cep; deny = safe_alloc(sizeof(ConfigItem_deny_version)); - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "mask")) + if (!strcmp(cep->name, "mask")) { - safe_strdup(deny->mask, cep->ce_vardata); + safe_strdup(deny->mask, cep->value); } - else if (!strcmp(cep->ce_varname, "version")) + else if (!strcmp(cep->name, "version")) { - safe_strdup(deny->version, cep->ce_vardata); + safe_strdup(deny->version, cep->value); } - else if (!strcmp(cep->ce_varname, "flags")) + else if (!strcmp(cep->name, "flags")) { - safe_strdup(deny->flags, cep->ce_vardata); + safe_strdup(deny->flags, cep->value); } } AddListItem(deny, conf_deny_version); @@ -10042,241 +9746,253 @@ int _test_deny(ConfigFile *conf, ConfigEntry *ce) int errors = 0; Hook *h; - if (!ce->ce_vardata) + if (!ce->value) { config_error("%s:%i: deny without type", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); return 1; } - if (!strcmp(ce->ce_vardata, "channel")) + if (!strcmp(ce->value, "channel")) { char has_channel = 0, has_warn = 0, has_reason = 0, has_redirect = 0, has_class = 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { if (config_is_blankorempty(cep, "deny channel")) { errors++; continue; } - if (!strcmp(cep->ce_varname, "channel")) + if (!strcmp(cep->name, "channel")) { if (has_channel) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "deny channel::channel"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "deny channel::channel"); continue; } has_channel = 1; } - else if (!strcmp(cep->ce_varname, "redirect")) + else if (!strcmp(cep->name, "redirect")) { if (has_redirect) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "deny channel::redirect"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "deny channel::redirect"); continue; } has_redirect = 1; } - else if (!strcmp(cep->ce_varname, "reason")) + else if (!strcmp(cep->name, "reason")) { if (has_reason) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "deny channel::reason"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "deny channel::reason"); continue; } has_reason = 1; } - else if (!strcmp(cep->ce_varname, "warn")) + else if (!strcmp(cep->name, "warn")) { if (has_warn) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "deny channel::warn"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "deny channel::warn"); continue; } has_warn = 1; } - else if (!strcmp(cep->ce_varname, "class")) + else if (!strcmp(cep->name, "class")) { if (has_class) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "deny channel::class"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "deny channel::class"); continue; } has_class = 1; } - else if (!strcmp(cep->ce_varname, "mask")) + else if (!strcmp(cep->name, "mask")) { } else { - config_error_unknown(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "deny channel", cep->ce_varname); + config_error_unknown(cep->file->filename, + cep->line_number, "deny channel", cep->name); errors++; } } if (!has_channel) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "deny channel::channel"); errors++; } if (!has_reason) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "deny channel::reason"); errors++; } } - else if (!strcmp(ce->ce_vardata, "link")) + else if (!strcmp(ce->value, "link")) { char has_mask = 0, has_rule = 0, has_type = 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (config_is_blankorempty(cep, "deny link")) + if (!cep->items) { - errors++; - continue; - } - if (!strcmp(cep->ce_varname, "mask")) - { - if (has_mask) + if (config_is_blankorempty(cep, "deny link")) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "deny link::mask"); - continue; - } - has_mask = 1; - } - else if (!strcmp(cep->ce_varname, "rule")) - { - int val = 0; - if (has_rule) - { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "deny link::rule"); - continue; - } - has_rule = 1; - if ((val = crule_test(cep->ce_vardata))) - { - config_error("%s:%i: deny link::rule contains an invalid expression: %s", - cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, - crule_errstring(val)); errors++; - } - } - else if (!strcmp(cep->ce_varname, "type")) - { - if (has_type) - { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "deny link::type"); continue; } - has_type = 1; - if (!strcmp(cep->ce_vardata, "auto")) - ; - else if (!strcmp(cep->ce_vardata, "all")) - ; - else { - config_status("%s:%i: unknown deny link type", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + else if (!strcmp(cep->name, "mask")) + { + has_mask = 1; + } else if (!strcmp(cep->name, "rule")) + { + int val = 0; + if (has_rule) + { + config_warn_duplicate(cep->file->filename, + cep->line_number, "deny link::rule"); + continue; + } + has_rule = 1; + if ((val = crule_test(cep->value))) + { + config_error("%s:%i: deny link::rule contains an invalid expression: %s", + cep->file->filename, + cep->line_number, + crule_errstring(val)); + errors++; + } + } + else if (!strcmp(cep->name, "type")) + { + if (has_type) + { + config_warn_duplicate(cep->file->filename, + cep->line_number, "deny link::type"); + continue; + } + has_type = 1; + if (!strcmp(cep->value, "auto")) + ; + else if (!strcmp(cep->value, "all")) + ; + else { + config_status("%s:%i: unknown deny link type", + cep->file->filename, cep->line_number); + errors++; + } + } + else + { + config_error_unknown(cep->file->filename, + cep->line_number, "deny link", cep->name); errors++; } } else { - config_error_unknown(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "deny link", cep->ce_varname); - errors++; + // Sections + if (!strcmp(cep->name, "mask")) + { + if (cep->value || cep->items) + has_mask = 1; + } + else + { + config_error_unknown(cep->file->filename, + cep->line_number, "deny link", cep->name); + errors++; + continue; + } } } if (!has_mask) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "deny link::mask"); errors++; } if (!has_rule) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "deny link::rule"); errors++; } if (!has_type) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "deny link::type"); errors++; } } - else if (!strcmp(ce->ce_vardata, "version")) + else if (!strcmp(ce->value, "version")) { char has_mask = 0, has_version = 0, has_flags = 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { if (config_is_blankorempty(cep, "deny version")) { errors++; continue; } - if (!strcmp(cep->ce_varname, "mask")) + if (!strcmp(cep->name, "mask")) { if (has_mask) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "deny version::mask"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "deny version::mask"); continue; } has_mask = 1; } - else if (!strcmp(cep->ce_varname, "version")) + else if (!strcmp(cep->name, "version")) { if (has_version) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "deny version::version"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "deny version::version"); continue; } has_version = 1; } - else if (!strcmp(cep->ce_varname, "flags")) + else if (!strcmp(cep->name, "flags")) { if (has_flags) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "deny version::flags"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "deny version::flags"); continue; } has_flags = 1; } else { - config_error_unknown(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "deny version", cep->ce_varname); + config_error_unknown(cep->file->filename, + cep->line_number, "deny version", cep->name); errors++; } } if (!has_mask) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "deny version::mask"); errors++; } if (!has_version) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "deny version::version"); errors++; } if (!has_flags) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "deny version::flags"); errors++; } @@ -10312,8 +10028,8 @@ int _test_deny(ConfigFile *conf, ConfigEntry *ce) } if (!used) { config_error("%s:%i: unknown deny type %s", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum, - ce->ce_vardata); + ce->file->filename, ce->line_number, + ce->value); return 1; } return errors; @@ -10327,59 +10043,62 @@ int _test_security_group(ConfigFile *conf, ConfigEntry *ce) int errors = 0; ConfigEntry *cep; - if (!ce->ce_vardata) + if (!ce->value) { config_error("%s:%i: security-group block needs a name, eg: security-group web-users {", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); errors++; } else { - if (!strcasecmp(ce->ce_vardata, "unknown-users")) + if (!strcasecmp(ce->value, "unknown-users")) { config_error("%s:%i: The 'unknown-users' group is a special group that is the " "inverse of 'known-users', you cannot create or adjust it in the " "config file, as it is created automatically by UnrealIRCd.", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); errors++; return errors; } - if (!security_group_valid_name(ce->ce_vardata)) + if (!security_group_valid_name(ce->value)) { config_error("%s:%i: security-group block name '%s' contains invalid characters or is too long. " "Only letters, numbers, underscore and hyphen are allowed.", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum, ce->ce_vardata); + ce->file->filename, ce->line_number, ce->value); errors++; } } - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "webirc")) + if (!strcmp(cep->name, "webirc")) { CheckNull(cep); } else - if (!strcmp(cep->ce_varname, "identified")) + if (!strcmp(cep->name, "identified")) { CheckNull(cep); } else - if (!strcmp(cep->ce_varname, "tls")) + if (!strcmp(cep->name, "tls")) { CheckNull(cep); } else - if (!strcmp(cep->ce_varname, "reputation-score")) + if (!strcmp(cep->name, "reputation-score")) { int v; CheckNull(cep); - v = atoi(cep->ce_vardata); + v = atoi(cep->value); if ((v < 1) || (v > 10000)) { config_error("%s:%i: security-group::reputation-score needs to be a value of 1-10000", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; } } else + if (!strcmp(cep->name, "include-mask")) { - config_error_unknown(cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - "security-group", cep->ce_varname); + } else + { + config_error_unknown(cep->file->filename, cep->line_number, + "security-group", cep->name); errors++; continue; } @@ -10391,29 +10110,33 @@ int _test_security_group(ConfigFile *conf, ConfigEntry *ce) int _conf_security_group(ConfigFile *conf, ConfigEntry *ce) { ConfigEntry *cep; - SecurityGroup *s = add_security_group(ce->ce_vardata, 1); + SecurityGroup *s = add_security_group(ce->value, 1); - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "webirc")) - s->webirc = config_checkval(cep->ce_vardata, CFG_YESNO); - else if (!strcmp(cep->ce_varname, "identified")) - s->identified = config_checkval(cep->ce_vardata, CFG_YESNO); - else if (!strcmp(cep->ce_varname, "tls")) - s->tls = config_checkval(cep->ce_vardata, CFG_YESNO); - else if (!strcmp(cep->ce_varname, "reputation-score")) - s->reputation_score = atoi(cep->ce_vardata); - else if (!strcmp(cep->ce_varname, "priority")) + if (!strcmp(cep->name, "webirc")) + s->webirc = config_checkval(cep->value, CFG_YESNO); + else if (!strcmp(cep->name, "identified")) + s->identified = config_checkval(cep->value, CFG_YESNO); + else if (!strcmp(cep->name, "tls")) + s->tls = config_checkval(cep->value, CFG_YESNO); + else if (!strcmp(cep->name, "reputation-score")) + s->reputation_score = atoi(cep->value); + else if (!strcmp(cep->name, "priority")) { - s->priority = atoi(cep->ce_vardata); + s->priority = atoi(cep->value); DelListItem(s, securitygroups); AddListItemPrio(s, securitygroups, s->priority); } + else if (!strcmp(cep->name, "include-mask")) + { + unreal_add_masks(&s->include_mask, cep); + } } return 1; } -Secret *find_secret(char *secret_name) +Secret *find_secret(const char *secret_name) { Secret *s; for (s = secrets; s; s = s->next) @@ -10444,7 +10167,7 @@ void free_secret(Secret *s) safe_free(s); } -char *_conf_secret_read_password_file(char *fname) +char *_conf_secret_read_password_file(const char *fname) { char *pwd, *err; int fd, n; @@ -10482,7 +10205,7 @@ char *_conf_secret_read_password_file(char *fname) return pwd; } -char *_conf_secret_read_prompt(char *blockname) +char *_conf_secret_read_prompt(const char *blockname) { char *pwd, *pwd_prompt; char buf[256]; @@ -10513,54 +10236,54 @@ int _test_secret(ConfigFile *conf, ConfigEntry *ce) char *err; Secret *existing; - if (!ce->ce_vardata) + if (!ce->value) { config_error("%s:%i: secret block needs a name, eg: secret xyz {", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); errors++; - return errors; /* need to return here since we dereference ce->ce_vardata later.. */ + return errors; /* need to return here since we dereference ce->value later.. */ } else { - if (!security_group_valid_name(ce->ce_vardata)) + if (!security_group_valid_name(ce->value)) { config_error("%s:%i: secret block name '%s' contains invalid characters or is too long. " "Only letters, numbers, underscore and hyphen are allowed.", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum, ce->ce_vardata); + ce->file->filename, ce->line_number, ce->value); errors++; } } - existing = find_secret(ce->ce_vardata); + existing = find_secret(ce->value); - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "password")) + if (!strcmp(cep->name, "password")) { int n; has_password = 1; CheckNull(cep); - if (cep->ce_entries || - (((n = Auth_AutoDetectHashType(cep->ce_vardata))) && ((n == AUTHTYPE_BCRYPT) || (n == AUTHTYPE_ARGON2)))) + if (cep->items || + (((n = Auth_AutoDetectHashType(cep->value))) && ((n == AUTHTYPE_BCRYPT) || (n == AUTHTYPE_ARGON2)))) { config_error("%s:%d: you cannot use hashed passwords here, see " "https://www.unrealircd.org/docs/Secret_block#secret-plaintext", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; continue; } - if (!valid_secret_password(cep->ce_vardata, &err)) + if (!valid_secret_password(cep->value, &err)) { config_error("%s:%d: secret::password does not meet password complexity requirements: %s", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, err); + cep->file->filename, cep->line_number, err); errors++; } } else - if (!strcmp(cep->ce_varname, "password-file")) + if (!strcmp(cep->name, "password-file")) { char *str; has_password_file = 1; CheckNull(cep); - convert_to_absolute_path(&cep->ce_vardata, CONFDIR); - if (!file_exists(cep->ce_vardata) && existing && existing->password) + convert_to_absolute_path(&cep->value, CONFDIR); + if (!file_exists(cep->value) && existing && existing->password) { /* Silently ignore the case where a secret block already * has the password read and now the file is no longer available. @@ -10569,59 +10292,59 @@ int _test_secret(ConfigFile *conf, ConfigEntry *ce) */ } else { - str = _conf_secret_read_password_file(cep->ce_vardata); + str = _conf_secret_read_password_file(cep->value); if (!str) { config_error("%s:%d: secret::password-file: error reading password from file, see error from above.", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; } safe_free_sensitive(str); } } else - if (!strcmp(cep->ce_varname, "password-prompt")) + if (!strcmp(cep->name, "password-prompt")) { #ifdef _WIN32 config_error("%s:%d: secret::password-prompt is not implemented in Windows at the moment, sorry!", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); config_error("Choose a different method to enter passwords or use *NIX"); errors++; return errors; #endif has_password_prompt = 1; - if (loop.ircd_booted && !find_secret(ce->ce_vardata)) + if (loop.booted && !find_secret(ce->value)) { config_error("%s:%d: you cannot add a new secret { } block that uses password-prompt and then /REHASH. " "With 'password-prompt' you can only add such a password on boot.", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); config_error("Either use a different method to enter passwords or restart the IRCd on the console."); errors++; } - if (!loop.ircd_booted && !running_interactively()) + if (!loop.booted && !running_interactively()) { config_error("ERROR: IRCd is not running interactively, but via a cron job or something similar."); config_error("%s:%d: unable to prompt for password since IRCd is not started in a terminal", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); config_error("Either use a different method to enter passwords or start the IRCd in a terminal/SSH/.."); } } else - if (!strcmp(cep->ce_varname, "password-url")) + if (!strcmp(cep->name, "password-url")) { config_error("%s:%d: secret::password-url is not supported yet in this UnrealIRCd version.", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; } else { - config_error_unknown(cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - "secret", cep->ce_varname); + config_error_unknown(cep->file->filename, cep->line_number, + "secret", cep->name); errors++; continue; } - if (cep->ce_entries) + if (cep->items) { config_error("%s:%d: secret::%s does not support sub-options (%s)", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - cep->ce_varname, cep->ce_entries->ce_varname); + cep->file->filename, cep->line_number, + cep->name, cep->items->name); errors++; } } @@ -10629,7 +10352,7 @@ int _test_secret(ConfigFile *conf, ConfigEntry *ce) if (!has_password && !has_password_file && !has_password_prompt) { config_error("%s:%d: secret { } block must contain 1 of: password OR password-file OR password-prompt", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); errors++; } @@ -10645,21 +10368,21 @@ int _conf_secret(ConfigFile *conf, ConfigEntry *ce) { ConfigEntry *cep; Secret *s; - Secret *existing = find_secret(ce->ce_vardata); + Secret *existing = find_secret(ce->value); s = safe_alloc(sizeof(Secret)); - safe_strdup(s->name, ce->ce_vardata); + safe_strdup(s->name, ce->value); - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "password")) + if (!strcmp(cep->name, "password")) { - safe_strdup_sensitive(s->password, cep->ce_vardata); - destroy_string(cep->ce_vardata); /* destroy the original */ + safe_strdup_sensitive(s->password, cep->value); + destroy_string(cep->value); /* destroy the original */ } else - if (!strcmp(cep->ce_varname, "password-file")) + if (!strcmp(cep->name, "password-file")) { - if (!file_exists(cep->ce_vardata) && existing && existing->password) + if (!file_exists(cep->value) && existing && existing->password) { /* Silently ignore the case where a secret block already * has the password read and now the file is no longer available. @@ -10668,14 +10391,14 @@ int _conf_secret(ConfigFile *conf, ConfigEntry *ce) */ } else { - s->password = _conf_secret_read_password_file(cep->ce_vardata); + s->password = _conf_secret_read_password_file(cep->value); } } else - if (!strcmp(cep->ce_varname, "password-prompt")) + if (!strcmp(cep->name, "password-prompt")) { - if (!loop.ircd_booted && running_interactively()) + if (!loop.booted && running_interactively()) { - s->password = _conf_secret_read_prompt(ce->ce_vardata); + s->password = _conf_secret_read_prompt(ce->value); if (!s->password || !valid_secret_password(s->password, NULL)) { config_error("Invalid password entered on console (does not meet complexity requirements)"); @@ -10713,150 +10436,128 @@ int _conf_secret(ConfigFile *conf, ConfigEntry *ce) return 1; } -#ifdef USE_LIBCURL -static void conf_download_complete(const char *url, const char *file, const char *errorbuf, int cached, void *inc_key) +void resource_download_complete(const char *url, const char *file, const char *errorbuf, int cached, void *rs_key) { - ConfigItem_include *inc; + ConfigResource *rs = (ConfigResource *)rs_key; - if (!loop.ircd_rehashing) - return; + rs->type &= ~RESOURCE_DLQUEUED; - /* - use inc_key to find the correct include block. This - should be cheaper than using the full URL. - */ - for (inc = conf_include; inc; inc = inc->next) - { - if ( inc_key != (void *)inc ) - continue; - if (!(inc->flag.type & INCLUDE_REMOTE)) - continue; - if (inc->flag.type & INCLUDE_NOTLOADED) - continue; - if (strcasecmp(url, inc->url)) - continue; - - inc->flag.type &= ~INCLUDE_DLQUEUED; - break; - } - if (!inc) - { - ircd_log(LOG_ERROR, "Downloaded remote include which matches no include statement."); - return; - } + if (config_verbose) + config_status("resource_download_complete() for %s [%s]", url, errorbuf?errorbuf:"success"); if (!file && !cached) - update_remote_include(inc, file, 0, errorbuf); /* DOWNLOAD FAILED */ + { + /* DOWNLOAD FAILED */ + if (rs->cache_file) + { + unreal_log(ULOG_ERROR, "config", "DOWNLOAD_FAILED_SOFT", NULL, + "$file:$line_number: Failed to download '$url': $error_message\n" + "Using a cached copy instead.", + log_data_string("file", rs->wce->ce->file->filename), + log_data_integer("line_number", rs->wce->ce->line_number), + log_data_string("url", displayurl(url)), + log_data_string("error_message", errorbuf)); + safe_strdup(rs->file, rs->cache_file); + } else { + unreal_log(ULOG_ERROR, "config", "DOWNLOAD_FAILED_HARD", NULL, + "$file:$line_number: Failed to download '$url': $error_message", + log_data_string("file", rs->wce->ce->file->filename), + log_data_integer("line_number", rs->wce->ce->line_number), + log_data_string("url", displayurl(url)), + log_data_string("error_message", errorbuf)); + /* Set error condition, this so config_read_file() later will stop. */ + loop.config_load_failed = 1; + /* We keep the other transfers running since they may raise (more) errors. + * Which can be helpful so you can differentiate between an error of an + * include on one server, or complete lack of internet connectvitity. + */ + } + } else { - char *urlfile = url_getfilename(url); - char *file_basename = unreal_getfilename(urlfile); - char *tmp = unreal_mktemp(TMPDIR, file_basename ? file_basename : "download.conf"); - safe_free(urlfile); - if (cached) { - unreal_copyfileex(inc->file, tmp, 1); - unreal_copyfileex(inc->file, unreal_mkcache(url), 0); - update_remote_include(inc, tmp, 0, NULL); + /* Copy from cache */ + safe_strdup(rs->file, rs->cache_file); + } else { + /* Copy to cache */ + const char *cache_file = unreal_mkcache(url); + unreal_copyfileex(file, cache_file, 1); + safe_strdup(rs->file, cache_file); } - else + } + + if (rs->file) + { + if (rs->type & RESOURCE_INCLUDE) { - /* - copy/hardlink file to another file because our caller will - remove(file). - */ - unreal_copyfileex(file, tmp, 1); - update_remote_include(inc, tmp, 0, NULL); - unreal_copyfileex(file, unreal_mkcache(url), 0); + if (config_read_file(rs->file, (char *)displayurl(rs->url)) < 0) + loop.config_load_failed = 1; + } else { + ConfigEntryWrapper *wce; + for (wce = rs->wce; wce; wce = wce->next) + safe_strdup(wce->ce->value, rs->file); // now information of url is lost, hm!! } } - for (inc = conf_include; inc; inc = inc->next) - { - if (inc->flag.type & INCLUDE_DLQUEUED) - return; - } - rehash_internal(loop.rehash_save_client, loop.rehash_save_sig); -} -#endif -int rehash(Client *client, int sig) + /* If rehashing, check if we are done. + * If booting (not rehashing), this is done from the + * startup loop where it also checks is_config_read_finished(). + */ + if (loop.rehashing && is_config_read_finished()) + rehash_internal(loop.rehash_save_client); +} + +/** Request to REHASH the configuration file. + * There is no guarantee that the request will be done immediately + * (eg: it won't in case of remote includes). + * @param client The client requesting the /REHASH. + * If this is NULL then the rehash was requested + * via a signal to the process or GUI. + */ +void request_rehash(Client *client) { -#ifdef USE_LIBCURL - ConfigItem_include *inc; - char found_remote = 0; - if (loop.ircd_rehashing) + if (loop.rehashing) { - if (!sig) + if (client) sendnotice(client, "A rehash is already in progress"); - return 0; + return; } - /* Log who or what did the rehash: */ - if (sig) - { - ircd_log(LOG_ERROR, "Rehashing configuration file (SIGHUP signal received)"); - } else - if (client && client->user) - { - ircd_log(LOG_ERROR, "Rehashing configuration file (requested by %s!%s@%s)", - client->name, client->user->username, client->user->realhost); - } else - if (client) - { - ircd_log(LOG_ERROR, "Rehashing configuration file (requested by %s)", - client->name); - } - - loop.ircd_rehashing = 1; + loop.rehashing = 1; loop.rehash_save_client = client; - loop.rehash_save_sig = sig; - for (inc = conf_include; inc; inc = inc->next) + config_read_start(); + /* If we already have everything, then can we proceed with the rehash */ + if (is_config_read_finished()) { - time_t modtime; - if (!(inc->flag.type & INCLUDE_REMOTE)) - continue; - - if (inc->flag.type & INCLUDE_NOTLOADED) - continue; - found_remote = 1; - modtime = unreal_getfilemodtime(inc->file); - inc->flag.type |= INCLUDE_DLQUEUED; - - /* - use (void *)inc as the key for finding which - include block conf_download_complete() should use. - */ - download_file_async(inc->url, modtime, conf_download_complete, (void *)inc); + rehash_internal(client); + return; } - if (!found_remote) - return rehash_internal(client, sig); - return 0; -#else - loop.ircd_rehashing = 1; - return rehash_internal(client, sig); -#endif + /* Otherwise, I/O events will take care of it later + * after all remote includes have been downloaded. + */ } -int rehash_internal(Client *client, int sig) +int rehash_internal(Client *client) { - if (sig == 1) - sendto_ops("Got signal SIGHUP, reloading %s file", configfile); - loop.ircd_rehashing = 1; /* double checking.. */ - if (init_conf(configfile, 1) == 0) - run_configuration(); - if (sig == 1) - reread_motdsandrules(); - unload_all_unused_snomasks(); + /* Log it here if it is by a signal */ + if (client == NULL) + unreal_log(ULOG_INFO, "config", "CONFIG_RELOAD", client, "Rehashing server configuration file [./unrealircd rehash]"); + + loop.rehashing = 1; /* double checking.. */ + + if (config_test() == 0) + config_run(); + /* TODO: uh.. are we supposed to do all this for a failed rehash too? maybe some but not all? */ + reread_motdsandrules(); unload_all_unused_umodes(); unload_all_unused_extcmodes(); unload_all_unused_caps(); unload_all_unused_history_backends(); // unload_all_unused_moddata(); -- this will crash - extcmodes_check_for_changes(); umodes_check_for_changes(); charsys_check_for_changes(); - loop.ircd_rehashing = 0; + loop.rehashing = 0; remote_rehash_client = NULL; return 1; } @@ -10884,8 +10585,6 @@ void link_cleanup(ConfigItem_link *link_ptr) void delete_linkblock(ConfigItem_link *link_ptr) { - Debug((DEBUG_ERROR, "delete_linkblock: deleting %s, refcount=%d", - link_ptr->servername, link_ptr->refcount)); if (link_ptr->class) { link_ptr->class->xrefcount--; @@ -10904,8 +10603,6 @@ void delete_linkblock(ConfigItem_link *link_ptr) void delete_classblock(ConfigItem_class *class_ptr) { - Debug((DEBUG_ERROR, "delete_classblock: deleting %s, clients=%d, xrefcount=%d", - class_ptr->name, class_ptr->clients, class_ptr->xrefcount)); safe_free(class_ptr->name); DelListItem(class_ptr, conf_class); safe_free(class_ptr); @@ -10924,6 +10621,7 @@ void listen_cleanup() safe_free(listen_ptr->ip); free_tls_options(listen_ptr->tls_options); DelListItem(listen_ptr, conf_listen); + safe_free(listen_ptr->websocket_forward); safe_free(listen_ptr); i++; } @@ -10933,279 +10631,153 @@ void listen_cleanup() close_unbound_listeners(); } -#ifdef USE_LIBCURL -char *find_remote_include(char *url, char **errorbuf) +ConfigResource *find_config_resource(const char *resource) { - ConfigItem_include *inc; + ConfigResource *rs; - for (inc = conf_include; inc; inc = inc->next) + for (rs = config_resources; rs; rs = rs->next) { - if (!(inc->flag.type & INCLUDE_NOTLOADED)) - continue; - if (!(inc->flag.type & INCLUDE_REMOTE)) - continue; - if (!strcasecmp(url, inc->url)) - { - *errorbuf = inc->errorbuf; - return inc->file; - } +#ifdef _WIN32 + if (rs->file && !strcasecmp(resource, rs->file)) + return rs; +#else + if (rs->file && !strcmp(resource, rs->file)) + return rs; +#endif + if (rs->url && !strcasecmp(resource, rs->url)) + return rs; } return NULL; } -char *find_loaded_remote_include(char *url) +/* Add configuration resource to list. + * For files this doesn't do terribly much, except that you can use + * the return value to judge on whether you should call config_read_file() or not. + * For urls this adds the resource to the list of links to be downloaded. + * @param resource File or URL of the resource + * @param type A RESOURCE_ type such as RESOURCE_INCLUDE + * @param ce The ConfigEntry where the add_config_resource() happened + * for, such as the include block, etc. + * @returns 0 if the file is already on our list (so no need to load it!) + */ +int add_config_resource(const char *resource, int type, ConfigEntry *ce) { - ConfigItem_include *inc; + ConfigResource *rs; + ConfigEntryWrapper *wce; - for (inc = conf_include; inc; inc = inc->next) + if (config_verbose) + config_status("add_config_resource() for '%s", resource); + + wce = safe_alloc(sizeof(ConfigEntryWrapper)); + wce->ce = ce; + + rs = find_config_resource(resource); + if (rs) { - if ((inc->flag.type & INCLUDE_NOTLOADED)) - continue; - if (!(inc->flag.type & INCLUDE_REMOTE)) - continue; - if (!strcasecmp(url, inc->url)) - return inc->file; + /* Existing entry, add us to the list of + * items who are interested in this resource ;) + */ + AddListItem(wce, rs->wce); + return 0; } - return NULL; -} + /* New entry */ + rs = safe_alloc(sizeof(ConfigResource)); + rs->wce = wce; + AddListItem(rs, config_resources); -/** - * Non-asynchronous remote inclusion to give a user better feedback - * when first starting his IRCd. - * - * The asynchronous friend is rehash() which merely queues remote - * includes for download using download_file_async(). - */ -int remote_include(ConfigEntry *ce) -{ - char *errorbuf = NULL; - char *url = ce->ce_vardata; - char *file = find_remote_include(url, &errorbuf); - int ret; - if (!loop.ircd_rehashing || (loop.ircd_rehashing && !file && !errorbuf)) + if (!url_is_valid(resource)) { - char *error; - if (config_verbose > 0) - config_status("Downloading %s", displayurl(url)); - file = download_file(url, &error); - if (!file) + safe_strdup(rs->file, resource); + } else { + const char *cache_file; + time_t modtime; + + safe_strdup(rs->url, resource); + rs->type = type|RESOURCE_REMOTE|RESOURCE_DLQUEUED; + + cache_file = unreal_mkcache(rs->url); + modtime = unreal_getfilemodtime(cache_file); + if (modtime > 0) { - if (has_cached_version(url)) + safe_strdup(rs->cache_file, cache_file); /* Cached copy is available */ + /* Check if there is an "url-refresh" argument */ + ConfigEntry *cep, *prev = NULL; + for (cep = ce->items; cep; cep = cep->next) { - config_warn("%s:%i: include: error downloading '%s': %s -- using cached version instead.", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum, - displayurl(url), error); - safe_strdup(file, unreal_mkcache(url)); - /* Let it pass to load_conf()... */ - } else { - config_error("%s:%i: include: error downloading '%s': %s", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum, - displayurl(url), error); - return -1; - } - } else { - unreal_copyfileex(file, unreal_mkcache(url), 0); - } - add_remote_include(file, url, 0, NULL, ce->ce_fileptr->cf_filename, ce->ce_varlinenum); - ret = load_conf(file, url); - safe_free(file); - return ret; - } - else - { - if (errorbuf) - { - if (has_cached_version(url)) - { - config_warn("%s:%i: include: error downloading '%s': %s -- using cached version instead.", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum, - displayurl(url), errorbuf); - /* Let it pass to load_conf()... */ - safe_strdup(file, unreal_mkcache(url)); - } else { - config_error("%s:%i: include: error downloading '%s': %s", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum, - displayurl(url), errorbuf); - return -1; - } - } - if (config_verbose > 0) - config_status("Loading %s from download", url); - add_remote_include(file, url, 0, NULL, ce->ce_fileptr->cf_filename, ce->ce_varlinenum); - ret = load_conf(file, url); - return ret; - } - return 0; -} -#endif - -/** - * Add an item to the conf_include list for the specified file. - * - * Checks for whether or not we're performing recursive includes - * belong in conf_load() because that function is able to return an - * error code. Any checks in here will end up being ignored by callers - * and thus will gain us nothing. - * - * @param file path to the include file. - */ -void add_include(const char *file, const char *included_from, int included_from_line) -{ - ConfigItem_include *inc; - - inc = safe_alloc(sizeof(ConfigItem_include)); - safe_strdup(inc->file, file); - inc->flag.type = INCLUDE_NOTLOADED; - safe_strdup(inc->included_from, included_from); - inc->included_from_line = included_from_line; - AddListItem(inc, conf_include); -} - -#ifdef USE_LIBCURL -/** - * Adds a remote include entry to the config_include list. - * - * This is to be called whenever the included_from and - * included_from_line parameters are known. This means that during a - * rehash when downloads are done asynchronously, you call this with - * the inclued_from and included_from_line information. After the - * download is complete and you know there it is stored in the FS, - * call update_remote_include(). - */ -void add_remote_include(const char *file, const char *url, int flags, const char *errorbuf, const char *included_from, int included_from_line) -{ - ConfigItem_include *inc; - - /* we rely on safe_alloc() zeroing the ConfigItem_include */ - inc = safe_alloc(sizeof(ConfigItem_include)); - if (included_from) - { - safe_strdup(inc->included_from, included_from); - inc->included_from_line = included_from_line; - } - safe_strdup(inc->url, url); - - update_remote_include(inc, file, INCLUDE_NOTLOADED|INCLUDE_REMOTE|flags, errorbuf); - AddListItem(inc, conf_include); -} - -/** - * Update certain information in a remote include's config_include list entry. - * - * @param file the place on disk where the downloaded remote include - * may be found - * @param flags additional flags to set on the config_include entry - * @param errorbuf non-NULL if there were errors encountered in - * downloading. The error will be stored into the config_include - * entry. - */ -void update_remote_include(ConfigItem_include *inc, const char *file, int flags, const char *errorbuf) -{ - /* - * file may be NULL when errorbuf is non-NULL and vice-versa. - */ - if (file) - safe_strdup(inc->file, file); - inc->flag.type |= flags; - - if (errorbuf) - safe_strdup(inc->errorbuf, errorbuf); -} -#endif - -/** - * Clean up conf_include after a rehash fails because of a - * configuration file error. - * - * Duplicates some in unload_loaded_include(). - */ -void unload_notloaded_includes(void) -{ - ConfigItem_include *inc, *next; - - for (inc = conf_include; inc; inc = next) - { - next = inc->next; - if ((inc->flag.type & INCLUDE_NOTLOADED) || !(inc->flag.type & INCLUDE_USED)) - { -#ifdef USE_LIBCURL - if (inc->flag.type & INCLUDE_REMOTE) - { - /* Delete the file, but only if it's not a cached version */ - if (strncmp(inc->file, CACHEDIR, strlen(CACHEDIR))) + if (!strcmp(cep->name, "url-refresh")) { - remove(inc->file); + /* First find out the time value of url-refresh... (eg '7d' -> 86400*7) */ + long refresh_time = 0; + if (cep->value) + refresh_time = config_checkval(cep->value, CFG_TIME); + /* Then remove the config item so it is not seen by the rest of unrealircd. + * Can't use DelListItem() here as ConfigEntry has no ->prev, only ->next. + */ + if (prev) + prev->next = cep->next; /* (skip over us) */ + else + ce->items = cep->next; /* (new head) */ + /* ..and free it */ + config_entry_free(cep); + /* And now check if the current cached copy is recent enough */ + if (TStime() - modtime < refresh_time) + { + /* Don't download, use cached copy */ + //config_status("DEBUG: using cached copy due to url-refresh %ld", refresh_time); + resource_download_complete(rs->url, NULL, NULL, 1, rs); + return 1; + } else { + //config_status("DEBUG: requires download attempt, out of date url-refresh %ld < %ld", refresh_time, TStime() - modtime); + } + break; // MUST break now as we touched the linked list. } - safe_free(inc->url); - safe_free(inc->errorbuf); + prev = cep; } -#endif - safe_free(inc->file); - safe_free(inc->included_from); - DelListItem(inc, conf_include); - safe_free(inc); } + download_file_async(rs->url, modtime, resource_download_complete, (void *)rs, NULL, DOWNLOAD_MAX_REDIRECTS); } + return 1; } -/** - * Clean up conf_include after a successful rehash to make way for - * load_includes(). - */ -void unload_loaded_includes(void) +void free_all_config_resources(void) { - ConfigItem_include *inc, *next; + ConfigResource *rs, *next; + ConfigEntryWrapper *wce, *wce_next; - for (inc = conf_include; inc; inc = next) + for (rs = config_resources; rs; rs = next) { - next = inc->next; - if (!(inc->flag.type & INCLUDE_NOTLOADED) || !(inc->flag.type & INCLUDE_USED)) + next = rs->next; + for (wce = rs->wce; wce; wce = wce_next) { -#ifdef USE_LIBCURL - if (inc->flag.type & INCLUDE_REMOTE) - { - /* Delete the file, but only if it's not a cached version */ - if (strncmp(inc->file, CACHEDIR, strlen(CACHEDIR))) - { - remove(inc->file); - } - safe_free(inc->url); - safe_free(inc->errorbuf); - } -#endif - safe_free(inc->file); - safe_free(inc->included_from); - DelListItem(inc, conf_include); - safe_free(inc); + wce_next = wce->next; + safe_free(wce); } + rs->wce = NULL; + if (rs->type & RESOURCE_REMOTE) + { + /* Delete the file, but only if it's not a cached version */ + if (rs->file && strncmp(rs->file, CACHEDIR, strlen(CACHEDIR))) + { + remove(rs->file); + } + safe_free(rs->url); + } + safe_free(rs->file); + safe_free(rs->cache_file); + DelListItem(rs, config_resources); + safe_free(rs); } } -/** - * Mark loaded includes as loaded by removing the INCLUDE_NOTLOADED - * flag. Meant to be called only after calling - * unload_loaded_includes(). - */ -void load_includes(void) -{ - ConfigItem_include *inc; - - /* Doing this for all the includes should actually be faster - * than only doing it for includes that are not-loaded - */ - for (inc = conf_include; inc; inc = inc->next) - inc->flag.type &= ~INCLUDE_NOTLOADED; -} - int tls_tests(void) { if (have_tls_listeners == 0) { - config_error("Your server is not listening on any SSL/TLS ports."); + config_error("Your server is not listening on any TLS ports."); config_status("Add this to your unrealircd.conf: listen { ip %s; port 6697; options { tls; }; };", port_6667_ip ? port_6667_ip : "*"); - config_status("See https://www.unrealircd.org/docs/FAQ#Your_server_is_not_listening_on_any_SSL_ports"); + config_status("See https://www.unrealircd.org/docs/FAQ#no-tls-ports"); return 0; } @@ -11245,7 +10817,7 @@ int reloadable_perm_module_unloaded(void) return ret; } -char *link_generator_spkifp(TLSOptions *tlsoptions) +const char *link_generator_spkifp(TLSOptions *tlsoptions) { SSL_CTX *ctx; SSL *ssl; @@ -11267,7 +10839,7 @@ void link_generator(void) TLSOptions *tlsopt = iConf.tls_options; /* never null */ int port = 0; char *ip = NULL; - char *spkifp; + const char *spkifp; for (lstn = conf_listen; lstn; lstn = lstn->next) { @@ -11286,7 +10858,7 @@ void link_generator(void) if (!port) { - printf("You don't have any listen { } blocks that are serversonly.\n"); + printf("You don't have any listen { } blocks that are serversonly (and have tls enabled).\n"); printf("It is recommended to have at least one. Add this to your configuration file:\n"); printf("listen { ip *; port 6900; options { tls; serversonly; }; };\n"); exit(1); @@ -11295,7 +10867,7 @@ void link_generator(void) spkifp = link_generator_spkifp(tlsopt); if (!spkifp) { - printf("Could not calculate spkifp. Maybe you have uncommon SSL/TLS options set? Odd...\n"); + printf("Could not calculate spkifp. Maybe you have uncommon TLS options set? Odd...\n"); exit(1); } diff --git a/src/conf_preprocessor.c b/src/conf_preprocessor.c index 6551fcb..9be3338 100644 --- a/src/conf_preprocessor.c +++ b/src/conf_preprocessor.c @@ -19,7 +19,7 @@ static inline int ValidVarCharacter(char x) return 0; } -PreprocessorItem evaluate_preprocessor_if(char *statement, char *filename, int linenumber, ConditionalConfig **cc_out) +PreprocessorItem evaluate_preprocessor_if(char *statement, const char *filename, int linenumber, ConditionalConfig **cc_out) { char *p=statement, *name; int negative = 0; @@ -176,7 +176,7 @@ PreprocessorItem evaluate_preprocessor_if(char *statement, char *filename, int l return PREPROCESSOR_ERROR; } -PreprocessorItem evaluate_preprocessor_define(char *statement, char *filename, int linenumber) +PreprocessorItem evaluate_preprocessor_define(char *statement, const char *filename, int linenumber) { char *p = statement; char *name, *name_terminator; @@ -246,7 +246,7 @@ PreprocessorItem evaluate_preprocessor_define(char *statement, char *filename, return PREPROCESSOR_DEFINE; } -PreprocessorItem parse_preprocessor_item(char *start, char *end, char *filename, int linenumber, ConditionalConfig **cc) +PreprocessorItem parse_preprocessor_item(char *start, char *end, const char *filename, int linenumber, ConditionalConfig **cc) { char buf[512]; int max; @@ -262,7 +262,7 @@ PreprocessorItem parse_preprocessor_item(char *start, char *end, char *filename return evaluate_preprocessor_define(buf+7, filename, linenumber); else if (!strncmp(buf, "@if ", 4)) return evaluate_preprocessor_if(buf+4, filename, linenumber, cc); - else if (!strcmp(buf, "@endif")) + else if (!strncmp(buf, "@endif", 6)) return PREPROCESSOR_ENDIF; config_error("%s:%i: Unknown preprocessor directive: %s", filename, linenumber, buf); @@ -382,29 +382,29 @@ int preprocessor_resolve_if(ConditionalConfig *cc, PreprocessorPhase phase) void preprocessor_resolve_conditionals_ce(ConfigEntry **ce_list, PreprocessorPhase phase) { - ConfigEntry *ce, *ce_next, *ce_prev; + ConfigEntry *ce, *next, *ce_prev; ConfigEntry *cep, *cep_next, *cep_prev; ce_prev = NULL; - for (ce = *ce_list; ce; ce = ce_next) + for (ce = *ce_list; ce; ce = next) { - ce_next = ce->ce_next; + next = ce->next; /* This is for an @if before a block start */ - if (!preprocessor_resolve_if(ce->ce_cond, phase)) + if (!preprocessor_resolve_if(ce->conditional_config, phase)) { /* Delete this entry */ if (ce == *ce_list) { /* we are head, so new head */ - *ce_list = ce->ce_next; /* can be NULL now */ + *ce_list = ce->next; /* can be NULL now */ } else { /* non-head */ - ce_prev->ce_next = ce->ce_next; /* can be NULL now */ + ce_prev->next = ce->next; /* can be NULL now */ } config_entry_free(ce); continue; } - preprocessor_resolve_conditionals_ce(&ce->ce_entries, phase); + preprocessor_resolve_conditionals_ce(&ce->items, phase); ce_prev = ce; } } @@ -413,8 +413,8 @@ void preprocessor_resolve_conditionals_all(PreprocessorPhase phase) { ConfigFile *cfptr; - for (cfptr = conf; cfptr; cfptr = cfptr->cf_next) - preprocessor_resolve_conditionals_ce(&cfptr->cf_entries, phase); + for (cfptr = conf; cfptr; cfptr = cfptr->next) + preprocessor_resolve_conditionals_ce(&cfptr->items, phase); } /** Frees the list of config_defines, so all @defines */ @@ -502,7 +502,7 @@ void preprocessor_replace_defines(char **item, ConfigEntry *ce) if ((limit > 2) && ((*varend == '\0') || strchr("\t ,.", *varend))) { config_warn("%s:%d: Variable %s used here but there's no @define for it earlier.", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum, varname); + ce->file->filename, ce->line_number, varname); } #endif value = varname; /* not found? then use varname, including the '$' */ diff --git a/src/crashreport.c b/src/crashreport.c index bd7e83c..270c363 100644 --- a/src/crashreport.c +++ b/src/crashreport.c @@ -109,7 +109,7 @@ char *find_best_asan_log(void) } } closedir(fd); - return BadPtr(best_fname) ? NULL : best_fname; + return *best_fname ? best_fname : NULL; #else return NULL; #endif @@ -531,7 +531,7 @@ char *generate_crash_report(char *coredump, int *thirdpartymods) #define CRASH_REPORT_HOST "crash.unrealircd.org" -SSL_CTX *crashreport_init_ssl(void) +SSL_CTX *crashreport_init_tls(void) { SSL_CTX *ctx_client; char buf[512]; @@ -587,7 +587,7 @@ int crashreport_send(char *fname) delimiter); snprintf(footer, sizeof(footer), "\r\n--%s--\r\n", delimiter); - ctx_client = crashreport_init_ssl(); + ctx_client = crashreport_init_tls(); if (!ctx_client) { printf("ERROR: TLS initalization failure (I)\n"); diff --git a/src/crule.c b/src/crule.c index faa9e6a..4baf20e 100644 --- a/src/crule.c +++ b/src/crule.c @@ -186,7 +186,7 @@ int crule_via(int numargs, void *crulearg[]) { if (!match_simple((char *)crulearg[1], client->name)) continue; - if (!match_simple((char *)crulearg[0], client->serv->up)) + if (!match_simple((char *)crulearg[0], client->uplink->name)) continue; return (1); } @@ -372,11 +372,6 @@ char *crule_parse(char *rule) } if (ruleroot != NULL) crule_free((char **)&ruleroot); -#if !defined(CR_DEBUG) && !defined(CR_CHKCONF) - Debug((DEBUG_ERROR, "%s in rule: %s", crule_errstr[errcode], rule)); -#else - (void)fprintf(stderr, "%s in rule: %s\n", crule_errstr[errcode], rule); -#endif return NULL; } diff --git a/src/dbuf.c b/src/dbuf.c index 62cb40f..23786d5 100644 --- a/src/dbuf.c +++ b/src/dbuf.c @@ -61,7 +61,7 @@ void dbuf_queue_init(dbuf *dyn) INIT_LIST_HEAD(&dyn->dbuf_list); } -void dbuf_put(dbuf *dyn, char *buf, size_t length) +void dbuf_put(dbuf *dyn, const char *buf, size_t length) { struct dbufbuf *block; size_t amount; diff --git a/src/debug.c b/src/debug.c index e28f898..e4d7635 100644 --- a/src/debug.c +++ b/src/debug.c @@ -48,9 +48,6 @@ MODVAR char serveropts[] = { 'Y', #endif '6', -#ifdef USE_SSL - 'e', -#endif #ifndef NO_OPEROVERRIDE 'O', #endif @@ -150,11 +147,16 @@ void debug(int level, FORMAT_STRING(const char *form), ...) SET_ERRNO(err); } -int checkprotoflags(Client *client, int flags, char *file, int line) +int checkprotoflags(Client *client, int flags, const char *file, int line) { if (!MyConnect(client)) - ircd_log(LOG_ERROR, "[Debug] [BUG] ERROR: %s:%d: IsToken(<%s>,%d) on remote client", - file, line, client->name, flags); + { + unreal_log(ULOG_ERROR, "main", "BUG_ISTOKEN_REMOTE_CLIENT", client, + "IsToken($token_value) used on remote client in $file:$line", + log_data_integer("token_value", flags), + log_data_string("file", file), + log_data_integer("line", line)); + } return ((client->local->proto & flags) == flags) ? 1 : 0; } #endif diff --git a/src/dispatch.c b/src/dispatch.c index 37540f3..096243c 100644 --- a/src/dispatch.c +++ b/src/dispatch.c @@ -39,6 +39,11 @@ #include #endif +/* Not sure if this is suitable for production, + * but let's turn it on for U6 development. + */ +//#define DETECT_HIGH_CPU + /*************************************************************************************** * Backend-independent functions. fd_setselect() and friends * ***************************************************************************************/ @@ -47,14 +52,18 @@ void fd_setselect(int fd, int flags, IOCallbackFunc iocb, void *data) FDEntry *fde; int changed = 0; #if 0 - ircd_log(LOG_ERROR, "fd_setselect(): fd %d flags %d func %p", fd, flags, &iocb); + unreal_log(ULOG_DEBUG, "io", "IO_DEBUG_FD_SETSELECT", NULL, + "fd_setselect(): fd $fd flags $fd_flags function $function_pointer", + log_data_integer("fd", fd), + log_data_integer("fd_flags", flags), + log_data_integer("function_pointer", (long long)iocb)); #endif if ((fd < 0) || (fd >= MAXCONNECTIONS)) { - sendto_realops("[BUG] trying to modify fd #%d in fd table, but MAXCONNECTIONS is %d", - fd, MAXCONNECTIONS); - ircd_log(LOG_ERROR, "[BUG] trying to modify fd #%d in fd table, but MAXCONNECTIONS is %d", - fd, MAXCONNECTIONS); + unreal_log(ULOG_ERROR, "io", "BUG_FD_SETSELECT_OUT_OF_RANGE", NULL, + "[BUG] trying to modify fd $fd in fd table, but MAXCONNECTIONS is $maxconnections", + log_data_integer("fd", fd), + log_data_integer("maxconnections", MAXCONNECTIONS)); #ifdef DEBUGMODE abort(); #endif @@ -143,7 +152,11 @@ void fd_debug(fd_set *f, int highest, char *name) //if (fcntl(i, F_GETFL) < 0) int nonb = 1; if (ioctlsocket(i, FIONBIO, &nonb) < 0) - ircd_log(LOG_ERROR, "fd_debug: FD #%d is invalid!!!", i); + { + unreal_log(ULOG_ERROR, "io", "FD_DEBUG", NULL, + "[BUG] fd_debug: fd $fd is invalid!!!", + log_data_integer("fd", i)); + } } } } @@ -168,10 +181,6 @@ void fd_select(time_t delay) to.tv_sec = delay / 1000; to.tv_usec = (delay % 1000) * 1000; -#ifdef DEBUGMODE - ircd_log(LOG_ERROR, "fd_select() on 0-%d...", highest_fd+1); -#endif - #ifdef _WIN32 num = select(highest_fd + 1, &work_read_fds, &work_write_fds, &work_except_fds, &to); #else @@ -179,8 +188,9 @@ void fd_select(time_t delay) #endif if (num < 0) { - extern void report_baderror(char *text, Client *client); - report_baderror("select %s:%s", &me); + unreal_log(ULOG_FATAL, "io", "SELECT_ERROR", NULL, + "select() returned error ($socket_error) -- SERIOUS TROUBLE!", + log_data_socket_error(-1)); /* DEBUG the actual problem: */ memcpy(&work_read_fds, &read_fds, sizeof(fd_set)); memcpy(&work_write_fds, &write_fds, sizeof(fd_set)); @@ -204,10 +214,6 @@ void fd_select(time_t delay) if (!fde->is_open) continue; -#ifdef DEBUGMODE - ircd_log(LOG_ERROR, "fd_select(): checking %d...", fd); -#endif - if (FD_ISSET(fd, &work_read_fds)) evflags |= FD_SELECT_READ; @@ -223,10 +229,6 @@ void fd_select(time_t delay) if (!evflags) continue; -#ifdef DEBUGMODE - ircd_log(LOG_ERROR, "fd_select(): events for %d (%d)... processing...", fd, evflags); -#endif - if (evflags & FD_SELECT_READ) { iocb = fde->read_callback; @@ -280,7 +282,9 @@ void fd_fork() continue; #ifdef DEBUGMODE - ircd_log(LOG_ERROR, "[BUG?] kevent returned %d", errno); + unreal_log(ULOG_ERROR, "io", "KEVENT_FAILED", NULL, + "[io] fd_fork(): kevent returned error: $system_error", + log_data_string("system_error", strerror(errno))); #endif } } @@ -308,8 +312,13 @@ void fd_refresh(int fd) #ifdef DEBUGMODE if (ERRNO != P_EWOULDBLOCK && ERRNO != P_EAGAIN) { - ircd_log(LOG_ERROR, "[BUG?] fd_refresh(): kevent returned %d for fd %d for read callback (%s)", - errno, fd, (fde->read_callback ? "add" : "delete")); + int save_err = errno; + unreal_log(ULOG_ERROR, "io", "KEVENT_FAILED_REFRESH", NULL, + "fd_refresh(): kevent returned error for fd $fd ($fd_action) ($callback): $system_error", + log_data_string("system_error", strerror(save_err)), + log_data_integer("fd", fd), + log_data_string("fd_action", (fde->read_callback ? "add" : "delete")), + log_data_string("callback", "read_callback")); } #endif } @@ -323,8 +332,13 @@ void fd_refresh(int fd) #ifdef DEBUGMODE if (ERRNO != P_EWOULDBLOCK && ERRNO != P_EAGAIN && fde->write_callback) { - ircd_log(LOG_ERROR, "[BUG?] fd_refresh(): kevent returned %d for fd %d for write callback (%s)", - errno, fd, "add" /*(fde->write_callback ? "add" : "delete")*/); + int save_err = errno; + unreal_log(ULOG_ERROR, "io", "KEVENT_FAILED_REFRESH", NULL, + "[io] fd_refresh(): kevent returned error for fd $fd ($fd_action) ($callback): $system_error", + log_data_string("system_error", strerror(save_err)), + log_data_integer("fd", fd), + log_data_string("fd_action", "add"), + log_data_string("callback", "write_callback")); } #endif } @@ -440,11 +454,15 @@ void fd_refresh(int fd) if (epoll_ctl(epoll_fd, op, fd, &ep_event) != 0) { - if (ERRNO == P_EWOULDBLOCK || ERRNO == P_EAGAIN) + int save_errno = errno; + if ((save_errno == P_EWOULDBLOCK) || (save_errno == P_EAGAIN)) return; - ircd_log(LOG_ERROR, "[BUG] fd_refresh(): epoll_ctl returned error %d (%s) for fd %d (%s)", - errno, STRERROR(ERRNO), fd, fde->desc); + unreal_log(ULOG_ERROR, "io", "EPOLL_CTL_FAILED", NULL, + "[io] fd_refresh(): epoll_ctl returned error for fd $fd ($fd_description): $system_error", + log_data_string("system_error", strerror(save_errno)), + log_data_integer("fd", fd), + log_data_string("fd_description", fde->desc)); return; } @@ -455,7 +473,7 @@ void fd_select(time_t delay) { int num, p, revents, fd; struct epoll_event *epfd; -#ifdef DEBUG_IOENGINE +#ifdef DETECT_HIGH_CPU int read_callbacks = 0, write_callbacks = 0; struct timeval oldt, t; long long tdiff; @@ -467,7 +485,7 @@ void fd_select(time_t delay) if (num <= 0) return; -#ifdef DEBUG_IOENGINE +#ifdef DETECT_HIGH_CPU gettimeofday(&oldt, NULL); #endif @@ -499,7 +517,7 @@ void fd_select(time_t delay) if (iocb != NULL) iocb(fd, evflags, fde->data); -#ifdef DEBUG_IOENGINE +#ifdef DETECT_HIGH_CPU read_callbacks++; #endif } @@ -511,7 +529,7 @@ void fd_select(time_t delay) if (iocb != NULL) iocb(fd, evflags, fde->data); -#ifdef DEBUG_IOENGINE +#ifdef DETECT_HIGH_CPU write_callbacks++; #endif } @@ -524,14 +542,18 @@ void fd_select(time_t delay) #endif } -#ifdef DEBUG_IOENGINE +#ifdef DETECT_HIGH_CPU gettimeofday(&t, NULL); tdiff = ((t.tv_sec - oldt.tv_sec) * 1000000) + (t.tv_usec - oldt.tv_usec); if (tdiff > 1000000) { - sendto_realops_and_log("WARNING: Slow I/O engine or high load: fd_select() took %lld ms! read_callbacks=%d, write_callbacks=%d", - tdiff / 1000, read_callbacks, write_callbacks); + unreal_log(ULOG_WARNING, "io", "HIGH_LOAD", NULL, + "HIGH CPU LOAD! fd_select() took $time_msec msec " + "(read: $num_read_callbacks, write: $num_write_callbacks)", + log_data_integer("time_msec", tdiff/1000), + log_data_integer("num_read_callbacks", read_callbacks), + log_data_integer("num_write_callbacks", write_callbacks)); } #endif } @@ -601,7 +623,7 @@ void fd_select(time_t delay) pfd = &pollfds[p]; revents = pfd->revents; - fd = pfd->local->fd; + fd = pfd->fd; if (revents == 0 || fd == -1) continue; diff --git a/src/dns.c b/src/dns.c index edaa674..d8cb660 100644 --- a/src/dns.c +++ b/src/dns.c @@ -40,9 +40,9 @@ void unrealdns_cb_nametoip_verify(void *arg, int status, int timeouts, struct ho void unrealdns_cb_nametoip_link(void *arg, int status, int timeouts, struct hostent *he); void unrealdns_delasyncconnects(void); static uint64_t unrealdns_hash_ip(const char *ip); -static void unrealdns_addtocache(char *name, char *ip); -static char *unrealdns_findcache_ip(char *ip); -struct hostent *unreal_create_hostent(char *name, char *ip); +static void unrealdns_addtocache(const char *name, const char *ip); +static const char *unrealdns_findcache_ip(const char *ip); +struct hostent *unreal_create_hostent(const char *name, const char *ip); static void unrealdns_freeandremovereq(DNSReq *r); void unrealdns_removecacherecord(DNSCache *c); @@ -87,10 +87,7 @@ static void unrealdns_sock_state_cb(void *data, ares_socket_t fd, int read, int if (!read && !write) { - /* Socket is going to be closed *BY C-ARES*.. - * so don't call fd_close() but fd_unmap(). - */ - fd_unmap(fd); + fd_close(fd); return; } @@ -108,7 +105,11 @@ static void unrealdns_sock_state_cb(void *data, ares_socket_t fd, int read, int */ static int unrealdns_sock_create_cb(ares_socket_t fd, int type, void *data) { - fd_open(fd, "DNS Resolver Socket"); + /* NOTE: We use FDCLOSE_NONE here because c-ares + * will take care of the closing. So *WE* must + * never close the socket. + */ + fd_open(fd, "DNS Resolver Socket", FDCLOSE_NONE); return ARES_SUCCESS; } @@ -174,12 +175,10 @@ void reinit_resolver(Client *client) { EventDel(unrealdns_timeout_hdl); - sendto_ops_and_log("%s requested reinitalization of resolver!", client->name); - sendto_realops("Destroying resolver channel, along with all currently pending queries..."); + unreal_log(ULOG_INFO, "dns", "REINIT_RESOLVER", client, + "$client requested reinitalization of the DNS resolver"); ares_destroy(resolver_channel); - sendto_realops("Initializing resolver again..."); init_resolver(0); - sendto_realops("Reinitalization finished successfully."); } void unrealdns_addreqtolist(DNSReq *r) @@ -202,7 +201,7 @@ void unrealdns_addreqtolist(DNSReq *r) struct hostent *unrealdns_doclient(Client *client) { DNSReq *r; - char *cache_name; + const char *cache_name; cache_name = unrealdns_findcache_ip(client->ip); if (cache_name) @@ -233,7 +232,7 @@ struct hostent *unrealdns_doclient(Client *client) /** Resolve a name to an IP, for a link block. */ -void unrealdns_gethostbyname_link(char *name, ConfigItem_link *conf, int ipv4_only) +void unrealdns_gethostbyname_link(const char *name, ConfigItem_link *conf, int ipv4_only) { DNSReq *r; @@ -283,27 +282,6 @@ void unrealdns_cb_iptoname(void *arg, int status, int timeouts, struct hostent * ares_gethostbyname(resolver_channel, he->h_name, ipv6 ? AF_INET6 : AF_INET, unrealdns_cb_nametoip_verify, newr); } -/* - returns: - 1 = good hostname - 0 = bad hostname - */ -int verify_hostname(char *name) -{ -char *p; - - if (strlen(name) > HOSTLEN) - return 0; - - /* No underscores or other illegal characters */ - for (p = name; *p; p++) - if (!isalnum(*p) && !strchr(".-", *p)) - return 0; - - return 1; -} - - void unrealdns_cb_nametoip_verify(void *arg, int status, int timeouts, struct hostent *he) { DNSReq *r = (DNSReq *)arg; @@ -348,13 +326,16 @@ void unrealdns_cb_nametoip_verify(void *arg, int status, int timeouts, struct ho goto bad; } - if (!verify_hostname(r->name)) + if (!valid_host(r->name, 1)) { /* Hostname is bad, don't cache and consider unresolved */ proceed_normal_client_handshake(client, NULL); goto bad; } + /* Get rid of stupid uppercase DNS names... */ + strtolower(r->name); + /* Entry was found, verified, and can be added to cache */ unrealdns_addtocache(r->name, client->ip); @@ -372,7 +353,7 @@ void unrealdns_cb_nametoip_link(void *arg, int status, int timeouts, struct host int n; struct hostent *he2; char ipbuf[HOSTLEN+1]; - char *ip = NULL; + const char *ip = NULL; if (!r->linkblock) { @@ -393,8 +374,9 @@ void unrealdns_cb_nametoip_link(void *arg, int status, int timeouts, struct host } /* fatal error while resolving */ - sendto_ops_and_log("Unable to resolve hostname '%s', when trying to connect to server %s.", - r->name, r->linkblock->servername); + unreal_log(ULOG_ERROR, "link", "LINK_ERROR_RESOLVING", NULL, + "Unable to resolve hostname $link_block.hostname, when trying to connect to server $link_block.", + log_data_link_block(r->linkblock)); r->linkblock->refcount--; unrealdns_freeandremovereq(r); return; @@ -405,8 +387,9 @@ void unrealdns_cb_nametoip_link(void *arg, int status, int timeouts, struct host !(ip = inetntop(r->ipv6 ? AF_INET6 : AF_INET, he->h_addr_list[0], ipbuf, sizeof(ipbuf)))) { /* Illegal response -- fatal */ - sendto_ops_and_log("Unable to resolve hostname '%s', when trying to connect to server %s.", - r->name, r->linkblock->servername); + unreal_log(ULOG_ERROR, "link", "LINK_ERROR_RESOLVING", NULL, + "Unable to resolve hostname $link_block.hostname, when trying to connect to server $link_block.", + log_data_link_block(r->linkblock)); unrealdns_freeandremovereq(r); return; } @@ -417,22 +400,9 @@ void unrealdns_cb_nametoip_link(void *arg, int status, int timeouts, struct host safe_strdup(r->linkblock->connect_ip, ip); he2 = unreal_create_hostent(he->h_name, ip); - switch ((n = connect_server(r->linkblock, r->client, he2))) - { - case 0: - sendto_ops_and_log("Trying to activate link with server %s[%s]...", r->linkblock->servername, ip); - break; - case -1: - sendto_ops_and_log("Couldn't connect to server %s[%s].", r->linkblock->servername, ip); - break; - case -2: - /* Should not happen since he is not NULL */ - sendto_ops_and_log("Hostname %s is unknown for server %s (!?).", r->linkblock->outgoing.hostname, r->linkblock->servername); - break; - default: - sendto_ops_and_log("Connection to server %s failed: %s", r->linkblock->servername, STRERROR(n)); - } - + /* Try to connect to the server */ + connect_server(r->linkblock, r->client, he2); + unrealdns_freeandremovereq(r); /* DONE */ } @@ -442,7 +412,7 @@ static uint64_t unrealdns_hash_ip(const char *ip) return siphash(ip, siphashkey_dns_ip) % DNS_HASH_SIZE; } -static void unrealdns_addtocache(char *name, char *ip) +static void unrealdns_addtocache(const char *name, const char *ip) { unsigned int hashv; DNSCache *c; @@ -494,7 +464,7 @@ static void unrealdns_addtocache(char *name, char *ip) /** Search the cache for a confirmed ip->name and name->ip match, by address. * @returns The resolved hostname, or NULL if not found in cache. */ -static char *unrealdns_findcache_ip(char *ip) +static const char *unrealdns_findcache_ip(const char *ip) { unsigned int hashv; DNSCache *c; @@ -562,17 +532,11 @@ DNSCache *c, *next; { next = c->next; if (c->expires < TStime()) - { -#if 0 - sendto_realops(client, "[Syzop/DNS] Expire: %s [%s] (%ld < %ld)", - c->name, c->ip, c->expires, TStime()); -#endif unrealdns_removecacherecord(c); - } } } -struct hostent *unreal_create_hostent(char *name, char *ip) +struct hostent *unreal_create_hostent(const char *name, const char *ip) { struct hostent *he; @@ -646,7 +610,7 @@ CMD_FUNC(cmd_dns) { DNSCache *c; DNSReq *r; - char *param; + const char *param; if (!ValidatePermissionsForPath("server:dns",client,NULL,NULL,NULL)) { @@ -673,8 +637,8 @@ CMD_FUNC(cmd_dns) } else if (*param == 'c') /* CLEAR CACHE */ { - sendto_realops("%s (%s@%s) cleared the DNS cache list (/QUOTE DNS c)", - client->name, client->user->username, client->user->realhost); + unreal_log(ULOG_INFO, "dns", "DNS_CACHE_CLEARED", client, + "DNS cache cleared by $client"); while (cache_list) { @@ -702,7 +666,8 @@ CMD_FUNC(cmd_dns) ares_get_servers(resolver_channel, &serverlist); for (ns = serverlist; ns; ns = ns->next) { - char ipbuf[128], *ip; + char ipbuf[128]; + const char *ip; i++; ip = inetntop(ns->family, &ns->addr, ipbuf, sizeof(ipbuf)); diff --git a/src/fdlist.c b/src/fdlist.c index 0d9dc98..ae57aee 100644 --- a/src/fdlist.c +++ b/src/fdlist.c @@ -24,16 +24,23 @@ */ FDEntry fd_table[MAXCONNECTIONS + 1]; -int fd_open(int fd, const char *desc) +/** Notify I/O engine that a file descriptor opened. + * @param fd The file descriptor + * @param desc Description for in the fd table + * @param close_method Tell what a subsequent call to fd_close() should do, + * eg close the socket, file or don't close anything. + * @returns The file descriptor 'fd' or -1 in case of fatal error. + */ +int fd_open(int fd, const char *desc, FDCloseMethod close_method) { FDEntry *fde; if ((fd < 0) || (fd >= MAXCONNECTIONS)) { - sendto_realops("[BUG] trying to add fd #%d to fd table, but MAXCONNECTIONS is %d", - fd, MAXCONNECTIONS); - ircd_log(LOG_ERROR, "[BUG] trying to add fd #%d to fd table, but MAXCONNECTIONS is %d", - fd, MAXCONNECTIONS); + unreal_log(ULOG_ERROR, "io", "BUG_FD_OPEN_OUT_OF_RANGE", NULL, + "[BUG] trying to add fd $fd to fd table, but MAXCONNECTIONS is $maxconnections", + log_data_integer("fd", fd), + log_data_integer("maxconnections", MAXCONNECTIONS)); #ifdef DEBUGMODE abort(); #endif @@ -46,6 +53,7 @@ int fd_open(int fd, const char *desc) fde->fd = fd; fde->is_open = 1; fde->backend_flags = 0; + fde->close_method = close_method; strlcpy(fde->desc, desc, FD_DESC_SZ); return fde->fd; @@ -71,20 +79,28 @@ int fd_fileopen(const char *path, unsigned int flags) snprintf(comment, sizeof comment, "File: %s", unreal_getfilename(pathbuf)); - return fd_open(fd, comment); + return fd_open(fd, comment, FDCLOSE_FILE); } -int fd_unmap(int fd) +/** Internal function to unmap and optionally close the fd. + */ +/** Remove file descriptor from our table and possibly close the fd. + * The fd is closed (or not) according to the method specified in fd_open(). + * @param fd The file descriptor + * @returns 1 on success, 0 on failure + */ +int fd_close(int fd) { FDEntry *fde; unsigned int befl; + FDCloseMethod close_method; if ((fd < 0) || (fd >= MAXCONNECTIONS)) { - sendto_realops("[BUG] trying to close fd #%d in fd table, but MAXCONNECTIONS is %d", - fd, MAXCONNECTIONS); - ircd_log(LOG_ERROR, "[BUG] trying to close fd #%d in fd table, but MAXCONNECTIONS is %d", - fd, MAXCONNECTIONS); + unreal_log(ULOG_ERROR, "io", "BUG_FD_CLOSE_OUT_OF_RANGE", NULL, + "[BUG] trying to close fd $fd to fd table, but MAXCONNECTIONS is $maxconnections", + log_data_integer("fd", fd), + log_data_integer("maxconnections", MAXCONNECTIONS)); #ifdef DEBUGMODE abort(); #endif @@ -94,10 +110,9 @@ int fd_unmap(int fd) fde = &fd_table[fd]; if (!fde->is_open) { - sendto_realops("[BUG] trying to close fd #%d in fd table, but this FD isn't reported open", - fd); - ircd_log(LOG_ERROR, "[BUG] trying to close fd #%d in fd table, but this FD isn't reported open", - fd); + unreal_log(ULOG_ERROR, "io", "BUG_FD_CLOSE_NOT_OPEN", NULL, + "[BUG] trying to close fd $fd to fd table, but FD is (already) closed", + log_data_integer("fd", fd)); #ifdef DEBUGMODE abort(); #endif @@ -105,6 +120,7 @@ int fd_unmap(int fd) } befl = fde->backend_flags; + close_method = fde->close_method; memset(fde, 0, sizeof(FDEntry)); fde->fd = fd; @@ -112,25 +128,29 @@ int fd_unmap(int fd) /* only notify the backend if it is actively tracking the FD */ if (befl) fd_refresh(fd); - + + /* Finally, close the file or socket if requested to do so */ + switch (close_method) + { + case FDCLOSE_SOCKET: + CLOSE_SOCK(fd); + break; + case FDCLOSE_FILE: + close(fd); + break; + case FDCLOSE_NONE: + default: + break; + } + return 1; } -void fd_close(int fd) -{ - if (!fd_unmap(fd)) - return; - - CLOSE_SOCK(fd); -} - /* Deregister I/O notification for this file descriptor */ void fd_unnotify(int fd) { -FDEntry *fde; -#ifdef DEBUGMODE - ircd_log(LOG_ERROR, "fd_unnotify(): fd=%d", fd); -#endif + FDEntry *fde; + if ((fd < 0) || (fd >= MAXCONNECTIONS)) return; @@ -150,7 +170,7 @@ int fd_socket(int family, int type, int protocol, const char *desc) if (fd < 0) return -1; - return fd_open(fd, desc); + return fd_open(fd, desc, FDCLOSE_SOCKET); } int fd_accept(int sockfd) @@ -162,7 +182,7 @@ int fd_accept(int sockfd) if (fd < 0) return -1; - return fd_open(fd, buf); + return fd_open(fd, buf, FDCLOSE_SOCKET); } void fd_desc(int fd, const char *desc) @@ -171,10 +191,10 @@ void fd_desc(int fd, const char *desc) if ((fd < 0) || (fd >= MAXCONNECTIONS)) { - sendto_realops("[BUG] trying to modify fd #%d in fd table, but MAXCONNECTIONS is %d", - fd, MAXCONNECTIONS); - ircd_log(LOG_ERROR, "[BUG] trying to modify fd #%d in fd table, but MAXCONNECTIONS is %d", - fd, MAXCONNECTIONS); + unreal_log(ULOG_ERROR, "io", "BUG_FD_DESC_OUT_OF_RANGE", NULL, + "[BUG] trying to fd_desc fd $fd in fd table, but MAXCONNECTIONS is $maxconnections", + log_data_integer("fd", fd), + log_data_integer("maxconnections", MAXCONNECTIONS)); #ifdef DEBUGMODE abort(); #endif @@ -184,10 +204,9 @@ void fd_desc(int fd, const char *desc) fde = &fd_table[fd]; if (!fde->is_open) { - sendto_realops("[BUG] trying to modify fd #%d in fd table, but this FD isn't reported open", - fd); - ircd_log(LOG_ERROR, "[BUG] trying to modify fd #%d in fd table, but this FD isn't reported open", - fd); + unreal_log(ULOG_ERROR, "io", "BUG_FD_DESC_NOT_OPEN", NULL, + "[BUG] trying to fd_desc fd $fd in fd table, but FD is (already) closed", + log_data_integer("fd", fd)); #ifdef DEBUGMODE abort(); #endif diff --git a/src/hash.c b/src/hash.c index e5dd203..0901af9 100644 --- a/src/hash.c +++ b/src/hash.c @@ -260,11 +260,9 @@ void siphash_generate_key(char *k) static struct list_head clientTable[NICK_HASH_TABLE_SIZE]; static struct list_head idTable[NICK_HASH_TABLE_SIZE]; static Channel *channelTable[CHAN_HASH_TABLE_SIZE]; -static Watch *watchTable[WATCH_HASH_TABLE_SIZE]; static char siphashkey_nick[SIPHASH_KEY_LENGTH]; static char siphashkey_chan[SIPHASH_KEY_LENGTH]; -static char siphashkey_watch[SIPHASH_KEY_LENGTH]; static char siphashkey_whowas[SIPHASH_KEY_LENGTH]; static char siphashkey_throttling[SIPHASH_KEY_LENGTH]; @@ -277,7 +275,6 @@ void init_hash(void) siphash_generate_key(siphashkey_nick); siphash_generate_key(siphashkey_chan); - siphash_generate_key(siphashkey_watch); siphash_generate_key(siphashkey_whowas); siphash_generate_key(siphashkey_throttling); @@ -288,7 +285,6 @@ void init_hash(void) INIT_LIST_HEAD(&idTable[i]); memset(channelTable, 0, sizeof(channelTable)); - memset(watchTable, 0, sizeof(watchTable)); memset(ThrottlingHash, 0, sizeof(ThrottlingHash)); /* do not call init_throttling() here, as @@ -310,11 +306,6 @@ uint64_t hash_channel_name(const char *name) return siphash_nocase(name, siphashkey_chan) % CHAN_HASH_TABLE_SIZE; } -uint64_t hash_watch_nick_name(const char *name) -{ - return siphash_nocase(name, siphashkey_watch) % WATCH_HASH_TABLE_SIZE; -} - uint64_t hash_whowas_name(const char *name) { return siphash_nocase(name, siphashkey_whowas) % WHOWAS_HASH_TABLE_SIZE; @@ -323,7 +314,7 @@ uint64_t hash_whowas_name(const char *name) /* * add_to_client_hash_table */ -int add_to_client_hash_table(char *name, Client *client) +int add_to_client_hash_table(const char *name, Client *client) { unsigned int hashv; /* @@ -349,7 +340,7 @@ int add_to_client_hash_table(char *name, Client *client) /* * add_to_client_hash_table */ -int add_to_id_hash_table(char *name, Client *client) +int add_to_id_hash_table(const char *name, Client *client) { unsigned int hashv; hashv = hash_client_name(name); @@ -360,7 +351,7 @@ int add_to_id_hash_table(char *name, Client *client) /* * add_to_channel_hash_table */ -int add_to_channel_hash_table(char *name, Channel *channel) +int add_to_channel_hash_table(const char *name, Channel *channel) { unsigned int hashv; @@ -372,7 +363,7 @@ int add_to_channel_hash_table(char *name, Channel *channel) /* * del_from_client_hash_table */ -int del_from_client_hash_table(char *name, Client *client) +int del_from_client_hash_table(const char *name, Client *client) { if (!list_empty(&client->client_hash)) list_del(&client->client_hash); @@ -382,7 +373,7 @@ int del_from_client_hash_table(char *name, Client *client) return 0; } -int del_from_id_hash_table(char *name, Client *client) +int del_from_id_hash_table(const char *name, Client *client) { if (!list_empty(&client->id_hash)) list_del(&client->id_hash); @@ -395,7 +386,7 @@ int del_from_id_hash_table(char *name, Client *client) /* * del_from_channel_hash_table */ -void del_from_channel_hash_table(char *name, Channel *channel) +void del_from_channel_hash_table(const char *name, Channel *channel) { Channel *tmp, *prev = NULL; unsigned int hashv; @@ -465,7 +456,7 @@ Client *hash_find_nickatserver(const char *str, Client *def) if (serv) *serv++ = '\0'; - client = find_person(nick, NULL); + client = find_user(nick, NULL); if (!client) return NULL; /* client not found */ @@ -509,14 +500,14 @@ Client *hash_find_server(const char *server, Client *def) /** Find a client by name. * This searches in the list of all types of clients, user/person, servers or an unregistered clients. - * If you know what type of client to search for, then use find_server() or find_person() instead! + * If you know what type of client to search for, then use find_server() or find_user() instead! * @param name The name to search for (eg: "nick" or "irc.example.net") * @param requester The client that is searching for this name * @note If 'requester' is a server or NULL, then we also check * the ID table, otherwise not. * @returns If the client is found then the Client is returned, otherwise NULL. */ -Client *find_client(char *name, Client *requester) +Client *find_client(const char *name, Client *requester) { if (requester == NULL || IsServer(requester)) { @@ -537,7 +528,7 @@ Client *find_client(char *name, Client *requester) * the ID table, otherwise not. * @returns If the server is found then the Client is returned, otherwise NULL. */ -Client *find_server(char *name, Client *requester) +Client *find_server(const char *name, Client *requester) { if (name) { @@ -550,14 +541,14 @@ Client *find_server(char *name, Client *requester) return NULL; } -/** Find a person (a user). +/** Find a user (a person) * @param name The name to search for (eg: "nick" or "001ABCDEFG") * @param requester The client that is searching for this name * @note If 'requester' is a server or NULL, then we also check * the ID table, otherwise not. * @returns If the user is found then the Client is returned, otherwise NULL. */ -Client *find_person(char *name, Client *requester) /* TODO: this should have been called find_user() to be consistent */ +Client *find_user(const char *name, Client *requester) { Client *c2ptr; @@ -572,22 +563,20 @@ Client *find_person(char *name, Client *requester) /* TODO: this should have bee /** Find a channel by name. * @param name The channel name to search for - * @param default_result If the channel is not found, this value is returned. - * @returns If the channel exists then the Channel is returned, otherwise default_result is returned. + * @returns If the channel exists then the Channel is returned, otherwise NULL. */ -Channel *find_channel(char *name, Channel *default_result) +Channel *find_channel(const char *name) { unsigned int hashv; - Channel *tmp; + Channel *channel; hashv = hash_channel_name(name); - for (tmp = channelTable[hashv]; tmp; tmp = tmp->hnextch) - { - if (smycmp(name, tmp->chname) == 0) - return tmp; - } - return default_result; + for (channel = channelTable[hashv]; channel; channel = channel->hnextch) + if (smycmp(name, channel->name) == 0) + return channel; + + return NULL; } /** @} */ @@ -599,303 +588,6 @@ Channel *hash_get_chan_bucket(uint64_t hashv) return channelTable[hashv]; } -void count_watch_memory(int *count, u_long *memory) -{ - int i = WATCH_HASH_TABLE_SIZE; - Watch *anptr; - - while (i--) - { - anptr = watchTable[i]; - while (anptr) - { - (*count)++; - (*memory) += sizeof(Watch)+strlen(anptr->nick); - anptr = anptr->hnext; - } - } -} - -/* - * add_to_watch_hash_table - */ -int add_to_watch_hash_table(char *nick, Client *client, int awaynotify) -{ - unsigned int hashv; - Watch *anptr; - Link *lp; - - - /* Get the right bucket... */ - hashv = hash_watch_nick_name(nick); - - /* Find the right nick (header) in the bucket, or NULL... */ - if ((anptr = (Watch *)watchTable[hashv])) - while (anptr && mycmp(anptr->nick, nick)) - anptr = anptr->hnext; - - /* If found NULL (no header for this nick), make one... */ - if (!anptr) { - anptr = (Watch *)safe_alloc(sizeof(Watch)+strlen(nick)); - anptr->lasttime = timeofday; - strcpy(anptr->nick, nick); - - anptr->watch = NULL; - - anptr->hnext = watchTable[hashv]; - watchTable[hashv] = anptr; - } - /* Is this client already on the watch-list? */ - if ((lp = anptr->watch)) - while (lp && (lp->value.client != client)) - lp = lp->next; - - /* No it isn't, so add it in the bucket and client addint it */ - if (!lp) { - lp = anptr->watch; - anptr->watch = make_link(); - anptr->watch->value.client = client; - anptr->watch->flags = awaynotify; - anptr->watch->next = lp; - - lp = make_link(); - lp->next = client->local->watch; - lp->value.wptr = anptr; - lp->flags = awaynotify; - client->local->watch = lp; - client->local->watches++; - } - - return 0; -} - -/* - * hash_check_watch - */ -int hash_check_watch(Client *client, int reply) -{ - unsigned int hashv; - Watch *anptr; - Link *lp; - int awaynotify = 0; - - if ((reply == RPL_GONEAWAY) || (reply == RPL_NOTAWAY) || (reply == RPL_REAWAY)) - awaynotify = 1; - - /* Get us the right bucket */ - hashv = hash_watch_nick_name(client->name); - - /* Find the right header in this bucket */ - if ((anptr = (Watch *)watchTable[hashv])) - while (anptr && mycmp(anptr->nick, client->name)) - anptr = anptr->hnext; - if (!anptr) - return 0; /* This nick isn't on watch */ - - /* Update the time of last change to item */ - anptr->lasttime = TStime(); - - /* Send notifies out to everybody on the list in header */ - for (lp = anptr->watch; lp; lp = lp->next) - { - if (!awaynotify) - { - sendnumeric(lp->value.client, reply, - client->name, - (IsUser(client) ? client->user->username : ""), - (IsUser(client) ? - (IsHidden(client) ? client->user->virthost : client-> - user->realhost) : ""), anptr->lasttime, client->info); - } - else - { - /* AWAY or UNAWAY */ - if (!lp->flags) - continue; /* skip away/unaway notification for users not interested in them */ - - if (reply == RPL_NOTAWAY) - sendnumeric(lp->value.client, reply, - client->name, - (IsUser(client) ? client->user->username : ""), - (IsUser(client) ? - (IsHidden(client) ? client->user->virthost : client-> - user->realhost) : ""), client->user->lastaway); - else /* RPL_GONEAWAY / RPL_REAWAY */ - sendnumeric(lp->value.client, reply, - client->name, - (IsUser(client) ? client->user->username : ""), - (IsUser(client) ? - (IsHidden(client) ? client->user->virthost : client-> - user->realhost) : ""), client->user->lastaway, client->user->away); - } - } - - return 0; -} - -/* - * hash_get_watch - */ -Watch *hash_get_watch(char *nick) -{ - unsigned int hashv; - Watch *anptr; - - hashv = hash_watch_nick_name(nick); - - if ((anptr = (Watch *)watchTable[hashv])) - while (anptr && mycmp(anptr->nick, nick)) - anptr = anptr->hnext; - - return anptr; -} - -/* - * del_from_watch_hash_table - */ -int del_from_watch_hash_table(char *nick, Client *client) -{ - unsigned int hashv; - Watch *anptr, *nlast = NULL; - Link *lp, *last = NULL; - - /* Get the bucket for this nick... */ - hashv = hash_watch_nick_name(nick); - - /* Find the right header, maintaining last-link pointer... */ - if ((anptr = (Watch *)watchTable[hashv])) - while (anptr && mycmp(anptr->nick, nick)) { - nlast = anptr; - anptr = anptr->hnext; - } - if (!anptr) - return 0; /* No such watch */ - - /* Find this client from the list of notifies... with last-ptr. */ - if ((lp = anptr->watch)) - while (lp && (lp->value.client != client)) { - last = lp; - lp = lp->next; - } - if (!lp) - return 0; /* No such client to watch */ - - /* Fix the linked list under header, then remove the watch entry */ - if (!last) - anptr->watch = lp->next; - else - last->next = lp->next; - free_link(lp); - - /* Do the same regarding the links in client-record... */ - last = NULL; - if ((lp = client->local->watch)) - while (lp && (lp->value.wptr != anptr)) { - last = lp; - lp = lp->next; - } - - /* - * Give error on the odd case... probobly not even neccessary - * No error checking in ircd is unneccessary ;) -Cabal95 - */ - if (!lp) - sendto_ops("WATCH debug error: del_from_watch_hash_table " - "found a watch entry with no client " - "counterpoint processing nick %s on client %p!", - nick, client->user); - else { - if (!last) /* First one matched */ - client->local->watch = lp->next; - else - last->next = lp->next; - free_link(lp); - } - /* In case this header is now empty of notices, remove it */ - if (!anptr->watch) { - if (!nlast) - watchTable[hashv] = anptr->hnext; - else - nlast->hnext = anptr->hnext; - safe_free(anptr); - } - - /* Update count of notifies on nick */ - client->local->watches--; - - return 0; -} - -/* - * hash_del_watch_list - */ -int hash_del_watch_list(Client *client) -{ - unsigned int hashv; - Watch *anptr; - Link *np, *lp, *last; - - - if (!(np = client->local->watch)) - return 0; /* Nothing to do */ - - client->local->watch = NULL; /* Break the watch-list for client */ - while (np) { - /* Find the watch-record from hash-table... */ - anptr = np->value.wptr; - last = NULL; - for (lp = anptr->watch; lp && (lp->value.client != client); - lp = lp->next) - last = lp; - - /* Not found, another "worst case" debug error */ - if (!lp) - sendto_ops("WATCH Debug error: hash_del_watch_list " - "found a WATCH entry with no table " - "counterpoint processing client %s!", - client->name); - else { - /* Fix the watch-list and remove entry */ - if (!last) - anptr->watch = lp->next; - else - last->next = lp->next; - free_link(lp); - - /* - * If this leaves a header without notifies, - * remove it. Need to find the last-pointer! - */ - if (!anptr->watch) { - Watch *np2, *nl; - - hashv = hash_watch_nick_name(anptr->nick); - - nl = NULL; - np2 = watchTable[hashv]; - while (np2 != anptr) { - nl = np2; - np2 = np2->hnext; - } - - if (nl) - nl->hnext = anptr->hnext; - else - watchTable[hashv] = anptr->hnext; - safe_free(anptr); - } - } - - lp = np; /* Save last pointer processed */ - np = np->next; /* Jump to the next pointer */ - free_link(lp); /* Free the previous */ - } - - client->local->watches = 0; - - return 0; -} - /* Throttling - originally by Stskeeps */ /* Note that we call this set::anti-flood::connect-flood nowadays */ @@ -925,15 +617,7 @@ void update_throttling_timer_settings(void) EventMod(EventFind("throttling_check_expire"), &eInfo); } -void init_throttling() -{ - EventAdd(NULL, "throttling_check_expire", throttling_check_expire, NULL, 123456, 0); - /* Note: the every_ms value (123,456) will be adjusted on boot and rehash - * via the update_throttling_timer_settings() function. - */ -} - -uint64_t hash_throttling(char *ip) +uint64_t hash_throttling(const char *ip) { return siphash(ip, siphashkey_throttling) % THROTTLING_HASH_TABLE_SIZE; } diff --git a/src/ircd.c b/src/ircd.c index ed1e0d4..dbb5554 100644 --- a/src/ircd.c +++ b/src/ircd.c @@ -34,7 +34,6 @@ time_t timeofday = 0; struct timeval timeofday_tv; int tainted = 0; LoopStruct loop; -MODVAR MemoryInfo StatsZ; #ifndef _WIN32 uid_t irc_uid = 0; gid_t irc_gid = 0; @@ -51,12 +50,8 @@ extern SERVICE_STATUS IRCDStatus; MODVAR unsigned char conf_debuglevel = 0; -#ifdef USE_LIBCURL -extern void url_init(void); -#endif - -void server_reboot(char *); -void restart(char *); +void server_reboot(const char *); +void restart(const char *); static void open_debugfile(), setup_signals(); extern void init_glines(void); extern void tkl_init(void); @@ -82,7 +77,7 @@ void s_die() Client *client; if (!IsService) { - loop.ircd_terminating = 1; + loop.terminating = 1; unload_all_modules(); list_for_each_entry(client, &lclient_list, lclient_node) @@ -97,7 +92,7 @@ void s_die() ControlService(hService, SERVICE_CONTROL_STOP, &status); } #else - loop.ircd_terminating = 1; + loop.terminating = 1; unload_all_modules(); unlink(conf_files ? conf_files->pid_file : IRCD_PIDFILE); exit(0); @@ -128,7 +123,7 @@ static void s_reloadcert() } #endif // #ifndef _WIN32 -void restart(char *mesg) +void restart(const char *mesg) { server_reboot(mesg); } @@ -174,12 +169,13 @@ void ignore_this_signal() #endif /* #ifndef _WIN32 */ -void server_reboot(char *mesg) +void server_reboot(const char *mesg) { int i; Client *client; - sendto_realops("Aieeeee!!! Restarting server... %s", mesg); - Debug((DEBUG_NOTICE, "Restarting server... %s", mesg)); + unreal_log(ULOG_INFO, "main", "UNREALIRCD_RESTARTING", NULL, + "Restarting server: $reason", + log_data_string("reason", mesg)); list_for_each_entry(client, &lclient_list, lclient_node) (void) send_queued(client); @@ -206,12 +202,6 @@ void server_reboot(char *mesg) CleanUp(); WinExec(cmdLine, SW_SHOWDEFAULT); } -#endif -#ifndef _WIN32 - Debug((DEBUG_FATAL, "Couldn't restart server: %s", strerror(errno))); -#else - Debug((DEBUG_FATAL, "Couldn't restart server: %s", - strerror(GetLastError()))); #endif unload_all_modules(); #ifdef _WIN32 @@ -254,7 +244,7 @@ EVENT(garbage_collect) int ii; if (loop.do_garbage_collect == 1) - sendto_realops("Doing garbage collection .."); + unreal_log(ULOG_INFO, "main", "GARBAGE_COLLECT_STARTED", NULL, "Doing garbage collection..."); if (freelinks > HOW_MANY_FREELINKS_ALLOWED) { ii = freelinks; while (freelink && (freelinks > HOW_MANY_FREELINKS_ALLOWED)) { @@ -265,65 +255,20 @@ EVENT(garbage_collect) } if (loop.do_garbage_collect == 1) { loop.do_garbage_collect = 0; - sendto_realops - ("Cleaned up %i garbage blocks", (ii - freelinks)); + unreal_log(ULOG_INFO, "main", "GARBAGE_COLLECT_STARTED", NULL, "Cleaned up $count garbage blocks", + (ii - freelinks)); } } if (loop.do_garbage_collect == 1) loop.do_garbage_collect = 0; } -/** Perform autoconnect to servers that are not linked yet. */ -EVENT(try_connections) -{ - ConfigItem_link *aconf; - ConfigItem_deny_link *deny; - Client *client; - int confrq; - ConfigItem_class *class; - - for (aconf = conf_link; aconf; aconf = aconf->next) - { - /* We're only interested in autoconnect blocks that are valid. Also, we ignore temporary link blocks. */ - if (!(aconf->outgoing.options & CONNECT_AUTO) || !aconf->outgoing.hostname || (aconf->flag.temporary == 1)) - continue; - - class = aconf->class; - - /* Only do one connection attempt per seconds (for the same server) */ - if ((aconf->hold > TStime())) - continue; - - confrq = class->connfreq; - aconf->hold = TStime() + confrq; - - client = find_client(aconf->servername, NULL); - if (client) - continue; /* Server already connected (or connecting) */ - - if (class->clients >= class->maxclients) - continue; /* Class is full */ - - /* Check connect rules to see if we're allowed to try the link */ - for (deny = conf_deny_link; deny; deny = deny->next) - if (match_simple(deny->mask, aconf->servername) && crule_eval(deny->rule)) - break; - - if (!deny && connect_server(aconf, NULL, NULL) == 0) - sendto_ops_and_log("Trying to activate link with server %s[%s]...", - aconf->servername, aconf->outgoing.hostname); - - } -} - /** Does this user match any TKL's? */ int match_tkls(Client *client) { ConfigItem_ban *bconf = NULL; char banbuf[1024]; - char killflag = 0; - /* Process dynamic *LINES */ if (find_tkline_match(client, 0)) return 1; /* user killed */ @@ -334,35 +279,25 @@ int match_tkls(Client *client) { /* Check ban realname { } */ if (!ValidatePermissionsForPath("immune",client,NULL,NULL,NULL) && (bconf = find_ban(NULL, client->info, CONF_BAN_REALNAME))) - killflag++; - } + { + unreal_log(ULOG_INFO, "tkl", "BAN_REALNAME", client, + "Banned client $client.details due to realname ban: $reason", + bconf->reason ? bconf->reason : "no reason"); - /* If user is meant to be killed, take action: */ - if (killflag) - { - if (IsUser(client)) - sendto_realops("Ban active for %s (%s)", - get_client_name(client, FALSE), - bconf->reason ? bconf->reason : "no reason"); - - if (IsServer(client)) - sendto_realops("Ban active for server %s (%s)", - get_client_name(client, FALSE), - bconf->reason ? bconf->reason : "no reason"); - - if (bconf->reason) { - if (IsUser(client)) - snprintf(banbuf, sizeof(banbuf), "User has been banned (%s)", bconf->reason); - else - snprintf(banbuf, sizeof(banbuf), "Banned (%s)", bconf->reason); - exit_client(client, NULL, banbuf); - } else { - if (IsUser(client)) - exit_client(client, NULL, "User has been banned"); - else - exit_client(client, NULL, "Banned"); + if (bconf->reason) { + if (IsUser(client)) + snprintf(banbuf, sizeof(banbuf), "User has been banned (%s)", bconf->reason); + else + snprintf(banbuf, sizeof(banbuf), "Banned (%s)", bconf->reason); + exit_client(client, NULL, banbuf); + } else { + if (IsUser(client)) + exit_client(client, NULL, "User has been banned"); + else + exit_client(client, NULL, "Banned"); + } + return 1; /* stop processing, client is dead now */ } - return 1; /* stop processing this user, as (s)he is dead now. */ } if (loop.do_bancheck_spamf_user && IsUser(client) && find_spamfilter_user(client, SPAMFLAG_NOWARN)) @@ -385,14 +320,10 @@ EVENT(handshake_timeout) list_for_each_entry_safe(client, next, &unknown_list, lclient_node) { - if (client->local->firsttime && ((TStime() - client->local->firsttime) > iConf.handshake_timeout)) + if (client->local->creationtime && ((TStime() - client->local->creationtime) > iConf.handshake_timeout)) { - if (client->serv && *client->serv->by) - { - /* If this is a handshake timeout to an outgoing server then notify ops & log it */ - sendto_ops_and_log("Connection handshake timeout while trying to link to server '%s' (%s)", - client->name, client->ip?client->ip:""); - } + if (client->server && *client->server->by) + continue; /* handled by server module */ exit_client(client, NULL, "Registration Timeout"); continue; @@ -407,37 +338,31 @@ void check_ping(Client *client) int ping = 0; ping = client->local->class ? client->local->class->pingfreq : iConf.handshake_timeout; - Debug((DEBUG_DEBUG, "c(%s)=%d p %d a %lld", client->name, - client->status, ping, - (long long)(TStime() - client->local->lasttime))); /* If ping is less than or equal to the last time we received a command from them */ - if (ping > (TStime() - client->local->lasttime)) + if (ping > (TStime() - client->local->last_msg_received)) return; /* some recent command was executed */ if ( /* If we have sent a ping */ (IsPingSent(client) /* And they had 2x ping frequency to respond */ - && ((TStime() - client->local->lasttime) >= (2 * ping))) + && ((TStime() - client->local->last_msg_received) >= (2 * ping))) || /* Or isn't registered and time spent is larger than ping (CONNECTTIMEOUT).. */ - (!IsRegistered(client) && (TStime() - client->local->since >= ping)) + (!IsRegistered(client) && (TStime() - client->local->fake_lag >= ping)) ) { if (IsServer(client) || IsConnecting(client) || IsHandshake(client) || IsTLSConnectHandshake(client)) { - sendto_umode_global(UMODE_OPER, "No response from %s, closing link", - get_client_name(client, FALSE)); - ircd_log(LOG_ERROR, "No response from %s, closing link", - get_client_name(client, FALSE)); + unreal_log(ULOG_ERROR, "link", "LINK_DISCONNECTED", client, + "Lost server link to $client [$client.ip]: No response (Ping timeout)", + client->server->conf ? log_data_link_block(client->server->conf) : NULL); + SetServerDisconnectLogged(client); } - if (IsTLSAcceptHandshake(client)) - Debug((DEBUG_DEBUG, "ssl accept handshake timeout: %s (%lld-%lld > %lld)", client->local->sockhost, - (long long)TStime(), (long long)client->local->since, (long long)ping)); ircsnprintf(scratch, sizeof(scratch), "Ping timeout: %lld seconds", - (long long) (TStime() - client->local->lasttime)); + (long long) (TStime() - client->local->last_msg_received)); exit_client(client, NULL, scratch); return; } @@ -447,17 +372,19 @@ void check_ping(Client *client) SetPingSent(client); ClearPingWarning(client); /* not nice but does the job */ - client->local->lasttime = TStime() - ping; + client->local->last_msg_received = TStime() - ping; sendto_one(client, NULL, "PING :%s", me.name); } else if (!IsPingWarning(client) && PINGWARNING > 0 && (IsServer(client) || IsHandshake(client) || IsConnecting(client) || IsTLSConnectHandshake(client)) && - (TStime() - client->local->lasttime) >= (ping + PINGWARNING)) + (TStime() - client->local->last_msg_received) >= (ping + PINGWARNING)) { SetPingWarning(client); - sendto_realops("Warning, no response from %s for %d seconds", - get_client_name(client, FALSE), PINGWARNING); + unreal_log(ULOG_WARNING, "link", "LINK_UNRELIABLE", client, + "Warning, no response from $client for $time_delta seconds", + log_data_integer("time_delta", PINGWARNING), + client->server->conf ? log_data_link_block(client->server->conf) : NULL); } return; @@ -496,9 +423,6 @@ EVENT(check_deadsockets) /* No need to notify opers here. It's already done when dead socket is set */ if (IsDeadSocket(client)) { -#ifdef DEBUGMODE - ircd_log(LOG_ERROR, "Closing deadsock: %d/%s", client->local->fd, client->name); -#endif ClearDeadSocket(client); /* CPR. So we send the error. */ exit_client(client, NULL, client->local->error_str ? client->local->error_str : "Dead socket"); continue; @@ -510,9 +434,6 @@ EVENT(check_deadsockets) /* No need to notify opers here. It's already done when dead socket is set */ if (IsDeadSocket(client)) { -#ifdef DEBUGMODE - ircd_log(LOG_ERROR, "Closing deadsock: %d/%s", client->local->fd, client->name); -#endif ClearDeadSocket(client); /* CPR. So we send the error. */ exit_client(client, NULL, client->local->error_str ? client->local->error_str : "Dead socket"); continue; @@ -562,21 +483,6 @@ char chess[] = { 85, 110, 114, 101, 97, 108, 0 }; -static void version_check_logerror(char *fmt, ...) -{ -va_list va; -char buf[1024]; - - va_start(va, fmt); - vsnprintf(buf, sizeof(buf), fmt, va); - va_end(va); -#ifndef _WIN32 - fprintf(stderr, "[!!!] %s\n", buf); -#else - win_log("[!!!] %s", buf); -#endif -} - extern void applymeblock(void); extern MODVAR Event *events; @@ -595,41 +501,20 @@ void fix_timers(void) list_for_each_entry(client, &lclient_list, lclient_node) { - if (client->local->since > TStime()) - { - Debug((DEBUG_DEBUG, "fix_timers(): %s: client->local->since %ld -> %ld", - client->name, client->local->since, TStime())); - client->local->since = TStime(); - } - if (client->local->lasttime > TStime()) - { - Debug((DEBUG_DEBUG, "fix_timers(): %s: client->local->lasttime %ld -> %ld", - client->name, client->local->lasttime, TStime())); - client->local->lasttime = TStime(); - } - if (client->local->last > TStime()) - { - Debug((DEBUG_DEBUG, "fix_timers(): %s: client->local->last %ld -> %ld", - client->name, client->local->last, TStime())); - client->local->last = TStime(); - } + if (client->local->fake_lag > TStime()) + client->local->fake_lag = TStime(); + if (client->local->last_msg_received > TStime()) + client->local->last_msg_received = TStime(); + if (client->local->idle_since > TStime()) + client->local->idle_since = TStime(); /* users */ if (MyUser(client)) { - if (client->local->nextnick > TStime()) - { - Debug((DEBUG_DEBUG, "fix_timers(): %s: client->local->nextnick %ld -> %ld", - client->name, client->local->nextnick, TStime())); - client->local->nextnick = TStime(); - } + if (client->local->next_nick_allowed > TStime()) + client->local->next_nick_allowed = TStime(); if (client->local->nexttarget > TStime()) - { - Debug((DEBUG_DEBUG, "fix_timers(): %s: client->local->nexttarget %ld -> %ld", - client->name, client->local->nexttarget, TStime())); client->local->nexttarget = TStime(); - } - } } @@ -658,7 +543,6 @@ void fix_timers(void) thr->since = TStime(); } } - Debug((DEBUG_DEBUG, "fix_timers(): removed %d throttling item(s)", cnt)); /* Make sure autoconnect for servers still works (lnk->hold) */ for (lnk = conf_link; lnk; lnk = lnk->next) @@ -668,37 +552,34 @@ void fix_timers(void) if (lnk->hold > TStime() + t) { lnk->hold = TStime() + (t / 2); /* compromise */ - Debug((DEBUG_DEBUG, "fix_timers(): link '%s' hold-time adjusted to %ld", lnk->servername, lnk->hold)); } } } #ifndef _WIN32 +/* Generate 3 cloak keys and print to console */ static void generate_cloakkeys() { - /* Generate 3 cloak keys */ -#define GENERATE_CLOAKKEY_MINLEN 50 -#define GENERATE_CLOAKKEY_MAXLEN 60 /* Length of cloak keys to generate. */ - char keyBuf[GENERATE_CLOAKKEY_MAXLEN + 1]; + #define GENERATE_CLOAKKEY_LEN 80 /* Length of cloak keys to generate. */ + char keyBuf[GENERATE_CLOAKKEY_LEN + 1]; int keyNum; - int keyLen; int charIndex; short has_upper; short has_lower; short has_num; - fprintf(stderr, "Here are 3 random cloak keys:\n"); + fprintf(stderr, "Here are 3 random cloak keys that you can copy-paste to your configuration file:\n\n"); + fprintf(stderr, "set {\n\tcloak-keys {\n"); for (keyNum = 0; keyNum < 3; ++keyNum) { has_upper = 0; has_lower = 0; has_num = 0; - keyLen = (getrandom8() % (GENERATE_CLOAKKEY_MAXLEN - GENERATE_CLOAKKEY_MINLEN + 1)) + GENERATE_CLOAKKEY_MINLEN; - for (charIndex = 0; charIndex < keyLen; ++charIndex) + for (charIndex = 0; charIndex < sizeof(keyBuf)-1; ++charIndex) { switch (getrandom8() % 3) { @@ -716,14 +597,15 @@ static void generate_cloakkeys() break; } } - keyBuf[keyLen] = '\0'; + keyBuf[sizeof(keyBuf)-1] = '\0'; if (has_upper && has_lower && has_num) - (void)fprintf(stderr, "%s\n", keyBuf); + fprintf(stderr, "\t\t\"%s\";\n", keyBuf); else /* Try again. For this reason, keyNum must be signed. */ keyNum--; } + fprintf(stderr, "\t}\n}\n\n"); } #endif @@ -743,38 +625,35 @@ void detect_timeshift_and_warn(void) if (oldtimeofday == 0) oldtimeofday = timeofday; /* pretend everything is ok the first time.. */ - if (mytdiff(timeofday, oldtimeofday) < NEGATIVE_SHIFT_WARN) { + if (mytdiff(timeofday, oldtimeofday) < NEGATIVE_SHIFT_WARN) + { /* tdiff = # of seconds of time set backwards (positive number! eg: 60) */ time_t tdiff = oldtimeofday - timeofday; - ircd_log(LOG_ERROR, "WARNING: Time running backwards! Clock set back ~%lld seconds (%lld -> %lld)", - (long long)tdiff, (long long)oldtimeofday, (long long)timeofday); - ircd_log(LOG_ERROR, "[TimeShift] Resetting a few timers to prevent IRCd freeze!"); - sendto_realops("WARNING: Time running backwards! Clock set back ~%lld seconds (%lld -> %lld)", - (long long)tdiff, (long long)oldtimeofday, (long long)timeofday); - sendto_realops("Incorrect time for IRC servers is a serious problem. " - "Time being set backwards (system clock changed) is " - "even more serious and can cause clients to freeze, channels to be " - "taken over, and other issues."); - sendto_realops("Please be sure your clock is always synchronized before " - "the IRCd is started!"); - sendto_realops("[TimeShift] Resetting a few timers to prevent IRCd freeze!"); + unreal_log(ULOG_WARNING, "system", "SYSTEM_CLOCK_JUMP_BACKWARDS", NULL, + "System clock jumped back in time ~$time_delta seconds ($time_from -> $time_to)\n" + "Incorrect time for IRC servers is a serious problem. " + "Time being set backwards (system clock changed) is " + "even more serious and can cause clients to freeze, channels to be " + "taken over, and other issues.\n" + "Please be sure your clock is always synchronized before the IRCd is started!", + log_data_integer("time_delta", tdiff), + log_data_timestamp("time_from", oldtimeofday), + log_data_timestamp("time_to", timeofday)); fix_timers(); } else if (mytdiff(timeofday, oldtimeofday) > POSITIVE_SHIFT_WARN) /* do not set too low or you get false positives */ { /* tdiff = # of seconds of time set forward (eg: 60) */ time_t tdiff = timeofday - oldtimeofday; - ircd_log(LOG_ERROR, "WARNING: Time jumped ~%lld seconds ahead! (%lld -> %lld)", - (long long)tdiff, (long long)oldtimeofday, (long long)timeofday); - ircd_log(LOG_ERROR, "[TimeShift] Resetting some timers!"); - sendto_realops("WARNING: Time jumped ~%lld seconds ahead! (%lld -> %lld)", - (long long)tdiff, (long long)oldtimeofday, (long long)timeofday); - sendto_realops("Incorrect time for IRC servers is a serious problem. " - "Time being adjusted (by changing the system clock) " - "more than a few seconds forward/backward can lead to serious issues."); - sendto_realops("Please be sure your clock is always synchronized before " - "the IRCd is started!"); - sendto_realops("[TimeShift] Resetting some timers!"); + unreal_log(ULOG_WARNING, "system", "SYSTEM_CLOCK_JUMP_FORWARDS", NULL, + "System clock jumped ~$time_delta seconds forward ($time_from -> $time_to)\n" + "Incorrect time for IRC servers is a serious problem. " + "Time being adjusted (by changing the system clock) " + "more than a few seconds forward/backward can lead to serious issues.\n" + "Please be sure your clock is always synchronized before the IRCd is started!", + log_data_integer("time_delta", tdiff), + log_data_timestamp("time_from", oldtimeofday), + log_data_timestamp("time_to", timeofday)); fix_timers(); } @@ -784,13 +663,11 @@ void detect_timeshift_and_warn(void) lasthighwarn = timeofday; if (timeofday - lasthighwarn > 300) { - ircd_log(LOG_ERROR, "[TimeShift] The (IRCd) clock was set backwards. " - "Waiting for time to be OK again. This will be in %lld seconds", - (long long)(highesttimeofday - timeofday)); - sendto_realops("[TimeShift] The (IRCd) clock was set backwards. Timers, nick- " - "and channel-timestamps are possibly incorrect. This message will " - "repeat itself until we catch up with the original time, which will be " - "in %lld seconds", (long long)(highesttimeofday - timeofday)); + unreal_log(ULOG_WARNING, "system", "SYSTEM_CLOCK_JUMP_BACKWARDS_PREVIOUSLY", NULL, + "The system clock previously went backwards. Waiting for time to be OK again. This will be in $time_delta seconds.", + log_data_integer("time_delta", highesttimeofday - timeofday), + log_data_timestamp("time_from", highesttimeofday), + log_data_timestamp("time_to", timeofday)); lasthighwarn = timeofday; } } else { @@ -909,7 +786,6 @@ int InitUnrealIRCd(int argc, char *argv[]) #else WSAStartup(wVersionRequested, &wsaData); #endif - memset(&StatsZ, 0, sizeof(StatsZ)); setup_signals(); memset(&irccounts, '\0', sizeof(irccounts)); @@ -918,10 +794,10 @@ int InitUnrealIRCd(int argc, char *argv[]) mp_pool_init(); dbuf_init(); initlists(); + initlist_channels(); -#ifdef USE_LIBCURL + early_init_tls(); url_init(); -#endif tkl_init(); umode_init(); extcmode_init(); @@ -967,7 +843,7 @@ int InitUnrealIRCd(int argc, char *argv[]) #ifndef _WIN32 case 'P':{ short type; - char *result; + const char *result; srandom(TStime()); type = Auth_FindType(NULL, p); if (type == -1) @@ -1001,11 +877,10 @@ int InitUnrealIRCd(int argc, char *argv[]) exit(0); } #endif -#if 1 +#if 0 case 'S': - //charsys_dump_table(p ? p : "*"); - unrealdb_test(); - exit(0); + charsys_dump_table(p ? p : "*"); + //unrealdb_test(); #endif #ifndef _WIN32 case 't': @@ -1065,14 +940,6 @@ int InitUnrealIRCd(int argc, char *argv[]) fprintf(stderr, "It is impossible to get here\n"); exit(0); } - case 'U': - if (chdir(CONFDIR) < 0) - { - fprintf(stderr, "Unable to change to '%s' directory\n", CONFDIR); - exit(1); - } - update_conf(); - exit(0); case 'R': report_crash(); exit(0); @@ -1142,7 +1009,8 @@ int InitUnrealIRCd(int argc, char *argv[]) #ifndef _WIN32 fprintf(stderr, "%s", unreallogo); fprintf(stderr, " v%s\n\n", VERSIONONLY); - fprintf(stderr, "UnrealIRCd is brought to you by Bram Matthys (Syzop), Gottem and i\n\n"); + fprintf(stderr, "UnrealIRCd is brought to you by Bram Matthys (Syzop),\n" + "Krzysztof Beresztant (k4be), Gottem and i\n\n"); fprintf(stderr, "Using the following libraries:\n"); fprintf(stderr, "* %s\n", SSLeay_version(SSLEAY_VERSION)); @@ -1170,7 +1038,7 @@ int InitUnrealIRCd(int argc, char *argv[]) (void)chmod(CPATH, DEFAULT_PERMISSIONS); #endif init_dynconf(); - early_init_ssl(); + init_sys(); /* * Add default class */ @@ -1181,10 +1049,17 @@ int InitUnrealIRCd(int argc, char *argv[]) default_class->sendq = DEFAULT_RECVQ; default_class->name = "default"; AddListItem(default_class, conf_class); - if (init_conf(configfile, 0) < 0) - { + if (config_read_start() < 0) exit(-1); + while (!is_config_read_finished()) + { + gettimeofday(&timeofday_tv, NULL); + timeofday = timeofday_tv.tv_sec; + url_socket_timeout(NULL); + fd_select(500); } + if (config_test() < 0) + exit(-1); booted = TRUE; load_tunefile(); make_umodestr(); @@ -1192,7 +1067,6 @@ int InitUnrealIRCd(int argc, char *argv[]) me.local->fd = -1; SetMe(&me); make_server(&me); - extcmodes_check_for_changes(); umodes_check_for_changes(); charsys_check_for_changes(); clicap_init(); @@ -1202,37 +1076,30 @@ int InitUnrealIRCd(int argc, char *argv[]) exit(-4); } -#ifndef _WIN32 - fprintf(stderr, "Initializing TLS..\n"); -#endif - if (!init_ssl()) + if (!init_tls()) { - config_error("Failed to load SSL/TLS (see errors above). UnrealIRCd can not start."); + config_error("Failed to load TLS (see errors above). UnrealIRCd can not start."); #ifdef _WIN32 win_error(); /* display error dialog box */ #endif exit(9); } + unreal_log(ULOG_INFO, "config", "CONFIG_PASSED", NULL, "Configuration test passed OK"); if (loop.config_test) { - ircd_log(LOG_ERROR, "Configuration test passed OK"); fflush(stderr); exit(0); } if (loop.boot_function) loop.boot_function(); -#ifndef _WIN32 - fprintf(stderr, "Dynamic configuration initialized.. booting IRCd.\n"); -#endif open_debugfile(); me.local->port = 6667; /* pointless? */ - init_sys(); applymeblock(); #ifdef HAVE_SYSLOG openlog("ircd", LOG_PID | LOG_NDELAY, LOG_DAEMON); #endif - run_configuration(); - ircd_log(LOG_ERROR, "UnrealIRCd started."); + config_run(); + unreal_log(ULOG_INFO, "main", "UNREALIRCD_START", NULL, "UnrealIRCd started."); read_motd(conf_files->botmotd_file, &botmotd); read_motd(conf_files->rules_file, &rules); @@ -1250,11 +1117,10 @@ int InitUnrealIRCd(int argc, char *argv[]) * This listener will never go away */ me_hash = find_or_add(me.name); - me.serv->up = me_hash; timeofday = time(NULL); - me.local->lasttime = me.local->since = me.local->firsttime = me.serv->boottime = TStime(); - me.serv->features.protocol = UnrealProtocol; - safe_strdup(me.serv->features.software, version); + me.local->last_msg_received = me.local->fake_lag = me.local->creationtime = me.server->boottime = TStime(); + me.server->features.protocol = UnrealProtocol; + safe_strdup(me.server->features.software, version); add_to_client_hash_table(me.name, &me); add_to_id_hash_table(me.id, &me); list_add(&me.client_node, &global_server_list); @@ -1277,18 +1143,16 @@ int InitUnrealIRCd(int argc, char *argv[]) /* Background process (child) continues below... */ close_std_descriptors(); fd_fork(); - loop.ircd_forked = 1; + loop.forked = 1; } #endif #ifdef _WIN32 - loop.ircd_forked = 1; + loop.forked = 1; #endif fix_timers(); write_pidfile(); - Debug((DEBUG_NOTICE, "Server ready...")); - init_throttling(); - loop.ircd_booted = 1; + loop.booted = 1; #if defined(HAVE_SETPROCTITLE) setproctitle("%s", me.name); #elif defined(HAVE_PSTAT) @@ -1346,7 +1210,7 @@ void SocketLoop(void *dummy) */ if (dorehash) { - (void)rehash(&me, 1); + request_rehash(NULL); dorehash = 0; } if (dorestart) @@ -1355,7 +1219,8 @@ void SocketLoop(void *dummy) } if (doreloadcert) { - reinit_ssl(NULL); + unreal_log(ULOG_INFO, "config", "CONFIG_RELOAD_TLS", NULL, "Reloading all TLS related data (./unrealircd reloadtls)"); + reinit_tls(); doreloadcert = 0; } } @@ -1408,9 +1273,6 @@ static void open_debugfile(void) else # endif strlcpy(client->name, "FD2-Pipe", sizeof(client->name)); - Debug((DEBUG_FATAL, - "Debug: File <%s> Level: %d at %s", client->name, - client->local->port, myctime(time(NULL)))); } #endif } diff --git a/src/list.c b/src/list.c index 7007378..d752fb8 100644 --- a/src/list.c +++ b/src/list.c @@ -104,14 +104,14 @@ Client *make_client(Client *from, Client *servr) /* Note: all fields are already NULL/0, no need to set here */ client->direction = from ? from : client; /* 'from' of local client is self! */ - client->srvptr = servr; + client->uplink = servr; client->status = CLIENT_STATUS_UNKNOWN; INIT_LIST_HEAD(&client->client_node); INIT_LIST_HEAD(&client->client_hash); INIT_LIST_HEAD(&client->id_hash); - strcpy(client->ident, "unknown"); + strlcpy(client->ident, "unknown", sizeof(client->ident)); if (!from) { /* Local client */ @@ -123,9 +123,9 @@ Client *make_client(Client *from, Client *servr) INIT_LIST_HEAD(&client->lclient_node); INIT_LIST_HEAD(&client->special_node); - client->local->since = client->local->lasttime = - client->lastnick = client->local->firsttime = - client->local->last = TStime(); + client->local->fake_lag = client->local->last_msg_received = + client->lastnick = client->local->creationtime = + client->local->idle_since = TStime(); client->local->class = NULL; client->local->passwd = NULL; client->local->sockhost[0] = '\0'; @@ -197,7 +197,7 @@ User *make_user(Client *client) #ifdef DEBUGMODE users.inuse++; #endif - strlcpy(user->svid, "0", sizeof(user->svid)); + strlcpy(user->account, "0", sizeof(user->account)); if (client->ip) { /* initially set client->user->realhost to IP */ @@ -213,7 +213,7 @@ User *make_user(Client *client) Server *make_server(Client *client) { - Server *serv = client->serv; + Server *serv = client->server; if (!serv) { @@ -223,8 +223,7 @@ Server *make_server(Client *client) #endif *serv->by = '\0'; serv->users = 0; - serv->up = NULL; - client->serv = serv; + client->server = serv; } if (strlen(client->id) > 3) { @@ -234,7 +233,7 @@ Server *make_server(Client *client) del_from_id_hash_table(client->id, client); *client->id = '\0'; } - return client->serv; + return client->server; } /* @@ -260,6 +259,7 @@ void free_user(Client *client) } safe_free(client->user->virthost); safe_free(client->user->operlogin); + safe_free(client->user->snomask); mp_pool_release(client->user); #ifdef DEBUGMODE users.inuse--; @@ -297,8 +297,8 @@ void remove_client_from_list(Client *client) VERIFY_OPERCOUNT(client, "rmvlist"); } irccounts.clients--; - if (client->srvptr && client->srvptr->serv) - client->srvptr->serv->users--; + if (client->uplink && client->uplink->server) + client->uplink->server->users--; } if (IsUnknown(client) || IsConnecting(client) || IsHandshake(client) || IsTLSHandshake(client) @@ -313,16 +313,16 @@ void remove_client_from_list(Client *client) if (client->user) free_user(client); - if (client->serv) + if (client->server) { - safe_free(client->serv->features.usermodes); - safe_free(client->serv->features.chanmodes[0]); - safe_free(client->serv->features.chanmodes[1]); - safe_free(client->serv->features.chanmodes[2]); - safe_free(client->serv->features.chanmodes[3]); - safe_free(client->serv->features.software); - safe_free(client->serv->features.nickchars); - safe_free(client->serv); + safe_free(client->server->features.usermodes); + safe_free(client->server->features.chanmodes[0]); + safe_free(client->server->features.chanmodes[1]); + safe_free(client->server->features.chanmodes[2]); + safe_free(client->server->features.chanmodes[3]); + safe_free(client->server->features.software); + safe_free(client->server->features.nickchars); + safe_free(client->server); #ifdef DEBUGMODE servs.inuse--; #endif @@ -383,6 +383,16 @@ void free_link(Link *lp) #endif } +/** Returns the length (entry count) of a +beI list */ +int link_list_length(Link *lp) +{ + int count = 0; + + for (; lp; lp = lp->next) + count++; + return count; +} + Ban *make_ban(void) { Ban *lp; @@ -491,7 +501,7 @@ void add_ListItemPrio(ListStructPrio *new, ListStructPrio **list, int priority) /* NameList functions */ -void _add_name_list(NameList **list, char *name) +void _add_name_list(NameList **list, const char *name) { NameList *e = safe_alloc(sizeof(NameList)+strlen(name)); strcpy(e->name, name); /* safe, allocated above */ @@ -509,7 +519,7 @@ void _free_entire_name_list(NameList *n) } } -void _del_name_list(NameList **list, char *name) +void _del_name_list(NameList **list, const char *name) { NameList *e = find_name_list(*list, name); if (e) @@ -523,7 +533,7 @@ void _del_name_list(NameList **list, char *name) /** Find an entry in a NameList - case insensitive comparisson. * @ingroup ListFunctions */ -NameList *find_name_list(NameList *list, char *name) +NameList *find_name_list(NameList *list, const char *name) { NameList *e; @@ -540,7 +550,7 @@ NameList *find_name_list(NameList *list, char *name) /** Find an entry in a NameList by running match_simple() on it. * @ingroup ListFunctions */ -NameList *find_name_list_match(NameList *list, char *name) +NameList *find_name_list_match(NameList *list, const char *name) { NameList *e; @@ -554,7 +564,7 @@ NameList *find_name_list_match(NameList *list, char *name) return NULL; } -void add_nvplist(NameValuePrioList **lst, int priority, char *name, char *value) +void add_nvplist(NameValuePrioList **lst, int priority, const char *name, const char *value) { va_list vl; NameValuePrioList *e = safe_alloc(sizeof(NameValuePrioList)); @@ -564,7 +574,7 @@ void add_nvplist(NameValuePrioList **lst, int priority, char *name, char *value) AddListItemPrio(e, *lst, priority); } -NameValuePrioList *find_nvplist(NameValuePrioList *list, char *name) +NameValuePrioList *find_nvplist(NameValuePrioList *list, const char *name) { NameValuePrioList *e; @@ -578,7 +588,7 @@ NameValuePrioList *find_nvplist(NameValuePrioList *list, char *name) return NULL; } -void add_fmt_nvplist(NameValuePrioList **lst, int priority, char *name, FORMAT_STRING(const char *format), ...) +void add_fmt_nvplist(NameValuePrioList **lst, int priority, const char *name, FORMAT_STRING(const char *format), ...) { char value[512]; va_list vl; @@ -603,3 +613,37 @@ void free_nvplist(NameValuePrioList *lst) safe_free(e); } } + +#define nv_find_by_name(stru, name) do_nv_find_by_name(stru, name, ARRAY_SIZEOF((stru))) + +long do_nv_find_by_name(NameValue *table, const char *cmd, int numelements) +{ + int start = 0; + int stop = numelements-1; + int mid; + while (start <= stop) { + mid = (start+stop)/2; + + if (smycmp(cmd,table[mid].name) < 0) { + stop = mid-1; + } + else if (strcmp(cmd,table[mid].name) == 0) { + return table[mid].value; + } + else + start = mid+1; + } + return 0; +} + +#define nv_find_by_value(stru, value) do_nv_find_by_value(stru, value, ARRAY_SIZEOF((stru))) +const char *do_nv_find_by_value(NameValue *table, long value, int numelements) +{ + int i; + + for (i=0; i < numelements; i++) + if (table[i].value == value) + return table[i].name; + + return NULL; +} diff --git a/src/log.c b/src/log.c new file mode 100644 index 0000000..d21dabb --- /dev/null +++ b/src/log.c @@ -0,0 +1,1871 @@ +/************************************************************************ + * IRC - Internet Relay Chat, src/api-channelmode.c + * (C) 2021 Bram Matthys (Syzop) and the UnrealIRCd Team + * + * See file AUTHORS in IRC package for additional names of + * the programmers. + * + * This program is free 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 1, or (at your option) + * any later version. + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +/** @file + * @brief The logging API + */ + +#define UNREAL_LOGGER_CODE +#include "unrealircd.h" + +// TODO: Make configurable at compile time (runtime won't do, as we haven't read the config file) +#define show_event_id_console 0 + +/* Variables */ +Log *logs[NUM_LOG_DESTINATIONS] = { NULL, NULL, NULL, NULL, NULL }; +Log *temp_logs[NUM_LOG_DESTINATIONS] = { NULL, NULL, NULL, NULL, NULL }; +static int snomask_num_destinations = 0; + +static char snomasks_in_use[257] = { '\0' }; +static char snomasks_in_use_testing[257] = { '\0' }; + +/* Forward declarations */ +int log_sources_match(LogSource *logsource, LogLevel loglevel, const char *subsystem, const char *event_id, int matched_already); +void do_unreal_log_internal(LogLevel loglevel, const char *subsystem, const char *event_id, Client *client, int expand_msg, const char *msg, va_list vl); +void log_blocks_switchover(void); + +/** Convert a regular string value to a JSON string. + * In UnrealIRCd, this must be used instead of json_string() + * as we may use non-UTF8 sequences. Also, this takes care + * of using json_null() if the string was NULL, which is + * usually what we want as well. + * @param s Input string + * @returns a json string value or json null value. + */ +json_t *json_string_unreal(const char *s) +{ + static char buf[8192]; + char *verified_s; + + if (s == NULL) + return json_null(); + + verified_s = unrl_utf8_make_valid(s, buf, sizeof(buf), 0); + return json_string(verified_s); +} + +#define json_string __BAD___DO__NOT__USE__JSON__STRING__PLZ + +json_t *json_timestamp(time_t v) +{ + const char *ts = timestamp_iso8601(v); + if (ts) + return json_string_unreal(ts); + return json_null(); +} + +LogType log_type_stringtoval(const char *str) +{ + if (!strcmp(str, "json")) + return LOG_TYPE_JSON; + if (!strcmp(str, "text")) + return LOG_TYPE_TEXT; + return LOG_TYPE_INVALID; +} + +const char *log_type_valtostring(LogType v) +{ + switch(v) + { + case LOG_TYPE_TEXT: + return "text"; + case LOG_TYPE_JSON: + return "json"; + default: + return NULL; + } +} + +/***** CONFIGURATION ******/ + +LogSource *add_log_source(const char *str) +{ + LogSource *ls; + char buf[256]; + char *p; + LogLevel loglevel = ULOG_INVALID; + char *subsystem = NULL; + char *event_id = NULL; + int negative = 0; + + if (*str == '!') + { + negative = 1; + strlcpy(buf, str+1, sizeof(buf)); + } else + { + strlcpy(buf, str, sizeof(buf)); + } + + p = strchr(buf, '.'); + if (p) + *p++ = '\0'; + + loglevel = log_level_stringtoval(buf); + if (loglevel == ULOG_INVALID) + { + if (isupper(*buf)) + event_id = buf; + else + subsystem = buf; + } + if (p) + { + if (isupper(*p)) + { + event_id = p; + } else + if (loglevel == ULOG_INVALID) + { + loglevel = log_level_stringtoval(p); + if ((loglevel == ULOG_INVALID) && !subsystem) + subsystem = p; + } else if (!subsystem) + { + subsystem = p; + } + } + ls = safe_alloc(sizeof(LogSource)); + ls->loglevel = loglevel; + ls->negative = negative; + if (!BadPtr(subsystem)) + strlcpy(ls->subsystem, subsystem, sizeof(ls->subsystem)); + if (!BadPtr(event_id)) + strlcpy(ls->event_id, event_id, sizeof(ls->event_id)); + + return ls; +} + +void free_log_source(LogSource *l) +{ + safe_free(l); +} + +void free_log_sources(LogSource *l) +{ + LogSource *l_next; + for (; l; l = l_next) + { + l_next = l->next; + free_log_source(l); + } +} + +int config_test_log(ConfigFile *conf, ConfigEntry *block) +{ + int errors = 0; + int any_sources = 0; + ConfigEntry *ce, *cep, *cepp; + int destinations = 0; + + for (ce = block->items; ce; ce = ce->next) + { + if (!strcmp(ce->name, "source")) + { + for (cep = ce->items; cep; cep = cep->next) + { + /* TODO: Validate the sources lightly for formatting issues */ + any_sources = 1; + } + } + if (!strcmp(ce->name, "destination")) + { + for (cep = ce->items; cep; cep = cep->next) + { + if (!strcmp(cep->name, "snomask")) + { + destinations++; + snomask_num_destinations++; + /* We need to validate the parameter here as well */ + if (!cep->value) + { + config_error_blank(cep->file->filename, cep->line_number, "set::logging::snomask"); + errors++; + } else + if ((strlen(cep->value) != 1) || !(islower(cep->value[0]) || isupper(cep->value[0]))) + { + config_error("%s:%d: snomask must be a single letter", + cep->file->filename, cep->line_number); + errors++; + } else { + strlcat(snomasks_in_use_testing, cep->value, sizeof(snomasks_in_use_testing)); + } + } else + if (!strcmp(cep->name, "channel")) + { + destinations++; + /* We need to validate the parameter here as well */ + if (!cep->value) + { + config_error_blank(cep->file->filename, cep->line_number, "set::logging::channel"); + errors++; + } else + if (!valid_channelname(cep->value)) + { + config_error("%s:%d: Invalid channel name '%s'", + cep->file->filename, cep->line_number, cep->value); + errors++; + } + } else + if (!strcmp(cep->name, "file")) + { + destinations++; + if (!cep->value) + { + config_error_blank(cep->file->filename, cep->line_number, "set::logging::file"); + errors++; + continue; + } + convert_to_absolute_path(&cep->value, LOGDIR); + for (cepp = cep->items; cepp; cepp = cepp->next) + { + if (!strcmp(cepp->name, "type")) + { + if (!cepp->value) + { + config_error_empty(cepp->file->filename, + cepp->line_number, "log", cepp->name); + errors++; + continue; + } + if (!log_type_stringtoval(cepp->value)) + { + config_error("%s:%i: unknown log type '%s'", + cepp->file->filename, cepp->line_number, + cepp->value); + errors++; + } + } else + if (!strcmp(cepp->name, "maxsize")) + { + if (!cepp->value) + { + config_error_empty(cepp->file->filename, + cepp->line_number, "log", cepp->name); + errors++; + } + } else + { + config_error_unknown(cepp->file->filename, cepp->line_number, "log::destination::file", cepp->name); + errors++; + } + } + } else + if (!strcmp(cep->name, "remote")) + { + destinations++; + } else + if (!strcmp(cep->name, "syslog")) + { + destinations++; + for (cepp = cep->items; cepp; cepp = cepp->next) + { + if (!strcmp(cepp->name, "type")) + { + if (!cepp->value) + { + config_error_empty(cepp->file->filename, + cepp->line_number, "log", cepp->name); + errors++; + continue; + } + if (!log_type_stringtoval(cepp->value)) + { + config_error("%s:%i: unknown log type '%s'", + cepp->file->filename, cepp->line_number, + cepp->value); + errors++; + } + } else + { + config_error_unknown(cepp->file->filename, cepp->line_number, "log::destination::syslog", cepp->name); + errors++; + } + } + } else + { + config_error_unknownopt(cep->file->filename, cep->line_number, "log::destination", cep->name); + errors++; + continue; + } + } + } + } + + if (!any_sources && !destinations) + { + unreal_log(ULOG_ERROR, "config", "CONFIG_OLD_LOG_BLOCK", NULL, + "$config_file:$line_number: Your log block contains no sources and no destinations.\n" + "The log block changed between UnrealIRCd 5 and UnrealIRCd 6, " + "see https://www.unrealircd.org/docs/FAQ#old-log-block on how " + "to convert it to the new syntax.", + log_data_string("config_file", block->file->filename), + log_data_integer("line_number", block->line_number)); + errors++; + return errors; + } + + if (!any_sources) + { + config_error("%s:%d: log block contains no sources. Old log block perhaps?", + block->file->filename, block->line_number); + errors++; + } + if (destinations == 0) + { + config_error("%s:%d: log block contains no destinations. Old log block perhaps?", + block->file->filename, block->line_number); + errors++; + } + if (destinations > 1) + { + config_error("%s:%d: log block contains multiple destinations. This is not support... YET!", + block->file->filename, block->line_number); + errors++; + } + return errors; +} + +int config_run_log(ConfigFile *conf, ConfigEntry *block) +{ + ConfigEntry *ce, *cep, *cepp; + LogSource *sources = NULL; + int type; + + /* If we later allow multiple destination entries later, + * then we need to 'clone' sources or work with reference counts. + */ + + /* First, gather the source... */ + for (ce = block->items; ce; ce = ce->next) + { + if (!strcmp(ce->name, "source")) + { + LogSource *s; + for (cep = ce->items; cep; cep = cep->next) + { + s = add_log_source(cep->name); + AddListItem(s, sources); + } + } + } + + /* Now deal with destinations... */ + for (ce = block->items; ce; ce = ce->next) + { + if (!strcmp(ce->name, "destination")) + { + for (cep = ce->items; cep; cep = cep->next) + { + if (!strcmp(cep->name, "snomask")) + { + Log *log = safe_alloc(sizeof(Log)); + strlcpy(log->destination, cep->value, sizeof(log->destination)); /* destination is the snomask */ + strlcat(snomasks_in_use, cep->value, sizeof(snomasks_in_use)); + log->sources = sources; + if (!strcmp(cep->value, "s")) + AddListItem(log, temp_logs[LOG_DEST_OPER]); + else + AddListItem(log, temp_logs[LOG_DEST_SNOMASK]); + } else + if (!strcmp(cep->name, "channel")) + { + Log *log = safe_alloc(sizeof(Log)); + strlcpy(log->destination, cep->value, sizeof(log->destination)); /* destination is the channel */ + log->sources = sources; + AddListItem(log, temp_logs[LOG_DEST_CHANNEL]); + } else + if (!strcmp(cep->name, "remote")) + { + Log *log = safe_alloc(sizeof(Log)); + /* destination stays empty */ + log->sources = sources; + AddListItem(log, temp_logs[LOG_DEST_REMOTE]); + } else + if (!strcmp(cep->name, "file") || !strcmp(cep->name, "syslog")) + { + Log *log; + /* First check if already exists... yeah this is a bit late + * and ideally would have been done in config_test but... + * that would have been lots of work for a (hopefully) rare case. + */ + for (log = temp_logs[LOG_DEST_DISK]; log; log = log->next) + { + if ((log->file && !strcmp(log->file, cep->value)) || + (log->filefmt && !strcmp(log->filefmt, cep->value))) + { + config_warn("%s:%d: Ignoring duplicate log block for file '%s'. " + "You cannot have multiple log blocks logging to the same file.", + cep->file->filename, cep->line_number, + cep->value); + free_log_sources(sources); + return 0; + } + } + log = safe_alloc(sizeof(Log)); + log->sources = sources; + log->logfd = -1; + log->type = LOG_TYPE_TEXT; /* default */ + if (!strcmp(cep->name, "syslog")) + safe_strdup(log->file, "syslog"); + else if (strchr(cep->value, '%')) + safe_strdup(log->filefmt, cep->value); + else + safe_strdup(log->file, cep->value); + for (cepp = cep->items; cepp; cepp = cepp->next) + { + if (!strcmp(cepp->name, "maxsize")) + { + log->maxsize = config_checkval(cepp->value,CFG_SIZE); + } + else if (!strcmp(cepp->name, "type")) + { + log->type = log_type_stringtoval(cepp->value); + } + } + AddListItem(log, temp_logs[LOG_DEST_DISK]); + } + } + } + } + + return 0; +} + + + + +/***** RUNTIME *****/ + +void json_expand_client_security_groups(json_t *parent, Client *client) +{ + SecurityGroup *s; + json_t *child = json_array(); + json_object_set_new(parent, "security-groups", child); + + /* We put known-users or unknown-users at the beginning. + * The latter is special and doesn't actually exist + * in the linked list, hence the special code here, + * and again later in the for loop to skip it. + */ + if (user_allowed_by_security_group_name(client, "known-users")) + json_array_append_new(child, json_string_unreal("known-users")); + else + json_array_append_new(child, json_string_unreal("unknown-users")); + + for (s = securitygroups; s; s = s->next) + if (strcmp(s->name, "known-users") && user_allowed_by_security_group(client, s)) + json_array_append_new(child, json_string_unreal(s->name)); +} + +void json_expand_client(json_t *j, const char *key, Client *client, int detail) +{ + char buf[BUFSIZE+1]; + json_t *child = json_object(); + json_t *user = NULL; + json_object_set_new(j, key, child); + + /* First the information that is available for ALL client types: */ + + json_object_set_new(child, "name", json_string_unreal(client->name)); + json_object_set_new(child, "id", json_string_unreal(client->id)); + + /* hostname is available for all, it just depends a bit on whether it is DNS or IP */ + if (client->user && *client->user->realhost) + json_object_set_new(child, "hostname", json_string_unreal(client->user->realhost)); + else if (client->local && *client->local->sockhost) + json_object_set_new(child, "hostname", json_string_unreal(client->local->sockhost)); + else + json_object_set_new(child, "hostname", json_string_unreal(GetIP(client))); + + /* same for ip, is there for all (well, some services pseudo-users may not have one) */ + json_object_set_new(child, "ip", json_string_unreal(client->ip)); + + /* client.details is always available: it is nick!user@host, nick@host, server@host + * server@ip, or just server. + */ + if (client->user) + { + snprintf(buf, sizeof(buf), "%s!%s@%s", client->name, client->user->username, client->user->realhost); + json_object_set_new(child, "details", json_string_unreal(buf)); + } else if (client->ip) { + if (*client->name) + snprintf(buf, sizeof(buf), "%s@%s", client->name, client->ip); + else + snprintf(buf, sizeof(buf), "[%s]", client->ip); + json_object_set_new(child, "details", json_string_unreal(buf)); + } else { + json_object_set_new(child, "details", json_string_unreal(client->name)); + } + + if (client->local && client->local->creationtime) + json_object_set_new(child, "connected_since", json_timestamp(client->local->creationtime)); + + if (client->user) + { + char buf[512]; + const char *str; + /* client.user */ + user = json_object(); + json_object_set_new(child, "user", user); + + json_object_set_new(user, "username", json_string_unreal(client->user->username)); + if (!BadPtr(client->info)) + json_object_set_new(user, "realname", json_string_unreal(client->info)); + if (client->uplink) + json_object_set_new(user, "servername", json_string_unreal(client->uplink->name)); + if (IsLoggedIn(client)) + json_object_set_new(user, "account", json_string_unreal(client->user->account)); + json_object_set_new(user, "reputation", json_integer(GetReputation(client))); + json_expand_client_security_groups(user, client); + + /* user modes and snomasks */ + get_usermode_string_r(client, buf, sizeof(buf)); + json_object_set_new(user, "modes", json_string_unreal(buf+1)); + if (client->user->snomask) + json_object_set_new(user, "snomasks", json_string_unreal(client->user->snomask)); + + /* if oper then we can possibly expand a bit more */ + str = get_operlogin(client); + if (str) + json_object_set_new(user, "operlogin", json_string_unreal(str)); + str = get_operclass(client); + if (str) + json_object_set_new(user, "operclass", json_string_unreal(str)); + } else + if (IsMe(client)) + { + json_t *server = json_object(); + json_t *features; + + /* client.server */ + json_object_set_new(child, "server", server); + + if (!BadPtr(client->info)) + json_object_set_new(server, "info", json_string_unreal(client->info)); + json_object_set_new(server, "num_users", json_integer(client->server->users)); + json_object_set_new(server, "boot_time", json_timestamp(client->server->boottime)); + } else + if (IsServer(client) && client->server) + { + /* client.server */ + + /* Whenever a server is expanded, which is rare, + * we should probably expand as much as info as possible: + */ + json_t *server = json_object(); + json_t *features; + + /* client.server */ + json_object_set_new(child, "server", server); + if (!BadPtr(client->info)) + json_object_set_new(server, "info", json_string_unreal(client->info)); + if (client->uplink) + json_object_set_new(server, "uplink", json_string_unreal(client->uplink->name)); + json_object_set_new(server, "num_users", json_integer(client->server->users)); + json_object_set_new(server, "boot_time", json_timestamp(client->server->boottime)); + json_object_set_new(server, "synced", json_boolean(client->server->flags.synced)); + + /* client.server.features */ + features = json_object(); + json_object_set_new(server, "features", features); + if (!BadPtr(client->server->features.software)) + json_object_set_new(features, "software", json_string_unreal(client->server->features.software)); + json_object_set_new(features, "protocol", json_integer(client->server->features.protocol)); + if (!BadPtr(client->server->features.usermodes)) + json_object_set_new(features, "usermodes", json_string_unreal(client->server->features.usermodes)); + if (!BadPtr(client->server->features.chanmodes[0])) + { + /* client.server.features.chanmodes (array) */ + int i; + json_t *chanmodes = json_array(); + json_object_set_new(features, "chanmodes", chanmodes); + for (i=0; i < 4; i++) + json_array_append_new(chanmodes, json_string_unreal(client->server->features.chanmodes[i])); + } + if (!BadPtr(client->server->features.nickchars)) + json_object_set_new(features, "nick_character_sets", json_string_unreal(client->server->features.nickchars)); + } +} + +void json_expand_channel(json_t *j, const char *key, Channel *channel, int detail) +{ + char mode1[512], mode2[512], modes[512]; + + json_t *child = json_object(); + json_object_set_new(j, key, child); + json_object_set_new(child, "name", json_string_unreal(channel->name)); + json_object_set_new(child, "creation_time", json_timestamp(channel->creationtime)); + json_object_set_new(child, "num_users", json_integer(channel->users)); + if (channel->topic) + { + json_object_set_new(child, "topic", json_string_unreal(channel->topic)); + json_object_set_new(child, "topic_set_by", json_string_unreal(channel->topic_nick)); + json_object_set_new(child, "topic_set_at", json_timestamp(channel->topic_time)); + } + + /* Add "mode" too */ + channel_modes(NULL, mode1, mode2, sizeof(mode1), sizeof(mode2), channel, 0); + if (*mode2) + { + snprintf(modes, sizeof(modes), "%s %s", mode1+1, mode2); + json_object_set_new(child, "modes", json_string_unreal(modes)); + } else { + json_object_set_new(child, "modes", json_string_unreal(mode1+1)); + } + + // Possibly later: If detail is set to 1 then expand more... +} + +const char *timestamp_iso8601_now(void) +{ + struct timeval t; + struct tm *tm; + time_t sec; + static char buf[64]; + + gettimeofday(&t, NULL); + sec = t.tv_sec; + tm = gmtime(&sec); + + snprintf(buf, sizeof(buf), "%04d-%02d-%02dT%02d:%02d:%02d.%03dZ", + tm->tm_year + 1900, + tm->tm_mon + 1, + tm->tm_mday, + tm->tm_hour, + tm->tm_min, + tm->tm_sec, + (int)(t.tv_usec / 1000)); + + return buf; +} + +const char *timestamp_iso8601(time_t v) +{ + struct tm *tm; + static char buf[64]; + + if (v == 0) + return NULL; + + tm = gmtime(&v); + + if (tm == NULL) + return NULL; + + snprintf(buf, sizeof(buf), "%04d-%02d-%02dT%02d:%02d:%02d.%03dZ", + tm->tm_year + 1900, + tm->tm_mon + 1, + tm->tm_mday, + tm->tm_hour, + tm->tm_min, + tm->tm_sec, + 0); + + return buf; +} + +LogData *log_data_string(const char *key, const char *str) +{ + LogData *d = safe_alloc(sizeof(LogData)); + d->type = LOG_FIELD_STRING; + safe_strdup(d->key, key); + safe_strdup(d->value.string, str); + return d; +} + +LogData *log_data_char(const char *key, const char c) +{ + LogData *d = safe_alloc(sizeof(LogData)); + d->type = LOG_FIELD_STRING; + safe_strdup(d->key, key); + d->value.string = safe_alloc(2); + d->value.string[0] = c; + d->value.string[1] = '\0'; + return d; +} + +LogData *log_data_integer(const char *key, int64_t integer) +{ + LogData *d = safe_alloc(sizeof(LogData)); + d->type = LOG_FIELD_INTEGER; + safe_strdup(d->key, key); + d->value.integer = integer; + return d; +} + +LogData *log_data_timestamp(const char *key, time_t ts) +{ + LogData *d = safe_alloc(sizeof(LogData)); + d->type = LOG_FIELD_STRING; + safe_strdup(d->key, key); + safe_strdup(d->value.string, timestamp_iso8601(ts)); + return d; +} + +LogData *log_data_client(const char *key, Client *client) +{ + LogData *d = safe_alloc(sizeof(LogData)); + d->type = LOG_FIELD_CLIENT; + safe_strdup(d->key, key); + d->value.client = client; + return d; +} + +LogData *log_data_channel(const char *key, Channel *channel) +{ + LogData *d = safe_alloc(sizeof(LogData)); + d->type = LOG_FIELD_CHANNEL; + safe_strdup(d->key, key); + d->value.channel = channel; + return d; +} + +LogData *log_data_source(const char *file, int line, const char *function) +{ + LogData *d = safe_alloc(sizeof(LogData)); + json_t *j; + + d->type = LOG_FIELD_OBJECT; + safe_strdup(d->key, "source"); + d->value.object = j = json_object(); + json_object_set_new(j, "file", json_string_unreal(file)); + json_object_set_new(j, "line", json_integer(line)); + json_object_set_new(j, "function", json_string_unreal(function)); + return d; +} + +LogData *log_data_socket_error(int fd) +{ + /* First, grab the error number very early here: */ +#ifndef _WIN32 + int sockerr = errno; +#else + int sockerr = WSAGetLastError(); +#endif + int v; + int len = sizeof(v); + LogData *d; + json_t *j; + +#ifdef SO_ERROR + /* Try to get the "real" error from the underlying socket. + * If we succeed then we will override "sockerr" with it. + */ + if ((fd >= 0) && !getsockopt(fd, SOL_SOCKET, SO_ERROR, (void *)&v, &len) && v) + sockerr = v; +#endif + + d = safe_alloc(sizeof(LogData)); + d->type = LOG_FIELD_OBJECT; + safe_strdup(d->key, "socket_error"); + d->value.object = j = json_object(); + json_object_set_new(j, "error_code", json_integer(sockerr)); + json_object_set_new(j, "error_string", json_string_unreal(STRERROR(sockerr))); + return d; +} + +/** Populate log with the TLS error(s) stack */ +LogData *log_data_tls_error(void) +{ + LogData *d; + json_t *j; + json_t *error_stack; + json_t *name = NULL; + json_t *jt; + unsigned long e; + char buf[512]; + static char all_errors[8192]; + + d = safe_alloc(sizeof(LogData)); + d->type = LOG_FIELD_OBJECT; + safe_strdup(d->key, "tls_error"); + d->value.object = j = json_object(); + + error_stack = json_array(); + json_object_set_new(j, "error_stack", error_stack); + *all_errors = '\0'; + + do { + json_t *obj; + + e = ERR_get_error(); + if (e == 0) + break; + ERR_error_string_n(e, buf, sizeof(buf)); + + obj = json_object(); + json_object_set_new(obj, "code", json_integer(e)); + json_object_set_new(obj, "string", json_string_unreal(buf)); + json_array_append_new(error_stack, obj); + + if (name == NULL) + { + /* Set tls_error.name to the first error that was encountered */ + json_object_set_new(j, "name", json_string_unreal(buf)); + } + strlcat(all_errors, buf, sizeof(all_errors)); + strlcat(all_errors, "\n", sizeof(all_errors)); + } while(e); + + json_object_set_new(j, "all", json_string_unreal(all_errors)); + + return d; +} + +LogData *log_data_link_block(ConfigItem_link *link) +{ + LogData *d = safe_alloc(sizeof(LogData)); + json_t *j; + char *bind_ip; + + d->type = LOG_FIELD_OBJECT; + safe_strdup(d->key, "link_block"); + d->value.object = j = json_object(); + json_object_set_new(j, "name", json_string_unreal(link->servername)); + json_object_set_new(j, "hostname", json_string_unreal(link->outgoing.hostname)); + json_object_set_new(j, "ip", json_string_unreal(link->connect_ip)); + json_object_set_new(j, "port", json_integer(link->outgoing.port)); + + if (!link->outgoing.bind_ip && iConf.link_bindip) + bind_ip = iConf.link_bindip; + else + bind_ip = link->outgoing.bind_ip; + if (!bind_ip) + bind_ip = "*"; + json_object_set_new(j, "bind_ip", json_string_unreal(bind_ip)); + + return d; +} + +LogData *log_data_tkl(const char *key, TKL *tkl) +{ + char buf[BUFSIZE]; + LogData *d = safe_alloc(sizeof(LogData)); + json_t *j; + + d->type = LOG_FIELD_OBJECT; + safe_strdup(d->key, key); + d->value.object = j = json_object(); + + json_object_set_new(j, "type", json_string_unreal(tkl_type_config_string(tkl))); // Eg 'kline' + json_object_set_new(j, "type_string", json_string_unreal(tkl_type_string(tkl))); // Eg 'Soft K-Line' + json_object_set_new(j, "set_by", json_string_unreal(tkl->set_by)); + json_object_set_new(j, "set_at", json_timestamp(tkl->set_at)); + json_object_set_new(j, "expire_at", json_timestamp(tkl->expire_at)); + *buf = '\0'; + short_date(tkl->set_at, buf); + strlcat(buf, " GMT", sizeof(buf)); + json_object_set_new(j, "set_at_string", json_string_unreal(buf)); + if (tkl->expire_at <= 0) + { + json_object_set_new(j, "expire_at_string", json_string_unreal("Never")); + json_object_set_new(j, "duration_string", json_string_unreal("permanent")); + } else { + *buf = '\0'; + short_date(tkl->expire_at, buf); + strlcat(buf, " GMT", sizeof(buf)); + json_object_set_new(j, "expire_at_string", json_string_unreal(buf)); + json_object_set_new(j, "duration_string", json_string_unreal(pretty_time_val_r(buf, sizeof(buf), tkl->expire_at - tkl->set_at))); + } + json_object_set_new(j, "set_at_delta", json_integer(TStime() - tkl->set_at)); + if (TKLIsServerBan(tkl)) + { + json_object_set_new(j, "name", json_string_unreal(tkl_uhost(tkl, buf, sizeof(buf), 0))); + json_object_set_new(j, "reason", json_string_unreal(tkl->ptr.serverban->reason)); + } else + if (TKLIsNameBan(tkl)) + { + json_object_set_new(j, "name", json_string_unreal(tkl->ptr.nameban->name)); + json_object_set_new(j, "reason", json_string_unreal(tkl->ptr.nameban->reason)); + } else + if (TKLIsBanException(tkl)) + { + json_object_set_new(j, "name", json_string_unreal(tkl_uhost(tkl, buf, sizeof(buf), 0))); + json_object_set_new(j, "reason", json_string_unreal(tkl->ptr.banexception->reason)); + json_object_set_new(j, "exception_types", json_string_unreal(tkl->ptr.banexception->bantypes)); + } else + if (TKLIsSpamfilter(tkl)) + { + json_object_set_new(j, "name", json_string_unreal(tkl->ptr.spamfilter->match->str)); + json_object_set_new(j, "match_type", json_string_unreal(unreal_match_method_valtostr(tkl->ptr.spamfilter->match->type))); + json_object_set_new(j, "ban_action", json_string_unreal(banact_valtostring(tkl->ptr.spamfilter->action))); + json_object_set_new(j, "spamfilter_targets", json_string_unreal(spamfilter_target_inttostring(tkl->ptr.spamfilter->target))); + json_object_set_new(j, "reason", json_string_unreal(unreal_decodespace(tkl->ptr.spamfilter->tkl_reason))); + } + + return d; +} + +void log_data_free(LogData *d) +{ + if (d->type == LOG_FIELD_STRING) + safe_free(d->value.string); + else if ((d->type == LOG_FIELD_OBJECT) && d->value.object) + json_decref(d->value.object); + + safe_free(d->key); + safe_free(d); +} + +const char *log_level_valtostring(LogLevel loglevel) +{ + switch(loglevel) + { + case ULOG_DEBUG: + return "debug"; + case ULOG_INFO: + return "info"; + case ULOG_WARNING: + return "warn"; + case ULOG_ERROR: + return "error"; + case ULOG_FATAL: + return "fatal"; + default: + return NULL; + } +} + +static NameValue log_colors_irc[] = { + { ULOG_INVALID, "\0030,01" }, + { ULOG_DEBUG, "\0030,01" }, + { ULOG_INFO, "\00303" }, + { ULOG_WARNING, "\00307" }, + { ULOG_ERROR, "\00304" }, + { ULOG_FATAL, "\00313" }, +}; + +static NameValue log_colors_terminal[] = { + { ULOG_INVALID, "\033[90m" }, + { ULOG_DEBUG, "\033[37m" }, + { ULOG_INFO, "\033[92m" }, + { ULOG_WARNING, "\033[93m" }, + { ULOG_ERROR, "\033[91m" }, + { ULOG_FATAL, "\033[95m" }, +}; +#define TERMINAL_COLOR_RESET "\033[0m" + +const char *log_level_irc_color(LogLevel loglevel) +{ + return nv_find_by_value(log_colors_irc, loglevel); +} + +const char *log_level_terminal_color(LogLevel loglevel) +{ + return nv_find_by_value(log_colors_terminal, loglevel); +} + +LogLevel log_level_stringtoval(const char *str) +{ + if (!strcmp(str, "info")) + return ULOG_INFO; + if (!strcmp(str, "warn")) + return ULOG_WARNING; + if (!strcmp(str, "error")) + return ULOG_ERROR; + if (!strcmp(str, "fatal")) + return ULOG_FATAL; + if (!strcmp(str, "debug")) + return ULOG_DEBUG; + return ULOG_INVALID; +} + +#define validvarcharacter(x) (isalnum((x)) || ((x) == '_')) +#define valideventidcharacter(x) (isupper((x)) || isdigit((x)) || ((x) == '_')) +#define validsubsystemcharacter(x) (islower((x)) || isdigit((x)) || ((x) == '_') || ((x) == '-')) + +int valid_event_id(const char *s) +{ + if (!*s) + return 0; + for (; *s; s++) + if (!valideventidcharacter(*s)) + return 0; + return 1; +} + +int valid_subsystem(const char *s) +{ + if (!*s) + return 0; + if (log_level_stringtoval(s) != ULOG_INVALID) + return 0; + for (; *s; s++) + if (!validsubsystemcharacter(*s)) + return 0; + return 1; +} + +const char *json_get_value(json_t *t) +{ + static char buf[32]; + + if (json_is_string(t)) + return json_string_value(t); + + if (json_is_integer(t)) + { + snprintf(buf, sizeof(buf), "%lld", (long long)json_integer_value(t)); + return buf; + } + + return NULL; +} + +// TODO: if in the function below we keep adding auto expanshion shit, +// like we currently have $client automatically expanding to $client.name +// and $socket_error to $socket_error.error_string, +// if this gets more than we should use some kind of array for it, +// especially for the hardcoded name shit like $socket_error. + +/** Build a string and replace $variables where needed. + * See src/modules/blacklist.c for an example. + * @param inbuf The input string + * @param outbuf The output string + * @param len The maximum size of the output string (including NUL) + * @param name Array of variables names + * @param value Array of variable values + */ +void buildlogstring(const char *inbuf, char *outbuf, size_t len, json_t *details) +{ + const char *i, *p; + char *o; + int left = len - 1; + int cnt, found; + char varname[256], *varp, *varpp; + json_t *t; + +#ifdef DEBUGMODE + if (len <= 0) + abort(); +#endif + + for (i = inbuf, o = outbuf; *i; i++) + { + if (*i == '$') + { + i++; + + /* $$ = literal $ */ + if (*i == '$') + goto literal; + + if (!validvarcharacter(*i)) + { + /* What do we do with things like '$/' ? -- treat literal */ + i--; + goto literal; + } + + /* find termination */ + for (p=i; validvarcharacter(*p) || ((*p == '.') && validvarcharacter(p[1])); p++); + + /* find variable name in list */ + strlncpy(varname, i, sizeof(varname), p - i); + varp = strchr(varname, '.'); + if (varp) + *varp = '\0'; + t = json_object_get(details, varname); + if (t) + { + const char *output = NULL; + if (varp) + { + char *varpp; + do { + varpp = strchr(varp+1, '.'); + if (varpp) + *varpp = '\0'; + /* Fetch explicit object.key */ + t = json_object_get(t, varp+1); + varp = varpp; + } while(t && varpp); + if (t) + output = json_get_value(t); + } else + if (!strcmp(varname, "socket_error")) + { + /* Fetch socket_error.error_string */ + t = json_object_get(t, "error_string"); + if (t) + output = json_get_value(t); + } else + if (json_is_object(t)) + { + /* Fetch object.name */ + t = json_object_get(t, "name"); + if (t) + output = json_get_value(t); + } else + { + output = json_get_value(t); + } + if (output) + { + strlcpy(o, output, left); + left -= strlen(output); /* may become <0 */ + if (left <= 0) + return; /* return - don't write \0 to 'o'. ensured by strlcpy already */ + o += strlen(output); /* value entirely written */ + } + } else + { + /* variable name does not exist -- treat as literal string */ + i--; + goto literal; + } + + /* value written. we're done. */ + i = p - 1; + continue; + } +literal: + if (!left) + break; + *o++ = *i; + left--; + if (!left) + break; + } + *o = '\0'; +} + +/** Do the actual writing to log files */ +void do_unreal_log_disk(LogLevel loglevel, const char *subsystem, const char *event_id, MultiLine *msg, const char *json_serialized) +{ + static int last_log_file_warning = 0; + Log *l; + char timebuf[128]; + struct stat fstats; + int n; + int write_error; + long snomask; + MultiLine *m; + + snprintf(timebuf, sizeof(timebuf), "[%s] ", myctime(TStime())); + + RunHook(HOOKTYPE_LOG, loglevel, subsystem, event_id, msg, json_serialized, timebuf); + + if (!loop.forked && (loglevel > ULOG_DEBUG)) + { + for (m = msg; m; m = m->next) + { +#ifdef _WIN32 + if (show_event_id_console) + win_log("* %s.%s%s [%s] %s\n", subsystem, event_id, m->next?"+":"", log_level_valtostring(loglevel), m->line); + else + win_log("* [%s] %s\n", log_level_valtostring(loglevel), m->line); +#else + if (terminal_supports_color()) + { + if (show_event_id_console) + { + fprintf(stderr, "%s%s.%s%s %s[%s]%s %s\n", + log_level_terminal_color(ULOG_INVALID), subsystem, event_id, TERMINAL_COLOR_RESET, + log_level_terminal_color(loglevel), log_level_valtostring(loglevel), TERMINAL_COLOR_RESET, + m->line); + } else { + fprintf(stderr, "%s[%s]%s %s\n", + log_level_terminal_color(loglevel), log_level_valtostring(loglevel), TERMINAL_COLOR_RESET, + m->line); + } + } else { + if (show_event_id_console) + fprintf(stderr, "%s.%s%s [%s] %s\n", subsystem, event_id, m->next?"+":"", log_level_valtostring(loglevel), m->line); + else + fprintf(stderr, "[%s] %s\n", log_level_valtostring(loglevel), m->line); + } +#endif + } + } + + /* In case of './unrealircd configtest': don't write to log file, only to stderr */ + if (loop.config_test) + return; + + for (l = logs[LOG_DEST_DISK]; l; l = l->next) + { + if (!log_sources_match(l->sources, loglevel, subsystem, event_id, 0)) + continue; + +#ifdef HAVE_SYSLOG + if (l->file && !strcasecmp(l->file, "syslog")) + { + if (l->type == LOG_TYPE_JSON) + { + syslog(LOG_INFO, "%s", json_serialized); + } else + if (l->type == LOG_TYPE_TEXT) + { + for (m = msg; m; m = m->next) + syslog(LOG_INFO, "%s.%s%s %s: %s", subsystem, event_id, m->next?"+":"", log_level_valtostring(loglevel), m->line); + } + continue; + } +#endif + + /* This deals with dynamic log file names, such as ircd.%Y-%m-%d.log */ + if (l->filefmt) + { + char *fname = unreal_strftime(l->filefmt); + if (l->file && (l->logfd != -1) && strcmp(l->file, fname)) + { + /* We are logging already and need to switch over */ + fd_close(l->logfd); + l->logfd = -1; + } + safe_strdup(l->file, fname); + } + + /* log::maxsize code */ + if (l->maxsize && (stat(l->file, &fstats) != -1) && fstats.st_size >= l->maxsize) + { + char oldlog[512]; + if (l->logfd == -1) + { + /* Try to open, so we can write the 'Max file size reached' message. */ + l->logfd = fd_fileopen(l->file, O_CREAT|O_APPEND|O_WRONLY); + } + if (l->logfd != -1) + { + if (write(l->logfd, "Max file size reached, starting new log file\n", 45) < 0) + { + /* We already handle the unable to write to log file case for normal data. + * I think we can get away with not handling this one. + */ + ; + } + fd_close(l->logfd); + } + l->logfd = -1; + + /* Rename log file to xxxxxx.old */ + snprintf(oldlog, sizeof(oldlog), "%s.old", l->file); + unlink(oldlog); /* windows rename cannot overwrite, so unlink here.. ;) */ + rename(l->file, oldlog); + } + + /* generic code for opening log if not open yet.. */ + if (l->logfd == -1) + { + l->logfd = fd_fileopen(l->file, O_CREAT|O_APPEND|O_WRONLY); + if (l->logfd == -1) + { + if (!loop.booted) + { + config_status("WARNING: Unable to write to '%s': %s", l->file, strerror(errno)); + } else { + if (last_log_file_warning + 300 < TStime()) + { + config_status("WARNING: Unable to write to '%s': %s. This warning will not re-appear for at least 5 minutes.", l->file, strerror(errno)); + last_log_file_warning = TStime(); + } + } + continue; + } + } + + /* Now actually WRITE to the log... */ + write_error = 0; + if ((l->type == LOG_TYPE_JSON) && strcmp(subsystem, "rawtraffic")) + { + n = write(l->logfd, json_serialized, strlen(json_serialized)); + if (n < strlen(json_serialized)) + { + write_error = 1; + } else { + if (write(l->logfd, "\n", 1) < 1) // FIXME: no.. we should do it this way..... and why do we use direct I/O at all? + write_error = 1; + } + } else + if (l->type == LOG_TYPE_TEXT) + { + for (m = msg; m; m = m->next) + { + char text_buf[8192]; + snprintf(text_buf, sizeof(text_buf), "%s.%s%s %s: %s\n", subsystem, event_id, m->next?"+":"", log_level_valtostring(loglevel), m->line); + // FIXME: don't write in 2 stages, waste of slow system calls + if (write(l->logfd, timebuf, strlen(timebuf)) < 0) + { + /* Let's ignore any write errors for this one. Next write() will catch it... */ + ; + } + n = write(l->logfd, text_buf, strlen(text_buf)); + if (n < strlen(text_buf)) + { + write_error = 1; + break; + } + } + } + + if (write_error) + { + if (!loop.booted) + { + config_status("WARNING: Unable to write to '%s': %s", l->file, strerror(errno)); + } else { + if (last_log_file_warning + 300 < TStime()) + { + config_status("WARNING: Unable to write to '%s': %s. This warning will not re-appear for at least 5 minutes.", l->file, strerror(errno)); + last_log_file_warning = TStime(); + } + } + } + } +} + +int log_sources_match(LogSource *logsource, LogLevel loglevel, const char *subsystem, const char *event_id, int matched_already) +{ + int retval = 0; + LogSource *ls; + + // NOTE: This routine works by exclusion, so a bad struct would + // cause everything to match!! + + for (ls = logsource; ls; ls = ls->next) + { + /* First deal with all positive matchers.. */ + if (ls->negative) + continue; + if (!strcmp(ls->subsystem, "all")) + { + retval = 1; + break; + } + if (!strcmp(ls->subsystem, "nomatch") && !matched_already) + { + /* catch-all */ + retval = 1; + break; + } + if (*ls->event_id && strcmp(ls->event_id, event_id)) + continue; + if (*ls->subsystem && strcmp(ls->subsystem, subsystem)) + continue; + if ((ls->loglevel != ULOG_INVALID) && (ls->loglevel != loglevel)) + continue; + /* MATCH */ + retval = 1; + break; + } + + /* No matches? Then we can stop here */ + if (retval == 0) + return 0; + + /* There was a match, now check for exemptions, eg !operoverride */ + for (ls = logsource; ls; ls = ls->next) + { + /* Only deal with negative matches... */ + if (!ls->negative) + continue; + if (!strcmp(ls->subsystem, "nomatch") || !strcmp(ls->subsystem, "all")) + continue; /* !nomatch and !all make no sense, so just ignore it */ + if (*ls->event_id && strcmp(ls->event_id, event_id)) + continue; + if (*ls->subsystem && strcmp(ls->subsystem, subsystem)) + continue; + if ((ls->loglevel != ULOG_INVALID) && (ls->loglevel != loglevel)) + continue; + /* NEGATIVE MATCH */ + return 0; + } + + return 1; +} + +/** Convert loglevel/subsystem/event_id to a snomask. + * @returns The snomask letters (may be more than one), + * an asterisk (for all ircops), or NULL (no delivery) + */ +const char *log_to_snomask(LogLevel loglevel, const char *subsystem, const char *event_id) +{ + Log *ld; + static char snomasks[64]; + int matched = 0; + + *snomasks = '\0'; + for (ld = logs[LOG_DEST_SNOMASK]; ld; ld = ld->next) + { + if (log_sources_match(ld->sources, loglevel, subsystem, event_id, 0)) + { + strlcat(snomasks, ld->destination, sizeof(snomasks)); + matched = 1; + } + } + + if (logs[LOG_DEST_OPER] && log_sources_match(logs[LOG_DEST_OPER]->sources, loglevel, subsystem, event_id, matched)) + strlcat(snomasks, "s", sizeof(snomasks)); + + return *snomasks ? snomasks : NULL; +} + +#define COLOR_NONE "\xf" +#define COLOR_DARKGREY "\00314" +/** Do the actual writing to log files */ +void do_unreal_log_opers(LogLevel loglevel, const char *subsystem, const char *event_id, MultiLine *msg, const char *json_serialized, Client *from_server) +{ + Client *client; + const char *snomask_destinations, *p; + MessageTag *mtags = NULL, *mtags_loop; + MultiLine *m; + + /* If not fully booted then we don't have a logging to snomask mapping so can't do much.. */ + if (!loop.booted) + return; + + /* Never send these */ + if (!strcmp(subsystem, "rawtraffic")) + return; + + snomask_destinations = log_to_snomask(loglevel, subsystem, event_id); + if (!snomask_destinations) + return; + + /* Prepare message tag for those who have CAP unrealircd.org/json-log */ + if (json_serialized) + { + mtags = safe_alloc(sizeof(MessageTag)); + safe_strdup(mtags->name, "unrealircd.org/json-log"); + safe_strdup(mtags->value, json_serialized); + } + + /* To specific snomasks... */ + list_for_each_entry(client, &oper_list, special_node) + { + const char *operlogin; + ConfigItem_oper *oper; + int colors = iConf.server_notice_colors; + + if (snomask_destinations) + { + char found = 0; + if (!client->user->snomask) + continue; /* None set, so will never match */ + for (p = snomask_destinations; *p; p++) + { + if (strchr(client->user->snomask, *p)) + { + found = 1; + break; + } + } + if (!found) + continue; + } + + operlogin = get_operlogin(client); + if (operlogin && (oper = find_oper(operlogin))) + colors = oper->server_notice_colors; + + mtags_loop = mtags; + for (m = msg; m; m = m->next) + { + if (colors) + { + sendto_one(client, mtags_loop, ":%s NOTICE %s :%s%s.%s%s%s %s[%s]%s %s", + from_server->name, client->name, + COLOR_DARKGREY, subsystem, event_id, m->next?"+":"", COLOR_NONE, + log_level_irc_color(loglevel), log_level_valtostring(loglevel), COLOR_NONE, + m->line); + } else { + sendto_one(client, mtags_loop, ":%s NOTICE %s :%s.%s%s [%s] %s", + from_server->name, client->name, + subsystem, event_id, m->next?"+":"", + log_level_valtostring(loglevel), + m->line); + } + mtags_loop = NULL; /* this way we only send the JSON in the first msg */ + } + } + + safe_free_message_tags(mtags); +} + +void do_unreal_log_remote(LogLevel loglevel, const char *subsystem, const char *event_id, MultiLine *msg, const char *json_serialized) +{ + Log *l; + int found = 0; + + for (l = logs[LOG_DEST_REMOTE]; l; l = l->next) + { + if (log_sources_match(l->sources, loglevel, subsystem, event_id, 0)) + { + found = 1; + break; + } + } + if (found == 0) + return; + + do_unreal_log_remote_deliver(loglevel, subsystem, event_id, msg, json_serialized); +} + +void do_unreal_log_free_args(va_list vl) +{ + LogData *d; + + while ((d = va_arg(vl, LogData *))) + { + log_data_free(d); + } +} + +static int unreal_log_recursion_trap = 0; + +/* Logging function, called by the unreal_log() macro. */ +void do_unreal_log(LogLevel loglevel, const char *subsystem, const char *event_id, + Client *client, const char *msg, ...) +{ + va_list vl; + + if (unreal_log_recursion_trap) + { + va_start(vl, msg); + do_unreal_log_free_args(vl); + va_end(vl); + return; + } + + unreal_log_recursion_trap = 1; + va_start(vl, msg); + do_unreal_log_internal(loglevel, subsystem, event_id, client, 1, msg, vl); + va_end(vl); + unreal_log_recursion_trap = 0; +} + +/* Logging function, called by the unreal_log_raw() macro. */ +void do_unreal_log_raw(LogLevel loglevel, const char *subsystem, const char *event_id, + Client *client, const char *msg, ...) +{ + va_list vl; + + if (unreal_log_recursion_trap) + { + va_start(vl, msg); + do_unreal_log_free_args(vl); + va_end(vl); + return; + } + + unreal_log_recursion_trap = 1; + va_start(vl, msg); + do_unreal_log_internal(loglevel, subsystem, event_id, client, 0, msg, vl); + va_end(vl); + unreal_log_recursion_trap = 0; +} + +void do_unreal_log_norecursioncheck(LogLevel loglevel, const char *subsystem, const char *event_id, + Client *client, const char *msg, ...) +{ + va_list vl; + + va_start(vl, msg); + do_unreal_log_internal(loglevel, subsystem, event_id, client, 1, msg, vl); + va_end(vl); +} + +void do_unreal_log_internal(LogLevel loglevel, const char *subsystem, const char *event_id, + Client *client, int expand_msg, const char *msg, va_list vl) +{ + LogData *d; + char *json_serialized; + const char *str; + json_t *j = NULL; + json_t *j_details = NULL; + json_t *t; + char msgbuf[8192]; + const char *loglevel_string = log_level_valtostring(loglevel); + MultiLine *mmsg; + Client *from_server = NULL; + + if (loglevel_string == NULL) + { + do_unreal_log_norecursioncheck(ULOG_ERROR, "log", "BUG_LOG_LOGLEVEL", NULL, + "[BUG] Next log message had an invalid log level -- corrected to ULOG_ERROR", + NULL); + loglevel = ULOG_ERROR; + loglevel_string = log_level_valtostring(loglevel); + } + if (!valid_subsystem(subsystem)) + { + do_unreal_log_norecursioncheck(ULOG_ERROR, "log", "BUG_LOG_SUBSYSTEM", NULL, + "[BUG] Next log message had an invalid subsystem -- changed to 'unknown'", + NULL); + subsystem = "unknown"; + } + if (!valid_event_id(event_id)) + { + do_unreal_log_norecursioncheck(ULOG_ERROR, "log", "BUG_LOG_EVENT_ID", NULL, + "[BUG] Next log message had an invalid event id -- changed to 'unknown'", + NULL); + event_id = "unknown"; + } + /* This one is probably temporary since it should not be a real error, actually (but often is) */ + if (expand_msg && strchr(msg, '%')) + { + do_unreal_log_norecursioncheck(ULOG_ERROR, "log", "BUG_LOG_MESSAGE_PERCENT", NULL, + "[BUG] Next log message contains a percent sign -- possibly accidental format string!", + NULL); + } + + j = json_object(); + j_details = json_object(); + + json_object_set_new(j, "timestamp", json_string_unreal(timestamp_iso8601_now())); + json_object_set_new(j, "level", json_string_unreal(loglevel_string)); + json_object_set_new(j, "subsystem", json_string_unreal(subsystem)); + json_object_set_new(j, "event_id", json_string_unreal(event_id)); + json_object_set_new(j, "log_source", json_string_unreal(*me.name ? me.name : "local")); + + /* We put all the rest in j_details because we want to enforce + * a certain ordering of the JSON output. We will merge these + * details later on. + */ + if (client) + json_expand_client(j_details, "client", client, 0); + /* Additional details (if any) */ + while ((d = va_arg(vl, LogData *))) + { + switch(d->type) + { + case LOG_FIELD_INTEGER: + json_object_set_new(j_details, d->key, json_integer(d->value.integer)); + break; + case LOG_FIELD_STRING: + if (d->value.string) + json_object_set_new(j_details, d->key, json_string_unreal(d->value.string)); + else + json_object_set_new(j_details, d->key, json_null()); + break; + case LOG_FIELD_CLIENT: + json_expand_client(j_details, d->key, d->value.client, 0); + break; + case LOG_FIELD_CHANNEL: + json_expand_channel(j_details, d->key, d->value.channel, 0); + break; + case LOG_FIELD_OBJECT: + json_object_set_new(j_details, d->key, d->value.object); + d->value.object = NULL; /* don't let log_data_free() free it */ + break; + default: +#ifdef DEBUGMODE + abort(); +#endif + break; + } + log_data_free(d); + } + + if (expand_msg) + buildlogstring(msg, msgbuf, sizeof(msgbuf), j_details); + else + strlcpy(msgbuf, msg, sizeof(msgbuf)); + + json_object_set_new(j, "msg", json_string_unreal(msgbuf)); + + /* Now merge the details into root object 'j': */ + json_object_update_missing(j, j_details); + /* Generate the JSON */ + json_serialized = json_dumps(j, JSON_COMPACT); + + /* Convert the message buffer to MultiLine */ + mmsg = line2multiline(msgbuf); + + /* Now call the disk loggers */ + do_unreal_log_disk(loglevel, subsystem, event_id, mmsg, json_serialized); + + /* And the ircops stuff */ + t = json_object_get(j_details, "from_server_name"); + if (t && (str = json_get_value(t))) + from_server = find_server(str, NULL); + if (from_server == NULL) + from_server = &me; + do_unreal_log_opers(loglevel, subsystem, event_id, mmsg, json_serialized, from_server); + + do_unreal_log_remote(loglevel, subsystem, event_id, mmsg, json_serialized); + + // NOTE: code duplication further down! + + /* Free everything */ + safe_free(json_serialized); + safe_free_multiline(mmsg); + json_decref(j_details); + json_decref(j); +} + +void do_unreal_log_internal_from_remote(LogLevel loglevel, const char *subsystem, const char *event_id, + MultiLine *msg, const char *json_serialized, Client *from_server) +{ + if (unreal_log_recursion_trap) + return; + unreal_log_recursion_trap = 1; + + /* Call the disk loggers */ + do_unreal_log_disk(loglevel, subsystem, event_id, msg, json_serialized); + + /* And the ircops stuff */ + do_unreal_log_opers(loglevel, subsystem, event_id, msg, json_serialized, from_server); + + unreal_log_recursion_trap = 0; +} + + +void free_log_block(Log *l) +{ + Log *l_next; + LogSource *src, *src_next; + for (; l; l = l_next) + { + l_next = l->next; + if (l->logfd > 0) + { + fd_close(l->logfd); + l->logfd = -1; + } + free_log_sources(l->sources); + safe_free(l->file); + safe_free(l->filefmt); + safe_free(l); + } +} + +int log_tests(void) +{ + if (snomask_num_destinations <= 1) + { + unreal_log(ULOG_ERROR, "config", "LOG_SNOMASK_BLOCK_MISSING", NULL, + "Missing snomask logging configuration:\n" + "Please add the following line to your unrealircd.conf: " + "include \"snomasks.default.conf\";"); + return 0; + } + snomask_num_destinations = 0; + return 1; +} + +void postconf_defaults_log_block(void) +{ + Log *l; + LogSource *ls; + + /* Is there any log block to disk? Then nothing to do. */ + if (logs[LOG_DEST_DISK]) + return; + + unreal_log(ULOG_WARNING, "log", "NO_DISK_LOG_BLOCK", NULL, + "No log { } block found that logs to disk -- " + "logging everything in text format to 'ircd.log'"); + + /* Create a default log block */ + l = safe_alloc(sizeof(Log)); + l->logfd = -1; + l->type = LOG_TYPE_TEXT; /* text */ + l->maxsize = 100000000; /* maxsize 100M */ + safe_strdup(l->file, "ircd.log"); + convert_to_absolute_path(&l->file, LOGDIR); + AddListItem(l, logs[LOG_DEST_DISK]); + + /* And the source filter */ + ls = add_log_source("all"); + AppendListItem(ls, l->sources); + ls = add_log_source("!debug"); + AppendListItem(ls, l->sources); + ls = add_log_source("!join.LOCAL_CLIENT_JOIN"); + AppendListItem(ls, l->sources); + ls = add_log_source("!join.REMOTE_CLIENT_JOIN"); + AppendListItem(ls, l->sources); + ls = add_log_source("!part.LOCAL_CLIENT_PART"); + AppendListItem(ls, l->sources); + ls = add_log_source("!part.REMOTE_CLIENT_PART"); + AppendListItem(ls, l->sources); + ls = add_log_source("!kick.LOCAL_CLIENT_KICK"); + AppendListItem(ls, l->sources); + ls = add_log_source("!kick.REMOTE_CLIENT_KICK"); + AppendListItem(ls, l->sources); +} + +/* Called before CONFIG_TEST */ +void log_pre_rehash(void) +{ + *snomasks_in_use_testing = '\0'; +} + +/* Called after CONFIG_TEST right before CONFIG_RUN */ +void config_pre_run_log(void) +{ + *snomasks_in_use = '\0'; +} + +/* Called after CONFIG_RUN is complete */ +void log_blocks_switchover(void) +{ + int i; + for (i=0; i < NUM_LOG_DESTINATIONS; i++) + free_log_block(logs[i]); + memcpy(logs, temp_logs, sizeof(logs)); + memset(temp_logs, 0, sizeof(temp_logs)); +} + +/** Check if a letter is a valid snomask (that is: + * one that exists in the log block configuration). + * @param c the snomask letter to check + * @returns 1 if exists, 0 if not. + */ +int is_valid_snomask(char c) +{ + return strchr(snomasks_in_use, c) ? 1 : 0; +} + +/** Check if a letter is a valid snomask during or after CONFIG_TEST + * (the snomasks exist in the log block configuration read during config_test). + * @param c the snomask letter to check + * @returns 1 if exists, 0 if not. + */ +int is_valid_snomask_testing(char c) +{ + return strchr(snomasks_in_use_testing, c) ? 1 : 0; +} + +/** Check if a string all consists of valid snomasks during or after CONFIG_TEST + * (the snomasks exist in the log block configuration read during config_test). + * @param str the snomask string to check + * @param invalid_snomasks list of unknown snomask letters + * @returns 1 if exists, 0 if not. + */ +int is_valid_snomask_string_testing(const char *str, char **invalid_snomasks) +{ + static char invalid_snomasks_buf[256]; + + *invalid_snomasks_buf = '\0'; + for (; *str; str++) + { + if ((*str == '+') || (*str == '-')) + continue; + if (!strchr(snomasks_in_use_testing, *str)) + strlcat_letter(invalid_snomasks_buf, *str, sizeof(invalid_snomasks_buf)); + } + *invalid_snomasks = invalid_snomasks_buf; + return *invalid_snomasks_buf ? 0 : 1; +} diff --git a/src/macosx/UnrealIRCd/AppModel.swift b/src/macosx/UnrealIRCd/AppModel.swift index 7cb4570..5fff8ba 100644 --- a/src/macosx/UnrealIRCd/AppModel.swift +++ b/src/macosx/UnrealIRCd/AppModel.swift @@ -13,7 +13,7 @@ class AppModel : ChangeNotifierDelegate { var menuItem : NSStatusItem static let logoName = "logo.png" - static let helpURL = "https://www.unrealircd.org/docs/UnrealIRCd_5_documentation" + static let helpURL = "https://www.unrealircd.org/docs/UnrealIRCd_6_documentation" var daemonModel : DaemonModel var configurationModel : ConfigurationModel var windowController : NSWindowController? diff --git a/src/match.c b/src/match.c index ccc1c39..ca361b0 100644 --- a/src/match.c +++ b/src/match.c @@ -384,7 +384,7 @@ void unreal_delete_match(Match *m) safe_free(m); } -Match *unreal_create_match(MatchType type, char *str, char **error) +Match *unreal_create_match(MatchType type, const char *str, char **error) { Match *m = safe_alloc(sizeof(Match)); static char errorbuf[512]; @@ -438,7 +438,7 @@ Match *unreal_create_match(MatchType type, char *str, char **error) * @returns 1 if matched, 0 if not. * @note These (more logical) return values are opposite to the match_simple() function. */ -int unreal_match(Match *m, char *str) +int unreal_match(Match *m, const char *str) { if (m->type == MATCH_SIMPLE) { @@ -463,7 +463,7 @@ int unreal_match(Match *m, char *str) return 0; } -int unreal_match_method_strtoval(char *str) +int unreal_match_method_strtoval(const char *str) { if (!strcmp(str, "regex") || !strcmp(str, "pcre")) return MATCH_PCRE_REGEX; @@ -489,10 +489,11 @@ char *unreal_match_method_valtostr(int val) * Moved here from the censor channel and user mode module * (previously was present in both modules, code duplication) */ -int fast_badword_match(ConfigItem_badword *badword, char *line) +int fast_badword_match(ConfigItem_badword *badword, const char *line) { - char *p; + const char *p; int bwlen = strlen(badword->word); + if ((badword->type & BADW_TYPE_FAST_L) && (badword->type & BADW_TYPE_FAST_R)) return (our_strcasestr(line, badword->word) ? 1 : 0); @@ -523,21 +524,20 @@ next: * buf is used for the result and max is sizeof(buf). * Assumptions[!]: max > 0 AND max > strlen(line)+1 */ -int fast_badword_replace(ConfigItem_badword *badword, char *line, char *buf, int max) +int fast_badword_replace(ConfigItem_badword *badword, const char *line, char *buf, int max) { /* Some aliases ;P */ char *replacew = badword->replace ? badword->replace : REPLACEWORD; - char *pold = line, *pnew = buf; /* Pointers to old string and new string */ - char *poldx = line; + const char *pold = line; /* pointer to the old string */ + const char *poldx = line; + char *pnew = buf; /* pointer to the new string */ int replacen = -1; /* Only calculated if needed. w00t! saves us a few nanosecs? lol */ int searchn = -1; - char *startw, *endw; + const char *startw, *endw; /* start and end of the word */ char *c_eol = buf + max - 1; /* Cached end of (new) line */ int run = 1; int cleaned = 0; - Debug((DEBUG_NOTICE, "replacing %s -> %s in '%s'", badword->word, replacew, line)); - while(run) { pold = our_strcasestr(pold, badword->word); if (!pold) @@ -617,7 +617,7 @@ int fast_badword_replace(ConfigItem_badword *badword, char *line, char *buf, int * the loadbadwords() function. It's primary use is to filter swearing * in both private and public messages */ -char *stripbadwords(char *str, ConfigItem_badword *start_bw, int *blocked) +const char *stripbadwords(const char *str, ConfigItem_badword *start_bw, int *blocked) { static char cleanstr[4096]; char buf[4096]; @@ -692,14 +692,17 @@ char *stripbadwords(char *str, ConfigItem_badword *start_bw, int *blocked) ret = pcre2_match(this_word->pcre2_expr, ptr, PCRE2_ZERO_TERMINATED, 0, 0, md, NULL); /* run the regex */ if (ret > 0) { - ircd_log(LOG_ERROR, "pcre2_get_ovector_count: %d", pcre2_get_ovector_count(md)); dd = pcre2_get_ovector_pointer(md); start = (int)dd[0]; end = (int)dd[1]; if ((start < 0) || (end < 0) || (start > strlen(ptr)) || (end > strlen(ptr)+1)) { - ircd_log(LOG_ERROR, "pcre2_match() returned an ovector with OOB start/end: %d/%d, str (%d): '%s'", - (int)start, (int)end, (int)strlen(ptr), ptr); + unreal_log(ULOG_FATAL, "main", "BUG_STRIPBADWORDS_PCRE2_MATCH_OOB", NULL, + "[BUG] pcre2_match() returned an ovector with OOB start/end: $start/$end, len $length: '$buf'", + log_data_integer("start", start), + log_data_integer("end", end), + log_data_integer("length", strlen(ptr)), + log_data_string("buf", ptr)); abort(); } m = end - start; @@ -743,10 +746,10 @@ char *stripbadwords(char *str, ConfigItem_badword *start_bw, int *blocked) * if check_broadness is 1, the function will attempt to determine * if the given regex string is too broad (i.e. matches everything) */ -char *badword_config_check_regex(char *str, int fastsupport, int check_broadness) +const char *badword_config_check_regex(const char *str, int fastsupport, int check_broadness) { int regex=0; - char *tmp; + const char *tmp; static char errorbuf[512]; if (fastsupport) @@ -787,9 +790,9 @@ char *badword_config_check_regex(char *str, int fastsupport, int check_broadness return NULL; } -int badword_config_process(ConfigItem_badword *ca, char *str) +int badword_config_process(ConfigItem_badword *ca, const char *str) { - char *tmp; + const char *tmp; short regex = 0; int ast_l = 0, ast_r = 0; diff --git a/src/misc.c b/src/misc.c index e8a1ee5..27c4f36 100644 --- a/src/misc.c +++ b/src/misc.c @@ -32,17 +32,26 @@ static void exit_one_client(Client *, MessageTag *mtags_i, const char *); -static char *months[] = { +static const char *months[] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; -static char *weekdays[] = { +static const char *weekdays[] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; +static const char *short_months[12] = { + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", +}; + +static const char *short_weekdays[7] = { + "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", +}; + typedef struct { int value; /** Unique integer value of item */ char character; /** Unique character assigned to item */ @@ -98,167 +107,8 @@ SpamfilterTargetTable spamfiltertargettable[] = { /** IRC Statistics (quite useless?) */ struct IRCStatistics ircstats; -/** Main IRCd logging function. - * @param flags One of LOG_* (eg: LOG_ERROR) - * @param format Format string - * @param ... Arguments - * @note This function is safe to call at all times. It provides - * protection against recursion. - */ -void ircd_log(int flags, FORMAT_STRING(const char *format), ...) -{ - static int last_log_file_warning = 0; - static char recursion_trap=0; - - va_list ap; - ConfigItem_log *logs; - char buf[2048], timebuf[128]; - struct stat fstats; - int written = 0; - int n; - - /* Trap infinite recursions to avoid crash if log file is unavailable, - * this will also avoid calling ircd_log from anything else called - */ - if (recursion_trap == 1) - return; - - recursion_trap = 1; - - /* NOTE: past this point you CANNOT just 'return'. - * You must set 'recursion_trap = 0;' before 'return'! - */ - - va_start(ap, format); - ircvsnprintf(buf, sizeof(buf), format, ap); - va_end(ap); - snprintf(timebuf, sizeof(timebuf), "[%s] - ", myctime(TStime())); - - RunHook3(HOOKTYPE_LOG, flags, timebuf, buf); - strlcat(buf, "\n", sizeof(buf)); - - if (!loop.ircd_forked && (flags & LOG_ERROR)) - { -#ifdef _WIN32 - win_log("* %s", buf); -#else - fprintf(stderr, "%s", buf); -#endif - } - - /* In case of './unrealircd configtest': don't write to log file, only to stderr */ - if (loop.config_test) - { - recursion_trap = 0; - return; - } - - for (logs = conf_log; logs; logs = logs->next) - { - if (!(logs->flags & flags)) - continue; - -#ifdef HAVE_SYSLOG - if (logs->file && !strcasecmp(logs->file, "syslog")) - { - syslog(LOG_INFO, "%s", buf); - written++; - continue; - } -#endif - - /* This deals with dynamic log file names, such as ircd.%Y-%m-%d.log */ - if (logs->filefmt) - { - char *fname = unreal_strftime(logs->filefmt); - if (logs->file && (logs->logfd != -1) && strcmp(logs->file, fname)) - { - /* We are logging already and need to switch over */ - fd_close(logs->logfd); - logs->logfd = -1; - } - safe_strdup(logs->file, fname); - } - - /* log::maxsize code */ - if (logs->maxsize && (stat(logs->file, &fstats) != -1) && fstats.st_size >= logs->maxsize) - { - char oldlog[512]; - if (logs->logfd == -1) - { - /* Try to open, so we can write the 'Max file size reached' message. */ - logs->logfd = fd_fileopen(logs->file, O_CREAT|O_APPEND|O_WRONLY); - } - if (logs->logfd != -1) - { - if (write(logs->logfd, "Max file size reached, starting new log file\n", 45) < 0) - { - /* We already handle the unable to write to log file case for normal data. - * I think we can get away with not handling this one. - */ - ; - } - fd_close(logs->logfd); - } - logs->logfd = -1; - - /* Rename log file to xxxxxx.old */ - snprintf(oldlog, sizeof(oldlog), "%s.old", logs->file); - unlink(oldlog); /* windows rename cannot overwrite, so unlink here.. ;) */ - rename(logs->file, oldlog); - } - - /* generic code for opening log if not open yet.. */ - if (logs->logfd == -1) - { - logs->logfd = fd_fileopen(logs->file, O_CREAT|O_APPEND|O_WRONLY); - if (logs->logfd == -1) - { - if (!loop.ircd_booted) - { - config_status("WARNING: Unable to write to '%s': %s", logs->file, strerror(ERRNO)); - } else { - if (last_log_file_warning + 300 < TStime()) - { - config_status("WARNING: Unable to write to '%s': %s. This warning will not re-appear for at least 5 minutes.", logs->file, strerror(ERRNO)); - last_log_file_warning = TStime(); - } - } - continue; - } - } - - /* Now actually WRITE to the log... */ - if (write(logs->logfd, timebuf, strlen(timebuf)) < 0) - { - /* Let's ignore any write errors for this one. Next write() will catch it... */ - ; - } - n = write(logs->logfd, buf, strlen(buf)); - if (n == strlen(buf)) - { - written++; - } - else - { - if (!loop.ircd_booted) - { - config_status("WARNING: Unable to write to '%s': %s", logs->file, strerror(ERRNO)); - } else { - if (last_log_file_warning + 300 < TStime()) - { - config_status("WARNING: Unable to write to '%s': %s. This warning will not re-appear for at least 5 minutes.", logs->file, strerror(ERRNO)); - last_log_file_warning = TStime(); - } - } - } - } - - recursion_trap = 0; -} - /** Returns the date in rather long string */ -char *long_date(time_t clock) +const char *long_date(time_t clock) { static char buf[80], plus; struct tm *lt, *gm; @@ -300,10 +150,9 @@ char *long_date(time_t clock) * @param buf The buffer to store the string (minimum size: 128 bytes), * or NULL to use temporary static storage. */ -char *short_date(time_t ts, char *buf) +const char *short_date(time_t ts, char *buf) { struct tm *t = gmtime(&ts); - char *timestr; static char retbuf[128]; if (!buf) @@ -313,17 +162,14 @@ char *short_date(time_t ts, char *buf) if (!t) return NULL; - timestr = asctime(t); - if (!timestr) + if (!strftime(buf, 128, "%a %b %d %H:%M:%S %Y", t)) return NULL; - strlcpy(buf, timestr, 128); - stripcrlf(buf); return buf; } /** Return a string with the "pretty date" - yeah, another variant */ -char *pretty_date(time_t t) +const char *pretty_date(time_t t) { static char buf[128]; struct tm *tm; @@ -347,62 +193,53 @@ char *pretty_date(time_t t) * string marker (`\-`). returns the 'fixed' string or "*" if the string * was NULL length or a NULL pointer. */ -char *check_string(char *s) +const char *check_string(const char *s) { + static char buf[512]; static char star[2] = "*"; - char *str = s; + const char *str = s; if (BadPtr(s)) return star; for (; *s; s++) + { if (isspace(*s)) { - *s = '\0'; + /* Because this is an unlikely scenario, we have + * delayed the copy until here: + */ + strlncpy(buf, s, sizeof(buf), s - str); + str = buf; break; } + } return (BadPtr(str)) ? star : str; } /** Create a user@host based on the provided name and host */ -char *make_user_host(char *name, char *host) +char *make_user_host(const char *name, const char *host) { static char namebuf[USERLEN + HOSTLEN + 6]; - char *s = namebuf; - memset(namebuf, 0, sizeof(namebuf)); - name = check_string(name); - strlcpy(s, name, USERLEN + 1); - s += strlen(s); - *s++ = '@'; - host = check_string(host); - strlcpy(s, host, HOSTLEN + 1); - s += strlen(s); - *s = '\0'; - return (namebuf); + strlncpy(namebuf, check_string(name), sizeof(namebuf), USERLEN+1); + strlcat(namebuf, "@", sizeof(namebuf)); + strlncat(namebuf, check_string(host), sizeof(namebuf), HOSTLEN+1); + return namebuf; } /** Create a nick!user@host string based on the provided variables. * If any of the variables are NULL, it becomes * (asterisk) * This is the reentrant safe version. */ -char *make_nick_user_host_r(char *namebuf, char *nick, char *name, char *host) +char *make_nick_user_host_r(char *namebuf, size_t namebuflen, const char *nick, const char *name, const char *host) { - char *s = namebuf; - - nick = check_string(nick); - strlcpy(namebuf, nick, NICKLEN + 1); - s += strlen(s); - *s++ = '!'; - name = check_string(name); - strlcpy(s, name, USERLEN + 1); - s += strlen(s); - *s++ = '@'; - host = check_string(host); - strlcpy(s, host, HOSTLEN + 1); - s += strlen(s); - *s = '\0'; + strlncpy(namebuf, check_string(nick), namebuflen, NICKLEN+1); + strlcat(namebuf, "!", namebuflen); + strlncat(namebuf, check_string(name), namebuflen, USERLEN+1); + strlcat(namebuf, "@", namebuflen); + strlncat(namebuf, check_string(host), namebuflen, HOSTLEN+1); return namebuf; } @@ -410,18 +247,18 @@ char *make_nick_user_host_r(char *namebuf, char *nick, char *name, char *host) * If any of the variables are NULL, it becomes * (asterisk) * This version uses static storage. */ -char *make_nick_user_host(char *nick, char *name, char *host) +char *make_nick_user_host(const char *nick, const char *name, const char *host) { static char namebuf[NICKLEN + USERLEN + HOSTLEN + 24]; - return make_nick_user_host_r(namebuf, nick, name, host); + return make_nick_user_host_r(namebuf, sizeof(namebuf), nick, name, host); } /** Similar to ctime() but without a potential newline and * also takes a time_t value rather than a pointer. */ -char *myctime(time_t value) +const char *myctime(time_t value) { static char buf[28]; char *p; @@ -457,7 +294,7 @@ char *myctime(time_t value) ** to internal buffer (nbuf). *NEVER* use the returned pointer ** to modify what it points!!! */ -char *get_client_name(Client *client, int showip) +const char *get_client_name(Client *client, int showip) { static char nbuf[HOSTLEN * 2 + USERLEN + 5]; @@ -482,7 +319,7 @@ char *get_client_name(Client *client, int showip) return client->name; } -char *get_client_host(Client *client) +const char *get_client_host(Client *client) { static char nbuf[HOSTLEN * 2 + USERLEN + 5]; @@ -500,9 +337,9 @@ char *get_client_host(Client *client) /* * Set sockhost to 'host'. Skip the user@ part of 'host' if necessary. */ -void set_sockhost(Client *client, char *host) +void set_sockhost(Client *client, const char *host) { - char *s; + const char *s; if ((s = strchr(host, '@'))) s++; else @@ -516,7 +353,7 @@ int on_dccallow_list(Client *to, Client *from) Link *lp; for(lp = to->user->dccallow; lp; lp = lp->next) - if(lp->flags == DCC_LINK_ME && lp->value.client == from) + if (lp->flags == DCC_LINK_ME && lp->value.client == from) return 1; return 0; } @@ -538,11 +375,11 @@ void remove_dcc_references(Client *client) acptr = lp->value.client; for(found = 0, lpp = &(acptr->user->dccallow); *lpp; lpp=&((*lpp)->next)) { - if(lp->flags == (*lpp)->flags) + if (lp->flags == (*lpp)->flags) continue; /* match only opposite types for sanity */ - if((*lpp)->value.client == client) + if ((*lpp)->value.client == client) { - if((*lpp)->flags == DCC_LINK_ME) + if ((*lpp)->flags == DCC_LINK_ME) { sendto_one(acptr, NULL, ":%s %d %s :%s has been removed from " "your DCC allow list for signing off", @@ -556,38 +393,19 @@ void remove_dcc_references(Client *client) } } - if(!found) - sendto_realops("[BUG] remove_dcc_references: %s was in dccallowme " - "list[%d] of %s but not in dccallowrem list!", - acptr->name, lp->flags, client->name); + if (!found) + { + unreal_log(ULOG_WARNING, "main", "BUG_REMOVE_DCC_REFERENCES", acptr, + "[BUG] remove_dcc_references: $client was in dccallowme " + "list of $existing_client but not in dccallowrem list!", + log_data_client("existing_client", client)); + } free_link(lp); lp = nextlp; } } -/* - * Recursively send QUITs and SQUITs for cptr and all of it's dependent - * clients. A server needs the client QUITs if it does not support NOQUIT. - * - kaniini - */ -static void recurse_send_quits(Client *cptr, Client *client, Client *from, Client *to, - MessageTag *mtags, const char *comment, const char *splitstr) -{ - Client *acptr, *next; - - list_for_each_entry_safe(acptr, next, &global_server_list, client_node) - { - if (acptr->srvptr != client) - continue; - - recurse_send_quits(cptr, acptr, from, to, mtags, comment, splitstr); - } - - if (cptr == client && to != from && !(to->direction && (to->direction == from))) - sendto_one(to, mtags, "SQUIT %s :%s", client->name, comment); -} - /* * Remove all clients that depend on source_p; assumes all (S)QUITs have * already been sent. we make sure to exit a server's dependent clients @@ -600,7 +418,7 @@ static void recurse_remove_clients(Client *client, MessageTag *mtags, const char list_for_each_entry_safe(acptr, next, &client_list, client_node) { - if (acptr->srvptr != client) + if (acptr->uplink != client) continue; exit_one_client(acptr, mtags, comment); @@ -608,7 +426,7 @@ static void recurse_remove_clients(Client *client, MessageTag *mtags, const char list_for_each_entry_safe(acptr, next, &global_server_list, client_node) { - if (acptr->srvptr != client) + if (acptr->uplink != client) continue; recurse_remove_clients(acptr, mtags, comment); @@ -626,7 +444,10 @@ static void remove_dependents(Client *client, Client *from, MessageTag *mtags, c Client *acptr; list_for_each_entry(acptr, &global_server_list, client_node) - recurse_send_quits(client, client, from, acptr, mtags, comment, splitstr); + { + if (acptr != from && !(acptr->direction && (acptr->direction == from))) + sendto_one(acptr, mtags, "SQUIT %s :%s", client->name, comment); + } recurse_remove_clients(client, mtags, splitstr); } @@ -647,18 +468,14 @@ static void exit_one_client(Client *client, MessageTag *mtags_i, const char *com MessageTag *mtags_o = NULL; if (!MyUser(client)) - RunHook3(HOOKTYPE_REMOTE_QUIT, client, mtags_i, comment); + RunHook(HOOKTYPE_REMOTE_QUIT, client, mtags_i, comment); new_message_special(client, mtags_i, &mtags_o, ":%s QUIT", client->name); sendto_local_common_channels(client, NULL, 0, mtags_o, ":%s QUIT :%s", client->name, comment); free_message_tags(mtags_o); while ((mp = client->user->channel)) - remove_user_from_channel(client, mp->channel); - - /* Clean up invitefield */ - while ((lp = client->user->invited)) - del_invite(client, lp->value.channel); + remove_user_from_channel(client, mp->channel, 1); /* again, this is all that is needed */ /* Clean up dccallow list and (if needed) notify other clients @@ -687,8 +504,6 @@ static void exit_one_client(Client *client, MessageTag *mtags_i, const char *com } if (*client->name) del_from_client_hash_table(client->name, client); - if (IsUser(client)) - hash_check_watch(client, RPL_LOGOFF); if (remote_rehash_client == client) remote_rehash_client = NULL; /* client did a /REHASH and QUIT before rehash was complete */ remove_client_from_list(client); @@ -699,7 +514,7 @@ static void exit_one_client(Client *client, MessageTag *mtags_i, const char *com * @param recv_mtags Message tags to use as a base (if any). * @param comment The (s)quit message */ -void exit_client(Client *client, MessageTag *recv_mtags, char *comment) +void exit_client(Client *client, MessageTag *recv_mtags, const char *comment) { exit_client_ex(client, client->direction, recv_mtags, comment); } @@ -709,7 +524,24 @@ void exit_client(Client *client, MessageTag *recv_mtags, char *comment) * @param recv_mtags Message tags to use as a base (if any). * @param comment The (s)quit message */ -void exit_client_ex(Client *client, Client *origin, MessageTag *recv_mtags, char *comment) +void exit_client_fmt(Client *client, MessageTag *recv_mtags, FORMAT_STRING(const char *pattern), ...) +{ + char comment[512]; + + va_list vl; + va_start(vl, pattern); + vsnprintf(comment, sizeof(comment), pattern, vl); + va_end(vl); + + exit_client_ex(client, client->direction, recv_mtags, comment); +} + +/** Exit this IRC client, and all the dependents (users, servers) if this is a server. + * @param client The client to exit. + * @param recv_mtags Message tags to use as a base (if any). + * @param comment The (s)quit message + */ +void exit_client_ex(Client *client, Client *origin, MessageTag *recv_mtags, const char *comment) { long long on_for; ConfigItem_listen *listen_conf; @@ -741,23 +573,25 @@ void exit_client_ex(Client *client, Client *origin, MessageTag *recv_mtags, char } if (IsUser(client)) irccounts.me_clients--; - if (client->serv && client->serv->conf) + if (client->server && client->server->conf) { - client->serv->conf->refcount--; - Debug((DEBUG_ERROR, "reference count for %s (%s) is now %d", - client->name, client->serv->conf->servername, client->serv->conf->refcount)); - if (!client->serv->conf->refcount - && client->serv->conf->flag.temporary) + client->server->conf->refcount--; + if (!client->server->conf->refcount + && client->server->conf->flag.temporary) { - Debug((DEBUG_ERROR, "deleting temporary block %s", client->serv->conf->servername)); - delete_linkblock(client->serv->conf); - client->serv->conf = NULL; + delete_linkblock(client->server->conf); + client->server->conf = NULL; } } if (IsServer(client)) { irccounts.me_servers--; - ircd_log(LOG_SERVER, "SQUIT %s (%s)", client->name, comment); + if (!IsServerDisconnectLogged(client)) + { + unreal_log(ULOG_ERROR, "link", "LINK_DISCONNECTED", client, + "Lost server link to $client [$client.ip]: $reason", + log_data_string("reason", comment)); + } } free_pending_net(client); if (client->local->listener) @@ -774,24 +608,17 @@ void exit_client_ex(Client *client, Client *origin, MessageTag *recv_mtags, char SetClosing(client); if (IsUser(client)) { - RunHook3(HOOKTYPE_LOCAL_QUIT, client, recv_mtags, comment); - sendto_connectnotice(client, 1, comment); - /* Clean out list and watch structures -Donwulff */ - hash_del_watch_list(client); - on_for = TStime() - client->local->firsttime; - if (IsHidden(client)) - ircd_log(LOG_CLIENT, "Disconnect - (%lld:%lld:%lld) %s!%s@%s [%s] [vhost: %s] (%s)", - on_for / 3600, (on_for % 3600) / 60, on_for % 60, - client->name, client->user->username, - client->user->realhost, GetIP(client), client->user->virthost, comment); - else - ircd_log(LOG_CLIENT, "Disconnect - (%lld:%lld:%lld) %s!%s@%s [%s] (%s)", - on_for / 3600, (on_for % 3600) / 60, on_for % 60, - client->name, client->user->username, client->user->realhost, GetIP(client), comment); + long connected_time = TStime() - client->local->creationtime; + RunHook(HOOKTYPE_LOCAL_QUIT, client, recv_mtags, comment); + unreal_log(ULOG_INFO, "connect", "LOCAL_CLIENT_DISCONNECT", client, + "Client exiting: $client ($client.user.username@$client.hostname) [$client.ip] ($reason)", + log_data_string("extended_client_info", get_connect_extinfo(client)), + log_data_string("reason", comment), + log_data_integer("connected_time", connected_time)); } else if (IsUnknown(client)) { - RunHook3(HOOKTYPE_UNKUSER_QUIT, client, recv_mtags, comment); + RunHook(HOOKTYPE_UNKUSER_QUIT, client, recv_mtags, comment); } if (client->local->fd >= 0 && !IsConnecting(client)) @@ -803,8 +630,14 @@ void exit_client_ex(Client *client, Client *origin, MessageTag *recv_mtags, char } else if (IsUser(client) && !IsULine(client)) { - if (client->srvptr != &me) - sendto_fconnectnotice(client, 1, comment); + if (client->uplink != &me) + { + unreal_log(ULOG_INFO, "connect", "REMOTE_CLIENT_DISCONNECT", client, + "Client exiting: $client ($client.user.username@$client.hostname) [$client.ip] ($reason)", + log_data_string("extended_client_info", get_connect_extinfo(client)), + log_data_string("reason", comment), + log_data_string("from_server_name", client->user->server)); + } } /* @@ -816,16 +649,16 @@ void exit_client_ex(Client *client, Client *origin, MessageTag *recv_mtags, char { char splitstr[HOSTLEN + HOSTLEN + 2]; - assert(client->serv != NULL && client->srvptr != NULL); + assert(client->server != NULL && client->uplink != NULL); if (FLAT_MAP) strlcpy(splitstr, "*.net *.split", sizeof splitstr); else - ircsnprintf(splitstr, sizeof splitstr, "%s %s", client->srvptr->name, client->name); + ircsnprintf(splitstr, sizeof splitstr, "%s %s", client->uplink->name, client->name); remove_dependents(client, origin, recv_mtags, comment, splitstr); - RunHook2(HOOKTYPE_SERVER_QUIT, client, recv_mtags); + RunHook(HOOKTYPE_SERVER_QUIT, client, recv_mtags); } else if (IsUser(client) && !IsKilled(client)) { @@ -845,7 +678,7 @@ void initstats(void) } /** Verify operator count, to catch bugs introduced by flawed services */ -void verify_opercount(Client *orig, char *tag) +void verify_opercount(Client *orig, const char *tag) { int counted = 0; Client *client; @@ -858,31 +691,44 @@ void verify_opercount(Client *orig, char *tag) } if (counted == irccounts.operators) return; - snprintf(text, sizeof(text), "[BUG] operator count bug! value in /lusers is '%d', we counted '%d', " - "user='%s', userserver='%s', tag=%s. Corrected. ", - irccounts.operators, counted, orig->name, - orig->srvptr ? orig->srvptr->name : "", tag ? tag : ""); -#ifdef DEBUGMODE - sendto_realops("%s", text); -#endif - ircd_log(LOG_ERROR, "%s", text); + unreal_log(ULOG_WARNING, "main", "BUG_LUSERS_OPERS", orig, + "[BUG] Operator count bug at $where! Value in /LUSERS is $opers, " + "we counted $counted_opers, " + "triggered by $client.details on $client.user.servername", + log_data_integer("opers", irccounts.operators), + log_data_integer("counted_opers", counted), + log_data_string("where", tag)); irccounts.operators = counted; } /** Check if the specified hostname does not contain forbidden characters. - * RETURNS: - * 1 if ok, 0 if rejected. + * @param host The host name to check + * @param strict If set to 1 then we also check if the hostname + * resembles an IP address (eg contains ':') and + * some other stuff that we don't consider valid + * in actual DNS names (eg '/'). + * @returns 1 if valid, 0 if not. */ -int valid_host(char *host) +int valid_host(const char *host, int strict) { - char *p; + const char *p; + + if (!*host) + return 0; /* must at least contain something */ if (strlen(host) > HOSTLEN) return 0; /* too long hosts are invalid too */ - for (p=host; *p; p++) - if (!isalnum(*p) && (*p != '_') && (*p != '-') && (*p != '.') && (*p != ':') && (*p != '/')) - return 0; + if (strict) + { + for (p=host; *p; p++) + if (!isalnum(*p) && !strchr("_-.", *p)) + return 0; + } else { + for (p=host; *p; p++) + if (!isalnum(*p) && !strchr("_-.:/", *p)) + return 0; + } return 1; } @@ -890,7 +736,7 @@ int valid_host(char *host) /*|| BAN ACTION ROUTINES FOLLOW ||*/ /** Converts a banaction string (eg: "kill") to an integer value (eg: BAN_ACT_KILL) */ -BanAction banact_stringtoval(char *s) +BanAction banact_stringtoval(const char *s) { BanActTable *b; @@ -923,7 +769,7 @@ char banact_valtochar(BanAction val) } /** Converts a banaction value (eg: BAN_ACT_KLINE) to a string (eg: "kline") */ -char *banact_valtostring(BanAction val) +const char *banact_valtostring(BanAction val) { BanActTable *b; @@ -936,7 +782,7 @@ char *banact_valtostring(BanAction val) /*|| BAN TARGET ROUTINES FOLLOW ||*/ /** Extract target flags from string 's'. */ -int spamfilter_gettargets(char *s, Client *client) +int spamfilter_gettargets(const char *s, Client *client) { SpamfilterTargetTable *e; int flags = 0; @@ -959,7 +805,7 @@ int flags = 0; } /** Convert a string with a targetname to an integer value */ -int spamfilter_getconftargets(char *s) +int spamfilter_getconftargets(const char *s) { SpamfilterTargetTable *e; @@ -972,9 +818,9 @@ SpamfilterTargetTable *e; /** Create a string with (multiple) targets from an integer mask */ char *spamfilter_target_inttostring(int v) { -static char buf[128]; -SpamfilterTargetTable *e; -char *p = buf; + static char buf[128]; + SpamfilterTargetTable *e; + char *p = buf; for (e = &spamfiltertargettable[0]; e->value; e++) if (v & e->value) @@ -1033,7 +879,7 @@ char *unreal_encodespace(char *s) } /** This is basically only used internally by match_spamfilter()... */ -char *cmdname_by_spamftarget(int target) +const char *cmdname_by_spamftarget(int target) { SpamfilterTargetTable *e; @@ -1044,7 +890,7 @@ char *cmdname_by_spamftarget(int target) } /** Returns 1 if this is a channel from set::auto-join or set::oper-auto-join */ -int is_autojoin_chan(char *chname) +int is_autojoin_chan(const char *chname) { char buf[512]; char *p, *name; @@ -1070,40 +916,6 @@ int is_autojoin_chan(char *chname) return 0; } -/** Convert a character like 'o' to the corresponding channel flag - * like CHFL_CHANOP. - * @param c The mode character. The only valid values are: vhoaq - * @returns One of CHFL_* or 0 if an invalid mode character is specified. - */ -int char_to_channelflag(char c) -{ - if (c == 'v') - return CHFL_VOICE; - else if (c == 'h') - return CHFL_HALFOP; - else if (c == 'o') - return CHFL_CHANOP; - else if (c == 'a') - return CHFL_CHANADMIN; - else if (c == 'q') - return CHFL_CHANOWNER; - return 0; -} - -// FIXME: should detect ce_vardata) - safe_strdup(m->mask, ce->ce_vardata); + if (ce->value) + safe_strdup(m->mask, ce->value); else - safe_strdup(m->mask, ce->ce_varname); + safe_strdup(m->mask, ce->name); add_ListItem((ListStruct *)m, (ListStruct **)head); } @@ -1136,10 +948,10 @@ static void unreal_add_mask(ConfigItem_mask **head, ConfigEntry *ce) /** Add mask entries from config */ void unreal_add_masks(ConfigItem_mask **head, ConfigEntry *ce) { - if (ce->ce_entries) + if (ce->items) { ConfigEntry *cep; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) unreal_add_mask(head, cep); } else { @@ -1147,29 +959,108 @@ void unreal_add_masks(ConfigItem_mask **head, ConfigEntry *ce) } } -/** Check if a client matches any of the masks in the mask list */ -int unreal_mask_match(Client *client, ConfigItem_mask *m) +/** Check if a client matches any of the masks in the mask list. + * The following rules apply: + * - If you have only negating entries, like '!abc' and '!def', then + * we assume an implicit * rule first, since that is clearly what + * the user wants. + * - If you have a mix, like '*.com', '!irc1*', '!irc2*' then the + * implicit * is dropped and we assume you only want to match *.com, + * with the exception of irc1*.com and irc2*.com. + * - If you only have normal entries without ! then things are + * as they always are. + * @param client The client to run the mask match against + * @param mask The mask entry from the config file + * @returns 1 on match, 0 on non-match. + */ +int unreal_mask_match(Client *client, ConfigItem_mask *mask) { - for (; m; m = m->next) + int retval = 1; + ConfigItem_mask *m; + + if (!mask) + return 0; /* Empty mask block is no match */ + + /* First check normal matches (without ! prefix) */ + for (m = mask; m; m = m->next) { - /* With special support for '!' prefix (negative matching like "!192.168.*") */ - if (m->mask[0] == '!') + if (m->mask[0] != '!') { - if (!match_user(m->mask+1, client, MATCH_CHECK_REAL)) - return 1; - } else { - if (match_user(m->mask, client, MATCH_CHECK_REAL)) - return 1; + retval = 0; /* no implicit * */ + if (match_user(m->mask, client, MATCH_CHECK_REAL|MATCH_CHECK_EXTENDED)) + { + retval = 1; + break; + } } } - return 0; + if (retval) + { + /* We matched. Check for exceptions (with ! prefix) */ + for (m = mask; m; m = m->next) + { + if ((m->mask[0] == '!') && match_user(m->mask+1, client, MATCH_CHECK_REAL|MATCH_CHECK_EXTENDED)) + return 0; + } + } + + return retval; +} + +/** Check if a string matches any of the masks in the mask list. + * The following rules apply: + * - If you have only negating entries, like '!abc' and '!def', then + * we assume an implicit * rule first, since that is clearly what + * the user wants. + * - If you have a mix, like '*.com', '!irc1*', '!irc2*' then the + * implicit * is dropped and we assume you only want to match *.com, + * with the exception of irc1*.com and irc2*.com. + * - If you only have normal entries without ! then things are + * as they always are. + * @param name The name to run the mask matching on + * @param mask The mask entry from the config file + * @returns 1 on match, 0 on non-match. + */ +int unreal_mask_match_string(const char *name, ConfigItem_mask *mask) +{ + int retval = 1; + ConfigItem_mask *m; + + if (!mask) + return 0; /* Empty mask block is no match */ + + /* First check normal matches (without ! prefix) */ + for (m = mask; m; m = m->next) + { + if (m->mask[0] != '!') + { + retval = 0; /* no implicit * */ + if (match_simple(m->mask, name)) + { + retval = 1; + break; + } + } + } + + if (retval) + { + /* We matched. Check for exceptions (with ! prefix) */ + for (m = mask; m; m = m->next) + { + if ((m->mask[0] == '!') && match_simple(m->mask+1, name)) + return 0; + } + } + + return retval; } /** Our own strcasestr implementation because strcasestr is * often not available or is not working correctly. */ -char *our_strcasestr(char *haystack, char *needle) +char *our_strcasestr(const char *haystack, const char *needle) { int i; int nlength = strlen(needle); @@ -1182,12 +1073,12 @@ char *our_strcasestr(char *haystack, char *needle) return NULL; if (nlength <= 0) - return haystack; + return (char *)haystack; for (i = 0; i <= (hlength - nlength); i++) { if (strncasecmp (haystack + i, needle, nlength) == 0) - return haystack + i; + return (char *)(haystack + i); } return NULL; /* not found */ @@ -1203,7 +1094,7 @@ char *our_strcasestr(char *haystack, char *needle) * @param from Who added this entry * @param skip Which server(-side) to skip broadcasting this entry to. */ -int swhois_add(Client *client, char *tag, int priority, char *swhois, Client *from, Client *skip) +int swhois_add(Client *client, const char *tag, int priority, const char *swhois, Client *from, Client *skip) { SWhois *s; @@ -1237,7 +1128,7 @@ int swhois_add(Client *client, char *tag, int priority, char *swhois, Client *fr * @param skip Which server(-side) to skip broadcasting this entry to. * @note If you use swhois "*" then it will remove all swhois titles for that tag */ -int swhois_delete(Client *client, char *tag, char *swhois, Client *from, Client *skip) +int swhois_delete(Client *client, const char *tag, const char *swhois, Client *from, Client *skip) { SWhois *s, *s_next; int ret = -1; /* default to 'not found' */ @@ -1277,8 +1168,6 @@ int IsWebsocket(Client *client) return (MyConnect(client) && moddata_client(client, md).ptr) ? 1 : 0; } -extern void send_raw_direct(Client *user, FORMAT_STRING(const char *pattern), ...); - /** Generic function to inform the user he/she has been banned. * @param client The affected client. * @param bantype The ban type, such as: "K-Lined", "G-Lined" or "realname". @@ -1290,7 +1179,7 @@ extern void send_raw_direct(Client *user, FORMAT_STRING(const char *pattern), .. * * @note This function will call exit_client() appropriately. */ -void banned_client(Client *client, char *bantype, char *reason, int global, int noexit) +void banned_client(Client *client, const char *bantype, const char *reason, int global, int noexit) { char buf[512]; char *fmt = global ? iConf.reject_message_gline : iConf.reject_message_kline; @@ -1369,7 +1258,7 @@ char *mystpcpy(char *dst, const char *src) * so similar to what strlen() would have returned. * @note Caller must ensure that the buffer 'buf' is of sufficient size. */ -size_t add_sjsby(char *buf, char *setby, time_t seton) +size_t add_sjsby(char *buf, const char *setby, time_t seton) { char tbuf[32]; char *p = buf; @@ -1399,14 +1288,14 @@ size_t add_sjsby(char *buf, char *setby, time_t seton) * sendto_server(client, 0, 0, recv_mtags, ":%s SOMECOMMAND %s", client->name, buf); * @endcode */ -void concat_params(char *buf, int len, int parc, char *parv[]) +void concat_params(char *buf, int len, int parc, const char *parv[]) { int i; *buf = '\0'; for (i = 1; i < parc; i++) { - char *param = parv[i]; + const char *param = parv[i]; if (!param) break; @@ -1476,7 +1365,6 @@ void new_message(Client *sender, MessageTag *recv_mtags, MessageTag **mtag_list) * This function calls modules so they can add tags, such as: * msgid, time and account. * This special version deals in a special way with msgid in particular. - * TODO: document * The pattern and vararg create a 'signature', this is normally * identical to the message that is sent to clients (end-users). * For example ":xyz JOIN #chan". @@ -1509,7 +1397,7 @@ void parse_message_tags_default_handler(Client *client, char **str, MessageTag * * This is only used if the 'mtags' module is NOT loaded, * which would be quite unusual, but possible. */ -char *mtags_to_string_default_handler(MessageTag *m, Client *client) +const char *mtags_to_string_default_handler(MessageTag *m, Client *client) { return NULL; } @@ -1568,6 +1456,11 @@ void labeled_response_force_end_default_handler(void) { } +/** Ad default handler for if the slog module is not loaded */ +void do_unreal_log_remote_deliver_default_handler(LogLevel loglevel, const char *subsystem, const char *event_id, MultiLine *msg, const char *json_serialized) +{ +} + /** my_timegm: mktime()-like function which will use GMT/UTC. * Strangely enough there is no standard function for this. * On some *NIX OS's timegm() may be available, sometimes only @@ -1612,16 +1505,10 @@ time_t server_time_to_unix_time(const char *tbuf) time_t ret; if (!tbuf) - { - ircd_log(LOG_ERROR, "[BUG] server_time_to_unix_time() failed for NULL item. Incorrect S2S traffic?"); return 0; - } if (strlen(tbuf) < 20) - { - ircd_log(LOG_ERROR, "[BUG] server_time_to_unix_time() failed for short item '%s'", tbuf); return 0; - } memset(&tm, 0, sizeof(tm)); ret = sscanf(tbuf, "%d-%d-%dT%d:%d:%d.%dZ", @@ -1634,10 +1521,7 @@ time_t server_time_to_unix_time(const char *tbuf) &dontcare); if (ret != 7) - { - ircd_log(LOG_ERROR, "[BUG] server_time_to_unix_time() failed for '%s'", tbuf); return 0; - } tm.tm_year -= 1900; tm.tm_mon -= 1; @@ -1646,6 +1530,68 @@ time_t server_time_to_unix_time(const char *tbuf) return ret; } +/** Convert an RFC 2616 timestamp (used in HTTP headers) to UNIX time */ +time_t rfc2616_time_to_unix_time(const char *tbuf) +{ + struct tm tm; + int dontcare = 0; + time_t ret; + char month[8]; + int i; + + if (!tbuf) + return 0; + + if (strlen(tbuf) < 20) + return 0; + + memset(&tm, 0, sizeof(tm)); + *month = '\0'; + ret = sscanf(tbuf, "%*[a-zA-Z,] %d %3s %d %d:%d:%d", + &tm.tm_mday, month, &tm.tm_year, + &tm.tm_hour, &tm.tm_min, &tm.tm_sec); + + if (ret < 6) + return 0; + + for (i=0; i < 12; i++) + { + if (!strcmp(short_months[i], month)) + { + tm.tm_mon = i; + break; + } + } + if (i == 12) + return 0; /* Month not found */ + if (tm.tm_year < 1900) + return 0; + + tm.tm_year -= 1900; + ret = my_timegm(&tm); + return ret; /* can still be 0 */ +} + +/** Returns an RFC 2616 timestamp (used in HTTP headers) */ +const char *rfc2616_time(time_t clock) +{ + static char buf[80], plus; + struct tm *lt, *gm; + struct tm gmbuf; + int minswest; + + if (!clock) + time(&clock); + gm = gmtime(&clock); + + snprintf(buf, sizeof(buf), + "%s, %02d %.3s %4d %02d:%02d:%02d GMT", + short_weekdays[gm->tm_wday], gm->tm_mday, short_months[gm->tm_mon], + gm->tm_year + 1900, gm->tm_hour, gm->tm_min, gm->tm_sec); + + return buf; +} + /** Write a 64 bit integer to a file. * @param fd File descriptor * @param t The value to write @@ -1735,7 +1681,7 @@ int write_data(FILE *fd, const void *buf, size_t len) * Note that 'x' can safely be NULL. * @returns 1 on success, 0 on failure. */ -int write_str(FILE *fd, char *x) +int write_str(FILE *fd, const char *x) { uint16_t len; @@ -1814,19 +1760,31 @@ void binarytohex(void *data, size_t len, char *str) str[n] = '\0'; } -/** Generates an MD5 checksum. +/** Generates an MD5 checksum - binary version. * @param mdout[out] Buffer to store result in, the result will be 16 bytes in binary * (not ascii printable!). * @param src[in] The input data used to generate the checksum. * @param n[in] Length of data. + * @deprecated The MD5 algorithm is deprecated and insecure, + * so only use this if absolutely needed. */ void DoMD5(char *mdout, const char *src, unsigned long n) { +#if OPENSSL_VERSION_NUMBER >= 0x30000000L + unsigned int md_len; + EVP_MD_CTX *mdctx = EVP_MD_CTX_new(); + if (EVP_DigestInit_ex(mdctx, md5_function, NULL) != 1) + abort(); + EVP_DigestUpdate(mdctx, src, n); + EVP_DigestFinal_ex(mdctx, mdout, &md_len); + EVP_MD_CTX_free(mdctx); +#else MD5_CTX hash; MD5_Init(&hash); MD5_Update(&hash, src, n); MD5_Final(mdout, &hash); +#endif } /** Generates an MD5 checksum - ASCII printable string (0011223344..etc..). @@ -1834,6 +1792,8 @@ void DoMD5(char *mdout, const char *src, unsigned long n) * 32 characters + nul terminator, so needs to be at least 33 characters. * @param src[in] The input data used to generate the checksum. * @param n[in] Length of data. + * @deprecated The MD5 algorithm is deprecated and insecure, + * so only use this if absolutely needed. */ char *md5hash(char *dst, const char *src, unsigned long n) { @@ -1844,6 +1804,32 @@ char *md5hash(char *dst, const char *src, unsigned long n) return dst; } +/** Generates a SHA256 checksum - binary version. + * Most people will want to use sha256hash() instead which outputs hex. + * @param dst[out] Buffer to store result in, which needs to be 32 bytes in length + * (SHA256_DIGEST_LENGTH). + * @param src[in] The input data used to generate the checksum. + * @param n[in] Length of data. + */ +void sha256hash_binary(char *dst, const char *src, unsigned long n) +{ +#if OPENSSL_VERSION_NUMBER >= 0x30000000L + unsigned int md_len; + EVP_MD_CTX *mdctx = EVP_MD_CTX_new(); + if (EVP_DigestInit_ex(mdctx, sha256_function, NULL) != 1) + abort(); + EVP_DigestUpdate(mdctx, src, n); + EVP_DigestFinal_ex(mdctx, dst, &md_len); + EVP_MD_CTX_free(mdctx); +#else + SHA256_CTX hash; + + SHA256_Init(&hash); + SHA256_Update(&hash, src, n); + SHA256_Final(dst, &hash); +#endif +} + /** Generates a SHA256 checksum - ASCII printable string (0011223344..etc..). * @param dst[out] Buffer to store result in, which needs to be 65 bytes minimum. * @param src[in] The input data used to generate the checksum. @@ -1851,18 +1837,15 @@ char *md5hash(char *dst, const char *src, unsigned long n) */ char *sha256hash(char *dst, const char *src, unsigned long n) { - SHA256_CTX hash; char binaryhash[SHA256_DIGEST_LENGTH]; - SHA256_Init(&hash); - SHA256_Update(&hash, src, n); - SHA256_Final(binaryhash, &hash); + sha256hash_binary(binaryhash, src, n); binarytohex(binaryhash, sizeof(binaryhash), dst); return dst; } /** Calculate the SHA256 checksum of a file */ -char *sha256sum_file(const char *fname) +const char *sha256sum_file(const char *fname) { FILE *fd; char buf[2048]; @@ -1870,22 +1853,68 @@ char *sha256sum_file(const char *fname) char binaryhash[SHA256_DIGEST_LENGTH]; static char hexhash[SHA256_DIGEST_LENGTH*2+1]; int n; +#if OPENSSL_VERSION_NUMBER >= 0x30000000L + unsigned int md_len; + EVP_MD_CTX *mdctx; + + mdctx = EVP_MD_CTX_new(); + if (EVP_DigestInit_ex(mdctx, sha256_function, NULL) != 1) + abort(); +#else + SHA256_Init(&hash); +#endif fd = fopen(fname, "rb"); if (!fd) return NULL; - SHA256_Init(&hash); while ((n = fread(buf, 1, sizeof(buf), fd)) > 0) { +#if OPENSSL_VERSION_NUMBER >= 0x30000000L + EVP_DigestUpdate(mdctx, buf, n); +#else SHA256_Update(&hash, buf, n); +#endif } fclose(fd); + +#if OPENSSL_VERSION_NUMBER >= 0x30000000L + EVP_DigestFinal_ex(mdctx, binaryhash, &md_len); + EVP_MD_CTX_free(mdctx); +#else SHA256_Final(binaryhash, &hash); +#endif binarytohex(binaryhash, sizeof(binaryhash), hexhash); return hexhash; } +/** Generates a SHA1 checksum - binary version. + * @param dst[out] Buffer to store result in, which needs to be 32 bytes in length + * (SHA1_DIGEST_LENGTH). + * @param src[in] The input data used to generate the checksum. + * @param n[in] Length of data. + * @deprecated The SHA1 algorithm is deprecated and insecure, + * so only use this if absolutely needed. + */ +void sha1hash_binary(char *dst, const char *src, unsigned long n) +{ +#if OPENSSL_VERSION_NUMBER >= 0x30000000L + unsigned int md_len; + EVP_MD_CTX *mdctx = EVP_MD_CTX_new(); + if (EVP_DigestInit_ex(mdctx, sha1_function, NULL) != 1) + abort(); + EVP_DigestUpdate(mdctx, src, n); + EVP_DigestFinal_ex(mdctx, dst, &md_len); + EVP_MD_CTX_free(mdctx); +#else + SHA_CTX hash; + + SHA1_Init(&hash); + SHA1_Update(&hash, src, n); + SHA1_Final(dst, &hash); +#endif +} + /** Remove a suffix from a filename, eg ".c" (if it is present) */ char *filename_strip_suffix(const char *fname, const char *suffix) { @@ -1932,21 +1961,20 @@ int filename_has_suffix(const char *fname, const char *suffix) return 0; } -/** Check if the specified file exists */ -int file_exists(char *file) +/** Check if the specified file or directory exists */ +int file_exists(const char *file) { - FILE *fd; - - fd = fopen(file, "r"); - if (!fd) - return 0; - - fclose(fd); - return 1; +#ifdef _WIN32 + if (_access(file, 0) == 0) +#else + if (access(file, 0) == 0) +#endif + return 1; + return 0; } /** Get the file creation time */ -time_t get_file_time(char *fname) +time_t get_file_time(const char *fname) { struct stat st; @@ -1957,7 +1985,7 @@ time_t get_file_time(char *fname) } /** Get the size of a file */ -long get_file_size(char *fname) +long get_file_size(const char *fname) { struct stat st; @@ -1968,7 +1996,7 @@ long get_file_size(char *fname) } /** Add a line to a MultiLine list */ -void addmultiline(MultiLine **l, char *line) +void addmultiline(MultiLine **l, const char *line) { MultiLine *m = safe_alloc(sizeof(MultiLine)); safe_strdup(m->line, line); @@ -1987,8 +2015,27 @@ void freemultiline(MultiLine *l) } } +/** Convert a line regular string containing \n's to a MultiLine linked list */ +MultiLine *line2multiline(const char *str) +{ + static char buf[8192]; + char *p, *p2; + MultiLine *ml = NULL; + + strlcpy(buf, str, sizeof(buf)); + p = buf; + do { + p2 = strchr(p, '\n'); + if (p2) + *p2++ = '\0'; + addmultiline(&ml, p); + p = p2; + } while(p2 && *p2); + return ml; +} + /** Convert a sendtype to a command string */ -char *sendtype_to_cmd(SendType sendtype) +const char *sendtype_to_cmd(SendType sendtype) { if (sendtype == SEND_TYPE_PRIVMSG) return "PRIVMSG"; @@ -2005,11 +2052,11 @@ char *sendtype_to_cmd(SendType sendtype) * @param strict Whether to require UPPER+lower+digits * @returns 1 if good, 0 if not. */ -int check_password_strength(char *pass, int min_length, int strict, char **err) +int check_password_strength(const char *pass, int min_length, int strict, char **err) { - char has_lowercase=0, has_uppercase=0, has_digit=0; - char *p; static char buf[256]; + char has_lowercase=0, has_uppercase=0, has_digit=0; + const char *p; if (err) *err = NULL; @@ -2059,7 +2106,7 @@ int check_password_strength(char *pass, int min_length, int strict, char **err) return 1; } -int valid_secret_password(char *pass, char **err) +int valid_secret_password(const char *pass, char **err) { return check_password_strength(pass, 10, 1, err); } @@ -2082,6 +2129,34 @@ int running_interactively(void) #endif } +int terminal_supports_color(void) +{ +#ifndef _WIN32 + char *s; + + /* Yeah we check all of stdin, stdout, stderr, because + * or more may be redirected (bin/unrealircd >log 2>&1), + * and then we want to say no to color support. + */ + if (!isatty(0) || !isatty(1) || !isatty(2)) + return 0; + + s = getenv("TERM"); + /* Yeah this is a lazy way to detect color-capable terminals + * but it is good enough for me. + */ + if (s) + { + if (strstr(s, "color") || strstr(s, "ansi")) + return 1; + } + + return 0; +#else + return 0; +#endif +} + /** Skip whitespace (if any) */ void skip_whitespace(char **p) { @@ -2096,3 +2171,201 @@ void read_until(char **p, char *stopchars) { for (; **p && !strchr(stopchars, **p); *p = *p + 1); } + +void write_pidfile_failed(void) +{ + char *errstr = strerror(errno); + unreal_log(ULOG_WARNING, "config", "WRITE_PID_FILE_FAILED", NULL, + "Unable to write to pid file '$filename': $system_error", + log_data_string("filename", conf_files->pid_file), + log_data_string("system_error", errstr)); +} + +/** Write PID file */ +void write_pidfile(void) +{ +#ifdef IRCD_PIDFILE + int fd; + char buff[20]; + if ((fd = open(conf_files->pid_file, O_CREAT | O_WRONLY, 0600)) < 0) + { + write_pidfile_failed(); + return; + } + ircsnprintf(buff, sizeof(buff), "%5d\n", (int)getpid()); + if (write(fd, buff, strlen(buff)) < 0) + write_pidfile_failed(); + if (close(fd) < 0) + write_pidfile_failed(); +#endif +} + +/* + * Determines if the given string is a valid URL. Since libcurl + * supports telnet, ldap, and dict such strings are treated as + * invalid URLs here since we don't want them supported in + * unreal. + */ +int url_is_valid(const char *string) +{ + if (strstr(string, " ") || strstr(string, "\t")) + return 0; + + if (strstr(string, "telnet://") == string || + strstr(string, "ldap://") == string || + strstr(string, "dict://") == string) + { + return 0; + } + return (strstr(string, "://") != NULL); +} + +/** A displayable URL for in error messages and such. + * This leaves out any authentication information (user:pass) + * the URL may contain. + */ +const char *displayurl(const char *url) +{ + static char buf[512]; + char *proto, *rest; + + /* protocol://user:pass@host/etc.. */ + rest = strchr(url, '@'); + + if (!rest) + return url; /* contains no auth information */ + + rest++; /* now points to the rest (remainder) of the URL */ + + proto = strstr(url, "://"); + if (!proto || (proto > rest) || (proto == url)) + return url; /* incorrectly formatted, just show entire URL. */ + + strlncpy(buf, url, sizeof(buf), proto - url); + strlcat(buf, "://***:***@", sizeof(buf)); + strlcat(buf, rest, sizeof(buf)); + + return buf; +} + +/* + * Returns the filename portion of the URL. The returned string + * is malloc()'ed and must be freed by the caller. If the specified + * URL does not contain a filename, a '-' is allocated and returned. + */ +char *url_getfilename(const char *url) +{ + const char *c, *start; + + if ((c = strstr(url, "://"))) + c += 3; + else + c = url; + + while (*c && *c != '/') + c++; + + if (*c == '/') + { + c++; + if (!*c || *c == '?') + return raw_strdup("-"); + start = c; + while (*c && *c != '?') + c++; + if (!*c) + return raw_strdup(start); + else + return raw_strldup(start, c-start+1); + + } + return raw_strdup("-"); +} + +#ifdef _WIN32 + // https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/access-waccess + // mode value Checks file for + // 04 Read-only + #define R_OK 04 +#endif + +/* + * Checks whether a file can be opened for reading. + */ +int is_file_readable(const char *file, const char *dir) +{ + char *filename = strdup(file); + convert_to_absolute_path(&filename, dir); + if (access(filename, R_OK)){ + safe_free(filename); + return 0; + } + safe_free(filename); + return 1; +} + +void delletterfromstring(char *s, char letter) +{ + if (s == NULL) + return; + for (; *s; s++) + { + if (*s == letter) + { + for (; *s; s++) + *s = s[1]; + break; + } + } +} + +int sort_character_lowercase_before_uppercase(char x, char y) +{ + /* Lower before upper */ + if (islower(x) && isupper(y)) + return 1; + if (isupper(x) && islower(y)) + return 0; + /* Other than that, easy */ + return x < y ? 1 : 0; +} + +/* Helper function, mainly used by snomask code */ +void addlettertodynamicstringsorted(char **str, char letter) +{ + char *i, *o; + char *newbuf; + size_t newbuflen; + + /* NULL string? Easy! */ + if (*str == NULL) + { + *str = safe_alloc(2); + **str = letter; + return; + } + + /* Exists? Then nothing to do */ + if (strchr(*str, letter)) + return; + + /* Ok, we really need to add it */ + newbuflen = strlen(*str) + 2; + newbuf = safe_alloc(newbuflen); + for (i = *str, o = newbuf; *i; i++) + { + /* Insert before a higher letter */ + if (letter && sort_character_lowercase_before_uppercase(letter, *i)) + { + *o++ = letter; + letter = '\0'; + } + *o++ = *i; + } + /* Or maybe we should be at the final spot? */ + if (letter) + *o++ = letter; + *o = '\0'; + safe_free_raw(*str); + *str = newbuf; +} diff --git a/src/modulemanager.c b/src/modulemanager.c index 1165df0..680a888 100644 --- a/src/modulemanager.c +++ b/src/modulemanager.c @@ -44,7 +44,7 @@ int mm_valid_module_name(char *name); void free_managed_module(ManagedModule *m); -SSL_CTX *mm_init_ssl(void) +SSL_CTX *mm_init_tls(void) { SSL_CTX *ctx_client; char buf1[512], buf2[512]; @@ -101,8 +101,7 @@ int parse_url(const char *url, char **host, int *port, char **document) if (!p) return 0; - *hostbuf = '\0'; - strlncat(hostbuf, url, sizeof(hostbuf), p - url); + strlncpy(hostbuf, url, sizeof(hostbuf), p - url); strlcpy(documentbuf, p, sizeof(documentbuf)); @@ -134,7 +133,7 @@ int mm_http_request(char *url, char *fname, int follow_redirects) snprintf(hostandport, sizeof(hostandport), "%s:%d", host, port); - ctx_client = mm_init_ssl(); + ctx_client = mm_init_tls(); if (!ctx_client) { fprintf(stderr, "ERROR: TLS initalization failure (I)\n"); @@ -163,14 +162,14 @@ int mm_http_request(char *url, char *fname, int follow_redirects) if (BIO_do_connect(socket) != 1) { fprintf(stderr, "ERROR: Could not connect to %s\n", hostandport); - config_report_ssl_error(); + //config_report_ssl_error(); FIXME? goto out2; } if (BIO_do_handshake(socket) != 1) { fprintf(stderr, "ERROR: Could not connect to %s (TLS handshake failed)\n", hostandport); - config_report_ssl_error(); + //config_report_ssl_error(); FIXME? goto out2; } @@ -339,63 +338,64 @@ int parse_quoted_string(char *buf, char *dest, size_t destlen) return 1; } -#define CheckNull(x) if ((!(x)->ce_vardata) || (!(*((x)->ce_vardata)))) { config_error("%s:%i: missing parameter", m->name, (x)->ce_varlinenum); return 0; } +#undef CheckNull +#define CheckNull(x) if ((!(x)->value) || (!(*((x)->value)))) { config_error("%s:%i: missing parameter", m->name, (x)->line_number); return 0; } /** Parse a module { } line from a module (not repo!!) */ int mm_module_file_config(ManagedModule *m, ConfigEntry *ce) { ConfigEntry *cep; - if (ce->ce_vardata) + if (ce->value) { config_error("%s:%d: module { } block should not have a name.", - m->name, ce->ce_varlinenum); + m->name, ce->line_number); return 0; } - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "source") || - !strcmp(cep->ce_varname, "version") || - !strcmp(cep->ce_varname, "author") || - !strcmp(cep->ce_varname, "sha256sum") || - !strcmp(cep->ce_varname, "description") + if (!strcmp(cep->name, "source") || + !strcmp(cep->name, "version") || + !strcmp(cep->name, "author") || + !strcmp(cep->name, "sha256sum") || + !strcmp(cep->name, "description") ) { config_error("%s:%d: module::%s should not be in here (it only exists in repository entries)", - m->name, cep->ce_varlinenum, cep->ce_varname); + m->name, cep->line_number, cep->name); return 0; } - else if (!strcmp(cep->ce_varname, "troubleshooting")) + else if (!strcmp(cep->name, "troubleshooting")) { CheckNull(cep); - safe_strdup(m->troubleshooting, cep->ce_vardata); + safe_strdup(m->troubleshooting, cep->value); } - else if (!strcmp(cep->ce_varname, "documentation")) + else if (!strcmp(cep->name, "documentation")) { CheckNull(cep); - safe_strdup(m->documentation, cep->ce_vardata); + safe_strdup(m->documentation, cep->value); } - else if (!strcmp(cep->ce_varname, "min-unrealircd-version")) + else if (!strcmp(cep->name, "min-unrealircd-version")) { CheckNull(cep); - safe_strdup(m->min_unrealircd_version, cep->ce_vardata); + safe_strdup(m->min_unrealircd_version, cep->value); } - else if (!strcmp(cep->ce_varname, "max-unrealircd-version")) + else if (!strcmp(cep->name, "max-unrealircd-version")) { CheckNull(cep); - safe_strdup(m->max_unrealircd_version, cep->ce_vardata); + safe_strdup(m->max_unrealircd_version, cep->value); } - else if (!strcmp(cep->ce_varname, "post-install-text")) + else if (!strcmp(cep->name, "post-install-text")) { - if (cep->ce_entries) + if (cep->items) { ConfigEntry *cepp; - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) - addmultiline(&m->post_install_text, cepp->ce_varname); + for (cepp = cep->items; cepp; cepp = cepp->next) + addmultiline(&m->post_install_text, cepp->name); } else { CheckNull(cep); - addmultiline(&m->post_install_text, cep->ce_vardata); + addmultiline(&m->post_install_text, cep->value); } } /* unknown items are silently ignored for future compatibility */ @@ -403,19 +403,19 @@ int mm_module_file_config(ManagedModule *m, ConfigEntry *ce) if (!m->documentation) { - config_error("%s:%d: module::documentation missing", m->name, ce->ce_varlinenum); + config_error("%s:%d: module::documentation missing", m->name, ce->line_number); return 0; } if (!m->troubleshooting) { - config_error("%s:%d: module::troubleshooting missing", m->name, ce->ce_varlinenum); + config_error("%s:%d: module::troubleshooting missing", m->name, ce->line_number); return 0; } if (!m->min_unrealircd_version) { - config_error("%s:%d: module::min-unrealircd-version missing", m->name, ce->ce_varlinenum); + config_error("%s:%d: module::min-unrealircd-version missing", m->name, ce->line_number); return 0; } @@ -438,9 +438,9 @@ int mm_parse_module_file(ManagedModule *m, char *buf, unsigned int line_offset) return 0; /* eg: parse errors */ /* Parse the module { } block (only one!) */ - for (ce = cf->cf_entries; ce; ce = ce->ce_next) + for (ce = cf->items; ce; ce = ce->next) { - if (!strcmp(ce->ce_varname, "module")) + if (!strcmp(ce->name, "module")) { int n = mm_module_file_config(m, ce); config_free(cf); @@ -652,7 +652,8 @@ int mm_valid_module_name(char *name) return 1; } -#define CheckNull(x) if ((!(x)->ce_vardata) || (!(*((x)->ce_vardata)))) { config_error("%s:%i: missing parameter", repo_url, (x)->ce_varlinenum); goto fail_mm_repo_module_config; } +#undef CheckNull +#define CheckNull(x) if ((!(x)->value) || (!(*((x)->value)))) { config_error("%s:%i: missing parameter", repo_url, (x)->line_number); goto fail_mm_repo_module_config; } /** Parse a module { } line from a repository */ ManagedModule *mm_repo_module_config(char *repo_url, ConfigEntry *ce) @@ -660,84 +661,84 @@ ManagedModule *mm_repo_module_config(char *repo_url, ConfigEntry *ce) ConfigEntry *cep; ManagedModule *m = safe_alloc(sizeof(ManagedModule)); - if (!ce->ce_vardata) + if (!ce->value) { config_error("%s:%d: module { } with no name", - repo_url, ce->ce_varlinenum); + repo_url, ce->line_number); goto fail_mm_repo_module_config; } - if (strncmp(ce->ce_vardata, "third/", 6)) + if (strncmp(ce->value, "third/", 6)) { config_error("%s:%d: module { } name must start with: third/", - repo_url, ce->ce_varlinenum); + repo_url, ce->line_number); goto fail_mm_repo_module_config; } - if (!mm_valid_module_name(ce->ce_vardata)) + if (!mm_valid_module_name(ce->value)) { config_error("%s:%d: module { } with illegal name: %s", - repo_url, ce->ce_varlinenum, ce->ce_vardata); + repo_url, ce->line_number, ce->value); goto fail_mm_repo_module_config; } - safe_strdup(m->name, ce->ce_vardata); + safe_strdup(m->name, ce->value); safe_strdup(m->repo_url, repo_url); - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "source")) + if (!strcmp(cep->name, "source")) { CheckNull(cep); - safe_strdup(m->source, cep->ce_vardata); + safe_strdup(m->source, cep->value); } - else if (!strcmp(cep->ce_varname, "sha256sum")) + else if (!strcmp(cep->name, "sha256sum")) { CheckNull(cep); - safe_strdup(m->sha256sum, cep->ce_vardata); + safe_strdup(m->sha256sum, cep->value); } - else if (!strcmp(cep->ce_varname, "version")) + else if (!strcmp(cep->name, "version")) { CheckNull(cep); - safe_strdup(m->version, cep->ce_vardata); + safe_strdup(m->version, cep->value); } - else if (!strcmp(cep->ce_varname, "author")) + else if (!strcmp(cep->name, "author")) { CheckNull(cep); - safe_strdup(m->author, cep->ce_vardata); + safe_strdup(m->author, cep->value); } - else if (!strcmp(cep->ce_varname, "troubleshooting")) + else if (!strcmp(cep->name, "troubleshooting")) { CheckNull(cep); - safe_strdup(m->troubleshooting, cep->ce_vardata); + safe_strdup(m->troubleshooting, cep->value); } - else if (!strcmp(cep->ce_varname, "documentation")) + else if (!strcmp(cep->name, "documentation")) { CheckNull(cep); - safe_strdup(m->documentation, cep->ce_vardata); + safe_strdup(m->documentation, cep->value); } - else if (!strcmp(cep->ce_varname, "min-unrealircd-version")) + else if (!strcmp(cep->name, "min-unrealircd-version")) { CheckNull(cep); - safe_strdup(m->min_unrealircd_version, cep->ce_vardata); + safe_strdup(m->min_unrealircd_version, cep->value); } - else if (!strcmp(cep->ce_varname, "max-unrealircd-version")) + else if (!strcmp(cep->name, "max-unrealircd-version")) { CheckNull(cep); - safe_strdup(m->max_unrealircd_version, cep->ce_vardata); + safe_strdup(m->max_unrealircd_version, cep->value); } - else if (!strcmp(cep->ce_varname, "description")) + else if (!strcmp(cep->name, "description")) { CheckNull(cep); - safe_strdup(m->description, cep->ce_vardata); + safe_strdup(m->description, cep->value); } - else if (!strcmp(cep->ce_varname, "post-install-text")) + else if (!strcmp(cep->name, "post-install-text")) { - if (cep->ce_entries) + if (cep->items) { ConfigEntry *cepp; - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) - addmultiline(&m->post_install_text, cepp->ce_varname); + for (cepp = cep->items; cepp; cepp = cepp->next) + addmultiline(&m->post_install_text, cepp->name); } else { CheckNull(cep); - addmultiline(&m->post_install_text, cep->ce_vardata); + addmultiline(&m->post_install_text, cep->value); } } /* unknown items are silently ignored for future compatibility */ @@ -745,43 +746,43 @@ ManagedModule *mm_repo_module_config(char *repo_url, ConfigEntry *ce) if (!m->source) { - config_error("%s:%d: module::source missing", repo_url, ce->ce_varlinenum); + config_error("%s:%d: module::source missing", repo_url, ce->line_number); goto fail_mm_repo_module_config; } if (!m->sha256sum) { - config_error("%s:%d: module::sha256sum missing", repo_url, ce->ce_varlinenum); + config_error("%s:%d: module::sha256sum missing", repo_url, ce->line_number); goto fail_mm_repo_module_config; } if (!m->version) { - config_error("%s:%d: module::version missing", repo_url, ce->ce_varlinenum); + config_error("%s:%d: module::version missing", repo_url, ce->line_number); goto fail_mm_repo_module_config; } if (!m->author) { - config_error("%s:%d: module::author missing", repo_url, ce->ce_varlinenum); + config_error("%s:%d: module::author missing", repo_url, ce->line_number); goto fail_mm_repo_module_config; } if (!m->documentation) { - config_error("%s:%d: module::documentation missing", repo_url, ce->ce_varlinenum); + config_error("%s:%d: module::documentation missing", repo_url, ce->line_number); goto fail_mm_repo_module_config; } if (!m->troubleshooting) { - config_error("%s:%d: module::troubleshooting missing", repo_url, ce->ce_varlinenum); + config_error("%s:%d: module::troubleshooting missing", repo_url, ce->line_number); goto fail_mm_repo_module_config; } if (!m->min_unrealircd_version) { - config_error("%s:%d: module::min-unrealircd-version missing", repo_url, ce->ce_varlinenum); + config_error("%s:%d: module::min-unrealircd-version missing", repo_url, ce->line_number); goto fail_mm_repo_module_config; } /* max_unrealircd_version is optional */ if (!m->description) { - config_error("%s:%d: module::description missing", repo_url, ce->ce_varlinenum); + config_error("%s:%d: module::description missing", repo_url, ce->line_number); goto fail_mm_repo_module_config; } /* post_install_text is optional */ @@ -805,9 +806,9 @@ int mm_parse_repo_db(char *url, char *filename) if (!cf) return 0; /* eg: parse errors */ - for (ce = cf->cf_entries; ce; ce = ce->ce_next) + for (ce = cf->items; ce; ce = ce->next) { - if (!strcmp(ce->ce_varname, "module")) + if (!strcmp(ce->name, "module")) { m = mm_repo_module_config(url, ce); if (!m) @@ -957,7 +958,7 @@ int mm_get_module_status(ManagedModule *m) { FILE *fd; char fname[512]; - char *our_sha256sum; + const char *our_sha256sum; snprintf(fname, sizeof(fname), "%s/src/modules/%s.c", BUILDDIR, m->name); if (!file_exists(fname)) @@ -1142,7 +1143,7 @@ int mm_compile(ManagedModule *m, char *tmpfile, int test) { char newpath[512]; char cmd[512]; - char *basename; + const char *basename; char *p; FILE *fd; char buf[512]; @@ -1213,15 +1214,15 @@ int mm_compile(ManagedModule *m, char *tmpfile, int test) */ void mm_install_module(ManagedModule *m) { - char *basename = unreal_getfilename(m->source); + const char *basename = unreal_getfilename(m->source); char *tmpfile; - char *sha256; + const char *sha256; if (!basename) basename = "mod.c"; tmpfile = unreal_mktemp(TMPDIR, basename); - printf("Downloading %s from %s...\n", m->name, m->source); + printf("ConfigResourceing %s from %s...\n", m->name, m->source); if (!mm_http_request(m->source, tmpfile, 1)) { fprintf(stderr, "Repository %s seems to list a module file that cannot be retrieved (%s).\n", m->repo_url, m->source); @@ -1535,7 +1536,7 @@ void print_md_block(FILE *fdo, ManagedModule *m) void mm_generate_repository_usage(void) { - fprintf(stderr, "Usage: ./unrealircd module generate-repository \n"); + fprintf(stderr, "Usage: ./unrealircd module generate-repository [optional-minimum-version-filter]\n"); fprintf(stderr, "For example: ./unrealircd module generate-repository https://www.unrealircd.org/modules/ src/modules/third modules.lst\n"); } @@ -1547,6 +1548,7 @@ void mm_generate_repository(int argc, char *args[]) char *urlbasepath; char *dirname; char *outputfile; + char *minversion; char modname[128]; char fullname[512]; ManagedModule *m; @@ -1555,6 +1557,8 @@ void mm_generate_repository(int argc, char *args[]) urlbasepath = args[1]; dirname = args[2]; outputfile = args[3]; + minversion = args[4]; + if (!urlbasepath || !dirname || !outputfile) { mm_generate_repository_usage(); @@ -1587,6 +1591,7 @@ void mm_generate_repository(int argc, char *args[]) char *fname = dir->d_name; if (filename_has_suffix(fname, ".c")) { + int hide = 0; snprintf(fullname, sizeof(fullname), "%s/%s", dirname, fname); snprintf(modname, sizeof(modname), "third/%s", filename_strip_suffix(fname, ".c")); printf("Processing: %s\n", modname); @@ -1599,7 +1604,12 @@ void mm_generate_repository(int argc, char *args[]) m->sha256sum = strdup(sha256sum_file(fullname)); m->source = safe_alloc(512); snprintf(m->source, 512, "%s%s.c", urlbasepath, modname + 6); - print_md_block(fdo, m); + /* filter */ + if (minversion && m->min_unrealircd_version && strncmp(minversion, m->min_unrealircd_version, strlen(minversion))) + hide = 1; + /* /filter */ + if (!hide) + print_md_block(fdo, m); free_managed_module(m); m = NULL; } @@ -1611,7 +1621,7 @@ void mm_generate_repository(int argc, char *args[]) void mm_parse_c_file(int argc, char *args[]) { char *fullname = args[1]; - char *basename; + const char *basename; char modname[256]; ManagedModule *m; diff --git a/src/modules.c b/src/modules.c index d7de75c..208c6b5 100644 --- a/src/modules.c +++ b/src/modules.c @@ -52,7 +52,7 @@ Module *Module_make(ModuleHeader *header, #ifdef UNDERSCORE /* dlsym for OpenBSD */ -void *obsd_dlsym(void *handle, char *symbol) +void *obsd_dlsym(void *handle, const char *symbol) { size_t buflen = strlen(symbol) + 2; char *obsdsymbol = safe_alloc(buflen); @@ -69,7 +69,7 @@ void *obsd_dlsym(void *handle, char *symbol) } #endif -void deletetmp(char *path) +void deletetmp(const char *path) { #ifndef NOREMOVETMP if (!loop.config_test) @@ -88,7 +88,7 @@ void DeleteTempModules(void) { config_error("Unable to open temp directory %s: %s, please create one with the appropriate permissions", TMPDIR, strerror(errno)); - if (!loop.ircd_booted) + if (!loop.booted) exit(7); return; } @@ -131,7 +131,7 @@ void DeleteTempModules(void) #endif } -Module *Module_Find(char *name) +Module *Module_Find(const char *name) { Module *p; @@ -149,16 +149,16 @@ Module *Module_Find(char *name) } -int parse_modsys_version(char *version) +int parse_modsys_version(const char *version) { - if (!strcmp(version, "unrealircd-5")) - return 0x500000; + if (!strcmp(version, "unrealircd-6")) + return 0x600000; return 0; } void make_compiler_string(char *buf, size_t buflen, unsigned int ver) { -unsigned int maj, min, plevel; + unsigned int maj, min, plevel; if (ver == 0) { @@ -180,7 +180,7 @@ unsigned int maj, min, plevel; * something like "/home/xyz/unrealircd/modules/third/la.so * (and other tricks) */ -char *Module_TransformPath(char *path_) +const char *Module_TransformPath(const char *path_) { static char path[1024]; @@ -202,17 +202,18 @@ char *Module_TransformPath(char *path_) } /** This function is the inverse of Module_TransformPath() */ -char *Module_GetRelPath(char *fullpath) +const char *Module_GetRelPath(const char *fullpath) { static char buf[512]; char prefix[512]; - char *s = fullpath; + const char *without_prefix = fullpath; + char *s; /* Strip the prefix */ snprintf(prefix, sizeof(prefix), "%s/", MODULESDIR); if (!strncasecmp(fullpath, prefix, strlen(prefix))) - s += strlen(prefix); - strlcpy(buf, s, sizeof(buf)); + without_prefix += strlen(prefix); + strlcpy(buf, without_prefix, sizeof(buf)); /* Strip the suffix */ s = strstr(buf, MODULE_SUFFIX); @@ -225,7 +226,7 @@ char *Module_GetRelPath(char *fullpath) /** Validate a modules' ModuleHeader. * @returns Error message is returned, or NULL if everything is OK. */ -static char *validate_mod_header(char *relpath, ModuleHeader *mod_header) +static const char *validate_mod_header(const char *relpath, ModuleHeader *mod_header) { char *p; static char buf[256]; @@ -260,7 +261,7 @@ static char *validate_mod_header(char *relpath, ModuleHeader *mod_header) return NULL; /* SUCCESS */ } -int module_already_in_testing(char *relpath) +int module_already_in_testing(const char *relpath) { Module *m; for (m = Modules; m; m = m->next) @@ -277,7 +278,7 @@ int module_already_in_testing(char *relpath) /* * Returns an error if insucessful .. yes NULL is OK! */ -char *Module_Create(char *path_) +const char *Module_Create(const char *path_) { #ifdef _WIN32 HMODULE Mod; @@ -291,15 +292,14 @@ char *Module_Create(char *path_) char *Mod_Version; unsigned int *compiler_version; static char errorbuf[1024]; - char *path, *relpath, *tmppath; + const char *path, *relpath, *tmppath; ModuleHeader *mod_header = NULL; int ret = 0; - char *reterr; + const char *reterr; Module *mod = NULL, **Mod_Handle = NULL; char *expectedmodversion = our_mod_version; unsigned int expectedcompilerversion = our_compiler_version; long modsys_ver = 0; - Debug((DEBUG_DEBUG, "Attempting to load module from %s", path_)); path = Module_TransformPath(path_); @@ -447,7 +447,7 @@ char *Module_Create(char *path_) else { /* Return the error .. */ - return ((char *)irc_dlerror()); + return irc_dlerror(); } } @@ -524,9 +524,6 @@ void FreeModObj(ModuleObject *obj, Module *m) else if (obj->type == MOBJ_VERSIONFLAG) { VersionflagDel(obj->object.versionflag, m); } - else if (obj->type == MOBJ_SNOMASK) { - SnomaskDel(obj->object.snomask); - } else if (obj->type == MOBJ_UMODE) { UmodeDel(obj->object.umode); } @@ -565,7 +562,9 @@ void FreeModObj(ModuleObject *obj, Module *m) } else { - ircd_log(LOG_ERROR, "FreeModObj() called for unknown object"); + unreal_log(ULOG_FATAL, "module", "FREEMODOBJ_UNKNOWN_TYPE", NULL, + "[BUG] FreeModObj() called for unknown object (type $type)", + log_data_integer("type", obj->type)); abort(); } } @@ -655,8 +654,6 @@ int Module_free(Module *mod) for (cp = mod->children; cp; cp = cp->next) { - sendto_realops("Unloading child module %s", - cp->child->header->name); Module_Unload(cp->child->header->name); } for (objs = mod->objects; objs; objs = next) { @@ -693,7 +690,7 @@ int Module_free(Module *mod) * 1 Module unloaded * 2 Module wishes delayed unloading, has placed event */ -int Module_Unload(char *name) +int Module_Unload(const char *name) { Module *m; int (*Mod_Unload)(); @@ -734,11 +731,6 @@ void module_loadall(void) iFP fp; Module *mi, *next; - if (!loop.ircd_booted) - { - sendto_realops("Ehh, !loop.ircd_booted in module_loadall()"); - return ; - } /* Run through all modules and check for module load */ for (mi = Modules; mi; mi = next) { @@ -799,12 +791,12 @@ CMD_FUNC(cmd_module) all = 1; if (MyUser(client) && !IsOper(client) && all) - client->local->since += 7; /* Lag them up. Big list. */ + add_fake_lag(client, 7000); /* Lag them up. Big list. */ - if ((parc > 2) && (hunt_server(client, recv_mtags, ":%s MODULE %s :%s", 2, parc, parv) != HUNTED_ISME)) + if ((parc > 2) && (hunt_server(client, recv_mtags, "MODULE", 2, parc, parv) != HUNTED_ISME)) return; - if ((parc == 2) && (parv[1][0] != '-') && (hunt_server(client, recv_mtags, ":%s MODULE :%s", 1, parc, parv) != HUNTED_ISME)) + if ((parc == 2) && (parv[1][0] != '-') && (hunt_server(client, recv_mtags, "MODULE", 1, parc, parv) != HUNTED_ISME)) return; if (all) @@ -884,7 +876,7 @@ CMD_FUNC(cmd_module) sendtxtnumeric(client, "Override: %s", tmp); } -Hooktype *HooktypeFind(char *string) { +Hooktype *HooktypeFind(const char *string) { Hooktype *hooktype; for (hooktype = Hooktypes; hooktype->string ;hooktype++) { if (!strcasecmp(hooktype->string, string)) @@ -984,7 +976,7 @@ void VersionflagDel(Versionflag *vflag, Module *module) } } -Hook *HookAddMain(Module *module, int hooktype, int priority, int (*func)(), void (*vfunc)(), char *(*cfunc)()) +Hook *HookAddMain(Module *module, int hooktype, int priority, int (*func)(), void (*vfunc)(), char *(*stringfunc)(), const char *(*conststringfunc)()) { Hook *p; @@ -993,8 +985,10 @@ Hook *HookAddMain(Module *module, int hooktype, int priority, int (*func)(), voi p->func.intfunc = func; if (vfunc) p->func.voidfunc = vfunc; - if (cfunc) - p->func.pcharfunc = cfunc; + if (stringfunc) + p->func.stringfunc = stringfunc; + if (conststringfunc) + p->func.conststringfunc = conststringfunc; p->type = hooktype; p->owner = module; p->priority = priority; @@ -1036,17 +1030,40 @@ Hook *HookDel(Hook *hook) return NULL; } -Callback *CallbackAddMain(Module *module, int cbtype, int (*func)(), void (*vfunc)(), char *(*cfunc)()) +static int num_callbacks(int cbtype) +{ +Callback *e; +int cnt = 0; + + for (e = Callbacks[cbtype]; e; e = e->next) + if (!e->willberemoved) + cnt++; + + return cnt; +} + +Callback *CallbackAddMain(Module *module, int cbtype, int (*func)(), void (*vfunc)(), void *(*pvfunc)(), char *(*stringfunc)(), const char *(*conststringfunc)()) { Callback *p; + if (num_callbacks(cbtype) > 0) + { + if (module) + module->errorcode = MODERR_EXISTS; + return NULL; + } + p = safe_alloc(sizeof(Callback)); if (func) p->func.intfunc = func; if (vfunc) p->func.voidfunc = vfunc; - if (cfunc) - p->func.pcharfunc = cfunc; + if (pvfunc) + p->func.pvoidfunc = pvfunc; + if (stringfunc) + p->func.stringfunc = stringfunc; + if (conststringfunc) + p->func.conststringfunc = conststringfunc; p->type = cbtype; p->owner = module; AddListItem(p, Callbacks[cbtype]); @@ -1086,7 +1103,7 @@ Callback *CallbackDel(Callback *cb) return NULL; } -CommandOverride *CommandOverrideAddEx(Module *module, char *name, int priority, OverrideCmdFunc function) +CommandOverride *CommandOverrideAdd(Module *module, const char *name, int priority, OverrideCmdFunc function) { RealCommand *p; CommandOverride *ovr; @@ -1108,7 +1125,7 @@ CommandOverride *CommandOverrideAddEx(Module *module, char *name, int priority, } ovr = safe_alloc(sizeof(CommandOverride)); ovr->func = function; - ovr->owner = module; /* TODO: module objects */ + ovr->owner = module; ovr->priority = priority; if (module) { @@ -1127,11 +1144,6 @@ CommandOverride *CommandOverrideAddEx(Module *module, char *name, int priority, return ovr; } -CommandOverride *CommandOverrideAdd(Module *module, char *name, OverrideCmdFunc function) -{ - return CommandOverrideAddEx(module, name, 0, function); -} - void CommandOverrideDel(CommandOverride *cmd) { DelListItem(cmd, cmd->command->overriders); @@ -1157,7 +1169,7 @@ void CommandOverrideDel(CommandOverride *cmd) safe_free(cmd); } -void CallCommandOverride(CommandOverride *ovr, Client *client, MessageTag *mtags, int parc, char *parv[]) +void CallCommandOverride(CommandOverride *ovr, Client *client, MessageTag *mtags, int parc, const char *parv[]) { if (ovr->next) ovr->next->func(ovr->next, client, mtags, parc, parv); @@ -1171,21 +1183,27 @@ EVENT(e_unload_module_delayed) int i; i = Module_Unload(name); if (i == 1) - sendto_realops("Unloaded module %s", name); + { + unreal_log(ULOG_INFO, "module", "MODULE_UNLOADING_DELAYED", NULL, + "Unloading module $module_name (was delayed earlier)", + log_data_string("module_name", name)); + } safe_free(name); extcmodes_check_for_changes(); umodes_check_for_changes(); return; } -void unload_all_modules(void) +void unload_all_modules(void) { Module *m; int (*Mod_Unload)(); for (m = Modules; m; m = m->next) { #ifdef DEBUGMODE - ircd_log(LOG_ERROR, "Unloading %s...", m->header->name); + unreal_log(ULOG_DEBUG, "module", "MODULE_UNLOADING", NULL, + "Unloading module $module_name", + log_data_string("module_name", m->header->name)); #endif irc_dlsym(m->dll, "Mod_Unload", Mod_Unload); if (Mod_Unload) @@ -1237,18 +1255,6 @@ const char *ModuleGetErrorStr(Module *module) return module_error_str[module->errorcode]; } -static int num_callbacks(int cbtype) -{ -Callback *e; -int cnt = 0; - - for (e = Callbacks[cbtype]; e; e = e->next) - if (!e->willberemoved) - cnt++; - - return cnt; -} - /** Ensure that all required callbacks are in place and meet * all specified requirements */ @@ -1262,11 +1268,21 @@ int i; { config_error("ERROR: Multiple callbacks loaded for type %d. " "Make sure you only load 1 module of 1 type (eg: only 1 cloaking module)", - i); /* TODO: make more clear? */ + i); return -1; } } - + + if (!Callbacks[CALLBACKTYPE_CLOAK_KEY_CHECKSUM]) + { + unreal_log(ULOG_ERROR, "config", "NO_CLOAKING_MODULE", NULL, + "No cloaking module loaded, you must load 1 of these modulese:\n" + "1) cloak_sha256 - if you are a new network starting with UnrealIRCd 6\n" + "2) cloak_md5 - the old one if migrating an existing network from UnrealIRCd 3.2/4/5\n" + "3) cloak_none - if you don't want to use cloaking at all\n" + "See also https://www.unrealircd.org/docs/FAQ#choose-a-cloaking-module"); + return -1; + } return 0; } @@ -1311,7 +1327,7 @@ const char *our_dlerror(void) * @note The name is checked against the module name, * this can be a problem if two modules have the same name. */ -int is_module_loaded(char *name) +int is_module_loaded(const char *name) { Module *mi; for (mi = Modules; mi; mi = mi->next) @@ -1325,17 +1341,17 @@ int is_module_loaded(char *name) return 0; } -static char *mod_var_name(ModuleInfo *modinfo, char *varshortname) +static const char *mod_var_name(ModuleInfo *modinfo, const char *varshortname) { static char fullname[512]; snprintf(fullname, sizeof(fullname), "%s:%s", modinfo->handle->header->name, varshortname); return fullname; } -int LoadPersistentPointerX(ModuleInfo *modinfo, char *varshortname, void **var, void (*free_variable)(ModData *m)) +int LoadPersistentPointerX(ModuleInfo *modinfo, const char *varshortname, void **var, void (*free_variable)(ModData *m)) { ModDataInfo *m; - char *fullname = mod_var_name(modinfo, varshortname); + const char *fullname = mod_var_name(modinfo, varshortname); m = findmoddata_byname(fullname, MODDATATYPE_LOCAL_VARIABLE); if (m) @@ -1346,27 +1362,28 @@ int LoadPersistentPointerX(ModuleInfo *modinfo, char *varshortname, void **var, ModDataInfo mreq; memset(&mreq, 0, sizeof(mreq)); mreq.type = MODDATATYPE_LOCAL_VARIABLE; - mreq.name = fullname; + mreq.name = strdup(fullname); mreq.free = free_variable; m = ModDataAdd(modinfo->handle, mreq); moddata_local_variable(m).ptr = NULL; + safe_free(mreq.name); return 0; } } -void SavePersistentPointerX(ModuleInfo *modinfo, char *varshortname, void *var) +void SavePersistentPointerX(ModuleInfo *modinfo, const char *varshortname, void *var) { ModDataInfo *m; - char *fullname = mod_var_name(modinfo, varshortname); + const char *fullname = mod_var_name(modinfo, varshortname); m = findmoddata_byname(fullname, MODDATATYPE_LOCAL_VARIABLE); moddata_local_variable(m).ptr = var; } -int LoadPersistentIntX(ModuleInfo *modinfo, char *varshortname, int *var) +int LoadPersistentIntX(ModuleInfo *modinfo, const char *varshortname, int *var) { ModDataInfo *m; - char *fullname = mod_var_name(modinfo, varshortname); + const char *fullname = mod_var_name(modinfo, varshortname); m = findmoddata_byname(fullname, MODDATATYPE_LOCAL_VARIABLE); if (m) @@ -1377,27 +1394,28 @@ int LoadPersistentIntX(ModuleInfo *modinfo, char *varshortname, int *var) ModDataInfo mreq; memset(&mreq, 0, sizeof(mreq)); mreq.type = MODDATATYPE_LOCAL_VARIABLE; - mreq.name = fullname; + mreq.name = strdup(fullname); mreq.free = NULL; m = ModDataAdd(modinfo->handle, mreq); moddata_local_variable(m).i = 0; + safe_free(mreq.name); return 0; } } -void SavePersistentIntX(ModuleInfo *modinfo, char *varshortname, int var) +void SavePersistentIntX(ModuleInfo *modinfo, const char *varshortname, int var) { ModDataInfo *m; - char *fullname = mod_var_name(modinfo, varshortname); + const char *fullname = mod_var_name(modinfo, varshortname); m = findmoddata_byname(fullname, MODDATATYPE_LOCAL_VARIABLE); moddata_local_variable(m).i = var; } -int LoadPersistentLongX(ModuleInfo *modinfo, char *varshortname, long *var) +int LoadPersistentLongX(ModuleInfo *modinfo, const char *varshortname, long *var) { ModDataInfo *m; - char *fullname = mod_var_name(modinfo, varshortname); + const char *fullname = mod_var_name(modinfo, varshortname); m = findmoddata_byname(fullname, MODDATATYPE_LOCAL_VARIABLE); if (m) @@ -1408,18 +1426,19 @@ int LoadPersistentLongX(ModuleInfo *modinfo, char *varshortname, long *var) ModDataInfo mreq; memset(&mreq, 0, sizeof(mreq)); mreq.type = MODDATATYPE_LOCAL_VARIABLE; - mreq.name = fullname; + mreq.name = strdup(fullname); mreq.free = NULL; m = ModDataAdd(modinfo->handle, mreq); moddata_local_variable(m).l = 0; + safe_free(mreq.name); return 0; } } -void SavePersistentLongX(ModuleInfo *modinfo, char *varshortname, long var) +void SavePersistentLongX(ModuleInfo *modinfo, const char *varshortname, long var) { ModDataInfo *m; - char *fullname = mod_var_name(modinfo, varshortname); + const char *fullname = mod_var_name(modinfo, varshortname); m = findmoddata_byname(fullname, MODDATATYPE_LOCAL_VARIABLE); moddata_local_variable(m).l = var; diff --git a/src/modules/Makefile.in b/src/modules/Makefile.in index cdc560f..62ee898 100644 --- a/src/modules/Makefile.in +++ b/src/modules/Makefile.in @@ -28,13 +28,14 @@ INCLUDES = ../include/channel.h \ ../include/ircsprintf.h \ ../include/license.h \ ../include/modules.h ../include/modversion.h ../include/msg.h \ - ../include/numeric.h ../include/proto.h ../include/dns.h \ + ../include/numeric.h ../include/dns.h \ ../include/resource.h ../include/setup.h \ ../include/struct.h ../include/sys.h \ - ../include/types.h ../include/url.h \ + ../include/types.h \ ../include/version.h ../include/whowas.h -R_MODULES= \ +MODULES= \ + cloak_md5.so cloak_sha256.so cloak_none.so \ sethost.so chghost.so chgident.so setname.so \ setident.so sdesc.so svsmode.so swhois.so\ svsmotd.so svsnline.so who_old.so whox.so mkpasswd.so \ @@ -49,7 +50,7 @@ R_MODULES= \ invite.so list.so time.so svskill.so sjoin.so \ pass.so userhost.so ison.so silence.so knock.so \ umode2.so squit.so protoctl.so addomotd.so \ - wallops.so admin.so globops.so locops.so \ + admin.so globops.so locops.so \ trace.so netinfo.so links.so help.so rules.so \ close.so map.so eos.so server.so stats.so \ dccdeny.so whowas.so \ @@ -71,604 +72,48 @@ R_MODULES= \ account-tag.so labeled-response.so link-security.so \ message-ids.so plaintext-policy.so server-time.so sts.so \ echo-message.so userip-tag.so userhost-tag.so \ - bot-tag.so \ - reply-tag.so typing-indicator.so \ + bot-tag.so reply-tag.so json-log-tag.so \ + typing-indicator.so \ ident_lookup.so history.so chathistory.so \ - targetfloodprot.so clienttagdeny.so + targetfloodprot.so clienttagdeny.so watch-backend.so \ + monitor.so slog.so tls_cipher.so operinfo.so \ + unreal_server_compat.so \ + extended-monitor.so geoip_csv.so \ + geoip_base.so extjwt.so \ + $(GEOIP_CLASSIC_OBJECTS) $(GEOIP_MAXMIND_OBJECTS) -MODULES=cloak.so $(R_MODULES) MODULEFLAGS=@MODULEFLAGS@ RM=@RM@ +.SUFFIXES: +.SUFFIXES: .c .h .so + all: build build: $(MODULES) cd chanmodes; $(MAKE) all cd usermodes; $(MAKE) all - cd snomasks; $(MAKE) all cd extbans; $(MAKE) all cd third; $(MAKE) all -############################################################################# -# .so's section -############################################################################# - -chgname.so: chgname.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o chgname.so chgname.c - -kill.so: kill.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o kill.so kill.c - -lag.so: lag.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o lag.so lag.c - -message.so: message.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o message.so message.c - -oper.so: oper.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o oper.so oper.c - -pingpong.so: pingpong.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o pingpong.so pingpong.c - -quit.so: quit.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o quit.so quit.c - -sendumode.so: sendumode.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o sendumode.so sendumode.c - -sqline.so: sqline.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o sqline.so sqline.c - -tsctl.so: tsctl.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o tsctl.so tsctl.c - -unsqline.so: unsqline.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o unsqline.so unsqline.c - -whois.so: whois.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o whois.so whois.c - -sethost.so: sethost.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o sethost.so sethost.c - -chghost.so: chghost.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o chghost.so chghost.c - -chgident.so: chgident.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o chgident.so chgident.c - -setident.so: setident.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o setident.so setident.c - -setname.so: setname.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o setname.so setname.c - -sdesc.so: sdesc.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o sdesc.so sdesc.c - -svsmode.so: svsmode.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o svsmode.so svsmode.c - -swhois.so: swhois.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o swhois.so swhois.c - -svsmotd.so: svsmotd.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o svsmotd.so svsmotd.c - -svsnline.so: svsnline.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o svsnline.so svsnline.c - -who_old.so: who_old.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o who_old.so who_old.c - -whox.so: whox.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o whox.so whox.c - -mkpasswd.so: mkpasswd.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o mkpasswd.so mkpasswd.c - -away.so: away.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o away.so away.c - -svsnoop.so: svsnoop.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o svsnoop.so svsnoop.c - -svsnick.so: svsnick.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o svsnick.so svsnick.c - -tkl.so: tkl.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o tkl.so tkl.c - -vhost.so: vhost.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o vhost.so vhost.c - -cycle.so: cycle.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o cycle.so cycle.c - -svsjoin.so: svsjoin.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o svsjoin.so svsjoin.c - -svspart.so: svspart.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o svspart.so svspart.c - -svslusers.so: svslusers.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o svslusers.so svslusers.c - -svswatch.so: svswatch.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o svswatch.so svswatch.c - -svssilence.so: svssilence.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o svssilence.so svssilence.c - -sendsno.so: sendsno.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o sendsno.so sendsno.c - -svssno.so: svssno.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o svssno.so svssno.c - -sajoin.so: sajoin.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o sajoin.so sajoin.c - -sapart.so: sapart.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o sapart.so sapart.c - -samode.so: samode.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o samode.so samode.c - -kick.so: kick.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o kick.so kick.c - -topic.so: topic.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o topic.so topic.c - -invite.so: invite.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o invite.so invite.c - -list.so: list.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o list.so list.c - -time.so: time.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o time.so time.c - -svskill.so: svskill.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o svskill.so svskill.c - -sjoin.so: sjoin.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o sjoin.so sjoin.c - -pass.so: pass.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o pass.so pass.c - -userhost.so: userhost.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o userhost.so userhost.c - -ison.so: ison.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o ison.so ison.c - -silence.so: silence.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o silence.so silence.c - -knock.so: knock.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o knock.so knock.c - -umode2.so: umode2.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o umode2.so umode2.c - -squit.so: squit.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o squit.so squit.c - -protoctl.so: protoctl.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o protoctl.so protoctl.c - -addmotd.so: addmotd.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o addmotd.so addmotd.c - -addomotd.so: addomotd.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o addomotd.so addomotd.c - -wallops.so: wallops.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o wallops.so wallops.c - -admin.so: admin.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o admin.so admin.c - -globops.so: globops.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o globops.so globops.c - -locops.so: locops.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o locops.so locops.c - -trace.so: trace.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o trace.so trace.c - -netinfo.so: netinfo.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o netinfo.so netinfo.c - -links.so: links.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o links.so links.c - -help.so: help.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o help.so help.c - -rules.so: rules.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o rules.so rules.c - -close.so: close.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o close.so close.c - -map.so: map.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o map.so map.c - -eos.so: eos.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o eos.so eos.c - -server.so: server.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o server.so server.c - -stats.so: stats.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o stats.so stats.c - -dccdeny.so: dccdeny.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o dccdeny.so dccdeny.c - -whowas.so: whowas.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o whowas.so whowas.c - -connect.so: connect.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o connect.so connect.c - -dccallow.so: dccallow.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o dccallow.so dccallow.c - -userip.so: userip.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o userip.so userip.c - -nick.so: nick.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o nick.so nick.c - -user.so: user.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o user.so user.c - -mode.so: mode.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o mode.so mode.c - -watch.so: watch.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o watch.so watch.c - -part.so: part.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o part.so part.c - -join.so: join.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o join.so join.c - -motd.so: motd.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o motd.so motd.c - -opermotd.so: opermotd.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o opermotd.so opermotd.c - -botmotd.so: botmotd.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o botmotd.so botmotd.c - -lusers.so: lusers.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o lusers.so lusers.c - -names.so: names.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o names.so names.c - -svsnolag.so: svsnolag.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o svsnolag.so svsnolag.c - -starttls.so: starttls.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o starttls.so starttls.c - -webredir.so: webredir.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o webredir.so webredir.c - -cap.so: cap.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o cap.so cap.c - -sasl.so: sasl.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o sasl.so sasl.c - -md.so: md.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o md.so md.c - -certfp.so: certfp.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o certfp.so certfp.c - -tls_antidos.so: tls_antidos.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o tls_antidos.so tls_antidos.c - -webirc.so: webirc.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o webirc.so webirc.c - -websocket.so: websocket.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o websocket.so websocket.c - -blacklist.so: blacklist.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o blacklist.so blacklist.c - -jointhrottle.so: jointhrottle.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o jointhrottle.so jointhrottle.c - -antirandom.so: antirandom.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o antirandom.so antirandom.c - -hideserver.so: hideserver.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o hideserver.so hideserver.c - -jumpserver.so: jumpserver.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o jumpserver.so jumpserver.c - -ircops.so: ircops.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o ircops.so ircops.c - -staff.so: staff.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o staff.so staff.c - -nocodes.so: nocodes.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o nocodes.so nocodes.c - -charsys.so: charsys.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o charsys.so charsys.c - -antimixedutf8.so: antimixedutf8.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o antimixedutf8.so antimixedutf8.c - -authprompt.so: authprompt.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o authprompt.so authprompt.c - -sinfo.so: sinfo.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o sinfo.so sinfo.c - -reputation.so: reputation.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o reputation.so reputation.c - -connthrottle.so: connthrottle.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o connthrottle.so connthrottle.c - -history_backend_mem.so: history_backend_mem.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o history_backend_mem.so history_backend_mem.c - -history_backend_null.so: history_backend_null.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o history_backend_null.so history_backend_null.c - -tkldb.so: tkldb.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o tkldb.so tkldb.c - -channeldb.so: channeldb.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o channeldb.so channeldb.c - -restrict-commands.so: restrict-commands.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o restrict-commands.so restrict-commands.c - -rmtkl.so: rmtkl.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o rmtkl.so rmtkl.c - -message-tags.so: message-tags.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o message-tags.so message-tags.c - -batch.so: batch.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o batch.so batch.c - -account-tag.so: account-tag.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o account-tag.so account-tag.c - -labeled-response.so: labeled-response.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o labeled-response.so labeled-response.c - -link-security.so: link-security.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o link-security.so link-security.c - -message-ids.so: message-ids.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o message-ids.so message-ids.c - -plaintext-policy.so: plaintext-policy.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o plaintext-policy.so plaintext-policy.c - -server-time.so: server-time.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o server-time.so server-time.c - -sts.so: sts.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o sts.so sts.c - -echo-message.so: echo-message.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o echo-message.so echo-message.c - -userip-tag.so: userip-tag.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o userip-tag.so userip-tag.c - -userhost-tag.so: userhost-tag.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o userhost-tag.so userhost-tag.c - -bot-tag.so: bot-tag.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o bot-tag.so bot-tag.c - -reply-tag.so: reply-tag.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o reply-tag.so reply-tag.c - -typing-indicator.so: typing-indicator.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o typing-indicator.so typing-indicator.c - -require-module.so: require-module.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o require-module.so require-module.c - -account-notify.so: account-notify.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o account-notify.so account-notify.c - -ident_lookup.so: ident_lookup.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o ident_lookup.so ident_lookup.c - -history.so: history.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o history.so history.c - -chathistory.so: chathistory.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o chathistory.so chathistory.c - -targetfloodprot.so: targetfloodprot.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o targetfloodprot.so targetfloodprot.c - -clienttagdeny.so: clienttagdeny.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o clienttagdeny.so clienttagdeny.c - -############################################################################# -# capabilities -############################################################################# - -############################################################################# -# and now the remaining modules... -############################################################################# - -cloak.so: cloak.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o cloak.so cloak.c - clean: $(RM) -f *.o *.so *~ core cd chanmodes; $(MAKE) clean cd usermodes; $(MAKE) clean - cd snomasks; $(MAKE) clean cd extbans; $(MAKE) clean cd third; $(MAKE) clean + +# Generic *.so rule: +%.so: %.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ + -o $@ $< + +# geoip_classic requires extra library +geoip_classic.so: geoip_classic.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) $(GEOIP_CLASSIC_CFLAGS) -DDYNAMIC_LINKING \ + -o geoip_classic.so geoip_classic.c @LDFLAGS_PRIVATELIBS@ $(GEOIP_CLASSIC_LIBS) + +# geoip_maxmind requires another extra library +geoip_maxmind.so: geoip_maxmind.c $(INCLUDES) + $(CC) $(CFLAGS) $(MODULEFLAGS) $(LIBMAXMINDDB_CFLAGS) -DDYNAMIC_LINKING \ + -o geoip_maxmind.so geoip_maxmind.c @LDFLAGS_PRIVATELIBS@ $(LIBMAXMINDDB_LIBS) diff --git a/src/modules/account-notify.c b/src/modules/account-notify.c index b2e9c3b..9bd4100 100644 --- a/src/modules/account-notify.c +++ b/src/modules/account-notify.c @@ -28,7 +28,7 @@ ModuleHeader MOD_HEADER "5.0", /* Version */ "account-notify CAP", /* Short description of module */ "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Variables */ @@ -70,7 +70,7 @@ int account_notify_account_login(Client *client, MessageTag *recv_mtags) CAP_ACCOUNT_NOTIFY, mtags, ":%s ACCOUNT %s", client->name, - !isdigit(*client->user->svid) ? client->user->svid : "*"); + IsLoggedIn(client) ? client->user->account : "*"); free_message_tags(mtags); return 0; } diff --git a/src/modules/account-tag.c b/src/modules/account-tag.c index 523da07..b23578a 100644 --- a/src/modules/account-tag.c +++ b/src/modules/account-tag.c @@ -28,14 +28,14 @@ ModuleHeader MOD_HEADER "5.0", "account-tag CAP", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Variables */ long CAP_ACCOUNT_TAG = 0L; -int account_tag_mtag_is_ok(Client *client, char *name, char *value); -void mtag_add_account(Client *client, MessageTag *recv_mtags, MessageTag **mtag_list, char *signature); +int account_tag_mtag_is_ok(Client *client, const char *name, const char *value); +void mtag_add_account(Client *client, MessageTag *recv_mtags, MessageTag **mtag_list, const char *signature); MOD_INIT() { @@ -75,7 +75,7 @@ MOD_UNLOAD() * syntax. * We simply allow account-tag ONLY from servers and with any syntax. */ -int account_tag_mtag_is_ok(Client *client, char *name, char *value) +int account_tag_mtag_is_ok(Client *client, const char *name, const char *value) { if (IsServer(client)) return 1; @@ -83,15 +83,15 @@ int account_tag_mtag_is_ok(Client *client, char *name, char *value) return 0; } -void mtag_add_account(Client *client, MessageTag *recv_mtags, MessageTag **mtag_list, char *signature) +void mtag_add_account(Client *client, MessageTag *recv_mtags, MessageTag **mtag_list, const char *signature) { MessageTag *m; - if (client && client->user && (*client->user->svid != '*') && !isdigit(*client->user->svid)) + if (IsLoggedIn(client)) { m = safe_alloc(sizeof(MessageTag)); safe_strdup(m->name, "account"); - safe_strdup(m->value, client->user->svid); + safe_strdup(m->value, client->user->account); AddListItem(m, *mtag_list); } diff --git a/src/modules/addmotd.c b/src/modules/addmotd.c index 51d5b6f..6ba7f95 100644 --- a/src/modules/addmotd.c +++ b/src/modules/addmotd.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", "command /addmotd", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -60,7 +60,7 @@ MOD_UNLOAD() CMD_FUNC(cmd_addmotd) { FILE *conf; - char *text; + const char *text; text = parc > 1 ? parv[1] : NULL; diff --git a/src/modules/addomotd.c b/src/modules/addomotd.c index ea0f1e8..140d044 100644 --- a/src/modules/addomotd.c +++ b/src/modules/addomotd.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", "command /addomotd", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -60,7 +60,7 @@ MOD_UNLOAD() CMD_FUNC(cmd_addomotd) { FILE *conf; - char *text; + const char *text; text = parc > 1 ? parv[1] : NULL; diff --git a/src/modules/admin.c b/src/modules/admin.c index 6b79c39..064dd9b 100644 --- a/src/modules/admin.c +++ b/src/modules/admin.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", "command /admin", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -61,7 +61,7 @@ CMD_FUNC(cmd_admin) if (IsUser(client)) { - if (hunt_server(client, recv_mtags, ":%s ADMIN :%s", 1, parc, parv) != HUNTED_ISME) + if (hunt_server(client, recv_mtags, "ADMIN", 1, parc, parv) != HUNTED_ISME) return; } diff --git a/src/modules/antimixedutf8.c b/src/modules/antimixedutf8.c index 731ef4b..8d7eabb 100644 --- a/src/modules/antimixedutf8.c +++ b/src/modules/antimixedutf8.c @@ -48,7 +48,7 @@ ModuleHeader MOD_HEADER "1.0", "Mixed UTF8 character filter (look-alike character spam) - by Syzop", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; struct { @@ -99,22 +99,22 @@ int detect_script(const char *t) else if ((t[0] == 0xd3) && (t[1] >= 0x80) && (t[1] <= 0xbf)) return SCRIPT_CYRILLIC; - if((t[0] == 0xe4) && (t[1] >= 0xb8) && (t[1] <= 0xbf)) + if ((t[0] == 0xe4) && (t[1] >= 0xb8) && (t[1] <= 0xbf)) return SCRIPT_CJK; else if ((t[0] >= 0xe5) && (t[0] <= 0xe9) && (t[1] >= 0x80) && (t[1] <= 0xbf)) return SCRIPT_CJK; - if((t[0] == 0xea) && (t[1] >= 0xb0) && (t[1] <= 0xbf)) + if ((t[0] == 0xea) && (t[1] >= 0xb0) && (t[1] <= 0xbf)) return SCRIPT_HANGUL; else if ((t[0] >= 0xeb) && (t[0] <= 0xec) && (t[1] >= 0x80) && (t[1] <= 0xbf)) return SCRIPT_HANGUL; else if ((t[0] == 0xed) && (t[1] >= 0x80) && (t[1] <= 0x9f)) return SCRIPT_HANGUL; - if((t[0] == 0xe1) && (t[1] >= 0x90) && (t[1] <= 0x99)) + if ((t[0] == 0xe1) && (t[1] >= 0x90) && (t[1] <= 0x99)) return SCRIPT_CANADIAN; - if((t[0] == 0xe0) && (t[1] >= 0xb0) && (t[1] <= 0xb1)) + if ((t[0] == 0xe0) && (t[1] >= 0xb0) && (t[1] <= 0xb1)) return SCRIPT_TELUGU; if ((t[0] >= 'a') && (t[0] <= 'z')) @@ -206,12 +206,9 @@ CMD_OVERRIDE_FUNC(override_msg) score = lookalikespam_score(StripControlCodes(parv[2])); if ((score >= cfg.score) && !find_tkl_exception(TKL_ANTIMIXEDUTF8, client)) { - if (cfg.ban_action == BAN_ACT_KILL) - { - sendto_realops("[antimixedutf8] Killed connection from %s (score %d)", - GetIP(client), score); - } /* no else here!! */ - + unreal_log(ULOG_INFO, "antimixedutf8", "ANTIMIXEDUTF8_HIT", client, + "[antimixedutf8] Client $client.details hit score $score -- taking action", + log_data_integer("score", score)); if ((cfg.ban_action == BAN_ACT_BLOCK) || ((cfg.ban_action == BAN_ACT_SOFT_BLOCK) && !IsLoggedIn(client))) { @@ -246,10 +243,10 @@ MOD_INIT() MOD_LOAD() { - if (!CommandOverrideAdd(modinfo->handle, "PRIVMSG", override_msg)) + if (!CommandOverrideAdd(modinfo->handle, "PRIVMSG", 0, override_msg)) return MOD_FAILED; - if (!CommandOverrideAdd(modinfo->handle, "NOTICE", override_msg)) + if (!CommandOverrideAdd(modinfo->handle, "NOTICE", 0, override_msg)) return MOD_FAILED; return MOD_SUCCESS; @@ -286,45 +283,45 @@ int antimixedutf8_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *er return 0; /* We are only interrested in set::antimixedutf8... */ - if (!ce || !ce->ce_varname || strcmp(ce->ce_varname, "antimixedutf8")) + if (!ce || !ce->name || strcmp(ce->name, "antimixedutf8")) return 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!cep->ce_vardata) + if (!cep->value) { config_error("%s:%i: set::antimixedutf8::%s with no value", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_varname); + cep->file->filename, cep->line_number, cep->name); errors++; } else - if (!strcmp(cep->ce_varname, "score")) + if (!strcmp(cep->name, "score")) { - int v = atoi(cep->ce_vardata); + int v = atoi(cep->value); if ((v < 1) || (v > 99)) { config_error("%s:%i: set::antimixedutf8::score: must be between 1 - 99 (got: %d)", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, v); + cep->file->filename, cep->line_number, v); errors++; } } else - if (!strcmp(cep->ce_varname, "ban-action")) + if (!strcmp(cep->name, "ban-action")) { - if (!banact_stringtoval(cep->ce_vardata)) + if (!banact_stringtoval(cep->value)) { config_error("%s:%i: set::antimixedutf8::ban-action: unknown action '%s'", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_vardata); + cep->file->filename, cep->line_number, cep->value); errors++; } } else - if (!strcmp(cep->ce_varname, "ban-reason")) + if (!strcmp(cep->name, "ban-reason")) { } else - if (!strcmp(cep->ce_varname, "ban-time")) + if (!strcmp(cep->name, "ban-time")) { } else { config_error("%s:%i: unknown directive set::antimixedutf8::%s", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_varname); + cep->file->filename, cep->line_number, cep->name); errors++; } } @@ -340,26 +337,26 @@ int antimixedutf8_config_run(ConfigFile *cf, ConfigEntry *ce, int type) return 0; /* We are only interrested in set::antimixedutf8... */ - if (!ce || !ce->ce_varname || strcmp(ce->ce_varname, "antimixedutf8")) + if (!ce || !ce->name || strcmp(ce->name, "antimixedutf8")) return 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "score")) + if (!strcmp(cep->name, "score")) { - cfg.score = atoi(cep->ce_vardata); + cfg.score = atoi(cep->value); } else - if (!strcmp(cep->ce_varname, "ban-action")) + if (!strcmp(cep->name, "ban-action")) { - cfg.ban_action = banact_stringtoval(cep->ce_vardata); + cfg.ban_action = banact_stringtoval(cep->value); } else - if (!strcmp(cep->ce_varname, "ban-reason")) + if (!strcmp(cep->name, "ban-reason")) { - safe_strdup(cfg.ban_reason, cep->ce_vardata); + safe_strdup(cfg.ban_reason, cep->value); } else - if (!strcmp(cep->ce_varname, "ban-time")) + if (!strcmp(cep->name, "ban-time")) { - cfg.ban_time = config_checkval(cep->ce_vardata, CFG_TIME); + cfg.ban_time = config_checkval(cep->value, CFG_TIME); } } return 1; diff --git a/src/modules/antirandom.c b/src/modules/antirandom.c index 8522f36..9c30703 100644 --- a/src/modules/antirandom.c +++ b/src/modules/antirandom.c @@ -22,24 +22,13 @@ #include "unrealircd.h" -/* You can change this '//#undef' into '#define' if you want to see quite - * a flood for every user that connects (and on-load if cfg.fullstatus_on_load). - * Obviously only recommended for testing, use with care! - */ -#undef DEBUGMODE - -/** Change this 'undef' to 'define' to get performance information. - * This really only meant for debugging purposes. - */ -#undef TIMING - ModuleHeader MOD_HEADER = { "antirandom", "1.4", "Detect and ban users with random names", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; #ifndef MAX @@ -515,7 +504,6 @@ struct { long ban_time; int convert_to_lowercase; int show_failedconnects; - int fullstatus_on_load; ConfigItem_mask *except_hosts; int except_webirc; } cfg; @@ -553,19 +541,14 @@ MOD_INIT() HookAdd(modinfo->handle, HOOKTYPE_CONFIGRUN, 0, antirandom_config_run); /* Some default values: */ - cfg.fullstatus_on_load = 1; cfg.convert_to_lowercase = 1; cfg.except_webirc = 1; return MOD_SUCCESS; } -void check_all_users(void); - MOD_LOAD() { - if (cfg.fullstatus_on_load) - check_all_users(); return MOD_SUCCESS; } @@ -592,67 +575,64 @@ int antirandom_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) return 0; /* We are only interrested in set::antirandom... */ - if (!ce || !ce->ce_varname || strcmp(ce->ce_varname, "antirandom")) + if (!ce || !ce->name || strcmp(ce->name, "antirandom")) return 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "except-hosts")) + if (!strcmp(cep->name, "except-hosts")) { } else - if (!strcmp(cep->ce_varname, "except-webirc")) + if (!strcmp(cep->name, "except-webirc")) { /* This should normally be UNDER the generic 'set::antirandom::%s with no value' * stuff but I put it here because people may think it's a hostlist and then * the error can be a tad confusing. -- Syzop */ - if (!cep->ce_vardata) + if (!cep->value) { config_error("%s:%i: set::antirandom::except-webirc should be 'yes' or 'no'", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; } } else - if (!cep->ce_vardata) + if (!cep->value) { config_error("%s:%i: set::antirandom::%s with no value", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_varname); + cep->file->filename, cep->line_number, cep->name); errors++; } else - if (!strcmp(cep->ce_varname, "threshold")) + if (!strcmp(cep->name, "threshold")) { req.threshold = 1; } else - if (!strcmp(cep->ce_varname, "ban-action")) + if (!strcmp(cep->name, "ban-action")) { - if (!banact_stringtoval(cep->ce_vardata)) + if (!banact_stringtoval(cep->value)) { config_error("%s:%i: set::antirandom::ban-action: unknown action '%s'", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_vardata); + cep->file->filename, cep->line_number, cep->value); errors++; } else req.ban_action = 1; } else - if (!strcmp(cep->ce_varname, "ban-reason")) + if (!strcmp(cep->name, "ban-reason")) { req.ban_reason = 1; } else - if (!strcmp(cep->ce_varname, "ban-time")) + if (!strcmp(cep->name, "ban-time")) { req.ban_time = 1; } else - if (!strcmp(cep->ce_varname, "convert-to-lowercase")) + if (!strcmp(cep->name, "convert-to-lowercase")) { } else - if (!strcmp(cep->ce_varname, "fullstatus-on-load")) - { - } else - if (!strcmp(cep->ce_varname, "show-failedconnects")) + if (!strcmp(cep->name, "show-failedconnects")) { } else { config_error("%s:%i: unknown directive set::antirandom::%s", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_varname); + cep->file->filename, cep->line_number, cep->name); errors++; } } @@ -668,47 +648,43 @@ int antirandom_config_run(ConfigFile *cf, ConfigEntry *ce, int type) return 0; /* We are only interrested in set::antirandom... */ - if (!ce || !ce->ce_varname || strcmp(ce->ce_varname, "antirandom")) + if (!ce || !ce->name || strcmp(ce->name, "antirandom")) return 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "except-hosts")) + if (!strcmp(cep->name, "except-hosts")) { - for (cep2 = cep->ce_entries; cep2; cep2 = cep2->ce_next) + for (cep2 = cep->items; cep2; cep2 = cep2->next) unreal_add_masks(&cfg.except_hosts, cep2); } else - if (!strcmp(cep->ce_varname, "except-webirc")) + if (!strcmp(cep->name, "except-webirc")) { - cfg.except_webirc = config_checkval(cep->ce_vardata, CFG_YESNO); + cfg.except_webirc = config_checkval(cep->value, CFG_YESNO); } else - if (!strcmp(cep->ce_varname, "threshold")) + if (!strcmp(cep->name, "threshold")) { - cfg.threshold = atoi(cep->ce_vardata); + cfg.threshold = atoi(cep->value); } else - if (!strcmp(cep->ce_varname, "ban-action")) + if (!strcmp(cep->name, "ban-action")) { - cfg.ban_action = banact_stringtoval(cep->ce_vardata); + cfg.ban_action = banact_stringtoval(cep->value); } else - if (!strcmp(cep->ce_varname, "ban-reason")) + if (!strcmp(cep->name, "ban-reason")) { - safe_strdup(cfg.ban_reason, cep->ce_vardata); + safe_strdup(cfg.ban_reason, cep->value); } else - if (!strcmp(cep->ce_varname, "ban-time")) + if (!strcmp(cep->name, "ban-time")) { - cfg.ban_time = config_checkval(cep->ce_vardata, CFG_TIME); + cfg.ban_time = config_checkval(cep->value, CFG_TIME); } else - if (!strcmp(cep->ce_varname, "convert-to-lowercase")) + if (!strcmp(cep->name, "convert-to-lowercase")) { - cfg.convert_to_lowercase = config_checkval(cep->ce_vardata, CFG_YESNO); + cfg.convert_to_lowercase = config_checkval(cep->value, CFG_YESNO); } - if (!strcmp(cep->ce_varname, "show-failedconnects")) + if (!strcmp(cep->name, "show-failedconnects")) { - cfg.show_failedconnects = config_checkval(cep->ce_vardata, CFG_YESNO); - } else - if (!strcmp(cep->ce_varname, "fullstatus-on-load")) - { - cfg.fullstatus_on_load = config_checkval(cep->ce_vardata, CFG_YESNO); + cfg.show_failedconnects = config_checkval(cep->value, CFG_YESNO); } } return 1; @@ -820,24 +796,15 @@ static int internal_getscore(char *str) if (digits >= 5) { - score += 5 + (digits - 5); -#ifdef DEBUGMODE - sendto_ops_and_log("score@'%s': MATCH for digits check", str); -#endif + score += digits; } if (vowels >= 4) { - score += 4 + (vowels - 4); -#ifdef DEBUGMODE - sendto_ops_and_log("score@'%s': MATCH for vowels check", str); -#endif + score += vowels; } if (consonants >= 4) { - score += 4 + (consonants - 4); -#ifdef DEBUGMODE - sendto_ops_and_log("score@'%s': MATCH for consonants check", str); -#endif + score += consonants; } for (t=triples; t; t=t->next) @@ -846,10 +813,6 @@ static int internal_getscore(char *str) if ((t->two[0] == s[0]) && (t->two[1] == s[1]) && s[2] && strchr(t->rest, s[2])) { score++; /* OK */ -#ifdef DEBUGMODE - sendto_ops_and_log("score@'%s': MATCH for '%s[%s]' %c/%c/%c", str, t->two, t->rest, - s[0], s[1], s[2]); -#endif } } @@ -868,11 +831,6 @@ static int get_spam_score(Client *client) char *gecos = client->info; char nbuf[NICKLEN+1], ubuf[USERLEN+1], rbuf[REALLEN+1]; int nscore, uscore, gscore, score; -#ifdef TIMING - struct timeval tv_alpha, tv_beta; - - gettimeofday(&tv_alpha, NULL); -#endif if (cfg.convert_to_lowercase) { @@ -889,46 +847,9 @@ static int get_spam_score(Client *client) gscore = internal_getscore(gecos); score = nscore + uscore + gscore; -#ifdef TIMING - gettimeofday(&tv_beta, NULL); - ircd_log(LOG_ERROR, "AntiRandom Timing: %ld microseconds", - ((tv_beta.tv_sec - tv_alpha.tv_sec) * 1000000) + (tv_beta.tv_usec - tv_alpha.tv_usec)); -#endif -#ifdef DEBUGMODE - sendto_ops_and_log("got score: %d/%d/%d = %d", - nscore, uscore, gscore, score); -#endif - return score; } -void check_all_users(void) -{ - Client *client; - int matches=0, score; - - list_for_each_entry(client, &lclient_list, lclient_node) - { - if (IsUser(client)) - { - if (is_exempt(client)) - continue; - - score = get_spam_score(client); - if (score > cfg.threshold) - { - if (!matches) - sendto_realops("[antirandom] Full status report follows:"); - sendto_realops("%d points: %s!%s@%s:%s", - score, client->name, client->user->username, client->user->realhost, client->info); - matches++; - } - } - } - if (matches) - sendto_realops("[antirandom] %d match%s", matches, matches == 1 ? "" : "es"); -} - int antirandom_preconnect(Client *client) { int score; @@ -941,13 +862,17 @@ int antirandom_preconnect(Client *client) { if (cfg.ban_action == BAN_ACT_WARN) { - sendto_ops_and_log("[antirandom] would have denied access to user with score %d: %s!%s@%s:%s", - score, client->name, client->user->username, client->user->realhost, client->info); + unreal_log(ULOG_INFO, "antirandom", "ANTIRANDOM_DENIED_USER", client, + "[antirandom] would have denied access to user with score $score: $client:$client.info", + log_data_integer("score", score)); return HOOK_CONTINUE; } if (cfg.show_failedconnects) - sendto_ops_and_log("[antirandom] denied access to user with score %d: %s!%s@%s:%s", - score, client->name, client->user->username, client->user->realhost, client->info); + { + unreal_log(ULOG_INFO, "antirandom", "ANTIRANDOM_DENIED_USER", client, + "[antirandom] denied access to user with score $score: $client:$client.info", + log_data_integer("score", score)); + } place_host_ban(client, cfg.ban_action, cfg.ban_reason, cfg.ban_time); return HOOK_DENY; } @@ -972,7 +897,7 @@ static int is_exempt(Client *client) /* WEBIRC gateway and exempt? */ if (cfg.except_webirc) { - char *val = moddata_client_get(client, "webirc"); + const char *val = moddata_client_get(client, "webirc"); if (val && (atoi(val)>0)) return 1; } diff --git a/src/modules/authprompt.c b/src/modules/authprompt.c index 3a46d96..da0d496 100644 --- a/src/modules/authprompt.c +++ b/src/modules/authprompt.c @@ -25,7 +25,7 @@ ModuleHeader MOD_HEADER "1.0", "SASL authentication for clients that don't support SASL", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /** Configuration settings */ @@ -33,6 +33,7 @@ struct { int enabled; MultiLine *message; MultiLine *fail_message; + MultiLine *unconfirmed_message; } cfg; /** User struct */ @@ -50,10 +51,9 @@ static void init_config(void); static void config_postdefaults(void); int authprompt_config_test(ConfigFile *, ConfigEntry *, int, int *); int authprompt_config_run(ConfigFile *, ConfigEntry *, int); -int authprompt_require_sasl(Client *client, char *reason); -int authprompt_sasl_continuation(Client *client, char *buf); +int authprompt_sasl_continuation(Client *client, const char *buf); int authprompt_sasl_result(Client *client, int success); -int authprompt_place_host_ban(Client *client, int action, char *reason, long duration); +int authprompt_place_host_ban(Client *client, int action, const char *reason, long duration); int authprompt_find_tkline_match(Client *client, TKL *tk); int authprompt_pre_connect(Client *client); CMD_FUNC(cmd_auth); @@ -89,7 +89,6 @@ MOD_INIT() init_config(); HookAdd(modinfo->handle, HOOKTYPE_CONFIGRUN, 0, authprompt_config_run); - HookAdd(modinfo->handle, HOOKTYPE_REQUIRE_SASL, 0, authprompt_require_sasl); HookAdd(modinfo->handle, HOOKTYPE_SASL_CONTINUATION, 0, authprompt_sasl_continuation); HookAdd(modinfo->handle, HOOKTYPE_SASL_RESULT, 0, authprompt_sasl_result); HookAdd(modinfo->handle, HOOKTYPE_PLACE_HOST_BAN, 0, authprompt_place_host_ban); @@ -133,12 +132,18 @@ static void config_postdefaults(void) { addmultiline(&cfg.fail_message, "Authentication failed."); } + if (!cfg.unconfirmed_message) + { + addmultiline(&cfg.unconfirmed_message, "You are trying to use an unconfirmed services account."); + addmultiline(&cfg.unconfirmed_message, "This services account can only be used after it has been activated/confirmed."); + } } static void free_config(void) { freemultiline(cfg.message); freemultiline(cfg.fail_message); + freemultiline(cfg.unconfirmed_message); memset(&cfg, 0, sizeof(cfg)); /* needed! */ } @@ -151,29 +156,32 @@ int authprompt_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) return 0; /* We are only interrested in set::authentication-prompt... */ - if (!ce || !ce->ce_varname || strcmp(ce->ce_varname, "authentication-prompt")) + if (!ce || !ce->name || strcmp(ce->name, "authentication-prompt")) return 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!cep->ce_vardata) + if (!cep->value) { config_error("%s:%i: set::authentication-prompt::%s with no value", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_varname); + cep->file->filename, cep->line_number, cep->name); errors++; } else - if (!strcmp(cep->ce_varname, "enabled")) + if (!strcmp(cep->name, "enabled")) { } else - if (!strcmp(cep->ce_varname, "message")) + if (!strcmp(cep->name, "message")) { } else - if (!strcmp(cep->ce_varname, "fail-message")) + if (!strcmp(cep->name, "fail-message")) + { + } else + if (!strcmp(cep->name, "unconfirmed-message")) { } else { config_error("%s:%i: unknown directive set::authentication-prompt::%s", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_varname); + cep->file->filename, cep->line_number, cep->name); errors++; } } @@ -189,22 +197,26 @@ int authprompt_config_run(ConfigFile *cf, ConfigEntry *ce, int type) return 0; /* We are only interrested in set::authentication-prompt... */ - if (!ce || !ce->ce_varname || strcmp(ce->ce_varname, "authentication-prompt")) + if (!ce || !ce->name || strcmp(ce->name, "authentication-prompt")) return 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "enabled")) + if (!strcmp(cep->name, "enabled")) { - cfg.enabled = config_checkval(cep->ce_vardata, CFG_YESNO); + cfg.enabled = config_checkval(cep->value, CFG_YESNO); } else - if (!strcmp(cep->ce_varname, "message")) + if (!strcmp(cep->name, "message")) { - addmultiline(&cfg.message, cep->ce_vardata); + addmultiline(&cfg.message, cep->value); } else - if (!strcmp(cep->ce_varname, "fail-message")) + if (!strcmp(cep->name, "fail-message")) { - addmultiline(&cfg.fail_message, cep->ce_vardata); + addmultiline(&cfg.fail_message, cep->value); + } else + if (!strcmp(cep->name, "unconfirmed-message")) + { + addmultiline(&cfg.unconfirmed_message, cep->value); } } return 1; @@ -257,7 +269,7 @@ char *make_authbuf(const char *username, const char *password) int size; size = strlen(username) + 1 + strlen(username) + 1 + strlen(password); - if (size >= sizeof(inbuf)) + if (size >= sizeof(inbuf)-1) return NULL; /* too long */ /* Because size limits are already checked above, we can cut some corners here: */ @@ -281,7 +293,7 @@ void send_first_auth(Client *client) { Client *sasl_server; char *addr = BadPtr(client->ip) ? "0" : client->ip; - char *certfp = moddata_client_get(client, "certfp"); + const char *certfp = moddata_client_get(client, "certfp"); sasl_server = find_client(SASL_SERVER, NULL); if (!sasl_server) { @@ -365,25 +377,8 @@ void authprompt_send_auth_required_message(Client *client) sendnotice_multiline(client, cfg.message); } -int authprompt_require_sasl(Client *client, char *reason) -{ - /* If the client did SASL then we (authprompt) will not kick in */ - if (HasCapability(client, "sasl")) - return 0; - - authprompt_tag_as_auth_required(client); - - /* Display the require authentication::reason */ - if (reason && strcmp(reason, "-") && strcmp(reason, "*")) - sendnotice(client, "%s", reason); - - authprompt_send_auth_required_message(client); - - return 1; -} - /* Called upon "place a host ban on this user" (eg: spamfilter, blacklist, ..) */ -int authprompt_place_host_ban(Client *client, int action, char *reason, long duration) +int authprompt_place_host_ban(Client *client, int action, const char *reason, long duration) { /* If it's a soft-xx action and the user is not logged in * and the user is not yet online, then we will handle this user. @@ -437,7 +432,7 @@ int authprompt_pre_connect(Client *client) return HOOK_CONTINUE; /* no action taken, proceed normally */ } -int authprompt_sasl_continuation(Client *client, char *buf) +int authprompt_sasl_continuation(Client *client, const char *buf) { /* If it's not for us (eg: user is doing real SASL) then return 0. */ if (!SEUSER(client) || !SEUSER(client)->authmsg) @@ -468,10 +463,16 @@ int authprompt_sasl_result(Client *client, int success) return 1; } + if (client->user && !IsLoggedIn(client)) + { + sendnotice_multiline(client, cfg.unconfirmed_message); + return 1; + } + /* Authentication was a success */ if (*client->name && client->user && *client->user->username && IsNotSpoof(client)) { - register_user(client, client->name, client->user->username, NULL, NULL, NULL); + register_user(client); /* User MAY be killed now. But since we 'return 1' below, it's safe */ } diff --git a/src/modules/away.c b/src/modules/away.c index a760c83..2d02a48 100644 --- a/src/modules/away.c +++ b/src/modules/away.c @@ -25,6 +25,9 @@ #include "unrealircd.h" CMD_FUNC(cmd_away); +int away_join(Client *client, Channel *channel, MessageTag *mtags); + +long CAP_AWAY_NOTIFY = 0L; #define MSG_AWAY "AWAY" @@ -34,12 +37,19 @@ ModuleHeader MOD_HEADER "5.0", "command /away", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() { + ClientCapabilityInfo c; + memset(&c, 0, sizeof(c)); + c.name = "away-notify"; + ClientCapabilityAdd(modinfo->handle, &c, &CAP_AWAY_NOTIFY); CommandAdd(modinfo->handle, MSG_AWAY, cmd_away, 1, CMD_USER); + HookAdd(modinfo->handle, HOOKTYPE_LOCAL_JOIN, 0, away_join); + HookAdd(modinfo->handle, HOOKTYPE_REMOTE_JOIN, 0, away_join); + MARK_AS_OFFICIAL_MODULE(modinfo); return MOD_SUCCESS; } @@ -54,17 +64,44 @@ MOD_UNLOAD() return MOD_SUCCESS; } +int away_join(Client *client, Channel *channel, MessageTag *mtags) +{ + Member *lp; + Client *acptr; + int invisible = invisible_user_in_channel(client, channel); + for (lp = channel->members; lp; lp = lp->next) + { + acptr = lp->client; + + if (!MyConnect(acptr)) + continue; /* only locally connected clients */ + + if (invisible && !check_channel_access_member(lp, "hoaq") && (client != acptr)) + continue; /* skip non-ops if requested to (used for mode +D), but always send to 'client' */ + + if (client->user->away && HasCapabilityFast(acptr, CAP_AWAY_NOTIFY)) + { + MessageTag *mtags_away = NULL; + new_message(client, NULL, &mtags_away); + sendto_one(acptr, mtags_away, ":%s!%s@%s AWAY :%s", + client->name, client->user->username, GetHost(client), client->user->away); + free_message_tags(mtags_away); + } + } + return 0; +} + /** Mark client as AWAY or mark them as back (in case of empty reason) */ CMD_FUNC(cmd_away) { - char *new_reason = parv[1]; + char reason[512]; int n, already_as_away = 0; MessageTag *mtags = NULL; if (IsServer(client)) return; - if (parc < 2 || !*new_reason) + if (parc < 2 || BadPtr(parv[1])) { /* Marking as not away */ if (client->user->away) @@ -73,10 +110,9 @@ CMD_FUNC(cmd_away) new_message(client, recv_mtags, &mtags); sendto_server(client, 0, 0, mtags, ":%s AWAY", client->name); - hash_check_watch(client, RPL_NOTAWAY); - sendto_local_common_channels(client, client, ClientCapabilityBit("away-notify"), mtags, + sendto_local_common_channels(client, client, CAP_AWAY_NOTIFY, mtags, ":%s AWAY", client->name); - RunHook3(HOOKTYPE_AWAY, client, mtags, NULL); + RunHook(HOOKTYPE_AWAY, client, mtags, NULL, 0); free_message_tags(mtags); } @@ -85,8 +121,11 @@ CMD_FUNC(cmd_away) return; } + /* Obey set::away-length */ + strlncpy(reason, parv[1], sizeof(reason), iConf.away_length); + /* Check spamfilters */ - if (MyUser(client) && match_spamfilter(client, new_reason, SPAMF_AWAY, "AWAY", NULL, 0, NULL)) + if (MyUser(client) && match_spamfilter(client, reason, SPAMF_AWAY, "AWAY", NULL, 0, NULL)) return; /* Check away-flood */ @@ -98,21 +137,17 @@ CMD_FUNC(cmd_away) return; } - /* Obey set::away-length */ - if (strlen(new_reason) > iConf.away_length) - new_reason[iConf.away_length] = '\0'; - /* Check if the new away reason is the same as the current reason - if so then return (no change) */ - if ((client->user->away) && !strcmp(client->user->away, new_reason)) + if ((client->user->away) && !strcmp(client->user->away, reason)) return; /* All tests passed. Now marking as away (or still away but changing the away reason) */ - client->user->lastaway = TStime(); + client->user->away_since = TStime(); new_message(client, recv_mtags, &mtags); - sendto_server(client, 0, 0, mtags, ":%s AWAY :%s", client->id, new_reason); + sendto_server(client, 0, 0, mtags, ":%s AWAY :%s", client->id, reason); if (client->user->away) { @@ -120,18 +155,16 @@ CMD_FUNC(cmd_away) already_as_away = 1; } - safe_strdup(client->user->away, new_reason); + safe_strdup(client->user->away, reason); if (MyConnect(client)) sendnumeric(client, RPL_NOWAWAY); - hash_check_watch(client, already_as_away ? RPL_REAWAY : RPL_GONEAWAY); - sendto_local_common_channels(client, client, - ClientCapabilityBit("away-notify"), mtags, + CAP_AWAY_NOTIFY, mtags, ":%s AWAY :%s", client->name, client->user->away); - RunHook3(HOOKTYPE_AWAY, client, mtags, client->user->away); + RunHook(HOOKTYPE_AWAY, client, mtags, client->user->away, already_as_away); free_message_tags(mtags); diff --git a/src/modules/batch.c b/src/modules/batch.c index e1ca1a8..692680c 100644 --- a/src/modules/batch.c +++ b/src/modules/batch.c @@ -28,7 +28,7 @@ ModuleHeader MOD_HEADER "5.0", "Batch CAP", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Forward declarations */ @@ -37,7 +37,7 @@ CMD_FUNC(cmd_batch); /* Variables */ long CAP_BATCH = 0L; -int batch_mtag_is_ok(Client *client, char *name, char *value); +int batch_mtag_is_ok(Client *client, const char *name, const char *value); MOD_INIT() { @@ -111,7 +111,7 @@ CMD_FUNC(cmd_batch) * syntax. * We simply allow batch ONLY from servers and with any syntax. */ -int batch_mtag_is_ok(Client *client, char *name, char *value) +int batch_mtag_is_ok(Client *client, const char *name, const char *value) { if (IsServer(client)) return 1; diff --git a/src/modules/blacklist.c b/src/modules/blacklist.c index 7cc99cd..696b8fa 100644 --- a/src/modules/blacklist.c +++ b/src/modules/blacklist.c @@ -26,7 +26,7 @@ ModuleHeader MOD_HEADER "5.0", "Check connecting users against DNS Blacklists", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* In this module and the config syntax I tried to 'abstract' things @@ -83,6 +83,9 @@ struct BLUser { long save_tkltime; char *save_opernotice; char *save_reason; + char *save_blacklist; + char *save_blacklist_dns_name; + int save_blacklist_dns_reply; }; /* Global variables */ @@ -96,7 +99,7 @@ void blacklist_free_conf(void); void delete_blacklist_block(Blacklist *e); void blacklist_md_free(ModData *md); int blacklist_handshake(Client *client); -int blacklist_quit(Client *client, MessageTag *mtags, char *comment); +int blacklist_quit(Client *client, MessageTag *mtags, const char *comment); int blacklist_preconnect(Client *client); void blacklist_resolver_callback(void *arg, int status, int timeouts, struct hostent *he); int blacklist_start_check(Client *client); @@ -109,13 +112,11 @@ void blacklist_free_bluser_if_able(BLUser *bl); #define SetBLUser(x, y) do { moddata_client(x, blacklist_md).ptr = y; } while(0) #define BLUSER(x) ((BLUser *)moddata_client(x, blacklist_md).ptr) -long SNO_BLACKLIST = 0L; - MOD_TEST() { HookAdd(modinfo->handle, HOOKTYPE_CONFIGTEST, 0, blacklist_config_test); - CallbackAddEx(modinfo->handle, CALLBACKTYPE_BLACKLIST_CHECK, blacklist_start_check); + CallbackAdd(modinfo->handle, CALLBACKTYPE_BLACKLIST_CHECK, blacklist_start_check); return MOD_SUCCESS; } @@ -150,8 +151,6 @@ MOD_INIT() HookAdd(modinfo->handle, HOOKTYPE_REHASH_COMPLETE, 0, blacklist_rehash_complete); HookAdd(modinfo->handle, HOOKTYPE_LOCAL_QUIT, 0, blacklist_quit); - SnomaskAdd(modinfo->handle, 'b', umode_allow_opers, &SNO_BLACKLIST); - return MOD_SUCCESS; } @@ -251,192 +250,192 @@ int blacklist_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) if (!ce) return 0; - if (strcmp(ce->ce_varname, "blacklist")) + if (strcmp(ce->name, "blacklist")) return 0; /* not interested in non-blacklist stuff.. */ - if (!ce->ce_vardata) + if (!ce->value) { config_error("%s:%i: blacklist block without name (use: blacklist somename { })", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); *errs = 1; return -1; } /* Now actually go parse the blacklist { } block */ - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "dns")) + if (!strcmp(cep->name, "dns")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { - if (!strcmp(cepp->ce_varname, "reply")) + if (!strcmp(cepp->name, "reply")) { if (has_dns_reply) { /* this is an error (not a warning) */ config_error("%s:%i: blacklist block may contain only one blacklist::dns::reply item. " "You can specify multiple replies by using: reply { 1; 2; 4; };", - cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum); + cepp->file->filename, cepp->line_number); errors++; continue; } - if (!cepp->ce_vardata && !cepp->ce_entries) + if (!cepp->value && !cepp->items) { - config_error_blank(cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum, "blacklist::dns::reply"); + config_error_blank(cepp->file->filename, cepp->line_number, "blacklist::dns::reply"); errors++; continue; } has_dns_reply = 1; /* we have a reply. now whether it's actually valid is another story.. */ - if (cepp->ce_vardata && cepp->ce_entries) + if (cepp->value && cepp->items) { config_error("%s:%i: blacklist::dns::reply must be either using format 'reply 1;' or " "'reply { 1; 2; 4; }; but not both formats at the same time.", - cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum); + cepp->file->filename, cepp->line_number); errors++; continue; } - if (cepp->ce_vardata) + if (cepp->value) { - if (atoi(cepp->ce_vardata) <= 0) + if (atoi(cepp->value) <= 0) { config_error("%s:%i: blacklist::dns::reply must be >0", - cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum); + cepp->file->filename, cepp->line_number); errors++; continue; } } - if (cepp->ce_entries) + if (cepp->items) { - for (ceppp = cepp->ce_entries; ceppp; ceppp=ceppp->ce_next) + for (ceppp = cepp->items; ceppp; ceppp=ceppp->next) { - if (atoi(ceppp->ce_varname) <= 0) + if (atoi(ceppp->name) <= 0) { config_error("%s:%i: all items in blacklist::dns::reply must be >0", - cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum); + cepp->file->filename, cepp->line_number); errors++; } } } } else - if (!cepp->ce_vardata) + if (!cepp->value) { - config_error_empty(cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum, - "blacklist::dns", cepp->ce_varname); + config_error_empty(cepp->file->filename, cepp->line_number, + "blacklist::dns", cepp->name); errors++; continue; } else - if (!strcmp(cepp->ce_varname, "name")) + if (!strcmp(cepp->name, "name")) { if (has_dns_name) { - config_warn_duplicate(cepp->ce_fileptr->cf_filename, - cepp->ce_varlinenum, "blacklist::dns::name"); + config_warn_duplicate(cepp->file->filename, + cepp->line_number, "blacklist::dns::name"); } has_dns_name = 1; } else - if (!strcmp(cepp->ce_varname, "type")) + if (!strcmp(cepp->name, "type")) { if (has_dns_type) { - config_warn_duplicate(cepp->ce_fileptr->cf_filename, - cepp->ce_varlinenum, "blacklist::dns::type"); + config_warn_duplicate(cepp->file->filename, + cepp->line_number, "blacklist::dns::type"); } has_dns_type = 1; - if (!strcmp(cepp->ce_vardata, "record")) + if (!strcmp(cepp->value, "record")) ; - else if (!strcmp(cepp->ce_vardata, "bitmask")) + else if (!strcmp(cepp->value, "bitmask")) ; else { config_error("%s:%i: unknown blacklist::dns::type '%s', must be either 'record' or 'bitmask'", - cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum, cepp->ce_vardata); + cepp->file->filename, cepp->line_number, cepp->value); errors++; } } } } else - if (!cep->ce_vardata) + if (!cep->value) { - config_error_empty(cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - "blacklist", cep->ce_varname); + config_error_empty(cep->file->filename, cep->line_number, + "blacklist", cep->name); errors++; continue; } - else if (!strcmp(cep->ce_varname, "action")) + else if (!strcmp(cep->name, "action")) { if (has_action) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "blacklist::action"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "blacklist::action"); continue; } has_action = 1; - if (!banact_stringtoval(cep->ce_vardata)) + if (!banact_stringtoval(cep->value)) { config_error("%s:%i: blacklist::action has unknown action type '%s'", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_vardata); + cep->file->filename, cep->line_number, cep->value); errors++; } } - else if (!strcmp(cep->ce_varname, "ban-time")) + else if (!strcmp(cep->name, "ban-time")) { if (has_ban_time) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "blacklist::ban-time"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "blacklist::ban-time"); continue; } has_ban_time = 1; } else - if (!strcmp(cep->ce_varname, "reason")) + if (!strcmp(cep->name, "reason")) { if (has_reason) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "blacklist::reason"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "blacklist::reason"); continue; } has_reason = 1; } else { - config_error_unknown(cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - "blacklist", cep->ce_varname); + config_error_unknown(cep->file->filename, cep->line_number, + "blacklist", cep->name); errors++; } } if (!has_action) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "blacklist::action"); errors++; } if (!has_reason) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "blacklist::reason"); errors++; } if (!has_dns_name) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "blacklist::dns::name"); errors++; } if (!has_dns_type) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "blacklist::dns::type"); errors++; } if (!has_dns_reply) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "blacklist::dns::reply"); errors++; } @@ -453,12 +452,12 @@ int blacklist_config_run(ConfigFile *cf, ConfigEntry *ce, int type) if (type != CONFIG_MAIN) return 0; - if (!ce || !ce->ce_varname || strcmp(ce->ce_varname, "blacklist")) + if (!ce || !ce->name || strcmp(ce->name, "blacklist")) return 0; /* not interested */ d = safe_alloc(sizeof(Blacklist)); - safe_strdup(d->name, ce->ce_vardata); - /* set some defaults. TODO: use set::blacklist or something ? */ + safe_strdup(d->name, ce->value); + /* set some defaults */ d->action = BAN_ACT_KILL; safe_strdup(d->reason, "Your IP is on a DNS Blacklist"); d->ban_time = 3600; @@ -468,28 +467,28 @@ int blacklist_config_run(ConfigFile *cf, ConfigEntry *ce, int type) d->backend = safe_alloc(sizeof(BlacklistBackend)); d->backend->dns = safe_alloc(sizeof(DNSBL)); - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "dns")) + if (!strcmp(cep->name, "dns")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { - if (!strcmp(cepp->ce_varname, "reply")) + if (!strcmp(cepp->name, "reply")) { - if (cepp->ce_vardata) + if (cepp->value) { /* single reply */ d->backend->dns->reply = safe_alloc(sizeof(int)*2); - d->backend->dns->reply[0] = atoi(cepp->ce_vardata); + d->backend->dns->reply[0] = atoi(cepp->value); d->backend->dns->reply[1] = 0; } else - if (cepp->ce_entries) + if (cepp->items) { /* (potentially) multiple reply values */ int cnt = 0; - for (ceppp = cepp->ce_entries; ceppp; ceppp = ceppp->ce_next) + for (ceppp = cepp->items; ceppp; ceppp = ceppp->next) { - if (ceppp->ce_varname) + if (ceppp->name) cnt++; } @@ -499,37 +498,37 @@ int blacklist_config_run(ConfigFile *cf, ConfigEntry *ce, int type) d->backend->dns->reply = safe_alloc(sizeof(int)*(cnt+1)); cnt = 0; - for (ceppp = cepp->ce_entries; ceppp; ceppp = ceppp->ce_next) + for (ceppp = cepp->items; ceppp; ceppp = ceppp->next) { - d->backend->dns->reply[cnt++] = atoi(ceppp->ce_varname); + d->backend->dns->reply[cnt++] = atoi(ceppp->name); } d->backend->dns->reply[cnt] = 0; } } else - if (!strcmp(cepp->ce_varname, "type")) + if (!strcmp(cepp->name, "type")) { - if (!strcmp(cepp->ce_vardata, "record")) + if (!strcmp(cepp->value, "record")) d->backend->dns->type = DNSBL_RECORD; - else if (!strcmp(cepp->ce_vardata, "bitmask")) + else if (!strcmp(cepp->value, "bitmask")) d->backend->dns->type = DNSBL_BITMASK; } else - if (!strcmp(cepp->ce_varname, "name")) + if (!strcmp(cepp->name, "name")) { - safe_strdup(d->backend->dns->name, cepp->ce_vardata); + safe_strdup(d->backend->dns->name, cepp->value); } } } - else if (!strcmp(cep->ce_varname, "action")) + else if (!strcmp(cep->name, "action")) { - d->action = banact_stringtoval(cep->ce_vardata); + d->action = banact_stringtoval(cep->value); } - else if (!strcmp(cep->ce_varname, "reason")) + else if (!strcmp(cep->name, "reason")) { - safe_strdup(d->reason, cep->ce_vardata); + safe_strdup(d->reason, cep->value); } - else if (!strcmp(cep->ce_varname, "ban-time")) + else if (!strcmp(cep->name, "ban-time")) { - d->ban_time = config_checkval(cep->ce_vardata, CFG_TIME); + d->ban_time = config_checkval(cep->value, CFG_TIME); } } @@ -644,7 +643,7 @@ void blacklist_cancel(BLUser *bl) bl->client = NULL; } -int blacklist_quit(Client *client, MessageTag *mtags, char *comment) +int blacklist_quit(Client *client, MessageTag *mtags, const char *comment) { if (BLUSER(client)) blacklist_cancel(BLUSER(client)); @@ -725,10 +724,17 @@ int blacklist_parse_reply(struct hostent *he, int entry) * from blacklist_preconnect() for softbans that need to be delayed * as to give the user the opportunity to do SASL Authentication. */ -int blacklist_action(Client *client, char *opernotice, BanAction ban_action, char *ban_reason, long ban_time) +int blacklist_action(Client *client, char *opernotice, BanAction ban_action, char *ban_reason, long ban_time, + char *blacklist, char *blacklist_dns_name, int blacklist_dns_reply) { - sendto_snomask(SNO_BLACKLIST, "%s", opernotice); - ircd_log(LOG_KILL, "%s", opernotice); + unreal_log_raw(ULOG_INFO, "blacklist", "BLACKLIST_HIT", client, + opernotice, + log_data_string("blacklist_name", blacklist), + log_data_string("blacklist_dns_name", blacklist_dns_name), + log_data_integer("blacklist_dns_reply", blacklist_dns_reply), + log_data_string("ban_action", banact_valtostring(ban_action)), + log_data_string("ban_reason", ban_reason), + log_data_integer("ban_time", ban_time)); if (ban_action == BAN_ACT_WARN) return 0; return place_host_ban(client, ban_action, ban_reason, ban_time); @@ -766,9 +772,12 @@ void blacklist_hit(Client *client, Blacklist *bl, int reply) blu->save_tkltime = bl->ban_time; safe_strdup(blu->save_opernotice, opernotice); safe_strdup(blu->save_reason, banbuf); + safe_strdup(blu->save_blacklist, bl->name); + safe_strdup(blu->save_blacklist_dns_name, bl->backend->dns->name); + blu->save_blacklist_dns_reply = reply; } else { /* Otherwise, execute the action immediately */ - blacklist_action(client, opernotice, bl->action, banbuf, bl->ban_time); + blacklist_action(client, opernotice, bl->action, banbuf, bl->ban_time, bl->name, bl->backend->dns->name, reply); } } @@ -841,7 +850,10 @@ int blacklist_preconnect(Client *client) if (IsLoggedIn(client)) return HOOK_CONTINUE; /* yup, so the softban does not apply. */ - if (blacklist_action(client, blu->save_opernotice, blu->save_action, blu->save_reason, blu->save_tkltime)) + if (blacklist_action(client, blu->save_opernotice, blu->save_action, blu->save_reason, blu->save_tkltime, + blu->save_blacklist, blu->save_blacklist_dns_name, blu->save_blacklist_dns_reply)) + { return HOOK_DENY; + } return HOOK_CONTINUE; /* exempt */ } diff --git a/src/modules/bot-tag.c b/src/modules/bot-tag.c index ed566ef..2a300c3 100644 --- a/src/modules/bot-tag.c +++ b/src/modules/bot-tag.c @@ -33,11 +33,11 @@ ModuleHeader MOD_HEADER "5.0", "bot message tag", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; -int bottag_mtag_is_ok(Client *client, char *name, char *value); -void mtag_add_bottag(Client *client, MessageTag *recv_mtags, MessageTag **mtag_list, char *signature); +int bottag_mtag_is_ok(Client *client, const char *name, const char *value); +void mtag_add_bottag(Client *client, MessageTag *recv_mtags, MessageTag **mtag_list, const char *signature); MOD_INIT() { @@ -68,7 +68,7 @@ MOD_UNLOAD() /** This function verifies if the client sending the mtag is permitted to do so. */ -int bottag_mtag_is_ok(Client *client, char *name, char *value) +int bottag_mtag_is_ok(Client *client, const char *name, const char *value) { if (IsServer(client) && (value == NULL)) return 1; /* OK */ @@ -76,7 +76,7 @@ int bottag_mtag_is_ok(Client *client, char *name, char *value) return 0; } -void mtag_add_bottag(Client *client, MessageTag *recv_mtags, MessageTag **mtag_list, char *signature) +void mtag_add_bottag(Client *client, MessageTag *recv_mtags, MessageTag **mtag_list, const char *signature) { MessageTag *m; diff --git a/src/modules/botmotd.c b/src/modules/botmotd.c index a36248b..b5dcde2 100644 --- a/src/modules/botmotd.c +++ b/src/modules/botmotd.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", "command /botmotd", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -60,7 +60,7 @@ CMD_FUNC(cmd_botmotd) MOTDLine *motdline; ConfigItem_tld *tld; - if (hunt_server(client, recv_mtags, ":%s BOTMOTD :%s", 1, parc, parv) != HUNTED_ISME) + if (hunt_server(client, recv_mtags, "BOTMOTD", 1, parc, parv) != HUNTED_ISME) return; if (!IsUser(client)) diff --git a/src/modules/cap.c b/src/modules/cap.c index 7b886a3..08ffe5e 100644 --- a/src/modules/cap.c +++ b/src/modules/cap.c @@ -34,7 +34,7 @@ ModuleHeader MOD_HEADER "5.0", /* Version */ "command /cap", /* Short description of module */ "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Forward declarations */ @@ -43,13 +43,7 @@ int cap_never_visible(Client *client); /* Variables */ long CAP_IN_PROGRESS = 0L; -long CAP_ACCOUNT_NOTIFY = 0L; -long CAP_AWAY_NOTIFY = 0L; -long CAP_MULTI_PREFIX = 0L; -long CAP_USERHOST_IN_NAMES = 0L; long CAP_NOTIFY = 0L; -long CAP_CHGHOST = 0L; -long CAP_EXTENDED_JOIN = 0L; MOD_INIT() { @@ -66,34 +60,10 @@ MOD_INIT() c.visible = cap_never_visible; ClientCapabilityAdd(modinfo->handle, &c, &CAP_IN_PROGRESS); - memset(&c, 0, sizeof(c)); - c.name = "account-notify"; - ClientCapabilityAdd(modinfo->handle, &c, &CAP_ACCOUNT_NOTIFY); - - memset(&c, 0, sizeof(c)); - c.name = "away-notify"; - ClientCapabilityAdd(modinfo->handle, &c, &CAP_AWAY_NOTIFY); - - memset(&c, 0, sizeof(c)); - c.name = "multi-prefix"; - ClientCapabilityAdd(modinfo->handle, &c, &CAP_MULTI_PREFIX); - - memset(&c, 0, sizeof(c)); - c.name = "userhost-in-names"; - ClientCapabilityAdd(modinfo->handle, &c, &CAP_USERHOST_IN_NAMES); - memset(&c, 0, sizeof(c)); c.name = "cap-notify"; ClientCapabilityAdd(modinfo->handle, &c, &CAP_NOTIFY); - memset(&c, 0, sizeof(c)); - c.name = "chghost"; - ClientCapabilityAdd(modinfo->handle, &c, &CAP_CHGHOST); - - memset(&c, 0, sizeof(c)); - c.name = "extended-join"; - ClientCapabilityAdd(modinfo->handle, &c, &CAP_EXTENDED_JOIN); - HookAdd(modinfo->handle, HOOKTYPE_IS_HANDSHAKE_FINISHED, 0, cap_is_handshake_finished); return MOD_SUCCESS; @@ -139,17 +109,17 @@ static ClientCapability *clicap_find(Client *client, const char *data, int *nega return NULL; } - if(*p == '-') + if (*p == '-') { *negate = 1; p++; /* someone sent a '-' without a parameter.. */ - if(*p == '\0') + if (*p == '\0') return NULL; } - if((s = strchr(p, ' '))) + if ((s = strchr(p, ' '))) *s++ = '\0'; cap = ClientCapabilityFind(p, client); @@ -190,7 +160,7 @@ static void clicap_generate(Client *client, const char *subcmd, int flags) for (cap = clicaps; cap; cap = cap->next) { char name[256]; - char *param; + const char *param; if (cap->visible && !cap->visible(client)) continue; /* hidden */ @@ -240,7 +210,7 @@ static void cap_end(Client *client, const char *arg) ClearCapabilityFast(client, CAP_IN_PROGRESS); if (*client->name && client->user && *client->user->username && IsNotSpoof(client)) - register_user(client, client->name, client->user->username, NULL, NULL, NULL); + register_user(client); } static void cap_list(Client *client, const char *arg) @@ -386,8 +356,8 @@ CMD_FUNC(cmd_cap) * Only add a 1 second fake lag penalty if this is the XXth command. * This will speed up connections considerably. */ - if (client->local->receiveM > 15) - client->local->since++; + if (client->local->traffic.messages_received > 15) + add_fake_lag(client, 1000); if (DISABLE_CAP) { @@ -406,7 +376,7 @@ CMD_FUNC(cmd_cap) return; } - if(!(cmd = bsearch(parv[1], clicap_cmdtable, + if (!(cmd = bsearch(parv[1], clicap_cmdtable, sizeof(clicap_cmdtable) / sizeof(struct clicap_cmd), sizeof(struct clicap_cmd), (bqcmp) clicap_cmd_search))) { diff --git a/src/modules/certfp.c b/src/modules/certfp.c index 1ec8b9a..c389b9e 100644 --- a/src/modules/certfp.c +++ b/src/modules/certfp.c @@ -1,6 +1,6 @@ /* * Certificate Fingerprint Module - * This grabs the SHA256 fingerprint of the SSL/TLS client certificate + * This grabs the SHA256 fingerprint of the TLS client certificate * the user is using, shares it with the other servers (and rest of * UnrealIRCd) and shows it in /WHOIS etc. * @@ -17,24 +17,22 @@ ModuleHeader MOD_HEADER "5.0", "Certificate fingerprint", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Forward declarations */ void certfp_free(ModData *m); -char *certfp_serialize(ModData *m); -void certfp_unserialize(char *str, ModData *m); +const char *certfp_serialize(ModData *m); +void certfp_unserialize(const char *str, ModData *m); int certfp_handshake(Client *client); int certfp_connect(Client *client); -int certfp_whois(Client *client, Client *target); +int certfp_whois(Client *client, Client *target, NameValuePrioList **list); ModDataInfo *certfp_md; /* Module Data structure which we acquire */ -#define WHOISCERTFP_STRING ":%s 276 %s %s :has client certificate fingerprint %s" - MOD_INIT() { -ModDataInfo mreq; + ModDataInfo mreq; MARK_AS_OFFICIAL_MODULE(modinfo); @@ -43,7 +41,7 @@ ModDataInfo mreq; mreq.free = certfp_free; mreq.serialize = certfp_serialize; mreq.unserialize = certfp_unserialize; - mreq.sync = 1; + mreq.sync = MODDATA_SYNC_EARLY; mreq.type = MODDATATYPE_CLIENT; certfp_md = ModDataAdd(modinfo->handle, mreq); if (!certfp_md) @@ -121,7 +119,7 @@ int certfp_connect(Client *client) { if (IsSecure(client)) { - char *fp = moddata_client_get(client, "certfp"); + const char *fp = moddata_client_get(client, "certfp"); if (fp && !iConf.no_connect_tls_info) sendnotice(client, "*** Your TLS certificate fingerprint is %s", fp); @@ -130,12 +128,17 @@ int certfp_connect(Client *client) return 0; } -int certfp_whois(Client *client, Client *target) +int certfp_whois(Client *client, Client *target, NameValuePrioList **list) { - char *fp = moddata_client_get(target, "certfp"); - - if (fp) - sendnumeric(client, RPL_WHOISCERTFP, target->name, fp); + const char *fp = moddata_client_get(target, "certfp"); + char buf[512]; + + if (!fp) + return 0; + + if (whois_get_policy(client, target, "certfp") == WHOIS_CONFIG_DETAILS_FULL) + add_nvplist_numeric(list, 0, "certfp", client, RPL_WHOISCERTFP, target->name, fp); + return 0; } @@ -144,14 +147,14 @@ void certfp_free(ModData *m) safe_free(m->str); } -char *certfp_serialize(ModData *m) +const char *certfp_serialize(ModData *m) { if (!m->str) return NULL; return m->str; } -void certfp_unserialize(char *str, ModData *m) +void certfp_unserialize(const char *str, ModData *m) { safe_strdup(m->str, str); } diff --git a/src/modules/chanmodes/Makefile.in b/src/modules/chanmodes/Makefile.in index a493260..0544b9c 100644 --- a/src/modules/chanmodes/Makefile.in +++ b/src/modules/chanmodes/Makefile.in @@ -25,14 +25,17 @@ INCLUDES = ../../include/channel.h \ ../../include/ircsprintf.h \ ../../include/license.h \ ../../include/modules.h ../../include/modversion.h ../../include/msg.h \ - ../../include/numeric.h ../../include/proto.h ../../include/dns.h \ + ../../include/numeric.h ../../include/dns.h \ ../../include/resource.h ../../include/setup.h \ ../../include/struct.h ../../include/sys.h \ - ../../include/types.h ../../include/url.h \ + ../../include/types.h \ ../../include/version.h ../../include/whowas.h R_MODULES= \ - nocolor.so stripcolor.so issecure.so permanent.so floodprot.so \ + chanowner.so chanadmin.so chanop.so halfop.so voice.so \ + key.so limit.so inviteonly.so secret.so private.so \ + moderated.so noexternalmsgs.so topiclimit.so \ + nocolor.so stripcolor.so isregistered.so issecure.so permanent.so floodprot.so \ noctcp.so link.so censor.so delayjoin.so noknock.so noinvite.so operonly.so \ nonotice.so regonly.so nonickchange.so nokick.so regonlyspeak.so \ secureonly.so history.so @@ -41,6 +44,9 @@ MODULES=$(R_MODULES) MODULEFLAGS=@MODULEFLAGS@ RM=@RM@ +.SUFFIXES: +.SUFFIXES: .c .h .so + all: build build: $(MODULES) @@ -48,82 +54,6 @@ build: $(MODULES) clean: $(RM) -f *.o *.so *~ core -############################################################################# -# .so's section -############################################################################# - -issecure.so: issecure.c $(INCLUDES) +%.so: %.c $(INCLUDES) $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o issecure.so issecure.c - -nocolor.so: nocolor.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o nocolor.so nocolor.c - -stripcolor.so: stripcolor.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o stripcolor.so stripcolor.c - -permanent.so: permanent.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o permanent.so permanent.c - -floodprot.so: floodprot.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o floodprot.so floodprot.c - -noctcp.so: noctcp.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o noctcp.so noctcp.c - -link.so: link.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o link.so link.c - -censor.so: censor.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o censor.so censor.c - -delayjoin.so: delayjoin.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o delayjoin.so delayjoin.c - -noknock.so: noknock.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o noknock.so noknock.c - -noinvite.so: noinvite.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o noinvite.so noinvite.c - -operonly.so: operonly.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o operonly.so operonly.c - -nonotice.so: nonotice.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o nonotice.so nonotice.c - -regonly.so: regonly.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o regonly.so regonly.c - -nonickchange.so: nonickchange.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o nonickchange.so nonickchange.c - -nokick.so: nokick.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o nokick.so nokick.c - -regonlyspeak.so: regonlyspeak.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o regonlyspeak.so regonlyspeak.c - -secureonly.so: secureonly.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o secureonly.so secureonly.c - -history.so: history.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o history.so history.c + -o $@ $< diff --git a/src/modules/chanmodes/censor.c b/src/modules/chanmodes/censor.c index 767d21f..5ae21a8 100644 --- a/src/modules/chanmodes/censor.c +++ b/src/modules/chanmodes/censor.c @@ -12,18 +12,18 @@ ModuleHeader MOD_HEADER "4.2", "Channel Mode +G", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; Cmode_t EXTMODE_CENSOR = 0L; -#define IsCensored(x) ((x)->mode.extmode & EXTMODE_CENSOR) +#define IsCensored(x) ((x)->mode.mode & EXTMODE_CENSOR) -int censor_can_send_to_channel(Client *client, Channel *channel, Membership *lp, char **msg, char **errmsg, SendType sendtype); -char *censor_pre_local_part(Client *client, Channel *channel, char *text); -char *censor_pre_local_quit(Client *client, char *text); -int censor_stats_badwords_channel(Client *client, char *para); +int censor_can_send_to_channel(Client *client, Channel *channel, Membership *lp, const char **msg, const char **errmsg, SendType sendtype); +const char *censor_pre_local_part(Client *client, Channel *channel, const char *text); +const char *censor_pre_local_quit(Client *client, const char *text); +int censor_stats_badwords_channel(Client *client, const char *para); int censor_config_test(ConfigFile *, ConfigEntry *, int, int *); int censor_config_run(ConfigFile *, ConfigEntry *, int); @@ -49,12 +49,12 @@ MOD_INIT() memset(&req, 0, sizeof(req)); req.paracount = 0; req.is_ok = extcmode_default_requirechop; - req.flag = 'G'; + req.letter = 'G'; CmodeAdd(modinfo->handle, req, &EXTMODE_CENSOR); HookAdd(modinfo->handle, HOOKTYPE_CAN_SEND_TO_CHANNEL, 0, censor_can_send_to_channel); - HookAddPChar(modinfo->handle, HOOKTYPE_PRE_LOCAL_PART, 0, censor_pre_local_part); - HookAddPChar(modinfo->handle, HOOKTYPE_PRE_LOCAL_QUIT, 0, censor_pre_local_quit); + HookAddConstString(modinfo->handle, HOOKTYPE_PRE_LOCAL_PART, 0, censor_pre_local_part); + HookAddConstString(modinfo->handle, HOOKTYPE_PRE_LOCAL_QUIT, 0, censor_pre_local_quit); HookAdd(modinfo->handle, HOOKTYPE_STATS, 0, censor_stats_badwords_channel); HookAdd(modinfo->handle, HOOKTYPE_CONFIGRUN, 0, censor_config_run); return MOD_SUCCESS; @@ -88,99 +88,99 @@ int censor_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) if (type != CONFIG_MAIN) return 0; - if (!ce || !ce->ce_varname || strcmp(ce->ce_varname, "badword")) + if (!ce || !ce->name || strcmp(ce->name, "badword")) return 0; /* not interested */ - if (!ce->ce_vardata) + if (!ce->value) { config_error("%s:%i: badword without type", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); return 1; } - else if (strcmp(ce->ce_vardata, "channel") && - strcmp(ce->ce_vardata, "quit") && strcmp(ce->ce_vardata, "all")) { + else if (strcmp(ce->value, "channel") && + strcmp(ce->value, "quit") && strcmp(ce->value, "all")) { /* config_error("%s:%i: badword with unknown type", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); -- can't do that.. */ + ce->file->filename, ce->line_number); -- can't do that.. */ return 0; /* unhandled */ } - if (!strcmp(ce->ce_vardata, "quit")) + if (!strcmp(ce->value, "quit")) { config_error("%s:%i: badword quit has been removed. We just use the bad words from " "badword channel { } instead.", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); return 0; /* pretend unhandled.. ok not just pretend.. ;) */ } - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { if (config_is_blankorempty(cep, "badword")) { errors++; continue; } - if (!strcmp(cep->ce_varname, "word")) + if (!strcmp(cep->name, "word")) { - char *errbuf; + const char *errbuf; if (has_word) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "badword::word"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "badword::word"); continue; } has_word = 1; - if ((errbuf = badword_config_check_regex(cep->ce_vardata,1,1))) + if ((errbuf = badword_config_check_regex(cep->value,1,1))) { config_error("%s:%i: badword::%s contains an invalid regex: %s", - cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, - cep->ce_varname, errbuf); + cep->file->filename, + cep->line_number, + cep->name, errbuf); errors++; } } - else if (!strcmp(cep->ce_varname, "replace")) + else if (!strcmp(cep->name, "replace")) { if (has_replace) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "badword::replace"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "badword::replace"); continue; } has_replace = 1; } - else if (!strcmp(cep->ce_varname, "action")) + else if (!strcmp(cep->name, "action")) { if (has_action) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "badword::action"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "badword::action"); continue; } has_action = 1; - if (!strcmp(cep->ce_vardata, "replace")) + if (!strcmp(cep->value, "replace")) action = 'r'; - else if (!strcmp(cep->ce_vardata, "block")) + else if (!strcmp(cep->value, "block")) action = 'b'; else { config_error("%s:%d: Unknown badword::action '%s'", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - cep->ce_vardata); + cep->file->filename, cep->line_number, + cep->value); errors++; } } else { - config_error_unknown(cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - "badword", cep->ce_varname); + config_error_unknown(cep->file->filename, cep->line_number, + "badword", cep->name); errors++; } } if (!has_word) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "badword::word"); errors++; } @@ -189,7 +189,7 @@ int censor_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) if (has_replace && action == 'b') { config_error("%s:%i: badword::action is block but badword::replace exists", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); errors++; } } @@ -207,39 +207,39 @@ int censor_config_run(ConfigFile *cf, ConfigEntry *ce, int type) if (type != CONFIG_MAIN) return 0; - if (!ce || !ce->ce_varname || strcmp(ce->ce_varname, "badword")) + if (!ce || !ce->name || strcmp(ce->name, "badword")) return 0; /* not interested */ - if (strcmp(ce->ce_vardata, "channel") && strcmp(ce->ce_vardata, "all")) + if (strcmp(ce->value, "channel") && strcmp(ce->value, "all")) return 0; /* not for us */ ca = safe_alloc(sizeof(ConfigItem_badword)); ca->action = BADWORD_REPLACE; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "action")) + if (!strcmp(cep->name, "action")) { - if (!strcmp(cep->ce_vardata, "block")) + if (!strcmp(cep->value, "block")) { ca->action = BADWORD_BLOCK; } } - else if (!strcmp(cep->ce_varname, "replace")) + else if (!strcmp(cep->name, "replace")) { - safe_strdup(ca->replace, cep->ce_vardata); + safe_strdup(ca->replace, cep->value); } else - if (!strcmp(cep->ce_varname, "word")) + if (!strcmp(cep->name, "word")) { word = cep; } } - badword_config_process(ca, word->ce_vardata); + badword_config_process(ca, word->value); - if (!strcmp(ce->ce_vardata, "channel")) + if (!strcmp(ce->value, "channel")) AddListItem(ca, conf_badword_channel); - else if (!strcmp(ce->ce_vardata, "all")) + else if (!strcmp(ce->value, "all")) { AddListItem(ca, conf_badword_channel); return 0; /* pretend we didn't see it, so other modules can handle 'all' as well */ @@ -248,12 +248,12 @@ int censor_config_run(ConfigFile *cf, ConfigEntry *ce, int type) return 1; } -char *stripbadwords_channel(char *str, int *blocked) +const char *stripbadwords_channel(const char *str, int *blocked) { return stripbadwords(str, conf_badword_channel, blocked); } -int censor_can_send_to_channel(Client *client, Channel *channel, Membership *lp, char **msg, char **errmsg, SendType sendtype) +int censor_can_send_to_channel(Client *client, Channel *channel, Membership *lp, const char **msg, const char **errmsg, SendType sendtype) { int blocked; Hook *h; @@ -281,7 +281,7 @@ int censor_can_send_to_channel(Client *client, Channel *channel, Membership *lp, return HOOK_CONTINUE; } -char *censor_pre_local_part(Client *client, Channel *channel, char *text) +const char *censor_pre_local_part(Client *client, Channel *channel, const char *text) { int blocked; @@ -306,7 +306,7 @@ static int IsAnyChannelCensored(Client *client) return 0; } -char *censor_pre_local_quit(Client *client, char *text) +const char *censor_pre_local_quit(Client *client, const char *text) { int blocked = 0; @@ -319,7 +319,7 @@ char *censor_pre_local_quit(Client *client, char *text) return blocked ? NULL : text; } -int censor_stats_badwords_channel(Client *client, char *para) +int censor_stats_badwords_channel(Client *client, const char *para) { ConfigItem_badword *words; diff --git a/src/modules/chanmodes/chanadmin.c b/src/modules/chanmodes/chanadmin.c new file mode 100644 index 0000000..358557d --- /dev/null +++ b/src/modules/chanmodes/chanadmin.c @@ -0,0 +1,88 @@ +/* + * Channel Mode +a + * (C) Copyright 2021 Syzop and the UnrealIRCd team + * + * This program is free 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 1, or (at your option) + * any later version. + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "unrealircd.h" + +ModuleHeader MOD_HEADER + = { + "chanmodes/chanadmin", + "6.0", + "Channel Mode +a", + "UnrealIRCd Team", + "unrealircd-6", + }; + +/* Forward declarations */ +int cmode_chanadmin_is_ok(Client *client, Channel *channel, char mode, const char *para, int type, int what); + +MOD_INIT() +{ + CmodeInfo creq; + ModDataInfo mreq; + + MARK_AS_OFFICIAL_MODULE(modinfo); + + memset(&creq, 0, sizeof(creq)); + creq.paracount = 1; + creq.is_ok = cmode_chanadmin_is_ok; + creq.letter = 'a'; + creq.prefix = '&'; + creq.sjoin_prefix = '~'; /* yeah i know, totally not confusing! */ + creq.rank = RANK_CHANADMIN; + creq.unset_with_param = 1; + creq.type = CMODE_MEMBER; + CmodeAdd(modinfo->handle, creq, NULL); + + return MOD_SUCCESS; +} + +MOD_LOAD() +{ + return MOD_SUCCESS; +} + +MOD_UNLOAD() +{ + return MOD_SUCCESS; +} + +int cmode_chanadmin_is_ok(Client *client, Channel *channel, char mode, const char *param, int type, int what) +{ + if ((type == EXCHK_ACCESS) || (type == EXCHK_ACCESS_ERR)) + { + Client *target = find_user(param, NULL); + + if ((what == MODE_DEL) && (client == target)) + { + /* User may always remove their own modes */ + return EX_ALLOW; + } + if (check_channel_access(client, channel, "q")) + { + /* only +q people may do +a/-a */ + return EX_ALLOW; + } + if (type == EXCHK_ACCESS_ERR) + sendnumeric(client, ERR_CHANOWNPRIVNEEDED, channel->name); + return EX_DENY; + } + + /* fallthrough -- should not be used */ + return EX_DENY; +} diff --git a/src/modules/chanmodes/chanop.c b/src/modules/chanmodes/chanop.c new file mode 100644 index 0000000..3a08f32 --- /dev/null +++ b/src/modules/chanmodes/chanop.c @@ -0,0 +1,78 @@ +/* + * Channel Mode +o + * (C) Copyright 2021 Syzop and the UnrealIRCd team + * + * This program is free 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 1, or (at your option) + * any later version. + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "unrealircd.h" + +ModuleHeader MOD_HEADER + = { + "chanmodes/chanop", + "6.0", + "Channel Mode +o", + "UnrealIRCd Team", + "unrealircd-6", + }; + +/* Forward declarations */ +int cmode_chanop_is_ok(Client *client, Channel *channel, char mode, const char *para, int type, int what); + +MOD_INIT() +{ + CmodeInfo creq; + ModDataInfo mreq; + + MARK_AS_OFFICIAL_MODULE(modinfo); + + memset(&creq, 0, sizeof(creq)); + creq.paracount = 1; + creq.is_ok = cmode_chanop_is_ok; + creq.letter = 'o'; + creq.prefix = '@'; + creq.sjoin_prefix = '@'; + creq.rank = RANK_CHANOP; + creq.unset_with_param = 1; + creq.type = CMODE_MEMBER; + CmodeAdd(modinfo->handle, creq, NULL); + + return MOD_SUCCESS; +} + +MOD_LOAD() +{ + return MOD_SUCCESS; +} + +MOD_UNLOAD() +{ + return MOD_SUCCESS; +} + +int cmode_chanop_is_ok(Client *client, Channel *channel, char mode, const char *param, int type, int what) +{ + if ((type == EXCHK_ACCESS) || (type == EXCHK_ACCESS_ERR)) + { + if (check_channel_access(client, channel, "oaq")) + return EX_ALLOW; + if (type == EXCHK_ACCESS_ERR) + sendnumeric(client, ERR_CHANOPRIVSNEEDED, channel->name); + return EX_DENY; + } + + /* fallthrough -- should not be used */ + return EX_DENY; +} diff --git a/src/modules/chanmodes/chanowner.c b/src/modules/chanmodes/chanowner.c new file mode 100644 index 0000000..f449d99 --- /dev/null +++ b/src/modules/chanmodes/chanowner.c @@ -0,0 +1,88 @@ +/* + * Channel Mode +q + * (C) Copyright 2021 Syzop and the UnrealIRCd team + * + * This program is free 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 1, or (at your option) + * any later version. + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "unrealircd.h" + +ModuleHeader MOD_HEADER + = { + "chanmodes/chanowner", + "6.0", + "Channel Mode +q", + "UnrealIRCd Team", + "unrealircd-6", + }; + +/* Forward declarations */ +int cmode_chanowner_is_ok(Client *client, Channel *channel, char mode, const char *para, int type, int what); + +MOD_INIT() +{ + CmodeInfo creq; + ModDataInfo mreq; + + MARK_AS_OFFICIAL_MODULE(modinfo); + + memset(&creq, 0, sizeof(creq)); + creq.paracount = 1; + creq.is_ok = cmode_chanowner_is_ok; + creq.letter = 'q'; + creq.prefix = '~'; + creq.sjoin_prefix = '*'; + creq.rank = RANK_CHANOWNER; + creq.unset_with_param = 1; + creq.type = CMODE_MEMBER; + CmodeAdd(modinfo->handle, creq, NULL); + + return MOD_SUCCESS; +} + +MOD_LOAD() +{ + return MOD_SUCCESS; +} + +MOD_UNLOAD() +{ + return MOD_SUCCESS; +} + +int cmode_chanowner_is_ok(Client *client, Channel *channel, char mode, const char *param, int type, int what) +{ + if ((type == EXCHK_ACCESS) || (type == EXCHK_ACCESS_ERR)) + { + Client *target = find_user(param, NULL); + + if ((what == MODE_DEL) && (client == target)) + { + /* User may always remove their own modes */ + return EX_ALLOW; + } + if (check_channel_access(client, channel, "q")) + { + /* only +q people may do +q/-q */ + return EX_ALLOW; + } + if (type == EXCHK_ACCESS_ERR) + sendnumeric(client, ERR_CHANOWNPRIVNEEDED, channel->name); + return EX_DENY; + } + + /* fallthrough -- should not be used */ + return EX_DENY; +} diff --git a/src/modules/chanmodes/delayjoin.c b/src/modules/chanmodes/delayjoin.c index 0eedb31..95fc07b 100644 --- a/src/modules/chanmodes/delayjoin.c +++ b/src/modules/chanmodes/delayjoin.c @@ -11,7 +11,7 @@ ModuleHeader MOD_HEADER "5.0", /* Version */ "delayed join (+D,+d)", /* Short description of module */ "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; #define MOD_DATA_STR "delayjoin" @@ -26,13 +26,14 @@ static Cmode_t EXTMODE_POST_DELAYED; int visible_in_channel(Client *client, Channel *channel); int moded_check_part(Client *client, Channel *channel); int moded_join(Client *client, Channel *channel); -int moded_part(Client *client, Channel *channel, MessageTag *mtags, char *comment); -int deny_all(Client *client, Channel *channel, char mode, char *para, int checkt, int what); +int moded_part(Client *client, Channel *channel, MessageTag *mtags, const char *comment); +int moded_quit(Client *client, MessageTag *mtags, const char *comment); +int delayjoin_is_ok(Client *client, Channel *channel, char mode, const char *para, int checkt, int what); int moded_chanmode(Client *client, Channel *channel, - MessageTag *mtags, char *modebuf, char *parabuf, time_t sendts, int samode); -int moded_prechanmsg(Client *client, Channel *channel, MessageTag *mtags, char *text, SendType sendtype); -char *moded_serialize(ModData *m); -void moded_unserialize(char *str, ModData *m); + MessageTag *mtags, const char *modebuf, const char *parabuf, time_t sendts, int samode); +int moded_prechanmsg(Client *client, Channel *channel, MessageTag *mtags, const char *text, SendType sendtype); +const char *moded_serialize(ModData *m); +void moded_unserialize(const char *str, ModData *m); MOD_INIT() { @@ -45,13 +46,14 @@ MOD_INIT() memset(&req, 0, sizeof(req)); req.paracount = 0; req.is_ok = extcmode_default_requirechop; - req.flag = 'D'; + req.letter = 'D'; CmodeDelayed = CmodeAdd(modinfo->handle, req, &EXTMODE_DELAYED); memset(&req, 0, sizeof(req)); req.paracount = 0; - req.is_ok = deny_all; - req.flag = 'd'; + req.is_ok = delayjoin_is_ok; + req.letter = 'd'; + req.local = 1; CmodePostDelayed = CmodeAdd(modinfo->handle, req, &EXTMODE_POST_DELAYED); memset(&mreq, 0, sizeof(mreq)); @@ -76,6 +78,8 @@ MOD_INIT() HookAdd(modinfo->handle, HOOKTYPE_JOIN_DATA, 0, moded_join); HookAdd(modinfo->handle, HOOKTYPE_LOCAL_PART, 0, moded_part); HookAdd(modinfo->handle, HOOKTYPE_REMOTE_PART, 0, moded_part); + HookAdd(modinfo->handle, HOOKTYPE_LOCAL_QUIT, 0, moded_quit); + HookAdd(modinfo->handle, HOOKTYPE_REMOTE_QUIT, 0, moded_quit); HookAdd(modinfo->handle, HOOKTYPE_PRE_LOCAL_CHANMODE, 0, moded_chanmode); HookAdd(modinfo->handle, HOOKTYPE_PRE_REMOTE_CHANMODE, 0, moded_chanmode); HookAdd(modinfo->handle, HOOKTYPE_PRE_CHANMSG, 0, moded_prechanmsg); @@ -97,10 +101,10 @@ void set_post_delayed(Channel *channel) { MessageTag *mtags = NULL; - channel->mode.extmode |= EXTMODE_POST_DELAYED; + channel->mode.mode |= EXTMODE_POST_DELAYED; new_message(&me, NULL, &mtags); - sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s +d", me.name, channel->chname); + sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s +d", me.name, channel->name); free_message_tags(mtags); } @@ -108,10 +112,10 @@ void clear_post_delayed(Channel *channel) { MessageTag *mtags = NULL; - channel->mode.extmode &= ~EXTMODE_POST_DELAYED; + channel->mode.mode &= ~EXTMODE_POST_DELAYED; new_message(&me, NULL, &mtags); - sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s -d", me.name, channel->chname); + sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s -d", me.name, channel->name); free_message_tags(mtags); } @@ -153,14 +157,14 @@ bool channel_has_invisible_users(Channel *channel) bool channel_is_post_delayed(Channel *channel) { - if (channel->mode.extmode & EXTMODE_POST_DELAYED) + if (channel->mode.mode & EXTMODE_POST_DELAYED) return true; return false; } bool channel_is_delayed(Channel *channel) { - if (channel->mode.extmode & EXTMODE_DELAYED) + if (channel->mode.mode & EXTMODE_DELAYED) return true; return false; } @@ -196,7 +200,7 @@ void clear_user_invisible(Channel *channel, Client *client) } } - if (should_clear && (channel->mode.extmode & EXTMODE_POST_DELAYED)) + if (should_clear && (channel->mode.mode & EXTMODE_POST_DELAYED)) { clear_post_delayed(channel); } @@ -213,18 +217,18 @@ void clear_user_invisible_announce(Channel *channel, Client *client, MessageTag clear_user_invisible(channel, client); ircsnprintf(joinbuf, sizeof(joinbuf), ":%s!%s@%s JOIN %s", - client->name, client->user->username, GetHost(client), channel->chname); + client->name, client->user->username, GetHost(client), channel->name); ircsnprintf(exjoinbuf, sizeof(exjoinbuf), ":%s!%s@%s JOIN %s %s :%s", - client->name, client->user->username, GetHost(client), channel->chname, - !isdigit(*client->user->svid) ? client->user->svid : "*", + client->name, client->user->username, GetHost(client), channel->name, + IsLoggedIn(client) ? client->user->account : "*", client->info); - new_message_special(client, recv_mtags, &mtags, ":%s JOIN %s", client->name, channel->chname); + new_message_special(client, recv_mtags, &mtags, ":%s JOIN %s", client->name, channel->name); for (i = channel->members; i; i = i->next) { Client *acptr = i->client; - if (!is_skochanop(acptr, channel) && acptr != client && MyConnect(acptr)) + if (!check_channel_access(acptr, channel, "hoaq") && acptr != client && MyConnect(acptr)) { if (HasCapabilityFast(acptr, CAP_EXTENDED_JOIN)) sendto_one(acptr, mtags, "%s", exjoinbuf); @@ -252,7 +256,7 @@ void set_user_invisible(Channel *channel, Client *client) } -int deny_all(Client *client, Channel *channel, char mode, char *para, int checkt, int what) +int delayjoin_is_ok(Client *client, Channel *channel, char mode, const char *para, int checkt, int what) { return EX_ALWAYS_DENY; } @@ -272,7 +276,7 @@ int moded_join(Client *client, Channel *channel) return 0; } -int moded_part(Client *client, Channel *channel, MessageTag *mtags, char *comment) +int moded_part(Client *client, Channel *channel, MessageTag *mtags, const char *comment) { if (channel_is_delayed(channel) || channel_is_post_delayed(channel)) clear_user_invisible(channel, client); @@ -280,7 +284,23 @@ int moded_part(Client *client, Channel *channel, MessageTag *mtags, char *commen return 0; } -int moded_chanmode(Client *client, Channel *channel, MessageTag *recv_mtags, char *modebuf, char *parabuf, time_t sendts, int samode) +int moded_quit(Client *client, MessageTag *mtags, const char *comment) +{ + Membership *membership; + Channel *channel; + + for (membership = client->user->channel; membership; membership=membership->next) + { + channel = membership->channel; + /* Identical to moded_part() */ + if (channel_is_delayed(channel) || channel_is_post_delayed(channel)) + clear_user_invisible(channel, client); + } + + return 0; +} + +int moded_chanmode(Client *client, Channel *channel, MessageTag *recv_mtags, const char *modebuf, const char *parabuf, time_t sendts, int samode) { long CAP_EXTENDED_JOIN = ClientCapabilityBit("extended-join"); @@ -317,16 +337,16 @@ int moded_chanmode(Client *client, Channel *channel, MessageTag *recv_mtags, cha if (moded_user_invisible(i->client, channel)) { MessageTag *mtags = NULL; - new_message_special(i->client, recv_mtags, &mtags, ":%s JOIN %s", i->client->name, channel->chname); + new_message_special(i->client, recv_mtags, &mtags, ":%s JOIN %s", i->client->name, channel->name); if (HasCapabilityFast(user, CAP_EXTENDED_JOIN)) { sendto_one(user, mtags, ":%s!%s@%s JOIN %s %s :%s", i->client->name, i->client->user->username, GetHost(i->client), - channel->chname, - !isdigit(*i->client->user->svid) ? i->client->user->svid : "*", + channel->name, + IsLoggedIn(i->client) ? i->client->user->account : "*", i->client->info); } else { - sendto_one(user, mtags, ":%s!%s@%s JOIN :%s", i->client->name, i->client->user->username, GetHost(i->client), channel->chname); + sendto_one(user, mtags, ":%s!%s@%s JOIN :%s", i->client->name, i->client->user->username, GetHost(i->client), channel->name); } free_message_tags(mtags); } @@ -354,8 +374,8 @@ int moded_chanmode(Client *client, Channel *channel, MessageTag *recv_mtags, cha if (moded_user_invisible(i->client, channel)) { MessageTag *mtags = NULL; - new_message_special(i->client, recv_mtags, &mtags, ":%s PART %s", i->client->name, channel->chname); - sendto_one(user, mtags, ":%s!%s@%s PART :%s", i->client->name, i->client->user->username, GetHost(i->client), channel->chname); + new_message_special(i->client, recv_mtags, &mtags, ":%s PART %s", i->client->name, channel->name); + sendto_one(user, mtags, ":%s!%s@%s PART :%s", i->client->name, i->client->user->username, GetHost(i->client), channel->name); free_message_tags(mtags); } } @@ -367,7 +387,7 @@ int moded_chanmode(Client *client, Channel *channel, MessageTag *recv_mtags, cha return 0; } -int moded_prechanmsg(Client *client, Channel *channel, MessageTag *mtags, char *text, SendType sendtype) +int moded_prechanmsg(Client *client, Channel *channel, MessageTag *mtags, const char *text, SendType sendtype) { if ((channel_is_delayed(channel) || channel_is_post_delayed(channel)) && (moded_user_invisible(client, channel))) clear_user_invisible_announce(channel, client, mtags); @@ -375,12 +395,12 @@ int moded_prechanmsg(Client *client, Channel *channel, MessageTag *mtags, char * return 0; } -char *moded_serialize(ModData *m) +const char *moded_serialize(ModData *m) { return m->i ? "1" : "0"; } -void moded_unserialize(char *str, ModData *m) +void moded_unserialize(const char *str, ModData *m) { m->i = atoi(str); } diff --git a/src/modules/chanmodes/floodprot.c b/src/modules/chanmodes/floodprot.c index a3aa3ef..148a652 100644 --- a/src/modules/chanmodes/floodprot.c +++ b/src/modules/chanmodes/floodprot.c @@ -25,17 +25,18 @@ ModuleHeader MOD_HEADER "5.0", "Channel Mode +f", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; -#define CHFLD_CTCP 0 /* c */ -#define CHFLD_JOIN 1 /* j */ -#define CHFLD_KNOCK 2 /* k */ -#define CHFLD_MSG 3 /* m */ -#define CHFLD_NICK 4 /* n */ -#define CHFLD_TEXT 5 /* t */ -#define CHFLD_REPEAT 6 /* r */ - +typedef enum Flood { + CHFLD_CTCP = 0, + CHFLD_JOIN = 1, + CHFLD_KNOCK = 2, + CHFLD_MSG = 3, + CHFLD_NICK = 4, + CHFLD_TEXT = 5, + CHFLD_REPEAT = 6, +} Flood; #define NUMFLD 7 /* 7 flood types */ /** Configuration settings */ @@ -47,7 +48,7 @@ struct { typedef struct FloodType { char letter; - int index; + Flood index; char *description; char default_action; char *actions; @@ -61,7 +62,7 @@ FloodType floodtypes[] = { { 'c', CHFLD_CTCP, "CTCPflood", 'C', "mM", 0, }, { 'j', CHFLD_JOIN, "joinflood", 'i', "R", 0, }, { 'k', CHFLD_KNOCK, "knockflood", 'K', "", 0, }, - { 'm', CHFLD_MSG, "msg/noticeflood", 'm', "M", 0, }, + { 'm', CHFLD_MSG, "msg/noticeflood", 'm', "M", 0, }, { 'n', CHFLD_NICK, "nickflood", 'N', "", 0, }, { 't', CHFLD_TEXT, "msg/noticeflood", '\0', "bd", 1, }, { 'r', CHFLD_REPEAT, "repeating", '\0', "bd", 1, }, @@ -113,7 +114,7 @@ static int timedban_available = 0; /**< Set to 1 if extbans/timedban module is l RemoveChannelModeTimer *removechannelmodetimer_list = NULL; char *floodprot_msghash_key = NULL; -#define IsFloodLimit(x) ((x)->mode.extmode & EXTMODE_FLOODLIMIT) +#define IsFloodLimit(x) ((x)->mode.mode & EXTMODE_FLOODLIMIT) /* Forward declarations */ static void init_config(void); @@ -128,24 +129,24 @@ static int do_floodprot(Channel *channel, Client *client, int what); char *channel_modef_string(ChannelFloodProtection *x, char *str); void do_floodprot_action(Channel *channel, int what); void floodprottimer_add(Channel *channel, char mflag, time_t when); -uint64_t gen_floodprot_msghash(char *text); -int cmodef_is_ok(Client *client, Channel *channel, char mode, char *para, int type, int what); -void *cmodef_put_param(void *r_in, char *param); -char *cmodef_get_param(void *r_in); -char *cmodef_conv_param(char *param_in, Client *client, Channel *channel); +uint64_t gen_floodprot_msghash(const char *text); +int cmodef_is_ok(Client *client, Channel *channel, char mode, const char *para, int type, int what); +void *cmodef_put_param(void *r_in, const char *param); +const char *cmodef_get_param(void *r_in); +const char *cmodef_conv_param(const char *param_in, Client *client, Channel *channel); void cmodef_free_param(void *r); void *cmodef_dup_struct(void *r_in); int cmodef_sjoin_check(Channel *channel, void *ourx, void *theirx); -int floodprot_join(Client *client, Channel *channel, MessageTag *mtags, char *parv[]); +int floodprot_join(Client *client, Channel *channel, MessageTag *mtags); EVENT(modef_event); int cmodef_channel_destroy(Channel *channel, int *should_destroy); -int floodprot_can_send_to_channel(Client *client, Channel *channel, Membership *lp, char **msg, char **errmsg, SendType sendtype); -int floodprot_post_chanmsg(Client *client, Channel *channel, int sendflags, int prefix, char *target, MessageTag *mtags, char *text, SendType sendtype); -int floodprot_knock(Client *client, Channel *channel, MessageTag *mtags, char *comment); -int floodprot_nickchange(Client *client, MessageTag *mtags, char *oldnick); +int floodprot_can_send_to_channel(Client *client, Channel *channel, Membership *lp, const char **msg, const char **errmsg, SendType sendtype); +int floodprot_post_chanmsg(Client *client, Channel *channel, int sendflags, const char *prefix, const char *target, MessageTag *mtags, const char *text, SendType sendtype); +int floodprot_knock(Client *client, Channel *channel, MessageTag *mtags, const char *comment); +int floodprot_nickchange(Client *client, MessageTag *mtags, const char *oldnick); int floodprot_chanmode_del(Channel *channel, int m); void memberflood_free(ModData *md); -int floodprot_stats(Client *client, char *flag); +int floodprot_stats(Client *client, const char *flag); void floodprot_free_removechannelmodetimer_list(ModData *m); void floodprot_free_msghash_key(ModData *m); @@ -165,7 +166,7 @@ MOD_INIT() memset(&creq, 0, sizeof(creq)); creq.paracount = 1; creq.is_ok = cmodef_is_ok; - creq.flag = 'f'; + creq.letter = 'f'; creq.unset_with_param = 1; /* ah yeah, +f is special! */ creq.put_param = cmodef_put_param; creq.get_param = cmodef_get_param; @@ -244,53 +245,53 @@ int floodprot_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) if (type != CONFIG_SET) return 0; - if (!strcmp(ce->ce_varname, "modef-default-unsettime")) + if (!strcmp(ce->name, "modef-default-unsettime")) { - if (!ce->ce_vardata) + if (!ce->value) { - config_error_empty(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, - "set", ce->ce_varname); + config_error_empty(ce->file->filename, ce->line_number, + "set", ce->name); errors++; } else { - int v = atoi(ce->ce_vardata); + int v = atoi(ce->value); if ((v <= 0) || (v > 255)) { config_error("%s:%i: set::modef-default-unsettime: value '%d' out of range (should be 1-255)", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum, v); + ce->file->filename, ce->line_number, v); errors++; } } } else - if (!strcmp(ce->ce_varname, "modef-max-unsettime")) + if (!strcmp(ce->name, "modef-max-unsettime")) { - if (!ce->ce_vardata) + if (!ce->value) { - config_error_empty(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, - "set", ce->ce_varname); + config_error_empty(ce->file->filename, ce->line_number, + "set", ce->name); errors++; } else { - int v = atoi(ce->ce_vardata); + int v = atoi(ce->value); if ((v <= 0) || (v > 255)) { config_error("%s:%i: set::modef-max-unsettime: value '%d' out of range (should be 1-255)", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum, v); + ce->file->filename, ce->line_number, v); errors++; } } } else - if (!strcmp(ce->ce_varname, "modef-boot-delay")) + if (!strcmp(ce->name, "modef-boot-delay")) { - if (!ce->ce_vardata) + if (!ce->value) { - config_error_empty(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, - "set", ce->ce_varname); + config_error_empty(ce->file->filename, ce->line_number, + "set", ce->name); errors++; } else { - long v = config_checkval(ce->ce_vardata, CFG_TIME); + long v = config_checkval(ce->value, CFG_TIME); if ((v < 0) || (v > 600)) { config_error("%s:%i: set::modef-boot-delay: value '%ld' out of range (should be 0-600)", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum, v); + ce->file->filename, ce->line_number, v); errors++; } } @@ -309,12 +310,12 @@ int floodprot_config_run(ConfigFile *cf, ConfigEntry *ce, int type) if (type != CONFIG_SET) return 0; - if (!strcmp(ce->ce_varname, "modef-default-unsettime")) - cfg.modef_default_unsettime = (unsigned char)atoi(ce->ce_vardata); - else if (!strcmp(ce->ce_varname, "modef-max-unsettime")) - cfg.modef_max_unsettime = (unsigned char)atoi(ce->ce_vardata); - else if (!strcmp(ce->ce_varname, "modef-boot-delay")) - cfg.modef_boot_delay = config_checkval(ce->ce_vardata, CFG_TIME); + if (!strcmp(ce->name, "modef-default-unsettime")) + cfg.modef_default_unsettime = (unsigned char)atoi(ce->value); + else if (!strcmp(ce->name, "modef-max-unsettime")) + cfg.modef_max_unsettime = (unsigned char)atoi(ce->value); + else if (!strcmp(ce->name, "modef-boot-delay")) + cfg.modef_boot_delay = config_checkval(ce->value, CFG_TIME); else return 0; /* not handled by us */ @@ -331,7 +332,7 @@ FloodType *find_floodprot_by_letter(char c) return NULL; } -FloodType *find_floodprot_by_index(int index) +FloodType *find_floodprot_by_index(Flood index) { int i; for (i=0; i < ARRAY_SIZEOF(floodtypes); i++) @@ -341,11 +342,11 @@ FloodType *find_floodprot_by_index(int index) return NULL; } -int cmodef_is_ok(Client *client, Channel *channel, char mode, char *param, int type, int what) +int cmodef_is_ok(Client *client, Channel *channel, char mode, const char *param, int type, int what) { if ((type == EXCHK_ACCESS) || (type == EXCHK_ACCESS_ERR)) { - if (IsUser(client) && is_chan_op(client, channel)) + if (IsUser(client) && check_channel_access(client, channel, "oaq")) return EX_ALLOW; if (type == EXCHK_ACCESS_ERR) /* can only be due to being halfop */ sendnumeric(client, ERR_NOTFORHALFOPS, 'f'); @@ -359,7 +360,7 @@ int cmodef_is_ok(Client *client, Channel *channel, char mode, char *param, int t unsigned short warnings = 0, breakit; unsigned char r; FloodType *floodtype; - int index; + Flood index; memset(&newf, 0, sizeof(newf)); @@ -467,7 +468,7 @@ invalidsyntax: return EX_DENY; } -void *cmodef_put_param(void *fld_in, char *param) +void *cmodef_put_param(void *fld_in, const char *param) { ChannelFloodProtection *fld = (ChannelFloodProtection *)fld_in; char xbuf[256], c, a, *p, *p2, *x = xbuf+1; @@ -475,7 +476,7 @@ void *cmodef_put_param(void *fld_in, char *param) unsigned short breakit; unsigned char r; FloodType *floodtype; - int index; + Flood index; strlcpy(xbuf, param, sizeof(xbuf)); @@ -581,7 +582,7 @@ fail_cmodef_put_param: return fld; /* FAIL */ } -char *cmodef_get_param(void *r_in) +const char *cmodef_get_param(void *r_in) { ChannelFloodProtection *r = (ChannelFloodProtection *)r_in; static char retbuf[512]; @@ -596,7 +597,7 @@ char *cmodef_get_param(void *r_in) /** Convert parameter to something proper. * NOTE: client may be NULL if called for e.g. set::modes-on-join */ -char *cmodef_conv_param(char *param_in, Client *client, Channel *channel) +const char *cmodef_conv_param(const char *param_in, Client *client, Channel *channel) { static char retbuf[256]; char param[256]; @@ -607,7 +608,7 @@ char *cmodef_conv_param(char *param_in, Client *client, Channel *channel) unsigned short breakit; unsigned char r; FloodType *floodtype; - int index; + Flood index; memset(&newf, 0, sizeof(newf)); @@ -736,7 +737,7 @@ int cmodef_sjoin_check(Channel *channel, void *ourx, void *theirx) return EXSJ_MERGE; } -int floodprot_join(Client *client, Channel *channel, MessageTag *mtags, char *parv[]) +int floodprot_join(Client *client, Channel *channel, MessageTag *mtags) { /* I'll explain this only once: * 1. if channel is +f @@ -749,8 +750,8 @@ int floodprot_join(Client *client, Channel *channel, MessageTag *mtags, char *pa * from all servers. */ if (IsFloodLimit(channel) && - (MyUser(client) || client->srvptr->serv->flags.synced) && - (client->srvptr->serv->boottime && (TStime() - client->srvptr->serv->boottime >= MODEF_BOOT_DELAY)) && + (MyUser(client) || client->uplink->server->flags.synced) && + (client->uplink->server->boottime && (TStime() - client->uplink->server->boottime >= MODEF_BOOT_DELAY)) && !IsULine(client)) { do_floodprot(channel, client, CHFLD_JOIN); @@ -818,7 +819,7 @@ char *channel_modef_string(ChannelFloodProtection *x, char *retbuf) return retbuf; } -int floodprot_can_send_to_channel(Client *client, Channel *channel, Membership *lp, char **msg, char **errmsg, SendType sendtype) +int floodprot_can_send_to_channel(Client *client, Channel *channel, Membership *lp, const char **msg, const char **errmsg, SendType sendtype) { Membership *mb; ChannelFloodProtection *chp; @@ -834,7 +835,7 @@ int floodprot_can_send_to_channel(Client *client, Channel *channel, Membership * if (sendtype == SEND_TYPE_TAGMSG) return 0; // TODO: some TAGMSG specific limit? (1 of 2) - if (ValidatePermissionsForPath("channel:override:flood",client,NULL,channel,NULL) || !IsFloodLimit(channel) || is_skochanop(client, channel)) + if (ValidatePermissionsForPath("channel:override:flood",client,NULL,channel,NULL) || !IsFloodLimit(channel) || check_channel_access(client, channel, "hoaq")) return HOOK_CONTINUE; if (!(mb = find_membership_link(client->user->channel, channel))) @@ -921,16 +922,21 @@ int floodprot_can_send_to_channel(Client *client, Channel *channel, Membership * { /* Ban the user */ if (timedban_available && (chp->remove_after[flood_type] > 0)) - snprintf(mask, sizeof(mask), "~t:%d:*!*@%s", chp->remove_after[flood_type], GetHost(client)); - else + { + if (iConf.named_extended_bans) + snprintf(mask, sizeof(mask), "~time:%d:*!*@%s", chp->remove_after[flood_type], GetHost(client)); + else + snprintf(mask, sizeof(mask), "~t:%d:*!*@%s", chp->remove_after[flood_type], GetHost(client)); + } else { snprintf(mask, sizeof(mask), "*!*@%s", GetHost(client)); + } if (add_listmode(&channel->banlist, &me, channel, mask) == 0) { mtags = NULL; new_message(&me, NULL, &mtags); - sendto_server(NULL, 0, 0, mtags, ":%s MODE %s +b %s 0", me.id, channel->chname, mask); + sendto_server(NULL, 0, 0, mtags, ":%s MODE %s +b %s 0", me.id, channel->name, mask); sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, - ":%s MODE %s +b %s", me.name, channel->chname, mask); + ":%s MODE %s +b %s", me.name, channel->name, mask); free_message_tags(mtags); } /* else.. ban list is full */ } @@ -942,9 +948,9 @@ int floodprot_can_send_to_channel(Client *client, Channel *channel, Membership * return HOOK_CONTINUE; } -int floodprot_post_chanmsg(Client *client, Channel *channel, int sendflags, int prefix, char *target, MessageTag *mtags, char *text, SendType sendtype) +int floodprot_post_chanmsg(Client *client, Channel *channel, int sendflags, const char *prefix, const char *target, MessageTag *mtags, const char *text, SendType sendtype) { - if (!IsFloodLimit(channel) || is_skochanop(client, channel) || IsULine(client)) + if (!IsFloodLimit(channel) || check_channel_access(client, channel, "hoaq") || IsULine(client)) return 0; if (sendtype == SEND_TYPE_TAGMSG) @@ -960,14 +966,14 @@ int floodprot_post_chanmsg(Client *client, Channel *channel, int sendflags, int return 0; } -int floodprot_knock(Client *client, Channel *channel, MessageTag *mtags, char *comment) +int floodprot_knock(Client *client, Channel *channel, MessageTag *mtags, const char *comment) { if (IsFloodLimit(channel) && !IsULine(client)) do_floodprot(channel, client, CHFLD_KNOCK); return 0; } -int floodprot_nickchange(Client *client, MessageTag *mtags, char *oldnick) +int floodprot_nickchange(Client *client, MessageTag *mtags, const char *oldnick) { Membership *mp; @@ -977,8 +983,7 @@ int floodprot_nickchange(Client *client, MessageTag *mtags, char *oldnick) for (mp = client->user->channel; mp; mp = mp->next) { Channel *channel = mp->channel; - if (channel && IsFloodLimit(channel) && - !(mp->flags & (CHFL_CHANOP|CHFL_VOICE|CHFL_CHANOWNER|CHFL_HALFOP|CHFL_CHANADMIN))) + if (channel && IsFloodLimit(channel) && !check_channel_access_membership(mp, "vhoaq")) { do_floodprot(channel, client, CHFLD_NICK); } @@ -1080,8 +1085,10 @@ void floodprottimer_add(Channel *channel, char mflag, time_t when) { if (strlen(chp->timers_running)+1 >= sizeof(chp->timers_running)) { - sendto_realops_and_log("floodprottimer_add: too many timers running for %s (%s)!!!", - channel->chname, chp->timers_running); + unreal_log(ULOG_WARNING, "flood", "BUG_FLOODPROTTIMER_ADD", NULL, + "[BUG] floodprottimer_add: too many timers running for $channel ($timers_running)", + log_data_channel("channel", channel), + log_data_string("timers_running", chp->timers_running)); return; } strccat(chp->timers_running, mflag); /* bounds already checked ^^ */ @@ -1137,39 +1144,24 @@ EVENT(modef_event) if (e->when <= now) { /* Remove chanmode... */ - long mode = 0; - Cmode_t extmode = 0; -#ifdef NEWFLDDBG - sendto_realops("modef_event: chan %s mode -%c EXPIRED", e->channel->chname, e->m); -#endif - mode = get_mode_bitbychar(e->m); - if (mode == 0) - extmode = get_extmode_bitbychar(e->m); + Cmode_t extmode = get_extmode_bitbychar(e->m); - if ((mode && (e->channel->mode.mode & mode)) || - (extmode && (e->channel->mode.extmode & extmode))) + if (extmode && (e->channel->mode.mode & extmode)) { MessageTag *mtags = NULL; new_message(&me, NULL, &mtags); - sendto_server(NULL, 0, 0, mtags, ":%s MODE %s -%c 0", me.id, e->channel->chname, e->m); + sendto_server(NULL, 0, 0, mtags, ":%s MODE %s -%c 0", me.id, e->channel->name, e->m); sendto_channel(e->channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s -%c", - me.name, e->channel->chname, e->m); + me.name, e->channel->name, e->m); free_message_tags(mtags); - - e->channel->mode.mode &= ~mode; - e->channel->mode.extmode &= ~extmode; + e->channel->mode.mode &= ~extmode; } /* And delete... */ DelListItem(e, removechannelmodetimer_list); safe_free(e); - } else { -#ifdef NEWFLDDBG - sendto_realops("modef_event: chan %s mode -%c about %d seconds", - e->channel->chname, e->m, e->when - now); -#endif } } } @@ -1220,7 +1212,6 @@ int do_floodprot(Channel *channel, Client *client, int what) void do_floodprot_action(Channel *channel, int what) { char m; - int mode = 0; Cmode_t extmode = 0; ChannelFloodProtection *chp = (ChannelFloodProtection *)GETPARASTRUCT(channel, 'f'); FloodType *floodtype = find_floodprot_by_index(what); @@ -1240,15 +1231,11 @@ void do_floodprot_action(Channel *channel, int what) if (chp->action[what] == 'd') return; - mode = get_mode_bitbychar(m); - if (mode == 0) - extmode = get_extmode_bitbychar(m); - - if (!mode && !extmode) + extmode = get_extmode_bitbychar(m); + if (!extmode) return; - if (!(mode && (channel->mode.mode & mode)) && - !(extmode && (channel->mode.extmode & extmode))) + if (!(extmode && (channel->mode.mode & extmode))) { char comment[512], target[CHANNELLEN + 8]; MessageTag *mtags; @@ -1258,8 +1245,8 @@ void do_floodprot_action(Channel *channel, int what) new_message(&me, NULL, &mtags); ircsnprintf(comment, sizeof(comment), "*** Channel %s detected (limit is %d per %d seconds), setting mode +%c", text, chp->limit[what], chp->per, m); - ircsnprintf(target, sizeof(target), "%%%s", channel->chname); - sendto_channel(channel, &me, NULL, PREFIX_HALFOP|PREFIX_OP|PREFIX_ADMIN|PREFIX_OWNER, + ircsnprintf(target, sizeof(target), "%%%s", channel->name); + sendto_channel(channel, &me, NULL, "ho", 0, SEND_ALL, mtags, ":%s NOTICE %s :%s", me.name, target, comment); free_message_tags(mtags); @@ -1267,13 +1254,12 @@ void do_floodprot_action(Channel *channel, int what) /* Then the MODE broadcast */ mtags = NULL; new_message(&me, NULL, &mtags); - sendto_server(NULL, 0, 0, mtags, ":%s MODE %s +%c 0", me.id, channel->chname, m); - sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s +%c", me.name, channel->chname, m); + sendto_server(NULL, 0, 0, mtags, ":%s MODE %s +%c 0", me.id, channel->name, m); + sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s +%c", me.name, channel->name, m); free_message_tags(mtags); /* Actually set the mode internally */ - channel->mode.mode |= mode; - channel->mode.extmode |= extmode; + channel->mode.mode |= extmode; /* Add remove-chanmode timer */ if (chp->remove_after[what]) @@ -1286,7 +1272,7 @@ void do_floodprot_action(Channel *channel, int what) } } -uint64_t gen_floodprot_msghash(char *text) +uint64_t gen_floodprot_msghash(const char *text) { int i; int is_ctcp, is_action; @@ -1312,10 +1298,10 @@ uint64_t gen_floodprot_msghash(char *text) if (is_ctcp || is_action) { // Remove the \001 chars around the message - if((len = strlen(plaintext)) && plaintext[len - 1] == '\001') + if ((len = strlen(plaintext)) && plaintext[len - 1] == '\001') plaintext[len - 1] = '\0'; plaintext++; - if(is_action) + if (is_action) plaintext += 7; } @@ -1345,7 +1331,7 @@ void memberflood_free(ModData *md) safe_free(md->ptr); } -int floodprot_stats(Client *client, char *flag) +int floodprot_stats(Client *client, const char *flag) { if (*flag != 'S') return 0; diff --git a/src/modules/chanmodes/halfop.c b/src/modules/chanmodes/halfop.c new file mode 100644 index 0000000..2e2a6ba --- /dev/null +++ b/src/modules/chanmodes/halfop.c @@ -0,0 +1,88 @@ +/* + * Channel Mode +h + * (C) Copyright 2021 Syzop and the UnrealIRCd team + * + * This program is free 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 1, or (at your option) + * any later version. + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "unrealircd.h" + +ModuleHeader MOD_HEADER + = { + "chanmodes/halfop", + "6.0", + "Channel Mode +h", + "UnrealIRCd Team", + "unrealircd-6", + }; + +/* Forward declarations */ +int cmode_halfop_is_ok(Client *client, Channel *channel, char mode, const char *para, int type, int what); + +MOD_INIT() +{ + CmodeInfo creq; + ModDataInfo mreq; + + MARK_AS_OFFICIAL_MODULE(modinfo); + + memset(&creq, 0, sizeof(creq)); + creq.paracount = 1; + creq.is_ok = cmode_halfop_is_ok; + creq.letter = 'h'; + creq.prefix = '%'; + creq.sjoin_prefix = '%'; + creq.rank = RANK_HALFOP; + creq.unset_with_param = 1; + creq.type = CMODE_MEMBER; + CmodeAdd(modinfo->handle, creq, NULL); + + return MOD_SUCCESS; +} + +MOD_LOAD() +{ + return MOD_SUCCESS; +} + +MOD_UNLOAD() +{ + return MOD_SUCCESS; +} + +int cmode_halfop_is_ok(Client *client, Channel *channel, char mode, const char *param, int type, int what) +{ + if ((type == EXCHK_ACCESS) || (type == EXCHK_ACCESS_ERR)) + { + Client *target = find_user(param, NULL); + + if ((what == MODE_DEL) && (target == client)) + { + /* User may always remove their own modes */ + return EX_ALLOW; + } + if ((what == MODE_ADD) && check_channel_access(client, channel, "hoaq")) + { + /* Permitted for +hoaq */ + return EX_ALLOW; + } + if (type == EXCHK_ACCESS_ERR) + sendnumeric(client, ERR_CHANOPRIVSNEEDED, channel->name); + return EX_DENY; + } + + /* fallthrough -- should not be used */ + return EX_DENY; +} diff --git a/src/modules/chanmodes/history.c b/src/modules/chanmodes/history.c index 124a25e..9cdc73e 100644 --- a/src/modules/chanmodes/history.c +++ b/src/modules/chanmodes/history.c @@ -11,7 +11,7 @@ ModuleHeader MOD_HEADER "1.0", "Channel Mode +H", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; typedef struct ConfigHistoryExt ConfigHistoryExt; @@ -37,25 +37,25 @@ Cmode_t EXTMODE_HISTORY = 0L; static cfgstruct cfg; static cfgstruct test; -#define HistoryEnabled(channel) (channel->mode.extmode & EXTMODE_HISTORY) +#define HistoryEnabled(channel) (channel->mode.mode & EXTMODE_HISTORY) /* Forward declarations */ static void init_config(cfgstruct *cfg); int history_config_test(ConfigFile *, ConfigEntry *, int, int *); int history_config_posttest(int *); int history_config_run(ConfigFile *, ConfigEntry *, int); -int history_chanmode_change(Client *client, Channel *channel, MessageTag *mtags, char *modebuf, char *parabuf, time_t sendts, int samode); +int history_chanmode_change(Client *client, Channel *channel, MessageTag *mtags, const char *modebuf, const char *parabuf, time_t sendts, int samode, int *destroy_channel); static int compare_history_modes(HistoryChanMode *a, HistoryChanMode *b); -int history_chanmode_is_ok(Client *client, Channel *channel, char mode, char *para, int type, int what); -void *history_chanmode_put_param(void *r_in, char *param); -char *history_chanmode_get_param(void *r_in); -char *history_chanmode_conv_param(char *param, Client *client, Channel *channel); +int history_chanmode_is_ok(Client *client, Channel *channel, char mode, const char *para, int type, int what); +void *history_chanmode_put_param(void *r_in, const char *param); +const char *history_chanmode_get_param(void *r_in); +const char *history_chanmode_conv_param(const char *param, Client *client, Channel *channel); void history_chanmode_free_param(void *r); void *history_chanmode_dup_struct(void *r_in); int history_chanmode_sjoin_check(Channel *channel, void *ourx, void *theirx); int history_channel_destroy(Channel *channel, int *should_destroy); -int history_chanmsg(Client *client, Channel *channel, int sendflags, int prefix, char *target, MessageTag *mtags, char *text, SendType sendtype); -int history_join(Client *client, Channel *channel, MessageTag *mtags, char *parv[]); +int history_chanmsg(Client *client, Channel *channel, int sendflags, const char *prefix, const char *target, MessageTag *mtags, const char *text, SendType sendtype); +int history_join(Client *client, Channel *channel, MessageTag *mtags); CMD_OVERRIDE_FUNC(override_mode); MOD_TEST() @@ -77,7 +77,7 @@ MOD_INIT() memset(&creq, 0, sizeof(creq)); creq.paracount = 1; creq.is_ok = history_chanmode_is_ok; - creq.flag = 'H'; + creq.letter = 'H'; creq.put_param = history_chanmode_put_param; creq.get_param = history_chanmode_get_param; creq.conv_param = history_chanmode_conv_param; @@ -99,11 +99,11 @@ MOD_INIT() MOD_LOAD() { - CommandOverrideAdd(modinfo->handle, "MODE", override_mode); - CommandOverrideAdd(modinfo->handle, "SVSMODE", override_mode); - CommandOverrideAdd(modinfo->handle, "SVS2MODE", override_mode); - CommandOverrideAdd(modinfo->handle, "SAMODE", override_mode); - CommandOverrideAdd(modinfo->handle, "SJOIN", override_mode); + CommandOverrideAdd(modinfo->handle, "MODE", 0, override_mode); + CommandOverrideAdd(modinfo->handle, "SVSMODE", 0, override_mode); + CommandOverrideAdd(modinfo->handle, "SVS2MODE", 0, override_mode); + CommandOverrideAdd(modinfo->handle, "SAMODE", 0, override_mode); + CommandOverrideAdd(modinfo->handle, "SJOIN", 0, override_mode); return MOD_SUCCESS; } @@ -124,8 +124,6 @@ static void init_config(cfgstruct *cfg) cfg->max_storage_per_channel_registered.time = 86400*31; } -#define CheckNull(x) if ((!(x)->ce_vardata) || (!(*((x)->ce_vardata)))) { config_error("%s:%i: missing parameter", (x)->ce_fileptr->cf_filename, (x)->ce_varlinenum); errors++; continue; } - int history_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) { int errors = 0; @@ -134,140 +132,140 @@ int history_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) long on_join_time=0L, maximum_storage_time_registered=0L, maximum_storage_time_unregistered=0L; /* We only care about set::history */ - if ((type != CONFIG_SET) || strcmp(ce->ce_varname, "history")) + if ((type != CONFIG_SET) || strcmp(ce->name, "history")) return 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "channel")) + if (!strcmp(cep->name, "channel")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { - if (!strcmp(cepp->ce_varname, "playback-on-join")) + if (!strcmp(cepp->name, "playback-on-join")) { - for (cep4 = cepp->ce_entries; cep4; cep4 = cep4->ce_next) + for (cep4 = cepp->items; cep4; cep4 = cep4->next) { - if (!strcmp(cep4->ce_varname, "lines")) + if (!strcmp(cep4->name, "lines")) { int v; CheckNull(cep4); - v = atoi(cep4->ce_vardata); + v = atoi(cep4->value); if ((v < 0) || (v > 1000)) { config_error("%s:%i: set::history::channel::playback-on-join::lines must be between 0 and 1000. " "Recommended values are 10-50. Got: %d.", - cep4->ce_fileptr->cf_filename, cep4->ce_varlinenum, v); + cep4->file->filename, cep4->line_number, v); errors++; continue; } test.playback_on_join.lines = v; } else - if (!strcmp(cep4->ce_varname, "time")) + if (!strcmp(cep4->name, "time")) { long v; CheckNull(cep4); - v = config_checkval(cep4->ce_vardata, CFG_TIME); + v = config_checkval(cep4->value, CFG_TIME); if (v < 0) { config_error("%s:%i: set::history::channel::playback-on-join::time must be zero or more.", - cep4->ce_fileptr->cf_filename, cep4->ce_varlinenum); + cep4->file->filename, cep4->line_number); errors++; continue; } test.playback_on_join.time = v; } else { - config_error_unknown(cep4->ce_fileptr->cf_filename, - cep4->ce_varlinenum, "set::history::channel::playback-on-join", cep4->ce_varname); + config_error_unknown(cep4->file->filename, + cep4->line_number, "set::history::channel::playback-on-join", cep4->name); errors++; } } } else - if (!strcmp(cepp->ce_varname, "max-storage-per-channel")) + if (!strcmp(cepp->name, "max-storage-per-channel")) { - for (cep4 = cepp->ce_entries; cep4; cep4 = cep4->ce_next) + for (cep4 = cepp->items; cep4; cep4 = cep4->next) { - if (!strcmp(cep4->ce_varname, "registered")) + if (!strcmp(cep4->name, "registered")) { - for (cep5 = cep4->ce_entries; cep5; cep5 = cep5->ce_next) + for (cep5 = cep4->items; cep5; cep5 = cep5->next) { - if (!strcmp(cep5->ce_varname, "lines")) + if (!strcmp(cep5->name, "lines")) { int v; CheckNull(cep5); - v = atoi(cep5->ce_vardata); + v = atoi(cep5->value); if (v < 1) { config_error("%s:%i: set::history::channel::max-storage-per-channel::registered::lines must be a positive number.", - cep5->ce_fileptr->cf_filename, cep5->ce_varlinenum); + cep5->file->filename, cep5->line_number); errors++; continue; } test.max_storage_per_channel_registered.lines = v; } else - if (!strcmp(cep5->ce_varname, "time")) + if (!strcmp(cep5->name, "time")) { long v; CheckNull(cep5); - v = config_checkval(cep5->ce_vardata, CFG_TIME); + v = config_checkval(cep5->value, CFG_TIME); if (v < 1) { config_error("%s:%i: set::history::channel::max-storage-per-channel::registered::time must be a positive number.", - cep5->ce_fileptr->cf_filename, cep5->ce_varlinenum); + cep5->file->filename, cep5->line_number); errors++; continue; } test.max_storage_per_channel_registered.time = v; } else { - config_error_unknown(cep5->ce_fileptr->cf_filename, - cep5->ce_varlinenum, "set::history::channel::max-storage-per-channel::registered", cep5->ce_varname); + config_error_unknown(cep5->file->filename, + cep5->line_number, "set::history::channel::max-storage-per-channel::registered", cep5->name); errors++; } } } else - if (!strcmp(cep4->ce_varname, "unregistered")) + if (!strcmp(cep4->name, "unregistered")) { - for (cep5 = cep4->ce_entries; cep5; cep5 = cep5->ce_next) + for (cep5 = cep4->items; cep5; cep5 = cep5->next) { - if (!strcmp(cep5->ce_varname, "lines")) + if (!strcmp(cep5->name, "lines")) { int v; CheckNull(cep5); - v = atoi(cep5->ce_vardata); + v = atoi(cep5->value); if (v < 1) { config_error("%s:%i: set::history::channel::max-storage-per-channel::unregistered::lines must be a positive number.", - cep5->ce_fileptr->cf_filename, cep5->ce_varlinenum); + cep5->file->filename, cep5->line_number); errors++; continue; } test.max_storage_per_channel_unregistered.lines = v; } else - if (!strcmp(cep5->ce_varname, "time")) + if (!strcmp(cep5->name, "time")) { long v; CheckNull(cep5); - v = config_checkval(cep5->ce_vardata, CFG_TIME); + v = config_checkval(cep5->value, CFG_TIME); if (v < 1) { config_error("%s:%i: set::history::channel::max-storage-per-channel::unregistered::time must be a positive number.", - cep5->ce_fileptr->cf_filename, cep5->ce_varlinenum); + cep5->file->filename, cep5->line_number); errors++; continue; } test.max_storage_per_channel_unregistered.time = v; } else { - config_error_unknown(cep5->ce_fileptr->cf_filename, - cep5->ce_varlinenum, "set::history::channel::max-storage-per-channel::unregistered", cep5->ce_varname); + config_error_unknown(cep5->file->filename, + cep5->line_number, "set::history::channel::max-storage-per-channel::unregistered", cep5->name); errors++; } } } else { - config_error_unknown(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "set::history::max-storage-per-channel", cep->ce_varname); + config_error_unknown(cep->file->filename, + cep->line_number, "set::history::max-storage-per-channel", cep->name); errors++; } } @@ -304,15 +302,15 @@ int history_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) } if (!used) { - config_error_unknown(cepp->ce_fileptr->cf_filename, - cepp->ce_varlinenum, "set::history::channel", cepp->ce_varname); + config_error_unknown(cepp->file->filename, + cepp->line_number, "set::history::channel", cepp->name); errors++; } } } } else { - config_error_unknown(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "set::history", cep->ce_varname); + config_error_unknown(cep->file->filename, + cep->line_number, "set::history", cep->name); errors++; } } @@ -337,58 +335,58 @@ int history_config_run(ConfigFile *cf, ConfigEntry *ce, int type) { ConfigEntry *cep, *cepp, *cep4, *cep5; - if ((type != CONFIG_SET) || strcmp(ce->ce_varname, "history")) + if ((type != CONFIG_SET) || strcmp(ce->name, "history")) return 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "channel")) + if (!strcmp(cep->name, "channel")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { - if (!strcmp(cepp->ce_varname, "playback-on-join")) + if (!strcmp(cepp->name, "playback-on-join")) { - for (cep4 = cepp->ce_entries; cep4; cep4 = cep4->ce_next) + for (cep4 = cepp->items; cep4; cep4 = cep4->next) { - if (!strcmp(cep4->ce_varname, "lines")) + if (!strcmp(cep4->name, "lines")) { - cfg.playback_on_join.lines = atoi(cep4->ce_vardata); + cfg.playback_on_join.lines = atoi(cep4->value); } else - if (!strcmp(cep4->ce_varname, "time")) + if (!strcmp(cep4->name, "time")) { - cfg.playback_on_join.time = config_checkval(cep4->ce_vardata, CFG_TIME); + cfg.playback_on_join.time = config_checkval(cep4->value, CFG_TIME); } } } else - if (!strcmp(cepp->ce_varname, "max-storage-per-channel")) + if (!strcmp(cepp->name, "max-storage-per-channel")) { - for (cep4 = cepp->ce_entries; cep4; cep4 = cep4->ce_next) + for (cep4 = cepp->items; cep4; cep4 = cep4->next) { - if (!strcmp(cep4->ce_varname, "registered")) + if (!strcmp(cep4->name, "registered")) { - for (cep5 = cep4->ce_entries; cep5; cep5 = cep5->ce_next) + for (cep5 = cep4->items; cep5; cep5 = cep5->next) { - if (!strcmp(cep5->ce_varname, "lines")) + if (!strcmp(cep5->name, "lines")) { - cfg.max_storage_per_channel_registered.lines = atoi(cep5->ce_vardata); + cfg.max_storage_per_channel_registered.lines = atoi(cep5->value); } else - if (!strcmp(cep5->ce_varname, "time")) + if (!strcmp(cep5->name, "time")) { - cfg.max_storage_per_channel_registered.time = config_checkval(cep5->ce_vardata, CFG_TIME); + cfg.max_storage_per_channel_registered.time = config_checkval(cep5->value, CFG_TIME); } } } else - if (!strcmp(cep4->ce_varname, "unregistered")) + if (!strcmp(cep4->name, "unregistered")) { - for (cep5 = cep4->ce_entries; cep5; cep5 = cep5->ce_next) + for (cep5 = cep4->items; cep5; cep5 = cep5->next) { - if (!strcmp(cep5->ce_varname, "lines")) + if (!strcmp(cep5->name, "lines")) { - cfg.max_storage_per_channel_unregistered.lines = atoi(cep5->ce_vardata); + cfg.max_storage_per_channel_unregistered.lines = atoi(cep5->value); } else - if (!strcmp(cep5->ce_varname, "time")) + if (!strcmp(cep5->name, "time")) { - cfg.max_storage_per_channel_unregistered.time = config_checkval(cep5->ce_vardata, CFG_TIME); + cfg.max_storage_per_channel_unregistered.time = config_checkval(cep5->value, CFG_TIME); } } } @@ -415,7 +413,7 @@ int history_config_run(ConfigFile *cf, ConfigEntry *ce, int type) * @param lines: The number of lines (the X in +H X:Y) * @param t: The time value (the Y in +H X:Y) */ -int history_parse_chanmode(Channel *channel, char *param, int *lines, long *t) +int history_parse_chanmode(Channel *channel, const char *param, int *lines, long *t) { char buf[64], *p, *q; char contains_non_digit = 0; @@ -479,11 +477,11 @@ int history_parse_chanmode(Channel *channel, char *param, int *lines, long *t) * Does the user have rights to add/remove this channel mode? * Is the supplied mode parameter ok? */ -int history_chanmode_is_ok(Client *client, Channel *channel, char mode, char *param, int type, int what) +int history_chanmode_is_ok(Client *client, Channel *channel, char mode, const char *param, int type, int what) { if ((type == EXCHK_ACCESS) || (type == EXCHK_ACCESS_ERR)) { - if (IsUser(client) && is_chan_op(client, channel)) + if (IsUser(client) && check_channel_access(client, channel, "oaq")) return EX_ALLOW; if (type == EXCHK_ACCESS_ERR) /* can only be due to being halfop */ sendnumeric(client, ERR_NOTFORHALFOPS, 'H'); @@ -529,7 +527,7 @@ static void history_chanmode_helper(char *buf, size_t bufsize, int lines, long t /** Convert channel parameter to something proper. * NOTE: client may be NULL if called for e.g. set::modes-playback-on-join */ -char *history_chanmode_conv_param(char *param, Client *client, Channel *channel) +const char *history_chanmode_conv_param(const char *param, Client *client, Channel *channel) { static char buf[64]; int lines = 0; @@ -543,7 +541,7 @@ char *history_chanmode_conv_param(char *param, Client *client, Channel *channel) } /** Store the +H x:y channel mode */ -void *history_chanmode_put_param(void *mode_in, char *param) +void *history_chanmode_put_param(void *mode_in, const char *param) { HistoryChanMode *h = (HistoryChanMode *)mode_in; int lines = 0; @@ -565,7 +563,7 @@ void *history_chanmode_put_param(void *mode_in, char *param) } /** Retrieve the +H settings (the X:Y string) */ -char *history_chanmode_get_param(void *h_in) +const char *history_chanmode_get_param(void *h_in) { HistoryChanMode *h = (HistoryChanMode *)h_in; static char buf[64]; @@ -612,7 +610,7 @@ int history_chanmode_sjoin_check(Channel *channel, void *ourx, void *theirx) } /** On channel mode change, communicate the +H limits to the history backend layer */ -int history_chanmode_change(Client *client, Channel *channel, MessageTag *mtags, char *modebuf, char *parabuf, time_t sendts, int samode) +int history_chanmode_change(Client *client, Channel *channel, MessageTag *mtags, const char *modebuf, const char *parabuf, time_t sendts, int samode, int *destroy_channel) { HistoryChanMode *settings; @@ -623,9 +621,9 @@ int history_chanmode_change(Client *client, Channel *channel, MessageTag *mtags, /* If so, grab the settings, and communicate them */ settings = (HistoryChanMode *)GETPARASTRUCT(channel, 'H'); if (settings) - history_set_limit(channel->chname, settings->max_lines, settings->max_time); + history_set_limit(channel->name, settings->max_lines, settings->max_time); else - history_destroy(channel->chname); + history_destroy(channel->name); return 0; } @@ -636,12 +634,12 @@ int history_channel_destroy(Channel *channel, int *should_destroy) if (*should_destroy == 0) return 0; /* channel will not be destroyed */ - history_destroy(channel->chname); + history_destroy(channel->name); return 0; } -int history_chanmsg(Client *client, Channel *channel, int sendflags, int prefix, char *target, MessageTag *mtags, char *text, SendType sendtype) +int history_chanmsg(Client *client, Channel *channel, int sendflags, const char *prefix, const char *target, MessageTag *mtags, const char *text, SendType sendtype) { char buf[512]; char source[64]; @@ -672,15 +670,15 @@ int history_chanmsg(Client *client, Channel *channel, int sendflags, int prefix, snprintf(buf, sizeof(buf), ":%s %s %s :%s", source, sendtype_to_cmd(sendtype), - channel->chname, + channel->name, text); - history_add(channel->chname, mtags, buf); + history_add(channel->name, mtags, buf); return 0; } -int history_join(Client *client, Channel *channel, MessageTag *mtags, char *parv[]) +int history_join(Client *client, Channel *channel, MessageTag *mtags) { /* Only for +H channels */ if (!HistoryEnabled(channel) || !cfg.playback_on_join.lines || !cfg.playback_on_join.time) @@ -689,7 +687,7 @@ int history_join(Client *client, Channel *channel, MessageTag *mtags, char *parv /* No history-on-join for clients that implement CHATHISTORY, * they will pull history themselves if they need it. */ - if (HasCapability(client, "draft/chathistory") || HasCapability(client, "chathistory")) + if (HasCapability(client, "draft/chathistory") /*|| HasCapability(client, "chathistory")*/) return 0; if (MyUser(client) && can_receive_history(client)) @@ -700,7 +698,7 @@ int history_join(Client *client, Channel *channel, MessageTag *mtags, char *parv filter.cmd = HFC_SIMPLE; filter.last_lines = cfg.playback_on_join.lines; filter.last_seconds = cfg.playback_on_join.time; - r = history_request(channel->chname, &filter); + r = history_request(channel->name, &filter); if (r) { history_send_result(client, r); @@ -724,10 +722,10 @@ CMD_OVERRIDE_FUNC(override_mode) * means: we are the server that services are linked to. */ if ((IsServer(client) && client->local) || - (IsUser(client) && client->srvptr && client->srvptr->local)) + (IsUser(client) && client->uplink && client->uplink->local)) { /* Now check if the channel is currently +r */ - if ((parc >= 2) && !BadPtr(parv[1]) && ((channel = find_channel(parv[1], NULL))) && + if ((parc >= 2) && !BadPtr(parv[1]) && ((channel = find_channel(parv[1]))) && has_channel_mode(channel, 'r')) { had_r = 1; @@ -744,7 +742,7 @@ CMD_OVERRIDE_FUNC(override_mode) * then... */ if (had_r && - ((channel = find_channel(parv[1], NULL))) && + ((channel = find_channel(parv[1]))) && !has_channel_mode(channel, 'r') && HistoryEnabled(channel)) { @@ -770,7 +768,9 @@ CMD_OVERRIDE_FUNC(override_mode) if (changed) { MessageTag *mtags = NULL; - char *params = history_chanmode_get_param(settings); + const char *params = history_chanmode_get_param(settings); + char modebuf[BUFSIZE], parabuf[BUFSIZE]; + int destroy_channel = 0; if (!params) return; /* Weird */ @@ -782,13 +782,13 @@ CMD_OVERRIDE_FUNC(override_mode) sendto_channel(channel, &me, &me, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s %s %s", - me.name, channel->chname, modebuf, parabuf); + me.name, channel->name, modebuf, parabuf); sendto_server(NULL, 0, 0, mtags, ":%s MODE %s %s %s %lld", - me.id, channel->chname, modebuf, parabuf, + me.id, channel->name, modebuf, parabuf, (long long)channel->creationtime); /* Activate this hook just like cmd_mode.c */ - RunHook7(HOOKTYPE_REMOTE_CHANMODE, &me, channel, mtags, modebuf, parabuf, 0, 0); + RunHook(HOOKTYPE_REMOTE_CHANMODE, &me, channel, mtags, modebuf, parabuf, 0, 0, &destroy_channel); free_message_tags(mtags); diff --git a/src/modules/chanmodes/inviteonly.c b/src/modules/chanmodes/inviteonly.c new file mode 100644 index 0000000..d7548f9 --- /dev/null +++ b/src/modules/chanmodes/inviteonly.c @@ -0,0 +1,77 @@ +/* + * Channel Mode +i + * (C) Copyright 2021 Syzop and the UnrealIRCd team + * + * This program is free 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 1, or (at your option) + * any later version. + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "unrealircd.h" + + +ModuleHeader MOD_HEADER + = { + "chanmodes/inviteonly", + "6.0", + "Channel Mode +i", + "UnrealIRCd Team", + "unrealircd-6", + }; + +Cmode_t EXTCMODE_INVITE_ONLY; + +#define IsInviteOnly(channel) (channel->mode.mode & EXTCMODE_INVITE_ONLY) + +int inviteonly_can_join(Client *client, Channel *channel, const char *key, char **errmsg); + +MOD_INIT() +{ + CmodeInfo req; + + MARK_AS_OFFICIAL_MODULE(modinfo); + + memset(&req, 0, sizeof(req)); + req.paracount = 0; + req.letter = 'i'; + req.is_ok = extcmode_default_requirehalfop; + CmodeAdd(modinfo->handle, req, &EXTCMODE_INVITE_ONLY); + + HookAdd(modinfo->handle, HOOKTYPE_CAN_JOIN, 0, inviteonly_can_join); + + return MOD_SUCCESS; +} + +MOD_LOAD() +{ + return MOD_SUCCESS; +} + +MOD_UNLOAD() +{ + return MOD_SUCCESS; +} + +int inviteonly_can_join (Client *client, Channel *channel, const char *key, char **errmsg) +{ + if (IsInviteOnly(channel)) + { + if (is_invited(client, channel)) + return 0; + if (find_invex(channel, client)) + return 0; + *errmsg = STR_ERR_INVITEONLYCHAN; + return ERR_INVITEONLYCHAN; + } + return 0; +} diff --git a/src/modules/chanmodes/isregistered.c b/src/modules/chanmodes/isregistered.c new file mode 100644 index 0000000..4d8675f --- /dev/null +++ b/src/modules/chanmodes/isregistered.c @@ -0,0 +1,72 @@ +/* + * Channel Mode +r + * (C) Copyright 2021 Syzop and the UnrealIRCd team + * + * This program is free 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 1, or (at your option) + * any later version. + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "unrealircd.h" + + +ModuleHeader MOD_HEADER + = { + "chanmodes/isregistered", + "6.0", + "Channel Mode +r", + "UnrealIRCd Team", + "unrealircd-6", + }; + +Cmode_t EXTCMODE_REGISTERED; + +#define IsRegisteredChannel(channel) (channel->mode.mode & EXTCMODE_REGISTERED) + +int isregistered_chanmode_is_ok(Client *client, Channel *channel, char mode, const char *param, int type, int what); + +MOD_INIT() +{ + CmodeInfo req; + + MARK_AS_OFFICIAL_MODULE(modinfo); + + memset(&req, 0, sizeof(req)); + req.paracount = 0; + req.letter = 'r'; + req.is_ok = isregistered_chanmode_is_ok; + CmodeAdd(modinfo->handle, req, &EXTCMODE_REGISTERED); + + return MOD_SUCCESS; +} + +MOD_LOAD() +{ + return MOD_SUCCESS; +} + +MOD_UNLOAD() +{ + return MOD_SUCCESS; +} + +int isregistered_chanmode_is_ok(Client *client, Channel *channel, char mode, const char *param, int type, int what) +{ + if (!IsServer(client) && !IsULine(client)) + { + if (type == EXCHK_ACCESS_ERR) + sendnumeric(client, ERR_ONLYSERVERSCANCHANGE, channel->name); + return EX_ALWAYS_DENY; + } + return EX_ALLOW; +} diff --git a/src/modules/chanmodes/issecure.c b/src/modules/chanmodes/issecure.c index 56320ab..07839a8 100644 --- a/src/modules/chanmodes/issecure.c +++ b/src/modules/chanmodes/issecure.c @@ -3,7 +3,7 @@ * (C) Copyright 2010-.. Bram Matthys (Syzop) and the UnrealIRCd team * * This module will indicate if a channel is secure, and if so will set +Z. - * Secure is defined as: all users on the channel are connected through SSL/TLS + * Secure is defined as: all users on the channel are connected through TLS * Additionally, the channel has to be +z (only allow secure users to join). * Suggested on http://bugs.unrealircd.org/view.php?id=3720 * Thanks go to fez for pushing us for some kind of method to indicate @@ -34,21 +34,21 @@ ModuleHeader MOD_HEADER "4.2", "Channel Mode +Z", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; Cmode_t EXTCMODE_ISSECURE; -#define IsSecureChanIndicated(channel) (channel->mode.extmode & EXTCMODE_ISSECURE) +#define IsSecureChanIndicated(channel) (channel->mode.mode & EXTCMODE_ISSECURE) int IsSecureJoin(Channel *channel); -int modeZ_is_ok(Client *client, Channel *channel, char mode, char *para, int checkt, int what); -int issecure_join(Client *client, Channel *channel, MessageTag *mtags, char *parv[]); -int issecure_part(Client *client, Channel *channel, MessageTag *mtags, char *comment); -int issecure_quit(Client *client, MessageTag *mtags, char *comment); -int issecure_kick(Client *client, Client *victim, Channel *channel, MessageTag *mtags, char *comment); +int modeZ_is_ok(Client *client, Channel *channel, char mode, const char *para, int checkt, int what); +int issecure_join(Client *client, Channel *channel, MessageTag *mtags); +int issecure_part(Client *client, Channel *channel, MessageTag *mtags, const char *comment); +int issecure_quit(Client *client, MessageTag *mtags, const char *comment); +int issecure_kick(Client *client, Client *victim, Channel *channel, MessageTag *mtags, const char *comment); int issecure_chanmode(Client *client, Channel *channel, MessageTag *mtags, - char *modebuf, char *parabuf, time_t sendts, int samode); + const char *modebuf, const char *parabuf, time_t sendts, int samode, int *destroy_channel); MOD_TEST() @@ -64,7 +64,7 @@ CmodeInfo req; memset(&req, 0, sizeof(req)); req.paracount = 0; req.is_ok = modeZ_is_ok; - req.flag = 'Z'; + req.letter = 'Z'; req.local = 1; /* local channel mode */ CmodeAdd(modinfo->handle, req, &EXTCMODE_ISSECURE); @@ -108,7 +108,7 @@ int IsSecureJoin(Channel *channel) return i; } -int modeZ_is_ok(Client *client, Channel *channel, char mode, char *para, int checkt, int what) +int modeZ_is_ok(Client *client, Channel *channel, char mode, const char *para, int checkt, int what) { /* Reject any attempt to set or unset our mode. Even to IRCOps */ return EX_ALWAYS_DENY; @@ -143,17 +143,17 @@ void issecure_unset(Channel *channel, Client *client, MessageTag *recv_mtags, in if (notice) { mtags = NULL; - new_message_special(&me, recv_mtags, &mtags, "NOTICE %s :setting -Z", channel->chname); + new_message_special(&me, recv_mtags, &mtags, "NOTICE %s :setting -Z", channel->name); sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, - ":%s NOTICE %s :User '%s' joined and is not connected through SSL/TLS, setting channel -Z (insecure)", - me.id, channel->chname, client->name); + ":%s NOTICE %s :User '%s' joined and is not connected through TLS, setting channel -Z (insecure)", + me.id, channel->name, client->name); free_message_tags(mtags); } - channel->mode.extmode &= ~EXTCMODE_ISSECURE; + channel->mode.mode &= ~EXTCMODE_ISSECURE; mtags = NULL; - new_message_special(&me, recv_mtags, &mtags, "MODE %s -Z", channel->chname); - sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s -Z", me.name, channel->chname); + new_message_special(&me, recv_mtags, &mtags, "MODE %s -Z", channel->name); + sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s -Z", me.name, channel->name); free_message_tags(mtags); } @@ -168,31 +168,31 @@ void issecure_set(Channel *channel, Client *client, MessageTag *recv_mtags, int MessageTag *mtags; mtags = NULL; - new_message_special(&me, recv_mtags, &mtags, "NOTICE %s :setting +Z", channel->chname); + new_message_special(&me, recv_mtags, &mtags, "NOTICE %s :setting +Z", channel->name); if (notice && client) { /* note that we have to skip 'client', since when this call is being made * he is still considered a member of this channel. */ sendto_channel(channel, &me, client, 0, 0, SEND_LOCAL, NULL, - ":%s NOTICE %s :Now all users in the channel are connected through SSL/TLS, setting channel +Z (secure)", - me.name, channel->chname); + ":%s NOTICE %s :Now all users in the channel are connected through TLS, setting channel +Z (secure)", + me.name, channel->name); } else if (notice) { /* note the missing word 'now' in next line */ sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, NULL, - ":%s NOTICE %s :All users in the channel are connected through SSL/TLS, setting channel +Z (secure)", - me.name, channel->chname); + ":%s NOTICE %s :All users in the channel are connected through TLS, setting channel +Z (secure)", + me.name, channel->name); } free_message_tags(mtags); - channel->mode.extmode |= EXTCMODE_ISSECURE; + channel->mode.mode |= EXTCMODE_ISSECURE; mtags = NULL; - new_message_special(&me, recv_mtags, &mtags, "MODE %s +Z", channel->chname); + new_message_special(&me, recv_mtags, &mtags, "MODE %s +Z", channel->name); sendto_channel(channel, &me, client, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s +Z", - me.name, channel->chname); + me.name, channel->name); free_message_tags(mtags); } @@ -200,7 +200,7 @@ void issecure_set(Channel *channel, Client *client, MessageTag *recv_mtags, int * so while they can be written shorter, they would only take longer to execute! */ -int issecure_join(Client *client, Channel *channel, MessageTag *mtags, char *parv[]) +int issecure_join(Client *client, Channel *channel, MessageTag *mtags) { /* Check only if chan already +zZ and the user joining is insecure (no need to count) */ if (IsSecureJoin(channel) && IsSecureChanIndicated(channel) && !IsSecureConnect(client) && !IsULine(client)) @@ -213,7 +213,7 @@ int issecure_join(Client *client, Channel *channel, MessageTag *mtags, char *par return 0; } -int issecure_part(Client *client, Channel *channel, MessageTag *mtags, char *comment) +int issecure_part(Client *client, Channel *channel, MessageTag *mtags, const char *comment) { /* Only care if chan is +z-Z and the user leaving is insecure, then count */ if (IsSecureJoin(channel) && !IsSecureChanIndicated(channel) && !IsSecureConnect(client) && @@ -222,7 +222,7 @@ int issecure_part(Client *client, Channel *channel, MessageTag *mtags, char *com return 0; } -int issecure_quit(Client *client, MessageTag *mtags, char *comment) +int issecure_quit(Client *client, MessageTag *mtags, const char *comment) { Membership *membership; Channel *channel; @@ -238,7 +238,7 @@ Channel *channel; return 0; } -int issecure_kick(Client *client, Client *victim, Channel *channel, MessageTag *mtags, char *comment) +int issecure_kick(Client *client, Client *victim, Channel *channel, MessageTag *mtags, const char *comment) { /* Identical to part&quit, except we care about 'victim' and not 'client' */ if (IsSecureJoin(channel) && !IsSecureChanIndicated(channel) && @@ -248,7 +248,7 @@ int issecure_kick(Client *client, Client *victim, Channel *channel, MessageTag * } int issecure_chanmode(Client *client, Channel *channel, MessageTag *mtags, - char *modebuf, char *parabuf, time_t sendts, int samode) + const char *modebuf, const char *parabuf, time_t sendts, int samode, int *destroy_channel) { if (!strchr(modebuf, 'z')) return 0; /* don't care */ diff --git a/src/modules/chanmodes/key.c b/src/modules/chanmodes/key.c new file mode 100644 index 0000000..e0753cc --- /dev/null +++ b/src/modules/chanmodes/key.c @@ -0,0 +1,232 @@ +/* + * Channel Mode +k + * (C) Copyright 2021 Syzop and the UnrealIRCd team + * + * This program is free 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 1, or (at your option) + * any later version. + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "unrealircd.h" + +ModuleHeader MOD_HEADER + = { + "chanmodes/key", + "6.0", + "Channel Mode +k", + "UnrealIRCd Team", + "unrealircd-6", + }; + +typedef struct ChannelKey ChannelKey; +struct ChannelKey { + char key[KEYLEN+1]; +}; + +/* Global variables */ +ModDataInfo *mdkey = NULL; +Cmode_t EXTMODE_KEY = 0L; + +#define IsKey(x) ((x)->mode.mode & EXTMODE_KEY) + +/* Forward declarations */ +int key_can_join(Client *client, Channel *channel, const char *key, char **errmsg); +int cmode_key_is_ok(Client *client, Channel *channel, char mode, const char *para, int type, int what); +void *cmode_key_put_param(void *r_in, const char *param); +const char *cmode_key_get_param(void *r_in); +const char *cmode_key_conv_param(const char *param_in, Client *client, Channel *channel); +void cmode_key_free_param(void *r); +void *cmode_key_dup_struct(void *r_in); +int cmode_key_sjoin_check(Channel *channel, void *ourx, void *theirx); +int is_valid_key(const char *key); +void transform_channel_key(const char *i, char *o, int n); + +MOD_INIT() +{ + CmodeInfo creq; + ModDataInfo mreq; + + MARK_AS_OFFICIAL_MODULE(modinfo); + + memset(&creq, 0, sizeof(creq)); + creq.paracount = 1; + creq.is_ok = cmode_key_is_ok; + creq.letter = 'k'; + creq.unset_with_param = 1; /* yeah... +k is like this */ + creq.put_param = cmode_key_put_param; + creq.get_param = cmode_key_get_param; + creq.conv_param = cmode_key_conv_param; + creq.free_param = cmode_key_free_param; + creq.dup_struct = cmode_key_dup_struct; + creq.sjoin_check = cmode_key_sjoin_check; + CmodeAdd(modinfo->handle, creq, &EXTMODE_KEY); + + HookAdd(modinfo->handle, HOOKTYPE_CAN_JOIN, 0, key_can_join); + return MOD_SUCCESS; +} + +MOD_LOAD() +{ + return MOD_SUCCESS; +} + +MOD_UNLOAD() +{ + return MOD_SUCCESS; +} + +/** Can the user join the channel? */ +int key_can_join(Client *client, Channel *channel, const char *key, char **errmsg) +{ + ChannelKey *r = (ChannelKey *)GETPARASTRUCT(channel, 'k'); + + /* Is the channel +k? */ + if (r && *r->key) + { + if (key && !strcmp(r->key, key)) + return 0; + *errmsg = STR_ERR_BADCHANNELKEY; + return ERR_BADCHANNELKEY; + } + + return 0; +} + +int cmode_key_is_ok(Client *client, Channel *channel, char mode, const char *param, int type, int what) +{ + if ((type == EXCHK_ACCESS) || (type == EXCHK_ACCESS_ERR)) + { + /* Permitted for +hoaq */ + if (IsUser(client) && check_channel_access(client, channel, "hoaq")) + return EX_ALLOW; + return EX_DENY; + } else + if (type == EXCHK_PARAM) + { + if (!is_valid_key(param)) + { + sendnumeric(client, ERR_INVALIDMODEPARAM, + channel->name, 'k', "*", "Channel key contains forbidden characters or is too long"); + return EX_DENY; + } + return EX_ALLOW; + } + + /* fallthrough -- should not be used */ + return EX_DENY; +} + +void *cmode_key_put_param(void *k_in, const char *param) +{ + ChannelKey *fld = (ChannelKey *)k_in; + + if (!fld) + fld = safe_alloc(sizeof(ChannelKey)); + + transform_channel_key(param, fld->key, sizeof(fld->key)); + + return fld; +} + +const char *cmode_key_get_param(void *r_in) +{ + ChannelKey *r = (ChannelKey *)r_in; + static char retbuf[KEYLEN+1]; + + if (!r) + return NULL; + + strlcpy(retbuf, r->key, sizeof(retbuf)); + return retbuf; +} + +const char *cmode_key_conv_param(const char *param, Client *client, Channel *channel) +{ + static char retbuf[KEYLEN+1]; + + transform_channel_key(param, retbuf, sizeof(retbuf)); + + if (!*retbuf) + return NULL; /* entire key was invalid */ + + return retbuf; +} + +void cmode_key_free_param(void *r) +{ + safe_free(r); +} + +void *cmode_key_dup_struct(void *r_in) +{ + ChannelKey *r = (ChannelKey *)r_in; + ChannelKey *w = safe_alloc(sizeof(ChannelKey)); + + memcpy(w, r, sizeof(ChannelKey)); + + return (void *)w; +} + +int cmode_key_sjoin_check(Channel *channel, void *ourx, void *theirx) +{ + ChannelKey *our = (ChannelKey *)ourx; + ChannelKey *their = (ChannelKey *)theirx; + int i; + int r; + + r = strcmp(our->key, their->key); + if (r == 0) + return EXSJ_SAME; + else if (r > 0) + return EXSJ_WEWON; + else + return EXSJ_THEYWON; +} + +int valid_key_char(char c) +{ + if (strchr(" :,", c)) + return 0; + if (c <= 32) + return 0; + return 1; +} + +#define BADKEYCHARS " :," +int is_valid_key(const char *key) +{ + const char *p; + + if (strlen(key) > KEYLEN) + return 0; + for (p = key; *p; p++) + if (!valid_key_char(*p)) + return 0; + return 1; +} + +void transform_channel_key(const char *i, char *o, int n) +{ + n--; /* reserve one for final nul byte */ + + for (; *i; i++) + { + if (!valid_key_char(*i)) + break; + if (n <= 0) + break; + *o++ = *i; + n--; + } + *o = '\0'; +} diff --git a/src/modules/chanmodes/limit.c b/src/modules/chanmodes/limit.c new file mode 100644 index 0000000..761d1ea --- /dev/null +++ b/src/modules/chanmodes/limit.c @@ -0,0 +1,198 @@ +/* + * Channel Mode +l + * (C) Copyright 2021 Syzop and the UnrealIRCd team + * + * This program is free 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 1, or (at your option) + * any later version. + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "unrealircd.h" + +ModuleHeader MOD_HEADER + = { + "chanmodes/limit", + "6.0", + "Channel Mode +l", + "UnrealIRCd Team", + "unrealircd-6", + }; + +typedef struct ChannelLimit ChannelLimit; +struct ChannelLimit { + int limit; +}; + +/* Global variables */ +ModDataInfo *mdlimit = NULL; +Cmode_t EXTMODE_LIMIT = 0L; + +#define IsLimit(x) ((x)->mode.mode & EXTMODE_LIMIT) + +/* Just for buffers, nothing else */ +#define LIMITLEN 32 + +/* Forward declarations */ +int limit_can_join(Client *client, Channel *channel, const char *key, char **errmsg); +int cmode_limit_is_ok(Client *client, Channel *channel, char mode, const char *para, int type, int what); +void *cmode_limit_put_param(void *r_in, const char *param); +const char *cmode_limit_get_param(void *r_in); +const char *cmode_limit_conv_param(const char *param_in, Client *client, Channel *channel); +void cmode_limit_free_param(void *r); +void *cmode_limit_dup_struct(void *r_in); +int cmode_limit_sjoin_check(Channel *channel, void *ourx, void *theirx); +int transform_channel_limit(const char *param); + +MOD_INIT() +{ + CmodeInfo creq; + ModDataInfo mreq; + + MARK_AS_OFFICIAL_MODULE(modinfo); + + memset(&creq, 0, sizeof(creq)); + creq.paracount = 1; + creq.is_ok = cmode_limit_is_ok; + creq.letter = 'l'; + creq.put_param = cmode_limit_put_param; + creq.get_param = cmode_limit_get_param; + creq.conv_param = cmode_limit_conv_param; + creq.free_param = cmode_limit_free_param; + creq.dup_struct = cmode_limit_dup_struct; + creq.sjoin_check = cmode_limit_sjoin_check; + CmodeAdd(modinfo->handle, creq, &EXTMODE_LIMIT); + + HookAdd(modinfo->handle, HOOKTYPE_CAN_JOIN, 0, limit_can_join); + return MOD_SUCCESS; +} + +MOD_LOAD() +{ + return MOD_SUCCESS; +} + +MOD_UNLOAD() +{ + return MOD_SUCCESS; +} + +/** Can the user join the channel? */ +int limit_can_join(Client *client, Channel *channel, const char *key, char **errmsg) +{ + ChannelLimit *r = (ChannelLimit *)GETPARASTRUCT(channel, 'l'); + + /* Is the channel +l? */ + if (r && r->limit && (channel->users >= r->limit)) + { + Hook *h; + for (h = Hooks[HOOKTYPE_CAN_JOIN_LIMITEXCEEDED]; h; h = h->next) + { + int i = (*(h->func.intfunc))(client,channel,key,errmsg); + if (i != 0) + return i; + } + *errmsg = STR_ERR_CHANNELISFULL; + return ERR_CHANNELISFULL; + } + + return 0; +} + +int cmode_limit_is_ok(Client *client, Channel *channel, char mode, const char *param, int type, int what) +{ + if ((type == EXCHK_ACCESS) || (type == EXCHK_ACCESS_ERR)) + { + /* Permitted for +hoaq */ + if (IsUser(client) && check_channel_access(client, channel, "hoaq")) + return EX_ALLOW; + return EX_DENY; + } else + if (type == EXCHK_PARAM) + { + /* Actually any value is valid, we just morph it */ + return EX_ALLOW; + } + + /* fallthrough -- should not be used */ + return EX_DENY; +} + +void *cmode_limit_put_param(void *k_in, const char *param) +{ + ChannelLimit *fld = (ChannelLimit *)k_in; + + if (!fld) + fld = safe_alloc(sizeof(ChannelLimit)); + + fld->limit = transform_channel_limit(param); + + return fld; +} + +const char *cmode_limit_get_param(void *r_in) +{ + ChannelLimit *r = (ChannelLimit *)r_in; + static char retbuf[32]; + + if (!r) + return NULL; + + snprintf(retbuf, sizeof(retbuf), "%d", r->limit); + return retbuf; +} + +const char *cmode_limit_conv_param(const char *param, Client *client, Channel *channel) +{ + static char retbuf[32]; + int v = transform_channel_limit(param); + snprintf(retbuf, sizeof(retbuf), "%d", v); + return retbuf; +} + +void cmode_limit_free_param(void *r) +{ + safe_free(r); +} + +void *cmode_limit_dup_struct(void *r_in) +{ + ChannelLimit *r = (ChannelLimit *)r_in; + ChannelLimit *w = safe_alloc(sizeof(ChannelLimit)); + + memcpy(w, r, sizeof(ChannelLimit)); + + return (void *)w; +} + +int cmode_limit_sjoin_check(Channel *channel, void *ourx, void *theirx) +{ + ChannelLimit *our = (ChannelLimit *)ourx; + ChannelLimit *their = (ChannelLimit *)theirx; + + if (our->limit == their->limit) + return EXSJ_SAME; + else if (our->limit > their->limit) + return EXSJ_WEWON; + else + return EXSJ_THEYWON; +} + +int transform_channel_limit(const char *param) +{ + int v = atoi(param); + if (v <= 0) + v = 1; /* setting +l with a negative number makes no sense */ + if (v > 1000000) + v = 1000000; /* some kind of limit, 1 million (mrah...) */ + return v; +} diff --git a/src/modules/chanmodes/link.c b/src/modules/chanmodes/link.c index 3be4a43..9a5b5b8 100644 --- a/src/modules/chanmodes/link.c +++ b/src/modules/chanmodes/link.c @@ -26,7 +26,7 @@ ModuleHeader MOD_HEADER = { "5.0", "Channel Mode +L", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; Cmode_t EXTMODE_LINK = 0L; @@ -39,26 +39,25 @@ typedef enum { LINKTYPE_BAN = 1, // +b LINKTYPE_INVITE = 2, // +i LINKTYPE_OPER = 3, // +O - LINKTYPE_SSL = 4, // +z + LINKTYPE_SECURE = 4, // +z LINKTYPE_REG = 5, // +R LINKTYPE_LIMIT = 6, // +l LINKTYPE_BADKEY = 7, // +k } linkType; -int cmodeL_is_ok(Client *client, Channel *channel, char mode, char *para, int type, int what); -void *cmodeL_put_param(void *r_in, char *param); -char *cmodeL_get_param(void *r_in); -char *cmodeL_conv_param(char *param_in, Client *client, Channel *channel); +int cmodeL_is_ok(Client *client, Channel *channel, char mode, const char *para, int type, int what); +void *cmodeL_put_param(void *r_in, const char *param); +const char *cmodeL_get_param(void *r_in); +const char *cmodeL_conv_param(const char *param_in, Client *client, Channel *channel); void cmodeL_free_param(void *r); void *cmodeL_dup_struct(void *r_in); int cmodeL_sjoin_check(Channel *channel, void *ourx, void *theirx); -int extban_link_syntax(Client *client, int checkt, char *reason); -int extban_link_is_ok(Client *client, Channel *channel, char *param, int checkt, int what, int what2); -char *extban_link_conv_param(char *param); -int extban_link_is_banned(Client *client, Channel *channel, char *ban, int type, char **msg, char **errmsg); -int link_doforward(Client *client, Channel *channel, char *linked, linkType linktype); -int link_pre_localjoin_cb(Client *client, Channel *channel, char *parv[]); +int extban_link_syntax(Client *client, int checkt, const char *reason); +int extban_link_is_ok(BanContext *b); +const char *extban_link_conv_param(BanContext *b, Extban *extban); +int link_doforward(Client *client, Channel *channel, const char *linked, linkType linktype); +int link_pre_localjoin_cb(Client *client, Channel *channel, const char *key); MOD_INIT() { @@ -70,7 +69,7 @@ MOD_INIT() memset(&req, 0, sizeof(req)); req.paracount = 1; req.is_ok = cmodeL_is_ok; - req.flag = 'L'; + req.letter = 'L'; req.unset_with_param = 1; /* Oh yeah, we are special! */ req.put_param = cmodeL_put_param; req.get_param = cmodeL_get_param; @@ -81,10 +80,10 @@ MOD_INIT() CmodeAdd(modinfo->handle, req, &EXTMODE_LINK); memset(&req_extban, 0, sizeof(ExtbanInfo)); - req_extban.flag = 'f'; + req_extban.letter = 'f'; + req_extban.name = "forward"; req_extban.is_ok = extban_link_is_ok; req_extban.conv_param = extban_link_conv_param; - req_extban.is_banned = extban_link_is_banned; req_extban.options = EXTBOPT_ACTMODIFIER; if (!ExtbanAdd(modinfo->handle, req_extban)) { @@ -107,14 +106,14 @@ MOD_UNLOAD() return MOD_SUCCESS; } -int cmodeL_is_ok(Client *client, Channel *channel, char mode, char *para, int type, int what) +int cmodeL_is_ok(Client *client, Channel *channel, char mode, const char *para, int type, int what) { if ((type == EXCHK_ACCESS) || (type == EXCHK_ACCESS_ERR)) { - if (IsUser(client) && is_chan_op(client, channel)) + if (IsUser(client) && check_channel_access(client, channel, "oaq")) return EX_ALLOW; if (type == EXCHK_ACCESS_ERR) /* can only be due to being halfop */ - sendnumeric(client, ERR_NOTFORHALFOPS, 'H'); + sendnumeric(client, ERR_NOTFORHALFOPS, 'L'); return EX_DENY; } else if (type == EXCHK_PARAM) @@ -129,7 +128,7 @@ int cmodeL_is_ok(Client *client, Channel *channel, char mode, char *para, int ty return EX_DENY; } - if (find_channel(para, NULL) == channel) + if (find_channel(para) == channel) { if (MyUser(client)) sendnumeric(client, ERR_CANNOTCHANGECHANMODE, 'L', @@ -143,7 +142,7 @@ int cmodeL_is_ok(Client *client, Channel *channel, char mode, char *para, int ty return EX_DENY; } -void *cmodeL_put_param(void *r_in, char *param) +void *cmodeL_put_param(void *r_in, const char *param) { aModeLEntry *r = (aModeLEntry *)r_in; @@ -156,7 +155,7 @@ void *cmodeL_put_param(void *r_in, char *param) return (void *)r; } -char *cmodeL_get_param(void *r_in) +const char *cmodeL_get_param(void *r_in) { aModeLEntry *r = (aModeLEntry *)r_in; static char retbuf[CHANNELLEN+1]; @@ -171,10 +170,8 @@ char *cmodeL_get_param(void *r_in) /** Convert parameter to something proper. * NOTE: client may be NULL */ -char *cmodeL_conv_param(char *param, Client *client, Channel *channel) +const char *cmodeL_conv_param(const char *param, Client *client, Channel *channel) { - char *p; - if (!valid_channelname(param)) return NULL; @@ -207,7 +204,7 @@ int cmodeL_sjoin_check(Channel *channel, void *ourx, void *theirx) return EXSJ_THEYWON; } -int extban_link_syntax(Client *client, int checkt, char *reason) +int extban_link_syntax(Client *client, int checkt, const char *reason) { if (MyUser(client) && (checkt == EXBCHK_PARAM)) { @@ -222,52 +219,50 @@ int extban_link_syntax(Client *client, int checkt, char *reason) return 0; // Reject ban } -int extban_link_is_ok(Client *client, Channel *channel, char *param, int checkt, int what, int what2) +int extban_link_is_ok(BanContext *b) { - char paramtmp[MAX_EB_LEN + 1]; - char tmpmask[MAX_EB_LEN + 1]; + static char paramtmp[MAX_EB_LEN + 1]; char *matchby; // Matching method, such as 'n!u@h' char *chan; // Always permit deletion - if (what == MODE_DEL) + if (b->what == MODE_DEL) return 1; - if (what2 != EXBTYPE_BAN) + if (b->ban_type != EXBTYPE_BAN) { - if (checkt == EXBCHK_PARAM) - sendnotice(client, "Ban type ~f only works with bans (+b) and not with exceptions or invex (+e/+I)"); + if (b->is_ok_check == EXBCHK_PARAM) + sendnotice(b->client, "Ban type ~f only works with bans (+b) and not with exceptions or invex (+e/+I)"); return 0; // Reject } - strlcpy(paramtmp, param + 3, sizeof(paramtmp)); // Work on a size-truncated copy + strlcpy(paramtmp, b->banstr, sizeof(paramtmp)); // Work on a size-truncated copy chan = paramtmp; matchby = strchr(paramtmp, ':'); if (!matchby || !matchby[1]) - return extban_link_syntax(client, checkt, "Invalid syntax"); + return extban_link_syntax(b->client, b->is_ok_check, "Invalid syntax"); *matchby++ = '\0'; - if (*chan != '#' || strchr(param, ',')) - return extban_link_syntax(client, checkt, "Invalid channel"); + if (*chan != '#' || strchr(b->banstr, ',')) + return extban_link_syntax(b->client, b->is_ok_check, "Invalid channel"); - // Possibly stack multiple extbans, this is a little convoluted due to extban API limitations - snprintf(tmpmask, sizeof(tmpmask), "~?:%s", matchby); - if (extban_is_ok_nuh_extban(client, channel, tmpmask, checkt, what, what2) == 0) - return extban_link_syntax(client, checkt, "Invalid matcher"); + b->banstr = matchby; + if (extban_is_ok_nuh_extban(b) == 0) + return extban_link_syntax(b->client, b->is_ok_check, "Invalid matcher"); return 1; // Is ok } -char *extban_link_conv_param(char *param) +const char *extban_link_conv_param(BanContext *b, Extban *extban) { static char retbuf[MAX_EB_LEN + 1]; char paramtmp[MAX_EB_LEN + 1]; char tmpmask[MAX_EB_LEN + 1]; char *matchby; // Matching method, such as 'n!u@h' - char *newmask; // Cleaned matching method, such as 'n!u@h' + const char *newmask; // Cleaned matching method, such as 'n!u@h' char *chan; - strlcpy(paramtmp, param + 3, sizeof(paramtmp)); // Work on a size-truncated copy + strlcpy(paramtmp, b->banstr, sizeof(paramtmp)); // Work on a size-truncated copy chan = paramtmp; matchby = strchr(paramtmp, ':'); if (!matchby || !matchby[1]) @@ -277,26 +272,20 @@ char *extban_link_conv_param(char *param) if (!valid_channelname(chan)) return NULL; - // Possibly stack multiple extbans, this is a little convoluted due to extban API limitations - snprintf(tmpmask, sizeof(tmpmask), "~?:%s", matchby); - newmask = extban_conv_param_nuh_or_extban(tmpmask); - if (!newmask || (strlen(newmask) <= 3)) + b->banstr = matchby; + newmask = extban_conv_param_nuh_or_extban(b, extban); + if (BadPtr(newmask)) return NULL; - snprintf(retbuf, sizeof(retbuf), "~f:%s:%s", chan, newmask + 3); + snprintf(retbuf, sizeof(retbuf), "%s:%s", chan, newmask); return retbuf; } -int extban_link_is_banned(Client *client, Channel *channel, char *ban, int type, char **msg, char **errmsg) -{ - // We don't actually ban here because we have to extract the channel name in PRE_LOCAL_JOIN anyways - return 0; -} - -int link_doforward(Client *client, Channel *channel, char *linked, linkType type) +int link_doforward(Client *client, Channel *channel, const char *linked, linkType type) { + char linked_channel_buffer[CHANNELLEN+1]; char desc[64]; - char *parv[3]; + const char *parv[3]; switch (type) { @@ -312,8 +301,8 @@ int link_doforward(Client *client, Channel *channel, char *linked, linkType type strncpy(desc, "channel is oper only", sizeof(desc)); break; - case LINKTYPE_SSL: - strncpy(desc, "channel requires SSL", sizeof(desc)); + case LINKTYPE_SECURE: + strncpy(desc, "channel requires a secure connection", sizeof(desc)); break; case LINKTYPE_REG: @@ -335,23 +324,24 @@ int link_doforward(Client *client, Channel *channel, char *linked, linkType type sendto_one(client, NULL, ":%s %d %s %s %s :[Link] Cannot join channel %s (%s) -- transferring you to %s", - me.name, ERR_LINKCHANNEL, client->name, channel->chname, linked, - channel->chname, desc, linked); + me.name, ERR_LINKCHANNEL, client->name, channel->name, linked, + channel->name, desc, linked); + + strlcpy(linked_channel_buffer, linked, sizeof(linked_channel_buffer)); parv[0] = client->name; - parv[1] = linked; + parv[1] = linked_channel_buffer; parv[2] = NULL; + do_join(client, 2, parv); + return HOOK_DENY; // Original channel join = ignored } -int link_pre_localjoin_cb(Client *client, Channel *channel, char *parv[]) +int link_pre_localjoin_cb(Client *client, Channel *channel, const char *key) { - char *linked; + const char *linked; int canjoin; - Ban *ban; - char bantmp[MAX_EB_LEN + 1]; - char *banchan; - char *banmask; + char *error = NULL; // User might already be on this channel, let's also exclude any possible services bots early if (IsULine(client) || find_membership_link(client->user->channel, channel)) @@ -361,12 +351,26 @@ int link_pre_localjoin_cb(Client *client, Channel *channel, char *parv[]) // only /INVITE from chanop bypasses: if (!is_invited(client, channel)) { - for(ban = channel->banlist; ban; ban = ban->next) + Ban *ban; + BanContext *b = safe_alloc(sizeof(BanContext)); + char bantmp[MAX_EB_LEN + 1]; + char *banchan; + char *banmask; + + b->client = client; + b->channel = channel; + b->ban_check_types = BANCHK_JOIN; + + for (ban = channel->banlist; ban; ban = ban->next) { if (!strncmp(ban->banstr, "~f:", 3)) { strlcpy(bantmp, ban->banstr + 3, sizeof(bantmp)); } else + if (!strncmp(ban->banstr, "~forward:", 9)) + { + strlcpy(bantmp, ban->banstr + 9, sizeof(bantmp)); + } else if (!strncmp(ban->banstr, "~t:", 3)) { /* A timed ban, but is it for us? Need to parse a little: @@ -376,6 +380,28 @@ int link_pre_localjoin_cb(Client *client, Channel *channel, char *parv[]) if (p && !strncmp(p, ":~f:", 4)) { strlcpy(bantmp, p + 4, sizeof(bantmp)); + } else + if (p && !strncmp(p, ":~forward:", 10)) + { + strlcpy(bantmp, p + 10, sizeof(bantmp)); + } else { + /* Not for us - some other ~t ban */ + continue; + } + } else + if (!strncmp(ban->banstr, "~time:", 6)) + { + /* A timed ban, but is it for us? Need to parse a little: + * ~t:dddd:~f:... + */ + char *p = strchr(ban->banstr + 6, ':'); + if (p && !strncmp(p, ":~f:", 4)) + { + strlcpy(bantmp, p + 4, sizeof(bantmp)); + } else + if (p && !strncmp(p, ":~forward:", 10)) + { + strlcpy(bantmp, p + 10, sizeof(bantmp)); } else { /* Not for us - some other ~t ban */ continue; @@ -391,26 +417,32 @@ int link_pre_localjoin_cb(Client *client, Channel *channel, char *parv[]) continue; *banmask++ = '\0'; - if (ban_check_mask(client, channel, banmask, BANCHK_JOIN, NULL, NULL, 0)) + b->banstr = banmask; + if (ban_check_mask(b)) + { + safe_free(b); return link_doforward(client, channel, banchan, LINKTYPE_BAN); + } } + + safe_free(b); } // Either +L is not set, or it is set but the parameter isn't stored somehow - if (!(channel->mode.extmode & EXTMODE_LINK) || !(linked = cm_getparameter(channel, 'L'))) + if (!(channel->mode.mode & EXTMODE_LINK) || !(linked = cm_getparameter(channel, 'L'))) return HOOK_CONTINUE; // can_join() actually returns 0 if we *can* join a channel, so we don't need to bother checking any further conditions - if (!(canjoin = can_join(client, channel, parv[2], parv))) + if (!(canjoin = can_join(client, channel, key, &error))) return HOOK_CONTINUE; // Oper only channel if (has_channel_mode(channel, 'O') && !IsOper(client)) return link_doforward(client, channel, linked, LINKTYPE_OPER); - // SSL/TLS connected users only + // TLS connected users only if (has_channel_mode(channel, 'z') && !IsSecureConnect(client)) - return link_doforward(client, channel, linked, LINKTYPE_SSL); + return link_doforward(client, channel, linked, LINKTYPE_SECURE); // Registered/identified users only if (has_channel_mode(channel, 'R') && !IsRegNick(client)) diff --git a/src/modules/chanmodes/moderated.c b/src/modules/chanmodes/moderated.c new file mode 100644 index 0000000..6a00d4a --- /dev/null +++ b/src/modules/chanmodes/moderated.c @@ -0,0 +1,117 @@ +/* + * Channel Mode +m + * (C) Copyright 2021 Syzop and the UnrealIRCd team + * + * This program is free 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 1, or (at your option) + * any later version. + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "unrealircd.h" + + +ModuleHeader MOD_HEADER + = { + "chanmodes/moderated", + "6.0", + "Channel Mode +m", + "UnrealIRCd Team", + "unrealircd-6", + }; + +/* Global variables */ +Cmode_t EXTCMODE_MODERATED; + +/* Forward declarations */ +int moderated_can_send_to_channel(Client *client, Channel *channel, Membership *lp, const char **msg, const char **errmsg, SendType sendtype); +const char *moderated_pre_local_part(Client *client, Channel *channel, const char *text); +int moderated_can_set_topic(Client *client, Channel *channel, const char *topic, const char **errmsg); + +/* Macros */ +#define IsModerated(channel) (channel->mode.mode & EXTCMODE_MODERATED) + +MOD_INIT() +{ + CmodeInfo req; + + MARK_AS_OFFICIAL_MODULE(modinfo); + + memset(&req, 0, sizeof(req)); + req.paracount = 0; + req.letter = 'm'; + req.is_ok = extcmode_default_requirehalfop; + CmodeAdd(modinfo->handle, req, &EXTCMODE_MODERATED); + + HookAdd(modinfo->handle, HOOKTYPE_CAN_SEND_TO_CHANNEL, 0, moderated_can_send_to_channel); + HookAddConstString(modinfo->handle, HOOKTYPE_PRE_LOCAL_PART, 0, moderated_pre_local_part); + HookAdd(modinfo->handle, HOOKTYPE_CAN_SET_TOPIC, 0, moderated_can_set_topic); + + return MOD_SUCCESS; +} + +MOD_LOAD() +{ + return MOD_SUCCESS; +} + +MOD_UNLOAD() +{ + return MOD_SUCCESS; +} + +int moderated_can_send_to_channel(Client *client, Channel *channel, Membership *m, const char **msg, const char **errmsg, SendType sendtype) +{ + if (IsModerated(channel) && (!m || !check_channel_access_membership(m, "vhoaq")) && + !op_can_override("channel:override:message:moderated",client,channel,NULL)) + { + Hook *h; + for (h = Hooks[HOOKTYPE_CAN_BYPASS_CHANNEL_MESSAGE_RESTRICTION]; h; h = h->next) + { + int i = (*(h->func.intfunc))(client, channel, BYPASS_CHANMSG_MODERATED); + if (i == HOOK_ALLOW) + return HOOK_CONTINUE; /* bypass +m restriction */ + if (i != HOOK_CONTINUE) + break; + } + + *errmsg = "You need voice (+v)"; + return HOOK_DENY; /* BLOCK message */ + } + + return HOOK_CONTINUE; +} + +/** Remove PART reason too if the channel is +m, -t, and user not +vhoaq */ +const char *moderated_pre_local_part(Client *client, Channel *channel, const char *text) +{ + if (IsModerated(channel) && !check_channel_access(client, channel, "v") && !check_channel_access(client, channel, "h")) + return NULL; + return text; +} + +int moderated_can_set_topic(Client *client, Channel *channel, const char *topic, const char **errmsg) +{ + static char errmsg_buf[NICKLEN+256]; + + /* Channel is +m but user is not +vhoaq: reject the topic change */ + if (has_channel_mode(channel, 'm') && !check_channel_access(client, channel, "vhoaq")) + { + char buf[512]; + snprintf(buf, sizeof(buf), "Voice (+v) or higher is required in order to change the topic on %s (channel is +m)", channel->name); + buildnumeric(errmsg_buf, sizeof(errmsg_buf), client, ERR_CANNOTDOCOMMAND, "TOPIC", buf); + *errmsg = errmsg_buf; + return EX_DENY; + } + + return EX_ALLOW; +} diff --git a/src/modules/chanmodes/nocolor.c b/src/modules/chanmodes/nocolor.c index 6f2dab5..9544368 100644 --- a/src/modules/chanmodes/nocolor.c +++ b/src/modules/chanmodes/nocolor.c @@ -27,16 +27,16 @@ ModuleHeader MOD_HEADER "4.2", "Channel Mode +c", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; Cmode_t EXTCMODE_NOCOLOR; -#define IsNoColor(channel) (channel->mode.extmode & EXTCMODE_NOCOLOR) +#define IsNoColor(channel) (channel->mode.mode & EXTCMODE_NOCOLOR) -int nocolor_can_send_to_channel(Client *client, Channel *channel, Membership *lp, char **msg, char **errmsg, SendType sendtype); -char *nocolor_prelocalpart(Client *client, Channel *channel, char *comment); -char *nocolor_prelocalquit(Client *client, char *comment); +int nocolor_can_send_to_channel(Client *client, Channel *channel, Membership *lp, const char **msg, const char **errmsg, SendType sendtype); +const char *nocolor_prelocalpart(Client *client, Channel *channel, const char *comment); +const char *nocolor_prelocalquit(Client *client, const char *comment); MOD_TEST() { @@ -50,14 +50,14 @@ CmodeInfo req; /* Channel mode */ memset(&req, 0, sizeof(req)); req.paracount = 0; - req.flag = 'c'; + req.letter = 'c'; req.is_ok = extcmode_default_requirechop; CmodeAdd(modinfo->handle, req, &EXTCMODE_NOCOLOR); HookAdd(modinfo->handle, HOOKTYPE_CAN_SEND_TO_CHANNEL, 0, nocolor_can_send_to_channel); - HookAddPChar(modinfo->handle, HOOKTYPE_PRE_LOCAL_PART, 0, nocolor_prelocalpart); - HookAddPChar(modinfo->handle, HOOKTYPE_PRE_LOCAL_QUIT_CHAN, 0, nocolor_prelocalpart); - HookAddPChar(modinfo->handle, HOOKTYPE_PRE_LOCAL_QUIT, 0, nocolor_prelocalquit); + HookAddConstString(modinfo->handle, HOOKTYPE_PRE_LOCAL_PART, 0, nocolor_prelocalpart); + HookAddConstString(modinfo->handle, HOOKTYPE_PRE_LOCAL_QUIT_CHAN, 0, nocolor_prelocalpart); + HookAddConstString(modinfo->handle, HOOKTYPE_PRE_LOCAL_QUIT, 0, nocolor_prelocalquit); MARK_AS_OFFICIAL_MODULE(modinfo); return MOD_SUCCESS; @@ -73,7 +73,7 @@ MOD_UNLOAD() return MOD_SUCCESS; } -static int IsUsingColor(char *s) +static int IsUsingColor(const char *s) { if (!s) return 0; @@ -85,7 +85,7 @@ static int IsUsingColor(char *s) return 0; } -int nocolor_can_send_to_channel(Client *client, Channel *channel, Membership *lp, char **msg, char **errmsg, SendType sendtype) +int nocolor_can_send_to_channel(Client *client, Channel *channel, Membership *lp, const char **msg, const char **errmsg, SendType sendtype) { Hook *h; int i; @@ -108,7 +108,7 @@ int nocolor_can_send_to_channel(Client *client, Channel *channel, Membership *lp return HOOK_CONTINUE; } -char *nocolor_prelocalpart(Client *client, Channel *channel, char *comment) +const char *nocolor_prelocalpart(Client *client, Channel *channel, const char *comment) { if (!comment) return NULL; @@ -130,7 +130,7 @@ static int IsAnyChannelNoColor(Client *client) return 0; } -char *nocolor_prelocalquit(Client *client, char *comment) +const char *nocolor_prelocalquit(Client *client, const char *comment) { if (!comment) return NULL; diff --git a/src/modules/chanmodes/noctcp.c b/src/modules/chanmodes/noctcp.c index 058f20a..3ce69db 100644 --- a/src/modules/chanmodes/noctcp.c +++ b/src/modules/chanmodes/noctcp.c @@ -27,14 +27,14 @@ ModuleHeader MOD_HEADER "4.2", "Channel Mode +C", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; Cmode_t EXTCMODE_NOCTCP; -#define IsNoCTCP(channel) (channel->mode.extmode & EXTCMODE_NOCTCP) +#define IsNoCTCP(channel) (channel->mode.mode & EXTCMODE_NOCTCP) -int noctcp_can_send_to_channel(Client *client, Channel *channel, Membership *lp, char **msg, char **errmsg, SendType sendtype); +int noctcp_can_send_to_channel(Client *client, Channel *channel, Membership *lp, const char **msg, const char **errmsg, SendType sendtype); MOD_TEST() { @@ -47,7 +47,7 @@ CmodeInfo req; memset(&req, 0, sizeof(req)); req.paracount = 0; - req.flag = 'C'; + req.letter = 'C'; req.is_ok = extcmode_default_requirehalfop; CmodeAdd(modinfo->handle, req, &EXTCMODE_NOCTCP); @@ -67,7 +67,7 @@ MOD_UNLOAD() return MOD_SUCCESS; } -static int IsACTCP(char *s) +static int IsACTCP(const char *s) { if (!s) return 0; @@ -78,7 +78,7 @@ static int IsACTCP(char *s) return 0; } -int noctcp_can_send_to_channel(Client *client, Channel *channel, Membership *lp, char **msg, char **errmsg, SendType sendtype) +int noctcp_can_send_to_channel(Client *client, Channel *channel, Membership *lp, const char **msg, const char **errmsg, SendType sendtype) { if (IsNoCTCP(channel) && IsACTCP(*msg)) { diff --git a/src/modules/chanmodes/noexternalmsgs.c b/src/modules/chanmodes/noexternalmsgs.c new file mode 100644 index 0000000..1de63ad --- /dev/null +++ b/src/modules/chanmodes/noexternalmsgs.c @@ -0,0 +1,89 @@ +/* + * Channel Mode +n + * (C) Copyright 2021 Syzop and the UnrealIRCd team + * + * This program is free 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 1, or (at your option) + * any later version. + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "unrealircd.h" + + +ModuleHeader MOD_HEADER + = { + "chanmodes/noexternalmsgs", + "6.0", + "Channel Mode +n", + "UnrealIRCd Team", + "unrealircd-6", + }; + +Cmode_t EXTCMODE_NO_EXTERNAL_MESSAGES; + +#define IsNoExternalMessages(channel) (channel->mode.mode & EXTCMODE_NO_EXTERNAL_MESSAGES) + +int noexternalmsgs_can_send_to_channel(Client *client, Channel *channel, Membership *lp, const char **msg, const char **errmsg, SendType sendtype); + +MOD_INIT() +{ + CmodeInfo req; + + MARK_AS_OFFICIAL_MODULE(modinfo); + + memset(&req, 0, sizeof(req)); + req.paracount = 0; + req.letter = 'n'; + req.is_ok = extcmode_default_requirehalfop; + CmodeAdd(modinfo->handle, req, &EXTCMODE_NO_EXTERNAL_MESSAGES); + + HookAdd(modinfo->handle, HOOKTYPE_CAN_SEND_TO_CHANNEL, 0, noexternalmsgs_can_send_to_channel); + + return MOD_SUCCESS; +} + +MOD_LOAD() +{ + return MOD_SUCCESS; +} + +MOD_UNLOAD() +{ + return MOD_SUCCESS; +} + +int noexternalmsgs_can_send_to_channel(Client *client, Channel *channel, Membership *lp, const char **msg, const char **errmsg, SendType sendtype) +{ + if (IsNoExternalMessages(channel) && !IsMember(client,channel)) + { + /* Channel does not accept external messages (+n). + * Reject, unless HOOKTYPE_CAN_BYPASS_NO_EXTERNAL_MSGS tells otherwise. + */ + Hook *h; + int i; + + for (h = Hooks[HOOKTYPE_CAN_BYPASS_CHANNEL_MESSAGE_RESTRICTION]; h; h = h->next) + { + i = (*(h->func.intfunc))(client, channel, BYPASS_CHANMSG_EXTERNAL); + if (i == HOOK_ALLOW) + return HOOK_CONTINUE; /* bypass +n restriction */ + if (i != HOOK_CONTINUE) + break; + } + + *errmsg = "No external channel messages"; + return HOOK_DENY; /* BLOCK message */ + } + + return HOOK_CONTINUE; +} diff --git a/src/modules/chanmodes/noinvite.c b/src/modules/chanmodes/noinvite.c index d6874aa..2d81825 100644 --- a/src/modules/chanmodes/noinvite.c +++ b/src/modules/chanmodes/noinvite.c @@ -27,14 +27,14 @@ ModuleHeader MOD_HEADER "4.2", "Channel Mode +V", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; Cmode_t EXTCMODE_NOINVITE; -#define IsNoInvite(channel) (channel->mode.extmode & EXTCMODE_NOINVITE) +#define IsNoInvite(channel) (channel->mode.mode & EXTCMODE_NOINVITE) -int noinvite_pre_knock(Client *client, Channel *channel); +int noinvite_pre_knock(Client *client, Channel *channel, const char **reason); int noinvite_pre_invite(Client *client, Client *target, Channel *channel, int *override); MOD_TEST() @@ -48,7 +48,7 @@ MOD_INIT() memset(&req, 0, sizeof(req)); req.paracount = 0; - req.flag = 'V'; + req.letter = 'V'; req.is_ok = extcmode_default_requirechop; CmodeAdd(modinfo->handle, req, &EXTCMODE_NOINVITE); @@ -70,12 +70,12 @@ MOD_UNLOAD() } -int noinvite_pre_knock(Client *client, Channel *channel) +int noinvite_pre_knock(Client *client, Channel *channel, const char **reason) { if (MyUser(client) && IsNoInvite(channel)) { - sendnumeric(client, ERR_CANNOTKNOCK, - channel->chname, "The channel does not allow invites (+V)"); + sendnumeric(client, ERR_CANNOTKNOCK, channel->name, + "The channel does not allow invites (+V)"); return HOOK_DENY; } @@ -90,7 +90,7 @@ int noinvite_pre_invite(Client *client, Client *target, Channel *channel, int *o { *override = 1; } else { - sendnumeric(client, ERR_NOINVITE, channel->chname); + sendnumeric(client, ERR_NOINVITE, channel->name); return HOOK_DENY; } } diff --git a/src/modules/chanmodes/nokick.c b/src/modules/chanmodes/nokick.c index 899d7c9..56cb115 100644 --- a/src/modules/chanmodes/nokick.c +++ b/src/modules/chanmodes/nokick.c @@ -26,14 +26,14 @@ ModuleHeader MOD_HEADER "4.2", "Channel Mode +Q", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; Cmode_t EXTCMODE_NOKICK; -#define IsNoKick(channel) (channel->mode.extmode & EXTCMODE_NOKICK) +#define IsNoKick(channel) (channel->mode.mode & EXTCMODE_NOKICK) -int nokick_check (Client *client, Client *who, Channel *channel, char *comment, long client_flags, long who_flags, char **reject_reason); +int nokick_check (Client *client, Client *target, Channel *channel, const char *comment, const char *client_member_modes, const char *target_member_modes, const char **reject_reason); MOD_TEST() { @@ -46,7 +46,7 @@ MOD_INIT() memset(&req, 0, sizeof(req)); req.paracount = 0; - req.flag = 'Q'; + req.letter = 'Q'; req.is_ok = extcmode_default_requirechop; CmodeAdd(modinfo->handle, req, &EXTCMODE_NOKICK); @@ -67,7 +67,7 @@ MOD_UNLOAD() return MOD_SUCCESS; } -int nokick_check (Client *client, Client *who, Channel *channel, char *comment, long client_flags, long who_flags, char **reject_reason) +int nokick_check (Client *client, Client *target, Channel *channel, const char *comment, const char *client_member_modes, const char *target_member_modes, const char **reject_reason) { static char errmsg[256]; diff --git a/src/modules/chanmodes/noknock.c b/src/modules/chanmodes/noknock.c index d5b36a4..ac5f1f6 100644 --- a/src/modules/chanmodes/noknock.c +++ b/src/modules/chanmodes/noknock.c @@ -25,15 +25,15 @@ ModuleHeader MOD_HEADER "4.2", "Channel Mode +K", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; Cmode_t EXTCMODE_NOKNOCK; -#define IsNoKnock(channel) (channel->mode.extmode & EXTCMODE_NOKNOCK) +#define IsNoKnock(channel) (channel->mode.mode & EXTCMODE_NOKNOCK) -int noknock_check (Client *client, Channel *channel); -int noknock_mode_allow(Client *client, Channel *channel, char mode, char *para, int checkt, int what); +int noknock_check_knock(Client *client, Channel *channel, const char **reason); +int noknock_mode_allow(Client *client, Channel *channel, char mode, const char *para, int checkt, int what); int noknock_mode_del (Channel *channel, int modeChar); MOD_TEST() @@ -47,11 +47,11 @@ CmodeInfo req; memset(&req, 0, sizeof(req)); req.paracount = 0; - req.flag = 'K'; + req.letter = 'K'; req.is_ok = noknock_mode_allow; CmodeAdd(modinfo->handle, req, &EXTCMODE_NOKNOCK); - HookAdd(modinfo->handle, HOOKTYPE_PRE_KNOCK, 0, noknock_check); + HookAdd(modinfo->handle, HOOKTYPE_PRE_KNOCK, 0, noknock_check_knock); HookAdd(modinfo->handle, HOOKTYPE_MODECHAR_DEL, 0, noknock_mode_del); @@ -70,11 +70,11 @@ MOD_UNLOAD() } -int noknock_check (Client *client, Channel *channel) +int noknock_check_knock (Client *client, Channel *channel, const char **reason) { if (MyUser(client) && IsNoKnock(channel)) { - sendnumeric(client, ERR_CANNOTKNOCK, channel->chname, "No knocks are allowed! (+K)"); + sendnumeric(client, ERR_CANNOTKNOCK, channel->name, "No knocks are allowed! (+K)"); return HOOK_DENY; } @@ -85,14 +85,14 @@ int noknock_mode_del (Channel *channel, int modeChar) { // Remove noknock when we're removing invite only if (modeChar == 'i') - channel->mode.extmode &= ~EXTCMODE_NOKNOCK; + channel->mode.mode &= ~EXTCMODE_NOKNOCK; return 0; } -int noknock_mode_allow(Client *client, Channel *channel, char mode, char *para, int checkt, int what) +int noknock_mode_allow(Client *client, Channel *channel, char mode, const char *para, int checkt, int what) { - if (!(channel->mode.mode & MODE_INVITEONLY)) + if (!has_channel_mode(channel, 'i')) { if (checkt == EXCHK_ACCESS_ERR) { diff --git a/src/modules/chanmodes/nonickchange.c b/src/modules/chanmodes/nonickchange.c index 1d28e38..88a411c 100644 --- a/src/modules/chanmodes/nonickchange.c +++ b/src/modules/chanmodes/nonickchange.c @@ -26,12 +26,12 @@ ModuleHeader MOD_HEADER "4.2", "Channel Mode +N", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; Cmode_t EXTCMODE_NONICKCHANGE; -#define IsNoNickChange(channel) (channel->mode.extmode & EXTCMODE_NONICKCHANGE) +#define IsNoNickChange(channel) (channel->mode.mode & EXTCMODE_NONICKCHANGE) int nonickchange_check (Client *client, Channel *channel); @@ -46,7 +46,7 @@ CmodeInfo req; memset(&req, 0, sizeof(req)); req.paracount = 0; - req.flag = 'N'; + req.letter = 'N'; req.is_ok = extcmode_default_requirehalfop; CmodeAdd(modinfo->handle, req, &EXTCMODE_NONICKCHANGE); @@ -71,7 +71,7 @@ int nonickchange_check (Client *client, Channel *channel) { if (!IsOper(client) && !IsULine(client) && IsNoNickChange(channel) - && !is_chan_op(client, channel)) + && !check_channel_access(client, channel, "oaq")) { return HOOK_DENY; } diff --git a/src/modules/chanmodes/nonotice.c b/src/modules/chanmodes/nonotice.c index 0d60023..7c63b35 100644 --- a/src/modules/chanmodes/nonotice.c +++ b/src/modules/chanmodes/nonotice.c @@ -25,14 +25,14 @@ ModuleHeader MOD_HEADER "4.2", "Channel Mode +T", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; Cmode_t EXTCMODE_NONOTICE; -#define IsNoNotice(channel) (channel->mode.extmode & EXTCMODE_NONOTICE) +#define IsNoNotice(channel) (channel->mode.mode & EXTCMODE_NONOTICE) -int nonotice_check_can_send_to_channel(Client *client, Channel *channel, Membership *lp, char **msg, char **errmsg, SendType sendtype); +int nonotice_check_can_send_to_channel(Client *client, Channel *channel, Membership *lp, const char **msg, const char **errmsg, SendType sendtype); MOD_TEST() { @@ -45,7 +45,7 @@ MOD_INIT() memset(&req, 0, sizeof(req)); req.paracount = 0; - req.flag = 'T'; + req.letter = 'T'; req.is_ok = extcmode_default_requirechop; CmodeAdd(modinfo->handle, req, &EXTCMODE_NONOTICE); @@ -65,14 +65,14 @@ MOD_UNLOAD() return MOD_SUCCESS; } -int nonotice_check_can_send_to_channel(Client *client, Channel *channel, Membership *lp, char **msg, char **errmsg, SendType sendtype) +int nonotice_check_can_send_to_channel(Client *client, Channel *channel, Membership *lp, const char **msg, const char **errmsg, SendType sendtype) { Hook *h; int i; if ((sendtype == SEND_TYPE_NOTICE) && IsNoNotice(channel) && - (!lp || !(lp->flags & (CHFL_CHANOP | CHFL_CHANOWNER | CHFL_CHANADMIN)))) + !check_channel_access_membership(lp, "oaq")) { for (h = Hooks[HOOKTYPE_CAN_BYPASS_CHANNEL_MESSAGE_RESTRICTION]; h; h = h->next) { diff --git a/src/modules/chanmodes/operonly.c b/src/modules/chanmodes/operonly.c index 4b959c0..3c4b4f7 100644 --- a/src/modules/chanmodes/operonly.c +++ b/src/modules/chanmodes/operonly.c @@ -27,15 +27,15 @@ ModuleHeader MOD_HEADER "4.2", "Channel Mode +O", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; Cmode_t EXTCMODE_OPERONLY; -int operonly_require_oper(Client *client, Channel *channel, char mode, char *para, int checkt, int what); -int operonly_check (Client *client, Channel *channel, char *key, char *parv[]); -int operonly_topic_allow (Client *client, Channel *channel); -int operonly_check_ban(Client *client, Channel *channel); +int operonly_require_oper(Client *client, Channel *channel, char mode, const char *para, int checkt, int what); +int operonly_can_join(Client *client, Channel *channel, const char *key, char **errmsg); +int operonly_view_topic_outside_channel(Client *client, Channel *channel); +int operonly_oper_invite_ban(Client *client, Channel *channel); MOD_TEST() { @@ -48,13 +48,13 @@ CmodeInfo req; memset(&req, 0, sizeof(req)); req.paracount = 0; - req.flag = 'O'; + req.letter = 'O'; req.is_ok = operonly_require_oper; CmodeAdd(modinfo->handle, req, &EXTCMODE_OPERONLY); - HookAdd(modinfo->handle, HOOKTYPE_CAN_JOIN, 0, operonly_check); - HookAdd(modinfo->handle, HOOKTYPE_OPER_INVITE_BAN, 0, operonly_check_ban); - HookAdd(modinfo->handle, HOOKTYPE_VIEW_TOPIC_OUTSIDE_CHANNEL, 0, operonly_topic_allow); + HookAdd(modinfo->handle, HOOKTYPE_CAN_JOIN, 0, operonly_can_join); + HookAdd(modinfo->handle, HOOKTYPE_OPER_INVITE_BAN, 0, operonly_oper_invite_ban); + HookAdd(modinfo->handle, HOOKTYPE_VIEW_TOPIC_OUTSIDE_CHANNEL, 0, operonly_view_topic_outside_channel); MARK_AS_OFFICIAL_MODULE(modinfo); @@ -71,31 +71,34 @@ MOD_UNLOAD() return MOD_SUCCESS; } -int operonly_check (Client *client, Channel *channel, char *key, char *parv[]) +int operonly_can_join(Client *client, Channel *channel, const char *key, char **errmsg) { - if ((channel->mode.extmode & EXTCMODE_OPERONLY) && !ValidatePermissionsForPath("channel:operonly:join",client,NULL,channel,NULL)) + if ((channel->mode.mode & EXTCMODE_OPERONLY) && !ValidatePermissionsForPath("channel:operonly:join",client,NULL,channel,NULL)) + { + *errmsg = STR_ERR_OPERONLY; return ERR_OPERONLY; + } return 0; } -int operonly_check_ban(Client *client, Channel *channel) +int operonly_oper_invite_ban(Client *client, Channel *channel) { - if ((channel->mode.extmode & EXTCMODE_OPERONLY) && + if ((channel->mode.mode & EXTCMODE_OPERONLY) && !ValidatePermissionsForPath("channel:operonly:ban",client,NULL,NULL,NULL)) return HOOK_DENY; return HOOK_CONTINUE; } -int operonly_topic_allow (Client *client, Channel *channel) +int operonly_view_topic_outside_channel(Client *client, Channel *channel) { - if (channel->mode.extmode & EXTCMODE_OPERONLY && !ValidatePermissionsForPath("channel:operonly:topic",client,NULL,channel,NULL)) + if (channel->mode.mode & EXTCMODE_OPERONLY && !ValidatePermissionsForPath("channel:operonly:topic",client,NULL,channel,NULL)) return HOOK_DENY; return HOOK_CONTINUE; } -int operonly_require_oper(Client *client, Channel *channel, char mode, char *para, int checkt, int what) +int operonly_require_oper(Client *client, Channel *channel, char mode, const char *para, int checkt, int what) { if (!MyUser(client) || ValidatePermissionsForPath("channel:operonly:set",client,NULL,channel,NULL)) return EX_ALLOW; diff --git a/src/modules/chanmodes/permanent.c b/src/modules/chanmodes/permanent.c index bccc443..e52c9f7 100644 --- a/src/modules/chanmodes/permanent.c +++ b/src/modules/chanmodes/permanent.c @@ -25,20 +25,20 @@ ModuleHeader MOD_HEADER "4.2", "Permanent channel mode (+P)", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; static Cmode_t EXTMODE_PERMANENT = 0L; static int permanent_channel_destroy(Channel *channel, int *should_destroy) { - if (channel->mode.extmode & EXTMODE_PERMANENT) + if (channel->mode.mode & EXTMODE_PERMANENT) *should_destroy = 0; return 0; } -static int permanent_is_ok(Client *client, Channel *channel, char mode, char *para, int checkt, int what) +static int permanent_is_ok(Client *client, Channel *channel, char mode, const char *para, int checkt, int what) { if (!IsOper(client)) { @@ -51,14 +51,17 @@ static int permanent_is_ok(Client *client, Channel *channel, char mode, char *pa return EX_ALLOW; } -int permanent_chanmode(Client *client, Channel *channel, MessageTag *mtags, char *modebuf, char *parabuf, time_t sendts, int samode) +int permanent_chanmode(Client *client, Channel *channel, MessageTag *mtags, const char *modebuf, const char *parabuf, time_t sendts, int samode, int *destroy_channel) { if (samode == -1) return 0; /* SJOIN server-sync, already has its own way of destroying the channel */ /* Destroy the channel if it was set '(SA)MODE #chan -P' with nobody in it (#4442) */ - if (!(channel->mode.extmode & EXTMODE_PERMANENT) && (channel->users <= 0)) + if (!(channel->mode.mode & EXTMODE_PERMANENT) && (channel->users <= 0)) + { sub1_from_channel(channel); + *destroy_channel = 1; + } return 0; } @@ -72,7 +75,7 @@ CmodeInfo req; memset(&req, 0, sizeof(req)); req.paracount = 0; - req.flag = 'P'; + req.letter = 'P'; req.is_ok = permanent_is_ok; CmodeAdd(modinfo->handle, req, &EXTMODE_PERMANENT); diff --git a/src/modules/snomasks/dccreject.c b/src/modules/chanmodes/private.c similarity index 52% rename from src/modules/snomasks/dccreject.c rename to src/modules/chanmodes/private.c index 50bccdd..d292050 100644 --- a/src/modules/snomasks/dccreject.c +++ b/src/modules/chanmodes/private.c @@ -1,6 +1,6 @@ /* - * Show DCC SEND rejection notices (Snomask +D) - * (C) Copyright 2000-.. Bram Matthys (Syzop) and the UnrealIRCd team + * Channel Mode +p + * (C) Copyright 2021 Syzop and the UnrealIRCd team * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,34 +19,36 @@ #include "unrealircd.h" -/* Module header */ + ModuleHeader MOD_HEADER = { - "snomasks/dccreject", - "4.2", - "Snomask +D", + "chanmodes/private", + "6.0", + "Channel Mode +p", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; -/* Global variables */ -long SNO_DCCREJECT = 0L; +Cmode_t EXTCMODE_PRIVATE; -/* Forward declarations */ -int dccreject_dcc_denied(Client *client, char *target, char *realfile, char *displayfile, ConfigItem_deny_dcc *dccdeny); +#define IsPrivate(channel) (channel->mode.mode & EXTCMODE_PRIVATE) -MOD_TEST() -{ - return MOD_SUCCESS; -} +int private_modechar_add(Channel *channel, int modechar); MOD_INIT() { - SnomaskAdd(modinfo->handle, 'D', umode_allow_opers, &SNO_DCCREJECT); - - HookAdd(modinfo->handle, HOOKTYPE_DCC_DENIED, 0, dccreject_dcc_denied); - + CmodeInfo req; + MARK_AS_OFFICIAL_MODULE(modinfo); + + memset(&req, 0, sizeof(req)); + req.paracount = 0; + req.letter = 'p'; + req.is_ok = extcmode_default_requirehalfop; + CmodeAdd(modinfo->handle, req, &EXTCMODE_PRIVATE); + + HookAdd(modinfo->handle, HOOKTYPE_MODECHAR_ADD, 0, private_modechar_add); + return MOD_SUCCESS; } @@ -60,11 +62,12 @@ MOD_UNLOAD() return MOD_SUCCESS; } -int dccreject_dcc_denied(Client *client, char *target, char *realfile, char *displayfile, ConfigItem_deny_dcc *dccdeny) +/** This clears channel mode +p when +s gets set */ +int private_modechar_add(Channel *channel, int modechar) { - sendto_snomask_global(SNO_DCCREJECT, - "%s tried to send forbidden file %s (%s) to %s (is blocked now)", - client->name, displayfile, dccdeny->reason, target); - + if (modechar == 's') + { + channel->mode.mode &= ~EXTCMODE_PRIVATE; + } return 0; } diff --git a/src/modules/chanmodes/regonly.c b/src/modules/chanmodes/regonly.c index 8b1b559..b35100c 100644 --- a/src/modules/chanmodes/regonly.c +++ b/src/modules/chanmodes/regonly.c @@ -26,14 +26,14 @@ ModuleHeader MOD_HEADER "4.2", "Channel Mode +R", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; Cmode_t EXTCMODE_REGONLY; -#define IsRegOnly(channel) (channel->mode.extmode & EXTCMODE_REGONLY) +#define IsRegOnly(channel) (channel->mode.mode & EXTCMODE_REGONLY) -int regonly_check (Client *client, Channel *channel, char *key, char *parv[]); +int regonly_check(Client *client, Channel *channel, const char *key, char **errmsg); MOD_TEST() @@ -47,7 +47,7 @@ CmodeInfo req; memset(&req, 0, sizeof(req)); req.paracount = 0; - req.flag = 'R'; + req.letter = 'R'; req.is_ok = extcmode_default_requirehalfop; CmodeAdd(modinfo->handle, req, &EXTCMODE_REGONLY); @@ -68,10 +68,13 @@ MOD_UNLOAD() return MOD_SUCCESS; } -int regonly_check (Client *client, Channel *channel, char *key, char *parv[]) +int regonly_check (Client *client, Channel *channel, const char *key, char **errmsg) { if (IsRegOnly(channel) && !IsLoggedIn(client)) + { + *errmsg = STR_ERR_NEEDREGGEDNICK; return ERR_NEEDREGGEDNICK; + } return 0; } diff --git a/src/modules/chanmodes/regonlyspeak.c b/src/modules/chanmodes/regonlyspeak.c index 33e2c5b..656dd06 100644 --- a/src/modules/chanmodes/regonlyspeak.c +++ b/src/modules/chanmodes/regonlyspeak.c @@ -26,16 +26,16 @@ ModuleHeader MOD_HEADER "4.2", "Channel Mode +M", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; Cmode_t EXTCMODE_REGONLYSPEAK; static char errMsg[2048]; -#define IsRegOnlySpeak(channel) (channel->mode.extmode & EXTCMODE_REGONLYSPEAK) +#define IsRegOnlySpeak(channel) (channel->mode.mode & EXTCMODE_REGONLYSPEAK) -int regonlyspeak_can_send_to_channel(Client *client, Channel *channel, Membership *lp, char **msg, char **errmsg, SendType sendtype); -char *regonlyspeak_part_message (Client *client, Channel *channel, char *comment); +int regonlyspeak_can_send_to_channel(Client *client, Channel *channel, Membership *lp, const char **msg, const char **errmsg, SendType sendtype); +const char *regonlyspeak_part_message (Client *client, Channel *channel, const char *comment); MOD_TEST() { @@ -48,12 +48,12 @@ MOD_INIT() memset(&req, 0, sizeof(req)); req.paracount = 0; - req.flag = 'M'; + req.letter = 'M'; req.is_ok = extcmode_default_requirehalfop; CmodeAdd(modinfo->handle, req, &EXTCMODE_REGONLYSPEAK); HookAdd(modinfo->handle, HOOKTYPE_CAN_SEND_TO_CHANNEL, 0, regonlyspeak_can_send_to_channel); - HookAddPChar(modinfo->handle, HOOKTYPE_PRE_LOCAL_PART, 0, regonlyspeak_part_message); + HookAddConstString(modinfo->handle, HOOKTYPE_PRE_LOCAL_PART, 0, regonlyspeak_part_message); MARK_AS_OFFICIAL_MODULE(modinfo); @@ -70,7 +70,7 @@ MOD_UNLOAD() return MOD_SUCCESS; } -char *regonlyspeak_part_message (Client *client, Channel *channel, char *comment) +const char *regonlyspeak_part_message (Client *client, Channel *channel, const char *comment) { if (!comment) return NULL; @@ -81,15 +81,15 @@ char *regonlyspeak_part_message (Client *client, Channel *channel, char *comment return comment; } -int regonlyspeak_can_send_to_channel(Client *client, Channel *channel, Membership *lp, char **msg, char **errmsg, SendType sendtype) +int regonlyspeak_can_send_to_channel(Client *client, Channel *channel, Membership *lp, const char **msg, const char **errmsg, SendType sendtype) { Hook *h; int i; - if (IsRegOnlySpeak(channel) && !op_can_override("channel:override:message:regonlyspeak",client,channel,NULL) && !IsLoggedIn(client) && - (!lp - || !(lp->flags & (CHFL_CHANOP | CHFL_VOICE | CHFL_CHANOWNER | - CHFL_HALFOP | CHFL_CHANADMIN)))) + if (IsRegOnlySpeak(channel) && + !op_can_override("channel:override:message:regonlyspeak",client,channel,NULL) && + !IsLoggedIn(client) && + !check_channel_access_membership(lp, "vhoaq")) { for (h = Hooks[HOOKTYPE_CAN_BYPASS_CHANNEL_MESSAGE_RESTRICTION]; h; h = h->next) { diff --git a/src/modules/chanmodes/secret.c b/src/modules/chanmodes/secret.c new file mode 100644 index 0000000..0487a29 --- /dev/null +++ b/src/modules/chanmodes/secret.c @@ -0,0 +1,73 @@ +/* + * Channel Mode +s + * (C) Copyright 2021 Syzop and the UnrealIRCd team + * + * This program is free 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 1, or (at your option) + * any later version. + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "unrealircd.h" + + +ModuleHeader MOD_HEADER + = { + "chanmodes/secret", + "6.0", + "Channel Mode +s", + "UnrealIRCd Team", + "unrealircd-6", + }; + +Cmode_t EXTCMODE_SECRET; + +#define IsSecret(channel) (channel->mode.mode & EXTCMODE_SECRET) + +int secret_modechar_add(Channel *channel, int modechar); + +MOD_INIT() +{ + CmodeInfo req; + + MARK_AS_OFFICIAL_MODULE(modinfo); + + memset(&req, 0, sizeof(req)); + req.paracount = 0; + req.letter = 's'; + req.is_ok = extcmode_default_requirehalfop; + CmodeAdd(modinfo->handle, req, &EXTCMODE_SECRET); + + HookAdd(modinfo->handle, HOOKTYPE_MODECHAR_ADD, 0, secret_modechar_add); + + return MOD_SUCCESS; +} + +MOD_LOAD() +{ + return MOD_SUCCESS; +} + +MOD_UNLOAD() +{ + return MOD_SUCCESS; +} + +/** This clears channel mode +s when +p gets set */ +int secret_modechar_add(Channel *channel, int modechar) +{ + if (modechar == 'p') + { + channel->mode.mode &= ~EXTCMODE_SECRET; + } + return 0; +} diff --git a/src/modules/chanmodes/secureonly.c b/src/modules/chanmodes/secureonly.c index 4bd3dcb..084997b 100644 --- a/src/modules/chanmodes/secureonly.c +++ b/src/modules/chanmodes/secureonly.c @@ -25,18 +25,18 @@ ModuleHeader MOD_HEADER "4.2", "Channel Mode +z", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; Cmode_t EXTCMODE_SECUREONLY; -#define IsSecureOnly(channel) (channel->mode.extmode & EXTCMODE_SECUREONLY) +#define IsSecureOnly(channel) (channel->mode.mode & EXTCMODE_SECUREONLY) -int secureonly_check_join(Client *client, Channel *channel, char *key, char *parv[]); +int secureonly_check_join(Client *client, Channel *channel, const char *key, char **errmsg); int secureonly_channel_sync (Channel *channel, int merge, int removetheirs, int nomode); int secureonly_check_secure(Channel *channel); int secureonly_check_sajoin(Client *target, Channel *channel, Client *requester); -int secureonly_specialcheck(Client *client, Channel *channel, char *parv[]); +int secureonly_pre_local_join(Client *client, Channel *channel, const char *key); MOD_TEST() { @@ -49,11 +49,11 @@ MOD_INIT() memset(&req, 0, sizeof(req)); req.paracount = 0; - req.flag = 'z'; + req.letter = 'z'; req.is_ok = extcmode_default_requirechop; CmodeAdd(modinfo->handle, req, &EXTCMODE_SECUREONLY); - HookAdd(modinfo->handle, HOOKTYPE_PRE_LOCAL_JOIN, 0, secureonly_specialcheck); + HookAdd(modinfo->handle, HOOKTYPE_PRE_LOCAL_JOIN, 0, secureonly_pre_local_join); HookAdd(modinfo->handle, HOOKTYPE_CAN_JOIN, 0, secureonly_check_join); HookAdd(modinfo->handle, HOOKTYPE_CHANNEL_SYNCED, 0, secureonly_channel_sync); HookAdd(modinfo->handle, HOOKTYPE_IS_CHANNEL_SECURE, 0, secureonly_check_secure); @@ -95,39 +95,39 @@ static int secureonly_kick_insecure_users(Channel *channel) client = member->client; if (MyUser(client) && !IsSecureConnect(client) && !IsULine(client)) { - int prefix = 0; + char *prefix = NULL; MessageTag *mtags = NULL; if (invisible_user_in_channel(client, channel)) { /* Send only to chanops */ - prefix = CHFL_HALFOP|CHFL_CHANOP|CHFL_CHANOWNER|CHFL_CHANADMIN; + prefix = "ho"; } new_message(&me, NULL, &mtags); - RunHook6(HOOKTYPE_LOCAL_KICK, &me, &me, client, channel, mtags, comment); + RunHook(HOOKTYPE_LOCAL_KICK, &me, &me, client, channel, mtags, comment); sendto_channel(channel, &me, client, prefix, 0, SEND_LOCAL, mtags, ":%s KICK %s %s :%s", - me.name, channel->chname, client->name, comment); + me.name, channel->name, client->name, comment); - sendto_prefix_one(client, &me, mtags, ":%s KICK %s %s :%s", me.name, channel->chname, client->name, comment); + sendto_prefix_one(client, &me, mtags, ":%s KICK %s %s :%s", me.name, channel->name, client->name, comment); - sendto_server(NULL, 0, 0, mtags, ":%s KICK %s %s :%s", me.id, channel->chname, client->id, comment); + sendto_server(NULL, 0, 0, mtags, ":%s KICK %s %s :%s", me.id, channel->name, client->id, comment); free_message_tags(mtags); - if (remove_user_from_channel(client, channel) == 1) + if (remove_user_from_channel(client, channel, 0) == 1) return 1; /* channel was destroyed */ } } return 0; } -int secureonly_check_join(Client *client, Channel *channel, char *key, char *parv[]) +int secureonly_check_join(Client *client, Channel *channel, const char *key, char **errmsg) { Link *lp; @@ -141,6 +141,7 @@ int secureonly_check_join(Client *client, Channel *channel, char *key, char *par if (is_invited(client, channel)) return HOOK_CONTINUE; } + *errmsg = STR_ERR_SECUREONLYCHAN; return ERR_SECUREONLYCHAN; } return 0; @@ -167,8 +168,8 @@ int secureonly_check_sajoin(Client *target, Channel *channel, Client *requester) { if (IsSecureOnly(channel) && !IsSecure(target)) { - sendnotice(requester, "You cannot SAJOIN %s to %s because the channel is +z and the user is not connected via SSL/TLS", - target->name, channel->chname); + sendnotice(requester, "You cannot SAJOIN %s to %s because the channel is +z and the user is not connected via TLS", + target->name, channel->name); return HOOK_DENY; } @@ -178,11 +179,11 @@ int secureonly_check_sajoin(Client *target, Channel *channel, Client *requester) /* Special check for +z in set::modes-on-join. Needs to be done early. * Perhaps one day this will be properly handled in the core so this can be removed. */ -int secureonly_specialcheck(Client *client, Channel *channel, char *parv[]) +int secureonly_pre_local_join(Client *client, Channel *channel, const char *key) { - if ((channel->users == 0) && (iConf.modes_on_join.extmodes & EXTCMODE_SECUREONLY) && !IsSecure(client) && !IsOper(client)) + if ((channel->users == 0) && (MODES_ON_JOIN & EXTCMODE_SECUREONLY) && !IsSecure(client) && !IsOper(client)) { - sendnumeric(client, ERR_SECUREONLYCHAN, channel->chname); + sendnumeric(client, ERR_SECUREONLYCHAN, channel->name); return HOOK_DENY; } return HOOK_CONTINUE; diff --git a/src/modules/chanmodes/stripcolor.c b/src/modules/chanmodes/stripcolor.c index 11f9f31..c172381 100644 --- a/src/modules/chanmodes/stripcolor.c +++ b/src/modules/chanmodes/stripcolor.c @@ -27,16 +27,16 @@ ModuleHeader MOD_HEADER "4.2", "Channel Mode +S", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; Cmode_t EXTCMODE_STRIPCOLOR; -#define IsStripColor(channel) (channel->mode.extmode & EXTCMODE_STRIPCOLOR) +#define IsStripColor(channel) (channel->mode.mode & EXTCMODE_STRIPCOLOR) -int stripcolor_can_send_to_channel(Client *client, Channel *channel, Membership *lp, char **msg, char **errmsg, SendType sendtype); -char *stripcolor_prelocalpart(Client *client, Channel *channel, char *comment); -char *stripcolor_prelocalquit(Client *client, char *comment); +int stripcolor_can_send_to_channel(Client *client, Channel *channel, Membership *lp, const char **msg, const char **errmsg, SendType sendtype); +const char *stripcolor_prelocalpart(Client *client, Channel *channel, const char *comment); +const char *stripcolor_prelocalquit(Client *client, const char *comment); MOD_TEST() { @@ -50,14 +50,14 @@ CmodeInfo req; /* Channel mode */ memset(&req, 0, sizeof(req)); req.paracount = 0; - req.flag = 'S'; + req.letter = 'S'; req.is_ok = extcmode_default_requirechop; CmodeAdd(modinfo->handle, req, &EXTCMODE_STRIPCOLOR); HookAdd(modinfo->handle, HOOKTYPE_CAN_SEND_TO_CHANNEL, 0, stripcolor_can_send_to_channel); - HookAddPChar(modinfo->handle, HOOKTYPE_PRE_LOCAL_PART, 0, stripcolor_prelocalpart); - HookAddPChar(modinfo->handle, HOOKTYPE_PRE_LOCAL_QUIT_CHAN, 0, stripcolor_prelocalpart); - HookAddPChar(modinfo->handle, HOOKTYPE_PRE_LOCAL_QUIT, 0, stripcolor_prelocalquit); + HookAddConstString(modinfo->handle, HOOKTYPE_PRE_LOCAL_PART, 0, stripcolor_prelocalpart); + HookAddConstString(modinfo->handle, HOOKTYPE_PRE_LOCAL_QUIT_CHAN, 0, stripcolor_prelocalpart); + HookAddConstString(modinfo->handle, HOOKTYPE_PRE_LOCAL_QUIT, 0, stripcolor_prelocalquit); MARK_AS_OFFICIAL_MODULE(modinfo); return MOD_SUCCESS; @@ -73,7 +73,7 @@ MOD_UNLOAD() return MOD_SUCCESS; } -int stripcolor_can_send_to_channel(Client *client, Channel *channel, Membership *lp, char **msg, char **errmsg, SendType sendtype) +int stripcolor_can_send_to_channel(Client *client, Channel *channel, Membership *lp, const char **msg, const char **errmsg, SendType sendtype) { Hook *h; int i; @@ -95,7 +95,7 @@ int stripcolor_can_send_to_channel(Client *client, Channel *channel, Membership return HOOK_CONTINUE; } -char *stripcolor_prelocalpart(Client *client, Channel *channel, char *comment) +const char *stripcolor_prelocalpart(Client *client, Channel *channel, const char *comment) { if (!comment) return NULL; @@ -118,7 +118,7 @@ static int IsAnyChannelStripColor(Client *client) } -char *stripcolor_prelocalquit(Client *client, char *comment) +const char *stripcolor_prelocalquit(Client *client, const char *comment) { if (!comment) return NULL; diff --git a/src/modules/chanmodes/topiclimit.c b/src/modules/chanmodes/topiclimit.c new file mode 100644 index 0000000..f16583a --- /dev/null +++ b/src/modules/chanmodes/topiclimit.c @@ -0,0 +1,82 @@ +/* + * Channel Mode +t + * (C) Copyright 2021 Syzop and the UnrealIRCd team + * + * This program is free 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 1, or (at your option) + * any later version. + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "unrealircd.h" + + +ModuleHeader MOD_HEADER + = { + "chanmodes/topiclimit", + "6.0", + "Channel Mode +t", + "UnrealIRCd Team", + "unrealircd-6", + }; + +/* Global variables */ +Cmode_t EXTCMODE_TOPIC_LIMIT; + +/* Forward declarations */ +int topiclimit_can_set_topic(Client *client, Channel *channel, const char *topic, const char **errmsg); + +/* Macros */ +#define IsTopicLimit(channel) (channel->mode.mode & EXTCMODE_TOPIC_LIMIT) + +MOD_INIT() +{ + CmodeInfo req; + + MARK_AS_OFFICIAL_MODULE(modinfo); + + memset(&req, 0, sizeof(req)); + req.paracount = 0; + req.letter = 't'; + req.is_ok = extcmode_default_requirehalfop; + CmodeAdd(modinfo->handle, req, &EXTCMODE_TOPIC_LIMIT); + + HookAdd(modinfo->handle, HOOKTYPE_CAN_SET_TOPIC, 0, topiclimit_can_set_topic); + return MOD_SUCCESS; +} + +MOD_LOAD() +{ + return MOD_SUCCESS; +} + +MOD_UNLOAD() +{ + return MOD_SUCCESS; +} + +int topiclimit_can_set_topic(Client *client, Channel *channel, const char *topic, const char **errmsg) +{ + static char errmsg_buf[NICKLEN+256]; + + if (has_channel_mode(channel, 't') && + !check_channel_access(client, channel, "hoaq") && + !IsULine(client) && + !IsServer(client)) + { + buildnumeric(errmsg_buf, sizeof(errmsg_buf), client, ERR_CHANOPRIVSNEEDED, channel->name); + *errmsg = errmsg_buf; + return EX_DENY; + } + + return EX_ALLOW; +} diff --git a/src/modules/chanmodes/voice.c b/src/modules/chanmodes/voice.c new file mode 100644 index 0000000..7233c53 --- /dev/null +++ b/src/modules/chanmodes/voice.c @@ -0,0 +1,88 @@ +/* + * Channel Mode +v + * (C) Copyright 2021 Syzop and the UnrealIRCd team + * + * This program is free 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 1, or (at your option) + * any later version. + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "unrealircd.h" + +ModuleHeader MOD_HEADER + = { + "chanmodes/voice", + "6.0", + "Channel Mode +v", + "UnrealIRCd Team", + "unrealircd-6", + }; + +/* Forward declarations */ +int cmode_voice_is_ok(Client *client, Channel *channel, char mode, const char *para, int type, int what); + +MOD_INIT() +{ + CmodeInfo creq; + ModDataInfo mreq; + + MARK_AS_OFFICIAL_MODULE(modinfo); + + memset(&creq, 0, sizeof(creq)); + creq.paracount = 1; + creq.is_ok = cmode_voice_is_ok; + creq.letter = 'v'; + creq.prefix = '+'; + creq.sjoin_prefix = '+'; + creq.rank = RANK_VOICE; + creq.unset_with_param = 1; + creq.type = CMODE_MEMBER; + CmodeAdd(modinfo->handle, creq, NULL); + + return MOD_SUCCESS; +} + +MOD_LOAD() +{ + return MOD_SUCCESS; +} + +MOD_UNLOAD() +{ + return MOD_SUCCESS; +} + +int cmode_voice_is_ok(Client *client, Channel *channel, char mode, const char *param, int type, int what) +{ + if ((type == EXCHK_ACCESS) || (type == EXCHK_ACCESS_ERR)) + { + Client *target = find_user(param, NULL); + + if ((what == MODE_DEL) && (target == client)) + { + /* User may always remove their own modes */ + return EX_ALLOW; + } + if (check_channel_access(client, channel, "hoaq")) + { + /* Permitted for +hoaq */ + return EX_ALLOW; + } + if (type == EXCHK_ACCESS_ERR) + sendnumeric(client, ERR_CHANOPRIVSNEEDED, channel->name); + return EX_DENY; + } + + /* fallthrough -- should not be used */ + return EX_DENY; +} diff --git a/src/modules/channeldb.c b/src/modules/channeldb.c index 7df6ddf..9c4f0c2 100644 --- a/src/modules/channeldb.c +++ b/src/modules/channeldb.c @@ -11,7 +11,7 @@ ModuleHeader MOD_HEADER = { "1.0", "Stores and retrieves channel settings for persistent (+P) channels", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Database version */ @@ -27,15 +27,14 @@ ModuleHeader MOD_HEADER = { #define MAGIC_CHANNEL_START 0x11111111 #define MAGIC_CHANNEL_END 0x22222222 -#ifdef DEBUGMODE - #define BENCHMARK -#endif +// #undef BENCHMARK #define WARN_WRITE_ERROR(fname) \ do { \ - sendto_realops_and_log("[channeldb] Error writing to temporary database file " \ - "'%s': %s (DATABASE NOT SAVED)", \ - fname, unrealdb_get_error_string()); \ + unreal_log(ULOG_ERROR, "channeldb", "CHANNELDB_FILE_WRITE_ERROR", NULL, \ + "[channeldb] Error writing to temporary database file $filename: $system_error", \ + log_data_string("filename", fname), \ + log_data_string("system_error", unrealdb_get_error_string())); \ } while(0) #define W_SAFE(x) \ @@ -72,7 +71,6 @@ EVENT(write_channeldb_evt); int write_channeldb(void); int write_channel_entry(UnrealDB *db, const char *tmpfname, Channel *channel); int read_channeldb(void); -static void set_channel_mode(Channel *channel, char *modes, char *parameters); /* Global variables */ static uint32_t channeldb_version = CHANNELDB_VERSION; @@ -132,7 +130,7 @@ MOD_LOAD() MOD_UNLOAD() { - if (loop.ircd_terminating) + if (loop.terminating) write_channeldb(); freecfg(&test); freecfg(&cfg); @@ -168,34 +166,34 @@ int channeldb_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) if (type != CONFIG_SET) return 0; - if (!ce || strcmp(ce->ce_varname, "channeldb")) + if (!ce || strcmp(ce->name, "channeldb")) return 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!cep->ce_vardata) + if (!cep->value) { - config_error("%s:%i: blank set::channeldb::%s without value", cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_varname); + config_error("%s:%i: blank set::channeldb::%s without value", cep->file->filename, cep->line_number, cep->name); errors++; } else - if (!strcmp(cep->ce_varname, "database")) + if (!strcmp(cep->name, "database")) { - convert_to_absolute_path(&cep->ce_vardata, PERMDATADIR); - safe_strdup(test.database, cep->ce_vardata); + convert_to_absolute_path(&cep->value, PERMDATADIR); + safe_strdup(test.database, cep->value); } else - if (!strcmp(cep->ce_varname, "db-secret")) + if (!strcmp(cep->name, "db-secret")) { - char *err; - if ((err = unrealdb_test_secret(cep->ce_vardata))) + const char *err; + if ((err = unrealdb_test_secret(cep->value))) { - config_error("%s:%i: set::channeldb::db-secret: %s", cep->ce_fileptr->cf_filename, cep->ce_varlinenum, err); + config_error("%s:%i: set::channeldb::db-secret: %s", cep->file->filename, cep->line_number, err); errors++; continue; } - safe_strdup(test.db_secret, cep->ce_vardata); + safe_strdup(test.db_secret, cep->value); } else { - config_error("%s:%i: unknown directive set::channeldb::%s", cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_varname); + config_error("%s:%i: unknown directive set::channeldb::%s", cep->file->filename, cep->line_number, cep->name); errors++; } } @@ -227,15 +225,15 @@ int channeldb_config_run(ConfigFile *cf, ConfigEntry *ce, int type) if (type != CONFIG_SET) return 0; - if (!ce || strcmp(ce->ce_varname, "channeldb")) + if (!ce || strcmp(ce->name, "channeldb")) return 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "database")) - safe_strdup(cfg.database, cep->ce_vardata); - else if (!strcmp(cep->ce_varname, "db-secret")) - safe_strdup(cfg.db_secret, cep->ce_vardata); + if (!strcmp(cep->name, "database")) + safe_strdup(cfg.database, cep->value); + else if (!strcmp(cep->name, "db-secret")) + safe_strdup(cfg.db_secret, cep->value); } return 1; } @@ -300,7 +298,7 @@ int write_channeldb(void) #endif if (rename(tmpfname, cfg.database) < 0) { - sendto_realops_and_log("[channeldb] Error renaming '%s' to '%s': %s (DATABASE NOT SAVED)", tmpfname, cfg.database, strerror(errno)); + config_error("[channeldb] Error renaming '%s' to '%s': %s (DATABASE NOT SAVED)", tmpfname, cfg.database, strerror(errno)); return 0; } #ifdef BENCHMARK @@ -333,9 +331,11 @@ int write_listmode(UnrealDB *db, const char *tmpfname, Ban *lst) int write_channel_entry(UnrealDB *db, const char *tmpfname, Channel *channel) { + char modebuf[BUFSIZE], parabuf[BUFSIZE]; + W_SAFE(unrealdb_write_int32(db, MAGIC_CHANNEL_START)); /* Channel name */ - W_SAFE(unrealdb_write_str(db, channel->chname)); + W_SAFE(unrealdb_write_str(db, channel->name)); /* Channel creation time */ W_SAFE(unrealdb_write_int64(db, channel->creationtime)); /* Topic (topic, setby, seton) */ @@ -343,7 +343,7 @@ int write_channel_entry(UnrealDB *db, const char *tmpfname, Channel *channel) W_SAFE(unrealdb_write_str(db, channel->topic_nick)); W_SAFE(unrealdb_write_int64(db, channel->topic_time)); /* Basic channel modes (eg: +sntkl key 55) */ - channel_modes(&me, modebuf, parabuf, sizeof(modebuf), sizeof(parabuf), channel); + channel_modes(&me, modebuf, parabuf, sizeof(modebuf), sizeof(parabuf), channel, 1); W_SAFE(unrealdb_write_str(db, modebuf)); W_SAFE(unrealdb_write_str(db, parabuf)); /* Mode lock */ @@ -506,8 +506,11 @@ int read_channeldb(void) R_SAFE(unrealdb_read_str(db, &modes2)); R_SAFE(unrealdb_read_str(db, &mode_lock)); /* If we got this far, we can create/initialize the channel with the above */ - channel = get_channel(&me, chname, CREATE); - channel->creationtime = creationtime; + channel = make_channel(chname); + if (IsInvalidChannelTS(creationtime)) + channel->creationtime = TStime(); + else + channel->creationtime = creationtime; safe_strdup(channel->topic, topic); safe_strdup(channel->topic_nick, topic_nick); channel->topic_time = topic_time; @@ -529,37 +532,14 @@ int read_channeldb(void) unrealdb_close(db); if (added) - sendto_realops_and_log("[channeldb] Added %d persistent channels (+P)", added); + config_status("[channeldb] Added %d persistent channels (+P)", added); #ifdef BENCHMARK gettimeofday(&tv_beta, NULL); - ircd_log(LOG_ERROR, "[channeldb] Benchmark: LOAD DB: %ld microseconds", - ((tv_beta.tv_sec - tv_alpha.tv_sec) * 1000000) + (tv_beta.tv_usec - tv_alpha.tv_usec)); + unreal_log(ULOG_DEBUG, "channeldb", "CHANNELDB_BENCHMARK", NULL, + "[channeldb] Benchmark: LOAD DB: $time_msec microseconds", + log_data_integer("time_msec", ((tv_beta.tv_sec - tv_alpha.tv_sec) * 1000000) + (tv_beta.tv_usec - tv_alpha.tv_usec))); #endif return 1; } #undef FreeChannelEntry #undef R_SAFE - -static void set_channel_mode(Channel *channel, char *modes, char *parameters) -{ - char buf[512]; - char *p, *param; - int myparc = 1, i; - char *myparv[64]; - - memset(&myparv, 0, sizeof(myparv)); - myparv[0] = raw_strdup(modes); - - strlcpy(buf, parameters, sizeof(buf)); - for (param = strtoken(&p, buf, " "); param; param = strtoken(&p, NULL, " ")) - myparv[myparc++] = raw_strdup(param); - myparv[myparc] = NULL; - - SetULine(&me); // hack for crash.. set ulined so no access checks. - do_mode(channel, &me, NULL, myparc, myparv, 0, 0); - ClearULine(&me); // and clear it again.. - - for (i = 0; i < myparc; i++) - safe_free(myparv[i]); -} -// FIXME: move above function to m_mode and make efunc, available for all modules anyway diff --git a/src/modules/charsys.c b/src/modules/charsys.c index f0b1430..e20e13c 100644 --- a/src/modules/charsys.c +++ b/src/modules/charsys.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", /* Version */ "Character System (set::allowed-nickchars)", /* Short description of module */ "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* NOTE: it is guaranteed that char is unsigned by compiling options @@ -73,6 +73,7 @@ char langsinuse[4096]; #define LANGAV_CYRILLIC_UTF8 0x008000 /* UTF8: cyrillic script */ #define LANGAV_GREEK_UTF8 0x010000 /* UTF8: greek script */ #define LANGAV_HEBREW_UTF8 0x020000 /* UTF8: hebrew script */ +#define LANGAV_ARABIC_UTF8 0x040000 /* UTF8: arabic script */ typedef struct LangList LangList; struct LangList { @@ -83,7 +84,7 @@ struct LangList /* MUST be alphabetized (first column) */ static LangList langlist[] = { -/* { "arabic", "ara", LANGAV_ASCII|LANGAV_ISO8859_6 }, -- TODO: check if this has issues first! */ + { "arabic-utf8", "ara-utf8", LANGAV_ASCII|LANGAV_UTF8|LANGAV_ARABIC_UTF8 }, { "belarussian-utf8", "blr-utf8", LANGAV_ASCII|LANGAV_UTF8|LANGAV_CYRILLIC_UTF8 }, { "belarussian-w1251", "blr", LANGAV_ASCII|LANGAV_W1251 }, { "catalan", "cat", LANGAV_ASCII|LANGAV_LATIN1 }, @@ -189,7 +190,7 @@ MOD_TEST() MARK_AS_OFFICIAL_MODULE(modinfo); EfunctionAdd(modinfo->handle, EFUNC_DO_NICK_NAME, _do_nick_name); EfunctionAdd(modinfo->handle, EFUNC_DO_REMOTE_NICK_NAME, _do_remote_nick_name); - EfunctionAddPChar(modinfo->handle, EFUNC_CHARSYS_GET_CURRENT_LANGUAGES, _charsys_get_current_languages); + EfunctionAddString(modinfo->handle, EFUNC_CHARSYS_GET_CURRENT_LANGUAGES, _charsys_get_current_languages); charsys_reset(); charsys_reset_pretest(); HookAdd(modinfo->handle, HOOKTYPE_CONFIGTEST, 0, charsys_config_test); @@ -226,26 +227,26 @@ int charsys_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) return 0; /* We are only interrested in set::allowed-nickchars... */ - if (!ce || !ce->ce_varname || strcmp(ce->ce_varname, "allowed-nickchars")) + if (!ce || !ce->name || strcmp(ce->name, "allowed-nickchars")) return 0; - if (ce->ce_vardata) + if (ce->value) { config_error("%s:%i: set::allowed-nickchars: please use 'allowed-nickchars { name; };' " "and not 'allowed-nickchars name;'", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); /* Give up immediately. Don't bother the user with any other errors. */ errors++; *errs = errors; return -1; } - for (cep = ce->ce_entries; cep; cep=cep->ce_next) + for (cep = ce->items; cep; cep=cep->next) { - if (!charsys_test_language(cep->ce_varname)) + if (!charsys_test_language(cep->name)) { config_error("%s:%i: set::allowed-nickchars: Unknown (sub)language '%s'", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum, cep->ce_varname); + ce->file->filename, ce->line_number, cep->name); errors++; } } @@ -262,11 +263,11 @@ int charsys_config_run(ConfigFile *cf, ConfigEntry *ce, int type) return 0; /* We are only interrested in set::allowed-nickchars... */ - if (!ce || !ce->ce_varname || strcmp(ce->ce_varname, "allowed-nickchars")) + if (!ce || !ce->name || strcmp(ce->name, "allowed-nickchars")) return 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) - charsys_add_language(cep->ce_varname); + for (cep = ce->items; cep; cep = cep->next) + charsys_add_language(cep->name); return 1; } @@ -313,6 +314,8 @@ int charsys_config_posttest(int *errs) x++; if (x > 1) { +#if 0 +// I don't think this should be hard error, right? Some combinations may be problematic, but not all. if (langav & LANGAV_LATIN_UTF8) { config_error("ERROR: set::allowed-nickchars: you cannot combine 'latin-utf8' with any other character set"); @@ -333,8 +336,13 @@ int charsys_config_posttest(int *errs) config_error("ERROR: set::allowed-nickchars: you cannot combine 'hebrew-utf8' with any other character set"); errors++; } - config_status("WARNING: set::allowed-nickchars: " - "Mixing of charsets (eg: latin1+latin2) can cause display problems"); + if (langav & LANGAV_ARABIC_UTF8) + { + config_error("ERROR: set::allowed-nickchars: you cannot combine 'arabic-utf8' with any other character set"); + errors++; + } +#endif + config_status("WARNING: set::allowed-nickchars: Mixing of charsets (eg: latin1+latin2) may cause display problems"); } *errs = errors; @@ -877,13 +885,6 @@ void charsys_add_language(char *name) charsys_addmultibyterange(0xc3, 0xc3, 0xba, 0xba); charsys_addmultibyterange(0xc3, 0xc3, 0xbd, 0xbe); } -/* if (latin1 || !strcmp(name, "arabic")) -- Since when is arabic considered latin(1)??? oh man... - { - char bytes[] = { 0xa0, 0xa4, 0xac, 0xad, 0xbb, 0xbf, 0x00 }; - charsys_addallowed(bytes); - charsys_addallowed_range(0xc1, 0xda); - charsys_addallowed_range(0xe0, 0xf2); - } */ /* [LATIN2] and rest of [LATIN-UTF8] */ /* actually hungarian is a special case, include it in both w1250 and latin2 ;p */ @@ -1181,6 +1182,19 @@ void charsys_add_language(char *name) charsys_addmultibyterange(0xc5, 0xc5, 0xaa, 0xab); charsys_addmultibyterange(0xc5, 0xc5, 0xbd, 0xbe); } + + /* [ARABIC] */ + if (latin_utf8 || !strcmp(name, "arabic-utf8")) + { + /* Supplied by Sensiva */ + /*charsys_addallowed("اأإآءبتثجحخدذرزسشصضطظعغفقكلمنهؤةويىئ");*/ + /*- From U+0621 to U+063A (Regex: [\u0621-\u063A])*/ + /* 0xd8a1 - 0xd8ba */ + charsys_addmultibyterange(0xd8, 0xd8, 0xa1, 0xba); + /*- From U+0641 to U+064A (Regex: [\u0641-\u064A])*/ + /* 0xd981 - 0xd98a */ + charsys_addmultibyterange(0xd9, 0xd9, 0x81, 0x8a); + } } /** This displays all the nick characters that are permitted */ @@ -1250,6 +1264,8 @@ char *charsys_group(int v) return "Greek script"; if (v & LANGAV_HEBREW_UTF8) return "Hebrew script"; + if (v & LANGAV_ARABIC_UTF8) + return "Arabic script"; return "Other"; } diff --git a/src/modules/chathistory.c b/src/modules/chathistory.c index dba2d5f..d13c32d 100644 --- a/src/modules/chathistory.c +++ b/src/modules/chathistory.c @@ -13,7 +13,15 @@ ModuleHeader MOD_HEADER "1.0", "IRCv3 CHATHISTORY command", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", +}; + +/* Structs */ +typedef struct ChatHistoryTarget ChatHistoryTarget; +struct ChatHistoryTarget { + ChatHistoryTarget *prev, *next; + char *datetime; + char *object; }; /* Forward declarations */ @@ -22,7 +30,6 @@ CMD_FUNC(cmd_chathistory); /* Global variables */ long CAP_CHATHISTORY = 0L; -/* TODO: consider moving to config file */ #define CHATHISTORY_LIMIT 50 MOD_INIT() @@ -49,13 +56,18 @@ MOD_UNLOAD() return MOD_SUCCESS; } -int chathistory_token(char *str, char *token, char **store) +int chathistory_token(const char *str, char *token, char **store) { - char *p = strchr(str, '='); + char request[BUFSIZE]; + char *p; + + strlcpy(request, str, sizeof(request)); + + p = strchr(request, '='); if (!p) return 0; *p = '\0'; // frag - if (!strcmp(str, token)) + if (!strcmp(request, token)) { *p = '='; // restore *store = strdup(p + 1); // can be \0 @@ -65,15 +77,68 @@ int chathistory_token(char *str, char *token, char **store) return 0; } -static int chathistory_targets_send_line(Client *client, HistoryResult *r, char *batchid) +static void add_chathistory_target_list(ChatHistoryTarget *new, ChatHistoryTarget **list) +{ + ChatHistoryTarget *x, *last = NULL; + + if (!*list) + { + /* We are the only item. Easy. */ + *list = new; + return; + } + + for (x = *list; x; x = x->next) + { + last = x; + if (strcmp(new->datetime, x->datetime) >= 0) + break; + } + + if (x) + { + if (x->prev) + { + /* We will insert ourselves just before this item */ + new->prev = x->prev; + new->next = x; + x->prev->next = new; + x->prev = new; + } else { + /* We are the new head */ + *list = new; + new->next = x; + x->prev = new; + } + } else + { + /* We are the last item */ + last->next = new; + new->prev = last; + } +} + +static void add_chathistory_target(ChatHistoryTarget **list, HistoryResult *r) +{ + MessageTag *m; + time_t ts; + char *datetime; + ChatHistoryTarget *e; + + if (!r->log || !((m = find_mtag(r->log->mtags, "time"))) || !m->value) + return; + datetime = m->value; + + e = safe_alloc(sizeof(ChatHistoryTarget)); + safe_strdup(e->datetime, datetime); + safe_strdup(e->object, r->object); + add_chathistory_target_list(e, list); +} + +static void chathistory_targets_send_line(Client *client, ChatHistoryTarget *r, char *batchid) { MessageTag *mtags = NULL; MessageTag *m; - char *ts; - - if (!r->log || !((m = find_mtag(r->log->mtags, "time"))) || !m->value) - return 0; - ts = m->value; if (!BadPtr(batchid)) { @@ -83,12 +148,10 @@ static int chathistory_targets_send_line(Client *client, HistoryResult *r, char } sendto_one(client, mtags, ":%s CHATHISTORY TARGETS %s %s", - me.name, r->object, ts); + me.name, r->object, r->datetime); if (mtags) free_message_tags(mtags); - - return 1; } void chathistory_targets(Client *client, HistoryFilter *filter, int limit) @@ -97,14 +160,9 @@ void chathistory_targets(Client *client, HistoryFilter *filter, int limit) HistoryResult *r; char batch[BATCHLEN+1]; int sent = 0; + ChatHistoryTarget *targets = NULL, *targets_next; - batch[0] = '\0'; - if (HasCapability(client, "batch")) - { - /* Start a new batch */ - generate_batch_id(batch); - sendto_one(client, NULL, ":%s BATCH +%s draft/chathistory-targets", me.name, batch); - } + /* 1. Grab all information we need */ filter->cmd = HFC_BEFORE; if (strcmp(filter->timestamp_a, filter->timestamp_b) < 0) @@ -119,14 +177,32 @@ void chathistory_targets(Client *client, HistoryFilter *filter, int limit) for (mp = client->user->channel; mp; mp = mp->next) { Channel *channel = mp->channel; - r = history_request(channel->chname, filter); - if (r->log && chathistory_targets_send_line(client, r, batch)) + r = history_request(channel->name, filter); + if (r) { - if (++sent >= limit) - break; /* We are done */ + add_chathistory_target(&targets, r); + free_history_result(r); } - free_history_result(r); - r = NULL; + } + + /* 2. Now send it to the client */ + + batch[0] = '\0'; + if (HasCapability(client, "batch")) + { + /* Start a new batch */ + generate_batch_id(batch); + sendto_one(client, NULL, ":%s BATCH +%s draft/chathistory-targets", me.name, batch); + } + + for (; targets; targets = targets_next) + { + targets_next = targets->next; + if (++sent < limit) + chathistory_targets_send_line(client, targets, batch); + safe_free(targets->datetime); + safe_free(targets->object); + safe_free(targets); } /* End of batch */ @@ -160,7 +236,7 @@ CMD_FUNC(cmd_chathistory) return; } - if (!strcmp(parv[1], "TARGETS")) + if (!strcasecmp(parv[1], "TARGETS")) { Membership *mp; int limit; @@ -185,18 +261,39 @@ CMD_FUNC(cmd_chathistory) goto end; } - channel = find_channel(parv[2], NULL); - if (!channel || !IsMember(client, channel) || !has_channel_mode(channel, 'H')) + channel = find_channel(parv[2]); + if (!channel) { - sendto_one(client, NULL, ":%s FAIL CHATHISTORY INVALID_TARGET %s %s :Messages could not be retrieved", + sendto_one(client, NULL, ":%s FAIL CHATHISTORY INVALID_TARGET %s %s :Messages could not be retrieved, not an existing channel", me.name, parv[1], parv[2]); return; } + if (!IsMember(client, channel)) + { + sendto_one(client, NULL, ":%s FAIL CHATHISTORY INVALID_TARGET %s %s :Messages could not be retrieved, you are not a member", + me.name, parv[1], parv[2]); + return; + } + + /* Channel is not +H? Send empty response/batch (as per IRCv3 discussion) */ + if (!has_channel_mode(channel, 'H')) + { + if (HasCapability(client, "batch")) + { + char batch[BATCHLEN+1]; + + generate_batch_id(batch); + sendto_one(client, NULL, ":%s BATCH +%s chathistory %s", me.name, batch, channel->name); + sendto_one(client, NULL, ":%s BATCH -%s", me.name, batch); + } + return; + } + filter = safe_alloc(sizeof(HistoryFilter)); /* Below this point, instead of 'return', use 'goto end', which takes care of the freeing of 'filter' and 'history' */ - if (!strcmp(parv[1], "BEFORE")) + if (!strcasecmp(parv[1], "BEFORE")) { filter->cmd = HFC_BEFORE; if (!chathistory_token(parv[3], "timestamp", &filter->timestamp_a) && @@ -208,7 +305,7 @@ CMD_FUNC(cmd_chathistory) } filter->limit = atoi(parv[4]); } else - if (!strcmp(parv[1], "AFTER")) + if (!strcasecmp(parv[1], "AFTER")) { filter->cmd = HFC_AFTER; if (!chathistory_token(parv[3], "timestamp", &filter->timestamp_a) && @@ -220,7 +317,7 @@ CMD_FUNC(cmd_chathistory) } filter->limit = atoi(parv[4]); } else - if (!strcmp(parv[1], "LATEST")) + if (!strcasecmp(parv[1], "LATEST")) { filter->cmd = HFC_LATEST; if (!chathistory_token(parv[3], "timestamp", &filter->timestamp_a) && @@ -233,7 +330,7 @@ CMD_FUNC(cmd_chathistory) } filter->limit = atoi(parv[4]); } else - if (!strcmp(parv[1], "AROUND")) + if (!strcasecmp(parv[1], "AROUND")) { filter->cmd = HFC_AROUND; if (!chathistory_token(parv[3], "timestamp", &filter->timestamp_a) && @@ -245,7 +342,7 @@ CMD_FUNC(cmd_chathistory) } filter->limit = atoi(parv[4]); } else - if (!strcmp(parv[1], "BETWEEN")) + if (!strcasecmp(parv[1], "BETWEEN")) { filter->cmd = HFC_BETWEEN; if (BadPtr(parv[5])) @@ -283,7 +380,7 @@ CMD_FUNC(cmd_chathistory) if (filter->limit > CHATHISTORY_LIMIT) filter->limit = CHATHISTORY_LIMIT; - if ((r = history_request(channel->chname, filter))) + if ((r = history_request(channel->name, filter))) history_send_result(client, r); end: diff --git a/src/modules/chghost.c b/src/modules/chghost.c index 8d3e3f0..a52c883 100644 --- a/src/modules/chghost.c +++ b/src/modules/chghost.c @@ -25,6 +25,10 @@ #define MSG_CHGHOST "CHGHOST" CMD_FUNC(cmd_chghost); +void _userhost_save_current(Client *client); +void _userhost_changed(Client *client); + +long CAP_CHGHOST = 0L; ModuleHeader MOD_HEADER = { @@ -32,13 +36,28 @@ ModuleHeader MOD_HEADER "5.0", /* Version */ "/chghost", /* Short description of module */ "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; +MOD_TEST() +{ + MARK_AS_OFFICIAL_MODULE(modinfo); + EfunctionAddVoid(modinfo->handle, EFUNC_USERHOST_SAVE_CURRENT, _userhost_save_current); + EfunctionAddVoid(modinfo->handle, EFUNC_USERHOST_CHANGED, _userhost_changed); + return MOD_SUCCESS; +} + MOD_INIT() { + ClientCapabilityInfo c; + CommandAdd(modinfo->handle, MSG_CHGHOST, cmd_chghost, MAXPARA, CMD_USER|CMD_SERVER); MARK_AS_OFFICIAL_MODULE(modinfo); + + memset(&c, 0, sizeof(c)); + c.name = "chghost"; + ClientCapabilityAdd(modinfo->handle, &c, &CAP_CHGHOST); + return MOD_SUCCESS; } @@ -53,6 +72,177 @@ MOD_UNLOAD() return MOD_SUCCESS; } + +static char remember_nick[NICKLEN+1]; +static char remember_user[USERLEN+1]; +static char remember_host[HOSTLEN+1]; + +/** Save current nick/user/host. Used later by userhost_changed(). */ +void _userhost_save_current(Client *client) +{ + strlcpy(remember_nick, client->name, sizeof(remember_nick)); + strlcpy(remember_user, client->user->username, sizeof(remember_user)); + strlcpy(remember_host, GetHost(client), sizeof(remember_host)); +} + +/** User/Host changed for user. + * Note that userhost_save_current() needs to be called before this + * to save the old username/hostname. + * This userhost_changed() function deals with notifying local clients + * about the user/host change by sending PART+JOIN+MODE if + * set::allow-userhost-change force-rejoin is in use, + * and it wills end "CAP chghost" to such capable clients. + * It will also deal with bumping fakelag for the user since a user/host + * change is costly, doesn't matter if it was self-induced or not. + * + * Please call this function for any user/host change by doing: + * userhost_save_current(client); + * << change username or hostname here >> + * userhost_changed(client); + */ +void _userhost_changed(Client *client) +{ + Membership *channels; + Member *lp; + Client *acptr; + int impact = 0; + char buf[512]; + long CAP_EXTENDED_JOIN = ClientCapabilityBit("extended-join"); + + if (strcmp(remember_nick, client->name)) + { + unreal_log(ULOG_ERROR, "main", "BUG_USERHOST_CHANGED", client, + "[BUG] userhost_changed() was called but without calling userhost_save_current() first! Affected user: $client\n" + "Please report above bug on https://bugs.unrealircd.org/"); + return; /* We cannot safely process this request anymore */ + } + + /* It's perfectly acceptable to call us even if the userhost didn't change. */ + if (!strcmp(remember_user, client->user->username) && !strcmp(remember_host, GetHost(client))) + return; /* Nothing to do */ + + /* Most of the work is only necessary for set::allow-userhost-change force-rejoin */ + if (UHOST_ALLOWED == UHALLOW_REJOIN) + { + /* Walk through all channels of this user.. */ + for (channels = client->user->channel; channels; channels = channels->next) + { + Channel *channel = channels->channel; + char *modes; + char partbuf[512]; /* PART */ + char joinbuf[512]; /* JOIN */ + char exjoinbuf[512]; /* JOIN (for CAP extended-join) */ + char modebuf[512]; /* MODE (if any) */ + int chanops_only = invisible_user_in_channel(client, channel); + + modebuf[0] = '\0'; + + /* If the user is banned, don't send any rejoins, it would only be annoying */ + if (is_banned(client, channel, BANCHK_JOIN, NULL, NULL)) + continue; + + /* Prepare buffers for PART, JOIN, MODE */ + ircsnprintf(partbuf, sizeof(partbuf), ":%s!%s@%s PART %s :%s", + remember_nick, remember_user, remember_host, + channel->name, + "Changing host"); + + ircsnprintf(joinbuf, sizeof(joinbuf), ":%s!%s@%s JOIN %s", + client->name, client->user->username, GetHost(client), channel->name); + + ircsnprintf(exjoinbuf, sizeof(exjoinbuf), ":%s!%s@%s JOIN %s %s :%s", + client->name, client->user->username, GetHost(client), channel->name, + IsLoggedIn(client) ? client->user->account : "*", + client->info); + + modes = get_chmodes_for_user(client, channels->member_modes); + if (!BadPtr(modes)) + ircsnprintf(modebuf, sizeof(modebuf), ":%s MODE %s %s", me.name, channel->name, modes); + + for (lp = channel->members; lp; lp = lp->next) + { + acptr = lp->client; + + if (acptr == client) + continue; /* skip self */ + + if (!MyConnect(acptr)) + continue; /* only locally connected clients */ + + if (chanops_only && !check_channel_access_member(lp, "hoaq")) + continue; /* skip non-ops if requested to (used for mode +D) */ + + if (HasCapabilityFast(acptr, CAP_CHGHOST)) + continue; /* we notify 'CAP chghost' users in a different way, so don't send it here. */ + + impact++; + + /* FIXME: if a client does not have the "chghost" cap then + * here we will not generate a proper new message, probably + * needs to be fixed... I skipped doing it for now. + */ + sendto_one(acptr, NULL, "%s", partbuf); + + if (HasCapabilityFast(acptr, CAP_EXTENDED_JOIN)) + sendto_one(acptr, NULL, "%s", exjoinbuf); + else + sendto_one(acptr, NULL, "%s", joinbuf); + + if (*modebuf) + sendto_one(acptr, NULL, "%s", modebuf); + } + } + } + + /* Now deal with "CAP chghost" clients. + * This only needs to be sent one per "common channel". + * This would normally call sendto_common_channels_local_butone() but the user already + * has the new user/host.. so we do it here.. + */ + ircsnprintf(buf, sizeof(buf), ":%s!%s@%s CHGHOST %s %s", + remember_nick, remember_user, remember_host, + client->user->username, + GetHost(client)); + current_serial++; + for (channels = client->user->channel; channels; channels = channels->next) + { + for (lp = channels->channel->members; lp; lp = lp->next) + { + acptr = lp->client; + if (MyUser(acptr) && HasCapabilityFast(acptr, CAP_CHGHOST) && + (acptr->local->serial != current_serial) && (client != acptr)) + { + /* FIXME: send mtag */ + sendto_one(acptr, NULL, "%s", buf); + acptr->local->serial = current_serial; + } + } + } + + RunHook(HOOKTYPE_USERHOST_CHANGED, client, remember_user, remember_host); + + if (MyUser(client)) + { + /* We take the liberty of sending the CHGHOST to the impacted user as + * well. This makes things easy for client coders. + * (Note that this cannot be merged with the for loop from 15 lines up + * since the user may not be in any channels) + */ + if (HasCapabilityFast(client, CAP_CHGHOST)) + sendto_one(client, NULL, "%s", buf); + + /* A userhost change always generates the following network traffic: + * server to server traffic, CAP "chghost" notifications, and + * possibly PART+JOIN+MODE if force-rejoin had work to do. + * We give the user a penalty so they don't flood... + */ + if (impact) + add_fake_lag(client, 7000); /* Resulted in rejoins and such. */ + else + add_fake_lag(client, 4000); /* No rejoins */ + } +} + /* * cmd_chghost - 12/07/1999 (two months after I made SETIDENT) - Stskeeps * :prefix CHGHOST @@ -83,7 +273,7 @@ CMD_FUNC(cmd_chghost) return; } - if (!valid_host(parv[2])) + if (!valid_host(parv[2], 0)) { sendnotice(client, "*** /ChgHost Error: A hostname may contain a-z, A-Z, 0-9, '-' & '.' - Please only use them"); return; @@ -95,7 +285,7 @@ CMD_FUNC(cmd_chghost) return; } - if (!(target = find_person(parv[1], NULL))) + if (!(target = find_user(parv[1], NULL))) { sendnumeric(client, ERR_NOSUCHNICK, parv[1]); return; @@ -135,14 +325,11 @@ CMD_FUNC(cmd_chghost) if (!IsULine(client)) { - sendto_snomask(SNO_EYES, - "%s changed the virtual hostname of %s (%s@%s) to be %s", - client->name, target->name, target->user->username, - target->user->realhost, parv[2]); - /* Logging added by XeRXeS */ - ircd_log(LOG_CHGCMDS, - "CHGHOST: %s changed the virtual hostname of %s (%s@%s) to be %s", - client->name, target->name, target->user->username, target->user->realhost, parv[2]); + unreal_log(ULOG_INFO, "chgcmds", "CHGHOST_COMMAND", client, + "CHGHOST: $client changed the virtual hostname of $target.details to be $new_hostname", + log_data_string("change_type", "hostname"), + log_data_client("target", target), + log_data_string("new_hostname", parv[2])); } target->umodes |= UMODE_HIDE; diff --git a/src/modules/chgident.c b/src/modules/chgident.c index 923ec39..155c894 100644 --- a/src/modules/chgident.c +++ b/src/modules/chgident.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", /* Version */ "/chgident", /* Short description of module */ "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -63,7 +63,7 @@ MOD_UNLOAD() CMD_FUNC(cmd_chgident) { Client *target; - char *s; + const char *s; int legalident = 1; if (!ValidatePermissionsForPath("client:set:ident",client,NULL,NULL,NULL)) @@ -102,7 +102,7 @@ CMD_FUNC(cmd_chgident) return; } - if (!(target = find_person(parv[1], NULL))) + if (!(target = find_user(parv[1], NULL))) { sendnumeric(client, ERR_NOSUCHNICK, parv[1]); return; @@ -134,15 +134,11 @@ CMD_FUNC(cmd_chgident) } if (!IsULine(client)) { - sendto_snomask(SNO_EYES, - "%s changed the virtual ident of %s (%s@%s) to be %s", - client->name, target->name, target->user->username, - GetHost(target), parv[2]); - /* Logging ability added by XeRXeS */ - ircd_log(LOG_CHGCMDS, - "CHGIDENT: %s changed the virtual ident of %s (%s@%s) to be %s", - client->name, target->name, target->user->username, - GetHost(target), parv[2]); + unreal_log(ULOG_INFO, "chgcmds", "CHGIDENT_COMMAND", client, + "CHGIDENT: $client changed the username of $target.details to be $new_username", + log_data_string("change_type", "username"), + log_data_client("target", target), + log_data_string("new_username", parv[2])); } sendto_server(client, 0, 0, NULL, ":%s CHGIDENT %s %s", diff --git a/src/modules/chgname.c b/src/modules/chgname.c index 2866117..ed6b089 100644 --- a/src/modules/chgname.c +++ b/src/modules/chgname.c @@ -31,7 +31,7 @@ ModuleHeader MOD_HEADER "5.0", /* Version */ "command /chgname", /* Short description of module */ "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; @@ -88,7 +88,7 @@ CMD_FUNC(cmd_chgname) return; } - if (!(target = find_person(parv[1], NULL))) + if (!(target = find_user(parv[1], NULL))) { sendnumeric(client, ERR_NOSUCHNICK, parv[1]); return; @@ -97,15 +97,11 @@ CMD_FUNC(cmd_chgname) /* Let's log this first */ if (!IsULine(client)) { - sendto_snomask(SNO_EYES, - "%s changed the GECOS of %s (%s@%s) to be %s", - client->name, target->name, target->user->username, - GetHost(target), parv[2]); - /* Logging ability added by XeRXeS */ - ircd_log(LOG_CHGCMDS, - "CHGNAME: %s changed the GECOS of %s (%s@%s) to be %s", - client->name, target->name, target->user->username, - GetHost(target), parv[2]); + unreal_log(ULOG_INFO, "chgcmds", "CHGNAME_COMMAND", client, + "CHGNAME: $client changed the realname of $target.details to be $new_realname", + log_data_string("change_type", "realname"), + log_data_client("target", target), + log_data_string("new_realname", parv[2])); } /* set the realname to make ban checking work */ diff --git a/src/modules/clienttagdeny.c b/src/modules/clienttagdeny.c index 2552d49..4add58a 100644 --- a/src/modules/clienttagdeny.c +++ b/src/modules/clienttagdeny.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER = { "5.0", "Informs clients about supported client tags", "k4be", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT(){ @@ -62,7 +62,7 @@ char *ct_isupport_param(void){ strlcpy(buf, "*", sizeof(buf)); for (m = mtaghandlers; m; m = m->next) { - if(!m->unloaded && m->name[0] == '+'){ + if (!m->unloaded && m->name[0] == '+'){ strlcat(buf, ",-", sizeof(buf)); strlcat(buf, m->name+1, sizeof(buf)); } diff --git a/src/modules/cloak.c b/src/modules/cloak_md5.c similarity index 84% rename from src/modules/cloak.c rename to src/modules/cloak_md5.c index a28a53b..74df253 100644 --- a/src/modules/cloak.c +++ b/src/modules/cloak_md5.c @@ -1,6 +1,6 @@ /* - * IRC - Internet Relay Chat, src/modules/cloak.c - * (C) 2004 The UnrealIRCd Team + * IRC - Internet Relay Chat, src/modules/cloak_md5.c + * (C) 2004-2017 Bram Matthys and The UnrealIRCd Team * * See file AUTHORS in IRC package for additional names of * the programmers. @@ -46,28 +46,26 @@ static char *hidehost_ipv6(char *host); static char *hidehost_normalhost(char *host); static inline unsigned int downsample(char *i); -Callback *cloak = NULL, *cloak_csum = NULL; - ModuleHeader MOD_HEADER = { - "cloak", + "cloak_md5", "1.0", - "Official cloaking module (md5)", + "Old cloaking module (MD5)", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_TEST() { - cloak = CallbackAddPCharEx(modinfo->handle, CALLBACKTYPE_CLOAK_EX, hidehost); - if (!cloak) + if (!CallbackAddString(modinfo->handle, CALLBACKTYPE_CLOAK_KEY_CHECKSUM, cloakcsum)) { - config_error("cloak: Error while trying to install cloaking callback!"); + unreal_log(ULOG_ERROR, "config", "CLOAK_MODULE_DUPLICATE", NULL, + "cloak_md5: Error while trying to install callback.\n" + "Maybe you have multiple cloaking modules loaded? You can only load one!"); return MOD_FAILED; } - cloak_csum = CallbackAddPCharEx(modinfo->handle, CALLBACKTYPE_CLOAKKEYCSUM, cloakcsum); - if (!cloak_csum) + if (!CallbackAddString(modinfo->handle, CALLBACKTYPE_CLOAK_EX, hidehost)) { - config_error("cloak: Error while trying to install cloaking checksum callback!"); + config_error("cloak_md5: Error while trying to install cloaking callback!"); return MOD_FAILED; } HookAdd(modinfo->handle, HOOKTYPE_CONFIGTEST, 0, cloak_config_test); @@ -125,19 +123,19 @@ int cloak_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) if (type == CONFIG_SET) { /* set::cloak-method */ - if (!ce || !ce->ce_varname || strcmp(ce->ce_varname, "cloak-method")) + if (!ce || !ce->name || strcmp(ce->name, "cloak-method")) return 0; - if (!ce->ce_vardata) + if (!ce->value) { config_error("%s:%i: set::cloak-method: no method specified. The only supported methods are: 'ip' and 'host'", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); errors++; } else - if (strcmp(ce->ce_vardata, "ip") && strcmp(ce->ce_vardata, "host")) + if (strcmp(ce->value, "ip") && strcmp(ce->value, "host")) { config_error("%s:%i: set::cloak-method: unknown method '%s'. The only supported methods are: 'ip' and 'host'", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum, ce->ce_vardata); + ce->file->filename, ce->line_number, ce->value); errors++; } @@ -149,41 +147,40 @@ int cloak_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) return 0; nokeys = 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { keycnt++; - /* TODO: check randomness */ - if (check_badrandomness(cep->ce_varname)) + if (check_badrandomness(cep->name)) { config_error("%s:%i: set::cloak-keys: (key %d) Keys should be mixed a-zA-Z0-9, " - "like \"a2JO6fh3Q6w4oN3s7\"", cep->ce_fileptr->cf_filename, cep->ce_varlinenum, keycnt); + "like \"a2JO6fh3Q6w4oN3s7\"", cep->file->filename, cep->line_number, keycnt); errors++; } - if (strlen(cep->ce_varname) < 5) + if (strlen(cep->name) < 5) { config_error("%s:%i: set::cloak-keys: (key %d) Each key should be at least 5 characters", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, keycnt); + cep->file->filename, cep->line_number, keycnt); errors++; } - if (strlen(cep->ce_varname) > 100) + if (strlen(cep->name) > 100) { config_error("%s:%i: set::cloak-keys: (key %d) Each key should be less than 100 characters", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, keycnt); + cep->file->filename, cep->line_number, keycnt); errors++; } if (keycnt < 4) - keys[keycnt-1] = cep->ce_varname; + keys[keycnt-1] = cep->name; } if (keycnt != 3) { config_error("%s:%i: set::cloak-keys: we want 3 values, not %i!", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum, keycnt); + ce->file->filename, ce->line_number, keycnt); errors++; } if ((keycnt == 3) && (!strcmp(keys[0], keys[1]) || !strcmp(keys[1], keys[2]))) { config_error("%s:%i: set::cloak-keys: All your 3 keys should be RANDOM, they should not be equal", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); errors++; } *errs = errors; @@ -212,10 +209,10 @@ char buf[512], result[16]; if (type == CONFIG_SET) { /* set::cloak-method */ - if (!ce || !ce->ce_varname || strcmp(ce->ce_varname, "cloak-method")) + if (!ce || !ce->name || strcmp(ce->name, "cloak-method")) return 0; - if (!strcmp(ce->ce_vardata, "ip")) + if (!strcmp(ce->value, "ip")) CLOAK_IP_ONLY = 1; return 0; @@ -225,12 +222,12 @@ char buf[512], result[16]; return 0; /* config test should ensure this goes fine... */ - cep = ce->ce_entries; - safe_strdup(cloak_key1, cep->ce_varname); - cep = cep->ce_next; - safe_strdup(cloak_key2, cep->ce_varname); - cep = cep->ce_next; - safe_strdup(cloak_key3, cep->ce_varname); + cep = ce->items; + safe_strdup(cloak_key1, cep->name); + cep = cep->next; + safe_strdup(cloak_key2, cep->name); + cep = cep->next; + safe_strdup(cloak_key3, cep->name); /* Calculate checksum */ ircsnprintf(buf, sizeof(buf), "%s:%s:%s", KEY1, KEY2, KEY3); @@ -412,14 +409,14 @@ unsigned int alpha, n; { unsigned int len; p++; - ircsnprintf(result, sizeof(result), "%s-%X.", hidden_host, alpha); + ircsnprintf(result, sizeof(result), "%s-%X.", CLOAK_PREFIX, alpha); len = strlen(result) + strlen(p); if (len <= HOSTLEN) strlcat(result, p, sizeof(result)); else strlcat(result, p + (len - HOSTLEN), sizeof(result)); } else - ircsnprintf(result, sizeof(result), "%s-%X", hidden_host, alpha); + ircsnprintf(result, sizeof(result), "%s-%X", CLOAK_PREFIX, alpha); return result; } diff --git a/src/modules/cloak_none.c b/src/modules/cloak_none.c new file mode 100644 index 0000000..4cb627d --- /dev/null +++ b/src/modules/cloak_none.c @@ -0,0 +1,87 @@ +/* + * IRC - Internet Relay Chat, src/modules/cloak_none.c + * (C) 2021 Bram Matthys and The UnrealIRCd Team + * + * See file AUTHORS in IRC package for additional names of + * the programmers. + * + * This program is free 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 1, or (at your option) + * any later version. + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "unrealircd.h" + +char *cloakcsum(); +int cloak_config_test(ConfigFile *, ConfigEntry *, int, int *); + +ModuleHeader MOD_HEADER = { + "cloak_none", + "1.0", + "Cloaking module that does nothing", + "UnrealIRCd Team", + "unrealircd-6", +}; + +MOD_TEST() +{ + if (!CallbackAddString(modinfo->handle, CALLBACKTYPE_CLOAK_KEY_CHECKSUM, cloakcsum)) + { + unreal_log(ULOG_ERROR, "config", "CLOAK_MODULE_DUPLICATE", NULL, + "cloak_none: Error while trying to install callback.\n" + "Maybe you have multiple cloaking modules loaded? You can only load one!"); + return MOD_FAILED; + } + HookAdd(modinfo->handle, HOOKTYPE_CONFIGTEST, 0, cloak_config_test); + return MOD_SUCCESS; +} + +MOD_INIT() +{ + MARK_AS_OFFICIAL_MODULE(modinfo); + return MOD_SUCCESS; +} + +MOD_LOAD() +{ + return MOD_SUCCESS; +} + +MOD_UNLOAD() +{ + return MOD_SUCCESS; +} + +int cloak_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) +{ + int errors = 0; + + if (type != CONFIG_CLOAKKEYS) + return 0; + + if (ce->items) + { + config_error("%s:%i: The cloaking module 'cloak_none' is loaded (no cloaking) but " + "you also have set::cloak-keys set. Either delete your cloak keys, " + "or switch to a real cloaking module.", + ce->file->filename, ce->line_number); + errors++; + } + *errs = errors; + return errors ? -1 : 1; +} + +char *cloakcsum() +{ + return "NONE"; +} diff --git a/src/modules/cloak_sha256.c b/src/modules/cloak_sha256.c new file mode 100644 index 0000000..3200a86 --- /dev/null +++ b/src/modules/cloak_sha256.c @@ -0,0 +1,411 @@ +/* + * IRC - Internet Relay Chat, src/modules/cloak_sha256.c + * (C) 2004-2021 Bram Matthys and The UnrealIRCd Team + * + * See file AUTHORS in IRC package for additional names of + * the programmers. + * + * This program is free 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 1, or (at your option) + * any later version. + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "unrealircd.h" + +static char *cloak_key1 = NULL, *cloak_key2 = NULL, *cloak_key3 = NULL; +static char cloak_checksum[64]; +static int nokeys = 1; + +int CLOAK_IP_ONLY = 0; + +#undef KEY1 +#undef KEY2 +#undef KEY3 +#define KEY1 cloak_key1 +#define KEY2 cloak_key2 +#define KEY3 cloak_key3 + +#define SHA256_HASH_SIZE (256/8) + +char *hidehost(Client *client, char *host); +char *cloakcsum(); +int cloak_config_test(ConfigFile *, ConfigEntry *, int, int *); +int cloak_config_run(ConfigFile *, ConfigEntry *, int); +int cloak_config_posttest(int *); + +static char *hidehost_ipv4(char *host); +static char *hidehost_ipv6(char *host); +static char *hidehost_normalhost(char *host); +static inline unsigned int downsample(char *i); + +ModuleHeader MOD_HEADER = { + "cloak_sha256", + "1.0", + "Cloaking module (SHA256)", + "UnrealIRCd Team", + "unrealircd-6", +}; + +MOD_TEST() +{ + if (!CallbackAddString(modinfo->handle, CALLBACKTYPE_CLOAK_KEY_CHECKSUM, cloakcsum)) + { + unreal_log(ULOG_ERROR, "config", "CLOAK_MODULE_DUPLICATE", NULL, + "cloak_sha256: Error while trying to install callback.\n" + "Maybe you have multiple cloaking modules loaded? You can only load one!"); + return MOD_FAILED; + } + if (!CallbackAddString(modinfo->handle, CALLBACKTYPE_CLOAK_EX, hidehost)) + { + config_error("cloak_sha256: Error while trying to install cloaking callback!"); + return MOD_FAILED; + } + HookAdd(modinfo->handle, HOOKTYPE_CONFIGTEST, 0, cloak_config_test); + HookAdd(modinfo->handle, HOOKTYPE_CONFIGPOSTTEST, 0, cloak_config_posttest); + return MOD_SUCCESS; +} + +MOD_INIT() +{ + MARK_AS_OFFICIAL_MODULE(modinfo); + HookAdd(modinfo->handle, HOOKTYPE_CONFIGRUN, 0, cloak_config_run); + return MOD_SUCCESS; +} + +MOD_LOAD() +{ + return MOD_SUCCESS; +} + +MOD_UNLOAD() +{ + if (cloak_key1) + { + safe_free(cloak_key1); + safe_free(cloak_key2); + safe_free(cloak_key3); + } + return MOD_SUCCESS; +} + +static int check_badrandomness(char *key) +{ + char gotlowcase=0, gotupcase=0, gotdigit=0; + char *p; + + for (p=key; *p; p++) + { + if (islower(*p)) + gotlowcase = 1; + else if (isupper(*p)) + gotupcase = 1; + else if (isdigit(*p)) + gotdigit = 1; + } + + if (gotlowcase && gotupcase && gotdigit) + return 0; + + return 1; +} + + +int cloak_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) +{ + ConfigEntry *cep; + int keycnt = 0, errors = 0; + char *keys[3]; + + if (type == CONFIG_SET) + { + /* set::cloak-method */ + if (!ce || !ce->name || strcmp(ce->name, "cloak-method")) + return 0; + + if (!ce->value) + { + config_error("%s:%i: set::cloak-method: no method specified. The only supported methods are: 'ip' and 'host'", + ce->file->filename, ce->line_number); + errors++; + } else + if (strcmp(ce->value, "ip") && strcmp(ce->value, "host")) + { + config_error("%s:%i: set::cloak-method: unknown method '%s'. The only supported methods are: 'ip' and 'host'", + ce->file->filename, ce->line_number, ce->value); + errors++; + } + + *errs = errors; + return errors ? -1 : 1; + } + + if (type != CONFIG_CLOAKKEYS) + return 0; + + nokeys = 0; + for (cep = ce->items; cep; cep = cep->next) + { + keycnt++; + if (check_badrandomness(cep->name)) + { + config_error("%s:%i: set::cloak-keys: (key %d) Keys should be mixed a-zA-Z0-9, " + "like \"a2JO6fh3Q6w4oN3s7\"", cep->file->filename, cep->line_number, keycnt); + errors++; + } + if (strlen(cep->name) < 80) + { + config_error("%s:%i: set::cloak-keys: (key %d) Each key should be at least 80 characters", + cep->file->filename, cep->line_number, keycnt); + errors++; + } + if (strlen(cep->name) > 1000) + { + config_error("%s:%i: set::cloak-keys: (key %d) Each key should be less than 1000 characters", + cep->file->filename, cep->line_number, keycnt); + errors++; + } + if (keycnt < 4) + keys[keycnt-1] = cep->name; + } + if (keycnt != 3) + { + config_error("%s:%i: set::cloak-keys: we want 3 values, not %i!", + ce->file->filename, ce->line_number, keycnt); + errors++; + } + if ((keycnt == 3) && (!strcmp(keys[0], keys[1]) || !strcmp(keys[1], keys[2]))) + { + config_error("%s:%i: set::cloak-keys: All your 3 keys should be RANDOM, they should not be equal", + ce->file->filename, ce->line_number); + errors++; + } + *errs = errors; + return errors ? -1 : 1; +} + +int cloak_config_posttest(int *errs) +{ + int errors = 0; + + if (nokeys) + { + config_error("set::cloak-keys missing!"); + errors++; + } + + *errs = errors; + return errors ? -1 : 1; +} + +int cloak_config_run(ConfigFile *cf, ConfigEntry *ce, int type) +{ + ConfigEntry *cep; + char buf[4096]; + char result[128]; + + if (type == CONFIG_SET) + { + /* set::cloak-method */ + if (!ce || !ce->name || strcmp(ce->name, "cloak-method")) + return 0; + + if (!strcmp(ce->value, "ip")) + CLOAK_IP_ONLY = 1; + + return 0; + } + + if (type != CONFIG_CLOAKKEYS) + return 0; + + /* config test should ensure this goes fine... */ + cep = ce->items; + safe_strdup(cloak_key1, cep->name); + cep = cep->next; + safe_strdup(cloak_key2, cep->name); + cep = cep->next; + safe_strdup(cloak_key3, cep->name); + + /* Calculate checksum */ + ircsnprintf(buf, sizeof(buf), "%s:%s:%s", KEY1, KEY2, KEY3); + ircsnprintf(cloak_checksum, sizeof(cloak_checksum), "SHA256:%s", sha256hash(result, buf, strlen(buf))); + return 1; +} + +char *hidehost(Client *client, char *host) +{ + char *p; + int host_type; + + if (CLOAK_IP_ONLY) + host = GetIP(client); + + host_type = is_valid_ip(host); + + if (host_type == 4) + return hidehost_ipv4(host); + else if (host_type == 6) + return hidehost_ipv6(host); + else + return hidehost_normalhost(host); +} + +char *cloakcsum() +{ + return cloak_checksum; +} + +/** Downsamples a 256 bit result to 32 bits (SHA256 -> unsigned int) */ +static inline unsigned int downsample(char *i) +{ + char r[4]; + + r[0] = i[0] ^ i[1] ^ i[2] ^ i[3] ^ i[4] ^ i[5] ^ i[6] ^ i[7]; + r[1] = i[8] ^ i[9] ^ i[10] ^ i[11] ^ i[12] ^ i[13] ^ i[14] ^ i[15]; + r[2] = i[16] ^ i[17] ^ i[18] ^ i[19] ^ i[20] ^ i[21] ^ i[22] ^ i[23]; + r[3] = i[24] ^ i[25] ^ i[26] ^ i[27] ^ i[28] ^ i[29] ^ i[30] ^ i[31]; + + return ( ((unsigned int)r[0] << 24) + + ((unsigned int)r[1] << 16) + + ((unsigned int)r[2] << 8) + + (unsigned int)r[3]); +} + +static char *hidehost_ipv4(char *host) +{ + unsigned int a, b, c, d; + static char buf[512], res[512], res2[512], result[128]; + unsigned long n; + unsigned int alpha, beta, gamma; + + /* + * Output: ALPHA.BETA.GAMMA.IP + * ALPHA is unique for a.b.c.d + * BETA is unique for a.b.c.* + * GAMMA is unique for a.b.* + * We cloak like this: + * ALPHA = downsample(sha256(sha256("KEY2:A.B.C.D:KEY3")+"KEY1")); + * BETA = downsample(sha256(sha256("KEY3:A.B.C:KEY1")+"KEY2")); + * GAMMA = downsample(sha256(sha256("KEY1:A.B:KEY2")+"KEY3")); + */ + sscanf(host, "%u.%u.%u.%u", &a, &b, &c, &d); + + /* ALPHA... */ + ircsnprintf(buf, sizeof(buf), "%s:%s:%s", KEY2, host, KEY3); + sha256hash_binary(res, buf, strlen(buf)); + strlcpy(res+SHA256_HASH_SIZE, KEY1, sizeof(res)-SHA256_HASH_SIZE); /* first bytes are filled, append our key.. */ + n = strlen(res+SHA256_HASH_SIZE) + SHA256_HASH_SIZE; + sha256hash_binary(res2, res, n); + alpha = downsample(res2); + + /* BETA... */ + ircsnprintf(buf, sizeof(buf), "%s:%d.%d.%d:%s", KEY3, a, b, c, KEY1); + sha256hash_binary(res, buf, strlen(buf)); + strlcpy(res+SHA256_HASH_SIZE, KEY2, sizeof(res)-SHA256_HASH_SIZE); /* first bytes are filled, append our key.. */ + n = strlen(res+SHA256_HASH_SIZE) + SHA256_HASH_SIZE; + sha256hash_binary(res2, res, n); + beta = downsample(res2); + + /* GAMMA... */ + ircsnprintf(buf, sizeof(buf), "%s:%d.%d:%s", KEY1, a, b, KEY2); + sha256hash_binary(res, buf, strlen(buf)); + strlcpy(res+SHA256_HASH_SIZE, KEY3, sizeof(res)-SHA256_HASH_SIZE); /* first bytes are filled, append our key.. */ + n = strlen(res+SHA256_HASH_SIZE) + SHA256_HASH_SIZE; + sha256hash_binary(res2, res, n); + gamma = downsample(res2); + + ircsnprintf(result, sizeof(result), "%X.%X.%X.IP", alpha, beta, gamma); + return result; +} + +static char *hidehost_ipv6(char *host) +{ + unsigned int a, b, c, d, e, f, g, h; + static char buf[512], res[512], res2[512], result[128]; + unsigned long n; + unsigned int alpha, beta, gamma; + + /* + * Output: ALPHA:BETA:GAMMA:IP + * ALPHA is unique for a:b:c:d:e:f:g:h + * BETA is unique for a:b:c:d:e:f:g + * GAMMA is unique for a:b:c:d + * We cloak like this: + * ALPHA = downsample(sha256(sha256("KEY2:a:b:c:d:e:f:g:h:KEY3")+"KEY1")); + * BETA = downsample(sha256(sha256("KEY3:a:b:c:d:e:f:g:KEY1")+"KEY2")); + * GAMMA = downsample(sha256(sha256("KEY1:a:b:c:d:KEY2")+"KEY3")); + */ + sscanf(host, "%x:%x:%x:%x:%x:%x:%x:%x", + &a, &b, &c, &d, &e, &f, &g, &h); + + /* ALPHA... */ + ircsnprintf(buf, sizeof(buf), "%s:%s:%s", KEY2, host, KEY3); + sha256hash_binary(res, buf, strlen(buf)); + strlcpy(res+SHA256_HASH_SIZE, KEY1, sizeof(res)-SHA256_HASH_SIZE); /* first bytes are filled, append our key.. */ + n = strlen(res+SHA256_HASH_SIZE) + SHA256_HASH_SIZE; + sha256hash_binary(res2, res, n); + alpha = downsample(res2); + + /* BETA... */ + ircsnprintf(buf, sizeof(buf), "%s:%x:%x:%x:%x:%x:%x:%x:%s", KEY3, a, b, c, d, e, f, g, KEY1); + sha256hash_binary(res, buf, strlen(buf)); + strlcpy(res+SHA256_HASH_SIZE, KEY2, sizeof(res)-SHA256_HASH_SIZE); /* first bytes are filled, append our key.. */ + n = strlen(res+SHA256_HASH_SIZE) + SHA256_HASH_SIZE; + sha256hash_binary(res2, res, n); + beta = downsample(res2); + + /* GAMMA... */ + ircsnprintf(buf, sizeof(buf), "%s:%x:%x:%x:%x:%s", KEY1, a, b, c, d, KEY2); + sha256hash_binary(res, buf, strlen(buf)); + strlcpy(res+SHA256_HASH_SIZE, KEY3, sizeof(res)-SHA256_HASH_SIZE); /* first bytes are filled, append our key.. */ + n = strlen(res+SHA256_HASH_SIZE) + SHA256_HASH_SIZE; + sha256hash_binary(res2, res, n); + gamma = downsample(res2); + + ircsnprintf(result, sizeof(result), "%X:%X:%X:IP", alpha, beta, gamma); + return result; +} + +static char *hidehost_normalhost(char *host) +{ + char *p; + static char buf[512], res[512], res2[512], result[HOSTLEN+1]; + unsigned int alpha, n; + + ircsnprintf(buf, sizeof(buf), "%s:%s:%s", KEY1, host, KEY2); + sha256hash_binary(res, buf, strlen(buf)); + strlcpy(res+SHA256_HASH_SIZE, KEY3, sizeof(res)-SHA256_HASH_SIZE); /* first bytes are filled, append our key.. */ + n = strlen(res+SHA256_HASH_SIZE) + SHA256_HASH_SIZE; + sha256hash_binary(res2, res, n); + alpha = downsample(res2); + + for (p = host; *p; p++) + if (*p == '.') + if (isalpha(*(p + 1))) + break; + + if (*p) + { + unsigned int len; + p++; + ircsnprintf(result, sizeof(result), "%s-%X.", CLOAK_PREFIX, alpha); + len = strlen(result) + strlen(p); + if (len <= HOSTLEN) + strlcat(result, p, sizeof(result)); + else + strlcat(result, p + (len - HOSTLEN), sizeof(result)); + } else + ircsnprintf(result, sizeof(result), "%s-%X", CLOAK_PREFIX, alpha); + + return result; +} diff --git a/src/modules/close.c b/src/modules/close.c index e9f988e..a732990 100644 --- a/src/modules/close.c +++ b/src/modules/close.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", "command /close", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -75,7 +75,8 @@ CMD_FUNC(cmd_close) } sendnumeric(client, RPL_CLOSEEND, closed); - sendto_realops("%s!%s@%s closed %d unknown connections", client->name, - client->user->username, GetHost(client), closed); + unreal_log(ULOG_INFO, "close", "CLOSED_CONNECTIONS", client, + "$client.details closed $num_closed unknown connections", + log_data_integer("num_closed", closed)); irccounts.unknown = 0; } diff --git a/src/modules/connect.c b/src/modules/connect.c index e5c47bd..59cff3c 100644 --- a/src/modules/connect.c +++ b/src/modules/connect.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", "command /connect", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -76,7 +76,7 @@ CMD_FUNC(cmd_connect) sendnumeric(client, ERR_NOPRIVILEGES); return; } - if (hunt_server(client, recv_mtags, ":%s CONNECT %s %s :%s", 3, parc, parv) != HUNTED_ISME) + if (hunt_server(client, recv_mtags, "CONNECT", 3, parc, parv) != HUNTED_ISME) return; if (parc < 2 || *parv[1] == '\0') @@ -117,7 +117,7 @@ CMD_FUNC(cmd_connect) /* Evaluate deny link */ for (deny = conf_deny_link; deny; deny = deny->next) { - if (deny->flag.type == CRULE_ALL && match_simple(deny->mask, aconf->servername) + if (deny->flag.type == CRULE_ALL && unreal_mask_match_string(aconf->servername, deny->mask) && crule_eval(deny->rule)) { sendnotice(client, "*** Connect: Disallowed by connection rule"); @@ -134,22 +134,5 @@ CMD_FUNC(cmd_connect) get_client_name(client, FALSE)); } - switch (retval = connect_server(aconf, client, NULL)) - { - case 0: - sendnotice(client, "*** Trying to activate link with server %s[%s]...", - aconf->servername, aconf->outgoing.hostname); - break; - case -1: - sendnotice(client, "*** Couldn't connect to %s[%s]", - aconf->servername, aconf->outgoing.hostname); - break; - case -2: - sendnotice(client, "*** Resolving hostname '%s'...", - aconf->outgoing.hostname); - break; - default: - sendnotice(client, "*** Connection to %s[%s] failed: %s", - aconf->servername, aconf->outgoing.hostname, STRERROR(retval)); - } + connect_server(aconf, client, NULL); } diff --git a/src/modules/connthrottle.c b/src/modules/connthrottle.c index 608e07c..5b35e2a 100644 --- a/src/modules/connthrottle.c +++ b/src/modules/connthrottle.c @@ -19,7 +19,7 @@ ModuleHeader MOD_HEADER CONNTHROTTLE_VERSION, "Connection throttler - by Syzop", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; typedef struct { @@ -146,9 +146,6 @@ int ct_config_posttest(int *errs) return errors ? -1 : 1; } -#ifndef CheckNull - #define CheckNull(x) if ((!(x)->ce_vardata) || (!(*((x)->ce_vardata)))) { config_error("%s:%i: missing parameter", (x)->ce_fileptr->cf_filename, (x)->ce_varlinenum); errors++; continue; } -#endif /** Test the set::connthrottle configuration */ int ct_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) { @@ -159,113 +156,113 @@ int ct_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) return 0; /* We are only interrested in set::connthrottle.. */ - if (!ce || !ce->ce_varname || strcmp(ce->ce_varname, "connthrottle")) + if (!ce || !ce->name || strcmp(ce->name, "connthrottle")) return 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "known-users")) + if (!strcmp(cep->name, "known-users")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { CheckNull(cepp); - if (!strcmp(cepp->ce_varname, "minimum-reputation-score")) + if (!strcmp(cepp->name, "minimum-reputation-score")) { - int cnt = atoi(cepp->ce_vardata); + int cnt = atoi(cepp->value); if (cnt < 1) { config_error("%s:%i: set::connthrottle::known-users::minimum-reputation-score should be at least 1", - cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum); + cepp->file->filename, cepp->line_number); errors++; continue; } } else - if (!strcmp(cepp->ce_varname, "sasl-bypass")) + if (!strcmp(cepp->name, "sasl-bypass")) { } else - if (!strcmp(cepp->ce_varname, "webirc-bypass")) + if (!strcmp(cepp->name, "webirc-bypass")) { } else { - config_error_unknown(cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum, - "set::connthrottle::known-users", cepp->ce_varname); + config_error_unknown(cepp->file->filename, cepp->line_number, + "set::connthrottle::known-users", cepp->name); errors++; } } } else - if (!strcmp(cep->ce_varname, "new-users")) + if (!strcmp(cep->name, "new-users")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { CheckNull(cepp); - if (!strcmp(cepp->ce_varname, "local-throttle")) + if (!strcmp(cepp->name, "local-throttle")) { int cnt, period; - if (!config_parse_flood(cepp->ce_vardata, &cnt, &period) || + if (!config_parse_flood(cepp->value, &cnt, &period) || (cnt < 1) || (cnt > 2000000000) || (period > 2000000000)) { config_error("%s:%i: set::connthrottle::new-users::local-throttle error. " "Syntax is : (eg 6:60), " "and count and period should be non-zero.", - cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum); + cepp->file->filename, cepp->line_number); errors++; continue; } } else - if (!strcmp(cepp->ce_varname, "global-throttle")) + if (!strcmp(cepp->name, "global-throttle")) { int cnt, period; - if (!config_parse_flood(cepp->ce_vardata, &cnt, &period) || + if (!config_parse_flood(cepp->value, &cnt, &period) || (cnt < 1) || (cnt > 2000000000) || (period > 2000000000)) { config_error("%s:%i: set::connthrottle::new-users::global-throttle error. " "Syntax is : (eg 6:60), " "and count and period should be non-zero.", - cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum); + cepp->file->filename, cepp->line_number); errors++; continue; } } else { - config_error_unknown(cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum, - "set::connthrottle::new-users", cepp->ce_varname); + config_error_unknown(cepp->file->filename, cepp->line_number, + "set::connthrottle::new-users", cepp->name); errors++; } } } else - if (!strcmp(cep->ce_varname, "disabled-when")) + if (!strcmp(cep->name, "disabled-when")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { CheckNull(cepp); - if (!strcmp(cepp->ce_varname, "start-delay")) + if (!strcmp(cepp->name, "start-delay")) { - int cnt = config_checkval(cepp->ce_vardata, CFG_TIME); + int cnt = config_checkval(cepp->value, CFG_TIME); if ((cnt < 0) || (cnt > 3600)) { config_error("%s:%i: set::connthrottle::disabled-when::start-delay should be in range 0-3600", - cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum); + cepp->file->filename, cepp->line_number); errors++; continue; } } else - if (!strcmp(cepp->ce_varname, "reputation-gathering")) + if (!strcmp(cepp->name, "reputation-gathering")) { } else { - config_error_unknown(cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum, - "set::connthrottle::disabled-when", cepp->ce_varname); + config_error_unknown(cepp->file->filename, cepp->line_number, + "set::connthrottle::disabled-when", cepp->name); errors++; } } } else - if (!strcmp(cep->ce_varname, "reason")) + if (!strcmp(cep->name, "reason")) { CheckNull(cep); } else { config_error("%s:%i: unknown directive set::connthrottle::%s", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_varname); + cep->file->filename, cep->line_number, cep->name); errors++; continue; } @@ -284,48 +281,48 @@ int ct_config_run(ConfigFile *cf, ConfigEntry *ce, int type) return 0; /* We are only interrested in set::connthrottle.. */ - if (!ce || !ce->ce_varname || strcmp(ce->ce_varname, "connthrottle")) + if (!ce || !ce->name || strcmp(ce->name, "connthrottle")) return 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "known-users")) + if (!strcmp(cep->name, "known-users")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { - if (!strcmp(cepp->ce_varname, "minimum-reputation-score")) - cfg.minimum_reputation_score = atoi(cepp->ce_vardata); - else if (!strcmp(cepp->ce_varname, "sasl-bypass")) - cfg.sasl_bypass = config_checkval(cepp->ce_vardata, CFG_YESNO); - else if (!strcmp(cepp->ce_varname, "webirc-bypass")) - cfg.webirc_bypass = config_checkval(cepp->ce_vardata, CFG_YESNO); + if (!strcmp(cepp->name, "minimum-reputation-score")) + cfg.minimum_reputation_score = atoi(cepp->value); + else if (!strcmp(cepp->name, "sasl-bypass")) + cfg.sasl_bypass = config_checkval(cepp->value, CFG_YESNO); + else if (!strcmp(cepp->name, "webirc-bypass")) + cfg.webirc_bypass = config_checkval(cepp->value, CFG_YESNO); } } else - if (!strcmp(cep->ce_varname, "new-users")) + if (!strcmp(cep->name, "new-users")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { - if (!strcmp(cepp->ce_varname, "local-throttle")) - config_parse_flood(cepp->ce_vardata, &cfg.local.count, &cfg.local.period); - else if (!strcmp(cepp->ce_varname, "global-throttle")) - config_parse_flood(cepp->ce_vardata, &cfg.global.count, &cfg.global.period); + if (!strcmp(cepp->name, "local-throttle")) + config_parse_flood(cepp->value, &cfg.local.count, &cfg.local.period); + else if (!strcmp(cepp->name, "global-throttle")) + config_parse_flood(cepp->value, &cfg.global.count, &cfg.global.period); } } else - if (!strcmp(cep->ce_varname, "disabled-when")) + if (!strcmp(cep->name, "disabled-when")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { - if (!strcmp(cepp->ce_varname, "start-delay")) - cfg.start_delay = config_checkval(cepp->ce_vardata, CFG_TIME); - else if (!strcmp(cepp->ce_varname, "reputation-gathering")) - cfg.reputation_gathering = config_checkval(cepp->ce_vardata, CFG_TIME); + if (!strcmp(cepp->name, "start-delay")) + cfg.start_delay = config_checkval(cepp->value, CFG_TIME); + else if (!strcmp(cepp->name, "reputation-gathering")) + cfg.reputation_gathering = config_checkval(cepp->value, CFG_TIME); } } else - if (!strcmp(cep->ce_varname, "reason")) + if (!strcmp(cep->name, "reason")) { safe_free(cfg.reason); - cfg.reason = safe_alloc(strlen(cep->ce_vardata)+16); - sprintf(cfg.reason, "Throttled: %s", cep->ce_vardata); + cfg.reason = safe_alloc(strlen(cep->value)+16); + sprintf(cfg.reason, "Throttled: %s", cep->value); } } return 1; @@ -360,16 +357,18 @@ EVENT(connthrottle_evt) if (ucounter->rejected_clients) { - snprintf(buf, sizeof(buf), - "[ConnThrottle] Stats for this server past 60 secs: Connections rejected: %d. Accepted: %d known user(s), %d SASL, %d WEBIRC and %d new user(s).", - ucounter->rejected_clients, - ucounter->allowed_score, - ucounter->allowed_sasl, - ucounter->allowed_webirc, - ucounter->allowed_other); - - sendto_realops("%s", buf); - ircd_log(LOG_ERROR, "%s", buf); + unreal_log(ULOG_INFO, "connthrottle", "CONNTHROTLE_REPORT", NULL, + "ConnThrottle] Stats for this server past 60 secs: " + "Connections rejected: $num_rejected. " + "Accepted: $num_accepted_known_users known user(s), " + "$num_accepted_sasl SASL, " + "$num_accepted_webirc WEBIRC and " + "$num_accepted_unknown_users new user(s).", + log_data_integer("num_rejected", ucounter->rejected_clients), + log_data_integer("num_accepted_known_users", ucounter->allowed_score), + log_data_integer("num_accepted_sasl", ucounter->allowed_sasl), + log_data_integer("num_accepted_webirc", ucounter->allowed_webirc), + log_data_integer("num_accepted_unknown_users", ucounter->allowed_other)); } /* Reset stats for next message */ @@ -391,7 +390,7 @@ int ct_pre_lconnect(Client *client) int throttle=0; int score; - if (me.local->firsttime + cfg.start_delay > TStime()) + if (me.local->creationtime + cfg.start_delay > TStime()) return HOOK_CONTINUE; /* no throttle: start delay */ if (ucounter->disabled) @@ -436,10 +435,10 @@ int ct_pre_lconnect(Client *client) /* We send the LARGE banner if throttling was activated */ if (!ucounter->throttling_previous_minute && !ucounter->throttling_banner_displayed) { - ircd_log(LOG_ERROR, "[ConnThrottle] Connection throttling has been ACTIVATED due to a HIGH CONNECTION RATE."); - sendto_realops("[ConnThrottle] Connection throttling has been ACTIVATED due to a HIGH CONNECTION RATE."); - sendto_realops("[ConnThrottle] Users with IP addresses that have not been seen before will be rejected above the set connection rate. Known users can still get in."); - sendto_realops("[ConnThrottle] For more information see https://www.unrealircd.org/docs/ConnThrottle"); + unreal_log(ULOG_WARNING, "connthrottle", "CONNTHROTLE_ACTIVATED", NULL, + "[ConnThrottle] Connection throttling has been ACTIVATED due to a HIGH CONNECTION RATE.\n" + "Users with IP addresses that have not been seen before will be rejected above the set connection rate. Known users can still get in.\n" + "or more information see https://www.unrealircd.org/docs/ConnThrottle"); ucounter->throttling_banner_displayed = 1; } exit_client(client, NULL, cfg.reason); @@ -478,7 +477,7 @@ int ct_lconnect(Client *client) { int score; - if (me.local->firsttime + cfg.start_delay > TStime()) + if (me.local->creationtime + cfg.start_delay > TStime()) return 0; /* no throttle: start delay */ if (ucounter->disabled) @@ -521,7 +520,7 @@ int ct_rconnect(Client *client) { int score; - if (client->srvptr && !IsSynched(client->srvptr)) + if (client->uplink && !IsSynched(client->uplink)) return 0; /* Netmerge: skip */ if (IsULine(client)) @@ -533,8 +532,8 @@ int ct_rconnect(Client *client) * set::disabled-when::start-delay restriction on remote * servers as well. */ - if (client->srvptr && client->srvptr->serv && client->srvptr->serv->boottime && - (TStime() - client->srvptr->serv->boottime < cfg.start_delay)) + if (client->uplink && client->uplink->server && client->uplink->server->boottime && + (TStime() - client->uplink->server->boottime < cfg.start_delay)) { return 0; } @@ -584,10 +583,10 @@ CMD_FUNC(ct_throttle) { sendnotice(client, "Module DISABLED because the 'reputation' module has not gathered enough data yet (set::connthrottle::disabled-when::reputation-gathering)."); } else - if (me.local->firsttime + cfg.start_delay > TStime()) + if (me.local->creationtime + cfg.start_delay > TStime()) { sendnotice(client, "Module DISABLED due to start-delay (set::connthrottle::disabled-when::start-delay), will be enabled in %lld second(s).", - (long long)((me.local->firsttime + cfg.start_delay) - TStime())); + (long long)((me.local->creationtime + cfg.start_delay) - TStime())); } else { sendnotice(client, "Module ENABLED"); @@ -602,8 +601,8 @@ CMD_FUNC(ct_throttle) return; } ucounter->disabled = 1; - sendto_realops("[connthrottle] %s (%s@%s) DISABLED the connthrottle module.", - client->name, client->user->username, client->user->realhost); + unreal_log(ULOG_WARNING, "connthrottle", "CONNTHROTLE_MODULE_DISABLED", client, + "[ConnThrottle] $client.details DISABLED the connthrottle module."); } else if (!strcasecmp(parv[1], "ON")) { @@ -612,15 +611,15 @@ CMD_FUNC(ct_throttle) sendnotice(client, "Already ON"); return; } - sendto_realops("[connthrottle] %s (%s@%s) ENABLED the connthrottle module.", - client->name, client->user->username, client->user->realhost); + unreal_log(ULOG_WARNING, "connthrottle", "CONNTHROTLE_MODULE_ENABLED", client, + "[ConnThrottle] $client.details ENABLED the connthrottle module."); ucounter->disabled = 0; } else if (!strcasecmp(parv[1], "RESET")) { memset(ucounter, 0, sizeof(UCounter)); - sendto_realops("[connthrottle] %s (%s@%s) did a RESET on the stats/counters!!", - client->name, client->user->username, client->user->realhost); + unreal_log(ULOG_WARNING, "connthrottle", "CONNTHROTLE_RESET", client, + "[ConnThrottle] $client.details did a RESET on the statistics/counters."); } else { sendnotice(client, "Unknown option '%s'", parv[1]); diff --git a/src/modules/cycle.c b/src/modules/cycle.c index 8953609..f1af457 100644 --- a/src/modules/cycle.c +++ b/src/modules/cycle.c @@ -30,7 +30,7 @@ ModuleHeader MOD_HEADER "5.0", /* Version */ "command /cycle", /* Short description of module */ "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* This is called on module init, before Server Ready */ @@ -62,6 +62,7 @@ MOD_UNLOAD() CMD_FUNC(cmd_cycle) { char channels[BUFSIZE]; + const char *parx[3]; int n; if (parc < 2) @@ -75,7 +76,8 @@ CMD_FUNC(cmd_cycle) return; /* Then JOIN the user again... */ - parv[1] = channels; - parv[2] = NULL; - do_cmd(client, recv_mtags, "JOIN", 2, parv); + parx[0] = NULL; + parx[1] = channels; + parx[2] = NULL; + do_cmd(client, recv_mtags, "JOIN", 2, parx); } diff --git a/src/modules/dccallow.c b/src/modules/dccallow.c index ffeffd4..ce1ad49 100644 --- a/src/modules/dccallow.c +++ b/src/modules/dccallow.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", "command /dccallow", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -59,6 +59,7 @@ MOD_UNLOAD() */ CMD_FUNC(cmd_dccallow) { + char request[BUFSIZE]; Link *lp; char *p, *s; Client *friend; @@ -92,7 +93,8 @@ CMD_FUNC(cmd_dccallow) return; } - for (p = NULL, s = strtoken(&p, parv[1], ", "); s; s = strtoken(&p, NULL, ", ")) + strlcpy(request, parv[1], sizeof(request)); + for (p = NULL, s = strtoken(&p, request, ", "); s; s = strtoken(&p, NULL, ", ")) { if (MyUser(client) && (++ntargets > maxtargets)) { @@ -105,7 +107,7 @@ CMD_FUNC(cmd_dccallow) if (!*++s) continue; - friend = find_person(s, NULL); + friend = find_user(s, NULL); if (friend == client) continue; @@ -123,7 +125,7 @@ CMD_FUNC(cmd_dccallow) if (!*++s) continue; - friend = find_person(s, NULL); + friend = find_user(s, NULL); if (friend == client) continue; if (!friend) @@ -243,8 +245,11 @@ int del_dccallow(Client *client, Client *optr) } } if (!found) - sendto_realops("[BUG!] %s was in dccallowme list of %s but not in dccallowrem list!", - optr->name, client->name); + { + unreal_log(ULOG_WARNING, "dccallow", "BUG_DCCALLOW", client, + "[BUG] DCCALLOW list for $client did not contain $target", + log_data_client("target", optr)); + } sendnumeric(client, RPL_DCCSTATUS, optr->name, "removed from"); diff --git a/src/modules/dccdeny.c b/src/modules/dccdeny.c index d27a9f7..0fda03f 100644 --- a/src/modules/dccdeny.c +++ b/src/modules/dccdeny.c @@ -28,7 +28,7 @@ ModuleHeader MOD_HEADER "5.0", "command /dccdeny", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Variables */ @@ -40,24 +40,26 @@ int dccdeny_configtest_deny_dcc(ConfigFile *cf, ConfigEntry *ce, int type, int * int dccdeny_configtest_allow_dcc(ConfigFile *cf, ConfigEntry *ce, int type, int *errs); int dccdeny_configrun_deny_dcc(ConfigFile *cf, ConfigEntry *ce, int type); int dccdeny_configrun_allow_dcc(ConfigFile *cf, ConfigEntry *ce, int type); -int dccdeny_stats(Client *client, char *para); +int dccdeny_stats(Client *client, const char *para); +int dccdeny_dcc_denied(Client *client, const char *target, const char *realfile, const char *displayfile, ConfigItem_deny_dcc *dccdeny); CMD_FUNC(cmd_dccdeny); CMD_FUNC(cmd_undccdeny); CMD_FUNC(cmd_svsfline); -int dccdeny_can_send_to_user(Client *client, Client *target, char **text, char **errmsg, SendType sendtype); -int dccdeny_can_send_to_channel(Client *client, Channel *channel, Membership *lp, char **msg, char **errmsg, SendType sendtype); +int dccdeny_can_send_to_user(Client *client, Client *target, const char **text, const char **errmsg, SendType sendtype); +int dccdeny_can_send_to_channel(Client *client, Channel *channel, Membership *lp, const char **msg, const char **errmsg, SendType sendtype); int dccdeny_server_sync(Client *client); -static ConfigItem_deny_dcc *dcc_isforbidden(Client *client, char *filename); -static ConfigItem_deny_dcc *dcc_isdiscouraged(Client *client, char *filename); -static void DCCdeny_add(char *filename, char *reason, int type, int type2); +static ConfigItem_deny_dcc *dcc_isforbidden(Client *client, const char *filename); +static ConfigItem_deny_dcc *dcc_isdiscouraged(Client *client, const char *filename); +static void DCCdeny_add(const char *filename, const char *reason, int type, int type2); static void DCCdeny_del(ConfigItem_deny_dcc *deny); static void dcc_wipe_services(void); -static char *get_dcc_filename(const char *text); -static int can_dcc(Client *client, char *target, Client *targetcli, char *filename, char **errmsg); -static int can_dcc_soft(Client *from, Client *to, char *filename, char **errmsg); +static const char *get_dcc_filename(const char *text); +static int can_dcc(Client *client, const char *target, Client *targetcli, const char *filename, const char **errmsg); +static int can_dcc_soft(Client *from, Client *to, const char *filename, const char **errmsg); static void free_dcc_config_blocks(void); void dccdeny_unload_free_all_conf_deny_dcc(ModData *m); void dccdeny_unload_free_all_conf_allow_dcc(ModData *m); +ConfigItem_deny_dcc *find_deny_dcc(const char *name); MOD_TEST() { @@ -80,6 +82,7 @@ MOD_INIT() HookAdd(modinfo->handle, HOOKTYPE_CAN_SEND_TO_USER, 0, dccdeny_can_send_to_user); HookAdd(modinfo->handle, HOOKTYPE_CAN_SEND_TO_CHANNEL, 0, dccdeny_can_send_to_channel); HookAdd(modinfo->handle, HOOKTYPE_SERVER_SYNC, 0, dccdeny_server_sync); + HookAdd(modinfo->handle, HOOKTYPE_DCC_DENIED, 0, dccdeny_dcc_denied); return MOD_SUCCESS; } @@ -104,62 +107,62 @@ int dccdeny_configtest_deny_dcc(ConfigFile *cf, ConfigEntry *ce, int type, int * char has_filename = 0, has_reason = 0, has_soft = 0; /* We are only interested in deny dcc { } */ - if ((type != CONFIG_DENY) || strcmp(ce->ce_vardata, "dcc")) + if ((type != CONFIG_DENY) || strcmp(ce->value, "dcc")) return 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { if (config_is_blankorempty(cep, "deny dcc")) { errors++; continue; } - if (!strcmp(cep->ce_varname, "filename")) + if (!strcmp(cep->name, "filename")) { if (has_filename) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "deny dcc::filename"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "deny dcc::filename"); continue; } has_filename = 1; } - else if (!strcmp(cep->ce_varname, "reason")) + else if (!strcmp(cep->name, "reason")) { if (has_reason) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "deny dcc::reason"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "deny dcc::reason"); continue; } has_reason = 1; } - else if (!strcmp(cep->ce_varname, "soft")) + else if (!strcmp(cep->name, "soft")) { if (has_soft) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "deny dcc::soft"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "deny dcc::soft"); continue; } has_soft = 1; } else { - config_error_unknown(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "deny dcc", cep->ce_varname); + config_error_unknown(cep->file->filename, + cep->line_number, "deny dcc", cep->name); errors++; } } if (!has_filename) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "deny dcc::filename"); errors++; } if (!has_reason) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "deny dcc::reason"); errors++; } @@ -174,46 +177,46 @@ int dccdeny_configtest_allow_dcc(ConfigFile *cf, ConfigEntry *ce, int type, int int errors = 0, has_filename = 0, has_soft = 0; /* We are only interested in allow dcc { } */ - if ((type != CONFIG_ALLOW) || strcmp(ce->ce_vardata, "dcc")) + if ((type != CONFIG_ALLOW) || strcmp(ce->value, "dcc")) return 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { if (config_is_blankorempty(cep, "allow dcc")) { errors++; continue; } - if (!strcmp(cep->ce_varname, "filename")) + if (!strcmp(cep->name, "filename")) { if (has_filename) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "allow dcc::filename"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "allow dcc::filename"); continue; } has_filename = 1; } - else if (!strcmp(cep->ce_varname, "soft")) + else if (!strcmp(cep->name, "soft")) { if (has_soft) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "allow dcc::soft"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "allow dcc::soft"); continue; } has_soft = 1; } else { - config_error_unknown(cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - "allow dcc", cep->ce_varname); + config_error_unknown(cep->file->filename, cep->line_number, + "allow dcc", cep->name); errors++; } } if (!has_filename) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "allow dcc::filename"); errors++; } @@ -228,23 +231,23 @@ int dccdeny_configrun_deny_dcc(ConfigFile *cf, ConfigEntry *ce, int type) ConfigEntry *cep; /* We are only interested in deny dcc { } */ - if ((type != CONFIG_DENY) || strcmp(ce->ce_vardata, "dcc")) + if ((type != CONFIG_DENY) || strcmp(ce->value, "dcc")) return 0; deny = safe_alloc(sizeof(ConfigItem_deny_dcc)); - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "filename")) + if (!strcmp(cep->name, "filename")) { - safe_strdup(deny->filename, cep->ce_vardata); + safe_strdup(deny->filename, cep->value); } - else if (!strcmp(cep->ce_varname, "reason")) + else if (!strcmp(cep->name, "reason")) { - safe_strdup(deny->reason, cep->ce_vardata); + safe_strdup(deny->reason, cep->value); } - else if (!strcmp(cep->ce_varname, "soft")) + else if (!strcmp(cep->name, "soft")) { - int x = config_checkval(cep->ce_vardata,CFG_YESNO); + int x = config_checkval(cep->value,CFG_YESNO); if (x == 1) deny->flag.type = DCCDENY_SOFT; } @@ -266,18 +269,18 @@ int dccdeny_configrun_allow_dcc(ConfigFile *cf, ConfigEntry *ce, int type) ConfigEntry *cep; /* We are only interested in allow dcc { } */ - if ((type != CONFIG_ALLOW) || strcmp(ce->ce_vardata, "dcc")) + if ((type != CONFIG_ALLOW) || strcmp(ce->value, "dcc")) return 0; allow = safe_alloc(sizeof(ConfigItem_allow_dcc)); - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "filename")) - safe_strdup(allow->filename, cep->ce_vardata); - else if (!strcmp(cep->ce_varname, "soft")) + if (!strcmp(cep->name, "filename")) + safe_strdup(allow->filename, cep->value); + else if (!strcmp(cep->name, "soft")) { - int x = config_checkval(cep->ce_vardata,CFG_YESNO); + int x = config_checkval(cep->value,CFG_YESNO); if (x) allow->flag.type = DCCDENY_SOFT; } @@ -371,8 +374,10 @@ CMD_FUNC(cmd_dccdeny) if (!find_deny_dcc(parv[1])) { - sendto_ops("%s added a temp dccdeny for %s (%s)", client->name, - parv[1], parv[2]); + unreal_log(ULOG_INFO, "dccdeny", "DCCDENY_ADD", client, + "[dccdeny] $client added a temporary DCCDENY for $file ($reason)", + log_data_string("file", parv[1]), + log_data_string("reason", parv[2])); DCCdeny_add(parv[1], parv[2], DCCDENY_HARD, CONF_BAN_TYPE_TEMPORARY); return; } else @@ -405,7 +410,10 @@ CMD_FUNC(cmd_undccdeny) if ((d = find_deny_dcc(parv[1])) && d->flag.type2 == CONF_BAN_TYPE_TEMPORARY) { - sendto_ops("%s removed a temp dccdeny for %s", client->name, parv[1]); + unreal_log(ULOG_INFO, "dccdeny", "DCCDENY_DEL", client, + "[dccdeny] $client removed a temporary DCCDENY for $file ($reason)", + log_data_string("file", d->filename), + log_data_string("reason", d->reason)); DCCdeny_del(d); return; } else @@ -489,11 +497,11 @@ int dccdeny_server_sync(Client *client) } /** Check if a DCC should be blocked (user-to-user) */ -int dccdeny_can_send_to_user(Client *client, Client *target, char **text, char **errmsg, SendType sendtype) +int dccdeny_can_send_to_user(Client *client, Client *target, const char **text, const char **errmsg, SendType sendtype) { if (**text == '\001') { - char *filename = get_dcc_filename(*text); + const char *filename = get_dcc_filename(*text); if (filename) { if (MyUser(client) && !can_dcc(client, target->name, target, filename, errmsg)) @@ -507,15 +515,15 @@ int dccdeny_can_send_to_user(Client *client, Client *target, char **text, char * } /** Check if a DCC should be blocked (user-to-channel, unusual) */ -int dccdeny_can_send_to_channel(Client *client, Channel *channel, Membership *lp, char **msg, char **errmsg, SendType sendtype) +int dccdeny_can_send_to_channel(Client *client, Channel *channel, Membership *lp, const char **msg, const char **errmsg, SendType sendtype) { static char errbuf[512]; if (MyUser(client) && (**msg == '\001')) { - char *err = NULL; - char *filename = get_dcc_filename(*msg); - if (filename && !can_dcc(client, channel->chname, NULL, filename, &err)) + const char *err = NULL; + const char *filename = get_dcc_filename(*msg); + if (filename && !can_dcc(client, channel->name, NULL, filename, &err)) { if (!IsDead(client) && (sendtype != SEND_TYPE_NOTICE)) { @@ -541,10 +549,11 @@ int dccdeny_can_send_to_channel(Client *client, Channel *channel, Membership *lp * This is to protect a bit against tricks like 'flood-it-off-the-buffer' * and color 1,1 etc... */ -static char *dcc_displayfile(char *f) +static const char *dcc_displayfile(const char *f) { static char buf[512]; - char *i, *o = buf; + const char *i; + char *o = buf; size_t n = strlen(f); if (n < 300) @@ -575,7 +584,7 @@ static char *dcc_displayfile(char *f) return buf; } -static char *get_dcc_filename(const char *text) +static const char *get_dcc_filename(const char *text) { static char filename[BUFSIZE+1]; char *end; @@ -617,7 +626,7 @@ static char *get_dcc_filename(const char *text) * @param text The entire message * @returns 1 if DCC SEND allowed, 0 if rejected */ -static int can_dcc(Client *client, char *target, Client *targetcli, char *filename, char **errmsg) +static int can_dcc(Client *client, const char *target, Client *targetcli, const char *filename, const char **errmsg) { ConfigItem_deny_dcc *fl; static char errbuf[256]; @@ -644,9 +653,9 @@ static int can_dcc(Client *client, char *target, Client *targetcli, char *filena if ((fl = dcc_isforbidden(client, filename))) { - char *displayfile = dcc_displayfile(filename); + const char *displayfile = dcc_displayfile(filename); - RunHook5(HOOKTYPE_DCC_DENIED, client, target, filename, displayfile, fl); + RunHook(HOOKTYPE_DCC_DENIED, client, target, filename, displayfile, fl); ircsnprintf(errbuf, sizeof(errbuf), "Cannot DCC SEND file: %s", fl->reason); *errmsg = errbuf; @@ -675,10 +684,10 @@ static int can_dcc(Client *client, char *target, Client *targetcli, char *filena * 1: allowed * 0: block */ -static int can_dcc_soft(Client *from, Client *to, char *filename, char **errmsg) +static int can_dcc_soft(Client *from, Client *to, const char *filename, const char **errmsg) { ConfigItem_deny_dcc *fl; - char *displayfile; + const char *displayfile; static char errbuf[256]; /* User (IRCOp) may bypass send restrictions */ @@ -718,7 +727,7 @@ static int can_dcc_soft(Client *from, Client *to, char *filename, char **errmsg) } /** Checks if the dcc is blacklisted. */ -static ConfigItem_deny_dcc *dcc_isforbidden(Client *client, char *filename) +static ConfigItem_deny_dcc *dcc_isforbidden(Client *client, const char *filename) { ConfigItem_deny_dcc *d; ConfigItem_allow_dcc *a; @@ -743,7 +752,7 @@ static ConfigItem_deny_dcc *dcc_isforbidden(Client *client, char *filename) } /** checks if the dcc is discouraged ('soft bans'). */ -static ConfigItem_deny_dcc *dcc_isdiscouraged(Client *client, char *filename) +static ConfigItem_deny_dcc *dcc_isdiscouraged(Client *client, const char *filename) { ConfigItem_deny_dcc *d; ConfigItem_allow_dcc *a; @@ -767,7 +776,7 @@ static ConfigItem_deny_dcc *dcc_isdiscouraged(Client *client, char *filename) return NULL; } -static void DCCdeny_add(char *filename, char *reason, int type, int type2) +static void DCCdeny_add(const char *filename, const char *reason, int type, int type2) { ConfigItem_deny_dcc *deny = NULL; @@ -787,7 +796,7 @@ static void DCCdeny_del(ConfigItem_deny_dcc *deny) safe_free(deny); } -ConfigItem_deny_dcc *find_deny_dcc(char *name) +ConfigItem_deny_dcc *find_deny_dcc(const char *name) { ConfigItem_deny_dcc *e; @@ -820,7 +829,7 @@ static void dcc_wipe_services(void) } -int dccdeny_stats(Client *client, char *para) +int dccdeny_stats(Client *client, const char *para) { ConfigItem_deny_dcc *denytmp; ConfigItem_allow_dcc *allowtmp; @@ -860,3 +869,13 @@ int dccdeny_stats(Client *client, char *para) } return 1; } + +int dccdeny_dcc_denied(Client *client, const char *target, const char *realfile, const char *displayfile, ConfigItem_deny_dcc *dccdeny) +{ + unreal_log(ULOG_INFO, "dcc", "DCC_REJECTED", client, + "$client.details tried to send forbidden file $filename ($ban_reason) to $target (is blocked now)", + log_data_string("filename", displayfile), + log_data_string("ban_reason", dccdeny->reason), + log_data_string("target", target)); + return 0; +} diff --git a/src/modules/echo-message.c b/src/modules/echo-message.c index 90f83b5..97a5997 100644 --- a/src/modules/echo-message.c +++ b/src/modules/echo-message.c @@ -28,15 +28,15 @@ ModuleHeader MOD_HEADER "5.0", "Batch CAP", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Variables */ long CAP_ECHO_MESSAGE = 0L; /* Forward declarations */ -int em_chanmsg(Client *client, Channel *channel, int sendflags, int prefix, char *target, MessageTag *mtags, char *text, SendType sendtype); -int em_usermsg(Client *client, Client *to, MessageTag *mtags, char *text, SendType sendtype); +int em_chanmsg(Client *client, Channel *channel, int sendflags, const char *prefix, const char *target, MessageTag *mtags, const char *text, SendType sendtype); +int em_usermsg(Client *client, Client *to, MessageTag *mtags, const char *text, SendType sendtype); MOD_INIT() { @@ -64,7 +64,7 @@ MOD_UNLOAD() return MOD_SUCCESS; } -int em_chanmsg(Client *client, Channel *channel, int sendflags, int prefix, char *target, MessageTag *mtags, char *text, SendType sendtype) +int em_chanmsg(Client *client, Channel *channel, int sendflags, const char *prefix, const char *target, MessageTag *mtags, const char *text, SendType sendtype) { if (MyUser(client) && HasCapabilityFast(client, CAP_ECHO_MESSAGE)) { @@ -85,7 +85,7 @@ int em_chanmsg(Client *client, Channel *channel, int sendflags, int prefix, char return 0; } -int em_usermsg(Client *client, Client *to, MessageTag *mtags, char *text, SendType sendtype) +int em_usermsg(Client *client, Client *to, MessageTag *mtags, const char *text, SendType sendtype) { if (MyUser(client) && HasCapabilityFast(client, CAP_ECHO_MESSAGE)) { diff --git a/src/modules/eos.c b/src/modules/eos.c index 157c9f0..c3e0707 100644 --- a/src/modules/eos.c +++ b/src/modules/eos.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", "command /eos", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -63,12 +63,8 @@ CMD_FUNC(cmd_eos) { if (!IsServer(client)) return; - client->serv->flags.synced = 1; + client->server->flags.synced = 1; /* pass it on ^_- */ -#ifdef DEBUGMODE - ircd_log(LOG_ERROR, "[EOSDBG] cmd_eos: got sync from %s (path:%s)", client->name, client->direction->name); - ircd_log(LOG_ERROR, "[EOSDBG] cmd_eos: broadcasting it back to everyone except route from %s", client->direction->name); -#endif sendto_server(client, 0, 0, NULL, ":%s EOS", client->id); RunHook(HOOKTYPE_SERVER_SYNCED, client); diff --git a/src/modules/extbans/Makefile.in b/src/modules/extbans/Makefile.in index b286cc3..26ea7cf 100644 --- a/src/modules/extbans/Makefile.in +++ b/src/modules/extbans/Makefile.in @@ -25,21 +25,25 @@ INCLUDES = ../../include/channel.h \ ../../include/ircsprintf.h \ ../../include/license.h \ ../../include/modules.h ../../include/modversion.h ../../include/msg.h \ - ../../include/numeric.h ../../include/proto.h ../../include/dns.h \ + ../../include/numeric.h ../../include/dns.h \ ../../include/resource.h ../../include/setup.h \ ../../include/struct.h ../../include/sys.h \ - ../../include/types.h ../../include/url.h \ + ../../include/types.h \ ../../include/version.h ../../include/whowas.h R_MODULES= \ join.so quiet.so nickchange.so inchannel.so realname.so \ account.so operclass.so certfp.so textban.so msgbypass.so \ - timedban.so partmsg.so securitygroup.so + timedban.so partmsg.so securitygroup.so \ + country.so MODULES=$(R_MODULES) MODULEFLAGS=@MODULEFLAGS@ RM=@RM@ +.SUFFIXES: +.SUFFIXES: .c .h .so + all: build build: $(MODULES) @@ -47,62 +51,6 @@ build: $(MODULES) clean: $(RM) -f *.o *.so *~ core -############################################################################# -# .so's section -############################################################################# - -skel.so: skel.c $(INCLUDES) +%.so: %.c $(INCLUDES) $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o skel.so skel.c - -join.so: join.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o join.so join.c - -quiet.so: quiet.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o quiet.so quiet.c - -nickchange.so: nickchange.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o nickchange.so nickchange.c - -inchannel.so: inchannel.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o inchannel.so inchannel.c - -realname.so: realname.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o realname.so realname.c - -account.so: account.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o account.so account.c - -operclass.so: operclass.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o operclass.so operclass.c - -certfp.so: certfp.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o certfp.so certfp.c - -textban.so: textban.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o textban.so textban.c - -msgbypass.so: msgbypass.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o msgbypass.so msgbypass.c - -timedban.so: timedban.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o timedban.so timedban.c - -partmsg.so: partmsg.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o partmsg.so partmsg.c - -securitygroup.so: securitygroup.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o securitygroup.so securitygroup.c + -o $@ $< diff --git a/src/modules/extbans/account.c b/src/modules/extbans/account.c index 3e4877d..d28b0e8 100644 --- a/src/modules/extbans/account.c +++ b/src/modules/extbans/account.c @@ -24,22 +24,25 @@ ModuleHeader MOD_HEADER "4.2", "ExtBan ~a - Ban/exempt by services account name", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Forward declarations */ -char *extban_account_conv_param(char *para); -int extban_account_is_banned(Client *client, Channel *channel, char *banin, int type, char **msg, char **errmsg); +const char *extban_account_conv_param(BanContext *b, Extban *extban); +int extban_account_is_banned(BanContext *b); /** Called upon module init */ MOD_INIT() { ExtbanInfo req; - req.flag = 'a'; + memset(&req, 0, sizeof(req)); + req.letter = 'a'; + req.name = "account"; req.is_ok = NULL; req.conv_param = extban_account_conv_param; req.is_banned = extban_account_is_banned; + req.is_banned_events = BANCHK_ALL|BANCHK_TKL; req.options = EXTBOPT_INVEX|EXTBOPT_TKL; if (!ExtbanAdd(modinfo->handle, req)) { @@ -65,27 +68,34 @@ MOD_UNLOAD() } /** Account bans */ -char *extban_account_conv_param(char *para) +const char *extban_account_conv_param(BanContext *b, Extban *extban) { char *mask, *acc; static char retbuf[NICKLEN + 4]; - strlcpy(retbuf, para, sizeof(retbuf)); /* truncate */ + strlcpy(retbuf, b->banstr, sizeof(retbuf)); /* truncate */ - acc = retbuf+3; + acc = retbuf; if (!*acc) return NULL; /* don't allow "~a:" */ - if (!strcmp(acc, "0")) - return NULL; /* ~a:0 would mean ban all non-regged, but we already have +R for that. */ return retbuf; } -int extban_account_is_banned(Client *client, Channel *channel, char *banin, int type, char **msg, char **errmsg) +int extban_account_is_banned(BanContext *b) { - char *ban = banin+3; + /* ~a:0 is special and matches all unauthenticated users */ + if (!strcmp(b->banstr, "0") && !IsLoggedIn(b->client)) + return 1; - if (!strcasecmp(ban, client->user->svid)) + /* ~a:* matches all authenticated users + * (Yes this special code is needed because account + * is 0 or * for unauthenticated users) + */ + if (!strcmp(b->banstr, "*") && IsLoggedIn(b->client)) + return 1; + + if (match_simple(b->banstr, b->client->user->account)) return 1; return 0; diff --git a/src/modules/extbans/certfp.c b/src/modules/extbans/certfp.c index c3f4103..8bb1102 100644 --- a/src/modules/extbans/certfp.c +++ b/src/modules/extbans/certfp.c @@ -24,23 +24,26 @@ ModuleHeader MOD_HEADER "4.2", "ExtBan ~S - Ban/exempt by SHA256 TLS certificate fingerprint", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Forward declarations */ -int extban_certfp_is_ok(Client *client, Channel *channel, char *para, int checkt, int what, int what2); -char *extban_certfp_conv_param(char *para); -int extban_certfp_is_banned(Client *client, Channel *channel, char *banin, int type, char **msg, char **errmsg); +int extban_certfp_is_ok(BanContext *b); +const char *extban_certfp_conv_param(BanContext *b, Extban *extban); +int extban_certfp_is_banned(BanContext *b); /* Called upon module init */ MOD_INIT() { ExtbanInfo req; - req.flag = 'S'; + memset(&req, 0, sizeof(req)); + req.letter = 'S'; + req.name = "certfp"; req.is_ok = extban_certfp_is_ok; req.conv_param = extban_certfp_conv_param; req.is_banned = extban_certfp_is_banned; + req.is_banned_events = BANCHK_ALL|BANCHK_TKL; req.options = EXTBOPT_INVEX|EXTBOPT_TKL; if (!ExtbanAdd(modinfo->handle, req)) { @@ -74,18 +77,18 @@ int extban_certfp_usage(Client *client) return EX_DENY; } -int extban_certfp_is_ok(Client *client, Channel *channel, char *para, int checkt, int what, int what2) +int extban_certfp_is_ok(BanContext *b) { - if (checkt == EXCHK_PARAM) + if (b->is_ok_check == EXCHK_PARAM) { - char *p; + const char *p; - if (strlen(para) != 3 + CERT_FP_LEN) - return extban_certfp_usage(client); + if (strlen(b->banstr) != CERT_FP_LEN) + return extban_certfp_usage(b->client); - for (p = para + 3; *p; p++) + for (p = b->banstr; *p; p++) if (!isxdigit(*p)) - return extban_certfp_usage(client); + return extban_certfp_usage(b->client); return EX_ALLOW; } @@ -93,14 +96,14 @@ int extban_certfp_is_ok(Client *client, Channel *channel, char *para, int checkt } /* Obtain targeted certfp from the ban string */ -char *extban_certfp_conv_param(char *para) +const char *extban_certfp_conv_param(BanContext *b, Extban *extban) { static char retbuf[EVP_MAX_MD_SIZE * 2 + 1]; char *p; - strlcpy(retbuf, para, sizeof(retbuf)); + strlcpy(retbuf, b->banstr, sizeof(retbuf)); - for (p = retbuf+3; *p; p++) + for (p = retbuf; *p; p++) { *p = tolower(*p); } @@ -108,17 +111,14 @@ char *extban_certfp_conv_param(char *para) return retbuf; } -int extban_certfp_is_banned(Client *client, Channel *channel, char *banin, int type, char **msg, char **errmsg) +int extban_certfp_is_banned(BanContext *b) { - char *ban = banin+3; - char *fp; - - fp = moddata_client_get(client, "certfp"); + const char *fp = moddata_client_get(b->client, "certfp"); if (!fp) return 0; /* not using TLS */ - if (!strcmp(ban, fp)) + if (!strcmp(b->banstr, fp)) return 1; return 0; diff --git a/src/modules/extbans/country.c b/src/modules/extbans/country.c new file mode 100644 index 0000000..012bfe9 --- /dev/null +++ b/src/modules/extbans/country.c @@ -0,0 +1,124 @@ +/* + * Extended ban to ban/exempt by country/geoip info (+b ~country:UK) + * (C) Copyright 2021 The UnrealIRCd Team + * + * This program is free 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 1, or (at your option) + * any later version. + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +#include "unrealircd.h" + +ModuleHeader MOD_HEADER += { + "extbans/country", + "6.0", + "ExtBan ~country - Ban/exempt by country (geoip)", + "UnrealIRCd Team", + "unrealircd-6", +}; + +/* Forward declarations */ +int extban_country_is_ok(BanContext *b); +const char *extban_country_conv_param(BanContext *b, Extban *extban); +int extban_country_is_banned(BanContext *b); + +/* Called upon module init */ +MOD_INIT() +{ + ExtbanInfo req; + + memset(&req, 0, sizeof(req)); + req.letter = 'C'; + req.name = "country"; + req.is_ok = extban_country_is_ok; + req.conv_param = extban_country_conv_param; + req.is_banned = extban_country_is_banned; + req.is_banned_events = BANCHK_ALL|BANCHK_TKL; + req.options = EXTBOPT_INVEX|EXTBOPT_TKL; + if (!ExtbanAdd(modinfo->handle, req)) + { + config_error("could not register extended ban type"); + return MOD_FAILED; + } + + MARK_AS_OFFICIAL_MODULE(modinfo); + + return MOD_SUCCESS; +} + +/* Called upon module load */ +MOD_LOAD() +{ + return MOD_SUCCESS; +} + +/* Called upon unload */ +MOD_UNLOAD() +{ + return MOD_SUCCESS; +} + +int extban_country_usage(Client *client) +{ + sendnotice(client, "ERROR: ExtBan ~country expects a two letter country code, or * to ban unknown countries. " + "For example: +b ~country:UK"); + return EX_DENY; +} + +int extban_country_is_ok(BanContext *b) +{ + if (b->is_ok_check == EXCHK_PARAM) + { + const char *p; + + if (!strcmp(b->banstr, "*")) + return EX_ALLOW; + + if ((strlen(b->banstr) != 2)) + return extban_country_usage(b->client); + + for (p = b->banstr; *p; p++) + if (!isalpha(*p)) + return extban_country_usage(b->client); + + return EX_ALLOW; + } + return EX_ALLOW; +} + +/* Obtain targeted country from the ban string */ +const char *extban_country_conv_param(BanContext *b, Extban *extban) +{ + static char retbuf[EVP_MAX_MD_SIZE * 2 + 1]; + char *p; + + strlcpy(retbuf, b->banstr, sizeof(retbuf)); + + for (p = retbuf; *p; p++) + *p = toupper(*p); + + return retbuf; +} + +int extban_country_is_banned(BanContext *b) +{ + GeoIPResult *geo = geoip_client(b->client); + char *country; + + country = geo ? geo->country_code : "*"; + + if (!strcmp(b->banstr, country)) + return 1; + + return 0; +} diff --git a/src/modules/extbans/inchannel.c b/src/modules/extbans/inchannel.c index e8755f4..5d5a3ac 100644 --- a/src/modules/extbans/inchannel.c +++ b/src/modules/extbans/inchannel.c @@ -24,23 +24,26 @@ ModuleHeader MOD_HEADER "4.2", "ExtBan ~c - banned when in specified channel", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Forward declarations */ -int extban_inchannel_is_ok(Client *client, Channel *channel, char *para, int checkt, int what, int what2); -char *extban_inchannel_conv_param(char *para); -int extban_inchannel_is_banned(Client *client, Channel *channel, char *banin, int type, char **msg, char **errmsg); +int extban_inchannel_is_ok(BanContext *b); +const char *extban_inchannel_conv_param(BanContext *b, Extban *extban); +int extban_inchannel_is_banned(BanContext *b); /** Called upon module init */ MOD_INIT() { ExtbanInfo req; - req.flag = 'c'; + memset(&req, 0, sizeof(req)); + req.letter = 'c'; + req.name = "channel"; req.is_ok = extban_inchannel_is_ok; req.conv_param = extban_inchannel_conv_param; req.is_banned = extban_inchannel_is_banned; + req.is_banned_events = BANCHK_ALL|BANCHK_TKL; req.options = EXTBOPT_INVEX; /* for +I too */ if (!ExtbanAdd(modinfo->handle, req)) { @@ -65,13 +68,13 @@ MOD_UNLOAD() return MOD_SUCCESS; } -char *extban_inchannel_conv_param(char *para) +const char *extban_inchannel_conv_param(BanContext *b, Extban *extban) { static char retbuf[CHANNELLEN+6]; char *chan, *p, symbol='\0'; - strlcpy(retbuf, para, sizeof(retbuf)); - chan = retbuf+3; + strlcpy(retbuf, b->banstr, sizeof(retbuf)); + chan = retbuf; if ((*chan == '+') || (*chan == '%') || (*chan == '%') || (*chan == '@') || (*chan == '&') || (*chan == '~')) @@ -92,51 +95,53 @@ char *extban_inchannel_conv_param(char *para) } /* The only purpose of this function is a temporary workaround to prevent a desync.. pfff */ -int extban_inchannel_is_ok(Client *client, Channel *channel, char *para, int checkt, int what, int what2) +int extban_inchannel_is_ok(BanContext *b) { - char *p; + const char *p = b->banstr; - if ((checkt == EXBCHK_PARAM) && MyUser(client) && (what == MODE_ADD) && (strlen(para) > 3)) + if ((b->is_ok_check == EXBCHK_PARAM) && MyUser(b->client) && (b->what == MODE_ADD) && (strlen(b->banstr) > 3)) { - p = para + 3; if ((*p == '+') || (*p == '%') || (*p == '%') || (*p == '@') || (*p == '&') || (*p == '~')) p++; if (*p != '#') { - sendnotice(client, "Please use a # in the channelname (eg: ~c:#*blah*)"); + sendnotice(b->client, "Please use a # in the channelname (eg: ~c:#*blah*)"); return 0; } } return 1; } -static int extban_inchannel_compareflags(char symbol, int flags) +static int extban_inchannel_compareflags(char symbol, const char *member_modes) { - int require=0; + const char *required_modes = NULL; if (symbol == '+') - require = CHFL_VOICE|CHFL_HALFOP|CHFL_CHANOP|CHFL_CHANADMIN|CHFL_CHANOWNER; + required_modes = "vhoaq"; else if (symbol == '%') - require = CHFL_HALFOP|CHFL_CHANOP|CHFL_CHANADMIN|CHFL_CHANOWNER; + required_modes = "hoaq"; else if (symbol == '@') - require = CHFL_CHANOP|CHFL_CHANADMIN|CHFL_CHANOWNER; + required_modes = "oaq"; else if (symbol == '&') - require = CHFL_CHANADMIN|CHFL_CHANOWNER; + required_modes = "aq"; else if (symbol == '~') - require = CHFL_CHANOWNER; + required_modes = "q"; + else + return 0; /* unknown prefix character */ - if (flags & require) + if (check_channel_access_string(member_modes, required_modes)) return 1; return 0; } -int extban_inchannel_is_banned(Client *client, Channel *channel, char *ban, int type, char **msg, char **errmsg) +int extban_inchannel_is_banned(BanContext *b) { Membership *lp; - char *p = ban+3, symbol = '\0'; + const char *p = b->banstr; + char symbol = '\0'; if (*p != '#') { @@ -144,14 +149,14 @@ int extban_inchannel_is_banned(Client *client, Channel *channel, char *ban, int p++; } - for (lp = client->user->channel; lp; lp = lp->next) + for (lp = b->client->user->channel; lp; lp = lp->next) { - if (match_esc(p, lp->channel->chname)) + if (match_esc(p, lp->channel->name)) { /* Channel matched, check symbol if needed (+/%/@/etc) */ if (symbol) { - if (extban_inchannel_compareflags(symbol, lp->flags)) + if (extban_inchannel_compareflags(symbol, lp->member_modes)) return 1; } else return 1; diff --git a/src/modules/extbans/join.c b/src/modules/extbans/join.c index 050b43e..d2ca1ce 100644 --- a/src/modules/extbans/join.c +++ b/src/modules/extbans/join.c @@ -24,21 +24,24 @@ ModuleHeader MOD_HEADER "4.2", "Extban ~j - prevent join only", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Forward declarations */ -int extban_modej_is_banned(Client *client, Channel *channel, char *banin, int type, char **msg, char **errmsg); +int extban_modej_is_banned(BanContext *b); /** Called upon module init */ MOD_INIT() { ExtbanInfo req; - req.flag = 'j'; + memset(&req, 0, sizeof(req)); + req.letter = 'j'; + req.name = "join"; req.is_ok = extban_is_ok_nuh_extban; req.conv_param = extban_conv_param_nuh_or_extban; req.is_banned = extban_modej_is_banned; + req.is_banned_events = BANCHK_JOIN; req.options = EXTBOPT_ACTMODIFIER; if (!ExtbanAdd(modinfo->handle, req)) { @@ -64,15 +67,7 @@ MOD_UNLOAD() } /** This ban that affects JOINs only */ -int extban_modej_is_banned(Client *client, Channel *channel, char *banin, int type, char **msg, char **errmsg) +int extban_modej_is_banned(BanContext *b) { - char *sub_ban; - - if (type != BANCHK_JOIN) - return 0; - - sub_ban = banin + 3; - - return ban_check_mask(client, channel, sub_ban, type, msg, errmsg, 0); + return ban_check_mask(b); } - diff --git a/src/modules/extbans/msgbypass.c b/src/modules/extbans/msgbypass.c index 167bf64..ef0b6fc 100644 --- a/src/modules/extbans/msgbypass.c +++ b/src/modules/extbans/msgbypass.c @@ -24,24 +24,24 @@ ModuleHeader MOD_HEADER "4.2", "ExtBan ~m - bypass +m/+n/+c/+S/+T (msgbypass)", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Forward declarations */ -int extban_msgbypass_is_banned(Client *client, Channel *channel, char *banin, int type, char **msg, char **errmsg); int msgbypass_can_bypass(Client *client, Channel *channel, BypassChannelMessageRestrictionType bypass_type); -int msgbypass_extban_is_ok(Client *client, Channel* channel, char *para, int checkt, int what, int what2); -char *msgbypass_extban_conv_param(char *para); +int msgbypass_extban_is_ok(BanContext *b); +const char *msgbypass_extban_conv_param(BanContext *b, Extban *extban); /** Called upon module init */ MOD_INIT() { ExtbanInfo req; - req.flag = 'm'; + memset(&req, 0, sizeof(req)); + req.letter = 'm'; + req.name = "msgbypass"; req.is_ok = msgbypass_extban_is_ok; req.conv_param = msgbypass_extban_conv_param; - req.is_banned = extban_msgbypass_is_banned; req.options = EXTBOPT_ACTMODIFIER; if (!ExtbanAdd(modinfo->handle, req)) { @@ -67,42 +67,50 @@ MOD_UNLOAD() return MOD_SUCCESS; } -/** Is the user banned? No, never by us anyway. */ -int extban_msgbypass_is_banned(Client *client, Channel *channel, char *banin, int type, char **msg, char **errmsg) -{ - return 0; /* not banned by us */ -} - /** Can the user bypass restrictions? */ int msgbypass_can_bypass(Client *client, Channel *channel, BypassChannelMessageRestrictionType bypass_type) { Ban *ban; char *p; - + BanContext *b = safe_alloc(sizeof(BanContext)); + + b->client = client; + b->channel = channel; + b->ban_check_types = BANCHK_MSG; + for (ban = channel->exlist; ban; ban=ban->next) { + char *type; + char *matchby; + if (!strncmp(ban->banstr, "~m:", 3)) + type = ban->banstr + 3; + else if (!strncmp(ban->banstr, "~msgbypass:", 11)) + type = ban->banstr + 11; + else + continue; + + if (((bypass_type == BYPASS_CHANMSG_EXTERNAL) && !strncmp(type, "external:", 9)) || + ((bypass_type == BYPASS_CHANMSG_MODERATED) && !strncmp(type, "moderated:", 10)) || + ((bypass_type == BYPASS_CHANMSG_COLOR) && !strncmp(type, "color:", 6)) || + ((bypass_type == BYPASS_CHANMSG_CENSOR) && !strncmp(type, "censor:", 7)) || + ((bypass_type == BYPASS_CHANMSG_NOTICE) && !strncmp(type, "notice:", 7))) { - char *type = ban->banstr + 3; - char *matchby; + matchby = strchr(type, ':'); + if (!matchby) + continue; + matchby++; - if (((bypass_type == BYPASS_CHANMSG_EXTERNAL) && !strncmp(type, "external:", 9)) || - ((bypass_type == BYPASS_CHANMSG_MODERATED) && !strncmp(type, "moderated:", 10)) || - ((bypass_type == BYPASS_CHANMSG_COLOR) && !strncmp(type, "color:", 6)) || - ((bypass_type == BYPASS_CHANMSG_CENSOR) && !strncmp(type, "censor:", 7)) || - ((bypass_type == BYPASS_CHANMSG_NOTICE) && !strncmp(type, "notice:", 7))) + b->banstr = matchby; + if (ban_check_mask(b)) { - matchby = strchr(type, ':'); - if (!matchby) - continue; - matchby++; - - if (ban_check_mask(client, channel, matchby, BANCHK_MSG, NULL, NULL, 0)) - return HOOK_ALLOW; /* Yes, user may bypass */ + safe_free(b); + return HOOK_ALLOW; /* Yes, user may bypass */ } } } + safe_free(b); return HOOK_CONTINUE; /* No, may NOT bypass. */ } @@ -121,16 +129,16 @@ int msgbypass_extban_type_ok(char *type) } #define MAX_LENGTH 128 -char *msgbypass_extban_conv_param(char *para_in) +const char *msgbypass_extban_conv_param(BanContext *b, Extban *extban) { static char retbuf[MAX_LENGTH+1]; char para[MAX_LENGTH+1]; char tmpmask[MAX_LENGTH+1]; char *type; /**< Type, such as 'external' */ char *matchby; /**< Matching method, such as 'n!u@h' */ - char *newmask; /**< Cleaned matching method, such as 'n!u@h' */ + const char *newmask; /**< Cleaned matching method, such as 'n!u@h' */ - strlcpy(para, para_in+3, sizeof(para)); /* work on a copy (and truncate it) */ + strlcpy(para, b->banstr, sizeof(para)); /* work on a copy (and truncate it) */ /* ~m:type:n!u@h for direct matching * ~m:type:~x:.... when calling another bantype @@ -145,16 +153,13 @@ char *msgbypass_extban_conv_param(char *para_in) if (!msgbypass_extban_type_ok(type)) return NULL; - /* This is quite silly, we have to create a fake extban here due to - * the current API of extban_conv_param_nuh and extban_conv_param_nuh_or_extban - * expecting the full banmask rather than the portion that actually matters. - */ - snprintf(tmpmask, sizeof(tmpmask), "~?:%s", matchby); - newmask = extban_conv_param_nuh_or_extban(tmpmask); - if (!newmask || (strlen(newmask) <= 3)) + b->banstr = matchby; + newmask = extban_conv_param_nuh_or_extban(b, extban); + if (BadPtr(newmask)) return NULL; - snprintf(retbuf, sizeof(retbuf), "~m:%s:%s", type, newmask+3); + //snprintf(retbuf, sizeof(retbuf), "~m:%s:%s", type, newmask); + snprintf(retbuf, sizeof(retbuf), "%s:%s", type, newmask); return retbuf; } @@ -171,26 +176,25 @@ int msgbypass_extban_syntax(Client *client, int checkt, char *reason) return 0; /* FAIL: ban rejected */ } -int msgbypass_extban_is_ok(Client *client, Channel* channel, char *para_in, int checkt, int what, int what2) +int msgbypass_extban_is_ok(BanContext *b) { - char para[MAX_LENGTH+1]; - char tmpmask[MAX_LENGTH+1]; + static char para[MAX_LENGTH+1]; char *type; /**< Type, such as 'external' */ char *matchby; /**< Matching method, such as 'n!u@h' */ char *newmask; /**< Cleaned matching method, such as 'n!u@h' */ /* Always permit deletion */ - if (what == MODE_DEL) + if (b->what == MODE_DEL) return 1; - if (what2 != EXBTYPE_EXCEPT) + if (b->ban_type != EXBTYPE_EXCEPT) { - if (checkt == EXBCHK_PARAM) - sendnotice(client, "Ban type ~m only works with exceptions (+e) and not with bans or invex (+b/+I)"); + if (b->is_ok_check == EXBCHK_PARAM) + sendnotice(b->client, "Ban type ~m only works with exceptions (+e) and not with bans or invex (+b/+I)"); return 0; /* reject */ } - strlcpy(para, para_in+3, sizeof(para)); /* work on a copy (and truncate it) */ + strlcpy(para, b->banstr, sizeof(para)); /* work on a copy (and truncate it) */ /* ~m:type:n!u@h for direct matching * ~m:type:~x:.... when calling another bantype @@ -199,24 +203,20 @@ int msgbypass_extban_is_ok(Client *client, Channel* channel, char *para_in, int type = para; matchby = strchr(para, ':'); if (!matchby || !matchby[1]) - return msgbypass_extban_syntax(client, checkt, "Invalid syntax"); + return msgbypass_extban_syntax(b->client, b->is_ok_check, "Invalid syntax"); *matchby++ = '\0'; if (!msgbypass_extban_type_ok(type)) - return msgbypass_extban_syntax(client, checkt, "Unknown type"); + return msgbypass_extban_syntax(b->client, b->is_ok_check, "Unknown type"); - /* This is quite silly, we have to create a fake extban here due to - * the current API of extban_conv_param_nuh and extban_conv_param_nuh_or_extban - * expecting the full banmask rather than the portion that actually matters. - */ - snprintf(tmpmask, sizeof(tmpmask), "~?:%s", matchby); - if (extban_is_ok_nuh_extban(client, channel, tmpmask, checkt, what, what2) == 0) + b->banstr = matchby; + if (extban_is_ok_nuh_extban(b) == 0) { /* This could be anything ranging from: * invalid n!u@h syntax, unknown (sub)extbantype, * disabled extban type in conf, too much recursion, etc. */ - return msgbypass_extban_syntax(client, checkt, "Invalid matcher"); + return msgbypass_extban_syntax(b->client, b->is_ok_check, "Invalid matcher"); } return 1; /* OK */ diff --git a/src/modules/extbans/nickchange.c b/src/modules/extbans/nickchange.c index 164fbc0..bc8769f 100644 --- a/src/modules/extbans/nickchange.c +++ b/src/modules/extbans/nickchange.c @@ -24,21 +24,24 @@ ModuleHeader MOD_HEADER "4.2", "ExtBan ~n - prevent nick-changes only", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Forward declarations */ -int extban_nickchange_is_banned(Client *client, Channel *channel, char *banin, int type, char **msg, char **errmsg); +int extban_nickchange_is_banned(BanContext *b); /** Called upon module init */ MOD_INIT() { ExtbanInfo req; - req.flag = 'n'; + memset(&req, 0, sizeof(req)); + req.letter = 'n'; + req.name = "nickchange"; req.is_ok = extban_is_ok_nuh_extban; req.conv_param = extban_conv_param_nuh_or_extban; req.is_banned = extban_nickchange_is_banned; + req.is_banned_events = BANCHK_NICK; req.options = EXTBOPT_ACTMODIFIER; if (!ExtbanAdd(modinfo->handle, req)) { @@ -64,18 +67,10 @@ MOD_UNLOAD() } /** This ban that affects nick-changes only */ -int extban_nickchange_is_banned(Client *client, Channel *channel, char *banin, int type, char **msg, char **errmsg) +int extban_nickchange_is_banned(BanContext *b) { - char *sub_ban; - - if (type != BANCHK_NICK) + if (check_channel_access(b->client, b->channel, "v")) return 0; - if (has_voice(client, channel)) - return 0; - - sub_ban = banin + 3; - - return ban_check_mask(client, channel, sub_ban, type, msg, errmsg, 0); + return ban_check_mask(b); } - diff --git a/src/modules/extbans/operclass.c b/src/modules/extbans/operclass.c index b5469cc..5b6bc2a 100644 --- a/src/modules/extbans/operclass.c +++ b/src/modules/extbans/operclass.c @@ -24,22 +24,25 @@ ModuleHeader MOD_HEADER "4.2", "ExtBan ~O - Ban/exempt operclass", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Forward declarations */ -char *extban_operclass_conv_param(char *para); -int extban_operclass_is_banned(Client *client, Channel *channel, char *banin, int type, char **msg, char **errmsg); +const char *extban_operclass_conv_param(BanContext *b, Extban *extban); +int extban_operclass_is_banned(BanContext *b); /** Called upon module init */ MOD_INIT() { ExtbanInfo req; - req.flag = 'O'; + memset(&req, 0, sizeof(req)); + req.letter = 'O'; + req.name = "operclass"; req.is_ok = NULL; req.conv_param = extban_operclass_conv_param; req.is_banned = extban_operclass_is_banned; + req.is_banned_events = BANCHK_ALL; req.options = EXTBOPT_INVEX; if (!ExtbanAdd(modinfo->handle, req)) { @@ -67,15 +70,15 @@ MOD_UNLOAD() #define OPERCLASSLEN 64 -char *extban_operclass_conv_param(char *para) +const char *extban_operclass_conv_param(BanContext *b, Extban *extban) { static char retbuf[OPERCLASSLEN + 4]; char *p; - strlcpy(retbuf, para, sizeof(retbuf)); + strlcpy(retbuf, b->banstr, sizeof(retbuf)); /* allow alpha, numeric, -, _, * and ? wildcards */ - for (p = retbuf+3; *p; p++) + for (p = retbuf; *p; p++) if (!strchr("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_?*", *p)) *p = '\0'; @@ -85,18 +88,12 @@ char *extban_operclass_conv_param(char *para) return retbuf; } -int extban_operclass_is_banned(Client *client, Channel *channel, char *banin, int type, char **msg, char **errmsg) +int extban_operclass_is_banned(BanContext *b) { - char *ban = banin+3; - - if (MyUser(client) && IsOper(client)) + if (MyUser(b->client) && IsOper(b->client)) { - char *operclass = NULL; - ConfigItem_oper *oper = find_oper(client->user->operlogin); - if (oper && oper->operclass) - operclass = oper->operclass; - - if (operclass && match_simple(ban, operclass)) + const char *operclass = get_operclass(b->client); + if (operclass && match_simple(b->banstr, operclass)) return 1; } diff --git a/src/modules/extbans/partmsg.c b/src/modules/extbans/partmsg.c index 10c3651..a6402d5 100644 --- a/src/modules/extbans/partmsg.c +++ b/src/modules/extbans/partmsg.c @@ -25,20 +25,23 @@ ModuleHeader MOD_HEADER "4.2", "ExtBan ~p - Ban/exempt Part/Quit message", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; -int extban_partmsg_is_banned(Client *client, Channel *channel, char *banin, int type, char **msg, char **errmsg); +int extban_partmsg_is_banned(BanContext *b); MOD_INIT() { ExtbanInfo req; - req.flag = 'p'; + memset(&req, 0, sizeof(req)); + req.letter = 'p'; + req.name = "partmsg"; req.is_ok = extban_is_ok_nuh_extban; req.conv_param = extban_conv_param_nuh_or_extban; req.options = EXTBOPT_ACTMODIFIER; req.is_banned = extban_partmsg_is_banned; + req.is_banned_events = BANCHK_LEAVE_MSG; if (!ExtbanAdd(modinfo->handle, req)) { config_error("could not register extended ban type"); @@ -62,10 +65,10 @@ MOD_UNLOAD() return MOD_SUCCESS; } -int extban_partmsg_is_banned(Client *client, Channel *channel, char *banin, int type, char **msg, char **errmsg) +int extban_partmsg_is_banned(BanContext *b) { - if (type == BANCHK_LEAVE_MSG) - *msg = NULL; + b->msg = NULL; + // Uh.. there is no attempt to match.... anything.......? return 0; } diff --git a/src/modules/extbans/quiet.c b/src/modules/extbans/quiet.c index 2f7d787..5d3dfdf 100644 --- a/src/modules/extbans/quiet.c +++ b/src/modules/extbans/quiet.c @@ -24,21 +24,24 @@ ModuleHeader MOD_HEADER "4.2", "ExtBan ~q - prevent messages only (quiet)", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Forward declarations */ -int extban_quiet_is_banned(Client *client, Channel *channel, char *banin, int type, char **msg, char **errmsg); +int extban_quiet_is_banned(BanContext *b); /** Called upon module init */ MOD_INIT() { ExtbanInfo req; - req.flag = 'q'; + memset(&req, 0, sizeof(req)); + req.letter = 'q'; + req.name = "quiet"; req.is_ok = extban_is_ok_nuh_extban; req.conv_param = extban_conv_param_nuh_or_extban; req.is_banned = extban_quiet_is_banned; + req.is_banned_events = BANCHK_MSG; req.options = EXTBOPT_ACTMODIFIER; if (!ExtbanAdd(modinfo->handle, req)) { @@ -64,14 +67,7 @@ MOD_UNLOAD() } /** This ban that affects messages/notices only */ -int extban_quiet_is_banned(Client *client, Channel *channel, char *banin, int type, char **msg, char **errmsg) +int extban_quiet_is_banned(BanContext *b) { - char *sub_ban; - - if (type != BANCHK_MSG) - return 0; - - sub_ban = banin + 3; - - return ban_check_mask(client, channel, sub_ban, type, msg, errmsg, 0); + return ban_check_mask(b); } diff --git a/src/modules/extbans/realname.c b/src/modules/extbans/realname.c index 8181716..074948e 100644 --- a/src/modules/extbans/realname.c +++ b/src/modules/extbans/realname.c @@ -24,22 +24,25 @@ ModuleHeader MOD_HEADER "4.2", "ExtBan ~r - Ban based on realname/gecos field", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Forward declarations */ -char *extban_realname_conv_param(char *para); -int extban_realname_is_banned(Client *client, Channel *channel, char *banin, int type, char **msg, char **errmsg); +const char *extban_realname_conv_param(BanContext *b, Extban *extban); +int extban_realname_is_banned(BanContext *b); /** Called upon module init */ MOD_INIT() { ExtbanInfo req; - req.flag = 'r'; + memset(&req, 0, sizeof(req)); + req.letter = 'r'; + req.name = "realname"; req.is_ok = NULL; req.conv_param = extban_realname_conv_param; req.is_banned = extban_realname_is_banned; + req.is_banned_events = BANCHK_ALL|BANCHK_TKL; req.options = EXTBOPT_CHSVSMODE|EXTBOPT_INVEX|EXTBOPT_TKL; if (!ExtbanAdd(modinfo->handle, req)) { @@ -65,32 +68,31 @@ MOD_UNLOAD() } /** Realname bans - conv_param */ -char *extban_realname_conv_param(char *para) +const char *extban_realname_conv_param(BanContext *b, Extban *extban) { static char retbuf[REALLEN + 8]; char *mask; - strlcpy(retbuf, para, sizeof(retbuf)); + strlcpy(retbuf, b->banstr, sizeof(retbuf)); - mask = retbuf+3; + mask = retbuf; if (!*mask) return NULL; /* don't allow "~r:" */ - if (strlen(mask) > REALLEN + 3) - mask[REALLEN + 3] = '\0'; + if (strlen(mask) > REALLEN) + mask[REALLEN] = '\0'; + /* Prevent otherwise confusing extban relationship */ if (*mask == '~') - *mask = '?'; /* Is this good? No ;) */ + *mask = '?'; return retbuf; } -int extban_realname_is_banned(Client *client, Channel *channel, char *banin, int type, char **msg, char **errmsg) +int extban_realname_is_banned(BanContext *b) { - char *ban = banin+3; - - if (match_esc(ban, client->info)) + if (match_esc(b->banstr, b->client->info)) return 1; return 0; diff --git a/src/modules/extbans/securitygroup.c b/src/modules/extbans/securitygroup.c index e45782e..ac412f2 100644 --- a/src/modules/extbans/securitygroup.c +++ b/src/modules/extbans/securitygroup.c @@ -24,23 +24,26 @@ ModuleHeader MOD_HEADER "4.2", "ExtBan ~G - Ban based on security-group", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Forward declarations */ -char *extban_securitygroup_conv_param(char *para); -int extban_securitygroup_is_ok(Client *client, Channel *channel, char *para, int checkt, int what, int what2); -int extban_securitygroup_is_banned(Client *client, Channel *channel, char *banin, int type, char **msg, char **errmsg); +const char *extban_securitygroup_conv_param(BanContext *b, Extban *extban); +int extban_securitygroup_is_ok(BanContext *b); +int extban_securitygroup_is_banned(BanContext *b); /** Called upon module init */ MOD_INIT() { ExtbanInfo req; - - req.flag = 'G'; + + memset(&req, 0, sizeof(req)); + req.letter = 'G'; + req.name = "security-group"; req.conv_param = extban_securitygroup_conv_param; req.is_ok = extban_securitygroup_is_ok; req.is_banned = extban_securitygroup_is_banned; + req.is_banned_events = BANCHK_ALL|BANCHK_TKL; req.options = EXTBOPT_INVEX|EXTBOPT_TKL; if (!ExtbanAdd(modinfo->handle, req)) { @@ -68,12 +71,8 @@ MOD_UNLOAD() /* Helper function for extban_securitygroup_is_ok() and extban_securitygroup_conv_param() * to do ban validation. */ -int extban_securitygroup_generic(char *para, int strict) +int extban_securitygroup_generic(char *mask, int strict) { - char *mask; - - mask = para+3; - /* ! at the start means negative match */ if (*mask == '!') mask++; @@ -91,27 +90,24 @@ int extban_securitygroup_generic(char *para, int strict) if (!*mask) return 0; /* don't allow "~G:" nor "~G:!" */ - if (strlen(mask) > SECURITYGROUPLEN + 3) - mask[SECURITYGROUPLEN + 3] = '\0'; - return 1; } -int extban_securitygroup_is_ok(Client *client, Channel *channel, char *para, int checkt, int what, int what2) +int extban_securitygroup_is_ok(BanContext *b) { - if (MyUser(client) && (what == MODE_ADD) && (checkt == EXBCHK_PARAM)) + if (MyUser(b->client) && (b->what == MODE_ADD) && (b->is_ok_check == EXBCHK_PARAM)) { char banbuf[SECURITYGROUPLEN+8]; - strlcpy(banbuf, para, sizeof(banbuf)); + strlcpy(banbuf, b->banstr, sizeof(banbuf)); if (!extban_securitygroup_generic(banbuf, 1)) { SecurityGroup *s; - sendnotice(client, "ERROR: Unknown security-group '%s'. Syntax: +b ~G:securitygroup or +b ~G:!securitygroup", para+3); - sendnotice(client, "Available security groups:"); + sendnotice(b->client, "ERROR: Unknown security-group '%s'. Syntax: +b ~G:securitygroup or +b ~G:!securitygroup", b->banstr); + sendnotice(b->client, "Available security groups:"); for (s = securitygroups; s; s = s->next) - sendnotice(client, "%s", s->name); - sendnotice(client, "unknown-users"); - sendnotice(client, "End of security group list."); + sendnotice(b->client, "%s", s->name); + sendnotice(b->client, "unknown-users"); + sendnotice(b->client, "End of security group list."); return 0; } } @@ -119,11 +115,11 @@ int extban_securitygroup_is_ok(Client *client, Channel *channel, char *para, int } /** Security group extban - conv_param */ -char *extban_securitygroup_conv_param(char *para) +const char *extban_securitygroup_conv_param(BanContext *b, Extban *extban) { static char retbuf[SECURITYGROUPLEN + 8]; - strlcpy(retbuf, para, sizeof(retbuf)); + strlcpy(retbuf, b->banstr, sizeof(retbuf)); if (!extban_securitygroup_generic(retbuf, 0)) return NULL; @@ -131,11 +127,9 @@ char *extban_securitygroup_conv_param(char *para) } /** Is the user banned by ~G:something ? */ -int extban_securitygroup_is_banned(Client *client, Channel *channel, char *banin, int type, char **msg, char **errmsg) +int extban_securitygroup_is_banned(BanContext *b) { - char *ban = banin+3; - - if (*ban == '!') - return !user_allowed_by_security_group_name(client, ban+1); - return user_allowed_by_security_group_name(client, ban); + if (*b->banstr == '!') + return !user_allowed_by_security_group_name(b->client, b->banstr+1); + return user_allowed_by_security_group_name(b->client, b->banstr); } diff --git a/src/modules/extbans/textban.c b/src/modules/extbans/textban.c index 297f0ca..cc241f5 100644 --- a/src/modules/extbans/textban.c +++ b/src/modules/extbans/textban.c @@ -61,30 +61,20 @@ /** Which censor replace word to use when CENSORFEATURE is enabled. */ #define CENSORWORD "" -/** Benchmark mode. - * Should never be used on production servers. - * Mainly meant for debugging/profiling purposes for myself, but if you - * have a test server and are curious about the speed of this module, - * then you can enable it of course ;). - */ -#undef BENCHMARK - - ModuleHeader MOD_HEADER = { "extbans/textban", "2.2", "ExtBan ~T (textban) by Syzop", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Forward declarations */ -char *extban_modeT_conv_param(char *para_in); -int textban_check_ban(Client *client, Channel *channel, char *ban, char **msg, char **errmsg); -int textban_can_send_to_channel(Client *client, Channel *channel, Membership *lp, char **msg, char **errmsg, SendType sendtype); -int extban_modeT_is_banned(Client *client, Channel *channel, char *ban, int type, char **msg, char **errmsg); -int extban_modeT_is_ok(Client *client, Channel *channel, char *para, int checkt, int what, int what2); +const char *extban_modeT_conv_param(BanContext *b, Extban *extban); +int textban_check_ban(Client *client, Channel *channel, const char *ban, const char **msg, const char **errmsg); +int textban_can_send_to_channel(Client *client, Channel *channel, Membership *lp, const char **msg, const char **errmsg, SendType sendtype); +int extban_modeT_is_ok(BanContext *b); void parse_word(const char *s, char **word, int *type); MOD_INIT() @@ -94,10 +84,10 @@ MOD_INIT() MARK_AS_OFFICIAL_MODULE(modinfo); memset(&req, 0, sizeof(ExtbanInfo)); - req.flag = 'T'; + req.letter = 'T'; + req.name = "text"; req.options = EXTBOPT_NOSTACKCHILD; /* disallow things like ~n:~T, as we only affect text. */ req.conv_param = extban_modeT_conv_param; - req.is_banned = extban_modeT_is_banned; req.is_ok = extban_modeT_is_ok; if (!ExtbanAdd(modinfo->handle, req)) @@ -262,21 +252,21 @@ unsigned int counttextbans(Channel *channel) } -int extban_modeT_is_ok(Client *client, Channel *channel, char *para, int checkt, int what, int what2) +int extban_modeT_is_ok(BanContext *b) { int n; - if ((what == MODE_ADD) && (what2 == EXBTYPE_EXCEPT) && MyUser(client)) + if ((b->what == MODE_ADD) && (b->ban_type == EXBTYPE_EXCEPT) && MyUser(b->client)) return 0; /* except is not supported */ /* We check the # of bans in the channel, may not exceed MAX_EXTBANT_PER_CHAN */ - if ((what == MODE_ADD) && (checkt == EXBCHK_PARAM) && - MyUser(client) && !IsOper(client) && - ((n = counttextbans(channel)) >= MAX_EXTBANT_PER_CHAN)) + if ((b->what == MODE_ADD) && (b->is_ok_check == EXBCHK_PARAM) && + MyUser(b->client) && !IsOper(b->client) && + ((n = counttextbans(b->channel)) >= MAX_EXTBANT_PER_CHAN)) { /* We check the # of bans in the channel, may not exceed MAX_EXTBANT_PER_CHAN */ - sendnumeric(client, ERR_BANLISTFULL, channel->chname, para); - sendnotice(client, "Too many textbans for this channel"); + sendnumeric(b->client, ERR_BANLISTFULL, b->channel->name, b->banstr); // FIXME: wants b->full_banstr here + sendnotice(b->client, "Too many textbans for this channel"); return 0; } return 1; @@ -298,7 +288,7 @@ char *conv_pattern_asterisks(const char *pattern) } /** Ban callbacks */ -char *extban_modeT_conv_param(char *para_in) +const char *extban_modeT_conv_param(BanContext *b, Extban *extban) { static char retbuf[MAX_LENGTH+1]; char para[MAX_LENGTH+1], *action, *text, *p; @@ -307,7 +297,7 @@ char *extban_modeT_conv_param(char *para_in) int ap = 0; #endif - strlcpy(para, para_in+3, sizeof(para)); /* work on a copy (and truncate it) */ + strlcpy(para, b->banstr, sizeof(para)); /* work on a copy (and truncate it) */ /* ~T:: * ~T:user@host:: if UHOSTFEATURE is enabled @@ -380,26 +370,20 @@ char *extban_modeT_conv_param(char *para_in) /* Rebuild the string.. can be cut off if too long. */ #ifdef UHOSTFEATURE - snprintf(retbuf, sizeof(retbuf), "~T:%s:%s:%s", uhost, action, text); + snprintf(retbuf, sizeof(retbuf), "%s:%s:%s", uhost, action, text); #else - snprintf(retbuf, sizeof(retbuf), "~T:%s:%s", action, text); + snprintf(retbuf, sizeof(retbuf), "%s:%s", action, text); #endif return retbuf; } -/** This is the regular "is banned?" routine. We can't use this as we need to be called for voiced users as well */ -int extban_modeT_is_banned(Client *client, Channel *channel, char *ban, int checktype, char **msg, char **errmsg) -{ - return 0; -} - /** Check for text bans (censor and block) */ -int textban_can_send_to_channel(Client *client, Channel *channel, Membership *lp, char **msg, char **errmsg, SendType sendtype) +int textban_can_send_to_channel(Client *client, Channel *channel, Membership *lp, const char **msg, const char **errmsg, SendType sendtype) { Ban *ban; /* +h/+o/+a/+q users bypass textbans */ - if (is_skochanop(client, channel)) + if (check_channel_access(client, channel, "hoaq")) return HOOK_CONTINUE; /* IRCOps with these privileges bypass textbans too */ @@ -409,21 +393,29 @@ int textban_can_send_to_channel(Client *client, Channel *channel, Membership *lp /* Now we have to manually walk the banlist and check if things match */ for (ban = channel->banlist; ban; ban=ban->next) { - if (!strncmp(ban->banstr, "~T:", 3)) + char *banstr = ban->banstr; + + /* Pretend time does not exist... */ + if (!strncmp(banstr, "~t:", 3)) { - /* ~T ban */ - if (textban_check_ban(client, channel, ban->banstr, msg, errmsg)) + banstr = strchr(banstr+3, ':'); + if (!banstr) + continue; + banstr++; + } + else if (!strncmp(banstr, "~time:", 6)) + { + banstr = strchr(banstr+6, ':'); + if (!banstr) + continue; + banstr++; + } + + if (!strncmp(banstr, "~T:", 3) || !strncmp(banstr, "~text:", 6)) + { + /* text ban */ + if (textban_check_ban(client, channel, banstr, msg, errmsg)) return HOOK_DENY; - } else - if (!strncmp(ban->banstr, "~t:", 3)) - { - /* Stacked ~t:xx:~T ban (timed text ban) */ - char *p = strchr(ban->banstr+3, ':'); - if (p && !strncmp(p+1, "~T:", 3)) - { - if (textban_check_ban(client, channel, p+1, msg, errmsg)) - return HOOK_DENY; - } } } @@ -431,23 +423,18 @@ int textban_can_send_to_channel(Client *client, Channel *channel, Membership *lp } -int textban_check_ban(Client *client, Channel *channel, char *ban, char **msg, char **errmsg) +int textban_check_ban(Client *client, Channel *channel, const char *ban, const char **msg, const char **errmsg) { static char retbuf[512]; char filtered[512]; /* temp input buffer */ long fl; int cleaned=0; - char *p; + const char *p; #ifdef UHOSTFEATURE char buf[512], uhost[USERLEN + HOSTLEN + 16]; #endif char tmp[1024], *word; int type; -#ifdef BENCHMARK - struct timeval tv_alpha, tv_beta; - - gettimeofday(&tv_alpha, NULL); -#endif /* We can only filter on non-NULL text of course */ if ((msg == NULL) || (*msg == NULL)) @@ -460,7 +447,10 @@ int textban_check_ban(Client *client, Channel *channel, char *ban, char **msg, c #endif strlcpy(filtered, StripControlCodes(*msg), sizeof(filtered)); - p = ban + 3; + p = strchr(ban, ':'); + if (!p) + return 0; /* "impossible" */ + p++; #ifdef UHOSTFEATURE /* First.. deal with userhost... */ strcpy(buf, p); @@ -496,13 +486,6 @@ int textban_check_ban(Client *client, Channel *channel, char *ban, char **msg, c #endif } -#ifdef BENCHMARK - gettimeofday(&tv_beta, NULL); - ircd_log(LOG_ERROR, "TextBan Timing: %ld microseconds (%s / %s / %d)", - ((tv_beta.tv_sec - tv_alpha.tv_sec) * 1000000) + (tv_beta.tv_usec - tv_alpha.tv_usec), - client->name, channel->chname, strlen(*msg)); -#endif - if (cleaned) { /* check for null string */ diff --git a/src/modules/extbans/timedban.c b/src/modules/extbans/timedban.c index 1b5f130..5ec418c 100644 --- a/src/modules/extbans/timedban.c +++ b/src/modules/extbans/timedban.c @@ -51,13 +51,13 @@ ModuleHeader MOD_HEADER "1.0", "ExtBan ~t: automatically removed timed bans", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Forward declarations */ -char *timedban_extban_conv_param(char *para_in); -int timedban_extban_is_ok(Client *client, Channel* channel, char *para_in, int checkt, int what, int what2); -int timedban_is_banned(Client *client, Channel *channel, char *ban, int chktype, char **msg, char **errmsg); +const char *timedban_extban_conv_param(BanContext *b, Extban *extban); +int timedban_extban_is_ok(BanContext *b); +int timedban_is_banned(BanContext *b); void add_send_mode_param(Channel *channel, Client *from, char what, char mode, char *param); char *timedban_chanmsg(Client *, Client *, Channel *, char *, int); @@ -70,18 +70,20 @@ MOD_TEST() MOD_INIT() { -ExtbanInfo extban; + ExtbanInfo extban; MARK_AS_OFFICIAL_MODULE(modinfo); memset(&extban, 0, sizeof(ExtbanInfo)); - extban.flag = 't'; + extban.letter = 't'; + extban.name = "time"; extban.options |= EXTBOPT_ACTMODIFIER; /* not really, but ours shouldn't be stacked from group 1 */ extban.options |= EXTBOPT_CHSVSMODE; /* so "SVSMODE -nick" will unset affected ~t extbans */ extban.options |= EXTBOPT_INVEX; /* also permit timed invite-only exceptions (+I) */ extban.conv_param = timedban_extban_conv_param; extban.is_ok = timedban_extban_is_ok; extban.is_banned = timedban_is_banned; + extban.is_banned_events = BANCHK_ALL; if (!ExtbanAdd(modinfo->handle, extban)) { @@ -106,17 +108,18 @@ MOD_UNLOAD() /** Generic helper for our conv_param extban function. * Mostly copied from clean_ban_mask() + * FIXME: Figure out why we have this one at all and not use conv_param? ;) */ -char *generic_clean_ban_mask(char *mask) +const char *generic_clean_ban_mask(BanContext *b, Extban *extban) { char *cp, *x; char *user; char *host; - Extban *p; static char maskbuf[512]; + char *mask; /* Work on a copy */ - strlcpy(maskbuf, mask, sizeof(maskbuf)); + strlcpy(maskbuf, b->banstr, sizeof(maskbuf)); mask = maskbuf; cp = strchr(mask, ' '); @@ -136,11 +139,22 @@ char *generic_clean_ban_mask(char *mask) /* Extended ban? */ if (is_extended_ban(mask)) { - p = findmod_by_bantype(mask[1]); - if (!p) + const char *nextbanstr; + Extban *extban = findmod_by_bantype(mask, &nextbanstr); + if (!extban) return NULL; /* reject unknown extban */ - if (p->conv_param) - return p->conv_param(mask); + if (extban->conv_param) + { + const char *ret; + static char retbuf[512]; + BanContext *newb = safe_alloc(sizeof(BanContext)); + newb->banstr = nextbanstr; + newb->conv_options = b->conv_options; + ret = extban->conv_param(newb, extban); + ret = prefix_with_extban(ret, newb, extban, retbuf, sizeof(retbuf)); + safe_free(newb); + return ret; + } /* else, do some basic sanity checks and cut it off at 80 bytes */ if ((mask[1] != ':') || (mask[2] == '\0')) return NULL; /* require a ":" after extban type */ @@ -169,7 +183,7 @@ char *generic_clean_ban_mask(char *mask) } /** Convert ban to an acceptable format (or return NULL to fully reject it) */ -char *timedban_extban_conv_param(char *para_in) +const char *timedban_extban_conv_param(BanContext *b, Extban *extban) { static char retbuf[MAX_LENGTH+1]; char para[MAX_LENGTH+1]; @@ -177,13 +191,13 @@ char *timedban_extban_conv_param(char *para_in) char *durationstr; /**< Duration, such as '5' */ int duration; char *matchby; /**< Matching method, such as 'n!u@h' */ - char *newmask; /**< Cleaned matching method, such as 'n!u@h' */ + const char *newmask; /**< Cleaned matching method, such as 'n!u@h' */ static int timedban_extban_conv_param_recursion = 0; if (timedban_extban_conv_param_recursion) return NULL; /* reject: recursion detected! */ - strlcpy(para, para_in+3, sizeof(para)); /* work on a copy (and truncate it) */ + strlcpy(para, b->banstr, sizeof(para)); /* work on a copy (and truncate it) */ /* ~t:duration:n!u@h for direct matching * ~t:duration:~x:.... when calling another bantype @@ -203,12 +217,14 @@ char *timedban_extban_conv_param(char *para_in) strlcpy(tmpmask, matchby, sizeof(tmpmask)); timedban_extban_conv_param_recursion++; //newmask = extban_conv_param_nuh_or_extban(tmpmask); - newmask = generic_clean_ban_mask(tmpmask); + b->banstr = matchby; // this was previously 'tmpmask' but then it's a copy-copy-copy.. :D + newmask = generic_clean_ban_mask(b, extban); timedban_extban_conv_param_recursion--; if (!newmask || (strlen(newmask) <= 1)) return NULL; - snprintf(retbuf, sizeof(retbuf), "~t:%d:%s", duration, newmask); + //snprintf(retbuf, sizeof(retbuf), "~t:%d:%s", duration, newmask); + snprintf(retbuf, sizeof(retbuf), "%d:%s", duration, newmask); return retbuf; } @@ -226,54 +242,50 @@ int timedban_extban_syntax(Client *client, int checkt, char *reason) } /** Generic helper for sub-bans, used by our "is this ban ok?" function */ -int generic_ban_is_ok(Client *client, Channel *channel, char *mask, int checkt, int what, int what2) +int generic_ban_is_ok(BanContext *b) { - if ((mask[0] == '~') && MyUser(client)) + if ((b->banstr[0] == '~') && MyUser(b->client)) { - Extban *p; + Extban *extban; + const char *nextbanstr; /* This portion is copied from clean_ban_mask() */ - if (is_extended_ban(mask) && MyUser(client)) + if (is_extended_ban(b->banstr) && MyUser(b->client)) { - if (RESTRICT_EXTENDEDBANS && !ValidatePermissionsForPath("immune:restrict-extendedbans",client,NULL,NULL,NULL)) + if (RESTRICT_EXTENDEDBANS && !ValidatePermissionsForPath("immune:restrict-extendedbans",b->client,NULL,NULL,NULL)) { if (!strcmp(RESTRICT_EXTENDEDBANS, "*")) { - if (checkt == EXBCHK_ACCESS_ERR) - sendnotice(client, "Setting/removing of extended bans has been disabled"); + if (b->is_ok_check == EXBCHK_ACCESS_ERR) + sendnotice(b->client, "Setting/removing of extended bans has been disabled"); return 0; /* REJECT */ } - if (strchr(RESTRICT_EXTENDEDBANS, mask[1])) + if (strchr(RESTRICT_EXTENDEDBANS, b->banstr[1])) { - if (checkt == EXBCHK_ACCESS_ERR) - sendnotice(client, "Setting/removing of extended bantypes '%s' has been disabled", RESTRICT_EXTENDEDBANS); + if (b->is_ok_check == EXBCHK_ACCESS_ERR) + sendnotice(b->client, "Setting/removing of extended bantypes '%s' has been disabled", RESTRICT_EXTENDEDBANS); return 0; /* REJECT */ } } /* And next is inspired by cmd_mode */ - p = findmod_by_bantype(mask[1]); - if (checkt == EXBCHK_ACCESS) + extban = findmod_by_bantype(b->banstr, &nextbanstr); + if (extban && extban->is_ok) { - if (p && p->is_ok && !p->is_ok(client, channel, mask, EXBCHK_ACCESS, what, what2) && - !ValidatePermissionsForPath("channel:override:mode:extban",client,NULL,channel,NULL)) + b->banstr = nextbanstr; + if ((b->is_ok_check == EXBCHK_ACCESS) || (b->is_ok_check == EXBCHK_ACCESS_ERR)) { - return 0; /* REJECT */ - } - } else - if (checkt == EXBCHK_ACCESS_ERR) - { - if (p && p->is_ok && !p->is_ok(client, channel, mask, EXBCHK_ACCESS, what, what2) && - !ValidatePermissionsForPath("channel:override:mode:extban",client,NULL,channel,NULL)) + if (!extban->is_ok(b) && + !ValidatePermissionsForPath("channel:override:mode:extban",b->client,NULL,b->channel,NULL)) + { + return 0; /* REJECT */ + } + } else + if (b->is_ok_check == EXBCHK_PARAM) { - p->is_ok(client, channel, mask, EXBCHK_ACCESS_ERR, what, what2); - return 0; /* REJECT */ - } - } else - if (checkt == EXBCHK_PARAM) - { - if (p && p->is_ok && !p->is_ok(client, channel, mask, EXBCHK_PARAM, what, what2)) - { - return 0; /* REJECT */ + if (!extban->is_ok(b)) + { + return 0; /* REJECT */ + } } } } @@ -288,7 +300,7 @@ int generic_ban_is_ok(Client *client, Channel *channel, char *mask, int checkt, } /** Validate ban ("is this ban ok?") */ -int timedban_extban_is_ok(Client *client, Channel* channel, char *para_in, int checkt, int what, int what2) +int timedban_extban_is_ok(BanContext *b) { char para[MAX_LENGTH+1]; char tmpmask[MAX_LENGTH+1]; @@ -300,13 +312,13 @@ int timedban_extban_is_ok(Client *client, Channel* channel, char *para_in, int c int res; /* Always permit deletion */ - if (what == MODE_DEL) + if (b->what == MODE_DEL) return 1; if (timedban_extban_is_ok_recursion) return 0; /* Recursion detected (~t:1:~t:....) */ - strlcpy(para, para_in+3, sizeof(para)); /* work on a copy (and truncate it) */ + strlcpy(para, b->banstr, sizeof(para)); /* work on a copy (and truncate it) */ /* ~t:duration:n!u@h for direct matching * ~t:duration:~x:.... when calling another bantype @@ -315,18 +327,19 @@ int timedban_extban_is_ok(Client *client, Channel* channel, char *para_in, int c durationstr = para; matchby = strchr(para, ':'); if (!matchby || !matchby[1]) - return timedban_extban_syntax(client, checkt, "Invalid syntax"); + return timedban_extban_syntax(b->client, b->is_ok_check, "Invalid syntax"); *matchby++ = '\0'; duration = atoi(durationstr); if ((duration <= 0) || (duration > TIMEDBAN_MAX_TIME)) - return timedban_extban_syntax(client, checkt, "Invalid duration time"); + return timedban_extban_syntax(b->client, b->is_ok_check, "Invalid duration time"); strlcpy(tmpmask, matchby, sizeof(tmpmask)); timedban_extban_is_ok_recursion++; - //res = extban_is_ok_nuh_extban(client, channel, tmpmask, checkt, what, what2); - res = generic_ban_is_ok(client, channel, tmpmask, checkt, what, what2); + //res = extban_is_ok_nuh_extban(b->client, b->channel, tmpmask, b->is_ok_check, b->what, b->ban_type); + b->banstr = tmpmask; + res = generic_ban_is_ok(b); timedban_extban_is_ok_recursion--; if (res == 0) { @@ -334,41 +347,48 @@ int timedban_extban_is_ok(Client *client, Channel* channel, char *para_in, int c * invalid n!u@h syntax, unknown (sub)extbantype, * disabled extban type in conf, too much recursion, etc. */ - return timedban_extban_syntax(client, checkt, "Invalid matcher"); + return timedban_extban_syntax(b->client, b->is_ok_check, "Invalid matcher"); } return 1; /* OK */ } /** Check if the user is currently banned */ -int timedban_is_banned(Client *client, Channel *channel, char *ban, int chktype, char **msg, char **errmsg) +int timedban_is_banned(BanContext *b) { - if (strncmp(ban, "~t:", 3)) - return 0; /* not for us */ - ban = strchr(ban+3, ':'); /* skip time argument */ - if (!ban) + b->banstr = strchr(b->banstr, ':'); /* skip time argument */ + if (!b->banstr) return 0; /* invalid fmt */ - ban++; + b->banstr++; /* skip over final semicolon */ - return ban_check_mask(client, channel, ban, chktype, msg, errmsg, 0); + return ban_check_mask(b); } -/** Helper to check if the ban has been expired */ +/** Helper to check if the ban has been expired. + */ int timedban_has_ban_expired(Ban *ban) { char *banstr = ban->banstr; - char *p; + char *p1, *p2; int t; time_t expire_on; - if (strncmp(banstr, "~t:", 3)) + /* The caller has only performed a very light check (string starting + * with ~t, in the interest of performance), so we don't know yet if + * it REALLY is a timed ban. We check that first here... + */ + if (!strncmp(banstr, "~t:", 3)) + p1 = banstr + 3; + else if (!strncmp(banstr, "~time:", 6)) + p1 = banstr + 6; + else return 0; /* not for us */ - p = strchr(banstr+3, ':'); /* skip time argument */ - if (!p) + p2 = strchr(p1+1, ':'); /* skip time argument */ + if (!p2) return 0; /* invalid fmt */ - *p = '\0'; /* danger.. must restore!! */ - t = atoi(banstr+3); - *p = ':'; /* restored.. */ + *p2 = '\0'; /* danger.. must restore!! */ + t = atoi(p1); + *p2 = ':'; /* restored.. */ expire_on = ban->when + (t * 60) - TIMEDBAN_TIMER_DELTA; @@ -398,14 +418,14 @@ EVENT(timedban_timeout) * is too costly. So we stick with this. It should be * good enough. Alternative would be some channel->id value. */ - if (((unsigned int)channel->chname[1] % TIMEDBAN_TIMER_ITERATION_SPLIT) != current_iteration) + if (((unsigned int)channel->name[1] % TIMEDBAN_TIMER_ITERATION_SPLIT) != current_iteration) continue; /* not this time, maybe next */ *mbuf = *pbuf = '\0'; for (ban = channel->banlist; ban; ban=nextban) { nextban = ban->next; - if (!strncmp(ban->banstr, "~t:", 3) && timedban_has_ban_expired(ban)) + if (!strncmp(ban->banstr, "~t", 2) && timedban_has_ban_expired(ban)) { add_send_mode_param(channel, &me, '-', 'b', ban->banstr); del_listmode(&channel->banlist, channel, ban->banstr); @@ -414,7 +434,7 @@ EVENT(timedban_timeout) for (ban = channel->exlist; ban; ban=nextban) { nextban = ban->next; - if (!strncmp(ban->banstr, "~t:", 3) && timedban_has_ban_expired(ban)) + if (!strncmp(ban->banstr, "~t", 2) && timedban_has_ban_expired(ban)) { add_send_mode_param(channel, &me, '-', 'e', ban->banstr); del_listmode(&channel->exlist, channel, ban->banstr); @@ -423,7 +443,7 @@ EVENT(timedban_timeout) for (ban = channel->invexlist; ban; ban=nextban) { nextban = ban->next; - if (!strncmp(ban->banstr, "~t:", 3) && timedban_has_ban_expired(ban)) + if (!strncmp(ban->banstr, "~t", 2) && timedban_has_ban_expired(ban)) { add_send_mode_param(channel, &me, '-', 'I', ban->banstr); del_listmode(&channel->invexlist, channel, ban->banstr); @@ -433,8 +453,8 @@ EVENT(timedban_timeout) { MessageTag *mtags = NULL; new_message(&me, NULL, &mtags); - sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s %s %s", me.name, channel->chname, mbuf, pbuf); - sendto_server(NULL, 0, 0, mtags, ":%s MODE %s %s %s 0", me.id, channel->chname, mbuf, pbuf); + sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s %s %s", me.name, channel->name, mbuf, pbuf); + sendto_server(NULL, 0, 0, mtags, ":%s MODE %s %s %s 0", me.id, channel->name, mbuf, pbuf); free_message_tags(mtags); *pbuf = 0; } @@ -484,8 +504,8 @@ void add_send_mode_param(Channel *channel, Client *from, char what, char mode, c MessageTag *mtags = NULL; new_message(&me, NULL, &mtags); - sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s %s %s", me.name, channel->chname, mbuf, pbuf); - sendto_server(NULL, 0, 0, mtags, ":%s MODE %s %s %s 0", me.id, channel->chname, mbuf, pbuf); + sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s %s %s", me.name, channel->name, mbuf, pbuf); + sendto_server(NULL, 0, 0, mtags, ":%s MODE %s %s %s 0", me.id, channel->name, mbuf, pbuf); free_message_tags(mtags); send = 0; *pbuf = 0; diff --git a/src/modules/extended-monitor.c b/src/modules/extended-monitor.c new file mode 100644 index 0000000..34c9f1f --- /dev/null +++ b/src/modules/extended-monitor.c @@ -0,0 +1,153 @@ +/* + * IRC - Internet Relay Chat, src/modules/extended-monitor.c + * (C) 2021 The UnrealIRCd Team + * + * See file AUTHORS in IRC package for additional names of + * the programmers. + * + * This program is free 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 1, or (at your option) + * any later version. + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "unrealircd.h" + +long CAP_EXTENDED_MONITOR = 0L; + +int extended_monitor_away(Client *client, MessageTag *mtags, const char *reason, int already_as_away); +int extended_monitor_account_login(Client *client, MessageTag *mtags); +int extended_monitor_userhost_changed(Client *client, const char *olduser, const char *oldhost); +int extended_monitor_realname_changed(Client *client, const char *oldinfo); +int extended_monitor_notification(Client *client, Watch *watch, Link *lp, int event); + +ModuleHeader MOD_HEADER + = { + "extended-monitor", + "5.0", + "extended functionality for /monitor", + "UnrealIRCd Team", + "unrealircd-6", + }; + +MOD_INIT() +{ + ClientCapabilityInfo cap; + ClientCapability *c; + + MARK_AS_OFFICIAL_MODULE(modinfo); + + ModDataInfo mreq; + + memset(&cap, 0, sizeof(cap)); + cap.name = "draft/extended-monitor"; + c = ClientCapabilityAdd(modinfo->handle, &cap, &CAP_EXTENDED_MONITOR); + if (!c) + { + config_error("[%s] Failed to request extended-monitor cap: %s", MOD_HEADER.name, ModuleGetErrorStr(modinfo->handle)); + return MOD_FAILED; + } + + HookAdd(modinfo->handle, HOOKTYPE_AWAY, 0, extended_monitor_away); + HookAdd(modinfo->handle, HOOKTYPE_ACCOUNT_LOGIN, 0, extended_monitor_account_login); + HookAdd(modinfo->handle, HOOKTYPE_USERHOST_CHANGED, 0, extended_monitor_userhost_changed); + HookAdd(modinfo->handle, HOOKTYPE_REALNAME_CHANGED, 0, extended_monitor_realname_changed); + + return MOD_SUCCESS; +} + +MOD_LOAD() +{ + return MOD_SUCCESS; +} + +MOD_UNLOAD() +{ + return MOD_SUCCESS; +} + +int extended_monitor_away(Client *client, MessageTag *mtags, const char *reason, int already_as_away) +{ + if (reason) + watch_check(client, WATCH_EVENT_AWAY, extended_monitor_notification); + else + watch_check(client, WATCH_EVENT_NOTAWAY, extended_monitor_notification); + + return 0; +} + +int extended_monitor_account_login(Client *client, MessageTag *mtags) +{ + if (IsLoggedIn(client)) + watch_check(client, WATCH_EVENT_LOGGEDIN, extended_monitor_notification); + else + watch_check(client, WATCH_EVENT_LOGGEDOUT, extended_monitor_notification); + + return 0; +} + +int extended_monitor_userhost_changed(Client *client, const char *olduser, const char *oldhost) +{ + watch_check(client, WATCH_EVENT_USERHOST, extended_monitor_notification); + return 0; +} + +int extended_monitor_realname_changed(Client *client, const char *oldinfo) +{ + watch_check(client, WATCH_EVENT_REALNAME, extended_monitor_notification); + return 0; +} + +int extended_monitor_notification(Client *client, Watch *watch, Link *lp, int event) +{ + if (!(lp->flags & WATCH_FLAG_TYPE_MONITOR)) + return 0; + + if (!HasCapabilityFast(lp->value.client, CAP_EXTENDED_MONITOR)) + return 0; /* this client does not support our notifications */ + + if (has_common_channels(client, lp->value.client)) + return 0; /* will be notified anyway */ + + switch (event) + { + case WATCH_EVENT_AWAY: + if (HasCapability(lp->value.client, "away-notify")) + sendto_prefix_one(lp->value.client, client, NULL, ":%s AWAY :%s", client->name, client->user->away); + break; + case WATCH_EVENT_NOTAWAY: + if (HasCapability(lp->value.client, "away-notify")) + sendto_prefix_one(lp->value.client, client, NULL, ":%s AWAY", client->name); + break; + case WATCH_EVENT_LOGGEDIN: + if (HasCapability(lp->value.client, "account-notify")) + sendto_prefix_one(lp->value.client, client, NULL, ":%s ACCOUNT :%s", client->name, client->user->account); + break; + case WATCH_EVENT_LOGGEDOUT: + if (HasCapability(lp->value.client, "account-notify")) + sendto_prefix_one(lp->value.client, client, NULL, ":%s ACCOUNT :*", client->name); + break; + case WATCH_EVENT_USERHOST: + if (HasCapability(lp->value.client, "chghost")) + sendto_prefix_one(lp->value.client, client, NULL, ":%s CHGHOST %s %s", client->name, client->user->username, GetHost(client)); + break; + case WATCH_EVENT_REALNAME: + if (HasCapability(lp->value.client, "setname")) + sendto_prefix_one(lp->value.client, client, NULL, ":%s SETNAME :%s", client->name, client->info); + break; + default: + break; + } + + return 0; +} + diff --git a/src/modules/extjwt.c b/src/modules/extjwt.c new file mode 100644 index 0000000..0d9d63c --- /dev/null +++ b/src/modules/extjwt.c @@ -0,0 +1,1151 @@ +/* + * IRC - Internet Relay Chat, src/modules/extjwt.c + * (C) 2021 The UnrealIRCd Team + * + * See file AUTHORS in IRC package for additional names of + * the programmers. + * + * This program is free 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 1, or (at your option) + * any later version. + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "unrealircd.h" + +#if defined(__GNUC__) +/* Temporarily ignore these for this entire file. FIXME later when updating the code for OpenSSL 3: */ +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif + +/* internal definitions */ + +#define MSG_EXTJWT "EXTJWT" +#define MYCONF "extjwt" + +#undef NEW_ISUPPORT /* enable this for https://github.com/ircv3/ircv3-specifications/pull/341#issuecomment-617038799 */ + +#define EXTJWT_METHOD_NOT_SET 0 +#define EXTJWT_METHOD_HS256 1 +#define EXTJWT_METHOD_HS384 2 +#define EXTJWT_METHOD_HS512 3 +#define EXTJWT_METHOD_RS256 4 +#define EXTJWT_METHOD_RS384 5 +#define EXTJWT_METHOD_RS512 6 +#define EXTJWT_METHOD_ES256 7 +#define EXTJWT_METHOD_ES384 8 +#define EXTJWT_METHOD_ES512 9 +#define EXTJWT_METHOD_NONE 10 + +#define NEEDS_KEY(x) (x>=EXTJWT_METHOD_RS256 && x<=EXTJWT_METHOD_ES512) + +#define URL_LENGTH 4096 +#define MODES_SIZE 41 /* about 10 mode chars */ +#define TS_LENGTH 19 /* 64-bit integer */ +#define MAX_TOKEN_CHUNK (510-sizeof(extjwt_message_pattern)-HOSTLEN-CHANNELLEN) + +/* OpenSSL 1.0.x compatibility */ + +#if (OPENSSL_VERSION_NUMBER < 0x10100000L) +void ECDSA_SIG_get0(const ECDSA_SIG *sig, const BIGNUM **pr, const BIGNUM **ps) +{ + if (pr != NULL) + *pr = sig->r; + if (ps != NULL) + *ps = sig->s; +} +#endif + +/* struct definitions */ + +struct extjwt_config { + time_t exp_delay; + char *secret; + int method; + char *vfy; +}; + +struct jwt_service { + char *name; + struct extjwt_config *cfg; + struct jwt_service *next; +}; + +/* function declarations */ + +CMD_FUNC(cmd_extjwt); +char *extjwt_make_payload(Client *client, Channel *channel, struct extjwt_config *config); +char *extjwt_generate_token(const char *payload, struct extjwt_config *config); +void b64url(char *b64); +unsigned char *extjwt_hmac_extjwt_hash(int method, const void *key, int keylen, const unsigned char *data, int datalen, unsigned int* resultlen); +unsigned char *extjwt_sha_pem_extjwt_hash(int method, const void *key, int keylen, const unsigned char *data, int datalen, unsigned int* resultlen); +unsigned char *extjwt_hash(int method, const void *key, int keylen, const unsigned char *data, int datalen, unsigned int* resultlen); +char *extjwt_gen_header(int method); +int extjwt_configtest(ConfigFile *cf, ConfigEntry *ce, int type, int *errs); +int extjwt_configrun(ConfigFile *cf, ConfigEntry *ce, int type); +int extjwt_configposttest(int *errs); +void extjwt_free_services(struct jwt_service **services); +struct jwt_service *find_jwt_service(struct jwt_service *services, const char *name); +int extjwt_valid_integer_string(const char *in, int min, int max); +char *extjwt_test_key(const char *file, int method); +char *extjwt_read_file_contents(const char *file, int absolute, int *size); +int EXTJWT_METHOD_from_string(const char *in); +#ifdef NEW_ISUPPORT +char *extjwt_isupport_param(void); +#endif + +/* string constants */ + +const char extjwt_message_pattern[] = ":%s EXTJWT %s %s %s%s"; + +/* global structs */ + +ModuleHeader MOD_HEADER = { + "extjwt", + "6.0", + "Command /EXTJWT (web service authorization)", + "UnrealIRCd Team", + "unrealircd-6" +}; + +struct { + int have_secret; + int have_key; + int have_method; + int have_expire; + int have_vfy; + char *key_filename; +} cfg_state; + +struct extjwt_config cfg; +struct jwt_service *jwt_services; + +MOD_TEST() +{ + memset(&cfg_state, 0, sizeof(cfg_state)); + HookAdd(modinfo->handle, HOOKTYPE_CONFIGTEST, 0, extjwt_configtest); + HookAdd(modinfo->handle, HOOKTYPE_CONFIGPOSTTEST, 0, extjwt_configposttest); + return MOD_SUCCESS; +} + +MOD_INIT() +{ + CommandAdd(modinfo->handle, MSG_EXTJWT, cmd_extjwt, 2, CMD_USER); + HookAdd(modinfo->handle, HOOKTYPE_CONFIGRUN, 0, extjwt_configrun); + return MOD_SUCCESS; +} + +MOD_LOAD() +{ + struct jwt_service *service = jwt_services; +#ifdef NEW_ISUPPORT + ISupportAdd(modinfo->handle, "EXTJWT", extjwt_isupport_param()); +#else + ISupportAdd(modinfo->handle, "EXTJWT", "1"); +#endif + while (service) + { /* copy default exp to all services not having one specified */ + if (service->cfg->exp_delay == 0) + service->cfg->exp_delay = cfg.exp_delay; + service = service->next; + } + return MOD_SUCCESS; +} + +MOD_UNLOAD() +{ + extjwt_free_services(&jwt_services); + return MOD_SUCCESS; +} + +#ifdef NEW_ISUPPORT +char *extjwt_isupport_param(void) +{ + struct jwt_service *services = jwt_services; + int count = 0; + static char buf[500]; + strlcpy(buf, "V:1", sizeof(buf)); + while (services) + { + strlcat(buf, count?",":"&S:", sizeof(buf)); + strlcat(buf, services->name, sizeof(buf)); + count++; + services = services->next; + } + return buf; +} +#endif + +void extjwt_free_services(struct jwt_service **services){ + struct jwt_service *ss, *next; + ss = *services; + while (ss) + { + next = ss->next; + safe_free(ss->name); + if (ss->cfg) + safe_free(ss->cfg->secret); + safe_free(ss->cfg); + safe_free(ss); + ss = next; + } + *services = NULL; +} + +struct jwt_service *find_jwt_service(struct jwt_service *services, const char *name) +{ + if (!name) + return NULL; + while (services) + { + if (services->name && !strcmp(services->name, name)) + return services; + services = services->next; + } + return NULL; +} + +int extjwt_valid_integer_string(const char *in, int min, int max) +{ + int i, val; + if (BadPtr(in)) + return 0; + for (i=0; in[i]; i++){ + if (!isdigit(in[i])) + return 0; + } + val = atoi(in); + if (val < min || val > max) + return 0; + return 1; +} + +int vfy_url_is_valid(const char *string) +{ + if (strstr(string, "http://") == string || strstr(string, "https://") == string) + { + if (strstr(string, "%s")) + return 1; + } + return 0; +} + +char *extjwt_test_key(const char *file, int method) +{ /* returns NULL when valid */ + int fsize; + char *fcontent = NULL; + char *retval = NULL; + BIO *bufkey = NULL; + EVP_PKEY *pkey = NULL; + int type, pkey_type; + do { + switch (method) + { + case EXTJWT_METHOD_RS256: case EXTJWT_METHOD_RS384: case EXTJWT_METHOD_RS512: + type = EVP_PKEY_RSA; + break; + case EXTJWT_METHOD_ES256: case EXTJWT_METHOD_ES384: case EXTJWT_METHOD_ES512: + type = EVP_PKEY_EC; + break; + default: + retval = "Internal error (invalid type)"; + return retval; + } + fcontent = extjwt_read_file_contents(file, 0, &fsize); + if (!fcontent) + { + retval = "Cannot open file"; + break; + } + if (fsize == 0) + { + retval = "File is empty"; + break; + } + if (!(bufkey = BIO_new_mem_buf(fcontent, fsize))) + { + retval = "Unknown error"; + break; + } + if (!(pkey = PEM_read_bio_PrivateKey(bufkey, NULL, NULL, NULL))) + { + retval = "Key is invalid"; + break; + } + pkey_type = EVP_PKEY_id(pkey); + if (type != pkey_type) + { + retval = "Key does not match method"; + break; + } + } while (0); + safe_free(fcontent); + if (bufkey) + BIO_free(bufkey); + if (pkey) + EVP_PKEY_free(pkey); + return retval; +} + +int EXTJWT_METHOD_from_string(const char *in) +{ + if (!strcmp(in, "HS256")) + return EXTJWT_METHOD_HS256; + if (!strcmp(in, "HS384")) + return EXTJWT_METHOD_HS384; + if (!strcmp(in, "HS512")) + return EXTJWT_METHOD_HS512; + if (!strcmp(in, "RS256")) + return EXTJWT_METHOD_RS256; + if (!strcmp(in, "RS384")) + return EXTJWT_METHOD_RS384; + if (!strcmp(in, "RS512")) + return EXTJWT_METHOD_RS512; + if (!strcmp(in, "ES256")) + return EXTJWT_METHOD_ES256; + if (!strcmp(in, "ES384")) + return EXTJWT_METHOD_ES384; + if (!strcmp(in, "ES512")) + return EXTJWT_METHOD_ES512; + if (!strcmp(in, "NONE")) + return EXTJWT_METHOD_NONE; + return EXTJWT_METHOD_NOT_SET; +} + +/* Configuration is described in conf/modules.optional.conf */ + +int extjwt_configtest(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) +{ + int errors = 0; + ConfigEntry *cep, *cep2; + int i; + struct jwt_service *services = NULL; + struct jwt_service **ss = &services; /* list for checking whether service names repeat */ + int have_ssecret, have_smethod, have_svfy, have_scert; + unsigned int sfilename_line_number = 0; + char *sfilename = NULL; + + if (type != CONFIG_MAIN) + return 0; + + if (!ce || strcmp(ce->name, MYCONF)) + return 0; + + for (cep = ce->items; cep; cep = cep->next) + { + if (!cep->value) + { + config_error("%s:%i: blank %s::%s without value", cep->file->filename, cep->line_number, MYCONF, cep->name); + errors++; + continue; + } + if (!strcmp(cep->name, "method")) + { + if (cfg_state.have_method) + { + config_error("%s:%i: duplicate %s::%s item", cep->file->filename, cep->line_number, MYCONF, cep->name); + errors++; + continue; + } + cfg_state.have_method = EXTJWT_METHOD_from_string(cep->value); + if (cfg_state.have_method == EXTJWT_METHOD_NOT_SET) + { + config_error("%s:%i: invalid value %s::%s \"%s\" (check docs for allowed options)", cep->file->filename, cep->line_number, MYCONF, cep->name, cep->value); + errors++; + } + continue; + } + if (!strcmp(cep->name, "expire-after")) + { + if (!extjwt_valid_integer_string(cep->value, 1, 9999)) + { + config_error("%s:%i: %s::%s must be an integer between 1 and 9999 (seconds)", cep->file->filename, cep->line_number, MYCONF, cep->name); + errors++; + } + continue; + } + if (!strcmp(cep->name, "secret")) + { + if (cfg_state.have_secret) + { + config_error("%s:%i: duplicate %s::%s item", cep->file->filename, cep->line_number, MYCONF, cep->name); + errors++; + continue; + } + cfg_state.have_secret = 1; + if (strlen(cep->value) < 4) + { + config_error("%s:%i: Secret specified in %s::%s is too short!", cep->file->filename, cep->line_number, MYCONF, cep->name); + errors++; + } + continue; + } + if (!strcmp(cep->name, "key")) + { + if (cfg_state.have_key) + { + config_error("%s:%i: duplicate %s::%s item", cep->file->filename, cep->line_number, MYCONF, cep->name); + errors++; + continue; + } + if (!is_file_readable(cep->value, CONFDIR)) + { + config_error("%s:%i: Cannot open file \"%s\" specified in %s::%s for reading", cep->file->filename, cep->line_number, cep->value, MYCONF, cep->name); + errors++; + } + safe_strdup(cfg_state.key_filename, cep->value); + cfg_state.have_key = 1; + continue; + } + if (!strcmp(cep->name, "verify-url")) + { + if (cfg_state.have_vfy) + { + config_error("%s:%i: duplicate %s:%s item", cep->file->filename, cep->line_number, MYCONF, cep->name); + errors++; + continue; + } + cfg_state.have_vfy = 1; + if (!vfy_url_is_valid(cep->value)) + { + config_error("%s:%i: Optional URL specified in %s::%s is invalid!", cep->file->filename, cep->line_number, MYCONF, cep->name); + errors++; + continue; + } + if (strlen(cep->value) > URL_LENGTH) + { + config_error("%s:%i: Optional URL specified in %s::%s is too long!", cep->file->filename, cep->line_number, MYCONF, cep->name); + errors++; + } + continue; + } + if (!strcmp(cep->name, "service")) + { + have_ssecret = 0; + have_smethod = 0; + have_svfy = 0; + have_scert = 0; + if (strchr(cep->value, ' ') || strchr(cep->value, ',')) + { + config_error("%s:%i: Invalid %s::%s name (contains spaces or commas)", cep->file->filename, cep->line_number, MYCONF, cep->name); + errors++; + continue; + } + if (find_jwt_service(services, cep->value)) + { + config_error("%s:%i: Duplicate %s::%s name \"%s\"", cep->file->filename, cep->line_number, MYCONF, cep->name, cep->value); + errors++; + continue; + } + *ss = safe_alloc(sizeof(struct jwt_service)); /* store the new name for further checking */ + safe_strdup((*ss)->name, cep->value); + ss = &(*ss)->next; + for (cep2 = cep->items; cep2; cep2 = cep2->next) + { + if (!cep2->name || !cep2->value || !cep2->value[0]) + { + config_error("%s:%i: blank/incomplete %s::service entry", cep2->file->filename, cep2->line_number, MYCONF); + errors++; + continue; + } + + if (!strcmp(cep2->name, "method")) + { + if (have_smethod) + { + config_error("%s:%i: duplicate %s::service::%s item", cep2->file->filename, cep2->line_number, MYCONF, cep2->name); + errors++; + continue; + } + have_smethod = EXTJWT_METHOD_from_string(cep2->value); + if (have_smethod == EXTJWT_METHOD_NOT_SET || have_smethod == EXTJWT_METHOD_NONE) + { + config_error("%s:%i: invalid value of optional %s::service::%s \"%s\" (check docs for allowed options)", cep2->file->filename, cep2->line_number, MYCONF, cep2->name, cep2->value); + errors++; + } + continue; + } + + if (!strcmp(cep2->name, "secret")) + { + if (have_ssecret) + { + config_error("%s:%i: duplicate %s::service::%s item", cep2->file->filename, cep2->line_number, MYCONF, cep2->name); + errors++; + continue; + } + have_ssecret = 1; + if (strlen(cep2->value) < 4) /* TODO maybe a better check? */ + { + config_error("%s:%i: Secret specified in %s::service::%s is too short!", cep2->file->filename, cep2->line_number, MYCONF, cep2->name); + errors++; + } + continue; + } + + if (!strcmp(cep2->name, "key")) + { + if (have_scert) + { + config_error("%s:%i: duplicate %s::service::%s item", cep2->file->filename, cep2->line_number, MYCONF, cep2->name); + errors++; + continue; + } + if (!is_file_readable(cep2->value, CONFDIR)) + { + config_error("%s:%i: Cannot open file \"%s\" specified in %s::service::%s for reading", cep2->file->filename, cep2->line_number, cep2->value, MYCONF, cep2->name); + errors++; + } + have_scert = 1; + safe_strdup(sfilename, cep2->value); + sfilename_line_number = cep2->line_number; + continue; + } + + if (!strcmp(cep2->name, "expire-after")) + { + if (!extjwt_valid_integer_string(cep2->value, 1, 9999)) + { + config_error("%s:%i: %s::%s must be an integer between 1 and 9999 (seconds)", cep2->file->filename, cep2->line_number, MYCONF, cep2->name); + errors++; + } + continue; + } + + if (!strcmp(cep2->name, "verify-url")) + { + if (have_svfy) + { + config_error("%s:%i: duplicate %s::service::%s item", cep2->file->filename, cep2->line_number, MYCONF, cep2->name); + errors++; + continue; + } + have_svfy = 1; + if (!vfy_url_is_valid(cep2->value)) + { + config_error("%s:%i: Optional URL specified in %s::service::%s is invalid!", cep2->file->filename, cep2->line_number, MYCONF, cep2->name); + errors++; + continue; + } + if (strlen(cep2->value) > URL_LENGTH) + { + config_error("%s:%i: Optional URL specified in %s::service::%s is too long!", cep2->file->filename, cep2->line_number, MYCONF, cep2->name); + errors++; + } + continue; + } + + config_error("%s:%i: invalid %s::service attribute %s (must be one of: name, secret, expire-after)", cep2->file->filename, cep2->line_number, MYCONF, cep2->name); + errors++; + } + if (!have_smethod) + { + config_error("%s:%i: invalid %s::service entry (no %s::service::method specfied)", cep->file->filename, cep->line_number, MYCONF, MYCONF); + errors++; + continue; + } + if (have_ssecret && NEEDS_KEY(have_smethod)) + { + config_error("%s:%i: invalid %s::service entry (this method needs %s::service::key and not %s::service::secret option)", cep->file->filename, cep->line_number, MYCONF, MYCONF, MYCONF); + errors++; + continue; + } + if (have_scert && !NEEDS_KEY(have_smethod)) + { + config_error("%s:%i: invalid %s::service entry (this method needs %s::service::secret and not %s::service::key option)", cep->file->filename, cep->line_number, MYCONF, MYCONF, MYCONF); + errors++; + continue; + } + if (!have_ssecret && !NEEDS_KEY(have_smethod)) + { + config_error("%s:%i: invalid %s::service entry (must contain %s::service::secret option)", cep->file->filename, cep->line_number, MYCONF, MYCONF); + errors++; + continue; + } + if (!have_scert && NEEDS_KEY(have_smethod)) { + config_error("%s:%i: invalid %s::service entry (must contain %s::service::key option)", cep->file->filename, cep->line_number, MYCONF, MYCONF); + errors++; + continue; + } + if (NEEDS_KEY(have_smethod) && have_scert) + { + char *keyerr; + keyerr = extjwt_test_key(sfilename, have_smethod); + if (keyerr) + { + config_error("%s:%i: Invalid key file specified for %s::key: %s", cep->file->filename, sfilename_line_number, MYCONF, keyerr); + errors++; + } + } + continue; + } + config_error("%s:%i: unknown directive %s::%s", cep->file->filename, cep->line_number, MYCONF, cep->name); + errors++; + } + *errs = errors; + extjwt_free_services(&services); + if (errors) + safe_free(cfg_state.key_filename); + safe_free(sfilename); + return errors ? -1 : 1; +} + +int extjwt_configposttest(int *errs) +{ + int errors = 0; + if (cfg_state.have_method == EXTJWT_METHOD_NOT_SET) + { + config_error("No %s::method specfied!", MYCONF); + errors++; + } else + { + if (cfg_state.have_method != EXTJWT_METHOD_NONE && !NEEDS_KEY(cfg_state.have_method) && !cfg_state.have_secret) + { + config_error("No %s::secret specfied as required by requested method!", MYCONF); + errors++; + } + if ((cfg_state.have_method == EXTJWT_METHOD_NONE || NEEDS_KEY(cfg_state.have_method)) && cfg_state.have_secret) + { + config_error("A %s::secret specfied but it should not be when using requested method!", MYCONF); + errors++; + } + if (NEEDS_KEY(cfg_state.have_method) && !cfg_state.have_key) + { + config_error("No %s::key specfied as required by requested method!", MYCONF); + errors++; + } + if (!NEEDS_KEY(cfg_state.have_method) && cfg_state.have_key) + { + config_error("A %s::key specfied but it should not be when using requested method!", MYCONF); + errors++; + } + if (NEEDS_KEY(cfg_state.have_method) && cfg_state.have_key && cfg_state.key_filename) + { + char *keyerr; + + keyerr = extjwt_test_key(cfg_state.key_filename, cfg_state.have_method); + if (keyerr) + { + config_error("Invalid key file specified for %s::key: %s", MYCONF, keyerr); + errors++; + } + } + } + safe_free(cfg_state.key_filename); + if (errors) + { + *errs = errors; + return -1; + } + /* setting defaults, FIXME this may behave incorrectly if there's another module failing POSTTEST */ + if (!cfg_state.have_expire) + cfg.exp_delay = 30; + /* prepare service list to load new data */ + extjwt_free_services(&jwt_services); + return 1; +} + +int extjwt_configrun(ConfigFile *cf, ConfigEntry *ce, int type) +{ /* actually use the new configuration data */ + ConfigEntry *cep, *cep2; + struct jwt_service **ss = &jwt_services; + if (*ss) + ss = &((*ss)->next); + + if (type != CONFIG_MAIN) + return 0; + + if (!ce || strcmp(ce->name, MYCONF)) + return 0; + + for (cep = ce->items; cep; cep = cep->next) + { + if (!strcmp(cep->name, "method")) + { + cfg.method = EXTJWT_METHOD_from_string(cep->value); + continue; + } + if (!strcmp(cep->name, "expire-after")) + { + cfg.exp_delay = atoi(cep->value); + continue; + } + if (!strcmp(cep->name, "secret")) + { + cfg.secret = strdup(cep->value); + continue; + } + if (!strcmp(cep->name, "key")) + { + cfg.secret = extjwt_read_file_contents(cep->value, 0, NULL); + continue; + } + if (!strcmp(cep->name, "verify-url")) + { + cfg.vfy = strdup(cep->value); + continue; + } + if (!strcmp(cep->name, "service")) + { /* nested block */ + *ss = safe_alloc(sizeof(struct jwt_service)); + (*ss)->cfg = safe_alloc(sizeof(struct extjwt_config)); + safe_strdup((*ss)->name, cep->value); /* copy the service name */ + for (cep2 = cep->items; cep2; cep2 = cep2->next) + { + if (!strcmp(cep2->name, "method")) + { + (*ss)->cfg->method = EXTJWT_METHOD_from_string(cep2->value); + continue; + } + if (!strcmp(cep2->name, "expire-after")) + { + (*ss)->cfg->exp_delay = atoi(cep2->value); + continue; + } + if (!strcmp(cep2->name, "secret")) + { + (*ss)->cfg->secret = strdup(cep2->value); + continue; + } + if (!strcmp(cep2->name, "key")) + { + (*ss)->cfg->secret = extjwt_read_file_contents(cep2->value, 0, NULL); + continue; + } + if (!strcmp(cep2->name, "verify-url")) + { + (*ss)->cfg->vfy = strdup(cep2->value); + continue; + } + } + ss = &((*ss)->next); + } + } + return 1; +} + +char *extjwt_read_file_contents(const char *file, int absolute, int *size) +{ + FILE *f = NULL; + int fsize; + char *filename = NULL; + char *buf = NULL; + do + { + safe_strdup(filename, file); + if (!absolute) + convert_to_absolute_path(&filename, CONFDIR); + f = fopen(filename, "rb"); + if (!f) + break; + fseek(f, 0, SEEK_END); + fsize = ftell(f); + fseek(f, 0, SEEK_SET); + buf = safe_alloc(fsize + 1); + fsize = fread(buf, 1, fsize, f); + buf[fsize] = '\0'; + if (size) + *size = fsize; + fclose(f); + } while (0); + safe_free(filename); + if (!buf && size) + *size = 0; + return buf; +} + +CMD_FUNC(cmd_extjwt) +{ + Channel *channel; + char *payload; + char *token, *full_token; + struct jwt_service *service = NULL; + struct extjwt_config *config; + int last = 0; + char message[MAX_TOKEN_CHUNK+1]; + if (parc < 2 || BadPtr(parv[1])) + { + sendnumeric(client, ERR_NEEDMOREPARAMS, MSG_EXTJWT); + return; + } + if (parv[1][0] == '*' && parv[1][1] == '\0') + { + channel = NULL; /* not linked to a channel */ + } else + { + channel = find_channel(parv[1]); + if (!channel) + { + sendnumeric(client, ERR_NOSUCHNICK, parv[1]); + return; + } + } + if (parc > 2 && !BadPtr(parv[2])) + { + service = find_jwt_service(jwt_services, parv[2]); + if (!service) + { + sendto_one(client, NULL, ":%s FAIL %s NO_SUCH_SERVICE :No such service", me.name, MSG_EXTJWT); + return; + } + } + if (service){ + config = service->cfg; /* service config */ + } else { + config = &cfg; /* default config */ + } + if (!(payload = extjwt_make_payload(client, channel, config)) || !(full_token = extjwt_generate_token(payload, config))) + { + sendto_one(client, NULL, ":%s FAIL %s UNKNOWN_ERROR :Failed to generate token", me.name, MSG_EXTJWT); + return; + } + safe_free(payload); + token = full_token; + do + { + if (strlen(token) <= MAX_TOKEN_CHUNK) + { /* the remaining data (or whole token) will fit a single irc message */ + last = 1; + strcpy(message, token); + } else + { /* send a chunk and shift buffer */ + strlcpy(message, token, MAX_TOKEN_CHUNK+1); + token += MAX_TOKEN_CHUNK; + } + sendto_one(client, NULL, extjwt_message_pattern, me.name, parv[1], "*", last?"":"* ", message); + } while (!last); + safe_free(full_token); +} + +char *extjwt_make_payload(Client *client, Channel *channel, struct extjwt_config *config) +{ + Membership *lp; + json_t *payload = NULL; + json_t *modes = NULL; + json_t *umodes = NULL; + char *modestring; + char singlemode[2] = { '\0' }; + char *result; + + if (!IsUser(client)) + return NULL; + + payload = json_object(); + modes = json_array(); + umodes = json_array(); + + json_object_set_new(payload, "exp", json_integer(TStime()+config->exp_delay)); + json_object_set_new(payload, "iss", json_string_unreal(me.name)); + json_object_set_new(payload, "sub", json_string_unreal(client->name)); + json_object_set_new(payload, "account", json_string_unreal(IsLoggedIn(client)?client->user->account:"")); + + if (config->vfy) /* also add the URL */ + json_object_set_new(payload, "vfy", json_string_unreal(config->vfy)); + + if (IsOper(client)) /* add "o" ircop flag */ + json_array_append_new(umodes, json_string("o")); + json_object_set_new(payload, "umodes", umodes); + + if (channel) + { /* fill in channel information and user flags */ + lp = find_membership_link(client->user->channel, channel); + if (lp) + { + modestring = lp->member_modes; + while (*modestring) + { + singlemode[0] = *modestring; + json_array_append_new(modes, json_string(singlemode)); + modestring++; + } + } + json_object_set_new(payload, "channel", json_string_unreal(channel->name)); + json_object_set_new(payload, "joined", json_integer(lp?1:0)); + json_object_set_new(payload, "cmodes", modes); + } + result = json_dumps(payload, JSON_COMPACT); + json_decref(modes); + json_decref(umodes); + json_decref(payload); + return result; +} + +void b64url(char *b64) +{ /* convert base64 to base64-url */ + while (*b64) + { + if (*b64 == '+') + *b64 = '-'; + if (*b64 == '/') + *b64 = '_'; + if (*b64 == '=') + { + *b64 = '\0'; + return; + } + b64++; + } +} + +unsigned char *extjwt_hash(int method, const void *key, int keylen, const unsigned char *data, int datalen, unsigned int* resultlen) +{ + switch(method) + { + case EXTJWT_METHOD_HS256: case EXTJWT_METHOD_HS384: case EXTJWT_METHOD_HS512: + return extjwt_hmac_extjwt_hash(method, key, keylen, data, datalen, resultlen); + case EXTJWT_METHOD_RS256: case EXTJWT_METHOD_RS384: case EXTJWT_METHOD_RS512: case EXTJWT_METHOD_ES256: case EXTJWT_METHOD_ES384: case EXTJWT_METHOD_ES512: + return extjwt_sha_pem_extjwt_hash(method, key, keylen, data, datalen, resultlen); + } + return NULL; +} + +unsigned char* extjwt_sha_pem_extjwt_hash(int method, const void *key, int keylen, const unsigned char *data, int datalen, unsigned int* resultlen) +{ + EVP_MD_CTX *mdctx = NULL; + ECDSA_SIG *ec_sig = NULL; + const BIGNUM *ec_sig_r = NULL; + const BIGNUM *ec_sig_s = NULL; + BIO *bufkey = NULL; + const EVP_MD *alg; + int type; + EVP_PKEY *pkey = NULL; + int pkey_type; + unsigned char *sig = NULL; + int ret = 0; + size_t slen; + char *retval = NULL; + char *output = NULL; + char *sig_ptr; + + do + { + switch (method) + { + case EXTJWT_METHOD_RS256: + alg = EVP_sha256(); + type = EVP_PKEY_RSA; + break; + case EXTJWT_METHOD_RS384: + alg = EVP_sha384(); + type = EVP_PKEY_RSA; + break; + case EXTJWT_METHOD_RS512: + alg = EVP_sha512(); + type = EVP_PKEY_RSA; + break; + case EXTJWT_METHOD_ES256: + alg = EVP_sha256(); + type = EVP_PKEY_EC; + break; + case EXTJWT_METHOD_ES384: + alg = EVP_sha384(); + type = EVP_PKEY_EC; + break; + case EXTJWT_METHOD_ES512: + alg = EVP_sha512(); + type = EVP_PKEY_EC; + break; + default: + return NULL; + } + +#if (OPENSSL_VERSION_NUMBER < 0x10100003L) /* https://github.com/openssl/openssl/commit/8ab31975bacb9c907261088937d3aa4102e3af84 */ + if (!(bufkey = BIO_new_mem_buf((void *)key, keylen))) + break; /* out of memory */ +#else + if (!(bufkey = BIO_new_mem_buf(key, keylen))) + break; /* out of memory */ +#endif + if (!(pkey = PEM_read_bio_PrivateKey(bufkey, NULL, NULL, NULL))) + break; /* invalid key? */ + pkey_type = EVP_PKEY_id(pkey); + if (type != pkey_type) + break; /* invalid key type */ + if (!(mdctx = EVP_MD_CTX_create())) + break; /* out of memory */ + if (EVP_DigestSignInit(mdctx, NULL, alg, NULL, pkey) != 1) + break; /* initialize error */ + if (EVP_DigestSignUpdate(mdctx, data, datalen) != 1) + break; /* signing error */ + if (EVP_DigestSignFinal(mdctx, NULL, &slen) != 1) /* get required buffer length */ + break; + sig = safe_alloc(slen); + if (EVP_DigestSignFinal(mdctx, sig, &slen) != 1) + break; + if (pkey_type != EVP_PKEY_EC) + { + *resultlen = slen; + output = safe_alloc(slen); + memcpy(output, sig, slen); + retval = output; + } else + { + unsigned int degree, bn_len, r_len, s_len, buf_len; + unsigned char *raw_buf = NULL; + EC_KEY *ec_key; + if (!(ec_key = EVP_PKEY_get1_EC_KEY(pkey))) + break; /* out of memory */ + degree = EC_GROUP_get_degree(EC_KEY_get0_group(ec_key)); + EC_KEY_free(ec_key); + sig_ptr = sig; + if (!(ec_sig = d2i_ECDSA_SIG(NULL, (const unsigned char **)&sig_ptr, slen))) + break; /* out of memory */ + ECDSA_SIG_get0(ec_sig, &ec_sig_r, &ec_sig_s); + r_len = BN_num_bytes(ec_sig_r); + s_len = BN_num_bytes(ec_sig_s); + bn_len = (degree+7)/8; + if (r_len>bn_len || s_len > bn_len) + break; + buf_len = bn_len*2; + raw_buf = safe_alloc(buf_len); + BN_bn2bin(ec_sig_r, raw_buf+bn_len-r_len); + BN_bn2bin(ec_sig_s, raw_buf+buf_len-s_len); + output = safe_alloc(buf_len); + *resultlen = buf_len; + memcpy(output, raw_buf, buf_len); + retval = output; + safe_free(raw_buf); + } + } while (0); + + if (bufkey) + BIO_free(bufkey); + if (pkey) + EVP_PKEY_free(pkey); + if (mdctx) + EVP_MD_CTX_destroy(mdctx); + if (ec_sig) + ECDSA_SIG_free(ec_sig); + safe_free(sig); + return retval; +} + +unsigned char* extjwt_hmac_extjwt_hash(int method, const void *key, int keylen, const unsigned char *data, int datalen, unsigned int* resultlen) +{ + const EVP_MD* typ; + char *hmac = safe_alloc(EVP_MAX_MD_SIZE); + switch (method) + { + default: + case EXTJWT_METHOD_HS256: + typ = EVP_sha256(); + break; + case EXTJWT_METHOD_HS384: + typ = EVP_sha384(); + break; + case EXTJWT_METHOD_HS512: + typ = EVP_sha512(); + break; + } + if (HMAC(typ, key, keylen, data, datalen, hmac, resultlen)) + { /* openssl call */ + return hmac; + } else { + safe_free(hmac); + return NULL; + } +} + +char *extjwt_gen_header(int method) +{ /* returns header json */ + json_t *header = NULL; + json_t *alg; + char *result; + + header = json_object(); + json_object_set_new(header, "typ", json_string("JWT")); + + switch (method) + { + default: + case EXTJWT_METHOD_HS256: + alg = json_string("HS256"); + break; + case EXTJWT_METHOD_HS384: + alg = json_string("HS384"); + break; + case EXTJWT_METHOD_HS512: + alg = json_string("HS512"); + break; + case EXTJWT_METHOD_RS256: + alg = json_string("RS256"); + break; + case EXTJWT_METHOD_RS384: + alg = json_string("RS384"); + break; + case EXTJWT_METHOD_RS512: + alg = json_string("RS512"); + break; + case EXTJWT_METHOD_ES256: + alg = json_string("ES256"); + break; + case EXTJWT_METHOD_ES384: + alg = json_string("ES384"); + break; + case EXTJWT_METHOD_ES512: + alg = json_string("ES512"); + break; + case EXTJWT_METHOD_NONE: + alg = json_string("none"); + break; + } + json_object_set_new(header, "alg", alg); + result = json_dumps(header, JSON_COMPACT); + json_decref(header); + return result; +} + +char *extjwt_generate_token(const char *payload, struct extjwt_config *config) +{ + char *header = extjwt_gen_header(config->method); + size_t b64header_size = strlen(header)*4/3 + 8; // base64 has 4/3 overhead + size_t b64payload_size = strlen(payload)*4/3 + 8; + size_t b64sig_size = 4096*4/3 + 8; + size_t b64data_size = b64header_size + b64payload_size + b64sig_size + 4; + char *b64header = safe_alloc(b64header_size); + char *b64payload = safe_alloc(b64payload_size); + char *b64sig = safe_alloc(b64sig_size); + char *b64data = safe_alloc(b64data_size); + unsigned int extjwt_hashsize; + char *extjwt_hash_val = NULL; + char *retval = NULL; + b64_encode(header, strlen(header), b64header, b64header_size); + b64_encode(payload, strlen(payload), b64payload, b64payload_size); + b64url(b64header); + b64url(b64payload); + snprintf(b64data, b64data_size, "%s.%s", b64header, b64payload); // generate first part of the token + if (config->method != EXTJWT_METHOD_NONE) + { + extjwt_hash_val = extjwt_hash(config->method, config->secret, strlen(config->secret), b64data, strlen(b64data), &extjwt_hashsize); // calculate the signature extjwt_hash + if (extjwt_hash_val) + { + b64_encode(extjwt_hash_val, extjwt_hashsize, b64sig, b64sig_size); + b64url(b64sig); + strlcat(b64data, ".", b64data_size); // append signature extjwt_hash to token + strlcat(b64data, b64sig, b64data_size); + retval = b64data; + } + } else + { + retval = b64data; + } + safe_free(header); + safe_free(b64header); + safe_free(b64payload); + safe_free(b64sig); + safe_free(extjwt_hash_val); + + if (retval != b64data) + safe_free(b64data); + + return retval; +} diff --git a/src/modules/geoip_base.c b/src/modules/geoip_base.c new file mode 100644 index 0000000..3244e1f --- /dev/null +++ b/src/modules/geoip_base.c @@ -0,0 +1,326 @@ +/* + * GEOIP Base module, needed for all geoip functions + * as this stores the geo information in ModData. + * (C) Copyright 2021-.. Syzop and The UnrealIRCd Team + * License: GPLv2 + */ + +#include "unrealircd.h" + +ModuleHeader MOD_HEADER + = { + "geoip_base", + "5.0", + "Base module for geoip", + "UnrealIRCd Team", + "unrealircd-6", + }; + +struct geoip_base_config_s { + int check_on_load; +}; + +/* Forward declarations */ +void geoip_base_free(ModData *m); +const char *geoip_base_serialize(ModData *m); +void geoip_base_unserialize(const char *str, ModData *m); +int geoip_base_handshake(Client *client); +int geoip_base_whois(Client *client, Client *target, NameValuePrioList **list); +int geoip_connect_extinfo(Client *client, NameValuePrioList **list); +int geoip_base_configtest(ConfigFile *cf, ConfigEntry *ce, int type, int *errs); +int geoip_base_configrun(ConfigFile *cf, ConfigEntry *ce, int type); +EVENT(geoip_base_set_existing_users_evt); +CMD_FUNC(cmd_geoip); + +ModDataInfo *geoip_md; /* Module Data structure which we acquire */ +struct geoip_base_config_s geoip_base_config; + +/* We can use GEOIPDATA() and GEOIPDATARAW() for fast access. + * People wanting to get this information from outside this module + * should use geoip_client(client) ! + */ + +#define GEOIPDATARAW(x) (moddata_client((x), geoip_md).ptr) +#define GEOIPDATA(x) ((GeoIPResult *)moddata_client((x), geoip_md).ptr) + +int geoip_base_configtest(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) +{ + ConfigEntry *cep; + int errors = 0; + int i; + + if (type != CONFIG_SET) + return 0; + + if (!ce || !ce->name) + return 0; + + if (strcmp(ce->name, "geoip")) + return 0; + + for (cep = ce->items; cep; cep = cep->next) + { + if (!strcmp(cep->name, "check-on-load")) + { + CheckNull(cep); + continue; + } + config_warn("%s:%i: unknown item geoip::%s", cep->file->filename, cep->line_number, cep->name); + } + + *errs = errors; + return errors ? -1 : 1; +} + +int geoip_base_configrun(ConfigFile *cf, ConfigEntry *ce, int type) +{ + ConfigEntry *cep; + + if (type != CONFIG_SET) + return 0; + + if (!ce || !ce->name) + return 0; + + if (strcmp(ce->name, "geoip")) + return 0; + + for (cep = ce->items; cep; cep = cep->next) + { + if (!strcmp(cep->name, "check-on-load")) + geoip_base_config.check_on_load = config_checkval(cep->value, CFG_YESNO); + } + return 1; +} + +MOD_TEST() +{ + MARK_AS_OFFICIAL_MODULE(modinfo); + HookAdd(modinfo->handle, HOOKTYPE_CONFIGTEST, 0, geoip_base_configtest); + return MOD_SUCCESS; +} + +MOD_INIT() +{ + ModDataInfo mreq; + + MARK_AS_OFFICIAL_MODULE(modinfo); + + memset(&mreq, 0, sizeof(mreq)); + mreq.name = "geoip"; + mreq.free = geoip_base_free; + mreq.serialize = geoip_base_serialize; + mreq.unserialize = geoip_base_unserialize; + mreq.sync = MODDATA_SYNC_EARLY; + mreq.type = MODDATATYPE_CLIENT; + geoip_md = ModDataAdd(modinfo->handle, mreq); + if (!geoip_md) + abort(); + + HookAdd(modinfo->handle, HOOKTYPE_CONFIGRUN, 0, geoip_base_configrun); + HookAdd(modinfo->handle, HOOKTYPE_HANDSHAKE, 0, geoip_base_handshake); + HookAdd(modinfo->handle, HOOKTYPE_SERVER_HANDSHAKE_OUT, 0, geoip_base_handshake); + HookAdd(modinfo->handle, HOOKTYPE_CONNECT_EXTINFO, 1, geoip_connect_extinfo); /* (prio: near-first) */ + HookAdd(modinfo->handle, HOOKTYPE_PRE_LOCAL_CONNECT, 0,geoip_base_handshake); /* in case the IP changed in registration phase (WEBIRC, HTTP Forwarded) */ + HookAdd(modinfo->handle, HOOKTYPE_REMOTE_CONNECT, 0, geoip_base_handshake); /* remote user */ + HookAdd(modinfo->handle, HOOKTYPE_WHOIS, 0, geoip_base_whois); + + CommandAdd(modinfo->handle, "GEOIP", cmd_geoip, MAXPARA, CMD_USER); + + /* set defaults */ + geoip_base_config.check_on_load = 1; + + return MOD_SUCCESS; +} + +MOD_LOAD() +{ + /* add info for all users upon module loading if enabled, but delay it a bit for data provider module to load */ + if (geoip_base_config.check_on_load) + { + EventAdd(modinfo->handle, "geoip_base_set_existing_users", geoip_base_set_existing_users_evt, NULL, 1000, 1); + } + return MOD_SUCCESS; +} + + +MOD_UNLOAD() +{ + return MOD_SUCCESS; +} + +int geoip_base_handshake(Client *client) +{ + if (!client->ip) + return 0; + GeoIPResult *res = geoip_lookup(client->ip); + + if (!res) + return 0; + + if (GEOIPDATA(client)) + { + free_geoip_result(GEOIPDATA(client)); + GEOIPDATARAW(client) = NULL; + } + GEOIPDATARAW(client) = res; + return 0; +} + +void geoip_base_free(ModData *m) +{ + if (m->ptr) + { + free_geoip_result((GeoIPResult *)m->ptr); + m->ptr = NULL; + } +} + +const char *geoip_base_serialize(ModData *m) +{ + static char buf[512]; + GeoIPResult *geo; + + if (!m->ptr) + return NULL; + + geo = m->ptr; + snprintf(buf, sizeof(buf), "cc=%s|cd=%s", + geo->country_code, + geo->country_name); + + return buf; +} + +void geoip_base_unserialize(const char *str, ModData *m) +{ + char buf[512], *p=NULL, *varname, *value; + char *country_name = NULL; + char *country_code = NULL; + GeoIPResult *res; + + if (m->ptr == NULL) + { + free_geoip_result((GeoIPResult *)m->ptr); + m->ptr = NULL; + } + if (str == NULL) + return; + + strlcpy(buf, str, sizeof(buf)); + for (varname = strtoken(&p, buf, "|"); varname; varname = strtoken(&p, NULL, "|")) + { + value = strchr(varname, '='); + if (!value) + continue; + *value++ = '\0'; + if (!strcmp(varname, "cc")) + country_code = value; + else if (!strcmp(varname, "cd")) + country_name = value; + } + + if (!country_code || !country_name) + return; /* does not meet minimum criteria */ + + res = safe_alloc(sizeof(GeoIPResult)); + safe_strdup(res->country_name, country_name); + safe_strdup(res->country_code, country_code); + m->ptr = res; +} + +EVENT(geoip_base_set_existing_users_evt){ + Client *client; + list_for_each_entry(client, &client_list, client_node){ + if (!IsUser(client)) + continue; + geoip_base_handshake(client); + } +} + +int geoip_connect_extinfo(Client *client, NameValuePrioList **list) +{ + GeoIPResult *geo = GEOIPDATA(client); + if (geo) + add_nvplist(list, 0, "country", geo->country_code); + return 0; +} + +int geoip_base_whois(Client *client, Client *target, NameValuePrioList **list) +{ + GeoIPResult *geo; + char buf[512]; + int policy = whois_get_policy(client, target, "geo"); + + if (policy == WHOIS_CONFIG_DETAILS_NONE) + return 0; + + geo = GEOIPDATA(target); + if (!geo) + return 0; + + // we only have country atm, but if we add city then city goes in 'full' and + // country goes in 'limited' + // if policy == WHOIS_CONFIG_DETAILS_LIMITED ... + add_nvplist_numeric_fmt(list, 0, "geo", client, RPL_WHOISCOUNTRY, + "%s %s :is connecting from %s", + target->name, + geo->country_code, + geo->country_name); + return 0; +} + +CMD_FUNC(cmd_geoip) +{ + const char *ip = NULL; + Client *target; + GeoIPResult *res; + + if (!IsOper(client)) + { + sendnumeric(client, ERR_NOPRIVILEGES); + return; + } + + if ((parc < 2) || BadPtr(parv[1])) + { + /* Maybe some report */ + return; + } + + if (strchr(parv[1], '.') || strchr(parv[1], ':')) + { + ip = parv[1]; + } else { + target = find_user(parv[1], NULL); + if (!target) + { + sendnumeric(client, ERR_NOSUCHNICK, parv[1]); + return; + } + ip = target->ip; + if (!ip) + { + sendnotice(client, "User %s has no known IP address", client->name); // (eg: services bot) + return; + } + } + + res = geoip_lookup(ip); + + sendnotice(client, "*** GEOIP information for IP %s ***", ip); + if (!res) + { + sendnotice(client, "- No information available"); + return; + } else { + if (res->country_code) + sendnotice(client, "- Country code: %s", res->country_code); + if (res->country_name) + sendnotice(client, "- Country name: %s", res->country_name); + } + + free_geoip_result(res); + + sendnotice(client, "*** End of information ***"); +} diff --git a/src/modules/geoip_classic.c b/src/modules/geoip_classic.c new file mode 100644 index 0000000..c7299fc --- /dev/null +++ b/src/modules/geoip_classic.c @@ -0,0 +1,297 @@ +/* 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", + }; + +struct geoip_classic_config_s { + char *v4_db_file; + char *v6_db_file; +/* for config reading only */ + int have_config; + int have_ipv4_database; + int have_ipv6_database; +}; + +/* Variables */ + +struct geoip_classic_config_s geoip_classic_config; +GeoIP *gi4 = NULL; +GeoIP *gi6 = NULL; + +/* Forward declarations */ +int geoip_classic_configtest(ConfigFile *cf, ConfigEntry *ce, int type, int *errs); +int geoip_classic_configposttest(int *errs); +int geoip_classic_configrun(ConfigFile *cf, ConfigEntry *ce, int type); +void geoip_classic_free(void); +GeoIPResult *geoip_lookup_classic(char *ip); + +int geoip_classic_configtest(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) +{ + ConfigEntry *cep; + int errors = 0; + int i; + + if (type != CONFIG_SET) + return 0; + + if (!ce || !ce->name) + return 0; + + if (strcmp(ce->name, "geoip-classic")) + return 0; + + geoip_classic_config.have_config = 1; + + for (cep = ce->items; cep; cep = cep->next) + { + if (!strcmp(cep->name, "ipv4-database")) + { + if (geoip_classic_config.have_ipv4_database) + { + config_error("%s:%i: duplicate item set::geoip-classic::%s", cep->file->filename, cep->line_number, cep->name); + continue; + } + if (!is_file_readable(cep->value, PERMDATADIR)) + { + config_error("%s:%i: set::geoip-classic::%s: cannot open file \"%s/%s\" for reading (%s)", cep->file->filename, cep->line_number, cep->name, PERMDATADIR, cep->value, strerror(errno)); + errors++; + continue; + } + geoip_classic_config.have_ipv4_database = 1; + continue; + } + if (!strcmp(cep->name, "ipv6-database")) + { + if (geoip_classic_config.have_ipv6_database) + { + config_error("%s:%i: duplicate item set::geoip-classic::%s", cep->file->filename, cep->line_number, cep->name); + continue; + } + if (!is_file_readable(cep->value, PERMDATADIR)) + { + config_error("%s:%i: set::geoip-classic::%s: cannot open file \"%s/%s\" for reading (%s)", cep->file->filename, cep->line_number, cep->name, PERMDATADIR, cep->value, strerror(errno)); + errors++; + continue; + } + geoip_classic_config.have_ipv6_database = 1; + continue; + } + config_warn("%s:%i: unknown item set::geoip-classic::%s", cep->file->filename, cep->line_number, cep->name); + } + + *errs = errors; + return errors ? -1 : 1; +} + +int geoip_classic_configposttest(int *errs) +{ + int errors = 0; + if (geoip_classic_config.have_config) + { + if (!geoip_classic_config.have_ipv4_database && !geoip_classic_config.have_ipv6_database) + { + config_error("geoip_classic: no database files specified! Remove set::geoip-classic to use defaults"); + errors++; + } + } else + { + safe_strdup(geoip_classic_config.v4_db_file, "GeoIP.dat"); + safe_strdup(geoip_classic_config.v6_db_file, "GeoIPv6.dat"); + + if (is_file_readable(geoip_classic_config.v4_db_file, PERMDATADIR)) + { + geoip_classic_config.have_ipv4_database = 1; + } else + { + config_warn("[geoip_classic] cannot open IPv4 database file \"%s/%s\" for reading (%s)", PERMDATADIR, geoip_classic_config.v4_db_file, strerror(errno)); + safe_free(geoip_classic_config.v4_db_file); + } + if (is_file_readable(geoip_classic_config.v6_db_file, PERMDATADIR)) + { + geoip_classic_config.have_ipv6_database = 1; + } else + { + config_warn("[geoip_classic] cannot open IPv6 database file \"%s/%s\" for reading (%s)", PERMDATADIR, geoip_classic_config.v6_db_file, strerror(errno)); + safe_free(geoip_classic_config.v6_db_file); + } + if (!geoip_classic_config.have_ipv4_database && !geoip_classic_config.have_ipv6_database) + { + config_error("[geoip_classic] couldn't read any database! Either put these in %s location " + "or specify another in set::geoip-classic config block", PERMDATADIR); + errors++; + } + } + + *errs = errors; + return errors ? -1 : 1; +} + +int geoip_classic_configrun(ConfigFile *cf, ConfigEntry *ce, int type) +{ + ConfigEntry *cep; + + if (type != CONFIG_SET) + return 0; + + if (!ce || !ce->name) + return 0; + + if (strcmp(ce->name, "geoip-classic")) + return 0; + + for (cep = ce->items; cep; cep = cep->next) + { + if (!strcmp(cep->name, "ipv4-database") && geoip_classic_config.have_ipv4_database) + safe_strdup(geoip_classic_config.v4_db_file, cep->value); + if (!strcmp(cep->name, "ipv6-database") && geoip_classic_config.have_ipv6_database) + safe_strdup(geoip_classic_config.v6_db_file, cep->value); + } + return 1; +} + +MOD_TEST() +{ + MARK_AS_OFFICIAL_MODULE(modinfo); + if (!CallbackAddPVoid(modinfo->handle, CALLBACKTYPE_GEOIP_LOOKUP, TO_PVOIDFUNC(geoip_lookup_classic))) + { + unreal_log(ULOG_ERROR, "geoip_classic", "GEOIP_ADD_CALLBACK_FAILED", NULL, + "geoip_classic: Could not install GEOIP_LOOKUP callback. " + "Most likely another geoip module is already loaded. " + "You can only load one!"); + return MOD_FAILED; + } + + geoip_classic_config.have_config = 0; + geoip_classic_config.have_ipv4_database = 0; + geoip_classic_config.have_ipv6_database = 0; + HookAdd(modinfo->handle, HOOKTYPE_CONFIGTEST, 0, geoip_classic_configtest); + HookAdd(modinfo->handle, HOOKTYPE_CONFIGPOSTTEST, 0, geoip_classic_configposttest); + return MOD_SUCCESS; +} + +MOD_INIT() +{ + MARK_AS_OFFICIAL_MODULE(modinfo); + geoip_classic_free(); + HookAdd(modinfo->handle, HOOKTYPE_CONFIGRUN, 0, geoip_classic_configrun); + return MOD_SUCCESS; +} + +MOD_LOAD() +{ + int found_good_file = 0; + + if (geoip_classic_config.v4_db_file) + { + convert_to_absolute_path(&geoip_classic_config.v4_db_file, PERMDATADIR); + gi4 = GeoIP_open(geoip_classic_config.v4_db_file, GEOIP_STANDARD | GEOIP_CHECK_CACHE | GEOIP_SILENCE); + if (gi4) + { + found_good_file = 1; + } else + { + int save_err = errno; + unreal_log(ULOG_WARNING, "geoip_classic", "GEOIP_CANNOT_OPEN_DB", NULL, + "[IPv4] Could not open '$filename': $system_error", + log_data_string("filename", geoip_classic_config.v4_db_file), + log_data_string("system_error", strerror(save_err))); + } + } + if (geoip_classic_config.v6_db_file) + { + convert_to_absolute_path(&geoip_classic_config.v6_db_file, PERMDATADIR); + gi6 = GeoIP_open(geoip_classic_config.v6_db_file, GEOIP_STANDARD | GEOIP_CHECK_CACHE | GEOIP_SILENCE); + if (gi6) + { + found_good_file = 1; + } else + { + int save_err = errno; + unreal_log(ULOG_WARNING, "geoip_classic", "GEOIP_CANNOT_OPEN_DB", NULL, + "[IPv6] Could not open '$filename': $system_error", + log_data_string("filename", geoip_classic_config.v6_db_file), + log_data_string("system_error", strerror(save_err))); + } + convert_to_absolute_path(&geoip_classic_config.v6_db_file, PERMDATADIR); + } + + if (!found_good_file) + { + unreal_log(ULOG_ERROR, "geoip_classic", "GEOIP_CANNOT_OPEN_DB", NULL, + "could not open any database!"); + return MOD_FAILED; + } + return MOD_SUCCESS; +} + +MOD_UNLOAD() +{ + geoip_classic_free(); + return MOD_SUCCESS; +} + +void geoip_classic_free(void) +{ + if (gi4) + GeoIP_delete(gi4); + if (gi6) + GeoIP_delete(gi6); + gi4 = NULL; + gi6 = NULL; + safe_free(geoip_classic_config.v4_db_file); + safe_free(geoip_classic_config.v6_db_file); +} + +GeoIPResult *geoip_lookup_classic(char *ip) +{ + static char buf[256]; + const char *country_code, *country_name; + GeoIPLookup gl; + GeoIP *gi; + int geoid; + GeoIPResult *r; + + if (!ip) + return NULL; + + if (strchr(ip, ':')) + { + if (!gi6) + return NULL; + geoid = GeoIP_id_by_addr_v6_gl(gi6, ip, &gl); + gi = gi6; + } else + { + if (!gi4 || !strcmp(ip, "255.255.255.255")) + return NULL; + geoid = GeoIP_id_by_addr_gl(gi4, ip, &gl); + gi = gi4; + } + + if (geoid == 0) + return NULL; + + country_code = GeoIP_code_by_id(geoid); + country_name = GeoIP_country_name_by_id(gi, geoid); + + if (!country_code || !country_name) + return NULL; + + r = safe_alloc(sizeof(GeoIPResult)); + safe_strdup(r->country_code, country_code); + safe_strdup(r->country_name, country_name); + return r; +} + diff --git a/src/modules/geoip_csv.c b/src/modules/geoip_csv.c new file mode 100644 index 0000000..19ec91e --- /dev/null +++ b/src/modules/geoip_csv.c @@ -0,0 +1,838 @@ +/* + * IRC - Internet Relay Chat, src/modules/geoip_csv.c + * (C) 2021 The UnrealIRCd Team + * + * See file AUTHORS in IRC package for additional names of + * the programmers. + * + * This program is free 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 1, or (at your option) + * any later version. + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "unrealircd.h" + +ModuleHeader MOD_HEADER + = { + "geoip_csv", + "5.0", + "GEOIP using csv data files", + "UnrealIRCd Team", + "unrealircd-6", + }; + +struct geoip_csv_config_s { + char *v4_db_file; + char *v6_db_file; + char *countries_db_file; +/* for config reading only */ + int have_config; + int have_ipv4_database; + int have_ipv6_database; + int have_countries; +}; + +struct geoip_csv_ip_range { + uint32_t addr; + uint32_t mask; + int geoid; + struct geoip_csv_ip_range *next; +}; + +struct geoip_csv_ip6_range { + uint16_t addr[8]; + uint16_t mask[8]; + int geoid; + struct geoip_csv_ip6_range *next; +}; + +struct geoip_csv_country { + char code[10]; + char name[100]; + char continent[25]; + int id; + struct geoip_csv_country *next; +}; + +/* Variables */ +struct geoip_csv_config_s geoip_csv_config; +struct geoip_csv_ip_range *geoip_csv_ip_range_list[256]; // we are keeping a separate list for each possible first octet to speed up searching +struct geoip_csv_ip6_range *geoip_csv_ip6_range_list = NULL; // for ipv6 there would be too many separate lists so just use a single one +struct geoip_csv_country *geoip_csv_country_list = NULL; + +/* Forward declarations */ +static void geoip_csv_free_ipv4(void); +static void geoip_csv_free_ipv6(void); +static void geoip_csv_free_ipv6(void); +static void geoip_csv_free_countries(void); +static void geoip_csv_free(void); +static int geoip_csv_read_ipv4(char *file); +static int geoip_csv_ip6_convert(char *ip, uint16_t out[8]); +static int geoip_csv_read_ipv6(char *file); +static int geoip_csv_read_countries(char *file); +static struct geoip_csv_country *geoip_csv_get_country(int id); +static int geoip_csv_get_v4_geoid(char *iip); +static int geoip_csv_get_v6_geoid(char *iip); +int geoip_csv_configtest(ConfigFile *cf, ConfigEntry *ce, int type, int *errs); +int geoip_csv_configposttest(int *errs); +int geoip_csv_configrun(ConfigFile *cf, ConfigEntry *ce, int type); +void geoip_csv_free(void); +GeoIPResult *geoip_lookup_csv(char *ip); + +int geoip_csv_configtest(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) +{ + ConfigEntry *cep; + int errors = 0; + int i; + + if (type != CONFIG_SET) + return 0; + + if (!ce || !ce->name) + return 0; + + if (strcmp(ce->name, "geoip-csv")) + return 0; + + geoip_csv_config.have_config = 1; + + for (cep = ce->items; cep; cep = cep->next) + { + if (!strcmp(cep->name, "ipv4-blocks-file")) + { + if (geoip_csv_config.have_ipv4_database) + { + config_error("%s:%i: duplicate item set::geoip-csv::%s", cep->file->filename, cep->line_number, cep->name); + continue; + } + if (!is_file_readable(cep->value, PERMDATADIR)) + { + config_error("%s:%i: set::geoip-csv::%s: cannot open file \"%s/%s\" for reading (%s)", cep->file->filename, cep->line_number, cep->name, PERMDATADIR, cep->value, strerror(errno)); + errors++; + continue; + } + geoip_csv_config.have_ipv4_database = 1; + continue; + } + if (!strcmp(cep->name, "ipv6-blocks-file")) + { + if (geoip_csv_config.have_ipv6_database) + { + config_error("%s:%i: duplicate item set::geoip-csv::%s", cep->file->filename, cep->line_number, cep->name); + continue; + } + if (!is_file_readable(cep->value, PERMDATADIR)) + { + config_error("%s:%i: set::geoip-csv::%s: cannot open file \"%s/%s\" for reading (%s)", cep->file->filename, cep->line_number, cep->name, PERMDATADIR, cep->value, strerror(errno)); + errors++; + continue; + } + geoip_csv_config.have_ipv6_database = 1; + continue; + } + if (!strcmp(cep->name, "countries-file")) + { + if (geoip_csv_config.have_countries) + { + config_error("%s:%i: duplicate item set::geoip-csv::%s", cep->file->filename, cep->line_number, cep->name); + continue; + } + if (!is_file_readable(cep->value, PERMDATADIR)) + { + config_error("%s:%i: set::geoip-csv::%s: cannot open file \"%s/%s\" for reading (%s)", cep->file->filename, cep->line_number, cep->name, PERMDATADIR, cep->value, strerror(errno)); + errors++; + continue; + } + geoip_csv_config.have_countries = 1; + continue; + } + config_warn("%s:%i: unknown item set::geoip-csv::%s", cep->file->filename, cep->line_number, cep->name); + } + + *errs = errors; + return errors ? -1 : 1; +} + +int geoip_csv_configposttest(int *errs) +{ + int errors = 0; + if (geoip_csv_config.have_config) + { + if (!geoip_csv_config.have_countries) + { + config_error("[geoip_csv] no countries file specified! Remove set::geoip-csv to use defaults"); + errors++; + } + if (!geoip_csv_config.have_ipv4_database && !geoip_csv_config.have_ipv6_database) + { + config_error("[geoip_csv] no database files specified! Remove set::geoip-csv to use defaults"); + errors++; + } + } else + { + safe_strdup(geoip_csv_config.v4_db_file, "GeoLite2-Country-Blocks-IPv4.csv"); + safe_strdup(geoip_csv_config.v6_db_file, "GeoLite2-Country-Blocks-IPv6.csv"); + safe_strdup(geoip_csv_config.countries_db_file, "GeoLite2-Country-Locations-en.csv"); + + if (is_file_readable(geoip_csv_config.v4_db_file, PERMDATADIR)) + { + geoip_csv_config.have_ipv4_database = 1; + } else + { + config_warn("[geoip_csv] cannot open IPv4 blocks file \"%s/%s\" for reading (%s)", PERMDATADIR, geoip_csv_config.v4_db_file, strerror(errno)); + safe_free(geoip_csv_config.v4_db_file); + } + if (is_file_readable(geoip_csv_config.v6_db_file, PERMDATADIR)) + { + geoip_csv_config.have_ipv6_database = 1; + } else + { + config_warn("[geoip_csv] cannot open IPv6 blocks file \"%s/%s\" for reading (%s)", PERMDATADIR, geoip_csv_config.v6_db_file, strerror(errno)); + safe_free(geoip_csv_config.v6_db_file); + } + if (!is_file_readable(geoip_csv_config.countries_db_file, PERMDATADIR)) + { + config_error("[geoip_csv] cannot open countries file \"%s/%s\" for reading (%s)", PERMDATADIR, geoip_csv_config.countries_db_file, strerror(errno)); + safe_free(geoip_csv_config.countries_db_file); + errors++; + } + if (!geoip_csv_config.have_ipv4_database && !geoip_csv_config.have_ipv6_database) + { + config_error("[geoip_csv] couldn't read any blocks file! Either put these in %s location " + "or specify another in set::geoip-csv config block", PERMDATADIR); + errors++; + } + } + + *errs = errors; + return errors ? -1 : 1; +} + +int geoip_csv_configrun(ConfigFile *cf, ConfigEntry *ce, int type) +{ + ConfigEntry *cep; + + if (type != CONFIG_SET) + return 0; + + if (!ce || !ce->name) + return 0; + + if (strcmp(ce->name, "geoip-csv")) + return 0; + + for (cep = ce->items; cep; cep = cep->next) + { + if (!strcmp(cep->name, "ipv4-blocks-file") && geoip_csv_config.have_ipv4_database) + safe_strdup(geoip_csv_config.v4_db_file, cep->value); + if (!strcmp(cep->name, "ipv6-blocks-file") && geoip_csv_config.have_ipv6_database) + safe_strdup(geoip_csv_config.v6_db_file, cep->value); + if (!strcmp(cep->name, "countries-file")) + safe_strdup(geoip_csv_config.countries_db_file, cep->value); + } + return 1; +} + +MOD_TEST() +{ + MARK_AS_OFFICIAL_MODULE(modinfo); + if (!CallbackAddPVoid(modinfo->handle, CALLBACKTYPE_GEOIP_LOOKUP, TO_PVOIDFUNC(geoip_lookup_csv))) + { + unreal_log(ULOG_ERROR, "geoip_csv", "GEOIP_ADD_CALLBACK_FAILED", NULL, + "geoip_csv: Could not install GEOIP_LOOKUP callback. " + "Most likely another geoip module is already loaded. " + "You can only load one!"); + return MOD_FAILED; + } + + geoip_csv_config.have_config = 0; + geoip_csv_config.have_ipv4_database = 0; + geoip_csv_config.have_ipv6_database = 0; + geoip_csv_config.have_countries = 0; + HookAdd(modinfo->handle, HOOKTYPE_CONFIGTEST, 0, geoip_csv_configtest); + HookAdd(modinfo->handle, HOOKTYPE_CONFIGPOSTTEST, 0, geoip_csv_configposttest); + return MOD_SUCCESS; +} + +MOD_INIT() +{ + MARK_AS_OFFICIAL_MODULE(modinfo); + geoip_csv_free(); + HookAdd(modinfo->handle, HOOKTYPE_CONFIGRUN, 0, geoip_csv_configrun); + return MOD_SUCCESS; +} + +MOD_LOAD() +{ + int found_good_file = 0; + + if (geoip_csv_config.v4_db_file) + { + convert_to_absolute_path(&geoip_csv_config.v4_db_file, PERMDATADIR); + if (!geoip_csv_read_ipv4(geoip_csv_config.v4_db_file)) + { + found_good_file = 1; + } + } + if (geoip_csv_config.v6_db_file) + { + convert_to_absolute_path(&geoip_csv_config.v6_db_file, PERMDATADIR); + if (!geoip_csv_read_ipv6(geoip_csv_config.v6_db_file)) + { + found_good_file = 1; + } + } + if (!geoip_csv_config.countries_db_file) + { + unreal_log(ULOG_DEBUG, "geoip_csv", "GEOIP_NO_COUNTRIES", NULL, + "[BUG] No countries file specified"); + geoip_csv_free(); + return MOD_FAILED; + } + convert_to_absolute_path(&geoip_csv_config.countries_db_file, PERMDATADIR); + if (geoip_csv_read_countries(geoip_csv_config.countries_db_file)) + { + unreal_log(ULOG_ERROR, "geoip_csv", "GEOIP_CANNOT_OPEN_DB", NULL, + "could not open required countries file!"); + geoip_csv_free(); + return MOD_FAILED; + } + + if (!found_good_file) + { + unreal_log(ULOG_ERROR, "geoip_csv", "GEOIP_CANNOT_OPEN_DB", NULL, + "could not open any database!"); + geoip_csv_free(); + return MOD_FAILED; + } + return MOD_SUCCESS; +} + +MOD_UNLOAD() +{ + geoip_csv_free(); + return MOD_SUCCESS; +} + +static void geoip_csv_free_ipv4(void) +{ + struct geoip_csv_ip_range *ptr, *oldptr; + int i; + for (i=0; i<256; i++) + { + ptr = geoip_csv_ip_range_list[i]; + geoip_csv_ip_range_list[i] = NULL; + while (ptr) + { + oldptr = ptr; + ptr = ptr->next; + safe_free(oldptr); + } + } +} + +static void geoip_csv_free_ipv6(void) +{ + struct geoip_csv_ip6_range *ptr, *oldptr; + ptr = geoip_csv_ip6_range_list; + geoip_csv_ip6_range_list = NULL; + while (ptr) + { + oldptr = ptr; + ptr = ptr->next; + safe_free(oldptr); + } +} + +static void geoip_csv_free_countries(void) +{ + struct geoip_csv_country *ptr, *oldptr; + ptr = geoip_csv_country_list; + geoip_csv_country_list = NULL; + while (ptr) + { + oldptr = ptr; + ptr = ptr->next; + safe_free(oldptr); + } +} + +static void geoip_csv_free(void) +{ + geoip_csv_free_ipv4(); + geoip_csv_free_ipv6(); + geoip_csv_free_countries(); +} + +/* reading data from files */ + +#define STR_HELPER(x) #x +#define STR(x) STR_HELPER(x) +#define BUFLEN 8191 + +static int geoip_csv_read_ipv4(char *file) +{ + FILE *u; + char buf[BUFLEN+1]; + int cidr, geoid; + char ip[24]; + char netmask[24]; + uint32_t addr; + uint32_t mask; + struct geoip_csv_ip_range *curr[256]; + struct geoip_csv_ip_range *ptr; + memset(curr, 0, sizeof(curr)); + int i; + char *filename = NULL; + + safe_strdup(filename, file); + convert_to_absolute_path(&filename, CONFDIR); + u = fopen(filename, "r"); + safe_free(filename); + if (!u) + { + config_warn("[geoip_csv] Cannot open IPv4 ranges list file"); + return 1; + } + + if (!fgets(buf, BUFLEN, u)) + { + config_warn("[geoip_csv] IPv4 list file is empty"); + fclose(u); + return 1; + } + buf[BUFLEN] = '\0'; + while (fscanf(u, "%23[^/\n]/%d,%" STR(BUFLEN) "[^\n]\n", ip, &cidr, buf) == 3) + { + if (sscanf(buf, "%d,", &geoid) != 1) + { + /* missing geoid: can happen with valid files */ + continue; + } + + if (cidr < 1 || cidr > 32) + { + config_warn("[geoip_csv] Invalid CIDR found! IP=%s CIDR=%d! Bad CSV file?", ip, cidr); + continue; + } + + if (inet_pton(AF_INET, ip, &addr) < 1) + { + config_warn("[geoip_csv] Invalid IP found! \"%s\" Bad CSV file?", ip); + continue; + } + addr = htonl(addr); + + mask = 0; + while (cidr) + { /* calculate netmask */ + mask >>= 1; + mask |= (1<<31); + cidr--; + } + + i=0; + do + { /* multiple iterations in case CIDR is <8 and we have multiple first octets matching */ + uint8_t index = addr>>24; + if (!curr[index]) + { + geoip_csv_ip_range_list[index] = safe_alloc(sizeof(struct geoip_csv_ip_range)); + curr[index] = geoip_csv_ip_range_list[index]; + } else + { + curr[index]->next = safe_alloc(sizeof(struct geoip_csv_ip_range)); + curr[index] = curr[index]->next; + } + ptr = curr[index]; + ptr->next = NULL; + ptr->addr = addr; + ptr->mask = mask; + ptr->geoid = geoid; + i++; + index++; + } while (i<=((~mask)>>24)); + } + fclose(u); + return 0; +} + +static int geoip_csv_ip6_convert(char *ip, uint16_t out[8]) +{ /* convert text to binary form */ + uint16_t tmp[8]; + int i; + if (inet_pton(AF_INET6, ip, out) < 1) + return 0; + for (i=0; i<8; i++) + { + out[i] = htons(out[i]); + } + return 1; +} + +#define IPV6_STRING_SIZE 40 + +static int geoip_csv_read_ipv6(char *file) +{ + FILE *u; + char buf[BUFLEN+1]; + char *bptr, *optr; + int cidr, geoid; + char ip[IPV6_STRING_SIZE]; + uint16_t addr[8]; + uint16_t mask[8]; + struct geoip_csv_ip6_range *curr = NULL; + struct geoip_csv_ip6_range *ptr; + int error; + int length; + char *filename = NULL; + + safe_strdup(filename, file); + convert_to_absolute_path(&filename, CONFDIR); + u = fopen(filename, "r"); + safe_free(filename); + if (!u) + { + config_warn("[geoip_csv] Cannot open IPv6 ranges list file"); + return 1; + } + if (!fgets(buf, BUFLEN, u)) + { + config_warn("[geoip_csv] IPv6 list file is empty"); + fclose(u); + return 1; + } + while (fgets(buf, BUFLEN, u)) + { + error = 0; + bptr = buf; + optr = ip; + length = 0; + while (*bptr != '/') + { + if (!*bptr) + { + error = 1; + break; + } + if (++length >= IPV6_STRING_SIZE) + { + ip[IPV6_STRING_SIZE-1] = '\0'; + config_warn("[geoip_csv] Too long IPv6 address found, starts with %s. Bad CSV file?", ip); + error = 1; + break; + } + *optr++ = *bptr++; + } + if (error) + continue; + *optr = '\0'; + bptr++; + if (!geoip_csv_ip6_convert(ip, addr)) + { + config_warn("[geoip_csv] Invalid IP found! \"%s\" Bad CSV file?", ip); + continue; + } + sscanf(bptr, "%d,%d,", &cidr, &geoid); + if (cidr < 1 || cidr > 128) + { + config_warn("[geoip_csv] Invalid CIDR found! CIDR=%d Bad CSV file?", cidr); + continue; + } + + memset(mask, 0, 16); + + int mask_bit = 0; + while (cidr) + { /* calculate netmask */ + mask[mask_bit/16] |= 1<<(15-(mask_bit%16)); + mask_bit++; + cidr--; + } + + if (!curr) + { + geoip_csv_ip6_range_list = safe_alloc(sizeof(struct geoip_csv_ip6_range)); + curr = geoip_csv_ip6_range_list; + } else + { + curr->next = safe_alloc(sizeof(struct geoip_csv_ip6_range)); + curr = curr->next; + } + ptr = curr; + ptr->next = NULL; + memcpy(ptr->addr, addr, 16); + memcpy(ptr->mask, mask, 16); + ptr->geoid = geoid; + } + fclose(u); + return 0; +} + +/* CSV fields; no STATE_GEONAME_ID because of using %d in fscanf */ +#define STATE_LOCALE_CODE 0 +#define STATE_CONTINENT_CODE 1 +#define STATE_CONTINENT_NAME 2 +#define STATE_COUNTRY_ISO_CODE 3 +#define STATE_COUNTRY_NAME 4 +#define STATE_IS_IN_EU 5 + +#define MEMBER_SIZE(type,member) sizeof(((type *)0)->member) + +static int geoip_csv_read_countries(char *file) +{ + FILE *u; + char code[MEMBER_SIZE(struct geoip_csv_country, code)]; + char continent[MEMBER_SIZE(struct geoip_csv_country, continent)]; + char name[MEMBER_SIZE(struct geoip_csv_country, name)]; + char buf[BUFLEN+1]; + int state; + int id; + struct geoip_csv_country *curr = NULL; + char *filename = NULL; + + safe_strdup(filename, file); + convert_to_absolute_path(&filename, CONFDIR); + u = fopen(filename, "r"); + safe_free(filename); + if (!u) + { + config_warn("[geoip_csv] Cannot open countries list file"); + return 1; + } + + if (!fgets(buf, BUFLEN, u)) + { + config_warn("[geoip_csv] Countries list file is empty"); + fclose(u); + return 1; + } + while (fscanf(u, "%d,%" STR(BUFLEN) "[^\n]", &id, buf) == 2) + { /* getting country ID integer and all other data in string */ + char *ptr = buf; + char *codeptr = code; + char *contptr = continent; + char *nptr = name; + int quote_open = 0; + int length = 0; + state = STATE_LOCALE_CODE; + while (*ptr) + { + switch (state) + { + case STATE_CONTINENT_NAME: + if (*ptr == ',') + goto next_line; /* no continent? */ + if (length >= MEMBER_SIZE(struct geoip_csv_country, continent)) + { + *contptr = '\0'; + config_warn("[geoip_csv] Too long continent name found: `%s`. If you are sure your countries file is correct, please file a bug report.", continent); + goto next_line; + } + *contptr = *ptr; /* scan for continent name */ + contptr++; + length++; + break; + case STATE_COUNTRY_ISO_CODE: + if (*ptr == ',') /* country code is empty */ + goto next_line; /* -- that means only the continent is specified - we ignore it completely */ + if (length >= MEMBER_SIZE(struct geoip_csv_country, code)) + { + *codeptr = '\0'; + config_warn("[geoip_csv] Too long country code found: `%s`. If you are sure your countries file is correct, please file a bug report.", code); + goto next_line; + } + *codeptr = *ptr; // scan for country code (DE, PL, US etc) + codeptr++; + length++; + break; + case STATE_COUNTRY_NAME: + goto read_country_name; + default: + break; // ignore this field and wait for next one + } + ptr++; + if (*ptr == ',') + { + length = 0; + ptr++; + state++; + } + } + read_country_name: + *codeptr = '\0'; + *contptr = '\0'; + length = 0; + while (*ptr) + { + switch (*ptr) + { + case '"': + quote_open = !quote_open; + ptr++; + continue; + case ',': + if (!quote_open) + goto end_country_name; /* we reached the end of current CSV field */ + /* fall through */ + default: + *nptr++ = *ptr++; + if (length >= MEMBER_SIZE(struct geoip_csv_country, name)) + { + *nptr = '\0'; + config_warn("[geoip_csv] Too long country name found: `%s`. If you are sure your countries file is correct, please file a bug report.", name); + goto next_line; + } + break; // scan for country name + } + } + end_country_name: + *nptr = '\0'; + if (geoip_csv_country_list) + { + curr->next = safe_alloc(sizeof(struct geoip_csv_country)); + curr = curr->next; + } else + { + geoip_csv_country_list = safe_alloc(sizeof(struct geoip_csv_country)); + curr = geoip_csv_country_list; + } + curr->next = NULL; + strcpy(curr->code, code); + strcpy(curr->name, name); + strcpy(curr->continent, continent); + curr->id = id; + next_line: continue; + } + fclose(u); + return 0; +} + +static struct geoip_csv_country *geoip_csv_get_country(int id) +{ + struct geoip_csv_country *curr = geoip_csv_country_list; + if (!curr) + return NULL; + int found = 0; + for (;curr;curr = curr->next) + { + if (curr->id == id) + { + found = 1; + break; + } + } + if (found) + return curr; + return NULL; +} + +static int geoip_csv_get_v4_geoid(char *iip) +{ + uint32_t addr, tmp_addr; + struct geoip_csv_ip_range *curr; + int i; + int found = 0; + if (inet_pton(AF_INET, iip, &addr) < 1) + { + unreal_log(ULOG_WARNING, "geoip_csv", "UNSUPPORTED_IP", NULL, "Invalid or unsupported client IP $ip", log_data_string("ip", iip)); + return 0; + } + addr = htonl(addr); + curr = geoip_csv_ip_range_list[addr>>24]; + if (curr) + { + i = 0; + for (;curr;curr = curr->next) + { + tmp_addr = addr; + tmp_addr &= curr->mask; /* mask the address to filter out net prefix only */ + if (tmp_addr == curr->addr) + { /* ... and match it to the loaded data */ + found = 1; + break; + } + i++; + } + } + if (found) + return curr->geoid; + return 0; +} + +static int geoip_csv_get_v6_geoid(char *iip) +{ + uint16_t addr[8]; + struct geoip_csv_ip6_range *curr; + int i; + int found = 0; + + if (!geoip_csv_ip6_convert(iip, addr)) + { + unreal_log(ULOG_WARNING, "geoip_csv", "UNSUPPORTED_IP", NULL, "Invalid or unsupported client IP $ip", log_data_string("ip", iip)); + return 0; + } + curr = geoip_csv_ip6_range_list; + if (curr) + { + for (;curr;curr = curr->next) + { + found = 1; + for (i=0; i<8; i++) + { + if (curr->addr[i] != (addr[i] & curr->mask[i])) + { /* compare net address to loaded data */ + found = 0; + break; + } + } + if(found) + break; + } + } + if (found) + return curr->geoid; + return 0; +} + +GeoIPResult *geoip_lookup_csv(char *ip) +{ + int geoid; + struct geoip_csv_country *country; + GeoIPResult *r; + + if (!ip) + return NULL; + + if (strchr(ip, ':')) + { + geoid = geoip_csv_get_v6_geoid(ip); + } else + { + geoid = geoip_csv_get_v4_geoid(ip); + } + + if (geoid == 0) + return NULL; + + country = geoip_csv_get_country(geoid); + + if (!country) + return NULL; + + r = safe_alloc(sizeof(GeoIPResult)); + safe_strdup(r->country_code, country->code); + safe_strdup(r->country_name, country->name); + return r; +} + diff --git a/src/modules/geoip_maxmind.c b/src/modules/geoip_maxmind.c new file mode 100644 index 0000000..06581f3 --- /dev/null +++ b/src/modules/geoip_maxmind.c @@ -0,0 +1,239 @@ +/* GEOIP maxmind module + * (C) Copyright 2021 Bram Matthys and the UnrealIRCd team + * License: GPLv2 + */ + +#include "unrealircd.h" +#include + +ModuleHeader MOD_HEADER + = { + "geoip_maxmind", + "5.0", + "GEOIP using maxmind databases", + "UnrealIRCd Team", + "unrealircd-6", + }; + +struct geoip_maxmind_config_s { + char *db_file; +/* for config reading only */ + int have_config; + int have_database; +}; + +/* Variables */ + +struct geoip_maxmind_config_s geoip_maxmind_config; +MMDB_s mmdb; + +/* Forward declarations */ +int geoip_maxmind_configtest(ConfigFile *cf, ConfigEntry *ce, int type, int *errs); +int geoip_maxmind_configposttest(int *errs); +int geoip_maxmind_configrun(ConfigFile *cf, ConfigEntry *ce, int type); +void geoip_maxmind_free(void); +GeoIPResult *geoip_lookup_maxmind(char *ip); + +int geoip_maxmind_configtest(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) +{ + ConfigEntry *cep; + int errors = 0; + int i; + + if (type != CONFIG_SET) + return 0; + + if (!ce || !ce->name) + return 0; + + if (strcmp(ce->name, "geoip-maxmind")) + return 0; + + geoip_maxmind_config.have_config = 1; + + for (cep = ce->items; cep; cep = cep->next) + { + if (!strcmp(cep->name, "database")) + { + if (geoip_maxmind_config.have_database) + { + config_error("%s:%i: duplicate item set::geoip-maxmind::%s", cep->file->filename, cep->line_number, cep->name); + continue; + } + if (!is_file_readable(cep->value, PERMDATADIR)) + { + config_error("%s:%i: set::geoip-maxmind::%s: cannot open file \"%s/%s\" for reading (%s)", cep->file->filename, cep->line_number, cep->name, PERMDATADIR, cep->value, strerror(errno)); + errors++; + continue; + } + geoip_maxmind_config.have_database = 1; + continue; + } + config_warn("%s:%i: unknown item set::geoip-maxmind::%s", cep->file->filename, cep->line_number, cep->name); + } + + *errs = errors; + return errors ? -1 : 1; +} + +int geoip_maxmind_configposttest(int *errs) +{ + int errors = 0; + if (geoip_maxmind_config.have_config) + { + if (!geoip_maxmind_config.have_database) + { + config_error("geoip_maxmind: no database file specified! Remove set::geoip-maxmind to use defaults"); + errors++; + } + } else + { + safe_strdup(geoip_maxmind_config.db_file, "GeoLite2-Country.mmdb"); + + if (is_file_readable(geoip_maxmind_config.db_file, PERMDATADIR)) + { + geoip_maxmind_config.have_database = 1; + } else + { + config_error("[geoip_maxmind] cannot open database file \"%s/%s\" for reading (%s)", PERMDATADIR, geoip_maxmind_config.db_file, strerror(errno)); + safe_free(geoip_maxmind_config.db_file); + errors++; + } + } + + *errs = errors; + return errors ? -1 : 1; +} + +int geoip_maxmind_configrun(ConfigFile *cf, ConfigEntry *ce, int type) +{ + ConfigEntry *cep; + + if (type != CONFIG_SET) + return 0; + + if (!ce || !ce->name) + return 0; + + if (strcmp(ce->name, "geoip-maxmind")) + return 0; + + for (cep = ce->items; cep; cep = cep->next) + { + if (!strcmp(cep->name, "database") && geoip_maxmind_config.have_database) + safe_strdup(geoip_maxmind_config.db_file, cep->value); + } + return 1; +} + +MOD_TEST() +{ + MARK_AS_OFFICIAL_MODULE(modinfo); + if (!CallbackAddPVoid(modinfo->handle, CALLBACKTYPE_GEOIP_LOOKUP, TO_PVOIDFUNC(geoip_lookup_maxmind))) + { + unreal_log(ULOG_ERROR, "geoip_maxmind", "GEOIP_ADD_CALLBACK_FAILED", NULL, + "geoip_maxmind: Could not install GEOIP_LOOKUP callback. " + "Most likely another geoip module is already loaded. " + "You can only load one!"); + return MOD_FAILED; + } + + geoip_maxmind_config.have_config = 0; + geoip_maxmind_config.have_database = 0; + HookAdd(modinfo->handle, HOOKTYPE_CONFIGTEST, 0, geoip_maxmind_configtest); + HookAdd(modinfo->handle, HOOKTYPE_CONFIGPOSTTEST, 0, geoip_maxmind_configposttest); + return MOD_SUCCESS; +} + +MOD_INIT() +{ + MARK_AS_OFFICIAL_MODULE(modinfo); + HookAdd(modinfo->handle, HOOKTYPE_CONFIGRUN, 0, geoip_maxmind_configrun); + return MOD_SUCCESS; +} + +MOD_LOAD() +{ + geoip_maxmind_free(); + convert_to_absolute_path(&geoip_maxmind_config.db_file, PERMDATADIR); + + int status = MMDB_open(geoip_maxmind_config.db_file, MMDB_MODE_MMAP, &mmdb); + + if (status != MMDB_SUCCESS) { + int save_err = errno; + unreal_log(ULOG_WARNING, "geoip_maxmind", "GEOIP_CANNOT_OPEN_DB", NULL, + "Could not open '$filename' - $maxmind_error; IO error: $io_error", + log_data_string("filename", geoip_maxmind_config.db_file), + log_data_string("maxmind_error", MMDB_strerror(status)), + log_data_string("io_error", (status == MMDB_IO_ERROR)?strerror(save_err):"none")); + return MOD_FAILED; + } + return MOD_SUCCESS; +} + +MOD_UNLOAD() +{ + geoip_maxmind_free(); + return MOD_SUCCESS; +} + +void geoip_maxmind_free(void) +{ + MMDB_close(&mmdb); +} + +GeoIPResult *geoip_lookup_maxmind(char *ip) +{ + int gai_error, mmdb_error, status; + MMDB_lookup_result_s result; + MMDB_entry_data_s country_code; + MMDB_entry_data_s country_name; + char *country_code_str, *country_name_str; + GeoIPResult *r; + + if (!ip) + return NULL; + + result = MMDB_lookup_string(&mmdb, ip, &gai_error, &mmdb_error); + if (gai_error) + { + unreal_log(ULOG_DEBUG, "geoip_maxmind", "GEOIP_DB_ERROR", NULL, + "libmaxminddb: getaddrinfo error for $ip: $error", + log_data_string("ip", ip), + log_data_string("error", gai_strerror(gai_error))); + return NULL; + } + + if (mmdb_error != MMDB_SUCCESS) + { + unreal_log(ULOG_DEBUG, "geoip_maxmind", "GEOIP_DB_ERROR", NULL, + "libmaxminddb: library error for $ip: $error", + log_data_string("ip", ip), + log_data_string("error", MMDB_strerror(mmdb_error))); + return NULL; + } + + if (!result.found_entry) /* no result */ + return NULL; + + status = MMDB_get_value(&result.entry, &country_code, "country", "iso_code", NULL); + if (status != MMDB_SUCCESS || !country_code.has_data || country_code.type != MMDB_DATA_TYPE_UTF8_STRING) + return NULL; + status = MMDB_get_value(&result.entry, &country_name, "country", "names", "en", NULL); + if (status != MMDB_SUCCESS || !country_name.has_data || country_name.type != MMDB_DATA_TYPE_UTF8_STRING) + return NULL; + + /* these results are not null-terminated */ + country_code_str = safe_alloc(country_code.data_size + 1); + country_name_str = safe_alloc(country_name.data_size + 1); + memcpy(country_code_str, country_code.utf8_string, country_code.data_size); + country_code_str[country_code.data_size] = '\0'; + memcpy(country_name_str, country_name.utf8_string, country_name.data_size); + country_name_str[country_name.data_size] = '\0'; + + r = safe_alloc(sizeof(GeoIPResult)); + r->country_code = country_code_str; + r->country_name = country_name_str; + return r; +} + diff --git a/src/modules/globops.c b/src/modules/globops.c index 8afcb1f..284e62c 100644 --- a/src/modules/globops.c +++ b/src/modules/globops.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", "command /globops", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -57,9 +57,7 @@ MOD_UNLOAD() */ CMD_FUNC(cmd_globops) { - char *message; - - message = parc > 1 ? parv[1] : NULL; + const char *message = parc > 1 ? parv[1] : NULL; if (BadPtr(message)) { diff --git a/src/modules/help.c b/src/modules/help.c index 65f2976..7d0e496 100644 --- a/src/modules/help.c +++ b/src/modules/help.c @@ -33,7 +33,7 @@ ModuleHeader MOD_HEADER "5.0", "command /help", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -57,7 +57,7 @@ MOD_UNLOAD() #define HDR(str) sendto_one(client, NULL, ":%s 290 %s :%s", me.name, client->name, str); #define SND(str) sendto_one(client, NULL, ":%s 292 %s :%s", me.name, client->name, str); -ConfigItem_help *find_Help(char *command) +ConfigItem_help *find_Help(const char *command) { ConfigItem_help *help; @@ -80,7 +80,7 @@ ConfigItem_help *find_Help(char *command) return NULL; } -void parse_help(Client *client, char *name, char *help) +void parse_help(Client *client, const char *help) { ConfigItem_help *helpitem; MOTDLine *text; @@ -109,7 +109,7 @@ void parse_help(Client *client, char *name, char *help) SND(" We're sorry, we don't have help available for the command you requested."); SND(" -"); sendto_one(client, NULL, ":%s 292 %s : ***** Go to %s if you have any further questions *****", - me.name, client->name, helpchan); + me.name, client->name, HELP_CHANNEL); SND(" -"); return; } @@ -131,7 +131,7 @@ void parse_help(Client *client, char *name, char *help) */ CMD_FUNC(cmd_help) { - char *helptopic; + const char *helptopic; if (!MyUser(client)) return; /* never remote */ @@ -141,5 +141,5 @@ CMD_FUNC(cmd_help) if (helptopic && (*helptopic == '?')) helptopic++; - parse_help(client, client->name, BadPtr(helptopic) ? NULL : helptopic); + parse_help(client, BadPtr(helptopic) ? NULL : helptopic); } diff --git a/src/modules/hideserver.c b/src/modules/hideserver.c index e0231a1..4e22bca 100644 --- a/src/modules/hideserver.c +++ b/src/modules/hideserver.c @@ -49,7 +49,7 @@ ModuleHeader MOD_HEADER "5.0", "Hide servers from /MAP & /LINKS", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; static void InitConf() @@ -95,10 +95,10 @@ MOD_INIT() MOD_LOAD() { - if (!CommandOverrideAdd(MyMod, "MAP", override_map)) + if (!CommandOverrideAdd(MyMod, "MAP", 0, override_map)) return MOD_FAILED; - if (!CommandOverrideAdd(MyMod, "LINKS", override_links)) + if (!CommandOverrideAdd(MyMod, "LINKS", 0, override_links)) return MOD_FAILED; return MOD_SUCCESS; @@ -118,35 +118,35 @@ static int cb_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) if (type == CONFIG_MAIN) { - if (!strcmp(ce->ce_varname, "hideserver")) + if (!strcmp(ce->name, "hideserver")) { - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "hide")) + if (!strcmp(cep->name, "hide")) { /* No checking needed */ } - else if (!cep->ce_vardata) + else if (!cep->value) { config_error("%s:%i: %s::%s without value", - cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, - ce->ce_varname, cep->ce_varname); + cep->file->filename, + cep->line_number, + ce->name, cep->name); errors++; continue; } - else if (!strcmp(cep->ce_varname, "disable-map")) + else if (!strcmp(cep->name, "disable-map")) ; - else if (!strcmp(cep->ce_varname, "disable-links")) + else if (!strcmp(cep->name, "disable-links")) ; - else if (!strcmp(cep->ce_varname, "map-deny-message")) + else if (!strcmp(cep->name, "map-deny-message")) ; - else if (!strcmp(cep->ce_varname, "links-deny-message")) + else if (!strcmp(cep->name, "links-deny-message")) ; else { config_error("%s:%i: unknown directive hideserver::%s", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_varname); + cep->file->filename, cep->line_number, cep->name); errors++; } } @@ -165,31 +165,31 @@ static int cb_conf(ConfigFile *cf, ConfigEntry *ce, int type) if (type == CONFIG_MAIN) { - if (!strcmp(ce->ce_varname, "hideserver")) + if (!strcmp(ce->name, "hideserver")) { - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "disable-map")) - Settings.disable_map = config_checkval(cep->ce_vardata, CFG_YESNO); - else if (!strcmp(cep->ce_varname, "disable-links")) - Settings.disable_links = config_checkval(cep->ce_vardata, CFG_YESNO); - else if (!strcmp(cep->ce_varname, "map-deny-message")) + if (!strcmp(cep->name, "disable-map")) + Settings.disable_map = config_checkval(cep->value, CFG_YESNO); + else if (!strcmp(cep->name, "disable-links")) + Settings.disable_links = config_checkval(cep->value, CFG_YESNO); + else if (!strcmp(cep->name, "map-deny-message")) { - safe_strdup(Settings.map_deny_message, cep->ce_vardata); + safe_strdup(Settings.map_deny_message, cep->value); } - else if (!strcmp(cep->ce_varname, "links-deny-message")) + else if (!strcmp(cep->name, "links-deny-message")) { - safe_strdup(Settings.links_deny_message, cep->ce_vardata); + safe_strdup(Settings.links_deny_message, cep->value); } - else if (!strcmp(cep->ce_varname, "hide")) + else if (!strcmp(cep->name, "hide")) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { - if (!strcasecmp(cepp->ce_varname, me.name)) + if (!strcasecmp(cepp->name, me.name)) continue; ca = safe_alloc(sizeof(ConfigItem_ulines)); - safe_strdup(ca->servername, cepp->ce_varname); + safe_strdup(ca->servername, cepp->name); AddListItem(ca, HiddenServers); } } @@ -231,7 +231,7 @@ static void dump_map(Client *client, Client *server, char *mask, int prompt_leng else { sendnumeric(client, RPL_MAP, prompt, - length, server->name, server->serv->users, IsOper(client) ? server->id : ""); + length, server->name, server->server->users, IsOper(client) ? server->id : ""); cnt = 0; } @@ -248,7 +248,7 @@ static void dump_map(Client *client, Client *server, char *mask, int prompt_leng list_for_each_entry(acptr, &global_server_list, client_node) { - if (acptr->srvptr != server || + if (acptr->uplink != server || (IsULine(acptr) && HIDE_ULINES && !ValidatePermissionsForPath("server:info:map:ulines",client,NULL,NULL,NULL))) continue; if (FindHiddenServer(acptr->name)) @@ -263,7 +263,7 @@ static void dump_map(Client *client, Client *server, char *mask, int prompt_leng continue; if (FindHiddenServer(acptr->name)) break; - if (acptr->srvptr != server) + if (acptr->uplink != server) continue; if (!IsMap(acptr)) continue; @@ -284,7 +284,7 @@ void dump_flat_map(Client *client, Client *server, int length) hide_ulines = (HIDE_ULINES && !ValidatePermissionsForPath("server:info:map:ulines",client,NULL,NULL,NULL)) ? 1 : 0; - sendnumeric(client, RPL_MAP, "", length, server->name, server->serv->users, ""); + sendnumeric(client, RPL_MAP, "", length, server->name, server->server->users, ""); list_for_each_entry(acptr, &global_server_list, client_node) { @@ -304,7 +304,7 @@ void dump_flat_map(Client *client, Client *server, int length) break; if (--cnt == 0) *buf = '`'; - sendnumeric(client, RPL_MAP, buf, length-2, acptr->name, acptr->serv->users, ""); + sendnumeric(client, RPL_MAP, buf, length-2, acptr->name, acptr->server->users, ""); } } @@ -388,7 +388,7 @@ CMD_OVERRIDE_FUNC(override_links) sendnumeric(client, RPL_LINKS, acptr->name, me.name, 1, (acptr->info[0] ? acptr->info : "(Unknown Location)")); else - sendnumeric(client, RPL_LINKS, acptr->name, acptr->serv->up, + sendnumeric(client, RPL_LINKS, acptr->name, acptr->uplink->name, acptr->hopcount, (acptr->info[0] ? acptr->info : "(Unknown Location)")); } diff --git a/src/modules/history.c b/src/modules/history.c index e8311e0..d99823e 100644 --- a/src/modules/history.c +++ b/src/modules/history.c @@ -34,7 +34,7 @@ ModuleHeader MOD_HEADER "5.0", "Simple history command for end-users", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; #define HISTORY_LINES_DEFAULT 100 @@ -76,13 +76,16 @@ CMD_FUNC(cmd_history) Channel *channel; int lines = HISTORY_LINES_DEFAULT; + if (!MyUser(client)) + return; + if ((parc < 2) || BadPtr(parv[1])) { history_usage(client); return; } - channel = find_channel(parv[1], NULL); + channel = find_channel(parv[1]); if (!channel) { sendnumeric(client, ERR_NOSUCHCHANNEL, parv[1]); @@ -91,13 +94,13 @@ CMD_FUNC(cmd_history) if (!IsMember(client, channel)) { - sendnumeric(client, ERR_NOTONCHANNEL, channel->chname); + sendnumeric(client, ERR_NOTONCHANNEL, channel->name); return; } if (!has_channel_mode(channel, 'H')) { - sendnotice(client, "Channel %s does not have channel mode +H set", channel->chname); + sendnotice(client, "Channel %s does not have channel mode +H set", channel->name); return; } @@ -125,7 +128,7 @@ CMD_FUNC(cmd_history) filter.cmd = HFC_SIMPLE; filter.last_lines = lines; - if ((r = history_request(channel->chname, &filter))) + if ((r = history_request(channel->name, &filter))) { history_send_result(client, r); free_history_result(r); diff --git a/src/modules/history_backend_mem.c b/src/modules/history_backend_mem.c index 897da65..9fd5117 100644 --- a/src/modules/history_backend_mem.c +++ b/src/modules/history_backend_mem.c @@ -17,7 +17,7 @@ ModuleHeader MOD_HEADER "2.0", "History backend: memory", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Defines */ @@ -97,16 +97,16 @@ static void freecfg(struct cfgstruct *cfg); static void hbm_init_hashes(ModuleInfo *m); static void init_history_storage(ModuleInfo *modinfo); int hbm_modechar_del(Channel *channel, int modechar); -int hbm_history_add(char *object, MessageTag *mtags, char *line); +int hbm_history_add(const char *object, MessageTag *mtags, const char *line); int hbm_history_cleanup(HistoryLogObject *h); -HistoryResult *hbm_history_request(char *object, HistoryFilter *filter); -int hbm_history_destroy(char *object); -int hbm_history_set_limit(char *object, int max_lines, long max_time); +HistoryResult *hbm_history_request(const char *object, HistoryFilter *filter); +int hbm_history_destroy(const char *object); +int hbm_history_set_limit(const char *object, int max_lines, long max_time); EVENT(history_mem_clean); EVENT(history_mem_init); static int hbm_read_masterdb(void); static void hbm_read_dbs(void); -static int hbm_read_db(char *fname); +static int hbm_read_db(const char *fname); static int hbm_write_masterdb(void); static int hbm_write_db(HistoryLogObject *h); static void hbm_delete_db(HistoryLogObject *h); @@ -200,7 +200,7 @@ EVENT(history_mem_init) MOD_UNLOAD() { - if (loop.ircd_terminating) + if (loop.terminating) hbm_flush(); freecfg(&test); freecfg(&cfg); @@ -235,6 +235,7 @@ static void setcfg(struct cfgstruct *cfg) static void freecfg(struct cfgstruct *cfg) { + safe_free(cfg->masterdb); safe_free(cfg->directory); safe_free(cfg->db_secret); } @@ -264,40 +265,40 @@ int hbm_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) { int errors = 0; - if ((type != CONFIG_SET_HISTORY_CHANNEL) || !ce || !ce->ce_varname) + if ((type != CONFIG_SET_HISTORY_CHANNEL) || !ce || !ce->name) return 0; - if (!strcmp(ce->ce_varname, "persist")) + if (!strcmp(ce->name, "persist")) { - if (!ce->ce_vardata) + if (!ce->value) { config_error("%s:%i: missing parameter", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); errors++; } else { - test.persist = config_checkval(ce->ce_vardata, CFG_YESNO); + test.persist = config_checkval(ce->value, CFG_YESNO); } } else - if (!strcmp(ce->ce_varname, "db-secret")) + if (!strcmp(ce->name, "db-secret")) { - char *err; - if ((err = unrealdb_test_secret(ce->ce_vardata))) + const char *err; + if ((err = unrealdb_test_secret(ce->value))) { - config_error("%s:%i: set::history::channel::db-secret: %s", ce->ce_fileptr->cf_filename, ce->ce_varlinenum, err); + config_error("%s:%i: set::history::channel::db-secret: %s", ce->file->filename, ce->line_number, err); errors++; } - safe_strdup(test.db_secret, ce->ce_vardata); + safe_strdup(test.db_secret, ce->value); } else - if (!strcmp(ce->ce_varname, "directory")) // or "path" ? + if (!strcmp(ce->name, "directory")) // or "path" ? { - if (!ce->ce_vardata) + if (!ce->value) { config_error("%s:%i: missing parameter", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); errors++; } else { - safe_strdup(test.directory, ce->ce_vardata); + safe_strdup(test.directory, ce->value); hbm_set_masterdb_filename(&test); } } else @@ -322,7 +323,7 @@ int hbm_config_posttest(int *errs) } else if (!test.db_secret && test.persist) { - config_error("set::history::channel::db-secret needs to be set."); // TODO: REFER TO FAQ OR OTHER ENTRY!!!! + config_error("set::history::channel::db-secret needs to be set."); errors++; } else if (test.db_secret && test.persist) @@ -367,22 +368,22 @@ hbm_config_posttest_end: /** Configure ourselves based on the set::history::channel settings */ int hbm_config_run(ConfigFile *cf, ConfigEntry *ce, int type) { - if ((type != CONFIG_SET_HISTORY_CHANNEL) || !ce || !ce->ce_varname) + if ((type != CONFIG_SET_HISTORY_CHANNEL) || !ce || !ce->name) return 0; - if (!strcmp(ce->ce_varname, "persist")) + if (!strcmp(ce->name, "persist")) { - cfg.persist = config_checkval(ce->ce_vardata, CFG_YESNO); + cfg.persist = config_checkval(ce->value, CFG_YESNO); } else - if (!strcmp(ce->ce_varname, "directory")) // or "path" ? + if (!strcmp(ce->name, "directory")) // or "path" ? { - safe_strdup(cfg.directory, ce->ce_vardata); + safe_strdup(cfg.directory, ce->value); convert_to_absolute_path(&cfg.directory, PERMDATADIR); hbm_set_masterdb_filename(&cfg); } else - if (!strcmp(ce->ce_varname, "db-secret")) + if (!strcmp(ce->name, "db-secret")) { - safe_strdup(cfg.db_secret, ce->ce_vardata); + safe_strdup(cfg.db_secret, ce->value); } else { return 0; /* unknown option to us, let another module handle it */ @@ -403,7 +404,7 @@ int hbm_rehash_complete(void) return 0; } -char *history_storage_capability_parameter(Client *client) +const char *history_storage_capability_parameter(Client *client) { static char buf[128]; @@ -426,12 +427,12 @@ static void init_history_storage(ModuleInfo *modinfo) ClientCapabilityAdd(modinfo->handle, &cap, NULL); } -uint64_t hbm_hash(char *object) +uint64_t hbm_hash(const char *object) { return siphash_nocase(object, siphashkey_history_backend_mem) % HISTORY_BACKEND_MEM_HASH_TABLE_SIZE; } -HistoryLogObject *hbm_find_object(char *object) +HistoryLogObject *hbm_find_object(const char *object) { int hashv = hbm_hash(object); HistoryLogObject *h; @@ -444,7 +445,7 @@ HistoryLogObject *hbm_find_object(char *object) return NULL; } -HistoryLogObject *hbm_find_or_add_object(char *object) +HistoryLogObject *hbm_find_or_add_object(const char *object) { int hashv = hbm_hash(object); HistoryLogObject *h; @@ -480,7 +481,7 @@ int hbm_modechar_del(Channel *channel, int modechar) if (!cfg.persist) return 0; - if ((modechar == 'P') && ((h = hbm_find_object(channel->chname)))) + if ((modechar == 'P') && ((h = hbm_find_object(channel->name)))) { /* Channel went from +P to -P and also has channel history: delete the history file */ hbm_delete_db(h); @@ -538,7 +539,7 @@ void hbm_duplicate_mtags(HistoryLogLine *l, MessageTag *m) } /** Add a line to a history object */ -void hbm_history_add_line(HistoryLogObject *h, MessageTag *mtags, char *line) +void hbm_history_add_line(HistoryLogObject *h, MessageTag *mtags, const char *line) { HistoryLogLine *l = safe_alloc(sizeof(HistoryLogLine) + strlen(line)); strcpy(l->line, line); /* safe, see memory allocation above ^ */ @@ -589,12 +590,14 @@ void hbm_history_del_line(HistoryLogObject *h, HistoryLogLine *l) } /** Add history entry */ -int hbm_history_add(char *object, MessageTag *mtags, char *line) +int hbm_history_add(const char *object, MessageTag *mtags, const char *line) { HistoryLogObject *h = hbm_find_or_add_object(object); if (!h->max_lines) { - sendto_realops("hbm_history_add() for '%s', which has no limit", h->name); + unreal_log(ULOG_WARNING, "history", "BUG_HISTORY_ADD_NO_LIMIT", NULL, + "[BUG] hbm_history_add() called for $object, which has no limit set", + log_data_string("object", h->name)); #ifdef DEBUGMODE abort(); #else @@ -955,7 +958,7 @@ static int hbm_return_between(HistoryResult *r, HistoryLogObject *h, HistoryFilt return 0; } -HistoryResult *hbm_history_request(char *object, HistoryFilter *filter) +HistoryResult *hbm_history_request(const char *object, HistoryFilter *filter) { HistoryResult *r; HistoryLogObject *h = hbm_find_object(object); @@ -1050,7 +1053,7 @@ int hbm_history_cleanup(HistoryLogObject *h) return 1; } -int hbm_history_destroy(char *object) +int hbm_history_destroy(const char *object) { HistoryLogObject *h = hbm_find_object(object); HistoryLogLine *l, *l_next; @@ -1075,7 +1078,7 @@ int hbm_history_destroy(char *object) } /** Set new limit on history object */ -int hbm_history_set_limit(char *object, int max_lines, long max_time) +int hbm_history_set_limit(const char *object, int max_lines, long max_time) { HistoryLogObject *h = hbm_find_or_add_object(object); h->max_lines = max_lines; @@ -1104,8 +1107,6 @@ static int hbm_read_masterdb(void) { /* Database does not exist. Could be first boot */ config_warn("[history] No database present at '%s', will start a new one", test.masterdb); - // TODO: maybe check for condition where 'master.db' does not exist but - // there are other .db files. if (!hbm_write_masterdb()) return 0; /* fatal error */ return 1; @@ -1125,10 +1126,10 @@ static int hbm_read_masterdb(void) !unrealdb_read_str(db, &prehash) || !unrealdb_read_str(db, &posthash)) { - safe_free(prehash); - safe_free(posthash); config_error("[history] Read error from database file '%s': %s", test.masterdb, unrealdb_get_error_string()); + safe_free(prehash); + safe_free(posthash); unrealdb_close(db); return 0; } @@ -1138,14 +1139,24 @@ static int hbm_read_masterdb(void) { config_error("[history] Read error from database file '%s': unexpected values encountered", test.masterdb); + safe_free(prehash); + safe_free(posthash); return 0; } /* Now, safely switch over.. */ - safe_free(hbm_prehash); - safe_free(hbm_posthash); - hbm_prehash = prehash; - hbm_posthash = posthash; + if (hbm_prehash && !strcmp(hbm_prehash, prehash) && hbm_posthash && !strcmp(hbm_posthash, posthash)) + { + /* Identical sets */ + safe_free(prehash); + safe_free(posthash); + } else { + /* Diffferent */ + safe_free(hbm_prehash); + safe_free(hbm_posthash); + hbm_prehash = prehash; + hbm_posthash = posthash; + } return 1; } @@ -1275,7 +1286,7 @@ static void hbm_read_dbs(void) /** Read a channel history db file */ -static int hbm_read_db(char *fname) +static int hbm_read_db(const char *fname) { UnrealDB *db = NULL; // header @@ -1475,7 +1486,7 @@ EVENT(history_mem_clean) } while(loopcnt++ < HISTORY_CLEAN_PER_LOOP); } -char *hbm_history_filename(HistoryLogObject *h) +const char *hbm_history_filename(HistoryLogObject *h) { static char fname[512]; char oname[OBJECTLEN+1]; @@ -1495,9 +1506,10 @@ char *hbm_history_filename(HistoryLogObject *h) #define WARN_WRITE_ERROR(fname) \ do { \ - sendto_realops_and_log("[history] Error writing to temporary database file " \ - "'%s': %s (DATABASE NOT SAVED)", \ - fname, unrealdb_get_error_string()); \ + unreal_log(ULOG_ERROR, "history", "HISTORYDB_FILE_WRITE_ERROR", NULL, \ + "[historydb] Error writing to temporary database file $filename: $system_error", \ + log_data_string("filename", fname), \ + log_data_string("system_error", unrealdb_get_error_string())); \ } while(0) #define W_SAFE(x) \ @@ -1515,7 +1527,7 @@ char *hbm_history_filename(HistoryLogObject *h) static int hbm_write_db(HistoryLogObject *h) { UnrealDB *db; - char *realfname; + const char *realfname; char tmpfname[512]; HistoryLogLine *l; MessageTag *m; @@ -1524,7 +1536,7 @@ static int hbm_write_db(HistoryLogObject *h) if (!cfg.db_secret) abort(); - channel = find_channel(h->name, NULL); + channel = find_channel(h->name); if (!channel || !has_channel_mode(channel, 'P')) return 1; /* Don't save this channel, pretend success */ @@ -1575,7 +1587,7 @@ static int hbm_write_db(HistoryLogObject *h) #endif if (rename(tmpfname, realfname) < 0) { - sendto_realops_and_log("[history] Error renaming '%s' to '%s': %s (HISTORY NOT SAVED)", + config_error("[history] Error renaming '%s' to '%s': %s (HISTORY NOT SAVED)", tmpfname, realfname, strerror(errno)); return 0; } @@ -1588,7 +1600,7 @@ static int hbm_write_db(HistoryLogObject *h) static void hbm_delete_db(HistoryLogObject *h) { UnrealDB *db; - char *fname; + const char *fname; if (!cfg.persist || !hbm_prehash || !hbm_posthash) { #ifdef DEBUGMODE diff --git a/src/modules/history_backend_null.c b/src/modules/history_backend_null.c index 2df4513..7136ce2 100644 --- a/src/modules/history_backend_null.c +++ b/src/modules/history_backend_null.c @@ -16,14 +16,14 @@ ModuleHeader MOD_HEADER "2.0", "History backend: null/none", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Forward declarations */ -int hbn_history_set_limit(char *object, int max_lines, long max_time); -int hbn_history_add(char *object, MessageTag *mtags, char *line); -HistoryResult *hbn_history_request(char *object, HistoryFilter *filter); -int hbn_history_destroy(char *object); +int hbn_history_set_limit(const char *object, int max_lines, long max_time); +int hbn_history_add(const char *object, MessageTag *mtags, const char *line); +HistoryResult *hbn_history_request(const char *object, HistoryFilter *filter); +int hbn_history_destroy(const char *object); MOD_INIT() { @@ -53,22 +53,22 @@ MOD_UNLOAD() return MOD_SUCCESS; } -int hbn_history_add(char *object, MessageTag *mtags, char *line) +int hbn_history_add(const char *object, MessageTag *mtags, const char *line) { return 1; } -HistoryResult *hbn_history_request(char *object, HistoryFilter *filter) +HistoryResult *hbn_history_request(const char *object, HistoryFilter *filter) { return NULL; } -int hbn_history_set_limit(char *object, int max_lines, long max_time) +int hbn_history_set_limit(const char *object, int max_lines, long max_time) { return 1; } -int hbn_history_destroy(char *object) +int hbn_history_destroy(const char *object) { return 1; } diff --git a/src/modules/ident_lookup.c b/src/modules/ident_lookup.c index 93ec0ed..c729bcc 100644 --- a/src/modules/ident_lookup.c +++ b/src/modules/ident_lookup.c @@ -10,7 +10,7 @@ ModuleHeader MOD_HEADER "1.0", "Ident lookups (RFC1413)", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Forward declarations */ @@ -43,7 +43,6 @@ MOD_UNLOAD() static void ident_lookup_failed(Client *client) { - Debug((DEBUG_NOTICE, "ident_lookup_failed() for %p", client)); ircstats.is_abad++; if (client->local->authfd != -1) { @@ -68,12 +67,12 @@ static EVENT(check_ident_timeout) if (IsIdentLookupSent(client)) { /* set::ident::connect-timeout */ - if ((TStime() - client->local->firsttime) > IDENT_CONNECT_TIMEOUT) + if ((TStime() - client->local->creationtime) > IDENT_CONNECT_TIMEOUT) ident_lookup_failed(client); } else { /* set::ident::read-timeout */ - if ((TStime() - client->local->firsttime) > IDENT_READ_TIMEOUT) + if ((TStime() - client->local->creationtime) > IDENT_READ_TIMEOUT) ident_lookup_failed(client); } } @@ -93,7 +92,8 @@ static int ident_lookup_connect(Client *client) } if (++OpenFiles >= maxclients+1) { - sendto_ops("Can't allocate fd, too many connections."); + unreal_log(ULOG_FATAL, "io", "IDENT_ERROR_MAXCLIENTS", client, + "Cannot do ident connection for $client.details: All connections in use"); fd_close(client->local->authfd); --OpenFiles; client->local->authfd = -1; diff --git a/src/modules/invite.c b/src/modules/invite.c index 906f5cc..feb99e3 100644 --- a/src/modules/invite.c +++ b/src/modules/invite.c @@ -22,9 +22,27 @@ #include "unrealircd.h" +#define MSG_INVITE "INVITE" + +#define CLIENT_INVITES(client) (moddata_local_client(client, userInvitesMD).ptr) +#define CHANNEL_INVITES(channel) (moddata_channel(channel, channelInvitesMD).ptr) + +ModDataInfo *userInvitesMD; +ModDataInfo *channelInvitesMD; +long CAP_INVITE_NOTIFY = 0L; +int invite_always_notify = 0; + CMD_FUNC(cmd_invite); -#define MSG_INVITE "INVITE" +void invite_free(ModData *md); +int invite_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs); +int invite_config_run(ConfigFile *cf, ConfigEntry *ce, int type); +void add_invite(Client *from, Client *to, Channel *channel, MessageTag *mtags); +void del_invite(Client *client, Channel *channel); +static int invite_channel_destroy(Channel *channel, int *should_destroy); +int invite_user_quit(Client *client, MessageTag *mtags, const char *comment); +int invite_user_join(Client *client, Channel *channel, MessageTag *mtags); +int invite_is_invited(Client *client, Channel *channel, int *invited); ModuleHeader MOD_HEADER = { @@ -32,13 +50,63 @@ ModuleHeader MOD_HEADER "5.0", "command /invite", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; +MOD_TEST() +{ + HookAdd(modinfo->handle, HOOKTYPE_CONFIGTEST, 0, invite_config_test); + return MOD_SUCCESS; +} + MOD_INIT() { - CommandAdd(modinfo->handle, MSG_INVITE, cmd_invite, MAXPARA, CMD_USER); + ClientCapabilityInfo cap; + ClientCapability *c; + ModDataInfo mreq; + MARK_AS_OFFICIAL_MODULE(modinfo); + + CommandAdd(modinfo->handle, MSG_INVITE, cmd_invite, MAXPARA, CMD_USER|CMD_SERVER); + + memset(&cap, 0, sizeof(cap)); + cap.name = "invite-notify"; + c = ClientCapabilityAdd(modinfo->handle, &cap, &CAP_INVITE_NOTIFY); + if (!c) + { + config_error("[%s] Failed to request invite-notify cap: %s", MOD_HEADER.name, ModuleGetErrorStr(modinfo->handle)); + return MOD_FAILED; + } + + memset(&mreq, 0 , sizeof(mreq)); + mreq.type = MODDATATYPE_LOCAL_CLIENT; + mreq.name = "invite", + mreq.free = invite_free; + userInvitesMD = ModDataAdd(modinfo->handle, mreq); + if (!userInvitesMD) + { + config_error("[%s] Failed to request user invite moddata: %s", MOD_HEADER.name, ModuleGetErrorStr(modinfo->handle)); + return MOD_FAILED; + } + + memset(&mreq, 0 , sizeof(mreq)); + mreq.type = MODDATATYPE_CHANNEL; + mreq.name = "invite", + mreq.free = invite_free; + channelInvitesMD = ModDataAdd(modinfo->handle, mreq); + if (!channelInvitesMD) + { + config_error("[%s] Failed to request channel invite moddata: %s", MOD_HEADER.name, ModuleGetErrorStr(modinfo->handle)); + return MOD_FAILED; + } + + invite_always_notify = 0; /* the default */ + HookAdd(modinfo->handle, HOOKTYPE_CONFIGRUN, 0, invite_config_run); + HookAdd(modinfo->handle, HOOKTYPE_CHANNEL_DESTROY, 1000000, invite_channel_destroy); + HookAdd(modinfo->handle, HOOKTYPE_LOCAL_QUIT, 0, invite_user_quit); + HookAdd(modinfo->handle, HOOKTYPE_LOCAL_JOIN, 0, invite_user_join); + HookAdd(modinfo->handle, HOOKTYPE_IS_INVITED, 0, invite_is_invited); + return MOD_SUCCESS; } @@ -52,62 +120,252 @@ MOD_UNLOAD() return MOD_SUCCESS; } +void invite_free(ModData *md) +{ + Link **inv, *tmp; + + if (!md->ptr) + return; // was not set + + for (inv = (Link **)md->ptr; (tmp = *inv); inv = &tmp->next) + { + *inv = tmp->next; + free_link(tmp); + } +} + +int invite_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) +{ + int errors = 0; + + if (type != CONFIG_SET) + return 0; + + if (!ce || !ce->name || strcmp(ce->name, "normal-user-invite-notification")) + return 0; + + if (!ce->value) + { + config_error_empty(ce->file->filename, ce->line_number, "set", ce->name); + errors++; + } + + *errs = errors; + return errors ? -1 : 1; +} + +int invite_config_run(ConfigFile *cf, ConfigEntry *ce, int type) +{ + ConfigEntry *cep; + + if (type != CONFIG_SET) + return 0; + + if (!ce || !ce->name || strcmp(ce->name, "normal-user-invite-notification")) + return 0; + + invite_always_notify = config_checkval(ce->value, CFG_YESNO); + + return 1; +} + +static int invite_channel_destroy(Channel *channel, int *should_destroy) +{ + Link *lp; + while ((lp = CHANNEL_INVITES(channel))) + del_invite(lp->value.client, channel); + return 0; +} + +int invite_user_quit(Client *client, MessageTag *mtags, const char *comment) +{ + Link *lp; + /* Clean up invitefield */ + while ((lp = CLIENT_INVITES(client))) + del_invite(client, lp->value.channel); + return 0; +} + +int invite_user_join(Client *client, Channel *channel, MessageTag *mtags) +{ + del_invite(client, channel); + return 0; +} + /* Send the user their list of active invites */ void send_invite_list(Client *client) { Link *inv; - for (inv = client->user->invited; inv; inv = inv->next) + for (inv = CLIENT_INVITES(client); inv; inv = inv->next) { sendnumeric(client, RPL_INVITELIST, - inv->value.channel->chname); + inv->value.channel->name); } sendnumeric(client, RPL_ENDOFINVITELIST); } +int invite_is_invited(Client *client, Channel *channel, int *invited) +{ + Link *lp; + + if (!MyConnect(client)) + return 0; // not handling invite lists for remote clients + + for (lp = CLIENT_INVITES(client); lp; lp = lp->next) + if (lp->value.channel == channel) + { + *invited = 1; + return 0; + } + return 0; +} + +void invite_process(Client *client, Client *target, Channel *channel, MessageTag *recv_mtags, int override) +{ + MessageTag *mtags = NULL; + + new_message(client, recv_mtags, &mtags); + + /* broadcast to other servers */ + sendto_server(client, 0, 0, mtags, ":%s INVITE %s %s %d", client->id, target->id, channel->name, override); + + /* send chanops notifications */ + if (IsUser(client) && (check_channel_access(client, channel, "oaq") + || IsULine(client) + || ValidatePermissionsForPath("channel:override:invite:self",client,NULL,channel,NULL) + || invite_always_notify + )) + { + if (override == 1) + { + sendto_channel(channel, &me, NULL, "o", + 0, SEND_LOCAL, mtags, + ":%s NOTICE @%s :OperOverride -- %s invited him/herself into the channel.", + me.name, channel->name, client->name); + } + if (override == 0) + { + sendto_channel(channel, &me, NULL, "o", + CAP_INVITE_NOTIFY | CAP_INVERT, SEND_LOCAL, mtags, + ":%s NOTICE @%s :%s invited %s into the channel.", + me.name, channel->name, client->name, target->name); + } + /* always send IRCv3 invite-notify if possible */ + sendto_channel(channel, client, NULL, "o", + CAP_INVITE_NOTIFY, SEND_LOCAL, mtags, + ":%s INVITE %s %s", + client->name, target->name, channel->name); + } + + /* add to list and notify the person who got invited */ + if (MyConnect(target)) + { + if (IsUser(client) && (check_channel_access(client, channel, "oaq") + || IsULine(client) + || ValidatePermissionsForPath("channel:override:invite:self",client,NULL,channel,NULL) + )) + { + add_invite(client, target, channel, mtags); + } + + if (!is_silenced(client, target)) + { + sendto_prefix_one(target, client, mtags, ":%s INVITE %s :%s", client->name, + target->name, channel->name); + } + } + free_message_tags(mtags); +} + +void invite_operoverride_msg(Client *client, Channel *channel, char *override_mode, char *override_mode_text) +{ + unreal_log(ULOG_INFO, "operoverride", "OPEROVERRIDE_INVITE", client, + "OperOverride: $client.details invited him/herself into $channel (Overriding $override_mode_text)", + log_data_string("override_type", "join"), + log_data_string("override_mode", override_mode), + log_data_string("override_mode_text", override_mode_text), + log_data_channel("channel", channel)); +} + /* ** cmd_invite ** parv[1] - user to invite -** parv[2] - channel number +** parv[2] - channel name +** parv[3] - override (S2S only) */ CMD_FUNC(cmd_invite) { - Client *target; - Channel *channel; + Client *target = NULL; + Channel *channel = NULL; int override = 0; int i = 0; + int params_ok = 0; Hook *h; + if (parc >= 3 && *parv[1] != '\0') + { + params_ok = 1; + target = find_user(parv[1], NULL); + channel = find_channel(parv[2]); + } + + if (!MyConnect(client)) + /*** remote invite ***/ + { + if (!params_ok) + return; + /* the client or channel may be already gone */ + if (!target) + { + sendnumeric(client, ERR_NOSUCHNICK, parv[1]); + return; + } + if (!channel) + { + sendnumeric(client, ERR_NOSUCHCHANNEL, parv[2]); + return; + } + if (parc >= 4 && !BadPtr(parv[3])) + { + override = atoi(parv[3]); + } + + /* no further checks */ + + invite_process(client, target, channel, recv_mtags, override); + return; + } + + /*** local invite ***/ + + /* the client requested own invite list */ if (parc == 1) { send_invite_list(client); return; } - - if (parc < 3 || *parv[1] == '\0') + + /* notify user about bad parameters */ + if (!params_ok) { sendnumeric(client, ERR_NEEDMOREPARAMS, "INVITE"); return; } - if (!(target = find_person(parv[1], NULL))) + if (!target) { sendnumeric(client, ERR_NOSUCHNICK, parv[1]); return; } - if (MyConnect(client) && !valid_channelname(parv[2])) - { - sendnumeric(client, ERR_NOSUCHCHANNEL, parv[2]); - return; - } - - if (!(channel = find_channel(parv[2], NULL))) + if (!channel) { sendnumeric(client, ERR_NOSUCHCHANNEL, parv[2]); return; } + /* proceed with the command */ for (h = Hooks[HOOKTYPE_PRE_INVITE]; h; h = h->next) { i = (*(h->func.intfunc))(client,target,channel,&override); @@ -134,15 +392,15 @@ CMD_FUNC(cmd_invite) return; } - if (channel->mode.mode & MODE_INVITEONLY) + if (has_channel_mode(channel, 'i')) { - if (!is_chan_op(client, channel) && !IsULine(client)) + if (!check_channel_access(client, channel, "oaq") && !IsULine(client)) { if (ValidatePermissionsForPath("channel:override:invite:invite-only",client,NULL,channel,NULL) && client == target) { override = 1; } else { - sendnumeric(client, ERR_CHANOPRIVSNEEDED, channel->chname); + sendnumeric(client, ERR_CHANOPRIVSNEEDED, channel->name); return; } } @@ -152,100 +410,52 @@ CMD_FUNC(cmd_invite) { override = 1; } else { - sendnumeric(client, ERR_CHANOPRIVSNEEDED, channel->chname); + sendnumeric(client, ERR_CHANOPRIVSNEEDED, channel->name); return; } } } if (SPAMFILTER_VIRUSCHANDENY && SPAMFILTER_VIRUSCHAN && - !strcasecmp(channel->chname, SPAMFILTER_VIRUSCHAN) && - !is_chan_op(client, channel) && !ValidatePermissionsForPath("immune:server-ban:viruschan",client,NULL,NULL,NULL)) + !strcasecmp(channel->name, SPAMFILTER_VIRUSCHAN) && + !check_channel_access(client, channel, "oaq") && !ValidatePermissionsForPath("immune:server-ban:viruschan",client,NULL,NULL,NULL)) { - sendnumeric(client, ERR_CHANOPRIVSNEEDED, channel->chname); + sendnumeric(client, ERR_CHANOPRIVSNEEDED, channel->name); return; } - if (MyUser(client)) + if (target_limit_exceeded(client, target, target->name)) + return; + + if (!ValidatePermissionsForPath("immune:invite-flood",client,NULL,NULL,NULL) && + flood_limit_exceeded(client, FLD_INVITE)) { - if (target_limit_exceeded(client, target, target->name)) - return; - - if (!ValidatePermissionsForPath("immune:invite-flood",client,NULL,NULL,NULL) && - flood_limit_exceeded(client, FLD_INVITE)) - { - sendnumeric(client, RPL_TRYAGAIN, "INVITE"); - return; - } - - if (!override) - { - sendnumeric(client, RPL_INVITING, target->name, channel->chname); - if (target->user->away) - { - sendnumeric(client, RPL_AWAY, target->name, target->user->away); - } - } + sendnumeric(client, RPL_TRYAGAIN, "INVITE"); + return; } - /* Send OperOverride messages */ - if (override && MyConnect(target)) + if (!override) { + sendnumeric(client, RPL_INVITING, target->name, channel->name); + if (target->user->away) + { + sendnumeric(client, RPL_AWAY, target->name, target->user->away); + } + } + else + { + /* Send OperOverride messages */ + char override_what = '\0'; if (is_banned(client, channel, BANCHK_JOIN, NULL, NULL)) - { - sendto_snomask_global(SNO_EYES, - "*** OperOverride -- %s (%s@%s) invited him/herself into %s (overriding +b).", - client->name, client->user->username, client->user->realhost, channel->chname); - - /* Logging implementation added by XeRXeS */ - ircd_log(LOG_OVERRIDE,"OVERRIDE: %s (%s@%s) invited him/herself into %s (Overriding Ban).", - client->name, client->user->username, client->user->realhost, channel->chname); - - } - else if (channel->mode.mode & MODE_INVITEONLY) - { - sendto_snomask_global(SNO_EYES, - "*** OperOverride -- %s (%s@%s) invited him/herself into %s (overriding +i).", - client->name, client->user->username, client->user->realhost, channel->chname); - - /* Logging implementation added by XeRXeS */ - ircd_log(LOG_OVERRIDE,"OVERRIDE: %s (%s@%s) invited him/herself into %s (Overriding Invite Only)", - client->name, client->user->username, client->user->realhost, channel->chname); - - } - else if (channel->mode.limit) - { - sendto_snomask_global(SNO_EYES, - "*** OperOverride -- %s (%s@%s) invited him/herself into %s (overriding +l).", - client->name, client->user->username, client->user->realhost, channel->chname); - - /* Logging implementation added by XeRXeS */ - ircd_log(LOG_OVERRIDE,"OVERRIDE: %s (%s@%s) invited him/herself into %s (Overriding Limit)", - client->name, client->user->username, client->user->realhost, channel->chname); - - } - - else if (*channel->mode.key) - { - sendto_snomask_global(SNO_EYES, - "*** OperOverride -- %s (%s@%s) invited him/herself into %s (overriding +k).", - client->name, client->user->username, client->user->realhost, channel->chname); - - /* Logging implementation added by XeRXeS */ - ircd_log(LOG_OVERRIDE,"OVERRIDE: %s (%s@%s) invited him/herself into %s (Overriding Key)", - client->name, client->user->username, client->user->realhost, channel->chname); - - } + invite_operoverride_msg(client, channel, "b", "ban"); + else if (has_channel_mode(channel, 'i')) + invite_operoverride_msg(client, channel, "i", "invite only"); + else if (has_channel_mode(channel, 'l')) + invite_operoverride_msg(client, channel, "l", "user limit"); + else if (has_channel_mode(channel, 'k')) + invite_operoverride_msg(client, channel, "k", "key"); else if (has_channel_mode(channel, 'z')) - { - sendto_snomask_global(SNO_EYES, - "*** OperOverride -- %s (%s@%s) invited him/herself into %s (overriding +z).", - client->name, client->user->username, client->user->realhost, channel->chname); - - /* Logging implementation added by XeRXeS */ - ircd_log(LOG_OVERRIDE,"OVERRIDE: %s (%s@%s) invited him/herself into %s (Overriding SSL/TLS-Only)", - client->name, client->user->username, client->user->realhost, channel->chname); - } + invite_operoverride_msg(client, channel, "z", "secure only"); #ifdef OPEROVERRIDE_VERIFY else if (channel->mode.mode & MODE_SECRET || channel->mode.mode & MODE_PRIVATE) override = -1; @@ -254,40 +464,79 @@ CMD_FUNC(cmd_invite) return; } - if (MyConnect(target)) - { - if (IsUser(client) - && (is_chan_op(client, channel) - || IsULine(client) - || ValidatePermissionsForPath("channel:override:invite:self",client,NULL,channel,NULL) - )) - { - MessageTag *mtags = NULL; - - new_message(&me, NULL, &mtags); - if (override == 1) - { - sendto_channel(channel, &me, NULL, PREFIX_OP|PREFIX_ADMIN|PREFIX_OWNER, - 0, SEND_ALL, mtags, - ":%s NOTICE @%s :OperOverride -- %s invited him/herself into the channel.", - me.name, channel->chname, client->name); - } else - if (override == 0) - { - sendto_channel(channel, &me, NULL, PREFIX_OP|PREFIX_ADMIN|PREFIX_OWNER, - 0, SEND_ALL, mtags, - ":%s NOTICE @%s :%s invited %s into the channel.", - me.name, channel->chname, client->name, target->name); - } - add_invite(client, target, channel, mtags); - free_message_tags(mtags); - } - } - - /* Notify the person who got invited */ - if (!is_silenced(client, target)) - { - sendto_prefix_one(target, client, NULL, ":%s INVITE %s :%s", client->name, - target->name, channel->chname); - } + /* allowed to proceed */ + invite_process(client, target, channel, recv_mtags, override); } + +/** Register an invite from someone to a channel - so they can bypass +i etc. + * @param from The person sending the invite + * @param to The person who is invited to join + * @param channel The channel + * @param mtags Message tags associated with this INVITE command + */ +void add_invite(Client *from, Client *to, Channel *channel, MessageTag *mtags) +{ + Link *inv, *tmp; + + del_invite(to, channel); + /* If too many invite entries then delete the oldest one */ + if (link_list_length(CLIENT_INVITES(to)) >= MAXCHANNELSPERUSER) + { + for (tmp = CLIENT_INVITES(to); tmp->next; tmp = tmp->next) + ; + del_invite(to, tmp->value.channel); + + } + /* We get pissy over too many invites per channel as well now, + * since otherwise mass-inviters could take up some major + * resources -Donwulff + */ + if (link_list_length(CHANNEL_INVITES(channel)) >= MAXCHANNELSPERUSER) + { + for (tmp = CHANNEL_INVITES(channel); tmp->next; tmp = tmp->next) + ; + del_invite(tmp->value.client, channel); + } + /* + * add client to the beginning of the channel invite list + */ + inv = make_link(); + inv->value.client = to; + inv->next = CHANNEL_INVITES(channel); + CHANNEL_INVITES(channel) = inv; + /* + * add channel to the beginning of the client invite list + */ + inv = make_link(); + inv->value.channel = channel; + inv->next = CLIENT_INVITES(to); + CLIENT_INVITES(to) = inv; + + RunHook(HOOKTYPE_INVITE, from, to, channel, mtags); +} + +/** Delete a previous invite of someone to a channel. + * @param client The client who was invited + * @param channel The channel to which the person was invited + */ +void del_invite(Client *client, Channel *channel) +{ + Link **inv, *tmp; + + for (inv = (Link **)&CHANNEL_INVITES(channel); (tmp = *inv); inv = &tmp->next) + if (tmp->value.client == client) + { + *inv = tmp->next; + free_link(tmp); + break; + } + + for (inv = (Link **)&CLIENT_INVITES(client); (tmp = *inv); inv = &tmp->next) + if (tmp->value.channel == channel) + { + *inv = tmp->next; + free_link(tmp); + break; + } +} + diff --git a/src/modules/ircops.c b/src/modules/ircops.c index 352208a..4b71eb0 100644 --- a/src/modules/ircops.c +++ b/src/modules/ircops.c @@ -31,7 +31,7 @@ ModuleHeader MOD_HEADER "3.71", "/IRCOPS command that lists IRC Operators", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() diff --git a/src/modules/ison.c b/src/modules/ison.c index 69ce42d..928810c 100644 --- a/src/modules/ison.c +++ b/src/modules/ison.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", "command /ison", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -66,6 +66,7 @@ static char buf[BUFSIZE]; CMD_FUNC(cmd_ison) { + char request[BUFSIZE]; char namebuf[USERLEN + HOSTLEN + 4]; Client *acptr; char *s, *user; @@ -82,11 +83,12 @@ CMD_FUNC(cmd_ison) ircsnprintf(buf, sizeof(buf), ":%s %d %s :", me.name, RPL_ISON, client->name); - for (s = strtoken(&p, parv[1], " "); s; s = strtoken(&p, NULL, " ")) + strlcpy(request, parv[1], sizeof(request)); + for (s = strtoken(&p, request, " "); s; s = strtoken(&p, NULL, " ")) { if ((user = strchr(s, '!'))) *user++ = '\0'; - if ((acptr = find_person(s, NULL))) + if ((acptr = find_user(s, NULL))) { if (user) { diff --git a/src/modules/join.c b/src/modules/join.c index 334256e..37610b8 100644 --- a/src/modules/join.c +++ b/src/modules/join.c @@ -24,12 +24,12 @@ /* Forward declarations */ CMD_FUNC(cmd_join); -void _join_channel(Channel *channel, Client *client, MessageTag *mtags, int flags); -void _do_join(Client *client, int parc, char *parv[]); -int _can_join(Client *client, Channel *channel, char *key, char *parv[]); -void _userhost_save_current(Client *client); -void _userhost_changed(Client *client); +void _join_channel(Channel *channel, Client *client, MessageTag *mtags, const char *member_modes); +void _do_join(Client *client, int parc, const char *parv[]); +int _can_join(Client *client, Channel *channel, const char *key, char **errmsg); void _send_join_to_local_users(Client *client, Channel *channel, MessageTag *mtags); +char *_get_chmodes_for_user(Client *client, const char *flags); +void send_cannot_join_error(Client *client, int numeric, char *fmtstr, char *channel_name); /* Externs */ extern MODVAR int spamf_ugly_vchanoverride; @@ -37,6 +37,7 @@ extern int find_invex(Channel *channel, Client *client); /* Local vars */ static int bouncedtimes = 0; +long CAP_EXTENDED_JOIN = 0L; /* Macros */ #define MAXBOUNCE 5 /** Most sensible */ @@ -48,7 +49,7 @@ ModuleHeader MOD_HEADER "5.0", "command /join", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_TEST() @@ -57,15 +58,19 @@ MOD_TEST() EfunctionAddVoid(modinfo->handle, EFUNC_JOIN_CHANNEL, _join_channel); EfunctionAddVoid(modinfo->handle, EFUNC_DO_JOIN, _do_join); EfunctionAdd(modinfo->handle, EFUNC_CAN_JOIN, _can_join); - EfunctionAddVoid(modinfo->handle, EFUNC_USERHOST_SAVE_CURRENT, _userhost_save_current); - EfunctionAddVoid(modinfo->handle, EFUNC_USERHOST_CHANGED, _userhost_changed); EfunctionAddVoid(modinfo->handle, EFUNC_SEND_JOIN_TO_LOCAL_USERS, _send_join_to_local_users); + EfunctionAddPVoid(modinfo->handle, EFUNC_GET_CHMODES_FOR_USER, TO_PVOIDFUNC(_get_chmodes_for_user)); return MOD_SUCCESS; } MOD_INIT() { + ClientCapabilityInfo c; + memset(&c, 0, sizeof(c)); + c.name = "extended-join"; + ClientCapabilityAdd(modinfo->handle, &c, &CAP_EXTENDED_JOIN); + CommandAdd(modinfo->handle, MSG_JOIN, cmd_join, MAXPARA, CMD_USER); MARK_AS_OFFICIAL_MODULE(modinfo); return MOD_SUCCESS; @@ -87,7 +92,7 @@ MOD_UNLOAD() * (eg: bans at the end), so don't change it unless you have a good reason * to do so -- Syzop. */ -int _can_join(Client *client, Channel *channel, char *key, char *parv[]) +int _can_join(Client *client, Channel *channel, const char *key, char **errmsg) { Link *lp; Ban *banned; @@ -96,7 +101,7 @@ int _can_join(Client *client, Channel *channel, char *key, char *parv[]) for (h = Hooks[HOOKTYPE_CAN_JOIN]; h; h = h->next) { - i = (*(h->func.intfunc))(client,channel,key,parv); + i = (*(h->func.intfunc))(client,channel,key, errmsg); if (i != 0) return i; } @@ -111,47 +116,32 @@ int _can_join(Client *client, Channel *channel, char *key, char *parv[]) /* See if we can evade this ban */ banned = is_banned(client, channel, BANCHK_JOIN, NULL, NULL); if (banned && j == HOOK_DENY) - return (ERR_BANNEDFROMCHAN); + { + *errmsg = STR_ERR_BANNEDFROMCHAN; + return ERR_BANNEDFROMCHAN; + } if (is_invited(client, channel)) - return 0; /* allowed */ + return 0; /* allowed to walk through all the other modes */ - if (channel->users >= channel->mode.limit) - { - /* Hmmm.. don't really like this.. and not at this place */ - - for (h = Hooks[HOOKTYPE_CAN_JOIN_LIMITEXCEEDED]; h; h = h->next) - { - i = (*(h->func.intfunc))(client,channel,key,parv); - if (i != 0) - return i; - } - - /* We later check again for this limit (in case +L was not set) */ - } - - - if (*channel->mode.key && (BadPtr(key) || strcmp(channel->mode.key, key))) - return (ERR_BADCHANNELKEY); - - if ((channel->mode.mode & MODE_INVITEONLY) && !find_invex(channel, client)) - return (ERR_INVITEONLYCHAN); - - if ((channel->mode.limit && channel->users >= channel->mode.limit)) - return (ERR_CHANNELISFULL); - - if (banned) - return (ERR_BANNEDFROMCHAN); + if (banned) + { + *errmsg = STR_ERR_BANNEDFROMCHAN; + return ERR_BANNEDFROMCHAN; + } #ifndef NO_OPEROVERRIDE #ifdef OPEROVERRIDE_VERIFY - if (ValidatePermissionsForPath("channel:override:privsecret",client,NULL,channel,NULL) && (channel->mode.mode & MODE_SECRET || - channel->mode.mode & MODE_PRIVATE) && !is_autojoin_chan(channel->chname)) - return (ERR_OPERSPVERIFY); + if (ValidatePermissionsForPath("channel:override:privsecret",client,NULL,channel,NULL) && (channel->mode.mode & MODE_SECRET || + channel->mode.mode & MODE_PRIVATE) && !is_autojoin_chan(channel->name)) + { + *errmsg = STR_ERR_OPERSPVERIFY; + return (ERR_OPERSPVERIFY); + } #endif #endif - return 0; + return 0; } /* @@ -170,7 +160,12 @@ CMD_FUNC(cmd_join) int r; if (bouncedtimes) - sendto_realops("join: bouncedtimes=%d??? [please report at https://bugs.unrealircd.org/]", bouncedtimes); + { + unreal_log(ULOG_ERROR, "join", "BUG_JOIN_BOUNCEDTIMES", NULL, + "[BUG] join: bouncedtimes is not initialized to zero ($bounced_times)!! " + "Please report at https://bugs.unrealircd.org/", + log_data_integer("bounced_times", bouncedtimes)); + } bouncedtimes = 0; if (IsServer(client)) @@ -190,15 +185,13 @@ void _send_join_to_local_users(Client *client, Channel *channel, MessageTag *mta Client *acptr; char joinbuf[512]; char exjoinbuf[512]; - long CAP_EXTENDED_JOIN = ClientCapabilityBit("extended-join"); - long CAP_AWAY_NOTIFY = ClientCapabilityBit("away-notify"); ircsnprintf(joinbuf, sizeof(joinbuf), ":%s!%s@%s JOIN :%s", - client->name, client->user->username, GetHost(client), channel->chname); + client->name, client->user->username, GetHost(client), channel->name); ircsnprintf(exjoinbuf, sizeof(exjoinbuf), ":%s!%s@%s JOIN %s %s :%s", - client->name, client->user->username, GetHost(client), channel->chname, - !isdigit(*client->user->svid) ? client->user->svid : "*", + client->name, client->user->username, GetHost(client), channel->name, + IsLoggedIn(client) ? client->user->account : "*", client->info); for (lp = channel->members; lp; lp = lp->next) @@ -208,46 +201,37 @@ void _send_join_to_local_users(Client *client, Channel *channel, MessageTag *mta if (!MyConnect(acptr)) continue; /* only locally connected clients */ - if (chanops_only && !(lp->flags & (CHFL_HALFOP|CHFL_CHANOP|CHFL_CHANOWNER|CHFL_CHANADMIN)) && (client != acptr)) + if (chanops_only && !check_channel_access_member(lp, "hoaq") && (client != acptr)) continue; /* skip non-ops if requested to (used for mode +D), but always send to 'client' */ if (HasCapabilityFast(acptr, CAP_EXTENDED_JOIN)) sendto_one(acptr, mtags, "%s", exjoinbuf); else sendto_one(acptr, mtags, "%s", joinbuf); - - if (client->user->away && HasCapabilityFast(acptr, CAP_AWAY_NOTIFY)) - { - MessageTag *mtags_away = NULL; - new_message(client, NULL, &mtags_away); - sendto_one(acptr, mtags_away, ":%s!%s@%s AWAY :%s", - client->name, client->user->username, GetHost(client), client->user->away); - free_message_tags(mtags_away); - } } } /* Routine that actually makes a user join the channel * this does no actual checking (banned, etc.) it just adds the user */ -void _join_channel(Channel *channel, Client *client, MessageTag *recv_mtags, int flags) +void _join_channel(Channel *channel, Client *client, MessageTag *recv_mtags, const char *member_modes) { MessageTag *mtags = NULL; /** Message tags to send to local users (sender is :user) */ MessageTag *mtags_sjoin = NULL; /* Message tags to send to remote servers for SJOIN (sender is :me.id) */ - char *parv[] = { 0, 0 }; + const char *parv[3]; /* Same way as in SJOIN */ - new_message_special(client, recv_mtags, &mtags, ":%s JOIN %s", client->name, channel->chname); + new_message_special(client, recv_mtags, &mtags, ":%s JOIN %s", client->name, channel->name); new_message(&me, recv_mtags, &mtags_sjoin); - add_user_to_channel(channel, client, flags); + add_user_to_channel(channel, client, member_modes); send_join_to_local_users(client, channel, mtags); sendto_server(client, 0, 0, mtags_sjoin, ":%s SJOIN %lld %s :%s%s ", me.id, (long long)channel->creationtime, - channel->chname, chfl_to_sjoin_symbol(flags), client->id); + channel->name, modes_to_sjoin_prefix(member_modes), client->id); if (MyUser(client)) { @@ -260,56 +244,63 @@ void _join_channel(Channel *channel, Client *client, MessageTag *recv_mtags, int { channel->creationtime = TStime(); sendto_server(client, 0, 0, NULL, ":%s MODE %s + %lld", - me.id, channel->chname, (long long)channel->creationtime); + me.id, channel->name, (long long)channel->creationtime); } - del_invite(client, channel); if (channel->topic) { - sendnumeric(client, RPL_TOPIC, channel->chname, channel->topic); - sendnumeric(client, RPL_TOPICWHOTIME, channel->chname, channel->topic_nick, - channel->topic_time); + sendnumeric(client, RPL_TOPIC, channel->name, channel->topic); + sendnumeric(client, RPL_TOPICWHOTIME, channel->name, channel->topic_nick, (long long)channel->topic_time); } /* Set default channel modes (set::modes-on-join). * Set only if it's the 1st user and only if no other modes have been set * already (eg: +P, permanent). */ - if ((channel->users == 1) && !channel->mode.mode && !channel->mode.extmode && - (MODES_ON_JOIN || iConf.modes_on_join.extmodes)) + if ((channel->users == 1) && !channel->mode.mode && MODES_ON_JOIN) { - int i; MessageTag *mtags_mode = NULL; - - channel->mode.extmode = iConf.modes_on_join.extmodes; - /* Param fun */ - for (i = 0; i <= Channelmode_highest; i++) - { - if (!Channelmode_Table[i].flag || !Channelmode_Table[i].paracount) - continue; - if (channel->mode.extmode & Channelmode_Table[i].mode) - cm_putparameter(channel, Channelmode_Table[i].flag, iConf.modes_on_join.extparams[i]); - } + Cmode *cm; + char modebuf[BUFSIZE], parabuf[BUFSIZE]; channel->mode.mode = MODES_ON_JOIN; + /* Param fun */ + for (cm=channelmodes; cm; cm = cm->next) + { + if (!cm->letter || !cm->paracount) + continue; + if (channel->mode.mode & cm->mode) + cm_putparameter(channel, cm->letter, iConf.modes_on_join.extparams[cm->letter]); + } + *modebuf = *parabuf = 0; - channel_modes(client, modebuf, parabuf, sizeof(modebuf), sizeof(parabuf), channel); + channel_modes(client, modebuf, parabuf, sizeof(modebuf), sizeof(parabuf), channel, 0); /* This should probably be in the SJOIN stuff */ - new_message_special(&me, recv_mtags, &mtags_mode, ":%s MODE %s %s %s", me.name, channel->chname, modebuf, parabuf); + new_message_special(&me, recv_mtags, &mtags_mode, ":%s MODE %s %s %s", me.name, channel->name, modebuf, parabuf); sendto_server(NULL, 0, 0, mtags_mode, ":%s MODE %s %s %s %lld", - me.id, channel->chname, modebuf, parabuf, (long long)channel->creationtime); - sendto_one(client, mtags_mode, ":%s MODE %s %s %s", me.name, channel->chname, modebuf, parabuf); + me.id, channel->name, modebuf, parabuf, (long long)channel->creationtime); + sendto_one(client, mtags_mode, ":%s MODE %s %s %s", me.name, channel->name, modebuf, parabuf); free_message_tags(mtags_mode); } - parv[0] = client->name; - parv[1] = channel->chname; + parv[0] = NULL; + parv[1] = channel->name; + parv[2] = NULL; do_cmd(client, NULL, "NAMES", 2, parv); - RunHook4(HOOKTYPE_LOCAL_JOIN, client, channel, mtags, parv); + unreal_log(ULOG_INFO, "join", "LOCAL_CLIENT_JOIN", client, + "User $client joined $channel", + log_data_channel("channel", channel), + log_data_string("modes", member_modes)); + + RunHook(HOOKTYPE_LOCAL_JOIN, client, channel, mtags); } else { - RunHook4(HOOKTYPE_REMOTE_JOIN, client, channel, mtags, parv); + unreal_log(ULOG_INFO, "join", "REMOTE_CLIENT_JOIN", client, + "User $client joined $channel", + log_data_channel("channel", channel), + log_data_string("modes", member_modes)); + RunHook(HOOKTYPE_REMOTE_JOIN, client, channel, mtags); } free_message_tags(mtags); @@ -323,18 +314,21 @@ void _join_channel(Channel *channel, Client *client, MessageTag *recv_mtags, int * increased every time we enter this loop and decreased anytime we leave the * loop. So be carefull not to use a simple 'return' after bouncedtimes++. -- Syzop */ -void _do_join(Client *client, int parc, char *parv[]) +void _do_join(Client *client, int parc, const char *parv[]) { + char request[BUFSIZE]; + char request_key[BUFSIZE]; char jbuf[BUFSIZE], jbuf2[BUFSIZE]; - char *orig_parv1; + const char *orig_parv1; Membership *lp; Channel *channel; char *name, *key = NULL; - int i, flags = 0, ishold; + int i, ishold; char *p = NULL, *p2 = NULL; TKL *tklban; int ntargets = 0; int maxtargets = max_targets_for_command("JOIN"); + const char *member_modes = ""; #define RET() do { bouncedtimes--; parv[1] = orig_parv1; return; } while(0) @@ -343,6 +337,11 @@ void _do_join(Client *client, int parc, char *parv[]) sendnumeric(client, ERR_NEEDMOREPARAMS, "JOIN"); return; } + + /* For our tests we need super accurate time for JOINs or they mail fail. */ + gettimeofday(&timeofday_tv, NULL); + timeofday = timeofday_tv.tv_sec; + bouncedtimes++; orig_parv1 = parv[1]; /* don't use 'return;' but 'RET();' from here ;p */ @@ -359,9 +358,8 @@ void _do_join(Client *client, int parc, char *parv[]) ** Rebuild list of channels joined to be the actual result of the ** JOIN. Note that "JOIN 0" is the destructive problem. */ - for (i = 0, name = strtoken(&p, parv[1], ","); - name; - i++, name = strtoken(&p, NULL, ",")) + strlcpy(request, parv[1], sizeof(request)); + for (i = 0, name = strtoken(&p, request, ","); name; i++, name = strtoken(&p, NULL, ",")) { if (MyUser(client) && (++ntargets > maxtargets)) { @@ -370,7 +368,7 @@ void _do_join(Client *client, int parc, char *parv[]) } if (*name == '0' && !atoi(name)) { - /* UnrealIRCd 5: we only support "JOIN 0", + /* UnrealIRCd 5+: we only support "JOIN 0", * "JOIN 0,#somechan" etc... so only at the beginning. * We do not support it half-way like "JOIN #a,0,#b" * since that doesn't make sense, unless you are flooding... @@ -384,7 +382,7 @@ void _do_join(Client *client, int parc, char *parv[]) if (MyConnect(client) && !valid_channelname(name)) { send_invalid_channelname(client, name); - if (IsOper(client) && find_channel(name, NULL)) + if (IsOper(client) && find_channel(name)) { /* Give IRCOps a bit more information */ sendnotice(client, "Channel '%s' is unjoinable because it contains illegal characters. " @@ -415,7 +413,10 @@ void _do_join(Client *client, int parc, char *parv[]) p = NULL; if (parv[2]) - key = strtoken(&p2, parv[2], ","); + { + strlcpy(request_key, parv[2], sizeof(request_key)); + key = strtoken(&p2, request_key, ","); + } parv[2] = NULL; /* for cmd_names call later, parv[parc] must == NULL */ for (name = strtoken(&p, jbuf, ","); @@ -442,13 +443,13 @@ void _do_join(Client *client, int parc, char *parv[]) sendto_channel(channel, client, NULL, 0, 0, SEND_LOCAL, mtags, ":%s PART %s :%s", - client->name, channel->chname, "Left all channels"); - sendto_server(client, 0, 0, mtags, ":%s PART %s :Left all channels", client->name, channel->chname); + client->name, channel->name, "Left all channels"); + sendto_server(client, 0, 0, mtags, ":%s PART %s :Left all channels", client->name, channel->name); if (MyConnect(client)) - RunHook4(HOOKTYPE_LOCAL_PART, client, channel, mtags, "Left all channels"); + RunHook(HOOKTYPE_LOCAL_PART, client, channel, mtags, "Left all channels"); - remove_user_from_channel(client, channel); + remove_user_from_channel(client, channel, 0); free_message_tags(mtags); } continue; @@ -456,19 +457,7 @@ void _do_join(Client *client, int parc, char *parv[]) if (MyConnect(client)) { - /* - ** local client is first to enter previously nonexistant - ** channel so make them (rightfully) the Channel - ** Operator. - */ - /* Where did this come from? Potvin ? --Stskeeps - flags = (ChannelExists(name)) ? CHFL_DEOPPED : - CHFL_CHANOWNER; - - */ - - flags = - (ChannelExists(name)) ? CHFL_DEOPPED : LEVEL_ON_JOIN; + member_modes = (ChannelExists(name)) ? "" : LEVEL_ON_JOIN; if (!ValidatePermissionsForPath("immune:maxchannelsperuser",client,NULL,NULL,NULL)) /* opers can join unlimited chans */ if (client->user->joined >= MAXCHANNELSPERUSER) @@ -486,8 +475,9 @@ void _do_join(Client *client, int parc, char *parv[]) { if (d->warn) { - sendto_snomask(SNO_EYES, "*** %s tried to join forbidden channel %s", - get_client_name(client, 1), name); + unreal_log(ULOG_INFO, "join", "JOIN_DENIED_FORBIDDEN_CHANNEL", client, + "Client $client.details tried to join forbidden channel $channel", + log_data_string("channel", name)); } if (d->reason) sendnumeric(client, ERR_FORBIDDENCHANNEL, name, d->reason); @@ -514,7 +504,7 @@ void _do_join(Client *client, int parc, char *parv[]) !strcasecmp(name, SPAMFILTER_VIRUSCHAN) && !ValidatePermissionsForPath("immune:server-ban:viruschan",client,NULL,NULL,NULL) && !spamf_ugly_vchanoverride) { - Channel *channel = find_channel(name, NULL); + Channel *channel = find_channel(name); if (!channel || !is_invited(client, channel)) { @@ -525,7 +515,7 @@ void _do_join(Client *client, int parc, char *parv[]) } } - channel = get_channel(client, name, CREATE); + channel = make_channel(name); if (channel && (lp = find_membership_link(client->user->channel, channel))) continue; @@ -534,23 +524,14 @@ void _do_join(Client *client, int parc, char *parv[]) i = HOOK_CONTINUE; if (!MyConnect(client)) - flags = CHFL_DEOPPED; + member_modes = ""; else { Hook *h; + char *errmsg = NULL; for (h = Hooks[HOOKTYPE_PRE_LOCAL_JOIN]; h; h = h->next) { - /* Note: this is just a hack not to break the ABI but still be - * able to fix https://bugs.unrealircd.org/view.php?id=5644 - * In the future we should just drop the parv/parx argument - * and use key as an argument instead. - */ - char *parx[4]; - parx[0] = NULL; - parx[1] = name; - parx[2] = key; - parx[3] = NULL; - i = (*(h->func.intfunc))(client,channel,parx); + i = (*(h->func.intfunc))(client,channel,key); if (i == HOOK_DENY || i == HOOK_ALLOW) break; } @@ -564,12 +545,10 @@ void _do_join(Client *client, int parc, char *parv[]) } /* If they are allowed, don't check can_join */ if (i != HOOK_ALLOW && - (i = can_join(client, channel, key, parv))) + (i = can_join(client, channel, key, &errmsg))) { if (i != -1) - { - sendnumeric(client, i, name); - } + send_cannot_join_error(client, i, errmsg, name); continue; } } @@ -585,43 +564,42 @@ void _do_join(Client *client, int parc, char *parv[]) * and so on, each with their own unique msgid and such. */ new_message(client, NULL, &mtags); - join_channel(channel, client, mtags, flags); + join_channel(channel, client, mtags, member_modes); free_message_tags(mtags); } RET(); #undef RET } +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wformat-nonliteral" +#endif +void send_cannot_join_error(Client *client, int numeric, char *fmtstr, char *channel_name) +{ + // TODO: add single %s validation ! + sendnumericfmt(client, numeric, fmtstr, channel_name); +} +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + /* Additional channel-related functions. I've put it here instead * of the core so it could be upgraded on the fly should it be necessary. */ -char *get_chmodes_for_user(Client *client, int flags) +char *_get_chmodes_for_user(Client *client, const char *member_flags) { static char modebuf[512]; /* returned */ char flagbuf[8]; /* For holding "vhoaq" */ - char *p = flagbuf; char parabuf[512]; int n, i; - if (!flags) + if (BadPtr(member_flags)) return ""; - if (flags & MODE_CHANOWNER) - *p++ = 'q'; - if (flags & MODE_CHANADMIN) - *p++ = 'a'; - if (flags & MODE_CHANOP) - *p++ = 'o'; - if (flags & MODE_VOICE) - *p++ = 'v'; - if (flags & MODE_HALFOP) - *p++ = 'h'; - *p = '\0'; - parabuf[0] = '\0'; - - n = strlen(flagbuf); + n = strlen(member_flags); if (n) { for (i=0; i < n; i++) @@ -631,182 +609,9 @@ char *get_chmodes_for_user(Client *client, int flags) strlcat(parabuf, " ", sizeof(parabuf)); } /* And we have our mode line! */ - snprintf(modebuf, sizeof(modebuf), "+%s %s", flagbuf, parabuf); + snprintf(modebuf, sizeof(modebuf), "+%s %s", member_flags, parabuf); return modebuf; } return ""; } - -static char remember_nick[NICKLEN+1]; -static char remember_user[USERLEN+1]; -static char remember_host[HOSTLEN+1]; - -/** Save current nick/user/host. Used later by userhost_changed(). */ -void _userhost_save_current(Client *client) -{ - strlcpy(remember_nick, client->name, sizeof(remember_nick)); - strlcpy(remember_user, client->user->username, sizeof(remember_user)); - strlcpy(remember_host, GetHost(client), sizeof(remember_host)); -} - -/** User/Host changed for user. - * Note that userhost_save_current() needs to be called before this - * to save the old username/hostname. - * This userhost_changed() function deals with notifying local clients - * about the user/host change by sending PART+JOIN+MODE if - * set::allow-userhost-change force-rejoin is in use, - * and it wills end "CAP chghost" to such capable clients. - * It will also deal with bumping fakelag for the user since a user/host - * change is costly, doesn't matter if it was self-induced or not. - * - * Please call this function for any user/host change by doing: - * userhost_save_current(client); - * << change username or hostname here >> - * userhost_changed(client); - */ -void _userhost_changed(Client *client) -{ - Membership *channels; - Member *lp; - Client *acptr; - int impact = 0; - char buf[512]; - long CAP_EXTENDED_JOIN = ClientCapabilityBit("extended-join"); - long CAP_CHGHOST = ClientCapabilityBit("chghost"); - - if (strcmp(remember_nick, client->name)) - { - ircd_log(LOG_ERROR, "[BUG] userhost_changed() was called but without calling userhost_save_current() first! Affected user: %s", - client->name); - ircd_log(LOG_ERROR, "Please report above bug on https://bugs.unrealircd.org/"); - sendto_realops("[BUG] userhost_changed() was called but without calling userhost_save_current() first! Affected user: %s", - client->name); - sendto_realops("Please report above bug on https://bugs.unrealircd.org/"); - return; /* We cannot safely process this request anymore */ - } - - /* It's perfectly acceptable to call us even if the userhost didn't change. */ - if (!strcmp(remember_user, client->user->username) && !strcmp(remember_host, GetHost(client))) - return; /* Nothing to do */ - - /* Most of the work is only necessary for set::allow-userhost-change force-rejoin */ - if (UHOST_ALLOWED == UHALLOW_REJOIN) - { - /* Walk through all channels of this user.. */ - for (channels = client->user->channel; channels; channels = channels->next) - { - Channel *channel = channels->channel; - int flags = channels->flags; - char *modes; - char partbuf[512]; /* PART */ - char joinbuf[512]; /* JOIN */ - char exjoinbuf[512]; /* JOIN (for CAP extended-join) */ - char modebuf[512]; /* MODE (if any) */ - int chanops_only = invisible_user_in_channel(client, channel); - - modebuf[0] = '\0'; - - /* If the user is banned, don't send any rejoins, it would only be annoying */ - if (is_banned(client, channel, BANCHK_JOIN, NULL, NULL)) - continue; - - /* Prepare buffers for PART, JOIN, MODE */ - ircsnprintf(partbuf, sizeof(partbuf), ":%s!%s@%s PART %s :%s", - remember_nick, remember_user, remember_host, - channel->chname, - "Changing host"); - - ircsnprintf(joinbuf, sizeof(joinbuf), ":%s!%s@%s JOIN %s", - client->name, client->user->username, GetHost(client), channel->chname); - - ircsnprintf(exjoinbuf, sizeof(exjoinbuf), ":%s!%s@%s JOIN %s %s :%s", - client->name, client->user->username, GetHost(client), channel->chname, - !isdigit(*client->user->svid) ? client->user->svid : "*", - client->info); - - modes = get_chmodes_for_user(client, flags); - if (!BadPtr(modes)) - ircsnprintf(modebuf, sizeof(modebuf), ":%s MODE %s %s", me.name, channel->chname, modes); - - for (lp = channel->members; lp; lp = lp->next) - { - acptr = lp->client; - - if (acptr == client) - continue; /* skip self */ - - if (!MyConnect(acptr)) - continue; /* only locally connected clients */ - - if (chanops_only && !(lp->flags & (CHFL_CHANOP|CHFL_CHANOWNER|CHFL_CHANADMIN))) - continue; /* skip non-ops if requested to (used for mode +D) */ - - if (HasCapabilityFast(acptr, CAP_CHGHOST)) - continue; /* we notify 'CAP chghost' users in a different way, so don't send it here. */ - - impact++; - - /* FIXME: if a client does not have the "chghost" cap then - * here we will not generate a proper new message, probably - * needs to be fixed... I skipped doing it for now. - */ - sendto_one(acptr, NULL, "%s", partbuf); - - if (HasCapabilityFast(acptr, CAP_EXTENDED_JOIN)) - sendto_one(acptr, NULL, "%s", exjoinbuf); - else - sendto_one(acptr, NULL, "%s", joinbuf); - - if (*modebuf) - sendto_one(acptr, NULL, "%s", modebuf); - } - } - } - - /* Now deal with "CAP chghost" clients. - * This only needs to be sent one per "common channel". - * This would normally call sendto_common_channels_local_butone() but the user already - * has the new user/host.. so we do it here.. - */ - ircsnprintf(buf, sizeof(buf), ":%s!%s@%s CHGHOST %s %s", - remember_nick, remember_user, remember_host, - client->user->username, - GetHost(client)); - current_serial++; - for (channels = client->user->channel; channels; channels = channels->next) - { - for (lp = channels->channel->members; lp; lp = lp->next) - { - acptr = lp->client; - if (MyUser(acptr) && HasCapabilityFast(acptr, CAP_CHGHOST) && - (acptr->local->serial != current_serial) && (client != acptr)) - { - /* FIXME: send mtag */ - sendto_one(acptr, NULL, "%s", buf); - acptr->local->serial = current_serial; - } - } - } - - if (MyUser(client)) - { - /* We take the liberty of sending the CHGHOST to the impacted user as - * well. This makes things easy for client coders. - * (Note that this cannot be merged with the for loop from 15 lines up - * since the user may not be in any channels) - */ - if (HasCapabilityFast(client, CAP_CHGHOST)) - sendto_one(client, NULL, "%s", buf); - - /* A userhost change always generates the following network traffic: - * server to server traffic, CAP "chghost" notifications, and - * possibly PART+JOIN+MODE if force-rejoin had work to do. - * We give the user a penalty so they don't flood... - */ - if (impact) - client->local->since += 7; /* Resulted in rejoins and such. */ - else - client->local->since += 4; /* No rejoins */ - } -} diff --git a/src/modules/jointhrottle.c b/src/modules/jointhrottle.c index 3247406..58a2404 100644 --- a/src/modules/jointhrottle.c +++ b/src/modules/jointhrottle.c @@ -29,7 +29,7 @@ ModuleHeader MOD_HEADER "5.0", "Join flood protection (set::anti-flood::join-flood)", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; ModuleInfo *ModInfo = NULL; @@ -40,15 +40,15 @@ typedef struct JoinFlood JoinFlood; struct JoinFlood { JoinFlood *prev, *next; - char chname[CHANNELLEN+1]; + char name[CHANNELLEN+1]; time_t firstjoin; unsigned short numjoins; }; /* Forward declarations */ void jointhrottle_md_free(ModData *m); -int jointhrottle_can_join(Client *client, Channel *channel, char *key, char *parv[]); -int jointhrottle_local_join(Client *client, Channel *channel, MessageTag *mtags, char *parv[]); +int jointhrottle_can_join(Client *client, Channel *channel, const char *key, char **errmsg); +int jointhrottle_local_join(Client *client, Channel *channel, MessageTag *mtags); static int isjthrottled(Client *client, Channel *channel); static void jointhrottle_increase_usercounter(Client *client, Channel *channel); EVENT(jointhrottle_cleanup_structs); @@ -104,7 +104,7 @@ static int isjthrottled(Client *client, Channel *channel) /* Grab user<->chan entry.. */ for (e = moddata_local_client(client, jointhrottle_md).ptr; e; e=e->next) - if (!strcasecmp(e->chname, channel->chname)) + if (!strcasecmp(e->name, channel->name)) break; if (!e) @@ -129,7 +129,7 @@ static void jointhrottle_increase_usercounter(Client *client, Channel *channel) /* Grab user<->chan entry.. */ for (e = moddata_local_client(client, jointhrottle_md).ptr; e; e=e->next) - if (!strcasecmp(e->chname, channel->chname)) + if (!strcasecmp(e->name, channel->name)) break; if (!e) @@ -149,15 +149,18 @@ static void jointhrottle_increase_usercounter(Client *client, Channel *channel) } } -int jointhrottle_can_join(Client *client, Channel *channel, char *key, char *parv[]) +int jointhrottle_can_join(Client *client, Channel *channel, const char *key, char **errmsg) { if (!ValidatePermissionsForPath("immune:join-flood",client,NULL,channel,NULL) && isjthrottled(client, channel)) + { + *errmsg = STR_ERR_TOOMANYJOINS; return ERR_TOOMANYJOINS; + } return 0; } -int jointhrottle_local_join(Client *client, Channel *channel, MessageTag *mtags, char *parv[]) +int jointhrottle_local_join(Client *client, Channel *channel, MessageTag *mtags) { jointhrottle_increase_usercounter(client, channel); return 0; @@ -175,12 +178,12 @@ JoinFlood *jointhrottle_addentry(Client *client, Channel *channel) abort(); for (e=moddata_local_client(client, jointhrottle_md).ptr; e; e=e->next) - if (!strcasecmp(e->chname, channel->chname)) + if (!strcasecmp(e->name, channel->name)) abort(); /* already exists -- should never happen */ #endif e = safe_alloc(sizeof(JoinFlood)); - strlcpy(e->chname, channel->chname, sizeof(e->chname)); + strlcpy(e->name, channel->name, sizeof(e->name)); /* Insert our new entry as (new) head */ if (moddata_local_client(client, jointhrottle_md).ptr) @@ -211,11 +214,6 @@ EVENT(jointhrottle_cleanup_structs) if (jf->firstjoin + iConf.floodsettings->period[FLD_JOIN] > TStime()) continue; /* still valid entry */ -#ifdef DEBUGMODE - ircd_log(LOG_ERROR, "jointhrottle_cleanup_structs(): freeing %s/%s (%ld[%ld], %ld)", - client->name, jf->chname, jf->firstjoin, (long)(TStime() - jf->firstjoin), - iConf.floodsettings->period[FLD_JOIN]); -#endif if (moddata_local_client(client, jointhrottle_md).ptr == jf) { /* change head */ diff --git a/src/modules/json-log-tag.c b/src/modules/json-log-tag.c new file mode 100644 index 0000000..5354ef1 --- /dev/null +++ b/src/modules/json-log-tag.c @@ -0,0 +1,90 @@ +/* + * IRC - Internet Relay Chat, src/modules/monitor.c + * (C) 2021 Bram Matthys and The UnrealIRCd Team + * + * See file AUTHORS in IRC package for additional names of + * the programmers. + * + * This program is free 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 1, or (at your option) + * any later version. + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "unrealircd.h" + +ModuleHeader MOD_HEADER + = { + "json-log-tag", + "5.0", + "unrealircd.org/json-log tag for S2S and ircops", + "UnrealIRCd Team", + "unrealircd-6", + }; + +/* Variables */ +long CAP_JSON_LOG = 0L; + +/* Forward declarations */ +int json_log_mtag_is_ok(Client *client, const char *name, const char *value); +int json_log_mtag_should_send_to_client(Client *target); + +MOD_INIT() +{ + ClientCapabilityInfo cap; + ClientCapability *c; + MessageTagHandlerInfo mtag; + + MARK_AS_OFFICIAL_MODULE(modinfo); + + memset(&cap, 0, sizeof(cap)); + cap.name = "unrealircd.org/json-log"; + c = ClientCapabilityAdd(modinfo->handle, &cap, &CAP_JSON_LOG); + + memset(&mtag, 0, sizeof(mtag)); + mtag.name = "unrealircd.org/json-log"; + mtag.is_ok = json_log_mtag_is_ok; + mtag.should_send_to_client = json_log_mtag_should_send_to_client; + mtag.clicap_handler = c; + MessageTagHandlerAdd(modinfo->handle, &mtag); + + return MOD_SUCCESS; +} + +MOD_LOAD() +{ + return MOD_SUCCESS; +} + +MOD_UNLOAD() +{ + return MOD_SUCCESS; +} + +/** This function verifies if the client sending + * We simply allow from servers without any syntax checking. + */ +int json_log_mtag_is_ok(Client *client, const char *name, const char *value) +{ + if (IsServer(client) || IsMe(client)) + return 1; + + return 0; +} + +/** Outgoing filter for this message tag */ +int json_log_mtag_should_send_to_client(Client *target) +{ + if (IsServer(target) || (target->local && IsOper(target) && HasCapabilityFast(target, CAP_JSON_LOG))) + return 1; + return 0; +} diff --git a/src/modules/jumpserver.c b/src/modules/jumpserver.c index 8d11c53..7743624 100644 --- a/src/modules/jumpserver.c +++ b/src/modules/jumpserver.c @@ -25,12 +25,9 @@ ModuleHeader MOD_HEADER "1.1", "/jumpserver command", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; -/* Defines */ -#define MSG_JUMPSERVER "JUMPSERVER" - /* Forward declarations */ CMD_FUNC(cmd_jumpserver); int jumpserver_preconnect(Client *); @@ -43,8 +40,8 @@ struct JSS char *reason; char *server; int port; - char *ssl_server; - int ssl_port; + char *tls_server; + int tls_port; }; JSS *jss=NULL; /**< JumpServer Status. NULL=disabled. */ @@ -53,7 +50,7 @@ MOD_INIT() { MARK_AS_OFFICIAL_MODULE(modinfo); LoadPersistentPointer(modinfo, jss, jumpserver_free_jss); - CommandAdd(modinfo->handle, MSG_JUMPSERVER, cmd_jumpserver, 3, CMD_USER); + CommandAdd(modinfo->handle, "JUMPSERVER", cmd_jumpserver, 3, CMD_USER); HookAdd(modinfo->handle, HOOKTYPE_PRE_LOCAL_CONNECT, 0, jumpserver_preconnect); return MOD_SUCCESS; } @@ -71,8 +68,8 @@ MOD_UNLOAD() static void do_jumpserver_exit_client(Client *client) { - if (IsSecure(client) && jss->ssl_server) - sendnumeric(client, RPL_REDIR, jss->ssl_server, jss->ssl_port); + if (IsSecure(client) && jss->tls_server) + sendnumeric(client, RPL_REDIR, jss->tls_server, jss->tls_port); else sendnumeric(client, RPL_REDIR, jss->server, jss->port); exit_client(client, NULL, jss->reason); @@ -91,8 +88,9 @@ static void redirect_all_clients(void) count++; } } - sendto_realops("JUMPSERVER: Redirected %d client%s", - count, count == 1 ? "" : "s"); /* Language fun... ;p */ + unreal_log(ULOG_INFO, "jumpserver", "JUMPSERVER_REPORT", NULL, + "[jumpserver] Redirected $num_clients client(s)", + log_data_integer("num_clients", count)); } int jumpserver_preconnect(Client *client) @@ -111,7 +109,7 @@ void free_jss(void) { safe_free(jss->server); safe_free(jss->reason); - safe_free(jss->ssl_server); + safe_free(jss->tls_server); safe_free(jss); jss = NULL; } @@ -124,8 +122,10 @@ void jumpserver_free_jss(ModData *m) CMD_FUNC(cmd_jumpserver) { - char *serv, *sslserv=NULL, *reason, *p; + char *serv, *tlsserv=NULL, *p; + const char *reason; int all=0, port=6667, sslport=6697; + char request[BUFSIZE]; char logbuf[512]; if (!IsOper(client)) @@ -136,9 +136,9 @@ CMD_FUNC(cmd_jumpserver) if ((parc < 2) || BadPtr(parv[1])) { - if (jss && jss->ssl_server) - sendnotice(client, "JumpServer is \002ENABLED\002 to %s:%d (SSL/TLS: %s:%d) with reason '%s'", - jss->server, jss->port, jss->ssl_server, jss->ssl_port, jss->reason); + if (jss && jss->tls_server) + sendnotice(client, "JumpServer is \002ENABLED\002 to %s:%d (TLS: %s:%d) with reason '%s'", + jss->server, jss->port, jss->tls_server, jss->tls_port, jss->reason); else if (jss) sendnotice(client, "JumpServer is \002ENABLED\002 to %s:%d with reason '%s'", @@ -156,10 +156,8 @@ CMD_FUNC(cmd_jumpserver) return; } free_jss(); - snprintf(logbuf, sizeof(logbuf), "%s (%s@%s) turned JUMPSERVER OFF", - client->name, client->user->username, client->user->realhost); - sendto_realops("%s", logbuf); - ircd_log(LOG_ERROR, "%s", logbuf); + unreal_log(ULOG_INFO, "jumpserver", "JUMPSERVER_DISABLED", client, + "[jumpserver] $client.details turned jumpserver OFF"); return; } @@ -167,7 +165,7 @@ CMD_FUNC(cmd_jumpserver) { /* Waah, pretty verbose usage info ;) */ sendnotice(client, "Use: /JUMPSERVER [:port] "); - sendnotice(client, " Or: /JUMPSERVER [:port]/[:port] "); + sendnotice(client, " Or: /JUMPSERVER [:port]/[:port] "); sendnotice(client, "if 'NEW' is chosen then only new (incoming) connections will be redirected"); sendnotice(client, "if 'ALL' is chosen then all clients except opers will be redirected immediately (+incoming connections)"); sendnotice(client, "Example: /JUMPSERVER irc2.test.net NEW This server will be upgraded, please use irc2.test.net for now"); @@ -177,19 +175,16 @@ CMD_FUNC(cmd_jumpserver) return; } - /* Parsing code follows... - * The parsing of the SSL stuff is still done even on non-SSL, - * but it's simply not used/applied :). - * Reason for this is to reduce non-SSL/SSL inconsistency issues. - */ + /* Parsing code follows... */ - serv = parv[1]; + strlcpy(request, parv[1], sizeof(request)); + serv = request; p = strchr(serv, '/'); if (p) { *p = '\0'; - sslserv = p+1; + tlsserv = p+1; } p = strchr(serv, ':'); @@ -203,21 +198,21 @@ CMD_FUNC(cmd_jumpserver) return; } } - if (sslserv) + if (tlsserv) { - p = strchr(sslserv, ':'); + p = strchr(tlsserv, ':'); if (p) { *p++ = '\0'; sslport = atoi(p); if ((sslport < 1) || (sslport > 65535)) { - sendnotice(client, "Invalid SSL/TLS serverport specified (%d)", sslport); + sendnotice(client, "Invalid TLS serverport specified (%d)", sslport); return; } } - if (!*sslserv) - sslserv = NULL; + if (!*tlsserv) + tlsserv = NULL; } if (!strcasecmp(parv[2], "new")) all = 0; @@ -239,27 +234,37 @@ CMD_FUNC(cmd_jumpserver) /* Set it */ safe_strdup(jss->server, serv); jss->port = port; - if (sslserv) + if (tlsserv) { - safe_strdup(jss->ssl_server, sslserv); - jss->ssl_port = sslport; + safe_strdup(jss->tls_server, tlsserv); + jss->tls_port = sslport; } safe_strdup(jss->reason, reason); /* Broadcast/log */ - if (sslserv) - snprintf(logbuf, sizeof(logbuf), "%s (%s@%s) added JUMPSERVER redirect for %s to %s:%d [SSL/TLS: %s:%d] with reason '%s'", - client->name, client->user->username, client->user->realhost, - all ? "ALL CLIENTS" : "all new clients", - jss->server, jss->port, jss->ssl_server, jss->ssl_port, jss->reason); - else - snprintf(logbuf, sizeof(logbuf), "%s (%s@%s) added JUMPSERVER redirect for %s to %s:%d with reason '%s'", - client->name, client->user->username, client->user->realhost, - all ? "ALL CLIENTS" : "all new clients", - jss->server, jss->port, jss->reason); - - sendto_realops("%s", logbuf); - ircd_log(LOG_ERROR, "%s", logbuf); + if (tlsserv) + { + unreal_log(ULOG_INFO, "jumpserver", "JUMPSERVER_ENABLED", client, + "[jumpserver] $client.details turned jumpserver ON for $jumpserver_who " + "to $jumpserver_server:$jumpserver_port " + "[TLS: $jumpserver_tls_server:$jumpserver_tls_port] " + "($reason)", + log_data_string("jumpserver_who", all ? "ALL CLIENTS" : "all new clients"), + log_data_string("jumpserver_server", jss->server), + log_data_integer("jumpserver_port", jss->port), + log_data_string("jumpserver_tls_server", jss->tls_server), + log_data_integer("jumpserver_tls_port", jss->tls_port), + log_data_string("reason", jss->reason)); + } else { + unreal_log(ULOG_INFO, "jumpserver", "JUMPSERVER_ENABLED", client, + "[jumpserver] $client.details turned jumpserver ON for $jumpserver_who " + "to $jumpserver_server:$jumpserver_port " + "($reason)", + log_data_string("jumpserver_who", all ? "ALL CLIENTS" : "all new clients"), + log_data_string("jumpserver_server", jss->server), + log_data_integer("jumpserver_port", jss->port), + log_data_string("reason", jss->reason)); + } if (all) redirect_all_clients(); diff --git a/src/modules/kick.c b/src/modules/kick.c index 8545f9b..f5a2b09 100644 --- a/src/modules/kick.c +++ b/src/modules/kick.c @@ -28,7 +28,7 @@ ModuleHeader MOD_HEADER "5.0", "command /kick", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Forward declarations */ @@ -59,6 +59,16 @@ MOD_UNLOAD() return MOD_SUCCESS; } +void kick_operoverride_msg(Client *client, Channel *channel, Client *target, char *reason) +{ + unreal_log(ULOG_INFO, "operoverride", "OPEROVERRIDE_KICK", client, + "OperOverride: $client.details kicked $target from $channel ($reason)", + log_data_string("override_type", "kick"), + log_data_string("reason", reason), + log_data_client("target", target), + log_data_channel("channel", channel)); +} + /** Kick a user from a channel. * @param initial_mtags Message tags associated with this KICK (can be NULL) * @param channel The channel where the KICK should happen @@ -84,37 +94,37 @@ void _kick_user(MessageTag *initial_mtags, Channel *channel, Client *client, Cli new_message(client, NULL, &initial_mtags); } - new_message_special(client, initial_mtags, &mtags, ":%s KICK %s %s", client->name, channel->chname, victim->name); + new_message_special(client, initial_mtags, &mtags, ":%s KICK %s %s", client->name, channel->name, victim->name); /* The same message is actually sent at 5 places below (though max 4 at most) */ if (MyUser(client)) - RunHook5(HOOKTYPE_LOCAL_KICK, client, victim, channel, mtags, comment); + RunHook(HOOKTYPE_LOCAL_KICK, client, victim, channel, mtags, comment); else - RunHook5(HOOKTYPE_REMOTE_KICK, client, victim, channel, mtags, comment); + RunHook(HOOKTYPE_REMOTE_KICK, client, victim, channel, mtags, comment); if (invisible_user_in_channel(victim, channel)) { /* Send it only to chanops & victim */ sendto_channel(channel, client, victim, - PREFIX_HALFOP|PREFIX_OP|PREFIX_OWNER|PREFIX_ADMIN, 0, + "h", 0, SEND_LOCAL, mtags, ":%s KICK %s %s :%s", - client->name, channel->chname, victim->name, comment); + client->name, channel->name, victim->name, comment); if (MyUser(victim)) { sendto_prefix_one(victim, client, mtags, ":%s KICK %s %s :%s", - client->name, channel->chname, victim->name, comment); + client->name, channel->name, victim->name, comment); } } else { /* NORMAL */ sendto_channel(channel, client, NULL, 0, 0, SEND_LOCAL, mtags, ":%s KICK %s %s :%s", - client->name, channel->chname, victim->name, comment); + client->name, channel->name, victim->name, comment); } sendto_server(client, 0, 0, mtags, ":%s KICK %s %s :%s", - client->id, channel->chname, victim->id, comment); + client->id, channel->name, victim->id, comment); free_message_tags(mtags); if (initial_mtags_generated) @@ -123,34 +133,44 @@ void _kick_user(MessageTag *initial_mtags, Channel *channel, Client *client, Cli initial_mtags = NULL; } - remove_user_from_channel(victim, channel); + if (MyUser(victim)) + { + unreal_log(ULOG_INFO, "kick", "LOCAL_CLIENT_KICK", victim, + "User $client kicked from $channel", + log_data_channel("channel", channel)); + } else { + unreal_log(ULOG_INFO, "kick", "REMOTE_CLIENT_KICK", victim, + "User $client kicked from $channel", + log_data_channel("channel", channel)); + } + + remove_user_from_channel(victim, channel, 1); } /* ** cmd_kick -** parv[1] = channel -** parv[2] = client to kick +** parv[1] = channel (single channel) +** parv[2] = client to kick (comma separated) ** parv[3] = kick comment */ -#ifdef PREFIX_AQ -#define CHFL_ISOP (CHFL_CHANOWNER|CHFL_CHANADMIN|CHFL_CHANOP) -#else -#define CHFL_ISOP (CHFL_CHANOP) -#endif - CMD_FUNC(cmd_kick) { - Client *who; + Client *target; Channel *channel; int chasing = 0; - char *comment, *name, *p = NULL, *user, *p2 = NULL, *badkick; + char *p = NULL, *user, *p2 = NULL, *badkick; + char comment[MAXKICKLEN+1]; Membership *lp; Hook *h; int ret; int ntargets = 0; int maxtargets = max_targets_for_command("KICK"); MessageTag *mtags; + char request[BUFSIZE]; + char request_chans[BUFSIZE]; + const char *client_member_modes = NULL; + const char *target_member_modes; if (parc < 3 || *parv[1] == '\0') { @@ -158,216 +178,192 @@ CMD_FUNC(cmd_kick) return; } - comment = (BadPtr(parv[3])) ? client->name : parv[3]; + if (BadPtr(parv[3])) + strlcpy(comment, client->name, sizeof(comment)); + else + strlncpy(comment, parv[3], sizeof(comment), iConf.kick_length); - if (!BadPtr(parv[3]) && (strlen(comment) > iConf.kick_length)) - comment[iConf.kick_length] = '\0'; - - for (; (name = strtoken(&p, parv[1], ",")); parv[1] = NULL) + strlcpy(request_chans, parv[1], sizeof(request_chans)); + p = strchr(request_chans, ','); + if (p) + *p = '\0'; + channel = find_channel(request_chans); + if (!channel) { - long client_flags = 0; - channel = get_channel(client, name, !CREATE); - if (!channel) + sendnumeric(client, ERR_NOSUCHCHANNEL, request_chans); + return; + } + + /* Store "client" access flags */ + if (IsUser(client)) + client_member_modes = get_channel_access(client, channel); + if (MyUser(client) && !IsULine(client) && + !op_can_override("channel:override:kick:no-ops",client,channel,NULL) && + !check_channel_access(client, channel, "hoaq")) + { + sendnumeric(client, ERR_CHANOPRIVSNEEDED, channel->name); + return; + } + + strlcpy(request, parv[2], sizeof(request)); + for (user = strtoken(&p2, request, ","); user; user = strtoken(&p2, NULL, ",")) + { + if (MyUser(client) && (++ntargets > maxtargets)) { - sendnumeric(client, ERR_NOSUCHCHANNEL, name); - continue; + sendnumeric(client, ERR_TOOMANYTARGETS, user, maxtargets, "KICK"); + break; } - /* Store "client" access flags */ - if (IsUser(client)) - client_flags = get_access(client, channel); - if (MyUser(client) && !IsULine(client) && !op_can_override("channel:override:kick:no-ops",client,channel,NULL) - && !(client_flags & CHFL_ISOP) && !(client_flags & CHFL_HALFOP)) + + if (!(target = find_chasing(client, user, &chasing))) + continue; /* No such user left! */ + + if (!target->user) + continue; /* non-user */ + + lp = find_membership_link(target->user->channel, channel); + if (!lp) { - sendnumeric(client, ERR_CHANOPRIVSNEEDED, channel->chname); + if (MyUser(client)) + sendnumeric(client, ERR_USERNOTINCHANNEL, user, request_chans); continue; } - for (; (user = strtoken(&p2, parv[2], ",")); parv[2] = NULL) - { - long who_flags; + if (IsULine(client) || IsServer(client)) + goto attack; - if (MyUser(client) && (++ntargets > maxtargets)) + /* Note for coders regarding oper override: + * always let a remote kick (=from a user on another server) through or + * else we will get desynced. In short this means all the denying should + * always contain a && MyUser(client) and at the end + * a remote kick should always be allowed (pass through). -- Syzop + */ + + /* Store "target" access flags */ + target_member_modes = get_channel_access(target, channel); + + badkick = NULL; + ret = EX_ALLOW; + for (h = Hooks[HOOKTYPE_CAN_KICK]; h; h = h->next) { + int n = (*(h->func.intfunc))(client, target, channel, comment, client_member_modes, target_member_modes, &badkick); + + if (n == EX_DENY) + ret = n; + else if (n == EX_ALWAYS_DENY) { - sendnumeric(client, ERR_TOOMANYTARGETS, user, maxtargets, "KICK"); + ret = n; break; } + } - if (!(who = find_chasing(client, user, &chasing))) - continue; /* No such user left! */ + if (ret == EX_ALWAYS_DENY) + { + if (MyUser(client) && badkick) + sendto_one(client, NULL, "%s", badkick); /* send error, if any */ - if (!who->user) - continue; /* non-user */ + if (MyUser(client)) + continue; /* reject the kick (note: we never block remote kicks) */ + } - lp = find_membership_link(who->user->channel, channel); - if (!lp) - { - if (MyUser(client)) - sendnumeric(client, ERR_USERNOTINCHANNEL, user, name); - continue; - } - - if (IsULine(client) || IsServer(client)) - goto attack; - - /* Note for coders regarding oper override: - * always let a remote kick (=from a user on another server) through or - * else we will get desynced. In short this means all the denying should - * always contain a && MyUser(client) and at the end - * a remote kick should always be allowed (pass through). -- Syzop - */ - - /* Store "who" access flags */ - who_flags = get_access(who, channel); - - badkick = NULL; - ret = EX_ALLOW; - for (h = Hooks[HOOKTYPE_CAN_KICK]; h; h = h->next) { - int n = (*(h->func.intfunc))(client, who, channel, comment, client_flags, who_flags, &badkick); - - if (n == EX_DENY) - ret = n; - else if (n == EX_ALWAYS_DENY) - { - ret = n; - break; - } - } - - if (ret == EX_ALWAYS_DENY) + if (ret == EX_DENY) + { + /* If set it means 'not allowed to kick'.. now check if (s)he can override that.. */ + if (op_can_override("channel:override:kick:no-ops",client,channel,NULL)) { + kick_operoverride_msg(client, channel, target, comment); + goto attack; /* all other checks don't matter anymore (and could cause double msgs) */ + } else { + /* Not an oper overriding */ if (MyUser(client) && badkick) sendto_one(client, NULL, "%s", badkick); /* send error, if any */ - if (MyUser(client)) - continue; /* reject the kick (note: we never block remote kicks) */ + continue; /* reject the kick */ } + } - if (ret == EX_DENY) + // FIXME: Most, maybe even all, of these must be moved to HOOKTYPE_CAN_KICK checks in the corresponding halfop/chanop/chanadmin/chanowner modules :) + // !!!! FIXME + + /* we are neither +o nor +h, OR.. + * we are +h but target is +o, OR... + * we are +h and target is +h + */ + if (op_can_override("channel:override:kick:no-ops",client,channel,NULL)) + { + if ((!check_channel_access_string(client_member_modes, "o") && !check_channel_access_string(client_member_modes, "h")) || + (check_channel_access_string(client_member_modes, "h") && check_channel_access_string(target_member_modes, "h")) || + (check_channel_access_string(client_member_modes, "h") && check_channel_access_string(target_member_modes, "o"))) { - /* If set it means 'not allowed to kick'.. now check if (s)he can override that.. */ - if (op_can_override("channel:override:kick:no-ops",client,channel,NULL)) - { - sendto_snomask(SNO_EYES, - "*** OperOverride -- %s (%s@%s) KICK %s %s (%s)", - client->name, client->user->username, client->user->realhost, - channel->chname, who->name, comment); - ircd_log(LOG_OVERRIDE,"OVERRIDE: %s (%s@%s) KICK %s %s (%s)", - client->name, client->user->username, client->user->realhost, - channel->chname, who->name, comment); - goto attack; /* all other checks don't matter anymore (and could cause double msgs) */ - } else { - /* Not an oper overriding */ - if (MyUser(client) && badkick) - sendto_one(client, NULL, "%s", badkick); /* send error, if any */ + kick_operoverride_msg(client, channel, target, comment); + goto attack; + } /* is_chan_op */ - continue; /* reject the kick */ - } - } + } - /* we are neither +o nor +h, OR.. - * we are +h but victim is +o, OR... - * we are +h and victim is +h - */ - if (op_can_override("channel:override:kick:no-ops",client,channel,NULL)) + /* target is +a/+q, and we are not +q? */ + if (check_channel_access_string(target_member_modes, "qa") && !check_channel_access_string(client_member_modes, "q")) + { + if (client == target) + goto attack; /* kicking self == ok */ + if (op_can_override("channel:override:kick:owner",client,channel,NULL)) /* (and f*ck local ops) */ { - if ((!(client_flags & CHFL_ISOP) && !(client_flags & CHFL_HALFOP)) || - ((client_flags & CHFL_HALFOP) && (who_flags & CHFL_ISOP)) || - ((client_flags & CHFL_HALFOP) && (who_flags & CHFL_HALFOP))) - { - sendto_snomask(SNO_EYES, - "*** OperOverride -- %s (%s@%s) KICK %s %s (%s)", - client->name, client->user->username, client->user->realhost, - channel->chname, who->name, comment); - - /* Logging Implementation added by XeRXeS */ - ircd_log(LOG_OVERRIDE,"OVERRIDE: %s (%s@%s) KICK %s %s (%s)", - client->name, client->user->username, client->user->realhost, - channel->chname, who->name, comment); - - goto attack; - } /* is_chan_op */ - + /* IRCop kicking owner/prot */ + kick_operoverride_msg(client, channel, target, comment); + goto attack; } - - /* victim is +a or +q, we are not +q */ - if ((who_flags & (CHFL_CHANOWNER|CHFL_CHANADMIN)) - && !(client_flags & CHFL_CHANOWNER)) { - if (client == who) - goto attack; /* kicking self == ok */ - if (op_can_override("channel:override:kick:owner",client,channel,NULL)) /* (and f*ck local ops) */ - { /* IRCop kicking owner/prot */ - sendto_snomask(SNO_EYES, - "*** OperOverride -- %s (%s@%s) KICK %s %s (%s)", - client->name, client->user->username, client->user->realhost, - channel->chname, who->name, comment); - - /* Logging Implementation added by XeRXeS */ - ircd_log(LOG_OVERRIDE,"OVERRIDE: %s (%s@%s) KICK %s %s (%s)", - client->name, client->user->username, client->user->realhost, - channel->chname, who->name, comment); - - goto attack; - } - else if (!IsULine(client) && (who != client) && MyUser(client)) - { - char errbuf[NICKLEN+25]; - if (who_flags & CHFL_CHANOWNER) - ircsnprintf(errbuf, sizeof(errbuf), "%s is a channel owner", - who->name); - else - ircsnprintf(errbuf, sizeof(errbuf), "%s is a channel admin", - who->name); - sendnumeric(client, ERR_CANNOTDOCOMMAND, "KICK", - errbuf); - goto deny; - } /* chanadmin/chanowner */ - } - - /* victim is +o, we are +h [operoverride is already taken care of 2 blocks above] */ - if ((who_flags & CHFL_ISOP) && (client_flags & CHFL_HALFOP) - && !(client_flags & CHFL_ISOP) && !IsULine(client) && MyUser(client)) + else if (!IsULine(client) && (target != client) && MyUser(client)) { - char errbuf[NICKLEN+30]; - ircsnprintf(errbuf, sizeof(errbuf), "%s is a channel operator", who->name); - sendnumeric(client, ERR_CANNOTDOCOMMAND, "KICK", - errbuf); + char errbuf[NICKLEN+25]; + if (check_channel_access_string(target_member_modes, "q")) + ircsnprintf(errbuf, sizeof(errbuf), "%s is a channel owner", target->name); + else + ircsnprintf(errbuf, sizeof(errbuf), "%s is a channel admin", target->name); + sendnumeric(client, ERR_CANNOTDOCOMMAND, "KICK", errbuf); goto deny; } + } - /* victim is +h, we are +h [operoverride is already taken care of 3 blocks above] */ - if ((who_flags & CHFL_HALFOP) && (client_flags & CHFL_HALFOP) - && !(client_flags & CHFL_ISOP) && MyUser(client)) - { - char errbuf[NICKLEN+15]; - ircsnprintf(errbuf, sizeof(errbuf), "%s is a halfop", who->name); - sendnumeric(client, ERR_CANNOTDOCOMMAND, "KICK", - errbuf); - goto deny; - } /* halfop */ + /* target is +o, we are +h [operoverride is already taken care of 2 blocks above] */ + if (check_channel_access_string(target_member_modes, "h") && check_channel_access_string(client_member_modes, "h") + && !check_channel_access_string(client_member_modes, "o") && !IsULine(client) && MyUser(client)) + { + char errbuf[NICKLEN+30]; + ircsnprintf(errbuf, sizeof(errbuf), "%s is a channel operator", target->name); + sendnumeric(client, ERR_CANNOTDOCOMMAND, "KICK", + errbuf); + goto deny; + } - /* allowed (either coz access granted or a remote kick), so attack! */ - goto attack; + /* target is +h, we are +h [operoverride is already taken care of 3 blocks above] */ + if (check_channel_access_string(target_member_modes, "o") && check_channel_access_string(client_member_modes, "h") + && !check_channel_access_string(client_member_modes, "o") && MyUser(client)) + { + char errbuf[NICKLEN+15]; + ircsnprintf(errbuf, sizeof(errbuf), "%s is a halfop", target->name); + sendnumeric(client, ERR_CANNOTDOCOMMAND, "KICK", + errbuf); + goto deny; + } /* halfop */ - deny: - continue; + /* allowed (either coz access granted or a remote kick), so attack! */ + goto attack; - attack: - if (MyConnect(client)) { - int breakit = 0; - Hook *h; - for (h = Hooks[HOOKTYPE_PRE_LOCAL_KICK]; h; h = h->next) { - if((*(h->func.intfunc))(client,who,channel,comment) > 0) { - breakit = 1; - break; - } + deny: + continue; + + attack: + if (MyConnect(client)) { + int breakit = 0; + Hook *h; + for (h = Hooks[HOOKTYPE_PRE_LOCAL_KICK]; h; h = h->next) { + if ((*(h->func.intfunc))(client,target,channel,comment) > 0) { + breakit = 1; + break; } - if (breakit) - continue; } + if (breakit) + continue; + } - kick_user(recv_mtags, channel, client, who, comment); - } /* loop on parv[2] */ - if (MyUser(client)) - break; - } /* loop on parv[1] */ + kick_user(recv_mtags, channel, client, target, comment); + } } diff --git a/src/modules/kill.c b/src/modules/kill.c index 67c53c3..2a62a75 100644 --- a/src/modules/kill.c +++ b/src/modules/kill.c @@ -29,7 +29,7 @@ ModuleHeader MOD_HEADER "5.0", "command /kill", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -56,7 +56,9 @@ MOD_UNLOAD() */ CMD_FUNC(cmd_kill) { - char *targetlist, *reason; + char targetlist[BUFSIZE]; + char reason[BUFSIZE]; + char *str; char *nick, *save = NULL; Client *target; Hook *h; @@ -69,20 +71,18 @@ CMD_FUNC(cmd_kill) return; } - targetlist = parv[1]; - reason = parv[2]; - if (!IsServer(client->direction) && !ValidatePermissionsForPath("kill:global",client,NULL,NULL,NULL) && !ValidatePermissionsForPath("kill:local",client,NULL,NULL,NULL)) { sendnumeric(client, ERR_NOPRIVILEGES); return; } - if (strlen(reason) > iConf.quit_length) - reason[iConf.quit_length] = '\0'; - if (MyUser(client)) - targetlist = canonize(targetlist); + strlcpy(targetlist, canonize(parv[1]), sizeof(targetlist)); + else + strlcpy(targetlist, parv[1], sizeof(targetlist)); + + strlncpy(reason, parv[2], sizeof(reason), iConf.quit_length); for (nick = strtoken(&save, targetlist, ","); nick; nick = strtoken(&save, NULL, ",")) { @@ -94,7 +94,7 @@ CMD_FUNC(cmd_kill) break; } - target = find_person(nick, NULL); + target = find_user(nick, NULL); /* If a local user issued the /KILL then we will "chase" the user. * In other words: we'll check the history for recently changed nicks. @@ -138,16 +138,10 @@ CMD_FUNC(cmd_kill) /* From here on, the kill is probably going to be successful. */ - sendto_snomask(SNO_KILLS, - "*** Received KILL message for %s (%s@%s) from %s: %s", - target->name, target->user->username, GetHost(target), - client->name, - reason); - - ircd_log(LOG_KILL, "KILL (%s) by %s (%s)", - make_nick_user_host(target->name, target->user->username, GetHost(target)), - client->name, - reason); + unreal_log(ULOG_INFO, "kill", "KILL_COMMAND", client, + "Client killed: $target.details [by: $client] ($reason)", + log_data_client("target", target), + log_data_string("reason", reason)); new_message(client, recv_mtags, &mtags); @@ -177,7 +171,7 @@ CMD_FUNC(cmd_kill) } if (MyUser(client)) - RunHook3(HOOKTYPE_LOCAL_KILL, client, target, reason); + RunHook(HOOKTYPE_LOCAL_KILL, client, target, reason); ircsnprintf(buf2, sizeof(buf2), "Killed by %s (%s)", client->name, reason); exit_client(target, mtags, buf2); diff --git a/src/modules/knock.c b/src/modules/knock.c index d2197af..16d2a7f 100644 --- a/src/modules/knock.c +++ b/src/modules/knock.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", "command /knock", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -78,7 +78,7 @@ CMD_FUNC(cmd_knock) Hook *h; int i = 0; MessageTag *mtags = NULL; - char *reason; + const char *reason; if (IsServer(client)) return; @@ -97,7 +97,7 @@ CMD_FUNC(cmd_knock) return; } - if (!(channel = find_channel(parv[1], NULL))) + if (!(channel = find_channel(parv[1]))) { sendnumeric(client, ERR_CANNOTKNOCK, parv[1], "Channel does not exist!"); return; @@ -106,25 +106,25 @@ CMD_FUNC(cmd_knock) /* IsMember bugfix by codemastr */ if (IsMember(client, channel) == 1) { - sendnumeric(client, ERR_CANNOTKNOCK, channel->chname, "You're already there!"); + sendnumeric(client, ERR_CANNOTKNOCK, channel->name, "You're already there!"); return; } - if (!(channel->mode.mode & MODE_INVITEONLY)) + if (!has_channel_mode(channel, 'i')) { - sendnumeric(client, ERR_CANNOTKNOCK, channel->chname, "Channel is not invite only!"); + sendnumeric(client, ERR_CANNOTKNOCK, channel->name, "Channel is not invite only!"); return; } if (is_banned(client, channel, BANCHK_JOIN, NULL, NULL)) { - sendnumeric(client, ERR_CANNOTKNOCK, channel->chname, "You're banned!"); + sendnumeric(client, ERR_CANNOTKNOCK, channel->name, "You're banned!"); return; } for (h = Hooks[HOOKTYPE_PRE_KNOCK]; h; h = h->next) { - i = (*(h->func.intfunc))(client,channel); + i = (*(h->func.intfunc))(client, channel, &reason); if (i == HOOK_DENY || i == HOOK_ALLOW) break; } @@ -142,19 +142,19 @@ CMD_FUNC(cmd_knock) new_message(&me, NULL, &mtags); - sendto_channel(channel, &me, NULL, PREFIX_OP|PREFIX_ADMIN|PREFIX_OWNER, + sendto_channel(channel, &me, NULL, "o", 0, SEND_LOCAL, mtags, ":%s NOTICE @%s :[Knock] by %s!%s@%s (%s)", - me.name, channel->chname, + me.name, channel->name, client->name, client->user->username, GetHost(client), reason); - sendto_server(client, 0, 0, mtags, ":%s KNOCK %s :%s", client->id, channel->chname, reason); + sendto_server(client, 0, 0, mtags, ":%s KNOCK %s :%s", client->id, channel->name, reason); if (MyUser(client)) - sendnotice(client, "Knocked on %s", channel->chname); + sendnotice(client, "Knocked on %s", channel->name); - RunHook4(HOOKTYPE_KNOCK, client, channel, mtags, parv[2]); + RunHook(HOOKTYPE_KNOCK, client, channel, mtags, parv[2]); free_message_tags(mtags); } diff --git a/src/modules/labeled-response.c b/src/modules/labeled-response.c index 56e9183..5027fe0 100644 --- a/src/modules/labeled-response.c +++ b/src/modules/labeled-response.c @@ -28,7 +28,7 @@ ModuleHeader MOD_HEADER "5.0", "Labeled response CAP", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Data structures */ @@ -43,8 +43,8 @@ struct LabeledResponseContext { }; /* Forward declarations */ -int lr_pre_command(Client *from, MessageTag *mtags, char *buf); -int lr_post_command(Client *from, MessageTag *mtags, char *buf); +int lr_pre_command(Client *from, MessageTag *mtags, const char *buf); +int lr_post_command(Client *from, MessageTag *mtags, const char *buf); int lr_close_connection(Client *client); int lr_packet(Client *from, Client *to, Client *intended_to, char **msg, int *len); void *_labeled_response_save_context(void); @@ -61,7 +61,7 @@ static long CAP_LABELED_RESPONSE = 0L; static char packet[8192]; -int labeled_response_mtag_is_ok(Client *client, char *name, char *value); +int labeled_response_mtag_is_ok(Client *client, const char *name, const char *value); MOD_TEST() { @@ -111,7 +111,7 @@ MOD_UNLOAD() return MOD_SUCCESS; } -int lr_pre_command(Client *from, MessageTag *mtags, char *buf) +int lr_pre_command(Client *from, MessageTag *mtags, const char *buf) { memset(¤tcmd, 0, sizeof(currentcmd)); labeled_response_inhibit = labeled_response_inhibit_end = labeled_response_force = 0; @@ -156,7 +156,7 @@ char *gen_start_batch(void) return buf; } -int lr_post_command(Client *from, MessageTag *mtags, char *buf) +int lr_post_command(Client *from, MessageTag *mtags, const char *buf) { /* ** IMPORTANT ** * Take care NOT to return here, use 'goto done' instead @@ -336,7 +336,7 @@ int lr_packet(Client *from, Client *to, Client *intended_to, char **msg, int *le /** This function verifies if the client sending the * tag is permitted to do so and uses a permitted syntax. */ -int labeled_response_mtag_is_ok(Client *client, char *name, char *value) +int labeled_response_mtag_is_ok(Client *client, const char *name, const char *value) { if (BadPtr(value)) return 0; diff --git a/src/modules/lag.c b/src/modules/lag.c index b2c1b59..9018303 100644 --- a/src/modules/lag.c +++ b/src/modules/lag.c @@ -31,7 +31,7 @@ ModuleHeader MOD_HEADER "5.0", /* Version */ "command /lag", /* Short description of module */ "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* This is called on module init, before Server Ready */ @@ -78,7 +78,7 @@ CMD_FUNC(cmd_lag) return; } - if (hunt_server(client, recv_mtags, ":%s LAG :%s", 1, parc, parv) == HUNTED_NOSUCH) + if (hunt_server(client, recv_mtags, "LAG", 1, parc, parv) == HUNTED_NOSUCH) return; sendnotice(client, "Lag reply -- %s %s %lld", me.name, parv[1], (long long)TStime()); diff --git a/src/modules/link-security.c b/src/modules/link-security.c index d4e6341..76e8bed 100644 --- a/src/modules/link-security.c +++ b/src/modules/link-security.c @@ -29,14 +29,14 @@ ModuleHeader MOD_HEADER "5.0", "Link Security CAP", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Forward declarations */ -char *link_security_md_serialize(ModData *m); -void link_security_md_unserialize(char *str, ModData *m); +const char *link_security_md_serialize(ModData *m); +void link_security_md_unserialize(const char *str, ModData *m); EVENT(checklinksec); -char *link_security_capability_parameter(Client *client); +const char *link_security_capability_parameter(Client *client); CMD_FUNC(cmd_linksecurity); /* Global variables */ @@ -59,6 +59,7 @@ MOD_INIT() mreq.serialize = link_security_md_serialize; mreq.unserialize = link_security_md_unserialize; mreq.sync = 1; + mreq.self_write = 1; link_security_md = ModDataAdd(modinfo->handle, mreq); if (!link_security_md) { @@ -97,7 +98,7 @@ MOD_UNLOAD() */ #define LNKSECMAGIC 100 -char *link_security_md_serialize(ModData *m) +const char *link_security_md_serialize(ModData *m) { static char buf[32]; if (m->i == 0) @@ -106,7 +107,7 @@ char *link_security_md_serialize(ModData *m) return buf; } -void link_security_md_unserialize(char *str, ModData *m) +void link_security_md_unserialize(const char *str, ModData *m) { m->i = atoi(str) + LNKSECMAGIC; } @@ -118,9 +119,9 @@ int certificate_verification_active(Client *client) { ConfigItem_link *conf; - if (!client->serv || !client->serv->conf) + if (!client->server || !client->server->conf) return 0; /* wtf? */ - conf = client->serv->conf; + conf = client->server->conf; if (conf->verify_certificate) return 1; /* yes, verify-certificate is 'yes' */ @@ -140,7 +141,7 @@ int certificate_verification_active(Client *client) /** Calculate our (local) link-security level. * This means stepping through the list of directly linked - * servers and determining if they are linked via SSL and + * servers and determining if they are linked via TLS and * certificate verification is active. * @returns value from 0 to 2. */ @@ -154,7 +155,7 @@ int our_link_security(void) if (IsLocalhost(client)) continue; /* server connected via localhost */ if (!IsSecure(client)) - return 0; /* Any non-SSL server (which is not localhost) results in level 0. */ + return 0; /* Any non-TLS server (which is not localhost) results in level 0. */ if (!certificate_verification_active(client)) level = 1; /* downgrade to level 1 */ } @@ -177,7 +178,6 @@ EVENT(checklinksec) int last_local_link_security = local_link_security; int last_global_link_security = global_link_security; Client *client; - char *s; int v; int warning_sent = 0; @@ -193,7 +193,7 @@ EVENT(checklinksec) global_link_security = 2; list_for_each_entry(client, &global_server_list, client_node) { - s = moddata_client_get(client, "link-security"); + const char *s = moddata_client_get(client, "link-security"); if (s) { v = atoi(s); @@ -209,15 +209,19 @@ EVENT(checklinksec) if (local_link_security < last_local_link_security) { - sendto_realops("Local link-security downgraded from level %d to %d due to just linked in server(s)", - last_local_link_security, local_link_security); + unreal_log(ULOG_INFO, "link-security", "LOCAL_LINK_SECURITY_DOWNGRADED", NULL, + "Local link-security downgraded from level $previous_level to $new_level due to just linked in server(s)", + log_data_integer("previous_level", last_local_link_security), + log_data_integer("new_level", local_link_security)); warning_sent = 1; } if (global_link_security < last_global_link_security) { - sendto_realops("Global link-security downgraded from level %d to %d due to just linked in server(s)", - last_global_link_security, global_link_security); + unreal_log(ULOG_INFO, "link-security", "GLOBAL_LINK_SECURITY_DOWNGRADED", NULL, + "Global link-security downgraded from level $previous_level to $new_level due to just linked in server(s)", + log_data_integer("previous_level", last_global_link_security), + log_data_integer("new_level", global_link_security)); warning_sent = 1; } @@ -225,12 +229,14 @@ EVENT(checklinksec) if (warning_sent) { - sendto_realops("Effective (network-wide) link-security is: level %d", effective_link_security); - sendto_realops("More information about this can be found at https://www.unrealircd.org/docs/Link_security"); + unreal_log(ULOG_INFO, "link-security", "EFFECTIVE_LINK_SECURITY_REPORT", NULL, + "Effective (network-wide) link-security is now: level $effective_link_security\n" + "More information about this can be found at https://www.unrealircd.org/docs/Link_security", + log_data_integer("effective_link_security", effective_link_security)); } } -char *link_security_capability_parameter(Client *client) +const char *link_security_capability_parameter(Client *client) { return valtostr(effective_link_security); } @@ -239,8 +245,6 @@ char *link_security_capability_parameter(Client *client) CMD_FUNC(cmd_linksecurity) { Client *acptr; - char *s; - int v; if (!IsOper(client)) { @@ -253,15 +257,11 @@ CMD_FUNC(cmd_linksecurity) sendtxtnumeric(client, "= By server ="); list_for_each_entry(acptr, &global_server_list, client_node) { - v = -1; - s = moddata_client_get(acptr, "link-security"); + const char *s = moddata_client_get(acptr, "link-security"); if (s) - { - v = atoi(s); - sendtxtnumeric(client, "%s: level %d", acptr->name, v); - } else { + sendtxtnumeric(client, "%s: level %d", acptr->name, atoi(s)); + else sendtxtnumeric(client, "%s: level UNKNOWN", acptr->name); - } } sendtxtnumeric(client, "-"); @@ -271,9 +271,9 @@ CMD_FUNC(cmd_linksecurity) sendtxtnumeric(client, "= Legend ="); sendtxtnumeric(client, "Higher level means better link security"); sendtxtnumeric(client, "Level UNKNOWN: Not an UnrealIRCd server (eg: services) or an old version (<4.0.14)"); - sendtxtnumeric(client, "Level 0: One or more servers linked insecurely (not using SSL/TLS)"); - sendtxtnumeric(client, "Level 1: Servers are linked with SSL/TLS but at least one of them is not verifying certificates"); - sendtxtnumeric(client, "Level 2: Servers linked with SSL/TLS and certificates are properly verified"); + sendtxtnumeric(client, "Level 0: One or more servers linked insecurely (not using TLS)"); + sendtxtnumeric(client, "Level 1: Servers are linked with TLS but at least one of them is not verifying certificates"); + sendtxtnumeric(client, "Level 2: Servers linked with TLS and certificates are properly verified"); sendtxtnumeric(client, "-"); sendtxtnumeric(client, "= More information ="); sendtxtnumeric(client, "To understand more about link security and how to improve your level"); diff --git a/src/modules/links.c b/src/modules/links.c index 6036cc7..041bd97 100644 --- a/src/modules/links.c +++ b/src/modules/links.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", "command /links", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -69,7 +69,7 @@ CMD_FUNC(cmd_links) sendnumeric(client, RPL_LINKS, acptr->name, me.name, 1, (acptr->info[0] ? acptr->info : "(Unknown Location)")); else - sendnumeric(client, RPL_LINKS, acptr->name, acptr->serv->up, + sendnumeric(client, RPL_LINKS, acptr->name, acptr->uplink ? acptr->uplink->name : me.name, acptr->hopcount, (acptr->info[0] ? acptr->info : "(Unknown Location)")); } diff --git a/src/modules/list.c b/src/modules/list.c index ab4bdea..f7ece82 100644 --- a/src/modules/list.c +++ b/src/modules/list.c @@ -33,7 +33,7 @@ ModuleHeader MOD_HEADER "5.0", "command /list", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; typedef struct ChannelListOptions ChannelListOptions; @@ -54,6 +54,7 @@ struct ChannelListOptions { /* Global variables */ ModDataInfo *list_md = NULL; +char modebuf[BUFSIZE], parabuf[BUFSIZE]; /* Macros */ #define CHANNELLISTOPTIONS(x) ((ChannelListOptions *)moddata_local_client(x, list_md).ptr) @@ -125,6 +126,7 @@ CMD_FUNC(cmd_list) NameList *nolist = NULL; int ntargets = 0; int maxtargets = max_targets_for_command("LIST"); + char request[BUFSIZE]; static char *usage[] = { " Usage: /LIST ", @@ -187,8 +189,8 @@ CMD_FUNC(cmd_list) usermin = 0; /* Minimum of 0 */ usermax = -1; /* No maximum */ - for (name = strtoken(&p, parv[1], ","); name && !error; - name = strtoken(&p, NULL, ",")) + strlcpy(request, parv[1], sizeof(request)); + for (name = strtoken(&p, request, ","); name && !error; name = strtoken(&p, NULL, ",")) { if (MyUser(client) && (++ntargets > maxtargets)) { @@ -269,21 +271,17 @@ CMD_FUNC(cmd_list) } else /* Just a normal channel */ { - channel = find_channel(name, NULL); + channel = find_channel(name); if (channel && (ShowChannel(client, channel) || ValidatePermissionsForPath("channel:see:list:secret",client,NULL,channel,NULL))) { -#ifdef LIST_SHOW_MODES modebuf[0] = '['; - channel_modes(client, modebuf+1, parabuf, sizeof(modebuf)-1, sizeof(parabuf), channel); + channel_modes(client, modebuf+1, parabuf, sizeof(modebuf)-1, sizeof(parabuf), channel, 0); if (modebuf[2] == '\0') modebuf[0] = '\0'; else strlcat(modebuf, "]", sizeof modebuf); -#endif sendnumeric(client, RPL_LIST, name, channel->users, -#ifdef LIST_SHOW_MODES modebuf, -#endif (channel->topic ? channel->topic : "")); } @@ -343,13 +341,11 @@ int send_list(Client *client) ConfigItem_offchans *x; for (x = conf_offchans; x; x = x->next) { - if (find_channel(x->chname, NULL)) + if (find_channel(x->name)) continue; /* exists, >0 users.. will be sent later */ - sendnumeric(client, RPL_LIST, x->chname, + sendnumeric(client, RPL_LIST, x->name, 0, -#ifdef LIST_SHOW_MODES "", -#endif x->topic ? x->topic : ""); } } @@ -366,11 +362,11 @@ int send_list(Client *client) continue; /* set::hide-list { deny-channel } */ - if (!IsOper(client) && iConf.hide_list && find_channel_allowed(client, channel->chname)) + if (!IsOper(client) && iConf.hide_list && find_channel_allowed(client, channel->name)) continue; /* Similarly, hide unjoinable channels for non-ircops since it would be confusing */ - if (!IsOper(client) && !valid_channelname(channel->chname)) + if (!IsOper(client) && !valid_channelname(channel->name)) continue; /* Much more readable like this -- codemastr */ @@ -394,39 +390,33 @@ int send_list(Client *client) continue; /* Must not be on nolist (if it exists) */ - if (lopt->nolist && find_name_list_match(lopt->nolist, channel->chname)) + if (lopt->nolist && find_name_list_match(lopt->nolist, channel->name)) continue; /* Must be on yeslist (if it exists) */ - if (lopt->yeslist && !find_name_list_match(lopt->yeslist, channel->chname)) + if (lopt->yeslist && !find_name_list_match(lopt->yeslist, channel->name)) continue; } -#ifdef LIST_SHOW_MODES modebuf[0] = '['; - channel_modes(client, modebuf+1, parabuf, sizeof(modebuf)-1, sizeof(parabuf), channel); + channel_modes(client, modebuf+1, parabuf, sizeof(modebuf)-1, sizeof(parabuf), channel, 0); if (modebuf[2] == '\0') modebuf[0] = '\0'; else strlcat(modebuf, "]", sizeof modebuf); -#endif if (!ValidatePermissionsForPath("channel:see:list:secret",client,NULL,channel,NULL)) sendnumeric(client, RPL_LIST, ShowChannel(client, - channel) ? channel->chname : + channel) ? channel->name : "*", channel->users, -#ifdef LIST_SHOW_MODES ShowChannel(client, channel) ? modebuf : "", -#endif ShowChannel(client, channel) ? (channel->topic ? channel->topic : "") : ""); else - sendnumeric(client, RPL_LIST, channel->chname, + sendnumeric(client, RPL_LIST, channel->name, channel->users, -#ifdef LIST_SHOW_MODES modebuf, -#endif (channel->topic ? channel->topic : "")); numsend--; } diff --git a/src/modules/locops.c b/src/modules/locops.c index 5437385..1943d87 100644 --- a/src/modules/locops.c +++ b/src/modules/locops.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", "command /locops", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -58,9 +58,7 @@ MOD_UNLOAD() */ CMD_FUNC(cmd_locops) { - char *message; - - message = parc > 1 ? parv[1] : NULL; + const char *message = parc > 1 ? parv[1] : NULL; if (BadPtr(message)) { diff --git a/src/modules/lusers.c b/src/modules/lusers.c index 4059eb4..3f07805 100644 --- a/src/modules/lusers.c +++ b/src/modules/lusers.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", "command /lusers", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -59,7 +59,7 @@ CMD_FUNC(cmd_lusers) { char flatmap; - if (hunt_server(client, recv_mtags, ":%s LUSERS :%s", 1, parc, parv) != HUNTED_ISME) + if (hunt_server(client, recv_mtags, "LUSERS", 1, parc, parv) != HUNTED_ISME) return; flatmap = (FLAT_MAP && !ValidatePermissionsForPath("server:info:lusers",client,NULL,NULL,NULL)) ? 1 : 0; @@ -83,12 +83,14 @@ char flatmap; sendnumeric(client, RPL_LUSERME, irccounts.me_clients, flatmap ? 0 : irccounts.me_servers); sendnumeric(client, RPL_LOCALUSERS, irccounts.me_clients, irccounts.me_max, irccounts.me_clients, irccounts.me_max); sendnumeric(client, RPL_GLOBALUSERS, irccounts.clients, irccounts.global_max, irccounts.clients, irccounts.global_max); - if ((irccounts.me_clients + irccounts.me_servers) > max_connection_count) + if (irccounts.me_clients > max_connection_count) { - max_connection_count = - irccounts.me_clients + irccounts.me_servers; + max_connection_count = irccounts.me_clients; if (max_connection_count % 10 == 0) /* only send on even tens */ - sendto_ops("New record on this server: %d connections (%d clients)", - max_connection_count, irccounts.me_clients); + { + unreal_log(ULOG_INFO, "client", "NEW_USER_RECORD", NULL, + "New record on this server: $num_users connections", + log_data_integer("num_users", max_connection_count)); + } } } diff --git a/src/modules/map.c b/src/modules/map.c index a0c8aa4..1f57e9e 100644 --- a/src/modules/map.c +++ b/src/modules/map.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", "command /map", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -71,7 +71,7 @@ static void dump_map(Client *client, Client *server, char *mask, int prompt_leng else { sendnumeric(client, RPL_MAP, prompt, - length, server->name, server->serv->users, IsOper(client) ? server->id : ""); + length, server->name, server->server->users, IsOper(client) ? server->id : ""); cnt = 0; } @@ -88,7 +88,7 @@ static void dump_map(Client *client, Client *server, char *mask, int prompt_leng list_for_each_entry(acptr, &global_server_list, client_node) { - if (acptr->srvptr != server || + if (acptr->uplink != server || (IsULine(acptr) && HIDE_ULINES && !ValidatePermissionsForPath("server:info:map:ulines",client,NULL,NULL,NULL))) continue; SetMap(acptr); @@ -99,7 +99,7 @@ static void dump_map(Client *client, Client *server, char *mask, int prompt_leng { if (IsULine(acptr) && HIDE_ULINES && !ValidatePermissionsForPath("server:info:map:ulines",client,NULL,NULL,NULL)) continue; - if (acptr->srvptr != server) + if (acptr->uplink != server) continue; if (!IsMap(acptr)) continue; @@ -120,7 +120,7 @@ void dump_flat_map(Client *client, Client *server, int length) hide_ulines = (HIDE_ULINES && !ValidatePermissionsForPath("server:info:map:ulines",client,NULL,NULL,NULL)) ? 1 : 0; - sendnumeric(client, RPL_MAP, "", length, server->name, server->serv->users, ""); + sendnumeric(client, RPL_MAP, "", length, server->name, server->server->users, ""); list_for_each_entry(acptr, &global_server_list, client_node) { @@ -136,7 +136,7 @@ void dump_flat_map(Client *client, Client *server, int length) continue; if (--cnt == 0) *buf = '`'; - sendnumeric(client, RPL_MAP, buf, length-2, acptr->name, acptr->serv->users, ""); + sendnumeric(client, RPL_MAP, buf, length-2, acptr->name, acptr->server->users, ""); } } diff --git a/src/modules/md.c b/src/modules/md.c index 485e8a4..ba735b9 100644 --- a/src/modules/md.c +++ b/src/modules/md.c @@ -14,7 +14,7 @@ ModuleHeader MOD_HEADER "5.0", "command /MD (S2S only)", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; CMD_FUNC(cmd_md); @@ -23,11 +23,13 @@ void _broadcast_md_channel(ModDataInfo *mdi, Channel *channel, ModData *md); void _broadcast_md_member(ModDataInfo *mdi, Channel *channel, Member *m, ModData *md); void _broadcast_md_membership(ModDataInfo *mdi, Client *client, Membership *m, ModData *md); void _broadcast_md_globalvar(ModDataInfo *mdi, ModData *md); -void _broadcast_md_client_cmd(Client *except, Client *sender, Client *client, char *varname, char *value); -void _broadcast_md_channel_cmd(Client *except, Client *sender, Channel *channel, char *varname, char *value); -void _broadcast_md_member_cmd(Client *except, Client *sender, Channel *channel, Client *client, char *varname, char *value); -void _broadcast_md_membership_cmd(Client *except, Client *sender, Client *client, Channel *channel, char *varname, char *value); -void _broadcast_md_globalvar_cmd(Client *except, Client *sender, char *varname, char *value); +void _broadcast_md_client_cmd(Client *except, Client *sender, Client *client, const char *varname, const char *value); +void _broadcast_md_channel_cmd(Client *except, Client *sender, Channel *channel, const char *varname, const char *value); +void _broadcast_md_member_cmd(Client *except, Client *sender, Channel *channel, Client *client, const char *varname, const char *value); +void _broadcast_md_membership_cmd(Client *except, Client *sender, Client *client, Channel *channel, const char *varname, const char *value); +void _broadcast_md_globalvar_cmd(Client *except, Client *sender, const char *varname, const char *value); +void _moddata_add_s2s_mtags(Client *client, MessageTag **mtags); +void _moddata_extract_s2s_mtags(Client *client, MessageTag *mtags); void _send_moddata_client(Client *srv, Client *client); void _send_moddata_channel(Client *srv, Channel *channel); void _send_moddata_members(Client *srv); @@ -48,6 +50,8 @@ MOD_TEST() EfunctionAddVoid(modinfo->handle, EFUNC_BROADCAST_MD_MEMBER_CMD, _broadcast_md_member_cmd); EfunctionAddVoid(modinfo->handle, EFUNC_BROADCAST_MD_MEMBERSHIP_CMD, _broadcast_md_membership_cmd); EfunctionAddVoid(modinfo->handle, EFUNC_BROADCAST_MD_GLOBALVAR_CMD, _broadcast_md_globalvar_cmd); + EfunctionAddVoid(modinfo->handle, EFUNC_MODDATA_ADD_S2S_MTAGS, _moddata_add_s2s_mtags); + EfunctionAddVoid(modinfo->handle, EFUNC_MODDATA_EXTRACT_S2S_MTAGS, _moddata_extract_s2s_mtags); EfunctionAddVoid(modinfo->handle, EFUNC_SEND_MODDATA_CLIENT, _send_moddata_client); EfunctionAddVoid(modinfo->handle, EFUNC_SEND_MODDATA_CHANNEL, _send_moddata_channel); EfunctionAddVoid(modinfo->handle, EFUNC_SEND_MODDATA_MEMBERS, _send_moddata_members); @@ -72,6 +76,25 @@ MOD_UNLOAD() return MOD_SUCCESS; } +/** Check if client may write to this MD object */ +int md_access_check(Client *client, ModDataInfo *md, Client *target) +{ + if ((client == target) && md->self_write) + return 1; + + if (MyConnect(target) && !md->remote_write) + { + unreal_log(ULOG_WARNING, "md", "REMOTE_MD_WRITE_DENIED", client, + "Remote server $client tried to write moddata $moddata_name " + "of a client from ours ($target.name) -- attempt BLOCKED", + log_data_string("moddata_name", md->name), + log_data_client("target", target)); + return 0; + } + + return 1; +} + /** Set ModData command. * Syntax: MD * Example: MD client Syzop sslfp 123456789 @@ -88,7 +111,7 @@ MOD_UNLOAD() */ CMD_FUNC(cmd_md) { - char *type, *objname, *varname, *value; + const char *type, *objname, *varname, *value; ModDataInfo *md; if (!IsServer(client) || (parc < 4) || BadPtr(parv[3])) @@ -105,6 +128,10 @@ CMD_FUNC(cmd_md) md = findmoddata_byname(varname, MODDATATYPE_CLIENT); if (!md || !md->unserialize || !target) return; + + if (!md_access_check(client, md, target)) + return; + if (value) md->unserialize(value, &moddata_client(target, md)); else @@ -118,7 +145,7 @@ CMD_FUNC(cmd_md) } else if (!strcmp(type, "channel")) { - Channel *channel = find_channel(objname, NULL); + Channel *channel = find_channel(objname); md = findmoddata_byname(varname, MODDATATYPE_CHANNEL); if (!md || !md->unserialize || !channel) return; @@ -146,11 +173,11 @@ CMD_FUNC(cmd_md) return; *p++ = '\0'; - channel = find_channel(objname, NULL); + channel = find_channel(objname); if (!channel) return; - target = find_person(p, NULL); + target = find_user(p, NULL); if (!target) return; @@ -162,6 +189,9 @@ CMD_FUNC(cmd_md) if (!md || !md->unserialize) return; + if (!md_access_check(client, md, target)) + return; + if (value) md->unserialize(value, &moddata_member(m, md)); else @@ -186,11 +216,11 @@ CMD_FUNC(cmd_md) return; *p++ = '\0'; - target = find_person(objname, NULL); + target = find_user(objname, NULL); if (!target) return; - channel = find_channel(p, NULL); + channel = find_channel(p); if (!channel) return; @@ -202,6 +232,9 @@ CMD_FUNC(cmd_md) if (!md || !md->unserialize) return; + if (!md_access_check(client, md, target)) + return; + if (value) md->unserialize(value, &moddata_membership(m, md)); else @@ -232,7 +265,7 @@ CMD_FUNC(cmd_md) } } -void _broadcast_md_client_cmd(Client *except, Client *sender, Client *client, char *varname, char *value) +void _broadcast_md_client_cmd(Client *except, Client *sender, Client *client, const char *varname, const char *value) { if (value) { @@ -246,45 +279,45 @@ void _broadcast_md_client_cmd(Client *except, Client *sender, Client *client, ch } } -void _broadcast_md_channel_cmd(Client *except, Client *sender, Channel *channel, char *varname, char *value) +void _broadcast_md_channel_cmd(Client *except, Client *sender, Channel *channel, const char *varname, const char *value) { if (value) sendto_server(except, 0, 0, NULL, ":%s MD %s %s %s :%s", - sender->id, "channel", channel->chname, varname, value); + sender->id, "channel", channel->name, varname, value); else sendto_server(except, 0, 0, NULL, ":%s MD %s %s %s", - sender->id, "channel", channel->chname, varname); + sender->id, "channel", channel->name, varname); } -void _broadcast_md_member_cmd(Client *except, Client *sender, Channel *channel, Client *client, char *varname, char *value) +void _broadcast_md_member_cmd(Client *except, Client *sender, Channel *channel, Client *client, const char *varname, const char *value) { if (value) { sendto_server(except, 0, 0, NULL, ":%s MD %s %s:%s %s :%s", - sender->id, "member", channel->chname, client->id, varname, value); + sender->id, "member", channel->name, client->id, varname, value); } else { sendto_server(except, 0, 0, NULL, ":%s MD %s %s:%s %s", - sender->id, "member", channel->chname, client->id, varname); + sender->id, "member", channel->name, client->id, varname); } } -void _broadcast_md_membership_cmd(Client *except, Client *sender, Client *client, Channel *channel, char *varname, char *value) +void _broadcast_md_membership_cmd(Client *except, Client *sender, Client *client, Channel *channel, const char *varname, const char *value) { if (value) { sendto_server(except, 0, 0, NULL, ":%s MD %s %s:%s %s :%s", - sender->id, "membership", client->id, channel->chname, varname, value); + sender->id, "membership", client->id, channel->name, varname, value); } else { sendto_server(except, 0, 0, NULL, ":%s MD %s %s:%s %s", - sender->id, "membership", client->id, channel->chname, varname); + sender->id, "membership", client->id, channel->name, varname); } } -void _broadcast_md_globalvar_cmd(Client *except, Client *sender, char *varname, char *value) +void _broadcast_md_globalvar_cmd(Client *except, Client *sender, const char *varname, const char *value) { if (value) { @@ -306,35 +339,35 @@ void _broadcast_md_globalvar_cmd(Client *except, Client *sender, char *varname, void _broadcast_md_client(ModDataInfo *mdi, Client *client, ModData *md) { - char *value = md ? mdi->serialize(md) : NULL; + const char *value = md ? mdi->serialize(md) : NULL; broadcast_md_client_cmd(NULL, &me, client, mdi->name, value); } void _broadcast_md_channel(ModDataInfo *mdi, Channel *channel, ModData *md) { - char *value = md ? mdi->serialize(md) : NULL; + const char *value = md ? mdi->serialize(md) : NULL; broadcast_md_channel_cmd(NULL, &me, channel, mdi->name, value); } void _broadcast_md_member(ModDataInfo *mdi, Channel *channel, Member *m, ModData *md) { - char *value = md ? mdi->serialize(md) : NULL; + const char *value = md ? mdi->serialize(md) : NULL; broadcast_md_member_cmd(NULL, &me, channel, m->client, mdi->name, value); } void _broadcast_md_membership(ModDataInfo *mdi, Client *client, Membership *m, ModData *md) { - char *value = md ? mdi->serialize(md) : NULL; + const char *value = md ? mdi->serialize(md) : NULL; broadcast_md_membership_cmd(NULL, &me, client, m->channel, mdi->name, value); } void _broadcast_md_globalvar(ModDataInfo *mdi, ModData *md) { - char *value = md ? mdi->serialize(md) : NULL; + const char *value = md ? mdi->serialize(md) : NULL; broadcast_md_globalvar_cmd(NULL, &me, mdi->name, value); } @@ -348,7 +381,7 @@ void _send_moddata_client(Client *srv, Client *client) { if ((mdi->type == MODDATATYPE_CLIENT) && mdi->sync && mdi->serialize) { - char *value = mdi->serialize(&moddata_client(client, mdi)); + const char *value = mdi->serialize(&moddata_client(client, mdi)); if (value) sendto_one(srv, NULL, ":%s MD %s %s %s :%s", me.id, "client", client->id, mdi->name, value); @@ -356,6 +389,62 @@ void _send_moddata_client(Client *srv, Client *client) } } +/** Enhance the command with moddata message tags, so we can send + * traffic like @s2s-md/certfp=xxxxx UID .... + */ +void _moddata_add_s2s_mtags(Client *client, MessageTag **mtags_list) +{ + ModDataInfo *mdi; + char name[128]; + + for (mdi = MDInfo; mdi; mdi = mdi->next) + { + if ((mdi->type == MODDATATYPE_CLIENT) && (mdi->sync == MODDATA_SYNC_EARLY) && mdi->serialize) + { + MessageTag *m; + const char *value = mdi->serialize(&moddata_client(client, mdi)); + if (!value) + continue; + snprintf(name, sizeof(name), "s2s-md/%s", mdi->name); + + m = safe_alloc(sizeof(MessageTag)); + safe_strdup(m->name, name); + safe_strdup(m->value, value); + AddListItem(m, *mtags_list); + } + } +} + +/** Extract the s2s-md/ tags again from an incoming command, + * eg @s2s-md/certfp=xxxxx UID .... + */ +void _moddata_extract_s2s_mtags(Client *client, MessageTag *mtags) +{ + MessageTag *m; + ModDataInfo *md; + + for (m = mtags; m; m = m->next) + { + if (!strncmp(m->name, "s2s-md/", 7)) + { + char *varname = m->name + 7; + char *value = m->value; + + if (!value) + continue; + + md = findmoddata_byname(varname, MODDATATYPE_CLIENT); + if (!md || !md->unserialize) + continue; + + if (!md_access_check(client, md, client)) + return; + + md->unserialize(value, &moddata_client(client, md)); + } + } +} + /** Send all moddata attached to channel 'channel' to remote server 'srv' (if the module wants this), called by SJOIN */ void _send_moddata_channel(Client *srv, Channel *channel) { @@ -365,10 +454,10 @@ void _send_moddata_channel(Client *srv, Channel *channel) { if ((mdi->type == MODDATATYPE_CHANNEL) && mdi->sync && mdi->serialize) { - char *value = mdi->serialize(&moddata_channel(channel, mdi)); + const char *value = mdi->serialize(&moddata_channel(channel, mdi)); if (value) sendto_one(srv, NULL, ":%s MD %s %s %s :%s", - me.id, "channel", channel->chname, mdi->name, value); + me.id, "channel", channel->name, mdi->name, value); } } } @@ -392,10 +481,10 @@ void _send_moddata_members(Client *srv) { if ((mdi->type == MODDATATYPE_MEMBER) && mdi->sync && mdi->serialize) { - char *value = mdi->serialize(&moddata_member(m, mdi)); + const char *value = mdi->serialize(&moddata_member(m, mdi)); if (value) sendto_one(srv, NULL, ":%s MD %s %s:%s %s :%s", - me.id, "member", channel->chname, client->id, mdi->name, value); + me.id, "member", channel->name, client->id, mdi->name, value); } } } @@ -416,10 +505,10 @@ void _send_moddata_members(Client *srv) { if ((mdi->type == MODDATATYPE_MEMBERSHIP) && mdi->sync && mdi->serialize) { - char *value = mdi->serialize(&moddata_membership(m, mdi)); + const char *value = mdi->serialize(&moddata_membership(m, mdi)); if (value) sendto_one(srv, NULL, ":%s MD %s %s:%s %s :%s", - me.id, "membership", client->id, m->channel->chname, mdi->name, value); + me.id, "membership", client->id, m->channel->name, mdi->name, value); } } } diff --git a/src/modules/mdex.c b/src/modules/mdex.c deleted file mode 100644 index 26388fb..0000000 --- a/src/modules/mdex.c +++ /dev/null @@ -1,317 +0,0 @@ -/* - * Example module for ModData usage - * NEVER LOAD THIS ON A LIVE SERVER!! - * - * (C) Copyright 2014 Bram Matthys and the UnrealIRCd team - * License: GPLv2 - */ - -#include "unrealircd.h" - -CMD_FUNC(cmd_mdex); - -ModuleHeader MOD_HEADER - = { - "mdex", - "5.0", - "Command /MDEX", - "UnrealIRCd Team", - "unrealircd-5", - }; - -ModDataInfo *mdex_cli = NULL, *mdex_chan = NULL, *mdex_member = NULL, *mdex_membership = NULL; -void mdex_free(ModData *m); -char *mdex_serialize(ModData *m); -void mdex_unserialize(char *str, ModData *m); - -MOD_INIT() -{ -ModDataInfo mreq; - - memset(&mreq, 0, sizeof(mreq)); - mreq.name = "mdex"; - mreq.free = mdex_free; - mreq.serialize = mdex_serialize; - mreq.unserialize = mdex_unserialize; - mreq.sync = 1; - mreq.type = MODDATATYPE_CLIENT; - mdex_cli = ModDataAdd(modinfo->handle, mreq); - if (!mdex_cli) - abort(); - mreq.type = MODDATATYPE_CHANNEL; - mdex_chan = ModDataAdd(modinfo->handle, mreq); - if (!mdex_cli) - abort(); - mreq.type = MODDATATYPE_MEMBER; - mdex_member = ModDataAdd(modinfo->handle, mreq); - if (!mdex_cli) - abort(); - mreq.type = MODDATATYPE_MEMBERSHIP; - mdex_membership = ModDataAdd(modinfo->handle, mreq); - if (!mdex_cli) - abort(); - - CommandAdd(modinfo->handle, "MDEX", cmd_mdex, MAXPARA, CMD_USER); - - return MOD_SUCCESS; -} - -MOD_LOAD() -{ - return MOD_SUCCESS; -} - - -MOD_UNLOAD() -{ - return MOD_SUCCESS; -} - -CMD_FUNC(cmd_mdex) -{ - char *action, *type, *objname, *varname, *value; - ModDataInfo *md; - - if (!IsOper(client) || (parc < 5) || BadPtr(parv[4])) - return 0; - - action = parv[1]; /* get / set */ - type = parv[2]; - objname = parv[3]; -#ifdef DEBUGMODE - varname = parv[4]; -#else - varname = "mdex"; -#endif - value = parv[5]; /* may be NULL */ - - if (!strcmp(action, "set")) - { - if (!strcmp(type, "client")) - { - Client *target = find_client(objname, NULL); - md = findmoddata_byname(varname, MODDATATYPE_CLIENT); - if (!md || !md->unserialize || !md->free || !target) - return 0; - if (value) - md->unserialize(value, &moddata_client(target, md)); - else - { - md->free(&moddata_client(target, md)); - memset(&moddata_client(target, md), 0, sizeof(ModData)); - } - broadcast_md_client(md, target, &moddata_client(target, md)); - } else - if (!strcmp(type, "channel")) - { - Channel *channel = find_channel(objname, NULL); - md = findmoddata_byname(varname, MODDATATYPE_CHANNEL); - if (!md || !md->unserialize || !md->free || !channel) - return 0; - if (value) - md->unserialize(value, &moddata_channel(channel, md)); - else - { - md->free(&moddata_channel(channel, md)); - memset(&moddata_channel(channel, md), 0, sizeof(ModData)); - } - broadcast_md_channel(md, channel, &moddata_channel(channel, md)); - } else - if (!strcmp(type, "member")) - { - Client *target; - Channel *channel; - Member *m; - char *p; - - /* for member the object name is like '#channel/Syzop' */ - p = strchr(objname, ':'); - if (!p) - return 0; - *p++ = '\0'; - - channel = find_channel(objname, NULL); - if (!channel) - return 0; - - target = find_person(p, NULL); - if (!target) - return 0; - - m = find_member_link(channel->members, target); - if (!m) - return 0; - - md = findmoddata_byname(varname, MODDATATYPE_MEMBER); - if (!md || !md->unserialize || !md->free) - return 0; - - if (value) - md->unserialize(value, &moddata_member(m, md)); - else - { - md->free(&moddata_member(m, md)); - memset(&moddata_member(m, md), 0, sizeof(ModData)); - } - broadcast_md_member(md, channel, m, &moddata_member(m, md)); - } else - if (!strcmp(type, "membership")) - { - Client *target; - Channel *channel; - Membership *m; - char *p; - - /* for membership the object name is like 'Syzop/#channel' */ - p = strchr(objname, ':'); - if (!p) - return 0; - *p++ = '\0'; - - target = find_person(objname, NULL); - if (!target) - return 0; - - channel = find_channel(p, NULL); - if (!channel) - return 0; - - m = find_membership_link(target->user->channel, channel); - if (!m) - return 0; - - md = findmoddata_byname(varname, MODDATATYPE_MEMBERSHIP); - if (!md || !md->unserialize || !md->free) - return 0; - - if (value) - md->unserialize(value, &moddata_membership(m, md)); - else - { - md->free(&moddata_membership(m, md)); - memset(&moddata_membership(m, md), 0, sizeof(ModData)); - } - broadcast_md_membership(md, target, m, &moddata_membership(m, md)); - } - } else - if (!strcmp(action, "get")) - { - if (!strcmp(type, "client")) - { - Client *target = find_client(objname, NULL); - char *str; - - md = findmoddata_byname(varname, MODDATATYPE_CLIENT); - if (!md || !md->serialize || !target) - return 0; - str = md->serialize(&moddata_client(target, md)); - if (str) - sendnotice(client, "Value: %s", str ? str : ""); - else - sendnotice(client, "No value set"); - } else - if (!strcmp(type, "channel")) - { - Channel *channel = find_channel(objname, NULL); - char *str; - - md = findmoddata_byname(varname, MODDATATYPE_CHANNEL); - if (!md || !md->serialize || !channel) - return 0; - str = md->serialize(&moddata_channel(channel, md)); - if (str) - sendnotice(client, "Value: %s", str ? str : ""); - else - sendnotice(client, "No value set"); - } else - if (!strcmp(type, "member")) - { - Client *target; - Channel *channel; - Member *m; - char *p, *str; - - /* for member the object name is like '#channel/Syzop' */ - p = strchr(objname, ':'); - if (!p) - return 0; - *p++ = '\0'; - - channel = find_channel(objname, NULL); - if (!channel) - return 0; - - target = find_person(p, NULL); - if (!target) - return 0; - - m = find_member_link(channel->members, target); - if (!m) - return 0; - - md = findmoddata_byname(varname, MODDATATYPE_MEMBER); - if (!md || !md->serialize) - return 0; - - str = md->serialize(&moddata_member(m, md)); - if (str) - sendnotice(client, "Value: %s", str ? str : ""); - else - sendnotice(client, "No value set"); - } else - if (!strcmp(type, "membership")) - { - Client *target; - Channel *channel; - Membership *m; - char *p, *str; - - /* for membership the object name is like 'Syzop/#channel' */ - p = strchr(objname, ':'); - if (!p) - return 0; - *p++ = '\0'; - - target = find_person(objname, NULL); - if (!target) - return 0; - - channel = find_channel(p, NULL); - if (!channel) - return 0; - - m = find_membership_link(target->user->channel, channel); - if (!m) - return 0; - - md = findmoddata_byname(varname, MODDATATYPE_MEMBERSHIP); - if (!md || !md->serialize) - return 0; - - str = md->serialize(&moddata_membership(m, md)); - if (str) - sendnotice(client, "Value: %s", str ? str : ""); - else - sendnotice(client, "No value set"); - } - } - - return 0; -} - -void mdex_free(ModData *m) -{ - safe_free(m->str); -} - -char *mdex_serialize(ModData *m) -{ - if (!m->str) - return NULL; - return m->str; -} - -void mdex_unserialize(char *str, ModData *m) -{ - safe_strdup(m->str, str); -} diff --git a/src/modules/message-ids.c b/src/modules/message-ids.c index 61959f3..ec44b8c 100644 --- a/src/modules/message-ids.c +++ b/src/modules/message-ids.c @@ -28,14 +28,14 @@ ModuleHeader MOD_HEADER "5.0", "msgid CAP", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Variables */ long CAP_ACCOUNT_TAG = 0L; -int msgid_mtag_is_ok(Client *client, char *name, char *value); -void mtag_add_or_inherit_msgid(Client *sender, MessageTag *recv_mtags, MessageTag **mtag_list, char *signature); +int msgid_mtag_is_ok(Client *client, const char *name, const char *value); +void mtag_add_or_inherit_msgid(Client *sender, MessageTag *recv_mtags, MessageTag **mtag_list, const char *signature); MOD_INIT() { @@ -69,7 +69,7 @@ MOD_UNLOAD() * syntax. * We simply allow msgid ONLY from servers and with any syntax. */ -int msgid_mtag_is_ok(Client *client, char *name, char *value) +int msgid_mtag_is_ok(Client *client, const char *name, const char *value) { if (IsServer(client) && !BadPtr(value)) return 1; @@ -103,7 +103,7 @@ MessageTag *mtag_generate_msgid(void) } -void mtag_add_or_inherit_msgid(Client *sender, MessageTag *recv_mtags, MessageTag **mtag_list, char *signature) +void mtag_add_or_inherit_msgid(Client *sender, MessageTag *recv_mtags, MessageTag **mtag_list, const char *signature) { MessageTag *m = find_mtag(recv_mtags, "msgid"); if (m) @@ -146,9 +146,7 @@ void mtag_add_or_inherit_msgid(Client *sender, MessageTag *recv_mtags, MessageTa char newbuf[256]; memset(&binaryhash, 0, sizeof(binaryhash)); memset(&b64hash, 0, sizeof(b64hash)); - SHA256_Init(&hash); - SHA256_Update(&hash, signature, strlen(signature)); - SHA256_Final(binaryhash, &hash); + sha256hash_binary(binaryhash, signature, strlen(signature)); b64_encode(binaryhash, sizeof(binaryhash)/2, b64hash, sizeof(b64hash)); b64hash[22] = '\0'; /* cut off at '=' */ snprintf(newbuf, sizeof(newbuf), "%s-%s", prefix, b64hash); diff --git a/src/modules/message-tags.c b/src/modules/message-tags.c index 1eab0fd..ae20a8e 100644 --- a/src/modules/message-tags.c +++ b/src/modules/message-tags.c @@ -28,18 +28,18 @@ ModuleHeader MOD_HEADER "5.0", "Message tags CAP", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; long CAP_MESSAGE_TAGS = 0L; -char *_mtags_to_string(MessageTag *m, Client *client); +const char *_mtags_to_string(MessageTag *m, Client *client); void _parse_message_tags(Client *client, char **str, MessageTag **mtag_list); MOD_TEST() { MARK_AS_OFFICIAL_MODULE(modinfo); - EfunctionAddPChar(modinfo->handle, EFUNC_MTAGS_TO_STRING, _mtags_to_string); + EfunctionAddConstString(modinfo->handle, EFUNC_MTAGS_TO_STRING, _mtags_to_string); EfunctionAddVoid(modinfo->handle, EFUNC_PARSE_MESSAGE_TAGS, _parse_message_tags); return 0; @@ -148,7 +148,13 @@ int message_tag_ok(Client *client, char *name, char *value) m = MessageTagHandlerFind(name); if (!m) + { + /* Permit unknown message tags from trusted servers */ + if (IsServer(client) || !MyConnect(client)) + return 1; + return 0; + } if (m->is_ok(client, name, value)) return 1; @@ -198,7 +204,7 @@ void _parse_message_tags(Client *client, char **str, MessageTag **mtag_list) m = safe_alloc(sizeof(MessageTag)); safe_strdup(m->name, name); /* Both NULL and empty become NULL: */ - if (BadPtr(value)) + if (!*value) m->value = NULL; else /* a real value... */ safe_strdup(m->value, value); @@ -227,7 +233,7 @@ int client_accepts_tag(const char *token, Client *client) return 0; /* Maybe there is an outgoing filter in effect (usually not) */ - if (m->can_send && !m->can_send(client)) + if (m->should_send_to_client && !m->should_send_to_client(client)) return 0; /* If the client has indicated 'message-tags' support then we can @@ -257,10 +263,10 @@ int client_accepts_tag(const char *token, Client *client) * Taking into account the restrictions that 'client' may have. * @returns A string (static buffer) or NULL if no tags at all (!) */ -char *_mtags_to_string(MessageTag *m, Client *client) +const char *_mtags_to_string(MessageTag *m, Client *client) { static char buf[4096], name[8192], value[8192]; - char tbuf[512]; + static char tbuf[4094]; if (!m) return NULL; diff --git a/src/modules/message.c b/src/modules/message.c index db8684b..279df2c 100644 --- a/src/modules/message.c +++ b/src/modules/message.c @@ -21,15 +21,15 @@ #include "unrealircd.h" /* Forward declarations */ -char *_StripColors(unsigned char *text); -char *_StripControlCodes(unsigned char *text); -int ban_version(Client *client, char *text); +const char *_StripColors(const char *text); +const char *_StripControlCodes(const char *text); +int ban_version(Client *client, const char *text); CMD_FUNC(cmd_private); CMD_FUNC(cmd_notice); CMD_FUNC(cmd_tagmsg); -void cmd_message(Client *client, MessageTag *recv_mtags, int parc, char *parv[], SendType sendtype); -int _can_send_to_channel(Client *client, Channel *channel, char **msgtext, char **errmsg, SendType sendtype); -int can_send_to_user(Client *client, Client *target, char **msgtext, char **errmsg, SendType sendtype); +void cmd_message(Client *client, MessageTag *recv_mtags, int parc, const char *parv[], SendType sendtype); +int _can_send_to_channel(Client *client, Channel *channel, const char **msgtext, const char **errmsg, SendType sendtype); +int can_send_to_user(Client *client, Client *target, const char **msgtext, const char **errmsg, SendType sendtype); /* Variables */ long CAP_MESSAGE_TAGS = 0; /**< Looked up at MOD_LOAD, may stay 0 if message-tags support is absent */ @@ -40,14 +40,14 @@ ModuleHeader MOD_HEADER "5.0", /* Version */ "private message and notice", /* Short description of module */ "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_TEST() { MARK_AS_OFFICIAL_MODULE(modinfo); - EfunctionAddPChar(modinfo->handle, EFUNC_STRIPCOLORS, _StripColors); - EfunctionAddPChar(modinfo->handle, EFUNC_STRIPCONTROLCODES, _StripControlCodes); + EfunctionAddConstString(modinfo->handle, EFUNC_STRIPCOLORS, _StripColors); + EfunctionAddConstString(modinfo->handle, EFUNC_STRIPCONTROLCODES, _StripControlCodes); EfunctionAdd(modinfo->handle, EFUNC_CAN_SEND_TO_CHANNEL, _can_send_to_channel); return MOD_SUCCESS; } @@ -85,7 +85,7 @@ MOD_UNLOAD() * text: Pointer to a pointer to a text [in, out] * cmd: Pointer to a pointer which contains the command to use [in, out] */ -int can_send_to_user(Client *client, Client *target, char **msgtext, char **errmsg, SendType sendtype) +int can_send_to_user(Client *client, Client *target, const char **msgtext, const char **errmsg, SendType sendtype) { int ret; Hook *h; @@ -111,7 +111,7 @@ int can_send_to_user(Client *client, Client *target, char **msgtext, char **errm if (is_silenced(client, target)) { - RunHook3(HOOKTYPE_SILENCED, client, target, sendtype); + RunHook(HOOKTYPE_SILENCED, client, target, sendtype); /* Silently discarded, no error message */ return 0; } @@ -120,7 +120,7 @@ int can_send_to_user(Client *client, Client *target, char **msgtext, char **errm if (MyUser(client)) { int spamtype = (sendtype == SEND_TYPE_NOTICE ? SPAMF_USERNOTICE : SPAMF_USERMSG); - char *cmd = sendtype_to_cmd(sendtype); + const char *cmd = sendtype_to_cmd(sendtype); if (match_spamfilter(client, *msgtext, spamtype, cmd, target->name, 0, NULL)) return 0; @@ -134,7 +134,9 @@ int can_send_to_user(Client *client, Client *target, char **msgtext, char **errm { if (!*errmsg) { - ircd_log(LOG_ERROR, "Module %s did not set errmsg!!!", h->owner->header->name); + unreal_log(ULOG_ERROR, "main", "BUG_CAN_SEND_TO_USER_NO_ERRMSG", client, + "[BUG] Module $module did not set errmsg!!!", + log_data_string("module", h->owner->header->name)); abort(); } return 0; @@ -151,85 +153,12 @@ int can_send_to_user(Client *client, Client *target, char **msgtext, char **errm return 1; } -#ifdef PREFIX_AQ - #define PREFIX_REST (PREFIX_ADMIN|PREFIX_OWNER) -#else - #define PREFIX_REST (0) -#endif - -/** Convert a string of prefixes (like "+%@") to values (like PREFIX_VOICE|PREFIX_HALFOP|PREFIX_OP). - * @param str The string containing the prefixes and the channel name. - * @param end The position of the hashmark (#) - * @returns A value of PREFIX_*, potentially OR'ed if there are multiple values. - */ -int prefix_string_to_values(char *str, char *end) -{ - char *p; - int prefix = 0; - - for (p = str; p != end; p++) - { - switch (*p) - { - case '+': - prefix |= PREFIX_VOICE | PREFIX_HALFOP | PREFIX_OP | PREFIX_REST; - break; - case '%': - prefix |= PREFIX_HALFOP | PREFIX_OP | PREFIX_REST; - break; - case '@': - prefix |= PREFIX_OP | PREFIX_REST; - break; -#ifdef PREFIX_AQ - case '&': - prefix |= PREFIX_ADMIN | PREFIX_OWNER; - break; - case '~': - prefix |= PREFIX_OWNER; - break; -#else - case '&': - prefix |= PREFIX_OP | PREFIX_REST; - break; - case '~': - prefix |= PREFIX_OP | PREFIX_REST; - break; -#endif - default: - break; /* ignore it :P */ - } - } - return prefix; -} - -/** Find out the lowest prefix to use, so @&~#chan becomes @#chan. - * @param prefix One or more of PREFIX_* values (OR'ed) - * @returns A single character - * @note prefix must be >0, so must contain at least one PREFIX_xx value! - */ -char prefix_values_to_char(int prefix) -{ - if (prefix & PREFIX_VOICE) - return '+'; - if (prefix & PREFIX_HALFOP) - return '%'; - if (prefix & PREFIX_OP) - return '@'; -#ifdef PREFIX_AQ - if (prefix & PREFIX_ADMIN) - return '&'; - if (prefix & PREFIX_OWNER) - return '~'; -#endif - abort(); -} - /** Check if user is allowed to send to a prefix (eg: @#channel). * @param client The client (sender) * @param channel The target channel - * @param prefix The prefix mask (eg: PREFIX_CHANOP) + * @param mode The member mode to send to (eg: 'o') */ -int can_send_to_prefix(Client *client, Channel *channel, int prefix) +int can_send_to_member_mode(Client *client, Channel *channel, char mode) { Membership *lp; @@ -242,18 +171,20 @@ int can_send_to_prefix(Client *client, Channel *channel, int prefix) * Need at least voice (+) in order to send to +,% or @ * Need at least ops (@) in order to send to & or ~ */ - if (!lp || !(lp->flags & (CHFL_VOICE|CHFL_HALFOP|CHFL_CHANOP|CHFL_CHANOWNER|CHFL_CHANADMIN))) + if (!lp || !check_channel_access_membership(lp, "vhoaq")) { - sendnumeric(client, ERR_CHANOPRIVSNEEDED, channel->chname); + sendnumeric(client, ERR_CHANOPRIVSNEEDED, channel->name); return 0; } +#if 0 if (!(prefix & PREFIX_OP) && ((prefix & PREFIX_OWNER) || (prefix & PREFIX_ADMIN)) && - !(lp->flags & (CHFL_CHANOP|CHFL_CHANOWNER|CHFL_CHANADMIN))) + !check_channel_access_membership(lp, "oaq")) { - sendnumeric(client, ERR_CHANOPRIVSNEEDED, channel->chname); + sendnumeric(client, ERR_CHANOPRIVSNEEDED, channel->name); return 0; } +#endif return 1; } @@ -270,16 +201,16 @@ int has_client_mtags(MessageTag *mtags) /* General message handler to users and channels. Used by PRIVMSG, NOTICE, etc. */ -void cmd_message(Client *client, MessageTag *recv_mtags, int parc, char *parv[], SendType sendtype) +void cmd_message(Client *client, MessageTag *recv_mtags, int parc, const char *parv[], SendType sendtype) { Client *target; Channel *channel; - char *targetstr, *p, *p2, *pc, *text, *errmsg; - int prefix = 0; - char pfixchan[CHANNELLEN + 4]; + char targets[BUFSIZE]; + char *targetstr, *p, *p2, *pc; + const char *text, *errmsg; int ret; int ntargets = 0; - char *cmd = sendtype_to_cmd(sendtype); + const char *cmd = sendtype_to_cmd(sendtype); int maxtargets = max_targets_for_command(cmd); Hook *h; MessageTag *mtags; @@ -306,7 +237,8 @@ void cmd_message(Client *client, MessageTag *recv_mtags, int parc, char *parv[], if (MyConnect(client)) parv[1] = (char *)canonize(parv[1]); - for (p = NULL, targetstr = strtoken(&p, parv[1], ","); targetstr; targetstr = strtoken(&p, NULL, ",")) + strlcpy(targets, parv[1], sizeof(targets)); + for (p = NULL, targetstr = strtoken(&p, targets, ","); targetstr; targetstr = strtoken(&p, NULL, ",")) { if (MyUser(client) && (++ntargets > maxtargets)) { @@ -331,29 +263,44 @@ void cmd_message(Client *client, MessageTag *recv_mtags, int parc, char *parv[], } p2 = strchr(targetstr, '#'); - prefix = 0; /* Message to channel */ - if (p2 && (channel = find_channel(p2, NULL))) + if (p2 && (channel = find_channel(p2))) { - prefix = prefix_string_to_values(targetstr, p2); - if (prefix) + char pfixchan[CHANNELLEN + 4]; + int replaced = 0; + char member_modes_tmp[2]; + char *member_modes = NULL; + if (p2 - targetstr > 0) + { + /* There is (posssibly) a prefix involved... */ + char prefix_tmp[32]; + char prefix; + strlncpy(prefix_tmp, targetstr, sizeof(prefix_tmp), p2 - targetstr); + prefix = lowest_ranking_prefix(prefix_tmp); + if (prefix) + { + /* Rewrite the target. Eg: @&~#chan becomes @#chan */ + snprintf(pfixchan, sizeof(pfixchan), "%c%s", prefix, channel->name); + targetstr = pfixchan; + replaced = 1; + /* And set 'member_modes' */ + member_modes_tmp[0] = prefix_to_mode(prefix); + member_modes_tmp[1] = '\0'; + member_modes = member_modes_tmp; + /* Oh, and some access check */ + if (MyUser(client) && !can_send_to_member_mode(client, channel, *member_modes)) + continue; + } + } + if (!replaced) { - if (MyUser(client) && !can_send_to_prefix(client, channel, prefix)) - continue; - /* Now find out the lowest prefix and rewrite the target. - * Eg: @&~#chan becomes @#chan - */ - pfixchan[0] = prefix_values_to_char(prefix); - strlcpy(pfixchan+1, channel->chname, sizeof(pfixchan)-1); - targetstr = pfixchan; - } else { /* Replace target so the privmsg always goes to the "official" channel name */ - strlcpy(pfixchan, channel->chname, sizeof(pfixchan)); + strlcpy(pfixchan, channel->name, sizeof(pfixchan)); targetstr = pfixchan; } - if (IsVirus(client) && strcasecmp(channel->chname, SPAMFILTER_VIRUSCHAN)) + if (IsVirus(client) && strcasecmp(channel->name, SPAMFILTER_VIRUSCHAN)) { sendnotice(client, "You are only allowed to talk in '%s'", SPAMFILTER_VIRUSCHAN); continue; @@ -372,7 +319,7 @@ void cmd_message(Client *client, MessageTag *recv_mtags, int parc, char *parv[], if (IsDead(client)) return; if (!IsDead(client) && (sendtype != SEND_TYPE_NOTICE) && errmsg) - sendnumeric(client, ERR_CANNOTSENDTOCHAN, channel->chname, errmsg, p2); + sendnumeric(client, ERR_CANNOTSENDTOCHAN, channel->name, errmsg, p2); continue; /* skip delivery to this target */ } } @@ -389,13 +336,13 @@ void cmd_message(Client *client, MessageTag *recv_mtags, int parc, char *parv[], { int spamtype = (sendtype == SEND_TYPE_NOTICE ? SPAMF_CHANNOTICE : SPAMF_CHANMSG); - if (match_spamfilter(client, text, spamtype, cmd, channel->chname, 0, NULL)) + if (match_spamfilter(client, text, spamtype, cmd, channel->name, 0, NULL)) return; } new_message(client, recv_mtags, &mtags); - RunHook5(HOOKTYPE_PRE_CHANMSG, client, channel, mtags, text, sendtype); + RunHook(HOOKTYPE_PRE_CHANMSG, client, channel, mtags, text, sendtype); if (!text) { @@ -407,7 +354,7 @@ void cmd_message(Client *client, MessageTag *recv_mtags, int parc, char *parv[], { /* PRIVMSG or NOTICE */ sendto_channel(channel, client, client->direction, - prefix, 0, sendflags, mtags, + member_modes, 0, sendflags, mtags, ":%s %s %s :%s", client->name, cmd, targetstr, text); } else { @@ -422,12 +369,12 @@ void cmd_message(Client *client, MessageTag *recv_mtags, int parc, char *parv[], continue; } sendto_channel(channel, client, client->direction, - prefix, CAP_MESSAGE_TAGS, sendflags, mtags, + member_modes, CAP_MESSAGE_TAGS, sendflags, mtags, ":%s TAGMSG %s", client->name, targetstr); } - RunHook8(HOOKTYPE_CHANMSG, client, channel, sendflags, prefix, targetstr, mtags, text, sendtype); + RunHook(HOOKTYPE_CHANMSG, client, channel, sendflags, member_modes, targetstr, mtags, text, sendtype); free_message_tags(mtags); @@ -469,7 +416,7 @@ void cmd_message(Client *client, MessageTag *recv_mtags, int parc, char *parv[], target = hash_find_nickatserver(targetstr, NULL); if (target) { - char *errmsg = NULL; + const char *errmsg = NULL; text = parv[2]; if (!can_send_to_user(client, target, &text, &errmsg, sendtype)) { @@ -520,7 +467,7 @@ void cmd_message(Client *client, MessageTag *recv_mtags, int parc, char *parv[], } } labeled_response_inhibit = 0; - RunHook5(HOOKTYPE_USERMSG, client, target, mtags, text, sendtype); + RunHook(HOOKTYPE_USERMSG, client, target, mtags, text, sendtype); free_message_tags(mtags); continue; } @@ -581,11 +528,12 @@ CMD_FUNC(cmd_tagmsg) * RGB color stripping support added -- codemastr */ -char *_StripColors(unsigned char *text) +const char *_StripColors(const char *text) { int i = 0, len = strlen(text), save_len=0; - char nc = 0, col = 0, rgb = 0, *save_text=NULL; - static unsigned char new_str[4096]; + char nc = 0, col = 0, rgb = 0; + const char *save_text=NULL; + static char new_str[4096]; while (len > 0) { @@ -648,10 +596,11 @@ char *_StripColors(unsigned char *text) } /* strip color, bold, underline, and reverse codes from a string */ -char *_StripControlCodes(unsigned char *text) +const char *_StripControlCodes(const char *text) { int i = 0, len = strlen(text), save_len=0; - char nc = 0, col = 0, rgb = 0, *save_text=NULL; + char nc = 0, col = 0, rgb = 0; + const char *save_text=NULL; static unsigned char new_str[4096]; while (len > 0) { @@ -744,19 +693,21 @@ char *_StripControlCodes(unsigned char *text) } /** Check ban version { } blocks, returns 1 if banned and 0 if not. */ -int ban_version(Client *client, char *text) +int ban_version(Client *client, const char *text) { int len; ConfigItem_ban *ban; + char ctcp_reply[BUFSIZE]; - len = strlen(text); + strlcpy(ctcp_reply, text, sizeof(ctcp_reply)); + len = strlen(ctcp_reply); if (!len) return 0; + + if (ctcp_reply[len-1] == '\1') + ctcp_reply[len-1] = '\0'; /* remove CTCP REPLY terminator (ASCII 1) */ - if (text[len-1] == '\1') - text[len-1] = '\0'; /* remove CTCP REPLY terminator (ASCII 1) */ - - if ((ban = find_ban(NULL, text, CONF_BAN_VERSION))) + if ((ban = find_ban(NULL, ctcp_reply, CONF_BAN_VERSION))) { if (IsSoftBanAction(ban->action) && IsLoggedIn(client)) return 0; /* soft ban does not apply to us, we are logged in */ @@ -780,7 +731,7 @@ int ban_version(Client *client, char *text) * @returns Returns 1 if the user is allowed to send, otherwise 0. * (note that this behavior was reversed in UnrealIRCd versions <5.x. */ -int _can_send_to_channel(Client *client, Channel *channel, char **msgtext, char **errmsg, SendType sendtype) +int _can_send_to_channel(Client *client, Channel *channel, const char **msgtext, const char **errmsg, SendType sendtype) { Membership *lp; int member, i = 0; @@ -793,45 +744,7 @@ int _can_send_to_channel(Client *client, Channel *channel, char **msgtext, char member = IsMember(client, channel); - if (channel->mode.mode & MODE_NOPRIVMSGS && !member) - { - /* Channel does not accept external messages (+n). - * Reject, unless HOOKTYPE_CAN_BYPASS_NO_EXTERNAL_MSGS tells otherwise. - */ - for (h = Hooks[HOOKTYPE_CAN_BYPASS_CHANNEL_MESSAGE_RESTRICTION]; h; h = h->next) - { - i = (*(h->func.intfunc))(client, channel, BYPASS_CHANMSG_EXTERNAL); - if (i != HOOK_CONTINUE) - break; - } - if (i != HOOK_ALLOW) - { - *errmsg = "No external channel messages"; - return 0; - } - } - lp = find_membership_link(client->user->channel, channel); - if (channel->mode.mode & MODE_MODERATED && - !op_can_override("channel:override:message:moderated",client,channel,NULL) && - (!lp /* FIXME: UGLY */ - || !(lp->flags & (CHFL_CHANOP | CHFL_VOICE | CHFL_CHANOWNER | CHFL_HALFOP | CHFL_CHANADMIN)))) - { - /* Channel is moderated (+m). - * Reject, unless HOOKTYPE_CAN_BYPASS_MODERATED tells otherwise. - */ - for (h = Hooks[HOOKTYPE_CAN_BYPASS_CHANNEL_MESSAGE_RESTRICTION]; h; h = h->next) - { - i = (*(h->func.intfunc))(client, channel, BYPASS_CHANMSG_MODERATED); - if (i != HOOK_CONTINUE) - break; - } - if (i != HOOK_ALLOW) - { - *errmsg = "You need voice (+v)"; - return 0; - } - } /* Modules can plug in as well */ for (h = Hooks[HOOKTYPE_CAN_SEND_TO_CHANNEL]; h; h = h->next) @@ -841,7 +754,9 @@ int _can_send_to_channel(Client *client, Channel *channel, char **msgtext, char { if (!*errmsg) { - ircd_log(LOG_ERROR, "Module %s did not set errmsg!!!", h->owner->header->name); + unreal_log(ULOG_ERROR, "main", "BUG_CAN_SEND_TO_CHANNEL_NO_ERRMSG", client, + "[BUG] Module $module did not set errmsg!!!", + log_data_string("module", h->owner->header->name)); abort(); } break; @@ -873,10 +788,10 @@ int _can_send_to_channel(Client *client, Channel *channel, char **msgtext, char if (op_can_override("channel:override:message:ban",client,channel,NULL)) return 1; - if ((!lp - || !(lp->flags & (CHFL_CHANOP | CHFL_VOICE | CHFL_CHANOWNER | - CHFL_HALFOP | CHFL_CHANADMIN))) && MyUser(client) - && is_banned(client, channel, BANCHK_MSG, msgtext, errmsg)) + /* If local client is banned and not +vhoaq... */ + if (MyUser(client) && + !check_channel_access_membership(lp, "vhoaq") && + is_banned(client, channel, BANCHK_MSG, msgtext, errmsg)) { /* Modules can set 'errmsg', otherwise we default to this: */ if (!*errmsg) diff --git a/src/modules/mkpasswd.c b/src/modules/mkpasswd.c index bde0127..ca750c6 100644 --- a/src/modules/mkpasswd.c +++ b/src/modules/mkpasswd.c @@ -34,7 +34,7 @@ ModuleHeader MOD_HEADER "5.0", "command /mkpasswd", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -60,8 +60,8 @@ MOD_UNLOAD() */ CMD_FUNC(cmd_mkpasswd) { - short type; - char *result = NULL; + short type; + const char *result = NULL; if (!MKPASSWD_FOR_EVERYONE && !IsOper(client)) { @@ -73,9 +73,9 @@ CMD_FUNC(cmd_mkpasswd) /* Non-opers /mkpasswd usage: lag them up, and send a notice to eyes snomask. * This notice is always sent, even in case of bad usage/bad auth methods/etc. */ - client->local->since += 7; - sendto_snomask(SNO_EYES, "*** /mkpasswd used by %s (%s@%s)", - client->name, client->user->username, GetHost(client)); + add_fake_lag(client, 7000); + unreal_log(ULOG_INFO, "mkpasswd", "MKPASSWD_COMMAND", client, + "mkpasswd command used by $client.details"); } if ((parc < 3) || BadPtr(parv[2])) diff --git a/src/modules/mode.c b/src/modules/mode.c index f269ce0..bb3a175 100644 --- a/src/modules/mode.c +++ b/src/modules/mode.c @@ -1,6 +1,6 @@ /* * IRC - Internet Relay Chat, src/modules/mode.c - * (C) 2005 The UnrealIRCd Team + * (C) 2005-.. The UnrealIRCd Team * * See file AUTHORS in IRC package for additional names of * the programmers. @@ -22,54 +22,53 @@ #include "unrealircd.h" -/* Forward declarations */ -CMD_FUNC(cmd_mode); -CMD_FUNC(cmd_mlock); -void _do_mode(Channel *channel, Client *client, MessageTag *recv_mtags, int parc, char *parv[], time_t sendts, int samode); -void _set_mode(Channel *channel, Client *client, int parc, char *parv[], u_int *pcount, - char pvar[MAXMODEPARAMS][MODEBUFLEN + 3], int bounce); -CMD_FUNC(_cmd_umode); - -/* local: */ -static void bounce_mode(Channel *, Client *, int, char **); -int do_mode_char(Channel *channel, long modetype, char modechar, char *param, - u_int what, Client *client, - u_int *pcount, char pvar[MAXMODEPARAMS][MODEBUFLEN + 3], char bounce, long my_access); -int do_extmode_char(Channel *channel, Cmode *handler, char *param, u_int what, - Client *client, u_int *pcount, char pvar[MAXMODEPARAMS][MODEBUFLEN + 3], - char bounce); -void make_mode_str(Channel *channel, long oldm, Cmode_t oldem, long oldl, int pcount, - char pvar[MAXMODEPARAMS][MODEBUFLEN + 3], char *mode_buf, char *para_buf, - size_t mode_buf_size, size_t para_buf_size, char bounce); - -static void mode_cutoff(char *s); -static void mode_cutoff2(Client *client, Channel *channel, int *parc_out, char *parv[]); - -static int samode_in_progress = 0; - -#define MSG_MODE "MODE" - ModuleHeader MOD_HEADER = { "mode", "5.0", "command /mode", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; +/* Forward declarations */ +int list_mode_request(Client *client, Channel *channel, const char *req); +CMD_FUNC(cmd_mode); +CMD_FUNC(cmd_mlock); +void _do_mode(Channel *channel, Client *client, MessageTag *recv_mtags, int parc, const char *parv[], time_t sendts, int samode); +MultiLineMode *_set_mode(Channel *channel, Client *client, int parc, const char *parv[], u_int *pcount, + char pvar[MAXMODEPARAMS][MODEBUFLEN + 3]); +void _set_channel_mode(Channel *channel, char *modes, char *parameters); +CMD_FUNC(_cmd_umode); + +/* local: */ +int do_mode_char(Channel *channel, long modetype, char modechar, const char *param, + u_int what, Client *client, + u_int *pcount, char pvar[MAXMODEPARAMS][MODEBUFLEN + 3]); +int do_extmode_char(Channel *channel, Cmode *handler, const char *param, u_int what, + Client *client, u_int *pcount, char pvar[MAXMODEPARAMS][MODEBUFLEN + 3]); +void do_mode_char_member_mode_new(Channel *channel, Cmode *handler, const char *param, u_int what, + Client *client, u_int *pcount, char pvar[MAXMODEPARAMS][MODEBUFLEN + 3]); +MultiLineMode *make_mode_str(Client *client, Channel *channel, Cmode_t oldem, int pcount, char pvar[MAXMODEPARAMS][MODEBUFLEN + 3]); + +static char *mode_cutoff(const char *s); +void mode_operoverride_msg(Client *client, Channel *channel, char *modebuf, char *parabuf); + +static int samode_in_progress = 0; + MOD_TEST() { MARK_AS_OFFICIAL_MODULE(modinfo); EfunctionAddVoid(modinfo->handle, EFUNC_DO_MODE, _do_mode); - EfunctionAddVoid(modinfo->handle, EFUNC_SET_MODE, _set_mode); + EfunctionAddPVoid(modinfo->handle, EFUNC_SET_MODE, TO_PVOIDFUNC(_set_mode)); EfunctionAddVoid(modinfo->handle, EFUNC_CMD_UMODE, _cmd_umode); + EfunctionAddVoid(modinfo->handle, EFUNC_SET_CHANNEL_MODE, _set_channel_mode); return MOD_SUCCESS; } MOD_INIT() { - CommandAdd(modinfo->handle, MSG_MODE, cmd_mode, MAXPARA, CMD_USER|CMD_SERVER); + CommandAdd(modinfo->handle, "MODE", cmd_mode, MAXPARA, CMD_USER|CMD_SERVER); CommandAdd(modinfo->handle, MSG_MLOCK, cmd_mlock, MAXPARA, CMD_SERVER); MARK_AS_OFFICIAL_MODULE(modinfo); return MOD_SUCCESS; @@ -105,7 +104,7 @@ CMD_FUNC(cmd_mode) { if (*parv[1] == '#') { - channel = find_channel(parv[1], NULL); + channel = find_channel(parv[1]); if (!channel) { cmd_umode(client, recv_mtags, parc, parv); @@ -130,102 +129,33 @@ CMD_FUNC(cmd_mode) if (parc < 3) { + char modebuf[BUFSIZE], parabuf[BUFSIZE]; *modebuf = *parabuf = '\0'; modebuf[1] = '\0'; - channel_modes(client, modebuf, parabuf, sizeof(modebuf), sizeof(parabuf), channel); - sendnumeric(client, RPL_CHANNELMODEIS, channel->chname, modebuf, parabuf); - sendnumeric(client, RPL_CREATIONTIME, channel->chname, channel->creationtime); + channel_modes(client, modebuf, parabuf, sizeof(modebuf), sizeof(parabuf), channel, 0); + sendnumeric(client, RPL_CHANNELMODEIS, channel->name, modebuf, parabuf); + sendnumeric(client, RPL_CREATIONTIME, channel->name, (long long)channel->creationtime); return; } - if (MyUser(client)) - { - /* Deal with information requests from local users, such as: - * MODE #chan b Show the ban list - * MODE #chan e Show the ban exemption list - * MODE #chan I Show the invite exception list - * MODE #chan q Show list of channel owners - * MODE #chan a Show list of channel admins - */ - if (strstr(parv[2], "b") && BadPtr(parv[3])) - { - if (!IsMember(client, channel) && !ValidatePermissionsForPath("channel:see:mode:remotebanlist",client,NULL,channel,NULL)) - return; - /* send ban list */ - for (ban = channel->banlist; ban; ban = ban->next) - sendnumeric(client, RPL_BANLIST, channel->chname, ban->banstr, ban->who, ban->when); - sendnumeric(client, RPL_ENDOFBANLIST, channel->chname); - return; - } - - if (strstr(parv[2], "e") && BadPtr(parv[3])) - { - if (!IsMember(client, channel) && !ValidatePermissionsForPath("channel:see:mode:remotebanlist",client,NULL,channel,NULL)) - return; - /* send exban list */ - for (ban = channel->exlist; ban; ban = ban->next) - sendnumeric(client, RPL_EXLIST, channel->chname, ban->banstr, ban->who, ban->when); - sendnumeric(client, RPL_ENDOFEXLIST, channel->chname); - return; - } - - if (strstr(parv[2], "I") && BadPtr(parv[3])) - { - if (!IsMember(client, channel) && !ValidatePermissionsForPath("channel:see:mode:remoteinvexlist",client,NULL,channel,NULL)) - return; - for (ban = channel->invexlist; ban; ban = ban->next) - sendnumeric(client, RPL_INVEXLIST, channel->chname, ban->banstr, ban->who, ban->when); - sendnumeric(client, RPL_ENDOFINVEXLIST, channel->chname); - return; - } - - if (strstr(parv[2], "q") && BadPtr(parv[3])) - { - Member *member; - - if (!IsMember(client, channel) && !ValidatePermissionsForPath("channel:see:mode:remoteownerlist",client,NULL,channel,NULL)) - return; - - for (member = channel->members; member; member = member->next) - { - if (is_chanowner(member->client, channel)) - sendnumeric(client, RPL_QLIST, channel->chname, member->client->name); - } - sendnumeric(client, RPL_ENDOFQLIST, channel->chname); - return; - } - - if (strstr(parv[2], "a") && BadPtr(parv[3])) - { - Member *member; - - if (!IsMember(client, channel) && !ValidatePermissionsForPath("channel:see:mode:remoteownerlist",client,NULL,channel,NULL)) - return; - - for (member = channel->members; member; member = member->next) - { - if (is_chanadmin(member->client, channel)) - sendnumeric(client, RPL_ALIST, channel->chname, member->client->name); - } - sendnumeric(client, RPL_ENDOFALIST, channel->chname); - return; - } - } + /* List mode request? Eg: "MODE #channel b" to list all bans */ + if (MyUser(client) && BadPtr(parv[3]) && list_mode_request(client, channel, parv[2])) + return; opermode = 0; #ifndef NO_OPEROVERRIDE - if (IsUser(client) && !IsULine(client) && !is_chan_op(client, channel) && - !is_half_op(client, channel) && ValidatePermissionsForPath("channel:override:mode",client,NULL,channel,NULL)) + if (IsUser(client) && !IsULine(client) && !check_channel_access(client, channel, "oaq") && + !check_channel_access(client, channel, "h") && ValidatePermissionsForPath("channel:override:mode",client,NULL,channel,NULL)) { sendts = 0; opermode = 1; goto aftercheck; } - if (IsUser(client) && !IsULine(client) && !is_chan_op(client, channel) && - is_half_op(client, channel) && ValidatePermissionsForPath("channel:override:mode",client,NULL,channel,NULL)) + if (IsUser(client) && !IsULine(client) && !check_channel_access(client, channel, "oaq") && + check_channel_access(client, channel, "h") && ValidatePermissionsForPath("channel:override:mode",client,NULL,channel,NULL)) { opermode = 2; goto aftercheck; @@ -233,36 +163,27 @@ CMD_FUNC(cmd_mode) #endif /* User does not have permission to use the MODE command */ - if (IsUser(client) && !IsULine(client) && !is_chan_op(client, channel) && - !is_half_op(client, channel) && + if (MyUser(client) && !IsULine(client) && !check_channel_access(client, channel, "hoaq") && !ValidatePermissionsForPath("channel:override:mode",client,NULL,channel,NULL)) { - if (MyUser(client)) - { - sendnumeric(client, ERR_CHANOPRIVSNEEDED, channel->chname); - return; - } - sendto_one(client, NULL, ":%s MODE %s -oh %s %s 0", - me.name, channel->chname, client->name, client->name); - /* Tell the other server that the user is - * de-opped. Fix op desyncs. */ - bounce_mode(channel, client, parc - 2, parv + 2); + sendnumeric(client, ERR_CHANOPRIVSNEEDED, channel->name); + return; + } + + if (parv[2] && (*parv[2] == '&')) + { + /* We don't do any bounce-mode handling anymore since UnrealIRCd 6 */ return; } if (IsServer(client) && (sendts = atol(parv[parc - 1])) && - !IsULine(client) && channel->creationtime && - sendts > channel->creationtime) + !IsULine(client) && (sendts > channel->creationtime)) { - if (!(*parv[2] == '&')) /* & denotes a bounce */ - { - /* !!! */ - sendto_snomask(SNO_EYES, - "*** TS bounce for %s - %lld(ours) %lld(theirs)", - channel->chname, (long long)channel->creationtime, - (long long)sendts); - bounce_mode(channel, client, parc - 2, parv + 2); - } + unreal_log(ULOG_INFO, "mode", "MODE_TS_IGNORED", client, + "MODE change ignored for $channel from $client: " + "timestamp mismatch, ours=$channel.creationtime, theirs=$their_ts", + log_data_channel("channel", channel), + log_data_integer("their_ts", sendts)); return; } if (IsServer(client) && !sendts && *parv[parc - 1] != '0') @@ -275,8 +196,7 @@ aftercheck: /* This is to prevent excess + modes. -- Syzop */ if (MyUser(client) && parv[2]) { - mode_cutoff(parv[2]); - mode_cutoff2(client, channel, &parc, parv); + parv[2] = mode_cutoff(parv[2]); } /* Filter out the unprivileged FIRST. * @@ -290,939 +210,472 @@ aftercheck: /** Cut off mode string (eg: +abcdfjkdsgfgs) at MAXMODEPARAMS modes. * @param s The mode string (modes only, no parameters) * @note Should only used on local clients - * @author Syzop + * @returns The cleaned up string */ -static void mode_cutoff(char *s) +static char *mode_cutoff(const char *i) { -unsigned short modesleft = MAXMODEPARAMS * 2; /* be generous... */ + static char newmodebuf[BUFSIZE]; + char *o; + unsigned short modesleft = MAXMODEPARAMS * 2; /* be generous... */ - for (; *s && modesleft; s++) - if ((*s != '-') && (*s != '+')) + strlcpy(newmodebuf, i, sizeof(newmodebuf)); + + for (o = newmodebuf; *o && modesleft; o++) + if ((*o != '-') && (*o != '+')) modesleft--; - *s = '\0'; -} - -/** Another mode cutoff routine - this one for the server-side - * amplification/enlargement problem that happens with bans/exempts/invex - * as explained in #2837. -- Syzop - */ -static void mode_cutoff2(Client *client, Channel *channel, int *parc_out, char *parv[]) -{ - int len, i; - int parc = *parc_out; - - if (parc-2 <= 3) - return; /* Less than 3 mode parameters? Then we don't even have to check */ - - /* Calculate length of MODE if it would go through fully as-is */ - /* :nick!user@host MODE #channel +something param1 param2 etc... */ - len = strlen(client->name) + strlen(client->user->username) + strlen(GetHost(client)) + - strlen(channel->chname) + 11; - - len += strlen(parv[2]); - - if (*parv[2] != '+' && *parv[2] != '-') - len++; - - for (i = 3; parv[i]; i++) - { - len += strlen(parv[i]) + 1; /* (+1 for the space character) */ - /* +4 is another potential amplification (per-param). - * If we were smart we would only check this for b/e/I and only for - * relevant cases (not for all extended), but this routine is dumb, - * so we just +4 for any case where the full mask is missing. - * It's better than assuming +4 for all cases, though... - */ - if (!match_simple("*!*@*", parv[i])) - len += 4; - } - - /* Now check if the result is acceptable... */ - if (len < 510) - return; /* Ok, no problem there... */ - - /* Ok, we have a potential problem... - * we just dump the last parameter... check how much space we saved... - * and try again if that did not help - */ - for (i = parc-1; parv[i] && (i > 3); i--) - { - len -= strlen(parv[i]); - if (!match_simple("*!*@*", parv[i])) - len -= 4; /* must adjust accordingly.. */ - parv[i] = NULL; - (*parc_out)--; - if (len < 510) - break; - } - /* This may be reached if like the first parameter is really insane long.. - * which is no problem, as other layers (eg: ban) takes care of that. - * We're done... - */ -} - -/* bounce_mode -- written by binary - * User or server is NOT authorized to change the mode. This takes care - * of making the bounce string and bounce it. Because of the 1 for the bounce - * param (last param) of the calls to set_mode and make_mode_str, it will not - * set the mode, but create the bounce string. - */ -static void bounce_mode(Channel *channel, Client *client, int parc, char *parv[]) -{ - char pvar[MAXMODEPARAMS][MODEBUFLEN + 3]; - int pcount; - - set_mode(channel, client, parc, parv, &pcount, pvar, 1); - - if (channel->creationtime) - sendto_one(client, NULL, ":%s MODE %s &%s %s %lld", me.id, - channel->chname, modebuf, parabuf, (long long)channel->creationtime); - else - sendto_one(client, NULL, ":%s MODE %s &%s %s", me.id, channel->chname, - modebuf, parabuf); - - /* the '&' denotes a bounce so servers won't bounce a bounce */ + *o = '\0'; + return newmodebuf; } /* do_mode -- written by binary * User or server is authorized to do the mode. This takes care of * setting the mode and relaying it to other users and servers. */ -void _do_mode(Channel *channel, Client *client, MessageTag *recv_mtags, int parc, char *parv[], time_t sendts, int samode) +void _do_mode(Channel *channel, Client *client, MessageTag *recv_mtags, int parc, const char *parv[], time_t sendts, int samode) { + Client *orig_client = client; /* (needed for samode replacement in a loop) */ char pvar[MAXMODEPARAMS][MODEBUFLEN + 3]; int pcount; - char tschange = 0, isbounce = 0; /* fwd'ing bounce */ - MessageTag *mtags = NULL; - - new_message(client, recv_mtags, &mtags); - - /* IMPORTANT: if you return, don't forget to free mtags!! */ - - if (**parv == '&') - isbounce = 1; + int i; + char tschange = 0; + MultiLineMode *m; /* Please keep the next 3 lines next to each other */ samode_in_progress = samode; - set_mode(channel, client, parc, parv, &pcount, pvar, 0); + m = set_mode(channel, client, parc, parv, &pcount, pvar); samode_in_progress = 0; - if (MyConnect(client)) - RunHook7(HOOKTYPE_PRE_LOCAL_CHANMODE, client, channel, mtags, modebuf, parabuf, sendts, samode); - else - RunHook7(HOOKTYPE_PRE_REMOTE_CHANMODE, client, channel, mtags, modebuf, parabuf, sendts, samode); - if (IsServer(client)) { if (sendts > 0) { - if (!channel->creationtime || sendts < channel->creationtime) + if (IsInvalidChannelTS(sendts)) { + unreal_log(ULOG_WARNING, "mode", "MODE_INVALID_TIMESTAMP", client, + "MODE for channel $channel has invalid timestamp $send_timestamp (from $client.name)\n" + "Buffer: $modebuf $parabuf", + log_data_channel("channel", channel), + log_data_integer("send_timestamp", sendts), + log_data_string("modebuf", m?m->modeline[0]:""), + log_data_string("parabuf", m?m->modeline[0]:"")); + /* Yeah, so what to do in this case? + * Don't set channel->creationtime + * and assume merging. + */ + sendts = channel->creationtime; + } else + if (sendts < channel->creationtime) + { + /* Our timestamp is wrong or this is a new channel */ tschange = 1; channel->creationtime = sendts; - if (sendts < 750000) - { - sendto_realops( - "Warning! Possible desync: MODE for channel %s ('%s %s') has fishy timestamp (%lld) (from %s/%s)", - channel->chname, modebuf, parabuf, (long long)sendts, client->direction->name, client->name); - ircd_log(LOG_ERROR, "Possible desync: MODE for channel %s ('%s %s') has fishy timestamp (%lld) (from %s/%s)", - channel->chname, modebuf, parabuf, (long long)sendts, client->direction->name, client->name); - } - /* new chan or our timestamp is wrong */ - /* now works for double-bounce prevention */ } if (sendts > channel->creationtime && channel->creationtime) { - /* theirs is wrong but we let it pass anyway */ + /* Their timestamp is wrong */ sendts = channel->creationtime; sendto_one(client, NULL, ":%s MODE %s + %lld", me.name, - channel->chname, (long long)channel->creationtime); + channel->name, (long long)channel->creationtime); } } - if (sendts == -1 && channel->creationtime) + if (sendts == -1) sendts = channel->creationtime; } - if (*modebuf == '\0' || (*(modebuf + 1) == '\0' && (*modebuf == '+' || *modebuf == '-'))) + if (!m) { - if (tschange || isbounce) + /* No modes changed (empty mode change) */ + if (tschange && !m) { - /* relay bounce time changes */ - if (channel->creationtime) - { - sendto_server(client, 0, 0, NULL, ":%s MODE %s %s+ %lld", - me.id, channel->chname, isbounce ? "&" : "", - (long long)channel->creationtime); - } else { - sendto_server(client, 0, 0, NULL, ":%s MODE %s %s+", - me.id, channel->chname, isbounce ? "&" : ""); - } - free_message_tags(mtags); - return; /* nothing to send */ + /* Message from the other server is an empty mode, BUT they + * did change the channel->creationtime to an earlier TS + * (see above "Our timestamp is wrong or this is a new channel"). + * We need to relay this MODE message to all other servers + * (all except from where it came from, client). + */ + sendto_server(client, 0, 0, NULL, ":%s MODE %s + %lld", + me.id, channel->name, + (long long)channel->creationtime); } - } - - /* opermode for twimodesystem --sts */ -#ifndef NO_OPEROVERRIDE - if ((opermode == 1) && IsUser(client)) - { - if (modebuf[1]) - { - sendto_snomask(SNO_EYES, - "*** OperOverride -- %s (%s@%s) MODE %s %s %s", - client->name, client->user->username, client->user->realhost, - channel->chname, modebuf, parabuf); - - /* Logging Implementation added by XeRXeS */ - ircd_log(LOG_OVERRIDE,"OVERRIDE: %s (%s@%s) MODE %s %s %s", - client->name, client->user->username, client->user->realhost, - channel->chname, modebuf, parabuf); - } - - sendts = 0; - } -#endif - - /* Should stop null modes */ - if (*(modebuf + 1) == '\0') - { - free_message_tags(mtags); + /* Nothing to send */ + safe_free_multilinemode(m); + opermode = 0; return; } - if (IsUser(client) && samode && MyUser(client)) + /* Now loop through the multiline modes... */ + for (i = 0; i < m->numlines; i++) { - if (!sajoinmode) - sendto_umode_global(UMODE_OPER, "%s used SAMODE %s (%s%s%s)", - client->name, channel->chname, modebuf, *parabuf ? " " : "", parabuf); + char *modebuf = m->modeline[i]; + char *parabuf = m->paramline[i]; + MessageTag *mtags = NULL; + int should_destroy = 0; - client = &me; - sendts = 0; + if (m->numlines == 1) + { + /* Single mode lines are easy: retain original msgid etc */ + new_message(client, recv_mtags, &mtags); + } else { + /* We have a multi-mode line: + * This only happens when the input was a single mode line + * that got expanded into a multi mode line due to expansion + * issues. The sender could be a local client, but could also + * be a remote server like UnrealIRCd 5. + * We can't use the same msgid multiple times, and (if the + * sender was a server) then we can't use the original msgid + * either, not for both events and not for the first event + * (since the modeline differs for all events, including first). + * Obviously message ids must be unique for the event... + * So here is our special version again, just like we use in + * SJOIN and elsewhere sporadically for cases like this: + */ + new_message_special(client, recv_mtags, &mtags, ":%s MODE %s %s %s", client->name, channel->name, modebuf, parabuf); + } + + /* IMPORTANT: if you return, don't forget to free mtags!! */ + + if (MyConnect(client)) + RunHook(HOOKTYPE_PRE_LOCAL_CHANMODE, client, channel, mtags, modebuf, parabuf, sendts, samode); + else + RunHook(HOOKTYPE_PRE_REMOTE_CHANMODE, client, channel, mtags, modebuf, parabuf, sendts, samode); + + /* opermode for twimodesystem --sts */ +#ifndef NO_OPEROVERRIDE + if ((opermode == 1) && IsUser(client)) + { + mode_operoverride_msg(client, channel, modebuf, parabuf); + + sendts = 0; + } +#endif + + if (IsUser(orig_client) && samode && MyUser(orig_client)) + { + if (!sajoinmode) + { + char buf[512]; + snprintf(buf, sizeof(buf), "%s%s%s", modebuf, *parabuf ? " " : "", parabuf); + unreal_log(ULOG_INFO, "samode", "SAMODE_COMMAND", orig_client, + "Client $client used SAMODE $channel ($mode)", + log_data_channel("channel", channel), + log_data_string("mode", buf)); + } + + client = &me; + sendts = 0; + } + + sendto_channel(channel, client, NULL, 0, 0, SEND_LOCAL, mtags, + ":%s MODE %s %s %s", + client->name, channel->name, modebuf, parabuf); + + if (IsServer(client) && sendts != -1) + { + sendto_server(client, 0, 0, mtags, + ":%s MODE %s %s %s %lld", + client->id, channel->name, + modebuf, parabuf, + (long long)sendts); + } else + if (samode && IsMe(client)) + { + /* SAMODE is a special case: always send a TS of 0 (omitting TS==desync) */ + sendto_server(client, 0, 0, mtags, + ":%s MODE %s %s %s 0", + client->id, channel->name, + modebuf, parabuf); + } else + { + sendto_server(client, 0, 0, mtags, + ":%s MODE %s %s %s", + client->id, channel->name, + modebuf, parabuf); + /* tell them it's not a timestamp, in case the last param is a number. */ + } + + if (MyConnect(client)) + RunHook(HOOKTYPE_LOCAL_CHANMODE, client, channel, mtags, modebuf, parabuf, sendts, samode, &should_destroy); + else + RunHook(HOOKTYPE_REMOTE_CHANMODE, client, channel, mtags, modebuf, parabuf, sendts, samode, &should_destroy); + + free_message_tags(mtags); + + if (should_destroy) + break; /* eg channel went -P with nobody in it. 'channel' is freed now */ } - - sendto_channel(channel, client, NULL, 0, 0, SEND_LOCAL, mtags, - ":%s MODE %s %s %s", - client->name, channel->chname, modebuf, parabuf); - - if (IsServer(client) && sendts != -1) - { - sendto_server(client, 0, 0, mtags, - ":%s MODE %s %s%s %s %lld", - client->id, channel->chname, - isbounce ? "&" : "", modebuf, parabuf, - (long long)sendts); - } else - if (samode && IsMe(client)) - { - /* SAMODE is a special case: always send a TS of 0 (omitting TS==desync) */ - sendto_server(client, 0, 0, mtags, - ":%s MODE %s %s %s 0", - client->id, channel->chname, modebuf, parabuf); - } else - { - sendto_server(client, 0, 0, mtags, - ":%s MODE %s %s%s %s", - client->id, channel->chname, isbounce ? "&" : "", modebuf, parabuf); - /* tell them it's not a timestamp, in case the last param - ** is a number. */ - } - - if (MyConnect(client)) - RunHook7(HOOKTYPE_LOCAL_CHANMODE, client, channel, mtags, modebuf, parabuf, sendts, samode); - else - RunHook7(HOOKTYPE_REMOTE_CHANMODE, client, channel, mtags, modebuf, parabuf, sendts, samode); - - /* After this, don't touch 'channel' anymore! As permanent module may have destroyed the channel. */ - - free_message_tags(mtags); - + safe_free_multilinemode(m); + opermode = 0; } + /* make_mode_str -- written by binary * Reconstructs the mode string, to make it look clean. mode_buf will * contain the +x-y stuff, and the parabuf will contain the parameters. - * If bounce is set to 1, it will make the string it needs for a bounce. */ -void make_mode_str(Channel *channel, long oldm, Cmode_t oldem, long oldl, int pcount, - char pvar[MAXMODEPARAMS][MODEBUFLEN + 3], char *mode_buf, char *para_buf, - size_t mode_buf_size, size_t para_buf_size, char bounce) +MultiLineMode *make_mode_str(Client *client, Channel *channel, Cmode_t oldem, int pcount, char pvar[MAXMODEPARAMS][MODEBUFLEN + 3]) { - char tmpbuf[MODEBUFLEN+3], *tmpstr; - CoreChannelModeTable *tab = &corechannelmodetable[0]; - char *x = mode_buf; - int what, cnt, z; - int i; - char *m; + Cmode *cm; + int what; + int cnt, z, i; + MultiLineMode *m = safe_alloc(sizeof(MultiLineMode)); + int curr = 0; + int initial_len; + + if (client->user) + initial_len = strlen(client->name) + strlen(client->user->username) + strlen(GetHost(client)) + strlen(channel->name) + 11; + else + initial_len = strlen(client->name) + strlen(channel->name) + 11; + + /* Reserve room for the first element */ + curr = 0; + m->modeline[curr] = safe_alloc(BUFSIZE); + m->paramline[curr] = safe_alloc(BUFSIZE); + m->numlines = curr+1; what = 0; - *tmpbuf = '\0'; - *mode_buf = '\0'; - *para_buf = '\0'; - what = 0; - /* + param-less modes */ - tab = &corechannelmodetable[0]; - while (tab->mode != 0x0) - { - if (channel->mode.mode & tab->mode) - { - if (!(oldm & tab->mode)) - { - if (what != MODE_ADD) - { - *x++ = bounce ? '-' : '+'; - what = MODE_ADD; - } - *x++ = tab->flag; - } - } - tab++; - } + /* The first element will be filled with all paramless modes. + * That is: both the ones that got set, and the ones that got unset. + * This will always fit. + */ - /* + paramless extmodes... */ - for (i=0; i <= Channelmode_highest; i++) + /* Which paramless modes got set? Eg +snt */ + for (cm=channelmodes; cm; cm = cm->next) { - if (!Channelmode_Table[i].flag || Channelmode_Table[i].paracount) + if (!cm->letter || cm->paracount) continue; /* have it now and didn't have it before? */ - if ((channel->mode.extmode & Channelmode_Table[i].mode) && - !(oldem & Channelmode_Table[i].mode)) + if ((channel->mode.mode & cm->mode) && + !(oldem & cm->mode)) { if (what != MODE_ADD) { - *x++ = bounce ? '-' : '+'; + strlcat_letter(m->modeline[curr], '+', BUFSIZE); what = MODE_ADD; } - *x++ = Channelmode_Table[i].flag; + strlcat_letter(m->modeline[curr], cm->letter, BUFSIZE); } } - *x = '\0'; - /* - param-less modes */ - tab = &corechannelmodetable[0]; - while (tab->mode != 0x0) + /* Which paramless modes got unset? Eg -r */ + for (cm=channelmodes; cm; cm = cm->next) { - if (!(channel->mode.mode & tab->mode)) - { - if (oldm & tab->mode) - { - if (what != MODE_DEL) - { - *x++ = bounce ? '+' : '-'; - what = MODE_DEL; - } - *x++ = tab->flag; - } - } - tab++; - } - - /* - extmodes (both "param modes" and paramless don't have - * any params when unsetting... well, except one special type, that is (we skip those here) - */ - for (i=0; i <= Channelmode_highest; i++) - { - if (!Channelmode_Table[i].flag || Channelmode_Table[i].unset_with_param) + if (!cm->letter || cm->unset_with_param) continue; /* don't have it now and did have it before */ - if (!(channel->mode.extmode & Channelmode_Table[i].mode) && - (oldem & Channelmode_Table[i].mode)) + if (!(channel->mode.mode & cm->mode) && (oldem & cm->mode)) { if (what != MODE_DEL) { - *x++ = bounce ? '+' : '-'; + strlcat_letter(m->modeline[curr], '-', BUFSIZE); what = MODE_DEL; } - *x++ = Channelmode_Table[i].flag; + strlcat_letter(m->modeline[curr], cm->letter, BUFSIZE); } } - *x = '\0'; - /* user limit */ - if (channel->mode.limit != oldl) - { - if ((!bounce && channel->mode.limit == 0) || - (bounce && channel->mode.limit != 0)) - { - if (what != MODE_DEL) - { - *x++ = '-'; - what = MODE_DEL; - } - if (bounce) - channel->mode.limit = 0; /* set it back */ - *x++ = 'l'; - } - else - { - if (what != MODE_ADD) - { - *x++ = '+'; - what = MODE_ADD; - } - *x++ = 'l'; - if (bounce) - channel->mode.limit = oldl; /* set it back */ - ircsnprintf(para_buf, para_buf_size, "%s%d ", para_buf, channel->mode.limit); - } - } - /* reconstruct bkov chain */ + /* Now for parameter modes we do both addition and removal. Eg +b-e ban!x@y exempt!z@z */ for (cnt = 0; cnt < pcount; cnt++) { + if ((strlen(m->modeline[curr]) + strlen(m->paramline[curr]) + strlen(&pvar[cnt][2])) > 507) + { + if (curr == MAXMULTILINEMODES) + { + /* Should be impossible.. */ + unreal_log(ULOG_ERROR, "mode", "MODE_MULTINE_EXCEEDED", client, + "A mode string caused an avalanche effect of more than $max_multiline modes " + "in channel $channel. Caused by client $client. Expect a desync.", + log_data_integer("max_multiline_modes", MAXMULTILINEMODES), + log_data_channel("channel", channel)); + break; + } + curr++; + m->modeline[curr] = safe_alloc(BUFSIZE); + m->paramline[curr] = safe_alloc(BUFSIZE); + m->numlines = curr+1; + what = 0; + } if ((*(pvar[cnt]) == '+') && what != MODE_ADD) { - *x++ = bounce ? '-' : '+'; + strlcat_letter(m->modeline[curr], '+', BUFSIZE); what = MODE_ADD; } if ((*(pvar[cnt]) == '-') && what != MODE_DEL) { - *x++ = bounce ? '+' : '-'; + strlcat_letter(m->modeline[curr], '-', BUFSIZE); what = MODE_DEL; } - *x++ = *(pvar[cnt] + 1); - tmpstr = &pvar[cnt][2]; - z = (MODEBUFLEN * MAXMODEPARAMS); - m = para_buf; - while ((*m)) { m++; } - while ((*tmpstr) && ((m-para_buf) < z)) - { - *m = *tmpstr; - m++; - tmpstr++; - } - *m++ = ' '; - *m = '\0'; + strlcat_letter(m->modeline[curr], *(pvar[cnt] + 1), BUFSIZE); + strlcat(m->paramline[curr], &pvar[cnt][2], BUFSIZE); + strlcat_letter(m->paramline[curr], ' ', BUFSIZE); } - if (bounce) + + for (i = 0; i <= curr; i++) { - channel->mode.mode = oldm; - channel->mode.extmode = oldem; + char *para_buf = m->paramline[i]; + /* Strip off useless space character (' ') at the end, if there is any */ + z = strlen(para_buf); + if ((z > 0) && (para_buf[z - 1] == ' ')) + para_buf[z - 1] = '\0'; } - z = strlen(para_buf); - if ((z > 0) && (para_buf[z - 1] == ' ')) - para_buf[z - 1] = '\0'; - *x = '\0'; - if (*mode_buf == '\0') + + /* Now check for completely empty mode: */ + if ((curr == 0) && empty_mode(m->modeline[0])) { - *mode_buf = '+'; - mode_buf++; - *mode_buf = '\0'; - /* Don't send empty lines. */ + /* And convert it to a NULL result */ + safe_free_multilinemode(m); + return NULL; } - return; + + return m; } +const char *mode_ban_handler(Client *client, Channel *channel, const char *param, int what, int extbtype, Ban **banlist) +{ + const char *tmpstr; + BanContext *b; -/* do_mode_char - * processes one mode character - * returns 1 if it ate up a param, otherwise 0 - * written by binary - * modified for Unreal by stskeeps.. + tmpstr = clean_ban_mask(param, what, client, 0); + if (BadPtr(tmpstr)) + { + /* Invalid ban. See if we can send an error about that (only for extbans) */ + if (MyUser(client) && is_extended_ban(param)) + { + const char *nextbanstr; + Extban *extban = findmod_by_bantype(param, &nextbanstr); + BanContext *b; + + b = safe_alloc(sizeof(BanContext)); + b->client = client; + b->channel = channel; + b->banstr = nextbanstr; + b->is_ok_check = EXBCHK_PARAM; + b->what = what; + b->ban_type = extbtype; + if (extban && extban->is_ok) + extban->is_ok(b); + safe_free(b); + } + + return NULL; + } + if (MyUser(client) && is_extended_ban(param)) + { + /* extban: check access if needed */ + const char *nextbanstr; + Extban *extban = findmod_by_bantype(tmpstr, &nextbanstr); + if (extban) + { + if ((extbtype == EXBTYPE_INVEX) && !(extban->options & EXTBOPT_INVEX)) + return NULL; /* this extended ban type does not support INVEX */ + if (extban->is_ok) + { + BanContext *b = safe_alloc(sizeof(BanContext)); + b->client = client; + b->channel = channel; + b->what = what; + b->ban_type = extbtype; + + b->is_ok_check = EXBCHK_ACCESS; + b->banstr = nextbanstr; + if (!extban->is_ok(b)) + { + if (ValidatePermissionsForPath("channel:override:mode:extban",client,NULL,channel,NULL)) + { + /* TODO: send operoverride notice */ + } else { + b->banstr = nextbanstr; + b->is_ok_check = EXBCHK_ACCESS_ERR; + extban->is_ok(b); + safe_free(b); + return NULL; + } + } + b->banstr = nextbanstr; + b->is_ok_check = EXBCHK_PARAM; + if (!extban->is_ok(b)) + { + safe_free(b); + return NULL; + } + safe_free(b); + } + } + } + + if ( (what == MODE_ADD && add_listmode(banlist, client, channel, tmpstr)) || + (what == MODE_DEL && del_listmode(banlist, channel, tmpstr))) + { + return NULL; /* already exists */ + } + + return tmpstr; +} + +/** Write the result of a mode change. + * This is used by do_mode_char_list_mode(), do_mode_char_member_mode() + * and do_extmode_char(). + * The result is later used by make_mode_str() to create the + * actual MODE line to be broadcasted to the channel and other servers. */ - -#define REQUIRE_PARAMETER() { if (!param || *pcount >= MAXMODEPARAMS) { retval = 0; break; } retval = 1; } - -#ifdef PREFIX_AQ -#define is_xchanop(x) ((x & (CHFL_CHANOP|CHFL_CHANADMIN|CHFL_CHANOWNER))) +void do_mode_char_write(char pvar[MAXMODEPARAMS][MODEBUFLEN + 3], u_int *pcount, u_int what, char modeletter, const char *str) +{ + /* Caller should have made sure there was room! */ + if (*pcount >= MAXMODEPARAMS) +#ifdef DEBUGMODE + abort(); #else -#define is_xchanop(x) ((x & CHFL_CHANOP)) + return; #endif -int do_mode_char(Channel *channel, long modetype, char modechar, char *param, - u_int what, Client *client, - u_int *pcount, char pvar[MAXMODEPARAMS][MODEBUFLEN + 3], - char bounce, long my_access) -{ - CoreChannelModeTable *tab = &corechannelmodetable[0]; - int retval = 0; - Member *member = NULL; - Membership *membership = NULL; - Client *target; - unsigned int tmp = 0; - char tmpbuf[512], *tmpstr; - char tc = ' '; /* */ - int chasing = 0, x; - Hook *h; + ircsnprintf(pvar[*pcount], MODEBUFLEN + 3, + "%c%c%s", + (what == MODE_ADD) ? '+' : '-', + modeletter, + str); + (*pcount)++; +} + +int do_mode_char_list_mode(Channel *channel, long modetype, char modechar, const char *param, + u_int what, Client *client, + u_int *pcount, char pvar[MAXMODEPARAMS][MODEBUFLEN + 3]) +{ + const char *tmpstr; + + /* Check if there is a parameter present */ + if (!param || *pcount >= MAXMODEPARAMS) + return 0; - if ((my_access & CHFL_HALFOP) && !is_xchanop(my_access) && !IsULine(client) && - !op_can_override("channel:override:mode",client,channel,&modetype) && !samode_in_progress) - { - if (MyUser(client) && (modetype == MODE_HALFOP) && (what == MODE_DEL) && - param && (find_client(param, NULL) == client)) - { - /* halfop -h'ing him/herself */ - /* ALLOW */ - } else - { - /* Ugly halfop hack --sts - - this allows halfops to do +b +e +v and so on */ - /* (Syzop/20040413: Allow remote halfop modes */ - if ((Halfop_mode(modetype) == FALSE) && MyUser(client)) - { - int eaten = 0; - while (tab->mode != 0x0) - { - if (tab->mode == modetype) - { - sendnumeric(client, ERR_NOTFORHALFOPS, tab->flag); - eaten = tab->parameters; - break; - } - tab++; - } - return eaten; - } - } /* not -h self */ - } switch (modetype) { - case MODE_RGSTR: - if (!IsServer(client) && !IsULine(client)) - { - sendnumeric(client, ERR_ONLYSERVERSCANCHANGE, channel->chname); - break; - } - goto setmode; - case MODE_SECRET: - case MODE_PRIVATE: - case MODE_MODERATED: - case MODE_TOPICLIMIT: - case MODE_NOPRIVMSGS: - case MODE_INVITEONLY: - goto setmode; - setmode: - retval = 0; - if (what == MODE_ADD) { - /* +sp bugfix.. (by JK/Luke)*/ - if ((modetype == MODE_SECRET) && (channel->mode.mode & MODE_PRIVATE)) - channel->mode.mode &= ~MODE_PRIVATE; - if ((modetype == MODE_PRIVATE) && (channel->mode.mode & MODE_SECRET)) - channel->mode.mode &= ~MODE_SECRET; - channel->mode.mode |= modetype; - } - else - { - channel->mode.mode &= ~modetype; - RunHook2(HOOKTYPE_MODECHAR_DEL, channel, (int)modechar); - } - break; - -/* do pro-opping here (popping) */ - case MODE_CHANOWNER: - REQUIRE_PARAMETER() - if (!IsULine(client) && !IsServer(client) && !is_chanowner(client, channel) && !samode_in_progress) - { - if (MyUser(client) && !op_can_override("channel:override:mode",client,channel,&modetype)) - { - sendnumeric(client, ERR_CHANOWNPRIVNEEDED, channel->chname); - break; - } - if (!is_half_op(client, channel)) /* htrig will take care of halfop override notices */ - opermode = 1; - } - goto process_listmode; - case MODE_CHANADMIN: - REQUIRE_PARAMETER() - /* not uline, not server, not chanowner, not an samode, not -a'ing yourself... */ - if (!IsULine(client) && !IsServer(client) && !is_chanowner(client, channel) && !samode_in_progress && - !(param && (what == MODE_DEL) && (find_client(param, NULL) == client))) - { - if (MyUser(client) && !op_can_override("channel:override:mode",client,channel,&modetype)) - { - sendnumeric(client, ERR_CHANOWNPRIVNEEDED, channel->chname); - break; - } - if (!is_half_op(client, channel)) /* htrig will take care of halfop override notices */ - opermode = 1; - } - goto process_listmode; - - case MODE_HALFOP: - case MODE_CHANOP: - case MODE_VOICE: - REQUIRE_PARAMETER() -process_listmode: - if (!(target = find_chasing(client, param, &chasing))) - break; - if (!target->user) - break; - if (!(membership = find_membership_link(target->user->channel, channel))) - { - sendnumeric(client, ERR_USERNOTINCHANNEL, target->name, channel->chname); - break; - } - member = find_member_link(channel->members, target); - if (!member) - { - /* should never happen */ - sendto_realops("crap! find_membership_link && !find_member_link !!. Report to unreal team"); - break; - } - /* we make the rules, we bend the rules */ - if (IsServer(client) || IsULine(client)) - goto breaktherules; - - if (what == MODE_DEL) - { - int ret = EX_ALLOW; - char *badmode = NULL; - - for (h = Hooks[HOOKTYPE_MODE_DEOP]; h; h = h->next) - { - int n = (*(h->func.intfunc))(client, member->client, channel, what, modechar, my_access, &badmode); - if (n == EX_DENY) - ret = n; - else if (n == EX_ALWAYS_DENY) - { - ret = n; - break; - } - } - - if (ret == EX_ALWAYS_DENY) - { - if (MyUser(client) && badmode) - sendto_one(client, NULL, "%s", badmode); /* send error message, if any */ - - if (MyUser(client)) - break; /* stop processing this mode */ - } - - /* This probably should work but is completely untested (the operoverride stuff, I mean): */ - if (ret == EX_DENY) - { - if (!op_can_override("channel:override:mode:del",client,channel,&modetype)) - { - if (badmode) - sendto_one(client, NULL, "%s", badmode); /* send error message, if any */ - break; /* stop processing this mode */ - } else { - opermode = 1; - } - } - } - - /* This check not only prevents unprivileged users from doing a -q on chanowners, - * it also protects against -o/-h/-v on them. - */ - if (is_chanowner(member->client, channel) - && member->client != client - && !is_chanowner(client, channel) && !IsServer(client) - && !IsULine(client) && !opermode && !samode_in_progress && (what == MODE_DEL)) - { - if (MyUser(client)) - { - /* Need this !op_can_override() here again, even with the !opermode - * check a few lines up, all due to halfops. -- Syzop - */ - if (!op_can_override("channel:override:mode:del",client,channel,&modetype)) - { - char errbuf[NICKLEN+30]; - ircsnprintf(errbuf, sizeof(errbuf), "%s is a channel owner", member->client->name); - sendnumeric(client, ERR_CANNOTCHANGECHANMODE, modechar, errbuf); - break; - } - } else { - if (IsOper(client)) - opermode = 1; - } - } - - /* This check not only prevents unprivileged users from doing a -a on chanadmins, - * it also protects against -o/-h/-v on them. - */ - if (is_chanadmin(member->client, channel) - && member->client != client - && !is_chanowner(client, channel) && !IsServer(client) && !opermode && !samode_in_progress - && modetype != MODE_CHANOWNER && (what == MODE_DEL)) - { - if (MyUser(client)) - { - /* Need this !op_can_override() here again, even with the !opermode - * check a few lines up, all due to halfops. -- Syzop - */ - if (!op_can_override("channel:override:mode:del",client,channel,&modetype)) - { - char errbuf[NICKLEN+30]; - ircsnprintf(errbuf, sizeof(errbuf), "%s is a channel admin", member->client->name); - sendnumeric(client, ERR_CANNOTCHANGECHANMODE, modechar, errbuf); - break; - } - } else { - if (IsOper(client)) - opermode = 1; - } - } - breaktherules: - tmp = member->flags; - if (what == MODE_ADD) - member->flags |= modetype; - else - member->flags &= ~modetype; - if ((tmp == member->flags) && (bounce || !IsULine(client))) - break; - /* It's easier to undo the mode here instead of later - * when you call make_mode_str for a bounce string. - * Why set it if it will be instantly removed? - * Besides, pvar keeps a log of it. */ - if (bounce) - member->flags = tmp; - if (modetype == MODE_CHANOWNER) - tc = 'q'; - if (modetype == MODE_CHANADMIN) - tc = 'a'; - if (modetype == MODE_CHANOP) - tc = 'o'; - if (modetype == MODE_HALFOP) - tc = 'h'; - if (modetype == MODE_VOICE) - tc = 'v'; - /* Make sure membership->flags and member->flags is the same */ - membership->flags = member->flags; - ircsnprintf(pvar[*pcount], MODEBUFLEN + 3, - "%c%c%s", - (what == MODE_ADD) ? '+' : '-', tc, target->name); - (*pcount)++; - break; - case MODE_LIMIT: - if (what == MODE_ADD) - { - int v; - REQUIRE_PARAMETER() - v = atoi(param); - if (v < 0) - v = 1; /* setting +l with a negative number makes no sense */ - if (v > 1000000000) - v = 1000000000; /* some kind of limit, 1 billion (mrah...) */ - if (channel->mode.limit == v) - break; - channel->mode.limit = v; - } - else - { - retval = 0; - if (!channel->mode.limit) - break; - channel->mode.limit = 0; - RunHook2(HOOKTYPE_MODECHAR_DEL, channel, (int)modechar); - } - break; - case MODE_KEY: - REQUIRE_PARAMETER() - for (x = 0; x < *pcount; x++) - { - if (pvar[x][1] == 'k') - { /* don't allow user to change key - * more than once per command. */ - retval = 0; - break; - } - } - if (retval == 0) /* you can't break a case from loop */ - break; - if (what == MODE_ADD) - { - if (!bounce) { /* don't do the mode at all. */ - char *tmp; - if ((tmp = strchr(param, ' '))) - *tmp = '\0'; - if ((tmp = strchr(param, ':'))) - *tmp = '\0'; - if ((tmp = strchr(param, ','))) - *tmp = '\0'; - if (*param == '\0') - break; - if (strlen(param) > KEYLEN) - param[KEYLEN] = '\0'; - if (!strcmp(channel->mode.key, param)) - break; - strlcpy(channel->mode.key, param, sizeof(channel->mode.key)); - } - tmpstr = param; - } - else - { - if (!*channel->mode.key) - break; /* no change */ - strlcpy(tmpbuf, channel->mode.key, sizeof(tmpbuf)); - tmpstr = tmpbuf; - if (!bounce) - strcpy(channel->mode.key, ""); - RunHook2(HOOKTYPE_MODECHAR_DEL, channel, (int)modechar); - } - retval = 1; - - ircsnprintf(pvar[*pcount], MODEBUFLEN + 3, - "%ck%s", - (what == MODE_ADD) ? '+' : '-', tmpstr); - (*pcount)++; - break; - case MODE_BAN: - REQUIRE_PARAMETER() - retval = 1; - tmpstr = clean_ban_mask(param, what, client); - if (BadPtr(tmpstr)) - { - /* Invalid ban. See if we can send an error about that (only for extbans) */ - if (MyUser(client) && !bounce && is_extended_ban(param)) - { - Extban *p = findmod_by_bantype(param[1]); - if (p && p->is_ok) - p->is_ok(client, channel, param, EXBCHK_PARAM, what, EXBTYPE_BAN); - } - - break; /* ignore ban, but eat param */ - } - if (MyUser(client) && !bounce && is_extended_ban(param)) - { - /* extban: check access if needed */ - Extban *p = findmod_by_bantype(tmpstr[1]); - if (p && p->is_ok) - { - if (!p->is_ok(client, channel, tmpstr, EXBCHK_ACCESS, what, EXBTYPE_BAN)) - { - if (ValidatePermissionsForPath("channel:override:mode:extban",client,NULL,channel,NULL)) - { - /* TODO: send operoverride notice */ - } else { - p->is_ok(client, channel, tmpstr, EXBCHK_ACCESS_ERR, what, EXBTYPE_BAN); - break; - } - } - if (!p->is_ok(client, channel, tmpstr, EXBCHK_PARAM, what, EXBTYPE_BAN)) - break; - } - } - /* For bounce, we don't really need to worry whether - * or not it exists on our server. We'll just always - * bounce it. */ - if (!bounce && - ((what == MODE_ADD && add_listmode(&channel->banlist, client, channel, tmpstr)) - || (what == MODE_DEL && del_listmode(&channel->banlist, channel, tmpstr)))) - { - break; /* already exists */ - } - ircsnprintf(pvar[*pcount], MODEBUFLEN + 3, - "%cb%s", - (what == MODE_ADD) ? '+' : '-', tmpstr); - (*pcount)++; + if (!(tmpstr = mode_ban_handler(client, channel, param, what, EXBTYPE_BAN, &channel->banlist))) + break; /* rejected or duplicate */ + do_mode_char_write(pvar, pcount, what, modechar, tmpstr); break; case MODE_EXCEPT: - REQUIRE_PARAMETER() - tmpstr = clean_ban_mask(param, what, client); - if (BadPtr(tmpstr)) - { - /* Invalid except. See if we can send an error about that (only for extbans) */ - if (MyUser(client) && !bounce && is_extended_ban(param)) - { - Extban *p = findmod_by_bantype(param[1]); - if (p && p->is_ok) - p->is_ok(client, channel, param, EXBCHK_PARAM, what, EXBTYPE_EXCEPT); - } - - break; /* ignore except, but eat param */ - } - if (MyUser(client) && !bounce && is_extended_ban(param)) - { - /* extban: check access if needed */ - Extban *p = findmod_by_bantype(tmpstr[1]); - if (p && p->is_ok) - { - if (!p->is_ok(client, channel, tmpstr, EXBCHK_ACCESS, what, EXBTYPE_EXCEPT)) - { - if (ValidatePermissionsForPath("channel:override:mode:extban",client,NULL,channel,NULL)) - { - /* TODO: send operoverride notice */ - } else { - p->is_ok(client, channel, tmpstr, EXBCHK_ACCESS_ERR, what, EXBTYPE_EXCEPT); - break; - } - } - if (!p->is_ok(client, channel, tmpstr, EXBCHK_PARAM, what, EXBTYPE_EXCEPT)) - break; - } - } - /* For bounce, we don't really need to worry whether - * or not it exists on our server. We'll just always - * bounce it. */ - if (!bounce && - ((what == MODE_ADD && add_listmode(&channel->exlist, client, channel, tmpstr)) - || (what == MODE_DEL && del_listmode(&channel->exlist, channel, tmpstr)))) - { - break; /* already exists */ - } - ircsnprintf(pvar[*pcount], MODEBUFLEN + 3, - "%ce%s", - (what == MODE_ADD) ? '+' : '-', tmpstr); - (*pcount)++; + if (!(tmpstr = mode_ban_handler(client, channel, param, what, EXBTYPE_EXCEPT, &channel->exlist))) + break; /* rejected or duplicate */ + do_mode_char_write(pvar, pcount, what, modechar, tmpstr); break; case MODE_INVEX: - REQUIRE_PARAMETER() - tmpstr = clean_ban_mask(param, what, client); - if (BadPtr(tmpstr)) - { - /* Invalid invex. See if we can send an error about that (only for extbans) */ - if (MyUser(client) && !bounce && is_extended_ban(param)) - { - Extban *p = findmod_by_bantype(param[1]); - if (p && p->is_ok) - p->is_ok(client, channel, param, EXBCHK_PARAM, what, EXBTYPE_INVEX); - } - - break; /* ignore invex, but eat param */ - } - if (MyUser(client) && !bounce && is_extended_ban(param)) - { - /* extban: check access if needed */ - Extban *p = findmod_by_bantype(tmpstr[1]); - if (p) - { - if (!(p->options & EXTBOPT_INVEX)) - break; /* this extended ban type does not support INVEX */ - if (p->is_ok && !p->is_ok(client, channel, tmpstr, EXBCHK_ACCESS, what, EXBTYPE_INVEX)) - { - if (ValidatePermissionsForPath("channel:override:mode:extban",client,NULL,channel,NULL)) - { - /* TODO: send operoverride notice */ - } else { - p->is_ok(client, channel, tmpstr, EXBCHK_ACCESS_ERR, what, EXBTYPE_INVEX); - break; - } - } - if (p->is_ok && !p->is_ok(client, channel, tmpstr, EXBCHK_PARAM, what, EXBTYPE_INVEX)) - break; - } - } - /* For bounce, we don't really need to worry whether - * or not it exists on our server. We'll just always - * bounce it. */ - if (!bounce && - ((what == MODE_ADD && add_listmode(&channel->invexlist, client, channel, tmpstr)) - || (what == MODE_DEL && del_listmode(&channel->invexlist, channel, tmpstr)))) - { - break; /* already exists */ - } - ircsnprintf(pvar[*pcount], MODEBUFLEN + 3, - "%cI%s", - (what == MODE_ADD) ? '+' : '-', tmpstr); - (*pcount)++; + if (!(tmpstr = mode_ban_handler(client, channel, param, what, EXBTYPE_INVEX, &channel->invexlist))) + break; /* rejected or duplicate */ + do_mode_char_write(pvar, pcount, what, modechar, tmpstr); break; } - return retval; + return 1; } /** Check access and if granted, set the extended chanmode to the requested value in memory. - * note: if bounce is requested then the mode will not be set. * @returns amount of params eaten (0 or 1) */ -int do_extmode_char(Channel *channel, Cmode *handler, char *param, u_int what, - Client *client, u_int *pcount, char pvar[MAXMODEPARAMS][MODEBUFLEN + 3], - char bounce) +int do_extmode_char(Channel *channel, Cmode *handler, const char *param, u_int what, + Client *client, u_int *pcount, char pvar[MAXMODEPARAMS][MODEBUFLEN + 3]) { int paracnt = (what == MODE_ADD) ? handler->paracount : 0; - char mode = handler->flag; + char mode = handler->letter; int x; - char *morphed; + const char *morphed; if ((what == MODE_DEL) && handler->unset_with_param) paracnt = 1; /* there's always an exception! */ @@ -1244,7 +697,7 @@ int do_extmode_char(Channel *channel, Cmode *handler, char *param, u_int what, handler->is_ok(client, channel, mode, param, EXCHK_ACCESS_ERR, what); return paracnt; /* Denied & error msg sent */ } - if (x == EX_DENY) + if ((x == EX_DENY) && !samode_in_progress) opermode = 1; /* override in progress... */ } else { /* remote user: we only need to check if we need to generate an operoverride msg */ @@ -1255,10 +708,16 @@ int do_extmode_char(Channel *channel, Cmode *handler, char *param, u_int what, } } + if (handler->type == CMODE_MEMBER) + { + do_mode_char_member_mode_new(channel, handler, param, what, client, pcount, pvar); + return 1; + } + /* Check for multiple changes in 1 command (like +y-y+y 1 2, or +yy 1 2). */ for (x = 0; x < *pcount; x++) { - if (pvar[x][1] == handler->flag) + if (pvar[x][1] == handler->letter) { /* this is different than the old chanmode system, coz: * "mode #chan +kkL #a #b #c" will get "+kL #a #b" which is wrong :p. @@ -1273,16 +732,14 @@ int do_extmode_char(Channel *channel, Cmode *handler, char *param, u_int what, { if (what == MODE_DEL) { - if (!(channel->mode.extmode & handler->mode)) + if (!(channel->mode.mode & handler->mode)) return paracnt; /* There's nothing to remove! */ if (handler->unset_with_param) { /* Special extended channel mode requiring a parameter on unset. * Any provided parameter is ok, the current one (that is set) will be used. */ - ircsnprintf(pvar[*pcount], MODEBUFLEN + 3, "-%c%s", - handler->flag, cm_getparameter(channel, handler->flag)); - (*pcount)++; + do_mode_char_write(pvar, pcount, what, handler->letter, cm_getparameter(channel, handler->letter)); } else { /* Normal extended channel mode: deleting is just -X, no parameter. * Nothing needs to be done here. @@ -1298,40 +755,92 @@ int do_extmode_char(Channel *channel, Cmode *handler, char *param, u_int what, return paracnt; /* rejected by conv_param */ /* is it already set at the same value? if so, ignore it. */ - if (channel->mode.extmode & handler->mode) + if (channel->mode.mode & handler->mode) { - char *now, *requested; - char flag = handler->flag; + const char *now, *requested; + char flag = handler->letter; now = cm_getparameter(channel, flag); requested = handler->conv_param(param, client, channel); if (now && requested && !strcmp(now, requested)) return paracnt; /* ignore... */ } - ircsnprintf(pvar[*pcount], MODEBUFLEN + 3, "+%c%s", - handler->flag, handler->conv_param(param, client, channel)); - (*pcount)++; + do_mode_char_write(pvar, pcount, what, handler->letter, handler->conv_param(param, client, channel)); param = morphed; /* set param to converted parameter. */ } } - if (bounce) /* bounce here means: only check access and return return value */ - return paracnt; - if (what == MODE_ADD) { /* + */ - channel->mode.extmode |= handler->mode; + channel->mode.mode |= handler->mode; if (handler->paracount) - cm_putparameter(channel, handler->flag, param); + cm_putparameter(channel, handler->letter, param); + RunHook(HOOKTYPE_MODECHAR_ADD, channel, (int)mode); } else { /* - */ - channel->mode.extmode &= ~(handler->mode); - RunHook2(HOOKTYPE_MODECHAR_DEL, channel, (int)mode); + channel->mode.mode &= ~(handler->mode); + RunHook(HOOKTYPE_MODECHAR_DEL, channel, (int)mode); if (handler->paracount) - cm_freeparameter(channel, handler->flag); + cm_freeparameter(channel, handler->letter); } return paracnt; } +/** Set or unset a mode on a member (eg +vhoaq/-vhoaq) */ +void do_mode_char_member_mode_new(Channel *channel, Cmode *handler, const char *param, u_int what, + Client *client, u_int *pcount, char pvar[MAXMODEPARAMS][MODEBUFLEN + 3]) +{ + Member *member = NULL; + Membership *membership = NULL; + Client *target; + int chasing = 0; + Hook *h; + char c[2]; + char modechar = handler->letter; + + if (!(target = find_chasing(client, param, &chasing))) + return; + + if (!target->user) + return; + + if (!(membership = find_membership_link(target->user->channel, channel))) + { + sendnumeric(client, ERR_USERNOTINCHANNEL, target->name, channel->name); + return; + } + member = find_member_link(channel->members, target); + if (!member) + { + /* should never happen */ + unreal_log(ULOG_ERROR, "mode", "BUG_FIND_MEMBER_LINK_FAILED", target, + "[BUG] Client $target.details on channel $channel: " + "found via find_membership_link() but NOT found via find_member_link(). " + "This should never happen! Please report on https://bugs.unrealircd.org/", + log_data_channel("channel", channel)); + return; + } + + if ((what == MODE_ADD) && strchr(member->member_modes, modechar)) + return; /* already set */ + if ((what == MODE_DEL) && !strchr(member->member_modes, modechar)) + return; /* already unset */ + + if (what == MODE_ADD) + { + if (strchr(member->member_modes, modechar)) + return; /* already set */ + /* Set the mode */ + add_member_mode_fast(member, membership, modechar); + } else { + if (!strchr(member->member_modes, modechar)) + return; /* already unset */ + del_member_mode_fast(member, membership, modechar); + } + + /* And write out the mode */ + do_mode_char_write(pvar, pcount, what, modechar, target->name); +} + /** In 2003 I introduced PROTOCTL CHANMODES= so remote servers (and services) * could deal with unknown "parameter eating" channel modes, minimizing desyncs. * Now, in 2015, I finally added the code to deal with this. -- Syzop @@ -1341,27 +850,27 @@ int paracount_for_chanmode_from_server(Client *client, u_int what, char mode) if (MyUser(client)) return 0; /* no server, we have no idea, assume 0 paracount */ - if (!client->serv) + if (!client->server) { /* If it's from a remote client then figure out from which "uplink" we * received this MODE. The uplink is the directly-connected-server to us * and may differ from the server the user is actually on. This is correct. */ - if (!client->direction || !client->direction->serv) + if (!client->direction || !client->direction->server) return 0; client = client->direction; } - if (client->serv->features.chanmodes[0] && strchr(client->serv->features.chanmodes[0], mode)) + if (client->server->features.chanmodes[0] && strchr(client->server->features.chanmodes[0], mode)) return 1; /* 1 parameter for set, 1 parameter for unset */ - if (client->serv->features.chanmodes[1] && strchr(client->serv->features.chanmodes[1], mode)) + if (client->server->features.chanmodes[1] && strchr(client->server->features.chanmodes[1], mode)) return 1; /* 1 parameter for set, 1 parameter for unset */ - if (client->serv->features.chanmodes[2] && strchr(client->serv->features.chanmodes[2], mode)) + if (client->server->features.chanmodes[2] && strchr(client->server->features.chanmodes[2], mode)) return (what == MODE_ADD) ? 1 : 0; /* 1 parameter for set, no parameter for unset */ - if (client->serv->features.chanmodes[3] && strchr(client->serv->features.chanmodes[3], mode)) + if (client->server->features.chanmodes[3] && strchr(client->server->features.chanmodes[3], mode)) return 0; /* no parameter for set, no parameter for unset */ if (mode == '&') @@ -1374,10 +883,10 @@ int paracount_for_chanmode_from_server(Client *client, u_int what, char mode) * channel mode. That's actually pretty bad. This shouldn't happen since CHANMODES= * is sent since 2003 and the (often also required) EAUTH PROTOCTL is in there since 2010. */ - sendto_realops("Unknown channel mode %c%c from server %s!", - (what == MODE_ADD) ? '+' : '-', - mode, - client->name); + unreal_log(ULOG_WARNING, "mode", "REMOTE_UNKNOWN_CHANNEL_MODE", client, + "Server $client sent us an unknown channel mode $what$mode_character!", + log_data_string("what", ((what == MODE_ADD) ? "+" : "-")), + log_data_char("mode_character", mode)); return 0; } @@ -1388,30 +897,30 @@ int paracount_for_chanmode_from_server(Client *client, u_int what, char mode) */ int paracount_for_chanmode(u_int what, char mode) { - if (me.serv->features.chanmodes[0] && strchr(me.serv->features.chanmodes[0], mode)) + if (me.server->features.chanmodes[0] && strchr(me.server->features.chanmodes[0], mode)) return 1; /* 1 parameter for set, 1 parameter for unset */ - if (me.serv->features.chanmodes[1] && strchr(me.serv->features.chanmodes[1], mode)) + if (me.server->features.chanmodes[1] && strchr(me.server->features.chanmodes[1], mode)) return 1; /* 1 parameter for set, 1 parameter for unset */ - if (me.serv->features.chanmodes[2] && strchr(me.serv->features.chanmodes[2], mode)) + if (me.server->features.chanmodes[2] && strchr(me.server->features.chanmodes[2], mode)) return (what == MODE_ADD) ? 1 : 0; /* 1 parameter for set, no parameter for unset */ - if (me.serv->features.chanmodes[3] && strchr(me.serv->features.chanmodes[3], mode)) + if (me.server->features.chanmodes[3] && strchr(me.server->features.chanmodes[3], mode)) return 0; /* no parameter for set, no parameter for unset */ /* Not found: */ return 0; } -/* set_mode - * written by binary - */ -void _set_mode(Channel *channel, Client *client, int parc, char *parv[], u_int *pcount, - char pvar[MAXMODEPARAMS][MODEBUFLEN + 3], int bounce) +MultiLineMode *_set_mode(Channel *channel, Client *client, int parc, const char *parv[], u_int *pcount, + char pvar[MAXMODEPARAMS][MODEBUFLEN + 3]) { - char *curchr; - char *argument; + Cmode *cm = NULL; + MultiLineMode *mlm = NULL; + const char *curchr; + const char *argument; + char argumentbuf[MODEBUFLEN+1]; u_int what = MODE_ADD; long modetype = 0; int paracount = 1; @@ -1422,24 +931,15 @@ void _set_mode(Channel *channel, Client *client, int parc, char *parv[], u_int * CoreChannelModeTable foundat; int found = 0; int sent_mlock_warning = 0; - unsigned int htrig = 0; - long oldm, oldl; int checkrestr = 0, warnrestr = 1; - int extm = 1000000; /* (default value not used but stops gcc from complaining) */ Cmode_t oldem; - long my_access; paracount = 1; *pcount = 0; - oldm = channel->mode.mode; - oldl = channel->mode.limit; - oldem = channel->mode.extmode; + oldem = channel->mode.mode; if (RESTRICT_CHANNELMODES && !ValidatePermissionsForPath("immune:restrict-channelmodes",client,NULL,channel,NULL)) /* "cache" this */ checkrestr = 1; - /* Set access to the status we have */ - my_access = IsUser(client) ? get_access(client, channel) : 0; - for (curchr = parv[0]; *curchr; curchr++) { switch (*curchr) @@ -1458,7 +958,7 @@ void _set_mode(Channel *channel, Client *client, int parc, char *parv[], u_int * { if (!sent_mlock_warning) { - sendnumeric(client, ERR_MLOCKRESTRICTED, channel->chname, *curchr, channel->mode_lock); + sendnumeric(client, ERR_MLOCKRESTRICTED, channel->name, *curchr, channel->mode_lock); sent_mlock_warning++; } continue; @@ -1480,9 +980,9 @@ void _set_mode(Channel *channel, Client *client, int parc, char *parv[], u_int * modetype = foundat.mode; } else { /* Maybe in extmodes */ - for (extm=0; extm <= Channelmode_highest; extm++) + for (cm=channelmodes; cm; cm = cm->next) { - if (Channelmode_Table[extm].flag == *curchr) + if (cm->letter == *curchr) { found = 2; break; @@ -1510,74 +1010,24 @@ void _set_mode(Channel *channel, Client *client, int parc, char *parv[], u_int * break; } - if (paracount < parc) - argument = parv[paracount]; /* can still be NULL */ - else + if ((paracount < parc) && parv[paracount]) + { + strlcpy(argumentbuf, parv[paracount], sizeof(argumentbuf)); + argument = argumentbuf; + } else { argument = NULL; - -#ifndef NO_OPEROVERRIDE - if (found == 1) - { - if ((Halfop_mode(modetype) == FALSE) && opermode == 2 && htrig != 1) - { - /* YUCK! */ - if ((foundat.flag == 'h') && argument && (find_person(argument, NULL) == client)) - { - /* ircop with halfop doing a -h on himself. no warning. */ - } else { - opermode = 0; - htrig = 1; - } - } } - else if (found == 2) { - /* Extended mode: all override stuff is in do_extmode_char which will set - * opermode if appropriate. -- Syzop - */ - } -#endif /* !NO_OPEROVERRIDE */ - - /* Not sure how useful this is, but I'll let it stay... */ - if (argument && strlen(argument) >= MODEBUFLEN) - argument[MODEBUFLEN-1] = '\0'; if (found == 1) - { - paracount += do_mode_char(channel, modetype, *curchr, - argument, what, client, pcount, - pvar, bounce, my_access); - } + paracount += do_mode_char_list_mode(channel, modetype, *curchr, argument, what, client, pcount, pvar); else if (found == 2) - { - paracount += do_extmode_char(channel, &Channelmode_Table[extm], argument, - what, client, pcount, pvar, bounce); - } + paracount += do_extmode_char(channel, cm, argument, what, client, pcount, pvar); break; } /* switch(*curchr) */ } /* for loop through mode letters */ - make_mode_str(channel, oldm, oldem, oldl, *pcount, pvar, modebuf, parabuf, sizeof(modebuf), sizeof(parabuf), bounce); - -#ifndef NO_OPEROVERRIDE - if ((htrig == 1) && IsUser(client)) - { - /* This is horrible. Just horrible. */ - if (!((modebuf[0] == '+' || modebuf[0] == '-') && modebuf[1] == '\0')) - { - sendto_snomask(SNO_EYES, "*** OperOverride -- %s (%s@%s) MODE %s %s %s", - client->name, client->user->username, client->user->realhost, - channel->chname, modebuf, parabuf); - } - - /* Logging Implementation added by XeRXeS */ - ircd_log(LOG_OVERRIDE,"OVERRIDE: %s (%s@%s) MODE %s %s %s", - client->name, client->user->username, client->user->realhost, - channel->chname, modebuf, parabuf); - - htrig = 0; - opermode = 0; /* stop double override notices... but is this ok??? -- Syzop */ - } -#endif + mlm = make_mode_str(client, channel, oldem, *pcount, pvar); + return mlm; } /* @@ -1587,16 +1037,17 @@ void _set_mode(Channel *channel, Client *client, int parc, char *parv[], u_int * */ CMD_FUNC(_cmd_umode) { - int i; - char **p, *m; + Umode *um; + const char *m; Client *acptr; - int what, setsnomask = 0; + int what; long oldumodes = 0; - int oldsnomasks = 0; + char oldsnomask[64]; /* (small note: keep 'what' as an int. -- Syzop). */ short rpterror = 0, umode_restrict_err = 0, chk_restrict = 0, modex_err = 0; what = MODE_ADD; + *oldsnomask = '\0'; if (parc < 2) { @@ -1604,7 +1055,7 @@ CMD_FUNC(_cmd_umode) return; } - if (!(acptr = find_person(parv[1], NULL))) + if (!(acptr = find_user(parv[1], NULL))) { if (MyConnect(client)) { @@ -1622,31 +1073,24 @@ CMD_FUNC(_cmd_umode) { sendnumeric(client, RPL_UMODEIS, get_usermode_string(client)); if (client->user->snomask) - sendnumeric(client, RPL_SNOMASK, get_snomask_string(client)); + sendnumeric(client, RPL_SNOMASK, client->user->snomask); return; } userhost_save_current(client); /* save host, in case we do any +x/-x or similar */ - /* find flags already set for user */ - for (i = 0; i <= Usermode_highest; i++) - if ((client->umodes & Usermode_Table[i].mode)) - oldumodes |= Usermode_Table[i].mode; - - for (i = 0; i <= Snomask_highest; i++) - if ((client->user->snomask & Snomask_Table[i].mode)) - oldsnomasks |= Snomask_Table[i].mode; + oldumodes = client->umodes; if (RESTRICT_USERMODES && MyUser(client) && !ValidatePermissionsForPath("immune:restrict-usermodes",client,NULL,NULL,NULL)) chk_restrict = 1; - if (MyConnect(client)) - setsnomask = client->user->snomask; + if (client->user->snomask) + strlcpy(oldsnomask, client->user->snomask, sizeof(oldsnomask)); + /* * parse mode change string(s) */ - p = &parv[2]; - for (m = *p; *m; m++) + for (m = parv[2]; *m; m++) { if (chk_restrict && strchr(RESTRICT_USERMODES, *m)) { @@ -1678,7 +1122,7 @@ CMD_FUNC(_cmd_umode) if (parc >= 4 && client->user->snomask) { set_snomask(client, parv[3]); - if (client->user->snomask == 0) + if (client->user->snomask == NULL) goto def; break; } else { @@ -1686,10 +1130,10 @@ CMD_FUNC(_cmd_umode) goto def; } } - if (what == MODE_ADD) + if ((what == MODE_ADD) && IsOper(client)) { if (parc < 4) - set_snomask(client, IsOper(client) ? SNO_DEFOPER : SNO_DEFUSER); + set_snomask(client, OPER_SNOMASKS); else set_snomask(client, parv[3]); goto def; @@ -1699,7 +1143,8 @@ CMD_FUNC(_cmd_umode) case 'O': if (IsQuarantined(client->direction)) { - sendto_realops("QUARANTINE: Oper %s on server %s killed, due to quarantine", client->name, client->srvptr->name); + unreal_log(ULOG_INFO, "mode", "OPER_KILLED_QUARANTINE", client, + "QUARANTINE: Oper $client.details on server $client.user.servername killed, due to quarantine"); sendto_server(NULL, 0, 0, NULL, ":%s KILL %s :Quarantined: no oper privileges allowed", me.id, client->name); exit_client(client, NULL, "Quarantined: no oper privileges allowed"); return; @@ -1749,24 +1194,23 @@ CMD_FUNC(_cmd_umode) break; default: def: - for (i = 0; i <= Usermode_highest; i++) + for (um = usermodes; um; um = um->next) { - if (*m == Usermode_Table[i].flag) + if (um->letter == *m) { - if (Usermode_Table[i].allowed) - if (!Usermode_Table[i].allowed(client,what)) + if (um->allowed && !um->allowed(client,what)) break; if (what == MODE_ADD) - client->umodes |= Usermode_Table[i].mode; + client->umodes |= um->mode; else - client->umodes &= ~Usermode_Table[i].mode; + client->umodes &= ~um->mode; break; } - else if (i == Usermode_highest && MyConnect(client) && !rpterror) - { - sendnumeric(client, ERR_UMODEUNKNOWNFLAG); - rpterror = 1; - } + } + if (!um && MyConnect(client) && !rpterror) + { + sendnumeric(client, ERR_UMODEUNKNOWNFLAG); + rpterror = 1; } break; } /* switch */ @@ -1784,35 +1228,44 @@ CMD_FUNC(_cmd_umode) int i; /* MODES */ - for (i = 0; i <= Usermode_highest; i++) + for (um = usermodes; um; um = um->next) { - if (!Usermode_Table[i].flag) - continue; - if (Usermode_Table[i].unset_on_deoper) + if (um->unset_on_deoper) { /* This is an oper mode. Is it set now and wasn't earlier? * then it needs to be stripped, as setting it is not * permitted. */ - long m = Usermode_Table[i].mode; - if ((client->umodes & m) && !(oldumodes & m)) - client->umodes &= ~Usermode_Table[i].mode; /* remove */ + if ((client->umodes & um->mode) && !(oldumodes & um->mode)) + client->umodes &= ~um->mode; /* remove */ } } /* SNOMASKS: user can delete existing but not add new ones */ - for (i = 0; i <= Snomask_highest; i++) + if (client->user->snomask) { - int sno = Snomask_Table[i].mode; + char rerun; + do { + char *p; - if (!Snomask_Table[i].flag) - continue; - /* Is it set now and wasn't earlier? Then it - * needs to be stripped, as setting it is not - * permitted. - */ - if ((client->user->snomask & sno) && !(oldsnomasks & sno)) - client->user->snomask &= ~Snomask_Table[i].mode; /* remove */ + rerun = 0; + for (p = client->user->snomask; *p; p++) + { + if (!strchr(oldsnomask, *p)) + { + /* It is set now, but was not earlier? + * Then it needs to be stripped, as setting is not permitted. + * And re-run the loop + */ + delletterfromstring(client->user->snomask, *p); + rerun = 1; + break; + } + } + } while(rerun); + /* And make sure an empty snomask ("") becomes a NULL pointer */ + if (client->user->snomask && !*client->user->snomask) + remove_all_snomasks(client); } } else { /* User isn't an ircop at all. The solution is simple: */ @@ -1876,8 +1329,9 @@ CMD_FUNC(_cmd_umode) if ((oldumodes & UMODE_OPER) && !IsOper(client) && MyConnect(client)) { list_del(&client->special_node); + if (MyUser(client)) + RunHook(HOOKTYPE_LOCAL_OPER, client, 0, NULL); remove_oper_privileges(client, 0); - RunHook2(HOOKTYPE_LOCAL_OPER, client, 0); } if (!(oldumodes & UMODE_OPER) && IsOper(client)) @@ -1913,12 +1367,12 @@ CMD_FUNC(_cmd_umode) * will cause servers to update correctly. */ if (oldumodes != client->umodes) - RunHook3(HOOKTYPE_UMODE_CHANGE, client, oldumodes, client->umodes); + RunHook(HOOKTYPE_UMODE_CHANGE, client, oldumodes, client->umodes); if (dontspread == 0) send_umode_out(client, 1, oldumodes); - if (MyConnect(client) && setsnomask != client->user->snomask) - sendnumeric(client, RPL_SNOMASK, get_snomask_string(client)); + if (MyConnect(client) && client->user->snomask && strcmp(oldsnomask, client->user->snomask)) + sendnumeric(client, RPL_SNOMASK, client->user->snomask); } CMD_FUNC(cmd_mlock) @@ -1932,7 +1386,7 @@ CMD_FUNC(cmd_mlock) t = (time_t) atol(parv[1]); /* Now, try to find the channel in question */ - channel = find_channel(parv[2], NULL); + channel = find_channel(parv[2]); if (!channel) return; @@ -1943,3 +1397,117 @@ CMD_FUNC(cmd_mlock) if (IsServer(client)) set_channel_mlock(client, channel, parv[3], TRUE); } + +void mode_operoverride_msg(Client *client, Channel *channel, char *modebuf, char *parabuf) +{ + char buf[1024]; + + if (empty_mode(modebuf)) + return; + + /* Internally we have this distinction between modebuf and parabuf, + * but this makes little sense to maintain in JSON. + */ + snprintf(buf, sizeof(buf), "%s %s", modebuf, parabuf); + + unreal_log(ULOG_INFO, "operoverride", "OPEROVERRIDE_MODE", client, + "OperOverride: $client.details changed channel mode of $channel to: $channel_mode", + log_data_string("override_type", "mode"), + log_data_string("channel_mode", buf), + log_data_channel("channel", channel)); +} + +/* Deal with information requests from local users, such as: + * MODE #chan b Show the ban list + * MODE #chan e Show the ban exemption list + * MODE #chan I Show the invite exception list + * MODE #chan q Show list of channel owners + * MODE #chan a Show list of channel admins + * @returns 1 if processed as a mode list (please return), + * 0 if not (continue with the MODE as it likely is a set request). + */ +int list_mode_request(Client *client, Channel *channel, const char *req) +{ + const char *p; + Ban *ban; + Member *member; + + for (p = req; *p; p++) + if (strchr("beIqa", *p)) + break; + + if (!*p) + return 0; /* not handled, proceed with the MODE set attempt */ + + /* First, check access */ + if (strchr("beI", *p)) + { + if (!IsMember(client, channel) && !ValidatePermissionsForPath("channel:see:mode:remotebanlist",client,NULL,channel,NULL)) + { + sendnumeric(client, ERR_NOTONCHANNEL, channel->name); + return 1; /* handled */ + } + } else { + if (!IsMember(client, channel) && !ValidatePermissionsForPath("channel:see:mode:remoteownerlist",client,NULL,channel,NULL)) + { + sendnumeric(client, ERR_NOTONCHANNEL, channel->name); + return 1; /* handled */ + } + } + + switch(*p) + { + case 'b': + for (ban = channel->banlist; ban; ban = ban->next) + sendnumeric(client, RPL_BANLIST, channel->name, ban->banstr, ban->who, (long long)ban->when); + sendnumeric(client, RPL_ENDOFBANLIST, channel->name); + break; + case 'e': + for (ban = channel->exlist; ban; ban = ban->next) + sendnumeric(client, RPL_EXLIST, channel->name, ban->banstr, ban->who, (long long)ban->when); + sendnumeric(client, RPL_ENDOFEXLIST, channel->name); + break; + case 'I': + for (ban = channel->invexlist; ban; ban = ban->next) + sendnumeric(client, RPL_INVEXLIST, channel->name, ban->banstr, ban->who, (long long)ban->when); + sendnumeric(client, RPL_ENDOFINVEXLIST, channel->name); + break; + case 'q': + for (member = channel->members; member; member = member->next) + if (strchr(member->member_modes, 'q')) + sendnumeric(client, RPL_QLIST, channel->name, member->client->name); + sendnumeric(client, RPL_ENDOFQLIST, channel->name); + break; + case 'a': + for (member = channel->members; member; member = member->next) + if (strchr(member->member_modes, 'a')) + sendnumeric(client, RPL_ALIST, channel->name, member->client->name); + sendnumeric(client, RPL_ENDOFALIST, channel->name); + break; + } + + return 1; /* handled */ +} + +void _set_channel_mode(Channel *channel, char *modes, char *parameters) +{ + char buf[512]; + char *p, *param; + int myparc = 1, i; + char *myparv[512]; + + memset(&myparv, 0, sizeof(myparv)); + myparv[0] = raw_strdup(modes); + + strlcpy(buf, parameters, sizeof(buf)); + for (param = strtoken(&p, buf, " "); param; param = strtoken(&p, NULL, " ")) + myparv[myparc++] = raw_strdup(param); + myparv[myparc] = NULL; + + SetULine(&me); // hack for crash.. set ulined so no access checks. + do_mode(channel, &me, NULL, myparc, (const char **)myparv, 0, 0); + ClearULine(&me); // and clear it again.. + + for (i = 0; i < myparc; i++) + safe_free(myparv[i]); +} diff --git a/src/modules/monitor.c b/src/modules/monitor.c new file mode 100644 index 0000000..e88e809 --- /dev/null +++ b/src/modules/monitor.c @@ -0,0 +1,232 @@ +/* + * IRC - Internet Relay Chat, src/modules/monitor.c + * (C) 2021 The UnrealIRCd Team + * + * See file AUTHORS in IRC package for additional names of + * the programmers. + * + * This program is free 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 1, or (at your option) + * any later version. + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "unrealircd.h" + +#define MSG_MONITOR "MONITOR" + +#define STR_HELPER(x) #x +#define STR(x) STR_HELPER(x) + +CMD_FUNC(cmd_monitor); +char *monitor_isupport_param(void); +int monitor_nickchange(Client *client, MessageTag *mtags, const char *newnick); +int monitor_post_nickchange(Client *client, MessageTag *mtags, const char *oldnick); +int monitor_quit(Client *client, MessageTag *mtags, const char *comment); +int monitor_connect(Client *client); +int monitor_notification(Client *client, Watch *watch, Link *lp, int event); + +ModuleHeader MOD_HEADER + = { + "monitor", + "5.0", + "command /monitor", + "UnrealIRCd Team", + "unrealircd-6", + }; + +MOD_INIT() +{ + MARK_AS_OFFICIAL_MODULE(modinfo); + + CommandAdd(modinfo->handle, MSG_MONITOR, cmd_monitor, 2, CMD_USER); + HookAdd(modinfo->handle, HOOKTYPE_LOCAL_NICKCHANGE, 0, monitor_nickchange); + HookAdd(modinfo->handle, HOOKTYPE_REMOTE_NICKCHANGE, 0, monitor_nickchange); + HookAdd(modinfo->handle, HOOKTYPE_POST_LOCAL_NICKCHANGE, 0, monitor_post_nickchange); + HookAdd(modinfo->handle, HOOKTYPE_POST_REMOTE_NICKCHANGE, 0, monitor_post_nickchange); + HookAdd(modinfo->handle, HOOKTYPE_REMOTE_QUIT, 0, monitor_quit); + HookAdd(modinfo->handle, HOOKTYPE_LOCAL_QUIT, 0, monitor_quit); + HookAdd(modinfo->handle, HOOKTYPE_LOCAL_CONNECT, 0, monitor_connect); + HookAdd(modinfo->handle, HOOKTYPE_REMOTE_CONNECT, 0, monitor_connect); + + return MOD_SUCCESS; +} + +MOD_LOAD() +{ + ISupportAdd(modinfo->handle, "MONITOR", monitor_isupport_param()); + return MOD_SUCCESS; +} + +MOD_UNLOAD() +{ + return MOD_SUCCESS; +} + +char *monitor_isupport_param(void) +{ + /* i find it unlikely for a client to use WATCH and MONITOR at the same time, so keep a single limit for both */ + return STR(MAXWATCH); +} + +int monitor_nickchange(Client *client, MessageTag *mtags, const char *newnick) +{ + if (!smycmp(client->name, newnick)) // new nick is same as old one, maybe the case changed + return 0; + + watch_check(client, WATCH_EVENT_OFFLINE, monitor_notification); + return 0; +} + +int monitor_post_nickchange(Client *client, MessageTag *mtags, const char *oldnick) +{ + if (!smycmp(client->name, oldnick)) // new nick is same as old one, maybe the case changed + return 0; + + watch_check(client, WATCH_EVENT_ONLINE, monitor_notification); + return 0; +} + +int monitor_quit(Client *client, MessageTag *mtags, const char *comment) +{ + watch_check(client, WATCH_EVENT_OFFLINE, monitor_notification); + return 0; +} + +int monitor_connect(Client *client) +{ + watch_check(client, WATCH_EVENT_ONLINE, monitor_notification); + return 0; +} + +int monitor_notification(Client *client, Watch *watch, Link *lp, int event) +{ + if (!(lp->flags & WATCH_FLAG_TYPE_MONITOR)) + return 0; + + switch (event) + { + case WATCH_EVENT_ONLINE: + sendnumeric(lp->value.client, RPL_MONONLINE, client->name, client->user->username, GetHost(client)); + break; + case WATCH_EVENT_OFFLINE: + sendnumeric(lp->value.client, RPL_MONOFFLINE, client->name); + break; + default: + break; /* may be handled by other modules */ + } + + return 0; +} + +void send_status(Client *client, MessageTag *recv_mtags, const char *nick) +{ + MessageTag *mtags = NULL; + Client *user; + user = find_user(nick, NULL); + new_message(client, recv_mtags, &mtags); + if (!user){ + sendnumeric(client, RPL_MONOFFLINE, nick); + } else { + sendnumeric(client, RPL_MONONLINE, user->name, user->user->username, GetHost(user)); + } + free_message_tags(mtags); +} + +#define WATCHES(client) (moddata_local_client(client, watchCounterMD).i) +#define WATCH(client) (moddata_local_client(client, watchListMD).ptr) + +CMD_FUNC(cmd_monitor) +{ + char request[BUFSIZE]; + char cmd; + char *s, *p = NULL; + int i; + int toomany = 0; + Link *lp; + + if (!MyUser(client)) + return; + + if (parc < 2 || BadPtr(parv[1])) + cmd = 'l'; + else + cmd = tolower(*parv[1]); + + ModDataInfo *watchCounterMD = findmoddata_byname("watchCount", MODDATATYPE_LOCAL_CLIENT); + ModDataInfo *watchListMD = findmoddata_byname("watchList", MODDATATYPE_LOCAL_CLIENT); + + if (!watchCounterMD || !watchListMD) + { + unreal_log(ULOG_ERROR, "monitor", "WATCH_BACKEND_MISSING", NULL, + "[monitor] moddata unavailable. Is the 'watch-backend' module loaded?"); + sendnotice(client, "MONITOR command is not available at this moment. Please try again later."); + return; + } + + switch(cmd) + { + case 'c': + watch_del_list(client, WATCH_FLAG_TYPE_MONITOR); + break; + case 'l': + lp = WATCH(client); + while (lp) + { + if (!(lp->flags & WATCH_FLAG_TYPE_MONITOR)) + { + lp = lp->next; + continue; /* this one is not ours */ + } + sendnumeric(client, RPL_MONLIST, lp->value.wptr->nick); + lp = lp->next; + } + + sendnumeric(client, RPL_ENDOFMONLIST); + break; + case 's': + lp = WATCH(client); + while (lp) + { + if (!(lp->flags & WATCH_FLAG_TYPE_MONITOR)) + { + lp = lp->next; + continue; /* this one is not ours */ + } + send_status(client, recv_mtags, lp->value.wptr->nick); + lp = lp->next; + } + break; + case '-': + case '+': + if (parc < 3 || BadPtr(parv[2])) + return; + strlcpy(request, parv[2], sizeof(request)); + for (s = strtoken(&p, request, ","); s; s = strtoken(&p, NULL, ",")) + { + if (cmd == '-') { + watch_del(s, client, WATCH_FLAG_TYPE_MONITOR); + } else { + if (WATCHES(client) >= MAXWATCH) + { + sendnumeric(client, ERR_MONLISTFULL, MAXWATCH, s); + continue; + } + if (do_nick_name(s)) + watch_add(s, client, WATCH_FLAG_TYPE_MONITOR); + send_status(client, recv_mtags, s); + } + } + break; + } +} + diff --git a/src/modules/motd.c b/src/modules/motd.c index 0397604..80b22a3 100644 --- a/src/modules/motd.c +++ b/src/modules/motd.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", "command /motd", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -66,10 +66,10 @@ CMD_FUNC(cmd_motd) if (IsServer(client)) return; - if (hunt_server(client, recv_mtags, ":%s MOTD :%s", 1, parc, parv) != HUNTED_ISME) + if (hunt_server(client, recv_mtags, "MOTD", 1, parc, parv) != HUNTED_ISME) { if (MyUser(client)) - client->local->since += 15; + add_fake_lag(client, 15000); return; } @@ -101,7 +101,7 @@ CMD_FUNC(cmd_motd) } motdline = NULL; - if(themotd) + if (themotd) motdline = themotd->lines; while (motdline) { diff --git a/src/modules/names.c b/src/modules/names.c index 405405f..e61bce0 100644 --- a/src/modules/names.c +++ b/src/modules/names.c @@ -24,6 +24,9 @@ CMD_FUNC(cmd_names); +long CAP_MULTI_PREFIX = 0L; +long CAP_USERHOST_IN_NAMES = 0L; + #define MSG_NAMES "NAMES" ModuleHeader MOD_HEADER @@ -32,11 +35,19 @@ ModuleHeader MOD_HEADER "5.0", "command /names", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() { + ClientCapabilityInfo c; + memset(&c, 0, sizeof(c)); + c.name = "multi-prefix"; + ClientCapabilityAdd(modinfo->handle, &c, &CAP_MULTI_PREFIX); + memset(&c, 0, sizeof(c)); + c.name = "userhost-in-names"; + ClientCapabilityAdd(modinfo->handle, &c, &CAP_USERHOST_IN_NAMES); + CommandAdd(modinfo->handle, MSG_NAMES, cmd_names, MAXPARA, CMD_USER|CMD_SERVER); MARK_AS_OFFICIAL_MODULE(modinfo); return MOD_SUCCESS; @@ -66,8 +77,8 @@ static char buf[BUFSIZE]; #define TRUNCATED_NAMES 64 CMD_FUNC(cmd_names) { - int multiprefix = (MyConnect(client) && HasCapability(client, "multi-prefix")); - int uhnames = (MyConnect(client) && HasCapability(client, "userhost-in-names")); // cache UHNAMES support + int multiprefix = (MyConnect(client) && HasCapabilityFast(client, CAP_MULTI_PREFIX)); + int uhnames = (MyConnect(client) && HasCapabilityFast(client, CAP_USERHOST_IN_NAMES)); // cache UHNAMES support int bufLen = NICKLEN + (!uhnames ? 0 : (1 + USERLEN + 1 + HOSTLEN)); int mlen = strlen(me.name) + bufLen + 7; Channel *channel; @@ -75,7 +86,7 @@ CMD_FUNC(cmd_names) int member; Member *cm; int idx, flag = 1, spos; - char *s, *para = parv[1]; + const char *para = parv[1], *s; char nuhBuffer[NICKLEN+USERLEN+HOSTLEN+3]; if (parc < 2 || !MyConnect(client)) @@ -88,16 +99,12 @@ CMD_FUNC(cmd_names) { if (*s == ',') { - if (strlen(para) > TRUNCATED_NAMES) - para[TRUNCATED_NAMES] = '\0'; - sendto_realops("names abuser %s %s", - get_client_name(client, FALSE), para); sendnumeric(client, ERR_TOOMANYTARGETS, s+1, 1, "NAMES"); return; } } - channel = find_channel(para, NULL); + channel = find_channel(para); if (!channel || (!ShowChannel(client, channel) && !ValidatePermissionsForPath("channel:see:names:secret",client,NULL,channel,NULL))) { @@ -108,6 +115,8 @@ CMD_FUNC(cmd_names) /* cache whether this user is a member of this channel or not */ member = IsMember(client, channel); + // FIXME: consider rewriting this whole thing to get rid of pointer juggling and stuff. + if (PubChannel(channel)) buf[0] = '='; else if (SecretChannel(channel)) @@ -117,7 +126,7 @@ CMD_FUNC(cmd_names) idx = 1; buf[idx++] = ' '; - for (s = channel->chname; *s; s++) + for (s = channel->name; *s; s++) buf[idx++] = *s; buf[idx++] = ' '; buf[idx++] = ':'; @@ -140,34 +149,14 @@ CMD_FUNC(cmd_names) if (!multiprefix) { - /* Standard NAMES reply */ -#ifdef PREFIX_AQ - if (cm->flags & CHFL_CHANOWNER) - buf[idx++] = '~'; - else if (cm->flags & CHFL_CHANADMIN) - buf[idx++] = '&'; - else -#endif - if (cm->flags & CHFL_CHANOP) - buf[idx++] = '@'; - else if (cm->flags & CHFL_HALFOP) - buf[idx++] = '%'; - else if (cm->flags & CHFL_VOICE) - buf[idx++] = '+'; + /* Standard NAMES reply (single character) */ + char c = mode_to_prefix(*cm->member_modes); + if (c) + buf[idx++] = c; } else { /* NAMES reply with all rights included (multi-prefix / NAMESX) */ -#ifdef PREFIX_AQ - if (cm->flags & CHFL_CHANOWNER) - buf[idx++] = '~'; - if (cm->flags & CHFL_CHANADMIN) - buf[idx++] = '&'; -#endif - if (cm->flags & CHFL_CHANOP) - buf[idx++] = '@'; - if (cm->flags & CHFL_HALFOP) - buf[idx++] = '%'; - if (cm->flags & CHFL_VOICE) - buf[idx++] = '+'; + strcpy(&buf[idx], modes_to_prefix(cm->member_modes)); + idx += strlen(&buf[idx]); } if (!uhnames) { @@ -187,7 +176,7 @@ CMD_FUNC(cmd_names) buf[idx++] = ' '; buf[idx] = '\0'; flag = 1; - if (mlen + idx + bufLen > BUFSIZE - 7) + if (mlen + idx + bufLen + MEMBERMODESLEN >= BUFSIZE - 1) { sendnumeric(client, RPL_NAMREPLY, buf); idx = spos; diff --git a/src/modules/netinfo.c b/src/modules/netinfo.c index a1fac6b..9cbd17d 100644 --- a/src/modules/netinfo.c +++ b/src/modules/netinfo.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", "command /netinfo", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -61,7 +61,7 @@ MOD_UNLOAD() * parv[1] = max global count * parv[2] = time of end sync * parv[3] = unreal protocol using (numeric) - * parv[4] = cloak-crc (> u2302) + * parv[4] = cloak key check (> u2302) * parv[5] = free(**) * parv[6] = free(**) * parv[7] = free(**) @@ -70,7 +70,6 @@ MOD_UNLOAD() CMD_FUNC(cmd_netinfo) { long lmax; - time_t xx; long endsync, protocol; char buf[512]; @@ -83,7 +82,8 @@ CMD_FUNC(cmd_netinfo) if (IsNetInfo(client)) { - sendto_realops("Already got NETINFO from Link %s", client->name); + unreal_log(ULOG_WARNING, "link", "NETINFO_ALREADY_RECEIVED", client, + "Got NETINFO from server $client, but we already received it earlier!"); return; } @@ -96,46 +96,46 @@ CMD_FUNC(cmd_netinfo) if (lmax > irccounts.global_max) { irccounts.global_max = lmax; - sendto_realops("Max Global Count is now %li (set by link %s)", - lmax, client->name); + unreal_log(ULOG_INFO, "link", "NEW_GLOBAL_RECORD", client, + "Record global users is now $record_global_users (set by server $client)", + log_data_integer("record_global_users", lmax)); } - xx = TStime(); - if ((xx - endsync) < -2) - { - char *emsg = ""; - if (xx - endsync < -10) - { - emsg = " [\002PLEASE SYNC YOUR CLOCKS!\002]"; - } - sendto_umode_global(UMODE_OPER, - "Possible negative TS split at link %s (%lld - %lld = %lld)%s", - client->name, (long long)(xx), (long long)(endsync), (long long)(xx - endsync), emsg); - } - sendto_umode_global(UMODE_OPER, - "Link %s -> %s is now synced [secs: %lld recv: %ld.%hu sent: %ld.%hu]", - client->name, me.name, (long long)(TStime() - endsync), client->local->receiveK, - client->local->receiveB, client->local->sendK, client->local->sendB); + unreal_log(ULOG_INFO, "link", "SERVER_SYNCED", client, + "Link $client -> $me is now synced " + "[secs: $synced_after_seconds, recv: $received_bytes, sent: $sent_bytes]", + log_data_client("me", &me), + log_data_integer("synced_after_seconds", TStime() - endsync), + log_data_integer("received_bytes", client->local->traffic.bytes_received), + log_data_integer("sent_bytes", client->local->traffic.bytes_sent)); - if (!(strcmp(ircnetwork, parv[8]) == 0)) + if (!(strcmp(NETWORK_NAME, parv[8]) == 0)) { - sendto_umode_global(UMODE_OPER, - "Network name mismatch from link %s (%s != %s)", - client->name, parv[8], ircnetwork); + unreal_log(ULOG_WARNING, "link", "NETWORK_NAME_MISMATCH", client, + "Network name mismatch: server $client has '$their_network_name', " + "server $me has '$our_network_name'.", + log_data_client("me", &me), + log_data_string("their_network_name", parv[8]), + log_data_string("our_network_name", NETWORK_NAME)); } if ((protocol != UnrealProtocol) && (protocol != 0)) { - sendto_umode_global(UMODE_OPER, - "Link %s is running Protocol %li while %s is running %d", - client->name, protocol, me.name, UnrealProtocol); + unreal_log(ULOG_INFO, "link", "LINK_PROTOCOL_MISMATCH", client, + "Server $client is running UnrealProtocol $their_link_protocol, " + "server $me uses $our_link_protocol.", + log_data_client("me", &me), + log_data_integer("their_link_protocol", protocol), + log_data_integer("our_link_protocol", UnrealProtocol)); } - strlcpy(buf, CLOAK_KEYCRC, sizeof(buf)); + strlcpy(buf, CLOAK_KEY_CHECKSUM, sizeof(buf)); if (*parv[4] != '*' && strcmp(buf, parv[4])) { - sendto_realops - ("Link %s has a DIFFERENT CLOAK KEY - %s != %s. \002YOU SHOULD CORRECT THIS ASAP\002.", - client->name, parv[4], buf); + unreal_log(ULOG_WARNING, "link", "CLOAK_KEY_MISMATCH", client, + "Server $client has a DIFFERENT CLOAK KEY (OR METHOD)!!! You should fix this ASAP!\n" + "When the cloaking configuration is different on servers, this will cause " + "channel bans on cloaked hosts/IPs not to work correctly, " + "meaning users can bypass channel bans!"); } SetNetInfo(client); } diff --git a/src/modules/nick.c b/src/modules/nick.c index 22f4340..377b375 100644 --- a/src/modules/nick.c +++ b/src/modules/nick.c @@ -28,17 +28,35 @@ ModuleHeader MOD_HEADER "5.0", "command /nick", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; +/* Defines */ + +#define NICKCOL_EQUAL 0 +#define NICKCOL_NEW_WON 1 +#define NICKCOL_EXISTING_WON 2 + +/* Assume that on collision a NICK is in flight and the other server will take + * the exact same decision we would do, and thus we don't send a KILL to cptr? + * This works great with this code, seems to kill the correct person and not + * cause desyncs even without UID/SID. HOWEVER.. who knows what code the other servers run? + * Should use UID/SID anyway, then this whole problem doesn't exist. + */ +#define ASSUME_NICK_IN_FLIGHT + +/* Variables */ +static char buf[BUFSIZE]; +static char spamfilter_user[NICKLEN + USERLEN + HOSTLEN + REALLEN + 64]; + /* Forward declarations */ CMD_FUNC(cmd_nick); CMD_FUNC(cmd_nick_local); CMD_FUNC(cmd_nick_remote); CMD_FUNC(cmd_uid); -int _register_user(Client *client, char *nick, char *username, char *umode, char *virthost, char *ip); -void nick_collision(Client *cptr, char *newnick, char *newid, Client *new, Client *existing, int type); -int AllowClient(Client *client, char *username); +int _register_user(Client *client); +void nick_collision(Client *cptr, const char *newnick, const char *newid, Client *new, Client *existing, int type); +int AllowClient(Client *client); MOD_TEST() { @@ -65,67 +83,52 @@ MOD_UNLOAD() return MOD_SUCCESS; } -static char buf[BUFSIZE]; -static char spamfilter_user[NICKLEN + USERLEN + HOSTLEN + REALLEN + 64]; +/** Hmm.. don't we already have such a function? */ +void set_user_modes_dont_spread(Client *client, const char *umode) +{ + const char *args[4]; -#define NICKCOL_EQUAL 0 -#define NICKCOL_NEW_WON 1 -#define NICKCOL_EXISTING_WON 2 + args[0] = client->name; + args[1] = client->name; + args[2] = umode; + args[3] = NULL; -/* Assume that on collision a NICK is in flight and the other server will take - * the exact same decision we would do, and thus we don't send a KILL to cptr? - * This works great with this code, seems to kill the correct person and not - * cause desyncs even without UID/SID. HOWEVER.. who knows what code the other servers run? - * Should use UID/SID anyway, then this whole problem doesn't exist. - */ -#define ASSUME_NICK_IN_FLIGHT + dontspread = 1; + do_cmd(client, NULL, "MODE", 3, args); + dontspread = 0; +} -/** The NICK command. - * In UnrealIRCd 4/5 this is only used in 2 cases: - * 1) A local user setting or changing the nick name ("NICK xyz") - * 2) A remote user changing their nick name (": NICK ") - */ +/** Remote client (already fully registered) changing their nick */ CMD_FUNC(cmd_nick_remote) { TKL *tklban; int ishold; Client *acptr; char nick[NICKLEN + 2]; + char oldnick[NICKLEN + 1]; time_t lastnick = 0; int differ = 1; unsigned char removemoder = (client->umodes & UMODE_REGNICK) ? 1 : 0; - char *nickid = (IsUser(client) && *client->id) ? client->id : NULL; - Client *cptr = client->direction; /* Pending a complete overhaul... (TODO) */ MessageTag *mtags = NULL; - if ((parc < 2) || BadPtr(parv[1])) - { - sendnumeric(client, ERR_NONICKNAMEGIVEN); - return; - } - - if (!IsUser(client)) - { - /* Old NICK protocol for introducing users, not supported as you should use UID */ - sendto_umode_global(UMODE_OPER, "Old NICK protocol detected from server %s, should use UID instead -- delinking", - client->name); - exit_client(cptr->direction, NULL, "Old NICK protocol detected, bad, use UID!"); - return; - } + /* 'client' is always the fully registered user doing the nick change */ strlcpy(nick, parv[1], NICKLEN + 1); + strlcpy(oldnick, client->name, sizeof(oldnick)); if (parc > 2) lastnick = atol(parv[2]); - if (!do_remote_nick_name(nick)) + if (!do_remote_nick_name(nick) || !strcasecmp("ircd", nick) || !strcasecmp("irc", nick)) { ircstats.is_kill++; - sendto_umode(UMODE_OPER, "Bad Nick: %s From: %s %s", - parv[1], client->name, get_client_name(cptr, FALSE)); + unreal_log(ULOG_ERROR, "nick", "BAD_NICK_REMOTE", client, + "Server link $server tried to introduce bad nick '$nick' -- rejected.", + log_data_string("nick", parv[1]), + log_data_client("server", client->direction)); mtags = NULL; new_message(client, NULL, &mtags); - sendto_one(cptr, mtags, ":%s KILL %s :Illegal nick name", me.id, client->id); + sendto_one(client, mtags, ":%s KILL %s :Illegal nick name", me.id, client->id); SetKilled(client); exit_client(client, mtags, "Illegal nick name"); free_message_tags(mtags); @@ -133,26 +136,16 @@ CMD_FUNC(cmd_nick_remote) return; } - if (!strcasecmp("ircd", nick) || !strcasecmp("irc", nick)) - { - sendto_umode(UMODE_OPER, "Bad Reserved Nick: %s From: %s %s", - parv[1], client->name, get_client_name(cptr, FALSE)); - mtags = NULL; - new_message(client, NULL, &mtags); - sendto_one(cptr, mtags, ":%s KILL %s :Reserved nick name", me.id, client->id); - SetKilled(client); - exit_client(client, mtags, "Reserved nick name"); - free_message_tags(mtags); - mtags = NULL; - return; - } - /* Check Q-lines / ban nick */ if (!IsULine(client) && (tklban = find_qline(client, nick, &ishold)) && !ishold) { - /* Remote user changing nick - warning only */ - sendto_snomask(SNO_QLINE, "Q-Lined nick %s from %s on %s", nick, - client->name, client->srvptr ? client->srvptr->name : ""); + unreal_log(ULOG_INFO, "nick", "QLINE_NICK_REMOTE", client, + "Banned nick $nick [$ip] from server $server ($reason)", + log_data_string("nick", parv[1]), + log_data_string("ip", GetIP(client)), + log_data_client("server", client->uplink), + log_data_string("reason", tklban->ptr.nameban->reason)); + /* Let it through */ } if ((acptr = find_client(nick, NULL))) @@ -178,26 +171,21 @@ CMD_FUNC(cmd_nick_remote) differ = (mycmp(acptr->user->username, client->user->username) || mycmp(acptr->user->realhost, client->user->realhost)); - sendto_umode(UMODE_OPER, "Nick change collision from %s to %s (%s %lld <- %s %lld)", - client->name, acptr->name, acptr->direction->name, - (long long)acptr->lastnick, - client->direction->name, (long long)lastnick); - if (!(parc > 2) || lastnick == acptr->lastnick) { - nick_collision(client, parv[1], nickid, client, acptr, NICKCOL_EQUAL); + nick_collision(client, parv[1], client->id, client, acptr, NICKCOL_EQUAL); return; /* Now that I killed them both, ignore the NICK */ } else if ((differ && (acptr->lastnick > lastnick)) || (!differ && (acptr->lastnick < lastnick))) { - nick_collision(client, parv[1], nickid, client, acptr, NICKCOL_NEW_WON); + nick_collision(client, parv[1], client->id, client, acptr, NICKCOL_NEW_WON); /* fallthrough: their user won, continue and proceed with the nick change */ } else if ((differ && (acptr->lastnick < lastnick)) || (!differ && (acptr->lastnick > lastnick))) { - nick_collision(client, parv[1], nickid, client, acptr, NICKCOL_EXISTING_WON); + nick_collision(client, parv[1], client->id, client, acptr, NICKCOL_EXISTING_WON); return; /* their user lost, ignore the NICK */ } else { @@ -208,53 +196,50 @@ CMD_FUNC(cmd_nick_remote) mtags = NULL; - /* Existing client nick-changing */ - if (!IsULine(client)) - sendto_snomask(SNO_FNICKCHANGE, "*** %s (%s@%s) has changed their nickname to %s", - client->name, client->user->username, client->user->realhost, nick); + { + unreal_log(ULOG_INFO, "nick", "REMOTE_NICK_CHANGE", client, + "Client $client.details has changed their nickname to $new_nick", + log_data_string("new_nick", nick)); + } new_message(client, recv_mtags, &mtags); - RunHook3(HOOKTYPE_REMOTE_NICKCHANGE, client, mtags, nick); + RunHook(HOOKTYPE_REMOTE_NICKCHANGE, client, mtags, nick); client->lastnick = lastnick ? lastnick : TStime(); add_history(client, 1); sendto_server(client, 0, 0, mtags, ":%s NICK %s %lld", client->id, nick, (long long)client->lastnick); sendto_local_common_channels(client, client, 0, mtags, ":%s NICK :%s", client->name, nick); - free_message_tags(mtags); if (removemoder) client->umodes &= ~UMODE_REGNICK; /* Finally set new nick name. */ del_from_client_hash_table(client->name, client); - hash_check_watch(client, RPL_LOGOFF); - - strcpy(client->name, nick); + strlcpy(client->name, nick, sizeof(client->name)); add_to_client_hash_table(nick, client); - hash_check_watch(client, RPL_LOGON); + RunHook(HOOKTYPE_POST_REMOTE_NICKCHANGE, client, mtags, oldnick); + free_message_tags(mtags); } +/* Local user: either setting their nick for the first time (registration) + * or changing their nick (fully registered already, or not) + */ CMD_FUNC(cmd_nick_local) { TKL *tklban; int ishold; Client *acptr; - char nick[NICKLEN + 2], descbuf[BUFSIZE]; + char nick[NICKLEN + 2]; + char oldnick[NICKLEN + 1]; + char descbuf[BUFSIZE]; Membership *mp; - long lastnick = 0l; - int differ = 1, update_watch = 1; + int newuser = 0; unsigned char removemoder = (client->umodes & UMODE_REGNICK) ? 1 : 0; Hook *h; - int i = 0; - char *nickid = (IsUser(client) && *client->id) ? client->id : NULL; - Client *cptr = client->direction; /* Pending a complete overhaul... (TODO) */ + int ret; - if ((parc < 2) || BadPtr(parv[1])) - { - sendnumeric(client, ERR_NONICKNAMEGIVEN); - return; - } + strlcpy(oldnick, client->name, sizeof(oldnick)); /* Enforce minimum nick length */ if (iConf.min_nick_length && !IsOper(client) && !IsULine(client) && strlen(parv[1]) < iConf.min_nick_length) @@ -299,27 +284,21 @@ CMD_FUNC(cmd_nick_local) } if (!ValidatePermissionsForPath("immune:server-ban:ban-nick",client,NULL,NULL,nick)) { - client->local->since += 4; /* lag them up */ + add_fake_lag(client, 4000); /* lag them up */ sendnumeric(client, ERR_ERRONEUSNICKNAME, nick, tklban->ptr.nameban->reason); - sendto_snomask(SNO_QLINE, "Forbidding Q-lined nick %s from %s (%s)", - nick, get_client_name(cptr, FALSE), tklban->ptr.nameban->reason); + unreal_log(ULOG_INFO, "nick", "QLINE_NICK_LOCAL_ATTEMPT", client, + "Attempt to use banned nick $nick [$ip] blocked ($reason)", + log_data_string("nick", parv[1]), + log_data_string("ip", GetIP(client)), + log_data_client("server", client->uplink), + log_data_string("reason", tklban->ptr.nameban->reason)); return; /* NICK message ignored */ } /* fallthrough for ircops that have sufficient privileges */ } - /* set::anti-flood::nick-flood */ - if (client->user && - !ValidatePermissionsForPath("immune:nick-flood",client,NULL,NULL,NULL) && - flood_limit_exceeded(client, FLD_NICK)) - { - /* Throttle... */ - sendnumeric(client, ERR_NCHANGETOOFAST, nick); - return; - } - if (!ValidatePermissionsForPath("immune:nick-flood",client,NULL,NULL,NULL)) - cptr->local->since += 3; /* Nick-flood prot. -Donwulff */ + add_fake_lag(client, 3000); if ((acptr = find_client(nick, NULL))) { @@ -350,9 +329,21 @@ CMD_FUNC(cmd_nick_local) } } + /* set::anti-flood::nick-flood */ + if (client->user && + !ValidatePermissionsForPath("immune:nick-flood",client,NULL,NULL,NULL) && + flood_limit_exceeded(client, FLD_NICK)) + { + /* Throttle... */ + sendnumeric(client, ERR_NCHANGETOOFAST, nick); + return; + } + /* New local client? */ if (!client->name[0]) { + newuser = 1; + if (iConf.ping_cookie) { /* @@ -380,7 +371,7 @@ CMD_FUNC(cmd_nick_local) sendto_one(client, NULL, ":IRC!IRC@%s PRIVMSG %s :\1VERSION\1", me.name, nick); client->lastnick = TStime(); - if (!register_user(client, nick, client->user->username, NULL, NULL, NULL)) + if (!register_user(client)) { if (IsDead(client)) return; @@ -389,7 +380,6 @@ CMD_FUNC(cmd_nick_local) */ } else { /* New user! */ - update_watch = 0; /* already done in register_user() */ strlcpy(nick, client->name, sizeof(nick)); /* don't ask, but I need this. do not remove! -- Syzop */ } } @@ -397,6 +387,7 @@ CMD_FUNC(cmd_nick_local) if (MyUser(client)) { MessageTag *mtags = NULL; + int ret; /* Existing client nick-changing */ @@ -409,38 +400,40 @@ CMD_FUNC(cmd_nick_local) */ for (mp = client->user->channel; mp; mp = mp->next) { - if (!is_skochanop(client, mp->channel) && is_banned(client, mp->channel, BANCHK_NICK, NULL, NULL)) + int ret = HOOK_CONTINUE; + Hook *h; + if (!check_channel_access(client, mp->channel, "hoaq") && is_banned(client, mp->channel, BANCHK_NICK, NULL, NULL)) { sendnumeric(client, ERR_BANNICKCHANGE, - mp->channel->chname); + mp->channel->name); return; } - if (CHECK_TARGET_NICK_BANS && !is_skochanop(client, mp->channel) && is_banned_with_nick(client, mp->channel, BANCHK_NICK, nick, NULL, NULL)) + if (CHECK_TARGET_NICK_BANS && !check_channel_access(client, mp->channel, "hoaq") && is_banned_with_nick(client, mp->channel, BANCHK_NICK, nick, NULL, NULL)) { - sendnumeric(client, ERR_BANNICKCHANGE, mp->channel->chname); + sendnumeric(client, ERR_BANNICKCHANGE, mp->channel->name); return; } for (h = Hooks[HOOKTYPE_CHAN_PERMIT_NICK_CHANGE]; h; h = h->next) { - i = (*(h->func.intfunc))(client,mp->channel); - if (i != HOOK_CONTINUE) + ret = (*(h->func.intfunc))(client,mp->channel); + if (ret != HOOK_CONTINUE) break; } - if (i == HOOK_DENY) + if (ret == HOOK_DENY) { - sendnumeric(client, ERR_NONICKCHANGE, - mp->channel->chname); + sendnumeric(client, ERR_NONICKCHANGE, mp->channel->name); return; } } - sendto_snomask(SNO_NICKCHANGE, "*** %s (%s@%s) has changed their nickname to %s", - client->name, client->user->username, client->user->realhost, nick); + unreal_log(ULOG_INFO, "nick", "LOCAL_NICK_CHANGE", client, + "Client $client.details has changed their nickname to $new_nick", + log_data_string("new_nick", nick)); new_message(client, recv_mtags, &mtags); - RunHook3(HOOKTYPE_LOCAL_NICKCHANGE, client, mtags, nick); + RunHook(HOOKTYPE_LOCAL_NICKCHANGE, client, mtags, nick); client->lastnick = TStime(); add_history(client, 1); sendto_server(client, 0, 0, mtags, ":%s NICK %s %lld", @@ -456,8 +449,6 @@ CMD_FUNC(cmd_nick_local) } del_from_client_hash_table(client->name, client); - if (update_watch && IsUser(client)) - hash_check_watch(client, RPL_LOGOFF); strlcpy(client->name, nick, sizeof(client->name)); add_to_client_hash_table(nick, client); @@ -466,11 +457,11 @@ CMD_FUNC(cmd_nick_local) snprintf(descbuf, sizeof(descbuf), "Client: %s", nick); fd_desc(client->local->fd, descbuf); - if (update_watch && IsUser(client)) - hash_check_watch(client, RPL_LOGON); - if (removemoder && MyUser(client)) sendto_one(client, NULL, ":%s MODE %s :-r", me.name, client->name); + + if (MyUser(client) && !newuser) + RunHook(HOOKTYPE_POST_LOCAL_NICKCHANGE, client, recv_mtags, oldnick); } /* @@ -481,7 +472,7 @@ CMD_FUNC(cmd_nick_local) ** parv[4] = username ** parv[5] = hostname ** parv[6] = UID -** parv[7] = servicestamp +** parv[7] = account name (SVID) ** parv[8] = umodes ** parv[9] = virthost, * if none ** parv[10] = cloaked host, * if none @@ -498,9 +489,10 @@ CMD_FUNC(cmd_uid) Client *acptr, *serv = NULL; Client *acptrs; char nick[NICKLEN + 1]; - long lastnick = 0l; + long lastnick = 0; int differ = 1; - char *hostname, *username, *sstamp, *umodes, *virthost, *ip, *realname; + const char *hostname, *username, *sstamp, *umodes, *virthost, *ip_raw, *realname; + const char *ip = NULL; if (parc < 13) { @@ -518,65 +510,103 @@ CMD_FUNC(cmd_uid) } strlcpy(nick, parv[1], sizeof(nick)); + hostname = parv[5]; + sstamp = parv[7]; + username = parv[4]; + umodes = parv[8]; + virthost = parv[9]; + ip_raw = parv[11]; + realname = parv[12]; /* Do some *MINIMAL* nick name checking for remote nicknames. * This will only catch things that severely break things. -- Syzop */ - if (!do_remote_nick_name(nick)) + if (!do_remote_nick_name(nick) || !strcasecmp("ircd", nick) || !strcasecmp("irc", nick)) { - sendnumeric(client, ERR_ERRONEUSNICKNAME, parv[1], "Illegal characters"); + unreal_log(ULOG_ERROR, "nick", "BAD_NICK_REMOTE", client->uplink, + "Server link $client tried to introduce bad nick '$nick' -- rejected.", + log_data_string("nick", parv[1])); + sendnumeric(client, ERR_ERRONEUSNICKNAME, parv[1], "Illegal nick name"); ircstats.is_kill++; - sendto_umode(UMODE_OPER, "Bad Nick: %s From: %s %s", - parv[1], client->name, get_client_name(client, FALSE)); /* Send kill to uplink only, hasn't been broadcasted to the rest, anyway */ sendto_one(client, NULL, ":%s KILL %s :Bad nick", me.id, parv[1]); return; } + if (!valid_uid(parv[6]) || strncmp(parv[6], client->id, 3)) + { + ircstats.is_kill++; + unreal_log(ULOG_ERROR, "link", "BAD_UID", client, + "Server link $client ($sid) used bad UID $uid in UID command.", + log_data_string("sid", client->id), + log_data_string("uid", parv[6])); + /* Send kill to uplink only, hasn't been broadcasted to the rest, anyway */ + sendto_one(client, NULL, ":%s KILL %s :Bad UID", me.id, parv[6]); + return; + } + + if (!valid_host(hostname, 0)) + { + ircstats.is_kill++; + unreal_log(ULOG_ERROR, "link", "BAD_HOSTNAME", client, + "Server link $client ($client.id) introduced user $nick with bad host name: $bad_hostname.", + log_data_string("nick", nick), + log_data_string("bad_hostname", hostname)); + /* Send kill to uplink only, hasn't been broadcasted to the rest, anyway */ + sendto_one(client, NULL, ":%s KILL %s :Bad hostname", me.id, parv[6]); + return; + } + + if (strcmp(virthost, "*") && !valid_host(virthost, 0)) + { + ircstats.is_kill++; + unreal_log(ULOG_ERROR, "link", "BAD_HOSTNAME", client, + "Server link $client ($client.id) introduced user $nick with bad virtual hostname: $bad_hostname.", + log_data_string("nick", nick), + log_data_string("bad_hostname", virthost)); + /* Send kill to uplink only, hasn't been broadcasted to the rest, anyway */ + sendto_one(client, NULL, ":%s KILL %s :Bad virtual host", me.id, parv[6]); + return; + } + + if (strcmp(ip_raw, "*")) + { + if (!(ip = decode_ip(ip_raw))) + { + ircstats.is_kill++; + unreal_log(ULOG_ERROR, "link", "BAD_IP", client, + "Server link $client ($client.id) introduced user $nick with bad IP: $bad_ip.", + log_data_string("nick", nick), + log_data_string("bad_ip", ip_raw)); + /* Send kill to uplink only, hasn't been broadcasted to the rest, anyway */ + sendto_one(client, NULL, ":%s KILL %s :Bad IP in UID command", me.id, parv[6]); + return; + } + } + /* Kill quarantined opers early... */ if (IsQuarantined(client->direction) && strchr(parv[8], 'o')) { ircstats.is_kill++; /* Send kill to uplink only, hasn't been broadcasted to the rest, anyway */ - sendto_one(client, NULL, ":%s KILL %s :Quarantined: no oper privileges allowed", - me.id, parv[1]); - sendto_umode_global(UMODE_OPER, "QUARANTINE: Oper %s on server %s killed, due to quarantine", - parv[1], client->name); - return; - } - - /* This one is never allowed, even from remotes */ - if (!strcasecmp("ircd", nick) || !strcasecmp("irc", nick)) - { - sendnumeric(client, ERR_ERRONEUSNICKNAME, nick, "Reserved for internal IRCd purposes"); - sendto_one(client, NULL, ":%s KILL %s :Bad reserved nick", me.id, parv[1]); + unreal_log(ULOG_INFO, "link", "OPER_KILLED_QUARANTINE", NULL, + "QUARANTINE: Oper $nick on server $server killed, due to quarantine", + log_data_string("nick", parv[1]), + log_data_client("server", client)); + sendto_one(client, NULL, ":%s KILL %s :Quarantined: no oper privileges allowed", me.id, parv[6]); return; } if (!IsULine(client) && (tklban = find_qline(client, nick, &ishold))) { - if (IsServer(client) && !ishold) /* server introducing new client */ - { - acptrs = find_server(client->user == NULL ? parv[6] : client->user->server, NULL); - /* (NEW: no unregistered Q-Line msgs anymore during linking) */ - if (!acptrs || (acptrs->serv && acptrs->serv->flags.synced)) - sendto_snomask(SNO_QLINE, "Q-Lined nick %s from %s on %s", nick, - (*client->name != 0 - && !IsServer(client) ? client->name : ""), - acptrs ? acptrs->name : "unknown server"); - } - } - - /* Now check if 'nick' already exists - first, collisions with server names/ids (extremely rare) */ - if ((acptr = find_server(nick, NULL)) != NULL) - { - sendto_umode(UMODE_OPER, "Nick collision on %s(%s <- %s)", - client->name, acptr->direction->name, - get_client_name(client, FALSE)); - ircstats.is_kill++; - sendto_one(client, NULL, ":%s KILL %s :Nick-server-collision", me.id, parv[1]); - return; + unreal_log(ULOG_INFO, "nick", "QLINE_NICK_REMOTE", client, + "Banned nick $nick [$nick.ip] from server $server ($reason)", + log_data_string("nick", parv[1]), + log_data_string("ip", ip), + log_data_client("server", client->uplink), + log_data_string("reason", tklban->ptr.nameban->reason)); + /* Let it through */ } /* Now check if 'nick' already exists - collision with a user (or still in handshake, unknown) */ @@ -594,22 +624,7 @@ CMD_FUNC(cmd_uid) lastnick = atol(parv[3]); differ = (mycmp(acptr->user->username, parv[4]) || mycmp(acptr->user->realhost, parv[5])); - sendto_umode(UMODE_OPER, "Nick collision on %s (%s %lld <- %s %lld)", - acptr->name, acptr->direction->name, (long long)acptr->lastnick, - client->direction->name, (long long)lastnick); - /* - ** I'm putting the KILL handling here just to make it easier - ** to read, it's hard to follow it the way it used to be. - ** Basically, this is what it will do. It will kill both - ** users if no timestamp is given, or they are equal. It will - ** kill the user on our side if the other server is "correct" - ** (user@host differ and their user is older, or user@host are - ** the same and their user is younger), otherwise just kill the - ** user an reintroduce our correct user. - ** The old code just sat there and "hoped" the other server - ** would kill their user. Not anymore. - ** -- binary - */ + if (acptr->lastnick == lastnick) { nick_collision(client, parv[1], parv[6], NULL, acptr, NICKCOL_EQUAL); @@ -647,29 +662,49 @@ nickkill2done: make_user(client); - hostname = parv[5]; - sstamp = parv[7]; - username = parv[4]; - umodes = parv[8]; - virthost = parv[9]; - ip = parv[11]; - realname = parv[12]; /* Note that cloaked host aka parv[10] is unused */ - client->user->server = find_or_add(client->srvptr->name); + client->user->server = find_or_add(client->uplink->name); strlcpy(client->user->realhost, hostname, sizeof(client->user->realhost)); - // FIXME: some validation would be nice ^ + if (ip) + safe_strdup(client->ip, ip); if (*sstamp != '*') - strlcpy(client->user->svid, sstamp, sizeof(client->user->svid)); + strlcpy(client->user->account, sstamp, sizeof(client->user->account)); strlcpy(client->info, realname, sizeof(client->info)); strlcpy(client->user->username, username, USERLEN + 1); - register_user(client, client->name, username, umodes, virthost, ip); - if (IsDead(client)) - return; + SetUser(client); - if (client->user->svid[0] != '0') + make_cloakedhost(client, client->user->realhost, client->user->cloakedhost, sizeof(client->user->cloakedhost)); + safe_strdup(client->user->virthost, client->user->cloakedhost); + + /* Inherit flags from server, makes it easy in the send routines + * and this also makes clients inherit ulines. + */ + client->flags |= client->uplink->flags; + + /* Update counts */ + irccounts.clients++; + if (client->uplink->server) + client->uplink->server->users++; + if (client->umodes & UMODE_INVISIBLE) + irccounts.invisible++; + + /* Set user modes */ + set_user_modes_dont_spread(client, umodes); + + /* Set the vhost */ + if (*virthost != '*') + safe_strdup(client->user->virthost, virthost); + + build_umode_string(client, 0, SEND_UMODES|UMODE_SERVNOTICE, buf); + + sendto_serv_butone_nickcmd(client->direction, recv_mtags, client, (*buf == '\0' ? "+" : buf)); + + moddata_extract_s2s_mtags(client, recv_mtags); + + if (IsLoggedIn(client)) { user_account_login(recv_mtags, client); /* no need to check for kill upon user_account_login() here @@ -680,510 +715,430 @@ nickkill2done: RunHook(HOOKTYPE_REMOTE_CONNECT, client); if (!IsULine(serv) && IsSynched(serv)) - sendto_fconnectnotice(client, 0, NULL); + { + unreal_log(ULOG_INFO, "connect", "REMOTE_CLIENT_CONNECT", client, + "Client connecting: $client ($client.user.username@$client.hostname) [$client.ip] $extended_client_info", + log_data_string("extended_client_info", get_connect_extinfo(client)), + log_data_string("from_server_name", client->user->server)); + } } /** The NICK command. - * In UnrealIRCd 4/5 this is only used in 2 cases: + * In UnrealIRCd 4 and later this should only happen for: * 1) A local user setting or changing the nick name ("NICK xyz") + * -> cmd_nick_local() * 2) A remote user changing their nick name (": NICK ") + * -> cmd_nick_remote() */ CMD_FUNC(cmd_nick) { + if ((parc < 2) || BadPtr(parv[1])) + { + sendnumeric(client, ERR_NONICKNAMEGIVEN); + return; + } + if (MyConnect(client) && !IsServer(client)) + { cmd_nick_local(client, recv_mtags, parc, parv); - else + } else + if (!IsUser(client)) + { + unreal_log(ULOG_ERROR, "link", "LINK_OLD_PROTOCOL_NICK", client->direction, + "Server link $client tried to introduce $nick using NICK command. " + "Server is using an old and unsupported protocol from UnrealIRCd 3.2.x or earlier, should use the UID command. " + "See https://www.unrealircd.org/docs/FAQ#old-server-protocol", + log_data_string("nick", parv[1])); + /* Split the entire uplink, as it should never have allowed this (and probably they are to blame too) */ + exit_client(client->direction, NULL, "Server used NICK command, bad, must use UID!"); + return; + } else + { cmd_nick_remote(client, recv_mtags, parc, parv); + } } -/** Register the connection as a User. +void welcome_user(Client *client, TKL *viruschan_tkl) +{ + int i; + ConfigItem_tld *tlds; + + RunHook(HOOKTYPE_WELCOME, client, 0); + sendnumeric(client, RPL_WELCOME, NETWORK_NAME, client->name, client->user->username, client->user->realhost); + + RunHook(HOOKTYPE_WELCOME, client, 1); + sendnumeric(client, RPL_YOURHOST, me.name, version); + + RunHook(HOOKTYPE_WELCOME, client, 2); + sendnumeric(client, RPL_CREATED, creation); + + RunHook(HOOKTYPE_WELCOME, client, 3); + sendnumeric(client, RPL_MYINFO, me.name, version, umodestring, cmodestring); + + RunHook(HOOKTYPE_WELCOME, client, 4); + for (i = 0; ISupportStrings[i]; i++) + sendnumeric(client, RPL_ISUPPORT, ISupportStrings[i]); + + RunHook(HOOKTYPE_WELCOME, client, 5); + + if (IsHidden(client)) + { + sendnumeric(client, RPL_HOSTHIDDEN, client->user->virthost); + RunHook(HOOKTYPE_WELCOME, client, 396); + } + + if (IsSecureConnect(client)) + { + if (client->local->ssl && !iConf.no_connect_tls_info) + { + sendnotice(client, "*** You are connected to %s with %s", + me.name, tls_get_cipher(client)); + } + } + + { + const char *parv[2]; + parv[0] = NULL; + parv[1] = NULL; + do_cmd(client, NULL, "LUSERS", 1, parv); + if (IsDead(client)) + return; + } + + RunHook(HOOKTYPE_WELCOME, client, 266); + + short_motd(client); + + RunHook(HOOKTYPE_WELCOME, client, 376); + +#ifdef EXPERIMENTAL + sendnotice(client, + "*** \2NOTE:\2 This server is running experimental IRC server software (UnrealIRCd %s). " + "If you find any bugs or problems, please report them at https://bugs.unrealircd.org/", + VERSIONONLY); +#endif + + if (client->umodes & UMODE_INVISIBLE) + irccounts.invisible++; + + build_umode_string(client, 0, SEND_UMODES|UMODE_SERVNOTICE, buf); + + sendto_serv_butone_nickcmd(client->direction, NULL, client, (*buf == '\0' ? "+" : buf)); + + broadcast_moddata_client(client); + RunHook(HOOKTYPE_LOCAL_CONNECT, client); + if (buf[0] != '\0' && buf[1] != '\0') + sendto_one(client, NULL, ":%s MODE %s :%s", client->name, + client->name, buf); + if (client->user->snomask) + sendnumeric(client, RPL_SNOMASK, client->user->snomask); + + if (!IsSecure(client) && !IsLocalhost(client) && (iConf.plaintext_policy_user == POLICY_WARN)) + sendnotice_multiline(client, iConf.plaintext_policy_user_message); + + if (IsSecure(client) && (iConf.outdated_tls_policy_user == POLICY_WARN) && outdated_tls_client(client)) + sendnotice(client, "%s", outdated_tls_client_build_string(iConf.outdated_tls_policy_user_message, client)); + + /* Make creation time the real 'online since' time, excluding registration time. + * Otherwise things like set::anti-spam-quit-messagetime 10s could mean + * 1 second in practice (#2174). + */ + client->local->creationtime = TStime(); + client->local->idle_since = TStime(); + + /* Give the user a fresh start as far as fake-lag is concerned. + * Otherwise the user could be lagged up already due to all the CAP stuff. + */ + client->local->fake_lag = TStime(); + + RunHook(HOOKTYPE_WELCOME, client, 999); + + /* NOTE: Code after this 'if (viruschan_tkl)' will not be executed for quarantined- + * virus-users. So be carefull with the order. -- Syzop + */ + // FIXME: verify if this works, trace code path upstream!!!! + if (viruschan_tkl) + { + join_viruschan(client, viruschan_tkl, SPAMF_USER); + return; + } + + /* Force the user to join the given chans -- codemastr */ + tlds = find_tld(client); + + if (tlds && !BadPtr(tlds->channel)) + { + char *chans = strdup(tlds->channel); + const char *args[3] = { + NULL, + chans, + NULL + }; + do_cmd(client, NULL, "JOIN", 3, args); + safe_free(chans); + if (IsDead(client)) + return; + } + else if (!BadPtr(AUTO_JOIN_CHANS) && strcmp(AUTO_JOIN_CHANS, "0")) + { + char *chans = strdup(AUTO_JOIN_CHANS); + const char *args[3] = { + NULL, + chans, + NULL + }; + do_cmd(client, NULL, "JOIN", 3, args); + safe_free(chans); + if (IsDead(client)) + return; + } +} + +/** Validate client->user->username. + * @param client The client to check + * @param noident Whether we should ignore the first ~ or not + * @returns 1 if the username is acceptable, 0 if not. + * @note This function will modify client->user->username to make it valid. + * Only if there are zero valid characters it will return 0. + */ +int valid_username(Client *client, int noident) +{ + static char stripuser[USERLEN + 1]; + char *i; + char *o = stripuser; + char filtered = 0; /* any changes? */ + + *stripuser = '\0'; + + for (i = client->user->username + noident; *i; i++) + { + if (isallowed(*i)) + *o++ = *i; + else + filtered = 1; + } + *o = '\0'; + + if (filtered == 0) + return 1; /* No change needed, all good */ + + if (*stripuser == '\0') + return 0; /* Zero valid characters, reject it */ + + strlcpy(client->user->username + 1, stripuser, sizeof(client->user->username)-1); + client->user->username[0] = '~'; + client->user->username[USERLEN] = '\0'; + return 1; /* Filtered, but OK */ +} + +/** Register the connection as a User - only for local connections! * This is called after NICK + USER (in no particular order) * and possibly other protocol messages as well (eg CAP). - * @param client Client to be made a user. - * @param nick Nick name - * @param username Username - * @param umode User modes - * @param virthost Virtual host (can be NULL) - * @param ip IP address string (can be NULL) + * @param client Client to be made a user. * @returns 1 if successfully registered, 0 if not (client might be killed). */ -int _register_user(Client *client, char *nick, char *username, char *umode, char *virthost, char *ip) +int _register_user(Client *client) { ConfigItem_ban *bconf; char *tmpstr; - char stripuser[USERLEN + 1], *u1 = stripuser, *u2, olduser[USERLEN + 1], - userbad[USERLEN * 2 + 1], *ubad = userbad, noident = 0; - int i, xx; + char noident = 0; + int i; Hook *h; - User *user = client->user; - char *tkllayer[9] = { - me.name, /*0 server.name */ - "+", /*1 +|- */ - "z", /*2 G */ - "*", /*3 user */ - NULL, /*4 host */ - NULL, - NULL, /*6 expire_at */ - NULL, /*7 set_at */ - NULL /*8 reason */ - }; TKL *savetkl = NULL; - ConfigItem_tld *tlds; + char temp[USERLEN + 1]; + char descbuf[BUFSIZE]; - nick = client->name; /* <- The data is always the same, but the pointer is sometimes not, - * I need this for one of my modules, so do not remove! ;) -- Syzop */ + if (!MyConnect(client)) + abort(); - if (MyConnect(client)) + /* Set client->local->sockhost: + * First deal with the special 'localhost' case and + * then with generic setting based on DNS. + */ + if (!strcmp(GetIP(client), "127.0.0.1") || + !strcmp(GetIP(client), "0:0:0:0:0:0:0:1") || + !strcmp(GetIP(client), "0:0:0:0:0:ffff:127.0.0.1")) { - char temp[USERLEN + 1]; - - if (!AllowClient(client, username)) - { - ircstats.is_ref++; - /* For safety, we have an extra kill here */ - if (!IsDead(client)) - exit_client(client, NULL, "Rejected"); - return 0; - } - + set_sockhost(client, "localhost"); if (client->local->hostp) { - /* reject ASCII < 32 and ASCII >= 127 (note: upper resolver might be even more strict). */ - for (tmpstr = client->local->sockhost; *tmpstr > ' ' && *tmpstr < 127; tmpstr++); + unreal_free_hostent(client->local->hostp); + client->local->hostp = NULL; + } + } else + { + struct hostent *hp = client->local->hostp; + if (hp && hp->h_name) + set_sockhost(client, hp->h_name); + } - /* if host contained invalid ASCII _OR_ the DNS reply is an IP-like reply - * (like: 1.2.3.4 or ::ffff:1.2.3.4), then reject it and use IP instead. + /* Set the hostname (client->user->realhost). + * This may later be overwritten by the AllowClient() call to + * revert to the IP again if allow::options::useip is set. + */ + strlcpy(client->user->realhost, client->local->sockhost, sizeof(client->local->sockhost)); + + /* Check allow { } blocks... */ + if (!AllowClient(client)) + { + ircstats.is_ref++; + /* For safety, we have an extra kill here */ + if (!IsDead(client)) + exit_client(client, NULL, "Rejected"); + return 0; + } + + if (IsUseIdent(client)) + { + if (IsIdentSuccess(client)) + { + /* ident succeeded: overwite client->user->username with the ident reply */ + strlcpy(client->user->username, client->ident, sizeof(client->user->username)); + } else + if (IDENT_CHECK) + { + /* ident check is enabled and it failed: prefix the username with ~ */ + char temp[USERLEN+1]; + strlcpy(temp, client->user->username, sizeof(temp)); + snprintf(client->user->username, sizeof(client->user->username), "~%s", temp); + noident = 1; + } + } + + /* Now validate the username. This may alter client->user->username + * or reject it completely. + */ + if (!valid_username(client, noident)) + { + exit_client(client, NULL, "Hostile username. Please use only 0-9 a-z A-Z _ - and . in your username."); + return 0; + } + + /* Check ban realname { } blocks */ + if ((bconf = find_ban(NULL, client->info, CONF_BAN_REALNAME))) + { + ircstats.is_ref++; + banned_client(client, "realname", bconf->reason?bconf->reason:"", 0, 0); + return 0; + } + /* Check G/Z lines before shuns -- kill before quite -- codemastr */ + if (find_tkline_match(client, 0)) + { + if (!IsDead(client) && client->local->class) + { + /* Fix client count bug, in case that it was a hold such as via authprompt */ + client->local->class->clients--; + client->local->class = NULL; + } + ircstats.is_ref++; + return 0; + } + find_shun(client); + + spamfilter_build_user_string(spamfilter_user, client->name, client); + if (match_spamfilter(client, spamfilter_user, SPAMF_USER, NULL, NULL, 0, &savetkl)) + { + if (savetkl && ((savetkl->ptr.spamfilter->action == BAN_ACT_VIRUSCHAN) || + (savetkl->ptr.spamfilter->action == BAN_ACT_SOFT_VIRUSCHAN))) + { + /* 'viruschan' action: + * Continue with registering the client, and at the end + * of this function we will do the actual joining to the + * virus channel. */ - if (*tmpstr || !*user->realhost || (isdigit(*client->local->sockhost) && (client->local->sockhost > tmpstr && isdigit(*(tmpstr - 1))) ) - || (client->local->sockhost[0] == ':')) - strlcpy(client->local->sockhost, client->ip, sizeof(client->local->sockhost)); - } - if (client->local->sockhost[0]) - { - strlcpy(user->realhost, client->local->sockhost, sizeof(client->local->sockhost)); /* SET HOSTNAME */ } else { - sendto_realops("[HOSTNAME BUG] client->local->sockhost is empty for user %s (%s, %s)", - client->name, client->ip ? client->ip : "", user->realhost); - ircd_log(LOG_ERROR, "[HOSTNAME BUG] client->local->sockhost is empty for user %s (%s, %s)", - client->name, client->ip ? client->ip : "", user->realhost); - } - - /* - * I do not consider *, ~ or ! 'hostile' in usernames, - * as it is easy to differentiate them (Use \*, \? and \\) - * with the possible? - * exception of !. With mIRC etc. ident is easy to fake - * to contain @ though, so if that is found use non-ident - * username. -Donwulff - * - * I do, We only allow a-z A-Z 0-9 _ - and . now so the - * !strchr(client->ident, '@') check is out of date. -Cabal95 - * - * Moved the noident stuff here. -OnyxDragon - */ - - /* because username may point to user->username */ - strlcpy(temp, username, USERLEN + 1); - - if (!IsUseIdent(client)) - strlcpy(user->username, temp, USERLEN + 1); - else if (IsIdentSuccess(client)) - strlcpy(user->username, client->ident, USERLEN+1); - else - { - if (IDENT_CHECK == 0) { - strlcpy(user->username, temp, USERLEN+1); - } - else { - *user->username = '~'; - strlcpy((user->username + 1), temp, sizeof(user->username)-1); - noident = 1; - } - - } - /* - * Limit usernames to just 0-9 a-z A-Z _ - and . - * It strips the "bad" chars out, and if nothing is left - * changes the username to the first 8 characters of their - * nickname. After the MOTD is displayed it sends numeric - * 455 to the user telling them what(if anything) happened. - * -Cabal95 - * - * Moved the noident thing to the right place - see above - * -OnyxDragon - * - * No longer use nickname if the entire ident is invalid, - * if thats the case, it is likely the user is trying to cause - * problems so just ban them. (Using the nick could introduce - * hostile chars) -- codemastr - */ - for (u2 = user->username + noident; *u2; u2++) - { - if (isallowed(*u2)) - *u1++ = *u2; - else if (*u2 < 32) - { - /* - * Make sure they can read what control - * characters were in their username. - */ - *ubad++ = '^'; - *ubad++ = *u2 + '@'; - } - else - *ubad++ = *u2; - } - *u1 = '\0'; - *ubad = '\0'; - if (strlen(stripuser) != strlen(user->username + noident)) - { - if (stripuser[0] == '\0') - { - exit_client(client, NULL, "Hostile username. Please use only 0-9 a-z A-Z _ - and . in your username."); - return 0; - } - - strlcpy(olduser, user->username + noident, USERLEN+1); - strlcpy(user->username + 1, stripuser, sizeof(user->username)-1); - user->username[0] = '~'; - user->username[USERLEN] = '\0'; - } - else - u1 = NULL; - - /* Check ban realname { } blocks */ - if ((bconf = find_ban(NULL, client->info, CONF_BAN_REALNAME))) - { - ircstats.is_ref++; - banned_client(client, "realname", bconf->reason?bconf->reason:"", 0, 0); + /* Client is either dead or blocked (will hang, on purpose, and timeout) */ return 0; } - /* Check G/Z lines before shuns -- kill before quite -- codemastr */ - if (find_tkline_match(client, 0)) + } + + for (h = Hooks[HOOKTYPE_PRE_LOCAL_CONNECT]; h; h = h->next) + { + int ret = (*(h->func.intfunc))(client); + if (ret == HOOK_DENY) { if (!IsDead(client) && client->local->class) { - /* Fix client count bug, in case that it was a hold such as via authprompt */ + /* Fix client count bug, in case that + * the HOOK_DENY was only meant temporarily. + */ client->local->class->clients--; client->local->class = NULL; } - ircstats.is_ref++; return 0; } - find_shun(client); - - spamfilter_build_user_string(spamfilter_user, client->name, client); - if (match_spamfilter(client, spamfilter_user, SPAMF_USER, NULL, NULL, 0, &savetkl)) - { - if (savetkl && ((savetkl->ptr.spamfilter->action == BAN_ACT_VIRUSCHAN) || - (savetkl->ptr.spamfilter->action == BAN_ACT_SOFT_VIRUSCHAN))) - { - /* 'viruschan' action: - * Continue with registering the client, and at the end - * of this function we will do the actual joining to the - * virus channel. - */ - } else { - /* Client is either dead or blocked (will hang, on purpose, and timeout) */ - return 0; - } - } - - for (h = Hooks[HOOKTYPE_PRE_LOCAL_CONNECT]; h; h = h->next) - { - i = (*(h->func.intfunc))(client); - if (i == HOOK_DENY) - { - if (!IsDead(client) && client->local->class) - { - /* Fix client count bug, in case that - * the HOOK_DENY was only meant temporarily. - */ - client->local->class->clients--; - client->local->class = NULL; - } - return 0; - } - if (i == HOOK_ALLOW) - break; - } - } - else - { - strlcpy(user->username, username, USERLEN+1); + if (ret == HOOK_ALLOW) + break; } + SetUser(client); + + make_cloakedhost(client, client->user->realhost, client->user->cloakedhost, sizeof(client->user->cloakedhost)); + safe_strdup(client->user->virthost, client->user->cloakedhost); + + snprintf(descbuf, sizeof descbuf, "Client: %s", client->name); + fd_desc(client->local->fd, descbuf); + + /* Move user from unknown list to client list */ + list_move(&client->lclient_node, &lclient_list); + + /* Update counts */ + irccounts.unknown--; irccounts.clients++; - if (client->srvptr && client->srvptr->serv) - client->srvptr->serv->users++; + irccounts.me_clients++; + if (client->uplink && client->uplink->server) + client->uplink->server->users++; - make_cloakedhost(client, user->realhost, user->cloakedhost, sizeof(user->cloakedhost)); - safe_strdup(user->virthost, user->cloakedhost); - - if (MyConnect(client)) + if (IsSecure(client)) { - char descbuf[BUFSIZE]; - int i; - - snprintf(descbuf, sizeof descbuf, "Client: %s", nick); - fd_desc(client->local->fd, descbuf); - - list_move(&client->lclient_node, &lclient_list); - - irccounts.unknown--; - irccounts.me_clients++; - - if (IsSecure(client)) - { - client->umodes |= UMODE_SECURE; - RunHook(HOOKTYPE_SECURE_CONNECT, client); - } - - if (IsHidden(client)) - { - ircd_log(LOG_CLIENT, "Connect - %s!%s@%s [%s] [vhost: %s] %s", - nick, user->username, user->realhost, GetIP(client), user->virthost, get_connect_extinfo(client)); - } else - { - ircd_log(LOG_CLIENT, "Connect - %s!%s@%s [%s] %s", - nick, user->username, user->realhost, GetIP(client), get_connect_extinfo(client)); - } - - RunHook2(HOOKTYPE_WELCOME, client, 0); - sendnumeric(client, RPL_WELCOME, ircnetwork, nick, user->username, user->realhost); - - RunHook2(HOOKTYPE_WELCOME, client, 1); - sendnumeric(client, RPL_YOURHOST, me.name, version); - - RunHook2(HOOKTYPE_WELCOME, client, 2); - sendnumeric(client, RPL_CREATED, creation); - - RunHook2(HOOKTYPE_WELCOME, client, 3); - sendnumeric(client, RPL_MYINFO, me.name, version, umodestring, cmodestring); - - RunHook2(HOOKTYPE_WELCOME, client, 4); - for (i = 0; ISupportStrings[i]; i++) - sendnumeric(client, RPL_ISUPPORT, ISupportStrings[i]); - - RunHook2(HOOKTYPE_WELCOME, client, 5); - - if (IsHidden(client)) - { - sendnumeric(client, RPL_HOSTHIDDEN, user->virthost); - RunHook2(HOOKTYPE_WELCOME, client, 396); - } - - if (IsSecureConnect(client)) - { - if (client->local->ssl && !iConf.no_connect_tls_info) - { - sendnotice(client, "*** You are connected to %s with %s", - me.name, tls_get_cipher(client->local->ssl)); - } - } - - { - char *parv[2]; - parv[0] = client->name; - parv[1] = NULL; - do_cmd(client, NULL, "LUSERS", 1, parv); - if (IsDead(client)) - return 0; - } - - RunHook2(HOOKTYPE_WELCOME, client, 266); - - short_motd(client); - - RunHook2(HOOKTYPE_WELCOME, client, 376); - -#ifdef EXPERIMENTAL - sendnotice(client, - "*** \2NOTE:\2 This server is running experimental IRC server software (UnrealIRCd %s). " - "If you find any bugs or problems, please report them at https://bugs.unrealircd.org/", - VERSIONONLY); -#endif - /* - * Now send a numeric to the user telling them what, if - * anything, happened. - */ - if (u1) - sendnumeric(client, ERR_HOSTILENAME, olduser, userbad, stripuser); - } - else - { - Client *acptr; - - /* Remote client */ - /* The following two cases probably cannot happen anymore? at all? */ - if (!(acptr = find_server_quick(user->server))) - { - sendto_ops("Bad USER [%s] :%s USER %s %s : No such server", - client->name, nick, user->username, user->server); - sendto_one(client, NULL, ":%s KILL %s :No such server: %s", - me.id, client->id, user->server); - SetKilled(client); - exit_client(client, NULL, "USER without prefix(2.8) or wrong prefix"); - return 0; - } - else if (acptr->direction != client->direction) - { - sendto_ops("Bad User [%s] :%s USER %s %s, != %s[%s]", - client->name, nick, user->username, user->server, - acptr->name, acptr->direction->name); - sendto_one(client, NULL, ":%s KILL %s :Wrong user-server-direction", - me.id, client->id); - SetKilled(client); - exit_client(client, NULL, "USER server wrong direction"); - return 0; - } else - { - client->flags |= acptr->flags; - } - - if (IsULine(client->srvptr)) - SetULine(client); - } - if (client->umodes & UMODE_INVISIBLE) - { - irccounts.invisible++; + client->umodes |= UMODE_SECURE; + RunHook(HOOKTYPE_SECURE_CONNECT, client); } - if (virthost && umode) - { - /* Set the IP address first */ - if (ip && (*ip != '*')) - { - char *ipstring = decode_ip(ip); - if (!ipstring) - { - sendto_ops("USER with invalid IP (%s) (%s) -- " - "IP must be base64 encoded binary representation of either IPv4 or IPv6", - client->name, ip); - exit_client(client, NULL, "USER with invalid IP"); - return 0; - } - safe_strdup(client->ip, ipstring); - } + safe_free(client->local->passwd); - /* For remote clients we recalculate the cloakedhost here because - * it may depend on the IP address (bug #5064). - */ - make_cloakedhost(client, user->realhost, user->cloakedhost, sizeof(user->cloakedhost)); - safe_strdup(user->virthost, user->cloakedhost); + unreal_log(ULOG_INFO, "connect", "LOCAL_CLIENT_CONNECT", client, + "Client connecting: $client ($client.user.username@$client.hostname) [$client.ip] $extended_client_info", + log_data_string("extended_client_info", get_connect_extinfo(client))); - /* Set the umodes */ - tkllayer[0] = nick; - tkllayer[1] = nick; - tkllayer[2] = umode; - tkllayer[3] = NULL; - dontspread = 1; - do_cmd(client, NULL, "MODE", 3, tkllayer); - dontspread = 0; + /* Send the RPL_WELCOME, LUSERS, MOTD, auto join channels, everything... */ + welcome_user(client, savetkl); - /* Set the vhost */ - if (virthost && *virthost != '*') - safe_strdup(client->user->virthost, virthost); - } - - hash_check_watch(client, RPL_LOGON); /* Uglier hack */ - build_umode_string(client, 0, SEND_UMODES|UMODE_SERVNOTICE, buf); - - sendto_serv_butone_nickcmd(client->direction, client, (*buf == '\0' ? "+" : buf)); - - if (MyConnect(client)) - { - broadcast_moddata_client(client); - sendto_connectnotice(client, 0, NULL); /* moved down, for modules. */ - if (buf[0] != '\0' && buf[1] != '\0') - sendto_one(client, NULL, ":%s MODE %s :%s", client->name, - client->name, buf); - if (user->snomask) - sendnumeric(client, RPL_SNOMASK, get_snomask_string_raw(user->snomask)); - - if (!IsSecure(client) && !IsLocalhost(client) && (iConf.plaintext_policy_user == POLICY_WARN)) - sendnotice_multiline(client, iConf.plaintext_policy_user_message); - - if (IsSecure(client) && (iConf.outdated_tls_policy_user == POLICY_WARN) && outdated_tls_client(client)) - sendnotice(client, "%s", outdated_tls_client_build_string(iConf.outdated_tls_policy_user_message, client)); - - /* Make creation time the real 'online since' time, excluding registration time. - * Otherwise things like set::anti-spam-quit-messagetime 10s could mean - * 1 second in practice (#2174). - */ - client->local->firsttime = TStime(); - client->local->last = TStime(); - - /* Give the user a fresh start as far as fake-lag is concerned. - * Otherwise the user could be lagged up already due to all the CAP stuff. - */ - client->local->since = TStime(); - - RunHook2(HOOKTYPE_WELCOME, client, 999); - - /* NOTE: Code after this 'if (savetkl)' will not be executed for quarantined- - * virus-users. So be carefull with the order. -- Syzop - */ - // FIXME: verify if this works, trace code path upstream!!!! - if (savetkl) - return join_viruschan(client, savetkl, SPAMF_USER); /* [RETURN!] */ - - /* Force the user to join the given chans -- codemastr */ - tlds = find_tld(client); - - if (tlds && !BadPtr(tlds->channel)) - { - char *chans = strdup(tlds->channel); - char *args[3] = { - client->name, - chans, - NULL - }; - do_cmd(client, NULL, "JOIN", 3, args); - safe_free(chans); - if (IsDead(client)) - return 0; - } - else if (!BadPtr(AUTO_JOIN_CHANS) && strcmp(AUTO_JOIN_CHANS, "0")) - { - char *chans = strdup(AUTO_JOIN_CHANS); - char *args[3] = { - client->name, - chans, - NULL - }; - do_cmd(client, NULL, "JOIN", 3, args); - safe_free(chans); - if (IsDead(client)) - return 0; - } - /* NOTE: If you add something here.. be sure to check the 'if (savetkl)' note above */ - } - - if (MyConnect(client) && !BadPtr(client->local->passwd)) - { - safe_free(client->local->passwd); - client->local->passwd = NULL; - } - - /* User successfully registered */ - return 1; + return IsDead(client) ? 0 : 1; } /** Nick collission detected. A winner has been decided upstream. Deal with killing. * I moved this all to a single routine here rather than having all code duplicated * due to SID vs NICK and some code quadruplicated. */ -void nick_collision(Client *cptr, char *newnick, char *newid, Client *new, Client *existing, int type) +void nick_collision(Client *cptr, const char *newnick, const char *newid, Client *new, Client *existing, int type) { char comment[512]; - char *new_server, *existing_server; + const char *new_server, *existing_server; + const char *who_won; + const char *nickcol_reason; - ircd_log(LOG_ERROR, "Nick collision: %s[%s]@%s (new) vs %s[%s]@%s (existing). Winner: %s. Type: %s", - newnick, newid, cptr->name, - existing->name, existing->id, existing->srvptr->name, - (type == NICKCOL_EQUAL) ? "None (equal)" : ((type == NICKCOL_NEW_WON) ? "New won" : "Existing won"), - new ? "nick-change" : "new user connecting"); + if (type == NICKCOL_NEW_WON) + who_won = "new"; + else if (type == NICKCOL_EXISTING_WON) + who_won = "existing"; + else + who_won = "none"; + + nickcol_reason = new ? "nick change" : "new user connecting"; + + unreal_log(ULOG_ERROR, "nick", "NICK_COLLISION", NULL, + "Nick collision: " + "$new_nick[$new_id]@$uplink (new) vs " + "$existing_client[$existing_client.id]@$existing_client.user.servername (existing). " + "Winner: $nick_collision_winner. " + "Cause: $nick_collision_reason", + log_data_string("new_nick", newnick), + log_data_string("new_id", newid), + log_data_client("uplink", cptr), + log_data_client("existing_client", existing), + log_data_string("nick_collision_winner", who_won), + log_data_string("nick_collision_reason", nickcol_reason)); new_server = cptr->name; existing_server = (existing == existing->direction) ? me.name : existing->direction->name; @@ -1246,32 +1201,6 @@ void nick_collision(Client *cptr, char *newnick, char *newid, Client *new, Clien } } -/* This used to initialize the various name strings used to store hostnames. - * But nowadays this takes place much earlier (in add_connection?). - * It's mainly used for "localhost" and WEBIRC magic only now... - */ -int check_init(Client *client, char *sockn, size_t size) -{ - strlcpy(sockn, client->local->sockhost, HOSTLEN); - - RunHookReturnInt3(HOOKTYPE_CHECK_INIT, client, sockn, size, !=0); - - /* Some silly hack to convert 127.0.0.1 and such into 'localhost' */ - if (!strcmp(GetIP(client), "127.0.0.1") || - !strcmp(GetIP(client), "0:0:0:0:0:0:0:1") || - !strcmp(GetIP(client), "0:0:0:0:0:ffff:127.0.0.1")) - { - if (client->local->hostp) - { - unreal_free_hostent(client->local->hostp); - client->local->hostp = NULL; - } - strlcpy(sockn, "localhost", HOSTLEN); - } - - return 1; -} - /** Returns 1 if allow::maxperip is exceeded by 'client' */ int exceeds_maxperip(Client *client, ConfigItem_allow *aconf) { @@ -1305,23 +1234,15 @@ int exceeds_maxperip(Client *client, ConfigItem_allow *aconf) * @param username Username, for some reason... * @returns 1 if OK, 0 if client is rejected (likely killed too) */ -int AllowClient(Client *client, char *username) +int AllowClient(Client *client) { static char sockhost[HOSTLEN + 1]; - struct hostent *hp = NULL; int i; ConfigItem_allow *aconf; char *hname; static char uhost[HOSTLEN + USERLEN + 3]; static char fullname[HOSTLEN + 1]; - Debug((DEBUG_DNS, "ch_cl: check access for %s[%s]", client->name, client->local->sockhost)); - - if (!check_init(client, sockhost, sizeof(sockhost))) - return 0; - - hp = client->local->hostp; - if (!IsSecure(client) && !IsLocalhost(client) && (iConf.plaintext_policy_user == POLICY_DENY)) { exit_client(client, NULL, iConf.plaintext_policy_user_message->line); @@ -1330,7 +1251,7 @@ int AllowClient(Client *client, char *username) if (IsSecure(client) && (iConf.outdated_tls_policy_user == POLICY_DENY) && outdated_tls_client(client)) { - char *msg = outdated_tls_client_build_string(iConf.outdated_tls_policy_user_message, client); + const char *msg = outdated_tls_client_build_string(iConf.outdated_tls_policy_user_message, client); exit_client(client, NULL, msg); return 0; } @@ -1340,62 +1261,9 @@ int AllowClient(Client *client, char *username) if (aconf->flags.tls && !IsSecure(client)) continue; - if (hp && hp->h_name) - { - hname = hp->h_name; - strlcpy(fullname, hname, sizeof(fullname)); - Debug((DEBUG_DNS, "a_il: %s->%s", sockhost, fullname)); - if (strchr(aconf->hostname, '@')) - { - if (aconf->flags.noident) - strlcpy(uhost, username, sizeof(uhost)); - else - strlcpy(uhost, client->ident, sizeof(uhost)); - strlcat(uhost, "@", sizeof(uhost)); - } - else - *uhost = '\0'; - strlcat(uhost, fullname, sizeof(uhost)); - if (match_simple(aconf->hostname, uhost)) - goto attach; - } + if (!unreal_mask_match(client, aconf->mask)) + continue; - if (strchr(aconf->ip, '@')) - { - if (aconf->flags.noident) - strlcpy(uhost, username, sizeof(uhost)); - else - strlcpy(uhost, client->ident, sizeof(uhost)); - strlcat(uhost, "@", sizeof(uhost)); - } - else - *uhost = '\0'; - strlcat(uhost, sockhost, sizeof(uhost)); - /* Check the IP */ - if (match_user(aconf->ip, client, MATCH_CHECK_IP)) - goto attach; - - /* Hmm, localhost is a special case, hp == NULL and sockhost contains - * 'localhost' instead of an ip... -- Syzop. */ - if (!strcmp(sockhost, "localhost")) - { - if (strchr(aconf->hostname, '@')) - { - if (aconf->flags.noident) - strlcpy(uhost, username, sizeof(uhost)); - else - strlcpy(uhost, client->ident, sizeof(uhost)); - strlcat(uhost, "@localhost", sizeof(uhost)); - } - else - strcpy(uhost, "localhost"); - - if (match_simple(aconf->hostname, uhost)) - goto attach; - } - - continue; /* No match */ - attach: /* Check authentication */ if (aconf->auth && !Auth_Check(client, aconf->auth, client->local->passwd)) { @@ -1411,11 +1279,9 @@ int AllowClient(Client *client, char *username) if (!aconf->flags.noident) SetUseIdent(client); - if (!aconf->flags.useip && hp) - strlcpy(uhost, fullname, sizeof(uhost)); - else - strlcpy(uhost, sockhost, sizeof(uhost)); - set_sockhost(client, uhost); + + if (aconf->flags.useip) + set_sockhost(client, GetIP(client)); if (exceeds_maxperip(client, aconf)) { @@ -1432,7 +1298,7 @@ int AllowClient(Client *client, char *username) else { /* Class is full */ - sendnumeric(client, RPL_REDIR, aconf->server ? aconf->server : defserv, aconf->port ? aconf->port : 6667); + sendnumeric(client, RPL_REDIR, aconf->server ? aconf->server : DEFAULT_SERVER, aconf->port ? aconf->port : 6667); exit_client(client, NULL, iConf.reject_message_server_full); return 0; } diff --git a/src/modules/nocodes.c b/src/modules/nocodes.c index c8fd9f3..aacf5fd 100644 --- a/src/modules/nocodes.c +++ b/src/modules/nocodes.c @@ -26,10 +26,10 @@ ModuleHeader MOD_HEADER "1.3", /* Version */ "Strip/block color/bold/underline/italic/reverse - by Syzop", /* Short description of module */ "UnrealIRCd Team", /* Author */ - "unrealircd-5", + "unrealircd-6", }; -int nocodes_can_send_to_channel(Client *client, Channel *channel, Membership *lp, char **msg, char **errmsg, SendType sendtype); +int nocodes_can_send_to_channel(Client *client, Channel *channel, Membership *lp, const char **msg, const char **errmsg, SendType sendtype); MOD_INIT() { @@ -49,7 +49,7 @@ MOD_UNLOAD() return MOD_SUCCESS; } -static int has_controlcodes(char *p) +static int has_controlcodes(const char *p) { for (; *p; p++) if ((*p == '\002') || (*p == '\037') || (*p == '\026') || (*p == '\035')) /* bold, underline, reverse, italic */ @@ -57,7 +57,7 @@ static int has_controlcodes(char *p) return 0; } -int nocodes_can_send_to_channel(Client *client, Channel *channel, Membership *lp, char **msg, char **errmsg, SendType sendtype) +int nocodes_can_send_to_channel(Client *client, Channel *channel, Membership *lp, const char **msg, const char **errmsg, SendType sendtype) { static char retbuf[4096]; Hook *h; diff --git a/src/modules/oper.c b/src/modules/oper.c index ee7d89a..c2a6541 100644 --- a/src/modules/oper.c +++ b/src/modules/oper.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", /* Version */ "command /oper", /* Short description of module */ "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* This is called on module init, before Server Ready */ @@ -82,7 +82,7 @@ void set_oper_host(Client *client, char *host) CMD_FUNC(cmd_oper) { ConfigItem_oper *operblock; - char *name, *password; + const char *operblock_name, *password; long old_umodes = client->umodes & ALL_UMODES; if (!MyUser(client)) @@ -103,24 +103,23 @@ CMD_FUNC(cmd_oper) if (IsOper(client)) { - sendnumeric(client, RPL_YOUREOPER); - // TODO: de-confuse this ? ;) + sendnotice(client, "You are already an IRC Operator. If you want to re-oper then de-oper first via /MODE yournick -o"); return; } - name = parv[1]; + operblock_name = parv[1]; password = (parc > 2) ? parv[2] : ""; /* set::plaintext-policy::oper 'deny' */ if (!IsSecure(client) && !IsLocalhost(client) && (iConf.plaintext_policy_oper == POLICY_DENY)) { sendnotice_multiline(client, iConf.plaintext_policy_oper_message); - sendto_snomask_global - (SNO_OPER, "Failed OPER attempt by %s (%s@%s) [not using SSL/TLS]", - client->name, client->user->username, client->local->sockhost); - ircd_log(LOG_OPER, "OPER NO-SSL/TLS (%s) by (%s!%s@%s)", name, client->name, - client->user->username, client->local->sockhost); - client->local->since += 7; + unreal_log(ULOG_WARNING, "oper", "OPER_FAILED", client, + "Failed OPER attempt by $client.details [reason: $reason] [oper-block: $oper_block]", + log_data_string("reason", "Not using TLS"), + log_data_string("fail_type", "NO_TLS"), + log_data_string("oper_block", parv[1])); + add_fake_lag(client, 7000); return; } @@ -128,36 +127,40 @@ CMD_FUNC(cmd_oper) if (IsSecure(client) && (iConf.outdated_tls_policy_oper == POLICY_DENY) && outdated_tls_client(client)) { sendnotice(client, "%s", outdated_tls_client_build_string(iConf.outdated_tls_policy_oper_message, client)); - sendto_snomask_global - (SNO_OPER, "Failed OPER attempt by %s (%s@%s) [outdated SSL/TLS protocol or cipher]", - client->name, client->user->username, client->local->sockhost); - ircd_log(LOG_OPER, "OPER OUTDATED-SSL/TLS (%s) by (%s!%s@%s)", name, client->name, - client->user->username, client->local->sockhost); - client->local->since += 7; + unreal_log(ULOG_WARNING, "oper", "OPER_FAILED", client, + "Failed OPER attempt by $client.details [reason: $reason] [oper-block: $oper_block]", + log_data_string("reason", "Outdated TLS protocol or cipher"), + log_data_string("fail_type", "OUTDATED_TLS_PROTOCOL_OR_CIPHER"), + log_data_string("oper_block", parv[1])); + add_fake_lag(client, 7000); return; } - if (!(operblock = find_oper(name))) + if (!(operblock = find_oper(operblock_name))) { sendnumeric(client, ERR_NOOPERHOST); - sendto_snomask_global - (SNO_OPER, "Failed OPER attempt by %s (%s@%s) [unknown oper]", - client->name, client->user->username, client->local->sockhost); - ircd_log(LOG_OPER, "OPER UNKNOWNOPER (%s) by (%s!%s@%s)", name, client->name, - client->user->username, client->local->sockhost); - client->local->since += 7; + unreal_log(ULOG_WARNING, "oper", "OPER_FAILED", client, + "Failed OPER attempt by $client.details [reason: $reason] [oper-block: $oper_block]", + log_data_string("reason", "Unknown oper operblock_name"), + log_data_string("fail_type", "UNKNOWN_OPER_NAME"), + log_data_string("oper_block", parv[1])); + add_fake_lag(client, 7000); return; } + /* Below here, the oper block exists, any errors here we take (even) + * more seriously, they are logged as errors instead of warnings. + */ + if (!unreal_mask_match(client, operblock->mask)) { sendnumeric(client, ERR_NOOPERHOST); - sendto_snomask_global - (SNO_OPER, "Failed OPER attempt by %s (%s@%s) using UID %s [host doesnt match]", - client->name, client->user->username, client->local->sockhost, name); - ircd_log(LOG_OPER, "OPER NOHOSTMATCH (%s) by (%s!%s@%s)", name, client->name, - client->user->username, client->local->sockhost); - client->local->since += 7; + unreal_log(ULOG_ERROR, "oper", "OPER_FAILED", client, + "Failed OPER attempt by $client.details [reason: $reason] [oper-block: $oper_block]", + log_data_string("reason", "Host does not match"), + log_data_string("fail_type", "NO_HOST_MATCH"), + log_data_string("oper_block", parv[1])); + add_fake_lag(client, 7000); return; } @@ -167,12 +170,12 @@ CMD_FUNC(cmd_oper) if (FAILOPER_WARN) sendnotice(client, "*** Your attempt has been logged."); - ircd_log(LOG_OPER, "OPER FAILEDAUTH (%s) by (%s!%s@%s)", name, client->name, - client->user->username, client->local->sockhost); - sendto_snomask_global - (SNO_OPER, "Failed OPER attempt by %s (%s@%s) using UID %s [FAILEDAUTH]", - client->name, client->user->username, client->local->sockhost, name); - client->local->since += 7; + unreal_log(ULOG_ERROR, "oper", "OPER_FAILED", client, + "Failed OPER attempt by $client.details [reason: $reason] [oper-block: $oper_block]", + log_data_string("reason", "Authentication failed"), + log_data_string("fail_type", "AUTHENTICATION_FAILED"), + log_data_string("oper_block", parv[1])); + add_fake_lag(client, 7000); return; } @@ -185,25 +188,23 @@ CMD_FUNC(cmd_oper) if (operblock->require_modes & ~client->umodes) { sendnumericfmt(client, ERR_NOOPERHOST, ":You are missing user modes required to OPER"); - sendto_snomask_global - (SNO_OPER, "Failed OPER attempt by %s (%s@%s) [lacking modes '%s' in oper::require-modes]", - client->name, client->user->username, client->local->sockhost, get_usermode_string_raw(operblock->require_modes & ~client->umodes)); - ircd_log(LOG_OPER, "OPER MISSINGMODES (%s) by (%s!%s@%s), needs modes=%s", - name, client->name, client->user->username, client->local->sockhost, - get_usermode_string_raw(operblock->require_modes & ~client->umodes)); - client->local->since += 7; + unreal_log(ULOG_WARNING, "oper", "OPER_FAILED", client, + "Failed OPER attempt by $client.details [reason: $reason] [oper-block: $oper_block]", + log_data_string("reason", "Not matching oper::require-modes"), + log_data_string("fail_type", "REQUIRE_MODES_NOT_SATISFIED"), + log_data_string("oper_block", parv[1])); + add_fake_lag(client, 7000); return; } if (!find_operclass(operblock->operclass)) { sendnotice(client, "ERROR: There is a non-existant oper::operclass specified for your oper block"); - ircd_log(LOG_ERROR, "OPER MISSINGOPERCLASS (%s) by (%s!%s@%s), oper::operclass does not exist: %s", - name, client->name, client->user->username, client->local->sockhost, - operblock->operclass); - sendto_snomask_global - (SNO_OPER, "Failed OPER attempt by %s (%s@%s) [oper::operclass does not exist: '%s']", - client->name, client->user->username, client->local->sockhost, operblock->operclass); + unreal_log(ULOG_WARNING, "oper", "OPER_FAILED", client, + "Failed OPER attempt by $client.details [reason: $reason] [oper-block: $oper_block]", + log_data_string("reason", "Config error: invalid oper::operclass"), + log_data_string("fail_type", "OPER_OPERCLASS_INVALID"), + log_data_string("oper_block", parv[1])); return; } @@ -212,12 +213,12 @@ CMD_FUNC(cmd_oper) sendnumeric(client, ERR_NOOPERHOST); sendnotice(client, "Your maximum number of concurrent oper logins has been reached (%d)", operblock->maxlogins); - sendto_snomask_global - (SNO_OPER, "Failed OPER attempt by %s (%s@%s) using UID %s [maxlogins reached]", - client->name, client->user->username, client->local->sockhost, name); - ircd_log(LOG_OPER, "OPER TOOMANYLOGINS (%s) by (%s!%s@%s)", name, client->name, - client->user->username, client->local->sockhost); - client->local->since += 4; + unreal_log(ULOG_WARNING, "oper", "OPER_FAILED", client, + "Failed OPER attempt by $client.details [reason: $reason] [oper-block: $oper_block]", + log_data_string("reason", "oper::maxlogins limit reached"), + log_data_string("fail_type", "OPER_MAXLOGINS_LIMIT"), + log_data_string("oper_block", parv[1])); + add_fake_lag(client, 4000); return; } @@ -258,13 +259,9 @@ CMD_FUNC(cmd_oper) safe_strdup(client->user->virthost, client->user->cloakedhost); } - sendto_snomask_global(SNO_OPER, - "%s (%s@%s) [%s] is now an operator", - client->name, client->user->username, client->local->sockhost, - parv[1]); - - ircd_log(LOG_OPER, "OPER (%s) by (%s!%s@%s)", name, client->name, client->user->username, - client->local->sockhost); + unreal_log(ULOG_INFO, "oper", "OPER_SUCCESS", client, + "$client.details is now an IRC Operator [oper-block: $oper_block]", + log_data_string("oper_block", parv[1])); /* set oper snomasks */ if (operblock->snomask) @@ -272,19 +269,13 @@ CMD_FUNC(cmd_oper) else set_snomask(client, OPER_SNOMASK); /* set::snomask-on-oper */ - /* some magic to set user mode +s (and snomask +s) if you have any snomasks set */ - if (client->user->snomask) - { - client->user->snomask |= SNO_SNOTICE; - client->umodes |= UMODE_SERVNOTICE; - } - send_umode_out(client, 1, old_umodes); - sendnumeric(client, RPL_SNOMASK, get_snomask_string(client)); + if (client->user->snomask) + sendnumeric(client, RPL_SNOMASK, client->user->snomask); list_add(&client->special_node, &oper_list); - RunHook2(HOOKTYPE_LOCAL_OPER, client, 1); + RunHook(HOOKTYPE_LOCAL_OPER, client, 1, operblock); sendnumeric(client, RPL_YOUREOPER); @@ -300,7 +291,7 @@ CMD_FUNC(cmd_oper) if (!BadPtr(OPER_AUTO_JOIN_CHANS) && strcmp(OPER_AUTO_JOIN_CHANS, "0")) { char *chans = strdup(OPER_AUTO_JOIN_CHANS); - char *args[3] = { + const char *args[3] = { client->name, chans, NULL @@ -316,17 +307,19 @@ CMD_FUNC(cmd_oper) if (!IsSecure(client) && !IsLocalhost(client) && (iConf.plaintext_policy_oper == POLICY_WARN)) { sendnotice_multiline(client, iConf.plaintext_policy_oper_message); - sendto_snomask_global - (SNO_OPER, "OPER %s [%s] used an insecure (non-SSL/TLS) connection to /OPER.", - client->name, name); + unreal_log(ULOG_WARNING, "oper", "OPER_UNSAFE", client, + "Insecure (non-TLS) connection used to OPER up by $client.details [oper-block: $oper_block]", + log_data_string("oper_block", parv[1]), + log_data_string("warn_type", "NO_TLS")); } /* set::outdated-tls-policy::oper 'warn' */ if (IsSecure(client) && (iConf.outdated_tls_policy_oper == POLICY_WARN) && outdated_tls_client(client)) { sendnotice(client, "%s", outdated_tls_client_build_string(iConf.outdated_tls_policy_oper_message, client)); - sendto_snomask_global - (SNO_OPER, "OPER %s [%s] used a connection with an outdated SSL/TLS protocol or cipher to /OPER.", - client->name, name); + unreal_log(ULOG_WARNING, "oper", "OPER_UNSAFE", client, + "Outdated TLS protocol/cipher used to OPER up by $client.details [oper-block: $oper_block]", + log_data_string("oper_block", parv[1]), + log_data_string("warn_type", "OUTDATED_TLS_PROTOCOL_OR_CIPHER")); } } diff --git a/src/modules/operinfo.c b/src/modules/operinfo.c new file mode 100644 index 0000000..7571c35 --- /dev/null +++ b/src/modules/operinfo.c @@ -0,0 +1,99 @@ +/* + * Store oper login in ModData, used by WHOIS and for auditting purposes. + * (C) Copyright 2021-.. Syzop and The UnrealIRCd Team + * License: GPLv2 + */ + +#include "unrealircd.h" + +ModuleHeader MOD_HEADER + = { + "operinfo", + "5.0", + "Store oper login in ModData", + "UnrealIRCd Team", + "unrealircd-6", + }; + +/* Forward declarations */ +int operinfo_local_oper(Client *client, int up, ConfigItem_oper *oper_block); +void operinfo_free(ModData *m); +const char *operinfo_serialize(ModData *m); +void operinfo_unserialize(const char *str, ModData *m); + +ModDataInfo *operlogin_md = NULL; /* Module Data structure which we acquire */ +ModDataInfo *operclass_md = NULL; /* Module Data structure which we acquire */ + +MOD_INIT() +{ + ModDataInfo mreq; + + MARK_AS_OFFICIAL_MODULE(modinfo); + + memset(&mreq, 0, sizeof(mreq)); + mreq.name = "operlogin"; + mreq.free = operinfo_free; + mreq.serialize = operinfo_serialize; + mreq.unserialize = operinfo_unserialize; + mreq.sync = MODDATA_SYNC_EARLY; + mreq.type = MODDATATYPE_CLIENT; + operlogin_md = ModDataAdd(modinfo->handle, mreq); + if (!operlogin_md) + abort(); + + memset(&mreq, 0, sizeof(mreq)); + mreq.name = "operclass"; + mreq.free = operinfo_free; + mreq.serialize = operinfo_serialize; + mreq.unserialize = operinfo_unserialize; + mreq.sync = MODDATA_SYNC_EARLY; + mreq.type = MODDATATYPE_CLIENT; + operclass_md = ModDataAdd(modinfo->handle, mreq); + if (!operclass_md) + abort(); + + HookAdd(modinfo->handle, HOOKTYPE_LOCAL_OPER, 0, operinfo_local_oper); + + return MOD_SUCCESS; +} + +MOD_LOAD() +{ + return MOD_SUCCESS; +} + + +MOD_UNLOAD() +{ + return MOD_SUCCESS; +} + +int operinfo_local_oper(Client *client, int up, ConfigItem_oper *oper_block) +{ + if (up) + { + moddata_client_set(client, "operlogin", oper_block->name); + moddata_client_set(client, "operclass", oper_block->operclass); + } else { + moddata_client_set(client, "operlogin", NULL); + moddata_client_set(client, "operclass", NULL); + } + return 0; +} + +void operinfo_free(ModData *m) +{ + safe_free(m->str); +} + +const char *operinfo_serialize(ModData *m) +{ + if (!m->str) + return NULL; + return m->str; +} + +void operinfo_unserialize(const char *str, ModData *m) +{ + safe_strdup(m->str, str); +} diff --git a/src/modules/opermotd.c b/src/modules/opermotd.c index 63bd7c6..75398b7 100644 --- a/src/modules/opermotd.c +++ b/src/modules/opermotd.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", "command /opermotd", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() diff --git a/src/modules/part.c b/src/modules/part.c index 937087a..84f940f 100644 --- a/src/modules/part.c +++ b/src/modules/part.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", "command /part", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -59,11 +59,12 @@ MOD_UNLOAD() */ CMD_FUNC(cmd_part) { + char request[BUFSIZE]; Channel *channel; Membership *lp; char *p = NULL, *name; - char *commentx = (parc > 2 && parv[2]) ? parv[2] : NULL; - char *comment; + const char *commentx = (parc > 2 && parv[2]) ? parv[2] : NULL; + const char *comment; int n; int ntargets = 0; int maxtargets = max_targets_for_command("PART"); @@ -96,7 +97,8 @@ CMD_FUNC(cmd_part) } } - for (; (name = strtoken(&p, parv[1], ",")); parv[1] = NULL) + strlcpy(request, parv[1], sizeof(request)); + for (name = strtoken(&p, request, ","); name; name = strtoken(&p, NULL, ",")) { MessageTag *mtags = NULL; @@ -106,7 +108,7 @@ CMD_FUNC(cmd_part) break; } - channel = get_channel(client, name, 0); + channel = find_channel(name); if (!channel) { sendnumeric(client, ERR_NOSUCHCHANNEL, name); @@ -130,36 +132,30 @@ CMD_FUNC(cmd_part) continue; } - if (!ValidatePermissionsForPath("channel:override:banpartmsg",client,NULL,channel,NULL) && !is_chan_op(client, channel)) { + if (!ValidatePermissionsForPath("channel:override:banpartmsg",client,NULL,channel,NULL) && !check_channel_access(client, channel, "oaq")) { /* Banned? No comment allowed ;) */ if (comment && is_banned(client, channel, BANCHK_MSG, &comment, NULL)) comment = NULL; if (comment && is_banned(client, channel, BANCHK_LEAVE_MSG, &comment, NULL)) comment = NULL; - /* Same for +m */ - if ((channel->mode.mode & MODE_MODERATED) && comment && - !has_voice(client, channel) && !is_half_op(client, channel)) - { - comment = NULL; - } } if (MyConnect(client)) { Hook *tmphook; for (tmphook = Hooks[HOOKTYPE_PRE_LOCAL_PART]; tmphook; tmphook = tmphook->next) { - comment = (*(tmphook->func.pcharfunc))(client, channel, comment); + comment = (*(tmphook->func.stringfunc))(client, channel, comment); if (!comment) break; } } /* Create a new message, this one is actually used by 8 calls (though at most 4 max) */ - new_message_special(client, recv_mtags, &mtags, ":%s PART %s", client->name, channel->chname); + new_message_special(client, recv_mtags, &mtags, ":%s PART %s", client->name, channel->name); /* Send to other servers... */ sendto_server(client, 0, 0, mtags, ":%s PART %s :%s", - client->id, channel->chname, comment ? comment : ""); + client->id, channel->name, comment ? comment : ""); if (invisible_user_in_channel(client, channel)) { @@ -167,29 +163,29 @@ CMD_FUNC(cmd_part) if (!comment) { sendto_channel(channel, client, client, - PREFIX_HALFOP|PREFIX_OP|PREFIX_OWNER|PREFIX_ADMIN, 0, + "ho", 0, SEND_LOCAL, mtags, ":%s PART %s", - client->name, channel->chname); + client->name, channel->name); if (MyUser(client)) { sendto_one(client, mtags, ":%s!%s@%s PART %s", - client->name, client->user->username, GetHost(client), channel->chname); + client->name, client->user->username, GetHost(client), channel->name); } } else { sendto_channel(channel, client, client, - PREFIX_HALFOP|PREFIX_OP|PREFIX_OWNER|PREFIX_ADMIN, 0, + "ho", 0, SEND_LOCAL, mtags, ":%s PART %s %s", - client->name, channel->chname, comment); + client->name, channel->name, comment); if (MyUser(client)) { sendto_one(client, mtags, ":%s!%s@%s PART %s %s", client->name, client->user->username, GetHost(client), - channel->chname, comment); + channel->name, comment); } } } @@ -200,21 +196,21 @@ CMD_FUNC(cmd_part) { sendto_channel(channel, client, NULL, 0, 0, SEND_LOCAL, mtags, ":%s PART %s", - client->name, channel->chname); + client->name, channel->name); } else { sendto_channel(channel, client, NULL, 0, 0, SEND_LOCAL, mtags, ":%s PART %s :%s", - client->name, channel->chname, comment); + client->name, channel->name, comment); } } if (MyUser(client)) - RunHook4(HOOKTYPE_LOCAL_PART, client, channel, mtags, comment); + RunHook(HOOKTYPE_LOCAL_PART, client, channel, mtags, comment); else - RunHook4(HOOKTYPE_REMOTE_PART, client, channel, mtags, comment); + RunHook(HOOKTYPE_REMOTE_PART, client, channel, mtags, comment); free_message_tags(mtags); - remove_user_from_channel(client, channel); + remove_user_from_channel(client, channel, 0); } } diff --git a/src/modules/pass.c b/src/modules/pass.c index b67fb6c..89084e1 100644 --- a/src/modules/pass.c +++ b/src/modules/pass.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", "command /pass", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Forward declarations */ @@ -119,7 +119,7 @@ int _check_banned(Client *client, int exitflags) */ CMD_FUNC(cmd_pass) { - char *password = parc > 1 ? parv[1] : NULL; + const char *password = parc > 1 ? parv[1] : NULL; if (!MyConnect(client) || (!IsUnknown(client) && !IsHandshake(client))) { @@ -137,5 +137,5 @@ CMD_FUNC(cmd_pass) safe_strldup(client->local->passwd, password, PASSWDLEN+1); /* note: the original non-truncated password is supplied as 2nd parameter. */ - RunHookReturn2(HOOKTYPE_LOCAL_PASS, client, password, !=0); + RunHookReturn(HOOKTYPE_LOCAL_PASS, !=0, client, password); } diff --git a/src/modules/pingpong.c b/src/modules/pingpong.c index 42b577d..d9bdd9c 100644 --- a/src/modules/pingpong.c +++ b/src/modules/pingpong.c @@ -34,7 +34,7 @@ ModuleHeader MOD_HEADER "5.0", /* Version */ "ping, pong and nospoof", /* Short description of module */ "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* This is called on module init, before Server Ready */ MOD_INIT() @@ -66,7 +66,7 @@ MOD_UNLOAD() CMD_FUNC(cmd_ping) { Client *target; - char *origin, *destination; + const char *origin, *destination; if (parc < 2 || BadPtr(parv[1])) { @@ -147,7 +147,7 @@ CMD_FUNC(cmd_nospoof) me.name, client->name); if (is_handshake_finished(client)) - register_user(client, client->name, client->user->username, NULL, NULL, NULL); + register_user(client); } /* @@ -158,7 +158,7 @@ CMD_FUNC(cmd_nospoof) CMD_FUNC(cmd_pong) { Client *target; - char *origin, *destination; + const char *origin, *destination; if (!IsRegistered(client)) { diff --git a/src/modules/plaintext-policy.c b/src/modules/plaintext-policy.c index 6df0cbe..d5159d6 100644 --- a/src/modules/plaintext-policy.c +++ b/src/modules/plaintext-policy.c @@ -28,7 +28,7 @@ ModuleHeader MOD_HEADER "5.0", "Plaintext Policy CAP", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -52,7 +52,7 @@ MOD_UNLOAD() return MOD_SUCCESS; } -char *plaintext_policy_capability_parameter(Client *client) +const char *plaintext_policy_capability_parameter(Client *client) { static char buf[128]; diff --git a/src/modules/protoctl.c b/src/modules/protoctl.c index c1b3c4e..a1c7b31 100644 --- a/src/modules/protoctl.c +++ b/src/modules/protoctl.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", "command /protoctl", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -94,6 +94,10 @@ CMD_FUNC(cmd_protoctl) { SetCapability(client, "userhost-in-names"); } + else if (IsUser(client)) + { + return; + } else if (!strcmp(name, "VL")) { SetVL(client); @@ -114,6 +118,10 @@ CMD_FUNC(cmd_protoctl) { SetMTAGS(client); } + else if (!strcmp(name, "NEXTBANS")) + { + SetNEXTBANS(client); + } else if (!strcmp(name, "NICKCHARS") && value) { if (!IsServer(client) && !IsEAuth(client) && !IsHandshake(client)) @@ -124,22 +132,23 @@ CMD_FUNC(cmd_protoctl) */ if (strstr(charsys_get_current_languages(), "utf8") && !strstr(value, "utf8")) { - char buf[512]; - snprintf(buf, sizeof(buf), "Server %s has utf8 in set::allowed-nickchars but %s does not. Link rejected.", - me.name, *client->name ? client->name : "other side"); - sendto_realops("\002ERROR\001 %s", buf); - exit_client(client, NULL, buf); + unreal_log(ULOG_ERROR, "link", "LINK_DENIED_CHARSYS_INCOMPATIBLE", client, + "Server link $client rejected. Server $me_name has utf8 in set::allowed-nickchars but $client does not.", + log_data_string("me_name", me.name)); + exit_client(client, NULL, "Incompatible set::allowed-nickchars setting"); return; } /* We compare the character sets to see if we should warn opers about any mismatch... */ if (strcmp(value, charsys_get_current_languages())) { - sendto_realops("\002WARNING!!!!\002 Link %s does not have the same set::allowed-nickchars settings (or is " - "a different UnrealIRCd version), this MAY cause display issues. Our charset: '%s', theirs: '%s'", - get_client_name(client, FALSE), charsys_get_current_languages(), value); + unreal_log(ULOG_WARNING, "link", "LINK_WARNING_CHARSYS", client, + "Server link $client does not have the same set::allowed-nickchars settings, " + "this may possibly cause display issues. Our charset: '$our_charsys', theirs: '$their_charsys'", + log_data_string("our_charsys", charsys_get_current_languages()), + log_data_string("their_charsys", value)); } - if (client->serv) - safe_strdup(client->serv->features.nickchars, value); + if (client->server) + safe_strdup(client->server->features.nickchars, value); /* If this is a runtime change (so post-handshake): */ if (IsServer(client)) @@ -155,15 +164,13 @@ CMD_FUNC(cmd_protoctl) their_value = allowed_channelchars_strtoval(value); if (their_value != iConf.allowed_channelchars) { - char linkerr[256]; - ircsnprintf(linkerr, sizeof(linkerr), - "Link rejected. Server %s has set::allowed-channelchars '%s' " - "while %s has a value of '%s'. " - "Please choose the same value on all servers.", - client->name, value, - me.name, allowed_channelchars_valtostr(iConf.allowed_channelchars)); - sendto_realops("ERROR: %s", linkerr); - exit_client(client, NULL, linkerr); + unreal_log(ULOG_ERROR, "link", "LINK_DENIED_ALLOWED_CHANNELCHARS_INCOMPATIBLE", client, + "Server link $client rejected. Server has set::allowed-channelchars setting " + "of $their_allowed_channelchars, while we have $our_allowed_channelchars.\n" + "Please set set::allowed-channelchars to the same value on all servers.", + log_data_string("their_allowed_channelchars", value), + log_data_string("our_allowed_channelchars", allowed_channelchars_valtostr(iConf.allowed_channelchars))); + exit_client(client, NULL, "Incompatible set::allowed-channelchars setting"); return; } } @@ -198,9 +205,10 @@ CMD_FUNC(cmd_protoctl) if ((aclient = hash_find_id(sid, NULL)) != NULL) { - sendto_one(client, NULL, "ERROR :SID %s already exists from %s", aclient->id, aclient->name); - sendto_snomask(SNO_SNOTICE, "Link %s rejected - SID %s already exists from %s", - get_client_name(client, FALSE), aclient->id, aclient->name); + unreal_log(ULOG_ERROR, "link", "LINK_DENIED_SID_COLLISION", client, + "Server link $client rejected. Server with SID $sid already exist via uplink $exiting_client.server.uplink.", + log_data_string("sid", sid), + log_data_client("existing_client", aclient)); exit_client(client, NULL, "SID collision"); return; } @@ -236,13 +244,8 @@ CMD_FUNC(cmd_protoctl) } servername = strtoken(&p, buf, ","); - if (!servername || (strlen(servername) > HOSTLEN) || !strchr(servername, '.')) + if (!servername || !valid_server_name(servername)) { - sendto_one(client, NULL, "ERROR :Bogus server name in EAUTH (%s)", servername ? servername : ""); - sendto_snomask - (SNO_JUNK, - "WARNING: Bogus server name (%s) from %s in EAUTH (maybe just a fishy client)", - servername ? servername : "", get_client_name(client, TRUE)); exit_client(client, NULL, "Bogus server name"); return; } @@ -258,7 +261,12 @@ CMD_FUNC(cmd_protoctl) } } - if (!verify_link(client, servername, &aconf)) + /* Set client->name but don't add to hash list, this gives better + * log messages and should be safe. See CMTSRV941 in server.c. + */ + strlcpy(client->name, servername, sizeof(client->name)); + + if (!verify_link(client, &aconf)) return; /* note: software, protocol and flags may be NULL */ @@ -266,16 +274,11 @@ CMD_FUNC(cmd_protoctl) return; SetEAuth(client); - make_server(client); /* allocate and set client->serv */ - /* Set client->name but don't add to hash list. The real work on - * that is done in cmd_server. We just set it here for display - * purposes of error messages (such as reject due to clock). - */ - strlcpy(client->name, servername, sizeof(client->name)); + make_server(client); /* allocate and set client->server */ if (protocol) - client->serv->features.protocol = atoi(protocol); + client->server->features.protocol = atoi(protocol); if (software) - safe_strdup(client->serv->features.software, software); + safe_strdup(client->server->features.software, software); if (!IsHandshake(client) && aconf) /* Send PASS early... */ sendto_one(client, NULL, "PASS :%s", (aconf->auth->type == AUTHTYPE_PLAINTEXT) ? aconf->auth->data : "*"); } @@ -287,12 +290,12 @@ CMD_FUNC(cmd_protoctl) if (!IsEAuth(client)) continue; - if (client->serv->features.protocol < 2351) + if (client->server->features.protocol < 2351) continue; /* old SERVERS= version */ /* Other side lets us know which servers are behind it. * SERVERS=[,id, aclient->name); - sendto_realops("Link %s cancelled, server with SID %s (%s) already exists", - get_client_name(aclient, TRUE), aclient->id, aclient->name); + unreal_log(ULOG_ERROR, "link", "LINK_DENIED_DUPLICATE_SID", client, + "Denied server $client: Server with SID $existing_client.id ($existing_client) is already linked.", + log_data_client("existing_client", aclient)); exit_client(client, NULL, "Server Exists (or non-unique me::sid)"); return; } @@ -311,12 +313,13 @@ CMD_FUNC(cmd_protoctl) aclient = find_pending_net_duplicates(client, &srv, &sid); if (aclient) { - sendto_one(client, NULL, "ERROR :Server with SID %s is being introduced by another server as well. " - "Just wait a moment for it to synchronize...", sid); - sendto_realops("Link %s cancelled, server would introduce server with SID %s, which " - "server %s is also about to introduce. Just wait a moment for it to synchronize...", - get_client_name(aclient, TRUE), sid, get_client_name(srv, TRUE)); - exit_client(client, NULL, "Server Exists (just wait a moment)"); + unreal_log(ULOG_ERROR, "link", "LINK_DENIED_DUPLICATE_SID_LINKED", client, + "Denied server $client: Server would (later) introduce SID $sid, " + "but we already have SID $sid linked ($existing_client)\n" + "Possible race condition, just wait a moment for the network to synchronize...", + log_data_string("sid", sid), + log_data_client("existing_client", aclient)); + exit_client(client, NULL, "Server Exists (just wait a moment...)"); return; } @@ -327,51 +330,34 @@ CMD_FUNC(cmd_protoctl) else if (!strcmp(name, "TS") && value && (IsServer(client) || IsEAuth(client))) { long t = atol(value); - char msg[512], linkerr[512]; - + if (t < 10000) continue; /* ignore */ - - *msg = *linkerr = '\0'; - + if ((TStime() - t) > MAX_SERVER_TIME_OFFSET) { - snprintf(linkerr, sizeof(linkerr), - "Your clock is %lld seconds behind my clock. " - "Please verify both your clock and mine, " - "fix it and try linking again.", - (long long)(TStime() - t)); - snprintf(msg, sizeof(msg), - "Rejecting link %s: our clock is %lld seconds ahead. " - "Please verify the clock on both %s (them) and %s (us). " - "Correct time is very important for IRC servers, " - "see https://www.unrealircd.org/docs/FAQ#fix-your-clock", - get_client_name(client, TRUE), - (long long)(TStime() - t), - client->name, me.name); + unreal_log(ULOG_ERROR, "link", "LINK_DENIED_CLOCK_INCORRECT", client, + "Denied server $client: clock on server $client is $time_delta " + "seconds behind the clock of $me_name.\n" + "Correct time is very important for IRC servers, " + "see https://www.unrealircd.org/docs/FAQ#fix-your-clock", + log_data_integer("time_delta", TStime() - t), + log_data_string("me_name", me.name)); + exit_client_fmt(client, NULL, "Incorrect clock. Our clocks are %lld seconds apart.", + (long long)(TStime() - t)); + return; } else if ((t - TStime()) > MAX_SERVER_TIME_OFFSET) { - snprintf(linkerr, sizeof(linkerr), - "Your clock is %lld seconds ahead of my clock. " - "Please verify both your clock and mine, fix it, " - "and try linking again.", - (long long)(t - TStime())); - snprintf(msg, sizeof(msg), - "Rejecting link %s: our clock is %lld seconds behind. " - "Please verify the clock on both %s (them) and %s (us). " - "Correct time is very important for IRC servers, " - "see https://www.unrealircd.org/docs/FAQ#fix-your-clock", - get_client_name(client, TRUE), - (long long)(t - TStime()), - client->name, me.name); - } - - if (*msg) - { - sendto_realops("%s", msg); - ircd_log(LOG_ERROR, "%s", msg); - exit_client(client, NULL, linkerr); + unreal_log(ULOG_ERROR, "link", "LINK_DENIED_CLOCK_INCORRECT", client, + "Denied server $client: clock on server $client is $time_delta " + "seconds ahead the clock of $me_name.\n" + "Correct time is very important for IRC servers, " + "see https://www.unrealircd.org/docs/FAQ#fix-your-clock", + log_data_integer("time_delta", t - TStime()), + log_data_string("me_name", me.name)); + exit_client_fmt(client, NULL, "Incorrect clock. Our clocks are %lld seconds apart.", + (long long)(t - TStime())); return; } } @@ -379,23 +365,23 @@ CMD_FUNC(cmd_protoctl) { client->local->proto |= PROTO_MLOCK; } - else if (!strcmp(name, "CHANMODES") && value && client->serv) + else if (!strcmp(name, "CHANMODES") && value && client->server) { parse_chanmodes_protoctl(client, value); /* If this is a runtime change (so post-handshake): */ if (IsServer(client)) broadcast_sinfo(client, NULL, client); } - else if (!strcmp(name, "USERMODES") && value && client->serv) + else if (!strcmp(name, "USERMODES") && value && client->server) { - safe_strdup(client->serv->features.usermodes, value); + safe_strdup(client->server->features.usermodes, value); /* If this is a runtime change (so post-handshake): */ if (IsServer(client)) broadcast_sinfo(client, NULL, client); } - else if (!strcmp(name, "BOOTED") && value && client->serv) + else if (!strcmp(name, "BOOTED") && value && client->server) { - client->serv->boottime = atol(value); + client->server->boottime = atol(value); } else if (!strcmp(name, "EXTSWHOIS")) { @@ -409,7 +395,7 @@ CMD_FUNC(cmd_protoctl) */ } - if (first_protoctl && IsHandshake(client) && client->serv && !IsServerSent(client)) /* first & outgoing connection to server */ + if (first_protoctl && IsHandshake(client) && client->server && !IsServerSent(client)) /* first & outgoing connection to server */ { /* SERVER message moved from completed_connection() to here due to EAUTH/SERVERS PROTOCTL stuff, * which needed to be delayed until after both sides have received SERVERS=xx (..or not.. in case diff --git a/src/modules/quit.c b/src/modules/quit.c index 8c59821..4bddef2 100644 --- a/src/modules/quit.c +++ b/src/modules/quit.c @@ -30,7 +30,7 @@ ModuleHeader MOD_HEADER "5.0", /* Version */ "command /quit", /* Short description of module */ "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* This is called on module init, before Server Ready */ @@ -59,11 +59,17 @@ MOD_UNLOAD() */ CMD_FUNC(cmd_quit) { - char *comment = (parc > 1 && parv[1]) ? parv[1] : client->name; - static char commentbuf[MAXQUITLEN + 1]; + const char *comment = (parc > 1 && parv[1]) ? parv[1] : client->name; + char commentbuf[MAXQUITLEN + 1]; + char commentbuf2[MAXQUITLEN + 1]; - if (parv[1] && (strlen(comment) > iConf.quit_length)) - comment[iConf.quit_length] = '\0'; + if (parc > 1 && parv[1]) + { + strlncpy(commentbuf, parv[1], sizeof(commentbuf), iConf.quit_length); + comment = commentbuf; + } else { + comment = client->name; + } if (MyUser(client)) { @@ -91,14 +97,14 @@ CMD_FUNC(cmd_quit) if (!ValidatePermissionsForPath("immune:anti-spam-quit-message-time",client,NULL,NULL,NULL) && ANTI_SPAM_QUIT_MSG_TIME) { - if (client->local->firsttime+ANTI_SPAM_QUIT_MSG_TIME > TStime()) + if (client->local->creationtime+ANTI_SPAM_QUIT_MSG_TIME > TStime()) comment = client->name; } if (iConf.part_instead_of_quit_on_comment_change && MyUser(client)) { Membership *lp, *lp_next; - char *newcomment; + const char *newcomment; Channel *channel; for (lp = client->user->channel; lp; lp = lp_next) @@ -109,7 +115,7 @@ CMD_FUNC(cmd_quit) for (tmphook = Hooks[HOOKTYPE_PRE_LOCAL_QUIT_CHAN]; tmphook; tmphook = tmphook->next) { - newcomment = (*(tmphook->func.pcharfunc))(client, channel, comment); + newcomment = (*(tmphook->func.stringfunc))(client, channel, comment); if (!newcomment) break; } @@ -120,13 +126,21 @@ CMD_FUNC(cmd_quit) /* Comment changed? Then PART the user before we do the QUIT. */ if (comment != newcomment) { - char *parx[4]; + const char *parx[4]; + char tmp[512]; int ret; + parx[0] = NULL; - parx[1] = channel->chname; - parx[2] = newcomment; - parx[3] = NULL; + parx[1] = channel->name; + if (newcomment) + { + strlcpy(tmp, newcomment, sizeof(tmp)); + parx[2] = tmp; + parx[3] = NULL; + } else { + parx[2] = NULL; + } do_cmd(client, recv_mtags, "PART", newcomment ? 3 : 2, parx); /* This would be unusual, but possible (somewhere in the future perhaps): */ @@ -138,7 +152,7 @@ CMD_FUNC(cmd_quit) for (tmphook = Hooks[HOOKTYPE_PRE_LOCAL_QUIT]; tmphook; tmphook = tmphook->next) { - comment = (*(tmphook->func.pcharfunc))(client, comment); + comment = (*(tmphook->func.stringfunc))(client, comment); if (!comment) { comment = client->name; @@ -147,11 +161,11 @@ CMD_FUNC(cmd_quit) } if (PREFIX_QUIT) - snprintf(commentbuf, sizeof(commentbuf), "%s: %s", PREFIX_QUIT, comment); + snprintf(commentbuf2, sizeof(commentbuf2), "%s: %s", PREFIX_QUIT, comment); else - strlcpy(commentbuf, comment, sizeof(commentbuf)); + strlcpy(commentbuf2, comment, sizeof(commentbuf2)); - exit_client(client, recv_mtags, commentbuf); + exit_client(client, recv_mtags, commentbuf2); } else { diff --git a/src/modules/reply-tag.c b/src/modules/reply-tag.c index 0364c78..ef9e295 100644 --- a/src/modules/reply-tag.c +++ b/src/modules/reply-tag.c @@ -30,11 +30,11 @@ ModuleHeader MOD_HEADER "5.0", "+reply client tag", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; -int replytag_mtag_is_ok(Client *client, char *name, char *value); -void mtag_add_replytag(Client *client, MessageTag *recv_mtags, MessageTag **mtag_list, char *signature); +int replytag_mtag_is_ok(Client *client, const char *name, const char *value); +void mtag_add_replytag(Client *client, MessageTag *recv_mtags, MessageTag **mtag_list, const char *signature); MOD_INIT() { @@ -73,9 +73,9 @@ MOD_UNLOAD() /** This function verifies if the client sending the mtag is permitted to do so. */ -int replytag_mtag_is_ok(Client *client, char *name, char *value) +int replytag_mtag_is_ok(Client *client, const char *name, const char *value) { - char *p; + const char *p; /* Require a non-empty parameter */ if (BadPtr(value)) @@ -92,7 +92,7 @@ int replytag_mtag_is_ok(Client *client, char *name, char *value) return 1; /* OK */ } -void mtag_add_replytag(Client *client, MessageTag *recv_mtags, MessageTag **mtag_list, char *signature) +void mtag_add_replytag(Client *client, MessageTag *recv_mtags, MessageTag **mtag_list, const char *signature) { MessageTag *m; diff --git a/src/modules/reputation.c b/src/modules/reputation.c index 6a76881..0ca0064 100644 --- a/src/modules/reputation.c +++ b/src/modules/reputation.c @@ -64,7 +64,7 @@ ModuleHeader MOD_HEADER REPUTATION_VERSION, "Known IP's scoring system", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Defines */ @@ -81,9 +81,10 @@ ModuleHeader MOD_HEADER #define WARN_WRITE_ERROR(fname) \ do { \ - sendto_realops_and_log("[reputation] Error writing to temporary database file " \ - "'%s': %s (DATABASE NOT SAVED)", \ - fname, unrealdb_get_error_string()); \ + unreal_log(ULOG_ERROR, "reputation", "REPUTATION_FILE_WRITE_ERROR", NULL, \ + "[reputation] Error writing to temporary database file $filename: $system_error", \ + log_data_string("filename", fname), \ + log_data_string("system_error", unrealdb_get_error_string())); \ } while(0) #define W_SAFE(x) \ @@ -131,21 +132,21 @@ ModDataInfo *reputation_md; /* Module Data structure which we acquire */ /* Forward declarations */ void reputation_md_free(ModData *m); -char *reputation_md_serialize(ModData *m); -void reputation_md_unserialize(char *str, ModData *m); +const char *reputation_md_serialize(ModData *m); +void reputation_md_unserialize(const char *str, ModData *m); void reputation_config_setdefaults(struct cfgstruct *cfg); void reputation_free_config(struct cfgstruct *cfg); CMD_FUNC(reputation_cmd); CMD_FUNC(reputationunperm); -int reputation_whois(Client *client, Client *target); +int reputation_whois(Client *client, Client *target, NameValuePrioList **list); int reputation_set_on_connect(Client *client); int reputation_pre_lconnect(Client *client); int reputation_connect_extinfo(Client *client, NameValuePrioList **list); int reputation_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs); int reputation_config_run(ConfigFile *cf, ConfigEntry *ce, int type); int reputation_config_posttest(int *errs); -static uint64_t hash_reputation_entry(char *ip); -ReputationEntry *find_reputation_entry(char *ip); +static uint64_t hash_reputation_entry(const char *ip); +ReputationEntry *find_reputation_entry(const char *ip); void add_reputation_entry(ReputationEntry *e); EVENT(delete_old_records); EVENT(add_scores); @@ -162,7 +163,7 @@ MOD_TEST() reputation_config_setdefaults(&test); HookAdd(modinfo->handle, HOOKTYPE_CONFIGTEST, 0, reputation_config_test); HookAdd(modinfo->handle, HOOKTYPE_CONFIGPOSTTEST, 0, reputation_config_posttest); - CallbackAddEx(modinfo->handle, CALLBACKTYPE_REPUTATION_STARTTIME, reputation_starttime_callback); + CallbackAdd(modinfo->handle, CALLBACKTYPE_REPUTATION_STARTTIME, reputation_starttime_callback); return MOD_SUCCESS; } @@ -239,7 +240,7 @@ MOD_LOAD() MOD_UNLOAD() { - if (loop.ircd_terminating) + if (loop.terminating) reputation_save_db(); reputation_free_config(&test); reputation_free_config(&cfg); @@ -283,37 +284,37 @@ int reputation_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) return 0; /* We are only interrested in set::reputation.. */ - if (!ce || strcmp(ce->ce_varname, "reputation")) + if (!ce || strcmp(ce->name, "reputation")) return 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!cep->ce_vardata) + if (!cep->value) { config_error("%s:%i: blank set::reputation::%s without value", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_varname); + cep->file->filename, cep->line_number, cep->name); errors++; continue; } else - if (!strcmp(cep->ce_varname, "database")) + if (!strcmp(cep->name, "database")) { - convert_to_absolute_path(&cep->ce_vardata, PERMDATADIR); - safe_strdup(test.database, cep->ce_vardata); + convert_to_absolute_path(&cep->value, PERMDATADIR); + safe_strdup(test.database, cep->value); } else - if (!strcmp(cep->ce_varname, "db-secret")) + if (!strcmp(cep->name, "db-secret")) { - char *err; - if ((err = unrealdb_test_secret(cep->ce_vardata))) + const char *err; + if ((err = unrealdb_test_secret(cep->value))) { - config_error("%s:%i: set::channeldb::db-secret: %s", cep->ce_fileptr->cf_filename, cep->ce_varlinenum, err); + config_error("%s:%i: set::channeldb::db-secret: %s", cep->file->filename, cep->line_number, err); errors++; continue; } - safe_strdup(test.db_secret, cep->ce_vardata); + safe_strdup(test.db_secret, cep->value); } else { config_error("%s:%i: unknown directive set::reputation::%s", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_varname); + cep->file->filename, cep->line_number, cep->name); errors++; continue; } @@ -331,18 +332,18 @@ int reputation_config_run(ConfigFile *cf, ConfigEntry *ce, int type) return 0; /* We are only interrested in set::reputation.. */ - if (!ce || strcmp(ce->ce_varname, "reputation")) + if (!ce || strcmp(ce->name, "reputation")) return 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "database")) + if (!strcmp(cep->name, "database")) { - safe_strdup(cfg.database, cep->ce_vardata); + safe_strdup(cfg.database, cep->value); } else - if (!strcmp(cep->ce_varname, "db-secret")) + if (!strcmp(cep->name, "db-secret")) { - safe_strdup(cfg.db_secret, cep->ce_vardata); + safe_strdup(cfg.db_secret, cep->value); } } return 1; @@ -465,8 +466,9 @@ void reputation_load_db_old(void) #ifdef BENCHMARK gettimeofday(&tv_beta, NULL); - ircd_log(LOG_ERROR, "Reputation benchmark: LOAD DB: %lld microseconds", - (long long)(((tv_beta.tv_sec - tv_alpha.tv_sec) * 1000000) + (tv_beta.tv_usec - tv_alpha.tv_usec))); + unreal_log(ULOG_DEBUG, "reputation", "REPUTATION_BENCHMARK", NULL, + "[reputation] Benchmark: LOAD DB: $time_msec microseconds", + log_data_integer("time_msec", ((tv_beta.tv_sec - tv_alpha.tv_sec) * 1000000) + (tv_beta.tv_usec - tv_alpha.tv_usec))); #endif } @@ -529,8 +531,9 @@ int reputation_load_db_new(UnrealDB *db) unrealdb_close(db); #ifdef BENCHMARK gettimeofday(&tv_beta, NULL); - ircd_log(LOG_ERROR, "Reputation benchmark: LOAD DB: %lld microseconds", - (long long)(((tv_beta.tv_sec - tv_alpha.tv_sec) * 1000000) + (tv_beta.tv_usec - tv_alpha.tv_usec))); + unreal_log(ULOG_DEBUG, "reputation", "REPUTATION_BENCHMARK", NULL, + "Reputation benchmark: LOAD DB: $time_msec microseconds", + log_data_integer("time_msec", ((tv_beta.tv_sec - tv_alpha.tv_sec) * 1000000) + (tv_beta.tv_usec - tv_alpha.tv_usec))); #endif return 1; } @@ -656,8 +659,9 @@ write_fail: #ifdef BENCHMARK gettimeofday(&tv_beta, NULL); - ircd_log(LOG_ERROR, "Reputation benchmark: SAVE DB: %lld microseconds", - (long long)(((tv_beta.tv_sec - tv_alpha.tv_sec) * 1000000) + (tv_beta.tv_usec - tv_alpha.tv_usec))); + unreal_log(ULOG_DEBUG, "reputation", "REPUTATION_BENCHMARK", NULL, + "Reputation benchmark: SAVE DB: $time_msec microseconds", + log_data_integer("time_msec", ((tv_beta.tv_sec - tv_alpha.tv_sec) * 1000000) + (tv_beta.tv_usec - tv_alpha.tv_usec))); #endif return 1; @@ -677,7 +681,7 @@ int reputation_save_db(void) #endif #ifdef TEST - sendto_realops("REPUTATION IS RUNNING IN TEST MODE. SAVING DB'S..."); + unreal_log(ULOG_DEBUG, "reputation", "REPUTATION_TEST", NULL, "Reputation in running in test mode. Saving DB's...."); #endif /* Comment this out after one or more releases (means you cannot downgrade to <=5.0.9.1 anymore) */ @@ -741,13 +745,14 @@ int reputation_save_db(void) #ifdef BENCHMARK gettimeofday(&tv_beta, NULL); - ircd_log(LOG_ERROR, "Reputation benchmark: SAVE DB: %lld microseconds", - (long long)(((tv_beta.tv_sec - tv_alpha.tv_sec) * 1000000) + (tv_beta.tv_usec - tv_alpha.tv_usec))); + unreal_log(ULOG_DEBUG, "reputation", "REPUTATION_BENCHMARK", NULL, + "Reputation benchmark: SAVE DB: $time_msec microseconds", + log_data_integer("time_msec", ((tv_beta.tv_sec - tv_alpha.tv_sec) * 1000000) + (tv_beta.tv_usec - tv_alpha.tv_usec))); #endif return 1; } -static uint64_t hash_reputation_entry(char *ip) +static uint64_t hash_reputation_entry(const char *ip) { return siphash(ip, siphashkey_reputation) % REPUTATION_HASH_TABLE_SIZE; } @@ -759,7 +764,7 @@ void add_reputation_entry(ReputationEntry *e) AddListItem(e, ReputationHashTable[hashv]); } -ReputationEntry *find_reputation_entry(char *ip) +ReputationEntry *find_reputation_entry(const char *ip) { ReputationEntry *e; int hashv = hash_reputation_entry(ip); @@ -924,8 +929,11 @@ EVENT(delete_old_records) if (is_reputation_expired(e)) { #ifdef DEBUGMODE - ircd_log(LOG_ERROR, "Deleting expired entry for '%s' (score %hd, last seen %lld seconds ago)", - e->ip, e->score, (long long)(TStime() - e->last_seen)); + unreal_log(ULOG_DEBUG, "reputation", "REPUTATION_EXPIRY", NULL, + "Deleting expired entry for $ip (score $score, last seen $time_delta seconds ago)", + log_data_string("ip", e->ip), + log_data_integer("score", e->score), + log_data_integer("time_delta", TStime() - e->last_seen)); #endif DelListItem(e, ReputationHashTable[i]); safe_free(e); @@ -935,8 +943,9 @@ EVENT(delete_old_records) #ifdef BENCHMARK gettimeofday(&tv_beta, NULL); - ircd_log(LOG_ERROR, "Reputation benchmark: EXPIRY IN MEM: %lld microseconds", - (long long)(((tv_beta.tv_sec - tv_alpha.tv_sec) * 1000000) + (tv_beta.tv_usec - tv_alpha.tv_usec))); + unreal_log(ULOG_DEBUG, "reputation", "REPUTATION_BENCHMARK", NULL, + "Reputation benchmark: EXPIRY IN MEM: $time_msec microseconds", + log_data_integer("time_msec", ((tv_beta.tv_sec - tv_alpha.tv_sec) * 1000000) + (tv_beta.tv_usec - tv_alpha.tv_usec))); #endif } @@ -955,9 +964,9 @@ CMD_FUNC(reputationunperm) ModuleSetOptions(ModInf.handle, MOD_OPT_PERM, 0); - sendto_realops("%s used /REPUTATIONUNPERM. On next REHASH the module can be RELOADED or UNLOADED. " - "Note however that for a few minutes the scoring may be skipped, so don't do this too often.", - client->name); + unreal_log(ULOG_INFO, "reputation", "REPUTATIONUNPERM_COMMAND", client, + "$client used /REPUTATIONUNPERM. On next REHASH the module can be RELOADED or UNLOADED. " + "Note however that for a few minutes the scoring may be skipped, so don't do this too often."); } int reputation_connect_extinfo(Client *client, NameValuePrioList **list) @@ -989,7 +998,7 @@ void reputation_channel_query(Client *client, Channel *channel) int cnt = 0, i, j; ReputationEntry *e; - sendtxtnumeric(client, "Users and reputation scores for %s:", channel->chname); + sendtxtnumeric(client, "Users and reputation scores for %s:", channel->name); /* Step 1: build a list of nicks and their reputation */ nicks = safe_alloc((channel->users+1) * sizeof(char *)); @@ -1005,8 +1014,11 @@ void reputation_channel_query(Client *client, Channel *channel) } if (++cnt > channel->users) { - sendto_ops("[BUG] reputation_channel_query() expected %d users but %d (or more) were present in %s", - channel->users, cnt, channel->chname); + unreal_log(ULOG_WARNING, "bug", "REPUTATION_CHANNEL_QUERY_BUG", client, + "[BUG] reputation_channel_query() expected $expected_users users, but $found_users (or more) users were present in $channel", + log_data_integer("expected_users", channel->users), + log_data_integer("found_users", cnt), + log_data_string("channel", channel->name)); #ifdef DEBUGMODE abort(); #endif @@ -1083,7 +1095,7 @@ void reputation_list_query(Client *client, int maxscore) CMD_FUNC(reputation_user_cmd) { ReputationEntry *e; - char *ip; + const char *ip; if (!IsOper(client)) { @@ -1121,16 +1133,16 @@ CMD_FUNC(reputation_user_cmd) } else if (parv[1][0] == '#') { - Channel *channel = find_channel(parv[1], NULL); + Channel *channel = find_channel(parv[1]); if (!channel) { sendnumeric(client, ERR_NOSUCHCHANNEL, parv[1]); return; } /* corner case: ircop without proper permissions and not in channel */ - if (!ValidatePermissionsForPath("channel:see:names:invisible",client,NULL,NULL,NULL) && !get_access(client,channel)) + if (!ValidatePermissionsForPath("channel:see:names:invisible",client,NULL,NULL,NULL) && !IsMember(client,channel)) { - sendnumeric(client, ERR_NOTONCHANNEL, channel->chname); + sendnumeric(client, ERR_NOTONCHANNEL, channel->name); return; } reputation_channel_query(client, channel); @@ -1147,7 +1159,7 @@ CMD_FUNC(reputation_user_cmd) reputation_list_query(client, max); return; } else { - Client *target = find_person(parv[1], NULL); + Client *target = find_user(parv[1], NULL); if (!target) { sendnumeric(client, ERR_NOSUCHNICK, parv[1]); @@ -1206,7 +1218,7 @@ CMD_FUNC(reputation_user_cmd) CMD_FUNC(reputation_server_cmd) { ReputationEntry *e; - char *ip; + const char *ip; int score; int allow_reply; @@ -1239,8 +1251,11 @@ CMD_FUNC(reputation_server_cmd) */ sendto_one(client, NULL, ":%s REPUTATION %s *%d", me.id, parv[1], e->score); #ifdef DEBUGMODE - ircd_log(LOG_ERROR, "[reputation] Score for '%s' from %s is %d, but we have %d, sending back %d", - ip, client->name, score, e->score, e->score); + unreal_log(ULOG_DEBUG, "reputation", "REPUTATION_DIFFERS", client, + "Reputation score for for $ip from $client is $their_score, but we have $score, sending back $score", + log_data_string("ip", ip), + log_data_integer("their_score", score), + log_data_integer("score", e->score)); #endif score = e->score; /* Update for propagation in the non-client direction */ } @@ -1249,8 +1264,11 @@ CMD_FUNC(reputation_server_cmd) if (e && (score > e->score)) { #ifdef DEBUGMODE - ircd_log(LOG_ERROR, "[reputation] Score for '%s' from %s is %d, but we have %d, updating our score to %d", - ip, client->name, score, e->score, score); + unreal_log(ULOG_DEBUG, "reputation", "REPUTATION_DIFFERS", client, + "Reputation score for for $ip from $client is $their_score, but we have $score, updating our score to $score", + log_data_string("ip", ip), + log_data_integer("their_score", score), + log_data_integer("score", e->score)); #endif e->score = score; } @@ -1259,8 +1277,11 @@ CMD_FUNC(reputation_server_cmd) if (!e && (score > 0)) { #ifdef DEBUGMODE - ircd_log(LOG_ERROR, "[reputation] Score for '%s' from %s is %d, we had no entry, adding it", - ip, client->name, score); + unreal_log(ULOG_DEBUG, "reputation", "REPUTATION_NEW", client, + "Reputation score for for $ip from $client is $their_score, we had no entry, adding it", + log_data_string("ip", ip), + log_data_integer("their_score", score), + log_data_integer("score", 0)); #endif e = safe_alloc(sizeof(ReputationEntry)+strlen(ip)); strcpy(e->ip, ip); /* safe, see alloc above */ @@ -1286,18 +1307,19 @@ CMD_FUNC(reputation_cmd) reputation_server_cmd(client, recv_mtags, parc, parv); } -int reputation_whois(Client *client, Client *target) +int reputation_whois(Client *client, Client *target, NameValuePrioList **list) { - int reputation = Reputation(target); + int reputation; - if (!IsOper(client)) - return 0; /* only opers can see this.. */ + if (whois_get_policy(client, target, "reputation") != WHOIS_CONFIG_DETAILS_FULL) + return 0; + reputation = Reputation(target); if (reputation > 0) { - sendto_one(client, NULL, ":%s %d %s %s :is using an IP with a reputation score of %d", - me.name, RPL_WHOISSPECIAL, client->name, - target->name, reputation); + add_nvplist_numeric_fmt(list, 0, "reputation", client, RPL_WHOISSPECIAL, + "%s :is using an IP with a reputation score of %d", + target->name, reputation); } return 0; } @@ -1308,7 +1330,7 @@ void reputation_md_free(ModData *m) m->l = 0; } -char *reputation_md_serialize(ModData *m) +const char *reputation_md_serialize(ModData *m) { static char buf[32]; if (m->i == 0) @@ -1317,7 +1339,7 @@ char *reputation_md_serialize(ModData *m) return buf; } -void reputation_md_unserialize(char *str, ModData *m) +void reputation_md_unserialize(const char *str, ModData *m) { m->i = atoi(str); } diff --git a/src/modules/require-module.c b/src/modules/require-module.c index 8b74b10..ab80469 100644 --- a/src/modules/require-module.c +++ b/src/modules/require-module.c @@ -30,7 +30,7 @@ ModuleHeader MOD_HEADER = { "5.0.1", "Require/deny modules across the network", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; typedef struct _denymod DenyMod; @@ -187,50 +187,50 @@ int reqmods_configtest_deny(ConfigFile *cf, ConfigEntry *ce, int type, int *errs int has_name, has_reason; // We are only interested in deny module { } - if (strcmp(ce->ce_vardata, "module")) + if (strcmp(ce->value, "module")) return 0; has_name = has_reason = 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strlen(cep->ce_varname)) + if (!strlen(cep->name)) { - config_error("%s:%i: blank directive for deny module { } block", cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + config_error("%s:%i: blank directive for deny module { } block", cep->file->filename, cep->line_number); errors++; continue; } - if (!cep->ce_vardata || !strlen(cep->ce_vardata)) + if (!cep->value || !strlen(cep->value)) { - config_error("%s:%i: blank %s without value for deny module { } block", cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_varname); + config_error("%s:%i: blank %s without value for deny module { } block", cep->file->filename, cep->line_number, cep->name); errors++; continue; } - if (!strcmp(cep->ce_varname, "name")) + if (!strcmp(cep->name, "name")) { if (has_name) { - config_error("%s:%i: duplicate %s for deny module { } block", cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_varname); + config_error("%s:%i: duplicate %s for deny module { } block", cep->file->filename, cep->line_number, cep->name); continue; } // We do a loose check here because a module might not be fully loaded yet - if (find_modptr_byname(cep->ce_vardata, 0)) + if (find_modptr_byname(cep->value, 0)) { - config_error("[require-module] Module '%s' was specified as denied but we've actually loaded it ourselves", cep->ce_vardata); + config_error("[require-module] Module '%s' was specified as denied but we've actually loaded it ourselves", cep->value); errors++; } has_name = 1; continue; } - if (!strcmp(cep->ce_varname, "reason")) // Optional + if (!strcmp(cep->name, "reason")) // Optional { // Still check for duplicate directives though if (has_reason) { - config_error("%s:%i: duplicate %s for deny module { } block", cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_varname); + config_error("%s:%i: duplicate %s for deny module { } block", cep->file->filename, cep->line_number, cep->name); errors++; continue; } @@ -238,13 +238,13 @@ int reqmods_configtest_deny(ConfigFile *cf, ConfigEntry *ce, int type, int *errs continue; } - config_error("%s:%i: unknown directive %s for deny module { } block", cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_varname); + config_error("%s:%i: unknown directive %s for deny module { } block", cep->file->filename, cep->line_number, cep->name); errors++; } if (!has_name) { - config_error("%s:%i: missing required 'name' directive for deny module { } block", ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + config_error("%s:%i: missing required 'name' directive for deny module { } block", ce->file->filename, ce->line_number); errors++; } @@ -257,21 +257,21 @@ int reqmods_configrun_deny(ConfigFile *cf, ConfigEntry *ce, int type) ConfigEntry *cep; DenyMod *dmod; - if (strcmp(ce->ce_vardata, "module")) + if (strcmp(ce->value, "module")) return 0; dmod = safe_alloc(sizeof(DenyMod)); - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "name")) + if (!strcmp(cep->name, "name")) { - safe_strdup(dmod->name, cep->ce_vardata); + safe_strdup(dmod->name, cep->value); continue; } - if (!strcmp(cep->ce_varname, "reason")) + if (!strcmp(cep->name, "reason")) { - safe_strdup(dmod->reason, cep->ce_vardata); + safe_strdup(dmod->reason, cep->value); continue; } } @@ -290,37 +290,37 @@ int reqmods_configtest_require(ConfigFile *cf, ConfigEntry *ce, int type, int *e int has_name, has_minversion; // We are only interested in require module { } - if (strcmp(ce->ce_vardata, "module")) + if (strcmp(ce->value, "module")) return 0; has_name = has_minversion = 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strlen(cep->ce_varname)) + if (!strlen(cep->name)) { - config_error("%s:%i: blank directive for require module { } block", cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + config_error("%s:%i: blank directive for require module { } block", cep->file->filename, cep->line_number); errors++; continue; } - if (!cep->ce_vardata || !strlen(cep->ce_vardata)) + if (!cep->value || !strlen(cep->value)) { - config_error("%s:%i: blank %s without value for require module { } block", cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_varname); + config_error("%s:%i: blank %s without value for require module { } block", cep->file->filename, cep->line_number, cep->name); errors++; continue; } - if (!strcmp(cep->ce_varname, "name")) + if (!strcmp(cep->name, "name")) { if (has_name) { - config_error("%s:%i: duplicate %s for require module { } block", cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_varname); + config_error("%s:%i: duplicate %s for require module { } block", cep->file->filename, cep->line_number, cep->name); continue; } - if (!find_modptr_byname(cep->ce_vardata, 0)) + if (!find_modptr_byname(cep->value, 0)) { - config_error("[require-module] Module '%s' was specified as required but we didn't even load it ourselves (maybe double check the name?)", cep->ce_vardata); + config_error("[require-module] Module '%s' was specified as required but we didn't even load it ourselves (maybe double check the name?)", cep->value); errors++; } @@ -329,12 +329,12 @@ int reqmods_configtest_require(ConfigFile *cf, ConfigEntry *ce, int type, int *e continue; } - if (!strcmp(cep->ce_varname, "min-version")) // Optional + if (!strcmp(cep->name, "min-version")) // Optional { // Still check for duplicate directives though if (has_minversion) { - config_error("%s:%i: duplicate %s for require module { } block", cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_varname); + config_error("%s:%i: duplicate %s for require module { } block", cep->file->filename, cep->line_number, cep->name); errors++; continue; } @@ -343,13 +343,13 @@ int reqmods_configtest_require(ConfigFile *cf, ConfigEntry *ce, int type, int *e } // Reason directive is not used for require module { }, so error on that too - config_error("%s:%i: unknown directive %s for require module { } block", cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_varname); + config_error("%s:%i: unknown directive %s for require module { } block", cep->file->filename, cep->line_number, cep->name); errors++; } if (!has_name) { - config_error("%s:%i: missing required 'name' directive for require module { } block", ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + config_error("%s:%i: missing required 'name' directive for require module { } block", ce->file->filename, ce->line_number); errors++; } @@ -364,28 +364,28 @@ int reqmods_configrun_require(ConfigFile *cf, ConfigEntry *ce, int type) ReqMod *rmod; char *name, *minversion; - if (strcmp(ce->ce_vardata, "module")) + if (strcmp(ce->value, "module")) return 0; name = minversion = NULL; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "name")) + if (!strcmp(cep->name, "name")) { - if (!(mod = find_modptr_byname(cep->ce_vardata, 0))) + if (!(mod = find_modptr_byname(cep->value, 0))) { // Something went very wrong :D - config_warn("[require-module] [BUG?] Passed configtest_require() but not configrun_require() for module '%s' (seems to not be loaded after all)", cep->ce_vardata); + config_warn("[require-module] [BUG?] Passed configtest_require() but not configrun_require() for module '%s' (seems to not be loaded after all)", cep->value); continue; } - name = cep->ce_vardata; + name = cep->value; continue; } - if (!strcmp(cep->ce_varname, "min-version")) + if (!strcmp(cep->name, "min-version")) { - minversion = cep->ce_vardata; + minversion = cep->value; continue; } } @@ -443,7 +443,11 @@ CMD_FUNC(cmd_smod) if ((dmod = find_denymod_byname(name))) { // Send this particular notice to local opers only - sendto_umode_global(UMODE_OPER, "Server %s is using module '%s', which is specified in a deny module { } config block (reason: %s)", client->name, name, dmod->reason); + unreal_log(ULOG_ERROR, "link", "LINK_DENY_MODULE", client, + "Server $client is using module '$module_name', " + "which is specified in a deny module { } config block (reason: $ban_reason) -- aborting link", + log_data_string("module_name", name), + log_data_string("ban_reason", dmod->reason)); abort = 1; // Always SQUIT because it was explicitly denied by admins continue; } @@ -458,13 +462,21 @@ CMD_FUNC(cmd_smod) if (modflag == 'R') { // We don't need to check the version yet because there's nothing to compare it to, so we'll treat it as if no require module::min-version was specified - sendto_umode_global(UMODE_OPER, "Required module wasn't (fully) loaded or is missing entirely: %s", name); + unreal_log(ULOG_ERROR, "link", "LINK_MISSING_REQUIRED_MODULE", client, + "Server $me is missing module '$module_name' which " + "is required by server $client. -- aborting link", + log_data_client("me", &me), + log_data_string("module_name", name)); abort = 1; // Always SQUIT here too (explicitly required by admins) } - else if (modflag == 'G') - sendto_umode_global(UMODE_OPER, "[WARN] Module marked as global wasn't (fully) loaded or is missing entirely: %s", name); - + { + unreal_log(ULOG_WARNING, "link", "LINK_MISSING_GLOBAL_MODULE", client, + "Server $me is missing module '$module_name', which is " + "marked as global at $client", + log_data_client("me", &me), + log_data_string("module_name", name)); + } continue; } @@ -476,15 +488,21 @@ CMD_FUNC(cmd_smod) // An explicit version was specified in require module { } but our module version is less than that if (*version != '*' && strnatcasecmp(mod->header->version, version) < 0) { - sendto_umode_global(UMODE_OPER, "Module version mismatch for required module '%s' (should be equal to or greater than %s but we're running %s)", name, version, mod->header->version); + unreal_log(ULOG_ERROR, "link", "LINK_MODULE_OLD_VERSION", client, + "Server $me is using an old version of module '$module_name'. " + "Server $client requires us to have version $minimum_module_version or later (we have $our_module_version). " + "-- aborting link", + log_data_client("me", &me), + log_data_string("module_name", name), + log_data_string("minimum_module_version", version), + log_data_string("our_module_version", mod->header->version)); abort = 1; } } if (abort) { - sendto_umode_global(UMODE_OPER, "ABORTING LINK: %s <=> %s", me.name, client->name); - exit_client(client, NULL, "ABORTING LINK"); + exit_client_fmt(client, NULL, "Link aborted due to missing or banned modules (see previous errors)"); return; } } diff --git a/src/modules/restrict-commands.c b/src/modules/restrict-commands.c index f104cb6..1884bfb 100644 --- a/src/modules/restrict-commands.c +++ b/src/modules/restrict-commands.c @@ -24,7 +24,7 @@ ModuleHeader MOD_HEADER = { "1.0.2", "Restrict specific commands unless certain conditions have been met", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; typedef struct RestrictedCommand RestrictedCommand; @@ -45,14 +45,14 @@ typedef struct { } CmdMap; // Forward declarations -char *find_cmd_byconftag(char *conftag); -RestrictedCommand *find_restrictions_bycmd(char *cmd); -RestrictedCommand *find_restrictions_byconftag(char *conftag); +const char *find_cmd_byconftag(const char *conftag); +RestrictedCommand *find_restrictions_bycmd(const char *cmd); +RestrictedCommand *find_restrictions_byconftag(const char *conftag); int rcmd_configtest(ConfigFile *cf, ConfigEntry *ce, int type, int *errs); int rcmd_configrun(ConfigFile *cf, ConfigEntry *ce, int type); -int rcmd_can_send_to_channel(Client *client, Channel *channel, Membership *lp, char **msg, char **errmsg, SendType sendtype); -int rcmd_can_send_to_user(Client *client, Client *target, char **text, char **errmsg, SendType sendtype); -int rcmd_block_message(Client *client, char *text, SendType sendtype, char **errmsg, char *display, char *conftag); +int rcmd_can_send_to_channel(Client *client, Channel *channel, Membership *lp, const char **msg, const char **errmsg, SendType sendtype); +int rcmd_can_send_to_user(Client *client, Client *target, const char **text, const char **errmsg, SendType sendtype); +int rcmd_block_message(Client *client, const char *text, SendType sendtype, const char **errmsg, const char *display, const char *conftag); CMD_OVERRIDE_FUNC(rcmd_override); // Globals @@ -110,7 +110,7 @@ MOD_UNLOAD() return MOD_SUCCESS; } -char *find_cmd_byconftag(char *conftag) { +const char *find_cmd_byconftag(const char *conftag) { CmdMap *cmap; for (cmap = conf_cmdmaps; cmap->conftag; cmap++) { @@ -120,7 +120,7 @@ char *find_cmd_byconftag(char *conftag) { return NULL; } -RestrictedCommand *find_restrictions_bycmd(char *cmd) { +RestrictedCommand *find_restrictions_bycmd(const char *cmd) { RestrictedCommand *rcmd; for (rcmd = RestrictedCommandList; rcmd; rcmd = rcmd->next) { @@ -130,7 +130,7 @@ RestrictedCommand *find_restrictions_bycmd(char *cmd) { return NULL; } -RestrictedCommand *find_restrictions_byconftag(char *conftag) { +RestrictedCommand *find_restrictions_byconftag(const char *conftag) { RestrictedCommand *rcmd; for (rcmd = RestrictedCommandList; rcmd; rcmd = rcmd->next) { @@ -150,17 +150,17 @@ int rcmd_configtest(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) if (type != CONFIG_SET) return 0; - if (!ce || strcmp(ce->ce_varname, "restrict-commands")) + if (!ce || strcmp(ce->name, "restrict-commands")) return 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - for (cep2 = cep->ce_entries; cep2; cep2 = cep2->ce_next) + for (cep2 = cep->items; cep2; cep2 = cep2->next) { - if (!strcmp(cep2->ce_varname, "disable")) + if (!strcmp(cep2->name, "disable")) { config_warn("%s:%i: set::restrict-commands::%s: the 'disable' option has been removed.", - cep2->ce_fileptr->cf_filename, cep2->ce_varlinenum, cep->ce_varname); + cep2->file->filename, cep2->line_number, cep->name); if (!warn_disable) { config_warn("Simply remove 'disable yes;' from the configuration file and " @@ -170,45 +170,45 @@ int rcmd_configtest(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) continue; } - if (!cep2->ce_vardata) + if (!cep2->value) { - config_error("%s:%i: blank set::restrict-commands::%s:%s without value", cep2->ce_fileptr->cf_filename, cep2->ce_varlinenum, cep->ce_varname, cep2->ce_varname); + config_error("%s:%i: blank set::restrict-commands::%s:%s without value", cep2->file->filename, cep2->line_number, cep->name, cep2->name); errors++; continue; } - if (!strcmp(cep2->ce_varname, "connect-delay")) + if (!strcmp(cep2->name, "connect-delay")) { - long v = config_checkval(cep2->ce_vardata, CFG_TIME); + long v = config_checkval(cep2->value, CFG_TIME); if ((v < 1) || (v > 3600)) { - config_error("%s:%i: set::restrict-commands::%s::connect-delay should be in range 1-3600", cep2->ce_fileptr->cf_filename, cep2->ce_varlinenum, cep->ce_varname); + config_error("%s:%i: set::restrict-commands::%s::connect-delay should be in range 1-3600", cep2->file->filename, cep2->line_number, cep->name); errors++; } continue; } - if (!strcmp(cep2->ce_varname, "exempt-identified")) + if (!strcmp(cep2->name, "exempt-identified")) continue; - if (!strcmp(cep2->ce_varname, "exempt-webirc")) + if (!strcmp(cep2->name, "exempt-webirc")) continue; - if (!strcmp(cep2->ce_varname, "exempt-tls")) + if (!strcmp(cep2->name, "exempt-tls")) continue; - if (!strcmp(cep2->ce_varname, "exempt-reputation-score")) + if (!strcmp(cep2->name, "exempt-reputation-score")) { - int v = atoi(cep2->ce_vardata); + int v = atoi(cep2->value); if (v <= 0) { - config_error("%s:%i: set::restrict-commands::%s::exempt-reputation-score must be greater than 0", cep2->ce_fileptr->cf_filename, cep2->ce_varlinenum, cep->ce_varname); + config_error("%s:%i: set::restrict-commands::%s::exempt-reputation-score must be greater than 0", cep2->file->filename, cep2->line_number, cep->name); errors++; } continue; } - config_error("%s:%i: unknown directive set::restrict-commands::%s::%s", cep2->ce_fileptr->cf_filename, cep2->ce_varlinenum, cep->ce_varname, cep2->ce_varname); + config_error("%s:%i: unknown directive set::restrict-commands::%s::%s", cep2->file->filename, cep2->line_number, cep->name, cep2->name); errors++; } } @@ -220,24 +220,24 @@ int rcmd_configtest(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) int rcmd_configrun(ConfigFile *cf, ConfigEntry *ce, int type) { ConfigEntry *cep, *cep2; - char *cmd, *conftag; + const char *cmd, *conftag; RestrictedCommand *rcmd; // We are only interested in set::restrict-commands if (type != CONFIG_SET) return 0; - if (!ce || strcmp(ce->ce_varname, "restrict-commands")) + if (!ce || strcmp(ce->name, "restrict-commands")) return 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { // May need to switch some stuff around for special cases where the config directive doesn't match the actual command conftag = NULL; - if ((cmd = find_cmd_byconftag(cep->ce_varname))) - conftag = cep->ce_varname; + if ((cmd = find_cmd_byconftag(cep->name))) + conftag = cep->name; else - cmd = cep->ce_varname; + cmd = cep->name; // Try to add override before even allocating the struct so we can bail early // Also don't override anything from the conf_cmdmaps[] list because those are handled through hooks instead @@ -250,7 +250,7 @@ int rcmd_configrun(ConfigFile *cf, ConfigEntry *ce, int type) continue; } - if (!CommandOverrideAdd(ModInf.handle, cmd, rcmd_override)) + if (!CommandOverrideAdd(ModInf.handle, cmd, 0, rcmd_override)) { config_warn("[restrict-commands] Failed to add override for '%s' (NO RESTRICTIONS APPLY)", cmd); continue; @@ -260,38 +260,38 @@ int rcmd_configrun(ConfigFile *cf, ConfigEntry *ce, int type) rcmd = safe_alloc(sizeof(RestrictedCommand)); safe_strdup(rcmd->cmd, cmd); safe_strdup(rcmd->conftag, conftag); - for (cep2 = cep->ce_entries; cep2; cep2 = cep2->ce_next) + for (cep2 = cep->items; cep2; cep2 = cep2->next) { - if (!cep2->ce_vardata) + if (!cep2->value) continue; - if (!strcmp(cep2->ce_varname, "connect-delay")) + if (!strcmp(cep2->name, "connect-delay")) { - rcmd->connect_delay = config_checkval(cep2->ce_vardata, CFG_TIME); + rcmd->connect_delay = config_checkval(cep2->value, CFG_TIME); continue; } - if (!strcmp(cep2->ce_varname, "exempt-identified")) + if (!strcmp(cep2->name, "exempt-identified")) { - rcmd->exempt_identified = config_checkval(cep2->ce_vardata, CFG_YESNO); + rcmd->exempt_identified = config_checkval(cep2->value, CFG_YESNO); continue; } - if (!strcmp(cep2->ce_varname, "exempt-webirc")) + if (!strcmp(cep2->name, "exempt-webirc")) { - rcmd->exempt_webirc = config_checkval(cep2->ce_vardata, CFG_YESNO); + rcmd->exempt_webirc = config_checkval(cep2->value, CFG_YESNO); continue; } - if (!strcmp(cep2->ce_varname, "exempt-tls")) + if (!strcmp(cep2->name, "exempt-tls")) { - rcmd->exempt_tls = config_checkval(cep2->ce_vardata, CFG_YESNO); + rcmd->exempt_tls = config_checkval(cep2->value, CFG_YESNO); continue; } - if (!strcmp(cep2->ce_varname, "exempt-reputation-score")) + if (!strcmp(cep2->name, "exempt-reputation-score")) { - rcmd->exempt_reputation_score = atoi(cep2->ce_vardata); + rcmd->exempt_reputation_score = atoi(cep2->value); continue; } } @@ -313,12 +313,12 @@ int rcmd_canbypass(Client *client, RestrictedCommand *rcmd) return 1; if (rcmd->exempt_reputation_score > 0 && (GetReputation(client) >= rcmd->exempt_reputation_score)) return 1; - if (rcmd->connect_delay && client->local && (TStime() - client->local->firsttime >= rcmd->connect_delay)) + if (rcmd->connect_delay && client->local && (TStime() - client->local->creationtime >= rcmd->connect_delay)) return 1; return 0; } -int rcmd_can_send_to_channel(Client *client, Channel *channel, Membership *lp, char **msg, char **errmsg, SendType sendtype) +int rcmd_can_send_to_channel(Client *client, Channel *channel, Membership *lp, const char **msg, const char **errmsg, SendType sendtype) { if (rcmd_block_message(client, *msg, sendtype, errmsg, "channel", (sendtype == SEND_TYPE_NOTICE ? "channel-notice" : "channel-message"))) return HOOK_DENY; @@ -326,7 +326,7 @@ int rcmd_can_send_to_channel(Client *client, Channel *channel, Membership *lp, c return HOOK_CONTINUE; } -int rcmd_can_send_to_user(Client *client, Client *target, char **text, char **errmsg, SendType sendtype) +int rcmd_can_send_to_user(Client *client, Client *target, const char **text, const char **errmsg, SendType sendtype) { // Need a few extra exceptions for user messages only =] if ((client == target) || IsULine(target)) @@ -338,7 +338,7 @@ int rcmd_can_send_to_user(Client *client, Client *target, char **text, char **er return HOOK_CONTINUE; } -int rcmd_block_message(Client *client, char *text, SendType sendtype, char **errmsg, char *display, char *conftag) +int rcmd_block_message(Client *client, const char *text, SendType sendtype, const char **errmsg, const char *display, const char *conftag) { RestrictedCommand *rcmd; static char errbuf[256]; diff --git a/src/modules/rmtkl.c b/src/modules/rmtkl.c index 8ba0f64..fd97b27 100644 --- a/src/modules/rmtkl.c +++ b/src/modules/rmtkl.c @@ -24,7 +24,7 @@ ModuleHeader MOD_HEADER = { "1.4", "Adds /rmtkl command to easily remove *-Lines in bulk", "Gottem and the UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; #define IsParam(x) (parc > (x) && !BadPtr(parv[(x)])) @@ -37,10 +37,10 @@ typedef struct { char *operpriv; } TKLType; -static void dump_str(Client *client, char **buf); +static void dump_str(Client *client, const char **buf); static TKLType *find_TKLType_by_flag(char flag); -void rmtkl_check_options(char *param, int *skipperm, int *silent); -int rmtkl_tryremove(Client *client, TKLType *tkltype, TKL *tkl, char *uhmask, char *commentmask, int skipperm, int silent); +void rmtkl_check_options(const char *param, int *skipperm, int *silent); +int rmtkl_tryremove(Client *client, TKLType *tkltype, TKL *tkl, const char *uhmask, const char *commentmask, int skipperm, int silent); CMD_FUNC(rmtkl); TKLType tkl_types[] = { @@ -53,7 +53,7 @@ TKLType tkl_types[] = { { 0, 0, "Unknown *-Line", 0 }, }; -static char *rmtkl_help[] = { +static const char *rmtkl_help[] = { "*** \002Help on /rmtkl\002 *** ", "Removes all TKLs matching the given conditions from the local server, or the entire", "network if it's a global-type ban.", @@ -104,7 +104,7 @@ MOD_UNLOAD() return MOD_SUCCESS; } -static void dump_str(Client *client, char **buf) +static void dump_str(Client *client, const char **buf) { if (!MyUser(client)) return; @@ -114,7 +114,7 @@ static void dump_str(Client *client, char **buf) sendto_one(client, NULL, ":%s %03d %s :%s", me.name, RPL_TEXT, client->name, *buf); // Let user take 8 seconds to read it - client->local->since += 8; + add_fake_lag(client, 8000); } static TKLType *find_TKLType_by_flag(char flag) @@ -126,14 +126,14 @@ static TKLType *find_TKLType_by_flag(char flag) return t; } -void rmtkl_check_options(char *param, int *skipperm, int *silent) { +void rmtkl_check_options(const char *param, int *skipperm, int *silent) { if (!strcasecmp("-skipperm", param)) *skipperm = 1; if (!strcasecmp("-silent", param)) *silent = 1; } -int rmtkl_tryremove(Client *client, TKLType *tkltype, TKL *tkl, char *uhmask, char *commentmask, int skipperm, int silent) +int rmtkl_tryremove(Client *client, TKLType *tkltype, TKL *tkl, const char *uhmask, const char *commentmask, int skipperm, int silent) { if (tkl->type != tkltype->type) return 0; @@ -171,7 +171,7 @@ int rmtkl_tryremove(Client *client, TKLType *tkltype, TKL *tkl, char *uhmask, ch if (!silent) sendnotice_tkl_del(client->name, tkl); - RunHook2(HOOKTYPE_TKL_DEL, client, tkl); + RunHook(HOOKTYPE_TKL_DEL, client, tkl); if (tkl->type & TKL_SHUN) tkl_check_local_remove_shun(tkl); @@ -183,7 +183,7 @@ CMD_FUNC(rmtkl) { TKL *tkl, *next; TKLType *tkltype; - char *types, *uhmask, *commentmask, *p; + const char *types, *uhmask, *commentmask, *p; char tklchar; int tklindex, tklindex2, skipperm, silent; unsigned int count; @@ -289,5 +289,7 @@ CMD_FUNC(rmtkl) } } - sendto_snomask(SNO_TKL, "*** %s removed %d TKLine(s) using /rmtkl", client->name, count); + unreal_log(ULOG_INFO, "tkl", "RMTKL_COMMAND", client, + "[rmtkl] $client removed $tkl_removed_count TKLine(s) using /RMTKL", + log_data_integer("tkl_removed_count", count)); } diff --git a/src/modules/rules.c b/src/modules/rules.c index 8c09287..2845af7 100644 --- a/src/modules/rules.c +++ b/src/modules/rules.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", "command /rules", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -63,14 +63,14 @@ CMD_FUNC(cmd_rules) temp = NULL; - if (hunt_server(client, recv_mtags, ":%s RULES :%s", 1, parc, parv) != HUNTED_ISME) + if (hunt_server(client, recv_mtags, "RULES", 1, parc, parv) != HUNTED_ISME) return; ptr = find_tld(client); if (ptr) temp = ptr->rules.lines; - if(!temp) + if (!temp) temp = rules.lines; if (temp == NULL) diff --git a/src/modules/sajoin.c b/src/modules/sajoin.c index 57bd4e1..6f8767a 100644 --- a/src/modules/sajoin.c +++ b/src/modules/sajoin.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", "command /sajoin", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -52,6 +52,13 @@ MOD_UNLOAD() return MOD_SUCCESS; } +static void log_sajoin(Client *client, Client *target, const char *channels) +{ + unreal_log(ULOG_INFO, "sacmds", "SAJOIN_COMMAND", client, "SAJOIN: $client used SAJOIN to make $target join $channels", + log_data_client("target", target), + log_data_string("channels", channels)); +} + /* cmd_sajoin() - Lamego - Wed Jul 21 20:04:48 1999 Copied off PTlink IRCd (C) PTlink coders team. Coded for Sadmin by Stskeeps @@ -62,10 +69,8 @@ MOD_UNLOAD() CMD_FUNC(cmd_sajoin) { Client *target; + char request[BUFSIZE]; char jbuf[BUFSIZE]; - char mode = '\0'; - char sjmode = '\0'; - char *mode_args[3]; int did_anything = 0; int ntargets = 0; int maxtargets = max_targets_for_command("SAJOIN"); @@ -76,7 +81,7 @@ CMD_FUNC(cmd_sajoin) return; } - if (!(target = find_person(parv[1], NULL))) + if (!(target = find_user(parv[1], NULL))) { sendnumeric(client, ERR_NOSUCHNICK, parv[1]); return; @@ -89,32 +94,35 @@ CMD_FUNC(cmd_sajoin) return; } + /* Broadcast so other servers can log it appropriately as an SAJOIN */ + sendto_server(client, 0, 0, recv_mtags, ":%s SAJOIN %s %s", client->id, target->id, parv[2]); + /* If it's not for our client, then simply pass on the message... */ if (!MyUser(target)) { - sendto_one(target, NULL, ":%s SAJOIN %s %s", client->id, target->id, parv[2]); - - /* Logging function added by XeRXeS */ - ircd_log(LOG_SACMDS,"SAJOIN: %s used SAJOIN to make %s join %s", - client->name, target->name, parv[2]); - + log_sajoin(client, target, parv[2]); return; } + /* 'target' is our client... */ + /* Can't this just use do_join() or something with a parameter to bypass some checks? * This duplicate code is damn ugly. Ah well.. */ { char *name, *p = NULL; - int i, parted = 0; + int parted = 0; *jbuf = 0; /* Now works like cmd_join */ - for (i = 0, name = strtoken(&p, parv[2], ","); name; name = strtoken(&p, NULL, ",")) + strlcpy(request, parv[2], sizeof(request)); + for (name = strtoken(&p, request, ","); name; name = strtoken(&p, NULL, ",")) { Channel *channel; Membership *lp; + char mode = '\0'; + char prefix = '\0'; if (++ntargets > maxtargets) { @@ -122,38 +130,11 @@ CMD_FUNC(cmd_sajoin) break; } - switch (name[0]) + mode = prefix_to_mode(*name); + if (mode) { -#ifdef PREFIX_AQ - case '~': - mode = 'q'; - sjmode = '~'; - ++name; - break; - case '&': - mode = 'a'; - sjmode = '&'; - ++name; - break; -#endif - case '@': - mode = 'o'; - sjmode = '@'; - ++name; - break; - case '%': - mode = 'h'; - sjmode = '%'; - ++name; - break; - case '+': - mode = 'v'; - sjmode = '+'; - ++name; - break; - default: - mode = sjmode = '\0'; /* make sure sjmode is 0. */ - break; + prefix = *name; + name++; /* skip the prefix */ } if (strlen(name) > CHANNELLEN) @@ -162,10 +143,9 @@ CMD_FUNC(cmd_sajoin) continue; } - if (*name == '0' && !atoi(name) && !sjmode) + if (*name == '0' && !atoi(name) && !mode) { - strcpy(jbuf, "0"); - i = 1; + strlcpy(jbuf, "0", sizeof(jbuf)); parted = 1; continue; } @@ -176,7 +156,7 @@ CMD_FUNC(cmd_sajoin) continue; } - channel = get_channel(target, name, 0); + channel = make_channel(name); /* If this _specific_ channel is not permitted, skip it */ if (!IsULine(client) && !ValidatePermissionsForPath("sacmd:sajoin",client,target,channel,NULL)) @@ -191,25 +171,36 @@ CMD_FUNC(cmd_sajoin) continue; } if (*jbuf) - strlcat(jbuf, ",", sizeof jbuf); - strlncat(jbuf, name, sizeof jbuf, sizeof(jbuf) - i - 1); - i += strlen(name) + 1; + strlcat(jbuf, ",", sizeof(jbuf)); + if (prefix) + strlcat_letter(jbuf, prefix, sizeof(jbuf)); + strlcat(jbuf, name, sizeof(jbuf)); } if (!*jbuf) return; - i = 0; - strcpy(parv[2], jbuf); + + strlcpy(request, jbuf, sizeof(request)); *jbuf = 0; - for (name = strtoken(&p, parv[2], ","); name; name = strtoken(&p, NULL, ",")) + for (name = strtoken(&p, request, ","); name; name = strtoken(&p, NULL, ",")) { MessageTag *mtags = NULL; - int flags; + const char *member_modes; Channel *channel; Membership *lp; Hook *h; int i = 0; + char mode = '\0'; + char prefix = '\0'; - if (*name == '0' && !atoi(name) && !sjmode) + mode = prefix_to_mode(*name); + if (mode != '\0') + { + /* Yup, it was a real prefix. */ + prefix = *name; + name++; + } + + if (*name == '0' && !atoi(name) && !mode) { /* Rewritten so to generate a PART for each channel to servers, * so the same msgid is used for each part on all servers. -- Syzop @@ -223,18 +214,18 @@ CMD_FUNC(cmd_sajoin) new_message(target, NULL, &mtags); sendto_channel(channel, target, NULL, 0, 0, SEND_LOCAL, mtags, ":%s PART %s :%s", - target->name, channel->chname, "Left all channels"); - sendto_server(NULL, 0, 0, mtags, ":%s PART %s :Left all channels", target->name, channel->chname); + target->name, channel->name, "Left all channels"); + sendto_server(NULL, 0, 0, mtags, ":%s PART %s :Left all channels", target->name, channel->name); if (MyConnect(target)) - RunHook4(HOOKTYPE_LOCAL_PART, target, channel, mtags, "Left all channels"); + RunHook(HOOKTYPE_LOCAL_PART, target, channel, mtags, "Left all channels"); free_message_tags(mtags); - remove_user_from_channel(target, channel); + remove_user_from_channel(target, channel, 0); } - strcpy(jbuf, "0"); + strlcpy(jbuf, "0", sizeof(jbuf)); continue; } - flags = (ChannelExists(name)) ? CHFL_DEOPPED : LEVEL_ON_JOIN; - channel = get_channel(target, name, CREATE); + member_modes = (ChannelExists(name)) ? "" : LEVEL_ON_JOIN; + channel = make_channel(name); if (channel && (lp = find_membership_link(target->user->channel, channel))) continue; @@ -255,19 +246,26 @@ CMD_FUNC(cmd_sajoin) * Each with their own unique msgid. */ new_message(target, NULL, &mtags); - join_channel(channel, target, mtags, flags); - if (sjmode) + join_channel(channel, target, mtags, member_modes); + if (prefix) { + char *modes; + const char *mode_args[3]; + opermode = 0; sajoinmode = 1; - mode_args[0] = safe_alloc(2); - mode_args[0][0] = mode; - mode_args[0][1] = '\0'; + + modes = safe_alloc(2); + modes[0] = mode; + + mode_args[0] = modes; mode_args[1] = target->name; mode_args[2] = 0; + do_mode(channel, target, NULL, 3, mode_args, 0, 1); + sajoinmode = 0; - safe_free(mode_args[0]); + safe_free(modes); } free_message_tags(mtags); did_anything = 1; @@ -275,5 +273,11 @@ CMD_FUNC(cmd_sajoin) strlcat(jbuf, ",", sizeof jbuf); strlcat(jbuf, name, sizeof jbuf); } + + if (did_anything) + { + //sendnotice(target, "*** You were forced to join %s", jbuf); + log_sajoin(client, target, jbuf); + } } } diff --git a/src/modules/samode.c b/src/modules/samode.c index 7dc48b8..9ca4396 100644 --- a/src/modules/samode.c +++ b/src/modules/samode.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", "command /samode", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -68,7 +68,7 @@ CMD_FUNC(cmd_samode) return; } - channel = find_channel(parv[1], NULL); + channel = find_channel(parv[1]); if (!channel) { sendnumeric(client, ERR_NOSUCHCHANNEL, parv[1]); diff --git a/src/modules/sapart.c b/src/modules/sapart.c index d783fdd..6008389 100644 --- a/src/modules/sapart.c +++ b/src/modules/sapart.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", "command /sapart", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -52,6 +52,24 @@ MOD_UNLOAD() return MOD_SUCCESS; } +static void log_sapart(Client *client, Client *target, const char *channels, const char *comment) +{ + if (comment) + { + unreal_log(ULOG_INFO, "sacmds", "SAPART_COMMAND", client, "SAPART: $client used SAPART to make $target part $channels ($reason)", + log_data_client("target", target), + log_data_string("channels", channels), + log_data_string("reason", comment)); + } + else + { + unreal_log(ULOG_INFO, "sacmds", "SAPART_COMMAND", client, "SAPART: $client used SAPART to make $target part $channels", + log_data_client("target", target), + log_data_string("channels", channels)); + } +} + + /* cmd_sapart() - Lamego - Wed Jul 21 20:04:48 1999 Copied off PTlink IRCd (C) PTlink coders team. Coded for Sadmin by Stskeeps @@ -68,8 +86,9 @@ CMD_FUNC(cmd_sapart) Membership *lp; char *name, *p = NULL; int i; - char *comment = (parc > 3 && parv[3] ? parv[3] : NULL); + const char *comment = (parc > 3 && parv[3] ? parv[3] : NULL); char commentx[512]; + char request[BUFSIZE]; char jbuf[BUFSIZE]; int ntargets = 0; int maxtargets = max_targets_for_command("SAPART"); @@ -80,7 +99,7 @@ CMD_FUNC(cmd_sapart) return; } - if (!(target = find_person(parv[1], NULL))) + if (!(target = find_user(parv[1], NULL))) { sendnumeric(client, ERR_NOSUCHNICK, parv[1]); return; @@ -93,37 +112,33 @@ CMD_FUNC(cmd_sapart) return; } - /* Relay it on, if it's not my target */ + /* Broadcast so other servers can log it appropriately as an SAPART */ + if (parv[3]) + sendto_server(client, 0, 0, recv_mtags, ":%s SAPART %s %s :%s", client->id, target->id, parv[2], comment); + else + sendto_server(client, 0, 0, recv_mtags, ":%s SAPART %s %s", client->id, target->id, parv[2]); + if (!MyUser(target)) { - if (comment) - { - sendto_one(target, NULL, ":%s SAPART %s %s :%s", client->id, target->id, parv[2], comment); - ircd_log(LOG_SACMDS,"SAPART: %s used SAPART to make %s part %s (%s)", - client->name, target->name, parv[2], comment); - } - else - { - sendto_one(target, NULL, ":%s SAPART %s %s", client->id, target->id, parv[2]); - ircd_log(LOG_SACMDS,"SAPART: %s used SAPART to make %s part %s", - client->name, target->name, parv[2]); - } + log_sapart(client, target, parv[2], comment); return; } - /* Now works like cmd_join */ + /* 'target' is our client... */ + *jbuf = 0; - for (i = 0, name = strtoken(&p, parv[2], ","); name; name = strtoken(&p, NULL, ",")) + strlcpy(request, parv[2], sizeof(request)); + for (i = 0, name = strtoken(&p, request, ","); name; name = strtoken(&p, NULL, ",")) { if (++ntargets > maxtargets) { sendnumeric(client, ERR_TOOMANYTARGETS, name, maxtargets, "SAPART"); break; } - if (!(channel = get_channel(target, name, 0))) + + if (!(channel = find_channel(name))) { - sendnumeric(client, ERR_NOSUCHCHANNEL, - name); + sendnumeric(client, ERR_NOSUCHCHANNEL, name); continue; } @@ -148,17 +163,24 @@ CMD_FUNC(cmd_sapart) if (!*jbuf) return; - strcpy(parv[2], jbuf); + strlcpy(request, jbuf, sizeof(request)); + + log_sapart(client, target, request, comment); if (comment) { - strcpy(commentx, "SAPart: "); - strlcat(commentx, comment, 512); + snprintf(commentx, sizeof(commentx), "SAPart: %s", comment); + //sendnotice(target, "*** You were forced to part %s (%s)", request, commentx); + } else { + //sendnotice(target, "*** You were forced to part %s", request); } parv[0] = target->name; // nick - parv[1] = parv[2]; // chan + parv[1] = request; // chan parv[2] = comment ? commentx : NULL; // comment + + /* Now, do the actual parting: */ do_cmd(target, NULL, "PART", comment ? 3 : 2, parv); - /* target may be killed now due to the part reason @ spamfilter */ + + /* NOTE: target may be killed now due to the part reason @ spamfilter */ } diff --git a/src/modules/sasl.c b/src/modules/sasl.c index cceb9fe..c764bbc 100644 --- a/src/modules/sasl.c +++ b/src/modules/sasl.c @@ -25,17 +25,17 @@ ModuleHeader MOD_HEADER = { "sasl", - "5.0", + "5.2.1", "SASL", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Forward declarations */ void saslmechlist_free(ModData *m); -char *saslmechlist_serialize(ModData *m); -void saslmechlist_unserialize(char *str, ModData *m); -char *sasl_capability_parameter(Client *client); +const char *saslmechlist_serialize(ModData *m); +void saslmechlist_unserialize(const char *str, ModData *m); +const char *sasl_capability_parameter(Client *client); int sasl_server_synced(Client *client); int sasl_account_login(Client *client, MessageTag *mtags); EVENT(sasl_timeout); @@ -69,14 +69,15 @@ int sasl_account_login(Client *client, MessageTag *mtags) { if (!MyConnect(client)) return 0; + /* Notify user */ - if (client->user->svid[0] != '0') + if (IsLoggedIn(client)) { sendnumeric(client, RPL_LOGGEDIN, BadPtr(client->name) ? "*" : client->name, BadPtr(client->user->username) ? "*" : client->user->username, BadPtr(client->user->realhost) ? "*" : client->user->realhost, - client->user->svid, client->user->svid); + client->user->account, client->user->account); } else { @@ -93,13 +94,13 @@ int sasl_account_login(Client *client, MessageTag *mtags) * * parv[1]: propagation mask * parv[2]: target - * parv[3]: ESVID + * parv[3]: account name (SVID) */ CMD_FUNC(cmd_svslogin) { Client *target; - if (!SASL_SERVER || MyUser(client) || (parc < 3) || !parv[3]) + if (MyUser(client) || (parc < 3) || !parv[3]) return; /* We actually ignore parv[1] since this is a broadcast message. @@ -116,7 +117,7 @@ CMD_FUNC(cmd_svslogin) if (target->user == NULL) make_user(target); - strlcpy(target->user->svid, parv[3], sizeof(target->user->svid)); + strlcpy(target->user->account, parv[3], sizeof(target->user->account)); user_account_login(recv_mtags, target); if (MyConnect(target) && IsDead(target)) return; /* was killed due to *LINE on ~a probably */ @@ -169,7 +170,7 @@ CMD_FUNC(cmd_sasl) if (*parv[3] == 'C') { - RunHookReturn2(HOOKTYPE_SASL_CONTINUATION, target, parv[4], !=0); + RunHookReturn(HOOKTYPE_SASL_CONTINUATION, !=0, target, parv[4]); sendto_one(target, NULL, "AUTHENTICATE %s", parv[4]); } else if (*parv[3] == 'D') @@ -178,15 +179,15 @@ CMD_FUNC(cmd_sasl) if (*parv[4] == 'F') { target->local->sasl_sent_time = 0; - target->local->since += 7; /* bump fakelag due to failed authentication attempt */ - RunHookReturn2(HOOKTYPE_SASL_RESULT, target, 0, !=0); + add_fake_lag(target, 7000); /* bump fakelag due to failed authentication attempt */ + RunHookReturn(HOOKTYPE_SASL_RESULT, !=0, target, 0); sendnumeric(target, ERR_SASLFAIL); } else if (*parv[4] == 'S') { target->local->sasl_sent_time = 0; target->local->sasl_complete++; - RunHookReturn2(HOOKTYPE_SASL_RESULT, target, 1, !=0); + RunHookReturn(HOOKTYPE_SASL_RESULT, !=0, target, 1); sendnumeric(target, RPL_SASLSUCCESS); } } @@ -232,7 +233,7 @@ CMD_FUNC(cmd_authenticate) if (agent_p == NULL) { char *addr = BadPtr(client->ip) ? "0" : client->ip; - char *certfp = moddata_client_get(client, "certfp"); + const char *certfp = moddata_client_get(client, "certfp"); sendto_server(NULL, 0, 0, NULL, ":%s SASL %s %s H %s %s", me.name, SASL_SERVER, client->id, addr, addr); @@ -308,7 +309,7 @@ int sasl_connect(Client *client) return abort_sasl(client); } -int sasl_quit(Client *client, MessageTag *mtags, char *comment) +int sasl_quit(Client *client, MessageTag *mtags, const char *comment) { return abort_sasl(client); } @@ -335,14 +336,9 @@ void auto_discover_sasl_server(int justlinked) /* SASL server found */ if (justlinked) { - /* Let's send this message only on link and not also on /rehash */ - sendto_realops("Services server '%s' provides SASL authentication, good! " - "I'm setting set::sasl-server to '%s' internally.", - SERVICES_NAME, SERVICES_NAME); - /* We should really get some LOG_INFO or something... I keep abusing LOG_ERROR :) */ - ircd_log(LOG_ERROR, "Services server '%s' provides SASL authentication, good! " - "I'm setting set::sasl-server to '%s' internally.", - SERVICES_NAME, SERVICES_NAME); + unreal_log(ULOG_INFO, "config", "SASL_SERVER_AUTODETECT", client, + "Services server $client provides SASL authentication, good! " + "I'm setting set::sasl-server to \"$client\" internally."); } safe_strdup(SASL_SERVER, SERVICES_NAME); if (justlinked) @@ -394,7 +390,8 @@ MOD_INIT() mreq.free = saslmechlist_free; mreq.serialize = saslmechlist_serialize; mreq.unserialize = saslmechlist_unserialize; - mreq.sync = 1; + mreq.sync = MODDATA_SYNC_EARLY; + mreq.self_write = 1; mreq.type = MODDATATYPE_CLIENT; ModDataAdd(modinfo->handle, mreq); @@ -419,19 +416,19 @@ void saslmechlist_free(ModData *m) safe_free(m->str); } -char *saslmechlist_serialize(ModData *m) +const char *saslmechlist_serialize(ModData *m) { if (!m->str) return NULL; return m->str; } -void saslmechlist_unserialize(char *str, ModData *m) +void saslmechlist_unserialize(const char *str, ModData *m) { safe_strdup(m->str, str); } -char *sasl_capability_parameter(Client *client) +const char *sasl_capability_parameter(Client *client) { Client *server; diff --git a/src/modules/sdesc.c b/src/modules/sdesc.c index 6c1f730..685c044 100644 --- a/src/modules/sdesc.c +++ b/src/modules/sdesc.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", /* Version */ "command /sdesc", /* Short description of module */ "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -80,13 +80,13 @@ CMD_FUNC(cmd_sdesc) REALLEN); return; } - parv[1][REALLEN] = '\0'; } - ircsnprintf(client->srvptr->info, sizeof(client->srvptr->info), "%s", parv[1]); + strlncpy(client->uplink->info, parv[1], sizeof(client->uplink->info), REALLEN); sendto_server(client, 0, 0, NULL, ":%s SDESC :%s", client->name, parv[1]); - sendto_ops("Server description for %s is now '%s' (changed by %s)", - client->srvptr->name, client->srvptr->info, client->name); + unreal_log(ULOG_INFO, "sdesc", "SDESC_COMMAND", client, + "Server description for $server is now '$server.server.info' (changed by $client)", + log_data_client("server", client->uplink)); } diff --git a/src/modules/sendsno.c b/src/modules/sendsno.c index cabea21..1f1d52f 100644 --- a/src/modules/sendsno.c +++ b/src/modules/sendsno.c @@ -30,7 +30,7 @@ ModuleHeader MOD_HEADER "5.0", /* Version */ "command /sendsno", /* Short description of module */ "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* This is called on module init, before Server Ready */ @@ -63,9 +63,7 @@ MOD_UNLOAD() CMD_FUNC(cmd_sendsno) { MessageTag *mtags = NULL; - char *sno, *msg, *p; - long snomask = 0; - int i; + const char *sno, *msg, *p; Client *acptr; if ((parc < 3) || BadPtr(parv[2])) @@ -81,22 +79,22 @@ CMD_FUNC(cmd_sendsno) /* Forward to others... */ sendto_server(client, 0, 0, mtags, ":%s SENDSNO %s :%s", client->id, parv[1], parv[2]); - for (p = sno; *p; p++) - { - for(i = 0; i <= Snomask_highest; i++) - { - if (Snomask_Table[i].flag == *p) - { - snomask |= Snomask_Table[i].mode; - break; - } - } - } - list_for_each_entry(acptr, &oper_list, special_node) { - if (acptr->user->snomask & snomask) - sendto_one(acptr, mtags, ":%s NOTICE %s :%s", client->name, acptr->name, msg); + if (acptr->user->snomask) + { + char found = 0; + for (p = sno; *p; p++) + { + if (strchr(acptr->user->snomask, *p)) + { + found = 1; + break; + } + } + if (found) + sendto_one(acptr, mtags, ":%s NOTICE %s :%s", client->name, acptr->name, msg); + } } free_message_tags(mtags); diff --git a/src/modules/sendumode.c b/src/modules/sendumode.c index a8504d7..18c7c40 100644 --- a/src/modules/sendumode.c +++ b/src/modules/sendumode.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", /* Version */ "command /sendumode", /* Short description of module */ "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* This is called on module init, before Server Ready */ @@ -66,8 +66,8 @@ CMD_FUNC(cmd_sendumode) { MessageTag *mtags = NULL; Client *acptr; - char *message; - char *p; + const char *message; + const char *p; int i; long umode_s = 0; @@ -83,19 +83,7 @@ CMD_FUNC(cmd_sendumode) sendto_server(client, 0, 0, mtags, ":%s SENDUMODE %s :%s", client->id, parv[1], message); - for (p = parv[1]; *p; p++) - { - for(i = 0; i <= Usermode_highest; i++) - { - if (!Usermode_Table[i].flag) - continue; - if (Usermode_Table[i].flag == *p) - { - umode_s |= Usermode_Table[i].mode; - break; - } - } - } + umode_s = set_usermode(parv[1]); list_for_each_entry(acptr, &oper_list, special_node) { diff --git a/src/modules/server-time.c b/src/modules/server-time.c index f204e2a..7116977 100644 --- a/src/modules/server-time.c +++ b/src/modules/server-time.c @@ -28,14 +28,14 @@ ModuleHeader MOD_HEADER "5.0", "server-time CAP", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Variables */ long CAP_SERVER_TIME = 0L; -int server_time_mtag_is_ok(Client *client, char *name, char *value); -void mtag_add_or_inherit_time(Client *sender, MessageTag *recv_mtags, MessageTag **mtag_list, char *signature); +int server_time_mtag_is_ok(Client *client, const char *name, const char *value); +void mtag_add_or_inherit_time(Client *sender, MessageTag *recv_mtags, MessageTag **mtag_list, const char *signature); MOD_INIT() { @@ -75,7 +75,7 @@ MOD_UNLOAD() * syntax. * We simply allow server-time ONLY from servers. */ -int server_time_mtag_is_ok(Client *client, char *name, char *value) +int server_time_mtag_is_ok(Client *client, const char *name, const char *value) { if (IsServer(client) && !BadPtr(value)) return 1; @@ -83,7 +83,7 @@ int server_time_mtag_is_ok(Client *client, char *name, char *value) return 0; } -void mtag_add_or_inherit_time(Client *sender, MessageTag *recv_mtags, MessageTag **mtag_list, char *signature) +void mtag_add_or_inherit_time(Client *sender, MessageTag *recv_mtags, MessageTag **mtag_list, const char *signature) { MessageTag *m = find_mtag(recv_mtags, "time"); if (m) diff --git a/src/modules/server.c b/src/modules/server.c index df660f4..a673aee 100644 --- a/src/modules/server.c +++ b/src/modules/server.c @@ -22,21 +22,46 @@ #include "unrealircd.h" +/* Definitions */ +typedef enum AutoConnectStrategy { + AUTOCONNECT_PARALLEL = 0, + AUTOCONNECT_SEQUENTIAL = 1, + AUTOCONNECT_SEQUENTIAL_FALLBACK = 2 +} AutoConnectStrategy; + +typedef struct cfgstruct cfgstruct; +struct cfgstruct { + AutoConnectStrategy autoconnect_strategy; + long connect_timeout; + long handshake_timeout; +}; + /* Forward declarations */ +void server_config_setdefaults(cfgstruct *cfg); +int server_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs); +int server_config_run(ConfigFile *cf, ConfigEntry *ce, int type); +EVENT(server_autoconnect); +EVENT(server_handshake_timeout); void send_channel_modes_sjoin3(Client *to, Channel *channel); CMD_FUNC(cmd_server); CMD_FUNC(cmd_sid); -int _verify_link(Client *client, char *servername, ConfigItem_link **link_out); +int _verify_link(Client *client, ConfigItem_link **link_out); void _send_protoctl_servers(Client *client, int response); void _send_server_message(Client *client); void _introduce_user(Client *to, Client *acptr); int _check_deny_version(Client *cptr, char *software, int protocol, char *flags); void _broadcast_sinfo(Client *acptr, Client *to, Client *except); +int server_sync(Client *cptr, ConfigItem_link *conf, int incoming); +void tls_link_notification_verify(Client *acptr, ConfigItem_link *aconf); +void server_generic_free(ModData *m); +int server_post_connect(Client *client); +void _connect_server(ConfigItem_link *aconf, Client *by, struct hostent *hp); +static int connect_server_helper(ConfigItem_link *, Client *); /* Global variables */ static char buf[BUFSIZE]; - -#define MSG_SERVER "SERVER" +static cfgstruct cfg; +static char *last_autoconnect_server = NULL; ModuleHeader MOD_HEADER = { @@ -44,7 +69,7 @@ ModuleHeader MOD_HEADER "5.0", "command /server", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_TEST() @@ -56,30 +81,410 @@ MOD_TEST() EfunctionAddVoid(modinfo->handle, EFUNC_INTRODUCE_USER, _introduce_user); EfunctionAdd(modinfo->handle, EFUNC_CHECK_DENY_VERSION, _check_deny_version); EfunctionAddVoid(modinfo->handle, EFUNC_BROADCAST_SINFO, _broadcast_sinfo); + EfunctionAddVoid(modinfo->handle, EFUNC_CONNECT_SERVER, _connect_server); + HookAdd(modinfo->handle, HOOKTYPE_CONFIGTEST, 0, server_config_test); return MOD_SUCCESS; } MOD_INIT() { - CommandAdd(modinfo->handle, MSG_SERVER, cmd_server, MAXPARA, CMD_UNREGISTERED|CMD_SERVER); - CommandAdd(modinfo->handle, "SID", cmd_sid, MAXPARA, CMD_SERVER); - MARK_AS_OFFICIAL_MODULE(modinfo); + LoadPersistentPointer(modinfo, last_autoconnect_server, server_generic_free); + server_config_setdefaults(&cfg); + HookAdd(modinfo->handle, HOOKTYPE_CONFIGRUN, 0, server_config_run); + HookAdd(modinfo->handle, HOOKTYPE_POST_SERVER_CONNECT, 0, server_post_connect); + CommandAdd(modinfo->handle, "SERVER", cmd_server, MAXPARA, CMD_UNREGISTERED|CMD_SERVER); + CommandAdd(modinfo->handle, "SID", cmd_sid, MAXPARA, CMD_SERVER); return MOD_SUCCESS; } MOD_LOAD() { + EventAdd(modinfo->handle, "server_autoconnect", server_autoconnect, NULL, 2000, 0); + EventAdd(modinfo->handle, "server_handshake_timeout", server_handshake_timeout, NULL, 1000, 0); return MOD_SUCCESS; } MOD_UNLOAD() { + SavePersistentPointer(modinfo, last_autoconnect_server); return MOD_SUCCESS; } -int server_sync(Client *cptr, ConfigItem_link *conf); +/** Convert 'str' to a AutoConnectStrategy value. + * @param str The string, eg "parallel" + * @returns a valid AutoConnectStrategy value or -1 if not found. + */ +AutoConnectStrategy autoconnect_strategy_strtoval(char *str) +{ + if (!strcmp(str, "parallel")) + return AUTOCONNECT_PARALLEL; + if (!strcmp(str, "sequential")) + return AUTOCONNECT_SEQUENTIAL; + if (!strcmp(str, "sequential-fallback")) + return AUTOCONNECT_SEQUENTIAL_FALLBACK; + return -1; +} + +/** Convert an AutoConnectStrategy value to a string. + * @param val The value to convert to a string + * @returns a string, such as "parallel". + */ +char *autoconnect_strategy_valtostr(AutoConnectStrategy val) +{ + switch (val) + { + case AUTOCONNECT_PARALLEL: + return "parallel"; + case AUTOCONNECT_SEQUENTIAL: + return "sequential"; + case AUTOCONNECT_SEQUENTIAL_FALLBACK: + return "sequential-fallback"; + default: + return "???"; + } +} + +void server_config_setdefaults(cfgstruct *cfg) +{ + cfg->autoconnect_strategy = AUTOCONNECT_SEQUENTIAL; + cfg->connect_timeout = 10; + cfg->handshake_timeout = 20; +} + +int server_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) +{ + int errors = 0; + ConfigEntry *cep; + + if (type != CONFIG_SET) + return 0; + + /* We are only interrested in set::server-linking.. */ + if (!ce || strcmp(ce->name, "server-linking")) + return 0; + + for (cep = ce->items; cep; cep = cep->next) + { + if (!cep->value) + { + config_error("%s:%i: blank set::server-linking::%s without value", + cep->file->filename, cep->line_number, cep->name); + errors++; + continue; + } else + if (!strcmp(cep->name, "autoconnect-strategy")) + { + if (autoconnect_strategy_strtoval(cep->value) < 0) + { + config_error("%s:%i: set::server-linking::autoconnect-strategy: invalid value '%s'. " + "Should be one of: parallel", + cep->file->filename, cep->line_number, cep->value); + errors++; + continue; + } + } else + if (!strcmp(cep->name, "connect-timeout")) + { + long v = config_checkval(cep->value, CFG_TIME); + if ((v < 5) || (v > 30)) + { + config_error("%s:%i: set::server-linking::connect-timeout should be between 5 and 60 seconds", + cep->file->filename, cep->line_number); + errors++; + continue; + } + } else + if (!strcmp(cep->name, "handshake-timeout")) + { + long v = config_checkval(cep->value, CFG_TIME); + if ((v < 10) || (v > 120)) + { + config_error("%s:%i: set::server-linking::handshake-timeout should be between 10 and 120 seconds", + cep->file->filename, cep->line_number); + errors++; + continue; + } + } else + { + config_error("%s:%i: unknown directive set::server-linking::%s", + cep->file->filename, cep->line_number, cep->name); + errors++; + continue; + } + } + + *errs = errors; + return errors ? -1 : 1; +} + +int server_config_run(ConfigFile *cf, ConfigEntry *ce, int type) +{ + ConfigEntry *cep; + + if (type != CONFIG_SET) + return 0; + + /* We are only interrested in set::server-linking.. */ + if (!ce || strcmp(ce->name, "server-linking")) + return 0; + + for (cep = ce->items; cep; cep = cep->next) + { + if (!strcmp(cep->name, "autoconnect-strategy")) + { + cfg.autoconnect_strategy = autoconnect_strategy_strtoval(cep->value); + } else + if (!strcmp(cep->name, "connect-timeout")) + { + cfg.connect_timeout = config_checkval(cep->value, CFG_TIME); + } else + if (!strcmp(cep->name, "handshake-timeout")) + { + cfg.handshake_timeout = config_checkval(cep->value, CFG_TIME); + } + } + return 1; +} + +int server_needs_linking(ConfigItem_link *aconf) +{ + ConfigItem_deny_link *deny; + Client *client; + ConfigItem_class *class; + + /* We're only interested in autoconnect blocks that are valid. Also, we ignore temporary link blocks. */ + if (!(aconf->outgoing.options & CONNECT_AUTO) || !aconf->outgoing.hostname || (aconf->flag.temporary == 1)) + return 0; + + class = aconf->class; + + /* Never do more than one connection attempt per seconds (for the same server) */ + if ((aconf->hold > TStime())) + return 0; + + aconf->hold = TStime() + class->connfreq; + + client = find_client(aconf->servername, NULL); + if (client) + return 0; /* Server already connected (or connecting) */ + + if (class->clients >= class->maxclients) + return 0; /* Class is full */ + + /* Check connect rules to see if we're allowed to try the link */ + for (deny = conf_deny_link; deny; deny = deny->next) + if (unreal_mask_match_string(aconf->servername, deny->mask) && crule_eval(deny->rule)) + return 0; + + /* Yes, this server is a linking candidate */ + return 1; +} + +void server_autoconnect_parallel(void) +{ + ConfigItem_link *aconf; + + for (aconf = conf_link; aconf; aconf = aconf->next) + { + if (!server_needs_linking(aconf)) + continue; + + connect_server(aconf, NULL, NULL); + } +} + +/** Find first (valid) autoconnect server in link blocks. + * This function should not be used directly. It is a helper function + * for find_next_autoconnect_server(). + */ +ConfigItem_link *find_first_autoconnect_server(void) +{ + ConfigItem_link *aconf; + + for (aconf = conf_link; aconf; aconf = aconf->next) + { + if (!server_needs_linking(aconf)) + continue; + return aconf; /* found! */ + } + return NULL; /* none */ +} + +/** Find next server that we should try to autoconnect to. + * Taking into account that we last tried server 'current'. + * @param current Server the previous autoconnect attempt was made to + * @returns A link block, or NULL if no servers are suitable. + */ +ConfigItem_link *find_next_autoconnect_server(char *current) +{ + ConfigItem_link *aconf; + + /* If the current autoconnect server is NULL then + * just find whichever valid server is first. + */ + if (current == NULL) + return find_first_autoconnect_server(); + + /* Next code is a bit convulted, it would have + * been easier if conf_link was a circular list ;) + */ + + /* Otherwise, walk the list up to 'current' */ + for (aconf = conf_link; aconf; aconf = aconf->next) + { + if (!strcmp(aconf->servername, current)) + break; + } + + /* If the 'current' server dissapeared, then let's + * just pick the first one from the list. + * It is a rare event to have the link { } block + * removed of a server that we just happened to + * try to link to before, so we can afford to do + * it this way. + */ + if (!aconf) + return find_first_autoconnect_server(); + + /* Check the remainder for the list, in other words: + * check all servers after 'current' if they are + * ready for an outgoing connection attempt... + */ + for (aconf = aconf->next; aconf; aconf = aconf->next) + { + if (!server_needs_linking(aconf)) + continue; + return aconf; /* found! */ + } + + /* If we get here then there are no valid servers + * after 'current', so now check for before 'current' + * (and including 'current', since we may + * have to autoconnect to that one again, + * eg if it is the only autoconnect server)... + */ + for (aconf = conf_link; aconf; aconf = aconf->next) + { + if (!server_needs_linking(aconf)) + { + if (!strcmp(aconf->servername, current)) + break; /* need to stop here */ + continue; + } + return aconf; /* found! */ + } + + return NULL; /* none */ +} + +/** Check if we are currently connecting to a server (outgoing). + * This function takes into account not only an outgoing TCP/IP connect + * or TLS handshake, but also if we are 'somewhat connected' to that + * server but have not completed the full sync, eg we may still need + * to receive SIDs or other sync data. + * NOTE: This implicitly assumes that outgoing links only go to + * servers that will (eventually) send "EOS". + * Should be a reasonable assumption given that in nearly all + * cases we only connect to UnrealIRCd servers for the outgoing + * case, as services are "always" incoming links. + * @returns 1 if an outgoing link is in progress, 0 if not. + */ +int current_outgoing_link_in_process(void) +{ + Client *client; + + list_for_each_entry(client, &unknown_list, lclient_node) + { + if (client->server && *client->server->by && client->local->creationtime && + (IsConnecting(client) || IsTLSConnectHandshake(client) || !IsSynched(client))) + { + return 1; + } + } + + list_for_each_entry(client, &server_list, special_node) + { + if (client->server && *client->server->by && client->local->creationtime && + (IsConnecting(client) || IsTLSConnectHandshake(client) || !IsSynched(client))) + { + return 1; + } + } + + return 0; +} + +void server_autoconnect_sequential(void) +{ + ConfigItem_link *aconf; + + if (current_outgoing_link_in_process()) + return; + + /* We are currently not in the process of doing an outgoing connect, + * let's see if we need to connect to somewhere... + */ + aconf = find_next_autoconnect_server(last_autoconnect_server); + if (aconf == NULL) + return; /* No server to connect to at this time */ + + /* Start outgoing link attempt */ + safe_strdup(last_autoconnect_server, aconf->servername); + connect_server(aconf, NULL, NULL); +} + +/** Perform autoconnect to servers that are not linked yet. */ +EVENT(server_autoconnect) +{ + switch (cfg.autoconnect_strategy) + { + case AUTOCONNECT_PARALLEL: + server_autoconnect_parallel(); + break; + case AUTOCONNECT_SEQUENTIAL: + /* Fallback is the same as sequential but we reset last_autoconnect_server on connect */ + case AUTOCONNECT_SEQUENTIAL_FALLBACK: + server_autoconnect_sequential(); + break; + } +} + +EVENT(server_handshake_timeout) +{ + Client *client, *next; + + list_for_each_entry_safe(client, next, &unknown_list, lclient_node) + { + /* We are only interested in outgoing server connects */ + if (!client->server || !*client->server->by || !client->local->creationtime) + continue; + + /* Handle set::server-linking::connect-timeout */ + if ((IsConnecting(client) || IsTLSConnectHandshake(client)) && + ((TStime() - client->local->creationtime) >= cfg.connect_timeout)) + { + /* If this is a connect timeout to an outgoing server then notify ops & log it */ + unreal_log(ULOG_INFO, "link", "LINK_CONNECT_TIMEOUT", client, + "Connect timeout while trying to link to server '$client' ($client.ip)"); + + exit_client(client, NULL, "Connection timeout"); + continue; + } + + /* Handle set::server-linking::handshake-timeout */ + if ((TStime() - client->local->creationtime) >= cfg.handshake_timeout) + { + /* If this is a handshake timeout to an outgoing server then notify ops & log it */ + unreal_log(ULOG_INFO, "link", "LINK_HANDSHAKE_TIMEOUT", client, + "Connect handshake timeout while trying to link to server '$client' ($client.ip)"); + + exit_client(client, NULL, "Handshake Timeout"); + continue; + } + } +} /** Check deny version { } blocks. * @param cptr Client (a server) @@ -211,7 +616,7 @@ void _send_protoctl_servers(Client *client, int response) void _send_server_message(Client *client) { - if (client->serv && client->serv->flags.server_sent) + if (client->server && client->server->flags.server_sent) { #ifdef DEBUGMODE abort(); @@ -222,24 +627,22 @@ void _send_server_message(Client *client) sendto_one(client, NULL, "SERVER %s 1 :U%d-%s%s-%s %s", me.name, UnrealProtocol, serveropts, extraflags ? extraflags : "", me.id, me.info); - if (client->serv) - client->serv->flags.server_sent = 1; + if (client->server) + client->server->flags.server_sent = 1; } +#define LINK_DEFAULT_ERROR_MSG "Link denied (No link block found with your server name or link::incoming::mask did not match)" /** Verify server link. * This does authentication and authorization checks. * @param cptr The client directly connected to us (cptr). * @param client The client which (originally) issued the server command (client). - * @param servername The server name provided by the client. * @param link_out Pointer-to-pointer-to-link block. Will be set when auth OK. Caller may pass NULL if he doesn't care. * @returns This function returns 1 on successful authentication, 0 otherwise - in which case the client has been killed. */ -int _verify_link(Client *client, char *servername, ConfigItem_link **link_out) +int _verify_link(Client *client, ConfigItem_link **link_out) { - char xerrmsg[256]; - ConfigItem_link *link; - char *inpath = get_client_name(client, TRUE); + ConfigItem_link *link, *orig_link; Client *acptr = NULL, *ocptr = NULL; ConfigItem_ban *bconf; @@ -252,81 +655,72 @@ int _verify_link(Client *client, char *servername, ConfigItem_link **link_out) if (link_out) *link_out = NULL; - strcpy(xerrmsg, "No matching link configuration"); - if (!client->local->passwd) { - sendto_one(client, NULL, "ERROR :Missing password"); + unreal_log(ULOG_ERROR, "link", "LINK_DENIED_NO_PASSWORD", client, + "Link with server $client.details denied: No password provided. Protocol error."); exit_client(client, NULL, "Missing password"); return 0; } - /* First check if the server is in the list */ - if (!servername) { - strcpy(xerrmsg, "Null servername"); - goto errlink; - } - - if (client->serv && client->serv->conf) + if (client->server && client->server->conf) { /* This is an outgoing connect so we already know what link block we are - * dealing with. It's the one in: client->serv->conf + * dealing with. It's the one in: client->server->conf */ /* Actually we still need to double check the servername to avoid confusion. */ - if (strcasecmp(servername, client->serv->conf->servername)) + if (strcasecmp(client->name, client->server->conf->servername)) { - ircsnprintf(xerrmsg, sizeof(xerrmsg), "Outgoing connect from link block '%s' but server " - "introduced himself as '%s'. Server name mismatch.", - client->serv->conf->servername, - servername); - - sendto_one(client, NULL, "ERROR :%s", xerrmsg); - sendto_ops_and_log("Outgoing link aborted to %s(%s@%s) (%s) %s", - client->serv->conf->servername, client->ident, client->local->sockhost, xerrmsg, inpath); - exit_client(client, NULL, xerrmsg); + unreal_log(ULOG_ERROR, "link", "LINK_DENIED_SERVERNAME_MISMATCH", client, + "Link with server $client.details denied: " + "Outgoing connect from link block '$link_block' but server " + "introduced itself as '$client'. Server name mismatch.", + log_data_link_block(client->server->conf)); + exit_client_fmt(client, NULL, "Servername (%s) does not match name in my link block (%s)", + client->name, client->server->conf->servername); return 0; } - link = client->serv->conf; + link = client->server->conf; goto skip_host_check; } else { /* Hunt the linkblock down ;) */ for(link = conf_link; link; link = link->next) - if (match_simple(link->servername, servername)) + if (match_simple(link->servername, client->name)) break; } if (!link) { - ircsnprintf(xerrmsg, sizeof(xerrmsg), "No link block named '%s'", servername); - goto errlink; + unreal_log(ULOG_ERROR, "link", "LINK_DENIED_UNKNOWN_SERVER", client, + "Link with server $client.details denied: No link block named '$client'"); + exit_client(client, NULL, LINK_DEFAULT_ERROR_MSG); + return 0; } if (!link->incoming.mask) { - ircsnprintf(xerrmsg, sizeof(xerrmsg), "Link block '%s' exists but has no link::incoming::mask", servername); - goto errlink; + unreal_log(ULOG_ERROR, "link", "LINK_DENIED_NO_INCOMING", client, + "Link with server $client.details denied: Link block exists, but there is no link::incoming::mask set.", + log_data_link_block(link)); + exit_client(client, NULL, LINK_DEFAULT_ERROR_MSG); + return 0; } - link = find_link(servername, client); + orig_link = link; + link = find_link(client->name, client); if (!link) { - ircsnprintf(xerrmsg, sizeof(xerrmsg), "Server is in link block but link::incoming::mask didn't match"); -errlink: - /* Send the "simple" error msg to the server */ - sendto_one(client, NULL, - "ERROR :Link denied (No link block found named '%s' or link::incoming::mask did not match your IP %s) %s", - servername, GetIP(client), inpath); - /* And send the "verbose" error msg only to locally connected ircops */ - sendto_ops_and_log("Link denied for %s(%s@%s) (%s) %s", - servername, client->ident, client->local->sockhost, xerrmsg, inpath); - exit_client(client, NULL, "Link denied (No link block found with your server name or link::incoming::mask did not match)"); + unreal_log(ULOG_ERROR, "link", "LINK_DENIED_INCOMING_MASK_MISMATCH", client, + "Link with server $client.details denied: Server is in link block but link::incoming::mask didn't match", + log_data_link_block(orig_link)); + exit_client(client, NULL, LINK_DEFAULT_ERROR_MSG); return 0; } skip_host_check: - /* Now for checking passwords */ + /* Try to authenticate the server... */ if (!Auth_Check(client, link->auth, client->local->passwd)) { /* Let's help admins a bit with a good error message in case @@ -339,32 +733,39 @@ skip_host_check: if (((link->auth->type == AUTHTYPE_PLAINTEXT) && client->local->passwd && !strcmp(client->local->passwd, "*")) || ((link->auth->type != AUTHTYPE_PLAINTEXT) && client->local->passwd && strcmp(client->local->passwd, "*"))) { - sendto_ops_and_log("Link denied for '%s' (Authentication failed due to different password types on both sides of the link) %s", - servername, inpath); - sendto_ops_and_log("Read https://www.unrealircd.org/docs/FAQ#auth-fail-mixed for more information"); + unreal_log(ULOG_ERROR, "link", "LINK_DENIED_AUTH_FAILED", client, + "Link with server $client.details denied: Authentication failed: $auth_failure_msg", + log_data_string("auth_failure_msg", "different password types on both sides of the link\n" + "Read https://www.unrealircd.org/docs/FAQ#auth-fail-mixed for more information"), + log_data_link_block(link)); } else if (link->auth->type == AUTHTYPE_SPKIFP) { - sendto_ops_and_log("Link denied for '%s' (Authentication failed [spkifp mismatch]) %s", - servername, inpath); + unreal_log(ULOG_ERROR, "link", "LINK_DENIED_AUTH_FAILED", client, + "Link with server $client.details denied: Authentication failed: $auth_failure_msg", + log_data_string("auth_failure_msg", "spkifp mismatch"), + log_data_link_block(link)); } else if (link->auth->type == AUTHTYPE_TLS_CLIENTCERT) { - sendto_ops_and_log("Link denied for '%s' (Authentication failed [tlsclientcert mismatch]) %s", - servername, inpath); + unreal_log(ULOG_ERROR, "link", "LINK_DENIED_AUTH_FAILED", client, + "Link with server $client.details denied: Authentication failed: $auth_failure_msg", + log_data_string("auth_failure_msg", "tlsclientcert mismatch"), + log_data_link_block(link)); } else if (link->auth->type == AUTHTYPE_TLS_CLIENTCERTFP) { - sendto_ops_and_log("Link denied for '%s' (Authentication failed [tlsclientcertfp mismatch]) %s", - servername, inpath); + unreal_log(ULOG_ERROR, "link", "LINK_DENIED_AUTH_FAILED", client, + "Link with server $client.details denied: Authentication failed: $auth_failure_msg", + log_data_string("auth_failure_msg", "certfp mismatch"), + log_data_link_block(link)); } else { - sendto_ops_and_log("Link denied for '%s' (Authentication failed [Bad password?]) %s", - servername, inpath); + unreal_log(ULOG_ERROR, "link", "LINK_DENIED_AUTH_FAILED", client, + "Link with server $client.details denied: Authentication failed: $auth_failure_msg", + log_data_string("auth_failure_msg", "bad password"), + log_data_link_block(link)); } - sendto_one(client, NULL, - "ERROR :Link '%s' denied (Authentication failed) %s", - servername, inpath); exit_client(client, NULL, "Link denied (Authentication failed)"); return 0; } @@ -376,88 +777,90 @@ skip_host_check: if (!IsTLS(client)) { - sendto_one(client, NULL, - "ERROR :Link '%s' denied (Not using SSL/TLS) %s", - servername, inpath); - sendto_ops_and_log("Link denied for '%s' (Not using SSL/TLS and verify-certificate is on) %s", - servername, inpath); - exit_client(client, NULL, "Link denied (Not using SSL/TLS)"); + unreal_log(ULOG_ERROR, "link", "LINK_DENIED_VERIFY_CERTIFICATE_FAILED", client, + "Link with server $client.details denied: verify-certificate failed: $certificate_failure_msg", + log_data_string("certificate_failure_msg", "not using TLS"), + log_data_link_block(link)); + exit_client(client, NULL, "Link denied (Not using TLS)"); return 0; } if (!verify_certificate(client->local->ssl, link->servername, &errstr)) { - sendto_one(client, NULL, - "ERROR :Link '%s' denied (Certificate verification failed) %s", - servername, inpath); - sendto_ops_and_log("Link denied for '%s' (Certificate verification failed) %s", - servername, inpath); - sendto_ops_and_log("Reason for certificate verification failure: %s", errstr); + unreal_log(ULOG_ERROR, "link", "LINK_DENIED_VERIFY_CERTIFICATE_FAILED", client, + "Link with server $client.details denied: verify-certificate failed: $certificate_failure_msg", + log_data_string("certificate_failure_msg", errstr), + log_data_link_block(link)); exit_client(client, NULL, "Link denied (Certificate verification failed)"); return 0; } } - /* - * Third phase, we check that the server does not exist - * already - */ - if ((acptr = find_server(servername, NULL))) + if ((bconf = find_ban(NULL, client->name, CONF_BAN_SERVER))) { - /* Found. Bad. Quit. */ - - if (IsMe(acptr)) - { - sendto_ops_and_log("Link %s rejected, server trying to link with my name (%s)", - get_client_name(client, TRUE), me.name); - sendto_one(client, NULL, "ERROR: Server %s exists (it's me!)", me.name); - exit_client(client, NULL, "Server Exists"); - return 0; - } - - acptr = acptr->direction; - ocptr = (client->local->firsttime > acptr->local->firsttime) ? acptr : client; - acptr = (client->local->firsttime > acptr->local->firsttime) ? client : acptr; - sendto_one(acptr, NULL, - "ERROR :Server %s already exists from %s", - servername, - (ocptr->direction ? ocptr->direction->name : "")); - sendto_ops_and_log - ("Link %s cancelled, server %s already exists from %s", - get_client_name(acptr, TRUE), servername, - (ocptr->direction ? ocptr->direction->name : "")); - exit_client(acptr, NULL, "Server Exists"); - return 0; - } - if ((bconf = find_ban(NULL, servername, CONF_BAN_SERVER))) - { - sendto_ops_and_log - ("Cancelling link %s, banned server", - get_client_name(client, TRUE)); - sendto_one(client, NULL, "ERROR :Banned server (%s)", bconf->reason ? bconf->reason : "no reason"); - exit_client(client, NULL, "Banned server"); + unreal_log(ULOG_ERROR, "link", "LINK_DENIED_SERVER_BAN", client, + "Link with server $client.details denied: " + "Server is banned ($ban_reason)", + log_data_string("ban_reason", bconf->reason), + log_data_link_block(link)); + exit_client_fmt(client, NULL, "Banned server: %s", bconf->reason); return 0; } + if (link->class->clients + 1 > link->class->maxclients) { - sendto_ops_and_log("Cancelling link %s, full class", - get_client_name(client, TRUE)); + unreal_log(ULOG_ERROR, "link", "LINK_DENIED_CLASS_FULL", client, + "Link with server $client.details denied: " + "class '$link_block.class' is full", + log_data_link_block(link)); exit_client(client, NULL, "Full class"); return 0; } if (!IsLocalhost(client) && (iConf.plaintext_policy_server == POLICY_DENY) && !IsSecure(client)) { - sendto_one(client, NULL, "ERROR :Servers need to use SSL/TLS (set::plaintext-policy::server is 'deny')"); - sendto_ops_and_log("Rejected insecure server %s. See https://www.unrealircd.org/docs/FAQ#ERROR:_Servers_need_to_use_SSL.2FTLS", client->name); - exit_client(client, NULL, "Servers need to use SSL/TLS (set::plaintext-policy::server is 'deny')"); + unreal_log(ULOG_ERROR, "link", "LINK_DENIED_NO_TLS", client, + "Link with server $client.details denied: " + "Server needs to use TLS (set::plaintext-policy::server is 'deny')\n" + "See https://www.unrealircd.org/docs/FAQ#server-requires-tls", + log_data_link_block(link)); + exit_client(client, NULL, "Servers need to use TLS (set::plaintext-policy::server is 'deny')"); return 0; } if (IsSecure(client) && (iConf.outdated_tls_policy_server == POLICY_DENY) && outdated_tls_client(client)) { - sendto_one(client, NULL, "ERROR :Server is using an outdated SSL/TLS protocol or cipher (set::outdated-tls-policy::server is 'deny')"); - sendto_ops_and_log("Rejected server %s using outdated %s. See https://www.unrealircd.org/docs/FAQ#server-outdated-tls", tls_get_cipher(client->local->ssl), client->name); - exit_client(client, NULL, "Server using outdates SSL/TLS protocol or cipher (set::outdated-tls-policy::server is 'deny')"); + unreal_log(ULOG_ERROR, "link", "LINK_DENIED_OUTDATED_TLS", client, + "Link with server $client.details denied: " + "Server is using an outdated TLS protocol or cipher ($tls_cipher) and set::outdated-tls-policy::server is 'deny'.\n" + "See https://www.unrealircd.org/docs/FAQ#server-outdated-tls", + log_data_link_block(link), + log_data_string("tls_cipher", tls_get_cipher(client))); + exit_client(client, NULL, "Server using outdates TLS protocol or cipher (set::outdated-tls-policy::server is 'deny')"); return 0; } + /* This one is at the end, because it causes us to delink another server, + * so we want to be (reasonably) sure that this one will succeed before + * breaking the other one. + */ + if ((acptr = find_server(client->name, NULL))) + { + if (IsMe(acptr)) + { + unreal_log(ULOG_ERROR, "link", "LINK_DENIED_SERVER_EXISTS", client, + "Link with server $client.details denied: " + "Server is trying to link with my name ($me_name)", + log_data_string("me_name", me.name), + log_data_link_block(link)); + exit_client(client, NULL, "Server Exists (server trying to link with same name as myself)"); + return 0; + } else { + unreal_log(ULOG_ERROR, "link", "LINK_DROPPED_REINTRODUCED", client, + "Link with server $client.details causes older link " + "with same server via $existing_client.server.uplink to be dropped.", + log_data_client("existing_client", acptr), + log_data_link_block(link)); + exit_client_ex(acptr, client->direction, NULL, "Old link dropped, resyncing"); + } + } + if (link_out) *link_out = link; return 1; @@ -470,7 +873,7 @@ skip_host_check: */ CMD_FUNC(cmd_server) { - char *servername = NULL; /* Pointer for servername */ + const char *servername = NULL; /* Pointer for servername */ char *ch = NULL; /* */ char descbuf[BUFSIZE]; int hop = 0; @@ -478,6 +881,7 @@ CMD_FUNC(cmd_server) ConfigItem_link *aconf = NULL; ConfigItem_deny_link *deny; char *flags = NULL, *protocol = NULL, *inf = NULL, *num = NULL; + int incoming; if (IsUser(client)) { @@ -488,8 +892,7 @@ CMD_FUNC(cmd_server) if (parc < 4 || (!*parv[3])) { - sendto_one(client, NULL, "ERROR :Not enough SERVER parameters"); - exit_client(client, NULL, "Not enough parameters"); + exit_client(client, NULL, "Not enough SERVER parameters"); return; } @@ -498,10 +901,11 @@ CMD_FUNC(cmd_server) /* Remote 'SERVER' command is not possible on a 100% SID network */ if (!MyConnect(client)) { - char buf[256]; - sendto_umode_global(UMODE_OPER, "Server %s introduced %s which is using old unsupported protocol from UnrealIRCd 3.2.x or earlier. " - "See https://www.unrealircd.org/docs/FAQ#old-server-protocol", - client->direction->name, servername); + unreal_log(ULOG_ERROR, "link", "LINK_OLD_PROTOCOL", client, + "Server link $client tried to introduce $servername using SERVER command. " + "Server is using an old and unsupported protocol from UnrealIRCd 3.2.x or earlier. " + "See https://www.unrealircd.org/docs/FAQ#old-server-protocol", + log_data_string("servername", servername)); exit_client(client->direction, NULL, "Introduced another server with unsupported protocol"); return; } @@ -514,38 +918,37 @@ CMD_FUNC(cmd_server) if (!valid_server_name(servername)) { - sendto_one(client, NULL, "ERROR :Bogus server name (%s)", servername); - sendto_snomask - (SNO_JUNK, - "WARNING: Bogus server name (%s) from %s (maybe just a fishy client)", - servername, get_client_name(client, TRUE)); exit_client(client, NULL, "Bogus server name"); return; } if (!client->local->passwd) { - sendto_one(client, NULL, "ERROR :Missing password"); exit_client(client, NULL, "Missing password"); return; } - if (!verify_link(client, servername, &aconf)) + /* We set the client->name early here, even though it is not authenticated yet. + * Reason is that it makes the notices and logging more useful. + * This should be safe as it is not in the server linked list yet or hash table. + * CMTSRV941 -- Syzop. + */ + strlcpy(client->name, servername, sizeof(client->name)); + + if (!verify_link(client, &aconf)) return; /* Rejected */ /* From this point the server is authenticated, so we can be more verbose * with notices to ircops and in exit_client() and such. */ - strlcpy(client->name, servername, sizeof(client->name)); if (strlen(client->id) != 3) { - sendto_umode_global(UMODE_OPER, "Server %s is using old unsupported protocol from UnrealIRCd 3.2.x or earlier. " - "See https://www.unrealircd.org/docs/FAQ#old-server-protocol", - servername); - ircd_log(LOG_ERROR, "Server using old unsupported protocol from UnrealIRCd 3.2.x or earlier. " - "See https://www.unrealircd.org/docs/FAQ#old-server-protocol"); + unreal_log(ULOG_ERROR, "link", "LINK_OLD_PROTOCOL", client, + "Server link $servername rejected. Server is using an old and unsupported protocol from UnrealIRCd 3.2.x or earlier. " + "See https://www.unrealircd.org/docs/FAQ#old-server-protocol", + log_data_string("servername", servername)); exit_client(client, NULL, "Server using old unsupported protocol from UnrealIRCd 3.2.x or earlier. " "See https://www.unrealircd.org/docs/FAQ#old-server-protocol"); return; @@ -554,8 +957,10 @@ CMD_FUNC(cmd_server) hop = atol(parv[2]); if (hop != 1) { - sendto_umode_global(UMODE_OPER, "Directly linked server %s provided a hopcount of %d, while 1 was expected", - servername, hop); + unreal_log(ULOG_ERROR, "link", "LINK_DENIED_INVALID_HOPCOUNT", client, + "Server link $servername rejected. Directly linked server provided a hopcount of $hopcount, while 1 was expected.", + log_data_string("servername", servername), + log_data_integer("hopcount", hop)); exit_client(client, NULL, "Invalid SERVER message, hop count must be 1"); return; } @@ -597,11 +1002,12 @@ CMD_FUNC(cmd_server) /* Process deny server { } restrictions */ for (deny = conf_deny_link; deny; deny = deny->next) { - if (deny->flag.type == CRULE_ALL && match_simple(deny->mask, servername) + if (deny->flag.type == CRULE_ALL && unreal_mask_match_string(servername, deny->mask) && crule_eval(deny->rule)) { - sendto_ops_and_log("Refused connection from %s. Rejected by deny link { } block.", - get_client_host(client)); + unreal_log(ULOG_ERROR, "link", "LINK_DENIED_DENY_LINK_BLOCK", client, + "Server link $servername rejected by deny link { } block.", + log_data_string("servername", servername)); exit_client(client, NULL, "Disallowed by connection rule"); return; } @@ -613,7 +1019,86 @@ CMD_FUNC(cmd_server) ircsnprintf(descbuf, sizeof descbuf, "Server: %s", servername); fd_desc(client->local->fd, descbuf); - server_sync(client, aconf); + incoming = IsUnknown(client) ? 1 : 0; + + if (client->local->passwd) + safe_free(client->local->passwd); + + /* Set up server structure */ + free_pending_net(client); + SetServer(client); + irccounts.me_servers++; + irccounts.servers++; + irccounts.unknown--; + list_move(&client->client_node, &global_server_list); + list_move(&client->lclient_node, &lclient_list); + list_add(&client->special_node, &server_list); + + if (find_uline(client->name)) + { + if (client->server && client->server->features.software && !strncmp(client->server->features.software, "UnrealIRCd-", 11)) + { + unreal_log(ULOG_ERROR, "link", "BAD_ULINES", client, + "Bad ulines! Server $client matches your ulines { } block, but this server " + "is an UnrealIRCd server. UnrealIRCd servers should never be ulined as it " + "causes security issues. Ulines should only be added for services! " + "See https://www.unrealircd.org/docs/FAQ#bad-ulines."); + exit_client(client, NULL, "Bad ulines. See https://www.unrealircd.org/docs/FAQ#bad-ulines"); + } + SetULine(client); + } + + find_or_add(client->name); + + if (IsSecure(client)) + { + unreal_log(ULOG_INFO, "link", "SERVER_LINKED", client, + "Server linked: $me -> $client [secure: $tls_cipher]", + log_data_string("tls_cipher", tls_get_cipher(client)), + log_data_client("me", &me)); + tls_link_notification_verify(client, aconf); + } + else + { + unreal_log(ULOG_INFO, "link", "SERVER_LINKED", client, + "Server linked: $me -> $client", + log_data_client("me", &me)); + /* Print out a warning if linking to a non-TLS server unless it's localhost. + * Yeah.. there are still other cases when non-TLS links are fine (eg: local IP + * of the same machine), we won't bother with detecting that. -- Syzop + */ + if (!IsLocalhost(client) && (iConf.plaintext_policy_server == POLICY_WARN)) + { + unreal_log(ULOG_WARNING, "link", "LINK_WARNING_NO_TLS", client, + "Link with server $client.details is unencrypted (not TLS). " + "We highly recommend to use TLS for server linking. " + "See https://www.unrealircd.org/docs/Linking_servers", + log_data_link_block(aconf)); + } + if (IsSecure(client) && (iConf.outdated_tls_policy_server == POLICY_WARN) && outdated_tls_client(client)) + { + unreal_log(ULOG_WARNING, "link", "LINK_WARNING_OUTDATED_TLS", client, + "Link with server $client.details is using an outdated " + "TLS protocol or cipher ($tls_cipher).", + log_data_link_block(aconf), + log_data_string("tls_cipher", tls_get_cipher(client))); + } + } + + add_to_client_hash_table(client->name, client); + /* doesnt duplicate client->server if allocted this struct already */ + make_server(client); + client->uplink = &me; + if (!client->server->conf) + client->server->conf = aconf; /* Only set serv->conf to aconf if not set already! Bug #0003913 */ + if (incoming) + client->server->conf->refcount++; + client->server->conf->class->clients++; + client->local->class = client->server->conf->class; + + RunHook(HOOKTYPE_SERVER_CONNECT, client); + + server_sync(client, aconf, incoming); } /** Remote server command (SID). @@ -627,9 +1112,9 @@ CMD_FUNC(cmd_sid) Client *acptr, *ocptr; ConfigItem_link *aconf; ConfigItem_ban *bconf; - int hop; - char *servername = parv[1]; - Client *cptr = client->direction; /* lazy, since this function may be removed soon */ + int hop; + const char *servername = parv[1]; + Client *direction = client->direction; /* lazy, since this function may be removed soon */ /* Only allow this command from server sockets */ if (!IsServer(client->direction)) @@ -640,7 +1125,25 @@ CMD_FUNC(cmd_sid) if (parc < 4 || BadPtr(parv[3])) { - sendto_one(client, NULL, "ERROR :Not enough SID parameters"); + sendnumeric(client, ERR_NEEDMOREPARAMS, "SID"); + return; + } + + /* The SID check is done early because we do all the killing by SID, + * so we want to know if that won't work first. + */ + if (!valid_sid(parv[3])) + { + unreal_log(ULOG_ERROR, "link", "REMOTE_LINK_DENIED_INVALID_SID", client, + "Denied remote server $servername which was introduced by $client: " + "Invalid SID.", + log_data_string("servername", servername), + log_data_string("sid", parv[3])); + /* Since we cannot SQUIT via SID (since it is invalid), this gives + * us huge doubts about the accuracy of the uplink, so in this case + * we terminate the entire uplink. + */ + exit_client(client, NULL, "Trying to introduce a server with an invalid SID"); return; } @@ -651,87 +1154,116 @@ CMD_FUNC(cmd_sid) if (IsMe(acptr)) { - sendto_ops_and_log("Link %s rejected, server trying to link with my name (%s)", - get_client_name(client, TRUE), me.name); + /* This should never happen, not even due to a race condition. + * We cannot send SQUIT here either since it is unclear what + * side would be squitted. + * As said, not really important, as this does not happen anyway. + */ + unreal_log(ULOG_ERROR, "link", "REMOTE_LINK_DENIED_DUPLICATE_SERVER_IS_ME", client, + "Denied remote server $servername which was introduced by $client: " + "Server is using our servername, this should be impossible!", + log_data_string("servername", servername)); sendto_one(client, NULL, "ERROR: Server %s exists (it's me!)", me.name); exit_client(client, NULL, "Server Exists"); return; } - // FIXME: verify this code: + unreal_log(ULOG_ERROR, "link", "REMOTE_LINK_DENIED_DUPLICATE_SERVER", client, + "Denied remote server $servername which was introduced by $client: " + "Already linked via $existing_client.server.uplink.", + log_data_string("servername", servername), + log_data_client("existing_client", acptr)); + // FIXME: oldest should die. + // FIXME: code below looks wrong, it checks direction TS instead of anything else acptr = acptr->direction; - ocptr = (cptr->local->firsttime > acptr->local->firsttime) ? acptr : cptr; - acptr = (cptr->local->firsttime > acptr->local->firsttime) ? cptr : acptr; - sendto_one(acptr, NULL, - "ERROR :Server %s already exists from %s", - servername, - (ocptr->direction ? ocptr->direction->name : "")); - sendto_ops_and_log - ("Link %s cancelled, server %s already exists from %s", - get_client_name(acptr, TRUE), servername, - (ocptr->direction ? ocptr->direction->name : "")); + ocptr = (direction->local->creationtime > acptr->local->creationtime) ? acptr : direction; + acptr = (direction->local->creationtime > acptr->local->creationtime) ? direction : acptr; + // FIXME: Wait, this kills entire acptr? Without sending SQUIT even :D exit_client(acptr, NULL, "Server Exists"); return; } + if ((acptr = find_client(parv[3], NULL))) + { + unreal_log(ULOG_ERROR, "link", "LINK_DENIED_DUPLICATE_SID_SERVER", client, + "Denied server $servername with SID $sid: Server with SID $existing_client.id ($existing_client) is already linked.", + log_data_string("servername", servername), + log_data_string("sid", parv[3]), + log_data_client("existing_client", acptr)); + sendto_one(client, NULL, "SQUIT %s :Server with this SID (%s) already exists (%s)", parv[3], parv[3], acptr->name); + return; + } + /* Check deny server { } */ if ((bconf = find_ban(NULL, servername, CONF_BAN_SERVER))) { - sendto_ops_and_log("Cancelling link %s, banned server %s", - get_client_name(cptr, TRUE), servername); - sendto_one(cptr, NULL, "ERROR :Banned server (%s)", bconf->reason ? bconf->reason : "no reason"); - exit_client(cptr, NULL, "Brought in banned server"); + unreal_log(ULOG_ERROR, "link", "REMOTE_LINK_DENIED_SERVER_BAN", client, + "Denied remote server $servername which was introduced by $client: " + "Server is banned ($ban_reason)", + log_data_string("ban_reason", bconf->reason)); + /* Before UnrealIRCd 6 this would SQUIT the server who introduced + * this server. That seems a bit of an overreaction, so we now + * send a SQUIT instead. + */ + sendto_one(client, NULL, "SQUIT %s :Banned server: %s", parv[3], bconf->reason); return; } /* OK, let us check the data now */ if (!valid_server_name(servername)) { - sendto_ops_and_log("Link %s introduced server with bad server name '%s' -- disconnecting", - client->name, servername); - exit_client(cptr, NULL, "Introduced server with bad server name"); + unreal_log(ULOG_ERROR, "link", "REMOTE_LINK_DENIED_INVALID_SERVERNAME", client, + "Denied remote server $servername which was introduced by $client: " + "Invalid server name.", + log_data_string("servername", servername)); + sendto_one(client, NULL, "SQUIT %s :Invalid servername", parv[3]); return; } - hop = atol(parv[2]); + hop = atoi(parv[2]); if (hop < 2) { - sendto_ops_and_log("Server %s introduced server %s with hop count of %d, while >1 was expected", - client->name, servername, hop); - exit_client(cptr, NULL, "ERROR :Invalid hop count"); + unreal_log(ULOG_ERROR, "link", "REMOTE_LINK_DENIED_INVALID_HOP_COUNT", client, + "Denied remote server $servername which was introduced by $client: " + "Invalid server name.", + log_data_string("servername", servername), + log_data_integer("hop_count", hop)); + sendto_one(client, NULL, "SQUIT %s :Invalid hop count (%d)", parv[3], hop); return; } - if (!valid_sid(parv[3])) + if (!client->direction->server->conf) { - sendto_ops_and_log("Server %s introduced server %s with invalid SID '%s' -- disconnecting", - client->name, servername, parv[3]); - exit_client(cptr, NULL, "ERROR :Invalid SID"); + unreal_log(ULOG_ERROR, "link", "BUG_LOST_CONFIG", client, + "[BUG] Lost link conf record for link $direction.", + log_data_client("direction", direction)); + exit_client(client->direction, NULL, "BUG: lost link configuration"); return; } - if (!cptr->serv->conf) - { - sendto_ops_and_log("Internal error: lost conf for %s!!, dropping link", cptr->name); - exit_client(cptr, NULL, "Internal error: lost configuration"); - return; - } - - aconf = cptr->serv->conf; + aconf = client->direction->server->conf; if (!aconf->hub) { - sendto_ops_and_log("Link %s cancelled, is Non-Hub but introduced Leaf %s", - cptr->name, servername); - exit_client(cptr, NULL, "Non-Hub Link"); + unreal_log(ULOG_ERROR, "link", "REMOTE_LINK_DENIED_NO_HUB", client, + "Denied remote server $servername which was introduced by $client: " + "Server may not introduce this server ($direction is not a hub).", + log_data_string("servername", servername), + log_data_client("direction", client->direction)); + sendto_one(client, NULL, "SQUIT %s :Server is not permitted to be a hub: %s", + parv[3], client->direction->name); return; } if (!match_simple(aconf->hub, servername)) { - sendto_ops_and_log("Link %s cancelled, linked in %s, which hub config disallows", - cptr->name, servername); - exit_client(cptr, NULL, "Not matching hub configuration"); + unreal_log(ULOG_ERROR, "link", "REMOTE_LINK_DENIED_NO_MATCHING_HUB", client, + "Denied remote server $servername which was introduced by $client: " + "Server may not introduce this server ($direction hubmask does not allow it).", + log_data_string("servername", servername), + log_data_client("direction", client->direction)); + sendto_one(client, NULL, "SQUIT %s :Hub config for %s does not allow introducing this server", + parv[3], client->direction->name); return; } @@ -739,31 +1271,37 @@ CMD_FUNC(cmd_sid) { if (!match_simple(aconf->leaf, servername)) { - sendto_ops_and_log("Link %s(%s) cancelled, disallowed by leaf configuration", - cptr->name, servername); - exit_client(cptr, NULL, "Disallowed by leaf configuration"); + unreal_log(ULOG_ERROR, "link", "REMOTE_LINK_DENIED_NO_MATCHING_LEAF", client, + "Denied remote server $servername which was introduced by $client: " + "Server may not introduce this server ($direction leaf config does not allow it).", + log_data_string("servername", servername), + log_data_client("direction", client->direction)); + sendto_one(client, NULL, "SQUIT %s :Leaf config for %s does not allow introducing this server", + parv[3], client->direction->name); return; } } if (aconf->leaf_depth && (hop > aconf->leaf_depth)) { - sendto_ops_and_log("Link %s(%s) cancelled, too deep depth", - cptr->name, servername); - exit_client(cptr, NULL, "Too deep link depth (leaf)"); + unreal_log(ULOG_ERROR, "link", "REMOTE_LINK_DENIED_LEAF_DEPTH", client, + "Denied remote server $servername which was introduced by $client: " + "Server may not introduce this server ($direction leaf depth config does not allow it).", + log_data_string("servername", servername), + log_data_client("direction", client->direction)); + sendto_one(client, NULL, "SQUIT %s :Leaf depth config for %s does not allow introducing this server", + parv[3], client->direction->name); return; } /* All approved, add the server */ - acptr = make_client(cptr, find_server(client->name, cptr)); + acptr = make_client(direction, find_server(client->name, direction)); strlcpy(acptr->name, servername, sizeof(acptr->name)); acptr->hopcount = hop; strlcpy(acptr->id, parv[3], sizeof(acptr->id)); strlcpy(acptr->info, parv[parc - 1], sizeof(acptr->info)); make_server(acptr); - acptr->serv->up = find_or_add(acptr->srvptr->name); SetServer(acptr); - ircd_log(LOG_SERVER, "SERVER %s (from %s)", acptr->name, acptr->srvptr->name); /* If this server is U-lined, or the parent is, then mark it as U-lined */ if (IsULine(client) || find_uline(acptr->name)) SetULine(acptr); @@ -774,10 +1312,18 @@ CMD_FUNC(cmd_sid) add_to_id_hash_table(acptr->id, acptr); list_move(&acptr->client_node, &global_server_list); + if (IsULine(client->direction) || IsSynched(client->direction)) + { + /* Log these (but don't show when still syncing) */ + unreal_log(ULOG_INFO, "link", "SERVER_LINKED_REMOTE", acptr, + "Server linked: $client -> $other_server", + log_data_client("other_server", client)); + } + RunHook(HOOKTYPE_SERVER_CONNECT, acptr); sendto_server(client, 0, 0, NULL, ":%s SID %s %d %s :%s", - acptr->srvptr->id, acptr->name, hop + 1, acptr->id, acptr->info); + acptr->uplink->id, acptr->name, hop + 1, acptr->id, acptr->info); RunHook(HOOKTYPE_POST_SERVER_CONNECT, acptr); } @@ -786,7 +1332,7 @@ void _introduce_user(Client *to, Client *acptr) { build_umode_string(acptr, 0, SEND_UMODES, buf); - sendto_one_nickcmd(to, acptr, buf); + sendto_one_nickcmd(to, NULL, acptr, buf); send_moddata_client(to, acptr); @@ -811,14 +1357,164 @@ void _introduce_user(Client *to, Client *acptr) } } -void tls_link_notification_verify(Client *acptr, ConfigItem_link *aconf) +#define SafeStr(x) ((x && *(x)) ? (x) : "*") + +/** Broadcast SINFO. + * @param cptr The server to send the information about. + * @param to The server to send the information TO (NULL for broadcast). + * @param except The direction NOT to send to. + * This function takes into account that the server may not + * provide all of the detailed info. If any information is + * absent we will send 0 for numbers and * for NULL strings. + */ +void _broadcast_sinfo(Client *acptr, Client *to, Client *except) { - char *spki_fp; - char *tls_fp; + char chanmodes[128], buf[512]; + + if (acptr->server->features.chanmodes[0]) + { + snprintf(chanmodes, sizeof(chanmodes), "%s,%s,%s,%s", + acptr->server->features.chanmodes[0], + acptr->server->features.chanmodes[1], + acptr->server->features.chanmodes[2], + acptr->server->features.chanmodes[3]); + } else { + strlcpy(chanmodes, "*", sizeof(chanmodes)); + } + + snprintf(buf, sizeof(buf), "%lld %d %s %s %s :%s", + (long long)acptr->server->boottime, + acptr->server->features.protocol, + SafeStr(acptr->server->features.usermodes), + chanmodes, + SafeStr(acptr->server->features.nickchars), + SafeStr(acptr->server->features.software)); + + if (to) + { + /* Targetted to one server */ + sendto_one(to, NULL, ":%s SINFO %s", acptr->id, buf); + } else { + /* Broadcast (except one side...) */ + sendto_server(except, 0, 0, NULL, ":%s SINFO %s", acptr->id, buf); + } +} + +/** Sync all information with server 'client'. + * Eg: users, channels, everything. + * @param client The newly linked in server + * @param aconf The link block that belongs to this server + * @note This function (via cmd_server) is called from both sides, so + * from the incoming side and the outgoing side. + */ +int server_sync(Client *client, ConfigItem_link *aconf, int incoming) +{ + Client *acptr; + + if (incoming) + { + /* If this is an incomming connection, then we have just received + * their stuff and now send our PASS, PROTOCTL and SERVER messages back. + */ + if (!IsEAuth(client)) /* if eauth'd then we already sent the passwd */ + sendto_one(client, NULL, "PASS :%s", (aconf->auth->type == AUTHTYPE_PLAINTEXT) ? aconf->auth->data : "*"); + + send_proto(client, aconf); + send_server_message(client); + } + + /* Broadcast new server to the rest of the network */ + sendto_server(client, 0, 0, NULL, ":%s SID %s 2 %s :%s", + client->uplink->id, client->name, client->id, client->info); + + /* Broadcast the just-linked-in featureset to other servers on our side */ + broadcast_sinfo(client, NULL, client); + + /* Send moddata of &me (if any, likely minimal) */ + send_moddata_client(client, &me); + + list_for_each_entry_reverse(acptr, &global_server_list, client_node) + { + /* acptr->direction == acptr for acptr == client */ + if (acptr->direction == client) + continue; + + if (IsServer(acptr)) + { + sendto_one(client, NULL, ":%s SID %s %d %s :%s", + acptr->uplink->id, + acptr->name, acptr->hopcount + 1, + acptr->id, acptr->info); + + /* Also signal to the just-linked server which + * servers are fully linked. + * Now you might ask yourself "Why don't we just + * assume every server you get during link phase + * is fully linked?", well.. there's a race condition + * if 2 servers link (almost) at the same time, + * then you would think the other one is fully linked + * while in fact he was not.. -- Syzop. + */ + if (acptr->server->flags.synced) + sendto_one(client, NULL, ":%s EOS", acptr->id); + /* Send SINFO of our servers to their side */ + broadcast_sinfo(acptr, client, NULL); + send_moddata_client(client, acptr); /* send moddata of server 'acptr' (if any, likely minimal) */ + } + } + + /* Synching nick information */ + list_for_each_entry_reverse(acptr, &client_list, client_node) + { + /* acptr->direction == acptr for acptr == client */ + if (acptr->direction == client) + continue; + if (IsUser(acptr)) + introduce_user(client, acptr); + } + /* + ** Last, pass all channels plus statuses + */ + { + Channel *channel; + for (channel = channels; channel; channel = channel->nextch) + { + send_channel_modes_sjoin3(client, channel); + if (channel->topic_time) + sendto_one(client, NULL, "TOPIC %s %s %lld :%s", + channel->name, channel->topic_nick, + (long long)channel->topic_time, channel->topic); + send_moddata_channel(client, channel); + } + } + + /* Send ModData for all member(ship) structs */ + send_moddata_members(client); + + /* pass on TKLs */ + tkl_sync(client); + + RunHook(HOOKTYPE_SERVER_SYNC, client); + + sendto_one(client, NULL, "NETINFO %i %lld %i %s 0 0 0 :%s", + irccounts.global_max, (long long)TStime(), UnrealProtocol, + CLOAK_KEY_CHECKSUM, + NETWORK_NAME); + + /* Send EOS (End Of Sync) to the just linked server... */ + sendto_one(client, NULL, ":%s EOS", me.id); + RunHook(HOOKTYPE_POST_SERVER_CONNECT, client); + return 0; +} + +void tls_link_notification_verify(Client *client, ConfigItem_link *aconf) +{ + const char *spki_fp; + const char *tls_fp; char *errstr = NULL; int verify_ok; - if (!MyConnect(acptr) || !acptr->local->ssl || !aconf) + if (!MyConnect(client) || !client->local->ssl || !aconf) return; if ((aconf->auth->type == AUTHTYPE_TLS_CLIENTCERT) || @@ -835,270 +1531,54 @@ void tls_link_notification_verify(Client *acptr, ConfigItem_link *aconf) return; } - tls_fp = moddata_client_get(acptr, "certfp"); - spki_fp = spki_fingerprint(acptr); + tls_fp = moddata_client_get(client, "certfp"); + spki_fp = spki_fingerprint(client); if (!tls_fp || !spki_fp) return; /* wtf ? */ /* Only bother the user if we are linking to UnrealIRCd 4.0.16+, * since only for these versions we can give precise instructions. */ - if (!acptr->serv || acptr->serv->features.protocol < 4016) + if (!client->server || client->server->features.protocol < 4016) return; - sendto_realops("You may want to consider verifying this server link."); - sendto_realops("More information about this can be found on https://www.unrealircd.org/Link_verification"); - verify_ok = verify_certificate(acptr->local->ssl, aconf->servername, &errstr); + verify_ok = verify_certificate(client->local->ssl, aconf->servername, &errstr); if (errstr && strstr(errstr, "not valid for hostname")) { - sendto_realops("Unfortunately the certificate of server '%s' has a name mismatch:", acptr->name); - sendto_realops("%s", errstr); - sendto_realops("This isn't a fatal error but it will prevent you from using verify-certificate yes;"); + unreal_log(ULOG_INFO, "link", "HINT_VERIFY_LINK", client, + "You may want to consider verifying this server link.\n" + "More information about this can be found on https://www.unrealircd.org/Link_verification\n" + "Unfortunately the certificate of server '$client' has a name mismatch:\n" + "$tls_verify_error\n" + "This isn't a fatal error but it will prevent you from using verify-certificate yes;", + log_data_link_block(aconf), + log_data_string("tls_verify_error", errstr)); } else if (!verify_ok) { - sendto_realops("In short: in the configuration file, change the 'link %s {' block to use this as a password:", acptr->name); - sendto_realops("password \"%s\" { spkifp; };", spki_fp); - sendto_realops("And follow the instructions on the other side of the link as well (which will be similar, but will use a different hash)"); + unreal_log(ULOG_INFO, "link", "HINT_VERIFY_LINK", client, + "You may want to consider verifying this server link.\n" + "More information about this can be found on https://www.unrealircd.org/Link_verification\n" + "In short: in the configuration file, change the 'link $client {' block to use this as a password:\n" + "password \"$spki_fingerprint\" { spkifp; };\n" + "And follow the instructions on the other side of the link as well (which will be similar, but will use a different hash)", + log_data_link_block(aconf), + log_data_string("spki_fingerprint", spki_fp)); } else { - sendto_realops("In short: in the configuration file, add the following to your 'link %s {' block:", acptr->name); - sendto_realops("verify-certificate yes;"); - sendto_realops("Alternatively, you could use SPKI fingerprint verification. Then change the password in the link block to be:"); - sendto_realops("password \"%s\" { spkifp; };", spki_fp); + unreal_log(ULOG_INFO, "link", "HINT_VERIFY_LINK", client, + "You may want to consider verifying this server link.\n" + "More information about this can be found on https://www.unrealircd.org/Link_verification\n" + "In short: in the configuration file, add the following to your 'link $client {' block:\n" + "verify-certificate yes;\n" + "Alternatively, you could use SPKI fingerprint verification. Then change the password in the link block to be:\n" + "password \"$spki_fingerprint\" { spki_fp; };", + log_data_link_block(aconf), + log_data_string("spki_fingerprint", spki_fp)); } } -#define SafeStr(x) ((x && *(x)) ? (x) : "*") - -/** Broadcast SINFO. - * @param cptr The server to send the information about. - * @param to The server to send the information TO (NULL for broadcast). - * @param except The direction NOT to send to. - * This function takes into account that the server may not - * provide all of the detailed info. If any information is - * absent we will send 0 for numbers and * for NULL strings. - */ -void _broadcast_sinfo(Client *acptr, Client *to, Client *except) -{ - char chanmodes[128], buf[512]; - - if (acptr->serv->features.chanmodes[0]) - { - snprintf(chanmodes, sizeof(chanmodes), "%s,%s,%s,%s", - acptr->serv->features.chanmodes[0], - acptr->serv->features.chanmodes[1], - acptr->serv->features.chanmodes[2], - acptr->serv->features.chanmodes[3]); - } else { - strlcpy(chanmodes, "*", sizeof(chanmodes)); - } - - snprintf(buf, sizeof(buf), "%lld %d %s %s %s :%s", - (long long)acptr->serv->boottime, - acptr->serv->features.protocol, - SafeStr(acptr->serv->features.usermodes), - chanmodes, - SafeStr(acptr->serv->features.nickchars), - SafeStr(acptr->serv->features.software)); - - if (to) - { - /* Targetted to one server */ - sendto_one(to, NULL, ":%s SINFO %s", acptr->id, buf); - } else { - /* Broadcast (except one side...) */ - sendto_server(except, 0, 0, NULL, ":%s SINFO %s", acptr->id, buf); - } -} - -int server_sync(Client *cptr, ConfigItem_link *aconf) -{ - char *inpath = get_client_name(cptr, TRUE); - Client *acptr; - int incoming = IsUnknown(cptr) ? 1 : 0; - - ircd_log(LOG_SERVER, "SERVER %s", cptr->name); - - if (cptr->local->passwd) - { - safe_free(cptr->local->passwd); - cptr->local->passwd = NULL; - } - if (incoming) - { - /* If this is an incomming connection, then we have just received - * their stuff and now send our stuff back. - */ - if (!IsEAuth(cptr)) /* if eauth'd then we already sent the passwd */ - sendto_one(cptr, NULL, "PASS :%s", (aconf->auth->type == AUTHTYPE_PLAINTEXT) ? aconf->auth->data : "*"); - - send_proto(cptr, aconf); - send_server_message(cptr); - } - - /* Set up server structure */ - free_pending_net(cptr); - SetServer(cptr); - irccounts.me_servers++; - irccounts.servers++; - irccounts.unknown--; - list_move(&cptr->client_node, &global_server_list); - list_move(&cptr->lclient_node, &lclient_list); - list_add(&cptr->special_node, &server_list); - if (find_uline(cptr->name)) - { - if (cptr->serv && cptr->serv->features.software && !strncmp(cptr->serv->features.software, "UnrealIRCd-", 11)) - { - sendto_realops("\002WARNING:\002 Bad ulines! It seems your server is misconfigured: " - "your ulines { } block is matching an UnrealIRCd server (%s). " - "This is not correct and will cause security issues. " - "ULines should only be added for services! " - "See https://www.unrealircd.org/docs/FAQ#bad-ulines", - cptr->name); - } - SetULine(cptr); - } - find_or_add(cptr->name); - if (IsSecure(cptr)) - { - sendto_umode_global(UMODE_OPER, - "(\2link\2) Secure link %s -> %s established (%s)", - me.name, inpath, tls_get_cipher(cptr->local->ssl)); - tls_link_notification_verify(cptr, aconf); - } - else - { - sendto_umode_global(UMODE_OPER, - "(\2link\2) Link %s -> %s established", - me.name, inpath); - /* Print out a warning if linking to a non-TLS server unless it's localhost. - * Yeah.. there are still other cases when non-TLS links are fine (eg: local IP - * of the same machine), we won't bother with detecting that. -- Syzop - */ - if (!IsLocalhost(cptr) && (iConf.plaintext_policy_server == POLICY_WARN)) - { - sendto_realops("\002WARNING:\002 This link is unencrypted (not SSL/TLS). We highly recommend to use " - "SSL/TLS for server linking. See https://www.unrealircd.org/docs/Linking_servers"); - } - if (IsSecure(cptr) && (iConf.outdated_tls_policy_server == POLICY_WARN) && outdated_tls_client(cptr)) - { - sendto_realops("\002WARNING:\002 This link is using an outdated SSL/TLS protocol or cipher (%s).", - tls_get_cipher(cptr->local->ssl)); - } - } - add_to_client_hash_table(cptr->name, cptr); - /* doesnt duplicate cptr->serv if allocted this struct already */ - make_server(cptr); - cptr->serv->up = me.name; - cptr->srvptr = &me; - if (!cptr->serv->conf) - cptr->serv->conf = aconf; /* Only set serv->conf to aconf if not set already! Bug #0003913 */ - if (incoming) - { - cptr->serv->conf->refcount++; - Debug((DEBUG_ERROR, "reference count for %s (%s) is now %d", - cptr->name, cptr->serv->conf->servername, cptr->serv->conf->refcount)); - } - cptr->serv->conf->class->clients++; - cptr->local->class = cptr->serv->conf->class; - RunHook(HOOKTYPE_SERVER_CONNECT, cptr); - - /* Broadcast new server to the rest of the network */ - sendto_server(cptr, 0, 0, NULL, ":%s SID %s 2 %s :%s", - cptr->srvptr->id, cptr->name, cptr->id, cptr->info); - - /* Broadcast the just-linked-in featureset to other servers on our side */ - broadcast_sinfo(cptr, NULL, cptr); - - /* Send moddata of &me (if any, likely minimal) */ - send_moddata_client(cptr, &me); - - list_for_each_entry_reverse(acptr, &global_server_list, client_node) - { - /* acptr->direction == acptr for acptr == cptr */ - if (acptr->direction == cptr) - continue; - - if (IsServer(acptr)) - { - sendto_one(cptr, NULL, ":%s SID %s %d %s :%s", - acptr->srvptr->id, - acptr->name, acptr->hopcount + 1, - acptr->id, acptr->info); - - /* Also signal to the just-linked server which - * servers are fully linked. - * Now you might ask yourself "Why don't we just - * assume every server you get during link phase - * is fully linked?", well.. there's a race condition - * if 2 servers link (almost) at the same time, - * then you would think the other one is fully linked - * while in fact he was not.. -- Syzop. - */ - if (acptr->serv->flags.synced) - { - sendto_one(cptr, NULL, ":%s EOS", acptr->id); -#ifdef DEBUGMODE - ircd_log(LOG_ERROR, "[EOSDBG] server_sync: sending to uplink '%s' with src %s...", - cptr->name, acptr->name); -#endif - } - /* Send SINFO of our servers to their side */ - broadcast_sinfo(acptr, cptr, NULL); - send_moddata_client(cptr, acptr); /* send moddata of server 'acptr' (if any, likely minimal) */ - } - } - - /* Synching nick information */ - list_for_each_entry_reverse(acptr, &client_list, client_node) - { - /* acptr->direction == acptr for acptr == cptr */ - if (acptr->direction == cptr) - continue; - if (IsUser(acptr)) - introduce_user(cptr, acptr); - } - /* - ** Last, pass all channels plus statuses - */ - { - Channel *channel; - for (channel = channels; channel; channel = channel->nextch) - { - send_channel_modes_sjoin3(cptr, channel); - if (channel->topic_time) - sendto_one(cptr, NULL, "TOPIC %s %s %lld :%s", - channel->chname, channel->topic_nick, - (long long)channel->topic_time, channel->topic); - send_moddata_channel(cptr, channel); - } - } - - /* Send ModData for all member(ship) structs */ - send_moddata_members(cptr); - - /* pass on TKLs */ - tkl_sync(cptr); - - RunHook(HOOKTYPE_SERVER_SYNC, cptr); - - sendto_one(cptr, NULL, "NETINFO %i %lld %i %s 0 0 0 :%s", - irccounts.global_max, (long long)TStime(), UnrealProtocol, - CLOAK_KEYCRC, - ircnetwork); - - /* Send EOS (End Of Sync) to the just linked server... */ - sendto_one(cptr, NULL, ":%s EOS", me.id); -#ifdef DEBUGMODE - ircd_log(LOG_ERROR, "[EOSDBG] server_sync: sending to justlinked '%s' with src ME...", - cptr->name); -#endif - RunHook(HOOKTYPE_POST_SERVER_CONNECT, cptr); - return 0; -} - /** This will send "to" a full list of the modes for channel channel, * * Half of it recoded by Syzop: the whole buffering and size checking stuff @@ -1118,8 +1598,9 @@ void send_channel_modes_sjoin3(Client *to, Channel *channel) char *p; /* points to somewhere in 'tbuf' */ int prebuflen = 0; /* points to after the > : part */ int sent = 0; /* we need this so we send at least 1 message about the channel (eg if +P and no members, no bans, #4459) */ + char modebuf[BUFSIZE], parabuf[BUFSIZE]; - if (*channel->chname != '#') + if (*channel->name != '#') return; nomode = 0; @@ -1129,7 +1610,11 @@ void send_channel_modes_sjoin3(Client *to, Channel *channel) /* First we'll send channel, channel modes and members and status */ *modebuf = *parabuf = '\0'; - channel_modes(to, modebuf, parabuf, sizeof(modebuf), sizeof(parabuf), channel); + channel_modes(to, modebuf, parabuf, sizeof(modebuf), sizeof(parabuf), channel, 1); + + /* Strip final space if needed */ + if (*parabuf && (parabuf[strlen(parabuf)-1] == ' ')) + parabuf[strlen(parabuf)-1] = '\0'; if (!modebuf[1]) nomode = 1; @@ -1148,19 +1633,19 @@ void send_channel_modes_sjoin3(Client *to, Channel *channel) { ircsnprintf(buf, sizeof(buf), ":%s SJOIN %lld %s :", me.id, - (long long)channel->creationtime, channel->chname); + (long long)channel->creationtime, channel->name); } if (nopara && !nomode) { ircsnprintf(buf, sizeof(buf), ":%s SJOIN %lld %s %s :", me.id, - (long long)channel->creationtime, channel->chname, modebuf); + (long long)channel->creationtime, channel->name, modebuf); } if (!nopara && !nomode) { ircsnprintf(buf, sizeof(buf), ":%s SJOIN %lld %s %s %s :", me.id, - (long long)channel->creationtime, channel->chname, modebuf, parabuf); + (long long)channel->creationtime, channel->name, modebuf, parabuf); } prebuflen = strlen(buf); @@ -1190,19 +1675,8 @@ void send_channel_modes_sjoin3(Client *to, Channel *channel) for (lp = members; lp; lp = lp->next) { - p = tbuf; - if (lp->flags & MODE_CHANOP) - *p++ = '@'; - if (lp->flags & MODE_VOICE) - *p++ = '+'; - if (lp->flags & MODE_HALFOP) - *p++ = '%'; - if (lp->flags & MODE_CHANOWNER) - *p++ = '*'; - if (lp->flags & MODE_CHANADMIN) - *p++ = '~'; - - p = mystpcpy(p, lp->client->id); + p = mystpcpy(tbuf, modes_to_sjoin_prefix(lp->member_modes)); /* eg @+ */ + p = mystpcpy(p, lp->client->id); /* nick (well, id) */ *p++ = ' '; *p = '\0'; @@ -1212,6 +1686,10 @@ void send_channel_modes_sjoin3(Client *to, Channel *channel) /* Would overflow, so send our current stuff right now (except new stuff) */ sendto_one(to, mtags, "%s", buf); sent++; + ircsnprintf(buf, sizeof(buf), + ":%s SJOIN %lld %s :", me.id, + (long long)channel->creationtime, channel->name); + prebuflen = strlen(buf); bufptr = buf + prebuflen; *bufptr = '\0'; } @@ -1235,6 +1713,10 @@ void send_channel_modes_sjoin3(Client *to, Channel *channel) /* Would overflow, so send our current stuff right now (except new stuff) */ sendto_one(to, mtags, "%s", buf); sent++; + ircsnprintf(buf, sizeof(buf), + ":%s SJOIN %lld %s :", me.id, + (long long)channel->creationtime, channel->name); + prebuflen = strlen(buf); bufptr = buf + prebuflen; *bufptr = '\0'; } @@ -1258,6 +1740,10 @@ void send_channel_modes_sjoin3(Client *to, Channel *channel) /* Would overflow, so send our current stuff right now (except new stuff) */ sendto_one(to, mtags, "%s", buf); sent++; + ircsnprintf(buf, sizeof(buf), + ":%s SJOIN %lld %s :", me.id, + (long long)channel->creationtime, channel->name); + prebuflen = strlen(buf); bufptr = buf + prebuflen; *bufptr = '\0'; } @@ -1281,6 +1767,10 @@ void send_channel_modes_sjoin3(Client *to, Channel *channel) /* Would overflow, so send our current stuff right now (except new stuff) */ sendto_one(to, mtags, "%s", buf); sent++; + ircsnprintf(buf, sizeof(buf), + ":%s SJOIN %lld %s :", me.id, + (long long)channel->creationtime, channel->name); + prebuflen = strlen(buf); bufptr = buf + prebuflen; *bufptr = '\0'; } @@ -1293,3 +1783,203 @@ void send_channel_modes_sjoin3(Client *to, Channel *channel) free_message_tags(mtags); } + +void server_generic_free(ModData *m) +{ + safe_free(m->ptr); +} + +int server_post_connect(Client *client) { + if (cfg.autoconnect_strategy == AUTOCONNECT_SEQUENTIAL_FALLBACK && last_autoconnect_server + && !strcmp(last_autoconnect_server, client->name)) + { + last_autoconnect_server = NULL; + } + return 0; +} + +/** Start an outgoing connection to a server, for server linking. + * @param aconf Configuration attached to this server + * @param by The user initiating the connection (can be NULL) + * @param hp The address to connect to. + */ +void _connect_server(ConfigItem_link *aconf, Client *by, struct hostent *hp) +{ + Client *client; + + if (!aconf->outgoing.hostname) + { + /* Actually the caller should make sure that this doesn't happen, + * so this error may never be triggered: + */ + unreal_log(ULOG_ERROR, "link", "LINK_ERROR_NO_OUTGOING", NULL, + "Connect to $link_block failed: link block is for incoming only (no link::outgoing::hostname set)", + log_data_link_block(aconf)); + return; + } + + if (!hp) + { + /* Remove "cache" */ + safe_free(aconf->connect_ip); + } + /* + * If we dont know the IP# for this host and itis a hostname and + * not a ip# string, then try and find the appropriate host record. + */ + if (!aconf->connect_ip) + { + if (is_valid_ip(aconf->outgoing.hostname)) + { + /* link::outgoing::hostname is an IP address. No need to resolve host. */ + safe_strdup(aconf->connect_ip, aconf->outgoing.hostname); + } else + { + /* It's a hostname, let the resolver look it up. */ + int ipv4_explicit_bind = 0; + + if (aconf->outgoing.bind_ip && (is_valid_ip(aconf->outgoing.bind_ip) == 4)) + ipv4_explicit_bind = 1; + + /* We need this 'aconf->refcount++' or else there's a race condition between + * starting resolving the host and the result of the resolver (we could + * REHASH in that timeframe) leading to an invalid (freed!) 'aconf'. + * -- Syzop, bug #0003689. + */ + aconf->refcount++; + unrealdns_gethostbyname_link(aconf->outgoing.hostname, aconf, ipv4_explicit_bind); + unreal_log(ULOG_INFO, "link", "LINK_RESOLVING", NULL, + "Resolving hostname $link_block.hostname...", + log_data_link_block(aconf)); + /* Going to resolve the hostname, in the meantime we return (asynchronous operation) */ + return; + } + } + client = make_client(NULL, &me); + client->local->hostp = hp; + /* + * Copy these in so we have something for error detection. + */ + strlcpy(client->name, aconf->servername, sizeof(client->name)); + strlcpy(client->local->sockhost, aconf->outgoing.hostname, HOSTLEN + 1); + + if (!connect_server_helper(aconf, client)) + { + fd_close(client->local->fd); + --OpenFiles; + client->local->fd = -2; + free_client(client); + /* Fatal error */ + return; + } + /* The socket has been connected or connect is in progress. */ + make_server(client); + client->server->conf = aconf; + client->server->conf->refcount++; + if (by && IsUser(by)) + strlcpy(client->server->by, by->name, sizeof(client->server->by)); + else + strlcpy(client->server->by, "AutoConn.", sizeof client->server->by); + SetConnecting(client); + SetOutgoing(client); + irccounts.unknown++; + list_add(&client->lclient_node, &unknown_list); + set_sockhost(client, aconf->outgoing.hostname); + add_client_to_list(client); + + if (aconf->outgoing.options & CONNECT_TLS) + { + SetTLSConnectHandshake(client); + fd_setselect(client->local->fd, FD_SELECT_WRITE, unreal_tls_client_handshake, client); + } + else + fd_setselect(client->local->fd, FD_SELECT_WRITE, completed_connection, client); + + unreal_log(ULOG_INFO, "link", "LINK_CONNECTING", client, + "Trying to activate link with server $client ($link_block.ip:$link_block.port)...", + log_data_link_block(aconf)); +} + +/** Helper function for connect_server() to prepare the actual bind()'ing and connect(). + * This will also take care of logging/sending error messages. + * @param aconf Configuration entry of the server. + * @param client The client entry that we will use and fill in. + * @returns 1 on success, 0 on failure. + */ +static int connect_server_helper(ConfigItem_link *aconf, Client *client) +{ + char *bindip; + char buf[BUFSIZE]; + + if (!aconf->connect_ip) + { + unreal_log(ULOG_ERROR, "link", "LINK_ERROR_NOIP", client, + "Connect to $client failed: no IP address to connect to", + log_data_link_block(aconf)); + return 0; /* handled upstream or shouldn't happen */ + } + + if (strchr(aconf->connect_ip, ':')) + SetIPV6(client); + + safe_strdup(client->ip, aconf->connect_ip); + + snprintf(buf, sizeof buf, "Outgoing connection: %s", get_client_name(client, TRUE)); + client->local->fd = fd_socket(IsIPV6(client) ? AF_INET6 : AF_INET, SOCK_STREAM, 0, buf); + if (client->local->fd < 0) + { + if (ERRNO == P_EMFILE) + { + unreal_log(ULOG_ERROR, "link", "LINK_ERROR_MAXCLIENTS", client, + "Connect to $client failed: no more sockets available", + log_data_link_block(aconf)); + return 0; + } + unreal_log(ULOG_ERROR, "link", "LINK_ERROR_SOCKET", client, + "Connect to $client failed: could not create socket: $socket_error", + log_data_socket_error(-1), + log_data_link_block(aconf)); + return 0; + } + if (++OpenFiles >= maxclients) + { + unreal_log(ULOG_ERROR, "link", "LINK_ERROR_MAXCLIENTS", client, + "Connect to $client failed: no more connections available", + log_data_link_block(aconf)); + return 0; + } + + set_sockhost(client, aconf->outgoing.hostname); + + if (!aconf->outgoing.bind_ip && iConf.link_bindip) + bindip = iConf.link_bindip; + else + bindip = aconf->outgoing.bind_ip; + + if (bindip && strcmp("*", bindip)) + { + if (!unreal_bind(client->local->fd, bindip, 0, IsIPV6(client))) + { + unreal_log(ULOG_ERROR, "link", "LINK_ERROR_SOCKET_BIND", client, + "Connect to $client failed: could not bind socket to $link_block.bind_ip: $socket_error -- " + "Your link::outgoing::bind-ip is probably incorrect.", + log_data_socket_error(client->local->fd), + log_data_link_block(aconf)); + return 0; + } + } + + set_sock_opts(client->local->fd, client, IsIPV6(client)); + + if (!unreal_connect(client->local->fd, client->ip, aconf->outgoing.port, IsIPV6(client))) + { + unreal_log(ULOG_ERROR, "link", "LINK_ERROR_CONNECT", client, + "Connect to $client ($link_block.ip:$link_block.port) failed: $socket_error", + log_data_socket_error(client->local->fd), + log_data_link_block(aconf)); + return 0; + } + + return 1; +} + diff --git a/src/modules/sethost.c b/src/modules/sethost.c index 01be159..510123f 100644 --- a/src/modules/sethost.c +++ b/src/modules/sethost.c @@ -33,7 +33,7 @@ ModuleHeader MOD_HEADER "5.0", /* Version */ "command /sethost", /* Short description of module */ "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -61,7 +61,7 @@ MOD_UNLOAD() */ CMD_FUNC(cmd_sethost) { - char *vhost; + const char *vhost; if (MyUser(client) && !ValidatePermissionsForPath("self:set:host",client,NULL,NULL,NULL)) { @@ -88,7 +88,7 @@ CMD_FUNC(cmd_sethost) return; } - if (!valid_host(vhost)) + if (!valid_host(vhost, 0)) { sendnotice(client, "*** /SetHost Error: A hostname may only contain a-z, A-Z, 0-9, '-' & '.'."); return; diff --git a/src/modules/setident.c b/src/modules/setident.c index 05179e3..6409ce3 100644 --- a/src/modules/setident.c +++ b/src/modules/setident.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", /* Version */ "/setident", /* Short description of module */ "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -61,8 +61,7 @@ MOD_UNLOAD() */ CMD_FUNC(cmd_setident) { - - char *vident, *s; + const char *vident, *s; if ((parc < 2) || BadPtr(parv[1])) { diff --git a/src/modules/setname.c b/src/modules/setname.c index 85ab9c3..b37106f 100644 --- a/src/modules/setname.c +++ b/src/modules/setname.c @@ -23,8 +23,13 @@ #include "unrealircd.h" CMD_FUNC(cmd_setname); +char *setname_isupport_param(void); #define MSG_SETNAME "SETNAME" /* setname */ +#define STR_HELPER(x) #x +#define STR(x) STR_HELPER(x) + +long CAP_SETNAME = 0L; ModuleHeader MOD_HEADER = { @@ -32,18 +37,32 @@ ModuleHeader MOD_HEADER "5.0", /* Version */ "command /setname", /* Short description of module */ "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() { - CommandAdd(modinfo->handle, MSG_SETNAME, cmd_setname, 1, CMD_USER); + ClientCapabilityInfo cap; + ClientCapability *c; MARK_AS_OFFICIAL_MODULE(modinfo); + + CommandAdd(modinfo->handle, MSG_SETNAME, cmd_setname, 1, CMD_USER); + + memset(&cap, 0, sizeof(cap)); + cap.name = "setname"; + c = ClientCapabilityAdd(modinfo->handle, &cap, &CAP_SETNAME); + if (!c) + { + config_error("[%s] Failed to request setname cap: %s", MOD_HEADER.name, ModuleGetErrorStr(modinfo->handle)); + return MOD_FAILED; + } + return MOD_SUCCESS; } MOD_LOAD() { + ISupportAdd(modinfo->handle, "NAMELEN", setname_isupport_param()); return MOD_SUCCESS; } @@ -52,19 +71,23 @@ MOD_UNLOAD() return MOD_SUCCESS; } +char *setname_isupport_param(void){ + return STR(REALLEN); +} + /* cmd_setname - 12/05/1999 - Stskeeps * :prefix SETNAME :gecos * parv[1] - gecos * D: This will set your gecos to be (like (/setname :The lonely wanderer)) - yes it is experimental but anyways ;P - FREEDOM TO THE USERS! ;) + this is now compatible with IRCv3 SETNAME --k4be */ CMD_FUNC(cmd_setname) { int xx; - char tmpinfo[REALLEN + 1]; + char oldinfo[REALLEN + 1]; char spamfilter_user[NICKLEN + USERLEN + HOSTLEN + REALLEN + 64]; ConfigItem_ban *bconf; + MessageTag *mtags = NULL; if ((parc < 2) || BadPtr(parv[1])) { @@ -74,25 +97,38 @@ CMD_FUNC(cmd_setname) if (strlen(parv[1]) > REALLEN) { - if (MyConnect(client)) + if (!MyConnect(client)) + return; + if (HasCapabilityFast(client, CAP_SETNAME)) { - sendnotice(client, "*** /SetName Error: \"Real names\" may maximum be %i characters of length", - REALLEN); + new_message(client, recv_mtags, &mtags); + sendto_one(client, mtags, ":%s FAIL SETNAME INVALID_REALNAME :\"Real names\" may maximum be %i characters of length", me.name, REALLEN); + free_message_tags(mtags); + } + else + { + sendnotice(client, "*** /SetName Error: \"Real names\" may maximum be %i characters of length", REALLEN); } return; } + strlcpy(oldinfo, client->info, sizeof(oldinfo)); + if (MyUser(client)) { - /* set temp info for spamfilter check*/ - strcpy(tmpinfo, client->info); /* set the new name before we check, but don't send to servers unless it is ok */ - strcpy(client->info, parv[1]); + strlcpy(client->info, parv[1], sizeof(client->info)); spamfilter_build_user_string(spamfilter_user, client->name, client); if (match_spamfilter(client, spamfilter_user, SPAMF_USER, "SETNAME", NULL, 0, NULL)) { /* Was rejected by spamfilter, restore the realname */ - strcpy(client->info, tmpinfo); + if (HasCapabilityFast(client, CAP_SETNAME)) + { + new_message(client, recv_mtags, &mtags); + sendto_one(client, mtags, "%s FAIL SETNAME CANNOT_CHANGE_REALNAME :Rejected by server", me.name); + free_message_tags(mtags); + } + strlcpy(client->info, oldinfo, sizeof(client->info)); return; } @@ -105,14 +141,22 @@ CMD_FUNC(cmd_setname) } } else { /* remote user */ - strcpy(client->info, parv[1]); + strlcpy(client->info, parv[1], sizeof(client->info)); } - sendto_server(client, 0, 0, NULL, ":%s SETNAME :%s", client->id, parv[1]); + new_message(client, recv_mtags, &mtags); + sendto_local_common_channels(client, client, CAP_SETNAME, mtags, ":%s SETNAME :%s", client->name, client->info); + sendto_server(client, 0, 0, mtags, ":%s SETNAME :%s", client->id, parv[1]); + /* notify the sender */ if (MyConnect(client)) { - sendnotice(client, "Your \"real name\" is now set to be %s - you have to set it manually to undo it", - parv[1]); + if (HasCapabilityFast(client, CAP_SETNAME)) + sendto_prefix_one(client, client, mtags, ":%s SETNAME :%s", client->name, client->info); + else + sendnotice(client, "Your \"real name\" is now set to be %s - you have to set it manually to undo it", parv[1]); } + free_message_tags(mtags); + + RunHook(HOOKTYPE_REALNAME_CHANGED, client, oldinfo); } diff --git a/src/modules/silence.c b/src/modules/silence.c index 6fd6bb3..e2af9c8 100644 --- a/src/modules/silence.c +++ b/src/modules/silence.c @@ -30,7 +30,7 @@ ModuleHeader MOD_HEADER "5.0", "command /silence", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Structs */ @@ -104,7 +104,8 @@ MOD_UNLOAD() CMD_FUNC(cmd_silence) { Silence *s; - char action, *p; + const char *p; + char action; if (MyUser(client)) { @@ -121,7 +122,7 @@ CMD_FUNC(cmd_silence) { p++; } else - if (!strchr(p, '@') && !strchr(p, '.') && !strchr(p, '!') && !strchr(p, '*') && !find_person(p, NULL)) + if (!strchr(p, '@') && !strchr(p, '.') && !strchr(p, '!') && !strchr(p, '*') && !find_user(p, NULL)) { sendnumeric(client, ERR_NOSUCHNICK, parv[1]); return; diff --git a/src/modules/sinfo.c b/src/modules/sinfo.c index d41eedf..d297001 100644 --- a/src/modules/sinfo.c +++ b/src/modules/sinfo.c @@ -12,7 +12,7 @@ ModuleHeader MOD_HEADER "5.0", "Server information", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Forward declarations */ @@ -73,36 +73,36 @@ CMD_FUNC(sinfo_server) return; } - client->serv->boottime = atol(parv[1]); - client->serv->features.protocol = atoi(parv[2]); + client->server->boottime = atol(parv[1]); + client->server->features.protocol = atoi(parv[2]); if (!strcmp(parv[3], "*")) - safe_free(client->serv->features.usermodes); + safe_free(client->server->features.usermodes); else - safe_strdup(client->serv->features.usermodes, parv[3]); + safe_strdup(client->server->features.usermodes, parv[3]); if (!strcmp(parv[4], "*")) { - safe_free(client->serv->features.chanmodes[0]); - safe_free(client->serv->features.chanmodes[1]); - safe_free(client->serv->features.chanmodes[2]); - safe_free(client->serv->features.chanmodes[3]); + safe_free(client->server->features.chanmodes[0]); + safe_free(client->server->features.chanmodes[1]); + safe_free(client->server->features.chanmodes[2]); + safe_free(client->server->features.chanmodes[3]); } else { parse_chanmodes_protoctl(client, parv[4]); } if (!strcmp(parv[5], "*")) - safe_free(client->serv->features.nickchars); + safe_free(client->server->features.nickchars); else - safe_strdup(client->serv->features.nickchars, parv[5]); + safe_strdup(client->server->features.nickchars, parv[5]); /* Software is always the last parameter. It is currently parv[6] * but may change later. So always use parv[parc-1]. */ if (!strcmp(parv[parc-1], "*")) - safe_free(client->serv->features.software); + safe_free(client->server->features.software); else - safe_strdup(client->serv->features.software, parv[parc-1]); + safe_strdup(client->server->features.software, parv[parc-1]); /* Broadcast to 'the other side' of the net */ concat_params(buf, sizeof(buf), parc, parv); @@ -124,33 +124,33 @@ CMD_FUNC(sinfo_user) { sendtxtnumeric(client, "*** Server %s:", acptr->name); sendtxtnumeric(client, "Protocol: %d", - acptr->serv->features.protocol); + acptr->server->features.protocol); sendtxtnumeric(client, "Software: %s", - SafeDisplayStr(acptr->serv->features.software)); - if (!acptr->serv->boottime) + SafeDisplayStr(acptr->server->features.software)); + if (!acptr->server->boottime) { sendtxtnumeric(client, "Up since: -"); sendtxtnumeric(client, "Uptime: -"); } else { sendtxtnumeric(client, "Up since: %s", - pretty_date(acptr->serv->boottime)); + pretty_date(acptr->server->boottime)); sendtxtnumeric(client, "Uptime: %s", - pretty_time_val(TStime() - acptr->serv->boottime)); + pretty_time_val(TStime() - acptr->server->boottime)); } sendtxtnumeric(client, "User modes: %s", - SafeDisplayStr(acptr->serv->features.usermodes)); - if (!acptr->serv->features.chanmodes[0]) + SafeDisplayStr(acptr->server->features.usermodes)); + if (!acptr->server->features.chanmodes[0]) { sendtxtnumeric(client, "Channel modes: -"); } else { sendtxtnumeric(client, "Channel modes: %s,%s,%s,%s", - SafeDisplayStr(acptr->serv->features.chanmodes[0]), - SafeDisplayStr(acptr->serv->features.chanmodes[1]), - SafeDisplayStr(acptr->serv->features.chanmodes[2]), - SafeDisplayStr(acptr->serv->features.chanmodes[3])); + SafeDisplayStr(acptr->server->features.chanmodes[0]), + SafeDisplayStr(acptr->server->features.chanmodes[1]), + SafeDisplayStr(acptr->server->features.chanmodes[2]), + SafeDisplayStr(acptr->server->features.chanmodes[3])); } sendtxtnumeric(client, "Allowed nick characters: %s", - SafeDisplayStr(acptr->serv->features.nickchars)); + SafeDisplayStr(acptr->server->features.nickchars)); } } diff --git a/src/modules/sjoin.c b/src/modules/sjoin.c index 3a8048c..509be2b 100644 --- a/src/modules/sjoin.c +++ b/src/modules/sjoin.c @@ -29,12 +29,14 @@ CMD_FUNC(cmd_sjoin); ModuleHeader MOD_HEADER = { "sjoin", - "5.0", + "5.1", "command /sjoin", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; +char modebuf[BUFSIZE], parabuf[BUFSIZE]; + MOD_INIT() { CommandAdd(modinfo->handle, MSG_SJOIN, cmd_sjoin, MAXPARA, CMD_SERVER); @@ -55,7 +57,7 @@ MOD_UNLOAD() typedef struct xParv aParv; struct xParv { int parc; - char *parv[256]; + const char *parv[256]; }; aParv pparv; @@ -78,20 +80,32 @@ aParv *mp2parv(char *xmbuf, char *parmbuf) return (&pparv); } -void send_local_chan_mode(MessageTag *recv_mtags, Client *client, Channel *channel, char *modebuf, char *parabuf) +static void send_local_chan_mode(MessageTag *recv_mtags, Client *client, Channel *channel, char *modebuf, char *parabuf) { MessageTag *mtags = NULL; + int destroy_channel = 0; - new_message_special(client, recv_mtags, &mtags, ":%s MODE %s %s %s", client->name, channel->chname, modebuf, parabuf); + new_message_special(client, recv_mtags, &mtags, ":%s MODE %s %s %s", client->name, channel->name, modebuf, parabuf); sendto_channel(channel, client, NULL, 0, 0, SEND_LOCAL, mtags, - ":%s MODE %s %s %s", client->name, channel->chname, modebuf, parabuf); + ":%s MODE %s %s %s", client->name, channel->name, modebuf, parabuf); if (MyConnect(client)) - RunHook7(HOOKTYPE_LOCAL_CHANMODE, client, channel, mtags, modebuf, parabuf, 0, -1); + RunHook(HOOKTYPE_LOCAL_CHANMODE, client, channel, mtags, modebuf, parabuf, 0, -1, &destroy_channel); else - RunHook7(HOOKTYPE_REMOTE_CHANMODE, client, channel, mtags, modebuf, parabuf, 0, -1); + RunHook(HOOKTYPE_REMOTE_CHANMODE, client, channel, mtags, modebuf, parabuf, 0, -1, &destroy_channel); free_message_tags(mtags); } +/** Call send_local_chan_mode() for multiline modes */ +static void send_local_chan_mode_mlm(MessageTag *recv_mtags, Client *client, Channel *channel, MultiLineMode *mlm) +{ + if (mlm) + { + int i; + for (i = 0; i < mlm->numlines; i++) + send_local_chan_mode(recv_mtags, client, channel, mlm->modeline[i], mlm->paramline[i]); + } +} + /** SJOIN: Synchronize channel modes, +beI lists and users (server-to-server command) * Extensive technical documentation is available at: * https://www.unrealircd.org/docs/Server_protocol:SJOIN_command @@ -147,9 +161,10 @@ CMD_FUNC(cmd_sjoin) unsigned short merge; /**< same timestamp: merge their & our modes */ char pvar[MAXMODEPARAMS][MODEBUFLEN + 3]; char cbuf[1024]; - char nick[1024]; /**< nick or ban/invex/exempt being processed */ char scratch_buf[1024]; /**< scratch buffer */ - char prefix[16]; /**< prefix of nick for server to server traffic (eg: @) */ + char item[1024]; /**< nick or ban/invex/exempt being processed */ + char item_modes[MEMBERMODESLEN]; /**< item modes, eg "b" or "vhoaq" */ + char prefix[16]; /**< SJOIN prefix of item for server to server traffic (eg: @) */ char uid_buf[BUFSIZE]; /**< Buffer for server-to-server traffic which will be broadcasted to others (servers supporting SID/UID) */ char uid_sjsby_buf[BUFSIZE]; /**< Buffer for server-to-server traffic which will be broadcasted to others (servers supporting SID/UID and SJSBY) */ char sj3_parabuf[BUFSIZE]; /**< Prefix for the above SJOIN buffers (":xxx SJOIN #channel +mode :") */ @@ -158,11 +173,10 @@ CMD_FUNC(cmd_sjoin) aParv *ap; int pcount, i; Hook *h; + Cmode *cm; time_t ts, oldts; unsigned short b=0; char *tp, *p, *saved = NULL; - long modeflags; - char queue_s=0, queue_c=0; /* oh this is soooooo ugly :p */ if (!IsServer(client) || parc < 4) return; @@ -178,17 +192,38 @@ CMD_FUNC(cmd_sjoin) if (parc < 5) nomode = 1; - channel = get_channel(client, parv[2], CREATE); + channel = find_channel(parv[2]); + if (!channel) + { + channel = make_channel(parv[2]); + oldts = -1; + } else { + oldts = channel->creationtime; + } ts = (time_t)atol(parv[1]); + if (IsInvalidChannelTS(ts)) + { + unreal_log(ULOG_WARNING, "sjoin", "SJOIN_INVALID_TIMESTAMP", client, + "SJOIN for channel $channel has invalid timestamp $send_timestamp (from $client)", + log_data_channel("channel", channel), + log_data_integer("send_timestamp", ts)); + /* Pretend they match our creation time (matches U6 behavior in m_mode.c) */ + ts = channel->creationtime; + } + + if (oldts == -1) + { + /* Newly created channel (from our POV), so set the correct creationtime here */ + channel->creationtime = ts; + } else if (channel->creationtime > ts) { removeours = 1; - oldts = channel->creationtime; channel->creationtime = ts; } - else if ((channel->creationtime < ts) && (channel->creationtime != 0)) + else if (channel->creationtime < ts) { removetheirs = 1; } @@ -197,47 +232,29 @@ CMD_FUNC(cmd_sjoin) merge = 1; } - if (channel->creationtime == 0) - { - oldts = -1; - channel->creationtime = ts; - } - else - { - oldts = channel->creationtime; - } - - // FIXME: make it so services cannot screw this up so easily --- if possible... - if (ts < 750000) - { - if (ts != 0) - sendto_ops - ("Warning! Possible desync: SJOIN for channel %s has a fishy timestamp (%lld) [%s/%s]", - channel->chname, (long long)ts, client->name, client->direction->name); - } - parabuf[0] = '\0'; modebuf[0] = '+'; modebuf[1] = '\0'; /* Grab current modes -> modebuf & parabuf */ - channel_modes(client, modebuf, parabuf, sizeof(modebuf), sizeof(parabuf), channel); + channel_modes(client, modebuf, parabuf, sizeof(modebuf), sizeof(parabuf), channel, 1); /* Do we need to remove all our modes, bans/exempt/inves lists and -vhoaq our users? */ if (removeours) { Member *lp; - Membership *lp2; modebuf[0] = '-'; /* remove our modes if any */ - if (modebuf[1] != '\0') + if (!empty_mode(modebuf)) { MessageTag *mtags = NULL; + MultiLineMode *mlm; ap = mp2parv(modebuf, parabuf); - set_mode(channel, client, ap->parc, ap->parv, &pcount, pvar, 0); - send_local_chan_mode(recv_mtags, client, channel, modebuf, parabuf); + mlm = set_mode(channel, client, ap->parc, ap->parv, &pcount, pvar); + send_local_chan_mode_mlm(recv_mtags, client, channel, mlm); + safe_free_multilinemode(mlm); } /* remove bans */ /* reset the buffers */ @@ -274,39 +291,15 @@ CMD_FUNC(cmd_sjoin) } for (lp = channel->members; lp; lp = lp->next) { - lp2 = find_membership_link(lp->client->user->channel, channel); - if (!lp2) + Membership *lp2 = find_membership_link(lp->client->user->channel, channel); + + /* Remove all our modes, one by one */ + for (p = lp->member_modes; *p; p++) { - sendto_realops("Oops! channel->members && !find_membership_link"); - continue; + Addit(*p, lp->client->name); } - if (lp->flags & MODE_CHANOWNER) - { - lp->flags &= ~MODE_CHANOWNER; - Addit('q', lp->client->name); - } - if (lp->flags & MODE_CHANADMIN) - { - lp->flags &= ~MODE_CHANADMIN; - Addit('a', lp->client->name); - } - if (lp->flags & MODE_CHANOP) - { - lp->flags &= ~MODE_CHANOP; - Addit('o', lp->client->name); - } - if (lp->flags & MODE_HALFOP) - { - lp->flags &= ~MODE_HALFOP; - Addit('h', lp->client->name); - } - if (lp->flags & MODE_VOICE) - { - lp->flags &= ~MODE_VOICE; - Addit('v', lp->client->name); - } - /* Those should always match anyways */ - lp2->flags = lp->flags; + /* And clear all the flags in memory */ + *lp->member_modes = *lp2->member_modes = '\0'; } if (b > 1) { @@ -327,11 +320,6 @@ CMD_FUNC(cmd_sjoin) sj3_parabuf[0] = '\0'; for (i = 2; i <= (parc - 2); i++) { - if (!parv[i]) - { - sendto_ops("Got null parv in SJ3 code"); - continue; - } strlcat(sj3_parabuf, parv[i], sizeof sj3_parabuf); if (((i + 1) <= (parc - 2))) strlcat(sj3_parabuf, " ", sizeof sj3_parabuf); @@ -348,7 +336,7 @@ CMD_FUNC(cmd_sjoin) time_t setat = TStime(); /**< Set at timestamp */ int sjsby_info = 0; /**< Set to 1 if we receive SJSBY info to alter the above 2 vars */ - modeflags = 0; + *item_modes = 0; i = 0; tp = s; @@ -365,8 +353,10 @@ CMD_FUNC(cmd_sjoin) if (!end) { /* this obviously should never happen */ - sendto_ops("Malformed SJOIN piece from %s for channel %s: %s", - client->name, channel->chname, tp); + unreal_log(ULOG_WARNING, "sjoin", "SJOIN_INVALID_SJSBY", client, + "SJOIN for channel $channel has invalid SJSBY in item '$item' (from $client)", + log_data_channel("channel", channel), + log_data_string("item", s)); continue; } *end++ = '\0'; @@ -375,8 +365,10 @@ CMD_FUNC(cmd_sjoin) if (!p) { /* missing setby parameter */ - sendto_ops("Malformed SJOIN piece from %s for channel %s: %s", - client->name, channel->chname, tp); + unreal_log(ULOG_WARNING, "sjoin", "SJOIN_INVALID_SJSBY", client, + "SJOIN for channel $channel has invalid SJSBY in item '$item' (from $client)", + log_data_channel("channel", channel), + log_data_string("item", s)); continue; } *p++ = '\0'; @@ -388,92 +380,46 @@ CMD_FUNC(cmd_sjoin) tp = end; /* the remainder is used for the actual ban/exempt/invex */ } - while ( - (*tp == '@') || (*tp == '+') || (*tp == '%') - || (*tp == '*') || (*tp == '~') || (*tp == '&') - || (*tp == '"') || (*tp == '\'')) + /* Process the SJOIN prefixes... */ + for (p = tp; *p; p++) { - switch (*(tp++)) + char m = sjoin_prefix_to_mode(*p); + if (!m) + break; /* end of prefix stuff, or so we hope anyway :D */ + // TODO: do we want safety here for if one side has prefixmodes loaded + // and the other does not? and if so, in what way do we want this? + + strlcat_letter(item_modes, m, sizeof(item_modes)); + + /* For list modes (+beI) stop processing immediately, + * so we don't accidentally eat additional prefix chars. + */ + if (strchr("beI", m)) { - case '@': - modeflags |= CHFL_CHANOP; - break; - case '%': - modeflags |= CHFL_HALFOP; - break; - case '+': - modeflags |= CHFL_VOICE; - break; - case '*': - modeflags |= CHFL_CHANOWNER; - break; - case '~': - modeflags |= CHFL_CHANADMIN; - break; - case '&': - modeflags = CHFL_BAN; - goto getnick; - case '"': - modeflags = CHFL_EXCEPT; - goto getnick; - case '\'': - modeflags = CHFL_INVEX; - goto getnick; + p++; + break; } } -getnick: - /* First, set the appropriate prefix for server to server traffic. - * Note that 'prefix' is a 16 byte buffer but it's safe due to the limited - * number of choices as can be seen below: + /* Now set 'prefix' to the prefixes we encountered. + * This is basically the range tp..p */ - *prefix = '\0'; - p = prefix; - if (modeflags == CHFL_INVEX) - *p++ = '\''; - else if (modeflags == CHFL_EXCEPT) - *p++ = '\"'; - else if (modeflags == CHFL_BAN) - *p++ = '&'; - else - { - /* multiple options possible at the same time */ - if (modeflags & CHFL_CHANOWNER) - *p++ = '*'; - if (modeflags & CHFL_CHANADMIN) - *p++ = '~'; - if (modeflags & CHFL_CHANOP) - *p++ = '@'; - if (modeflags & CHFL_HALFOP) - *p++ = '%'; - if (modeflags & CHFL_VOICE) - *p++ = '+'; - } - *p = '\0'; + strlncpy(prefix, tp, sizeof(prefix), p - tp); - /* Now copy the "nick" (which can actually be a ban/invex/exempt). - * There's no size checking here but nick is 1024 bytes and we - * have 512 bytes input max. - */ - i = 0; - while ((*tp != ' ') && (*tp != '\0')) - nick[i++] = *(tp++); /* get nick */ - nick[i] = '\0'; - if (nick[0] == ' ') + /* Now copy the "nick" (which can actually be a ban/invex/exempt) */ + strlcpy(item, p, sizeof(item)); + if (*item == '\0') continue; - if (nick[0] == '\0') - continue; - Debug((DEBUG_DEBUG, "Got nick: %s", nick)); - if (!(modeflags & CHFL_BAN) && !(modeflags & CHFL_EXCEPT) && !(modeflags & CHFL_INVEX)) + + /* If not a list mode... then we deal with users... */ + if (!strchr(item_modes, 'b') && !strchr(item_modes, 'e') && !strchr(item_modes, 'I')) { Client *acptr; - /* A person joining */ - /* The user may no longer exist. This can happen in case of a * SVSKILL traveling in the other direction. Nothing to worry about. */ - if (!(acptr = find_person(nick, NULL))) + if (!(acptr = find_user(item, NULL))) continue; if (acptr->direction != client->direction) @@ -486,18 +432,18 @@ getnick: sendto_one(client, NULL, ":%s KICK %s %s :Fake direction", - me.id, channel->chname, acptr->name); - sendto_realops - ("Fake direction from user %s in SJOIN from %s(%s) at %s", - nick, client->srvptr->name, - client->name, channel->chname); + me.id, channel->name, acptr->name); + unreal_log(ULOG_WARNING, "sjoin", "SJOIN_FAKE_DIRECTION", client, + "Fake direction from server $client in SJOIN " + "for user $existing_client on $existing_client.user.servername " + "(item: $buf)", + log_data_client("existing_client", acptr), + log_data_string("buf", item)); continue; } if (removetheirs) - { - modeflags = 0; - } + *item_modes = '\0'; if (!IsMember(acptr, channel)) { @@ -505,30 +451,32 @@ getnick: */ MessageTag *mtags = NULL; - add_user_to_channel(channel, acptr, modeflags); - RunHook4(HOOKTYPE_REMOTE_JOIN, acptr, channel, recv_mtags, NULL); - new_message_special(acptr, recv_mtags, &mtags, ":%s JOIN %s", acptr->name, channel->chname); + add_user_to_channel(channel, acptr, item_modes); + RunHook(HOOKTYPE_REMOTE_JOIN, acptr, channel, recv_mtags); + new_message_special(acptr, recv_mtags, &mtags, ":%s JOIN %s", acptr->name, channel->name); send_join_to_local_users(acptr, channel, mtags); free_message_tags(mtags); } - CheckStatus('q', CHFL_CHANOWNER); - CheckStatus('a', CHFL_CHANADMIN); - CheckStatus('o', CHFL_CHANOP); - CheckStatus('h', CHFL_HALFOP); - CheckStatus('v', CHFL_VOICE); + /* Set the +vhoaq */ + for (p = item_modes; *p; p++) + Addit(*p, acptr->name); if (strlen(uid_buf) + strlen(prefix) + IDLEN > BUFSIZE - 10) { /* Send what we have and start a new buffer */ sendto_server(client, 0, PROTO_SJSBY, recv_mtags, "%s", uid_buf); - snprintf(uid_buf, sizeof(uid_buf), ":%s SJOIN %lld %s :", client->id, (long long)ts, sj3_parabuf); + snprintf(uid_buf, sizeof(uid_buf), ":%s SJOIN %lld %s :", client->id, (long long)ts, channel->name); /* Double-check the new buffer is sufficient to concat the data */ if (strlen(uid_buf) + strlen(prefix) + strlen(acptr->id) > BUFSIZE - 5) { - ircd_log(LOG_ERROR, "Oversized SJOIN: '%s' + '%s%s'", - uid_buf, prefix, acptr->id); - sendto_realops("Oversized SJOIN for %s -- see ircd log", channel->chname); + unreal_log(ULOG_ERROR, "sjoin", "BUG_OVERSIZED_SJOIN", client, + "Oversized SJOIN [$sjoin_place] in channel $channel when adding '$str$str2' to '$buf'", + log_data_channel("channel", channel), + log_data_string("sjoin_place", "UID-MEMBER"), + log_data_string("str", prefix), + log_data_string("str2", acptr->id), + log_data_string("buf", uid_buf)); continue; } } @@ -537,14 +485,18 @@ getnick: if (strlen(uid_sjsby_buf) + strlen(prefix) + IDLEN > BUFSIZE - 10) { /* Send what we have and start a new buffer */ - sendto_server(client, 0, PROTO_SJSBY, recv_mtags, "%s", uid_sjsby_buf); - snprintf(uid_sjsby_buf, sizeof(uid_sjsby_buf), ":%s SJOIN %lld %s :", client->id, (long long)ts, sj3_parabuf); + sendto_server(client, PROTO_SJSBY, 0, recv_mtags, "%s", uid_sjsby_buf); + snprintf(uid_sjsby_buf, sizeof(uid_sjsby_buf), ":%s SJOIN %lld %s :", client->id, (long long)ts, channel->name); /* Double-check the new buffer is sufficient to concat the data */ if (strlen(uid_sjsby_buf) + strlen(prefix) + strlen(acptr->id) > BUFSIZE - 5) { - ircd_log(LOG_ERROR, "Oversized SJOIN: '%s' + '%s%s'", - uid_sjsby_buf, prefix, acptr->id); - sendto_realops("Oversized SJOIN for %s -- see ircd log", channel->chname); + unreal_log(ULOG_ERROR, "sjoin", "BUG_OVERSIZED_SJOIN", client, + "Oversized SJOIN [$sjoin_place] in channel $channel when adding '$str$str2' to '$buf'", + log_data_channel("channel", channel), + log_data_string("sjoin_place", "SJS-MEMBER"), + log_data_string("str", prefix), + log_data_string("str2", acptr->id), + log_data_string("buf", uid_sjsby_buf)); continue; } } @@ -552,79 +504,86 @@ getnick: } else { + /* It's a list mode................ */ + const char *str; + if (removetheirs) continue; - /* For list modes (beI): validate the syntax */ - if (modeflags & (CHFL_BAN|CHFL_EXCEPT|CHFL_INVEX)) - { - char *str; - - /* non-extbans: prevent bans without ! or @. a good case of "should never happen". */ - if ((nick[0] != '~') && (!strchr(nick, '!') || !strchr(nick, '@') || (nick[0] == '!'))) - continue; - - str = clean_ban_mask(nick, MODE_ADD, client); - if (!str) - continue; /* invalid ban syntax */ - strlcpy(nick, str, sizeof(nick)); - } + /* Validate syntax */ + + /* non-extbans: prevent bans without ! or @. a good case of "should never happen". */ + if ((item[0] != '~') && (!strchr(item, '!') || !strchr(item, '@') || (item[0] == '!'))) + continue; + + str = clean_ban_mask(item, MODE_ADD, client, 0); + if (!str) + continue; /* invalid ban syntax */ + strlcpy(item, str, sizeof(item)); /* Adding of list modes */ - if (modeflags & CHFL_BAN) + if (*item_modes == 'b') { - if (add_listmode_ex(&channel->banlist, client, channel, nick, setby, setat) != -1) + if (add_listmode_ex(&channel->banlist, client, channel, item, setby, setat) != -1) { - Addit('b', nick); + Addit('b', item); } } - if (modeflags & CHFL_EXCEPT) + if (*item_modes == 'e') { - if (add_listmode_ex(&channel->exlist, client, channel, nick, setby, setat) != -1) + if (add_listmode_ex(&channel->exlist, client, channel, item, setby, setat) != -1) { - Addit('e', nick); + Addit('e', item); } } - if (modeflags & CHFL_INVEX) + if (*item_modes == 'I') { - if (add_listmode_ex(&channel->invexlist, client, channel, nick, setby, setat) != -1) + if (add_listmode_ex(&channel->invexlist, client, channel, item, setby, setat) != -1) { - Addit('I', nick); + Addit('I', item); } } - if (strlen(uid_buf) + strlen(prefix) + strlen(nick) > BUFSIZE - 10) + if (strlen(uid_buf) + strlen(prefix) + strlen(item) > BUFSIZE - 10) { /* Send what we have and start a new buffer */ sendto_server(client, 0, PROTO_SJSBY, recv_mtags, "%s", uid_buf); - snprintf(uid_buf, sizeof(uid_buf), ":%s SJOIN %lld %s :", client->id, (long long)ts, sj3_parabuf); + snprintf(uid_buf, sizeof(uid_buf), ":%s SJOIN %lld %s :", client->id, (long long)ts, channel->name); /* Double-check the new buffer is sufficient to concat the data */ - if (strlen(uid_buf) + strlen(prefix) + strlen(nick) > BUFSIZE - 5) + if (strlen(uid_buf) + strlen(prefix) + strlen(item) > BUFSIZE - 5) { - ircd_log(LOG_ERROR, "Oversized SJOIN: '%s' + '%s%s'", - uid_buf, prefix, nick); - sendto_realops("Oversized SJOIN for %s -- see ircd log", channel->chname); + unreal_log(ULOG_ERROR, "sjoin", "BUG_OVERSIZED_SJOIN", client, + "Oversized SJOIN [$sjoin_place] in channel $channel when adding '$str$str2' to '$buf'", + log_data_channel("channel", channel), + log_data_string("sjoin_place", "UID-LMODE"), + log_data_string("str", prefix), + log_data_string("str2", item), + log_data_string("buf", uid_buf)); continue; } } - sprintf(uid_buf+strlen(uid_buf), "%s%s ", prefix, nick); + sprintf(uid_buf+strlen(uid_buf), "%s%s ", prefix, item); *scratch_buf = '\0'; if (sjsby_info) add_sjsby(scratch_buf, setby, setat); strcat(scratch_buf, prefix); - strcat(scratch_buf, nick); + strcat(scratch_buf, item); strcat(scratch_buf, " "); if (strlen(uid_sjsby_buf) + strlen(scratch_buf) > BUFSIZE - 10) { /* Send what we have and start a new buffer */ sendto_server(client, PROTO_SJSBY, 0, recv_mtags, "%s", uid_sjsby_buf); - snprintf(uid_sjsby_buf, sizeof(uid_sjsby_buf), ":%s SJOIN %lld %s :", client->id, (long long)ts, sj3_parabuf); + snprintf(uid_sjsby_buf, sizeof(uid_sjsby_buf), ":%s SJOIN %lld %s :", client->id, (long long)ts, channel->name); /* Double-check the new buffer is sufficient to concat the data */ if (strlen(uid_sjsby_buf) + strlen(scratch_buf) > BUFSIZE - 5) { - ircd_log(LOG_ERROR, "Oversized SJOIN: '%s' + '%s'", uid_sjsby_buf, scratch_buf); - sendto_realops("Oversized SJOIN for %s -- see ircd log", channel->chname); + unreal_log(ULOG_ERROR, "sjoin", "BUG_OVERSIZED_SJOIN", client, + "Oversized SJOIN [$sjoin_place] in channel $channel when adding '$str' to '$buf'", + log_data_channel("channel", channel), + log_data_string("sjoin_place", "SJS-LMODE"), + log_data_string("str", scratch_buf), + log_data_string("buf", uid_sjsby_buf)); continue; } } @@ -634,11 +593,10 @@ getnick: } /* Send out any possible remainder.. */ - Debug((DEBUG_DEBUG, "Sending '%li %s :%s' to ", ts, parabuf, parv[parc - 1])); sendto_server(client, 0, PROTO_SJSBY, recv_mtags, "%s", uid_buf); sendto_server(client, PROTO_SJSBY, 0, recv_mtags, "%s", uid_sjsby_buf); - if (modebuf[1]) + if (!empty_mode(modebuf)) { modebuf[b] = '\0'; send_local_chan_mode(recv_mtags, client, channel, modebuf, parabuf); @@ -646,8 +604,8 @@ getnick: if (!merge && !removetheirs && !nomode) { - char paraback[1024]; MessageTag *mtags = NULL; + MultiLineMode *mlm; strlcpy(modebuf, parv[3], sizeof modebuf); parabuf[0] = '\0'; @@ -659,22 +617,22 @@ getnick: strlcat(parabuf, " ", sizeof parabuf); } } - strlcpy(paraback, parabuf, sizeof paraback); ap = mp2parv(modebuf, parabuf); - - set_mode(channel, client, ap->parc, ap->parv, &pcount, pvar, 0); - send_local_chan_mode(recv_mtags, client, channel, modebuf, parabuf); + mlm = set_mode(channel, client, ap->parc, ap->parv, &pcount, pvar); + send_local_chan_mode_mlm(recv_mtags, client, channel, mlm); + safe_free_multilinemode(mlm); } if (merge && !nomode) { CoreChannelModeTable *acp; + MultiLineMode *mlm; Mode oldmode; /**< The old mode (OUR mode) */ /* Copy current mode to oldmode (need to duplicate all extended mode params too..) */ memcpy(&oldmode, &channel->mode, sizeof(oldmode)); - memset(&oldmode.extmodeparams, 0, sizeof(oldmode.extmodeparams)); - extcmode_duplicate_paramlist(channel->mode.extmodeparams, oldmode.extmodeparams); + memset(&oldmode.mode_params, 0, sizeof(oldmode.mode_params)); + extcmode_duplicate_paramlist(channel->mode.mode_params, oldmode.mode_params); /* Now merge the modes */ strlcpy(modebuf, parv[3], sizeof modebuf); @@ -687,8 +645,15 @@ getnick: strlcat(parabuf, " ", sizeof parabuf); } } + + /* First we set the mode (in memory) BUT we don't send the + * mode change out to anyone, hence the immediate freeing + * of 'mlm'. We do the actual rebuilding of the string and + * sending it out a few lines further down. + */ ap = mp2parv(modebuf, parabuf); - set_mode(channel, client, ap->parc, ap->parv, &pcount, pvar, 0); + mlm = set_mode(channel, client, ap->parc, ap->parv, &pcount, pvar); + safe_free_multilinemode(mlm); /* Good, now we got modes, now for the differencing and outputting of modes * We first see if any para modes are set. @@ -696,53 +661,40 @@ getnick: strlcpy(modebuf, "-", sizeof modebuf); parabuf[0] = '\0'; b = 1; - /* however, is this really going to happen at all? may be unneeded */ - if (oldmode.limit && !channel->mode.limit) - { - Addsingle('l'); - } - if (oldmode.key[0] && !channel->mode.key[0]) - { - Addit('k', oldmode.key); - } - /* First, check if we have something they don't have.. - * note that: oldmode.* = us, channel->mode.* = them. - */ - for (i=0; i <= Channelmode_highest; i++) + /* Check if we had +s and it became +p, then revert it silently (as it is no-change) */ + if (has_channel_mode_raw(oldmode.mode, 's') && has_channel_mode(channel, 'p')) { - if ((Channelmode_Table[i].flag) && - (oldmode.extmode & Channelmode_Table[i].mode) && - !(channel->mode.extmode & Channelmode_Table[i].mode)) + /* stay +s ! */ + long mode_p = get_extmode_bitbychar('p'); + long mode_s = get_extmode_bitbychar('s'); + channel->mode.mode &= ~mode_p; + channel->mode.mode |= mode_s; + /* TODO: all the code of above would ideally be in a module */ + } + /* (And the other condition, +p to +s, is already handled below by the generic code) */ + + /* First, check if we had something that is now gone + * note that: oldmode.* = us, channel->mode.* = merged. + */ + for (cm=channelmodes; cm; cm = cm->next) + { + if (cm->letter && + !cm->local && + (oldmode.mode & cm->mode) && + !(channel->mode.mode & cm->mode)) { - if (Channelmode_Table[i].paracount) + if (cm->paracount) { - char *parax = cm_getparameter_ex(oldmode.extmodeparams, Channelmode_Table[i].flag); - //char *parax = Channelmode_Table[i].get_param(extcmode_get_struct(oldmode.extmodeparam, Channelmode_Table[i].flag)); - Addit(Channelmode_Table[i].flag, parax); + const char *parax = cm_getparameter_ex(oldmode.mode_params, cm->letter); + //char *parax = cm->get_param(extcmode_get_struct(oldmode.modeparam, cm->letter)); + Addit(cm->letter, parax); } else { - Addsingle(Channelmode_Table[i].flag); + Addsingle(cm->letter); } } } - /* Check if we had +s and it became +p, then revert it... */ - if ((oldmode.mode & MODE_SECRET) && (channel->mode.mode & MODE_PRIVATE)) - { - /* stay +s ! */ - channel->mode.mode &= ~MODE_PRIVATE; - channel->mode.mode |= MODE_SECRET; - Addsingle('p'); /* - */ - queue_s = 1; - } - /* Add single char modes... */ - for (acp = corechannelmodetable; acp->mode; acp++) - { - if ((oldmode.mode & acp->mode) && !(channel->mode.mode & acp->mode) && !acp->parameters) - { - Addsingle(acp->flag); - } - } if (b > 1) { Addsingle('+'); @@ -753,111 +705,74 @@ getnick: b = 1; } - if (queue_s) - Addsingle('s'); - - if (queue_c) - Addsingle('c'); - - for (acp = corechannelmodetable; acp->mode; acp++) - { - if (!(oldmode.mode & acp->mode) && (channel->mode.mode & acp->mode) && !acp->parameters) - { - Addsingle(acp->flag); - } - } - - /* Now, check if they have something we don't have.. - * note that: oldmode.* = us, channel->mode.* = them. + /* Now, check if merged modes contain something we didn't have before. + * note that: oldmode.* = us before, channel->mode.* = merged. + * + * First the simple single letter modes... */ - for (i=0; i <= Channelmode_highest; i++) + for (cm=channelmodes; cm; cm = cm->next) { - if ((Channelmode_Table[i].flag) && - !(oldmode.extmode & Channelmode_Table[i].mode) && - (channel->mode.extmode & Channelmode_Table[i].mode)) + if ((cm->letter) && + !(oldmode.mode & cm->mode) && + (channel->mode.mode & cm->mode)) { - if (Channelmode_Table[i].paracount) + if (cm->paracount) { - char *parax = cm_getparameter(channel, Channelmode_Table[i].flag); + const char *parax = cm_getparameter(channel, cm->letter); if (parax) { - Addit(Channelmode_Table[i].flag, parax); + Addit(cm->letter, parax); } } else { - Addsingle(Channelmode_Table[i].flag); + Addsingle(cm->letter); } } } /* now, if we had diffent para modes - this loop really could be done better, but */ - /* +l (limit) difference? */ - if (oldmode.limit && channel->mode.limit && (oldmode.limit != channel->mode.limit)) - { - channel->mode.limit = MAX(oldmode.limit, channel->mode.limit); - if (oldmode.limit != channel->mode.limit) - { - Addit('l', my_itoa(channel->mode.limit)); - } - } - - /* +k (key) difference? */ - if (oldmode.key[0] && channel->mode.key[0] && strcmp(oldmode.key, channel->mode.key)) - { - if (strcmp(oldmode.key, channel->mode.key) > 0) - { - strlcpy(channel->mode.key, oldmode.key, sizeof channel->mode.key); - } - else - { - Addit('k', channel->mode.key); - } - } - /* Now, check for any param differences in extended channel modes.. - * note that: oldmode.* = us, channel->mode.* = them. + * note that: oldmode.* = us before, channel->mode.* = merged. * if we win: copy oldmode to channel mode, if they win: send the mode */ - for (i=0; i <= Channelmode_highest; i++) + for (cm=channelmodes; cm; cm = cm->next) { - if (Channelmode_Table[i].flag && Channelmode_Table[i].paracount && - (oldmode.extmode & Channelmode_Table[i].mode) && - (channel->mode.extmode & Channelmode_Table[i].mode)) + if (cm->letter && cm->paracount && + (oldmode.mode & cm->mode) && + (channel->mode.mode & cm->mode)) { int r; - char *parax; - char flag = Channelmode_Table[i].flag; - void *ourm = GETPARASTRUCTEX(oldmode.extmodeparams, flag); + const char *parax; + char flag = cm->letter; + void *ourm = GETPARASTRUCTEX(oldmode.mode_params, flag); void *theirm = GETPARASTRUCT(channel, flag); - //CmodeParam *ourm = extcmode_get_struct(oldmode.extmodeparam,Channelmode_Table[i].flag); - //CmodeParam *theirm = extcmode_get_struct(channel->mode.extmodeparam, Channelmode_Table[i].flag); - r = Channelmode_Table[i].sjoin_check(channel, ourm, theirm); + r = cm->sjoin_check(channel, ourm, theirm); switch (r) { case EXSJ_WEWON: - parax = cm_getparameter_ex(oldmode.extmodeparams, flag); /* grab from old */ + parax = cm_getparameter_ex(oldmode.mode_params, flag); /* grab from old */ cm_putparameter(channel, flag, parax); /* put in new (won) */ break; case EXSJ_THEYWON: parax = cm_getparameter(channel, flag); - Debug((DEBUG_DEBUG, "sjoin: they won: '%s'", parax)); - Addit(Channelmode_Table[i].flag, parax); + Addit(cm->letter, parax); break; case EXSJ_SAME: - Debug((DEBUG_DEBUG, "sjoin: equal")); break; case EXSJ_MERGE: - parax = cm_getparameter_ex(oldmode.extmodeparams, flag); /* grab from old */ + parax = cm_getparameter_ex(oldmode.mode_params, flag); /* grab from old */ cm_putparameter(channel, flag, parax); /* put in new (won) */ Addit(flag, parax); break; default: - ircd_log(LOG_ERROR, "channel.c:m_sjoin:param diff checker: got unk. retval 0x%x??", r); + unreal_log(ULOG_ERROR, "sjoin", "BUG_SJOIN_CHECK", client, + "[BUG] channel.c:m_sjoin:param diff checker: unknown return value $return_value", + log_data_integer("return_value", r)); break; } } @@ -865,14 +780,11 @@ getnick: Addsingle('\0'); - if (modebuf[1]) - { + if (!empty_mode(modebuf)) send_local_chan_mode(recv_mtags, client, channel, modebuf, parabuf); - } /* free the oldmode.* crap :( */ - extcmode_free_paramlist(oldmode.extmodeparams); - /* memset(&oldmode.extmodeparams, 0, sizeof(oldmode.extmodeparams)); -- redundant? */ + extcmode_free_paramlist(oldmode.mode_params); } for (h = Hooks[HOOKTYPE_CHANNEL_SYNCED]; h; h = h->next) @@ -885,13 +797,12 @@ getnick: /* we should be synced by now, */ if ((oldts != -1) && (oldts != channel->creationtime)) { - MessageTag *mtags = NULL; - new_message(client, NULL, &mtags); - sendto_channel(channel, &me, NULL, 0, 0, SEND_LOCAL, NULL, - ":%s NOTICE %s :*** TS for %s changed from %lld to %lld", - me.name, channel->chname, channel->chname, - (long long)oldts, (long long)channel->creationtime); - free_message_tags(mtags); + unreal_log(ULOG_INFO, "channel", "CHANNEL_SYNC_TS_CHANGE", client, + "Channel $channel: timestamp changed from $old_ts -> $new_ts " + "after syncing with server $client.", + log_data_channel("channel", channel), + log_data_integer("old_ts", oldts), + log_data_integer("new_ts", channel->creationtime)); } /* If something went wrong with processing of the SJOIN above and diff --git a/src/modules/slog.c b/src/modules/slog.c new file mode 100644 index 0000000..63a8d82 --- /dev/null +++ b/src/modules/slog.c @@ -0,0 +1,190 @@ +/* + * IRC - Internet Relay Chat, src/modules/monitor.c + * (C) 2021 Bram Matthys and The UnrealIRCd Team + * + * See file AUTHORS in IRC package for additional names of + * the programmers. + * + * This program is free 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 1, or (at your option) + * any later version. + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "unrealircd.h" + +ModuleHeader MOD_HEADER + = { + "slog", + "5.0", + "S2S logging", + "UnrealIRCd Team", + "unrealircd-6", + }; + +/* Forward declarations */ +CMD_FUNC(cmd_slog); +void _do_unreal_log_remote_deliver(LogLevel loglevel, const char *subsystem, const char *event_id, MultiLine *msg, const char *json_serialized); + +MOD_TEST() +{ + MARK_AS_OFFICIAL_MODULE(modinfo); + EfunctionAddVoid(modinfo->handle, EFUNC_DO_UNREAL_LOG_REMOTE_DELIVER, _do_unreal_log_remote_deliver); + return MOD_SUCCESS; +} + +MOD_INIT() +{ + MARK_AS_OFFICIAL_MODULE(modinfo); + + CommandAdd(modinfo->handle, "SLOG", cmd_slog, MAXPARA, CMD_SERVER); + + return MOD_SUCCESS; +} + +MOD_LOAD() +{ + return MOD_SUCCESS; +} + +MOD_UNLOAD() +{ + return MOD_SUCCESS; +} + +/** Server to server logging command. + * This way remote servers can send a log message to all servers. + * The message is broadcasted on to the rest of the network. + * Syntax: + * parv[1]: loglevel (eg "info") + * parv[2]: subsystem (eg: "link") + * parv[3]: event ID (eg: "LINK_DENIED_AUTH_FAILED") + * parv[4]: log message (only the first line!) + * We also require the "unrealircd.org/json-log" message tag to be present + * and to contain a valid UnrealIRCd JSON log. + * In fact, for sending the log message to disk and everything, we ignore + * the message in parv[4] and use the "msg" in the JSON itself. + * This because the "msg" in the JSON can be multi-line (can contain \n's) + * while the message in parv[4] will only be the first line. + * + * Why not skip parv[4] altogether and not send it all? + * I think it is still useful to send these, both for easy watching + * at server to server traffic, and also so (services) servers don't have + * to implement a full JSON parser. + */ +CMD_FUNC(cmd_slog) +{ + LogLevel loglevel; + const char *subsystem; + const char *event_id; + const char *msg; + const char *msg_in_json; + char *json_incoming = NULL; + char *json_serialized = NULL; + MessageTag *m; + MultiLine *mmsg = NULL; + json_t *j, *jt; + json_error_t jerr; + const char *original_timestamp; + + if ((parc < 4) || BadPtr(parv[4])) + { + sendnumeric(client, ERR_NEEDMOREPARAMS, "SLOG"); + return; + } + + loglevel = log_level_stringtoval(parv[1]); + if (loglevel == ULOG_INVALID) + return; + subsystem = parv[2]; + if (!valid_subsystem(subsystem)) + return; + event_id = parv[3]; + if (!valid_event_id(event_id)) + return; + msg = parv[4]; + + m = find_mtag(recv_mtags, "unrealircd.org/json-log"); + if (m) + json_incoming = m->value; + + if (!json_incoming) + return; + // Was previously: unreal_log_raw(loglevel, subsystem, event_id, NULL, msg); // WRONG: this may re-broadcast too, so twice, including back to direction!!! + + /* Validate the JSON */ + j = json_loads(json_incoming, JSON_REJECT_DUPLICATES, &jerr); + if (!j) + { + unreal_log(ULOG_INFO, "log", "REMOTE_LOG_INVALID", client, + "Received malformed JSON in server-to-server log message (SLOG) from $client", + log_data_string("bad_json_serialized", json_incoming)); + return; + } + + jt = json_object_get(j, "msg"); + if (!jt || !(msg_in_json = json_string_value(jt))) + { + unreal_log(ULOG_INFO, "log", "REMOTE_LOG_INVALID", client, + "Missing 'msg' in JSON in server-to-server log message (SLOG) from $client", + log_data_string("bad_json_serialized", json_incoming)); + json_decref(j); + return; + } + mmsg = line2multiline(msg_in_json); + + /* Set "timestamp", and save the original one in "original_timestamp" (if it existed) */ + jt = json_object_get(j, "timestamp"); + if (jt) + { + original_timestamp = json_string_value(jt); + if (original_timestamp) + json_object_set_new(j, "original_timestamp", json_string(original_timestamp)); + } + json_object_set_new(j, "timestamp", json_string(timestamp_iso8601_now())); + json_object_set_new(j, "log_source", json_string(client->name)); + + /* Re-serialize the result */ + json_serialized = json_dumps(j, JSON_COMPACT); + + if (json_serialized) + do_unreal_log_internal_from_remote(loglevel, subsystem, event_id, mmsg, json_serialized, client); + + /* Broadcast to the other servers */ + sendto_server(client, 0, 0, recv_mtags, ":%s SLOG %s %s %s :%s", + client->id, + parv[1], parv[2], parv[3], parv[4]); + + /* Free everything */ + safe_free(json_serialized); + json_decref(j); + safe_free_multiline(mmsg); +} + +void _do_unreal_log_remote_deliver(LogLevel loglevel, const char *subsystem, const char *event_id, MultiLine *msg, const char *json_serialized) +{ + MessageTag *mtags = safe_alloc(sizeof(MessageTag)); + + safe_strdup(mtags->name, "unrealircd.org/json-log"); + safe_strdup(mtags->value, json_serialized); + + /* Note that we only send the first line (msg->line), + * even for a multi-line event. + * If the recipient really wants to see everything then + * they can use the JSON data. + */ + sendto_server(NULL, 0, 0, mtags, ":%s SLOG %s %s %s :%s", + me.id, + log_level_valtostring(loglevel), subsystem, event_id, msg->line); + + free_message_tags(mtags); +} diff --git a/src/modules/snomasks/Makefile.in b/src/modules/snomasks/Makefile.in deleted file mode 100644 index d5bb70f..0000000 --- a/src/modules/snomasks/Makefile.in +++ /dev/null @@ -1,55 +0,0 @@ -#************************************************************************ -#* IRC - Internet Relay Chat, src/modules/snomasks/Makefile -#* Copyright (C) The UnrealIRCd team -#* -#* This program is free 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 1, or (at your option) -#* any later version. -#* -#* 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., 675 Mass Ave, Cambridge, MA 02139, USA. -#*/ - -CC = "==== DO NOT RUN MAKE FROM THIS DIRECTORY ====" - -INCLUDES = ../../include/channel.h \ - ../../include/common.h ../../include/config.h ../../include/dbuf.h \ - ../../include/dynconf.h ../../include/fdlist.h ../../include/h.h \ - ../../include/ircsprintf.h \ - ../../include/license.h \ - ../../include/modules.h ../../include/modversion.h ../../include/msg.h \ - ../../include/numeric.h ../../include/proto.h ../../include/dns.h \ - ../../include/resource.h ../../include/setup.h \ - ../../include/struct.h ../../include/sys.h \ - ../../include/types.h ../../include/url.h \ - ../../include/version.h ../../include/whowas.h - -R_MODULES=\ - dccreject.so - -MODULES=$(R_MODULES) -MODULEFLAGS=@MODULEFLAGS@ -RM=@RM@ - -all: build - -build: $(MODULES) - -clean: - $(RM) -f *.o *.so *~ core - -############################################################################# -# .so's section -############################################################################# - -dccreject.so: dccreject.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o dccreject.so dccreject.c - diff --git a/src/modules/sqline.c b/src/modules/sqline.c index 6955c2d..a3a0bd9 100644 --- a/src/modules/sqline.c +++ b/src/modules/sqline.c @@ -33,7 +33,7 @@ ModuleHeader MOD_HEADER "5.0", /* Version */ "command /sqline", /* Short description of module */ "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* This is called on module init, before Server Ready */ @@ -64,8 +64,8 @@ MOD_UNLOAD() CMD_FUNC(cmd_sqline) { char mo[32]; - char *comment = (parc == 3) ? parv[2] : NULL; - char *tkllayer[9] = { + const char *comment = (parc == 3) ? parv[2] : NULL; + const char *tkllayer[9] = { me.name, /*0 server.name */ "+", /*1 +|- */ "Q", /*2 G */ diff --git a/src/modules/squit.c b/src/modules/squit.c index 28325d3..e17ac49 100644 --- a/src/modules/squit.c +++ b/src/modules/squit.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", "command /squit", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -59,9 +59,9 @@ MOD_UNLOAD() */ CMD_FUNC(cmd_squit) { - char *server; + const char *server; Client *target; - char *comment = (parc > 2 && parv[parc - 1]) ? parv[parc - 1] : client->name; + const char *comment = (parc > 2 && parv[parc - 1]) ? parv[parc - 1] : client->name; // FIXME: this function is way too confusing, and full of old shit? @@ -130,8 +130,10 @@ CMD_FUNC(cmd_squit) */ if (MyConnect(target) && !MyUser(client)) { - sendto_umode_global(UMODE_OPER, "Received SQUIT %s from %s (%s)", - target->name, get_client_name(client, FALSE), comment); + unreal_log(ULOG_INFO, "link", "SQUIT", client, + "SQUIT: Forced server disconnect of $target by $client ($reason)", + log_data_client("target", target), + log_data_string("reason", comment)); } else if (MyConnect(target)) { @@ -141,8 +143,10 @@ CMD_FUNC(cmd_squit) me.name); return; } - sendto_umode_global(UMODE_OPER, "Received SQUIT %s from %s (%s)", - target->name, get_client_name(client, FALSE), comment); + unreal_log(ULOG_INFO, "link", "SQUIT", client, + "SQUIT: Forced server disconnect of $target by $client ($reason)", + log_data_client("target", target), + log_data_string("reason", comment)); } exit_client_ex(target, client->direction, recv_mtags, comment); diff --git a/src/modules/staff.c b/src/modules/staff.c index e9462be..af8bc81 100644 --- a/src/modules/staff.c +++ b/src/modules/staff.c @@ -26,18 +26,13 @@ ModuleHeader MOD_HEADER "3.8", "/STAFF command", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; #define MSG_STAFF "STAFF" #define DEF_STAFF_FILE CONFDIR "/network.staff" -#define CONF_STAFF_FILE (staff_file ? staff_file : DEF_STAFF_FILE) -#ifdef USE_LIBCURL -#define STAFF_FILE (Download.path ? Download.path : CONF_STAFF_FILE) -#else -#define STAFF_FILE CONF_STAFF_FILE -#endif +#define STAFF_FILE (staff_file ? staff_file : DEF_STAFF_FILE) #define RPL_STAFF ":%s 700 %s :- %s" #define RPL_STAFFSTART ":%s 701 %s :- %s IRC Network Staff Information -" @@ -47,31 +42,13 @@ ModuleHeader MOD_HEADER /* Forward declarations */ static void unload_motd_file(MOTDFile *list); CMD_FUNC(cmd_staff); -static int cb_rehashflag(Client *client, char *flag); static int cb_test(ConfigFile *, ConfigEntry *, int, int *); static int cb_conf(ConfigFile *, ConfigEntry *, int); -static int cb_rehash(); -static int cb_stats(Client *client, char *flag); -#ifdef USE_LIBCURL -static int download_staff_file(ConfigEntry *ce); -static void download_staff_file_complete(char *url, char *file, char *errorbuf, int cached, void *dummy); -#endif -static void InitConf(); +static int cb_stats(Client *client, const char *flag); static void FreeConf(); static MOTDFile staff; -static char *staff_file; - -#ifdef USE_LIBCURL -struct { - unsigned is_url : 1; - unsigned once_completed : 1; - unsigned in_progress : 1; - char *file; // File name - char *path; // File path - char *url; // Full URL address -} Download; -#endif +static char *staff_file = NULL; MOD_TEST() { @@ -82,17 +59,10 @@ MOD_TEST() MOD_INIT() { MARK_AS_OFFICIAL_MODULE(modinfo); -#ifdef USE_LIBCURL - memset(&Download, 0, sizeof(Download)); - ModuleSetOptions(modinfo->handle, MOD_OPT_PERM, 1); -#endif memset(&staff, 0, sizeof(staff)); - InitConf(); CommandAdd(modinfo->handle, MSG_STAFF, cmd_staff, MAXPARA, CMD_USER); HookAdd(modinfo->handle, HOOKTYPE_CONFIGRUN, 0, cb_conf); - HookAdd(modinfo->handle, HOOKTYPE_REHASH, 0, cb_rehash); - HookAdd(modinfo->handle, HOOKTYPE_REHASHFLAG, 0, cb_rehashflag); HookAdd(modinfo->handle, HOOKTYPE_STATS, 0, cb_stats); return MOD_SUCCESS; @@ -108,140 +78,14 @@ MOD_UNLOAD() FreeConf(); unload_motd_file(&staff); -#ifdef USE_LIBCURL - safe_free(Download.path); - safe_free(Download.file); - safe_free(Download.url); -#endif - return MOD_SUCCESS; } -static int cb_rehash() -{ - FreeConf(); - InitConf(); - return 1; -} - -static void InitConf() -{ - staff_file = NULL; -} - static void FreeConf() { safe_free(staff_file); } -/*** web routines */ -#ifdef USE_LIBCURL -static void remove_staff_file() -{ - if (Download.path) - { - if (remove(Download.path) == -1) - { - if (config_verbose > 0) - config_status("Cannot remove file %s: %s", - Download.path, strerror(errno)); - } - safe_free(Download.path); - Download.path = NULL; - } -} - -static int download_staff_file(ConfigEntry *ce) -{ - int ret = 0; - struct stat sb; - char *file, *filename; - - if (Download.in_progress) - return 0; - - Download.is_url = 1; - safe_strdup(Download.url, ce->ce_vardata); - - file = url_getfilename(ce->ce_vardata); - filename = unreal_getfilename(file); - /* TODO: handle NULL returns */ - safe_strdup(Download.file, filename); - safe_free(file); - - if (!loop.ircd_rehashing && !Download.once_completed) - { - char *error; - - if (config_verbose > 0) - config_status("Downloading %s", displayurl(Download.url)); - - if (!(file = download_file(ce->ce_vardata, &error))) - { - config_error("%s:%i: test: error downloading '%s': %s", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum, - displayurl(ce->ce_vardata), error); - return -1; - } - - Download.once_completed = 1; - safe_strdup(Download.path, file); - read_motd(Download.path, &staff); - - safe_free(file); - return 0; - } - - file = Download.path ? Download.path : Download.file; - - if ((ret = stat(file, &sb)) && errno != ENOENT) - { - /* I know, stat shouldn't fail... */ - config_error("%s:%i: could not get the creation time of %s: stat() returned %d: %s", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum, - Download.file, ret, strerror(errno)); - return -1; - } - - if (config_verbose > 0) - config_status("Downloading %s", displayurl(Download.url)); - - Download.in_progress = 1; - download_file_async(Download.url, sb.st_ctime, download_staff_file_complete, NULL); - return 0; -} - -static void download_staff_file_complete(char *url, char *file, char *errorbuf, int cached, void *dummy) -{ - Download.in_progress = 0; - Download.once_completed = 1; - - if (!cached) - { - if (!file) - { - config_error("Error downloading %s: %s", - displayurl(url), errorbuf); - return; - } - - remove_staff_file(); - safe_strdup(Download.path, file); - read_motd(Download.path, &staff); - } else - { - char *urlfile = url_getfilename(url); - char *file = unreal_getfilename(urlfile); - char *tmp = unreal_mktemp("tmp", file); - /* TODO: handle null returns ? */ - unreal_copyfile(Download.path, tmp); - remove_staff_file(); - safe_strdup(Download.path, tmp); - safe_free(urlfile); - } -} -#endif - static void unload_motd_file(MOTDFile *list) { MOTDLine *old, *new; @@ -266,28 +110,11 @@ static void unload_motd_file(MOTDFile *list) static int cb_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) { int errors = 0; -#ifdef USE_LIBCURL - char *file = NULL, *filename = NULL; -#endif if (type == CONFIG_SET) { - if (!strcmp(ce->ce_varname, "staff-file")) + if (!strcmp(ce->name, "staff-file")) { -#ifdef USE_LIBCURL - if (url_is_valid(ce->ce_vardata)) - { - /* TODO: hm, relax this one? */ - if (!(file = url_getfilename(ce->ce_vardata)) || !(filename = unreal_getfilename(file))) - { - config_error("%s:%i: invalid filename in URL", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); - errors++; - } - safe_free(file); - } -#endif - *errs = errors; return errors ? -1 : 1; } @@ -300,26 +127,10 @@ static int cb_conf(ConfigFile *cf, ConfigEntry *ce, int type) { if (type == CONFIG_SET) { - if (!strcmp(ce->ce_varname, "staff-file")) + if (!strcmp(ce->name, "staff-file")) { -#ifdef USE_LIBCURL - if (!Download.in_progress) - { - safe_strdup(staff_file, ce->ce_vardata); - if (url_is_valid(ce->ce_vardata)) - { - download_staff_file(ce); - } - else -#endif - { - convert_to_absolute_path(&ce->ce_vardata, CONFDIR); - read_motd(ce->ce_vardata, &staff); - } -#ifdef USE_LIBCURL - } - -#endif + convert_to_absolute_path(&ce->value, CONFDIR); + read_motd(ce->value, &staff); return 1; } } @@ -327,7 +138,7 @@ static int cb_conf(ConfigFile *cf, ConfigEntry *ce, int type) return 0; } -static int cb_stats(Client *client, char *flag) +static int cb_stats(Client *client, const char *flag) { if (*flag == 'S') { @@ -338,28 +149,6 @@ static int cb_stats(Client *client, char *flag) return 0; } -static int cb_rehashflag(Client *client, char *flag) -{ - int myflag = 0; - - /* "-all" only keeps compatibility with beta19 */ - if (match_simple("-all", flag) || (myflag = match_simple("-staff", flag))) - { - if (myflag) - sendto_ops("%sRehashing network staff file on the request of %s", - MyUser(client) ? "Remotely " : "", client->name); - -#ifdef USE_LIBCURL - if (Download.is_url) - read_motd(Download.path, &staff); - else -#endif - read_motd(CONF_STAFF_FILE, &staff); - } - - return 0; -} - /** The routine that actual does the /STAFF command */ CMD_FUNC(cmd_staff) { @@ -369,7 +158,7 @@ CMD_FUNC(cmd_staff) if (!IsUser(client)) return; - if (hunt_server(client, recv_mtags, ":%s STAFF", 1, parc, parv) != HUNTED_ISME) + if (hunt_server(client, recv_mtags, "STAFF", 1, parc, parv) != HUNTED_ISME) return; if (!staff.lines) @@ -378,7 +167,7 @@ CMD_FUNC(cmd_staff) return; } - sendto_one(client, NULL, RPL_STAFFSTART, me.name, client->name, ircnetwork); + sendto_one(client, NULL, RPL_STAFFSTART, me.name, client->name, NETWORK_NAME); temp = &staff; diff --git a/src/modules/starttls.c b/src/modules/starttls.c index 03dc883..bdaee2f 100644 --- a/src/modules/starttls.c +++ b/src/modules/starttls.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", "command /starttls", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; long CLICAP_STARTTLS; @@ -71,7 +71,7 @@ CMD_FUNC(cmd_starttls) ctx = client->local->listener->ssl_ctx ? client->local->listener->ssl_ctx : ctx_server; tls_options = client->local->listener->tls_options ? client->local->listener->tls_options->options : iConf.tls_options->options; - /* Is SSL support enabled? (may not, if failed to load cert/keys/..) */ + /* This should never happen? */ if (!ctx) { /* Pretend STARTTLS is an unknown command, this is the safest approach */ @@ -97,14 +97,13 @@ CMD_FUNC(cmd_starttls) send_queued(client); SetStartTLSHandshake(client); - Debug((DEBUG_DEBUG, "Starting SSL handshake (due to STARTTLS) for %s", client->local->sockhost)); if ((client->local->ssl = SSL_new(ctx)) == NULL) goto fail; SetTLS(client); SSL_set_fd(client->local->ssl, client->local->fd); SSL_set_nonblocking(client->local->ssl); - if (!ircd_SSL_accept(client, client->local->fd)) { - Debug((DEBUG_DEBUG, "Failed SSL accept handshake in instance 1: %s", client->local->sockhost)); + if (!unreal_tls_accept(client, client->local->fd)) + { SSL_set_shutdown(client->local->ssl, SSL_RECEIVED_SHUTDOWN); SSL_smart_shutdown(client->local->ssl); SSL_free(client->local->ssl); diff --git a/src/modules/stats.c b/src/modules/stats.c index fcb84e2..513cfda 100644 --- a/src/modules/stats.c +++ b/src/modules/stats.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", "command /stats", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -53,39 +53,38 @@ MOD_UNLOAD() } extern MODVAR int max_connection_count; -extern char *get_client_name2(Client *, int); -int stats_banversion(Client *, char *); -int stats_links(Client *, char *); -int stats_denylinkall(Client *, char *); -int stats_gline(Client *, char *); -int stats_except(Client *, char *); -int stats_allow(Client *, char *); -int stats_command(Client *, char *); -int stats_oper(Client *, char *); -int stats_port(Client *, char *); -int stats_bannick(Client *, char *); -int stats_traffic(Client *, char *); -int stats_uline(Client *, char *); -int stats_vhost(Client *, char *); -int stats_denylinkauto(Client *, char *); -int stats_kline(Client *, char *); -int stats_banrealname(Client *, char *); -int stats_sqline(Client *, char *); -int stats_linkinfoint(Client *, char *, int); -int stats_linkinfo(Client *, char *); -int stats_linkinfoall(Client *, char *); -int stats_chanrestrict(Client *, char *); -int stats_shun(Client *, char *); -int stats_set(Client *, char *); -int stats_tld(Client *, char *); -int stats_uptime(Client *, char *); -int stats_denyver(Client *, char *); -int stats_notlink(Client *, char *); -int stats_class(Client *, char *); -int stats_officialchannels(Client *, char *); -int stats_spamfilter(Client *, char *); -int stats_fdtable(Client *, char *); +int stats_banversion(Client *, const char *); +int stats_links(Client *, const char *); +int stats_denylinkall(Client *, const char *); +int stats_gline(Client *, const char *); +int stats_except(Client *, const char *); +int stats_allow(Client *, const char *); +int stats_command(Client *, const char *); +int stats_oper(Client *, const char *); +int stats_port(Client *, const char *); +int stats_bannick(Client *, const char *); +int stats_traffic(Client *, const char *); +int stats_uline(Client *, const char *); +int stats_vhost(Client *, const char *); +int stats_denylinkauto(Client *, const char *); +int stats_kline(Client *, const char *); +int stats_banrealname(Client *, const char *); +int stats_sqline(Client *, const char *); +int stats_linkinfoint(Client *, const char *, int); +int stats_linkinfo(Client *, const char *); +int stats_linkinfoall(Client *, const char *); +int stats_chanrestrict(Client *, const char *); +int stats_shun(Client *, const char *); +int stats_set(Client *, const char *); +int stats_tld(Client *, const char *); +int stats_uptime(Client *, const char *); +int stats_denyver(Client *, const char *); +int stats_notlink(Client *, const char *); +int stats_class(Client *, const char *); +int stats_officialchannels(Client *, const char *); +int stats_spamfilter(Client *, const char *); +int stats_fdtable(Client *, const char *); #define SERVER_AS_PARA 0x1 #define FLAGS_AS_PARA 0x2 @@ -93,7 +92,7 @@ int stats_fdtable(Client *, char *); struct statstab { char flag; char *longflag; - int (*func)(Client *client, char *para); + int (*func)(Client *client, const char *para); int options; }; @@ -142,7 +141,7 @@ struct statstab StatsTable[] = { { 0, NULL, NULL, 0 } }; -int stats_compare(char *s1, char *s2) +int stats_compare(const char *s1, const char *s2) { /* The long stats flags are always lowercase */ while (*s1 == tolower(*s2)) @@ -171,7 +170,7 @@ static inline struct statstab *stats_binary_search(char c) { return NULL; } -static inline struct statstab *stats_search(char *s) { +static inline struct statstab *stats_search(const char *s) { int i; for (i = 0; StatsTable[i].flag; i++) if (!stats_compare(StatsTable[i].longflag,s)) @@ -179,7 +178,7 @@ static inline struct statstab *stats_search(char *s) { return NULL; } -static inline char *stats_combine_parv(char *p1, char *p2) +static inline char *stats_combine_parv(const char *p1, const char *p2) { static char buf[BUFSIZE+1]; ircsnprintf(buf, sizeof(buf), "%s %s", p1, p2); @@ -259,7 +258,7 @@ static inline int allow_user_stats_short(char c) return 0; } -static inline int allow_user_stats_long(char *s) +static inline int allow_user_stats_long(const char *s) { OperStat *os; for (os = iConf.allow_user_stats_ext; os; os = os->next) @@ -295,12 +294,12 @@ CMD_FUNC(cmd_stats) if (parc == 3 && parv[2][0] != '+' && parv[2][0] != '-') { - if (hunt_server(client, recv_mtags, ":%s STATS %s :%s", 2, parc, parv) != HUNTED_ISME) + if (hunt_server(client, recv_mtags, "STATS", 2, parc, parv) != HUNTED_ISME) return; } else if (parc == 4 && parv[2][0] != '+' && parv[2][0] != '-') { - if (hunt_server(client, recv_mtags, ":%s STATS %s %s %s", 2, parc, parv) != HUNTED_ISME) + if (hunt_server(client, recv_mtags, "STATS", 2, parc, parv) != HUNTED_ISME) return; } if (parc < 2 || !*parv[1]) @@ -382,20 +381,13 @@ CMD_FUNC(cmd_stats) */ if (stat->flag != 'S') { - RunHook2(HOOKTYPE_STATS, client, flags); + RunHook(HOOKTYPE_STATS, client, flags); } sendnumeric(client, RPL_ENDOFSTATS, stat->flag); - - if (!IsULine(client)) - sendto_snomask(SNO_EYES, "Stats \'%c\' requested by %s (%s@%s)", - stat->flag, client->name, client->user->username, GetHost(client)); - else - sendto_snomask(SNO_JUNK, "Stats \'%c\' requested by %s (%s@%s) [ulined]", - stat->flag, client->name, client->user->username, GetHost(client)); } -int stats_banversion(Client *client, char *para) +int stats_banversion(Client *client, const char *para) { ConfigItem_ban *bans; for (bans = conf_ban; bans; bans = bans->next) @@ -408,7 +400,7 @@ int stats_banversion(Client *client, char *para) return 0; } -int stats_links(Client *client, char *para) +int stats_links(Client *client, const char *para) { ConfigItem_link *link_p; #ifdef DEBUGMODE @@ -433,40 +425,42 @@ int stats_links(Client *client, char *para) else if (link_p->leaf) sendnumericfmt(client, RPL_STATSLLINE, "L %s * %s %d", link_p->leaf, link_p->servername, link_p->leaf_depth); - // TODO: send incoming allow list? (for opers only) } #ifdef DEBUGMODE list_for_each_entry(acptr, &client_list, client_node) - if (MyConnect(acptr) && acptr->serv && !IsMe(acptr)) + if (MyConnect(acptr) && acptr->server && !IsMe(acptr)) { - if (!acptr->serv->conf) + if (!acptr->server->conf) sendnotice(client, "client '%s' (%p) has NO CONF attached (? :P)", acptr->name, acptr); else sendnotice(client, "client '%s' (%p) has conf %p attached, refcount: %d, temporary: %s", acptr->name, acptr, - acptr->serv->conf, - acptr->serv->conf->refcount, - acptr->serv->conf->flag.temporary ? "YES" : "NO"); + acptr->server->conf, + acptr->server->conf->refcount, + acptr->server->conf->flag.temporary ? "YES" : "NO"); } #endif return 0; } -int stats_denylinkall(Client *client, char *para) +int stats_denylinkall(Client *client, const char *para) { ConfigItem_deny_link *links; + ConfigItem_mask *m; for (links = conf_deny_link; links; links = links->next) { if (links->flag.type == CRULE_ALL) - sendnumeric(client, RPL_STATSDLINE, - 'D', links->mask, links->prettyrule); + { + for (m = links->mask; m; m = m->next) + sendnumeric(client, RPL_STATSDLINE, 'D', m->mask, links->prettyrule); + } } return 0; } -int stats_gline(Client *client, char *para) +int stats_gline(Client *client, const char *para) { int cnt = 0; tkl_stats(client, TKL_GLOBAL|TKL_KILL, para, &cnt); @@ -474,7 +468,7 @@ int stats_gline(Client *client, char *para) return 0; } -int stats_spamfilter(Client *client, char *para) +int stats_spamfilter(Client *client, const char *para) { int cnt = 0; tkl_stats(client, TKL_SPAMF, para, &cnt); @@ -482,7 +476,7 @@ int stats_spamfilter(Client *client, char *para) return 0; } -int stats_except(Client *client, char *para) +int stats_except(Client *client, const char *para) { int cnt = 0; tkl_stats(client, TKL_EXCEPTION, para, &cnt); @@ -490,43 +484,41 @@ int stats_except(Client *client, char *para) return 0; } -int stats_allow(Client *client, char *para) +int stats_allow(Client *client, const char *para) { ConfigItem_allow *allows; + ConfigItem_mask *m; + for (allows = conf_allow; allows; allows = allows->next) { - sendnumeric(client, RPL_STATSILINE, - allows->ip, allows->hostname, - allows->maxperip, - allows->global_maxperip, - allows->class->name, - allows->server ? allows->server : defserv, - allows->port ? allows->port : 6667); + for (m = allows->mask; m; m = m->next) + { + sendnumeric(client, RPL_STATSILINE, + m->mask, "-", + allows->maxperip, + allows->global_maxperip, + allows->class->name, + allows->server ? allows->server : DEFAULT_SERVER, + allows->port ? allows->port : 6667); + } } return 0; } -int stats_command(Client *client, char *para) +int stats_command(Client *client, const char *para) { int i; RealCommand *mptr; for (i = 0; i < 256; i++) for (mptr = CommandHash[i]; mptr; mptr = mptr->next) if (mptr->count) -#ifndef DEBUGMODE sendnumeric(client, RPL_STATSCOMMANDS, mptr->cmd, mptr->count, mptr->bytes); -#else - sendnumeric(client, RPL_STATSCOMMANDS, mptr->cmd, - mptr->count, mptr->bytes, - mptr->lticks, mptr->lticks / CLOCKS_PER_SEC, - mptr->rticks, mptr->rticks / CLOCKS_PER_SEC); -#endif return 0; } -int stats_oper(Client *client, char *para) +int stats_oper(Client *client, const char *para) { ConfigItem_oper *oper_p; ConfigItem_mask *m; @@ -556,7 +548,7 @@ static char *stats_port_helper(ConfigItem_listen *listener) return buf; } -int stats_port(Client *client, char *para) +int stats_port(Client *client, const char *para) { ConfigItem_listen *listener; @@ -577,7 +569,7 @@ int stats_port(Client *client, char *para) return 0; } -int stats_bannick(Client *client, char *para) +int stats_bannick(Client *client, const char *para) { int cnt = 0; tkl_stats(client, TKL_NAME, para, &cnt); @@ -585,7 +577,7 @@ int stats_bannick(Client *client, char *para) return 0; } -int stats_traffic(Client *client, char *para) +int stats_traffic(Client *client, const char *para) { Client *acptr; IRCStatistics *sp; @@ -599,41 +591,13 @@ int stats_traffic(Client *client, char *para) { if (IsServer(acptr)) { - sp->is_sbs += acptr->local->sendB; - sp->is_sbr += acptr->local->receiveB; - sp->is_sks += acptr->local->sendK; - sp->is_skr += acptr->local->receiveK; - sp->is_sti += now - acptr->local->firsttime; + sp->is_sti += now - acptr->local->creationtime; sp->is_sv++; - if (sp->is_sbs > 1023) - { - sp->is_sks += (sp->is_sbs >> 10); - sp->is_sbs &= 0x3ff; - } - if (sp->is_sbr > 1023) - { - sp->is_skr += (sp->is_sbr >> 10); - sp->is_sbr &= 0x3ff; - } } else if (IsUser(acptr)) { - sp->is_cbs += acptr->local->sendB; - sp->is_cbr += acptr->local->receiveB; - sp->is_cks += acptr->local->sendK; - sp->is_ckr += acptr->local->receiveK; - sp->is_cti += now - acptr->local->firsttime; + sp->is_cti += now - acptr->local->creationtime; sp->is_cl++; - if (sp->is_cbs > 1023) - { - sp->is_cks += (sp->is_cbs >> 10); - sp->is_cbs &= 0x3ff; - } - if (sp->is_cbr > 1023) - { - sp->is_ckr += (sp->is_cbr >> 10); - sp->is_cbr &= 0x3ff; - } } else if (IsUnknown(acptr)) sp->is_ni++; @@ -648,17 +612,17 @@ int stats_traffic(Client *client, char *para) sendnumericfmt(client, RPL_STATSDEBUG, "local connections %u udp packets %u", sp->is_loc, sp->is_udp); sendnumericfmt(client, RPL_STATSDEBUG, "Client Server"); sendnumericfmt(client, RPL_STATSDEBUG, "connected %u %u", sp->is_cl, sp->is_sv); - sendnumericfmt(client, RPL_STATSDEBUG, "bytes sent %ld.%huK %ld.%huK", - sp->is_cks, sp->is_cbs, sp->is_sks, sp->is_sbs); - sendnumericfmt(client, RPL_STATSDEBUG, "bytes recv %ld.%huK %ld.%huK", - sp->is_ckr, sp->is_cbr, sp->is_skr, sp->is_sbr); + sendnumericfmt(client, RPL_STATSDEBUG, "messages sent %lld", me.local->traffic.messages_sent); + sendnumericfmt(client, RPL_STATSDEBUG, "messages received %lld", me.local->traffic.messages_received); + sendnumericfmt(client, RPL_STATSDEBUG, "bytes sent %lld", me.local->traffic.bytes_sent); + sendnumericfmt(client, RPL_STATSDEBUG, "bytes received %lld", me.local->traffic.bytes_received); sendnumericfmt(client, RPL_STATSDEBUG, "time connected %lld %lld", (long long)sp->is_cti, (long long)sp->is_sti); return 0; } -int stats_fdtable(Client *client, char *para) +int stats_fdtable(Client *client, const char *para) { int i; @@ -677,14 +641,14 @@ int stats_fdtable(Client *client, char *para) return 0; } -int stats_uline(Client *client, char *para) +int stats_uline(Client *client, const char *para) { ConfigItem_ulines *ulines; for (ulines = conf_ulines; ulines; ulines = ulines->next) sendnumeric(client, RPL_STATSULINE, ulines->servername); return 0; } -int stats_vhost(Client *client, char *para) +int stats_vhost(Client *client, const char *para) { ConfigItem_mask *m; ConfigItem_vhost *vhosts; @@ -700,20 +664,23 @@ int stats_vhost(Client *client, char *para) return 0; } -int stats_denylinkauto(Client *client, char *para) +int stats_denylinkauto(Client *client, const char *para) { ConfigItem_deny_link *links; + ConfigItem_mask *m; for (links = conf_deny_link; links; links = links->next) { if (links->flag.type == CRULE_AUTO) - sendnumeric(client, RPL_STATSDLINE, - 'd', links->mask, links->prettyrule); + { + for (m = links->mask; m; m = m->next) + sendnumeric(client, RPL_STATSDLINE, 'd', m->mask, links->prettyrule); + } } return 0; } -int stats_kline(Client *client, char *para) +int stats_kline(Client *client, const char *para) { int cnt = 0; tkl_stats(client, TKL_KILL, NULL, &cnt); @@ -721,7 +688,7 @@ int stats_kline(Client *client, char *para) return 0; } -int stats_banrealname(Client *client, char *para) +int stats_banrealname(Client *client, const char *para) { ConfigItem_ban *bans; for (bans = conf_ban; bans; bans = bans->next) @@ -735,14 +702,14 @@ int stats_banrealname(Client *client, char *para) return 0; } -int stats_sqline(Client *client, char *para) +int stats_sqline(Client *client, const char *para) { int cnt = 0; tkl_stats(client, TKL_NAME|TKL_GLOBAL, para, &cnt); return 0; } -int stats_chanrestrict(Client *client, char *para) +int stats_chanrestrict(Client *client, const char *para) { ConfigItem_deny_channel *dchans; ConfigItem_allow_channel *achans; @@ -757,7 +724,7 @@ int stats_chanrestrict(Client *client, char *para) return 0; } -int stats_shun(Client *client, char *para) +int stats_shun(Client *client, const char *para) { int cnt = 0; tkl_stats(client, TKL_GLOBAL|TKL_SHUN, para, &cnt); @@ -765,13 +732,13 @@ int stats_shun(Client *client, char *para) } /* should this be moved to a seperate stats flag? */ -int stats_officialchannels(Client *client, char *para) +int stats_officialchannels(Client *client, const char *para) { ConfigItem_offchans *x; for (x = conf_offchans; x; x = x->next) { - sendtxtnumeric(client, "%s %s", x->chname, x->topic ? x->topic : ""); + sendtxtnumeric(client, "%s %s", x->name, x->topic ? x->topic : ""); } return 0; } @@ -791,6 +758,14 @@ static void stats_set_anti_flood(Client *client, FloodSettings *f) f->name, floodoption_names[i], (int)f->limit[i], pretty_time_val(f->period[i])); } + if (i == FLD_LAG_PENALTY) + { + sendtxtnumeric(client, "anti-flood::%s::lag-penalty: %d msec", + f->name, (int)f->period[i]); + sendtxtnumeric(client, "anti-flood::%s::lag-penalty-bytes: %d", + f->name, + f->limit[i] == INT_MAX ? 0 : (int)f->limit[i]); + } else { sendtxtnumeric(client, "anti-flood::%s::%s: %d per %s", @@ -800,11 +775,12 @@ static void stats_set_anti_flood(Client *client, FloodSettings *f) } } -int stats_set(Client *client, char *para) +int stats_set(Client *client, const char *para) { char *uhallow; SecurityGroup *s; FloodSettings *f; + char modebuf[BUFSIZE], parabuf[BUFSIZE]; if (!ValidatePermissionsForPath("server:info:stats",client,NULL,NULL,NULL)) { @@ -813,8 +789,8 @@ int stats_set(Client *client, char *para) } sendtxtnumeric(client, "*** Configuration Report ***"); - sendtxtnumeric(client, "network-name: %s", ircnetwork); - sendtxtnumeric(client, "default-server: %s", defserv); + sendtxtnumeric(client, "network-name: %s", NETWORK_NAME); + sendtxtnumeric(client, "default-server: %s", DEFAULT_SERVER); if (SERVICES_NAME) { sendtxtnumeric(client, "services-server: %s", SERVICES_NAME); @@ -827,9 +803,9 @@ int stats_set(Client *client, char *para) { sendtxtnumeric(client, "sasl-server: %s", SASL_SERVER); } - sendtxtnumeric(client, "hiddenhost-prefix: %s", hidden_host); - sendtxtnumeric(client, "help-channel: %s", helpchan); - sendtxtnumeric(client, "cloak-keys: %s", CLOAK_KEYCRC); + sendtxtnumeric(client, "cloak-prefix: %s", CLOAK_PREFIX); + sendtxtnumeric(client, "help-channel: %s", HELP_CHANNEL); + sendtxtnumeric(client, "cloak-keys: %s", CLOAK_KEY_CHECKSUM); sendtxtnumeric(client, "kline-address: %s", KLINE_ADDRESS); if (GLINE_ADDRESS) sendtxtnumeric(client, "gline-address: %s", GLINE_ADDRESS); @@ -896,8 +872,6 @@ int stats_set(Client *client, char *para) sendtxtnumeric(client, "static-part: %s", STATIC_PART ? STATIC_PART : ""); sendtxtnumeric(client, "who-limit: %d", WHOLIMIT); sendtxtnumeric(client, "silence-limit: %d", SILENCE_LIMIT); - if (DNS_BINDIP) - sendtxtnumeric(client, "dns::bind-ip: %s", DNS_BINDIP); sendtxtnumeric(client, "ban-version-tkl-time: %s", pretty_time_val(BAN_VERSION_TKL_TIME)); if (LINK_BINDIP) sendtxtnumeric(client, "link::bind-ip: %s", LINK_BINDIP); @@ -932,7 +906,7 @@ int stats_set(Client *client, char *para) sendtxtnumeric(client, "outdated-tls-policy::user: %s", policy_valtostr(iConf.outdated_tls_policy_user)); sendtxtnumeric(client, "outdated-tls-policy::oper: %s", policy_valtostr(iConf.outdated_tls_policy_oper)); sendtxtnumeric(client, "outdated-tls-policy::server: %s", policy_valtostr(iConf.outdated_tls_policy_server)); - RunHook2(HOOKTYPE_STATS, client, "S"); + RunHook(HOOKTYPE_STATS, client, "S"); #ifndef _WIN32 sendtxtnumeric(client, "This server can handle %d concurrent sockets (%d clients + %d reserve)", maxclients+CLIENTS_RESERVE, maxclients, CLIENTS_RESERVE); @@ -940,34 +914,34 @@ int stats_set(Client *client, char *para) return 1; } -int stats_tld(Client *client, char *para) +int stats_tld(Client *client, const char *para) { ConfigItem_tld *tld; + ConfigItem_mask *m; for (tld = conf_tld; tld; tld = tld->next) { - sendnumeric(client, RPL_STATSTLINE, - tld->mask, tld->motd_file, tld->rules_file ? - tld->rules_file : "none"); + for (m = tld->mask; m; m = m->next) + sendnumeric(client, RPL_STATSTLINE, m->mask, tld->motd_file, tld->rules_file ? tld->rules_file : "none"); } return 0; } -int stats_uptime(Client *client, char *para) +int stats_uptime(Client *client, const char *para) { - time_t tmpnow; + long long uptime; - tmpnow = TStime() - me.local->since; + uptime = TStime() - me.local->fake_lag; sendnumeric(client, RPL_STATSUPTIME, - tmpnow / 86400, (tmpnow / 3600) % 24, (tmpnow / 60) % 60, - tmpnow % 60); + uptime / 86400, (uptime / 3600) % 24, (uptime / 60) % 60, + uptime % 60); sendnumeric(client, RPL_STATSCONN, max_connection_count, irccounts.me_max); return 0; } -int stats_denyver(Client *client, char *para) +int stats_denyver(Client *client, const char *para) { ConfigItem_deny_version *versions; for (versions = conf_deny_version; versions; versions = versions->next) @@ -978,7 +952,7 @@ int stats_denyver(Client *client, char *para) return 0; } -int stats_notlink(Client *client, char *para) +int stats_notlink(Client *client, const char *para) { ConfigItem_link *link_p; @@ -993,7 +967,7 @@ int stats_notlink(Client *client, char *para) return 0; } -int stats_class(Client *client, char *para) +int stats_class(Client *client, const char *para) { ConfigItem_class *classes; @@ -1009,31 +983,23 @@ int stats_class(Client *client, char *para) return 0; } -int stats_linkinfo(Client *client, char *para) +int stats_linkinfo(Client *client, const char *para) { return stats_linkinfoint(client, para, 0); } -int stats_linkinfoall(Client *client, char *para) +int stats_linkinfoall(Client *client, const char *para) { return stats_linkinfoint(client, para, 1); } -int stats_linkinfoint(Client *client, char *para, int all) +int stats_linkinfoint(Client *client, const char *para, int all) { -#ifndef DEBUGMODE - static char Sformat[] = "SendQ SendM SendBytes RcveM RcveBytes Open_since :Idle"; - static char Lformat[] = "%s%s %u %u %u %u %u %u :%u"; -#else - static char Sformat[] = "SendQ SendM SendBytes RcveM RcveBytes Open_since CPU :Idle"; - static char Lformat[] = "%s%s %u %u %u %u %u %u %s"; - char pbuf[96]; /* Should be enough for to ints */ -#endif int remote = 0; int wilds = 0; int doall = 0; - int showports = ValidatePermissionsForPath("server:info:stats",client,NULL,NULL,NULL); Client *acptr; + /* * send info about connections which match, or all if the * mask matches me.name. Only restrictions are on those who @@ -1051,7 +1017,9 @@ int stats_linkinfoint(Client *client, char *para, int all) } else para = me.name; - sendnumericfmt(client, RPL_STATSLINKINFO, "%s", Sformat); + + sendnumericfmt(client, RPL_STATSLINKINFO, "Name SendQ SendM SendBytes RcveM RcveBytes Open_since :Idle"); + if (!MyUser(client)) { remote = 1; @@ -1076,54 +1044,23 @@ int stats_linkinfoint(Client *client, char *para, int all) continue; } -#ifdef DEBUGMODE - ircsnprintf(pbuf, sizeof(pbuf), "%ld :%ld", (long)acptr->local->cputime, - (long)(acptr->user && MyConnect(acptr)) ? TStime() - acptr->local->last : 0); -#endif - if (ValidatePermissionsForPath("server:info:stats",client,NULL,NULL,NULL)) - { - sendnumericfmt(client, RPL_STATSLINKINFO, Lformat, - all ? - (get_client_name2(acptr, showports)) : - (get_client_name(acptr, FALSE)), - get_client_status(acptr), - (int)DBufLength(&acptr->local->sendQ), - (int)acptr->local->sendM, (int)acptr->local->sendK, - (int)acptr->local->receiveM, - (int)acptr->local->receiveK, - TStime() - acptr->local->firsttime, -#ifndef DEBUGMODE - (acptr->user && MyConnect(acptr)) ? - TStime() - acptr->local->last : 0); -#else - pbuf); -#endif - } - else if (!strchr(acptr->name, '.')) - sendnumericfmt(client, RPL_STATSLINKINFO, Lformat, - IsHidden(acptr) ? acptr->name : - all ? /* Potvin - PreZ */ - get_client_name2(acptr, showports) : - get_client_name(acptr, FALSE), - get_client_status(acptr), - (int)DBufLength(&acptr->local->sendQ), - (int)acptr->local->sendM, (int)acptr->local->sendK, - (int)acptr->local->receiveM, - (int)acptr->local->receiveK, - TStime() - acptr->local->firsttime, -#ifndef DEBUGMODE - (acptr->user && MyConnect(acptr)) ? - TStime() - acptr->local->last : 0); -#else - pbuf); -#endif + sendnumericfmt(client, RPL_STATSLINKINFO, + "%s%s %lld %lld %lld %lld %lld %lld :%lld", + acptr->name, get_client_status(acptr), + (long long)DBufLength(&acptr->local->sendQ), + (long long)acptr->local->traffic.messages_sent, + (long long)acptr->local->traffic.bytes_sent, + (long long)acptr->local->traffic.messages_received, + (long long)acptr->local->traffic.bytes_received, + (long long)(TStime() - acptr->local->creationtime), + (long long)(TStime() - acptr->local->last_msg_received)); } #ifdef DEBUGMODE list_for_each_entry(acptr, &client_list, client_node) { if (IsServer(acptr)) sendnotice(client, "Server %s is %s", - acptr->name, acptr->serv->flags.synced ? "SYNCED" : "NOT SYNCED!!"); + acptr->name, acptr->server->flags.synced ? "SYNCED" : "NOT SYNCED!!"); } #endif return 0; diff --git a/src/modules/sts.c b/src/modules/sts.c index 4d78d01..35a8c78 100644 --- a/src/modules/sts.c +++ b/src/modules/sts.c @@ -28,7 +28,7 @@ ModuleHeader MOD_HEADER "5.0", "Strict Transport Security CAP", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -66,7 +66,7 @@ int sts_capability_visible(Client *client) if (!IsSecure(client)) { if (iConf.tls_options && iConf.tls_options->sts_port) - return 1; /* YES, non-SSL user and set::tls::sts-policy configured */ + return 1; /* YES, non-TLS user and set::tls::sts-policy configured */ return 0; /* NO, there is no sts-policy */ } @@ -78,7 +78,7 @@ int sts_capability_visible(Client *client) return 0; } -char *sts_capability_parameter(Client *client) +const char *sts_capability_parameter(Client *client) { TLSOptions *ssl; static char buf[256]; diff --git a/src/modules/svsjoin.c b/src/modules/svsjoin.c index f0175ae..3dc7ddb 100644 --- a/src/modules/svsjoin.c +++ b/src/modules/svsjoin.c @@ -30,7 +30,7 @@ ModuleHeader MOD_HEADER "5.0", /* Version */ "command /svsjoin", /* Short description of module */ "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* This is called on module init, before Server Ready */ @@ -66,7 +66,7 @@ CMD_FUNC(cmd_svsjoin) if (!IsULine(client)) return; - if ((parc < 3) || !(target = find_person(parv[1], NULL))) + if ((parc < 3) || !(target = find_user(parv[1], NULL))) return; if (MyUser(target)) diff --git a/src/modules/svskill.c b/src/modules/svskill.c index a1121d4..415326c 100644 --- a/src/modules/svskill.c +++ b/src/modules/svskill.c @@ -29,7 +29,7 @@ ModuleHeader MOD_HEADER "5.0", /* Version */ "command /svskill", /* Short description of module */ "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; @@ -63,7 +63,7 @@ CMD_FUNC(cmd_svskill) { MessageTag *mtags = NULL; Client *target; - char *comment = "SVS Killed"; + const char *comment = "SVS Killed"; int n; if (parc < 2) @@ -76,7 +76,7 @@ CMD_FUNC(cmd_svskill) if (!IsULine(client)) return; - if (!(target = find_person(parv[1], NULL))) + if (!(target = find_user(parv[1], NULL))) return; /* for new_message() we use target here, makes sense for the exit_client, right? */ diff --git a/src/modules/svslusers.c b/src/modules/svslusers.c index a231929..9d9e069 100644 --- a/src/modules/svslusers.c +++ b/src/modules/svslusers.c @@ -34,7 +34,7 @@ ModuleHeader MOD_HEADER "5.0", "command /svslusers", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -66,7 +66,7 @@ CMD_FUNC(cmd_svslusers) { if (!IsULine(client) || parc < 4) return; - if (hunt_server(client, NULL, ":%s SVSLUSERS %s %s :%s", 1, parc, parv) == HUNTED_ISME) + if (hunt_server(client, NULL, "SVSLUSERS", 1, parc, parv) == HUNTED_ISME) { int temp; temp = atoi(parv[2]); diff --git a/src/modules/svsmode.c b/src/modules/svsmode.c index 3bbd85b..5fb4025 100644 --- a/src/modules/svsmode.c +++ b/src/modules/svsmode.c @@ -39,9 +39,11 @@ ModuleHeader MOD_HEADER "5.0", "command /svsmode and svs2mode", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; +char modebuf[BUFSIZE], parabuf[BUFSIZE]; + MOD_INIT() { CommandAdd(modinfo->handle, MSG_SVSMODE, cmd_svsmode, MAXPARA, CMD_SERVER|CMD_USER); @@ -63,8 +65,10 @@ MOD_UNLOAD() void unban_user(Client *client, Channel *channel, Client *acptr, char chmode) { Extban *extban; + const char *nextbanstr; Ban *ban, *bnext; Ban **banlist; + BanContext *b; char uhost[NICKLEN+USERLEN+HOSTLEN+6], vhost[NICKLEN+USERLEN+HOSTLEN+6]; char ihost[NICKLEN+USERLEN+HOSTLEN+6], chost[NICKLEN+USERLEN+HOSTLEN+6]; @@ -114,6 +118,11 @@ void unban_user(Client *client, Channel *channel, Client *acptr, char chmode) /* DO THE ACTUAL WORK */ + b = safe_alloc(sizeof(BanContext)); + b->client = acptr; + b->channel = channel; + b->ban_check_types = BANCHK_JOIN; + for (ban = *banlist; ban; ban = bnext) { bnext = ban->next; @@ -122,15 +131,15 @@ void unban_user(Client *client, Channel *channel, Client *acptr, char chmode) (*ihost && match_simple(ban->banstr, ihost)) || (*chost && match_simple(ban->banstr, chost))) { - add_send_mode_param(channel, client, '-', chmode, - ban->banstr); + add_send_mode_param(channel, client, '-', chmode, ban->banstr); del_listmode(banlist, channel, ban->banstr); } - else if (chmode != 'I' && *ban->banstr == '~' && (extban = findmod_by_bantype(ban->banstr[1]))) + else if (chmode != 'I' && *ban->banstr == '~' && (extban = findmod_by_bantype(ban->banstr, &nextbanstr))) { - if (extban->options & EXTBOPT_CHSVSMODE) + if ((extban->options & EXTBOPT_CHSVSMODE) && (extban->is_banned_events & b->ban_check_types)) { - if (extban->is_banned(acptr, channel, ban->banstr, BANCHK_JOIN, NULL, NULL)) + b->banstr = nextbanstr; + if (extban->is_banned(b)) { add_send_mode_param(channel, acptr, '-', chmode, ban->banstr); del_listmode(banlist, channel, ban->banstr); @@ -138,6 +147,7 @@ void unban_user(Client *client, Channel *channel, Client *acptr, char chmode) } } } + safe_free(b); } void clear_bans(Client *client, Channel *channel, char chmode) @@ -164,7 +174,7 @@ void clear_bans(Client *client, Channel *channel, char chmode) for (ban = *banlist; ban; ban = bnext) { bnext = ban->next; - if (chmode != 'I' && (*ban->banstr == '~') && (extban = findmod_by_bantype(ban->banstr[1]))) + if (chmode != 'I' && (*ban->banstr == '~') && (extban = findmod_by_bantype(ban->banstr, NULL))) { if (!(extban->options & EXTBOPT_CHSVSMODE)) continue; @@ -195,14 +205,14 @@ void clear_bans(Client *client, Channel *channel, char chmode) * * OLD syntax had a 'ts' parameter. No services are known to use this. */ -void channel_svsmode(Client *client, int parc, char *parv[]) +void channel_svsmode(Client *client, int parc, const char *parv[]) { Channel *channel; Client *target; - char *m; + const char *m; int what = MODE_ADD; int i = 4; // wtf is this - Member *cm; + Member *member; int channel_flags; *parabuf = *modebuf = '\0'; @@ -210,67 +220,70 @@ void channel_svsmode(Client *client, int parc, char *parv[]) if ((parc < 3) || BadPtr(parv[2])) return; - if (!(channel = find_channel(parv[1], NULL))) + if (!(channel = find_channel(parv[1]))) return; - for(m = parv[2]; *m; m++) + for (m = parv[2]; *m; m++) { - switch (*m) + if (*m == '+') { - case '+': - what = MODE_ADD; - break; - case '-': - what = MODE_DEL; - break; - case 'v': - case 'h': - case 'o': - case 'a': - case 'q': - if (what != MODE_DEL) + what = MODE_ADD; + } else + if (*m == '-') + { + what = MODE_DEL; + } else + if ((*m == 'b') || (*m == 'e') || (*m == 'I')) + { + if (parc >= i) + { + if (!(target = find_user(parv[i-1], NULL))) { - sendto_realops("Warning! Received SVS(2)MODE with +%c for %s from %s, which is invalid!!", - *m, channel->chname, client->name); - continue; - } - channel_flags = char_to_channelflag(*m); - for (cm = channel->members; cm; cm = cm->next) - { - if (cm->flags & channel_flags) - { - Membership *mb; - mb = find_membership_link(cm->client->user->channel, channel); - add_send_mode_param(channel, client, '-', *m, cm->client->name); - cm->flags &= ~channel_flags; - if (mb) - mb->flags = cm->flags; - } - } - break; - case 'b': - case 'e': - case 'I': - if (parc >= i) - { - if (!(target = find_person(parv[i-1], NULL))) - { - i++; - break; - } i++; + break; + } + i++; - unban_user(client, channel, target, *m); + unban_user(client, channel, target, *m); + } + else { + clear_bans(client, channel, *m); + } + } else + { + /* Find member mode handler (vhoaq) */ + Cmode *cm = find_channel_mode_handler(*m); + if (!cm || (cm->type != CMODE_MEMBER)) + { + unreal_log(ULOG_WARNING, "svsmode", "INVALID_SVSMODE", client, + "Invalid SVSMODE for mode '$mode_character' in channel $channel from $client.", + log_data_char("mode_character", *m), + log_data_channel("channel", channel)); + continue; + } + if (what != MODE_DEL) + { + unreal_log(ULOG_WARNING, "svsmode", "INVALID_SVSMODE", client, + "Invalid SVSMODE from $client trying to add '$mode_character' in $channel.", + log_data_char("mode_character", *m), + log_data_channel("channel", channel)); + continue; + } + for (member = channel->members; member; member = member->next) + { + if (check_channel_access_letter(member->member_modes, *m)) + { + Membership *mb = find_membership_link(member->client->user->channel, channel); + if (!mb) + continue; /* bug */ + + /* Send the -x out */ + add_send_mode_param(channel, client, '-', *m, member->client->name); + + /* And remove from memory */ + del_member_mode_fast(member, mb, *m); } - else { - clear_bans(client, channel, *m); - } - break; - default: - sendto_realops("Warning! Invalid mode `%c' used with 'SVSMODE %s %s %s' (from %s %s)", - *m, channel->chname, parv[2], parv[3] ? parv[3] : "", - client->direction->name, client->name); - break; + } } } @@ -278,16 +291,17 @@ void channel_svsmode(Client *client, int parc, char *parv[]) if (*parabuf) { MessageTag *mtags = NULL; + int destroy_channel = 0; /* NOTE: cannot use 'recv_mtag' here because MODE could be rewrapped. Not ideal :( */ new_message(client, NULL, &mtags); sendto_channel(channel, client, client, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s %s %s", - client->name, channel->chname, modebuf, parabuf); - sendto_server(NULL, 0, 0, mtags, ":%s MODE %s %s %s", client->id, channel->chname, modebuf, parabuf); + client->name, channel->name, modebuf, parabuf); + sendto_server(NULL, 0, 0, mtags, ":%s MODE %s %s %s", client->id, channel->name, modebuf, parabuf); /* Activate this hook just like cmd_mode.c */ - RunHook7(HOOKTYPE_REMOTE_CHANMODE, client, channel, mtags, modebuf, parabuf, 0, 0); + RunHook(HOOKTYPE_REMOTE_CHANMODE, client, channel, mtags, modebuf, parabuf, 0, 0, &destroy_channel); free_message_tags(mtags); @@ -300,17 +314,17 @@ void channel_svsmode(Client *client, int parc, char *parv[]) * This is used by both SVSMODE and SVS2MODE, when dealing with users (not channels). * parv[1] - nick to change mode for * parv[2] - modes to change - * parv[3] - Service Stamp (if mode == d) + * parv[3] - account name (if mode contains 'd') * * show_change can be 0 (for svsmode) or 1 (for svs2mode). */ -void do_svsmode(Client *client, MessageTag *recv_mtags, int parc, char *parv[], int show_change) +void do_svsmode(Client *client, MessageTag *recv_mtags, int parc, const char *parv[], int show_change) { - int i; - char *m; + Umode *um; + const char *m; Client *target; int what; - long setflags = 0; + long oldumodes = 0; if (!IsULine(client)) return; @@ -326,15 +340,12 @@ void do_svsmode(Client *client, MessageTag *recv_mtags, int parc, char *parv[], return; } - if (!(target = find_person(parv[1], NULL))) + if (!(target = find_user(parv[1], NULL))) return; userhost_save_current(target); - /* initialize setflag to be the user's pre-SVSMODE flags */ - for (i = 0; i <= Usermode_highest; i++) - if (Usermode_Table[i].flag && (target->umodes & Usermode_Table[i].mode)) - setflags |= Usermode_Table[i].mode; + oldumodes = target->umodes; /* parse mode change string(s) */ for (m = parv[2]; *m; m++) @@ -383,6 +394,8 @@ void do_svsmode(Client *client, MessageTag *recv_mtags, int parc, char *parv[], /* User is no longer oper (after the goto below, anyway)... * so remove all oper-only modes and snomasks. */ + if (MyUser(client)) + RunHook(HOOKTYPE_LOCAL_OPER, client, 0, NULL); remove_oper_privileges(target, 0); } goto setmodex; @@ -392,10 +405,15 @@ void do_svsmode(Client *client, MessageTag *recv_mtags, int parc, char *parv[], if (!IsOper(target) && !strchr(parv[2], 'o')) /* (ofcoz this strchr() is flawed) */ { /* isn't an oper, and would not become one either.. abort! */ - sendto_realops( - "[BUG] server %s tried to set +H while user not an oper, para=%s/%s, " - "umodes=%ld, please fix your services or if you think it's our fault, " - "report at https://bugs.unrealircd.org/", client->name, parv[1], parv[2], target->umodes); + unreal_log(ULOG_WARNING, "svsmode", "SVSMODE_INVALID", client, + "[BUG] Server $client tried to set user mode +H (hidden ircop) " + "on a user that is not +o (not ircop)! " + "Please fix your services, or if you think it is our fault, then " + "report at https://bugs.unrealircd.org/. " + "Parameters: $para1 $para2. Target: $target.", + log_data_string("para1", parv[1]), + log_data_string("para2", parv[2]), + log_data_client("target", target)); break; /* abort! */ } irccounts.operators--; @@ -406,8 +424,18 @@ void do_svsmode(Client *client, MessageTag *recv_mtags, int parc, char *parv[], case 'd': if (parv[3]) { - strlcpy(target->user->svid, parv[3], sizeof(target->user->svid)); - user_account_login(recv_mtags, target); + int was_logged_in = IsLoggedIn(target) ? 1 : 0; + strlcpy(target->user->account, parv[3], sizeof(target->user->account)); + if (!was_logged_in && !IsLoggedIn(target)) + { + /* We don't care about users going from not logged in + * to not logged in, which is something that can happen + * from 0 to 123456, eg from no account to unconfirmed account. + */ + } else { + /* LOGIN or LOGOUT (or account change) */ + user_account_login(recv_mtags, target); + } if (MyConnect(target) && IsDead(target)) return; /* was killed due to *LINE on ~a probably */ } @@ -477,16 +505,14 @@ void do_svsmode(Client *client, MessageTag *recv_mtags, int parc, char *parv[], break; default: setmodex: - for (i = 0; i <= Usermode_highest; i++) + for (um = usermodes; um; um = um->next) { - if (!Usermode_Table[i].flag) - continue; - if (*m == Usermode_Table[i].flag) + if (um->letter == *m) { if (what == MODE_ADD) - target->umodes |= Usermode_Table[i].mode; + target->umodes |= um->mode; else - target->umodes &= ~Usermode_Table[i].mode; + target->umodes &= ~um->mode; break; } } @@ -503,15 +529,15 @@ void do_svsmode(Client *client, MessageTag *recv_mtags, int parc, char *parv[], parv[1], parv[2]); /* Here we trigger the same hooks that cmd_mode does and, likewise, - only if the old flags (setflags) are different than the newly- + only if the old flags (oldumodes) are different than the newly- set ones */ - if (setflags != target->umodes) - RunHook3(HOOKTYPE_UMODE_CHANGE, target, setflags, target->umodes); + if (oldumodes != target->umodes) + RunHook(HOOKTYPE_UMODE_CHANGE, target, oldumodes, target->umodes); if (show_change) { char buf[BUFSIZE]; - build_umode_string(target, setflags, ALL_UMODES, buf); + build_umode_string(target, oldumodes, ALL_UMODES, buf); if (MyUser(target) && *buf) sendto_one(target, NULL, ":%s MODE %s :%s", client->name, target->name, buf); } @@ -525,7 +551,7 @@ void do_svsmode(Client *client, MessageTag *recv_mtags, int parc, char *parv[], * cmd_svsmode() added by taz * parv[1] - username to change mode for * parv[2] - modes to change - * parv[3] - Service Stamp (if mode == d) + * parv[3] - account name (if mode contains 'd') */ CMD_FUNC(cmd_svsmode) { @@ -536,7 +562,7 @@ CMD_FUNC(cmd_svsmode) * cmd_svs2mode() added by Potvin * parv[1] - username to change mode for * parv[2] - modes to change - * parv[3] - Service Stamp (if mode == d) + * parv[3] - account name (if mode contains 'd') */ CMD_FUNC(cmd_svs2mode) { @@ -588,8 +614,8 @@ void add_send_mode_param(Channel *channel, Client *from, char what, char mode, c new_message(from, NULL, &mtags); sendto_channel(channel, from, from, 0, 0, SEND_LOCAL, mtags, ":%s MODE %s %s %s", - from->name, channel->chname, modebuf, parabuf); - sendto_server(NULL, 0, 0, mtags, ":%s MODE %s %s %s", from->id, channel->chname, modebuf, parabuf); + from->name, channel->name, modebuf, parabuf); + sendto_server(NULL, 0, 0, mtags, ":%s MODE %s %s %s", from->id, channel->name, modebuf, parabuf); free_message_tags(mtags); send = 0; *parabuf = 0; diff --git a/src/modules/svsmotd.c b/src/modules/svsmotd.c index 2f70740..514bd64 100644 --- a/src/modules/svsmotd.c +++ b/src/modules/svsmotd.c @@ -34,7 +34,7 @@ ModuleHeader MOD_HEADER "5.0", "command /svsmotd", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -60,59 +60,53 @@ MOD_UNLOAD() */ CMD_FUNC(cmd_svsmotd) { - FILE *conf = NULL; + FILE *conf = NULL; - if (!IsULine(client)) - { - sendnumeric(client, ERR_NOPRIVILEGES); - return; - } - if (parc < 2) - { - sendnumeric(client, ERR_NEEDMOREPARAMS, "SVSMOTD"); - return; - } + if (!IsULine(client)) + { + sendnumeric(client, ERR_NOPRIVILEGES); + return; + } + if (parc < 2) + { + sendnumeric(client, ERR_NEEDMOREPARAMS, "SVSMOTD"); + return; + } - if ((*parv[1] != '!') && parc < 3) - { - sendnumeric(client, ERR_NEEDMOREPARAMS, "SVSMOTD"); - return; - } + if ((*parv[1] != '!') && parc < 3) + { + sendnumeric(client, ERR_NEEDMOREPARAMS, "SVSMOTD"); + return; + } - switch (*parv[1]) - { - case '#': - conf = fopen(conf_files->svsmotd_file, "a"); - sendto_ops("Added '%s' to services motd", parv[2]); - break; - case '!': - { - remove(conf_files->svsmotd_file); - free_motd(&svsmotd); - sendto_ops("Wiped out services motd data"); - break; - } - default: - return; - } - if (parv[2]) - sendto_server(client, 0, 0, NULL, ":%s SVSMOTD %s :%s", client->id, parv[1], parv[2]); - else - sendto_server(client, 0, 0, NULL, ":%s SVSMOTD %s", client->id, parv[1]); + if (parv[2]) + sendto_server(client, 0, 0, NULL, ":%s SVSMOTD %s :%s", client->id, parv[1], parv[2]); + else + sendto_server(client, 0, 0, NULL, ":%s SVSMOTD %s", client->id, parv[1]); - if (conf == NULL) - return; + switch (*parv[1]) + { + case '#': + unreal_log(ULOG_INFO, "svsmotd", "SVSMOTD_ADDED", client, + "Services added '$line' to services motd", + log_data_string("line", parv[2])); + conf = fopen(conf_files->svsmotd_file, "a"); + if (conf) + { + fprintf(conf, "%s\n", parv[2]); + fclose(conf); + } + break; + case '!': + unreal_log(ULOG_INFO, "svsmotd", "SVSMOTD_REMOVED", client, + "Services deleted the services motd"); + remove(conf_files->svsmotd_file); + free_motd(&svsmotd); + break; + default: + return; + } - if (parc < 3 && (*parv[1] == '!')) - { - fclose(conf); - return; - } - fprintf(conf, "%s\n", parv[2]); - if (*parv[1] == '!') - sendto_ops("Added '%s' to services motd", parv[2]); - - fclose(conf); - /* We editted it, so rehash it -- codemastr */ - read_motd(conf_files->svsmotd_file, &svsmotd); + /* We editted it, so rehash it -- codemastr */ + read_motd(conf_files->svsmotd_file, &svsmotd); } diff --git a/src/modules/svsnick.c b/src/modules/svsnick.c index 3a43e89..d619d16 100644 --- a/src/modules/svsnick.c +++ b/src/modules/svsnick.c @@ -34,7 +34,7 @@ ModuleHeader MOD_HEADER "5.0", "command /svsnick", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -64,20 +64,23 @@ CMD_FUNC(cmd_svsnick) Client *acptr; Client *ocptr; /* Other client */ MessageTag *mtags = NULL; + char nickname[NICKLEN+1]; + char oldnickname[NICKLEN+1]; if (!IsULine(client) || parc < 4 || (strlen(parv[2]) > NICKLEN)) return; /* This looks like an error anyway -Studded */ - if (hunt_server(client, NULL, ":%s SVSNICK %s %s :%s", 1, parc, parv) != HUNTED_ISME) + if (hunt_server(client, NULL, "SVSNICK", 1, parc, parv) != HUNTED_ISME) return; /* Forwarded, done */ - if (do_nick_name(parv[2]) == 0) + strlcpy(nickname, parv[2], sizeof(nickname)); + if (do_nick_name(nickname) == 0) return; - if (!(acptr = find_person(parv[1], NULL))) + if (!(acptr = find_user(parv[1], NULL))) return; /* User not found, bail out */ - if ((ocptr = find_client(parv[2], NULL)) && ocptr != acptr) /* Collision */ + if ((ocptr = find_client(nickname, NULL)) && ocptr != acptr) /* Collision */ { exit_client(acptr, NULL, "Nickname collision due to Services enforced " @@ -86,30 +89,31 @@ CMD_FUNC(cmd_svsnick) } /* if the new nickname is identical to the old one, ignore it */ - if (!strcmp(acptr->name, parv[2])) + if (!strcmp(acptr->name, nickname)) return; + strlcpy(oldnickname, acptr->name, sizeof(oldnickname)); + if (acptr != ocptr) acptr->umodes &= ~UMODE_REGNICK; acptr->lastnick = atol(parv[3]); /* no 'recv_mtags' here, we do not inherit from SVSNICK but generate a new NICK event */ new_message(acptr, NULL, &mtags); - RunHook3(HOOKTYPE_LOCAL_NICKCHANGE, acptr, mtags, parv[2]); - sendto_local_common_channels(acptr, acptr, 0, mtags, ":%s NICK :%s", acptr->name, parv[2]); - sendto_one(acptr, mtags, ":%s NICK :%s", acptr->name, parv[2]); - sendto_server(NULL, 0, 0, mtags, ":%s NICK %s :%ld", acptr->id, parv[2], atol(parv[3])); - free_message_tags(mtags); + RunHook(HOOKTYPE_LOCAL_NICKCHANGE, acptr, mtags, nickname); + sendto_local_common_channels(acptr, acptr, 0, mtags, ":%s NICK :%s", acptr->name, nickname); + sendto_one(acptr, mtags, ":%s NICK :%s", acptr->name, nickname); + sendto_server(NULL, 0, 0, mtags, ":%s NICK %s :%lld", acptr->id, nickname, (long long)acptr->lastnick); add_history(acptr, 1); del_from_client_hash_table(acptr->name, acptr); - hash_check_watch(acptr, RPL_LOGOFF); - sendto_snomask(SNO_NICKCHANGE, - "*** %s (%s@%s) has been forced to change their nickname to %s", - acptr->name, acptr->user->username, acptr->user->realhost, parv[2]); + unreal_log(ULOG_INFO, "nick", "FORCED_NICK_CHANGE", acptr, + "$client.details has been forced by services to change their nickname to $new_nick_name", + log_data_string("new_nick_name", nickname)); - strlcpy(acptr->name, parv[2], sizeof acptr->name); - add_to_client_hash_table(parv[2], acptr); - hash_check_watch(acptr, RPL_LOGON); + strlcpy(acptr->name, nickname, sizeof acptr->name); + add_to_client_hash_table(nickname, acptr); + RunHook(HOOKTYPE_POST_LOCAL_NICKCHANGE, acptr, mtags, oldnickname); + free_message_tags(mtags); } diff --git a/src/modules/svsnline.c b/src/modules/svsnline.c index 2f8e945..4a31aad 100644 --- a/src/modules/svsnline.c +++ b/src/modules/svsnline.c @@ -34,7 +34,7 @@ ModuleHeader MOD_HEADER "5.0", /* Version */ "command /svsnline", /* Short description of module */ "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* This is called on module init, before Server Ready */ diff --git a/src/modules/svsnolag.c b/src/modules/svsnolag.c index cc71f85..e8aef9f 100644 --- a/src/modules/svsnolag.c +++ b/src/modules/svsnolag.c @@ -33,7 +33,7 @@ ModuleHeader MOD_HEADER "5.0", "commands /svsnolag and /svs2nolag", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -54,7 +54,7 @@ MOD_UNLOAD() return MOD_SUCCESS; } -void do_svsnolag(Client *client, int parc, char *parv[], int show_change) +void do_svsnolag(Client *client, int parc, const char *parv[], int show_change) { Client *target; char *cmd = show_change ? MSG_SVS2NOLAG : MSG_SVSNOLAG; @@ -65,7 +65,7 @@ void do_svsnolag(Client *client, int parc, char *parv[], int show_change) if (parc < 3) return; - if (!(target = find_person(parv[2], NULL))) + if (!(target = find_user(parv[2], NULL))) return; if (!MyUser(target)) diff --git a/src/modules/svsnoop.c b/src/modules/svsnoop.c index 28e802e..c86d022 100644 --- a/src/modules/svsnoop.c +++ b/src/modules/svsnoop.c @@ -35,7 +35,7 @@ ModuleHeader MOD_HEADER "5.0", "command /svsnoop", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -62,12 +62,13 @@ CMD_FUNC(cmd_svsnoop) if (!(IsULine(client) && parc > 2)) return; - if (hunt_server(client, NULL, ":%s SVSNOOP %s :%s", 1, parc, parv) == HUNTED_ISME) + if (hunt_server(client, NULL, "SVSNOOP", 1, parc, parv) == HUNTED_ISME) { if (parv[2][0] == '+') { SVSNOOP = 1; - sendto_ops("This server has been placed in NOOP mode"); + unreal_log(ULOG_INFO, "svsnoop", "SVSNOOP_ENABLED", client, + "This server has been placed in NOOP mode (by $client) -- all IRCOp rights disabled"); list_for_each_entry(acptr, &client_list, client_node) { if (MyUser(acptr) && IsOper(acptr)) @@ -81,15 +82,16 @@ CMD_FUNC(cmd_svsnoop) if (!list_empty(&acptr->special_node)) list_del(&acptr->special_node); + RunHook(HOOKTYPE_LOCAL_OPER, client, 0, NULL); remove_oper_privileges(acptr, 1); - RunHook2(HOOKTYPE_LOCAL_OPER, acptr, 0); } } } else { SVSNOOP = 0; - sendto_ops("This server is no longer in NOOP mode"); + unreal_log(ULOG_INFO, "svsnoop", "SVSNOOP_ENABLED", client, + "This server is no longer in NOOP mode (by $client) -- IRCOps can oper up again"); } } } diff --git a/src/modules/svspart.c b/src/modules/svspart.c index dd9007c..79f2ae5 100644 --- a/src/modules/svspart.c +++ b/src/modules/svspart.c @@ -29,7 +29,7 @@ ModuleHeader MOD_HEADER "5.0", /* Version */ "command /svspart", /* Short description of module */ "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* This is called on module init, before Server Ready */ @@ -62,11 +62,11 @@ MOD_UNLOAD() CMD_FUNC(cmd_svspart) { Client *target; - char *comment = (parc > 3 && parv[3] ? parv[3] : NULL); + const char *comment = (parc > 3 && parv[3] ? parv[3] : NULL); if (!IsULine(client)) return; - if (parc < 3 || !(target = find_person(parv[1], NULL))) + if (parc < 3 || !(target = find_user(parv[1], NULL))) return; if (MyUser(target)) diff --git a/src/modules/svssilence.c b/src/modules/svssilence.c index 5d64f54..203903f 100644 --- a/src/modules/svssilence.c +++ b/src/modules/svssilence.c @@ -27,7 +27,7 @@ ModuleHeader MOD_HEADER "5.0", /* Version */ "command /svssilence", /* Short description of module */ "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -60,11 +60,12 @@ CMD_FUNC(cmd_svssilence) Client *target; int mine; char *p, *cp, c; + char request[BUFSIZE]; if (!IsULine(client)) return; - if (parc < 3 || BadPtr(parv[2]) || !(target = find_person(parv[1], NULL))) + if (parc < 3 || BadPtr(parv[2]) || !(target = find_user(parv[1], NULL))) return; if (!MyUser(target)) @@ -74,7 +75,8 @@ CMD_FUNC(cmd_svssilence) } /* It's for our client */ - for (p = strtok(parv[2], " "); p; p = strtok(NULL, " ")) + strlcpy(request, parv[2], sizeof(request)); + for (p = strtok(request, " "); p; p = strtok(NULL, " ")) { c = *p; if ((c == '-') || (c == '+')) diff --git a/src/modules/svssno.c b/src/modules/svssno.c index ced2ea4..93eddab 100644 --- a/src/modules/svssno.c +++ b/src/modules/svssno.c @@ -34,7 +34,7 @@ ModuleHeader MOD_HEADER "5.0", "command /svssno", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -61,9 +61,9 @@ MOD_UNLOAD() * parv[2] - snomasks to change * show_change determines whether to show the change to the user */ -void do_svssno(Client *client, int parc, char *parv[], int show_change) +void do_svssno(Client *client, int parc, const char *parv[], int show_change) { - char *p; + const char *p; Client *target; int what = MODE_ADD, i; @@ -76,50 +76,22 @@ void do_svssno(Client *client, int parc, char *parv[], int show_change) if (parv[1][0] == '#') return; - if (!(target = find_person(parv[1], NULL))) + if (!(target = find_user(parv[1], NULL))) return; - if (hunt_server(client, NULL, - show_change ? ":%s SVS2SNO %s %s" : ":%s SVSSNO %s %s", - 1, parc, parv) != HUNTED_ISME) - { + if (hunt_server(client, NULL, show_change ? "SVS2SNO" : "SVSSNO", 1, parc, parv) != HUNTED_ISME) return; - } if (MyUser(target)) { if (parc == 2) - target->user->snomask = 0; + set_snomask(target, NULL); else - { - for (p = parv[2]; p && *p; p++) { - switch (*p) { - case '+': - what = MODE_ADD; - break; - case '-': - what = MODE_DEL; - break; - default: - for (i = 0; i <= Snomask_highest; i++) - { - if (!Snomask_Table[i].flag) - continue; - if (*p == Snomask_Table[i].flag) - { - if (what == MODE_ADD) - target->user->snomask |= Snomask_Table[i].mode; - else - target->user->snomask &= ~Snomask_Table[i].mode; - } - } - } - } - } + set_snomask(target, parv[2]); } - if (show_change) - sendnumeric(target, RPL_SNOMASK, get_snomask_string(target)); + if (show_change && target->user->snomask) + sendnumeric(target, RPL_SNOMASK, target->user->snomask); } CMD_FUNC(cmd_svssno) diff --git a/src/modules/svswatch.c b/src/modules/svswatch.c index 040ab0d..afab9a8 100644 --- a/src/modules/svswatch.c +++ b/src/modules/svswatch.c @@ -30,7 +30,7 @@ ModuleHeader MOD_HEADER "5.0", /* Version */ "command /svswatch", /* Short description of module */ "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* This is called on module init, before Server Ready */ @@ -65,7 +65,7 @@ CMD_FUNC(cmd_svswatch) if (!IsULine(client)) return; - if (parc < 3 || BadPtr(parv[2]) || !(target = find_person(parv[1], NULL))) + if (parc < 3 || BadPtr(parv[2]) || !(target = find_user(parv[1], NULL))) return; if (MyUser(target)) diff --git a/src/modules/swhois.c b/src/modules/swhois.c index 78d72b1..8d8c71b 100644 --- a/src/modules/swhois.c +++ b/src/modules/swhois.c @@ -34,7 +34,7 @@ ModuleHeader MOD_HEADER "5.0", "command /swhois", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -77,7 +77,7 @@ CMD_FUNC(cmd_swhois) if (parc < 3) return; - target = find_person(parv[1], NULL); + target = find_user(parv[1], NULL); if (!target) return; diff --git a/src/modules/targetfloodprot.c b/src/modules/targetfloodprot.c index 56151b1..5d7d6ac 100644 --- a/src/modules/targetfloodprot.c +++ b/src/modules/targetfloodprot.c @@ -11,7 +11,7 @@ ModuleHeader MOD_HEADER "5.0", "Target flood protection (set::anti-flood::target-flood)", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; #define TFP_PRIVMSG 0 @@ -35,8 +35,8 @@ struct TargetFloodConfig { int targetfloodprot_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs); int targetfloodprot_config_run(ConfigFile *cf, ConfigEntry *ce, int type); void targetfloodprot_mdata_free(ModData *m); -int targetfloodprot_can_send_to_channel(Client *client, Channel *channel, Membership *lp, char **msg, char **errmsg, SendType sendtype); -int targetfloodprot_can_send_to_user(Client *client, Client *target, char **text, char **errmsg, SendType sendtype); +int targetfloodprot_can_send_to_channel(Client *client, Channel *channel, Membership *lp, const char **msg, const char **errmsg, SendType sendtype); +int targetfloodprot_can_send_to_user(Client *client, Client *target, const char **text, const char **errmsg, SendType sendtype); /* Global variables */ ModDataInfo *targetfloodprot_client_md = NULL; @@ -117,13 +117,11 @@ MOD_LOAD() MOD_UNLOAD() { + safe_free(channelcfg); + safe_free(privatecfg); return MOD_SUCCESS; } -#ifndef CheckNull - #define CheckNull(x) if ((!(x)->ce_vardata) || (!(*((x)->ce_vardata)))) { config_error("%s:%i: missing parameter", (x)->ce_fileptr->cf_filename, (x)->ce_varlinenum); errors++; continue; } -#endif - int targetfloodprot_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) { int errors = 0; @@ -133,36 +131,36 @@ int targetfloodprot_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int * return 0; /* We are only interrested in set::anti-flood::target-flood.. */ - if (!ce || !ce->ce_varname || strcmp(ce->ce_varname, "target-flood")) + if (!ce || !ce->name || strcmp(ce->name, "target-flood")) return 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { CheckNull(cep); - if (!strcmp(cep->ce_varname, "channel-privmsg") || - !strcmp(cep->ce_varname, "channel-notice") || - !strcmp(cep->ce_varname, "channel-tagmsg") || - !strcmp(cep->ce_varname, "private-privmsg") || - !strcmp(cep->ce_varname, "private-notice") || - !strcmp(cep->ce_varname, "private-tagmsg")) + if (!strcmp(cep->name, "channel-privmsg") || + !strcmp(cep->name, "channel-notice") || + !strcmp(cep->name, "channel-tagmsg") || + !strcmp(cep->name, "private-privmsg") || + !strcmp(cep->name, "private-notice") || + !strcmp(cep->name, "private-tagmsg")) { int cnt = 0, period = 0; - if (!config_parse_flood(cep->ce_vardata, &cnt, &period) || + if (!config_parse_flood(cep->value, &cnt, &period) || (cnt < 1) || (cnt > 10000) || (period < 1) || (period > 120)) { config_error("%s:%i: set::anti-flood::target-flood::%s error. " "Syntax is ':' (eg 5:60). " "Count must be 1-10000 and period must be 1-120.", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - cep->ce_varname); + cep->file->filename, cep->line_number, + cep->name); errors++; } } else { config_error("%s:%i: unknown directive set::anti-flood::target-flood:%s", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_varname); + cep->file->filename, cep->line_number, cep->name); errors++; continue; } @@ -180,23 +178,23 @@ int targetfloodprot_config_run(ConfigFile *cf, ConfigEntry *ce, int type) return 0; /* We are only interrested in set::anti-flood::target-flood.. */ - if (!ce || !ce->ce_varname || strcmp(ce->ce_varname, "target-flood")) + if (!ce || !ce->name || strcmp(ce->name, "target-flood")) return 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "channel-privmsg")) - config_parse_flood(cep->ce_vardata, &channelcfg->cnt[TFP_PRIVMSG], &channelcfg->t[TFP_PRIVMSG]); - else if (!strcmp(cep->ce_varname, "channel-notice")) - config_parse_flood(cep->ce_vardata, &channelcfg->cnt[TFP_NOTICE], &channelcfg->t[TFP_NOTICE]); - else if (!strcmp(cep->ce_varname, "channel-tagmsg")) - config_parse_flood(cep->ce_vardata, &channelcfg->cnt[TFP_TAGMSG], &channelcfg->t[TFP_TAGMSG]); - else if (!strcmp(cep->ce_varname, "private-privmsg")) - config_parse_flood(cep->ce_vardata, &privatecfg->cnt[TFP_PRIVMSG], &privatecfg->t[TFP_PRIVMSG]); - else if (!strcmp(cep->ce_varname, "private-notice")) - config_parse_flood(cep->ce_vardata, &privatecfg->cnt[TFP_NOTICE], &privatecfg->t[TFP_NOTICE]); - else if (!strcmp(cep->ce_varname, "private-tagmsg")) - config_parse_flood(cep->ce_vardata, &privatecfg->cnt[TFP_TAGMSG], &privatecfg->t[TFP_TAGMSG]); + if (!strcmp(cep->name, "channel-privmsg")) + config_parse_flood(cep->value, &channelcfg->cnt[TFP_PRIVMSG], &channelcfg->t[TFP_PRIVMSG]); + else if (!strcmp(cep->name, "channel-notice")) + config_parse_flood(cep->value, &channelcfg->cnt[TFP_NOTICE], &channelcfg->t[TFP_NOTICE]); + else if (!strcmp(cep->name, "channel-tagmsg")) + config_parse_flood(cep->value, &channelcfg->cnt[TFP_TAGMSG], &channelcfg->t[TFP_TAGMSG]); + else if (!strcmp(cep->name, "private-privmsg")) + config_parse_flood(cep->value, &privatecfg->cnt[TFP_PRIVMSG], &privatecfg->t[TFP_PRIVMSG]); + else if (!strcmp(cep->name, "private-notice")) + config_parse_flood(cep->value, &privatecfg->cnt[TFP_NOTICE], &privatecfg->t[TFP_NOTICE]); + else if (!strcmp(cep->name, "private-tagmsg")) + config_parse_flood(cep->value, &privatecfg->cnt[TFP_TAGMSG], &privatecfg->t[TFP_TAGMSG]); } return 1; @@ -218,13 +216,15 @@ int sendtypetowhat(SendType sendtype) if (sendtype == SEND_TYPE_TAGMSG) return 2; #ifdef DEBUGMODE - ircd_log(LOG_ERROR, "sendtypetowhat() for unknown value %d", (int)sendtype); + unreal_log(ULOG_ERROR, "flood", "BUG_SENDTYPETOWHAT_UNKNOWN_VALUE", NULL, + "[BUG] sendtypetowhat() called for unknown sendtype $send_type", + log_data_integer("send_type", sendtype)); abort(); #endif return 0; /* otherwise, default to privmsg i guess */ } -int targetfloodprot_can_send_to_channel(Client *client, Channel *channel, Membership *lp, char **msg, char **errmsg, SendType sendtype) +int targetfloodprot_can_send_to_channel(Client *client, Channel *channel, Membership *lp, const char **msg, const char **errmsg, SendType sendtype) { TargetFlood *flood; static char errbuf[256]; @@ -269,7 +269,7 @@ int targetfloodprot_can_send_to_channel(Client *client, Channel *channel, Member return HOOK_CONTINUE; } -int targetfloodprot_can_send_to_user(Client *client, Client *target, char **text, char **errmsg, SendType sendtype) +int targetfloodprot_can_send_to_user(Client *client, Client *target, const char **text, const char **errmsg, SendType sendtype) { TargetFlood *flood; static char errbuf[256]; diff --git a/src/modules/third/Makefile.in b/src/modules/third/Makefile.in index 5fd8f47..cff2940 100644 --- a/src/modules/third/Makefile.in +++ b/src/modules/third/Makefile.in @@ -25,19 +25,22 @@ INCLUDES = ../../include/channel.h \ ../../include/ircsprintf.h \ ../../include/license.h \ ../../include/modules.h ../../include/modversion.h ../../include/msg.h \ - ../../include/numeric.h ../../include/proto.h ../../include/dns.h \ + ../../include/numeric.h ../../include/dns.h \ ../../include/resource.h ../../include/setup.h \ ../../include/struct.h ../../include/sys.h \ - ../../include/types.h ../../include/url.h \ + ../../include/types.h \ ../../include/version.h ../../include/whowas.h MODULEFLAGS=@MODULEFLAGS@ RM=@RM@ +.SUFFIXES: +.SUFFIXES: .c .h .so + all: build build: - ../../buildmod + ../../buildmod $(MAKE) custommodule: $(MODULEFILE).c $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ diff --git a/src/modules/time.c b/src/modules/time.c index 3b882fe..945aa47 100644 --- a/src/modules/time.c +++ b/src/modules/time.c @@ -30,7 +30,7 @@ ModuleHeader MOD_HEADER "5.0", /* Version */ "command /time", /* Short description of module */ "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; @@ -61,6 +61,6 @@ MOD_UNLOAD() */ CMD_FUNC(cmd_time) { - if (hunt_server(client, recv_mtags, ":%s TIME :%s", 1, parc, parv) == HUNTED_ISME) + if (hunt_server(client, recv_mtags, "TIME", 1, parc, parv) == HUNTED_ISME) sendnumeric(client, RPL_TIME, me.name, long_date(0)); } diff --git a/src/modules/tkl.c b/src/modules/tkl.c index 3bea4f1..c8d93f1 100644 --- a/src/modules/tkl.c +++ b/src/modules/tkl.c @@ -29,7 +29,7 @@ ModuleHeader MOD_HEADER "5.0", "Server ban commands such as /GLINE, /SPAMFILTER, etc.", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Forward declarations */ @@ -49,12 +49,13 @@ CMD_FUNC(cmd_kline); CMD_FUNC(cmd_zline); CMD_FUNC(cmd_spamfilter); CMD_FUNC(cmd_eline); -void cmd_tkl_line(Client *client, int parc, char *parv[], char *type); +void cmd_tkl_line(Client *client, int parc, const char *parv[], char *type); int _tkl_hash(unsigned int c); char _tkl_typetochar(int type); int _tkl_chartotype(char c); int tkl_banexception_chartotype(char c); char *_tkl_type_string(TKL *tk); +char *_tkl_type_config_string(TKL *tk); char *tkl_banexception_configname_to_chars(char *name); TKL *_tkl_add_serverban(int type, char *usermask, char *hostmask, char *reason, char *set_by, time_t expire_at, time_t set_at, int soft, int flags); @@ -71,6 +72,7 @@ void _sendnotice_tkl_add(TKL *tkl); void _free_tkl(TKL *tkl); void _tkl_del_line(TKL *tkl); static void _tkl_check_local_remove_shun(TKL *tmp); +char *_tkl_uhost(TKL *tkl, char *buf, size_t buflen, int options); void tkl_expire_entry(TKL * tmp); EVENT(tkl_check_expire); int _find_tkline_match(Client *client, int skip_soft); @@ -78,18 +80,18 @@ int _find_shun(Client *client); int _find_spamfilter_user(Client *client, int flags); TKL *_find_qline(Client *client, char *nick, int *ishold); TKL *_find_tkline_match_zap(Client *client); -void _tkl_stats(Client *client, int type, char *para, int *cnt); +void _tkl_stats(Client *client, int type, const char *para, int *cnt); void _tkl_sync(Client *client); CMD_FUNC(_cmd_tkl); int _place_host_ban(Client *client, BanAction action, char *reason, long duration); -int _match_spamfilter(Client *client, char *str_in, int type, char *cmd, char *target, int flags, TKL **rettk); +int _match_spamfilter(Client *client, const char *str_in, int type, const char *cmd, const char *target, int flags, TKL **rettk); int _match_spamfilter_mtags(Client *client, MessageTag *mtags, char *cmd); int check_mtag_spamfilters_present(void); int _join_viruschan(Client *client, TKL *tk, int type); void _spamfilter_build_user_string(char *buf, char *nick, Client *client); -int _match_user(char *rmask, Client *client, int options); -int _match_user_extended_server_ban(char *banstr, Client *client); -void ban_target_to_tkl_layer(BanTarget ban_target, BanAction action, Client *client, char **tkl_username, char **tkl_hostname); +int _match_user(const char *rmask, Client *client, int options); +int _match_user_extended_server_ban(const char *banstr, Client *client); +void ban_target_to_tkl_layer(BanTarget ban_target, BanAction action, Client *client, const char **tkl_username, const char **tkl_hostname); int _tkl_ip_hash(char *ip); int _tkl_ip_hash_type(int type); TKL *_find_tkl_serverban(int type, char *usermask, char *hostmask, int softban); @@ -98,6 +100,7 @@ TKL *_find_tkl_nameban(int type, char *name, int hold); TKL *_find_tkl_spamfilter(int type, char *match_string, BanAction action, unsigned short target); int _find_tkl_exception(int ban_type, Client *client); static void add_default_exempts(void); +int parse_extended_server_ban(const char *mask_in, Client *client, char **error, int skip_checking, char *buf1, size_t buf1len, char *buf2, size_t buf2len); /* Externals (only for us :D) */ extern int MODVAR spamf_ugly_vchanoverride; @@ -134,8 +137,8 @@ TKLTypeTable tkl_types[] = { { "except", 'E', TKL_EXCEPTION | TKL_GLOBAL, "Exception", 1, 0, 0 }, { "shun", 's', TKL_SHUN | TKL_GLOBAL, "Shun", 1, 1, 0 }, { "local-qline", 'q', TKL_NAME, "Local Q-Line", 1, 0, 0 }, - { "local-spamfilter", 'e', TKL_EXCEPTION, "Local Exception", 1, 0, 0 }, - { "local-exception", 'f', TKL_SPAMF, "Local Spamfilter", 1, 0, 0 }, + { "local-exception", 'e', TKL_EXCEPTION, "Local Exception", 1, 0, 0 }, + { "local-spamfilter", 'f', TKL_SPAMF, "Local Spamfilter", 1, 0, 0 }, { "blacklist", 'b', TKL_BLACKLIST, "Blacklist", 0, 1, 1 }, { "connect-flood", 'c', TKL_CONNECT_FLOOD, "Connect flood", 0, 1, 1 }, { "maxperip", 'm', TKL_MAXPERIP, "Max-per-IP", 0, 1, 0 }, @@ -158,9 +161,17 @@ MOD_TEST() HookAdd(modinfo->handle, HOOKTYPE_CONFIGTEST, 0, tkl_config_test_except); HookAdd(modinfo->handle, HOOKTYPE_CONFIGTEST, 0, tkl_config_test_set); EfunctionAdd(modinfo->handle, EFUNC_TKL_HASH, _tkl_hash); +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wcast-function-type" +#endif EfunctionAdd(modinfo->handle, EFUNC_TKL_TYPETOCHAR, TO_INTFUNC(_tkl_typetochar)); EfunctionAdd(modinfo->handle, EFUNC_TKL_CHARTOTYPE, TO_INTFUNC(_tkl_chartotype)); - EfunctionAddPChar(modinfo->handle, EFUNC_TKL_TYPE_STRING, _tkl_type_string); +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + EfunctionAddString(modinfo->handle, EFUNC_TKL_TYPE_STRING, _tkl_type_string); + EfunctionAddString(modinfo->handle, EFUNC_TKL_TYPE_CONFIG_STRING, _tkl_type_config_string); EfunctionAddPVoid(modinfo->handle, EFUNC_TKL_ADD_SERVERBAN, TO_PVOIDFUNC(_tkl_add_serverban)); EfunctionAddPVoid(modinfo->handle, EFUNC_TKL_ADD_BANEXCEPTION, TO_PVOIDFUNC(_tkl_add_banexception)); EfunctionAddPVoid(modinfo->handle, EFUNC_TKL_ADD_NAMEBAN, TO_PVOIDFUNC(_tkl_add_nameban)); @@ -191,6 +202,7 @@ MOD_TEST() EfunctionAddVoid(modinfo->handle, EFUNC_SENDNOTICE_TKL_ADD, _sendnotice_tkl_add); EfunctionAddVoid(modinfo->handle, EFUNC_SENDNOTICE_TKL_DEL, _sendnotice_tkl_del); EfunctionAdd(modinfo->handle, EFUNC_FIND_TKL_EXCEPTION, _find_tkl_exception); + EfunctionAddString(modinfo->handle, EFUNC_TKL_UHOST, _tkl_uhost); return MOD_SUCCESS; } @@ -237,130 +249,130 @@ int tkl_config_test_spamfilter(ConfigFile *cf, ConfigEntry *ce, int type, int *e int match_type = 0; /* We are only interested in spamfilter { } blocks */ - if ((type != CONFIG_MAIN) || strcmp(ce->ce_varname, "spamfilter")) + if ((type != CONFIG_MAIN) || strcmp(ce->name, "spamfilter")) return 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "target")) + if (!strcmp(cep->name, "target")) { if (has_target) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "spamfilter::target"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "spamfilter::target"); continue; } has_target = 1; - if (cep->ce_vardata) + if (cep->value) { - if (!spamfilter_getconftargets(cep->ce_vardata)) + if (!spamfilter_getconftargets(cep->value)) { config_error("%s:%i: unknown spamfiler target type '%s'", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_vardata); + cep->file->filename, cep->line_number, cep->value); errors++; } } - else if (cep->ce_entries) + else if (cep->items) { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { - if (!spamfilter_getconftargets(cepp->ce_varname)) + if (!spamfilter_getconftargets(cepp->name)) { config_error("%s:%i: unknown spamfiler target type '%s'", - cepp->ce_fileptr->cf_filename, - cepp->ce_varlinenum, cepp->ce_varname); + cepp->file->filename, + cepp->line_number, cepp->name); errors++; } } } else { - config_error_empty(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "spamfilter", cep->ce_varname); + config_error_empty(cep->file->filename, + cep->line_number, "spamfilter", cep->name); errors++; } continue; } - if (!cep->ce_vardata) + if (!cep->value) { - config_error_empty(cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - "spamfilter", cep->ce_varname); + config_error_empty(cep->file->filename, cep->line_number, + "spamfilter", cep->name); errors++; continue; } - if (!strcmp(cep->ce_varname, "reason")) + if (!strcmp(cep->name, "reason")) { if (has_reason) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "spamfilter::reason"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "spamfilter::reason"); continue; } has_reason = 1; - reason = cep->ce_vardata; + reason = cep->value; } - else if (!strcmp(cep->ce_varname, "match")) + else if (!strcmp(cep->name, "match")) { if (has_match) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "spamfilter::match"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "spamfilter::match"); continue; } has_match = 1; - match = cep->ce_vardata; + match = cep->value; } - else if (!strcmp(cep->ce_varname, "action")) + else if (!strcmp(cep->name, "action")) { if (has_action) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "spamfilter::action"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "spamfilter::action"); continue; } has_action = 1; - if (!banact_stringtoval(cep->ce_vardata)) + if (!banact_stringtoval(cep->value)) { config_error("%s:%i: spamfilter::action has unknown action type '%s'", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_vardata); + cep->file->filename, cep->line_number, cep->value); errors++; } } - else if (!strcmp(cep->ce_varname, "ban-time")) + else if (!strcmp(cep->name, "ban-time")) { if (has_bantime) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "spamfilter::ban-time"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "spamfilter::ban-time"); continue; } has_bantime = 1; } - else if (!strcmp(cep->ce_varname, "match-type")) + else if (!strcmp(cep->name, "match-type")) { if (has_match_type) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "spamfilter::match-type"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "spamfilter::match-type"); continue; } - if (!strcasecmp(cep->ce_vardata, "posix")) + if (!strcasecmp(cep->value, "posix")) { config_error("%s:%i: this spamfilter uses match-type 'posix' which is no longer supported. " "You must switch over to match-type 'regex' instead. " "See https://www.unrealircd.org/docs/FAQ#spamfilter-posix-deprecated", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); errors++; *errs = errors; return -1; /* return now, otherwise there will be issues */ } - match_type = unreal_match_method_strtoval(cep->ce_vardata); + match_type = unreal_match_method_strtoval(cep->value); if (match_type == 0) { config_error("%s:%i: spamfilter::match-type: unknown match type '%s', " "should be one of: 'simple', 'regex' or 'posix'", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - cep->ce_vardata); + cep->file->filename, cep->line_number, + cep->value); errors++; continue; } @@ -368,8 +380,8 @@ int tkl_config_test_spamfilter(ConfigFile *cf, ConfigEntry *ce, int type, int *e } else { - config_error_unknown(cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - "spamfilter", cep->ce_varname); + config_error_unknown(cep->file->filename, cep->line_number, + "spamfilter", cep->name); errors++; continue; } @@ -384,8 +396,8 @@ int tkl_config_test_spamfilter(ConfigFile *cf, ConfigEntry *ce, int type, int *e if (!m) { config_error("%s:%i: spamfilter::match contains an invalid regex: %s", - ce->ce_fileptr->cf_filename, - ce->ce_varlinenum, + ce->file->filename, + ce->line_number, err); errors++; } else @@ -396,19 +408,19 @@ int tkl_config_test_spamfilter(ConfigFile *cf, ConfigEntry *ce, int type, int *e if (!has_match) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "spamfilter::match"); errors++; } if (!has_target) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "spamfilter::target"); errors++; } if (!has_action) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "spamfilter::action"); errors++; } @@ -416,21 +428,16 @@ int tkl_config_test_spamfilter(ConfigFile *cf, ConfigEntry *ce, int type, int *e { config_error("%s:%i: spamfilter block problem: match + reason field are together over 505 bytes, " "please choose a shorter regex or reason", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); errors++; } if (!has_match_type) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "spamfilter::match-type"); errors++; } - if (!has_match_type && !has_match && has_action && has_target) - { - need_34_upgrade = 1; - } - if (match && !strcmp(match, "^LOL! //echo -a \\$\\(\\$decode\\(.+,m\\),[0-9]\\)$")) { config_warn("*** IMPORTANT ***"); @@ -449,47 +456,47 @@ int tkl_config_run_spamfilter(ConfigFile *cf, ConfigEntry *ce, int type) ConfigEntry *cep; ConfigEntry *cepp; char *word = NULL; - time_t bantime = (SPAMFILTER_BAN_TIME ? SPAMFILTER_BAN_TIME : 86400); - char *banreason = ""; + time_t bantime = tempiConf.spamfilter_ban_time; + char *banreason = tempiConf.spamfilter_ban_reason; int action = 0, target = 0; int match_type = 0; Match *m; /* We are only interested in spamfilter { } blocks */ - if ((type != CONFIG_MAIN) || strcmp(ce->ce_varname, "spamfilter")) + if ((type != CONFIG_MAIN) || strcmp(ce->name, "spamfilter")) return 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "match")) + if (!strcmp(cep->name, "match")) { - word = cep->ce_vardata; + word = cep->value; } - else if (!strcmp(cep->ce_varname, "target")) + else if (!strcmp(cep->name, "target")) { - if (cep->ce_vardata) - target = spamfilter_getconftargets(cep->ce_vardata); + if (cep->value) + target = spamfilter_getconftargets(cep->value); else { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) - target |= spamfilter_getconftargets(cepp->ce_varname); + for (cepp = cep->items; cepp; cepp = cepp->next) + target |= spamfilter_getconftargets(cepp->name); } } - else if (!strcmp(cep->ce_varname, "action")) + else if (!strcmp(cep->name, "action")) { - action = banact_stringtoval(cep->ce_vardata); + action = banact_stringtoval(cep->value); } - else if (!strcmp(cep->ce_varname, "reason")) + else if (!strcmp(cep->name, "reason")) { - banreason = cep->ce_vardata; + banreason = cep->value; } - else if (!strcmp(cep->ce_varname, "ban-time")) + else if (!strcmp(cep->name, "ban-time")) { - bantime = config_checkval(cep->ce_vardata, CFG_TIME); + bantime = config_checkval(cep->value, CFG_TIME); } - else if (!strcmp(cep->ce_varname, "match-type")) + else if (!strcmp(cep->name, "match-type")) { - match_type = unreal_match_method_strtoval(cep->ce_vardata); + match_type = unreal_match_method_strtoval(cep->value); } } @@ -518,35 +525,35 @@ int tkl_config_test_ban(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) if (type != CONFIG_BAN) return 0; - if (strcmp(ce->ce_vardata, "nick") && strcmp(ce->ce_vardata, "user") && - strcmp(ce->ce_vardata, "ip")) + if (strcmp(ce->value, "nick") && strcmp(ce->value, "user") && + strcmp(ce->value, "ip")) { return 0; } - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { if (config_is_blankorempty(cep, "ban")) { errors++; continue; } - if (!strcmp(cep->ce_varname, "mask")) + if (!strcmp(cep->name, "mask")) { if (has_mask) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "ban::mask"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "ban::mask"); continue; } has_mask = 1; } - else if (!strcmp(cep->ce_varname, "reason")) + else if (!strcmp(cep->name, "reason")) { if (has_reason) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "ban::reason"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "ban::reason"); continue; } has_reason = 1; @@ -554,23 +561,23 @@ int tkl_config_test_ban(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) else { config_error("%s:%i: unknown directive ban %s::%s", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - ce->ce_vardata, - cep->ce_varname); + cep->file->filename, cep->line_number, + ce->value, + cep->name); errors++; } } if (!has_mask) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "ban::mask"); errors++; } if (!has_reason) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "ban::reason"); errors++; } @@ -592,44 +599,35 @@ int tkl_config_run_ban(ConfigFile *cf, ConfigEntry *ce, int configtype) if (configtype != CONFIG_BAN) return 0; - if (strcmp(ce->ce_vardata, "nick") && strcmp(ce->ce_vardata, "user") && - strcmp(ce->ce_vardata, "ip")) + if (strcmp(ce->value, "nick") && strcmp(ce->value, "user") && + strcmp(ce->value, "ip")) { return 0; } - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "mask")) + if (!strcmp(cep->name, "mask")) { - char buf[512], *p; - strlcpy(buf, cep->ce_vardata, sizeof(buf)); - if (is_extended_ban(buf)) + if (is_extended_server_ban(cep->value)) { - char *str; - Extban *extban; - char buf2[BUFSIZE]; - extban = findmod_by_bantype(buf[1]); - if (!extban || !(extban->options & EXTBOPT_TKL)) + char mask1buf[512], mask2buf[512]; + char *err = NULL; + + if (!parse_extended_server_ban(cep->value, NULL, &err, 0, mask1buf, sizeof(mask1buf), mask2buf, sizeof(mask2buf))) { - config_warn("%s:%d: Invalid or unsupported extended server ban requested: %s", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, buf); + config_warn("%s:%d: Could not add extended server ban '%s': %s", + cep->file->filename, cep->line_number, cep->value, err); goto tcrb_end; } - /* is_ok() is not called, since there is no client, similar to like remote bans set */ - str = extban->conv_param(buf); - if (!str || (strlen(str) <= 4)) - { - config_warn("%s:%d: Extended server ban has a problem: %s", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, buf); - goto tcrb_end; - } - strlcpy(buf2, str+3, sizeof(buf2)); - buf[3] = '\0'; - safe_strdup(usermask, buf); /* eg ~S: */ - safe_strdup(hostmask, buf2); + safe_strdup(usermask, mask1buf); + safe_strdup(hostmask, mask2buf); } else { + char buf[512]; + char *p; + + strlcpy(buf, cep->value, sizeof(buf)); p = strchr(buf, '@'); if (p) { @@ -637,13 +635,13 @@ int tkl_config_run_ban(ConfigFile *cf, ConfigEntry *ce, int configtype) safe_strdup(usermask, buf); safe_strdup(hostmask, p); } else { - safe_strdup(hostmask, cep->ce_vardata); + safe_strdup(hostmask, cep->value); } } } else - if (!strcmp(cep->ce_varname, "reason")) + if (!strcmp(cep->name, "reason")) { - safe_strdup(reason, cep->ce_vardata); + safe_strdup(reason, cep->value); } } @@ -653,11 +651,11 @@ int tkl_config_run_ban(ConfigFile *cf, ConfigEntry *ce, int configtype) if (!reason) safe_strdup(reason, "-"); - if (!strcmp(ce->ce_vardata, "nick")) + if (!strcmp(ce->value, "nick")) tkltype = TKL_NAME; - else if (!strcmp(ce->ce_vardata, "user")) + else if (!strcmp(ce->value, "user")) tkltype = TKL_KILL; - else if (!strcmp(ce->ce_vardata, "ip")) + else if (!strcmp(ce->value, "ip")) tkltype = TKL_ZAP; else abort(); /* impossible */ @@ -685,82 +683,82 @@ int tkl_config_test_except(ConfigFile *cf, ConfigEntry *ce, int configtype, int return 0; /* These are the types that we handle */ - if (strcmp(ce->ce_vardata, "ban") && strcmp(ce->ce_vardata, "throttle") && - strcmp(ce->ce_vardata, "tkl") && strcmp(ce->ce_vardata, "blacklist") && - strcmp(ce->ce_vardata, "spamfilter")) + if (strcmp(ce->value, "ban") && strcmp(ce->value, "throttle") && + strcmp(ce->value, "tkl") && strcmp(ce->value, "blacklist") && + strcmp(ce->value, "spamfilter")) { return 0; } - if (!strcmp(ce->ce_vardata, "tkl")) + if (!strcmp(ce->value, "tkl")) { config_error("%s:%d: except tkl { } has been renamed to except ban { }", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); config_status("Please rename your block in the configuration file."); *errs = 1; return -1; } - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "mask")) + if (!strcmp(cep->name, "mask")) { - if (cep->ce_entries) + if (cep->items) { /* mask { *@1.1.1.1; *@2.2.2.2; *@3.3.3.3; }; */ - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { - if (!cepp->ce_varname) + if (!cepp->name) { - config_error_empty(cepp->ce_fileptr->cf_filename, - cepp->ce_varlinenum, "except ban", "mask"); + config_error_empty(cepp->file->filename, + cepp->line_number, "except ban", "mask"); errors++; continue; } has_mask = 1; } } else - if (cep->ce_vardata) + if (cep->value) { /* mask *@1.1.1.1; */ - if (!cep->ce_vardata) + if (!cep->value) { - config_error_empty(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "except ban", "mask"); + config_error_empty(cep->file->filename, + cep->line_number, "except ban", "mask"); errors++; continue; } has_mask = 1; } } else - if (!strcmp(cep->ce_varname, "type")) + if (!strcmp(cep->name, "type")) { - if (cep->ce_entries) + if (cep->items) { /* type { x; y; z; }; */ - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) - if (!tkl_banexception_configname_to_chars(cepp->ce_varname)) + for (cepp = cep->items; cepp; cepp = cepp->next) + if (!tkl_banexception_configname_to_chars(cepp->name)) { config_error("%s:%d: except ban::type '%s' unknown. Must be one of: %s", - cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum, cepp->ce_varname, + cepp->file->filename, cepp->line_number, cepp->name, ALL_VALID_EXCEPTION_TYPES); errors++; } } else - if (cep->ce_vardata) + if (cep->value) { /* type x; */ - if (!tkl_banexception_configname_to_chars(cep->ce_vardata)) + if (!tkl_banexception_configname_to_chars(cep->value)) { config_error("%s:%d: except ban::type '%s' unknown. Must be one of: %s", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_vardata, + cep->file->filename, cep->line_number, cep->value, ALL_VALID_EXCEPTION_TYPES); errors++; } } } else { - config_error_unknown(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "except", cep->ce_varname); + config_error_unknown(cep->file->filename, + cep->line_number, "except", cep->name); errors++; continue; } @@ -768,7 +766,7 @@ int tkl_config_test_except(ConfigFile *cf, ConfigEntry *ce, int configtype, int if (!has_mask) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "except ban::mask"); errors++; } @@ -782,7 +780,10 @@ void config_create_tkl_except(char *mask, char *bantypes) char *usermask = NULL; char *hostmask = NULL; int soft = 0; - char buf[256], buf2[256], *p; + char buf[256]; + char mask1buf[512]; + char mask2buf[512]; + char *p; if (*mask == '%') { @@ -790,27 +791,16 @@ void config_create_tkl_except(char *mask, char *bantypes) mask++; } strlcpy(buf, mask, sizeof(buf)); - if (is_extended_ban(buf)) + if (is_extended_server_ban(buf)) { - char *str; - Extban *extban; - extban = findmod_by_bantype(buf[1]); - if (!extban || !(extban->options & EXTBOPT_TKL)) + char *err = NULL; + if (!parse_extended_server_ban(buf, NULL, &err, 0, mask1buf, sizeof(mask1buf), mask2buf, sizeof(mask2buf))) { - config_warn("Invalid or unsupported extended server ban exemption requested: %s", buf); + config_warn("Could not add extended server ban '%s': %s", buf, err); return; } - /* is_ok() is not called, since there is no client, similar to like remote bans set */ - str = extban->conv_param(buf); - if (!str || (strlen(str) <= 4)) - { - config_warn("Extended server ban exemption has a problem: %s", buf); - return; - } - strlcpy(buf2, str+3, sizeof(buf2)); - buf[3] = '\0'; - usermask = buf; /* eg ~S: */ - hostmask = buf2; + usermask = mask1buf; + hostmask = mask2buf; } else { p = strchr(buf, '@'); @@ -827,7 +817,7 @@ void config_create_tkl_except(char *mask, char *bantypes) if ((*usermask == ':') || (*hostmask == ':')) { - config_error("Cannot add illegal ban '%s': for a given user@host neither" + config_error("Cannot add illegal ban '%s': for a given user@host - neither " "user nor host may start with a : character (semicolon)", mask); return; } @@ -846,9 +836,9 @@ int tkl_config_run_except(ConfigFile *cf, ConfigEntry *ce, int configtype) return 0; /* These are the types that we handle */ - if (strcmp(ce->ce_vardata, "ban") && strcmp(ce->ce_vardata, "throttle") && - strcmp(ce->ce_vardata, "blacklist") && - strcmp(ce->ce_vardata, "spamfilter")) + if (strcmp(ce->value, "ban") && strcmp(ce->value, "throttle") && + strcmp(ce->value, "blacklist") && + strcmp(ce->value, "spamfilter")) { return 0; } @@ -856,23 +846,23 @@ int tkl_config_run_except(ConfigFile *cf, ConfigEntry *ce, int configtype) *bantypes = '\0'; /* First configure all the types */ - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "type")) + if (!strcmp(cep->name, "type")) { - if (cep->ce_entries) + if (cep->items) { /* type { x; y; z; }; */ - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) + for (cepp = cep->items; cepp; cepp = cepp->next) { - char *str = tkl_banexception_configname_to_chars(cepp->ce_varname); + char *str = tkl_banexception_configname_to_chars(cepp->name); strlcat(bantypes, str, sizeof(bantypes)); } } else - if (cep->ce_vardata) + if (cep->value) { /* type x; */ - char *str = tkl_banexception_configname_to_chars(cep->ce_vardata); + char *str = tkl_banexception_configname_to_chars(cep->value); strlcat(bantypes, str, sizeof(bantypes)); } } @@ -881,33 +871,33 @@ int tkl_config_run_except(ConfigFile *cf, ConfigEntry *ce, int configtype) if (!*bantypes) { /* Default setting if no 'type' is specified: */ - if (!strcmp(ce->ce_vardata, "ban")) + if (!strcmp(ce->value, "ban")) strlcpy(bantypes, "kGzZs", sizeof(bantypes)); - else if (!strcmp(ce->ce_vardata, "throttle")) + else if (!strcmp(ce->value, "throttle")) strlcpy(bantypes, "c", sizeof(bantypes)); - else if (!strcmp(ce->ce_vardata, "blacklist")) + else if (!strcmp(ce->value, "blacklist")) strlcpy(bantypes, "b", sizeof(bantypes)); - else if (!strcmp(ce->ce_vardata, "spamfilter")) + else if (!strcmp(ce->value, "spamfilter")) strlcpy(bantypes, "f", sizeof(bantypes)); else abort(); /* someone can't code */ } /* Now walk through all mask entries */ - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "mask")) + if (!strcmp(cep->name, "mask")) { - if (cep->ce_entries) + if (cep->items) { /* mask { *@1.1.1.1; *@2.2.2.2; *@3.3.3.3; }; */ - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) - config_create_tkl_except(cepp->ce_varname, bantypes); + for (cepp = cep->items; cepp; cepp = cepp->next) + config_create_tkl_except(cepp->name, bantypes); } else - if (cep->ce_vardata) + if (cep->value) { /* mask *@1.1.1.1; */ - config_create_tkl_except(cep->ce_vardata, bantypes); + config_create_tkl_except(cep->value, bantypes); } } } @@ -923,12 +913,12 @@ int tkl_config_test_set(ConfigFile *cf, ConfigEntry *ce, int configtype, int *er if (configtype != CONFIG_SET) return 0; - if (!strcmp(ce->ce_varname, "max-stats-matches")) + if (!strcmp(ce->name, "max-stats-matches")) { - if (!ce->ce_vardata) + if (!ce->value) { config_error("%s:%i: set::max-stats-matches: no value specified", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); errors++; } // allow any other value, including 0 and negative. @@ -944,9 +934,9 @@ int tkl_config_run_set(ConfigFile *cf, ConfigEntry *ce, int configtype) if (configtype != CONFIG_SET) return 0; - if (!strcmp(ce->ce_varname, "max-stats-matches")) + if (!strcmp(ce->name, "max-stats-matches")) { - max_stats_matches = atoi(ce->ce_vardata); + max_stats_matches = atoi(ce->value); return 1; } @@ -982,7 +972,7 @@ CMD_FUNC(cmd_gline) if (parc == 1) { - char *parv[3]; + const char *parv[3]; parv[0] = NULL; parv[1] = "gline"; parv[2] = NULL; @@ -1008,7 +998,7 @@ CMD_FUNC(cmd_gzline) if (parc == 1) { - char *parv[3]; + const char *parv[3]; parv[0] = NULL; parv[1] = "gline"; /* (there's no /STATS gzline, it's included in /STATS gline output) */ parv[2] = NULL; @@ -1033,7 +1023,7 @@ CMD_FUNC(cmd_shun) if (parc == 1) { - char *parv[3]; + const char *parv[3]; parv[0] = NULL; parv[1] = "shun"; parv[2] = NULL; @@ -1049,8 +1039,8 @@ CMD_FUNC(cmd_shun) CMD_FUNC(cmd_tempshun) { Client *target; - char *comment = ((parc > 2) && !BadPtr(parv[2])) ? parv[2] : "no reason"; - char *name; + const char *comment = ((parc > 2) && !BadPtr(parv[2])) ? parv[2] : "no reason"; + const char *name; int remove = 0; if (MyUser(client) && (!ValidatePermissionsForPath("server-ban:shun:temporary",client,NULL,NULL,NULL))) @@ -1072,7 +1062,7 @@ CMD_FUNC(cmd_tempshun) } else name = parv[1]; - target = find_person(name, NULL); + target = find_user(name, NULL); if (!target) { sendnumeric(client, ERR_NOSUCHNICK, name); @@ -1095,10 +1085,10 @@ CMD_FUNC(cmd_tempshun) } else { SetShunned(target); - ircsnprintf(buf, sizeof(buf), "Temporary shun added on user %s (%s@%s) by %s [%s]", - target->name, target->user->username, target->user->realhost, - client->name, comment); - sendto_snomask_global(SNO_TKL, "%s", buf); + unreal_log(ULOG_INFO, "tkl", "TKL_ADD_TEMPSHUN", client, + "Temporary shun added on user $target.details [reason: $shun_reason] [by: $client]", + log_data_string("shun_reason", comment), + log_data_client("target", target)); } } else { if (!IsShunned(target)) @@ -1106,10 +1096,9 @@ CMD_FUNC(cmd_tempshun) sendnotice(client, "User '%s' is not shunned", target->name); } else { ClearShunned(target); - ircsnprintf(buf, sizeof(buf), "Removed temporary shun on user %s (%s@%s) by %s", - target->name, target->user->username, target->user->realhost, - client->name); - sendto_snomask_global(SNO_TKL, "%s", buf); + unreal_log(ULOG_INFO, "tkl", "TKL_DEL_TEMPSHUN", client, + "Temporary shun removed from user $target.details [by: $client]", + log_data_client("target", target)); } } } @@ -1130,7 +1119,7 @@ CMD_FUNC(cmd_kline) if (parc == 1) { - char *parv[3]; + const char *parv[3]; parv[0] = NULL; parv[1] = "kline"; parv[2] = NULL; @@ -1184,7 +1173,7 @@ void tkl_general_stats(Client *client) /** ZLINE - Kill a user as soon as it tries to connect to the server. * This happens before any DNS/ident lookups have been done and - * before any data has been processed (including no SSL/TLS handshake, etc.) + * before any data has been processed (including no TLS handshake, etc.) */ CMD_FUNC(cmd_zline) { @@ -1199,7 +1188,7 @@ CMD_FUNC(cmd_zline) if (parc == 1) { - char *parv[3]; + const char *parv[3]; parv[0] = NULL; parv[1] = "kline"; /* (there's no /STATS zline, it's included in /STATS kline output) */ parv[2] = NULL; @@ -1276,22 +1265,142 @@ static int xline_exists(char *type, char *usermask, char *hostmask) return find_tkl_serverban(tpe, umask, hostmask, softban) ? 1 : 0; } +/** Parse an extended server ban such as ~S:aabbccddetc.. + * Used for both syntax checking and to split it into userbuf/hostbuf for TKL protocol. + * @param mask_in The input mask (eg: ~S:aabbccddetc) + * @param client Client doing the request (used to send errors), can be NULL. + * @param error Pointer to set to the error buffer (must be set!) + * @param skip_checking Set this to 1 if coming from a remote user/server to skip the .is_ok() check. + * Note that a .conv_param() call can still fail. + * @param buf1 Buffer to store the extban starter in (eg "~S:") -- can be NULL if you don't need it + * @param buf1len Length of buf1 + * @param buf2 Buffer to store the extban remainder in (eg "aabbccddetc") -- can be NULL if you don't need it + * @param buf2len Length of buf2 + * @returns 1 if the server ban is acceptable. The ban will then be stored in buf1/buf2 (unless those + * were set to NULL by the caller). On failure we return 0 and 'error' is set appropriately. + */ +int parse_extended_server_ban(const char *mask_in, Client *client, char **error, int skip_checking, char *buf1, size_t buf1len, char *buf2, size_t buf2len) +{ + const char *nextbanstr = NULL; + Extban *extban; + const char *str; + char *p; + BanContext *b = NULL; + char mask[USERLEN + NICKLEN + HOSTLEN + 32]; // same as extban_conv_param_nuh_or_extban() + char newmask[USERLEN + NICKLEN + HOSTLEN + 32]; + char soft_ban = 0; + + *error = NULL; + if (buf1 && buf2) + *buf1 = *buf2 = '\0'; + + /* Work on a copy */ + if (*mask_in == '%') + { + strlcpy(mask, mask_in+1, sizeof(mask)); + soft_ban = 1; + } else { + strlcpy(mask, mask_in, sizeof(mask)); + } + + extban = findmod_by_bantype(mask, &nextbanstr); + if (!extban || !(extban->options & EXTBOPT_TKL)) + { + *error = "Invalid or unsupported extended server ban requested. Valid types are for example ~a, ~r, ~S."; + goto fail_parse_extended_server_ban; + } + + b = safe_alloc(sizeof(BanContext)); + b->client = client; + b->banstr = nextbanstr; + b->is_ok_check = EXBCHK_PARAM; + b->what = MODE_ADD; + b->ban_type = EXBTYPE_TKL; + + /* Run .is_ok() for the extban. This check is skipped if coming from a remote user/server */ + if (skip_checking == 0) + { + if (extban->is_ok && !extban->is_ok(b)) + { + *error = "Invalid extended server ban"; + goto fail_parse_extended_server_ban; + } + } + + b->banstr = nextbanstr; + str = extban->conv_param(b, extban); + if (!str) + { + *error = "Invalid extended server ban"; + goto fail_parse_extended_server_ban; + } + str = prefix_with_extban(str, b, extban, newmask, sizeof(newmask)); + if (str == NULL) + { + *error = "Unexpected error (1)"; + goto fail_parse_extended_server_ban; + } + + p = strchr(newmask, ':'); + if (!p) + { + *error = "Unexpected error (2)"; + goto fail_parse_extended_server_ban; + } + + if (p[1] == ':') + { + *error = "For technical reasons you cannot use a double : at the beginning of an extended server ban (eg ~a::xyz)"; + goto fail_parse_extended_server_ban; + } + + if (!p[1]) + { + *error = "Empty / too short extended server ban"; + goto fail_parse_extended_server_ban; + } + + /* Now convert the result into two buffers for TKL protocol usage */ + if (buf1 && buf2) + { + char save; + p++; + save = *p; + *p = '\0'; + /* First buffer is eg ~S: or %~S: */ + snprintf(buf1, buf1len, "%s%s", + soft_ban ? "%" : "", + newmask); + *p = save; + strlcpy(buf2, p, buf2len); /* eg 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef */ + } + safe_free(b); + return 1; + +fail_parse_extended_server_ban: + safe_free(b); + return 0; +} + + /** Intermediate layer between user functions such as KLINE/GLINE * and the TKL layer (cmd_tkl). * This allows us doing some syntax checking and other helpful * things that are the same for many types of *LINES. */ -void cmd_tkl_line(Client *client, int parc, char *parv[], char *type) +void cmd_tkl_line(Client *client, int parc, const char *parv[], char *type) { time_t secs; - int whattodo = 0; /* 0 = add 1 = del */ + int add = 1; time_t i; Client *acptr = NULL; - char *mask = NULL; + char maskbuf[BUFSIZE]; + char *mask; char mo[64], mo2[64]; + char mask1buf[BUFSIZE]; char mask2buf[BUFSIZE]; char *p, *usermask, *hostmask; - char *tkllayer[10] = { + const char *tkllayer[10] = { me.name, /*0 server.name */ NULL, /*1 +|- */ NULL, /*2 G */ @@ -1308,15 +1417,16 @@ void cmd_tkl_line(Client *client, int parc, char *parv[], char *type) if ((parc == 1) || BadPtr(parv[1])) return; /* shouldn't happen */ - mask = parv[1]; + strlcpy(maskbuf, parv[1], sizeof(maskbuf)); + mask = maskbuf; if (*mask == '-') { - whattodo = 1; + add = 0; mask++; } else if (*mask == '+') { - whattodo = 0; + add = 1; mask++; } @@ -1345,57 +1455,42 @@ void cmd_tkl_line(Client *client, int parc, char *parv[], char *type) } /* Check if it's an extended server ban */ - if (is_extended_ban(mask)) + if (is_extended_server_ban(mask)) { - if (whattodo == 0) - { - /* Add */ - char *str; - Extban *extban; - extban = findmod_by_bantype(mask[1]); - if (!extban || !(extban->options & EXTBOPT_TKL)) - { - sendnotice(client, "Invalid or unsupported extended server ban requested: %s", mask); - sendnotice(client, "Valid types are for example ~a, ~r, ~S"); - return; - } - if (extban->is_ok && !extban->is_ok(client, NULL, mask, EXBCHK_PARAM, MODE_ADD, EXBTYPE_TKL)) - return; /* rejected */ - str = extban->conv_param(mask); - if (!str || (strlen(str) <= 4)) - return; /* rejected */ - strlcpy(mask2buf, str+3, sizeof(mask2buf)); - mask[3] = '\0'; - usermask = mask; /* eg ~S: */ - hostmask = mask2buf; + char *err; - if (((*type == 'z') || (*type == 'Z'))) + if (!parse_extended_server_ban(mask, client, &err, 0, mask1buf, sizeof(mask1buf), mask2buf, sizeof(mask2buf))) + { + /* If adding, reject it */ + if (add) { - sendnotice(client, "ERROR: (g)zlines must be placed at *@\037IPMASK\037. " - "Extended server bans don't work here because (g)zlines are processed" - "BEFORE dns and ident lookups are done and before reading any client data. " - "If you want to use extended server bans then use a KLINE/GLINE instead."); + sendnotice(client, "ERROR: %s", err); return; + } else + { + /* Always allow any removal attempt... */ + char *p; + char save; + p = strchr(mask, ':'); + p++; + save = *p; + *p = '\0'; + strlcpy(mask1buf, mask, sizeof(mask1buf)); + *p = save; + strlcpy(mask2buf, p, sizeof(mask2buf)); + /* fallthrough */ } - } else { - /* Delete: allow any attempt */ - strlcpy(mask2buf, mask+3, sizeof(mask2buf)); - mask[3] = '\0'; - usermask = mask; /* eg ~S: */ - hostmask = mask2buf; } - /* Make sure we don't screw up S2S traffic ;) */ - if (*hostmask == ':') + if (add && ((*type == 'z') || (*type == 'Z'))) { - sendnotice(client, "[error] For technical reasons you cannot use double :: at the beginning " - "of an extended server ban (eg ~a::xyz). You probably don't want to do this either."); - return; - } - if (!*hostmask) - { - sendnotice(client, "[error] Empty hostmask encountered, eg -~S:"); + sendnotice(client, "ERROR: (g)zlines must be placed at *@\037IPMASK\037. " + "Extended server bans don't work here because (g)zlines are processed" + "BEFORE dns and ident lookups are done and before reading any client data. " + "If you want to use extended server bans then use a KLINE/GLINE instead."); return; } + usermask = mask1buf; /* eg ~S: */ + hostmask = mask2buf; /* eg 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef */ } else { /* Check if it's a hostmask and legal .. */ @@ -1420,7 +1515,7 @@ void cmd_tkl_line(Client *client, int parc, char *parv[], char *type) sendnotice(client, "[error] For technical reasons you cannot start the host with a ':', sorry"); return; } - if (((*type == 'z') || (*type == 'Z')) && !whattodo) + if (add && ((*type == 'z') || (*type == 'Z'))) { /* It's a (G)ZLINE, make sure the user isn't specyfing a HOST. * Just a warning in 3.2.3, but an error in 3.2.4. @@ -1446,12 +1541,12 @@ void cmd_tkl_line(Client *client, int parc, char *parv[], char *type) else { /* It's seemingly a nick .. let's see if we can find the user */ - if ((acptr = find_person(mask, NULL))) + if ((acptr = find_user(mask, NULL))) { BanAction action = BAN_ACT_KLINE; // just a dummy default if ((*type == 'z') || (*type == 'Z')) action = BAN_ACT_ZLINE; // to indicate zline (no hostname, no dns, etc) - ban_target_to_tkl_layer(iConf.manual_ban_target, action, acptr, &usermask, &hostmask); + ban_target_to_tkl_layer(iConf.manual_ban_target, action, acptr, (const char **)&usermask, (const char **)&hostmask); } else { @@ -1461,7 +1556,7 @@ void cmd_tkl_line(Client *client, int parc, char *parv[], char *type) } } - if (!whattodo && ban_too_broad(usermask, hostmask)) + if (add && ban_too_broad(usermask, hostmask)) { sendnotice(client, "*** [error] Too broad mask"); return; @@ -1469,7 +1564,7 @@ void cmd_tkl_line(Client *client, int parc, char *parv[], char *type) secs = 0; - if (whattodo == 0 && (parc > 3)) + if (add && (parc > 3)) { secs = config_checkval(parv[2], CFG_TIME); if (secs < 0) @@ -1478,12 +1573,12 @@ void cmd_tkl_line(Client *client, int parc, char *parv[], char *type) return; } } - tkllayer[1] = whattodo == 0 ? "+" : "-"; + tkllayer[1] = add ? "+" : "-"; tkllayer[2] = type; tkllayer[3] = usermask; tkllayer[4] = hostmask; tkllayer[5] = make_nick_user_host(client->name, client->user->username, GetHost(client)); - if (whattodo == 0) + if (add) { if (secs == 0) { @@ -1557,7 +1652,7 @@ void eline_syntax(Client *client) * exception to be placed on *@ip rather than * user@host or *@host. For eg zlines. */ -TKLTypeTable *eline_type_requires_ip(char *bantypes) +TKLTypeTable *eline_type_requires_ip(const char *bantypes) { int i; @@ -1568,9 +1663,9 @@ TKLTypeTable *eline_type_requires_ip(char *bantypes) } /** Checks a string to see if it contains invalid ban exception types */ -int contains_invalid_server_ban_exception_type(char *str, char *c) +int contains_invalid_server_ban_exception_type(const char *str, char *c) { - char *p; + const char *p; for (p = str; *p; p++) { if (!tkl_banexception_chartotype(*p)) @@ -1589,9 +1684,12 @@ CMD_FUNC(cmd_eline) Client *acptr = NULL; char *mask = NULL; char mo[64], mo2[64]; + char maskbuf[BUFSIZE]; + char mask1buf[BUFSIZE]; char mask2buf[BUFSIZE]; - char *p, *usermask, *hostmask, *bantypes=NULL, *reason=NULL; - char *tkllayer[11] = { + const char *p, *bantypes=NULL, *reason=NULL; + char *usermask, *hostmask; + const char *tkllayer[11] = { me.name, /*0 server.name */ NULL, /*1 +|- */ NULL, /*2 E */ @@ -1625,7 +1723,8 @@ CMD_FUNC(cmd_eline) return; } - mask = parv[1]; + strlcpy(maskbuf, parv[1], sizeof(maskbuf)); + mask = maskbuf; if (*mask == '-') { add = 0; @@ -1665,55 +1764,40 @@ CMD_FUNC(cmd_eline) return; /* Check if it's an extended server ban */ - if (is_extended_ban(mask)) + if (is_extended_server_ban(mask)) { - if (add) + char *err; + if (!parse_extended_server_ban(mask, client, &err, 0, mask1buf, sizeof(mask1buf), mask2buf, sizeof(mask2buf))) { - /* Add */ - char *str; - Extban *extban; - extban = findmod_by_bantype(mask[1]); - if (!extban || !(extban->options & EXTBOPT_TKL)) + /* If adding, reject it */ + if (add) { - sendnotice(client, "Invalid or unsupported extended server ban requested: %s", mask); - sendnotice(client, "Valid types are for example ~a, ~r, ~S"); + sendnotice(client, "ERROR: %s", err); return; - } - if (extban->is_ok && !extban->is_ok(client, NULL, mask, EXBCHK_PARAM, MODE_ADD, EXBTYPE_TKL)) - return; /* rejected */ - str = extban->conv_param(mask); - if (!str || (strlen(str) <= 4)) - return; /* rejected */ - strlcpy(mask2buf, str+3, sizeof(mask2buf)); - mask[3] = '\0'; - usermask = mask; /* eg ~S: */ - hostmask = mask2buf; - if ((t = eline_type_requires_ip(bantypes))) + } else { - sendnotice(client, "ERROR: Ban exception with type '%c' does not work on extended server bans. " - "This is because checking for %s takes places BEFORE " - "extended bans can be checked.", t->letter, t->log_name); - return; + /* Always allow any removal attempt... */ + char *p; + char save; + p = strchr(mask, ':'); + p++; + save = *p; + *p = '\0'; + strlcpy(mask1buf, mask, sizeof(mask1buf)); + *p = save; + strlcpy(mask2buf, p, sizeof(mask2buf)); + /* fallthrough */ } - } else { - /* Delete: allow any attempt */ - strlcpy(mask2buf, mask+3, sizeof(mask2buf)); - mask[3] = '\0'; - usermask = mask; /* eg ~S: */ - hostmask = mask2buf; } - /* Make sure we don't screw up S2S traffic ;) */ - if (*hostmask == ':') + if (add && (t = eline_type_requires_ip(bantypes))) { - sendnotice(client, "[error] For technical reasons you cannot use double :: at the beginning " - "of an extended server ban (eg ~a::xyz). You probably don't want to do this either."); - return; - } - if (!*hostmask) - { - sendnotice(client, "[error] Empty hostmask encountered, eg -~S:"); + sendnotice(client, "ERROR: Ban exception with type '%c' does not work on extended server bans. " + "This is because checking for %s takes places BEFORE " + "extended bans can be checked.", t->letter, t->log_name); return; } + usermask = mask1buf; /* eg ~S: */ + hostmask = mask2buf; /* eg 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef */ } else { /* Check if it's a hostmask and legal .. */ @@ -1769,12 +1853,12 @@ CMD_FUNC(cmd_eline) else { /* It's seemingly a nick .. let's see if we can find the user */ - if ((acptr = find_person(mask, NULL))) + if ((acptr = find_user(mask, NULL))) { BanAction action = BAN_ACT_KLINE; // just a dummy default if (add && eline_type_requires_ip(bantypes)) action = BAN_ACT_ZLINE; // to indicate zline (no hostname, no dns, etc) - ban_target_to_tkl_layer(iConf.manual_ban_target, action, acptr, &usermask, &hostmask); + ban_target_to_tkl_layer(iConf.manual_ban_target, action, acptr, (const char **)&usermask, (const char **)&hostmask); } else { @@ -1844,7 +1928,7 @@ void spamfilter_usage(Client *client) } /** Helper function for cmd_spamfilter, explaining usage has changed. */ -void spamfilter_new_usage(Client *client, char *parv[]) +void spamfilter_new_usage(Client *client, const char *parv[]) { sendnotice(client, "Unknown match-type '%s'. Must be one of: -regex (new fast PCRE regexes) or " "-simple (simple text with ? and * wildcards)", @@ -1857,13 +1941,13 @@ void spamfilter_new_usage(Client *client, char *parv[]) } /** Delete a spamfilter by ID (the ID can be obtained via '/SPAMFILTER del' */ -void spamfilter_del_by_id(Client *client, char *id) +void spamfilter_del_by_id(Client *client, const char *id) { int index; TKL *tk; int found = 0; char mo[32], mo2[32]; - char *tkllayer[13] = { + const char *tkllayer[13] = { me.name, /* 0 server.name */ NULL, /* 1 +|- */ "F", /* 2 F */ @@ -1924,9 +2008,9 @@ void spamfilter_del_by_id(Client *client, char *id) */ CMD_FUNC(cmd_spamfilter) { - int whattodo = 0; /* 0 = add 1 = del */ + int add = 1; char mo[32], mo2[32]; - char *tkllayer[13] = { + const char *tkllayer[13] = { me.name, /* 0 server.name */ NULL, /* 1 +|- */ "F", /* 2 F */ @@ -1960,7 +2044,7 @@ CMD_FUNC(cmd_spamfilter) if (parc == 1) { - char *parv[3]; + const char *parv[3]; parv[0] = NULL; parv[1] = "spamfilter"; parv[2] = NULL; @@ -1973,7 +2057,7 @@ CMD_FUNC(cmd_spamfilter) if (!parv[2]) { /* Show STATS with appropriate SPAMFILTER del command */ - char *parv[5]; + const char *parv[5]; parv[0] = NULL; parv[1] = "spamfilter"; parv[2] = me.name; @@ -2007,9 +2091,9 @@ CMD_FUNC(cmd_spamfilter) * parv[7]: regex */ if (!strcasecmp(parv[1], "add") || !strcmp(parv[1], "+")) - whattodo = 0; + add = 1; else if (!strcasecmp(parv[1], "del") || !strcmp(parv[1], "-") || !strcasecmp(parv[1], "remove")) - whattodo = 1; + add = 0; else { sendnotice(client, "1st parameter invalid"); @@ -2017,7 +2101,7 @@ CMD_FUNC(cmd_spamfilter) return; } - if ((whattodo == 0) && !strcasecmp(parv[2]+1, "posix")) + if (add && !strcasecmp(parv[2]+1, "posix")) { sendnotice(client, "ERROR: Spamfilter type 'posix' is DEPRECATED. You must use type 'regex' instead."); sendnotice(client, "See https://www.unrealircd.org/docs/FAQ#spamfilter-posix-deprecated"); @@ -2050,7 +2134,7 @@ CMD_FUNC(cmd_spamfilter) actionbuf[0] = banact_valtochar(action); actionbuf[1] = '\0'; - if (whattodo == 0) + if (add) { /* now check the regex / match field... */ m = unreal_create_match(match_type, parv[7], &err); @@ -2062,7 +2146,7 @@ CMD_FUNC(cmd_spamfilter) unreal_delete_match(m); } - tkllayer[1] = whattodo ? "-" : "+"; + tkllayer[1] = add ? "+" : "-"; tkllayer[3] = targetbuf; tkllayer[4] = actionbuf; tkllayer[5] = make_nick_user_host(client->name, client->user->username, GetHost(client)); @@ -2093,14 +2177,14 @@ CMD_FUNC(cmd_spamfilter) * on 50 characters for the rest... -- Syzop */ n = strlen(reason) + strlen(parv[7]) + strlen(tkllayer[6]) + (NICKLEN * 2) + 40; - if ((n > 500) && (whattodo == 0)) + if ((n > 500) && add) { sendnotice(client, "Sorry, spamfilter too long. You'll either have to trim down the " "reason or the regex (exceeded by %d bytes)", n - 500); return; } - if (whattodo == 0) + if (add) { ircsnprintf(mo2, sizeof(mo2), "%lld", (long long)TStime()); tkllayer[7] = mo2; @@ -2123,8 +2207,9 @@ int _tkl_hash(unsigned int c) else if ((c >= 'A') && (c <= 'Z')) return c-'A'; else { - sendto_realops("[BUG] tkl_hash() called with out of range parameter (c = '%c') !!!", c); - ircd_log(LOG_ERROR, "[BUG] tkl_hash() called with out of range parameter (c = '%c') !!!", c); + unreal_log(ULOG_ERROR, "bug", "TKL_HASH_INVALID", NULL, + "tkl_hash() called with out of range parameter (c = '$tkl_char') !!!", + log_data_char("tkl_char", c)); return 0; } #else @@ -2141,8 +2226,9 @@ char _tkl_typetochar(int type) for (i=0; tkl_types[i].config_name; i++) if ((tkl_types[i].type == type) && tkl_types[i].tkltype) return tkl_types[i].letter; - sendto_realops("[BUG]: tkl_typetochar(): unknown type 0x%x !!!", type); - ircd_log(LOG_ERROR, "[BUG] tkl_typetochar(): unknown type 0x%x !!!", type); + unreal_log(ULOG_ERROR, "bug", "TKL_TYPETOCHAR_INVALID", NULL, + "tkl_typetochar(): unknown type $tkl_type!!!", + log_data_integer("tkl_type", type)); return 0; } @@ -2201,13 +2287,13 @@ char *tkl_banexception_configname_to_chars(char *name) char *_tkl_type_string(TKL *tkl) { static char txt[256]; + int i; *txt = '\0'; if (TKLIsServerBan(tkl) && (tkl->ptr.serverban->subtype == TKL_SUBTYPE_SOFT)) strlcpy(txt, "Soft ", sizeof(txt)); - int i; for (i=0; tkl_types[i].config_name; i++) { if ((tkl_types[i].type == tkl->type) && tkl_types[i].tkltype) @@ -2221,6 +2307,18 @@ char *_tkl_type_string(TKL *tkl) return txt; } +/** Short config string, lowercase alnum with possibly hyphens (eg: 'kline') */ +char *_tkl_type_config_string(TKL *tkl) +{ + int i; + + for (i=0; tkl_types[i].config_name; i++) + if ((tkl_types[i].type == tkl->type) && tkl_types[i].tkltype) + return tkl_types[i].config_name; + + return "???"; +} + int tkl_banexception_matches_type(TKL *except, int bantype) { char *p; @@ -2632,18 +2730,10 @@ void _tkl_del_line(TKL *tkl) } if (!really_found) { - ircd_log(LOG_ERROR, "[BUG] [Crash] tkl_del_line() for %s (%d): " - "NOT found in tklines_ip_hash[%d][%d], " - "this should never happen!", - tkl_type_string(tkl), - tkl->type, - index, index2); - if (TKLIsServerBan(tkl)) - { - ircd_log(LOG_ERROR, "Additional information: the ban was on %s@%s", - tkl->ptr.serverban->usermask ? tkl->ptr.serverban->usermask : "", - tkl->ptr.serverban->hostmask ? tkl->ptr.serverban->hostmask : ""); - } + unreal_log(ULOG_FATAL, "tkl", "BUG_TKL_DEL_LINE_HASH", NULL, + "[BUG] [Crash] tkl_del_line() for $tkl (type: $tkl.type_string): " + "NOT found in tklines_ip_hash. This should never happen!", + log_data_tkl("tkl", tkl)); abort(); } #endif @@ -2672,7 +2762,7 @@ static void add_default_exempts(void) * Currently the list is: gline, kline, gzline, zline, shun, blacklist, * connect-flood, handshake-data-flood. */ - tkl_add_banexception(TKL_EXCEPTION, "*", "127.*", "localhost is always exempt", + tkl_add_banexception(TKL_EXCEPTION, "*", "127.0.0.0/8", "localhost is always exempt", "-default-", 0, TStime(), 0, "GkZzsbcd", TKL_FLAG_CONFIG); } @@ -2720,7 +2810,7 @@ void _tkl_check_local_remove_shun(TKL *tmp) */ keep_shun = 0; for(tk = tklines[tkl_hash('s')]; tk && !keep_shun; tk = tk->next) - if(tk != tmp && match_simple(tk->ptr.serverban->usermask, cname)) + if (tk != tmp && match_simple(tk->ptr.serverban->usermask, cname)) { if ((*tk->ptr.serverban->hostmask >= '0') && (*tk->ptr.serverban->hostmask <= '9') /* the hostmask is an IP */ @@ -2732,7 +2822,7 @@ void _tkl_check_local_remove_shun(TKL *tmp) keep_shun = 1; } - if(!keep_shun) + if (!keep_shun) { ClearShunned(client); } @@ -2746,11 +2836,11 @@ void _tkl_check_local_remove_shun(TKL *tmp) * that can be used in oper notices like expiring kline, added kline, etc. */ #define NO_SOFT_PREFIX 1 -char *tkl_uhost(TKL *tkl, char *buf, size_t buflen, int options) +char *_tkl_uhost(TKL *tkl, char *buf, size_t buflen, int options) { if (TKLIsServerBan(tkl)) { - if (is_extended_ban(tkl->ptr.serverban->usermask)) + if (is_extended_server_ban(tkl->ptr.serverban->usermask)) { ircsnprintf(buf, buflen, "%s%s%s", (!(options & NO_SOFT_PREFIX) && (tkl->ptr.serverban->subtype & TKL_SUBTYPE_SOFT)) ? "%" : "", @@ -2763,7 +2853,7 @@ char *tkl_uhost(TKL *tkl, char *buf, size_t buflen, int options) } else if (TKLIsBanException(tkl)) { - if (is_extended_ban(tkl->ptr.banexception->usermask)) + if (is_extended_server_ban(tkl->ptr.banexception->usermask)) { ircsnprintf(buf, buflen, "%s%s%s", (!(options & NO_SOFT_PREFIX) && (tkl->ptr.banexception->subtype & TKL_SUBTYPE_SOFT)) ? "%" : "", @@ -2784,60 +2874,33 @@ char *tkl_uhost(TKL *tkl, char *buf, size_t buflen, int options) */ void tkl_expire_entry(TKL *tkl) { - char *whattype = tkl_type_string(tkl); - - if (!tkl) - return; - - if (tkl->type & TKL_SPAMF) - { - /* Impossible */ - } else if (TKLIsServerBan(tkl)) { - char uhostbuf[BUFSIZE]; - char *uhost = tkl_uhost(tkl, uhostbuf, sizeof(uhostbuf), 0); - sendto_snomask(SNO_TKL, - "*** Expiring %s (%s) made by %s (Reason: %s) set %lld seconds ago", - whattype, uhost, tkl->set_by, tkl->ptr.serverban->reason, - (long long)(TStime() - tkl->set_at)); - ircd_log - (LOG_TKL, "Expiring %s (%s) made by %s (Reason: %s) set %lld seconds ago", - whattype, uhost, tkl->set_by, tkl->ptr.serverban->reason, - (long long)(TStime() - tkl->set_at)); + unreal_log(ULOG_INFO, "tkl", "TKL_EXPIRE", NULL, + "Expiring $tkl.type_string '$tkl' [reason: $tkl.reason] [by: $tkl.set_by] [duration: $tkl.duration_string]", + log_data_tkl("tkl", tkl)); } else if (TKLIsNameBan(tkl)) { if (!tkl->ptr.nameban->hold) { - sendto_snomask(SNO_TKL, - "*** Expiring %s (%s) made by %s (Reason: %s) set %lld seconds ago", - whattype, tkl->ptr.nameban->name, tkl->set_by, tkl->ptr.nameban->reason, - (long long)(TStime() - tkl->set_at)); - ircd_log - (LOG_TKL, "Expiring %s (%s) made by %s (Reason: %s) set %lld seconds ago", - whattype, tkl->ptr.nameban->name, tkl->set_by, tkl->ptr.nameban->reason, - (long long)(TStime() - tkl->set_at)); + unreal_log(ULOG_INFO, "tkl", "TKL_EXPIRE", NULL, + "Expiring $tkl.type_string '$tkl' [reason: $tkl.reason] [by: $tkl.set_by] [duration: $tkl.duration_string]", + log_data_tkl("tkl", tkl)); } } else if (TKLIsBanException(tkl)) { - char uhostbuf[BUFSIZE]; - char *uhost = tkl_uhost(tkl, uhostbuf, sizeof(uhostbuf), 0); - sendto_snomask(SNO_TKL, - "*** Expiring %s (%s) for types '%s' made by %s (Reason: %s) set %lld seconds ago", - whattype, uhost, tkl->ptr.banexception->bantypes, tkl->set_by, tkl->ptr.banexception->reason, - (long long)(TStime() - tkl->set_at)); - ircd_log - (LOG_TKL, "Expiring %s (%s) for types '%s' made by %s (Reason: %s) set %lld seconds ago", - whattype, uhost, tkl->ptr.banexception->bantypes, tkl->set_by, tkl->ptr.banexception->reason, - (long long)(TStime() - tkl->set_at)); + unreal_log(ULOG_INFO, "tkl", "TKL_EXPIRE", NULL, + "Expiring $tkl.type_string '$tkl' [type: $tkl.exception_types] [reason: $tkl.reason] [by: $tkl.set_by] [duration: $tkl.duration_string]", + log_data_tkl("tkl", tkl)); } + // FIXME: so.. this isn't logged? or what? if (tkl->type & TKL_SHUN) tkl_check_local_remove_shun(tkl); - RunHook2(HOOKTYPE_TKL_DEL, NULL, tkl); + RunHook(HOOKTYPE_TKL_DEL, NULL, tkl); tkl_del_line(tkl); } @@ -3032,7 +3095,7 @@ int _find_tkline_match(Client *client, int skip_soft) /* User is banned... */ - RunHookReturnInt2(HOOKTYPE_FIND_TKLINE_MATCH, client, tkl, !=99); + RunHookReturnInt(HOOKTYPE_FIND_TKLINE_MATCH, !=99, client, tkl); if (tkl->type & TKL_KILL) { @@ -3161,45 +3224,13 @@ int spamfilter_check_users(TKL *tkl) continue; /* No match */ /* matched! */ - ircsnprintf(buf, sizeof(buf), "[Spamfilter] %s!%s@%s matches filter '%s': [%s: '%s'] [%s]", - client->name, client->user->username, client->user->realhost, - tkl->ptr.spamfilter->match->str, - "user", spamfilter_user, - unreal_decodespace(tkl->ptr.spamfilter->tkl_reason)); + unreal_log(ULOG_INFO, "tkl", "SPAMFILTER_MATCH", client, + "[Spamfilter] $client.details matches filter '$tkl': [cmd: $command: '$str'] [reason: $tkl.reason] [action: $tkl.ban_action]", + log_data_tkl("tkl", tkl), + log_data_string("command", "USER"), + log_data_string("str", spamfilter_user)); - sendto_snomask_global(SNO_SPAMF, "%s", buf); - ircd_log(LOG_SPAMFILTER, "%s", buf); - RunHook6(HOOKTYPE_LOCAL_SPAMFILTER, client, spamfilter_user, spamfilter_user, SPAMF_USER, NULL, tkl); - matches++; - } - } - - return matches; -} - -/** Similarly to previous, but match against all global users. - * FUNCTION IS UNUSED !! - */ -int spamfilter_check_all_users(Client *from, TKL *tkl) -{ - char spamfilter_user[NICKLEN + USERLEN + HOSTLEN + REALLEN + 64]; /* n!u@h:r */ - int matches = 0; - Client *acptr; - - list_for_each_entry(acptr, &client_list, client_node) - { - if (IsUser(acptr)) - { - spamfilter_build_user_string(spamfilter_user, acptr->name, acptr); - if (!unreal_match(tkl->ptr.spamfilter->match, spamfilter_user)) - continue; /* No match */ - - /* matched! */ - sendnotice(from, "[Spamfilter] %s!%s@%s matches filter '%s': [%s: '%s'] [%s]", - acptr->name, acptr->user->username, acptr->user->realhost, - tkl->ptr.spamfilter->match->str, - "user", spamfilter_user, - unreal_decodespace(tkl->ptr.spamfilter->tkl_reason)); + RunHook(HOOKTYPE_LOCAL_SPAMFILTER, client, spamfilter_user, spamfilter_user, SPAMF_USER, NULL, tkl); matches++; } } @@ -3317,15 +3348,15 @@ TKL *_find_tkline_match_zap(Client *client) typedef struct { int flags; - char *mask; - char *reason; - char *set_by; + const char *mask; + const char *reason; + const char *set_by; } TKLFlag; /** Parse STATS tkl parameters. * TODO: I don't think this is documented anywhere? Or underdocumented at least. */ -static void parse_stats_params(char *para, TKLFlag *flag) +static void parse_stats_params(const char *para, TKLFlag *flag) { static char paratmp[512]; /* <- copy of para, because it gets fragged by strtok() */ char *flags, *tmp; @@ -3381,7 +3412,7 @@ static void parse_stats_params(char *para, TKLFlag *flag) /** Does this TKL entry match the search terms? * This is a helper function for tkl_stats(). */ -int tkl_stats_matcher(Client *client, int type, char *para, TKLFlag *tklflags, TKL *tkl) +int tkl_stats_matcher(Client *client, int type, const char *para, TKLFlag *tklflags, TKL *tkl) { /***** First, handle the selection ******/ @@ -3460,32 +3491,32 @@ int tkl_stats_matcher(Client *client, int type, char *para, TKLFlag *tklflags, T if (tkl->type == (TKL_KILL | TKL_GLOBAL)) { sendnumeric(client, RPL_STATSGLINE, 'G', uhost, - (tkl->expire_at != 0) ? (tkl->expire_at - TStime()) : 0, - (TStime() - tkl->set_at), tkl->set_by, tkl->ptr.serverban->reason); + (tkl->expire_at != 0) ? (long long)(tkl->expire_at - TStime()) : 0, + (long long)(TStime() - tkl->set_at), tkl->set_by, tkl->ptr.serverban->reason); } else if (tkl->type == (TKL_ZAP | TKL_GLOBAL)) { sendnumeric(client, RPL_STATSGLINE, 'Z', uhost, - (tkl->expire_at != 0) ? (tkl->expire_at - TStime()) : 0, - (TStime() - tkl->set_at), tkl->set_by, tkl->ptr.serverban->reason); + (tkl->expire_at != 0) ? (long long)(tkl->expire_at - TStime()) : 0, + (long long)(TStime() - tkl->set_at), tkl->set_by, tkl->ptr.serverban->reason); } else if (tkl->type == (TKL_SHUN | TKL_GLOBAL)) { sendnumeric(client, RPL_STATSGLINE, 's', uhost, - (tkl->expire_at != 0) ? (tkl->expire_at - TStime()) : 0, - (TStime() - tkl->set_at), tkl->set_by, tkl->ptr.serverban->reason); + (tkl->expire_at != 0) ? (long long)(tkl->expire_at - TStime()) : 0, + (long long)(TStime() - tkl->set_at), tkl->set_by, tkl->ptr.serverban->reason); } else if (tkl->type == (TKL_KILL)) { sendnumeric(client, RPL_STATSGLINE, 'K', uhost, - (tkl->expire_at != 0) ? (tkl->expire_at - TStime()) : 0, - (TStime() - tkl->set_at), tkl->set_by, tkl->ptr.serverban->reason); + (tkl->expire_at != 0) ? (long long)(tkl->expire_at - TStime()) : 0, + (long long)(TStime() - tkl->set_at), tkl->set_by, tkl->ptr.serverban->reason); } else if (tkl->type == (TKL_ZAP)) { sendnumeric(client, RPL_STATSGLINE, 'z', uhost, - (tkl->expire_at != 0) ? (tkl->expire_at - TStime()) : 0, - (TStime() - tkl->set_at), tkl->set_by, tkl->ptr.serverban->reason); + (tkl->expire_at != 0) ? (long long)(tkl->expire_at - TStime()) : 0, + (long long)(TStime() - tkl->set_at), tkl->set_by, tkl->ptr.serverban->reason); } } else if (TKLIsSpamfilter(tkl)) @@ -3495,9 +3526,10 @@ int tkl_stats_matcher(Client *client, int type, char *para, TKLFlag *tklflags, T unreal_match_method_valtostr(tkl->ptr.spamfilter->match->type), spamfilter_target_inttostring(tkl->ptr.spamfilter->target), banact_valtostring(tkl->ptr.spamfilter->action), - (tkl->expire_at != 0) ? (tkl->expire_at - TStime()) : 0, - TStime() - tkl->set_at, - tkl->ptr.spamfilter->tkl_duration, tkl->ptr.spamfilter->tkl_reason, + (tkl->expire_at != 0) ? (long long)(tkl->expire_at - TStime()) : 0, + (long long)(TStime() - tkl->set_at), + (long long)tkl->ptr.spamfilter->tkl_duration, + tkl->ptr.spamfilter->tkl_reason, tkl->set_by, tkl->ptr.spamfilter->match->str); if (para && !strcasecmp(para, "del")) @@ -3515,9 +3547,13 @@ int tkl_stats_matcher(Client *client, int type, char *para, TKLFlag *tklflags, T } else if (TKLIsNameBan(tkl)) { - sendnumeric(client, RPL_STATSQLINE, (tkl->type & TKL_GLOBAL) ? 'Q' : 'q', - tkl->ptr.nameban->name, (tkl->expire_at != 0) ? (tkl->expire_at - TStime()) : 0, - TStime() - tkl->set_at, tkl->set_by, tkl->ptr.nameban->reason); + sendnumeric(client, RPL_STATSQLINE, + (tkl->type & TKL_GLOBAL) ? 'Q' : 'q', + tkl->ptr.nameban->name, + (tkl->expire_at != 0) ? (long long)(tkl->expire_at - TStime()) : 0, + (long long)(TStime() - tkl->set_at), + tkl->set_by, + tkl->ptr.nameban->reason); } else if (TKLIsBanException(tkl)) { @@ -3525,8 +3561,8 @@ int tkl_stats_matcher(Client *client, int type, char *para, TKLFlag *tklflags, T char *uhost = tkl_uhost(tkl, uhostbuf, sizeof(uhostbuf), 0); sendnumeric(client, RPL_STATSEXCEPTTKL, uhost, tkl->ptr.banexception->bantypes, - (tkl->expire_at != 0) ? (tkl->expire_at - TStime()) : 0, - (TStime() - tkl->set_at), tkl->set_by, tkl->ptr.banexception->reason); + (tkl->expire_at != 0) ? (long long)(tkl->expire_at - TStime()) : 0, + (long long)(TStime() - tkl->set_at), tkl->set_by, tkl->ptr.banexception->reason); } else { /* That's weird, unknown TKL type */ @@ -3536,7 +3572,7 @@ int tkl_stats_matcher(Client *client, int type, char *para, TKLFlag *tklflags, T } /* TKL Stats. This is used by /STATS gline and all the others */ -void _tkl_stats(Client *client, int type, char *para, int *cnt) +void _tkl_stats(Client *client, int type, const char *para, int *cnt) { TKL *tk; TKLFlag tklflags; @@ -3661,8 +3697,10 @@ void tkl_sync_send_entry(int add, Client *sender, Client *to, TKL *tkl) tkl->ptr.banexception->reason); } else { - sendto_ops_and_log("[BUG] tkl_sync_send_entry() called, but unknown type %d/'%c'", - tkl->type, typ); + unreal_log(ULOG_FATAL, "tkl", "BUG_TKL_SYNC_SEND_ENTRY", NULL, + "[BUG] tkl_sync_send_entry() called for '%s' but unknown type: $tkl.type_string ($tkl_type_int)", + log_data_tkl("tkl", tkl), + log_data_integer("tkl_type_int", typ)); abort(); } } @@ -3809,138 +3847,81 @@ TKL *_find_tkl_spamfilter(int type, char *match_string, BanAction action, unsign /** Send a notice to opers about the TKL that is being added */ void _sendnotice_tkl_add(TKL *tkl) { - char buf[512]; - char set_at[128]; - char expire_at[128]; - char *tkl_type_str; /**< Eg: "K-Line" */ - /* Don't show notices for temporary nick holds (issued by services) */ if (TKLIsNameBan(tkl) && tkl->ptr.nameban->hold) return; - tkl_type_str = tkl_type_string(tkl); - - *buf = *set_at = *expire_at = '\0'; - short_date(tkl->set_at, set_at); - if (tkl->expire_at > 0) - short_date(tkl->expire_at, expire_at); - if (TKLIsServerBan(tkl)) { - char uhostbuf[BUFSIZE]; - char *uhost = tkl_uhost(tkl, uhostbuf, sizeof(uhostbuf), 0); - if (tkl->expire_at != 0) - { - ircsnprintf(buf, sizeof(buf), "%s added for %s on %s GMT (from %s to expire at %s GMT: %s)", - tkl_type_str, uhost, - set_at, tkl->set_by, expire_at, tkl->ptr.serverban->reason); - } else { - ircsnprintf(buf, sizeof(buf), "Permanent %s added for %s on %s GMT (from %s: %s)", - tkl_type_str, uhost, - set_at, tkl->set_by, tkl->ptr.serverban->reason); - } + unreal_log(ULOG_INFO, "tkl", "TKL_ADD", NULL, + "$tkl.type_string added: '$tkl' [reason: $tkl.reason] [by: $tkl.set_by] [duration: $tkl.duration_string]", + log_data_tkl("tkl", tkl)); } else if (TKLIsNameBan(tkl)) { - if (tkl->expire_at > 0) - { - ircsnprintf(buf, sizeof(buf), "%s added for %s on %s GMT (from %s to expire at %s GMT: %s)", - tkl_type_str, tkl->ptr.nameban->name, set_at, tkl->set_by, expire_at, tkl->ptr.nameban->reason); - } else { - ircsnprintf(buf, sizeof(buf), "Permanent %s added for %s on %s GMT (from %s: %s)", - tkl_type_str, tkl->ptr.nameban->name, set_at, tkl->set_by, tkl->ptr.nameban->reason); - } + unreal_log(ULOG_INFO, "tkl", "TKL_ADD", NULL, + "$tkl.type_string added: '$tkl' [reason: $tkl.reason] [by: $tkl.set_by] [duration: $tkl.duration_string]", + log_data_tkl("tkl", tkl)); } else if (TKLIsSpamfilter(tkl)) { - /* Spamfilter */ - ircsnprintf(buf, sizeof(buf), - "Spamfilter added: '%s' [type: %s] [target: %s] [action: %s] [reason: %s] on %s GMT (from %s)", - tkl->ptr.spamfilter->match->str, - unreal_match_method_valtostr(tkl->ptr.spamfilter->match->type), - spamfilter_target_inttostring(tkl->ptr.spamfilter->target), - banact_valtostring(tkl->ptr.spamfilter->action), - unreal_decodespace(tkl->ptr.spamfilter->tkl_reason), - set_at, - tkl->set_by); + unreal_log(ULOG_INFO, "tkl", "TKL_ADD", NULL, + "Spamfilter added: '$tkl' [type: $tkl.match_type] [targets: $tkl.spamfilter_targets] " + "[action: $tkl.ban_action] [reason: $tkl.reason] [by: $tkl.set_by]", + log_data_tkl("tkl", tkl)); } else if (TKLIsBanException(tkl)) { - char uhostbuf[BUFSIZE]; - char *uhost = tkl_uhost(tkl, uhostbuf, sizeof(uhostbuf), 0); - if (tkl->expire_at != 0) - { - ircsnprintf(buf, sizeof(buf), "%s added for %s for types '%s' on %s GMT (from %s to expire at %s GMT: %s)", - tkl_type_str, uhost, - tkl->ptr.banexception->bantypes, - set_at, tkl->set_by, expire_at, tkl->ptr.banexception->reason); - } else { - ircsnprintf(buf, sizeof(buf), "Permanent %s added for %s for types '%s' on %s GMT (from %s: %s)", - tkl_type_str, uhost, - tkl->ptr.banexception->bantypes, - set_at, tkl->set_by, tkl->ptr.banexception->reason); - } + unreal_log(ULOG_INFO, "tkl", "TKL_ADD", NULL, + "$tkl.type_string added: '$tkl' [types: $tkl.exception_types] [by: $tkl.set_by] [duration: $tkl.duration_string]", + log_data_tkl("tkl", tkl)); } else { - ircsnprintf(buf, sizeof(buf), "[BUG] %s added but type unhandled in sendnotice_tkl_add()!!!", tkl_type_str); + unreal_log(ULOG_ERROR, "tkl", "BUG_UNKNOWN_TKL", NULL, + "[BUG] TKL added of unknown type, unhandled in sendnotice_tkl_add()!!!!"); } - - sendto_snomask(SNO_TKL, "*** %s", buf); - ircd_log(LOG_TKL, "%s", buf); } /** Send a notice to opers about the TKL that is being deleted */ void _sendnotice_tkl_del(char *removed_by, TKL *tkl) { - char buf[512]; - char set_at[128]; - char *tkl_type_str; - /* Don't show notices for temporary nick holds (issued by services) */ if (TKLIsNameBan(tkl) && tkl->ptr.nameban->hold) return; - tkl_type_str = tkl_type_string(tkl); /* eg: "K-Line" */ - - *buf = *set_at = '\0'; - short_date(tkl->set_at, set_at); - if (TKLIsServerBan(tkl)) { - char uhostbuf[BUFSIZE]; - char *uhost = tkl_uhost(tkl, uhostbuf, sizeof(uhostbuf), 0); - ircsnprintf(buf, sizeof(buf), - "%s removed %s %s (set at %s - reason: %s)", - removed_by, tkl_type_str, uhost, - set_at, tkl->ptr.serverban->reason); + unreal_log(ULOG_INFO, "tkl", "TKL_DEL", NULL, + "$tkl.type_string removed: '$tkl' [reason: $tkl.reason] [by: $removed_by] [set at: $tkl.set_at_string]", + log_data_tkl("tkl", tkl), + log_data_string("removed_by", removed_by)); } else if (TKLIsNameBan(tkl)) { - ircsnprintf(buf, sizeof(buf), - "%s removed %s %s (set at %s - reason: %s)", - removed_by, tkl_type_str, tkl->ptr.nameban->name, set_at, tkl->ptr.nameban->reason); + unreal_log(ULOG_INFO, "tkl", "TKL_DEL", NULL, + "$tkl.type_string removed: '$tkl' [reason: $tkl.reason] [by: $removed_by] [set at: $tkl.set_at_string]", + log_data_tkl("tkl", tkl), + log_data_string("removed_by", removed_by)); } else if (TKLIsSpamfilter(tkl)) { - ircsnprintf(buf, sizeof(buf), - "%s removed Spamfilter '%s' (set at %s)", - removed_by, tkl->ptr.spamfilter->match->str, set_at); + unreal_log(ULOG_INFO, "tkl", "TKL_DEL", NULL, + "Spamfilter removed: '$tkl' [type: $tkl.match_type] [targets: $tkl.spamfilter_targets] " + "[action: $tkl.ban_action] [reason: $tkl.reason] [by: $removed_by] [set at: $tkl.set_at_string]", + log_data_tkl("tkl", tkl), + log_data_string("removed_by", removed_by)); } else if (TKLIsBanException(tkl)) { - char uhostbuf[BUFSIZE]; - char *uhost = tkl_uhost(tkl, uhostbuf, sizeof(uhostbuf), 0); - ircsnprintf(buf, sizeof(buf), - "%s removed exception on %s (set at %s - reason: %s)", - removed_by, uhost, - set_at, tkl->ptr.banexception->reason); + unreal_log(ULOG_INFO, "tkl", "TKL_DEL", NULL, + "$tkl.type_string removed: '$tkl' [types: $tkl.exception_types] [by: $removed_by] [set at: $tkl.set_at_string]", + log_data_tkl("tkl", tkl), + log_data_string("removed_by", removed_by)); } else { - ircsnprintf(buf, sizeof(buf), "[BUG] %s added but type unhandled in sendnotice_tkl_del()!!!!!", tkl_type_str); + unreal_log(ULOG_ERROR, "tkl", "BUG_UNKNOWN_TKL", NULL, + "[BUG] TKL removed of unknown type, unhandled in sendnotice_tkl_del()!!!!"); } - - sendto_snomask(SNO_TKL, "*** %s", buf); - ircd_log(LOG_TKL, "%s", buf); } /** Add a TKL using the TKL layer. See cmd_tkl for parv[] and protocol documentation. */ @@ -3949,7 +3930,7 @@ CMD_FUNC(cmd_tkl_add) TKL *tkl; int type; time_t expire_at, set_at; - char *set_by; + const char *set_by; char tkl_entry_exists = 0; /* we rely on servers to be failsafe.. */ @@ -3977,14 +3958,18 @@ CMD_FUNC(cmd_tkl_add) /* Validate set and expiry time */ if ((set_at < 0) || !short_date(set_at, NULL)) { - sendto_realops("Invalid TKL entry from %s, set-at time is out of range (%lld) -- not added. Clock on other server incorrect or bogus entry.", - client->name, (long long)set_at); + unreal_log(ULOG_WARNING, "tkl", "TKL_ADD_INVALID", client, + "Invalid TKL entry from $client: " + "The set-at time is out of range ($set_at). Clock on other server incorrect or bogus entry.", + log_data_integer("set_at", set_at)); return; } if ((expire_at < 0) || !short_date(expire_at, NULL)) { - sendto_realops("Invalid TKL entry from %s, expiry time is out of range (%lld) -- not added. Clock on other server incorrect or bogus entry.", - client->name, (long long)expire_at); + unreal_log(ULOG_WARNING, "tkl", "TKL_ADD_INVALID", client, + "Invalid TKL entry from $client: " + "The expire-at time is out of range ($expire_at). Clock on other server incorrect or bogus entry.", + log_data_integer("expire_at", expire_at)); return; } @@ -3996,9 +3981,9 @@ CMD_FUNC(cmd_tkl_add) { /* Validate server ban TKL fields */ int softban = 0; - char *usermask = parv[3]; - char *hostmask = parv[4]; - char *reason = parv[8]; + const char *usermask = parv[3]; + const char *hostmask = parv[4]; + const char *reason = parv[8]; /* Some simple validation on usermask and hostmask: * may not contain an @. Yeah, some services or self-written @@ -4006,9 +3991,11 @@ CMD_FUNC(cmd_tkl_add) */ if (strchr(usermask, '@') || strchr(hostmask, '@')) { - sendto_realops("Ignoring TKL entry %s@%s from %s. " - "Invalid usermask '%s' or hostmask '%s'.", - usermask, hostmask, client->name, usermask, hostmask); + unreal_log(ULOG_WARNING, "tkl", "TKL_ADD_INVALID", client, + "Invalid TKL entry from $client: " + "Invalid user@host $usermask@$hostmask", + log_data_string("usermask", usermask), + log_data_string("hostmask", hostmask)); return; } @@ -4035,10 +4022,10 @@ CMD_FUNC(cmd_tkl_add) { /* Validate ban exception TKL fields */ int softban = 0; - char *usermask = parv[3]; - char *hostmask = parv[4]; - char *bantypes = parv[8]; - char *reason; + const char *usermask = parv[3]; + const char *hostmask = parv[4]; + const char *bantypes = parv[8]; + const char *reason; if (parc < 10) return; @@ -4051,9 +4038,11 @@ CMD_FUNC(cmd_tkl_add) */ if (strchr(usermask, '@') || strchr(hostmask, '@')) { - sendto_realops("Ignoring TKL exception entry %s@%s from %s. " - "Invalid usermask '%s' or hostmask '%s'.", - usermask, hostmask, client->name, usermask, hostmask); + unreal_log(ULOG_WARNING, "tkl", "TKL_ADD_INVALID", client, + "Invalid TKL entry from $client: " + "Invalid TKL except user@host $usermask@$hostmask", + log_data_string("usermask", usermask), + log_data_string("hostmask", hostmask)); return; } @@ -4083,8 +4072,8 @@ CMD_FUNC(cmd_tkl_add) { /* Validate name ban TKL fields */ int hold = 0; - char *name = parv[4]; - char *reason = parv[8]; + const char *name = parv[4]; + const char *reason = parv[8]; if (*parv[3] == 'H') hold = 1; @@ -4102,10 +4091,10 @@ CMD_FUNC(cmd_tkl_add) { /* Validate spamfilter-specific TKL fields */ MatchType match_method; - char *match_string; + const char *match_string; Match *m; /* compiled match_string */ time_t tkl_duration; - char *tkl_reason; + const char *tkl_reason; BanAction action; unsigned short target; /* helper variables */ @@ -4113,38 +4102,42 @@ CMD_FUNC(cmd_tkl_add) if (parc < 12) { - sendto_realops("Ignoring spamfilter from %s. Running very old UnrealIRCd protocol (3.2.X?)", client->name); + unreal_log(ULOG_WARNING, "tkl", "TKL_ADD_INVALID", client, + "Invalid TKL entry from $client: " + "Spamfilter with too few parameters. Running very old UnrealIRCd protocol (3.2.X?)"); return; } match_string = parv[11]; - if (!strcasecmp(parv[10], "posix")) - { - sendto_realops("Ignoring spamfilter from %s. Spamfilter is of type 'posix' (TRE) which " - "is not supported in UnrealIRCd 5. Suggestion: upgrade the other server.", - client->name); - return; - } match_method = unreal_match_method_strtoval(parv[10]); if (match_method == 0) { - sendto_realops("Ignoring spamfilter '%s' from %s with unknown match type '%s'", - match_string, client->name, parv[10]); + unreal_log(ULOG_WARNING, "tkl", "TKL_ADD_INVALID", client, + "Invalid TKL entry from $client: " + "Spamfilter '$spamfilter_string' has unkown match-type '$spamfilter_type'", + log_data_string("spamfilter_string", match_string), + log_data_string("spamfilter_type", parv[10])); return; } if (!(target = spamfilter_gettargets(parv[3], NULL))) { - sendto_realops("Ignoring spamfilter '%s' from %s with unknown target type '%s'", - match_string, client->name, parv[3]); + unreal_log(ULOG_WARNING, "tkl", "TKL_ADD_INVALID", client, + "Invalid TKL entry from $client: " + "Spamfilter '$spamfilter_string' has unkown targets '$spamfilter_targets'", + log_data_string("spamfilter_string", match_string), + log_data_string("spamfilter_targets", parv[3])); return; } if (!(action = banact_chartoval(*parv[4]))) { - sendto_realops("Ignoring spamfilter '%s' from %s with unknown action type '%s'", - match_string, client->name, parv[4]); + unreal_log(ULOG_WARNING, "tkl", "TKL_ADD_INVALID", client, + "Invalid TKL entry from $client: " + "Spamfilter '$spamfilter_string' has unkown action '$spamfilter_action'", + log_data_string("spamfilter_string", match_string), + log_data_string("spamfilter_action", parv[4])); return; } @@ -4160,9 +4153,11 @@ CMD_FUNC(cmd_tkl_add) m = unreal_create_match(match_method, match_string, &err); if (!m) { - sendto_realops("[TKL ERROR] ERROR: Trying to add a spamfilter which does not compile. " - " ERROR='%s', Spamfilter='%s', from='%s'", - err, match_string, client->name); + unreal_log(ULOG_WARNING, "tkl", "TKL_ADD_INVALID", client, + "Invalid TKL entry from $client: " + "Spamfilter '$spamfilter_string': regex does not compile: $spamfilter_regex_error", + log_data_string("spamfilter_string", match_string), + log_data_string("spamfilter_regex_error", err)); return; } tkl = tkl_add_spamfilter(type, target, action, m, set_by, expire_at, set_at, @@ -4213,7 +4208,7 @@ CMD_FUNC(cmd_tkl_add) /* Below this line we will only use 'tkl'. No parc/parv reading anymore. */ - RunHook2(HOOKTYPE_TKL_ADD, client, tkl); + RunHook(HOOKTYPE_TKL_ADD, client, tkl); sendnotice_tkl_add(tkl); @@ -4233,7 +4228,7 @@ CMD_FUNC(cmd_tkl_del) { TKL *tkl; int type; - char *removed_by; + const char *removed_by; if (!IsServer(client) && !IsMe(client)) return; @@ -4249,8 +4244,8 @@ CMD_FUNC(cmd_tkl_del) if (TKLIsServerBanType(type)) { - char *usermask = parv[3]; - char *hostmask = parv[4]; + const char *usermask = parv[3]; + const char *hostmask = parv[4]; int softban = 0; if (*usermask == '%') @@ -4263,8 +4258,8 @@ CMD_FUNC(cmd_tkl_del) } else if (TKLIsBanExceptionType(type)) { - char *usermask = parv[3]; - char *hostmask = parv[4]; + const char *usermask = parv[3]; + const char *hostmask = parv[4]; int softban = 0; /* other parameters are ignored */ @@ -4279,7 +4274,7 @@ CMD_FUNC(cmd_tkl_del) else if (TKLIsNameBanType(type)) { int hold = 0; - char *name = parv[4]; + const char *name = parv[4]; if (*parv[3] == 'H') hold = 1; @@ -4287,14 +4282,15 @@ CMD_FUNC(cmd_tkl_del) } else if (TKLIsSpamfilterType(type)) { - char *match_string; + const char *match_string; unsigned short target; BanAction action; if (parc < 9) { - sendto_realops("[BUG] cmd_tkl called with bogus spamfilter removal request [f/F], from=%s, parc=%d", - client->name, parc); + unreal_log(ULOG_WARNING, "tkl", "TKL_DEL_INVALID", client, + "Invalid TKL deletion request from $client: " + "Spamfilter with too few parameters. Running very old UnrealIRCd protocol (3.2.X?)"); return; /* bogus */ } if (parc >= 12) @@ -4306,15 +4302,21 @@ CMD_FUNC(cmd_tkl_del) if (!(target = spamfilter_gettargets(parv[3], NULL))) { - sendto_realops("Ignoring spamfilter deletion request for '%s' from %s with unknown target type '%s'", - match_string, client->name, parv[3]); + unreal_log(ULOG_WARNING, "tkl", "TKL_DEL_INVALID", client, + "Invalid TKL deletion request from $client: " + "Spamfilter '$spamfilter_string' has unkown targets '$spamfilter_targets'", + log_data_string("spamfilter_string", match_string), + log_data_string("spamfilter_targets", parv[3])); return; } if (!(action = banact_chartoval(*parv[4]))) { - sendto_realops("Ignoring spamfilter deletion request for '%s' from %s with unknown action type '%s'", - match_string, client->name, parv[4]); + unreal_log(ULOG_WARNING, "tkl", "TKL_DEL_INVALID", client, + "Invalid TKL deletion request from $client: " + "Spamfilter '$spamfilter_string' has unkown action '$spamfilter_action'", + log_data_string("spamfilter_string", match_string), + log_data_string("spamfilter_action", parv[4])); return; } tkl = find_tkl_spamfilter(type, match_string, action, target); @@ -4338,7 +4340,7 @@ CMD_FUNC(cmd_tkl_del) if (type & TKL_SHUN) tkl_check_local_remove_shun(tkl); - RunHook2(HOOKTYPE_TKL_DEL, client, tkl); + RunHook(HOOKTYPE_TKL_DEL, client, tkl); if (type & TKL_GLOBAL) { @@ -4412,7 +4414,7 @@ CMD_FUNC(_cmd_tkl) } /** Configure the username/hostname TKL layer based on the BAN_TARGET_* configuration */ -void ban_target_to_tkl_layer(BanTarget ban_target, BanAction action, Client *client, char **tkl_username, char **tkl_hostname) +void ban_target_to_tkl_layer(BanTarget ban_target, BanAction action, Client *client, const char **tkl_username, const char **tkl_hostname) { static char username[USERLEN+1]; static char hostname[HOSTLEN+8]; @@ -4422,13 +4424,11 @@ void ban_target_to_tkl_layer(BanTarget ban_target, BanAction action, Client *cli if (ban_target == BAN_TARGET_ACCOUNT) { - if (client->user && client->user->svid && - strcmp(client->user->svid, "0") && - (*client->user->svid != ':')) + if (IsLoggedIn(client) && (*client->user->account != ':')) { /* Place a ban on ~a:Accountname */ strlcpy(username, "~a:", sizeof(username)); - strlcpy(hostname, client->user->svid, sizeof(hostname)); + strlcpy(hostname, client->user->account, sizeof(hostname)); *tkl_username = username; *tkl_hostname = hostname; return; @@ -4437,7 +4437,7 @@ void ban_target_to_tkl_layer(BanTarget ban_target, BanAction action, Client *cli } else if (ban_target == BAN_TARGET_CERTFP) { - char *fp = moddata_client_get(client, "certfp"); + const char *fp = moddata_client_get(client, "certfp"); if (fp) { /* Place a ban on ~S:sha256sumofclientcertificate */ @@ -4453,7 +4453,7 @@ void ban_target_to_tkl_layer(BanTarget ban_target, BanAction action, Client *cli /* Below we deal with the more common choices... */ /* First, set the username */ - if (((ban_target == BAN_TARGET_USERIP) || (ban_target == BAN_TARGET_USERHOST)) && client->ident && strcmp(client->ident, "unknown")) + if (((ban_target == BAN_TARGET_USERIP) || (ban_target == BAN_TARGET_USERHOST)) && strcmp(client->ident, "unknown")) strlcpy(username, client->ident, sizeof(username)); else strlcpy(username, "*", sizeof(username)); @@ -4494,11 +4494,10 @@ int _place_host_ban(Client *client, BanAction action, char *reason, long duratio { case BAN_ACT_TEMPSHUN: /* We simply mark this connection as shunned and do not add a ban record */ - sendto_snomask(SNO_TKL, "Temporary shun added at user %s (%s@%s) [%s]", - client->name, - client->user ? client->user->username : "unknown", - client->user ? client->user->realhost : GetIP(client), - reason); + unreal_log(ULOG_INFO, "tkl", "TKL_ADD_TEMPSHUN", &me, + "Temporary shun added on user $target.details [reason: $shun_reason] [by: $client]", + log_data_string("shun_reason", reason), + log_data_client("target", client)); SetShunned(client); return 1; case BAN_ACT_GZLINE: @@ -4511,7 +4510,7 @@ int _place_host_ban(Client *client, BanAction action, char *reason, long duratio case BAN_ACT_SOFT_SHUN: { char ip[128], user[USERLEN+3], mo[100], mo2[100]; - char *tkllayer[9] = { + const char *tkllayer[9] = { me.name, /*0 server.name */ "+", /*1 +|- */ "?", /*2 type */ @@ -4554,7 +4553,7 @@ int _place_host_ban(Client *client, BanAction action, char *reason, long duratio tkllayer[7] = mo2; tkllayer[8] = reason; cmd_tkl(&me, NULL, 9, tkllayer); - RunHookReturnInt4(HOOKTYPE_PLACE_HOST_BAN, client, action, reason, duration, !=99); + RunHookReturnInt(HOOKTYPE_PLACE_HOST_BAN, !=99, client, action, reason, duration); if ((action == BAN_ACT_SHUN) || (action == BAN_ACT_SOFT_SHUN)) { find_shun(client); @@ -4565,7 +4564,7 @@ int _place_host_ban(Client *client, BanAction action, char *reason, long duratio case BAN_ACT_SOFT_KILL: case BAN_ACT_KILL: default: - RunHookReturnInt4(HOOKTYPE_PLACE_HOST_BAN, client, action, reason, duration, !=99); + RunHookReturnInt(HOOKTYPE_PLACE_HOST_BAN, !=99, client, action, reason, duration); exit_client(client, NULL, reason); return 1; } @@ -4618,7 +4617,7 @@ TKL *choose_winning_spamfilter(TKL *one, TKL *two) /** Checks if 'target' is on the spamfilter exception list. * RETURNS 1 if found in list, 0 if not. */ -static int target_is_spamexcept(char *target) +static int target_is_spamexcept(const char *target) { SpamExcept *e; @@ -4638,12 +4637,13 @@ static int target_is_spamexcept(char *target) */ int _join_viruschan(Client *client, TKL *tkl, int type) { - char *xparv[3], chbuf[CHANNELLEN + 16], buf[2048]; + const char *xparv[3]; + char chbuf[CHANNELLEN + 16], buf[2048]; Channel *channel; int ret; snprintf(buf, sizeof(buf), "0,%s", SPAMFILTER_VIRUSCHAN); - xparv[0] = client->name; + xparv[0] = NULL; xparv[1] = buf; xparv[2] = NULL; @@ -4658,16 +4658,16 @@ int _join_viruschan(Client *client, TKL *tkl, int type) sendnotice(client, "You are now restricted to talking in %s: %s", SPAMFILTER_VIRUSCHAN, unreal_decodespace(tkl->ptr.spamfilter->tkl_reason)); - channel = find_channel(SPAMFILTER_VIRUSCHAN, NULL); + channel = find_channel(SPAMFILTER_VIRUSCHAN); if (channel) { MessageTag *mtags = NULL; - ircsnprintf(chbuf, sizeof(chbuf), "@%s", channel->chname); + ircsnprintf(chbuf, sizeof(chbuf), "@%s", channel->name); ircsnprintf(buf, sizeof(buf), "[Spamfilter] %s matched filter '%s' [%s] [%s]", client->name, tkl->ptr.spamfilter->match->str, cmdname_by_spamftarget(type), unreal_decodespace(tkl->ptr.spamfilter->tkl_reason)); new_message(&me, NULL, &mtags); - sendto_channel(channel, &me, NULL, PREFIX_OP|PREFIX_ADMIN|PREFIX_OWNER, + sendto_channel(channel, &me, NULL, "o", 0, SEND_ALL|SKIP_DEAF, mtags, ":%s NOTICE %s :%s", me.name, chbuf, buf); free_message_tags(mtags); @@ -4687,11 +4687,11 @@ int _join_viruschan(Client *client, TKL *tkl, int type) * 1 if spamfilter matched and it should be blocked (or client exited), 0 if not matched. * In case of 1, be sure to check IsDead(client).. */ -int _match_spamfilter(Client *client, char *str_in, int target, char *cmd, char *destination, int flags, TKL **rettkl) +int _match_spamfilter(Client *client, const char *str_in, int target, const char *cmd, const char *destination, int flags, TKL **rettkl) { TKL *tkl; TKL *winner_tkl = NULL; - char *str; + const char *str; int ret = -1; char *reason = NULL; #ifdef SPAMFILTER_DETECTSLOW @@ -4708,7 +4708,7 @@ int _match_spamfilter(Client *client, char *str_in, int target, char *cmd, char if (target == SPAMF_USER) str = str_in; else - str = (char *)StripControlCodes(str_in); + str = StripControlCodes(str_in); /* (note: using client->user check here instead of IsUser() * due to SPAMF_USER where user isn't marked as client/person yet. @@ -4753,22 +4753,26 @@ int _match_spamfilter(Client *client, char *str_in, int target, char *cmd, char if ((SPAMFILTER_DETECTSLOW_FATAL > 0) && (ms_past > SPAMFILTER_DETECTSLOW_FATAL)) { - sendto_realops("[Spamfilter] WARNING: Too slow spamfilter detected (took %ld msec to execute) " - "-- spamfilter will be \002REMOVED!\002: %s", ms_past, tkl->ptr.spamfilter->match->str); + unreal_log(ULOG_ERROR, "tkl", "SPAMFILTER_SLOW_FATAL", NULL, + "[Spamfilter] WARNING: Too slow spamfilter detected (took $msec_time msec to execute) " + "-- spamfilter will be \002REMOVED!\002: $tkl", + log_data_tkl("tkl", tkl), + log_data_integer("msec_time", ms_past)); tkl_del_line(tkl); return 0; /* Act as if it didn't match, even if it did.. it's gone now anyway.. */ } else if ((SPAMFILTER_DETECTSLOW_WARN > 0) && (ms_past > SPAMFILTER_DETECTSLOW_WARN)) { - sendto_realops("[Spamfilter] WARNING: SLOW Spamfilter detected (took %ld msec to execute): %s", - ms_past, tkl->ptr.spamfilter->match->str); + unreal_log(ULOG_WARNING, "tkl", "SPAMFILTER_SLOW_WARN", NULL, + "[Spamfilter] WARNING: Slow spamfilter detected (took $msec_time msec to execute): $tkl", + log_data_tkl("tkl", tkl), + log_data_integer("msec_time", ms_past)); } #endif if (ret) { /* We have a match! */ - char buf[1024]; char destinationbuf[48]; if (destination) { @@ -4781,15 +4785,14 @@ int _match_spamfilter(Client *client, char *str_in, int target, char *cmd, char if (!winner_tkl && destination && target_is_spamexcept(destination)) return 0; /* No problem! */ - ircsnprintf(buf, sizeof(buf), "[Spamfilter] %s!%s@%s matches filter '%s': [%s%s: '%s'] [%s]", - client->name, client->user->username, client->user->realhost, - tkl->ptr.spamfilter->match->str, - cmd, destinationbuf, str, - unreal_decodespace(tkl->ptr.spamfilter->tkl_reason)); + unreal_log(ULOG_INFO, "tkl", "SPAMFILTER_MATCH", client, + "[Spamfilter] $client.details matches filter '$tkl': [cmd: $command$destination: '$str'] [reason: $tkl.reason] [action: $tkl.ban_action]", + log_data_tkl("tkl", tkl), + log_data_string("command", cmd), + log_data_string("destination", destination ? destination : ""), + log_data_string("str", str)); - sendto_snomask_global(SNO_SPAMF, "%s", buf); - ircd_log(LOG_SPAMFILTER, "%s", buf); - RunHook6(HOOKTYPE_LOCAL_SPAMFILTER, client, str, str_in, target, destination, tkl); + RunHook(HOOKTYPE_LOCAL_SPAMFILTER, client, str, str_in, target, destination, tkl); /* If we should stop after the first match, we end here... */ if (SPAMFILTER_STOP_ON_FIRST_MATCH) @@ -4990,7 +4993,7 @@ static int comp_with_mask(void *addr, void *dest, u_int mask) * CIDR support is available so 'host' may be like '1.2.0.0/16'. * @returns 1 on match, 0 on no match. */ -int _match_user(char *rmask, Client *client, int options) +int _match_user(const char *rmask, Client *client, int options) { char mask[NICKLEN+USERLEN+HOSTLEN+8]; char clientip[IPSZ], maskip[IPSZ]; @@ -5001,8 +5004,8 @@ int _match_user(char *rmask, Client *client, int options) strlcpy(mask, rmask, sizeof(mask)); if ((options & MATCH_CHECK_EXTENDED) && - is_extended_ban(mask) && - client && client->user) + is_extended_server_ban(mask) && + client->user) { /* Check user properties / extbans style */ return _match_user_extended_server_ban(rmask, client); @@ -5144,17 +5147,29 @@ int _match_user(char *rmask, Client *client, int options) return 0; /* NOMATCH: nothing of the above matched */ } -int _match_user_extended_server_ban(char *banstr, Client *client) +int _match_user_extended_server_ban(const char *banstr, Client *client) { - char *msg = NULL, *errmsg = NULL; + const char *nextbanstr; Extban *extban; + BanContext *b; + int ret; - if (!is_extended_ban(banstr)) + if (!is_extended_server_ban(banstr)) return 0; /* we should never have been called */ - extban = findmod_by_bantype(banstr[1]); - if (!extban || !(extban->options & EXTBOPT_TKL)) + extban = findmod_by_bantype(banstr, &nextbanstr); + if (!extban || + !(extban->options & EXTBOPT_TKL) || + !(extban->is_banned_events & BANCHK_TKL)) + { return 0; /* extban not found or of incorrect type (eg ~T) */ + } - return extban->is_banned(client, NULL, banstr, BANCHK_TKL, &msg, &errmsg); + b = safe_alloc(sizeof(BanContext)); + b->client = client; + b->banstr = nextbanstr; + b->ban_check_types = BANCHK_TKL; + ret = extban->is_banned(b); + safe_free(b); + return ret; } diff --git a/src/modules/tkldb.c b/src/modules/tkldb.c index 57a2274..fdc05a5 100644 --- a/src/modules/tkldb.c +++ b/src/modules/tkldb.c @@ -24,7 +24,7 @@ ModuleHeader MOD_HEADER = { "1.10", "Stores active TKL entries (*-Lines) persistently/across IRCd restarts", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; #define TKLDB_MAGIC 0x10101010 @@ -38,8 +38,7 @@ ModuleHeader MOD_HEADER = { */ #define TKLDB_SAVE_EVERY_DELTA +15 -#ifdef DEBUGMODE - #define BENCHMARK +// #undef BENCHMARK /* Benchmark results (2GHz Xeon Skylake, compiled with -O2, Linux): * 100,000 zlines: * - load db: 510 ms @@ -48,7 +47,6 @@ ModuleHeader MOD_HEADER = { * which executes every 5 minutes. * Of course, exact figures will depend on the machine. */ -#endif #define FreeTKLRead() \ do { \ @@ -59,9 +57,10 @@ ModuleHeader MOD_HEADER = { #define WARN_WRITE_ERROR(fname) \ do { \ - sendto_realops_and_log("[tkldb] Error writing to temporary database file " \ - "'%s': %s (DATABASE NOT SAVED)", \ - fname, unrealdb_get_error_string()); \ + unreal_log(ULOG_ERROR, "tkldb", "TKLDB_FILE_WRITE_ERROR", NULL, \ + "[tkldb] Error writing to temporary database file $filename: $system_error", \ + log_data_string("filename", fname), \ + log_data_string("system_error", unrealdb_get_error_string())); \ } while(0) #define R_SAFE(x) \ @@ -163,7 +162,7 @@ MOD_LOAD() MOD_UNLOAD() { - if (loop.ircd_terminating) + if (loop.terminating) write_tkldb(); freecfg(&test); freecfg(&cfg); @@ -199,34 +198,34 @@ int tkldb_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) if (type != CONFIG_SET) return 0; - if (!ce || strcmp(ce->ce_varname, "tkldb")) + if (!ce || strcmp(ce->name, "tkldb")) return 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!cep->ce_vardata) + if (!cep->value) { - config_error("%s:%i: blank set::tkldb::%s without value", cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_varname); + config_error("%s:%i: blank set::tkldb::%s without value", cep->file->filename, cep->line_number, cep->name); errors++; } else - if (!strcmp(cep->ce_varname, "database")) + if (!strcmp(cep->name, "database")) { - convert_to_absolute_path(&cep->ce_vardata, PERMDATADIR); - safe_strdup(test.database, cep->ce_vardata); + convert_to_absolute_path(&cep->value, PERMDATADIR); + safe_strdup(test.database, cep->value); } else - if (!strcmp(cep->ce_varname, "db-secret")) + if (!strcmp(cep->name, "db-secret")) { - char *err; - if ((err = unrealdb_test_secret(cep->ce_vardata))) + const char *err; + if ((err = unrealdb_test_secret(cep->value))) { - config_error("%s:%i: set::tkldb::db-secret: %s", cep->ce_fileptr->cf_filename, cep->ce_varlinenum, err); + config_error("%s:%i: set::tkldb::db-secret: %s", cep->file->filename, cep->line_number, err); errors++; continue; } - safe_strdup(test.db_secret, cep->ce_vardata); + safe_strdup(test.db_secret, cep->value); } else { - config_error("%s:%i: unknown directive set::tkldb::%s", cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_varname); + config_error("%s:%i: unknown directive set::tkldb::%s", cep->file->filename, cep->line_number, cep->name); errors++; } } @@ -258,15 +257,15 @@ int tkldb_config_run(ConfigFile *cf, ConfigEntry *ce, int type) if (type != CONFIG_SET) return 0; - if (!ce || strcmp(ce->ce_varname, "tkldb")) + if (!ce || strcmp(ce->name, "tkldb")) return 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "database")) - safe_strdup(cfg.database, cep->ce_vardata); - else if (!strcmp(cep->ce_varname, "db-secret")) - safe_strdup(cfg.db_secret, cep->ce_vardata); + if (!strcmp(cep->name, "database")) + safe_strdup(cfg.database, cep->value); + else if (!strcmp(cep->name, "db-secret")) + safe_strdup(cfg.db_secret, cep->value); } return 1; } @@ -370,7 +369,7 @@ int write_tkldb(void) #endif if (rename(tmpfname, cfg.database) < 0) { - sendto_realops_and_log("[tkldb] Error renaming '%s' to '%s': %s (DATABASE NOT SAVED)", tmpfname, cfg.database, strerror(errno)); + config_error("[tkldb] Error renaming '%s' to '%s': %s (DATABASE NOT SAVED)", tmpfname, cfg.database, strerror(errno)); return 0; } #ifdef BENCHMARK @@ -748,12 +747,13 @@ int read_tkldb(void) unrealdb_close(db); if (added_cnt) - sendto_realops_and_log("[tkldb] Re-added %d *-Lines", added_cnt); + config_status("[tkldb] Re-added %d *-Lines", added_cnt); #ifdef BENCHMARK gettimeofday(&tv_beta, NULL); - ircd_log(LOG_ERROR, "[tkldb] Benchmark: LOAD DB: %lld microseconds", - (long long)(((tv_beta.tv_sec - tv_alpha.tv_sec) * 1000000) + (tv_beta.tv_usec - tv_alpha.tv_usec))); + unreal_log(ULOG_DEBUG, "tkldb", "TKLDB_BENCHMARK", NULL, + "[tkldb] Benchmark: LOAD DB: $time_msec microseconds", + log_data_integer("time_msec", ((tv_beta.tv_sec - tv_alpha.tv_sec) * 1000000) + (tv_beta.tv_usec - tv_alpha.tv_usec))); #endif return 1; } diff --git a/src/modules/tls_antidos.c b/src/modules/tls_antidos.c index 03615cd..b3f6d91 100644 --- a/src/modules/tls_antidos.c +++ b/src/modules/tls_antidos.c @@ -1,6 +1,6 @@ /* - * SSL/TLS Anti DoS module - * This protects against SSL renegotiation attacks while still allowing us + * TLS Anti DoS module + * This protects against TLS renegotiation attacks while still allowing us * to leave renegotiation on with all it's security benefits. * * (C) Copyright 2015- Bram Matthys and the UnrealIRCd team. @@ -16,7 +16,7 @@ ModuleHeader MOD_HEADER "5.0", "TLS Renegotiation DoS protection", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; #define HANDSHAKE_LIMIT_COUNT 3 @@ -81,8 +81,7 @@ void ssl_info_callback(const SSL *ssl, int where, int ret) e->n++; if (e->n >= HANDSHAKE_LIMIT_COUNT) { - ircd_log(LOG_ERROR, "TLS Handshake flood detected from %s -- killed", get_client_name(client, TRUE)); - sendto_realops("TLS Handshake flood detected from %s -- killed", get_client_name(client, TRUE)); + unreal_log(ULOG_INFO, "flood", "TLS_HANDSHAKE_FLOOD", client, "TLS Handshake flood detected from $client -- killed"); dead_socket(client, "TLS Handshake flood detected"); } } @@ -105,7 +104,7 @@ int tls_antidos_handshake(Client *client) return 0; } -/** Called by OpenSSL when the SSL structure is freed (so we can free up our custom struct too) */ +/** Called by OpenSSL when the SSL * structure is freed (so we can free up our custom struct too) */ void tls_antidos_free(void *parent, void *ptr, CRYPTO_EX_DATA *ad, int idx, long argl, void *argp) { safe_free(ptr); diff --git a/src/modules/tls_cipher.c b/src/modules/tls_cipher.c new file mode 100644 index 0000000..a7e84be --- /dev/null +++ b/src/modules/tls_cipher.c @@ -0,0 +1,91 @@ +/* + * Store TLS cipher in ModData + * (C) Copyright 2021-.. Syzop and The UnrealIRCd Team + * License: GPLv2 + */ + +#include "unrealircd.h" + +ModuleHeader MOD_HEADER + = { + "tls_cipher", + "5.0", + "Store and retrieve TLS cipher string", + "UnrealIRCd Team", + "unrealircd-6", + }; + +/* Forward declarations */ +void tls_cipher_free(ModData *m); +const char *tls_cipher_serialize(ModData *m); +void tls_cipher_unserialize(const char *str, ModData *m); +int tls_cipher_handshake(Client *client); +int tls_cipher_connect(Client *client); +int tls_cipher_whois(Client *client, Client *target); + +ModDataInfo *tls_cipher_md; /* Module Data structure which we acquire */ + +MOD_INIT() +{ +ModDataInfo mreq; + + MARK_AS_OFFICIAL_MODULE(modinfo); + + memset(&mreq, 0, sizeof(mreq)); + mreq.name = "tls_cipher"; + mreq.free = tls_cipher_free; + mreq.serialize = tls_cipher_serialize; + mreq.unserialize = tls_cipher_unserialize; + mreq.sync = MODDATA_SYNC_EARLY; + mreq.type = MODDATATYPE_CLIENT; + tls_cipher_md = ModDataAdd(modinfo->handle, mreq); + if (!tls_cipher_md) + abort(); + + HookAdd(modinfo->handle, HOOKTYPE_HANDSHAKE, 0, tls_cipher_handshake); + HookAdd(modinfo->handle, HOOKTYPE_SERVER_HANDSHAKE_OUT, 0, tls_cipher_handshake); + + return MOD_SUCCESS; +} + +MOD_LOAD() +{ + return MOD_SUCCESS; +} + + +MOD_UNLOAD() +{ + return MOD_SUCCESS; +} + +int tls_cipher_handshake(Client *client) +{ + if (client->local->ssl) + { + const char *cipher = tls_get_cipher(client); + + if (!cipher) + return 0; + + moddata_client_set(client, "tls_cipher", cipher); + } + return 0; +} + +void tls_cipher_free(ModData *m) +{ + safe_free(m->str); +} + +const char *tls_cipher_serialize(ModData *m) +{ + if (!m->str) + return NULL; + return m->str; +} + +void tls_cipher_unserialize(const char *str, ModData *m) +{ + safe_strdup(m->str, str); +} diff --git a/src/modules/topic.c b/src/modules/topic.c index 309de5d..a6ee5bb 100644 --- a/src/modules/topic.c +++ b/src/modules/topic.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", "command /topic", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -52,17 +52,13 @@ MOD_UNLOAD() return MOD_SUCCESS; } -void topicoverride(Client *client, Channel *channel, char *topic) +void topic_operoverride_msg(Client *client, Channel *channel, const char *topic) { - sendto_snomask(SNO_EYES, - "*** OperOverride -- %s (%s@%s) TOPIC %s \'%s\'", - client->name, client->user->username, client->user->realhost, - channel->chname, topic); - - /* Logging implementation added by XeRXeS */ - ircd_log(LOG_OVERRIDE, "OVERRIDE: %s (%s@%s) TOPIC %s \'%s\'", - client->name, client->user->username, client->user->realhost, - channel->chname, topic); + unreal_log(ULOG_INFO, "operoverride", "OPEROVERRIDE_TOPIC", client, + "OperOverride: $client.details changed the topic of $channel to '$topic'", + log_data_string("override_type", "topic"), + log_data_string("topic", topic), + log_data_channel("channel", channel)); } /** Query or change the channel topic. @@ -80,13 +76,12 @@ void topicoverride(Client *client, Channel *channel, char *topic) CMD_FUNC(cmd_topic) { Channel *channel = NULL; - char *topic = NULL, *name, *tnick = client->name; - char *errmsg = NULL; + const char *topic = NULL; + const char *name, *tnick = client->name; + const char *errmsg = NULL; time_t ttime = 0; int i = 0; Hook *h; - int ismember; /* cache: IsMember() */ - long flags = 0; /* cache: membership flags */ MessageTag *mtags = NULL; if ((parc < 2) || BadPtr(parv[1])) @@ -97,20 +92,16 @@ CMD_FUNC(cmd_topic) name = parv[1]; - channel = find_channel(parv[1], NULL); + channel = find_channel(parv[1]); if (!channel) { sendnumeric(client, ERR_NOSUCHCHANNEL, name); return; } - ismember = IsMember(client, channel); /* CACHE */ - if (ismember) - flags = get_access(client, channel); /* CACHE */ - if (parc > 2 || SecretChannel(channel)) { - if (!ismember && !IsServer(client) + if (!IsMember(client, channel) && !IsServer(client) && !ValidatePermissionsForPath("channel:see:list:secret",client,NULL,channel,NULL) && !IsULine(client)) { sendnumeric(client, ERR_NOTONCHANNEL, name); @@ -140,7 +131,7 @@ CMD_FUNC(cmd_topic) } /* If you're not a member, and you can't view outside channel, deny */ - if ((!ismember && i == HOOK_DENY) || + if ((!IsMember(client, channel) && i == HOOK_DENY) || (is_banned(client,channel,BANCHK_JOIN,NULL,NULL) && !ValidatePermissionsForPath("channel:see:topic",client,NULL,channel,NULL))) { @@ -149,13 +140,12 @@ CMD_FUNC(cmd_topic) } if (!channel->topic) - sendnumeric(client, RPL_NOTOPIC, channel->chname); + sendnumeric(client, RPL_NOTOPIC, channel->name); else { - sendnumeric(client, RPL_TOPIC, - channel->chname, channel->topic); - sendnumeric(client, RPL_TOPICWHOTIME, channel->chname, - channel->topic_nick, channel->topic_time); + sendnumeric(client, RPL_TOPIC, channel->name, channel->topic); + sendnumeric(client, RPL_TOPICWHOTIME, channel->name, + channel->topic_nick, (long long)channel->topic_time); } return; } @@ -173,13 +163,13 @@ CMD_FUNC(cmd_topic) channel->topic_time = ttime; new_message(client, recv_mtags, &mtags); - RunHook4(HOOKTYPE_TOPIC, client, channel, mtags, topic); + RunHook(HOOKTYPE_TOPIC, client, channel, mtags, topic); sendto_server(client, 0, 0, mtags, ":%s TOPIC %s %s %lld :%s", - client->id, channel->chname, channel->topic_nick, + client->id, channel->name, channel->topic_nick, (long long)channel->topic_time, channel->topic); sendto_channel(channel, client, NULL, 0, 0, SEND_LOCAL, mtags, ":%s TOPIC %s :%s", - client->name, channel->chname, channel->topic); + client->name, channel->name, channel->topic); free_message_tags(mtags); } return; @@ -188,53 +178,67 @@ CMD_FUNC(cmd_topic) /* Topic change. Either locally (check permissions!) or remote, check permissions: */ if (IsUser(client)) { - char *newtopic = NULL; + const char *newtopic = NULL; + const char *errmsg = NULL; + int ret = EX_ALLOW; + int operoverride = 0; - /* +t and not +hoaq ? */ - if ((channel->mode.mode & MODE_TOPICLIMIT) && - !is_skochanop(client, channel) && !IsULine(client) && !IsServer(client)) + for (h = Hooks[HOOKTYPE_CAN_SET_TOPIC]; h; h = h->next) + { + int n = (*(h->func.intfunc))(client, channel, topic, &errmsg); + + if (n == EX_DENY) + { + ret = n; + } else + if (n == EX_ALWAYS_DENY) + { + ret = n; + break; + } + } + + if (ret == EX_ALWAYS_DENY) + { + if (MyUser(client) && errmsg) + sendto_one(client, NULL, "%s", errmsg); /* send error, if any */ + + if (MyUser(client)) + return; /* reject the topic set (note: we never block remote sets) */ + } + + if (ret == EX_DENY) { if (MyUser(client) && !ValidatePermissionsForPath("channel:override:topic", client, NULL, channel, NULL)) { - sendnumeric(client, ERR_CHANOPRIVSNEEDED, channel->chname); - return; + if (errmsg) + sendto_one(client, NULL, "%s", errmsg); + return; /* reject */ + } else { + operoverride = 1; /* allow */ } - topicoverride(client, channel, topic); } - /* -t and banned? */ + /* banned? */ newtopic = topic; - if (!(channel->mode.mode & MODE_TOPICLIMIT) && - !is_skochanop(client, channel) && is_banned(client, channel, BANCHK_MSG, &newtopic, &errmsg)) + if (!check_channel_access(client, channel, "hoaq") && is_banned(client, channel, BANCHK_MSG, &newtopic, &errmsg)) { char buf[512]; if (MyUser(client) && !ValidatePermissionsForPath("channel:override:topic", client, NULL, channel, NULL)) { - ircsnprintf(buf, sizeof(buf), "You cannot change the topic on %s while being banned", channel->chname); + ircsnprintf(buf, sizeof(buf), "You cannot change the topic on %s while being banned", channel->name); sendnumeric(client, ERR_CANNOTDOCOMMAND, "TOPIC", buf); return; } - topicoverride(client, channel, topic); + operoverride = 1; } + if (MyUser(client) && newtopic) topic = newtopic; /* process is_banned() changes of topic (eg: text replacement), but only for local clients */ - /* -t, +m, and not +vhoaq */ - if (((flags&CHFL_OVERLAP) == 0) && (channel->mode.mode & MODE_MODERATED)) - { - char buf[512]; - - if (MyUser(client) && ValidatePermissionsForPath("channel:override:topic", client, NULL, channel, NULL)) - { - topicoverride(client, channel, topic); - } else { - /* With +m and -t, only voice and higher may change the topic */ - ircsnprintf(buf, sizeof(buf), "Voice (+v) or higher is required in order to change the topic on %s (channel is +m)", channel->chname); - sendnumeric(client, ERR_CANNOTDOCOMMAND, "TOPIC", buf); - return; - } - } + if (operoverride) + topic_operoverride_msg(client, channel, topic); /* For local users, run spamfilters and hooks.. */ if (MyUser(client)) @@ -242,11 +246,11 @@ CMD_FUNC(cmd_topic) Hook *tmphook; int n; - if (match_spamfilter(client, topic, SPAMF_TOPIC, "TOPIC", channel->chname, 0, NULL)) + if (match_spamfilter(client, topic, SPAMF_TOPIC, "TOPIC", channel->name, 0, NULL)) return; for (tmphook = Hooks[HOOKTYPE_PRE_LOCAL_TOPIC]; tmphook; tmphook = tmphook->next) { - topic = (*(tmphook->func.pcharfunc))(client, channel, topic); + topic = (*(tmphook->func.stringfunc))(client, channel, topic); if (!topic) return; } @@ -270,12 +274,12 @@ CMD_FUNC(cmd_topic) channel->topic_time = TStime(); new_message(client, recv_mtags, &mtags); - RunHook4(HOOKTYPE_TOPIC, client, channel, mtags, topic); + RunHook(HOOKTYPE_TOPIC, client, channel, mtags, topic); sendto_server(client, 0, 0, mtags, ":%s TOPIC %s %s %lld :%s", - client->id, channel->chname, channel->topic_nick, + client->id, channel->name, channel->topic_nick, (long long)channel->topic_time, channel->topic); sendto_channel(channel, client, NULL, 0, 0, SEND_LOCAL, mtags, ":%s TOPIC %s :%s", - client->name, channel->chname, channel->topic); + client->name, channel->name, channel->topic); free_message_tags(mtags); } diff --git a/src/modules/trace.c b/src/modules/trace.c index 8d88d11..1df322a 100644 --- a/src/modules/trace.c +++ b/src/modules/trace.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", "command /trace", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -61,7 +61,7 @@ CMD_FUNC(cmd_trace) int i; Client *acptr; ConfigItem_class *cltmp; - char *tname; + const char *tname; int doall, link_s[MAXCONNECTIONS], link_u[MAXCONNECTIONS]; int cnt = 0, wilds, dow; time_t now; @@ -73,7 +73,7 @@ CMD_FUNC(cmd_trace) labeled_response_inhibit = 1; if (parc > 2) - if (hunt_server(client, NULL, ":%s TRACE %s :%s", 2, parc, parv)) + if (hunt_server(client, NULL, "TRACE", 2, parc, parv)) return; if (parc > 1) @@ -98,7 +98,7 @@ CMD_FUNC(cmd_trace) } } - switch (hunt_server(client, NULL, ":%s TRACE :%s", 1, parc, parv)) + switch (hunt_server(client, NULL, "TRACE", 1, parc, parv)) { case HUNTED_PASS: /* note: gets here only if parv[1] exists */ { @@ -140,8 +140,8 @@ CMD_FUNC(cmd_trace) now = TStime(); list_for_each_entry(acptr, &lclient_list, lclient_node) { - char *name; - char *class; + const char *name; + const char *class; if (!ValidatePermissionsForPath("client:see:trace:invisible-users",client,acptr,NULL,NULL) && (acptr != client)) continue; @@ -182,21 +182,21 @@ CMD_FUNC(cmd_trace) sendnumeric(client, RPL_TRACEOPERATOR, class, acptr->name, GetHost(acptr), - now - acptr->local->lasttime); + (long long)(now - acptr->local->last_msg_received)); else sendnumeric(client, RPL_TRACEUSER, class, acptr->name, acptr->user->realhost, - now - acptr->local->lasttime); + (long long)(now - acptr->local->last_msg_received)); cnt++; } break; case CLIENT_STATUS_SERVER: sendnumeric(client, RPL_TRACESERVER, class, acptr->local->fd >= 0 ? link_s[acptr->local->fd] : -1, - acptr->local->fd >= 0 ? link_u[acptr->local->fd] : -1, name, *(acptr->serv->by) ? - acptr->serv->by : "*", "*", me.name, - now - acptr->local->lasttime); + acptr->local->fd >= 0 ? link_u[acptr->local->fd] : -1, name, *(acptr->server->by) ? + acptr->server->by : "*", "*", me.name, + (long long)(now - acptr->local->last_msg_received)); cnt++; break; diff --git a/src/modules/tsctl.c b/src/modules/tsctl.c index aa8d9e8..39aebf6 100644 --- a/src/modules/tsctl.c +++ b/src/modules/tsctl.c @@ -26,7 +26,7 @@ ModuleHeader MOD_HEADER "5.0", /* Version */ "command /tsctl", /* Short description of module */ "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; CMD_FUNC(cmd_tsctl); @@ -64,8 +64,10 @@ CMD_FUNC(cmd_tsctl) if (parv[1] && !strcasecmp(parv[1], "alltime")) { - sendnotice(client, "*** Server=%s TStime=%lld", - me.name, (long long)TStime()); + struct timeval currenttime_tv; + gettimeofday(¤ttime_tv, NULL); + sendnotice(client, "*** Server=%s TStime=%lld.%ld", + me.name, (long long)currenttime_tv.tv_sec, (long)currenttime_tv.tv_usec); sendto_server(client, 0, 0, NULL, ":%s TSCTL alltime", client->id); return; } diff --git a/src/modules/typing-indicator.c b/src/modules/typing-indicator.c index 1bc61d0..76f0320 100644 --- a/src/modules/typing-indicator.c +++ b/src/modules/typing-indicator.c @@ -28,11 +28,11 @@ ModuleHeader MOD_HEADER "5.0", "+typing client tag", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; -int ti_mtag_is_ok(Client *client, char *name, char *value); -void mtag_add_ti(Client *client, MessageTag *recv_mtags, MessageTag **mtag_list, char *signature); +int ti_mtag_is_ok(Client *client, const char *name, const char *value); +void mtag_add_ti(Client *client, MessageTag *recv_mtags, MessageTag **mtag_list, const char *signature); MOD_INIT() { @@ -69,7 +69,7 @@ MOD_UNLOAD() /** This function verifies if the client sending the mtag is permitted to do so. */ -int ti_mtag_is_ok(Client *client, char *name, char *value) +int ti_mtag_is_ok(Client *client, const char *name, const char *value) { /* Require a non-empty parameter */ if (BadPtr(value)) @@ -83,7 +83,7 @@ int ti_mtag_is_ok(Client *client, char *name, char *value) return 0; } -void mtag_add_ti(Client *client, MessageTag *recv_mtags, MessageTag **mtag_list, char *signature) +void mtag_add_ti(Client *client, MessageTag *recv_mtags, MessageTag **mtag_list, const char *signature) { MessageTag *m; diff --git a/src/modules/umode2.c b/src/modules/umode2.c index 8deb930..ce38b34 100644 --- a/src/modules/umode2.c +++ b/src/modules/umode2.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", "command /umode2", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -60,7 +60,7 @@ MOD_UNLOAD() CMD_FUNC(cmd_umode2) { - char *xparv[5] = { + const char *xparv[5] = { client->name, client->name, parv[1], diff --git a/src/modules/unreal_server_compat.c b/src/modules/unreal_server_compat.c new file mode 100644 index 0000000..b768761 --- /dev/null +++ b/src/modules/unreal_server_compat.c @@ -0,0 +1,319 @@ +/* + * unreal_server_compat - Compatibility with pre-U6 servers + * (C) Copyright 2016-2021 Bram Matthys (Syzop) + * License: GPLv2 + * + * Currently the only purpose of this module is to rewrite MODE + * and SJOIN lines to older servers so any bans/exempts/invex + * will show up with their single letter syntax, + * eg "MODE #test +b ~account:someacc" will be rewritten + * as "MODE #test +b ~a:someacc". + * It uses rather complex mode reparsing techniques to + * achieve this, but this was deemed to be the only way + * that we could achieve this in a doable way. + * The alternative was complicating the mode.c code with + * creating multiple strings for multiple clients, and + * doing the same in any other MODE change routine. + * That would have caused rather intrussive compatibility + * code, so I don't want that. + * With this we can just rip out the module at some point + * that we no longer want to support pre-U6 protocol. + * For SJOIN we do something similar, though in that case + * it would have been quite doable to handle it in there. + * Just figured I would stuff it in here as well, since + * it is basically the same case. + * -- Syzop + */ + +#include "unrealircd.h" + +ModuleHeader MOD_HEADER + = { + "unreal_server_compat", + "1.0.0", + "Provides compatibility with non-U6 servers", + "Bram Matthys (Syzop)", + "unrealircd-6" + }; + +/* Forward declarations */ +int usc_packet(Client *from, Client *to, Client *intended_to, char **msg, int *length); +int usc_reparse_mode(char **msg, char *p, int *length); +int usc_reparse_sjoin(char **msg, char *p, int *length); +void skip_spaces(char **p); +void read_until_space(char **p); +int eat_parameter(char **p); + +MOD_INIT() +{ + MARK_AS_OFFICIAL_MODULE(modinfo); + HookAdd(modinfo->handle, HOOKTYPE_PACKET, 0, usc_packet); + return MOD_SUCCESS; +} + +MOD_LOAD() +{ + return MOD_SUCCESS; +} + + +MOD_UNLOAD() +{ + return MOD_SUCCESS; +} + +int usc_packet(Client *from, Client *to, Client *intended_to, char **msg, int *length) +{ + char *p, *buf = *msg; + + /* We are only interested in outgoing servers + * that do not support PROTOCTL NEXTBANS + */ + if (IsMe(to) || !IsServer(to) || SupportNEXTBANS(to) || !buf || !length || !*length) + return 0; + + buf[*length] = '\0'; /* safety */ + + p = *msg; + + skip_spaces(&p); + /* Skip over message tags */ + if (*p == '@') + { + read_until_space(&p); + if (*p == '\0') + return 0; /* unexpected ending */ + p++; + } + + skip_spaces(&p); + if (*p == '\0') + return 0; + + /* Skip origin */ + if (*p == ':') + { + read_until_space(&p); + if (*p == '\0') + return 0; /* unexpected ending */ + } + + skip_spaces(&p); + if (*p == '\0') + return 0; + + if (!strncmp(p, "MODE ", 5)) /* MODE #channel */ + { + if (!eat_parameter(&p)) + return 0; + /* p now points to #channel */ + + /* Now it gets interesting... we have to re-parse and re-write the entire MODE line. */ + return usc_reparse_mode(msg, p, length); + } + + if (!strncmp(p, "SJOIN ", 6)) /* SJOIN timestamp #channel */ + { + if (!eat_parameter(&p) || !eat_parameter(&p)) + return 0; + /* p now points to #channel */ + + /* Now it gets interesting... we have to re-parse and re-write the entire SJOIN line. */ + return usc_reparse_sjoin(msg, p, length); + } + + return 0; +} + +int usc_reparse_mode(char **msg, char *p, int *length) +{ + static char obuf[8192]; + char modebuf[512], *mode_buf_p, *para_buf_p; + char *channel_name; + int i; + int n; + ParseMode pm; + int modes_processed = 0; + + channel_name = p; + if (!eat_parameter(&p)) + return 0; + + mode_buf_p = p; + if (!eat_parameter(&p)) + return 0; + strlncpy(modebuf, mode_buf_p, sizeof(modebuf), p - mode_buf_p); + + /* If we get here then it is (for example) a + * MODE #channel +b nick!user@host + * So, has at least one parameter (nick!user@host in the example). + * p now points exactly to the 'n' from nick!user@host. + * + * Now, what we will do: + * everything BEFORE p is the 'header' that we will + * send exactly as-is. + * The only thing we may (potentially) change is + * everything AFTER p! + */ + + /* Fill 'obuf' with that 'header' */ + strlncpy(obuf, *msg, sizeof(obuf), p - *msg); + para_buf_p = p; + + /* Now parse the modes */ + for (n = parse_chanmode(&pm, modebuf, para_buf_p); n; n = parse_chanmode(&pm, NULL, NULL)) + { + /* We only rewrite the parameters, so don't care about paramless modes.. */ + if (!pm.param) + continue; + + if ((pm.modechar == 'b') || (pm.modechar == 'e') || (pm.modechar == 'I')) + { + const char *result = clean_ban_mask(pm.param, pm.what, &me, 1); + strlcat(obuf, result?result:"", sizeof(obuf)); + strlcat(obuf, " ", sizeof(obuf)); + } else + { + /* as-is */ + strlcat(obuf, pm.param, sizeof(obuf)); + strlcat(obuf, " ", sizeof(obuf)); + } + modes_processed++; + } + + /* Send line as-is */ + if (modes_processed == 0) + return 0; + + /* Strip final whitespace */ + if (obuf[strlen(obuf)-1] == ' ') + obuf[strlen(obuf)-1] = '\0'; + + if (pm.parabuf && *pm.parabuf) + { + strlcat(obuf, " ", sizeof(obuf)); + strlcat(obuf, pm.parabuf, sizeof(obuf)); + } + + /* Add CRLF */ + if (obuf[strlen(obuf)-1] != '\n') + strlcat(obuf, "\r\n", sizeof(obuf)); + + /* Line modified, use it! */ + *msg = obuf; + *length = strlen(obuf); + + return 0; +} + +int usc_reparse_sjoin(char **msg, char *p, int *length) +{ + static char obuf[8192]; + char parabuf[512]; + char *save = NULL; + char *s; + + /* Skip right to the last parameter, the only one we care about */ + p = strstr(p, " :"); + if (!p) + return 0; + p += 2; + + /* Save everything before p, put it in obuf... */ + + /* Fill 'obuf' with that 'header' */ + strlncpy(obuf, *msg, sizeof(obuf), p - *msg); + + /* Put parameters in parabuf so we can trash it :D */ + strlcpy(parabuf, p, sizeof(parabuf)); + + /* Now parse the SJOIN */ + for (s = strtoken(&save, parabuf, " "); s; s = strtoken(&save, NULL, " ")) + { + if (*s == '<') + { + /* SJSBY */ + char *next = strchr(s, '>'); + const char *result; + if (!next) + { + unreal_log(ULOG_WARNING, "unreal_server_compat", "USC_REPARSE_SJOIN_FAILURE", NULL, + "[unreal_server_compat] usc_reparse_sjoin(): sjoin data '$ban' seemed like a SJSBY but was not??", + log_data_string("ban", s)); + continue; + } + if (!strchr("&\"\\", next[1])) + goto fallback_usc_reparse_sjoin; + *next++ = '\0'; + result = clean_ban_mask(next+1, MODE_ADD, &me, 1); + if (!result) + { + unreal_log(ULOG_WARNING, "unreal_server_compat", "USC_REPARSE_SJOIN_FAILURE", NULL, + "[unreal_server_compat] usc_reparse_sjoin(): ban '$ban' could not be converted", + log_data_string("ban", s+1)); + continue; + } + strlcat(obuf, s, sizeof(obuf)); /* "<123,nick" */ + strlcat(obuf, ">", sizeof(obuf)); /* > */ + strlncat(obuf, next, sizeof(obuf), 1); /* & or \" or \\ */ + strlcat(obuf, result, sizeof(obuf)); /* the converted result */ + strlcat(obuf, " ", sizeof(obuf)); + } else + if (strchr("&\"\\", *s)) + { + /* +b / +e / +I */ + const char *result = clean_ban_mask(s+1, MODE_ADD, &me, 1); + if (!result) + { + unreal_log(ULOG_WARNING, "unreal_server_compat", "USC_REPARSE_SJOIN_FAILURE", NULL, + "[unreal_server_compat] usc_reparse_sjoin(): ban '$ban' could not be converted", + log_data_string("ban", s+1)); + continue; + } + strlncat(obuf, s, sizeof(obuf), 1); + strlcat(obuf, result, sizeof(obuf)); + strlcat(obuf, " ", sizeof(obuf)); + } else { +fallback_usc_reparse_sjoin: + strlcat(obuf, s, sizeof(obuf)); + strlcat(obuf, " ", sizeof(obuf)); + } + } + + /* Strip final whitespace */ + if (obuf[strlen(obuf)-1] == ' ') + obuf[strlen(obuf)-1] = '\0'; + + /* Add CRLF */ + if (obuf[strlen(obuf)-1] != '\n') + strlcat(obuf, "\r\n", sizeof(obuf)); + + /* And use it! */ + *msg = obuf; + *length = strlen(obuf); + + return 0; +} + +/** Skip space(s), if any. */ +void skip_spaces(char **p) +{ + for (; **p == ' '; *p = *p + 1); +} + +/** Keep reading until we hit space. */ +void read_until_space(char **p) +{ + for (; **p && (**p != ' '); *p = *p + 1); +} + +int eat_parameter(char **p) +{ + read_until_space(p); + if (**p == '\0') + return 0; /* was just a "MODE #channel" query - wait.. that's weird we are a server sending this :D */ + skip_spaces(p); + if (**p == '\0') + return 0; // impossible + return 1; +} diff --git a/src/modules/unsqline.c b/src/modules/unsqline.c index 1c07c6a..e1fc614 100644 --- a/src/modules/unsqline.c +++ b/src/modules/unsqline.c @@ -30,7 +30,7 @@ ModuleHeader MOD_HEADER "5.0", /* Version */ "command /unsqline", /* Short description of module */ "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* This is called on module init, before Server Ready */ @@ -58,13 +58,13 @@ MOD_UNLOAD() */ CMD_FUNC(cmd_unsqline) { - char *tkllayer[6] = { + const char *tkllayer[6] = { me.name, /*0 server.name */ "-", /*1 - */ "Q", /*2 Q */ "*", /*3 unused */ parv[1], /*4 host */ - client->name /*5 whoremoved */ + client->name /*5 whoremoved */ }; if (parc < 2) diff --git a/src/modules/user.c b/src/modules/user.c index ccc3980..31b8c66 100644 --- a/src/modules/user.c +++ b/src/modules/user.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", "command /user", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -65,8 +65,9 @@ MOD_UNLOAD() */ CMD_FUNC(cmd_user) { - char *username; - char *realname; + const char *username; + const char *realname; + char *p; if (!MyConnect(client) || IsServer(client)) return; @@ -83,23 +84,20 @@ CMD_FUNC(cmd_user) return; } - /* This cuts the username off at @, uh okay.. */ - if ((username = strchr(parv[1], '@'))) - *username = '\0'; - username = parv[1]; realname = parv[4]; - if (strlen(username) > USERLEN) - username[USERLEN] = '\0'; /* cut-off */ - make_user(client); /* set::modes-on-connect */ client->umodes |= CONN_MODES; client->user->server = me_hash; strlcpy(client->info, realname, sizeof(client->info)); - strlcpy(client->user->username, username, USERLEN + 1); + strlcpy(client->user->username, username, sizeof(client->user->username)); + + /* This cuts the username off at @, uh okay.. */ + if ((p = strchr(client->user->username, '@'))) + *p = '\0'; if (*client->name && is_handshake_finished(client)) { @@ -109,7 +107,7 @@ CMD_FUNC(cmd_user) sendto_one(client, NULL, ":IRC!IRC@%s PRIVMSG %s :\1VERSION\1", me.name, client->name); } - register_user(client, client->name, username, NULL, NULL, NULL); + register_user(client); return; } } diff --git a/src/modules/userhost-tag.c b/src/modules/userhost-tag.c index 864775c..26a84a6 100644 --- a/src/modules/userhost-tag.c +++ b/src/modules/userhost-tag.c @@ -28,15 +28,15 @@ ModuleHeader MOD_HEADER "5.0", "userhost message tag", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Variables */ long CAP_ACCOUNT_TAG = 0L; -int userhost_mtag_is_ok(Client *client, char *name, char *value); -int userhost_mtag_can_send(Client *target); -void mtag_add_userhost(Client *client, MessageTag *recv_mtags, MessageTag **mtag_list, char *signature); +int userhost_mtag_is_ok(Client *client, const char *name, const char *value); +int userhost_mtag_should_send_to_client(Client *target); +void mtag_add_userhost(Client *client, MessageTag *recv_mtags, MessageTag **mtag_list, const char *signature); MOD_INIT() { @@ -47,7 +47,7 @@ MOD_INIT() memset(&mtag, 0, sizeof(mtag)); mtag.name = "unrealircd.org/userhost"; mtag.is_ok = userhost_mtag_is_ok; - mtag.can_send = userhost_mtag_can_send; + mtag.should_send_to_client = userhost_mtag_should_send_to_client; mtag.flags = MTAG_HANDLER_FLAGS_NO_CAP_NEEDED; MessageTagHandlerAdd(modinfo->handle, &mtag); @@ -71,7 +71,7 @@ MOD_UNLOAD() * syntax. * We simply allow userhost-tag ONLY from servers and with any syntax. */ -int userhost_mtag_is_ok(Client *client, char *name, char *value) +int userhost_mtag_is_ok(Client *client, const char *name, const char *value) { if (IsServer(client)) return 1; @@ -79,7 +79,7 @@ int userhost_mtag_is_ok(Client *client, char *name, char *value) return 0; } -void mtag_add_userhost(Client *client, MessageTag *recv_mtags, MessageTag **mtag_list, char *signature) +void mtag_add_userhost(Client *client, MessageTag *recv_mtags, MessageTag **mtag_list, const char *signature) { MessageTag *m; @@ -103,7 +103,7 @@ void mtag_add_userhost(Client *client, MessageTag *recv_mtags, MessageTag **mtag } /** Outgoing filter for this message tag */ -int userhost_mtag_can_send(Client *target) +int userhost_mtag_should_send_to_client(Client *target) { if (IsServer(target) || IsOper(target)) return 1; diff --git a/src/modules/userhost.c b/src/modules/userhost.c index 4352c5d..05d4399 100644 --- a/src/modules/userhost.c +++ b/src/modules/userhost.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", "command /userhost", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -65,6 +65,7 @@ CMD_FUNC(cmd_userhost) char *p; /* scratch end pointer */ char *cn; /* current name */ Client *acptr; + char request[BUFSIZE]; char response[MAXUSERHOSTREPLIES][NICKLEN * 2 + CHANNELLEN + USERLEN + HOSTLEN + 30]; int i; /* loop counter */ int w; @@ -83,14 +84,15 @@ CMD_FUNC(cmd_userhost) */ response[0][0] = response[1][0] = response[2][0] = response[3][0] = response[4][0] = '\0'; - cn = parv[1]; + strlcpy(request, parv[1], sizeof(request)); + cn = request; for (w = 0, i = 0; (i < MAXUSERHOSTREPLIES) && cn; i++) { if ((p = strchr(cn, ' '))) *p = '\0'; - if ((acptr = find_person(cn, NULL))) + if ((acptr = find_user(cn, NULL))) { ircsnprintf(response[w], NICKLEN * 2 + CHANNELLEN + USERLEN + HOSTLEN + 30, "%s%s=%c%s@%s", diff --git a/src/modules/userip-tag.c b/src/modules/userip-tag.c index cb7d20a..3fba6b9 100644 --- a/src/modules/userip-tag.c +++ b/src/modules/userip-tag.c @@ -28,15 +28,15 @@ ModuleHeader MOD_HEADER "5.0", "userip message tag", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Variables */ long CAP_ACCOUNT_TAG = 0L; -int userip_mtag_is_ok(Client *client, char *name, char *value); -int userip_mtag_can_send(Client *target); -void mtag_add_userip(Client *client, MessageTag *recv_mtags, MessageTag **mtag_list, char *signature); +int userip_mtag_is_ok(Client *client, const char *name, const char *value); +int userip_mtag_should_send_to_client(Client *target); +void mtag_add_userip(Client *client, MessageTag *recv_mtags, MessageTag **mtag_list, const char *signature); MOD_INIT() { @@ -47,7 +47,7 @@ MOD_INIT() memset(&mtag, 0, sizeof(mtag)); mtag.name = "unrealircd.org/userip"; mtag.is_ok = userip_mtag_is_ok; - mtag.can_send = userip_mtag_can_send; + mtag.should_send_to_client = userip_mtag_should_send_to_client; mtag.flags = MTAG_HANDLER_FLAGS_NO_CAP_NEEDED; MessageTagHandlerAdd(modinfo->handle, &mtag); @@ -71,7 +71,7 @@ MOD_UNLOAD() * syntax. * We simply allow userip-tag ONLY from servers and with any syntax. */ -int userip_mtag_is_ok(Client *client, char *name, char *value) +int userip_mtag_is_ok(Client *client, const char *name, const char *value) { if (IsServer(client)) return 1; @@ -79,7 +79,7 @@ int userip_mtag_is_ok(Client *client, char *name, char *value) return 0; } -void mtag_add_userip(Client *client, MessageTag *recv_mtags, MessageTag **mtag_list, char *signature) +void mtag_add_userip(Client *client, MessageTag *recv_mtags, MessageTag **mtag_list, const char *signature) { MessageTag *m; @@ -103,7 +103,7 @@ void mtag_add_userip(Client *client, MessageTag *recv_mtags, MessageTag **mtag_l } /** Outgoing filter for this message tag */ -int userip_mtag_can_send(Client *target) +int userip_mtag_should_send_to_client(Client *target) { if (IsServer(target) || IsOper(target)) return 1; diff --git a/src/modules/userip.c b/src/modules/userip.c index 7802184..5ca5af6 100644 --- a/src/modules/userip.c +++ b/src/modules/userip.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", "command /userip", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -69,6 +69,7 @@ CMD_FUNC(cmd_userip) char *cn; /* current name */ char *ip, ipbuf[HOSTLEN+1]; Client *acptr; + char request[BUFSIZE]; char response[MAXUSERHOSTREPLIES][NICKLEN * 2 + CHANNELLEN + USERLEN + HOSTLEN + 30]; int i; /* loop counter */ int w; @@ -88,17 +89,17 @@ CMD_FUNC(cmd_userip) * and our ircsnprintf() truncates it to fit anyway. There is * no danger of an overflow here. -Dianora */ - response[0][0] = response[1][0] = response[2][0] = - response[3][0] = response[4][0] = '\0'; + response[0][0] = response[1][0] = response[2][0] = response[3][0] = response[4][0] = '\0'; - cn = parv[1]; + strlcpy(request, parv[1], sizeof(request)); + cn = request; for (w = 0, i = 0; (i < MAXUSERHOSTREPLIES) && cn; i++) { if ((p = strchr(cn, ' '))) *p = '\0'; - if ((acptr = find_person(cn, NULL))) + if ((acptr = find_user(cn, NULL))) { if (!(ip = GetIP(acptr))) ip = ""; diff --git a/src/modules/usermodes/Makefile.in b/src/modules/usermodes/Makefile.in index 68c7dae..d940141 100644 --- a/src/modules/usermodes/Makefile.in +++ b/src/modules/usermodes/Makefile.in @@ -25,20 +25,23 @@ INCLUDES = ../../include/channel.h \ ../../include/ircsprintf.h \ ../../include/license.h \ ../../include/modules.h ../../include/modversion.h ../../include/msg.h \ - ../../include/numeric.h ../../include/proto.h ../../include/dns.h \ + ../../include/numeric.h ../../include/dns.h \ ../../include/resource.h ../../include/setup.h \ ../../include/struct.h ../../include/sys.h \ - ../../include/types.h ../../include/url.h \ + ../../include/types.h \ ../../include/version.h ../../include/whowas.h R_MODULES=\ noctcp.so censor.so bot.so showwhois.so nokick.so servicebot.so \ - privacy.so regonlymsg.so secureonlymsg.so privdeaf.so + privacy.so regonlymsg.so secureonlymsg.so privdeaf.so wallops.so MODULES=$(R_MODULES) MODULEFLAGS=@MODULEFLAGS@ RM=@RM@ +.SUFFIXES: +.SUFFIXES: .c .h .so + all: build build: $(MODULES) @@ -46,46 +49,6 @@ build: $(MODULES) clean: $(RM) -f *.o *.so *~ core -############################################################################# -# .so's section -############################################################################# - -noctcp.so: noctcp.c $(INCLUDES) +%.so: %.c $(INCLUDES) $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o noctcp.so noctcp.c - -censor.so: censor.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o censor.so censor.c - -bot.so: bot.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o bot.so bot.c - -showwhois.so: showwhois.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o showwhois.so showwhois.c - -nokick.so: nokick.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o nokick.so nokick.c - -servicebot.so: servicebot.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o servicebot.so servicebot.c - -privacy.so: privacy.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o privacy.so privacy.c - -regonlymsg.so: regonlymsg.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o regonlymsg.so regonlymsg.c - -secureonlymsg.so: secureonlymsg.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o secureonlymsg.so secureonlymsg.c - -privdeaf.so: privdeaf.c $(INCLUDES) - $(CC) $(CFLAGS) $(MODULEFLAGS) -DDYNAMIC_LINKING \ - -o privdeaf.so privdeaf.c + -o $@ $< diff --git a/src/modules/usermodes/bot.c b/src/modules/usermodes/bot.c index 01a08e3..a15f90f 100644 --- a/src/modules/usermodes/bot.c +++ b/src/modules/usermodes/bot.c @@ -28,15 +28,15 @@ ModuleHeader MOD_HEADER "4.2", "User Mode +B", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Global variables */ long UMODE_BOT = 0L; /* Forward declarations */ -int bot_whois(Client *client, Client *acptr); -int bot_who_status(Client *client, Client *acptr, Channel *channel, Member *cm, char *status, int cansee); +int bot_whois(Client *client, Client *acptr, NameValuePrioList **list); +int bot_who_status(Client *client, Client *acptr, Channel *channel, Member *cm, const char *status, int cansee); int bot_umode_change(Client *client, long oldmode, long newmode); MOD_TEST() @@ -67,17 +67,24 @@ MOD_UNLOAD() return MOD_SUCCESS; } -int bot_whois(Client *requester, Client *acptr) +int bot_whois(Client *client, Client *target, NameValuePrioList **list) { - if (IsBot(acptr)) - sendnumeric(requester, RPL_WHOISBOT, acptr->name, ircnetwork); + char buf[512]; + + if (!IsBot(target)) + return 0; + + if (whois_get_policy(client, target, "bot") == WHOIS_CONFIG_DETAILS_NONE) + return 0; + + add_nvplist_numeric(list, 0, "bot", client, RPL_WHOISBOT, target->name, NETWORK_NAME); return 0; } -int bot_who_status(Client *requester, Client *acptr, Channel *channel, Member *cm, char *status, int cansee) +int bot_who_status(Client *client, Client *target, Channel *channel, Member *cm, const char *status, int cansee) { - if (IsBot(acptr)) + if (IsBot(target)) return 'B'; return 0; @@ -88,7 +95,7 @@ int bot_umode_change(Client *client, long oldmode, long newmode) if ((newmode & UMODE_BOT) && !(oldmode & UMODE_BOT) && MyUser(client)) { /* now +B */ - char *parv[2]; + const char *parv[2]; parv[0] = client->name; parv[1] = NULL; do_cmd(client, NULL, "BOTMOTD", 1, parv); diff --git a/src/modules/usermodes/censor.c b/src/modules/usermodes/censor.c index b118501..fa8f291 100644 --- a/src/modules/usermodes/censor.c +++ b/src/modules/usermodes/censor.c @@ -12,7 +12,7 @@ ModuleHeader MOD_HEADER "4.2", "User Mode +G", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; @@ -20,7 +20,7 @@ long UMODE_CENSOR = 0L; #define IsCensored(x) (x->umodes & UMODE_CENSOR) -int censor_can_send_to_user(Client *client, Client *target, char **text, char **errmsg, SendType sendtype); +int censor_can_send_to_user(Client *client, Client *target, const char **text, const char **errmsg, SendType sendtype); int censor_config_test(ConfigFile *, ConfigEntry *, int, int *); int censor_config_run(ConfigFile *, ConfigEntry *, int); @@ -31,7 +31,7 @@ ConfigItem_badword *conf_badword_message = NULL; static ConfigItem_badword *copy_badword_struct(ConfigItem_badword *ca, int regex, int regflags); -int censor_stats_badwords_user(Client *client, char *para); +int censor_stats_badwords_user(Client *client, const char *para); MOD_TEST() { @@ -79,89 +79,89 @@ int censor_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) if (type != CONFIG_MAIN) return 0; - if (!ce || !ce->ce_varname || strcmp(ce->ce_varname, "badword")) + if (!ce || !ce->name || strcmp(ce->name, "badword")) return 0; /* not interested */ - if (!ce->ce_vardata) + if (!ce->value) { config_error("%s:%i: badword without type", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); return 1; } - else if (strcmp(ce->ce_vardata, "message") && strcmp(ce->ce_vardata, "all")) { + else if (strcmp(ce->value, "message") && strcmp(ce->value, "all")) { /* config_error("%s:%i: badword with unknown type", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); -- can't do that.. */ + ce->file->filename, ce->line_number); -- can't do that.. */ return 0; /* unhandled */ } - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { if (config_is_blankorempty(cep, "badword")) { errors++; continue; } - if (!strcmp(cep->ce_varname, "word")) + if (!strcmp(cep->name, "word")) { - char *errbuf; + const char *errbuf; if (has_word) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "badword::word"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "badword::word"); continue; } has_word = 1; - if ((errbuf = badword_config_check_regex(cep->ce_vardata,1,1))) + if ((errbuf = badword_config_check_regex(cep->value,1,1))) { config_error("%s:%i: badword::%s contains an invalid regex: %s", - cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, - cep->ce_varname, errbuf); + cep->file->filename, + cep->line_number, + cep->name, errbuf); errors++; } } - else if (!strcmp(cep->ce_varname, "replace")) + else if (!strcmp(cep->name, "replace")) { if (has_replace) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "badword::replace"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "badword::replace"); continue; } has_replace = 1; } - else if (!strcmp(cep->ce_varname, "action")) + else if (!strcmp(cep->name, "action")) { if (has_action) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "badword::action"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "badword::action"); continue; } has_action = 1; - if (!strcmp(cep->ce_vardata, "replace")) + if (!strcmp(cep->value, "replace")) action = 'r'; - else if (!strcmp(cep->ce_vardata, "block")) + else if (!strcmp(cep->value, "block")) action = 'b'; else { config_error("%s:%d: Unknown badword::action '%s'", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - cep->ce_vardata); + cep->file->filename, cep->line_number, + cep->value); errors++; } } else { - config_error_unknown(cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - "badword", cep->ce_varname); + config_error_unknown(cep->file->filename, cep->line_number, + "badword", cep->name); errors++; } } if (!has_word) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "badword::word"); errors++; } @@ -170,7 +170,7 @@ int censor_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) if (has_replace && action == 'b') { config_error("%s:%i: badword::action is block but badword::replace exists", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); errors++; } } @@ -188,41 +188,41 @@ int censor_config_run(ConfigFile *cf, ConfigEntry *ce, int type) if (type != CONFIG_MAIN) return 0; - if (!ce || !ce->ce_varname || strcmp(ce->ce_varname, "badword")) + if (!ce || !ce->name || strcmp(ce->name, "badword")) return 0; /* not interested */ - if (strcmp(ce->ce_vardata, "message") && strcmp(ce->ce_vardata, "all")) + if (strcmp(ce->value, "message") && strcmp(ce->value, "all")) return 0; /* not for us */ ca = safe_alloc(sizeof(ConfigItem_badword)); ca->action = BADWORD_REPLACE; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "action")) + if (!strcmp(cep->name, "action")) { - if (!strcmp(cep->ce_vardata, "block")) + if (!strcmp(cep->value, "block")) { ca->action = BADWORD_BLOCK; } } - else if (!strcmp(cep->ce_varname, "replace")) + else if (!strcmp(cep->name, "replace")) { - safe_strdup(ca->replace, cep->ce_vardata); + safe_strdup(ca->replace, cep->value); } - else if (!strcmp(cep->ce_varname, "word")) + else if (!strcmp(cep->name, "word")) { word = cep; } } - badword_config_process(ca, word->ce_vardata); + badword_config_process(ca, word->value); - if (!strcmp(ce->ce_vardata, "message")) + if (!strcmp(ce->value, "message")) { AddListItem(ca, conf_badword_message); } else - if (!strcmp(ce->ce_vardata, "all")) + if (!strcmp(ce->value, "all")) { AddListItem(ca, conf_badword_message); return 0; /* pretend we didn't see it, so other modules can handle 'all' as well */ @@ -231,12 +231,12 @@ int censor_config_run(ConfigFile *cf, ConfigEntry *ce, int type) return 1; } -char *stripbadwords_message(char *str, int *blocked) +const char *stripbadwords_message(const char *str, int *blocked) { return stripbadwords(str, conf_badword_message, blocked); } -int censor_can_send_to_user(Client *client, Client *target, char **text, char **errmsg, SendType sendtype) +int censor_can_send_to_user(Client *client, Client *target, const char **text, const char **errmsg, SendType sendtype) { int blocked = 0; @@ -253,7 +253,7 @@ int censor_can_send_to_user(Client *client, Client *target, char **text, char ** return HOOK_CONTINUE; } -int censor_stats_badwords_user(Client *client, char *para) +int censor_stats_badwords_user(Client *client, const char *para) { ConfigItem_badword *words; diff --git a/src/modules/usermodes/noctcp.c b/src/modules/usermodes/noctcp.c index cc3e7de..28a712e 100644 --- a/src/modules/usermodes/noctcp.c +++ b/src/modules/usermodes/noctcp.c @@ -27,14 +27,14 @@ ModuleHeader MOD_HEADER "4.2", "User Mode +T", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; long UMODE_NOCTCP = 0L; #define IsNoCTCP(client) (client->umodes & UMODE_NOCTCP) -int noctcp_can_send_to_user(Client *client, Client *target, char **text, char **errmsg, SendType sendtype); +int noctcp_can_send_to_user(Client *client, Client *target, const char **text, const char **errmsg, SendType sendtype); MOD_TEST() { @@ -63,7 +63,7 @@ MOD_UNLOAD() return MOD_SUCCESS; } -static int IsACTCP(char *s) +static int IsACTCP(const char *s) { if (!s) return 0; @@ -74,7 +74,7 @@ static int IsACTCP(char *s) return 0; } -int noctcp_can_send_to_user(Client *client, Client *target, char **text, char **errmsg, SendType sendtype) +int noctcp_can_send_to_user(Client *client, Client *target, const char **text, const char **errmsg, SendType sendtype) { if (MyUser(client) && (sendtype == SEND_TYPE_PRIVMSG) && IsNoCTCP(target) && !IsOper(client) && IsACTCP(*text)) diff --git a/src/modules/usermodes/nokick.c b/src/modules/usermodes/nokick.c index 7ea2440..688ee3a 100644 --- a/src/modules/usermodes/nokick.c +++ b/src/modules/usermodes/nokick.c @@ -28,7 +28,7 @@ ModuleHeader MOD_HEADER "4.2", "User Mode +q", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Global variables */ @@ -37,7 +37,7 @@ long UMODE_NOKICK = 0L; /* Forward declarations */ int umode_allow_unkickable_oper(Client *client, int what); int nokick_can_kick(Client *client, Client *target, Channel *channel, - char *comment, long client_flags, long target_flags, char **reject_reason); + const char *comment, const char *client_member_modes, const char *target_member_modes, const char **reject_reason); MOD_TEST() { @@ -76,8 +76,8 @@ int umode_allow_unkickable_oper(Client *client, int what) return 1; } -int nokick_can_kick(Client *client, Client *target, Channel *channel, char *comment, - long client_flags, long target_flags, char **reject_reason) +int nokick_can_kick(Client *client, Client *target, Channel *channel, const char *comment, + const char *client_member_modes, const char *target_member_modes, const char **reject_reason) { static char errmsg[NICKLEN+256]; @@ -91,7 +91,7 @@ int nokick_can_kick(Client *client, Client *target, Channel *channel, char *comm sendnotice(target, "*** umode q: %s tried to kick you from channel %s (%s)", - client->name, channel->chname, comment); + client->name, channel->name, comment); return EX_ALWAYS_DENY; } diff --git a/src/modules/usermodes/privacy.c b/src/modules/usermodes/privacy.c index 5a0fcce..3b43df0 100644 --- a/src/modules/usermodes/privacy.c +++ b/src/modules/usermodes/privacy.c @@ -28,7 +28,7 @@ ModuleHeader MOD_HEADER "4.2", "User Mode +p", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Global variables */ diff --git a/src/modules/usermodes/privdeaf.c b/src/modules/usermodes/privdeaf.c index 657e645..d252ad1 100644 --- a/src/modules/usermodes/privdeaf.c +++ b/src/modules/usermodes/privdeaf.c @@ -11,13 +11,13 @@ ModuleHeader MOD_HEADER "1.2", "Private Messages Deaf (+D) -- by Syzop", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; static long UMODE_PRIVDEAF = 0; static Umode *UmodePrivdeaf = NULL; -int privdeaf_can_send_to_user(Client *client, Client *target, char **text, char **errmsg, SendType sendtype); +int privdeaf_can_send_to_user(Client *client, Client *target, const char **text, const char **errmsg, SendType sendtype); MOD_INIT() { @@ -47,7 +47,7 @@ MOD_UNLOAD() return MOD_SUCCESS; } -int privdeaf_can_send_to_user(Client *client, Client *target, char **text, char **errmsg, SendType sendtype) +int privdeaf_can_send_to_user(Client *client, Client *target, const char **text, const char **errmsg, SendType sendtype) { if ((target->umodes & UMODE_PRIVDEAF) && !IsOper(client) && !IsULine(client) && !IsServer(client) && (client != target)) diff --git a/src/modules/usermodes/regonlymsg.c b/src/modules/usermodes/regonlymsg.c index 4555e67..4e08e4f 100644 --- a/src/modules/usermodes/regonlymsg.c +++ b/src/modules/usermodes/regonlymsg.c @@ -28,14 +28,14 @@ ModuleHeader MOD_HEADER "4.2", "User Mode +R", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Global variables */ long UMODE_REGONLYMSG = 0L; /* Forward declarations */ -int regonlymsg_can_send_to_user(Client *client, Client *target, char **text, char **errmsg, SendType sendtype); +int regonlymsg_can_send_to_user(Client *client, Client *target, const char **text, const char **errmsg, SendType sendtype); MOD_INIT() { @@ -57,11 +57,11 @@ MOD_UNLOAD() return MOD_SUCCESS; } -int regonlymsg_can_send_to_user(Client *client, Client *target, char **text, char **errmsg, SendType sendtype) +int regonlymsg_can_send_to_user(Client *client, Client *target, const char **text, const char **errmsg, SendType sendtype) { if (IsRegOnlyMsg(target) && !IsServer(client) && !IsULine(client) && !IsLoggedIn(client)) { - if (ValidatePermissionsForPath("client:override:message:regonlymsg",client,target,NULL,text)) + if (ValidatePermissionsForPath("client:override:message:regonlymsg",client,target,NULL,text?*text:NULL)) return HOOK_CONTINUE; /* bypass this restriction */ *errmsg = "You must identify to a registered nick to private message this user"; diff --git a/src/modules/usermodes/secureonlymsg.c b/src/modules/usermodes/secureonlymsg.c index 28859db..b4b554d 100644 --- a/src/modules/usermodes/secureonlymsg.c +++ b/src/modules/usermodes/secureonlymsg.c @@ -1,5 +1,5 @@ /* - * Recieve private messages only from SSL/TLS users (User mode +Z) + * Recieve private messages only from TLS users (User mode +Z) * (C) Copyright 2000-.. Bram Matthys (Syzop) and the UnrealIRCd team * Idea from "Stealth" * @@ -29,14 +29,14 @@ ModuleHeader MOD_HEADER "4.2", "User Mode +Z", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Global variables */ long UMODE_SECUREONLYMSG = 0L; /* Forward declarations */ -int secureonlymsg_can_send_to_user(Client *client, Client *target, char **text, char **errmsg, SendType sendtype); +int secureonlymsg_can_send_to_user(Client *client, Client *target, const char **text, const char **errmsg, SendType sendtype); MOD_INIT() { @@ -58,27 +58,27 @@ MOD_UNLOAD() return MOD_SUCCESS; } -int secureonlymsg_can_send_to_user(Client *client, Client *target, char **text, char **errmsg, SendType sendtype) +int secureonlymsg_can_send_to_user(Client *client, Client *target, const char **text, const char **errmsg, SendType sendtype) { if (IsSecureOnlyMsg(target) && !IsServer(client) && !IsULine(client) && !IsSecureConnect(client)) { - if (ValidatePermissionsForPath("client:override:message:secureonlymsg",client,target,NULL,text)) + if (ValidatePermissionsForPath("client:override:message:secureonlymsg",client,target,NULL,text?*text:NULL)) return HOOK_CONTINUE; /* bypass this restriction */ - *errmsg = "You must be connected via SSL/TLS to message this user"; + *errmsg = "You must be connected via TLS to message this user"; return HOOK_DENY; } else if (IsSecureOnlyMsg(client) && !IsSecureConnect(target) && !IsULine(target)) { - if (ValidatePermissionsForPath("client:override:message:secureonlymsg",client,target,NULL,text)) + if (ValidatePermissionsForPath("client:override:message:secureonlymsg",client,target,NULL,text?*text:NULL)) return HOOK_CONTINUE; /* bypass this restriction */ /* Similar to above but in this case we are +Z and are trying to message - * an SSL user (who does not have +Z set, note the 'else'). This does not + * a secure user (who does not have +Z set, note the 'else'). This does not * make sense since they could never message back to us. Better block the * message than leave the user confused. */ - *errmsg = "Recipient is not connected via SSL/TLS and you are +Z"; + *errmsg = "Recipient is not connected via TLS and you are +Z"; return HOOK_DENY; } diff --git a/src/modules/usermodes/servicebot.c b/src/modules/usermodes/servicebot.c index ba94e0a..8c7526c 100644 --- a/src/modules/usermodes/servicebot.c +++ b/src/modules/usermodes/servicebot.c @@ -21,8 +21,6 @@ #define IsServiceBot(client) (client->umodes & UMODE_SERVICEBOT) -#define WHOIS_SERVICE_STRING ":%s 313 %s %s :is a Network Service" - /* Module header */ ModuleHeader MOD_HEADER = { @@ -30,7 +28,7 @@ ModuleHeader MOD_HEADER "4.2", "User Mode +S", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Global variables */ @@ -38,11 +36,11 @@ long UMODE_SERVICEBOT = 0L; /* Forward declarations */ int servicebot_can_kick(Client *client, Client *target, Channel *channel, - char *comment, long client_flags, long target_flags, char **reject_reason); + const char *comment, const char *client_member_modes, const char *target_member_modes, const char **reject_reason); int servicebot_mode_deop(Client *client, Client *target, Channel *channel, - u_int what, int modechar, long my_access, char **reject_reason); -int servicebot_pre_kill(Client *client, Client *target, char *reason); -int servicebot_whois(Client *requester, Client *acptr); + u_int what, int modechar, const char *client_access, const char *target_access, const char **reject_reason); +int servicebot_pre_kill(Client *client, Client *target, const char *reason); +int servicebot_whois(Client *requester, Client *acptr, NameValuePrioList **list); int servicebot_see_channel_in_whois(Client *client, Client *target, Channel *channel); MOD_TEST() @@ -74,8 +72,8 @@ MOD_UNLOAD() return MOD_SUCCESS; } -int servicebot_can_kick(Client *client, Client *target, Channel *channel, char *comment, - long client_flags, long target_flags, char **reject_reason) +int servicebot_can_kick(Client *client, Client *target, Channel *channel, const char *comment, + const char *client_member_modes, const char *target_member_modes, const char **reject_reason) { static char errmsg[NICKLEN+256]; @@ -96,7 +94,7 @@ int servicebot_can_kick(Client *client, Client *target, Channel *channel, char * } int servicebot_mode_deop(Client *client, Client *target, Channel *channel, - u_int what, int modechar, long my_access, char **reject_reason) + u_int what, int modechar, const char *client_access, const char *target_access, const char **reject_reason) { static char errmsg[NICKLEN+256]; @@ -113,7 +111,7 @@ int servicebot_mode_deop(Client *client, Client *target, Channel *channel, return EX_ALLOW; } -int servicebot_pre_kill(Client *client, Client *target, char *reason) +int servicebot_pre_kill(Client *client, Client *target, const char *reason) { if (IsServiceBot(target) && !(ValidatePermissionsForPath("services:servicebot:kill",client,target,NULL,NULL) || IsULine(client))) { @@ -123,12 +121,15 @@ int servicebot_pre_kill(Client *client, Client *target, char *reason) return EX_ALLOW; } -int servicebot_whois(Client *requester, Client *acptr) +int servicebot_whois(Client *client, Client *target, NameValuePrioList **list) { - int hideoper = (IsHideOper(acptr) && (requester != acptr) && !IsOper(requester)) ? 1 : 0; + int hideoper = (IsHideOper(target) && (client != target) && !IsOper(client)) ? 1 : 0; - if (IsServiceBot(acptr) && !hideoper) - sendto_one(requester, NULL, WHOIS_SERVICE_STRING, me.name, requester->name, acptr->name); + if (IsServiceBot(target) && !hideoper && + (whois_get_policy(client, target, "services") > WHOIS_CONFIG_DETAILS_NONE)) + { + add_nvplist_numeric(list, 0, "services", client, RPL_WHOISOPERATOR, target->name, "a Network Service"); + } return 0; } diff --git a/src/modules/usermodes/showwhois.c b/src/modules/usermodes/showwhois.c index 453fd61..74d426a 100644 --- a/src/modules/usermodes/showwhois.c +++ b/src/modules/usermodes/showwhois.c @@ -28,14 +28,14 @@ ModuleHeader MOD_HEADER "4.2", "User Mode +W", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Global variables */ long UMODE_SHOWWHOIS = 0L; /* Forward declarations */ -int showwhois_whois(Client *requester, Client *target); +int showwhois_whois(Client *requester, Client *target, NameValuePrioList **list); MOD_TEST() { @@ -62,7 +62,7 @@ MOD_UNLOAD() return MOD_SUCCESS; } -int showwhois_whois(Client *requester, Client *target) +int showwhois_whois(Client *requester, Client *target, NameValuePrioList **list) { if (IsWhois(target) && (requester != target)) { diff --git a/src/modules/wallops.c b/src/modules/usermodes/wallops.c similarity index 51% rename from src/modules/wallops.c rename to src/modules/usermodes/wallops.c index 869e930..91b715f 100644 --- a/src/modules/wallops.c +++ b/src/modules/usermodes/wallops.c @@ -1,6 +1,6 @@ /* - * IRC - Internet Relay Chat, src/modules/wallops.c - * (C) 2004 The UnrealIRCd Team + * IRC - Internet Relay Chat, src/modules/usermodes/wallops.c + * (C) 2004-2021 The UnrealIRCd Team * * See file AUTHORS in IRC package for additional names of * the programmers. @@ -28,17 +28,20 @@ CMD_FUNC(cmd_wallops); ModuleHeader MOD_HEADER = { - "wallops", + "usermodes/wallops", "5.0", "command /wallops", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; +long UMODE_WALLOP = 0L; /* send wallops to them */ + MOD_INIT() { - CommandAdd(modinfo->handle, MSG_WALLOPS, cmd_wallops, 1, CMD_USER|CMD_SERVER); MARK_AS_OFFICIAL_MODULE(modinfo); + CommandAdd(modinfo->handle, MSG_WALLOPS, cmd_wallops, 1, CMD_USER|CMD_SERVER); + UmodeAdd(modinfo->handle, 'w', UMODE_GLOBAL, 0, umode_allow_all, &UMODE_WALLOP); return MOD_SUCCESS; } @@ -52,14 +55,43 @@ MOD_UNLOAD() return MOD_SUCCESS; } +#define SendWallops(x) (!IsMe(x) && IsUser(x) && ((x)->umodes & UMODE_WALLOP)) + +/** Send a message to all wallops, except one. + * @param one Skip sending the message to this client/direction + * @param from The sender (can not be NULL) + * @param pattern The format string / pattern to use. + * @param ... Format string parameters. + */ +void sendto_wallops(Client *one, Client *from, FORMAT_STRING(const char *pattern), ...) +{ + va_list vl; + Client *acptr; + + ++current_serial; + list_for_each_entry(acptr, &client_list, client_node) + { + if (!SendWallops(acptr)) + continue; + if (acptr->direction->local->serial == current_serial) /* sent message along it already ? */ + continue; + if (acptr->direction == one) + continue; /* ...was the one I should skip */ + acptr->direction->local->serial = current_serial; + + va_start(vl, pattern); + vsendto_prefix_one(acptr->direction, from, NULL, pattern, vl); + va_end(vl); + } +} + /* ** cmd_wallops (write to *all* opers currently online) ** parv[1] = message text */ CMD_FUNC(cmd_wallops) { - char *message; - message = parc > 1 ? parv[1] : NULL; + const char *message = parc > 1 ? parv[1] : NULL; if (BadPtr(message)) { @@ -73,5 +105,7 @@ CMD_FUNC(cmd_wallops) return; } - sendto_ops_butone(client->direction, client, ":%s WALLOPS :%s", client->name, message); + sendto_wallops(client->direction, client, ":%s WALLOPS :%s", client->name, message); + if (MyUser(client)) + sendto_prefix_one(client, client, NULL, ":%s WALLOPS :%s", client->name, message); } diff --git a/src/modules/vhost.c b/src/modules/vhost.c index e55969d..965ae28 100644 --- a/src/modules/vhost.c +++ b/src/modules/vhost.c @@ -30,7 +30,7 @@ ModuleHeader MOD_HEADER "5.0", /* Version */ "command /vhost", /* Short description of module */ "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* This is called on module init, before Server Ready */ @@ -57,7 +57,8 @@ MOD_UNLOAD() CMD_FUNC(cmd_vhost) { ConfigItem_vhost *vhost; - char *login, *password; + char login[HOSTLEN+1]; + const char *password; char olduser[USERLEN+1]; if (!MyUser(client)) @@ -70,42 +71,42 @@ CMD_FUNC(cmd_vhost) } - login = parv[1]; - password = (parc > 2) ? parv[2] : ""; - /* cut-off too long login names. HOSTLEN is arbitrary, we just don't want our * error messages to be cut off because the user is sending huge login names. */ - if (strlen(login) > HOSTLEN) - login[HOSTLEN] = '\0'; + strlcpy(login, parv[1], sizeof(login)); + + password = (parc > 2) ? parv[2] : ""; if (!(vhost = find_vhost(login))) { - sendto_snomask(SNO_VHOST, - "[\2vhost\2] Failed login for vhost %s by %s!%s@%s - incorrect password", - login, client->name, - client->user->username, - client->user->realhost); + unreal_log(ULOG_WARNING, "vhost", "VHOST_FAILED", client, + "Failed VHOST attempt by $client.details [reason: $reason] [vhost-block: $vhost_block]", + log_data_string("reason", "Vhost block not found"), + log_data_string("fail_type", "UNKNOWN_VHOST_NAME"), + log_data_string("vhost_block", login)); sendnotice(client, "*** [\2vhost\2] Login for %s failed - password incorrect", login); return; } if (!unreal_mask_match(client, vhost->mask)) { - sendto_snomask(SNO_VHOST, - "[\2vhost\2] Failed login for vhost %s by %s!%s@%s - host does not match", - login, client->name, client->user->username, client->user->realhost); + unreal_log(ULOG_WARNING, "vhost", "VHOST_FAILED", client, + "Failed VHOST attempt by $client.details [reason: $reason] [vhost-block: $vhost_block]", + log_data_string("reason", "Host does not match"), + log_data_string("fail_type", "NO_HOST_MATCH"), + log_data_string("vhost_block", login)); sendnotice(client, "*** No vHost lines available for your host"); return; } if (!Auth_Check(client, vhost->auth, password)) { - sendto_snomask(SNO_VHOST, - "[\2vhost\2] Failed login for vhost %s by %s!%s@%s - incorrect password", - login, client->name, - client->user->username, - client->user->realhost); + unreal_log(ULOG_WARNING, "vhost", "VHOST_FAILED", client, + "Failed VHOST attempt by $client.details [reason: $reason] [vhost-block: $vhost_block]", + log_data_string("reason", "Authentication failed"), + log_data_string("fail_type", "AUTHENTICATION_FAILED"), + log_data_string("vhost_block", login)); sendnotice(client, "*** [\2vhost\2] Login for %s failed - password incorrect", login); return; } @@ -141,8 +142,8 @@ CMD_FUNC(cmd_vhost) safe_strdup(client->user->virthost, vhost->virthost); if (vhost->virtuser) { - strcpy(olduser, client->user->username); - strlcpy(client->user->username, vhost->virtuser, USERLEN); + strlcpy(olduser, client->user->username, sizeof(olduser)); + strlcpy(client->user->username, vhost->virtuser, sizeof(client->user->username)); sendto_server(client, 0, 0, NULL, ":%s SETIDENT %s", client->id, client->user->username); } @@ -161,12 +162,22 @@ CMD_FUNC(cmd_vhost) vhost->virtuser ? vhost->virtuser : "", vhost->virtuser ? "@" : "", vhost->virthost); - sendto_snomask(SNO_VHOST, - "[\2vhost\2] %s (%s!%s@%s) is now using vhost %s%s%s", - login, client->name, - vhost->virtuser ? olduser : client->user->username, - client->user->realhost, vhost->virtuser ? vhost->virtuser : "", - vhost->virtuser ? "@" : "", vhost->virthost); + + if (vhost->virtuser) + { + /* virtuser@virthost */ + unreal_log(ULOG_INFO, "vhost", "VHOST_SUCCESS", client, + "$client.details is now using vhost $virtuser@$virthost [vhost-block: $vhost_block]", + log_data_string("virtuser", vhost->virtuser), + log_data_string("virthost", vhost->virthost), + log_data_string("vhost_block", login)); + } else { + /* just virthost */ + unreal_log(ULOG_INFO, "vhost", "VHOST_SUCCESS", client, + "$client.details is now using vhost $virthost [vhost-block: $vhost_block]", + log_data_string("virthost", vhost->virthost), + log_data_string("vhost_block", login)); + } userhost_changed(client); } diff --git a/src/modules/watch-backend.c b/src/modules/watch-backend.c new file mode 100644 index 0000000..40f73c4 --- /dev/null +++ b/src/modules/watch-backend.c @@ -0,0 +1,382 @@ +/* + * IRC - Internet Relay Chat, src/modules/watch-backend.c + * (C) 2021 The UnrealIRCd Team + * + * See file AUTHORS in IRC package for additional names of + * the programmers. + * + * This program is free 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 1, or (at your option) + * any later version. + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "unrealircd.h" + +#define WATCH_HASH_TABLE_SIZE 32768 + +#define WATCHES(client) (moddata_local_client(client, watchCounterMD).i) +#define WATCH(client) (moddata_local_client(client, watchListMD).ptr) + +ModDataInfo *watchCounterMD; +ModDataInfo *watchListMD; +static Watch *watchTable[WATCH_HASH_TABLE_SIZE]; +static int watch_initialized = 0; +static char siphashkey_watch[SIPHASH_KEY_LENGTH]; + +void dummy_free(ModData *md); +void watch_free(ModData *md); + +int watch_backend_user_quit(Client *client, MessageTag *mtags, const char *comment); +int _watch_add(char *nick, Client *client, int flags); +int _watch_check(Client *client, int event, int (*watch_notify)(Client *client, Watch *watch, Link *lp, int event)); +Watch *_watch_get(char *nick); +int _watch_del(char *nick, Client *client, int flags); +int _watch_del_list(Client *client, int flags); +uint64_t hash_watch_nick_name(const char *name); + +ModuleHeader MOD_HEADER += { + "watch-backend", + "5.0", + "backend for /watch", + "UnrealIRCd Team", + "unrealircd-6", +}; + +MOD_TEST() +{ + MARK_AS_OFFICIAL_MODULE(modinfo); + + EfunctionAdd(modinfo->handle, EFUNC_WATCH_ADD, _watch_add); + EfunctionAdd(modinfo->handle, EFUNC_WATCH_DEL, _watch_del); + EfunctionAdd(modinfo->handle, EFUNC_WATCH_DEL_LIST, _watch_del_list); + EfunctionAddPVoid(modinfo->handle, EFUNC_WATCH_GET, TO_PVOIDFUNC(_watch_get)); + EfunctionAdd(modinfo->handle, EFUNC_WATCH_CHECK, _watch_check); + return MOD_SUCCESS; +} + +MOD_INIT() +{ + ModDataInfo mreq; + + MARK_AS_OFFICIAL_MODULE(modinfo); + ModuleSetOptions(modinfo->handle, MOD_OPT_PERM_RELOADABLE, 1); /* or do a complex memory freeing algorithm instead */ + + if (!watch_initialized) + { + memset(watchTable, 0, sizeof(watchTable)); + siphash_generate_key(siphashkey_watch); + watch_initialized = 1; + } + + memset(&mreq, 0 , sizeof(mreq)); + mreq.type = MODDATATYPE_LOCAL_CLIENT; + mreq.name = "watchCount", + mreq.free = dummy_free; + watchCounterMD = ModDataAdd(modinfo->handle, mreq); + if (!watchCounterMD) + { + config_error("[%s] Failed to request user watchCount moddata: %s", MOD_HEADER.name, ModuleGetErrorStr(modinfo->handle)); + return MOD_FAILED; + } + + memset(&mreq, 0 , sizeof(mreq)); + mreq.type = MODDATATYPE_LOCAL_CLIENT; + mreq.name = "watchList", + mreq.free = watch_free; + watchListMD = ModDataAdd(modinfo->handle, mreq); + if (!watchListMD) + { + config_error("[%s] Failed to request user watchList moddata: %s", MOD_HEADER.name, ModuleGetErrorStr(modinfo->handle)); + return MOD_FAILED; + } + + HookAdd(modinfo->handle, HOOKTYPE_LOCAL_QUIT, 0, watch_backend_user_quit); + + return MOD_SUCCESS; +} + +MOD_LOAD() +{ + return MOD_SUCCESS; +} + +MOD_UNLOAD() +{ + return MOD_SUCCESS; +} + +void dummy_free(ModData *md) +{ +} + +void watch_free(ModData *md) +{ + /* it should have been never requested to free as the module is PERM */ + if (md) + { + unreal_log(ULOG_ERROR, "watch-backend", "BUG_WATCH_FREE_MEMORY_LEAK", NULL, + "[BUG] watchList moddata was not freed -- memory leak!"); + } +} + +int watch_backend_user_quit(Client *client, MessageTag *mtags, const char *comment) +{ + /* Clean out list and watch structures -Donwulff */ + watch_del_list(client, 0); + return 0; +} + +/* + * _watch_add + */ +int _watch_add(char *nick, Client *client, int flags) +{ + unsigned int hashv; + Watch *watch; + Link *lp; + + + /* Get the right bucket... */ + hashv = hash_watch_nick_name(nick); + + /* Find the right nick (header) in the bucket, or NULL... */ + if ((watch = (Watch *)watchTable[hashv])) + while (watch && mycmp(watch->nick, nick)) + watch = watch->hnext; + + /* If found NULL (no header for this nick), make one... */ + if (!watch) { + watch = (Watch *)safe_alloc(sizeof(Watch)+strlen(nick)); + watch->lasttime = timeofday; + strcpy(watch->nick, nick); + + watch->watch = NULL; + + watch->hnext = watchTable[hashv]; + watchTable[hashv] = watch; + } + /* Is this client already on the watch-list? */ + if ((lp = watch->watch)) + while (lp && (lp->value.client != client)) + lp = lp->next; + + /* No it isn't, so add it in the bucket and client addint it */ + if (!lp) { + lp = watch->watch; + watch->watch = make_link(); + watch->watch->value.client = client; + watch->watch->flags = flags; + watch->watch->next = lp; + + lp = make_link(); + lp->next = WATCH(client); + lp->value.wptr = watch; + lp->flags = flags; + WATCH(client) = lp; + WATCHES(client)++; + } + + return 0; +} + +/* + * _watch_check + */ +int _watch_check(Client *client, int event, int (*watch_notify)(Client *client, Watch *watch, Link *lp, int event)) +{ + unsigned int hashv; + Watch *watch; + Link *lp; + + /* Get us the right bucket */ + hashv = hash_watch_nick_name(client->name); + + /* Find the right header in this bucket */ + if ((watch = (Watch *)watchTable[hashv])) + while (watch && mycmp(watch->nick, client->name)) + watch = watch->hnext; + if (!watch) + return 0; /* This nick isn't on watch */ + + /* Update the time of last change to item */ + watch->lasttime = TStime(); + + /* Send notifies out to everybody on the list in header */ + for (lp = watch->watch; lp; lp = lp->next) + { + watch_notify(client, watch, lp, event); + } + + return 0; +} + +/* + * _watch_get + */ +Watch *_watch_get(char *nick) +{ + unsigned int hashv; + Watch *watch; + + hashv = hash_watch_nick_name(nick); + + if ((watch = (Watch *)watchTable[hashv])) + while (watch && mycmp(watch->nick, nick)) + watch = watch->hnext; + + return watch; +} + +/* + * _watch_del + */ +int _watch_del(char *nick, Client *client, int flags) +{ + unsigned int hashv; + Watch **watch, *wprev; + Link **lp, *prev; + + /* Get the bucket for this nick... */ + hashv = hash_watch_nick_name(nick); + + /* Find the right header, maintaining last-link pointer... */ + watch = (Watch **)&watchTable[hashv]; + while (*watch && mycmp((*watch)->nick, nick)) + watch = &(*watch)->hnext; + if (!*watch) + return 0; /* No such watch */ + + /* Find this client from the list of notifies... with last-ptr. */ + lp = &(*watch)->watch; + while (*lp) + { + if ((*lp)->value.client == client && ((*lp)->flags & flags) == flags) + break; + lp = &(*lp)->next; + } + if (!*lp) + return 0; /* No such client to watch */ + + /* Fix the linked list under header, then remove the watch entry */ + prev = *lp; + *lp = prev->next; + free_link(prev); + + /* Do the same regarding the links in client-record... */ + lp = (Link **)&WATCH(client); + while (*lp && ((*lp)->value.wptr != *watch)) + lp = &(*lp)->next; + + /* + * Give error on the odd case... probobly not even neccessary + * No error checking in ircd is unneccessary ;) -Cabal95 + */ + if (!*lp) + { + unreal_log(ULOG_WARNING, "watch", "BUG_WATCH_DEL", client, + "[BUG] watch_del found a watch entry with no client counterpoint, " + "while processing nick $nick on client $client.details", + log_data_string("nick", nick)); + } else { + prev = *lp; + *lp = prev->next; + free_link(prev); + } + /* In case this header is now empty of notices, remove it */ + if (!(*watch)->watch) { + wprev = *watch; + *watch = wprev->hnext; + safe_free(wprev); + } + + /* Update count of notifies on nick */ + WATCHES(client)--; + + return 0; +} + +/* + * _watch_del_list + */ +int _watch_del_list(Client *client, int flags) +{ + unsigned int hashv; + Watch *watch; + Link **np, **lp, *prev; + + np = (Link **)&WATCH(client); + + while (*np) { + if (((*np)->flags & flags) != flags) + { + /* this entry is not fitting requested flags */ + np = &(*np)->next; + continue; + } + + WATCHES(client)--; + + /* Find the watch-record from hash-table... */ + watch = (*np)->value.wptr; + lp = &(watch->watch); + while (*lp && ((*lp)->value.client != client)) + lp = &(*lp)->next; + + /* Not found, another "worst case" debug error */ + if (!*lp) + { + unreal_log(ULOG_WARNING, "watch", "BUG_WATCH_DEL_LIST", client, + "[BUG] watch_del_list found a watch entry with no table counterpoint, " + "while processing client $client.details"); + } else { + /* Fix the watch-list and remove entry */ + Link *prev = *lp; + *lp = prev->next; + free_link(prev); + + /* + * If this leaves a header without notifies, + * remove it. Need to find the last-pointer! + */ + if (!watch->watch) { + Watch **np2, *wprev; + + hashv = hash_watch_nick_name(watch->nick); + + np2 = &watchTable[hashv]; + while (*np2 && *np2 != watch) + np2 = &(*np2)->hnext; + + *np2 = watch->hnext; + + safe_free(watch); + } + } + + prev = *np; /* Save last pointer processed */ + *np = prev->next; /* Jump to the next pointer */ + free_link(prev); /* Free the previous */ + } + + if (!flags) + WATCHES(client) = 0; + + return 0; +} + +uint64_t hash_watch_nick_name(const char *name) +{ + return siphash_nocase(name, siphashkey_watch) % WATCH_HASH_TABLE_SIZE; +} + diff --git a/src/modules/watch.c b/src/modules/watch.c index f84b607..9839b15 100644 --- a/src/modules/watch.c +++ b/src/modules/watch.c @@ -22,9 +22,15 @@ #include "unrealircd.h" -CMD_FUNC(cmd_watch); +#define MSG_WATCH "WATCH" -#define MSG_WATCH "WATCH" +CMD_FUNC(cmd_watch); +int watch_user_quit(Client *client, MessageTag *mtags, const char *comment); +int watch_away(Client *client, MessageTag *mtags, const char *reason, int already_as_away); +int watch_nickchange(Client *client, MessageTag *mtags, const char *newnick); +int watch_post_nickchange(Client *client, MessageTag *mtags, const char *oldnick); +int watch_user_connect(Client *client); +int watch_notification(Client *client, Watch *watch, Link *lp, int event); ModuleHeader MOD_HEADER = { @@ -32,13 +38,24 @@ ModuleHeader MOD_HEADER "5.0", "command /watch", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() -{ - CommandAdd(modinfo->handle, MSG_WATCH, cmd_watch, 1, CMD_USER); +{ MARK_AS_OFFICIAL_MODULE(modinfo); + + CommandAdd(modinfo->handle, MSG_WATCH, cmd_watch, 1, CMD_USER); + HookAdd(modinfo->handle, HOOKTYPE_LOCAL_QUIT, 0, watch_user_quit); + HookAdd(modinfo->handle, HOOKTYPE_REMOTE_QUIT, 0, watch_user_quit); + HookAdd(modinfo->handle, HOOKTYPE_AWAY, 0, watch_away); + HookAdd(modinfo->handle, HOOKTYPE_LOCAL_NICKCHANGE, 0, watch_nickchange); + HookAdd(modinfo->handle, HOOKTYPE_REMOTE_NICKCHANGE, 0, watch_nickchange); + HookAdd(modinfo->handle, HOOKTYPE_POST_LOCAL_NICKCHANGE, 0, watch_post_nickchange); + HookAdd(modinfo->handle, HOOKTYPE_POST_REMOTE_NICKCHANGE, 0, watch_post_nickchange); + HookAdd(modinfo->handle, HOOKTYPE_LOCAL_CONNECT, 0, watch_user_connect); + HookAdd(modinfo->handle, HOOKTYPE_REMOTE_CONNECT, 0, watch_user_connect); + return MOD_SUCCESS; } @@ -55,44 +72,66 @@ MOD_UNLOAD() /* * RPL_NOWON - Online at the moment (Successfully added to WATCH-list) * RPL_NOWOFF - Offline at the moement (Successfully added to WATCH-list) - * RPL_WATCHOFF - Successfully removed from WATCH-list. - * ERR_TOOMANYWATCH - Take a guess :> Too many WATCH entries. */ -static void show_watch(Client *client, char *name, int rpl1, int rpl2, int awaynotify) +static void show_watch(Client *client, char *name, int awaynotify) { Client *target; - if ((target = find_person(name, NULL))) + if ((target = find_user(name, NULL))) { if (awaynotify && target->user->away) { sendnumeric(client, RPL_NOWISAWAY, target->name, target->user->username, - IsHidden(target) ? target->user->virthost : target->user-> - realhost, target->user->lastaway); + IsHidden(target) ? target->user->virthost : target->user->realhost, + (long long)target->user->away_since); return; } - sendnumeric(client, rpl1, + sendnumeric(client, RPL_NOWON, target->name, target->user->username, - IsHidden(target) ? target->user->virthost : target->user-> - realhost, target->lastnick); + IsHidden(target) ? target->user->virthost : target->user->realhost, + (long long)target->lastnick); } else { - sendnumeric(client, rpl2, name, "*", "*", 0L); + sendnumeric(client, RPL_NOWOFF, name, "*", "*", 0LL); + } +} + +/* + * RPL_WATCHOFF - Successfully removed from WATCH-list. + */ +static void show_watch_removed(Client *client, char *name) +{ + Client *target; + + if ((target = find_user(name, NULL))) + { + sendnumeric(client, RPL_WATCHOFF, + target->name, target->user->username, + IsHidden(target) ? target->user->virthost : target->user->realhost, + (long long)target->lastnick); + } + else + { + sendnumeric(client, RPL_WATCHOFF, name, "*", "*", 0LL); } } static char buf[BUFSIZE]; +#define WATCHES(client) (moddata_local_client(client, watchCounterMD).i) +#define WATCH(client) (moddata_local_client(client, watchListMD).ptr) + /* * cmd_watch */ CMD_FUNC(cmd_watch) { + char request[BUFSIZE]; Client *target; - char *s, **pav = parv, *user; + char *s, *user; char *p = NULL, *def = "l"; int awaynotify = 0; int did_l=0, did_s=0; @@ -109,7 +148,20 @@ CMD_FUNC(cmd_watch) parv[1] = def; } - for (s = strtoken(&p, *++pav, " "); s; s = strtoken(&p, NULL, " ")) + + ModDataInfo *watchCounterMD = findmoddata_byname("watchCount", MODDATATYPE_LOCAL_CLIENT); + ModDataInfo *watchListMD = findmoddata_byname("watchList", MODDATATYPE_LOCAL_CLIENT); + + if (!watchCounterMD || !watchListMD) + { + unreal_log(ULOG_ERROR, "watch", "WATCH_BACKEND_MISSING", NULL, + "[watch] moddata unavailable. Is the 'watch-backend' module loaded?"); + sendnotice(client, "WATCH command is not available at this moment. Please try again later."); + return; + } + + strlcpy(request, parv[1], sizeof(request)); + for (s = strtoken(&p, request, " "); s; s = strtoken(&p, NULL, " ")) { if ((user = strchr(s, '!'))) *user++ = '\0'; /* Not used */ @@ -127,16 +179,18 @@ CMD_FUNC(cmd_watch) continue; if (do_nick_name(s + 1)) { - if (client->local->watches >= MAXWATCH) + if (WATCHES(client) >= MAXWATCH) { sendnumeric(client, ERR_TOOMANYWATCH, s + 1); continue; } - add_to_watch_hash_table(s + 1, client, awaynotify); + watch_add(s + 1, client, + WATCH_FLAG_TYPE_WATCH | (awaynotify ? WATCH_FLAG_AWAYNOTIFY : 0) + ); } - show_watch(client, s + 1, RPL_NOWON, RPL_NOWOFF, awaynotify); + show_watch(client, s + 1, awaynotify); continue; } @@ -148,9 +202,8 @@ CMD_FUNC(cmd_watch) { if (!*(s+1)) continue; - del_from_watch_hash_table(s + 1, client); - show_watch(client, s + 1, RPL_WATCHOFF, RPL_WATCHOFF, 0); - + watch_del(s + 1, client, WATCH_FLAG_TYPE_WATCH); + show_watch_removed(client, s + 1); continue; } @@ -160,8 +213,7 @@ CMD_FUNC(cmd_watch) */ if (*s == 'C' || *s == 'c') { - hash_del_watch_list(client); - + watch_del_list(client, WATCH_FLAG_TYPE_WATCH); continue; } @@ -173,38 +225,38 @@ CMD_FUNC(cmd_watch) if ((*s == 'S' || *s == 's') && !did_s) { Link *lp; - Watch *anptr; + Watch *watch; int count = 0; did_s = 1; /* * Send a list of how many users they have on their WATCH list - * and how many WATCH lists they are on. + * and how many WATCH lists they are on. This will also include + * other WATCH types if present - we're not checking for + * WATCH_FLAG_TYPE_*. */ - anptr = hash_get_watch(client->name); - if (anptr) - for (lp = anptr->watch, count = 1; + watch = watch_get(client->name); + if (watch) + for (lp = watch->watch, count = 1; (lp = lp->next); count++) ; - sendnumeric(client, RPL_WATCHSTAT, client->local->watches, count); + sendnumeric(client, RPL_WATCHSTAT, WATCHES(client), count); /* * Send a list of everybody in their WATCH list. Be careful * not to buffer overflow. */ - if ((lp = client->local->watch) == NULL) - { - sendnumeric(client, RPL_ENDOFWATCHLIST, *s); - continue; - } + lp = WATCH(client); *buf = '\0'; - strlcpy(buf, lp->value.wptr->nick, sizeof buf); - count = - strlen(client->name) + strlen(me.name) + 10 + - strlen(buf); - while ((lp = lp->next)) + count = strlen(client->name) + strlen(me.name) + 10; + while (lp) { + if (!(lp->flags & WATCH_FLAG_TYPE_WATCH)) + { + lp = lp->next; + continue; /* this one is not ours */ + } if (count + strlen(lp->value.wptr->nick) + 1 > BUFSIZE - 2) { @@ -215,8 +267,12 @@ CMD_FUNC(cmd_watch) strcat(buf, " "); strcat(buf, lp->value.wptr->nick); count += (strlen(lp->value.wptr->nick) + 1); + + lp = lp->next; } - sendnumeric(client, RPL_WATCHLIST, buf); + if (*buf) + /* anything to send */ + sendnumeric(client, RPL_WATCHLIST, buf); sendnumeric(client, RPL_ENDOFWATCHLIST, *s); continue; @@ -229,19 +285,24 @@ CMD_FUNC(cmd_watch) */ if ((*s == 'L' || *s == 'l') && !did_l) { - Link *lp = client->local->watch; + Link *lp = WATCH(client); did_l = 1; while (lp) { - if ((target = find_person(lp->value.wptr->nick, NULL))) + if (!(lp->flags & WATCH_FLAG_TYPE_WATCH)) + { + lp = lp->next; + continue; /* this one is not ours */ + } + if ((target = find_user(lp->value.wptr->nick, NULL))) { sendnumeric(client, RPL_NOWON, target->name, target->user->username, IsHidden(target) ? target->user-> virthost : target->user->realhost, - target->lastnick); + (long long)target->lastnick); } /* * But actually, only show them offline if its a capital @@ -250,7 +311,7 @@ CMD_FUNC(cmd_watch) else if (isupper(*s)) sendnumeric(client, RPL_NOWOFF, lp->value.wptr->nick, "*", "*", - lp->value.wptr->lasttime); + (long long)lp->value.wptr->lasttime); lp = lp->next; } @@ -264,3 +325,106 @@ CMD_FUNC(cmd_watch) */ } } + +int watch_user_quit(Client *client, MessageTag *mtags, const char *comment) +{ + if (IsUser(client)) + watch_check(client, WATCH_EVENT_OFFLINE, watch_notification); + return 0; +} + +int watch_away(Client *client, MessageTag *mtags, const char *reason, int already_as_away) +{ + if (reason) + watch_check(client, already_as_away ? WATCH_EVENT_REAWAY : WATCH_EVENT_AWAY, watch_notification); + else + watch_check(client, WATCH_EVENT_NOTAWAY, watch_notification); + + return 0; +} + +int watch_nickchange(Client *client, MessageTag *mtags, const char *newnick) +{ + watch_check(client, WATCH_EVENT_OFFLINE, watch_notification); + + return 0; +} + +int watch_post_nickchange(Client *client, MessageTag *mtags, const char *oldnick) +{ + watch_check(client, WATCH_EVENT_ONLINE, watch_notification); + + return 0; +} + +int watch_user_connect(Client *client) +{ + watch_check(client, WATCH_EVENT_ONLINE, watch_notification); + + return 0; +} + +int watch_notification(Client *client, Watch *watch, Link *lp, int event) +{ + int awaynotify = 0; + + if (!(lp->flags & WATCH_FLAG_TYPE_WATCH)) + return 0; + + if ((event == WATCH_EVENT_AWAY) || (event == WATCH_EVENT_NOTAWAY) || (event == WATCH_EVENT_REAWAY)) + awaynotify = 1; + + if (!awaynotify) + { + if (event == WATCH_EVENT_OFFLINE) + { + sendnumeric(lp->value.client, RPL_LOGOFF, + client->name, + (IsUser(client) ? client->user->username : ""), + (IsUser(client) ? (IsHidden(client) ? client->user->virthost : client->user->realhost) : ""), + (long long)watch->lasttime); + } else { + sendnumeric(lp->value.client, RPL_LOGON, + client->name, + (IsUser(client) ? client->user->username : ""), + (IsUser(client) ? (IsHidden(client) ? client->user->virthost : client->user->realhost) : ""), + (long long)watch->lasttime); + } + } + else + { + /* AWAY or UNAWAY */ + if (!(lp->flags & WATCH_FLAG_AWAYNOTIFY)) + return 0; /* skip away/unaway notification for users not interested in them */ + + if (event == WATCH_EVENT_NOTAWAY) + { + sendnumeric(lp->value.client, RPL_NOTAWAY, + client->name, + (IsUser(client) ? client->user->username : ""), + (IsUser(client) ? (IsHidden(client) ? client->user->virthost : client->user->realhost) : ""), + (long long)client->user->away_since); + } else + if (event == RPL_GONEAWAY) + { + sendnumeric(lp->value.client, RPL_GONEAWAY, + client->name, + (IsUser(client) ? client->user->username : ""), + (IsUser(client) ? (IsHidden(client) ? client->user->virthost : client->user->realhost) : ""), + (long long)client->user->away_since, + client->user->away); + } else + if (event == RPL_REAWAY) + { + sendnumeric(lp->value.client, RPL_REAWAY, + client->name, + (IsUser(client) ? client->user->username : ""), + (IsUser(client) ? (IsHidden(client) ? client->user->virthost : client->user->realhost) : ""), + (long long)client->user->away_since, + client->user->away); + } + } + + return 0; +} + diff --git a/src/modules/webirc.c b/src/modules/webirc.c index 42762f5..373761d 100644 --- a/src/modules/webirc.c +++ b/src/modules/webirc.c @@ -40,7 +40,7 @@ ModuleHeader MOD_HEADER "5.0", "WebIRC/CGI:IRC Support", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* Global variables */ @@ -49,14 +49,13 @@ ConfigItem_webirc *conf_webirc = NULL; /* Forward declarations */ CMD_FUNC(cmd_webirc); -int webirc_check_init(Client *client, char *sockn, size_t size); -int webirc_local_pass(Client *client, char *password); +int webirc_local_pass(Client *client, const char *password); int webirc_config_test(ConfigFile *, ConfigEntry *, int, int *); int webirc_config_run(ConfigFile *, ConfigEntry *, int); void webirc_free_conf(void); void delete_webircblock(ConfigItem_webirc *e); -char *webirc_md_serialize(ModData *m); -void webirc_md_unserialize(char *str, ModData *m); +const char *webirc_md_serialize(ModData *m); +void webirc_md_unserialize(const char *str, ModData *m); void webirc_md_free(ModData *md); int webirc_secure_connect(Client *client); @@ -87,7 +86,7 @@ MOD_INIT() mreq.serialize = webirc_md_serialize; mreq.unserialize = webirc_md_unserialize; mreq.free = webirc_md_free; - mreq.sync = 1; + mreq.sync = MODDATA_SYNC_EARLY; webirc_md = ModDataAdd(modinfo->handle, mreq); if (!webirc_md) { @@ -96,7 +95,6 @@ MOD_INIT() } HookAdd(modinfo->handle, HOOKTYPE_CONFIGRUN, 0, webirc_config_run); - HookAdd(modinfo->handle, HOOKTYPE_CHECK_INIT, 0, webirc_check_init); HookAdd(modinfo->handle, HOOKTYPE_LOCAL_PASS, 0, webirc_local_pass); HookAdd(modinfo->handle, HOOKTYPE_SECURE_CONNECT, 0, webirc_secure_connect); @@ -154,82 +152,81 @@ int webirc_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) if (!ce) return 0; - if (!strcmp(ce->ce_varname, "cgiirc")) + if (!strcmp(ce->name, "cgiirc")) { config_error("%s:%i: the cgiirc block has been renamed to webirc and " "the syntax has changed in UnrealIRCd 4", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); - need_34_upgrade = 1; + ce->file->filename, ce->line_number); *errs = 1; return -1; } - if (strcmp(ce->ce_varname, "webirc")) + if (strcmp(ce->name, "webirc")) return 0; /* not interested in non-webirc stuff.. */ /* Now actually go parse the webirc { } block */ - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!cep->ce_vardata) + if (!cep->value) { - config_error_empty(cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - "webirc", cep->ce_varname); + config_error_empty(cep->file->filename, cep->line_number, + "webirc", cep->name); errors++; continue; } - if (!strcmp(cep->ce_varname, "mask")) + if (!strcmp(cep->name, "mask")) { - if (cep->ce_vardata || cep->ce_entries) + if (cep->value || cep->items) has_mask = 1; } - else if (!strcmp(cep->ce_varname, "password")) + else if (!strcmp(cep->name, "password")) { if (has_password) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "webirc::password"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "webirc::password"); continue; } has_password = 1; if (Auth_CheckError(cep) < 0) errors++; } - else if (!strcmp(cep->ce_varname, "type")) + else if (!strcmp(cep->name, "type")) { if (has_type) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "webirc::type"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "webirc::type"); } has_type = 1; - if (!strcmp(cep->ce_vardata, "webirc")) + if (!strcmp(cep->value, "webirc")) webirc_type = WEBIRC_WEBIRC; - else if (!strcmp(cep->ce_vardata, "old")) + else if (!strcmp(cep->value, "old")) webirc_type = WEBIRC_PASS; else { config_error("%s:%i: unknown webirc::type '%s', should be either 'webirc' or 'old'", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_vardata); + cep->file->filename, cep->line_number, cep->value); errors++; } } else { - config_error_unknown(cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - "webirc", cep->ce_varname); + config_error_unknown(cep->file->filename, cep->line_number, + "webirc", cep->name); errors++; } } if (!has_mask) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "webirc::mask"); errors++; } if (!has_password && (webirc_type == WEBIRC_WEBIRC)) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "webirc::password"); errors++; } @@ -239,7 +236,7 @@ int webirc_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) config_error("%s:%i: webirc block has type set to 'old' but has a password set. " "Passwords are not used with type 'old'. Either remove the password or " "use the 'webirc' method instead.", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); errors++; } @@ -255,23 +252,23 @@ int webirc_config_run(ConfigFile *cf, ConfigEntry *ce, int type) if (type != CONFIG_MAIN) return 0; - if (!ce || !ce->ce_varname || strcmp(ce->ce_varname, "webirc")) + if (!ce || !ce->name || strcmp(ce->name, "webirc")) return 0; /* not interested */ webirc = safe_alloc(sizeof(ConfigItem_webirc)); webirc->type = WEBIRC_WEBIRC; /* default */ - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "mask")) + if (!strcmp(cep->name, "mask")) unreal_add_masks(&webirc->mask, cep); - else if (!strcmp(cep->ce_varname, "password")) + else if (!strcmp(cep->name, "password")) webirc->auth = AuthBlockToAuthConfig(cep); - else if (!strcmp(cep->ce_varname, "type")) + else if (!strcmp(cep->name, "type")) { - if (!strcmp(cep->ce_vardata, "webirc")) + if (!strcmp(cep->value, "webirc")) webirc->type = WEBIRC_WEBIRC; - else if (!strcmp(cep->ce_vardata, "old")) + else if (!strcmp(cep->value, "old")) webirc->type = WEBIRC_PASS; else abort(); @@ -283,7 +280,7 @@ int webirc_config_run(ConfigFile *cf, ConfigEntry *ce, int type) return 0; } -char *webirc_md_serialize(ModData *m) +const char *webirc_md_serialize(ModData *m) { static char buf[32]; if (m->i == 0) @@ -292,7 +289,7 @@ char *webirc_md_serialize(ModData *m) return buf; } -void webirc_md_unserialize(char *str, ModData *m) +void webirc_md_unserialize(const char *str, ModData *m) { m->i = atoi(str); } @@ -303,7 +300,7 @@ void webirc_md_free(ModData *md) md->l = 0; } -ConfigItem_webirc *find_webirc(Client *client, char *password, WEBIRCType type, char **errorstr) +ConfigItem_webirc *find_webirc(Client *client, const char *password, WEBIRCType type, char **errorstr) { ConfigItem_webirc *e; char *error = NULL; @@ -337,7 +334,7 @@ ConfigItem_webirc *find_webirc(Client *client, char *password, WEBIRCType type, #define WEBIRC_STRINGLEN (sizeof(WEBIRC_STRING)-1) /* Does the CGI:IRC host spoofing work */ -void dowebirc(Client *client, char *ip, char *host, char *options) +void dowebirc(Client *client, const char *ip, const char *host, const char *options) { char scratch[64]; @@ -352,8 +349,7 @@ void dowebirc(Client *client, char *ip, char *host, char *options) /* STEP 1: Update client->local->ip inet_pton() returns 1 on success, 0 on bad input, -1 on bad AF */ - if ((inet_pton(AF_INET, ip, scratch) != 1) && - (inet_pton(AF_INET6, ip, scratch) != 1)) + if (!is_valid_ip(ip)) { /* then we have an invalid IP */ exit_client(client, NULL, "Invalid IP address"); @@ -371,7 +367,7 @@ void dowebirc(Client *client, char *ip, char *host, char *options) client->local->hostp = NULL; } /* (create new) */ - if (host && verify_hostname(host)) + if (host && valid_host(host, 1)) client->local->hostp = unreal_create_hostent(host, client->ip); /* STEP 4: Update sockhost @@ -385,8 +381,10 @@ void dowebirc(Client *client, char *ip, char *host, char *options) if (options) { + char optionsbuf[BUFSIZE]; char *name, *p = NULL, *p2; - for (name = strtoken(&p, options, " "); name; name = strtoken(&p, NULL, " ")) + strlcpy(optionsbuf, options, sizeof(optionsbuf)); + for (name = strtoken(&p, optionsbuf, " "); name; name = strtoken(&p, NULL, " ")) { p2 = strchr(name, '='); if (p2) @@ -413,7 +411,7 @@ void dowebirc(Client *client, char *ip, char *host, char *options) /* WEBIRC "cgiirc" [:option1 [option2...]]*/ CMD_FUNC(cmd_webirc) { - char *ip, *host, *password, *options; + const char *ip, *host, *password, *options; ConfigItem_webirc *e; char *error = NULL; @@ -440,25 +438,17 @@ CMD_FUNC(cmd_webirc) dowebirc(client, ip, host, options); } -int webirc_check_init(Client *client, char *sockn, size_t size) -{ - if (IsWEBIRC(client)) - { - strlcpy(sockn, GetIP(client), size); /* use already set value */ - return HOOK_DENY; - } - - return HOOK_CONTINUE; /* nothing to do */ -} - -int webirc_local_pass(Client *client, char *password) +int webirc_local_pass(Client *client, const char *password) { if (!strncmp(password, WEBIRC_STRING, WEBIRC_STRINGLEN)) { + char buf[512]; char *ip, *host; ConfigItem_webirc *e; char *error = NULL; + /* Work on a copy as we may trash it */ + strlcpy(buf, password, sizeof(buf)); e = find_webirc(client, NULL, WEBIRC_PASS, &error); if (e) { @@ -467,7 +457,7 @@ int webirc_local_pass(Client *client, char *password) * The has been checked ip->host AND host->ip by CGI:IRC itself * already so we trust it. */ - ip = password + WEBIRC_STRINGLEN; + ip = buf + WEBIRC_STRINGLEN; host = strchr(ip, '_'); if (!host) { diff --git a/src/modules/webredir.c b/src/modules/webredir.c index d1261a0..13c3b41 100644 --- a/src/modules/webredir.c +++ b/src/modules/webredir.c @@ -29,7 +29,7 @@ ModuleHeader MOD_HEADER "1.0", "Do 301 redirect for HEAD/GET/POST/PUT commands", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; struct { @@ -116,36 +116,36 @@ int webredir_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) return 0; /* We are only interrested in set::webredir... */ - if (!ce || !ce->ce_varname || strcmp(ce->ce_varname, "webredir")) + if (!ce || !ce->name || strcmp(ce->name, "webredir")) return 0; nowebredir = 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!cep->ce_vardata) + if (!cep->value) { config_error("%s:%i: set::webredir::%s with no value", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_varname); + cep->file->filename, cep->line_number, cep->name); errors++; } - else if (!strcmp(cep->ce_varname, "url")) + else if (!strcmp(cep->name, "url")) { - if (!*cep->ce_vardata || strchr(cep->ce_vardata, ' ')) + if (!*cep->value || strchr(cep->value, ' ')) { config_error("%s:%i: set::webredir::%s with empty value", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_varname); + cep->file->filename, cep->line_number, cep->name); errors++; } - if (!strstr(cep->ce_vardata, "://") || !strcmp(cep->ce_vardata, "https://...")) + if (!strstr(cep->value, "://") || !strcmp(cep->value, "https://...")) { config_error("%s:%i: set::webredir::url needs to be a valid URL", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum); + cep->file->filename, cep->line_number); errors++; } if (has_url) { - config_warn_duplicate(cep->ce_fileptr->cf_filename, - cep->ce_varlinenum, "set::webredir::url"); + config_warn_duplicate(cep->file->filename, + cep->line_number, "set::webredir::url"); continue; } has_url = 1; @@ -153,14 +153,14 @@ int webredir_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) else { config_error("%s:%i: unknown directive set::webredir::%s", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_varname); + cep->file->filename, cep->line_number, cep->name); errors++; } } if (!has_url) { - config_error_missing(ce->ce_fileptr->cf_filename, ce->ce_varlinenum, + config_error_missing(ce->file->filename, ce->line_number, "set::webredir::url"); errors++; } @@ -177,14 +177,14 @@ int webredir_config_run(ConfigFile *cf, ConfigEntry *ce, int type) return 0; /* We are only interrested in set::webredir... */ - if (!ce || !ce->ce_varname || strcmp(ce->ce_varname, "webredir")) + if (!ce || !ce->name || strcmp(ce->name, "webredir")) return 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "url")) + if (!strcmp(cep->name, "url")) { - safe_strdup(cfg.url, cep->ce_vardata); + safe_strdup(cfg.url, cep->value); } } return 1; diff --git a/src/modules/websocket.c b/src/modules/websocket.c index 97cd7dd..73c9fcc 100644 --- a/src/modules/websocket.c +++ b/src/modules/websocket.c @@ -6,6 +6,7 @@ */ #include "unrealircd.h" +#include "dns.h" #define WEBSOCKET_VERSION "1.1.0" @@ -15,7 +16,7 @@ ModuleHeader MOD_HEADER WEBSOCKET_VERSION, "WebSocket support (RFC6455)", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; #if CHAR_MIN < 0 @@ -40,6 +41,8 @@ struct WebSocketUser { int lefttoparselen; /**< Length of lefttoparse buffer */ WebSocketType type; /**< WEBSOCKET_TYPE_BINARY or WEBSOCKET_TYPE_TEXT */ char *sec_websocket_protocol; /**< Only valid during parsing of the request, after that it is NULL again */ + char *forwarded; /**< Unparsed `Forwarded:` header, RFC 7239 */ + int secure; /**< If there is a Forwarded header, this indicates if the remote connection is secure */ }; #define WSU(client) ((WebSocketUser *)moddata_client(client, websocket_md).ptr) @@ -56,19 +59,33 @@ struct WebSocketUser { #define WSOP_PING 0x09 #define WSOP_PONG 0x0a +/* used to parse http Forwarded header (RFC 7239) */ +#define IPLEN 48 +#define FHEADER_NAMELEN 20 + +struct HTTPForwardedHeader +{ + int secure; + char hostname[HOSTLEN+1]; + char ip[IPLEN+1]; +}; + /* Forward declarations */ int websocket_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs); int websocket_config_run_ex(ConfigFile *cf, ConfigEntry *ce, int type, void *ptr); int websocket_packet_out(Client *from, Client *to, Client *intended_to, char **msg, int *length); -int websocket_packet_in(Client *client, char *readbuf, int *length); +int websocket_packet_in(Client *client, const char *readbuf, int *length); void websocket_mdata_free(ModData *m); -int websocket_handle_packet(Client *client, char *readbuf, int length); -int websocket_handle_handshake(Client *client, char *readbuf, int *length); +int websocket_handle_packet(Client *client, const char *readbuf, int length); +int websocket_handle_handshake(Client *client, const char *readbuf, int *length); int websocket_handshake_send_response(Client *client); -int websocket_handle_packet_ping(Client *client, char *buf, int len); -int websocket_handle_packet_pong(Client *client, char *buf, int len); +int websocket_handle_packet_ping(Client *client, const char *buf, int len); +int websocket_handle_packet_pong(Client *client, const char *buf, int len); int websocket_create_packet(int opcode, char **buf, int *len); -int websocket_send_pong(Client *client, char *buf, int len); +int websocket_send_pong(Client *client, const char *buf, int len); +int websocket_secure_connect(Client *client); +struct HTTPForwardedHeader *websocket_parse_forwarded_header(char *input); +int websocket_ip_compare(const char *ip1, const char *ip2); /* Global variables */ ModDataInfo *websocket_md; @@ -89,6 +106,7 @@ MOD_INIT() HookAdd(modinfo->handle, HOOKTYPE_CONFIGRUN_EX, 0, websocket_config_run_ex); HookAdd(modinfo->handle, HOOKTYPE_PACKET, INT_MAX, websocket_packet_out); HookAdd(modinfo->handle, HOOKTYPE_RAWPACKET_IN, INT_MIN, websocket_packet_in); + HookAdd(modinfo->handle, HOOKTYPE_SECURE_CONNECT, 0, websocket_secure_connect); memset(&mreq, 0, sizeof(mreq)); mreq.name = "websocket"; @@ -114,10 +132,6 @@ MOD_UNLOAD() return MOD_SUCCESS; } -#ifndef CheckNull - #define CheckNull(x) if ((!(x)->ce_vardata) || (!(*((x)->ce_vardata)))) { config_error("%s:%i: missing parameter", (x)->ce_fileptr->cf_filename, (x)->ce_varlinenum); errors++; continue; } -#endif - int websocket_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) { int errors = 0; @@ -129,16 +143,16 @@ int websocket_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) return 0; /* We are only interrested in listen::options::websocket.. */ - if (!ce || !ce->ce_varname || strcmp(ce->ce_varname, "websocket")) + if (!ce || !ce->name || strcmp(ce->name, "websocket")) return 0; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "type")) + if (!strcmp(cep->name, "type")) { CheckNull(cep); has_type = 1; - if (!strcmp(cep->ce_vardata, "text")) + if (!strcmp(cep->value, "text")) { if (non_utf8_nick_chars_in_use && !errored_once_nick) { @@ -153,19 +167,33 @@ int websocket_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) errors++; } } - else if (!strcmp(cep->ce_vardata, "binary")) + else if (!strcmp(cep->value, "binary")) { } else { config_error("%s:%i: listen::options::websocket::type must be either 'binary' or 'text' (not '%s')", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_vardata); + cep->file->filename, cep->line_number, cep->value); errors++; } + } else if (!strcmp(cep->name, "forward")) + { + if (!cep->value) + { + config_error_empty(cep->file->filename, cep->line_number, "listen::options::websocket::forward", cep->name); + errors++; + continue; + } + if (!is_valid_ip(cep->value)) + { + config_error("%s:%i: invalid IP address '%s' in listen::options::websocket::forward", cep->file->filename, cep->line_number, cep->value); + errors++; + continue; + } } else { config_error("%s:%i: unknown directive listen::options::websocket::%s", - cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_varname); + cep->file->filename, cep->line_number, cep->name); errors++; continue; } @@ -174,7 +202,7 @@ int websocket_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) if (!has_type) { config_error("%s:%i: websocket set, but type unspecified. Use something like: listen { ip *; port 443; websocket { type text; } }", - ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + ce->file->filename, ce->line_number); errors++; } @@ -192,18 +220,18 @@ int websocket_config_run_ex(ConfigFile *cf, ConfigEntry *ce, int type, void *ptr return 0; /* We are only interrested in listen::options::websocket.. */ - if (!ce || !ce->ce_varname || strcmp(ce->ce_varname, "websocket")) + if (!ce || !ce->name || strcmp(ce->name, "websocket")) return 0; l = (ConfigItem_listen *)ptr; - for (cep = ce->ce_entries; cep; cep = cep->ce_next) + for (cep = ce->items; cep; cep = cep->next) { - if (!strcmp(cep->ce_varname, "type")) + if (!strcmp(cep->name, "type")) { - if (!strcmp(cep->ce_vardata, "binary")) + if (!strcmp(cep->value, "binary")) l->websocket_options = WEBSOCKET_TYPE_BINARY; - else if (!strcmp(cep->ce_vardata, "text")) + else if (!strcmp(cep->value, "text")) { l->websocket_options = WEBSOCKET_TYPE_TEXT; if ((tempiConf.allowed_channelchars == ALLOWED_CHANNELCHARS_ANY) && !warned_once_channel) @@ -217,6 +245,9 @@ int websocket_config_run_ex(ConfigFile *cf, ConfigEntry *ce, int type, void *ptr warned_once_channel = 1; } } + } else if (!strcmp(cep->name, "forward")) + { + safe_strdup(l->websocket_forward, cep->value); } } return 1; @@ -230,6 +261,8 @@ void websocket_mdata_free(ModData *m) { safe_free(wsu->handshake_key); safe_free(wsu->lefttoparse); + safe_free(wsu->sec_websocket_protocol); + safe_free(wsu->forwarded); safe_free(m->ptr); } } @@ -239,6 +272,8 @@ void websocket_mdata_free(ModData *m) */ int websocket_packet_out(Client *from, Client *to, Client *intended_to, char **msg, int *length) { + static char utf8buf[510]; + if (MyConnect(to) && WSU(to) && WSU(to)->handshake_completed) { if (WEBSOCKET_TYPE(to) == WEBSOCKET_TYPE_BINARY) @@ -246,7 +281,7 @@ int websocket_packet_out(Client *from, Client *to, Client *intended_to, char **m else if (WEBSOCKET_TYPE(to) == WEBSOCKET_TYPE_TEXT) { /* Some more conversions are needed */ - char *safe_msg = unrl_utf8_make_valid(*msg); + char *safe_msg = unrl_utf8_make_valid(*msg, utf8buf, sizeof(utf8buf), 1); *msg = safe_msg; *length = *msg ? strlen(safe_msg) : 0; websocket_create_packet(WSOP_TEXT, msg, length); @@ -256,7 +291,7 @@ int websocket_packet_out(Client *from, Client *to, Client *intended_to, char **m return 0; } -int websocket_handle_websocket(Client *client, char *readbuf2, int length2) +int websocket_handle_websocket(Client *client, const char *readbuf2, int length2) { int n; char *ptr; @@ -308,9 +343,13 @@ int websocket_handle_websocket(Client *client, char *readbuf2, int length2) * 0 means: don't process this data, but you can read another packet if you want * >0 means: process this data (regular IRC data, non-websocket stuff) */ -int websocket_packet_in(Client *client, char *readbuf, int *length) +int websocket_packet_in(Client *client, const char *readbuf, int *length) { - if ((client->local->receiveM == 0) && WEBSOCKET_PORT(client) && !WSU(client) && (*length > 8) && !strncmp(readbuf, "GET ", 4)) + if ((client->local->traffic.messages_received == 0) && + WEBSOCKET_PORT(client) && + !WSU(client) && + (*length > 8) && + !strncmp(readbuf, "GET ", 4)) { /* Allocate a new WebSocketUser struct for this session */ moddata_client(client, websocket_md).ptr = safe_alloc(sizeof(WebSocketUser)); @@ -461,6 +500,141 @@ int websocket_handshake_helper(char *buffer, int len, char **key, char **value, return 0; } +#define FHEADER_STATE_NAME 0 +#define FHEADER_STATE_VALUE 1 +#define FHEADER_STATE_VALUE_QUOTED 2 + +#define FHEADER_ACTION_APPEND 0 +#define FHEADER_ACTION_IGNORE 1 +#define FHEADER_ACTION_PROCESS 2 + +/** If a valid Forwarded: http header is received from a trusted source (proxy server), this function will + * extract remote IP address and secure (https) status from it. If more than one field with same name is received, + * we'll accept the last one. This should work correctly with chained proxies. */ +struct HTTPForwardedHeader *websocket_parse_forwarded_header(char *input) +{ + static struct HTTPForwardedHeader forwarded; + int i, length; + int state = FHEADER_STATE_NAME, action = FHEADER_ACTION_APPEND; + char name[FHEADER_NAMELEN+1]; + char value[IPLEN+1]; + int name_length = 0; + int value_length = 0; + char c; + + memset(&forwarded, 0, sizeof(struct HTTPForwardedHeader)); + + length = strlen(input); + for (i = 0; i < length; i++) + { + c = input[i]; + switch (c) + { + case '"': + switch (state) + { + case FHEADER_STATE_NAME: + action = FHEADER_ACTION_APPEND; + break; + case FHEADER_STATE_VALUE: + action = FHEADER_ACTION_IGNORE; + state = FHEADER_STATE_VALUE_QUOTED; + break; + case FHEADER_STATE_VALUE_QUOTED: + action = FHEADER_ACTION_IGNORE; + state = FHEADER_STATE_VALUE; + break; + } + break; + case ',': case ';': case ' ': + switch (state) + { + case FHEADER_STATE_NAME: /* name without value */ + name_length = 0; + action = FHEADER_ACTION_IGNORE; + break; + case FHEADER_STATE_VALUE: /* end of value */ + action = FHEADER_ACTION_PROCESS; + break; + case FHEADER_STATE_VALUE_QUOTED: /* quoted character, process as normal */ + action = FHEADER_ACTION_APPEND; + break; + } + break; + case '=': + switch (state) + { + case FHEADER_STATE_NAME: /* end of name */ + name[name_length] = '\0'; + state = FHEADER_STATE_VALUE; + action = FHEADER_ACTION_IGNORE; + break; + case FHEADER_STATE_VALUE: case FHEADER_STATE_VALUE_QUOTED: /* none of the values is expected to contain = but proceed anyway */ + action = FHEADER_ACTION_APPEND; + break; + } + break; + default: + action = FHEADER_ACTION_APPEND; + break; + } + switch (action) + { + case FHEADER_ACTION_APPEND: + if (state == FHEADER_STATE_NAME) + { + if (name_length < FHEADER_NAMELEN) + { + name[name_length++] = c; + } else + { + /* truncate */ + } + } else + { + if (value_length < IPLEN) + { + value[value_length++] = c; + } else + { + /* truncate */ + } + } + break; + case FHEADER_ACTION_IGNORE: default: + break; + case FHEADER_ACTION_PROCESS: + value[value_length] = '\0'; + name[name_length] = '\0'; + if (!strcasecmp(name, "for")) + { + strlcpy(forwarded.ip, value, IPLEN+1); + } else if (!strcasecmp(name, "proto")) + { + if (!strcasecmp(value, "https")) + { + forwarded.secure = 1; + } else if (!strcasecmp(value, "http")) + { + forwarded.secure = 0; + } else + { + /* ignore unknown value */ + } + } else + { + /* ignore unknown field name */ + } + value_length = 0; + name_length = 0; + state = FHEADER_STATE_NAME; + break; + } + } + + return &forwarded; +} + /** Finally, validate the websocket request (handshake) and proceed or reject. */ int websocket_handshake_valid(Client *client) { @@ -468,7 +642,7 @@ int websocket_handshake_valid(Client *client) { if (is_module_loaded("webredir")) { - char *parx[2] = { NULL, NULL }; + const char *parx[2] = { NULL, NULL }; do_cmd(client, NULL, "GET", 1, parx); } dead_socket(client, "Invalid WebSocket request"); @@ -510,13 +684,83 @@ int websocket_handshake_valid(Client *client) safe_free(WSU(client)->sec_websocket_protocol); } } + if (WSU(client)->forwarded) + { + /* check for source ip */ + if (BadPtr(client->local->listener->websocket_forward) || !websocket_ip_compare(client->local->listener->websocket_forward, client->ip)) + { + unreal_log(ULOG_WARNING, "websocket", "UNAUTHORIZED_FORWARDED_HEADER", client, "Received unauthorized Forwarded header from $ip", log_data_string("ip", client->ip)); + dead_socket(client, "Forwarded: no access"); + return 0; + } + /* parse the header */ + struct HTTPForwardedHeader *forwarded; + forwarded = websocket_parse_forwarded_header(WSU(client)->forwarded); + /* check header values */ + if (!is_valid_ip(forwarded->ip)) + { + unreal_log(ULOG_WARNING, "websocket", "INVALID_FORWARDED_IP", client, "Received invalid IP in Forwarded header from $ip", log_data_string("ip", client->ip)); + dead_socket(client, "Forwarded: invalid IP"); + return 0; + } + /* store data */ + WSU(client)->secure = forwarded->secure; + safe_strdup(client->ip, forwarded->ip); + /* Update client->local->hostp */ + strlcpy(client->local->sockhost, forwarded->ip, sizeof(client->local->sockhost)); /* in case dns lookup fails or is disabled */ + /* (free old) */ + if (client->local->hostp) + { + unreal_free_hostent(client->local->hostp); + client->local->hostp = NULL; + } + /* (create new) */ + if (!DONT_RESOLVE) + { + /* taken from socket.c */ + struct hostent *he; + unrealdns_delreq_bycptr(client); /* in case the proxy ip is still in progress of being looked up */ + ClearDNSLookup(client); + he = unrealdns_doclient(client); /* call this once more */ + if (!client->local->hostp) + { + if (he) + client->local->hostp = he; + else + SetDNSLookup(client); + } else + { + /* Race condition detected, DNS has been done, continue with auth */ + } + } + /* blacklist_start_check() */ + if (RCallbacks[CALLBACKTYPE_BLACKLIST_CHECK] != NULL) + RCallbacks[CALLBACKTYPE_BLACKLIST_CHECK]->func.intfunc(client); + + /* Check (g)zlines right now; these are normally checked upon accept(), + * but since we know the IP only now after PASS/WEBIRC, we have to check + * here again... + */ + check_banned(client, 0); + } return 1; } +int websocket_secure_connect(Client *client) +{ + /* Remove secure mode (-z) if the WEBIRC gateway did not ensure + * us that their [client]--[webirc gateway] connection is also + * secure (eg: using https) + */ + if (IsSecureConnect(client) && WSU(client) && WSU(client)->forwarded && !WSU(client)->secure) + client->umodes &= ~UMODE_SECURE; + return 0; +} + /** Handle client GET WebSocket handshake. * Yes, I'm going to assume that the header fits in one packet and one packet only. */ -int websocket_handle_handshake(Client *client, char *readbuf, int *length) +int websocket_handle_handshake(Client *client, const char *readbuf, int *length) { char *key, *value; int r, end_of_request; @@ -566,12 +810,17 @@ int websocket_handle_handshake(Client *client, char *readbuf, int *length) { /* Save it here, will be processed later */ safe_strdup(WSU(client)->sec_websocket_protocol, value); + } else + if (!strcasecmp(key, "Forwarded")) + { + /* will be processed later too */ + safe_strdup(WSU(client)->forwarded, value); } } if (end_of_request) { - if (!websocket_handshake_valid(client)) + if (!websocket_handshake_valid(client) || IsDead(client)) return -1; websocket_handshake_send_response(client); return 0; @@ -589,16 +838,12 @@ int websocket_handle_handshake(Client *client, char *readbuf, int *length) int websocket_handshake_send_response(Client *client) { char buf[512], hashbuf[64]; - SHA_CTX hash; char sha1out[20]; /* 160 bits */ WSU(client)->handshake_completed = 1; snprintf(buf, sizeof(buf), "%s%s", WSU(client)->handshake_key, WEBSOCKET_MAGIC_KEY); - SHA1_Init(&hash); - SHA1_Update(&hash, buf, strlen(buf)); - SHA1_Final(sha1out, &hash); - + sha1hash_binary(sha1out, buf, strlen(buf)); b64_encode(sha1out, sizeof(sha1out), hashbuf, sizeof(hashbuf)); snprintf(buf, sizeof(buf), @@ -660,14 +905,16 @@ void add_lf_if_needed(char **buf, int *len) * OR 0 to indicate a possible short read (want more data) * OR -1 in case of an error. */ -int websocket_handle_packet(Client *client, char *readbuf, int length) +int websocket_handle_packet(Client *client, const char *readbuf, int length) { char opcode; /**< Opcode */ char masked; /**< Masked */ int len; /**< Length of the packet */ char maskkey[4]; /**< Key used for masking */ - char *p, *payload; + const char *p; int total_packet_size; + char *payload = NULL; + static char payloadbuf[READBUF_SIZE]; if (length < 4) { @@ -728,14 +975,20 @@ int websocket_handle_packet(Client *client, char *readbuf, int length) memcpy(maskkey, p, 4); p+= 4; - payload = (len > 0) ? p : NULL; + + if (len > 0) + { + memcpy(payloadbuf, p, len); + payload = payloadbuf; + } /* else payload is NULL */ if (len > 0) { /* Unmask this thing (page 33, section 5.3) */ int n; char v; - for (n = 0; n < len; n++) + char *p; + for (p = payload, n = 0; n < len; n++) { v = *p; *p++ = v ^ maskkey[n % 4]; @@ -777,7 +1030,7 @@ int websocket_handle_packet(Client *client, char *readbuf, int length) return -1; /* NOTREACHED */ } -int websocket_handle_packet_ping(Client *client, char *buf, int len) +int websocket_handle_packet_ping(Client *client, const char *buf, int len) { if (len > 500) { @@ -785,11 +1038,11 @@ int websocket_handle_packet_ping(Client *client, char *buf, int len) return -1; } websocket_send_pong(client, buf, len); - client->local->since++; /* lag penalty of 1 second */ + add_fake_lag(client, 1000); /* lag penalty of 1 second */ return 0; } -int websocket_handle_packet_pong(Client *client, char *buf, int len) +int websocket_handle_packet_pong(Client *client, const char *buf, int len) { /* We don't care */ return 0; @@ -799,7 +1052,7 @@ int websocket_handle_packet_pong(Client *client, char *buf, int len) * This is the simple version that is used ONLY for WSOP_PONG, * as it does not take \r\n into account. */ -int websocket_create_packet_simple(int opcode, char **buf, int *len) +int websocket_create_packet_simple(int opcode, const char **buf, int *len) { static char sendbuf[8192]; @@ -871,8 +1124,12 @@ int websocket_create_packet(int opcode, char **buf, int *len) if (bytes_in_sendbuf + bytes_single_frame > sizeof(sendbuf)) { /* Overflow. This should never happen. */ - sendto_ops("[websocket] [BUG] Overflow prevented: %d + %d > %d", - bytes_in_sendbuf, bytes_single_frame, (int)sizeof(sendbuf)); + unreal_log(ULOG_WARNING, "websocket", "BUG_WEBSOCKET_OVERFLOW", NULL, + "[BUG] [websocket] Overflow prevented in websocket_create_packet(): " + "$bytes_in_sendbuf + $bytes_single_frame > $sendbuf_size", + log_data_integer("bytes_in_sendbuf", bytes_in_sendbuf), + log_data_integer("bytes_single_frame", bytes_single_frame), + log_data_integer("sendbuf_size", sizeof(sendbuf))); return -1; } @@ -906,9 +1163,9 @@ int websocket_create_packet(int opcode, char **buf, int *len) } /** Create and send a WSOP_PONG frame */ -int websocket_send_pong(Client *client, char *buf, int len) +int websocket_send_pong(Client *client, const char *buf, int len) { - char *b = buf; + const char *b = buf; int l = len; if (websocket_create_packet_simple(WSOP_PONG, &b, &l) < 0) @@ -924,3 +1181,33 @@ int websocket_send_pong(Client *client, char *buf, int len) send_queued(client); return 0; } + +/** Compare IP addresses (for authorization checking) */ +int websocket_ip_compare(const char *ip1, const char *ip2) +{ + uint32_t ip4[2]; + uint16_t ip6[16]; + int i; + if (inet_pton(AF_INET, ip1, &ip4[0]) == 1) /* IPv4 */ + { + if (inet_pton(AF_INET, ip2, &ip4[1]) == 1) /* both are valid, let's compare */ + { + return ip4[0] == ip4[1]; + } + return 0; + } + if (inet_pton(AF_INET6, ip1, &ip6[0]) == 1) /* IPv6 */ + { + if (inet_pton(AF_INET6, ip2, &ip6[8]) == 1) + { + for (i = 0; i < 8; i++) + { + if (ip6[i] != ip6[i+8]) + return 0; + } + return 1; + } + } + return 0; /* neither valid IPv4 nor IPv6 */ +} + diff --git a/src/modules/who_old.c b/src/modules/who_old.c index df21686..d2a8572 100644 --- a/src/modules/who_old.c +++ b/src/modules/who_old.c @@ -36,7 +36,7 @@ ModuleHeader MOD_HEADER "5.0", /* Version */ "command /who (old version)", /* Short description of module */ "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; /* This is called on module init, before Server Ready */ @@ -64,12 +64,12 @@ MOD_UNLOAD() return MOD_SUCCESS; } -static void do_channel_who(Client *client, Channel *channel, char *mask); +static void do_channel_who(Client *client, Channel *channel, const char *mask); static void make_who_status(Client *, Client *, Channel *, Member *, char *, int); -static void do_other_who(Client *client, char *mask); -static void send_who_reply(Client *, Client *, char *, char *, char *); -static char *first_visible_channel(Client *, Client *, int *); -static int parse_who_options(Client *, int, char**); +static void do_other_who(Client *client, const char *mask); +static void send_who_reply(Client *, Client *, const char *, const char *, const char *); +static const char *first_visible_channel(Client *, Client *, int *); +static int parse_who_options(Client *, int, const char **); static void who_sendhelp(Client *); #define WF_OPERONLY 0x01 /**< only show opers */ @@ -93,19 +93,19 @@ static int who_flags; struct { int want_away; int want_channel; - char *channel; /**< if they want one */ + const char *channel; /**< if they want one */ int want_gecos; - char *gecos; + const char *gecos; int want_server; - char *server; + const char *server; int want_host; - char *host; + const char *host; int want_nick; - char *nick; + const char *nick; int want_user; - char *user; + const char *user; int want_ip; - char *ip; + const char *ip; int want_port; int port; int want_umode; @@ -118,8 +118,8 @@ struct { CMD_FUNC(cmd_who) { Channel *target_channel; - char *mask = parv[1]; - char star[] = "*"; + const char *mask = parv[1]; + char maskbuf[512]; int i = 0; if (!MyUser(client)) @@ -139,14 +139,17 @@ CMD_FUNC(cmd_who) } if (parc-i < 2 || strcmp(parv[1 + i], "0") == 0) - mask = star; + mask = "*"; else mask = parv[1 + i]; if (!i && parc > 2 && *parv[2] == 'o') who_flags |= WF_OPERONLY; - collapse(mask); + /* Pfff... collapse... hate it! */ + strlcpy(maskbuf, mask, sizeof(maskbuf)); + collapse(maskbuf); + mask = maskbuf; if (*mask == '\0') { @@ -155,7 +158,7 @@ CMD_FUNC(cmd_who) return; } - if ((target_channel = find_channel(mask, NULL)) != NULL) + if ((target_channel = find_channel(mask)) != NULL) { do_channel_who(client, target_channel, mask); sendnumeric(client, RPL_ENDOFWHO, mask); @@ -163,7 +166,7 @@ CMD_FUNC(cmd_who) } if (wfl.channel && wfl.want_channel == WHO_WANT && - (target_channel = find_channel(wfl.channel, NULL)) != NULL) + (target_channel = find_channel(wfl.channel)) != NULL) { do_channel_who(client, target_channel, mask); sendnumeric(client, RPL_ENDOFWHO, mask); @@ -247,11 +250,11 @@ static void who_sendhelp(Client *client) #define WHO_ADD 1 #define WHO_DEL 2 -static int parse_who_options(Client *client, int argc, char **argv) +static int parse_who_options(Client *client, int argc, const char **argv) { -char *s = argv[0]; -int what = WHO_ADD; -int i = 1; + const char *s = argv[0]; + int what = WHO_ADD; + int i = 1; /* A few helper macro's because this is used a lot, added during recode by Syzop. */ @@ -319,7 +322,7 @@ int i = 1; case 'm': REQUIRE_PARAM() { - char *s = argv[i]; + const char *s = argv[i]; int *umodes; if (what == WHO_ADD) @@ -327,17 +330,7 @@ int i = 1; else umodes = &wfl.umodes_dontwant; - while (*s) - { - int i; - for (i = 0; i <= Usermode_highest; i++) - if (*s == Usermode_Table[i].flag) - { - *umodes |= Usermode_Table[i].mode; - break; - } - s++; - } + *umodes = set_usermode(s); if (!IsOper(client)) *umodes = *umodes & UMODE_OPER; /* these are usermodes regular users may search for. just oper now. */ @@ -418,7 +411,7 @@ static int can_see(Client *requester, Client *target, Channel *channel) /* if they only want people on a certain channel. */ if (wfl.want_channel != WHO_DONTCARE) { - Channel *chan = find_channel(wfl.channel, NULL); + Channel *chan = find_channel(wfl.channel); if (!chan && wfl.want_channel == WHO_WANT) return WHO_CANTSEE; if ((wfl.want_channel == WHO_WANT) && !IsMember(target, chan)) @@ -587,7 +580,7 @@ static int can_see(Client *requester, Client *target, Channel *channel) } } -static void do_channel_who(Client *client, Channel *channel, char *mask) +static void do_channel_who(Client *client, Channel *channel, const char *mask) { Member *cm = channel->members; if (IsMember(client, channel) || ValidatePermissionsForPath("channel:see:who:onchannel",client,NULL,channel,NULL)) @@ -602,7 +595,7 @@ static void do_channel_who(Client *client, Channel *channel, char *mask) continue; make_who_status(client, acptr, channel, cm, status, cansee); - send_who_reply(client, acptr, channel->chname, status, ""); + send_who_reply(client, acptr, channel->name, status, ""); } } @@ -617,7 +610,7 @@ static void make_who_status(Client *client, Client *acptr, Channel *channel, else status[i++] = 'H'; - if (IsARegNick(acptr)) + if (IsRegNick(acptr)) status[i++] = 'r'; if (IsSecureConnect(acptr)) @@ -643,39 +636,23 @@ static void make_who_status(Client *client, Client *acptr, Channel *channel, { if (HasCapability(client, "multi-prefix")) { -#ifdef PREFIX_AQ - if (cm->flags & CHFL_CHANOWNER) - status[i++] = '~'; - if (cm->flags & CHFL_CHANADMIN) - status[i++] = '&'; -#endif - if (cm->flags & CHFL_CHANOP) - status[i++] = '@'; - if (cm->flags & CHFL_HALFOP) - status[i++] = '%'; - if (cm->flags & CHFL_VOICE) - status[i++] = '+'; - } else { -#ifdef PREFIX_AQ - if (cm->flags & CHFL_CHANOWNER) - status[i++] = '~'; - else if (cm->flags & CHFL_CHANADMIN) - status[i++] = '&'; - else -#endif - if (cm->flags & CHFL_CHANOP) - status[i++] = '@'; - else if (cm->flags & CHFL_HALFOP) - status[i++] = '%'; - else if (cm->flags & CHFL_VOICE) - status[i++] = '+'; + /* Standard NAMES reply (single character) */ + char c = mode_to_prefix(*cm->member_modes); + if (c) + status[i++] = c; + } + else + { + /* NAMES reply with all rights included (multi-prefix / NAMESX) */ + strcpy(&status[i], modes_to_prefix(cm->member_modes)); + i += strlen(&status[i]); } } status[i] = '\0'; } -static void do_other_who(Client *client, char *mask) +static void do_other_who(Client *client, const char *mask) { int oper = IsOper(client); @@ -690,7 +667,7 @@ int oper = IsOper(client); { int cansee; char status[20]; - char *channel; + const char *channel; int flg; if (!IsUser(acptr)) @@ -733,7 +710,7 @@ matchok: Client *acptr = find_client(mask, NULL); int cansee; char status[20]; - char *channel; + const char *channel; int flg; if (!acptr) @@ -749,10 +726,10 @@ matchok: } static void send_who_reply(Client *client, Client *acptr, - char *channel, char *status, char *xstat) + const char *channel, const char *status, const char *xstat) { char *stat; - char *host; + const char *host; int flat = (FLAT_MAP && !IsOper(client)) ? 1 : 0; stat = safe_alloc(strlen(status) + strlen(xstat) + 1); @@ -799,7 +776,7 @@ static void send_who_reply(Client *client, Client *acptr, safe_free(stat); } -static char *first_visible_channel(Client *client, Client *acptr, int *flg) +static const char *first_visible_channel(Client *client, Client *acptr, int *flg) { Membership *lp; @@ -857,7 +834,7 @@ static char *first_visible_channel(Client *client, Client *acptr, int *flg) *flg |= FVC_HIDDEN; if (showchannel) - return channel->chname; + return channel->name; } /* no channels that they can see */ diff --git a/src/modules/whois.c b/src/modules/whois.c index c99b7fd..125fd17 100644 --- a/src/modules/whois.c +++ b/src/modules/whois.c @@ -1,7 +1,8 @@ /* * Unreal Internet Relay Chat Daemon, src/modules/whois.c * (C) 2000-2001 Carsten V. Munk and the UnrealIRCd Team - * Moved to modules by Fish (Justin Hammond) + * (C) 2003-2021 Bram Matthys and the UnrealIRCd team + * Moved to modules by Fish (Justin Hammond) in 2001 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,54 +21,278 @@ #include "unrealircd.h" -static char buf[BUFSIZE]; - -CMD_FUNC(cmd_whois); - -#define MSG_WHOIS "WHOIS" - +/* Structs */ ModuleHeader MOD_HEADER = { "whois", /* Name of module */ "5.0", /* Version */ "command /whois", /* Short description of module */ "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; -/* This is called on module init, before Server Ready */ -MOD_INIT() +typedef enum WhoisConfigUser { + WHOIS_CONFIG_USER_EVERYONE = 1, + WHOIS_CONFIG_USER_SELF = 2, + WHOIS_CONFIG_USER_OPER = 3, +} WhoisConfigUser; +#define HIGHEST_WHOIS_CONFIG_USER_VALUE 3 /* adjust this if you edit the enum above !! */ + +//this one is in include/struct.h because it needs full API exposure: +//typedef enum WhoisConfigDetails { +// ... +//} WhoisConfigDetails; +// + +typedef struct WhoisConfig WhoisConfig; +struct WhoisConfig { + WhoisConfig *prev, *next; + char *name; + WhoisConfigDetails permissions[HIGHEST_WHOIS_CONFIG_USER_VALUE+1]; +}; + +/* Global variables */ +static char buf[BUFSIZE]; +WhoisConfig *whoisconfig = NULL; + +/* Forward declarations */ +WhoisConfigDetails _whois_get_policy(Client *client, Client *target, const char *name); +CMD_FUNC(cmd_whois); +static int whois_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs); +static int whois_config_run(ConfigFile *cf, ConfigEntry *ce, int type); +static void whois_config_setdefaults(void); + +MOD_TEST() { - CommandAdd(modinfo->handle, MSG_WHOIS, cmd_whois, MAXPARA, CMD_USER); MARK_AS_OFFICIAL_MODULE(modinfo); + EfunctionAdd(modinfo->handle, EFUNC_WHOIS_GET_POLICY, TO_INTFUNC(_whois_get_policy)); + HookAdd(modinfo->handle, HOOKTYPE_CONFIGTEST, 0, whois_config_test); + return MOD_SUCCESS; +} + +MOD_INIT() +{ + MARK_AS_OFFICIAL_MODULE(modinfo); + CommandAdd(modinfo->handle, "WHOIS", cmd_whois, MAXPARA, CMD_USER); + HookAdd(modinfo->handle, HOOKTYPE_CONFIGRUN, 0, whois_config_run); + whois_config_setdefaults(); return MOD_SUCCESS; } -/* Is first run when server is 100% ready */ MOD_LOAD() { return MOD_SUCCESS; } -/* Called when module is unloaded */ MOD_UNLOAD() { return MOD_SUCCESS; } +static WhoisConfig *find_whois_config(const char *name) +{ + WhoisConfig *w; + for (w = whoisconfig; w; w = w->next) + if (!strcmp(w->name, name)) + return w; + return NULL; +} -/* -** cmd_whois -** parv[1] = nickname masklist -*/ +/* Lazy helper for whois_config_setdefaults */ +static void whois_config_add(const char *name, WhoisConfigUser user, WhoisConfigDetails details) +{ + WhoisConfig *w = find_whois_config(name); + + if (!w) + { + /* New one */ + w = safe_alloc(sizeof(WhoisConfig)); + safe_strdup(w->name, name); + AddListItem(w, whoisconfig); + } + w->permissions[user] = details; +} + +static void whois_config_setdefaults(void) +{ + whois_config_add("basic", WHOIS_CONFIG_USER_EVERYONE, WHOIS_CONFIG_DETAILS_FULL); + + whois_config_add("modes", WHOIS_CONFIG_USER_SELF, WHOIS_CONFIG_DETAILS_FULL); + whois_config_add("modes", WHOIS_CONFIG_USER_OPER, WHOIS_CONFIG_DETAILS_FULL); + + whois_config_add("realhost", WHOIS_CONFIG_USER_SELF, WHOIS_CONFIG_DETAILS_FULL); + whois_config_add("realhost", WHOIS_CONFIG_USER_OPER, WHOIS_CONFIG_DETAILS_FULL); + + whois_config_add("registered-nick", WHOIS_CONFIG_USER_EVERYONE, WHOIS_CONFIG_DETAILS_FULL); + + whois_config_add("channels", WHOIS_CONFIG_USER_EVERYONE, WHOIS_CONFIG_DETAILS_LIMITED); + whois_config_add("channels", WHOIS_CONFIG_USER_SELF, WHOIS_CONFIG_DETAILS_FULL); + whois_config_add("channels", WHOIS_CONFIG_USER_OPER, WHOIS_CONFIG_DETAILS_FULL); + + whois_config_add("server", WHOIS_CONFIG_USER_EVERYONE, WHOIS_CONFIG_DETAILS_FULL); + + whois_config_add("away", WHOIS_CONFIG_USER_EVERYONE, WHOIS_CONFIG_DETAILS_FULL); + + whois_config_add("oper", WHOIS_CONFIG_USER_EVERYONE, WHOIS_CONFIG_DETAILS_LIMITED); + whois_config_add("oper", WHOIS_CONFIG_USER_SELF, WHOIS_CONFIG_DETAILS_FULL); + whois_config_add("oper", WHOIS_CONFIG_USER_OPER, WHOIS_CONFIG_DETAILS_FULL); + + whois_config_add("secure", WHOIS_CONFIG_USER_EVERYONE, WHOIS_CONFIG_DETAILS_LIMITED); + whois_config_add("secure", WHOIS_CONFIG_USER_SELF, WHOIS_CONFIG_DETAILS_FULL); + whois_config_add("secure", WHOIS_CONFIG_USER_OPER, WHOIS_CONFIG_DETAILS_FULL); + + whois_config_add("bot", WHOIS_CONFIG_USER_EVERYONE, WHOIS_CONFIG_DETAILS_FULL); + + whois_config_add("services", WHOIS_CONFIG_USER_EVERYONE, WHOIS_CONFIG_DETAILS_FULL); + + whois_config_add("reputation", WHOIS_CONFIG_USER_OPER, WHOIS_CONFIG_DETAILS_FULL); + + whois_config_add("geo", WHOIS_CONFIG_USER_OPER, WHOIS_CONFIG_DETAILS_FULL); + + whois_config_add("certfp", WHOIS_CONFIG_USER_EVERYONE, WHOIS_CONFIG_DETAILS_FULL); + + whois_config_add("shunned", WHOIS_CONFIG_USER_OPER, WHOIS_CONFIG_DETAILS_FULL); + + whois_config_add("account", WHOIS_CONFIG_USER_EVERYONE, WHOIS_CONFIG_DETAILS_FULL); + + whois_config_add("swhois", WHOIS_CONFIG_USER_EVERYONE, WHOIS_CONFIG_DETAILS_FULL); + + whois_config_add("idle", WHOIS_CONFIG_USER_EVERYONE, WHOIS_CONFIG_DETAILS_LIMITED); + whois_config_add("idle", WHOIS_CONFIG_USER_SELF, WHOIS_CONFIG_DETAILS_FULL); + whois_config_add("idle", WHOIS_CONFIG_USER_OPER, WHOIS_CONFIG_DETAILS_FULL); +} + +static void whois_free_config(void) +{ +} + +static WhoisConfigUser whois_config_user_strtovalue(const char *str) +{ + if (!strcmp(str, "everyone")) + return WHOIS_CONFIG_USER_EVERYONE; + if (!strcmp(str, "self")) + return WHOIS_CONFIG_USER_SELF; + if (!strcmp(str, "oper")) + return WHOIS_CONFIG_USER_OPER; + return 0; +} + +static WhoisConfigDetails whois_config_details_strtovalue(const char *str) +{ + if (!strcmp(str, "full")) + return WHOIS_CONFIG_DETAILS_FULL; + if (!strcmp(str, "limited")) + return WHOIS_CONFIG_DETAILS_LIMITED; + if (!strcmp(str, "none")) + return WHOIS_CONFIG_DETAILS_NONE; + return 0; +} + +static int whois_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) +{ + int errors = 0; + ConfigEntry *cep, *cepp; + + if (type != CONFIG_SET) + return 0; + + /* We are only interrested in set::whois-details.. */ + if (!ce || strcmp(ce->name, "whois-details")) + return 0; + + for (cep = ce->items; cep; cep = cep->next) + { + if (cep->value) + { + config_error("%s:%i: set::whois-details::%s item has a value, which is unexpected. Check your syntax!", + cep->file->filename, cep->line_number, cep->name); + errors++; + continue; + } + for (cepp = cep->items; cepp; cepp = cepp->next) + { + if (!whois_config_user_strtovalue(cepp->name)) + { + config_error("%s:%i: set::whois-details::%s contains unknown user category called '%s', must be one of: everyone, self, ircop", + cepp->file->filename, cepp->line_number, cep->name, cepp->name); + errors++; + continue; + } else + if (!cepp->value || !whois_config_details_strtovalue(cepp->value)) + { + config_error("%s:%i: set::whois-details::%s contains unknown details type '%s', must be one of: full, limited, none", + cepp->file->filename, cepp->line_number, cep->name, cepp->name); + errors++; + continue; + } /* else it is good */ + } + } + + *errs = errors; + return errors ? -1 : 1; +} + +static int whois_config_run(ConfigFile *cf, ConfigEntry *ce, int type) +{ + ConfigEntry *cep, *cepp; + + if (type != CONFIG_SET) + return 0; + + /* We are only interrested in set::whois-details.. */ + if (!ce || strcmp(ce->name, "whois-details")) + return 0; + + for (cep = ce->items; cep; cep = cep->next) + { + WhoisConfig *w = find_whois_config(cep->name); + if (!w) + { + /* New one */ + w = safe_alloc(sizeof(WhoisConfig)); + safe_strdup(w->name, cep->name); + AddListItem(w, whoisconfig); + } + for (cepp = cep->items; cepp; cepp = cepp->next) + { + WhoisConfigUser user = whois_config_user_strtovalue(cepp->name); + WhoisConfigDetails details = whois_config_details_strtovalue(cepp->value); + w->permissions[user] = details; + } + } + return 1; +} + +/** Get set::whois-details policy for an item. + * @param client The client doing the /WHOIS + * @param target The client being whoised, so the one to show all details for + * @param name The name of the whois item (eg "modes") + */ +WhoisConfigDetails _whois_get_policy(Client *client, Client *target, const char *name) +{ + WhoisConfig *w = find_whois_config(name); + if (!w) + return WHOIS_CONFIG_DETAILS_DEFAULT; + if ((client == target) && (w->permissions[WHOIS_CONFIG_USER_SELF] > 0)) + return w->permissions[WHOIS_CONFIG_USER_SELF]; + if (IsOper(client) && (w->permissions[WHOIS_CONFIG_USER_OPER] > 0)) + return w->permissions[WHOIS_CONFIG_USER_OPER]; + if (w->permissions[WHOIS_CONFIG_USER_EVERYONE] > 0) + return w->permissions[WHOIS_CONFIG_USER_EVERYONE]; + return WHOIS_CONFIG_DETAILS_NONE; +} + +/* WHOIS command. + * parv[1] = list of nicks (comma separated) + */ CMD_FUNC(cmd_whois) { Membership *lp; Client *target; Channel *channel; - char *nick, *tmp, *name; + char *nick, *tmp; char *p = NULL; - int found, len, mlen; + int len, mlen; char querybuf[BUFSIZE]; int ntargets = 0; int maxtargets = max_targets_for_command("WHOIS"); @@ -80,7 +305,7 @@ CMD_FUNC(cmd_whois) if (parc > 2) { - if (hunt_server(client, recv_mtags, ":%s WHOIS %s :%s", 1, parc, parv) != HUNTED_ISME) + if (hunt_server(client, recv_mtags, "WHOIS", 1, parc, parv) != HUNTED_ISME) return; parv[1] = parv[2]; } @@ -90,6 +315,8 @@ CMD_FUNC(cmd_whois) for (tmp = canonize(parv[1]); (nick = strtoken(&p, tmp, ",")); tmp = NULL) { unsigned char showchannel, wilds, hideoper; /* <- these are all boolean-alike */ + NameValuePrioList *list = NULL, *e; + int policy; /* for temporary stuff */ if (MyUser(client) && (++ntargets > maxtargets)) { @@ -97,55 +324,62 @@ CMD_FUNC(cmd_whois) break; } - found = 0; /* We do not support "WHOIS *" */ wilds = (strchr(nick, '?') || strchr(nick, '*')); if (wilds) continue; - if ((target = find_person(nick, NULL))) + target = find_user(nick, NULL); + if (!target) { - /* - * 'Rules' established for sending a WHOIS reply: - * - only send replies about common or public channels - * the target user(s) are on; - */ + sendnumeric(client, ERR_NOSUCHNICK, nick); + continue; + } - if (!IsUser(target)) - continue; + /* Ok, from this point we are going to proceed with the WHOIS. + * The idea here is NOT to send any lines, so don't call sendto functions. + * Instead, use add_nvplist_numeric() and add_nvplist_numeric_fmt() + * to add items to the whois list. + * Then at the end of this loop we call modules who can also add/remove + * whois lines, and only after that we FINALLY send all the whois lines + * in one go. + */ - name = (!*target->name) ? "?" : target->name; + hideoper = 0; + if (IsHideOper(target) && (target != client) && !IsOper(client)) + hideoper = 1; - hideoper = 0; - if (IsHideOper(target) && (target != client) && !IsOper(client)) - hideoper = 1; + if (whois_get_policy(client, target, "basic") > WHOIS_CONFIG_DETAILS_NONE) + { + add_nvplist_numeric(&list, -1000000, "basic", client, RPL_WHOISUSER, target->name, + target->user->username, + IsHidden(target) ? target->user->virthost : target->user->realhost, + target->info); + } - sendnumeric(client, RPL_WHOISUSER, name, - target->user->username, - IsHidden(target) ? target->user->virthost : target->user->realhost, - target->info); + if (whois_get_policy(client, target, "modes") > WHOIS_CONFIG_DETAILS_NONE) + { + add_nvplist_numeric(&list, -100000, "modes", client, RPL_WHOISMODES, target->name, + get_usermode_string(target), target->user->snomask ? target->user->snomask : ""); + } + if (whois_get_policy(client, target, "realhost") > WHOIS_CONFIG_DETAILS_NONE) + { + add_nvplist_numeric(&list, -90000, "realhost", client, RPL_WHOISHOST, target->name, + (MyConnect(target) && strcmp(target->ident, "unknown")) ? target->ident : "*", + target->user->realhost, target->ip ? target->ip : ""); + } - if (IsOper(client) || target == client) - { - char sno[128]; - strlcpy(sno, get_snomask_string(target), sizeof(sno)); - - /* send the target user's modes */ - sendnumeric(client, RPL_WHOISMODES, name, - get_usermode_string(target), sno[1] == 0 ? "" : sno); - } - if ((target == client) || IsOper(client)) - { - sendnumeric(client, RPL_WHOISHOST, target->name, - (MyConnect(target) && strcmp(target->ident, "unknown")) ? target->ident : "*", - target->user->realhost, target->ip ? target->ip : ""); - } + if (IsRegNick(target) && (whois_get_policy(client, target, "registered-nick") > WHOIS_CONFIG_DETAILS_NONE)) + { + add_nvplist_numeric(&list, -80000, "registered-nick", client, RPL_WHOISREGNICK, target->name); + } - if (IsARegNick(target)) - sendnumeric(client, RPL_WHOISREGNICK, name); - - found = 1; - mlen = strlen(me.name) + strlen(client->name) + 10 + strlen(name); + /* The following code deals with channels */ + policy = whois_get_policy(client, target, "channels"); + if (policy > WHOIS_CONFIG_DETAILS_NONE) + { + int channel_whois_lines = 0; + mlen = strlen(me.name) + strlen(client->name) + 10 + strlen(target->name); for (len = 0, *buf = '\0', lp = target->user->channel; lp; lp = lp->next) { Hook *h; @@ -181,7 +415,12 @@ CMD_FUNC(cmd_whois) if (ret == EX_DENY) showchannel = 0; - if (!showchannel && (ValidatePermissionsForPath("channel:see:whois",client,NULL,channel,NULL))) + /* If the channel is normally hidden, but the user is an IRCOp, + * and has the channel:see:whois privilege, + * and set::whois-details for 'channels' has 'oper full', + * then show it: + */ + if (!showchannel && (ValidatePermissionsForPath("channel:see:whois",client,NULL,channel,NULL)) && (policy == WHOIS_CONFIG_DETAILS_FULL)) { showchannel = 1; /* OperOverride */ operoverride = 1; @@ -190,19 +429,19 @@ CMD_FUNC(cmd_whois) if ((ret == EX_ALWAYS_DENY) && (target != client)) continue; /* a module asked us to really not expose this channel, so we don't (except target==ourselves). */ - if (target == client) + /* This deals with target==client but also for unusual set::whois-details overrides + * such as 'everyone full' + */ + if (policy == WHOIS_CONFIG_DETAILS_FULL) showchannel = 1; if (showchannel) { - long access; - if (len + strlen(channel->chname) > (size_t)BUFSIZE - 4 - mlen) + if (len + strlen(channel->name) > (size_t)BUFSIZE - 4 - mlen) { - sendto_one(client, NULL, - ":%s %d %s %s :%s", - me.name, - RPL_WHOISCHANNELS, - client->name, name, buf); + add_nvplist_numeric_fmt(&list, -70500-channel_whois_lines, "channels", client, RPL_WHOISCHANNELS, + "%s :%s", target->name, buf); + channel_whois_lines++; *buf = '\0'; len = 0; } @@ -224,125 +463,152 @@ CMD_FUNC(cmd_whois) } } - access = get_access(target, channel); if (!MyUser(client) || !HasCapability(client, "multi-prefix")) { -#ifdef PREFIX_AQ - if (access & CHFL_CHANOWNER) - *(buf + len++) = '~'; - else if (access & CHFL_CHANADMIN) - *(buf + len++) = '&'; - else -#endif - if (access & CHFL_CHANOP) - *(buf + len++) = '@'; - else if (access & CHFL_HALFOP) - *(buf + len++) = '%'; - else if (access & CHFL_VOICE) - *(buf + len++) = '+'; + /* Standard NAMES reply (single character) */ + char c = mode_to_prefix(*lp->member_modes); + if (c) + *(buf + len++) = c; } else { -#ifdef PREFIX_AQ - if (access & CHFL_CHANOWNER) - *(buf + len++) = '~'; - if (access & CHFL_CHANADMIN) - *(buf + len++) = '&'; -#endif - if (access & CHFL_CHANOP) - *(buf + len++) = '@'; - if (access & CHFL_HALFOP) - *(buf + len++) = '%'; - if (access & CHFL_VOICE) - *(buf + len++) = '+'; + /* NAMES reply with all rights included (multi-prefix / NAMESX) */ + strcpy(buf + len, modes_to_prefix(lp->member_modes)); + len += strlen(buf + len); } if (len) *(buf + len) = '\0'; - strcpy(buf + len, channel->chname); - len += strlen(channel->chname); + strcpy(buf + len, channel->name); + len += strlen(channel->name); strcat(buf + len, " "); len++; } } if (buf[0] != '\0') - sendnumeric(client, RPL_WHOISCHANNELS, name, buf); - - if (!(IsULine(target) && !IsOper(client) && HIDE_ULINES)) - sendnumeric(client, RPL_WHOISSERVER, name, target->user->server, - target->srvptr ? target->srvptr->info : "*Not On This Net*"); - - if (target->user->away) - sendnumeric(client, RPL_AWAY, name, target->user->away); - - if (IsOper(target) && !hideoper) { - buf[0] = '\0'; - if (IsOper(target)) - strlcat(buf, "an IRC Operator", sizeof buf); - - else - strlcat(buf, "a Local IRC Operator", sizeof buf); - if (buf[0]) - { - if (IsOper(client) && MyUser(target)) - { - char *operclass = "???"; - ConfigItem_oper *oper = find_oper(target->user->operlogin); - if (oper && oper->operclass) - operclass = oper->operclass; - sendto_one(client, NULL, - ":%s 313 %s %s :is %s (%s) [%s]", me.name, - client->name, name, buf, - target->user->operlogin ? target->user->operlogin : "unknown", - operclass); - } - else - sendnumeric(client, RPL_WHOISOPERATOR, name, buf); - } - } - - if (target->umodes & UMODE_SECURE) - sendnumeric(client, RPL_WHOISSECURE, name, - "is using a Secure Connection"); - - RunHook2(HOOKTYPE_WHOIS, client, target); - - if (IsOper(client) && MyUser(target) && IsShunned(target)) - { - sendto_one(client, NULL, ":%s %d %s %s :is shunned", - me.name, RPL_WHOISSPECIAL, client->name, target->name); - } - - if (target->user->swhois && !hideoper) - { - SWhois *s; - - for (s = target->user->swhois; s; s = s->next) - sendto_one(client, NULL, ":%s %d %s %s :%s", - me.name, RPL_WHOISSPECIAL, client->name, - name, s->line); - } - - /* - * display services account name if it's actually a services account name and - * not a legacy timestamp. --nenolod - */ - if (!isdigit(*target->user->svid)) - sendnumeric(client, RPL_WHOISLOGGEDIN, name, target->user->svid); - - /* - * Umode +I hides an oper's idle time from regular users. - * -Nath. - */ - if (MyConnect(target) && !hide_idle_time(client, target)) - { - sendnumeric(client, RPL_WHOISIDLE, name, - TStime() - target->local->last, target->local->firsttime); + add_nvplist_numeric_fmt(&list, -70500-channel_whois_lines, "channels", client, RPL_WHOISCHANNELS, + "%s :%s", target->name, buf); + channel_whois_lines++; } } - if (!found) - sendnumeric(client, ERR_NOSUCHNICK, nick); + + if (!(IsULine(target) && !IsOper(client) && HIDE_ULINES) && + whois_get_policy(client, target, "server") > WHOIS_CONFIG_DETAILS_NONE) + { + add_nvplist_numeric(&list, -60000, "server", client, RPL_WHOISSERVER, + target->name, target->user->server, target->uplink->info); + } + + if (target->user->away && (whois_get_policy(client, target, "away") > WHOIS_CONFIG_DETAILS_NONE)) + { + add_nvplist_numeric(&list, -50000, "away", client, RPL_AWAY, + target->name, target->user->away); + } + + if (IsOper(target) && !hideoper) + { + policy = whois_get_policy(client, target, "oper"); + if (policy == WHOIS_CONFIG_DETAILS_FULL) + { + const char *operlogin = get_operlogin(target); + const char *operclass = get_operclass(target); + + if (operlogin && operclass) + { + add_nvplist_numeric_fmt(&list, -40000, "oper", client, RPL_WHOISOPERATOR, + "%s :is %s (%s) [%s]", + target->name, "an IRC Operator", operlogin, operclass); + } else + if (operlogin) + { + add_nvplist_numeric_fmt(&list, -40000, "oper", client, RPL_WHOISOPERATOR, + "%s :is %s (%s)", + target->name, "an IRC Operator", operlogin); + } else + { + add_nvplist_numeric(&list, -40000, "oper", client, RPL_WHOISOPERATOR, + target->name, "an IRC Operator"); + } + } else + if (policy == WHOIS_CONFIG_DETAILS_LIMITED) + { + add_nvplist_numeric(&list, -40000, "oper", client, RPL_WHOISOPERATOR, + target->name, "an IRC Operator"); + } + } + + if (target->umodes & UMODE_SECURE) + { + policy = whois_get_policy(client, target, "secure"); + if (policy == WHOIS_CONFIG_DETAILS_LIMITED) + { + add_nvplist_numeric(&list, -30000, "secure", client, RPL_WHOISSECURE, + target->name, "is using a Secure Connection"); + } else + if (policy == WHOIS_CONFIG_DETAILS_FULL) + { + const char *ciphers = tls_get_cipher(target); + if (ciphers) + { + add_nvplist_numeric_fmt(&list, -30000, "secure", client, RPL_WHOISSECURE, + "%s :is using a Secure Connection [%s]", + target->name, ciphers); + } else { + add_nvplist_numeric(&list, -30000, "secure", client, RPL_WHOISSECURE, + target->name, "is using a Secure Connection"); + } + } + } + + if (MyUser(target) && IsShunned(target) && (whois_get_policy(client, target, "shunned") > WHOIS_CONFIG_DETAILS_NONE)) + { + add_nvplist_numeric(&list, -20000, "shunned", client, RPL_WHOISSPECIAL, + target->name, "is shunned"); + } + + if (target->user->swhois && !hideoper && (whois_get_policy(client, target, "swhois") > WHOIS_CONFIG_DETAILS_NONE)) + { + SWhois *s; + int swhois_lines = 0; + + for (s = target->user->swhois; s; s = s->next) + { + add_nvplist_numeric(&list, 100000+swhois_lines, "swhois", client, RPL_WHOISSPECIAL, + target->name, s->line); + swhois_lines++; + } + } + + /* TODO: hmm.. this should be a bit more towards the beginning of the whois, no ? */ + if (IsLoggedIn(target) && (whois_get_policy(client, target, "account") > WHOIS_CONFIG_DETAILS_NONE)) + { + add_nvplist_numeric(&list, 200000, "account", client, RPL_WHOISLOGGEDIN, + target->name, target->user->account); + } + + if (MyConnect(target)) + { + policy = whois_get_policy(client, target, "idle"); + /* If the policy is 'full' then show the idle time. + * If the policy is 'limited then show the idle time according to the +I rules + */ + if ((policy == WHOIS_CONFIG_DETAILS_FULL) || + ((policy == WHOIS_CONFIG_DETAILS_LIMITED) && !hide_idle_time(client, target))) + { + add_nvplist_numeric(&list, 500000, "idle", client, RPL_WHOISIDLE, + target->name, + (long long)(TStime() - target->local->idle_since), + (long long)target->local->creationtime); + } + } + + RunHook(HOOKTYPE_WHOIS, client, target, &list); + + for (e = list; e; e = e->next) + sendto_one(client, NULL, "%s", e->value); + + free_nvplist(list); } sendnumeric(client, RPL_ENDOFWHOIS, querybuf); } diff --git a/src/modules/whowas.c b/src/modules/whowas.c index 8cb41c6..2ab48a0 100644 --- a/src/modules/whowas.c +++ b/src/modules/whowas.c @@ -32,7 +32,7 @@ ModuleHeader MOD_HEADER "5.0", "command /whowas", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; MOD_INIT() @@ -53,8 +53,8 @@ MOD_UNLOAD() } /* externally defined functions */ -extern aWhowas MODVAR WHOWAS[NICKNAMEHISTORYLENGTH]; -extern aWhowas MODVAR *WHOWASHASH[WHOWAS_HASH_TABLE_SIZE]; +extern WhoWas MODVAR WHOWAS[NICKNAMEHISTORYLENGTH]; +extern WhoWas MODVAR *WHOWASHASH[WHOWAS_HASH_TABLE_SIZE]; /* ** cmd_whowas @@ -62,7 +62,8 @@ extern aWhowas MODVAR *WHOWASHASH[WHOWAS_HASH_TABLE_SIZE]; */ CMD_FUNC(cmd_whowas) { - aWhowas *temp; + char request[BUFSIZE]; + WhoWas *temp; int cur = 0; int max = -1, found = 0; char *p, *nick; @@ -75,16 +76,17 @@ CMD_FUNC(cmd_whowas) if (parc > 2) max = atoi(parv[2]); if (parc > 3) - if (hunt_server(client, recv_mtags, ":%s WHOWAS %s %s :%s", 3, parc, parv)) + if (hunt_server(client, recv_mtags, "WHOWAS", 3, parc, parv)) return; if (!MyConnect(client) && (max > 20)) max = 20; - p = strchr(parv[1], ','); + strlcpy(request, parv[1], sizeof(request)); + p = strchr(request, ','); if (p) *p = '\0'; - nick = parv[1]; + nick = request; temp = WHOWASHASH[hash_whowas_name(nick)]; found = 0; for (; temp; temp = temp->next) @@ -109,5 +111,5 @@ CMD_FUNC(cmd_whowas) if (!found) sendnumeric(client, ERR_WASNOSUCHNICK, nick); - sendnumeric(client, RPL_ENDOFWHOWAS, parv[1]); + sendnumeric(client, RPL_ENDOFWHOWAS, request); } diff --git a/src/modules/whox.c b/src/modules/whox.c index 7cbc953..ca4239e 100644 --- a/src/modules/whox.c +++ b/src/modules/whox.c @@ -15,7 +15,7 @@ ModuleHeader MOD_HEADER "5.0", "command /who", "UnrealIRCd Team", - "unrealircd-5", + "unrealircd-6", }; @@ -80,10 +80,11 @@ static void who_global(Client *client, char *mask, int operspy, struct who_forma static void do_who(Client *client, Client *acptr, Channel *channel, struct who_format *fmt); static void do_who_on_channel(Client *client, Channel *channel, int member, int operspy, struct who_format *fmt); -static int convert_classical_who_request(Client *client, int *parc, char *parv[], char **orig_mask, struct who_format *fmt); -char *whox_md_serialize(ModData *m); -void whox_md_unserialize(char *str, ModData *m); +static int convert_classical_who_request(Client *client, int *parc, const char *parv[], const char **orig_mask, struct who_format *fmt); +const char *whox_md_serialize(ModData *m); +void whox_md_unserialize(const char *str, ModData *m); void whox_md_free(ModData *md); +static void append_format(char *buf, size_t bufsize, size_t *pos, const char *fmt, ...) __attribute__((format(printf,4,5))); MOD_INIT() { @@ -126,7 +127,7 @@ MOD_UNLOAD() } /** whox module data operations: serialize (rare) */ -char *whox_md_serialize(ModData *m) +const char *whox_md_serialize(ModData *m) { static char buf[32]; if (m->i == 0) @@ -136,7 +137,7 @@ char *whox_md_serialize(ModData *m) } /** whox module data operations: unserialize (rare) */ -void whox_md_unserialize(char *str, ModData *m) +void whox_md_unserialize(const char *str, ModData *m) { m->i = atoi(str); } @@ -179,9 +180,9 @@ void whox_md_free(ModData *md) CMD_FUNC(cmd_whox) { char *mask; - char *orig_mask; + const char *orig_mask; char ch; /* Scratch char register */ - char *p; /* Scratch char pointer */ + const char *p; /* Scratch char pointer */ int member; int operspy = 0; struct who_format fmt; @@ -294,7 +295,7 @@ CMD_FUNC(cmd_whox) while (*s) { - int i; + Umode *um; switch (*s) { @@ -316,11 +317,11 @@ CMD_FUNC(cmd_whox) else umodes = &fmt.noumodes; - for (i = 0; i <= Usermode_highest; i++) + for (um = usermodes; um; um = um->next) { - if (*s == Usermode_Table[i].flag) + if (um->letter == *s) { - *umodes |= Usermode_Table[i].mode; + *umodes |= um->mode; break; } } @@ -341,7 +342,7 @@ CMD_FUNC(cmd_whox) Channel *channel = NULL; /* List all users on a given channel */ - if ((channel = find_channel(orig_mask, NULL)) != NULL) + if ((channel = find_channel(orig_mask)) != NULL) { if (IsMember(client, channel) || operspy) do_who_on_channel(client, channel, 1, operspy, &fmt); @@ -426,8 +427,7 @@ static int do_match(Client *client, Client *acptr, char *mask, struct who_format return 1; /* match account */ - if (IsMatch(fmt, WMATCH_ACCOUNT) && !BadPtr(acptr->user->svid) && - !isdigit(*acptr->user->svid) && match_simple(mask, acptr->user->svid)) + if (IsMatch(fmt, WMATCH_ACCOUNT) && IsLoggedIn(acptr) && match_simple(mask, acptr->user->account)) { return 1; } @@ -491,12 +491,12 @@ static void who_common_channel(Client *client, Channel *channel, break; } - if (i != 0 && !(is_skochanop(client, channel)) && !(is_skochanop(acptr, channel) || has_voice(acptr,channel))) + if (i != 0 && !(check_channel_access(client, channel, "hoaq")) && !(check_channel_access(acptr, channel, "hoaq") || check_channel_access(acptr,channel, "v"))) continue; SetMark(acptr); - if(*maxmatches > 0) + if (*maxmatches > 0) { if (do_match(client, acptr, mask, fmt)) { @@ -530,7 +530,7 @@ static void who_global(Client *client, char *mask, int operspy, struct who_forma /* If searching for a nick explicitly, then include it later on in the result: */ if (mask && ((fmt->matchsel & WMATCH_NICK) || (fmt->matchsel == 0))) - hunted = find_person(mask, NULL); + hunted = find_user(mask, NULL); /* Initialize the markers to zero */ list_for_each_entry(acptr, &client_list, client_node) @@ -608,10 +608,10 @@ static void do_who_on_channel(Client *client, Channel *channel, break; } - if (!operspy && (acptr != client) && i != 0 && !(is_skochanop(client, channel)) && !(is_skochanop(acptr, channel) || has_voice(acptr,channel))) + if (!operspy && (acptr != client) && i != 0 && !(check_channel_access(client, channel, "hoaq")) && !(check_channel_access(acptr, channel, "hoaq") || check_channel_access(acptr,channel, "v"))) continue; - if(member || !IsInvisible(acptr)) + if (member || !IsInvisible(acptr)) do_who(client, acptr, channel, fmt); } } @@ -688,7 +688,7 @@ static void do_who(Client *client, Client *acptr, Channel *channel, struct who_f else status[i++] = 'H'; - if (IsARegNick(acptr)) + if (IsRegNick(acptr)) status[i++] = 'r'; if (IsSecureConnect(acptr)) @@ -715,36 +715,16 @@ static void do_who(Client *client, Client *acptr, Channel *channel, struct who_f { if (!(fmt->fields || HasCapability(client, "multi-prefix"))) { - /* Standard NAMES reply */ -#ifdef PREFIX_AQ - if (lp->flags & CHFL_CHANOWNER) - status[i++] = '~'; - else if (lp->flags & CHFL_CHANADMIN) - status[i++] = '&'; - else -#endif - if (lp->flags & CHFL_CHANOP) - status[i++] = '@'; - else if (lp->flags & CHFL_HALFOP) - status[i++] = '%'; - else if (lp->flags & CHFL_VOICE) - status[i++] = '+'; + /* Standard NAMES reply (single character) */ + char c = mode_to_prefix(*lp->member_modes); + if (c) + status[i++] = c; } else { /* NAMES reply with all rights included (multi-prefix / NAMESX) */ -#ifdef PREFIX_AQ - if (lp->flags & CHFL_CHANOWNER) - status[i++] = '~'; - if (lp->flags & CHFL_CHANADMIN) - status[i++] = '&'; -#endif - if (lp->flags & CHFL_CHANOP) - status[i++] = '@'; - if (lp->flags & CHFL_HALFOP) - status[i++] = '%'; - if (lp->flags & CHFL_VOICE) - status[i++] = '+'; + strcpy(&status[i], modes_to_prefix(lp->member_modes)); + i += strlen(&status[i]); } } } @@ -761,7 +741,7 @@ static void do_who(Client *client, Client *acptr, Channel *channel, struct who_f else host = GetHost(acptr); sendnumeric(client, RPL_WHOREPLY, - channel ? channel->chname : "*", + channel ? channel->name : "*", acptr->user->username, host, hide ? "*" : acptr->user->server, acptr->name, status, hide ? 0 : acptr->hopcount, acptr->info); @@ -773,7 +753,7 @@ static void do_who(Client *client, Client *acptr, Channel *channel, struct who_f if (HasField(fmt, FIELD_QUERYTYPE)) append_format(str, sizeof str, &pos, " %s", fmt->querytype); if (HasField(fmt, FIELD_CHANNEL)) - append_format(str, sizeof str, &pos, " %s", channel ? channel->chname : "*"); + append_format(str, sizeof str, &pos, " %s", channel ? channel->name : "*"); if (HasField(fmt, FIELD_USER)) append_format(str, sizeof str, &pos, " %s", acptr->user->username); if (HasField(fmt, FIELD_IP)) @@ -801,21 +781,26 @@ static void do_who(Client *client, Client *acptr, Channel *channel, struct who_f if (HasField(fmt, FIELD_MODES)) { if (IsOper(client)) - append_format(str, sizeof str, &pos, " %s", strtok(get_usermode_string(acptr), "+")); - else + { + const char *umodes = get_usermode_string(acptr); + if (*umodes == '+') + umodes++; + append_format(str, sizeof str, &pos, " %s", umodes); + } else { append_format(str, sizeof str, &pos, " %s", "*"); + } } if (HasField(fmt, FIELD_HOP)) append_format(str, sizeof str, &pos, " %d", hide ? 0 : acptr->hopcount); if (HasField(fmt, FIELD_IDLE)) { append_format(str, sizeof str, &pos, " %d", - (int)((MyUser(acptr) && !hide_idle_time(client, acptr)) ? (TStime() - acptr->local->last) : 0)); + (int)((MyUser(acptr) && !hide_idle_time(client, acptr)) ? (TStime() - acptr->local->idle_since) : 0)); } if (HasField(fmt, FIELD_ACCOUNT)) - append_format(str, sizeof str, &pos, " %s", (!isdigit(*acptr->user->svid)) ? acptr->user->svid : "0"); + append_format(str, sizeof str, &pos, " %s", IsLoggedIn(acptr) ? acptr->user->account : "0"); if (HasField(fmt, FIELD_OPLEVEL)) - append_format(str, sizeof str, &pos, " %s", (channel && is_skochanop(acptr, channel)) ? "999" : "n/a"); + append_format(str, sizeof str, &pos, " %s", (channel && check_channel_access(acptr, channel, "hoaq")) ? "999" : "n/a"); if (HasField(fmt, FIELD_REPUTATION)) { if (IsOper(client)) @@ -826,22 +811,15 @@ static void do_who(Client *client, Client *acptr, Channel *channel, struct who_f if (HasField(fmt, FIELD_INFO)) append_format(str, sizeof str, &pos, " :%s", acptr->info); - if (pos >= sizeof str) - { - static int warned = 0; - if (!warned) - sendto_snomask(SNO_JUNK, "*** WHOX overflow while sending information about %s to %s", acptr->name, client->name); - warned = 1; - } sendto_one(client, NULL, "%s", str); } } /* Yeah, this is fun. Thank you WHOX !!! */ -static int convert_classical_who_request(Client *client, int *parc, char *parv[], char **orig_mask, struct who_format *fmt) +static int convert_classical_who_request(Client *client, int *parc, const char *parv[], const char **orig_mask, struct who_format *fmt) { - char *p; - static char pbuf1[256]; + const char *p; + static char pbuf1[512], pbuf2[512]; int points; /* Figure out if the user is doing a 'classical' UnrealIRCd request, @@ -887,7 +865,7 @@ static int convert_classical_who_request(Client *client, int *parc, char *parv[] parv[1], parv[2] ? " " : "", parv[2] ? parv[2] : ""); if (parv[2]) { - char *swap = parv[1]; + const char *swap = parv[1]; parv[1] = parv[2]; parv[2] = swap; } else { @@ -925,13 +903,19 @@ static int convert_classical_who_request(Client *client, int *parc, char *parv[] sendnotice(client, "WHO request '%s' failed: flag 'c' no longer exists with WHOX.", oldrequest); return 0; } - for (p = parv[2]; *p; p++) + if (strchr(parv[2], 'g')) { - if (*p == 'g') + char *w; + strlcpy(pbuf2, parv[2], sizeof(pbuf2)); + for (w = pbuf2; *w; w++) { - *p = 'r'; - break; + if (*w == 'g') + { + *w = 'r'; + break; + } } + parv[2] = pbuf2; } /* "WHO -m xyz" (now: xyz -m) should become "WHO -xyz m" diff --git a/src/numeric.c b/src/numeric.c deleted file mode 100644 index 1481240..0000000 --- a/src/numeric.c +++ /dev/null @@ -1,1056 +0,0 @@ -/* - * Unreal Internet Relay Chat Daemon, src/numeric.c - * Copyright (C) 1992 Darren Reed - * - * This program is free 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 1, or (at your option) - * any later version. - * - * 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., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -/** @file - * @brief Numeric replies in the IRC protocol. - */ - -#include "unrealircd.h" - -/** Numeric replies */ -static char *replies[] = { -/* 000 */ NULL, -/* 001 RPL_WELCOME */ ":Welcome to the %s IRC Network %s!%s@%s", -/* 002 RPL_YOURHOST */ ":Your host is %s, running version %s", -/* 003 RPL_CREATED */ ":This server was created %s", -/* 004 RPL_MYINFO */ "%s %s %s %s", -/* 005 RPL_ISUPPORT */ "%s :are supported by this server", -/* 006 RPL_MAP */ ":%s%-*s(%ld) %s", -/* 007 RPL_MAPEND */ ":End of /MAP", -/* 008 RPL_SNOMASK */ "%s :Server notice mask", -/* 009 */ NULL, /* ircu */ -/* 010 RPL_REDIR */ "%s %d :Please use this Server/Port instead", -/* 011 */ NULL, -/* 012 */ NULL, -/* 013 */ NULL, -/* 014 */ NULL, /* hybrid */ -/* 015 */ NULL, -/* 016 */ NULL, -/* 017 */ NULL, -/* 018 */ NULL, -/* 019 */ NULL, -/* 020 */ NULL, -/* 021 */ NULL, -/* 022 */ NULL, -/* 023 */ NULL, -/* 024 */ NULL, -/* 025 */ NULL, -/* 026 */ NULL, -/* 027 */ NULL, -/* 028 */ NULL, -/* 029 */ NULL, -/* 030 */ NULL, -/* 031 */ NULL, -/* 032 */ NULL, -/* 033 */ NULL, -/* 034 */ NULL, -/* 035 */ NULL, -/* 036 */ NULL, -/* 037 */ NULL, -/* 038 */ NULL, -/* 039 */ NULL, -/* 040 */ NULL, -/* 041 */ NULL, -/* 042 RPL_YOURID */ "%s :your unique ID", -/* 043 */ NULL, /* ircnet */ -/* 044 */ NULL, -/* 045 */ NULL, -/* 046 */ NULL, -/* 047 */ NULL, -/* 048 */ NULL, -/* 049 */ NULL, -/* 050 */ NULL, /* aircd */ -/* 051 */ NULL, /* aircd */ -/* 052 */ NULL, -/* 053 */ NULL, -/* 054 */ NULL, -/* 055 */ NULL, -/* 056 */ NULL, -/* 057 */ NULL, -/* 058 */ NULL, -/* 059 */ NULL, -/* 060 */ NULL, -/* 061 */ NULL, -/* 062 */ NULL, -/* 063 */ NULL, -/* 064 */ NULL, -/* 065 */ NULL, -/* 066 */ NULL, -/* 067 */ NULL, -/* 068 */ NULL, -/* 069 */ NULL, -/* 070 */ NULL, -/* 071 */ NULL, -/* 072 */ NULL, -/* 073 */ NULL, -/* 074 */ NULL, -/* 075 */ NULL, -/* 076 */ NULL, -/* 077 */ NULL, -/* 078 */ NULL, -/* 079 */ NULL, -/* 080 */ NULL, -/* 081 */ NULL, -/* 082 */ NULL, -/* 083 */ NULL, -/* 084 */ NULL, -/* 085 */ NULL, -/* 086 */ NULL, -/* 087 */ NULL, -/* 088 */ NULL, -/* 089 */ NULL, -/* 090 */ NULL, -/* 091 */ NULL, -/* 092 */ NULL, -/* 093 */ NULL, -/* 094 */ NULL, -/* 095 */ NULL, -/* 096 */ NULL, -/* 097 */ NULL, -/* 098 */ NULL, -/* 099 */ NULL, -/* 100 */ NULL, -/* 101 */ NULL, -/* 102 */ NULL, -/* 103 */ NULL, -/* 104 */ NULL, -/* 105 RPL_REMOTEISUPPORT */ "%s :are supported by this server", -/* 106 */ NULL, -/* 107 */ NULL, -/* 108 */ NULL, -/* 109 */ NULL, -/* 110 */ NULL, -/* 111 */ NULL, -/* 112 */ NULL, -/* 113 */ NULL, -/* 114 */ NULL, -/* 115 */ NULL, -/* 116 */ NULL, -/* 117 */ NULL, -/* 118 */ NULL, -/* 119 */ NULL, -/* 120 */ NULL, -/* 121 */ NULL, -/* 122 */ NULL, -/* 123 */ NULL, -/* 124 */ NULL, -/* 125 */ NULL, -/* 126 */ NULL, -/* 127 */ NULL, -/* 128 */ NULL, -/* 129 */ NULL, -/* 130 */ NULL, -/* 131 */ NULL, -/* 132 */ NULL, -/* 133 */ NULL, -/* 134 */ NULL, -/* 135 */ NULL, -/* 136 */ NULL, -/* 137 */ NULL, -/* 138 */ NULL, -/* 139 */ NULL, -/* 140 */ NULL, -/* 141 */ NULL, -/* 142 */ NULL, -/* 143 */ NULL, -/* 144 */ NULL, -/* 145 */ NULL, -/* 146 */ NULL, -/* 147 */ NULL, -/* 148 */ NULL, -/* 149 */ NULL, -/* 150 */ NULL, -/* 151 */ NULL, -/* 152 */ NULL, -/* 153 */ NULL, -/* 154 */ NULL, -/* 155 */ NULL, -/* 156 */ NULL, -/* 157 */ NULL, -/* 158 */ NULL, -/* 159 */ NULL, -/* 160 */ NULL, -/* 161 */ NULL, -/* 162 */ NULL, -/* 163 */ NULL, -/* 164 */ NULL, -/* 165 */ NULL, -/* 166 */ NULL, -/* 167 */ NULL, -/* 168 */ NULL, -/* 169 */ NULL, -/* 170 */ NULL, -/* 171 */ NULL, -/* 172 */ NULL, -/* 173 */ NULL, -/* 174 */ NULL, -/* 175 */ NULL, -/* 176 */ NULL, -/* 177 */ NULL, -/* 178 */ NULL, -/* 179 */ NULL, -/* 180 */ NULL, -/* 181 */ NULL, -/* 182 */ NULL, -/* 183 */ NULL, -/* 184 */ NULL, -/* 185 */ NULL, -/* 186 */ NULL, -/* 187 */ NULL, -/* 188 */ NULL, -/* 189 */ NULL, -/* 190 */ NULL, -/* 191 */ NULL, -/* 192 */ NULL, -/* 193 */ NULL, -/* 194 */ NULL, -/* 195 */ NULL, -/* 196 */ NULL, -/* 197 */ NULL, -/* 198 */ NULL, -/* 199 */ NULL, -/* 200 RPL_TRACELINK */ "Link %s%s %s %s", -/* 201 RPL_TRACECONNECTING */ "Attempt %s %s", -/* 202 RPL_TRACEHANDSHAKE */ "Handshaking %s %s", -/* 203 RPL_TRACEUNKNOWN */ "???? %s %s", -/* 204 RPL_TRACEOPERATOR */ "Operator %s %s [%s] %ld", -/* 205 RPL_TRACEUSER */ "User %s %s [%s] %ld", -/* 206 RPL_TRACESERVER */ "Server %s %dS %dC %s %s!%s@%s %ld", -/* 207 RPL_TRACESERVICE */ "Service %s %s", -/* 208 RPL_TRACENEWTYPE */ "%s 0 %s", -/* 209 RPL_TRACECLASS */ "Class %s %d", -/* 210 RPL_STATSHELP */ ":%s", -/* 211 */ NULL, /* Used */ -#ifdef DEBUGMODE -/* 212 RPL_STATSCOMMANDS */ "%s %u %lu %lu %lu %lu %lu", -#else -/* 212 RPL_STATSCOMMANDS */ "%s %u %lu", -#endif -/* 213 RPL_STATSCLINE */ "%c %s * %s %d %d %s", -/* 214 RPL_STATSOLDNLINE */ "%c %s * %s %d %d %s", -/* 215 RPL_STATSILINE */ "I %s %s %d %d %s %s %d", -/* 216 RPL_STATSKLINE */ "%s %s %s", -/* 217 RPL_STATSQLINE */ "%c %s %ld %ld %s :%s", -/* 218 RPL_STATSYLINE */ "Y %s %d %d %d %d %d", -/* 219 RPL_ENDOFSTATS */ "%c :End of /STATS report", -/* 220 RPL_STATSBLINE */ "%c %s %s %s %d %d", -/* 221 RPL_UMODEIS */ "%s", -/* 222 RPL_SQLINE_NICK */ "%s :%s", -/* 223 RPL_STATSGLINE */ "%c %s %li %li %s :%s", -/* 224 RPL_STATSTLINE */ "T %s %s %s", -/* 225 RPL_STATSELINE (we use 230 instead) */ NULL, -/* 226 RPL_STATSNLINE */ "n %s %s", -/* 227 RPL_STATSVLINE */ "v %s %s %s", -/* 228 RPL_STATSBANVER */ "%s %s", -/* 229 RPL_STATSSPAMF */ "%c %s %s %s %li %li %li %s %s :%s", -/* 230 RPL_STATSEXCEPTTKL */ "%s %s %li %li %s :%s", -/* 231 */ NULL, /* rfc1459 */ -/* 232 RPL_RULES */ ":- %s", -/* 233 */ NULL, /* rfc1459 */ -/* 234 */ NULL, /* rfc2812 */ -/* 235 */ NULL, /* rfc2812 */ -/* 236 */ NULL, /* ircu */ -/* 237 */ NULL, /* ircu */ -/* 238 */ NULL, /* ircu, ircnet */ -/* 239 */ NULL, /* ircnet */ -/* 240 */ NULL, /* rfc2812, austhex */ -/* 241 RPL_STATSLLINE */ "%c %s * %s %d %d", -/* 242 RPL_STATSUPTIME */ ":Server Up %ld days, %ld:%02ld:%02ld", -/* 243 RPL_STATSOLINE */ "%c %s * %s %s %s", -/* 244 RPL_STATSHLINE */ "%c %s * %s %d %d", -/* 245 RPL_STATSSLINE */ "%c %s * %s %d %d", -/* 246 */ NULL, /* rfc2812 */ -/* 247 RPL_STATSXLINE */ "X %s %d", -/* 248 RPL_STATSULINE */ "U %s", -/* 249 RPL_STATSDEBUG */ ":%s", -/* 250 RPL_STATSCONN */ ":Highest connection count: %d (%d clients)", -/* 251 RPL_LUSERCLIENT */ ":There are %d users and %d invisible on %d servers", -/* 252 RPL_LUSEROP */ "%d :operator(s) online", -/* 253 RPL_LUSERUNKNOWN */ "%d :unknown connection(s)", -/* 254 RPL_LUSERCHANNELS */ "%d :channels formed", -/* 255 RPL_LUSERME */ ":I have %d clients and %d servers", -/* 256 RPL_ADMINME */ ":Administrative info about %s", -/* 257 RPL_ADMINLOC1 */ ":%s", -/* 258 RPL_ADMINLOC2 */ ":%s", -/* 259 RPL_ADMINEMAIL */ ":%s", -/* 260 */ NULL, -/* 261 RPL_TRACELOG */ "File %s %d", -/* 262 */ NULL, /* rfc2812 */ -/* 263 RPL_TRYAGAIN */ "%s :Flooding detected. Please wait a while and try again.", -/* 264 */ NULL, -/* 265 RPL_LOCALUSERS */ "%d %d :Current local users %d, max %d", -/* 266 RPL_GLOBALUSERS */ "%d %d :Current global users %d, max %d", -/* 267 */ NULL, /* aircd */ -/* 268 */ NULL, /* aircd */ -/* 269 */ NULL, /* aircd */ -/* 270 */ NULL, /* ircu */ -/* 271 RPL_SILELIST */ "%s", -/* 272 RPL_ENDOFSILELIST */ ":End of Silence List", -/* 273 */ NULL, /* aircd */ -/* 274 */ NULL, /* ircnet */ -/* 275 RPL_STATSDLINE */ "%c %s %s", -/* 276 RPL_WHOISCERTFP */ "%s :has client certificate fingerprint %s", -/* 277 */ NULL, /* hybrid */ -/* 278 */ NULL, /* hybrid */ -/* 279 */ NULL, -/* 280 */ NULL, /* ircu */ -/* 281 */ NULL, /* ircu, hybrid */ -/* 282 */ NULL, /* ircu, hybrid */ -/* 283 */ NULL, /* ircu, hybrid */ -/* 284 */ NULL, /* hybrid, quakenet */ -/* 285 */ NULL, /* ircu, aircd, quakenet */ -/* 286 */ NULL, /* aircd, quakenet */ -/* 287 */ NULL, /* aircd, quakenet */ -/* 288 */ NULL, /* aircd, quakenet */ -/* 289 */ NULL, /* aircd, quakenet */ -/* 290 */ NULL, /* aircd, quakenet */ -/* 291 */ NULL, /* aircd, quakenet */ -/* 292 */ NULL, /* aircd */ -/* 293 */ NULL, /* aircd */ -/* 294 RPL_HELPFWD */ ":Your help-request has been forwarded to Help Operators", -/* 295 RPL_HELPIGN */ ":Your address has been ignored from forwarding", -/* 296 */ NULL, /* aircd */ -/* 297 */ NULL, -/* 298 */ NULL, /* Used */ -/* 299 */ NULL, /* aircd */ -/* 300 */ NULL, /* rfc1459 */ -/* 301 RPL_AWAY */ "%s :%s", -/* 302 RPL_USERHOST */ ":%s %s %s %s %s", -/* 303 RPL_ISON */ ":", -/* 304 */ NULL, /* RPL_TEXT */ -/* 305 RPL_UNAWAY */ ":You are no longer marked as being away", -/* 306 RPL_NOWAWAY */ ":You have been marked as being away", -/* 307 RPL_WHOISREGNICK */ "%s :is identified for this nick", -/* 308 RPL_RULESSTART */ ":- %s Server Rules - ", -/* 309 RPL_ENDOFRULES */ ":End of RULES command.", -/* 310 RPL_WHOISHELPOP */ "%s :is available for help.", -/* 311 RPL_WHOISUSER */ "%s %s %s * :%s", -/* 312 RPL_WHOISSERVER */ "%s %s :%s", -/* 313 RPL_WHOISOPERATOR */ "%s :is %s", -/* 314 RPL_WHOWASUSER */ "%s %s %s * :%s", -/* 315 RPL_ENDOFWHO */ "%s :End of /WHO list.", -/* 316 */ NULL, /* rfc1459 */ -/* 317 RPL_WHOISIDLE */ "%s %ld %ld :seconds idle, signon time", -/* 318 RPL_ENDOFWHOIS */ "%s :End of /WHOIS list.", -/* 319 RPL_WHOISCHANNELS */ "%s :%s", -/* 320 RPL_WHOISSPECIAL */ "%s :%s", -/* 321 RPL_LISTSTART */ "Channel :Users Name", -#ifndef LIST_SHOW_MODES -/* 322 RPL_LIST */ "%s %d :%s", -#else -/* 322 RPL_LIST */ "%s %d :%s %s", -#endif -/* 323 RPL_LISTEND */ ":End of /LIST", -/* 324 RPL_CHANNELMODEIS */ "%s %s %s", -/* 325 */ NULL, /* rfc2812 */ -/* 326 */ NULL, /* Used */ -/* 327 */ NULL, /* Used */ -/* 328 */ NULL, /* bahamut, austhex */ -/* 329 RPL_CREATIONTIME */ "%s %lu", -/* 330 RPL_WHOISLOGGEDIN */ "%s %s :is logged in as", -/* 331 RPL_NOTOPIC */ "%s :No topic is set.", -/* 332 RPL_TOPIC */ "%s :%s", -/* 333 RPL_TOPICWHOTIME */ "%s %s %lu", -/* 334 RPL_LISTSYNTAX */ ":%s", -/* 335 RPL_WHOISBOT */ "%s :is a \2Bot\2 on %s", -/* 336 RPL_INVITELIST */ ":%s", -/* 337 RPL_ENDOFINVITELIST */ ":End of /INVITE list.", -/* 338 */ NULL, /* ircu, bahamut */ -/* 339 */ NULL, /* Used */ -/* 340 RPL_USERIP */ ":%s %s %s %s %s", -/* 341 RPL_INVITING */ "%s %s", -/* 342 RPL_SUMMONING */ "%s :User summoned to irc", -/* 343 */ NULL, -/* 344 */ NULL, -/* 345 */ NULL, /* gamesurge */ -/* 346 RPL_INVEXLIST */ "%s %s %s %lu", -/* 347 RPL_ENDOFINVEXLIST */ "%s :End of Channel Invite List", -/* 348 RPL_EXLIST */ "%s %s %s %lu", -/* 349 RPL_ENDOFEXLIST */ "%s :End of Channel Exception List", -/* 350 */ NULL, -/* 351 RPL_VERSION */ "%s.%s %s :%s%s%s [%s=%d]", -/* 352 RPL_WHOREPLY */ "%s %s %s %s %s %s :%d %s", -/* 353 RPL_NAMREPLY */ "%s", -/* 354 */ NULL, /* ircu */ -/* 355 */ NULL, /* quakenet */ -/* 356 */ NULL, -/* 357 */ NULL, /* austhex */ -/* 358 */ NULL, /* austhex */ -/* 359 */ NULL, /* austhex */ -/* 360 */ NULL, -/* 361 */ NULL, /* rfc1459 */ -/* 362 RPL_CLOSING */ "%s :Closed. Status = %d", -/* 363 RPL_CLOSEEND */ "%d: Connections Closed", -/* 364 RPL_LINKS */ "%s %s :%d %s", -/* 365 RPL_ENDOFLINKS */ "%s :End of /LINKS list.", -/* 366 RPL_ENDOFNAMES */ "%s :End of /NAMES list.", -/* 367 RPL_BANLIST */ "%s %s %s %lu", -/* 368 RPL_ENDOFBANLIST */ "%s :End of Channel Ban List", -/* 369 RPL_ENDOFWHOWAS */ "%s :End of WHOWAS", -/* 370 */ NULL, -/* 371 RPL_INFO */ ":%s", -/* 372 RPL_MOTD */ ":- %s", -/* 373 RPL_INFOSTART */ ":Server INFO", -/* 374 RPL_ENDOFINFO */ ":End of /INFO list.", -/* 375 RPL_MOTDSTART */ ":- %s Message of the Day - ", -/* 376 RPL_ENDOFMOTD */ ":End of /MOTD command.", -/* 377 */ NULL, /* aircd, austhex */ -/* 378 RPL_WHOISHOST */ "%s :is connecting from %s@%s %s", -/* 379 RPL_WHOISMODES */ "%s :is using modes %s %s", -/* 380 */ NULL, /* aircd, austhex */ -/* 381 RPL_YOUREOPER */ ":You are now an IRC Operator", -/* 382 RPL_REHASHING */ "%s :Rehashing", -/* 383 */ NULL, /* rfc2812 */ -/* 384 RPL_MYPORTIS */ "%d :Port to local server is\r\n", -/* 385 */ NULL, /* austhex, hybrid */ -/* 386 RPL_QLIST */ "%s %s", -/* 387 RPL_ENDOFQLIST */ "%s :End of Channel Owner List", -/* 388 RPL_ALIST */ "%s %s", -/* 389 RPL_ENDOFALIST */ "%s :End of Protected User List", -/* 390 */ NULL, -/* 391 RPL_TIME */ "%s :%s", -#ifdef ENABLE_USERS -/* 392 RPL_USERSSTART */ ":UserID Terminal Host", -/* 393 RPL_USERS */ ":%-8s %-9s %-8s", -/* 394 RPL_ENDOFUSERS */ ":End of Users", -/* 395 RPL_NOUSERS */ ":Nobody logged in.", -#else -/* 392 */ NULL, -/* 393 */ NULL, -/* 394 */ NULL, -/* 395 */ NULL, -#endif -/* 396 RPL_HOSTHIDDEN */ "%s :is now your displayed host", -/* 397 */ NULL, -/* 398 */ NULL, -/* 399 */ NULL, -/* 400 */ NULL, /* Used */ -/* 401 ERR_NOSUCHNICK */ "%s :No such nick/channel", -/* 402 ERR_NOSUCHSERVER */ "%s :No such server", -/* 403 ERR_NOSUCHCHANNEL */ "%s :No such channel", -/* 404 ERR_CANNOTSENDTOCHAN */ "%s :%s (%s)", -/* 405 ERR_TOOMANYCHANNELS */ "%s :You have joined too many channels", -/* 406 ERR_WASNOSUCHNICK */ "%s :There was no such nickname", -/* 407 ERR_TOOMANYTARGETS */ "%s :Too many targets. The maximum is %d for %s.", -/* 408 */ NULL, /* rfc2812, bahamut */ -/* 409 ERR_NOORIGIN */ ":No origin specified", -/* 410 ERR_INVALIDCAPCMD */ "%s :Invalid CAP subcommand", -/* 411 ERR_NORECIPIENT */ ":No recipient given (%s)", -/* 412 ERR_NOTEXTTOSEND */ ":No text to send", -/* 413 ERR_NOTOPLEVEL */ "%s :No toplevel domain specified", -/* 414 ERR_WILDTOPLEVEL */ "%s :Wildcard in toplevel Domain", -/* 415 */ NULL, /* rfc2812 */ -/* 416 ERR_TOOMANYMATCHES */ "%s :%s", -/* 417 */ NULL, -/* 418 */ NULL, -/* 419 */ NULL, /* aircd */ -/* 420 */ NULL, -/* 421 ERR_UNKNOWNCOMMAND */ "%s :Unknown command", -/* 422 ERR_NOMOTD */ ":MOTD File is missing", -/* 423 ERR_NOADMININFO */ "%s :No administrative info available", -/* 424 ERR_FILEERROR */ ":File error doing %s on %s", -/* 425 ERR_NOOPERMOTD */ ":OPERMOTD File is missing", -/* 426 */ NULL, -/* 427 */ NULL, -/* 428 */ NULL, -/* 429 ERR_TOOMANYAWAY */ ":Too Many aways - Flood Protection activated", -/* 430 */ NULL, /* austhex */ -/* 431 ERR_NONICKNAMEGIVEN */ ":No nickname given", -/* 432 ERR_ERRONEUSNICKNAME */ "%s :Nickname is unavailable: %s", -/* 433 ERR_NICKNAMEINUSE */ "%s :Nickname is already in use.", -/* 434 ERR_NORULES */ ":RULES File is missing", -/* 435 */ NULL, /* bahamut */ -/* 436 ERR_NICKCOLLISION */ "%s :Nickname collision KILL", -/* 437 ERR_BANNICKCHANGE */ "%s :Cannot change nickname while banned on channel", -/* 438 ERR_NCHANGETOOFAST */ "%s :Nick change too fast. Please try again later.", -/* 439 ERR_TARGETTOOFAST */ "%s :Message target change too fast. Please wait %ld seconds", -/* 440 ERR_SERVICESDOWN */ "%s :Services are currently down. Please try again later.", -/* 441 ERR_USERNOTINCHANNEL */ "%s %s :They aren't on that channel", -/* 442 ERR_NOTONCHANNEL */ "%s :You're not on that channel", -/* 443 ERR_USERONCHANNEL */ "%s %s :is already on channel", -/* 444 ERR_NOLOGIN */ "%s :User not logged in", -/* 445 ERR_SUMMONDISABLED */ ":SUMMON has been disabled", -/* 446 ERR_USERSDISABLED */ ":USERS has been disabled", -/* 447 ERR_NONICKCHANGE */ ":Can not change nickname while on %s (+N)", -/* 448 ERR_FORBIDDENCHANNEL */ "%s :Cannot join channel: %s", -/* 449 */ NULL, /* ircu */ -/* 450 */ NULL, -/* 451 ERR_NOTREGISTERED */ ":You have not registered", -/* 452 */ NULL, /* Used */ -/* 453 */ NULL, /* Used */ -/* 454 */ NULL, -/* 455 ERR_HOSTILENAME */ ":Your username %s contained the invalid " - "character(s) %s and has been changed to %s. " - "Please use only the characters 0-9 a-z A-Z _ - " - "or . in your username. Your username is the part " - "before the @ in your email address.", -/* 456 */ NULL, /* hybrid */ -/* 457 */ NULL, /* hybrid */ -/* 458 */ NULL, /* hybrid */ -/* 459 ERR_NOHIDING */ "%s :Cannot join channel (+H)", -/* 460 ERR_NOTFORHALFOPS */ ":Halfops cannot set mode %c", -/* 461 ERR_NEEDMOREPARAMS */ "%s :Not enough parameters", -/* 462 ERR_ALREADYREGISTRED */ ":You may not reregister", -/* 463 ERR_NOPERMFORHOST */ ":Your host isn't among the privileged", -/* 464 ERR_PASSWDMISMATCH */ ":Password Incorrect", -/* 465 ERR_YOUREBANNEDCREEP */ ":%s", -/* 466 */ NULL, /* rfc1459 */ -/* 467 ERR_KEYSET */ "%s :Channel key already set", -/* 468 ERR_ONLYSERVERSCANCHANGE */ "%s :Only servers can change that mode", -/* 469 ERR_LINKSET */ "%s :Channel link already set", -/* 470 ERR_LINKCHANNEL */ "%s %s :[Link] %s has become full, so you are automatically being transferred to the linked channel %s", -/* 471 ERR_CHANNELISFULL */ "%s :Cannot join channel (+l)", -/* 472 ERR_UNKNOWNMODE */ "%c :is unknown mode char to me", -/* 473 ERR_INVITEONLYCHAN */ "%s :Cannot join channel (+i)", -/* 474 ERR_BANNEDFROMCHAN */ "%s :Cannot join channel (+b)", -/* 475 ERR_BADCHANNELKEY */ "%s :Cannot join channel (+k)", -/* 476 ERR_BADCHANMASK */ "%s :Bad Channel Mask", -/* 477 ERR_NEEDREGGEDNICK */ "%s :You need a registered nick to join that channel.", -/* 478 ERR_BANLISTFULL */ "%s %s :Channel ban/ignore list is full", -/* 479 ERR_LINKFAIL */ "%s :Sorry, the channel has an invalid channel link set.", -/* 480 ERR_CANNOTKNOCK */ ":Cannot knock on %s (%s)", -/* 481 ERR_NOPRIVILEGES */ ":Permission Denied- You do not have the correct IRC operator privileges", -/* 482 ERR_CHANOPRIVSNEEDED */ "%s :You're not channel operator", -/* 483 ERR_CANTKILLSERVER */ ":You cant kill a server!", -/* 484 ERR_ATTACKDENY */ "%s :Cannot kick protected user %s.", -/* 485 ERR_KILLDENY */ ":Cannot kill protected user %s.", -/* 486 ERR_NONONREG */ ":You must identify to a registered nick to private message %s", -/* 487 ERR_NOTFORUSERS */ ":%s is a server only command", -/* 488 */ NULL, -/* 489 ERR_SECUREONLYCHAN */ "%s :Cannot join channel (Secure connection is required)", -/* 490 ERR_NOSWEAR */ ":%s does not accept private messages containing swearing.", -/* 491 ERR_NOOPERHOST */ ":No O-lines for your host", -/* 492 ERR_NOCTCP */ ":%s does not accept CTCPs", -/* 493 */ NULL, /* ircu */ -/* 494 */ NULL, /* ircu */ -/* 495 */ NULL, /* ircu */ -/* 496 */ NULL, /* ircu */ -/* 497 */ NULL, /* ircu */ -/* 498 */ NULL, /* ircu */ -/* 499 ERR_CHANOWNPRIVNEEDED */ "%s :You're not a channel owner", -/* 500 ERR_TOOMANYJOINS */ "%s :Too many join requests. Please wait a while and try again.", -/* 501 ERR_UMODEUNKNOWNFLAG */ ":Unknown MODE flag", -/* 502 ERR_USERSDONTMATCH */ ":Cant change mode for other users", -/* 503 */ NULL, /* austhex */ -/* 504 */ NULL, /* Used */ -/* 505 */ NULL, -/* 506 */ NULL, -/* 507 */ NULL, -/* 508 */ NULL, -/* 509 */ NULL, -/* 510 */ NULL, -/* 511 ERR_SILELISTFULL */ "%s :Your silence list is full", -/* 512 ERR_TOOMANYWATCH */ "%s :Maximum size for WATCH-list is 128 entries", -/* 513 ERR_NEEDPONG */ ":To connect, type /QUOTE PONG %lX", -/* 514 ERR_TOOMANYDCC */ "%s :Your dcc allow list is full. Maximum size is %d entries", -/* 515 */ NULL, /* ircu */ -/* 516 */ NULL, /* ircu */ -/* 517 ERR_DISABLED*/ "%s :%s", /* ircu */ -/* 518 518 */ ":Cannot invite (+V) at channel %s", -/* 519 519 */ ":Cannot join channel %s (Admin only)", -/* 520 520 */ ":Cannot join channel %s (IRCops only)", -/* 521 ERR_LISTSYNTAX */ ":Bad list syntax, type /quote list ? or /raw list ?", -/* 522 ERR_WHOSYNTAX */ ":/WHO Syntax incorrect, use /who ? for help", -/* 523 ERR_WHOLIMEXCEED */ ":Error, /who limit of %d exceeded. Please narrow your search down and try again", -/* 524 ERR_OPERSPVERIFY */ ":Trying to join +s or +p channel as an oper. Please invite yourself first.", -/* 525 */ NULL, /* draft-brocklesby-irc-usercmdpfx */ -/* 526 */ NULL, /* draft-brocklesby-irc-usercmdpfx */ -/* 527 */ NULL, -/* 528 */ NULL, -/* 529 */ NULL, -/* 530 */ NULL, -/* 531 ERR_CANTSENDTOUSER */ "%s :%s", -/* 532 */ NULL, -/* 533 */ NULL, -/* 534 */ NULL, -/* 535 */ NULL, -/* 536 */ NULL, -/* 537 */ NULL, -/* 538 */ NULL, -/* 539 */ NULL, -/* 540 */ NULL, -/* 541 */ NULL, -/* 542 */ NULL, -/* 543 */ NULL, -/* 544 */ NULL, -/* 545 */ NULL, -/* 546 */ NULL, -/* 547 */ NULL, -/* 548 */ NULL, -/* 549 */ NULL, -/* 550 */ NULL, /* quakenet */ -/* 551 */ NULL, /* quakenet */ -/* 552 */ NULL, /* quakenet */ -/* 553 */ NULL, /* quakenet */ -/* 554 */ NULL, -/* 555 */ NULL, -/* 556 */ NULL, -/* 557 */ NULL, -/* 558 */ NULL, -/* 559 */ NULL, -/* 560 */ NULL, -/* 561 */ NULL, -/* 562 */ NULL, -/* 563 */ NULL, -/* 564 */ NULL, -/* 565 */ NULL, -/* 566 */ NULL, -/* 567 */ NULL, -/* 568 */ NULL, -/* 569 */ NULL, -/* 570 */ NULL, -/* 571 */ NULL, -/* 572 */ NULL, -/* 573 */ NULL, -/* 574 */ NULL, -/* 575 */ NULL, -/* 576 */ NULL, -/* 577 */ NULL, -/* 578 */ NULL, -/* 579 */ NULL, -/* 580 */ NULL, -/* 581 */ NULL, -/* 582 */ NULL, -/* 583 */ NULL, -/* 584 */ NULL, -/* 585 */ NULL, -/* 586 */ NULL, -/* 587 */ NULL, -/* 588 */ NULL, -/* 589 */ NULL, -/* 590 */ NULL, -/* 591 */ NULL, -/* 592 */ NULL, -/* 593 */ NULL, -/* 594 */ NULL, -/* 595 */ NULL, -/* 596 */ NULL, -/* 597 RPL_REAWAY */ "%s %s %s %d :%s", -/* 598 RPL_GONEAWAY */ "%s %s %s %d :%s", -/* 599 RPL_NOTAWAY */ "%s %s %s %d :is no longer away", -/* 600 RPL_LOGON */ "%s %s %s %d :logged online", -/* 601 RPL_LOGOFF */ "%s %s %s %d :logged offline", -/* 602 RPL_WATCHOFF */ "%s %s %s %d :stopped watching", -/* 603 RPL_WATCHSTAT */ ":You have %d and are on %d WATCH entries", -/* 604 RPL_NOWON */ "%s %s %s %ld :is online", -/* 605 RPL_NOWOFF */ "%s %s %s %ld :is offline", -/* 606 RPL_WATCHLIST */ ":%s", -/* 607 RPL_ENDOFWATCHLIST */ ":End of WATCH %c", -/* 608 RPL_CLEARWATCH */ ":Your WATCH list is now empty", -/* 609 RPL_NOWISAWAY */ "%s %s %s %ld :is away", -/* 610 RPL_MAPMORE */ ":%s%-*s --> *more*", -/* 611 */ NULL, /* ultimate */ -/* 612 */ NULL, /* ultimate */ -/* 613 */ NULL, /* ultimate */ -/* 614 */ NULL, -/* 615 */ NULL, /* ptlink, ultimate */ -/* 616 */ NULL, /* ultimate */ -/* 617 RPL_DCCSTATUS */ ":%s has been %s your DCC allow list", -/* 618 RPL_DCCLIST */ ":%s", -/* 619 RPL_ENDOFDCCLIST */ ":End of DCCALLOW %s", -/* 620 RPL_DCCINFO */ ":%s", -/* 621 */ NULL, /* ultimate */ -/* 622 */ NULL, /* ultimate */ -/* 623 */ NULL, /* ultimate */ -/* 624 */ NULL, /* ultimate */ -/* 625 */ NULL, /* ultimate */ -/* 626 */ NULL, /* ultimate */ -/* 627 */ NULL, -/* 628 */ NULL, -/* 629 */ NULL, -/* 630 */ NULL, /* ultimate */ -/* 631 */ NULL, /* ultimate */ -/* 632 */ NULL, -/* 633 */ NULL, -/* 634 */ NULL, -/* 635 */ NULL, -/* 636 */ NULL, -/* 637 */ NULL, -/* 638 */ NULL, -/* 639 */ NULL, -/* 640 */ NULL, -/* 641 */ NULL, -/* 642 */ NULL, -/* 643 */ NULL, -/* 644 */ NULL, -/* 645 */ NULL, -/* 646 */ NULL, -/* 647 */ NULL, -/* 648 */ NULL, -/* 649 */ NULL, -/* 650 */ NULL, -/* 651 */ NULL, -/* 652 */ NULL, -/* 653 */ NULL, -/* 654 */ NULL, -/* 655 */ NULL, -/* 656 */ NULL, -/* 657 */ NULL, -/* 658 */ NULL, -/* 659 RPL_SPAMCMDFWD */ "%s :Command processed, but a copy has been sent to ircops for evaluation (anti-spam) purposes. [%s]", -/* 660 */ NULL, /* kineircd */ -/* 661 */ NULL, /* kineircd */ -/* 662 */ NULL, /* kineircd */ -/* 663 */ NULL, /* kineircd */ -/* 664 */ NULL, /* kineircd */ -/* 665 */ NULL, /* kineircd */ -/* 666 */ NULL, /* kineircd */ -/* 667 */ NULL, -/* 668 */ NULL, -/* 669 */ NULL, -/* 670 RPL_STARTTLS */ ":STARTTLS successful, go ahead with TLS handshake", /* kineircd */ -/* 671 RPL_WHOISSECURE */ "%s :%s", /* our variation on the kineircd numeric */ -/* 672 */ NULL, /* ithildin */ -/* 673 */ NULL, /* ithildin */ -/* 674 */ NULL, -/* 675 */ NULL, -/* 676 */ NULL, -/* 677 */ NULL, -/* 678 */ NULL, /* kineircd */ -/* 679 */ NULL, /* kineircd */ -/* 680 */ NULL, -/* 681 */ NULL, -/* 682 */ NULL, /* kineircd */ -/* 683 */ NULL, -/* 684 */ NULL, -/* 685 */ NULL, -/* 686 */ NULL, -/* 687 */ NULL, /* kineircd */ -/* 688 */ NULL, /* kineircd */ -/* 689 */ NULL, /* kineircd */ -/* 690 */ NULL, /* kineircd */ -/* 691 ERR_STARTTLS */ ":%s", -/* 692 */ NULL, -/* 693 */ NULL, -/* 694 */ NULL, -/* 695 */ NULL, -/* 696 */ NULL, -/* 697 */ NULL, -/* 698 */ NULL, -/* 699 */ NULL, -/* 700 */ NULL, -/* 701 */ NULL, -/* 702 */ NULL, -/* 703 */ NULL, -/* 704 */ NULL, -/* 705 */ NULL, -/* 706 */ NULL, -/* 707 */ NULL, -/* 708 */ NULL, -/* 709 */ NULL, -/* 710 */ NULL, -/* 711 */ NULL, -/* 712 */ NULL, -/* 713 */ NULL, -/* 714 */ NULL, -/* 715 */ NULL, -/* 716 */ NULL, /* ratbox */ -/* 717 */ NULL, /* ratbox */ -/* 718 */ NULL, /* ratbox */ -/* 719 */ NULL, -/* 720 */ NULL, -/* 721 */ NULL, -/* 722 */ NULL, -/* 723 */ NULL, -/* 724 */ NULL, -/* 725 */ NULL, -/* 726 */ NULL, -/* 727 */ NULL, -/* 728 */ NULL, -/* 729 */ NULL, -/* 730 */ NULL, -/* 731 */ NULL, -/* 732 */ NULL, -/* 733 */ NULL, -/* 734 */ NULL, -/* 735 */ NULL, -/* 736 */ NULL, -/* 737 */ NULL, -/* 738 */ NULL, -/* 739 */ NULL, -/* 740 */ NULL, -/* 741 */ NULL, -/* 742 ERR_MLOCKRESTRICTED */ "%s %c %s :MODE cannot be set due to channel having an active MLOCK restriction policy", -/* 743 */ NULL, -/* 744 */ NULL, -/* 745 */ NULL, -/* 746 */ NULL, -/* 747 */ NULL, -/* 748 */ NULL, -/* 749 */ NULL, -/* 750 */ NULL, -/* 751 */ NULL, -/* 752 */ NULL, -/* 753 */ NULL, -/* 754 */ NULL, -/* 755 */ NULL, -/* 756 */ NULL, -/* 757 */ NULL, -/* 758 */ NULL, -/* 759 */ NULL, -/* 760 */ NULL, -/* 761 */ NULL, -/* 762 */ NULL, -/* 763 */ NULL, -/* 764 */ NULL, -/* 765 */ NULL, -/* 766 */ NULL, -/* 767 */ NULL, -/* 768 */ NULL, -/* 769 */ NULL, -/* 770 */ NULL, -/* 771 */ NULL, /* ithildin */ -/* 772 */ NULL, -/* 773 */ NULL, /* ithildin */ -/* 774 */ NULL, /* ithildin */ -/* 775 */ NULL, -/* 776 */ NULL, -/* 777 */ NULL, -/* 778 */ NULL, -/* 779 */ NULL, -/* 780 */ NULL, -/* 781 */ NULL, -/* 782 */ NULL, -/* 783 */ NULL, -/* 784 */ NULL, -/* 785 */ NULL, -/* 786 */ NULL, -/* 787 */ NULL, -/* 788 */ NULL, -/* 789 */ NULL, -/* 790 */ NULL, -/* 791 */ NULL, -/* 792 */ NULL, -/* 793 */ NULL, -/* 794 */ NULL, -/* 795 */ NULL, -/* 796 */ NULL, -/* 797 */ NULL, -/* 798 */ NULL, -/* 799 */ NULL, -/* 800 */ NULL, -/* 801 */ NULL, -/* 802 */ NULL, -/* 803 */ NULL, -/* 804 */ NULL, -/* 805 */ NULL, -/* 806 */ NULL, -/* 807 */ NULL, -/* 808 */ NULL, -/* 809 */ NULL, -/* 810 */ NULL, -/* 811 */ NULL, -/* 812 */ NULL, -/* 813 */ NULL, -/* 814 */ NULL, -/* 815 */ NULL, -/* 816 */ NULL, -/* 817 */ NULL, -/* 818 */ NULL, -/* 819 */ NULL, -/* 820 */ NULL, -/* 821 */ NULL, -/* 822 */ NULL, -/* 823 */ NULL, -/* 824 */ NULL, -/* 825 */ NULL, -/* 826 */ NULL, -/* 827 */ NULL, -/* 828 */ NULL, -/* 829 */ NULL, -/* 830 */ NULL, -/* 831 */ NULL, -/* 832 */ NULL, -/* 833 */ NULL, -/* 834 */ NULL, -/* 835 */ NULL, -/* 836 */ NULL, -/* 837 */ NULL, -/* 838 */ NULL, -/* 839 */ NULL, -/* 840 */ NULL, -/* 841 */ NULL, -/* 842 */ NULL, -/* 843 */ NULL, -/* 844 */ NULL, -/* 845 */ NULL, -/* 846 */ NULL, -/* 847 */ NULL, -/* 848 */ NULL, -/* 849 */ NULL, -/* 850 */ NULL, -/* 851 */ NULL, -/* 852 */ NULL, -/* 853 */ NULL, -/* 854 */ NULL, -/* 855 */ NULL, -/* 856 */ NULL, -/* 857 */ NULL, -/* 858 */ NULL, -/* 859 */ NULL, -/* 860 */ NULL, -/* 861 */ NULL, -/* 862 */ NULL, -/* 863 */ NULL, -/* 864 */ NULL, -/* 865 */ NULL, -/* 866 */ NULL, -/* 867 */ NULL, -/* 868 */ NULL, -/* 869 */ NULL, -/* 870 */ NULL, -/* 871 */ NULL, -/* 872 */ NULL, -/* 873 */ NULL, -/* 874 */ NULL, -/* 875 */ NULL, -/* 876 */ NULL, -/* 877 */ NULL, -/* 878 */ NULL, -/* 879 */ NULL, -/* 880 */ NULL, -/* 881 */ NULL, -/* 882 */ NULL, -/* 883 */ NULL, -/* 884 */ NULL, -/* 885 */ NULL, -/* 886 */ NULL, -/* 887 */ NULL, -/* 888 */ NULL, -/* 889 */ NULL, -/* 890 */ NULL, -/* 891 */ NULL, -/* 892 */ NULL, -/* 893 */ NULL, -/* 894 */ NULL, -/* 895 */ NULL, -/* 896 */ NULL, -/* 897 */ NULL, -/* 898 */ NULL, -/* 899 */ NULL, -/* 900 RPL_LOGGEDIN */ "%s!%s@%s %s :You are now logged in as %s.", -/* 901 RPL_LOGGEDOUT */ "%s!%s@%s :You are now logged out.", -/* 902 ERR_NICKLOCKED */ ":You must use a nick assigned to you.", -/* 903 RPL_SASLSUCCESS */ ":SASL authentication successful", -/* 904 ERR_SASLFAIL */ ":SASL authentication failed", -/* 905 ERR_SASLTOOLONG */ ":SASL message too long", -/* 906 ERR_SASLABORTED */ ":SASL authentication aborted", -/* 907 ERR_SASLALREADY */ ":You have already completed SASL authentication", -/* 908 RPL_SASLMECHS */ "%s :are available SASL mechanisms", -/* 909 */ NULL, -/* 910 */ NULL, -/* 911 */ NULL, -/* 912 */ NULL, -/* 913 */ NULL, -/* 914 */ NULL, -/* 915 */ NULL, -/* 916 */ NULL, -/* 917 */ NULL, -/* 918 */ NULL, -/* 919 */ NULL, -/* 920 */ NULL, -/* 921 */ NULL, -/* 922 */ NULL, -/* 923 */ NULL, -/* 924 */ NULL, -/* 925 */ NULL, -/* 926 */ NULL, -/* 927 */ NULL, -/* 928 */ NULL, -/* 929 */ NULL, -/* 930 */ NULL, -/* 931 */ NULL, -/* 932 */ NULL, -/* 933 */ NULL, -/* 934 */ NULL, -/* 935 */ NULL, -/* 936 */ NULL, -/* 937 */ NULL, -/* 938 */ NULL, -/* 939 */ NULL, -/* 940 */ NULL, -/* 941 */ NULL, -/* 942 */ NULL, -/* 943 */ NULL, -/* 944 */ NULL, -/* 945 */ NULL, -/* 946 */ NULL, -/* 947 */ NULL, -/* 948 */ NULL, -/* 949 */ NULL, -/* 950 */ NULL, -/* 951 */ NULL, -/* 952 */ NULL, -/* 953 */ NULL, -/* 954 */ NULL, -/* 955 */ NULL, -/* 956 */ NULL, -/* 957 */ NULL, -/* 958 */ NULL, -/* 959 */ NULL, -/* 960 */ NULL, -/* 961 */ NULL, -/* 962 */ NULL, -/* 963 */ NULL, -/* 964 */ NULL, -/* 965 */ NULL, -/* 966 */ NULL, -/* 967 */ NULL, -/* 968 */ NULL, -/* 969 */ NULL, -/* 970 */ NULL, -/* 971 */ NULL, -/* 972 ERR_CANNOTDOCOMMAND */ "%s :%s", -/* 973 */ NULL, /* kineircd */ -/* 974 ERR_CANNOTCHANGECHANMODE */ "%c :%s", -/* 975 */ NULL, /* kineircd */ -/* 976 */ NULL, /* kineircd */ -/* 977 */ NULL, /* kineircd */ -/* 978 */ NULL, /* kineircd */ -/* 979 */ NULL, /* kineircd */ -/* 980 */ NULL, /* kineircd */ -/* 981 */ NULL, /* kineircd */ -/* 982 */ NULL, /* kineircd */ -/* 983 */ NULL, /* kineircd */ -/* 984 */ NULL, -/* 985 */ NULL, -/* 986 */ NULL, -/* 987 */ NULL, -/* 988 */ NULL, -/* 989 */ NULL, -/* 990 */ NULL, -/* 991 */ NULL, -/* 992 */ NULL, -/* 993 */ NULL, -/* 994 */ NULL, -/* 995 */ NULL, -/* 996 */ NULL, -/* 997 */ NULL, -/* 998 */ NULL, -/* 999 ERR_NUMERICERR */ "Numeric error!", -/* 1000 */ NULL, -}; - -char *getreply(int numeric) -{ - if ((numeric < 0) || (numeric > 999) || !replies[numeric]) - return replies[ERR_NUMERICERR]; - else - return replies[numeric]; -} diff --git a/src/openssl_hostname_validation.c b/src/openssl_hostname_validation.c index 5d9f0eb..cd1695c 100644 --- a/src/openssl_hostname_validation.c +++ b/src/openssl_hostname_validation.c @@ -146,7 +146,7 @@ static char Curl_raw_toupper(char in) static int Curl_raw_equal(const char *first, const char *second) { while(*first && *second) { - if(Curl_raw_toupper(*first) != Curl_raw_toupper(*second)) + if (Curl_raw_toupper(*first) != Curl_raw_toupper(*second)) /* get out of the loop as soon as they don't match */ break; first++; @@ -161,14 +161,14 @@ static int Curl_raw_equal(const char *first, const char *second) static int Curl_raw_nequal(const char *first, const char *second, size_t max) { while(*first && *second && max) { - if(Curl_raw_toupper(*first) != Curl_raw_toupper(*second)) { + if (Curl_raw_toupper(*first) != Curl_raw_toupper(*second)) { break; } max--; first++; second++; } - if(0 == max) + if (0 == max) return 1; /* they are equal this far */ return Curl_raw_toupper(*first) == Curl_raw_toupper(*second); @@ -189,7 +189,7 @@ static int hostmatch(const char *hostname, const char *pattern) int wildcard_enabled; size_t prefixlen, suffixlen; pattern_wildcard = strchr(pattern, '*'); - if(pattern_wildcard == NULL) + if (pattern_wildcard == NULL) return Curl_raw_equal(pattern, hostname) ? CURL_HOST_MATCH : CURL_HOST_NOMATCH; @@ -197,24 +197,24 @@ static int hostmatch(const char *hostname, const char *pattern) match. */ wildcard_enabled = 1; pattern_label_end = strchr(pattern, '.'); - if(pattern_label_end == NULL || strchr(pattern_label_end+1, '.') == NULL || + if (pattern_label_end == NULL || strchr(pattern_label_end+1, '.') == NULL || pattern_wildcard > pattern_label_end || Curl_raw_nequal(pattern, "xn--", 4)) { wildcard_enabled = 0; } - if(!wildcard_enabled) + if (!wildcard_enabled) return Curl_raw_equal(pattern, hostname) ? CURL_HOST_MATCH : CURL_HOST_NOMATCH; hostname_label_end = strchr(hostname, '.'); - if(hostname_label_end == NULL || + if (hostname_label_end == NULL || !Curl_raw_equal(pattern_label_end, hostname_label_end)) return CURL_HOST_NOMATCH; /* The wildcard must match at least one character, so the left-most label of the hostname is at least as large as the left-most label of the pattern. */ - if(hostname_label_end - hostname < pattern_label_end - pattern) + if (hostname_label_end - hostname < pattern_label_end - pattern) return CURL_HOST_NOMATCH; prefixlen = pattern_wildcard - pattern; @@ -227,14 +227,14 @@ static int hostmatch(const char *hostname, const char *pattern) int Curl_cert_hostcheck(const char *match_pattern, const char *hostname) { - if(!match_pattern || !*match_pattern || + if (!match_pattern || !*match_pattern || !hostname || !*hostname) /* sanity check */ return 0; - if(Curl_raw_equal(hostname, match_pattern)) /* trivial case */ + if (Curl_raw_equal(hostname, match_pattern)) /* trivial case */ return 1; - if(hostmatch(hostname,match_pattern) == CURL_HOST_MATCH) + if (hostmatch(hostname,match_pattern) == CURL_HOST_MATCH) return 1; return 0; } @@ -388,7 +388,7 @@ static HostnameValidationResult matches_subject_alternative_name(const char *hos HostnameValidationResult validate_hostname(const char *hostname, const X509 *server_cert) { HostnameValidationResult result; - if((hostname == NULL) || (server_cert == NULL)) + if ((hostname == NULL) || (server_cert == NULL)) return Error; // First try the Subject Alternative Names extension diff --git a/src/operclass.c b/src/operclass.c index 86899ca..0eaaa1e 100644 --- a/src/operclass.c +++ b/src/operclass.c @@ -29,7 +29,7 @@ struct OperClassValidator OperClassCallbackNode *node; }; -OperClassACLPath *OperClass_parsePath(char *path); +OperClassACLPath *OperClass_parsePath(const char *path); void OperClass_freePath(OperClassACLPath *path); OperClassPathNode *OperClass_findPathNodeForIdentifier(char *identifier, OperClassPathNode *head); @@ -111,7 +111,7 @@ void OperClassValidatorDel(OperClassValidator *validator) safe_free(validator); } -OperClassACLPath *OperClass_parsePath(char *path) +OperClassACLPath *OperClass_parsePath(const char *path) { char *pathCopy = raw_strdup(path); OperClassACLPath *pathHead = NULL; @@ -279,7 +279,7 @@ OperPermission ValidatePermissionsForPathEx(OperClassACL *acl, OperClassACLPath return OPER_DENY; } -OperPermission ValidatePermissionsForPath(char *path, Client *client, Client *victim, Channel *channel, void *extra) +OperPermission ValidatePermissionsForPath(const char *path, Client *client, Client *victim, Channel *channel, const void *extra) { ConfigItem_oper *ce_oper; ConfigItem_operclass *ce_operClass; diff --git a/src/parse.c b/src/parse.c index 6966958..473453a 100644 --- a/src/parse.c +++ b/src/parse.c @@ -29,11 +29,11 @@ char backupbuf[8192]; static char *para[MAXPARA + 2]; /* Forward declarations of functions that are local (static) */ -static int do_numeric(int, Client *, MessageTag *, int, char **); +static int do_numeric(int, Client *, MessageTag *, int, const char **); static void cancel_clients(Client *, Client *, char *); static void remove_unknown(Client *, char *); -static void parse2(Client *client, Client **fromptr, MessageTag *mtags, char *ch); -static void parse_addlag(Client *client, int cmdbytes); +static void parse2(Client *client, Client **fromptr, MessageTag *mtags, int mtags_bytes, char *ch); +static void parse_addlag(Client *client, int command_bytes, int mtags_bytes); static int client_lagged_up(Client *client); static void ban_handshake_data_flooder(Client *client); @@ -63,7 +63,8 @@ int process_packet(Client *client, char *readbuf, int length, int killsafely) /* flood from unknown connection */ if (IsUnknown(client) && (DBufLength(&client->local->recvQ) > iConf.handshake_data_flood_amount)) { - sendto_snomask(SNO_FLOOD, "Handshake data flood from %s detected", client->local->sockhost); + unreal_log(ULOG_INFO, "flood", "HANDSHAKE_DATA_FLOOD", client, + "Handshake data flood detected from $client.details [$client.ip]"); if (!killsafely) ban_handshake_data_flooder(client); else @@ -74,12 +75,10 @@ int process_packet(Client *client, char *readbuf, int length, int killsafely) /* excess flood check */ if (IsUser(client) && DBufLength(&client->local->recvQ) > get_recvq(client)) { - sendto_snomask(SNO_FLOOD, - "*** Flood -- %s!%s@%s (%d) exceeds %d recvQ", - client->name[0] ? client->name : "*", - client->user ? client->user->username : "*", - client->user ? client->user->realhost : "*", - DBufLength(&client->local->recvQ), get_recvq(client)); + unreal_log(ULOG_INFO, "flood", "RECVQ_EXCEEDED", client, + "Flood from $client.details [$client.ip] exceeds class::recvq ($recvq > $class_recvq) (Client sending too much data)", + log_data_integer("recvq", DBufLength(&client->local->recvQ)), + log_data_integer("class_recvq", get_recvq(client))); if (!killsafely) exit_client(client, NULL, "Excess Flood"); else @@ -105,7 +104,7 @@ void parse_client_queued(Client *client) return; /* we delay processing of data until identd has replied */ if (!IsUser(client) && !IsServer(client) && (iConf.handshake_delay > 0) && - !IsNoHandshakeDelay(client) && (TStime() - client->local->firsttime < iConf.handshake_delay)) + !IsNoHandshakeDelay(client) && (TStime() - client->local->creationtime < iConf.handshake_delay)) { return; /* we delay processing of data until set::handshake-delay is reached */ } @@ -140,21 +139,11 @@ void parse_client_queued(Client *client) */ void dopacket(Client *client, char *buffer, int length) { - me.local->receiveB += length; /* Update bytes received */ - client->local->receiveB += length; - if (client->local->receiveB > 1023) - { - client->local->receiveK += (client->local->receiveB >> 10); - client->local->receiveB &= 0x03ff; /* 2^10 = 1024, 3ff = 1023 */ - } - if (me.local->receiveB > 1023) - { - me.local->receiveK += (me.local->receiveB >> 10); - me.local->receiveB &= 0x03ff; - } + client->local->traffic.bytes_received += length; + me.local->traffic.bytes_received += length; - me.local->receiveM += 1; /* Update messages received */ - client->local->receiveM += 1; + client->local->traffic.messages_received++; + me.local->traffic.messages_received++; parse(client, buffer, length); } @@ -175,6 +164,7 @@ void parse(Client *cptr, char *buffer, int length) char *ch; int i, ret; MessageTag *mtags = NULL; + int mtags_bytes = 0; /* Take extreme care in this function, as messages can be up to READBUFSIZE * in size, which is 8192 at the time of writing. @@ -184,18 +174,17 @@ void parse(Client *cptr, char *buffer, int length) for (h = Hooks[HOOKTYPE_PACKET]; h; h = h->next) { (*(h->func.intfunc))(from, &me, NULL, &buffer, &length); - if(!buffer) + if (!buffer) return; } - Debug((DEBUG_ERROR, "Parsing: %s (from %s)", buffer, (*cptr->name ? cptr->name : "*"))); - if (IsDeadSocket(cptr)) return; - if ((cptr->local->receiveK >= iConf.handshake_data_flood_amount/1024) && IsUnknown(cptr)) + if ((cptr->local->traffic.bytes_received >= iConf.handshake_data_flood_amount) && IsUnknown(cptr)) { - sendto_snomask(SNO_FLOOD, "Handshake data flood from %s detected", cptr->local->sockhost); + unreal_log(ULOG_INFO, "flood", "HANDSHAKE_DATA_FLOOD", cptr, + "Handshake data flood detected from $client.details [$client.ip]"); ban_handshake_data_flooder(cptr); return; } @@ -203,8 +192,10 @@ void parse(Client *cptr, char *buffer, int length) /* This stores the last executed command in 'backupbuf', useful for debugging crashes */ strlcpy(backupbuf, buffer, sizeof(backupbuf)); -#if defined(DEBUGMODE) && defined(RAWCMDLOGGING) - ircd_log(LOG_ERROR, "<- %s: %s", cptr->name, backupbuf); +#if defined(RAWCMDLOGGING) + unreal_log(ULOG_INFO, "rawtraffic", "TRAFFIC_IN", cptr, + "<- $client: $data", + log_data_string("data", backupbuf)); #endif /* This poisons unused para elements that code should never access */ @@ -218,31 +209,35 @@ void parse(Client *cptr, char *buffer, int length) /* Now, parse message tags, if any */ if (*ch == '@') { + char *start = ch; parse_message_tags(cptr, &ch, &mtags); + if (ch - start > 0) + mtags_bytes = ch - start; /* Skip whitespace again */ for (; *ch == ' '; ch++) ; } - parse2(cptr, &from, mtags, ch); + parse2(cptr, &from, mtags, mtags_bytes, ch); if (IsDead(cptr)) - RunHook3(HOOKTYPE_POST_COMMAND, NULL, mtags, ch); + RunHook(HOOKTYPE_POST_COMMAND, NULL, mtags, ch); else - RunHook3(HOOKTYPE_POST_COMMAND, from, mtags, ch); + RunHook(HOOKTYPE_POST_COMMAND, from, mtags, ch); free_message_tags(mtags); return; } /** Parse the remaining line - helper function for parse(). - * @param cptr The client from which the message was received - * @param from The sender, this may be changed by parse2() when - * the message has a sender, eg :xyz PRIVMSG .. - * @param mtags Message tags received for this message. - * @param ch The incoming line received (buffer), excluding message tags. + * @param cptr The client from which the message was received + * @param from The sender, this may be changed by parse2() when + * the message has a sender, eg :xyz PRIVMSG .. + * @param mtags Message tags received for this message. + * @param mtags_bytes The length of all message tags. + * @param ch The incoming line received (buffer), excluding message tags. */ -static void parse2(Client *cptr, Client **fromptr, MessageTag *mtags, char *ch) +static void parse2(Client *cptr, Client **fromptr, MessageTag *mtags, int mtags_bytes, char *ch) { Client *from = cptr; char *s; @@ -328,12 +323,12 @@ static void parse2(Client *cptr, Client **fromptr, MessageTag *mtags, char *ch) ch++; } - RunHook3(HOOKTYPE_PRE_COMMAND, from, mtags, ch); + RunHook(HOOKTYPE_PRE_COMMAND, from, mtags, ch); if (*ch == '\0') { if (!IsServer(cptr)) - cptr->local->since++; /* 1s fake lag */ + cptr->local->fake_lag++; /* 1s fake lag */ return; } @@ -351,7 +346,7 @@ static void parse2(Client *cptr, Client **fromptr, MessageTag *mtags, char *ch) numeric = (*ch - '0') * 100 + (*(ch + 1) - '0') * 10 + (*(ch + 2) - '0'); paramcount = MAXPARA; ircstats.is_num++; - parse_addlag(cptr, bytes); + parse_addlag(cptr, bytes, mtags_bytes); } else { @@ -377,7 +372,7 @@ static void parse2(Client *cptr, Client **fromptr, MessageTag *mtags, char *ch) if (!cmptr || !(cmptr->flags & CMD_NOLAG)) { /* Add fake lag (doing this early in the code, so we don't forget) */ - parse_addlag(cptr, bytes); + parse_addlag(cptr, bytes, mtags_bytes); } if (!cmptr) { @@ -402,8 +397,6 @@ static void parse2(Client *cptr, Client **fromptr, MessageTag *mtags, char *ch) sendto_one(from, NULL, ":%s %d %s %s :Unknown command", me.name, ERR_UNKNOWNCOMMAND, from->name, ch); - Debug((DEBUG_ERROR, "Unknown (%s) from %s", - ch, get_client_name(cptr, TRUE))); } } ircstats.is_unco++; @@ -492,34 +485,34 @@ static void parse2(Client *cptr, Client **fromptr, MessageTag *mtags, char *ch) if (cmptr == NULL) { - do_numeric(numeric, from, mtags, i, para); + do_numeric(numeric, from, mtags, i, (const char **)para); return; } cmptr->count++; if (IsUser(cptr) && (cmptr->flags & CMD_RESETIDLE)) - cptr->local->last = TStime(); + cptr->local->idle_since = TStime(); /* Now ready to execute the command */ #ifndef DEBUGMODE if (cmptr->flags & CMD_ALIAS) { - (*cmptr->aliasfunc) (from, mtags, i, para, cmptr->cmd); + (*cmptr->aliasfunc) (from, mtags, i, (const char **)para, cmptr->cmd); } else { if (!cmptr->overriders) - (*cmptr->func) (from, mtags, i, para); + (*cmptr->func) (from, mtags, i, (const char **)para); else - (*cmptr->overriders->func) (cmptr->overriders, from, mtags, i, para); + (*cmptr->overriders->func) (cmptr->overriders, from, mtags, i, (const char **)para); } #else then = clock(); if (cmptr->flags & CMD_ALIAS) { - (*cmptr->aliasfunc) (from, mtags, i, para, cmptr->cmd); + (*cmptr->aliasfunc) (from, mtags, i, (const char **)para, cmptr->cmd); } else { if (!cmptr->overriders) - (*cmptr->func) (from, mtags, i, para); + (*cmptr->func) (from, mtags, i, (const char **)para); else - (*cmptr->overriders->func) (cmptr->overriders, from, mtags, i, para); + (*cmptr->overriders->func) (cmptr->overriders, from, mtags, i, (const char **)para); } if (!IsDead(cptr)) { @@ -528,7 +521,6 @@ static void parse2(Client *cptr, Client **fromptr, MessageTag *mtags, char *ch) cmptr->rticks += ticks; else cmptr->lticks += ticks; - cptr->local->cputime += ticks; } #endif } @@ -568,21 +560,45 @@ static void ban_handshake_data_flooder(Client *client) * be able to flood at full speed causing potentially many Mbits or even * GBits of data to be sent out to other clients. * - * @param client The client. - * @param cmdbytes Number of bytes in the command. + * @param client The client. + * @param command_bytes Command length in bytes (excluding message tagss) + * @param mtags_bytes Length of message tags in bytes */ -void parse_addlag(Client *client, int cmdbytes) +void parse_addlag(Client *client, int command_bytes, int mtags_bytes) { + FloodSettings *settings = get_floodsettings_for_user(client, FLD_LAG_PENALTY); + if (!IsServer(client) && !IsNoFakeLag(client) && #ifdef FAKELAG_CONFIGURABLE !(client->local->class && (client->local->class->options & CLASS_OPT_NOFAKELAG)) && #endif !ValidatePermissionsForPath("immune:lag",client,NULL,NULL,NULL)) { - client->local->since += (1 + cmdbytes/90); + int lag_penalty = settings->period[FLD_LAG_PENALTY]; + int lag_penalty_bytes = settings->limit[FLD_LAG_PENALTY]; + + client->local->fake_lag_msec += (1 + (command_bytes/lag_penalty_bytes) + (mtags_bytes/lag_penalty_bytes)) * lag_penalty; + + /* This code takes into account not only the msecs we just calculated + * but also any leftover msec from previous lagging up. + */ + client->local->fake_lag += (client->local->fake_lag_msec / 1000); + client->local->fake_lag_msec = client->local->fake_lag_msec % 1000; } } +/* Add extra fake lag to client, such as after a failed oper attempt. + */ +void add_fake_lag(Client *client, long msec) +{ + if (!MyConnect(client)) + return; + + client->local->fake_lag_msec += msec; + client->local->fake_lag += (client->local->fake_lag_msec / 1000); + client->local->fake_lag_msec = client->local->fake_lag_msec % 1000; +} + /** Returns 1 if the client is lagged up and data should NOT be parsed. * See also parse_addlag() for more information on "fake lag". * @param client The client to check @@ -596,7 +612,7 @@ static int client_lagged_up(Client *client) return 0; if (ValidatePermissionsForPath("immune:lag",client,NULL,NULL,NULL)) return 0; - if (client->local->since - TStime() < 10) + if (client->local->fake_lag - TStime() < 10) return 0; return 1; } @@ -611,18 +627,19 @@ static int client_lagged_up(Client *client) * @note In general you should NOT send anything back if you receive * a numeric, this to prevent creating loops. */ -static int do_numeric(int numeric, Client *client, MessageTag *recv_mtags, int parc, char *parv[]) +static int do_numeric(int numeric, Client *client, MessageTag *recv_mtags, int parc, const char *parv[]) { Client *acptr; Channel *channel; char *nick, *p; int i; char buffer[BUFSIZE]; + char targets[BUFSIZE]; if ((numeric < 0) || (numeric > 999)) return -1; - if (MyConnect(client) && !IsServer(client) && !IsUser(client) && IsHandshake(client) && client->serv && !IsServerSent(client)) + if (MyConnect(client) && !IsServer(client) && !IsUser(client) && IsHandshake(client) && client->server && !IsServerSent(client)) { /* This is an outgoing server connect that is currently not yet IsServer() but in 'unknown' state. * We need to handle a few responses here. @@ -631,7 +648,7 @@ static int do_numeric(int numeric, Client *client, MessageTag *recv_mtags, int p /* STARTTLS: unknown command */ if ((numeric == 451) && (parc > 2) && strstr(parv[1], "STARTTLS")) { - if (client->serv->conf && (client->serv->conf->outgoing.options & CONNECT_INSECURE)) + if (client->server->conf && (client->server->conf->outgoing.options & CONNECT_INSECURE)) start_server_handshake(client); else reject_insecure_server(client); @@ -641,7 +658,9 @@ static int do_numeric(int numeric, Client *client, MessageTag *recv_mtags, int p /* STARTTLS failed */ if (numeric == 691) { - sendto_umode(UMODE_OPER, "STARTTLS failed for link %s. Please check the other side of the link.", client->name); + unreal_log(ULOG_WARNING, "link", "STARTTLS_FAILED", client, + "Switching from plaintext to TLS via STARTTLS failed for server $client, this is unusual. " + "Please check the other side of the link for errors."); reject_insecure_server(client); return 0; } @@ -652,7 +671,8 @@ static int do_numeric(int numeric, Client *client, MessageTag *recv_mtags, int p int ret = client_starttls(client); if (ret < 0) { - sendto_umode(UMODE_OPER, "STARTTLS handshake failed for link %s. Strange.", client->name); + unreal_log(ULOG_WARNING, "link", "STARTTLS_FAILED", client, + "Switching from plaintext to TLS via STARTTLS failed for server $client, this is unusual."); reject_insecure_server(client); return ret; } @@ -680,7 +700,8 @@ static int do_numeric(int numeric, Client *client, MessageTag *recv_mtags, int p concat_params(buffer, sizeof(buffer), parc, parv); /* Now actually process the numeric, IOTW: send it on */ - for (; (nick = strtoken(&p, parv[1], ",")); parv[1] = NULL) + strlcpy(targets, parv[1], sizeof(targets)); + for (nick = strtoken(&p, targets, ","); nick; nick = strtoken(&p, NULL, ",")) { if ((acptr = find_client(nick, NULL))) { @@ -710,7 +731,7 @@ static int do_numeric(int numeric, Client *client, MessageTag *recv_mtags, int p sendto_prefix_one(acptr, client, recv_mtags, ":%s %d %s", client->name, numeric, buffer); } - else if ((channel = find_channel(nick, NULL))) + else if ((channel = find_channel(nick))) { sendto_channel(channel, client, client->direction, 0, 0, SEND_ALL, recv_mtags, @@ -739,10 +760,6 @@ static void remove_unknown(Client *client, char *sender) if (!IsServer(client)) return; -#ifdef DEVELOP - sendto_ops("Killing %s (%s)", sender, backupbuf); - return; -#endif /* * Do kill if it came from a server because it means there is a ghost * user on the other server which needs to be removed. -avalon diff --git a/src/random.c b/src/random.c index 0fc33bc..ebb65cb 100644 --- a/src/random.c +++ b/src/random.c @@ -276,7 +276,7 @@ chacha_encrypt_bytes(chacha_ctx *x,const u8 *m,u8 *c,u32 bytes) */ /* Modified for UnrealIRCd by Bram Matthys ("Syzop") in 2019. - * Things like taking out #if(n)def's for openssl (which we always + * Things like taking out #if (n)def's for openssl (which we always * compile with), re-indenting, removing various stuff, etc. */ @@ -308,8 +308,9 @@ static void _rs_stir(void) if (RAND_bytes(rnd, sizeof(rnd)) <= 0) { - ircd_log(LOG_ERROR, "Couldn't obtain random bytes (error 0x%lx)", - (unsigned long)ERR_get_error()); + unreal_log(ULOG_FATAL, "random", "RANDOM_OUT_OF_BYTES", NULL, + "Could not obtain random bytes, error $tls_error_code", + log_data_integer("tls_error_code", ERR_get_error())); abort(); } @@ -422,12 +423,12 @@ static void arc4_addrandom(void *dat, int datlen) void add_entropy_configfile(struct stat *st, char *buf) { - unsigned char mdbuf[16]; + char sha256buf[SHA256_DIGEST_LENGTH]; arc4_addrandom(&st->st_size, sizeof(st->st_size)); arc4_addrandom(&st->st_mtime, sizeof(st->st_mtime)); - DoMD5(mdbuf, buf, strlen(buf)); - arc4_addrandom(&mdbuf, sizeof(mdbuf)); + sha256hash_binary(sha256buf, buf, strlen(buf)); + arc4_addrandom(sha256buf, sizeof(sha256buf)); } /* @@ -459,7 +460,6 @@ void init_random() if (fd >= 0) { int n = read(fd, &rdat.rnd, sizeof(rdat.rnd)); - Debug((DEBUG_INFO, "init_random: read from /dev/urandom returned %d", n)); close(fd); } #else diff --git a/src/send.c b/src/send.c index e4284be..13fbaf5 100644 --- a/src/send.c +++ b/src/send.c @@ -28,8 +28,8 @@ /* Some forward declarions are needed */ void vsendto_one(Client *to, MessageTag *mtags, const char *pattern, va_list vl); -void vsendto_prefix_one(Client *to, Client *from, MessageTag *mtags, const char *pattern, va_list vl); -static int vmakebuf_local_withprefix(char *buf, size_t buflen, Client *from, const char *pattern, va_list vl); +void vsendto_prefix_one(Client *to, Client *from, MessageTag *mtags, const char *pattern, va_list vl) __attribute__((format(printf,4,0))); +static int vmakebuf_local_withprefix(char *buf, size_t buflen, Client *from, const char *pattern, va_list vl) __attribute__((format(printf,4,0))); #define ADD_CRLF(buf, len) { if (len > 510) len = 510; \ buf[len++] = '\r'; buf[len++] = '\n'; buf[len] = '\0'; } while(0) @@ -59,7 +59,7 @@ MODVAR int current_serial; * @param to Client to mark as dead * @param notice The quit reason to use */ -int dead_socket(Client *to, char *notice) +int dead_socket(Client *to, const char *notice) { DBufClear(&to->local->recvQ); DBufClear(&to->local->sendQ); @@ -76,9 +76,14 @@ int dead_socket(Client *to, char *notice) return -1; /* don't overwrite & don't send multiple times */ if (!IsUser(to) && !IsUnknown(to) && !IsClosing(to)) - sendto_ops_and_log("Link to server %s (%s) closed: %s", - to->name, to->ip?to->ip:"", notice); - Debug((DEBUG_ERROR, "dead_socket: %s - %s", notice, get_client_name(to, FALSE))); + { + /* Looks like a duplicate error message to me? + * If so, remove it here. + */ + unreal_log(ULOG_ERROR, "link", "LINK_CLOSING", to, + "Link to server $client.details closed: $reason", + log_data_string("reason", notice)); + } safe_strdup(to->local->error_str, notice); return -1; } @@ -123,7 +128,6 @@ int send_queued(Client *to) return dead_socket(to, buf); } dbuf_delete(&to->local->sendQ, rlen); - to->local->lastsq = DBufLength(&to->local->sendQ) / 1024; if (want_read) { /* SSL_write indicated that it cannot write data at this @@ -207,9 +211,17 @@ void sendto_one(Client *to, MessageTag *mtags, FORMAT_STRING(const char *pattern */ void vsendto_one(Client *to, MessageTag *mtags, const char *pattern, va_list vl) { - char *mtags_str = mtags ? mtags_to_string(mtags, to) : NULL; + const char *mtags_str = mtags ? mtags_to_string(mtags, to) : NULL; + /* Need to ignore -Wformat-nonliteral here */ +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wformat-nonliteral" +#endif ircvsnprintf(sendbuf, sizeof(sendbuf), pattern, vl); +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#endif if (BadPtr(mtags_str)) { @@ -248,8 +260,6 @@ void sendbufto_one(Client *to, char *msg, unsigned int quick) Hook *h; Client *intended_to = to; - Debug((DEBUG_ERROR, "Sending [%s] to %s", msg, to->name)); - if (to->direction) to = to->direction; if (IsDeadSocket(to)) @@ -259,11 +269,7 @@ void sendbufto_one(Client *to, char *msg, unsigned int quick) { /* This is normal when 'to' was being closed (via exit_client * and close_connection) --Run - * Print the debug message anyway... */ - Debug((DEBUG_ERROR, - "Local socket %s with negative fd %d... AARGH!", to->name, - to->local->fd)); return; } @@ -289,14 +295,17 @@ void sendbufto_one(Client *to, char *msg, unsigned int quick) p = strchr(msg+1, ' '); if (!p) { - ircd_log(LOG_ERROR, "[BUG] sendbufto_one(): Malformed message: %s", - msg); + unreal_log(ULOG_WARNING, "send", "SENDBUFTO_ONE_MALFORMED_MSG", to, + "Malformed message to $client: $buf", + log_data_string("buf", msg)); return; } - if (p - msg > 500) + if (p - msg > 4094) { - ircd_log(LOG_ERROR, "[BUG] sendbufto_one(): Spec-wise legal, but massively oversized message-tag (len %d)", - (int)(p - msg)); + unreal_log(ULOG_WARNING, "send", "SENDBUFTO_ONE_OVERSIZED_MSG", to, + "Oversized message to $client (length $length): $buf", + log_data_integer("length", p - msg), + log_data_string("buf", msg)); return; } p++; /* skip space character */ @@ -315,10 +324,17 @@ void sendbufto_one(Client *to, char *msg, unsigned int quick) len = quick; } - if (len >= 1024) + if (len >= 10240) { - ircd_log(LOG_ERROR, "sendbufto_one: len=%d, quick=%u", len, quick); + unreal_log(ULOG_WARNING, "send", "SENDBUFTO_ONE_OVERSIZED_MSG2", to, + "Oversized message to $client (length $length): $buf", + log_data_integer("length", len), + log_data_string("buf", msg)); +#ifdef DEBUGMODE abort(); +#else + return; +#endif } if (IsMe(to)) @@ -327,9 +343,9 @@ void sendbufto_one(Client *to, char *msg, unsigned int quick) p = strchr(msg, '\r'); if (p) *p = '\0'; - snprintf(tmp_msg, 500, "Trying to send data to myself! '%s'", msg); - ircd_log(LOG_ERROR, "%s", tmp_msg); - sendto_ops("%s", tmp_msg); /* recursion? */ + unreal_log(ULOG_WARNING, "send", "SENDBUFTO_ONE_ME_MESSAGE", to, + "Trying to send data to myself: $buf", + log_data_string("buf", tmp_msg)); return; } @@ -340,7 +356,7 @@ void sendbufto_one(Client *to, char *msg, unsigned int quick) return; } -#if defined(DEBUGMODE) && defined(RAWCMDLOGGING) +#if defined(RAWCMDLOGGING) { char copy[512], *p; strlcpy(copy, msg, len > sizeof(copy) ? sizeof(copy) : len); @@ -348,16 +364,18 @@ void sendbufto_one(Client *to, char *msg, unsigned int quick) if (p) *p = '\0'; p = strchr(copy, '\r'); if (p) *p = '\0'; - ircd_log(LOG_ERROR, "-> %s: %s", to->name, copy); + unreal_log(ULOG_INFO, "rawtraffic", "TRAFFIC_OUT", to, + "-> $client: $data", + log_data_string("data", copy)); } #endif if (DBufLength(&to->local->sendQ) > get_sendq(to)) { - if (IsServer(to)) - sendto_ops("Max SendQ limit exceeded for %s: %u > %d", - get_client_name(to, FALSE), DBufLength(&to->local->sendQ), - get_sendq(to)); + unreal_log(ULOG_INFO, "flood", "SENDQ_EXCEEDED", to, + "Flood of queued data to $client.details [$client.ip] exceeds class::sendq ($sendq > $class_sendq) (Too much data queued to be sent to this client)", + log_data_integer("sendq", DBufLength(&to->local->sendQ)), + log_data_integer("class_sendq", get_sendq(to))); dead_socket(to, "Max SendQ exceeded"); return; } @@ -370,8 +388,8 @@ void sendbufto_one(Client *to, char *msg, unsigned int quick) * only really sent. Queued bytes get updated in SendQueued. */ // FIXME: something is wrong here, I think we do double counts, either in message or in traffic, I forgot.. CHECK !!!! - to->local->sendM += 1; - me.local->sendM += 1; + to->local->traffic.messages_sent++; + me.local->traffic.messages_sent++; /* Previously we ran send_queued() here directly, but that is * a bad idea, CPU-wise. So now we just mark the client indicating @@ -385,11 +403,11 @@ void sendbufto_one(Client *to, char *msg, unsigned int quick) * now there is 1 single function. This also means that you most * likely will pass NULL or 0 as some parameters. * @param channel The channel to send to - * @param from The source of the message - * @param skip The client to skip (can be NULL). - * Note that if you specify a remote link then - * you usually mean xyz->direction and not xyz. - * @param prefix Any combination of PREFIX_* (can be 0 for all) + * @param from The source of the message + * @param skip The client to skip (can be NULL). + * Note that if you specify a remote link then + * you usually mean xyz->direction and not xyz. + * @param member_modes Require any of the member_modes to be set (eg: "o"), or NULL to skip this check. * @param clicap Client capability the recipient should have * (this only works for local clients, we will * always send the message to remote clients and @@ -414,14 +432,14 @@ void sendbufto_one(Client *to, char *msg, unsigned int quick) * sendnumeric(client, ERR_NEEDMOREPARAMS, "SAYHELLO"); * return; * } - * channel = find_channel(parv[1], NULL); + * channel = find_channel(parv[1]); * if (!channel) * { * sendnumeric(client, ERR_NOSUCHCHANNEL, parv[1]); * return; * } * new_message(client, recv_mtags, &mtags); - * sendto_channel(channel, client, client->direction, 0, 0, + * sendto_channel(channel, client, client->direction, NULL, 0, * SEND_LOCAL|SEND_REMOTE, mtags, * ":%s PRIVMSG %s :Hello everyone!!!", * client->name, channel->name); @@ -430,13 +448,20 @@ void sendbufto_one(Client *to, char *msg, unsigned int quick) * @endcode */ void sendto_channel(Channel *channel, Client *from, Client *skip, - int prefix, long clicap, int sendflags, + char *member_modes, long clicap, int sendflags, MessageTag *mtags, FORMAT_STRING(const char *pattern), ...) { va_list vl; Member *lp; Client *acptr; + char member_modes_ext[64]; + + if (member_modes) + { + channel_member_modes_generate_equal_or_greater(member_modes, member_modes_ext, sizeof(member_modes_ext)); + member_modes = member_modes_ext; + } ++current_serial; for (lp = channel->members; lp; lp = lp->next) @@ -452,23 +477,9 @@ void sendto_channel(Channel *channel, Client *from, Client *skip, /* Don't send to NOCTCP clients */ if (has_user_mode(acptr, 'T') && (sendflags & SKIP_CTCP)) continue; - /* Now deal with 'prefix' (if non-zero) */ - if (!prefix) - goto good; - if ((prefix & PREFIX_HALFOP) && (lp->flags & CHFL_HALFOP)) - goto good; - if ((prefix & PREFIX_VOICE) && (lp->flags & CHFL_VOICE)) - goto good; - if ((prefix & PREFIX_OP) && (lp->flags & CHFL_CHANOP)) - goto good; -#ifdef PREFIX_AQ - if ((prefix & PREFIX_ADMIN) && (lp->flags & CHFL_CHANADMIN)) - goto good; - if ((prefix & PREFIX_OWNER) && (lp->flags & CHFL_CHANOWNER)) - goto good; -#endif - continue; -good: + /* Now deal with 'member_modes' (if not NULL) */ + if (member_modes && !check_channel_access_member(lp, member_modes)) + continue; /* Now deal with 'clicap' (if non-zero) */ if (clicap && MyUser(acptr) && ((clicap & CAP_INVERT) ? HasCapabilityFast(acptr, clicap) : !HasCapabilityFast(acptr, clicap))) continue; @@ -629,7 +640,7 @@ void sendto_local_common_channels(Client *user, Client *skip, long clicap, Messa ** addition -- Armin, 8jun90 (gruner@informatik.tu-muenchen.de) */ -static int match_it(Client *one, char *mask, int what) +static int match_it(Client *one, const char *mask, int what) { switch (what) { @@ -651,7 +662,7 @@ static int match_it(Client *one, char *mask, int what) * @param pattern Format string * @param ... Parameters to the format string */ -void sendto_match_butone(Client *one, Client *from, char *mask, int what, +void sendto_match_butone(Client *one, Client *from, const char *mask, int what, MessageTag *mtags, FORMAT_STRING(const char *pattern), ...) { va_list vl; @@ -693,116 +704,6 @@ void sendto_match_butone(Client *one, Client *from, char *mask, int what, } } -/** Send a message to all locally connected IRCOps - * @param pattern The format string / pattern to use. - * @param ... Format string parameters. - */ -void sendto_ops(FORMAT_STRING(const char *pattern), ...) -{ - va_list vl; - Client *acptr; - char nbuf[1024]; - - list_for_each_entry(acptr, &lclient_list, lclient_node) - if (!IsServer(acptr) && !IsMe(acptr) && SendServNotice(acptr)) - { - ircsnprintf(nbuf, sizeof(nbuf), ":%s NOTICE %s :*** ", me.name, acptr->name); - strlcat(nbuf, pattern, sizeof nbuf); - - va_start(vl, pattern); - vsendto_one(acptr, NULL, nbuf, vl); - va_end(vl); - } -} - -/* Hmm.. so local sending is called sendto_ops() and local+remote is sendto_ops_butone(), - * that is weird naming... (TODO fix some day in a new major series) - */ - -/** Send a message to all IRCOps (local and remote), except one. - * @param one Skip sending the message to this client/direction - * @param from The sender (can not be NULL) - * @param pattern The format string / pattern to use. - * @param ... Format string parameters. - */ -void sendto_ops_butone(Client *one, Client *from, FORMAT_STRING(const char *pattern), ...) -{ - va_list vl; - Client *acptr; - - ++current_serial; - list_for_each_entry(acptr, &client_list, client_node) - { - if (!SendWallops(acptr)) - continue; - if (acptr->direction->local->serial == current_serial) /* sent message along it already ? */ - continue; - if (acptr->direction == one) - continue; /* ...was the one I should skip */ - acptr->direction->local->serial = current_serial; - - va_start(vl, pattern); - vsendto_prefix_one(acptr->direction, from, NULL, pattern, vl); - va_end(vl); - } -} - -/** This function does exactly the same as sendto_ops() in practice in 5.x. - * There used to be a difference between sendto_ops() and sendto_realops() - * with regards to user-settable snomasks, but this is no longer the case. - * TODO: remove this function in some future cleanup - */ -void sendto_realops(FORMAT_STRING(const char *pattern), ...) -{ - va_list vl; - Client *acptr; - char nbuf[1024]; - - list_for_each_entry(acptr, &oper_list, special_node) - { - ircsnprintf(nbuf, sizeof(nbuf), ":%s NOTICE %s :*** ", me.name, acptr->name); - strlcat(nbuf, pattern, sizeof nbuf); - - va_start(vl, pattern); - vsendto_one(acptr, NULL, nbuf, vl); - va_end(vl); - } -} - -/** Send a message to all locally connected IRCOps and also log the error. - * @param pattern The format string / pattern to use. - * @param ... Format string parameters. - */ -void sendto_ops_and_log(FORMAT_STRING(const char *pattern), ...) -{ - va_list vl; - char buf[1024]; - - va_start(vl, pattern); - ircvsnprintf(buf, sizeof(buf), pattern, vl); - va_end(vl); - - ircd_log(LOG_ERROR, "%s", buf); - sendto_umode(UMODE_OPER, "%s", buf); -} - -/** This function does exactly the same as sendto_ops_and_log() - * TODO: remove this function in some future cleanup - */ -void sendto_realops_and_log(FORMAT_STRING(const char *fmt), ...) -{ - va_list vl; - static char buf[2048]; - - va_start(vl, fmt); - vsnprintf(buf, sizeof(buf), fmt, vl); - va_end(vl); - - sendto_realops("%s", buf); - ircd_log(LOG_ERROR, "%s", buf); -} - - /** Send a message to all locally connected users with specified user mode. * @param umodes The umode that the recipient should have set (one of UMODE_) * @param pattern The format string / pattern to use. @@ -835,22 +736,13 @@ void sendto_umode_global(int umodes, FORMAT_STRING(const char *pattern), ...) { va_list vl; Client *acptr; + Umode *um; char nbuf[1024]; - int i; char modestr[128]; char *p; /* Convert 'umodes' (int) to 'modestr' (string) */ - *modestr = '\0'; - p = modestr; - for(i = 0; i <= Usermode_highest; i++) - { - if (!Usermode_Table[i].flag) - continue; - if (umodes & Usermode_Table[i].mode) - *p++ = Usermode_Table[i].flag; - } - *p = '\0'; + get_usermode_string_raw_r(umodes, modestr, sizeof(modestr)); list_for_each_entry(acptr, &lclient_list, lclient_node) { @@ -873,66 +765,12 @@ void sendto_umode_global(int umodes, FORMAT_STRING(const char *pattern), ...) } } -/** Send a message to all locally connected users with specified snomask. - * @param snomask The snomask that the recipient should have set (one of SNO_*) - * @param pattern The format string / pattern to use. - * @param ... Format string parameters. - */ -void sendto_snomask(int snomask, FORMAT_STRING(const char *pattern), ...) -{ - va_list vl; - Client *acptr; - char nbuf[2048]; - - va_start(vl, pattern); - ircvsnprintf(nbuf, sizeof(nbuf), pattern, vl); - va_end(vl); - - list_for_each_entry(acptr, &oper_list, special_node) - { - if (acptr->user->snomask & snomask) - sendnotice(acptr, "%s", nbuf); - } -} - -/** Send a message to all users with specified snomask (local and remote users). - * @param snomask The snomask that the recipient should have set (one of SNO_*) - * @param pattern The format string / pattern to use. - * @param ... Format string parameters. - */ -void sendto_snomask_global(int snomask, FORMAT_STRING(const char *pattern), ...) -{ - va_list vl; - Client *acptr; - int i; - char nbuf[2048], snobuf[32], *p; - - va_start(vl, pattern); - ircvsnprintf(nbuf, sizeof(nbuf), pattern, vl); - va_end(vl); - - list_for_each_entry(acptr, &oper_list, special_node) - { - if (acptr->user->snomask & snomask) - sendnotice(acptr, "%s", nbuf); - } - - /* Build snomasks-to-send-to buffer */ - snobuf[0] = '\0'; - for (i = 0, p=snobuf; i<= Snomask_highest; i++) - if (snomask & Snomask_Table[i].mode) - *p++ = Snomask_Table[i].flag; - *p = '\0'; - - sendto_server(NULL, 0, 0, NULL, ":%s SENDSNO %s :%s", me.id, snobuf, nbuf); -} - /** Send CAP DEL and CAP NEW notification to clients supporting it. * This function is mostly meant to be used by the CAP and SASL modules. * @param add Whether the CAP token is added (1) or removed (0) * @param token The CAP token */ -void send_cap_notify(int add, char *token) +void send_cap_notify(int add, const char *token) { Client *client; ClientCapability *clicap = ClientCapabilityFindReal(token); @@ -944,7 +782,7 @@ void send_cap_notify(int add, char *token) { if (add) { - char *args = NULL; + const char *args = NULL; if (clicap) { if (clicap->visible && !clicap->visible(client)) @@ -989,7 +827,7 @@ static int vmakebuf_local_withprefix(char *buf, size_t buflen, Client *from, con va_arg(vl, char *); /* eat first parameter */ *buf = ':'; - strcpy(buf+1, from->name); + strlcpy(buf+1, from->name, buflen-1); if (IsUser(from)) { @@ -998,17 +836,24 @@ static int vmakebuf_local_withprefix(char *buf, size_t buflen, Client *from, con if (*username) { - strcat(buf, "!"); - strcat(buf, username); + strlcat(buf, "!", buflen); + strlcat(buf, username, buflen); } if (*host) { - strcat(buf, "@"); - strcat(buf, host); + strlcat(buf, "@", buflen); + strlcat(buf, host, buflen); } } /* Now build the remaining string */ +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wformat-nonliteral" +#endif ircvsnprintf(buf + strlen(buf), buflen - strlen(buf), &pattern[3], vl); +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#endif } else { @@ -1048,7 +893,7 @@ void sendto_prefix_one(Client *to, Client *from, MessageTag *mtags, FORMAT_STRIN */ void vsendto_prefix_one(Client *to, Client *from, MessageTag *mtags, const char *pattern, va_list vl) { - char *mtags_str = mtags ? mtags_to_string(mtags, to) : NULL; + const char *mtags_str = mtags ? mtags_to_string(mtags, to) : NULL; if (to && from && MyUser(to) && from->user) vmakebuf_local_withprefix(sendbuf, sizeof sendbuf, from, pattern, vl); @@ -1066,65 +911,12 @@ void vsendto_prefix_one(Client *to, Client *from, MessageTag *mtags, const char } } -void sendto_connectnotice(Client *newuser, int disconnect, char *comment) -{ - Client *acptr; - char connect[512]; - - if (!disconnect) - { - RunHook(HOOKTYPE_LOCAL_CONNECT, newuser); - - ircsnprintf(connect, sizeof(connect), - "*** Client connecting: %s (%s@%s) [%s] %s", newuser->name, - newuser->user->username, newuser->user->realhost, newuser->ip, - get_connect_extinfo(newuser)); - } - else - { - ircsnprintf(connect, sizeof(connect), "*** Client exiting: %s (%s@%s) [%s] (%s)", - newuser->name, newuser->user->username, newuser->user->realhost, newuser->ip, comment); - } - - list_for_each_entry(acptr, &oper_list, special_node) - { - if (acptr->user->snomask & SNO_CLIENT) - sendnotice(acptr, "%s", connect); - } -} - -void sendto_fconnectnotice(Client *newuser, int disconnect, char *comment) -{ - Client *acptr; - char connect[512]; - - if (!disconnect) - { - ircsnprintf(connect, sizeof(connect), - "*** Client connecting: %s (%s@%s) [%s] %s", newuser->name, - newuser->user->username, newuser->user->realhost, newuser->ip ? newuser->ip : "0", - get_connect_extinfo(newuser)); - } - else - { - ircsnprintf(connect, sizeof(connect), "*** Client exiting: %s (%s@%s) [%s] (%s)", - newuser->name, newuser->user->username, newuser->user->realhost, - newuser->ip ? newuser->ip : "0", comment); - } - - list_for_each_entry(acptr, &oper_list, special_node) - { - if (acptr->user->snomask & SNO_FCLIENT) - sendto_one(acptr, NULL, ":%s NOTICE %s :%s", newuser->user->server, acptr->name, connect); - } -} - /** Introduce user to all other servers, except the one to skip. * @param one Server to skip (can be NULL) * @param client Client to introduce * @param umodes User modes of client */ -void sendto_serv_butone_nickcmd(Client *one, Client *client, char *umodes) +void sendto_serv_butone_nickcmd(Client *one, MessageTag *mtags, Client *client, const char *umodes) { Client *acptr; @@ -1133,7 +925,7 @@ void sendto_serv_butone_nickcmd(Client *one, Client *client, char *umodes) if (one && acptr == one->direction) continue; - sendto_one_nickcmd(acptr, client, umodes); + sendto_one_nickcmd(acptr, mtags, client, umodes); } } @@ -1142,9 +934,10 @@ void sendto_serv_butone_nickcmd(Client *one, Client *client, char *umodes) * @param client Client to introduce * @param umodes User modes of client */ -void sendto_one_nickcmd(Client *server, Client *client, char *umodes) +void sendto_one_nickcmd(Client *server, MessageTag *mtags, Client *client, const char *umodes) { char *vhost; + char mtags_generated = 0; if (!*umodes) umodes = "+"; @@ -1164,13 +957,22 @@ void sendto_one_nickcmd(Client *server, Client *client, char *umodes) vhost = "*"; } - sendto_one(server, NULL, + if (mtags == NULL) + { + moddata_add_s2s_mtags(client, &mtags); + mtags_generated = 1; + } + + sendto_one(server, mtags, ":%s UID %s %d %lld %s %s %s %s %s %s %s %s :%s", - client->srvptr->id, client->name, client->hopcount, + client->uplink->id, client->name, client->hopcount, (long long)client->lastnick, client->user->username, client->user->realhost, client->id, - client->user->svid, umodes, vhost, getcloak(client), + client->user->account, umodes, vhost, getcloak(client), encode_ip(client->ip), client->info); + + if (mtags_generated) + safe_free_message_tags(mtags); } /* sidenote: sendnotice() and sendtxtnumeric() assume no client or server @@ -1205,36 +1007,6 @@ void sendnotice_multiline(Client *client, MultiLine *m) sendnotice(client, "%s", m->line); } - -/** Send numeric message to a client. - * @param to The recipient - * @param numeric The numeric, one of RPL_* or ERR_*, see src/numeric.c - * @param ... The parameters for the numeric - * @note Be sure to provide the correct number and type of parameters that belong to the numeric. Check src/numeric.c when in doubt! - * @section sendnumeric_examples Examples - * @subsection sendnumeric_permission_denied Send "Permission Denied" numeric - * This numeric has no parameter, so is simple: - * @code - * sendnumeric(client, ERR_NOPRIVILEGES); - * @endcode - * @subsection sendnumeric_notenoughparameters Send "Not enough parameters" numeric - * This numeric requires 1 parameter: the name of the command. - * @code - * sendnumeric(client, ERR_NEEDMOREPARAMS, "SOMECOMMAND"); - * @endcode - */ -void sendnumeric(Client *to, int numeric, ...) -{ - va_list vl; - char pattern[512]; - - snprintf(pattern, sizeof(pattern), ":%s %.3d %s %s", me.name, numeric, to->name[0] ? to->name : "*", rpl_str(numeric)); - - va_start(vl, numeric); - vsendto_one(to, NULL, pattern, vl); - va_end(vl); -} - /** Send numeric message to a client - format to user specific needs. * This will ignore the numeric definition of src/numeric.c and always send ":me.name numeric clientname " * followed by the pattern and format string you choose. @@ -1276,6 +1048,56 @@ void sendtxtnumeric(Client *to, FORMAT_STRING(const char *pattern), ...) va_end(vl); } +/** Build buffer in order to send a numeric message to a client - rarely used. + * @param buf The buffer that should be used + * @param buflen The size of the buffer + * @param to The recipient + * @param numeric The numeric, one of RPL_* or ERR_*, see src/numeric.c + * @param pattern The format string / pattern to use. + * @param ... Format string parameters. + */ +void buildnumericfmt(char *buf, size_t buflen, Client *to, int numeric, FORMAT_STRING(const char *pattern), ...) +{ + va_list vl; + char realpattern[512]; + + snprintf(realpattern, sizeof(realpattern), ":%s %.3d %s %s", me.name, numeric, to->name[0] ? to->name : "*", pattern); + + va_start(vl, pattern); + /* Need to ignore -Wformat-nonliteral here */ +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wformat-nonliteral" +#endif + vsnprintf(buf, buflen, realpattern, vl); +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + va_end(vl); +} + +void add_nvplist_numeric_fmt(NameValuePrioList **lst, int priority, const char *name, Client *to, int numeric, FORMAT_STRING(const char *pattern), ...) +{ + va_list vl; + char realpattern[512], buf[512]; + + snprintf(realpattern, sizeof(realpattern), ":%s %.3d %s %s", me.name, numeric, to->name[0] ? to->name : "*", pattern); + + va_start(vl, pattern); + /* Need to ignore -Wformat-nonliteral here */ +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wformat-nonliteral" +#endif + vsnprintf(buf, sizeof(buf), realpattern, vl); +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + va_end(vl); + + add_nvplist(lst, priority, name, buf); +} + /* Send raw data directly to socket, bypassing everything. * Looks like an interesting function to call? NO! STOP! * Don't use this function. It may only be used by the initial @@ -1291,14 +1113,14 @@ void sendtxtnumeric(Client *to, FORMAT_STRING(const char *pattern), ...) * By the way, did I already mention that you SHOULD NOT USE THIS * FUNCTION? ;) */ -void send_raw_direct(Client *user, FORMAT_STRING(FORMAT_STRING(const char *pattern)), ...) +void send_raw_direct(Client *user, FORMAT_STRING(const char *pattern), ...) { va_list vl; int sendlen; *sendbuf = '\0'; va_start(vl, pattern); - sendlen = vmakebuf_local_withprefix(sendbuf, sizeof sendbuf, user, pattern, vl); + sendlen = vmakebuf_local_withprefix(sendbuf, sizeof(sendbuf), user, pattern, vl); va_end(vl); (void)send(user->local->fd, sendbuf, sendlen, 0); } diff --git a/src/serv.c b/src/serv.c index a58b417..6fc1377 100644 --- a/src/serv.c +++ b/src/serv.c @@ -53,14 +53,17 @@ int MODVAR spamf_ugly_vchanoverride = 0; void read_motd(const char *filename, MOTDFile *motd); void do_read_motd(const char *filename, MOTDFile *themotd); -#ifdef USE_LIBCURL -void read_motd_async_downloaded(const char *url, const char *filename, const char *errorbuf, int cached, MOTDDownload *motd_download); -#endif extern MOTDLine *find_file(char *, short); void reread_motdsandrules(); +#if defined(__GNUC__) +/* Temporarily ignore for this function. FIXME later!!! */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wformat-nonliteral" +#endif + /** Send a message upstream if necessary and check if it's for us. * @param client The sender * @param mtags Message tags associated with this message @@ -68,13 +71,24 @@ void reread_motdsandrules(); * @param server This indicates parv[server] contains the destination * @param parc Parameter count (MAX 8!!) * @param parv Parameter values (MAX 8!!) - * @note Command can have only max 8 parameters (parv[8]) - * @note parv[server] is replaced with the name of the matched client. + * @note While sending parv[server] is replaced with the name of the matched client + * (virtually, as parv[] is not actually written to) */ -int hunt_server(Client *client, MessageTag *mtags, char *command, int server, int parc, char *parv[]) +int hunt_server(Client *client, MessageTag *mtags, const char *command, int server, int parc, const char *parv[]) { Client *acptr; - char *saved; + const char *saved; + int i; + char buf[1024]; + + if (strchr(command, '%') || strchr(command, ' ')) + { + unreal_log(ULOG_ERROR, "main", "BUG_HUNT_SERVER", client, + "[BUG] hunt_server called with command '$command' but it may not contain " + "spaces or percentage signs nowadays, it must be ONLY the command.", + log_data_string("command", command)); + abort(); + } /* This would be strange and bad. Previous version assumed "it's for me". Hmm.. okay. */ if (parc <= server || BadPtr(parv[server])) @@ -102,21 +116,46 @@ int hunt_server(Client *client, MessageTag *mtags, char *command, int server, in return HUNTED_NOSUCH; } - /* Replace "server" part with actual servername (eg: 'User' -> 'x.y.net') - * Ugly. Previous version didn't even restore the state, now we do. + /* This puts all parv[] arguments in 'buf' + * Taken from concat_params() but this one is + * with parv[server] magic replacement. */ - saved = parv[server]; - parv[server] = acptr->id; + *buf = '\0'; + for (i = 1; i < parc; i++) + { + const char *param = parv[i]; - sendto_one(acptr, mtags, command, client->id, - parv[1], parv[2], parv[3], parv[4], - parv[5], parv[6], parv[7], parv[8]); + if (!param) + break; - parv[server] = saved; + /* The magic parv[server] replacement: + * this replaces eg 'User' with '001' in S2S traffic. + */ + if (i == server) + param = acptr->id; + + if (*buf) + strlcat(buf, " ", sizeof(buf)); + + if (strchr(param, ' ') || (*param == ':')) + { + /* Last parameter, with : */ + strlcat(buf, ":", sizeof(buf)); + strlcat(buf, parv[i], sizeof(buf)); + break; + } + strlcat(buf, parv[i], sizeof(buf)); + } + + sendto_one(acptr, mtags, ":%s %s %s", client->id, command, buf); return HUNTED_PASS; } +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + #ifndef _WIN32 /** Grab operating system name on Windows (outdated) */ char *getosname(void) @@ -146,12 +185,17 @@ char *getosname(void) #endif /** Helper function to send version strings */ -void send_version(Client *client, int reply) +void send_version(Client *client, int remote) { int i; for (i = 0; ISupportStrings[i]; i++) - sendnumeric(client, reply, ISupportStrings[i]); + { + if (remote) + sendnumeric(client, RPL_REMOTEISUPPORT, ISupportStrings[i]); + else + sendnumeric(client, RPL_ISUPPORT, ISupportStrings[i]); + } } /** VERSION command: @@ -162,11 +206,11 @@ CMD_FUNC(cmd_version) /* Only allow remote VERSIONs if registered -- Syzop */ if (!IsUser(client) && !IsServer(client)) { - send_version(client, RPL_ISUPPORT); + send_version(client, 0); return; } - if (hunt_server(client, recv_mtags, ":%s VERSION :%s", 1, parc, parv) == HUNTED_ISME) + if (hunt_server(client, recv_mtags, "VERSION", 1, parc, parv) == HUNTED_ISME) { sendnumeric(client, RPL_VERSION, version, debugmode, me.name, (ValidatePermissionsForPath("server:info",client,NULL,NULL,NULL) ? serveropts : "0"), @@ -185,9 +229,9 @@ CMD_FUNC(cmd_version) sendnotice(client, "%s", pcre2_version()); } if (MyUser(client)) - send_version(client,RPL_ISUPPORT); + send_version(client,0); else - send_version(client,RPL_REMOTEISUPPORT); + send_version(client,1); } } @@ -206,14 +250,14 @@ void send_proto(Client *client, ConfigItem_link *aconf) */ /* First line */ - sendto_one(client, NULL, "PROTOCTL NOQUIT NICKv2 SJOIN SJOIN2 UMODE2 VL SJ3 TKLEXT TKLEXT2 NICKIP ESVID %s %s", + sendto_one(client, NULL, "PROTOCTL NOQUIT NICKv2 SJOIN SJOIN2 UMODE2 VL SJ3 TKLEXT TKLEXT2 NICKIP ESVID NEXTBANS %s %s", iConf.ban_setter_sync ? "SJSBY" : "", ClientCapabilityFindReal("message-tags") ? "MTAGS" : ""); /* Second line */ - sendto_one(client, NULL, "PROTOCTL CHANMODES=%s%s,%s%s,%s%s,%s%s USERMODES=%s BOOTED=%lld PREFIX=%s SID=%s MLOCK TS=%lld EXTSWHOIS", - CHPAR1, EXPAR1, CHPAR2, EXPAR2, CHPAR3, EXPAR3, CHPAR4, EXPAR4, - umodestring, (long long)me.local->since, prefix->value, + sendto_one(client, NULL, "PROTOCTL CHANMODES=%s%s,%s,%s,%s USERMODES=%s BOOTED=%lld PREFIX=%s SID=%s MLOCK TS=%lld EXTSWHOIS", + CHPAR1, EXPAR1, EXPAR2, EXPAR3, EXPAR4, + umodestring, (long long)me.local->fake_lag, prefix->value, me.id, (long long)TStime()); /* Third line */ @@ -227,7 +271,7 @@ void send_proto(Client *client, ConfigItem_link *aconf) #endif /** Special filter for remote commands */ -int remotecmdfilter(Client *client, int parc, char *parv[]) +int remotecmdfilter(Client *client, int parc, const char *parv[]) { /* no remote requests permitted from non-ircops */ if (MyUser(client) && !ValidatePermissionsForPath("server:remote",client,NULL,NULL,NULL) && !BadPtr(parv[1])) @@ -252,6 +296,7 @@ char *unrealinfo[] = "* Bram Matthys (Syzop) ", "", "Coders:", + "* Krzysztof Beresztant (k4be) ", "* Gottem ", "* i ", "", @@ -286,7 +331,7 @@ void cmd_info_send(Client *client) sendnumericfmt(client, RPL_INFO, ":| UnrealIRCd Homepage: https://www.unrealircd.org"); sendnumericfmt(client, RPL_INFO, ":============================================"); sendnumericfmt(client, RPL_INFO, ":Birth Date: %s, compile # %s", creation, generation); - sendnumericfmt(client, RPL_INFO, ":On-line since %s", myctime(me.local->firsttime)); + sendnumericfmt(client, RPL_INFO, ":On-line since %s", myctime(me.local->creationtime)); sendnumericfmt(client, RPL_INFO, ":ReleaseID (%s)", buildid); sendnumeric(client, RPL_ENDOFINFO); } @@ -299,7 +344,7 @@ CMD_FUNC(cmd_info) if (remotecmdfilter(client, parc, parv)) return; - if (hunt_server(client, recv_mtags, ":%s INFO :%s", 1, parc, parv) == HUNTED_ISME) + if (hunt_server(client, recv_mtags, "INFO", 1, parc, parv) == HUNTED_ISME) cmd_info_send(client); } @@ -313,7 +358,7 @@ CMD_FUNC(cmd_license) if (remotecmdfilter(client, parc, parv)) return; - if (hunt_server(client, recv_mtags, ":%s LICENSE :%s", 1, parc, parv) == HUNTED_ISME) + if (hunt_server(client, recv_mtags, "LICENSE", 1, parc, parv) == HUNTED_ISME) { while (*text) sendnumeric(client, RPL_INFO, *text++); @@ -333,20 +378,20 @@ CMD_FUNC(cmd_credits) if (remotecmdfilter(client, parc, parv)) return; - if (hunt_server(client, recv_mtags, ":%s CREDITS :%s", 1, parc, parv) == HUNTED_ISME) + if (hunt_server(client, recv_mtags, "CREDITS", 1, parc, parv) == HUNTED_ISME) { while (*text) sendnumeric(client, RPL_INFO, *text++); sendnumeric(client, RPL_INFO, ""); sendnumericfmt(client, RPL_INFO, ":Birth Date: %s, compile # %s", creation, generation); - sendnumericfmt(client, RPL_INFO, ":On-line since %s", myctime(me.local->firsttime)); + sendnumericfmt(client, RPL_INFO, ":On-line since %s", myctime(me.local->creationtime)); sendnumeric(client, RPL_ENDOFINFO); } } -/** Return flags for a client (connection), eg 's' for SSL/TLS - used in STATS L/l */ -char *get_client_status(Client *client) +/** Return flags for a client (connection), eg 's' for TLS - used in STATS L/l */ +const char *get_client_status(Client *client) { static char buf[10]; char *p = buf; @@ -371,28 +416,7 @@ char *get_client_status(Client *client) } *p++ = ']'; *p++ = '\0'; - return (buf); -} - -/** Used to blank out ports -- Barubary - only used in STATS l/L */ -char *get_client_name2(Client *client, int showports) -{ - char *pointer = get_client_name(client, TRUE); - - if (!pointer) - return NULL; - if (showports) - return pointer; - if (!strrchr(pointer, '.')) - return NULL; - /* - * This may seem like wack but remind this is only used - * in rows of get_client_name2's, so it's perfectly fair - * - */ - strcpy(strrchr(pointer, '.'), ".0]"); - - return pointer; + return buf; } /** ERROR command - used by servers to indicate errors. @@ -400,29 +424,24 @@ char *get_client_name2(Client *client, int showports) */ CMD_FUNC(cmd_error) { - char *para; + const char *para; if (!MyConnect(client)) return; para = (parc > 1 && *parv[1] != '\0') ? parv[1] : "<>"; - /* Errors from untrusted sources only go to the junk snomask - * (which is only for debugging issues and such). - * This to prevent flooding and confusing IRCOps by - * malicious users. + /* Errors from untrusted sources are ignored as any + * malicious user can send these, confusing IRCOps etc. + * One can always see the errors from the other side anyway. */ - if (!IsServer(client) && !client->serv) - { - sendto_snomask(SNO_JUNK, "ERROR from server %s: %s", - get_client_name(client, FALSE), para); + if (!IsServer(client) && !client->server) return; - } - sendto_umode_global(UMODE_OPER, "ERROR from server %s: %s", - get_client_name(client, FALSE), para); - ircd_log(LOG_ERROR, "ERROR from server %s: %s", - get_client_name(client, FALSE), para); + unreal_log(ULOG_ERROR, "link", "LINK_ERROR_MESSAGE", client, + "Error from $client: $error_message", + log_data_string("error_message", para), + client->server->conf ? log_data_link_block(client->server->conf) : NULL); } /** Save the tunefile (such as: highest seen connection count) */ @@ -433,11 +452,11 @@ EVENT(save_tunefile) tunefile = fopen(conf_files->tune_file, "w"); if (!tunefile) { -#if !defined(_WIN32) && !defined(_AMIGA) - sendto_ops("Unable to write tunefile.. %s", strerror(errno)); -#else - sendto_ops("Unable to write tunefile.."); -#endif + char *errstr = strerror(errno); + unreal_log(ULOG_WARNING, "config", "WRITE_TUNE_FILE_FAILED", NULL, + "Unable to write tunefile '$filename': $system_error", + log_data_string("filename", conf_files->tune_file), + log_data_string("system_error", errstr)); return; } fprintf(tunefile, "0\n"); @@ -454,14 +473,15 @@ void load_tunefile(void) tunefile = fopen(conf_files->tune_file, "r"); if (!tunefile) return; - fprintf(stderr, "Loading tunefile..\n"); - if (!fgets(buf, sizeof(buf), tunefile)) - fprintf(stderr, "Warning: error while reading the timestamp offset from the tunefile%s%s\n", - errno? ": ": "", errno? strerror(errno): ""); - - if (!fgets(buf, sizeof(buf), tunefile)) - fprintf(stderr, "Warning: error while reading the peak user count from the tunefile%s%s\n", - errno? ": ": "", errno? strerror(errno): ""); + /* We ignore the first line, hence the weird looking double fgets here... */ + if (!fgets(buf, sizeof(buf), tunefile) || !fgets(buf, sizeof(buf), tunefile)) + { + char *errstr = strerror(errno); + unreal_log(ULOG_WARNING, "config", "READ_TUNE_FILE_FAILED", NULL, + "Unable to read tunefile '$filename': $system_error", + log_data_string("filename", conf_files->tune_file), + log_data_string("system_error", errstr)); + } irccounts.me_max = atol(buf); fclose(tunefile); } @@ -501,7 +521,7 @@ extern void reinit_resolver(Client *client); */ CMD_FUNC(cmd_rehash) { - int x = 0; + int x; /* This is one of the (few) commands that cannot be handled * by labeled-response accurately in all circumstances. @@ -521,13 +541,13 @@ CMD_FUNC(cmd_rehash) if (parv[1] && (parv[1][0] == '-')) x = HUNTED_ISME; else - x = hunt_server(client, recv_mtags, ":%s REHASH :%s", 1, parc, parv); + x = hunt_server(client, recv_mtags, "REHASH", 1, parc, parv); } else { if (match_simple("-glob*", parv[1])) /* This is really ugly... hack to make /rehash -global -something work */ { x = HUNTED_ISME; } else { - x = hunt_server(client, NULL, ":%s REHASH %s :%s", 1, parc, parv); + x = hunt_server(client, NULL, "REHASH", 1, parc, parv); } } if (x != HUNTED_ISME) @@ -557,17 +577,14 @@ CMD_FUNC(cmd_rehash) #endif if (parv[2] == NULL) { - if (loop.ircd_rehashing) + if (loop.rehashing) { sendnotice(client, "A rehash is already in progress"); return; } - sendto_umode_global(UMODE_OPER, "%s is remotely rehashing server %s config file", client->name, me.name); + unreal_log(ULOG_INFO, "config", "CONFIG_RELOAD", client, "Rehashing server configuration file [by: $client.details]"); remote_rehash_client = client; - reread_motdsandrules(); - // TODO: clean this next line up, wtf man. - rehash(client, (parc > 1) ? ((*parv[1] == 'q') ? 2 : 0) : 0); - return; + /* fallthrough... so we deal with this the same way as local rehashes */ } parv[1] = parv[2]; } else { @@ -583,16 +600,6 @@ CMD_FUNC(cmd_rehash) parv[1] = parv[2]; parv[2] = NULL; parc--; - /* Only netadmins may use /REHASH -global, which is because: - * a) it makes sense - * b) remote servers don't support remote rehashes by non-netadmins - */ - if (!ValidatePermissionsForPath("server:rehash",client,NULL,NULL,NULL)) - { - sendnumeric(client, ERR_NOPRIVILEGES); - sendnotice(client, "'/REHASH -global' requires you to have server::rehash permissions"); - return; - } if (parv[1] && *parv[1] != '-') { sendnotice(client, "You cannot specify a server name after /REHASH -global, for obvious reasons"); @@ -614,19 +621,12 @@ CMD_FUNC(cmd_rehash) if (!BadPtr(parv[1]) && strcasecmp(parv[1], "-all")) { - - if (!ValidatePermissionsForPath("server:rehash",client,NULL,NULL,NULL)) - { - sendnumeric(client, ERR_NOPRIVILEGES); - return; - } - if (*parv[1] == '-') { if (!strncasecmp("-gar", parv[1], 4)) { loop.do_garbage_collect = 1; - RunHook2(HOOKTYPE_REHASHFLAG, client, parv[1]); + RunHook(HOOKTYPE_REHASHFLAG, client, parv[1]); return; } if (!strncasecmp("-dns", parv[1], 4)) @@ -636,58 +636,27 @@ CMD_FUNC(cmd_rehash) } if (match_simple("-ssl*", parv[1]) || match_simple("-tls*", parv[1])) { - reinit_ssl(client); + unreal_log(ULOG_INFO, "config", "CONFIG_RELOAD_TLS", client, "Reloading all TLS related data. [by: $client.details]"); + reinit_tls(); return; } - if (match_simple("-o*motd", parv[1])) - { - if (MyUser(client)) - sendto_ops("Rehashing OPERMOTD on request of %s", client->name); - else - sendto_umode_global(UMODE_OPER, "Remotely rehashing OPERMOTD on request of %s", client->name); - read_motd(conf_files->opermotd_file, &opermotd); - RunHook2(HOOKTYPE_REHASHFLAG, client, parv[1]); - return; - } - if (match_simple("-b*motd", parv[1])) - { - if (MyUser(client)) - sendto_ops("Rehashing BOTMOTD on request of %s", client->name); - else - sendto_umode_global(UMODE_OPER, "Remotely rehashing BOTMOTD on request of %s", client->name); - read_motd(conf_files->botmotd_file, &botmotd); - RunHook2(HOOKTYPE_REHASHFLAG, client, parv[1]); - return; - } - if (!strncasecmp("-motd", parv[1], 5) || !strncasecmp("-rules", parv[1], 6)) - { - if (MyUser(client)) - sendto_ops("Rehashing all MOTDs and RULES on request of %s", client->name); - else - sendto_umode_global(UMODE_OPER, "Remotely rehasing all MOTDs and RULES on request of %s", client->name); - rehash_motdrules(); - RunHook2(HOOKTYPE_REHASHFLAG, client, parv[1]); - return; - } - RunHook2(HOOKTYPE_REHASHFLAG, client, parv[1]); + RunHook(HOOKTYPE_REHASHFLAG, client, parv[1]); return; } } else { - if (loop.ircd_rehashing) + if (loop.rehashing) { - sendnotice(client, "A rehash is already in progress"); + sendnotice(client, "ERROR: A rehash is already in progress"); return; } - sendto_ops("%s is rehashing server config file", client->name); + unreal_log(ULOG_INFO, "config", "CONFIG_RELOAD", client, "Rehashing server configuration file [by: $client.details]"); } /* Normal rehash, rehash motds&rules too, just like the on in the tld block will :p */ sendnumeric(client, RPL_REHASHING, configfile); - // TODO: fix next line - occurence #2 - x = rehash(client, (parc > 1) ? ((*parv[1] == 'q') ? 2 : 0) : 0); - reread_motdsandrules(); + request_rehash(client); } /** RESTART command - restart the server (discouraged command) @@ -696,7 +665,7 @@ CMD_FUNC(cmd_rehash) */ CMD_FUNC(cmd_restart) { - char *reason = parv[1]; + const char *reason = parv[1]; Client *acptr; if (!MyUser(client)) @@ -731,7 +700,6 @@ CMD_FUNC(cmd_restart) reason = parv[2]; } } - sendto_ops("Server is Restarting by request of %s", client->name); list_for_each_entry(acptr, &lclient_list, lclient_node) { @@ -806,122 +774,11 @@ void short_motd(Client *client) sendnumeric(client, RPL_ENDOFMOTD); } -/* - * A merge from ircu and bahamut, and some extra stuff added by codemastr - * we can now use 1 function for multiple files -- codemastr - * Merged read_motd/read_rules stuff into this -- Syzop - */ - /** Read motd-like file, used for rules/motd/botmotd/opermotd/etc. - * Multiplexes to either directly reading the MOTD or downloading it asynchronously. * @param filename Filename of file to read or URL. NULL is accepted and causes the *motd to be free()d. * @param motd Reference to motd pointer (used for freeing if needed and for asynchronous remote MOTD support) */ void read_motd(const char *filename, MOTDFile *themotd) -{ -#ifdef USE_LIBCURL - time_t modtime; - MOTDDownload *motd_download; -#endif - - /* TODO: if themotd points to a tld's motd, - could a rehash disrupt this pointer?*/ -#ifdef USE_LIBCURL - if(themotd->motd_download) - { - themotd->motd_download->themotd = NULL; - /* - * It is not our job to free() motd_download, the - * read_motd_async_downloaded() function will do that - * when it sees that ->themod == NULL. - */ - themotd->motd_download = NULL; - } - - /* if filename is NULL, do_read_motd will catch it */ - if(filename && url_is_valid(filename)) - { - /* prepare our payload for read_motd_async_downloaded() */ - motd_download = safe_alloc(sizeof(MOTDDownload)); - motd_download->themotd = themotd; - themotd->motd_download = motd_download; - - modtime = unreal_getfilemodtime(unreal_mkcache(filename)); - - download_file_async(filename, modtime, (vFP)read_motd_async_downloaded, motd_download); - return; - } -#endif /* USE_LIBCURL */ - - do_read_motd(filename, themotd); - - return; -} - -#ifdef USE_LIBCURL -/** Callback for download_file_async() called from read_motd() below. - * @param url the URL curl groked or NULL if the MOTD is stored locally. - * @param filename the path to the local copy of the MOTD or NULL if either cached=1 or there's an error. - * @param errorbuf NULL or an errorstring if there was an error while downloading the MOTD. - * @param cached 0 if the URL was downloaded freshly or 1 if the last download was canceled and the local copy should be used. - */ -void read_motd_async_downloaded(const char *url, const char *filename, const char *errorbuf, int cached, MOTDDownload *motd_download) -{ - MOTDFile *themotd; - - themotd = motd_download->themotd; - /* - check if the download was soft-canceled. See struct.h's docs on - struct MOTDDownload for details. - */ - if(!themotd) - { - safe_free(motd_download); - return; - } - - /* errors -- check for specialcached version if applicable */ - if(!cached && !filename) - { - if(has_cached_version(url)) - { - config_warn("Error downloading MOTD file from \"%s\": %s -- using cached version instead.", displayurl(url), errorbuf); - filename = unreal_mkcache(url); - } else { - config_error("Error downloading MOTD file from \"%s\": %s", displayurl(url), errorbuf); - - /* remove reference to this chunk of memory about to be freed. */ - motd_download->themotd->motd_download = NULL; - safe_free(motd_download); - return; - } - } - - /* - * We need to move our newly downloaded file to its cache file - * if it isn't there already. - */ - if(!cached) - { - /* create specialcached version for later */ - unreal_copyfileex(filename, unreal_mkcache(url), 1); - } else { - /* - * The file is cached. Thus we must look for it at the - * cache location where we placed it earlier. - */ - filename = unreal_mkcache(url); - } - - do_read_motd(filename, themotd); - safe_free(motd_download); -} -#endif /* USE_LIBCURL */ - - -/** The actual reading of the MOTD - used by read_motd() and read_motd_async_downloaded() - */ -void do_read_motd(const char *filename, MOTDFile *themotd) { FILE *fd; struct tm *tm_tmp; @@ -934,7 +791,7 @@ void do_read_motd(const char *filename, MOTDFile *themotd) free_motd(themotd); - if(!filename) + if (!filename) return; fd = fopen(filename, "r"); @@ -960,7 +817,7 @@ void do_read_motd(const char *filename, MOTDFile *themotd) temp = safe_alloc(sizeof(MOTDLine)); safe_strdup(temp->line, line); - if(last) + if (last) last->next = temp; else /* handle the special case of the first line */ @@ -969,7 +826,7 @@ void do_read_motd(const char *filename, MOTDFile *themotd) last = temp; } /* the file could be zero bytes long? */ - if(last) + if (last) last->next = NULL; fclose(fd); @@ -986,7 +843,7 @@ void free_motd(MOTDFile *themotd) { MOTDLine *next, *motdline; - if(!themotd) + if (!themotd) return; for (motdline = themotd->lines; motdline; motdline = next) @@ -998,11 +855,6 @@ void free_motd(MOTDFile *themotd) themotd->lines = NULL; memset(&themotd->last_modified, '\0', sizeof(struct tm)); - -#ifdef USE_LIBCURL - /* see struct.h for more information about motd_download */ - themotd->motd_download = NULL; -#endif } /** DIE command - terminate the server @@ -1036,7 +888,8 @@ CMD_FUNC(cmd_die) } /* Let the +s know what is going on */ - sendto_ops("Server Terminating by request of %s", client->name); + unreal_log(ULOG_INFO, "main", "UNREALIRCD_STOP", client, + "Terminating server by request of $client.details"); list_for_each_entry(acptr, &lclient_list, lclient_node) { @@ -1055,23 +908,29 @@ CMD_FUNC(cmd_die) PendingNet *pendingnet = NULL; /** Add server list (network) from 'client' connection */ -void add_pending_net(Client *client, char *str) +void add_pending_net(Client *client, const char *str) { PendingNet *net; PendingServer *srv; char *p, *name; + char buf[512]; if (BadPtr(str) || !client) return; + /* Skip any * at the beginning (indicating a reply), + * and work on a copy. + */ + if (*str == '*') + strlcpy(buf, str+1, sizeof(buf)); + else + strlcpy(buf, str, sizeof(buf)); + /* Allocate */ net = safe_alloc(sizeof(PendingNet)); net->client = client; - /* Fill in */ - if (*str == '*') - str++; - for (name = strtoken(&p, str, ","); name; name = strtoken(&p, NULL, ",")) + for (name = strtoken(&p, buf, ","); name; name = strtoken(&p, NULL, ",")) { if (!*name) continue; @@ -1108,7 +967,7 @@ void free_pending_net(Client *client) } /** Find SID in any server list (network) that is pending, except 'exempt' */ -PendingNet *find_pending_net_by_sid_butone(char *sid, Client *exempt) +PendingNet *find_pending_net_by_sid_butone(const char *sid, Client *exempt) { PendingNet *net; PendingServer *srv; @@ -1181,7 +1040,7 @@ Client *find_non_pending_net_duplicates(Client *client) } /** Parse CHANMODES= in PROTOCTL */ -void parse_chanmodes_protoctl(Client *client, char *str) +void parse_chanmodes_protoctl(Client *client, const char *str) { char *modes, *p; char copy[256]; @@ -1191,19 +1050,19 @@ void parse_chanmodes_protoctl(Client *client, char *str) modes = strtoken(&p, copy, ","); if (modes) { - safe_strdup(client->serv->features.chanmodes[0], modes); + safe_strdup(client->server->features.chanmodes[0], modes); modes = strtoken(&p, NULL, ","); if (modes) { - safe_strdup(client->serv->features.chanmodes[1], modes); + safe_strdup(client->server->features.chanmodes[1], modes); modes = strtoken(&p, NULL, ","); if (modes) { - safe_strdup(client->serv->features.chanmodes[2], modes); + safe_strdup(client->server->features.chanmodes[2], modes); modes = strtoken(&p, NULL, ","); if (modes) { - safe_strdup(client->serv->features.chanmodes[3], modes); + safe_strdup(client->server->features.chanmodes[3], modes); } } } @@ -1218,9 +1077,9 @@ static int previous_langsinuse_ready = 0; */ void charsys_check_for_changes(void) { - char *langsinuse = charsys_get_current_languages(); + const char *langsinuse = charsys_get_current_languages(); /* already called by charsys_finish() */ - safe_strdup(me.serv->features.nickchars, langsinuse); + safe_strdup(me.server->features.nickchars, langsinuse); if (!previous_langsinuse_ready) { @@ -1231,10 +1090,10 @@ void charsys_check_for_changes(void) if (strcmp(langsinuse, previous_langsinuse)) { - ircd_log(LOG_ERROR, "Permitted nick characters changed at runtime: %s -> %s", - previous_langsinuse, langsinuse); - sendto_realops("Permitted nick characters changed at runtime: %s -> %s", - previous_langsinuse, langsinuse); + unreal_log(ULOG_INFO, "charsys", "NICKCHARS_CHANGED", NULL, + "Permitted nick characters changed at runtime: $old_nickchars -> $new_nickchars", + log_data_string("old_nickchars", previous_langsinuse), + log_data_string("new_nickchars", langsinuse)); /* Broadcast change to all (locally connected) servers */ sendto_server(NULL, 0, 0, NULL, "PROTOCTL NICKCHARS=%s", langsinuse); } @@ -1243,25 +1102,21 @@ void charsys_check_for_changes(void) } /** Check if supplied server name is valid, that is: does not contain forbidden characters etc */ -int valid_server_name(char *name) +int valid_server_name(const char *name) { - char *p; + const char *p; - if (strlen(name) >= HOSTLEN) - return 0; - - for (p = name; *p; p++) - if ((*p <= ' ') || (*p > '~')) - return 0; + if (!valid_host(name, 0)) + return 0; /* invalid hostname */ if (!strchr(name, '.')) - return 0; + return 0; /* no dot */ return 1; } /** Check if the supplied name is a valid SID, as in: syntax. */ -int valid_sid(char *name) +int valid_sid(const char *name) { if (strlen(name) != 3) return 0; @@ -1274,6 +1129,31 @@ int valid_sid(char *name) return 1; } +/** Check if the supplied name is a valid UID, as in: syntax. */ +int valid_uid(const char *name) +{ + const char *p; + + /* Enforce at least some minimum length */ + if (strlen(name) < 6) + return 0; + + /* UID cannot be larger than IDLEN or it would be cut off later */ + if (strlen(name) > IDLEN) + return 0; + + /* Must start with a digit */ + if (!isdigit(*name)) + return 0; + + /* For all the remaining characters: digit or uppercase character */ + for (p = name+1; *p; p++) + if (!isdigit(*p) && !isupper(*p)) + return 0; + + return 1; +} + /** Initialize the TKL subsystem */ void tkl_init(void) { @@ -1284,28 +1164,96 @@ void tkl_init(void) /** Called when a server link is lost. * Used for logging only, API users can use the HOOKTYPE_SERVER_QUIT hook. */ -void lost_server_link(Client *serv, FORMAT_STRING(const char *fmt), ...) +void lost_server_link(Client *client, const char *tls_error_string) { - va_list vl; - static char buf[1024], buf2[512]; - - va_start(vl, fmt); - vsnprintf(buf2, sizeof(buf2), fmt, vl); - va_end(vl); - - if (IsServer(serv)) + if (IsServer(client)) { - /* An already established link is now lost. Broadcast this to all opers. */ - snprintf(buf, sizeof(buf), "Lost server link to %s: %s", - get_client_name(serv, FALSE), buf2); - sendto_umode_global(UMODE_OPER, "%s", buf); + /* An already established link is now lost. */ + // FIXME: we used to broadcast this GLOBALLY.. not anymore since the U6 rewrite.. is that what we want? + if (tls_error_string) + { + /* TLS */ + unreal_log(ULOG_ERROR, "link", "LINK_DISCONNECTED", client, + "Lost server link to $client [$client.ip]: $tls_error_string", + log_data_string("tls_error_string", tls_error_string), + client->server->conf ? log_data_link_block(client->server->conf) : NULL); + } else { + /* NON-TLS */ + unreal_log(ULOG_ERROR, "link", "LINK_DISCONNECTED", client, + "Lost server link to $client [$client.ip]: $socket_error", + log_data_socket_error(client->local->fd), + client->server->conf ? log_data_link_block(client->server->conf) : NULL); + } } else { - /* A link attempt failed. Only send this to local opers (can be noisy every xx seconds). */ - snprintf(buf, sizeof(buf), "Unable to link with server %s: %s", - get_client_name(serv, FALSE), buf2); - sendto_umode(UMODE_OPER, "%s", buf); + /* A link attempt failed (it was never a fully connected server) */ + /* We send these to local ops only */ + if (tls_error_string) + { + /* TLS */ + if (client->server->conf) + { + unreal_log(ULOG_ERROR, "link", "LINK_ERROR_CONNECT", client, + "Unable to link with server $client [$link_block.ip:$link_block.port]: $tls_error_string", + log_data_string("tls_error_string", tls_error_string), + log_data_link_block(client->server->conf)); + } else { + unreal_log(ULOG_ERROR, "link", "LINK_ERROR_CONNECT", client, + "Unable to link with server $client: $tls_error_string", + log_data_string("tls_error_string", tls_error_string)); + } + } else { + /* non-TLS */ + if (client->server->conf) + { + unreal_log(ULOG_ERROR, "link", "LINK_ERROR_CONNECT", client, + "Unable to link with server $client [$link_block.ip:$link_block.port]: $socket_error", + log_data_socket_error(client->local->fd), + log_data_link_block(client->server->conf)); + } else { + unreal_log(ULOG_ERROR, "link", "LINK_ERROR_CONNECT", client, + "Unable to link with server $client: $socket_error", + log_data_socket_error(client->local->fd)); + } + } + } + SetServerDisconnectLogged(client); +} + +/** Reject an insecure (outgoing) server link that isn't TLS. + * This function is void and not int because it can be called from other void functions + */ +void reject_insecure_server(Client *client) +{ + unreal_log(ULOG_ERROR, "link", "SERVER_STARTTLS_FAILED", client, + "Could not link with server $client with TLS enabled. " + "Please check logs on the other side of the link. " + "If you insist with insecure linking then you can set link::options::outgoing::insecure " + "(NOT recommended!)."); + dead_socket(client, "Rejected server link without TLS"); +} + +/** Start server handshake - called after the outgoing connection has been established. + * @param client The remote server + */ +void start_server_handshake(Client *client) +{ + ConfigItem_link *aconf = client->server ? client->server->conf : NULL; + + if (!aconf) + { + /* Should be impossible. */ + unreal_log(ULOG_ERROR, "link", "BUG_LOST_CONFIGURATION_ON_HANDSHAKE", client, + "Lost configuration while connecting to $client.details"); + return; } - /* Always log! */ - ircd_log(LOG_ERROR, "%s", buf); + RunHook(HOOKTYPE_SERVER_HANDSHAKE_OUT, client); + + sendto_one(client, NULL, "PASS :%s", (aconf->auth->type == AUTHTYPE_PLAINTEXT) ? aconf->auth->data : "*"); + + send_protoctl_servers(client, 0); + send_proto(client, aconf); + /* Sending SERVER message moved to cmd_protoctl, so it's send after the first PROTOCTL + * that we receive from the remote server. -- Syzop + */ } diff --git a/src/socket.c b/src/socket.c index b256ad3..cb4d508 100644 --- a/src/socket.c +++ b/src/socket.c @@ -40,10 +40,6 @@ char zlinebuf[BUFSIZE]; extern char *version; MODVAR time_t last_allinuse = 0; -#ifdef USE_LIBCURL -extern void url_do_transfers_async(void); -#endif - void start_of_normal_client_handshake(Client *client); void proceed_normal_client_handshake(Client *client, struct hostent *he); @@ -85,91 +81,6 @@ void close_connections(void) #endif } -/** Report an error to the log and also send to all local opers. - * @param text Format string for outputting the error. - * It must contain only two '%s'. The first - * one is replaced by the sockhost from the - * client, and the latter will be the error - * message from strerror(errno). - * @param client The client - ALWAYS locally connected. - */ -void report_error(char *text, Client *client) -{ - int errtmp = ERRNO, origerr = ERRNO; - char *host, xbuf[256]; - int err, len = sizeof(err), n; - - host = (client) ? get_client_name(client, FALSE) : ""; - - Debug((DEBUG_ERROR, text, host, STRERROR(errtmp))); - - /* - * Get the *real* error from the socket (well try to anyway..). - * This may only work when SO_DEBUG is enabled but its worth the - * gamble anyway. - */ -#ifdef SO_ERROR - if (client && !IsMe(client) && client->local->fd >= 0) - if (!getsockopt(client->local->fd, SOL_SOCKET, SO_ERROR, (void *)&err, &len)) - if (err) - errtmp = err; -#endif - if (origerr != errtmp) { - /* Socket error is different than original error, - * some tricks are needed because of 2x strerror() (or at least - * according to the man page) -- Syzop. - */ - snprintf(xbuf, 200, "[syserr='%s'", STRERROR(origerr)); - n = strlen(xbuf); - snprintf(xbuf+n, 256-n, ", sockerr='%s']", STRERROR(errtmp)); - sendto_snomask(SNO_JUNK, text, host, xbuf); - ircd_log(LOG_ERROR, text, host, xbuf); - } else { - sendto_snomask(SNO_JUNK, text, host, STRERROR(errtmp)); - ircd_log(LOG_ERROR, text,host,STRERROR(errtmp)); - } - return; -} - -/** Report a BAD error to the log and also send to all local opers. - * TODO: Document the difference between report_error() and report_baderror() - * @param text Format string for outputting the error. - * It must contain only two '%s'. The first - * one is replaced by the sockhost from the - * client, and the latter will be the error - * message from strerror(errno). - * @param client The client - ALWAYS locally connected. - */ -void report_baderror(char *text, Client *client) -{ -#ifndef _WIN32 - int errtmp = errno; /* debug may change 'errno' */ -#else - int errtmp = WSAGetLastError(); /* debug may change 'errno' */ -#endif - char *host; - int err, len = sizeof(err); - - host = (client) ? get_client_name(client, FALSE) : ""; - - Debug((DEBUG_ERROR, text, host, STRERROR(errtmp))); - - /* - * Get the *real* error from the socket (well try to anyway..). - * This may only work when SO_DEBUG is enabled but its worth the - * gamble anyway. - */ -#ifdef SO_ERROR - if (client && !IsMe(client) && client->local->fd >= 0) - if (!getsockopt(client->local->fd, SOL_SOCKET, SO_ERROR, (void *)&err, &len)) - if (err) - errtmp = err; -#endif - sendto_umode(UMODE_OPER, text, host, STRERROR(errtmp)); - ircd_log(LOG_ERROR, text, host, STRERROR(errtmp)); - return; -} - /** Accept an incoming connection. * @param listener_fd The file descriptor of a listen() socket. * @param data The listen { } block configuration data. @@ -190,8 +101,10 @@ static void listener_accept(int listener_fd, int revents, void *data) * Of course the underlying cause of this issue should be investigated, as this * is very much a workaround. */ - report_baderror("Cannot accept connections %s:%s", NULL); - sendto_realops("[BUG] Restarting listener on %s:%d due to fatal errors (see previous message)", listener->ip, listener->port); + unreal_log(ULOG_FATAL, "listen", "ACCEPT_ERROR", NULL, "Cannot accept incoming connection on IP \"$listen_ip\" port $listen_port: $socket_error", + log_data_socket_error(listener->fd), + log_data_string("listen_ip", listener->ip), + log_data_integer("listen_port", listener->port)); close_listener(listener); start_listeners(); } @@ -207,7 +120,9 @@ static void listener_accept(int listener_fd, int revents, void *data) ircstats.is_ref++; if (last_allinuse < TStime() - 15) { - sendto_ops_and_log("All connections in use. ([@%s/%u])", listener->ip, listener->port); + unreal_log(ULOG_FATAL, "listen", "ACCEPT_ERROR_MAXCLIENTS", NULL, "Cannot accept incoming connection on IP \"$listen_ip\" port $listen_port: All connections in use", + log_data_string("listen_ip", listener->ip), + log_data_integer("listen_port", listener->port)); last_allinuse = TStime(); } @@ -252,13 +167,20 @@ int unreal_listen(ConfigItem_listen *listener, char *ip, int port, int ipv6) listener->fd = fd_socket(ipv6 ? AF_INET6 : AF_INET, SOCK_STREAM, 0, "Listener socket"); if (listener->fd < 0) { - report_baderror("Cannot open stream socket() %s:%s", NULL); + unreal_log(ULOG_FATAL, "listen", "LISTEN_SOCKET_ERROR", NULL, + "Could not listen on IP \"$listen_ip\" on port $listen_port: $socket_error", + log_data_socket_error(-1), + log_data_string("listen_ip", ip), + log_data_integer("listen_port", port)); return -1; } if (++OpenFiles >= maxclients) { - sendto_ops_and_log("No more connections allowed (%s)", listener->ip); + unreal_log(ULOG_FATAL, "listen", "LISTEN_ERROR_MAXCLIENTS", NULL, + "Could not listen on IP \"$listen_ip\" on port $listen_port: all connections in use", + log_data_string("listen_ip", ip), + log_data_integer("listen_port", port)); fd_close(listener->fd); listener->fd = -1; --OpenFiles; @@ -269,10 +191,11 @@ int unreal_listen(ConfigItem_listen *listener, char *ip, int port, int ipv6) if (!unreal_bind(listener->fd, ip, port, ipv6)) { - char buf[512]; - ircsnprintf(buf, sizeof(buf), "Error binding stream socket to IP %s port %d", ip, port); - strlcat(buf, " - %s:%s", sizeof(buf)); - report_baderror(buf, NULL); + unreal_log(ULOG_FATAL, "listen", "LISTEN_BIND_ERROR", NULL, + "Could not listen on IP \"$listen_ip\" on port $listen_port: $socket_error", + log_data_socket_error(listener->fd), + log_data_string("listen_ip", ip), + log_data_integer("listen_port", port)); fd_close(listener->fd); listener->fd = -1; --OpenFiles; @@ -281,7 +204,11 @@ int unreal_listen(ConfigItem_listen *listener, char *ip, int port, int ipv6) if (listen(listener->fd, LISTEN_SIZE) < 0) { - report_error("listen failed for %s:%s", NULL); + unreal_log(ULOG_FATAL, "listen", "LISTEN_LISTEN_ERROR", NULL, + "Could not listen on IP \"$listen_ip\" on port $listen_port: $socket_error", + log_data_socket_error(listener->fd), + log_data_string("listen_ip", ip), + log_data_integer("listen_port", port)); fd_close(listener->fd); listener->fd = -1; --OpenFiles; @@ -344,17 +271,17 @@ void close_listener(ConfigItem_listen *listener) { if (listener->fd >= 0) { - ircd_log(LOG_ERROR, "IRCd no longer listening on %s:%d (%s)%s", - listener->ip, listener->port, - listener->ipv6 ? "IPv6" : "IPv4", - listener->options & LISTENER_TLS ? " (SSL/TLS)" : ""); + unreal_log(ULOG_INFO, "listen", "LISTEN_REMOVED", NULL, + "UnrealIRCd is now no longer listening on $listen_ip:$listen_port", + log_data_string("listen_ip", listener->ip), + log_data_integer("listen_port", listener->port)); fd_close(listener->fd); --OpenFiles; } listener->options &= ~LISTENER_BOUND; listener->fd = -1; - /* We can already free the SSL/TLS context, since it is only + /* We can already free the TLS context, since it is only * used for new connections, which we no longer accept. */ if (listener->ssl_ctx) @@ -498,63 +425,6 @@ void close_std_descriptors(void) #endif } -/** Write PID file */ -void write_pidfile(void) -{ -#ifdef IRCD_PIDFILE - int fd; - char buff[20]; - if ((fd = open(conf_files->pid_file, O_CREAT | O_WRONLY, 0600)) < 0) - { - ircd_log(LOG_ERROR, "Error writing to pid file %s: %s", conf_files->pid_file, strerror(ERRNO)); - return; - } - ircsnprintf(buff, sizeof(buff), "%5d\n", (int)getpid()); - if (write(fd, buff, strlen(buff)) < 0) - ircd_log(LOG_ERROR, "Error writing to pid file %s: %s", conf_files->pid_file, strerror(ERRNO)); - if (close(fd) < 0) - ircd_log(LOG_ERROR, "Error writing to pid file %s: %s", conf_files->pid_file, strerror(ERRNO)); -#endif -} - -/** Reject an insecure (outgoing) server link that isn't SSL/TLS. - * This function is void and not int because it can be called from other void functions - */ -void reject_insecure_server(Client *client) -{ - sendto_umode(UMODE_OPER, "Could not link with server %s with SSL/TLS enabled. " - "Please check logs on the other side of the link. " - "If you insist with insecure linking then you can set link::options::outgoing::insecure " - "(NOT recommended!).", - client->name); - dead_socket(client, "Rejected link without SSL/TLS"); -} - -/** Start server handshake - called after the outgoing connection has been established. - * @param client The remote server - */ -void start_server_handshake(Client *client) -{ - ConfigItem_link *aconf = client->serv ? client->serv->conf : NULL; - - if (!aconf) - { - /* Should be impossible. */ - sendto_ops_and_log("Lost configuration for %s in start_server_handshake()", get_client_name(client, FALSE)); - return; - } - - RunHook(HOOKTYPE_SERVER_HANDSHAKE_OUT, client); - - sendto_one(client, NULL, "PASS :%s", (aconf->auth->type == AUTHTYPE_PLAINTEXT) ? aconf->auth->data : "*"); - - send_protoctl_servers(client, 0); - send_proto(client, aconf); - /* Sending SERVER message moved to cmd_protoctl, so it's send after the first PROTOCTL - * that we receive from the remote server. -- Syzop - */ -} - /** Do an ident lookup if necessary. * @param client The incoming client */ @@ -563,7 +433,7 @@ void consider_ident_lookup(Client *client) char buf[BUFSIZE]; /* If ident checking is disabled or it's an outgoing connect, then no ident check */ - if ((IDENT_CHECK == 0) || (client->serv && IsHandshake(client))) + if ((IDENT_CHECK == 0) || (client->server && IsHandshake(client))) { ClearIdentLookupSent(client); ClearIdentLookup(client); @@ -579,11 +449,11 @@ void consider_ident_lookup(Client *client) void completed_connection(int fd, int revents, void *data) { Client *client = data; - ConfigItem_link *aconf = client->serv ? client->serv->conf : NULL; + ConfigItem_link *aconf = client->server ? client->server->conf : NULL; if (IsHandshake(client)) { - /* Due to delayed ircd_SSL_connect call */ + /* Due to delayed unreal_tls_connect call */ start_server_handshake(client); fd_setselect(fd, FD_SELECT_READ, read_packet, client); return; @@ -593,7 +463,8 @@ void completed_connection(int fd, int revents, void *data) if (!aconf) { - sendto_ops_and_log("Lost configuration for %s", get_client_name(client, FALSE)); + unreal_log(ULOG_ERROR, "link", "BUG_LOST_CONFIGURATION_ON_CONNECT", client, + "Lost configuration while connecting to $client.details"); return; } @@ -623,40 +494,12 @@ void close_connection(Client *client) if (IsServer(client)) { ircstats.is_sv++; - ircstats.is_sbs += client->local->sendB; - ircstats.is_sbr += client->local->receiveB; - ircstats.is_sks += client->local->sendK; - ircstats.is_skr += client->local->receiveK; - ircstats.is_sti += TStime() - client->local->firsttime; - if (ircstats.is_sbs > 1023) - { - ircstats.is_sks += (ircstats.is_sbs >> 10); - ircstats.is_sbs &= 0x3ff; - } - if (ircstats.is_sbr > 1023) - { - ircstats.is_skr += (ircstats.is_sbr >> 10); - ircstats.is_sbr &= 0x3ff; - } + ircstats.is_sti += TStime() - client->local->creationtime; } else if (IsUser(client)) { ircstats.is_cl++; - ircstats.is_cbs += client->local->sendB; - ircstats.is_cbr += client->local->receiveB; - ircstats.is_cks += client->local->sendK; - ircstats.is_ckr += client->local->receiveK; - ircstats.is_cti += TStime() - client->local->firsttime; - if (ircstats.is_cbs > 1023) - { - ircstats.is_cks += (ircstats.is_cbs >> 10); - ircstats.is_cbs &= 0x3ff; - } - if (ircstats.is_cbr > 1023) - { - ircstats.is_ckr += (ircstats.is_cbr >> 10); - ircstats.is_cbr &= 0x3ff; - } + ircstats.is_cti += TStime() - client->local->creationtime; } else ircstats.is_ni++; @@ -727,13 +570,21 @@ void set_sock_opts(int fd, Client *client, int ipv6) #ifdef SO_REUSEADDR opt = 1; if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (void *)&opt, sizeof(opt)) < 0) - report_error("setsockopt(SO_REUSEADDR) %s:%s", client); + { + unreal_log(ULOG_WARNING, "socket", "SOCKET_ERROR_SETSOCKOPTS", client, + "Could not setsockopt(SO_REUSEADDR): $socket_error", + log_data_socket_error(-1)); + } #endif #if defined(SO_USELOOPBACK) && !defined(_WIN32) opt = 1; if (setsockopt(fd, SOL_SOCKET, SO_USELOOPBACK, (void *)&opt, sizeof(opt)) < 0) - report_error("setsockopt(SO_USELOOPBACK) %s:%s", client); + { + unreal_log(ULOG_WARNING, "socket", "SOCKET_ERROR_SETSOCKOPTS", client, + "Could not setsockopt(SO_USELOOPBACK): $socket_error", + log_data_socket_error(-1)); + } #endif /* Previously we also called set_socket_buffers() to set some @@ -747,14 +598,18 @@ void set_sock_opts(int fd, Client *client, int ipv6) { if (client) { - report_error("fcntl(fd, F_GETFL) failed for %s:%s", client); + unreal_log(ULOG_WARNING, "socket", "SOCKET_ERROR_SETSOCKOPTS", client, + "Could not get socket options (F_GETFL): $socket_error", + log_data_socket_error(-1)); } } else if (fcntl(fd, F_SETFL, opt | O_NONBLOCK) == -1) { if (client) { - report_error("fcntl(fd, F_SETL, nonb) failed for %s:%s", client); + unreal_log(ULOG_WARNING, "socket", "SOCKET_ERROR_SETSOCKOPTS", client, + "Could not get socket options (F_SETFL): $socket_error", + log_data_socket_error(-1)); } } #else @@ -763,7 +618,9 @@ void set_sock_opts(int fd, Client *client, int ipv6) { if (client) { - report_error("ioctlsocket(fd,FIONBIO) failed for %s:%s", client); + unreal_log(ULOG_WARNING, "socket", "SOCKET_ERROR_SETSOCKOPTS", client, + "Could not ioctlsocket FIONBIO: $socket_error", + log_data_socket_error(-1)); } } #endif @@ -796,7 +653,7 @@ int is_loopback_ip(char *ip) * @param port Remote port (will be written) * @returns The IP address */ -char *getpeerip(Client *client, int fd, int *port) +const char *getpeerip(Client *client, int fd, int *port) { static char ret[HOSTLEN+1]; @@ -859,7 +716,7 @@ static int check_too_many_unknown_connections(Client *client) Client *add_connection(ConfigItem_listen *listener, int fd) { Client *client; - char *ip; + const char *ip; int port = 0; client = make_client(NULL, &me); @@ -877,7 +734,11 @@ Client *add_connection(ConfigItem_listen *listener, int fd) */ if (ERRNO != P_ENOTCONN) { - report_error("Failed to accept new client %s :%s", client); + unreal_log(ULOG_ERROR, "listen", "ACCEPT_ERROR", NULL, + "Failed to accept new client: unable to get IP address: $socket_error", + log_data_socket_error(fd), + log_data_string("listen_ip", listener->ip), + log_data_integer("listen_port", listener->port)); } refuse_client: ircstats.is_ref++; @@ -932,7 +793,6 @@ refuse_client: if (ctx) { SetTLSAcceptHandshake(client); - Debug((DEBUG_DEBUG, "Starting TLS accept handshake for %s", client->local->sockhost)); if ((client->local->ssl = SSL_new(ctx)) == NULL) { goto refuse_client; @@ -940,10 +800,9 @@ refuse_client: SetTLS(client); SSL_set_fd(client->local->ssl, fd); SSL_set_nonblocking(client->local->ssl); - SSL_set_ex_data(client->local->ssl, ssl_client_index, client); - if (!ircd_SSL_accept(client, fd)) + SSL_set_ex_data(client->local->ssl, tls_client_index, client); + if (!unreal_tls_accept(client, fd)) { - Debug((DEBUG_DEBUG, "Failed TLS accept handshake in instance 1: %s", client->local->sockhost)); SSL_set_shutdown(client->local->ssl, SSL_RECEIVED_SHUTDOWN); SSL_smart_shutdown(client->local->ssl); SSL_free(client->local->ssl); @@ -956,12 +815,10 @@ refuse_client: return client; } -static int dns_special_flag = 0; /* This is for an "interesting" race condition very ugly. */ - /** Start of normal client handshake - DNS and ident lookups, etc. * @param client The client * @note This is called directly after accept() -> add_connection() for plaintext. - * For SSL/TLS connections this is called after the SSL/TLS handshake is completed. + * For TLS connections this is called after the TLS handshake is completed. */ void start_of_normal_client_handshake(Client *client) { @@ -975,9 +832,7 @@ void start_of_normal_client_handshake(Client *client) { if (should_show_connect_info(client)) sendto_one(client, NULL, ":%s %s", me.name, REPORT_DO_DNS); - dns_special_flag = 1; he = unrealdns_doclient(client); - dns_special_flag = 0; if (client->local->hostp) goto doauth; /* Race condition detected, DNS has been done, continue with auth */ @@ -1040,7 +895,7 @@ void read_packet(int fd, int revents, void *data) fd_setselect(fd, FD_SELECT_READ, read_packet, client); /* Restore handling of writes towards send_queued_cb(), since * it may be overwritten in an earlier call to read_packet(), - * to handle (SSL) writes by read_packet(), see below under + * to handle (TLS) writes by read_packet(), see below under * SSL_ERROR_WANT_WRITE. */ fd_setselect(fd, FD_SELECT_WRITE, send_queued_cb, client); @@ -1090,16 +945,16 @@ void read_packet(int fd, int revents, void *data) if (length < 0 && ((ERRNO == P_EWOULDBLOCK) || (ERRNO == P_EAGAIN) || (ERRNO == P_EINTR))) return; - if (IsServer(client) || client->serv) /* server or outgoing connection */ - lost_server_link(client, "Read error or connection closed."); + if (IsServer(client) || client->server) /* server or outgoing connection */ + lost_server_link(client, NULL); - exit_client(client, NULL, "Read error"); + exit_client(client, NULL, ERRNO ? "Read error" : "Connection closed"); return; } - client->local->lasttime = now; - if (client->local->lasttime > client->local->since) - client->local->since = client->local->lasttime; + client->local->last_msg_received = now; + if (client->local->last_msg_received > client->local->fake_lag) + client->local->fake_lag = client->local->last_msg_received; /* FIXME: Is this correct? I have my doubts. */ ClearPingSent(client); @@ -1174,191 +1029,28 @@ void process_clients(void) } while(&client->lclient_node != &unknown_list); } -/** Returns 4 if 'str' is a valid IPv4 address - * and 6 if 'str' is a valid IPv6 IP address. - * Zero (0) is returned in any other case (eg: hostname). +/** Check if 'ip' is a valid IP address, and if so what type. + * @param ip The IP address + * @retval 4 Valid IPv4 address + * @retval 6 Valid IPv6 address + * @retval 0 Invalid IP address (eg: a hostname) */ -int is_valid_ip(char *str) +int is_valid_ip(const char *ip) { char scratch[64]; - if (inet_pton(AF_INET, str, scratch) == 1) + if (BadPtr(ip)) + return 0; + + if (inet_pton(AF_INET, ip, scratch) == 1) return 4; /* IPv4 */ - if (inet_pton(AF_INET6, str, scratch) == 1) + if (inet_pton(AF_INET6, ip, scratch) == 1) return 6; /* IPv6 */ return 0; /* not an IP address */ } -static int connect_server_helper(ConfigItem_link *, Client *); - -/** Start an outgoing connection to a server, for server linking. - * @param aconf Configuration attached to this server - * @param by The user initiating the connection (can be NULL) - * @param hp The address to connect to. - * @returns <0 on error, 0 on success. Rather confusing. - */ -int connect_server(ConfigItem_link *aconf, Client *by, struct hostent *hp) -{ - Client *client; - -#ifdef DEBUGMODE - sendto_realops("connect_server() called with aconf %p, refcount: %d, TEMP: %s", - aconf, aconf->refcount, aconf->flag.temporary ? "YES" : "NO"); -#endif - - if (!aconf->outgoing.hostname) - return -1; /* This is an incoming-only link block. Caller shouldn't call us. */ - - if (!hp) - { - /* Remove "cache" */ - safe_free(aconf->connect_ip); - } - /* - * If we dont know the IP# for this host and itis a hostname and - * not a ip# string, then try and find the appropriate host record. - */ - if (!aconf->connect_ip) - { - if (is_valid_ip(aconf->outgoing.hostname)) - { - /* link::outgoing::hostname is an IP address. No need to resolve host. */ - safe_strdup(aconf->connect_ip, aconf->outgoing.hostname); - } else - { - /* It's a hostname, let the resolver look it up. */ - int ipv4_explicit_bind = 0; - - if (aconf->outgoing.bind_ip && (is_valid_ip(aconf->outgoing.bind_ip) == 4)) - ipv4_explicit_bind = 1; - - /* We need this 'aconf->refcount++' or else there's a race condition between - * starting resolving the host and the result of the resolver (we could - * REHASH in that timeframe) leading to an invalid (freed!) 'aconf'. - * -- Syzop, bug #0003689. - */ - aconf->refcount++; - unrealdns_gethostbyname_link(aconf->outgoing.hostname, aconf, ipv4_explicit_bind); - return -2; - } - } - client = make_client(NULL, &me); - client->local->hostp = hp; - /* - * Copy these in so we have something for error detection. - */ - strlcpy(client->name, aconf->servername, sizeof(client->name)); - strlcpy(client->local->sockhost, aconf->outgoing.hostname, HOSTLEN + 1); - - if (!connect_server_helper(aconf, client)) - { - int errtmp = ERRNO; - report_error("Connect to host %s failed: %s", client); - if (by && IsUser(by) && !MyUser(by)) - sendnotice(by, "*** Connect to host %s failed.", client->name); - fd_close(client->local->fd); - --OpenFiles; - client->local->fd = -2; - free_client(client); - SET_ERRNO(errtmp); - if (ERRNO == P_EINTR) - SET_ERRNO(P_ETIMEDOUT); - return -1; - } - /* The socket has been connected or connect is in progress. */ - make_server(client); - client->serv->conf = aconf; - client->serv->conf->refcount++; -#ifdef DEBUGMODE - sendto_realops("connect_server() CONTINUED (%s:%d), aconf %p, refcount: %d, TEMP: %s", - __FILE__, __LINE__, aconf, aconf->refcount, aconf->flag.temporary ? "YES" : "NO"); -#endif - Debug((DEBUG_ERROR, "reference count for %s (%s) is now %d", - client->name, client->serv->conf->servername, client->serv->conf->refcount)); - if (by && IsUser(by)) - strlcpy(client->serv->by, by->name, sizeof(client->serv->by)); - else - strlcpy(client->serv->by, "AutoConn.", sizeof client->serv->by); - client->serv->up = me.name; - SetConnecting(client); - SetOutgoing(client); - irccounts.unknown++; - list_add(&client->lclient_node, &unknown_list); - set_sockhost(client, aconf->outgoing.hostname); - add_client_to_list(client); - - if (aconf->outgoing.options & CONNECT_TLS) - { - SetTLSConnectHandshake(client); - fd_setselect(client->local->fd, FD_SELECT_WRITE, ircd_SSL_client_handshake, client); - } - else - fd_setselect(client->local->fd, FD_SELECT_WRITE, completed_connection, client); - - return 0; -} - -/** Helper function for connect_server() to prepare the actual bind()'ing and connect(). - * @param aconf Configuration entry of the server. - * @param client The client entry that we will use and fill in. - * @returns 1 on success, 0 on failure. - */ -static int connect_server_helper(ConfigItem_link *aconf, Client *client) -{ - char *bindip; - char buf[BUFSIZE]; - - if (!aconf->connect_ip) - return 0; /* handled upstream or shouldn't happen */ - - if (strchr(aconf->connect_ip, ':')) - SetIPV6(client); - - safe_strdup(client->ip, aconf->connect_ip); - - snprintf(buf, sizeof buf, "Outgoing connection: %s", get_client_name(client, TRUE)); - client->local->fd = fd_socket(IsIPV6(client) ? AF_INET6 : AF_INET, SOCK_STREAM, 0, buf); - if (client->local->fd < 0) - { - if (ERRNO == P_EMFILE) - { - sendto_realops("opening stream socket to server %s: No more sockets", - get_client_name(client, TRUE)); - return 0; - } - report_baderror("opening stream socket to server %s:%s", client); - return 0; - } - if (++OpenFiles >= maxclients) - { - sendto_ops_and_log("No more connections allowed (%s)", client->name); - return 0; - } - - set_sockhost(client, aconf->outgoing.hostname); - - if (!aconf->outgoing.bind_ip && iConf.link_bindip) - bindip = iConf.link_bindip; - else - bindip = aconf->outgoing.bind_ip; - - if (bindip && strcmp("*", bindip)) - { - if (!unreal_bind(client->local->fd, bindip, 0, IsIPV6(client))) - { - report_baderror("Error binding to local port for %s:%s -- " - "Your link::outgoing::bind-ip is probably incorrect.", client); - return 0; - } - } - - set_sock_opts(client->local->fd, client, IsIPV6(client)); - - return unreal_connect(client->local->fd, client->ip, aconf->outgoing.port, IsIPV6(client)); -} - /** Checks if the system is IPv6 capable. * IPv6 is always available at compile time (libs, headers), but the OS may * not have IPv6 enabled (or ipv6 kernel module not loaded). So we better check.. @@ -1375,11 +1067,11 @@ int ipv6_capable(void) /** Attempt to deliver data to a client. * This function is only called from send_queued() and will deal - * with sending to the SSL/TLS or plaintext connection. + * with sending to the TLS or plaintext connection. * @param cptr The client * @param str The string to send * @param len The length of the string - * @param want_read In case of SSL/TLS it may happen that SSL_write() + * @param want_read In case of TLS it may happen that SSL_write() * needs to READ data. If this happens then this * function will set *want_read to 1. * The upper layer should then call us again when @@ -1399,16 +1091,10 @@ int deliver_it(Client *client, char *str, int len, int *want_read) *want_read = 0; - if (IsDeadSocket(client) || (!IsServer(client) && !IsUser(client) - && !IsHandshake(client) - && !IsTLSHandshake(client) - - && !IsUnknown(client))) + if (IsDeadSocket(client) || + (!IsServer(client) && !IsUser(client) && !IsHandshake(client) && + !IsTLSHandshake(client) && !IsUnknown(client))) { - str[len] = '\0'; - sendto_ops - ("* * * DEBUG ERROR * * * !!! Calling deliver_it() for %s, status %d %s, with message: %s", - client->name, client->status, IsDeadSocket(client) ? "DEAD" : "", str); return -1; } @@ -1459,25 +1145,15 @@ int deliver_it(Client *client, char *str, int len, int *want_read) if (retval > 0) { - client->local->sendB += retval; - me.local->sendB += retval; - if (client->local->sendB > 1023) - { - client->local->sendK += (client->local->sendB >> 10); - client->local->sendB &= 0x03ff; /* 2^10 = 1024, 3ff = 1023 */ - } - if (me.local->sendB > 1023) - { - me.local->sendK += (me.local->sendB >> 10); - me.local->sendB &= 0x03ff; - } + client->local->traffic.bytes_sent += retval; + me.local->traffic.bytes_sent += retval; } return (retval); } /** Initiate an outgoing connection, the actual connect() call. */ -int unreal_connect(int fd, char *ip, int port, int ipv6) +int unreal_connect(int fd, const char *ip, int port, int ipv6) { int n; @@ -1513,7 +1189,7 @@ int unreal_connect(int fd, char *ip, int port, int ipv6) /** Bind to an IP/port (port may be 0 for auto). * @returns 0 on failure, other on success. */ -int unreal_bind(int fd, char *ip, int port, int ipv6) +int unreal_bind(int fd, const char *ip, int port, int ipv6) { if (ipv6) { diff --git a/src/support.c b/src/support.c index 6207d93..cf88e94 100644 --- a/src/support.c +++ b/src/support.c @@ -34,7 +34,7 @@ extern void outofmemory(); #define is_enabled match /** Convert integer to string */ -char *my_itoa(int i) +const char *my_itoa(int i) { static char buf[128]; ircsnprintf(buf, sizeof(buf), "%d", i); @@ -50,9 +50,7 @@ char *my_itoa(int i) * @section Ex1 Example * @code * for (name = strtoken(&p, buf, ","); name; name = strtoken(&p, NULL, ",")) - * { - * ircd_log(LOG_ERROR, "Got: %s", name); - * } + * unreal_log(ULOG_INFO, "test", "TEST", "Got: $name", log_data_string(name)); * @endcode */ char *strtoken(char **save, char *str, char *fs) @@ -92,7 +90,7 @@ char *strtoken(char **save, char *str, char *fs) * @returns IP address as a string (IPv4 or IPv6, in case of the latter: * always the uncompressed form without ::) */ -char *inetntop(int af, const void *in, char *out, size_t size) +const char *inetntop(int af, const void *in, char *out, size_t size) { char tmp[MYDUMMY_SIZE]; @@ -140,7 +138,6 @@ char *inetntop(int af, const void *in, char *out, size_t size) if (*(op - 1) == ':') *op++ = '0'; *op = '\0'; - Debug((DEBUG_DNS, "Expanding `%s' -> `%s'", tmp, out)); } return out; } @@ -180,6 +177,27 @@ size_t strlcpy(char *dst, const char *src, size_t size) } #endif +#ifndef HAVE_STRLNCPY +/** BSD'ish strlncpy() - similar to strlcpy but never copies more then n characters. + */ +size_t strlncpy(char *dst, const char *src, size_t size, size_t n) +{ + size_t len = strlen(src); + size_t ret = len; + + if (size <= 0) + return 0; + if (len > n) + len = n; + if (len >= size) + len = size - 1; + memcpy(dst, src, len); + dst[len] = 0; + + return ret; +} +#endif + #ifndef HAVE_STRLCAT /* BSD'ish strlcat(). * The strlcat() function appends the NUL-terminated string src to the end of @@ -233,6 +251,16 @@ size_t strlncat(char *dst, const char *src, size_t size, size_t n) } #endif +/** Like strlcpy but concat one letter */ +void strlcat_letter(char *buf, char c, size_t buflen) +{ + int n = strlen(buf); + if (!buflen || (n >= buflen-1)) + return; + buf[n] = c; + buf[n+1] = '\0'; +} + /** Copies a string and ensure the new buffer is at most 'max' size, including NUL. * The syntax is pretty much identical to strlcpy() except that * the buffer is newly allocated. @@ -715,11 +743,11 @@ void outofmemory(size_t bytes) if (log_attempt) { + /* This will probably fail, but we can try... */ + unreal_log(ULOG_ERROR, "main", "OUT_OF_MEMORY", NULL, + "Out of memory while trying to allocate $bytes bytes!", + log_data_integer("bytes", bytes)); log_attempt = 0; - if (bytes) - ircd_log(LOG_ERROR, "Out of memory while trying to allocate %lld bytes!", (long long)bytes); - else - ircd_log(LOG_ERROR, "Out of memory"); } exit(7); } @@ -778,9 +806,9 @@ char *unreal_mktemp(const char *dir, const char *suffix) /** Returns the path portion of the given path/file * in the specified location (must be at least PATH_MAX bytes). */ -char *unreal_getpathname(char *filepath, char *path) +char *unreal_getpathname(const char *filepath, char *path) { - char *end = filepath+strlen(filepath); + const char *end = filepath+strlen(filepath); while (*end != '\\' && *end != '/' && end > filepath) end--; @@ -803,31 +831,35 @@ char *unreal_getpathname(char *filepath, char *path) /** Returns the filename portion of the given path. * The original string is not modified */ -char *unreal_getfilename(char *path) +const char *unreal_getfilename(const char *path) { - int len = strlen(path); - char *end; - if (!len) - return NULL; - end = path+len-1; + int len = strlen(path); + const char *end; + + if (!len) + return NULL; + + end = path+len-1; if (*end == '\\' || *end == '/') return NULL; - while (end > path) - { - if (*end == '\\' || *end == '/') - { - end++; - break; - } - end--; - } - return end; + + while (end > path) + { + if (*end == '\\' || *end == '/') + { + end++; + break; + } + end--; + } + + return end; } /** Returns the special module tmp name for a given path. * The original string is not modified. */ -char *unreal_getmodfilename(char *path) +const char *unreal_getmodfilename(const char *path) { static char ret[512]; char buf[512]; @@ -874,12 +906,12 @@ char *unreal_getmodfilename(char *path) /* Returns a consistent filename for the cache/ directory. * Returned value will be like: cache/ */ -char *unreal_mkcache(const char *url) +const char *unreal_mkcache(const char *url) { static char tempbuf[PATH_MAX+1]; - char tmp2[33]; + char tmp2[128]; - snprintf(tempbuf, PATH_MAX, "%s/%s", CACHEDIR, md5hash(tmp2, url, strlen(url))); + snprintf(tempbuf, PATH_MAX, "%s/%s", CACHEDIR, sha256hash(tmp2, url, strlen(url))); return tempbuf; } @@ -892,9 +924,9 @@ int has_cached_version(const char *url) /** Used to blow away result of bad copy or cancel file copy */ void cancel_copy(int srcfd, int destfd, const char *dest) { - close(srcfd); - close(destfd); - unlink(dest); + close(srcfd); + close(destfd); + unlink(dest); } /** Copys the contents of the src file to the dest file. @@ -1034,7 +1066,7 @@ time_t unreal_getfilemodtime(const char *filename) #endif /** Encode an IP string (eg: "1.2.3.4") to a BASE64 encoded value for S2S traffic */ -char *encode_ip(char *ip) +const char *encode_ip(const char *ip) { static char retbuf[25]; /* returned string */ char addrbuf[16]; @@ -1067,7 +1099,7 @@ char *encode_ip(char *ip) } /** Decode a BASE64 encoded string to an IP address string. Used for S2S traffic. */ -char *decode_ip(char *buf) +const char *decode_ip(const char *buf) { int n; char targ[25]; @@ -1161,7 +1193,7 @@ struct u_WSA_errors WSAErrors[] = { }; /** Get socket error string */ -char *sock_strerror(int error) +const char *sock_strerror(int error) { static char unkerr[64]; int start = 0; @@ -1277,7 +1309,7 @@ literal: } /** Return the PCRE2 library version in use */ -char *pcre2_version(void) +const char *pcre2_version(void) { static char buf[256]; @@ -1322,8 +1354,13 @@ int get_terminal_width(void) #endif } +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wformat-nonliteral" +#endif + /** Like strftime() but easier. */ -char *unreal_strftime(char *str) +char *unreal_strftime(const char *str) { time_t t; struct tm *tmp; @@ -1332,12 +1369,20 @@ char *unreal_strftime(char *str) t = time(NULL); tmp = localtime(&t); if (!tmp || !strftime(buf, sizeof(buf), str, tmp)) - return str; + { + /* If anything fails bigtime, then return the format string */ + strlcpy(buf, str, sizeof(buf)); + return buf; + } return buf; } -/** Convert a string to lowercase */ -void strtolower_safe(char *dst, char *src, int size) +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + +/** Convert a string to lowercase - with separate input/output buffer */ +void strtolower_safe(char *dst, const char *src, int size) { if (!size) return; /* size of 0 is unworkable */ @@ -1350,3 +1395,32 @@ void strtolower_safe(char *dst, char *src, int size) } *dst = '\0'; } + +/** Convert a string to lowercase - modifying existing string */ +void strtolower(char *str) +{ + for (; *str; str++) + *str = tolower(*str); +} + +/** Convert a string to uppercase - with separate input/output buffer */ +void strtoupper_safe(char *dst, const char *src, int size) +{ + if (!size) + return; /* size of 0 is unworkable */ + size--; /* for \0 */ + + for (; *src && size; src++) + { + *dst++ = toupper(*src); + size--; + } + *dst = '\0'; +} + +/** Convert a string to uppercase - modifying existing string */ +void strtoupper(char *str) +{ + for (; *str; str++) + *str = toupper(*str); +} diff --git a/src/tls.c b/src/tls.c index 961e1a2..c84ef02 100644 --- a/src/tls.c +++ b/src/tls.c @@ -19,7 +19,7 @@ */ /** @file - * @brief SSL/TLS functions + * @brief TLS functions */ #include "unrealircd.h" @@ -31,33 +31,32 @@ extern HINSTANCE hInst; extern HWND hwIRCDWnd; #endif -#define SAFE_SSL_READ 1 -#define SAFE_SSL_WRITE 2 -#define SAFE_SSL_ACCEPT 3 -#define SAFE_SSL_CONNECT 4 +#define FUNC_TLS_READ 1 +#define FUNC_TLS_WRITE 2 +#define FUNC_TLS_ACCEPT 3 +#define FUNC_TLS_CONNECT 4 /* Forward declarations */ -static int fatal_ssl_error(int ssl_error, int where, int my_errno, Client *client); +static int fatal_tls_error(int ssl_error, int where, int my_errno, Client *client); int cipher_check(SSL_CTX *ctx, char **errstr); int certificate_quality_check(SSL_CTX *ctx, char **errstr); -/* The SSL structures */ +/* The TLS structures */ SSL_CTX *ctx_server; SSL_CTX *ctx_client; -char *SSLKeyPasswd; +char *TLSKeyPasswd; typedef struct { int *size; char **buffer; } StreamIO; -MODVAR int ssl_client_index = 0; +MODVAR int tls_client_index = 0; -#define CHK_SSL(err) if ((err)==-1) { ERR_print_errors_fp(stderr); } #ifdef _WIN32 -/** Ask SSL private key password (Windows GUI mode only) */ -LRESULT SSLPassDLG(HWND hDlg, UINT Message, WPARAM wParam, LPARAM lParam) +/** Ask private key password (Windows GUI mode only) */ +LRESULT TLS_key_passwd_dialog(HWND hDlg, UINT Message, WPARAM wParam, LPARAM lParam) { static StreamIO *stream; switch (Message) { @@ -88,7 +87,7 @@ LRESULT SSLPassDLG(HWND hDlg, UINT Message, WPARAM wParam, LPARAM lParam) * @param my_errno The value of errno to use in case we want to call strerror(). * @returns Error string, only valid until next call to this function. */ -char *ssl_error_str(int err, int my_errno) +const char *ssl_error_str(int err, int my_errno) { static char ssl_errbuf[256]; char *ssl_errstr = NULL; @@ -96,7 +95,7 @@ char *ssl_error_str(int err, int my_errno) switch(err) { case SSL_ERROR_NONE: - ssl_errstr = "SSL: No error"; + ssl_errstr = "OpenSSL: No error"; break; case SSL_ERROR_SSL: ssl_errstr = "Internal OpenSSL error or protocol error"; @@ -126,27 +125,8 @@ char *ssl_error_str(int err, int my_errno) return ssl_errstr; } -/** Write official OpenSSL error string to ircd log / sendto_realops, using config_status. - * Note that you are expected to announce earlier that you actually encountered an SSL error. - * Also note that multiple error strings may be written out (with a slight chance of including - * irrelevent ones[?]). - */ -void config_report_ssl_error() -{ -unsigned long e; -char buf[512]; - - do { - e = ERR_get_error(); - if (e == 0) - break; /* no (more) errors */ - ERR_error_string_n(e, buf, sizeof(buf)); - config_status(" %s", buf); - } while(e); -} - -/** Ask SSL private key password (rare) */ -int ssl_pem_passwd_cb(char *buf, int size, int rwflag, void *password) +/** Ask certificate private key password (rare) */ +int TLS_key_passwd_cb(char *buf, int size, int rwflag, void *password) { char *pass; static int before = 0; @@ -162,19 +142,19 @@ int ssl_pem_passwd_cb(char *buf, int size, int rwflag, void *password) return strlen(buf); } #ifndef _WIN32 - pass = getpass("Password for SSL private key: "); + pass = getpass("Password for TLS private key: "); #else pass = passbuf; stream.buffer = &pass; stream.size = &passsize; - DialogBoxParam(hInst, "SSLPass", hwIRCDWnd, (DLGPROC)SSLPassDLG, (LPARAM)&stream); + DialogBoxParam(hInst, "TLSKey", hwIRCDWnd, (DLGPROC)TLS_key_passwd_dialog, (LPARAM)&stream); #endif if (pass) { strlcpy(buf, pass, size); strlcpy(beforebuf, pass, sizeof(beforebuf)); before = 1; - SSLKeyPasswd = beforebuf; + TLSKeyPasswd = beforebuf; return (strlen(buf)); } return 0; @@ -192,7 +172,7 @@ static int ssl_verify_callback(int preverify_ok, X509_STORE_CTX *ctx) /** Get Client pointer by SSL pointer */ Client *get_client_by_ssl(SSL *ssl) { - return SSL_get_ex_data(ssl, ssl_client_index); + return SSL_get_ex_data(ssl, tls_client_index); } /** Set requested server name as indicated by SNI */ @@ -218,20 +198,7 @@ static int ssl_hostname_callback(SSL *ssl, int *unk, void *arg) return SSL_TLSEXT_ERR_OK; } -/** Special logging function for SSL/TLS (? make more generic?) */ -static void mylog(char *fmt, ...) -{ - va_list vl; - static char buf[2048]; - - va_start(vl, fmt); - ircvsnprintf(buf, sizeof(buf), fmt, vl); - va_end(vl); - sendto_realops("[SSL rehash] %s", buf); - ircd_log(LOG_ERROR, "%s", buf); -} - -/** Disable SSL/TLS protocols as set by config */ +/** Disable TLS protocols as set by config */ void disable_ssl_protocols(SSL_CTX *ctx, TLSOptions *tlsoptions) { /* OpenSSL has three mechanisms for protocol version control... */ @@ -255,7 +222,7 @@ void disable_ssl_protocols(SSL_CTX *ctx, TLSOptions *tlsoptions) /* The remaining two mechanisms are: * The old way, which is most flexible, is to use: * SSL_CTX_set_options(... SSL_OP_NO_) which allows - * you to disable each and every specific SSL/TLS version. + * you to disable each and every specific TLS version. * * And the new way, which only allows setting a * minimum and maximum protocol version, using: @@ -305,10 +272,10 @@ void disable_ssl_protocols(SSL_CTX *ctx, TLSOptions *tlsoptions) #endif } -/** Initialize SSL/TLS context +/** Initialize TLS context * @param tlsoptions The ::tls-options configuration * @param server Set to 1 if we are initializing a server, 0 for client. - * @returns The SSL/TLS context (SSL_CTX) or NULL in case of error. + * @returns The TLS context (SSL_CTX) or NULL in case of error. */ SSL_CTX *init_ctx(TLSOptions *tlsoptions, int server) { @@ -322,19 +289,20 @@ SSL_CTX *init_ctx(TLSOptions *tlsoptions, int server) if (!ctx) { - config_error("Failed to do SSL CTX new"); - config_report_ssl_error(); + unreal_log(ULOG_ERROR, "config", "TLS_LOAD_FAILED", NULL, + "Failed to do SSL_CTX_new() !?\n$tls_error.all", + log_data_tls_error()); return NULL; } disable_ssl_protocols(ctx, tlsoptions); - SSL_CTX_set_default_passwd_cb(ctx, ssl_pem_passwd_cb); + SSL_CTX_set_default_passwd_cb(ctx, TLS_key_passwd_cb); if (server && !(tlsoptions->options & TLSFLAG_DISABLECLIENTCERT)) { /* We tell OpenSSL/LibreSSL to verify the certificate and set our callback. * Our callback will always accept the certificate since actual checking * will take place elsewhere. Why? Because certificate is (often) delayed - * until after the SSL handshake. Such as in the case of link blocks where + * until after the TLS handshake. Such as in the case of link blocks where * _verify_link() will take care of it only after we learned what server * we are dealing with (and if we should verify certificates for that server). */ @@ -346,71 +314,70 @@ SSL_CTX *init_ctx(TLSOptions *tlsoptions, int server) #endif SSL_CTX_set_options(ctx, SSL_OP_NO_TICKET); - if (!tlsoptions->certificate_file) - { - config_error("No SSL certificate configured (set::options::ssl::certificate or in a listen block)"); - config_report_ssl_error(); - goto fail; - } - if (SSL_CTX_use_certificate_chain_file(ctx, tlsoptions->certificate_file) <= 0) { - config_error("Failed to load SSL certificate %s", tlsoptions->certificate_file); - config_report_ssl_error(); - goto fail; - } - - if (!tlsoptions->key_file) - { - config_error("No SSL key configured (set::options::ssl::key or in a listen block)"); - config_report_ssl_error(); + unreal_log(ULOG_ERROR, "config", "TLS_LOAD_FAILED", NULL, + "Failed to load TLS certificate $filename\n$tls_error.all", + log_data_string("filename", tlsoptions->certificate_file), + log_data_tls_error()); goto fail; } if (SSL_CTX_use_PrivateKey_file(ctx, tlsoptions->key_file, SSL_FILETYPE_PEM) <= 0) { - config_error("Failed to load SSL private key %s", tlsoptions->key_file); - config_report_ssl_error(); + unreal_log(ULOG_ERROR, "config", "TLS_LOAD_FAILED", NULL, + "Failed to load TLS private key $filename\n$tls_error.all", + log_data_string("filename", tlsoptions->key_file), + log_data_tls_error()); goto fail; } if (!SSL_CTX_check_private_key(ctx)) { - config_error("Failed to check SSL private key"); - config_report_ssl_error(); + unreal_log(ULOG_ERROR, "config", "TLS_LOAD_FAILED", NULL, + "Check for TLS private key failed $filename\n$tls_error.all", + log_data_string("filename", tlsoptions->key_file), + log_data_tls_error()); goto fail; } if (SSL_CTX_set_cipher_list(ctx, tlsoptions->ciphers) == 0) { - config_error("Failed to set SSL cipher list"); - config_report_ssl_error(); + unreal_log(ULOG_ERROR, "config", "TLS_INVALID_CIPHERS_LIST", NULL, + "Failed to set TLS cipher list '$tls_ciphers_list'\n$tls_error.all", + log_data_string("tls_ciphers_list", tlsoptions->ciphers), + log_data_tls_error()); goto fail; } #ifdef SSL_OP_NO_TLSv1_3 if (SSL_CTX_set_ciphersuites(ctx, tlsoptions->ciphersuites) == 0) { - config_error("Failed to set SSL ciphersuites list"); - config_report_ssl_error(); + unreal_log(ULOG_ERROR, "config", "TLS_INVALID_CIPHERSUITES_LIST", NULL, + "Failed to set TLS ciphersuites list '$tls_ciphers_list'\n$tls_error.all", + log_data_string("tls_ciphersuites_list", tlsoptions->ciphersuites), + log_data_tls_error()); goto fail; } #endif if (!cipher_check(ctx, &errstr)) { - config_error("There is a problem with your SSL/TLS 'ciphers' configuration setting: %s", errstr); - config_error("Remove the ciphers setting from your configuration file to use safer defaults, or change the cipher setting."); - config_report_ssl_error(); + unreal_log(ULOG_ERROR, "config", "TLS_CIPHER_CHECK_FAILED", NULL, + "There is a problem with your TLS 'ciphers' configuration setting: $quality_check_error\n" + "Remove the ciphers setting from your configuration file to use safer defaults, or change the cipher setting.", + log_data_string("quality_check_error", errstr)); goto fail; } if (!certificate_quality_check(ctx, &errstr)) { - config_error("There is a problem with your SSL/TLS certificate: %s. Please use another certificate/keypair.", errstr); - config_error("If you use the standard UnrealIRCd certificates then you can simply run 'make pem' and 'make install' " - "from your UnrealIRCd source directory (eg: ~/unrealircd-5.X.Y/) to create and install new certificates"); - config_report_ssl_error(); + unreal_log(ULOG_ERROR, "config", "TLS_CERTIFICATE_CHECK_FAILED", NULL, + "There is a problem with your TLS certificate '$filename': $quality_check_error\n" + "If you use the standard UnrealIRCd certificates then you can simply run 'make pem' and 'make install' " + "from your UnrealIRCd source directory (eg: ~/unrealircd-6.X.Y/) to create and install new certificates", + log_data_string("filename", tlsoptions->certificate_file), + log_data_string("quality_check_error", errstr)); goto fail; } @@ -421,8 +388,10 @@ SSL_CTX *init_ctx(TLSOptions *tlsoptions, int server) { if (!SSL_CTX_load_verify_locations(ctx, tlsoptions->trusted_ca_file, NULL)) { - config_error("Failed to load Trusted CA's from %s", tlsoptions->trusted_ca_file); - config_report_ssl_error(); + unreal_log(ULOG_ERROR, "config", "TLS_LOAD_FAILED", NULL, + "Failed to load trusted-ca-file $filename\n$tls_error.all", + log_data_string("filename", tlsoptions->trusted_ca_file), + log_data_tls_error()); goto fail; } } @@ -450,22 +419,22 @@ SSL_CTX *init_ctx(TLSOptions *tlsoptions, int server) #ifdef HAS_SSL_CTX_SET1_CURVES_LIST if (!SSL_CTX_set1_curves_list(ctx, tlsoptions->ecdh_curves)) { - config_error("Failed to apply ecdh-curves '%s'. " - "To get a list of supported curves with the " - "appropriate names, run " - "'openssl ecparam -list_curves' on the server. " - "Separate multiple curves by colon, " - "for example: ecdh-curves \"secp521r1:secp384r1\".", - tlsoptions->ecdh_curves); - config_report_ssl_error(); + unreal_log(ULOG_ERROR, "config", "TLS_INVALID_ECDH_CURVES_LIST", NULL, + "Failed to set ecdh-curves '$ecdh_curves_list'\n$tls_error.all\n" + "HINT: o get a list of supported curves with the appropriate names, " + "run 'openssl ecparam -list_curves' on the server. " + "Separate multiple curves by colon, for example: " + "ecdh-curves \"secp521r1:secp384r1\".", + log_data_string("ecdh_curves_list", tlsoptions->ecdh_curves), + log_data_tls_error()); goto fail; } #else /* We try to avoid this in the config code, but better have * it here too than be sorry if someone screws up: */ - config_error("ecdh-curves specified but not supported by library -- BAD!"); - config_report_ssl_error(); + unreal_log(ULOG_ERROR, "config", "BUG_ECDH_CURVES", NULL, + "ecdh-curves specified but not supported by library -- BAD!"); goto fail; #endif } @@ -487,23 +456,51 @@ fail: return NULL; } -/** Early initalization of SSL/TLS subsystem - called on startup */ -int early_init_ssl(void) +#if OPENSSL_VERSION_NUMBER >= 0x30000000L +MODVAR EVP_MD *sha256_function; /**< SHA256 function for EVP_DigestInit_ex() call */ +MODVAR EVP_MD *sha1_function; /**< SHA1 function for EVP_DigestInit_ex() call */ +MODVAR EVP_MD *md5_function; /**< MD5 function for EVP_DigestInit_ex() call */ +#endif + +/** Early initalization of TLS subsystem - called on startup */ +int early_init_tls(void) { SSL_load_error_strings(); SSLeay_add_ssl_algorithms(); /* This is used to track (SSL *) <--> (Client *) relationships: */ - ssl_client_index = SSL_get_ex_new_index(0, "ssl_client", NULL, NULL, NULL); + tls_client_index = SSL_get_ex_new_index(0, "tls_client", NULL, NULL, NULL); + +#if OPENSSL_VERSION_NUMBER >= 0x30000000L + sha256_function = EVP_MD_fetch(NULL, "SHA2-256", NULL); + if (!sha256_function) + { + fprintf(stderr, "Could not find SHA256 algorithm in TLS library\n"); + exit(6); + } + + sha1_function = EVP_MD_fetch(NULL, "SHA1", NULL); + if (!sha1_function) + { + fprintf(stderr, "Could not find SHA1 algorithm in TLS library\n"); + exit(6); + } + + md5_function = EVP_MD_fetch(NULL, "MD5", NULL); + if (!md5_function) + { + fprintf(stderr, "Could not find MD5 algorithm in TLS library\n"); + exit(6); + } +#endif return 1; } /** Initialize the server and client contexts. * This is only possible after reading the configuration file. */ -int init_ssl(void) +int init_tls(void) { - /* SSL preliminaries. We keep the certificate and key with the context. */ ctx_server = init_ctx(iConf.tls_options, 1); if (!ctx_server) return 0; @@ -513,29 +510,20 @@ int init_ssl(void) return 1; } -/** Reinitialize SSL/TLS server and client contexts - after REHASH -tls +/** Reinitialize TLS server and client contexts - after REHASH -tls */ -void reinit_ssl(Client *client) +void reinit_tls(void) { SSL_CTX *tmp; ConfigItem_listen *listen; ConfigItem_sni *sni; ConfigItem_link *link; - if (!client) - mylog("Reloading all SSL related data (./unrealircd reloadtls)"); - else if (IsUser(client)) - mylog("%s (%s@%s) requested a reload of all SSL related data (/rehash -tls)", - client->name, client->user->username, client->user->realhost); - else - mylog("%s requested a reload of all SSL related data (/rehash -tls)", - client->name); - tmp = init_ctx(iConf.tls_options, 1); if (!tmp) { - config_error("SSL Reload failed."); - config_report_ssl_error(); + unreal_log(ULOG_ERROR, "config", "TLS_RELOAD_FAILED", NULL, + "TLS Reload failed. See previous errors."); return; } if (ctx_server) @@ -545,8 +533,8 @@ void reinit_ssl(Client *client) tmp = init_ctx(iConf.tls_options, 0); if (!tmp) { - config_error("SSL Reload partially failed. Server context is reloaded, client context failed"); - config_report_ssl_error(); + unreal_log(ULOG_ERROR, "config", "TLS_RELOAD_FAILED", NULL, + "TLS Reload failed at client context. See previous errors."); return; } if (ctx_client) @@ -561,8 +549,8 @@ void reinit_ssl(Client *client) tmp = init_ctx(listen->tls_options, 1); if (!tmp) { - config_error("SSL Reload partially failed. listen::tls-options error, see above"); - config_report_ssl_error(); + unreal_log(ULOG_ERROR, "config", "TLS_RELOAD_FAILED", NULL, + "TLS Reload failed at listen::tls-options. See previous errors."); return; } if (listen->ssl_ctx) @@ -579,8 +567,8 @@ void reinit_ssl(Client *client) tmp = init_ctx(sni->tls_options, 1); if (!tmp) { - config_error("SSL Reload partially failed. sni::tls-options error, see above"); - config_report_ssl_error(); + unreal_log(ULOG_ERROR, "config", "TLS_RELOAD_FAILED", NULL, + "TLS Reload failed at sni::tls-options. See previous errors."); return; } if (sni->ssl_ctx) @@ -597,9 +585,9 @@ void reinit_ssl(Client *client) tmp = init_ctx(link->tls_options, 0); if (!tmp) { - config_error("SSL Reload partially failed. link::outgoing::tls-options error in link %s { }, see above", - link->servername); - config_report_ssl_error(); + unreal_log(ULOG_ERROR, "config", "TLS_RELOAD_FAILED", NULL, + "TLS Reload failed at link $servername due to outgoing::tls-options. See previous errors.", + log_data_string("servername", link->servername)); return; } if (link->ssl_ctx) @@ -616,15 +604,23 @@ void SSL_set_nonblocking(SSL *s) BIO_set_nbio(SSL_get_wbio(s),1); } -/** Get SSL/TLS ciphersuite */ -char *tls_get_cipher(SSL *ssl) +/** Get TLS ciphersuite */ +const char *tls_get_cipher(Client *client) { static char buf[256]; - + const char *cached; + + cached = moddata_client_get(client, "tls_cipher"); + if (cached) + return cached; + + if (!MyConnect(client) || !client->local->ssl) + return NULL; + buf[0] = '\0'; - strlcpy(buf, SSL_get_version(ssl), sizeof(buf)); + strlcpy(buf, SSL_get_version(client->local->ssl), sizeof(buf)); strlcat(buf, "-", sizeof(buf)); - strlcat(buf, SSL_get_cipher(ssl), sizeof(buf)); + strlcat(buf, SSL_get_cipher(client->local->ssl), sizeof(buf)); return buf; } @@ -636,30 +632,34 @@ TLSOptions *get_tls_options_for_client(Client *client) { if (!client->local) return NULL; - if (client->serv && client->serv->conf && client->serv->conf->tls_options) - return client->serv->conf->tls_options; + if (client->server && client->server->conf && client->server->conf->tls_options) + return client->server->conf->tls_options; if (client->local && client->local->listener && client->local->listener->tls_options) return client->local->listener->tls_options; return iConf.tls_options; } -/** Outgoing SSL connect (read: handshake) to another server. */ -void ircd_SSL_client_handshake(int fd, int revents, void *data) +/** Outgoing TLS connect (read: handshake) to another server. */ +void unreal_tls_client_handshake(int fd, int revents, void *data) { Client *client = data; - SSL_CTX *ctx = (client->serv && client->serv->conf && client->serv->conf->ssl_ctx) ? client->serv->conf->ssl_ctx : ctx_client; + SSL_CTX *ctx = (client->server && client->server->conf && client->server->conf->ssl_ctx) ? client->server->conf->ssl_ctx : ctx_client; TLSOptions *tlsoptions = get_tls_options_for_client(client); if (!ctx) { - sendto_realops("Could not start SSL client handshake: SSL was not loaded correctly on this server (failed to load cert or key)"); + unreal_log(ULOG_ERROR, "config", "TLS_CREATE_SESSION_FAILED", NULL, + "Could not start TLS client handshake (no ctx?): TLS was possibly not loaded correctly on this server!?\n$tls_error.all", + log_data_tls_error()); return; } client->local->ssl = SSL_new(ctx); if (!client->local->ssl) { - sendto_realops("Failed to SSL_new(ctx)"); + unreal_log(ULOG_ERROR, "config", "TLS_CREATE_SESSION_FAILED", NULL, + "Could not start TLS client handshake: TLS was possibly not loaded correctly on this server!?\n$tls_error.all", + log_data_tls_error()); return; } @@ -679,15 +679,15 @@ void ircd_SSL_client_handshake(int fd, int revents, void *data) BIO_set_ssl_renegotiate_timeout(SSL_get_wbio(client->local->ssl), tlsoptions->renegotiate_timeout); } - if (client->serv && client->serv->conf) + if (client->server && client->server->conf) { /* Client: set hostname for SNI */ - SSL_set_tlsext_host_name(client->local->ssl, client->serv->conf->servername); + SSL_set_tlsext_host_name(client->local->ssl, client->server->conf->servername); } SetTLS(client); - switch (ircd_SSL_connect(client, fd)) + switch (unreal_tls_connect(client, fd)) { case -1: fd_close(fd); @@ -695,11 +695,9 @@ void ircd_SSL_client_handshake(int fd, int revents, void *data) --OpenFiles; return; case 0: - Debug((DEBUG_DEBUG, "SetTLSConnectHandshake(%s)", get_client_name(client, TRUE))); SetTLSConnectHandshake(client); return; case 1: - Debug((DEBUG_DEBUG, "SSL_init_finished should finish this job (%s)", get_client_name(client, TRUE))); return; default: return; @@ -707,15 +705,15 @@ void ircd_SSL_client_handshake(int fd, int revents, void *data) } -/** Called by I/O engine to (re)try accepting an SSL/TLS connection */ -static void ircd_SSL_accept_retry(int fd, int revents, void *data) +/** Called by I/O engine to (re)try accepting an TLS connection */ +static void unreal_tls_accept_retry(int fd, int revents, void *data) { Client *client = data; - ircd_SSL_accept(client, fd); + unreal_tls_accept(client, fd); } -/** Accept an SSL/TLS connection - that is: do the TLS handshake */ -int ircd_SSL_accept(Client *client, int fd) +/** Accept an TLS connection - that is: do the TLS handshake */ +int unreal_tls_accept(Client *client, int fd) { int ssl_err; @@ -730,26 +728,26 @@ int ircd_SSL_accept(Client *client, int fd) { char buf[512]; snprintf(buf, sizeof(buf), - "ERROR :STARTTLS received but this is an SSL-only port. Check your connect settings. " - "If this is a server linking in then add 'ssl' in your link::outgoing::options block.\r\n"); + "ERROR :STARTTLS received but this is a TLS-only port. Check your connect settings. " + "If this is a server linking in then add 'tls' in your link::outgoing::options block.\r\n"); (void)send(fd, buf, strlen(buf), 0); - return fatal_ssl_error(SSL_ERROR_SSL, SAFE_SSL_ACCEPT, ERRNO, client); + return fatal_tls_error(SSL_ERROR_SSL, FUNC_TLS_ACCEPT, ERRNO, client); } if ((n >= 4) && (!strncmp(buf, "USER", 4) || !strncmp(buf, "NICK", 4) || !strncmp(buf, "PASS", 4) || !strncmp(buf, "CAP ", 4))) { char buf[512]; snprintf(buf, sizeof(buf), - "ERROR :NON-SSL command received on SSL-only port. Check your connection settings.\r\n"); + "ERROR :NON-TLS command received on TLS-only port. Check your connection settings.\r\n"); (void)send(fd, buf, strlen(buf), 0); - return fatal_ssl_error(SSL_ERROR_SSL, SAFE_SSL_ACCEPT, ERRNO, client); + return fatal_tls_error(SSL_ERROR_SSL, FUNC_TLS_ACCEPT, ERRNO, client); } if ((n >= 8) && (!strncmp(buf, "PROTOCTL", 8) || !strncmp(buf, "SERVER", 6))) { char buf[512]; snprintf(buf, sizeof(buf), - "ERROR :NON-SSL command received on SSL-only port. Check your connection settings.\r\n"); + "ERROR :NON-TLS command received on TLS-only port. Check your connection settings.\r\n"); (void)send(fd, buf, strlen(buf), 0); - return fatal_ssl_error(SSL_ERROR_SSL, SAFE_SSL_ACCEPT, ERRNO, client); + return fatal_tls_error(SSL_ERROR_SSL, FUNC_TLS_ACCEPT, ERRNO, client); } if (n > 0) SetNextCall(client); @@ -764,17 +762,17 @@ int ircd_SSL_accept(Client *client, int fd) { return 1; } - return fatal_ssl_error(ssl_err, SAFE_SSL_ACCEPT, ERRNO, client); + return fatal_tls_error(ssl_err, FUNC_TLS_ACCEPT, ERRNO, client); case SSL_ERROR_WANT_READ: - fd_setselect(fd, FD_SELECT_READ, ircd_SSL_accept_retry, client); + fd_setselect(fd, FD_SELECT_READ, unreal_tls_accept_retry, client); fd_setselect(fd, FD_SELECT_WRITE, NULL, client); return 1; case SSL_ERROR_WANT_WRITE: fd_setselect(fd, FD_SELECT_READ, NULL, client); - fd_setselect(fd, FD_SELECT_WRITE, ircd_SSL_accept_retry, client); + fd_setselect(fd, FD_SELECT_WRITE, unreal_tls_accept_retry, client); return 1; default: - return fatal_ssl_error(ssl_err, SAFE_SSL_ACCEPT, ERRNO, client); + return fatal_tls_error(ssl_err, FUNC_TLS_ACCEPT, ERRNO, client); } /* NOTREACHED */ return -1; @@ -786,14 +784,14 @@ int ircd_SSL_accept(Client *client, int fd) } /** Called by the I/O engine to (re)try to connect to a remote host */ -static void ircd_SSL_connect_retry(int fd, int revents, void *data) +static void unreal_tls_connect_retry(int fd, int revents, void *data) { Client *client = data; - ircd_SSL_connect(client, fd); + unreal_tls_connect(client, fd); } /** Connect to a remote host - that is: connect and do the TLS handshake */ -int ircd_SSL_connect(Client *client, int fd) +int unreal_tls_connect(Client *client, int fd) { int ssl_err; @@ -805,23 +803,23 @@ int ircd_SSL_connect(Client *client, int fd) case SSL_ERROR_SYSCALL: if (ERRNO == P_EINTR || ERRNO == P_EWOULDBLOCK || ERRNO == P_EAGAIN) { - /* Hmmm. This implementation is different than in ircd_SSL_accept(). + /* Hmmm. This implementation is different than in unreal_tls_accept(). * One of them must be wrong -- better check! (TODO) */ - fd_setselect(fd, FD_SELECT_READ|FD_SELECT_WRITE, ircd_SSL_connect_retry, client); + fd_setselect(fd, FD_SELECT_READ|FD_SELECT_WRITE, unreal_tls_connect_retry, client); return 0; } - return fatal_ssl_error(ssl_err, SAFE_SSL_CONNECT, ERRNO, client); + return fatal_tls_error(ssl_err, FUNC_TLS_CONNECT, ERRNO, client); case SSL_ERROR_WANT_READ: - fd_setselect(fd, FD_SELECT_READ, ircd_SSL_connect_retry, client); + fd_setselect(fd, FD_SELECT_READ, unreal_tls_connect_retry, client); fd_setselect(fd, FD_SELECT_WRITE, NULL, client); return 0; case SSL_ERROR_WANT_WRITE: fd_setselect(fd, FD_SELECT_READ, NULL, client); - fd_setselect(fd, FD_SELECT_WRITE, ircd_SSL_connect_retry, client); + fd_setselect(fd, FD_SELECT_WRITE, unreal_tls_connect_retry, client); return 0; default: - return fatal_ssl_error(ssl_err, SAFE_SSL_CONNECT, ERRNO, client); + return fatal_tls_error(ssl_err, FUNC_TLS_CONNECT, ERRNO, client); } /* NOTREACHED */ return -1; @@ -833,7 +831,7 @@ int ircd_SSL_connect(Client *client, int fd) return 1; } -/** Shutdown a SSL/TLS connection (gracefully) */ +/** Shutdown a TLS connection (gracefully) */ int SSL_smart_shutdown(SSL *ssl) { char i; @@ -848,50 +846,54 @@ int SSL_smart_shutdown(SSL *ssl) } /** - * Report a fatal SSL error and disconnect the associated client. + * Report a fatal TLS error and disconnect the associated client. * * @param ssl_error The error as from OpenSSL. * @param where The location, one of the SAFE_SSL_* defines. * @param my_errno A preserved value of errno to pass to ssl_error_str(). * @param client The client the error is associated with. */ -static int fatal_ssl_error(int ssl_error, int where, int my_errno, Client *client) +static int fatal_tls_error(int ssl_error, int where, int my_errno, Client *client) { /* don`t alter ERRNO */ int errtmp = ERRNO; - char *ssl_errstr, *ssl_func; + const char *ssl_errstr, *ssl_func; unsigned long additional_errno = ERR_get_error(); char additional_info[256]; + char buf[512]; const char *one, *two; if (IsDeadSocket(client)) - { -#ifdef DEBUGMODE - /* This is quite possible I guess.. especially if we don't pay attention upstream :p */ - ircd_log(LOG_ERROR, "Warning: fatal_ssl_error() called for already-dead-socket (%d/%s)", - client->local->fd, client->name); -#endif return -1; - } switch(where) { - case SAFE_SSL_READ: + case FUNC_TLS_READ: ssl_func = "SSL_read()"; break; - case SAFE_SSL_WRITE: + case FUNC_TLS_WRITE: ssl_func = "SSL_write()"; break; - case SAFE_SSL_ACCEPT: + case FUNC_TLS_ACCEPT: ssl_func = "SSL_accept()"; break; - case SAFE_SSL_CONNECT: + case FUNC_TLS_CONNECT: ssl_func = "SSL_connect()"; break; default: ssl_func = "undefined SSL func"; } +#if OPENSSL_VERSION_NUMBER >= 0x30000000L + /* Fetch additional error information from OpenSSL 3.0.0+ */ + two = ERR_reason_error_string(additional_errno); + if (two && *two) + { + snprintf(additional_info, sizeof(additional_info), ": %s", two); + } else { + *additional_info = '\0'; + } +#else /* Fetch additional error information from OpenSSL. This is new as of Nov 2017 (4.0.16+) */ one = ERR_func_error_string(additional_errno); two = ERR_reason_error_string(additional_errno); @@ -901,20 +903,18 @@ static int fatal_ssl_error(int ssl_error, int where, int my_errno, Client *clien } else { *additional_info = '\0'; } +#endif ssl_errstr = ssl_error_str(ssl_error, my_errno); - /* if we reply() something here, we might just trigger another - * fatal_ssl_error() call and loop until a stack overflow... - * the client won`t get the ERROR : ... string, but this is - * the only way to do it. - * IRC protocol wasn`t SSL enabled .. --vejeta - */ SetDeadSocket(client); - sendto_snomask(SNO_JUNK, "Exiting ssl client %s: %s: %s%s", - get_client_name(client, TRUE), ssl_func, ssl_errstr, additional_info); + unreal_log(ULOG_DEBUG, "tls", "DEBUG_TLS_FATAL_ERROR", client, + "Exiting TLS client $client.details: $tls_function: $tls_error_string: $tls_additional_info", + log_data_string("tls_function", ssl_func), + log_data_string("tls_error_string", ssl_errstr), + log_data_string("tls_additional_info", additional_info)); - if (where == SAFE_SSL_CONNECT) + if (where == FUNC_TLS_CONNECT) { char extra[256]; *extra = '\0'; @@ -922,15 +922,17 @@ static int fatal_ssl_error(int ssl_error, int where, int my_errno, Client *clien { snprintf(extra, sizeof(extra), ". Please verify that listen::options::ssl is enabled on port %d in %s's configuration file.", - (client->serv && client->serv->conf) ? client->serv->conf->outgoing.port : -1, + (client->server && client->server->conf) ? client->server->conf->outgoing.port : -1, client->name); } - lost_server_link(client, "%s: %s%s%s", ssl_func, ssl_errstr, additional_info, extra); + snprintf(buf, sizeof(buf), "%s: %s%s%s", ssl_func, ssl_errstr, additional_info, extra); + lost_server_link(client, buf); } else - if (IsServer(client) || (client->serv && client->serv->conf)) + if (IsServer(client) || (client->server && client->server->conf)) { /* Either a trusted fully established server (incoming) or an outgoing server link (established or not) */ - lost_server_link(client, "%s: %s%s", ssl_func, ssl_errstr, additional_info); + snprintf(buf, sizeof(buf), "%s: %s%s", ssl_func, ssl_errstr, additional_info); + lost_server_link(client, buf); } if (errtmp) @@ -949,7 +951,7 @@ static int fatal_ssl_error(int ssl_error, int where, int my_errno, Client *clien return -1; } -/** Do a SSL/TLS handshake after a STARTTLS, as a client */ +/** Do a TLS handshake after a STARTTLS, as a client */ int client_starttls(Client *client) { if ((client->local->ssl = SSL_new(ctx_client)) == NULL) @@ -960,15 +962,14 @@ int client_starttls(Client *client) SSL_set_fd(client->local->ssl, client->local->fd); SSL_set_nonblocking(client->local->ssl); - if (client->serv && client->serv->conf) + if (client->server && client->server->conf) { /* Client: set hostname for SNI */ - SSL_set_tlsext_host_name(client->local->ssl, client->serv->conf->servername); + SSL_set_tlsext_host_name(client->local->ssl, client->server->conf->servername); } - if (ircd_SSL_connect(client, client->local->fd) < 0) + if (unreal_tls_connect(client, client->local->fd) < 0) { - Debug((DEBUG_DEBUG, "Failed SSL connect handshake in instance 1: %s", client->name)); SSL_set_shutdown(client->local->ssl, SSL_RECEIVED_SHUTDOWN); SSL_smart_shutdown(client->local->ssl); SSL_free(client->local->ssl); @@ -987,7 +988,7 @@ fail_starttls: } /** Find the appropriate TLSOptions structure for a client. - * NOTE: The default global SSL options will be returned if not found, + * NOTE: The default global TLS options will be returned if not found, * or NULL if no such options are available (unlikely, but possible?). */ TLSOptions *FindTLSOptionsForUser(Client *client) @@ -1020,7 +1021,7 @@ TLSOptions *FindTLSOptionsForUser(Client *client) * @param errstr: Error will be stored in here (optional) * @returns Returns 1 on success and 0 on error. */ -int verify_certificate(SSL *ssl, char *hostname, char **errstr) +int verify_certificate(SSL *ssl, const char *hostname, char **errstr) { static char buf[512]; X509 *cert; @@ -1033,10 +1034,10 @@ int verify_certificate(SSL *ssl, char *hostname, char **errstr) if (!ssl) { - strlcpy(buf, "Not using SSL/TLS", sizeof(buf)); + strlcpy(buf, "Not using TLS", sizeof(buf)); if (errstr) *errstr = buf; - return 0; /* Cannot verify a non-SSL connection */ + return 0; /* Cannot verify a non-TLS connection */ } if (SSL_get_verify_result(ssl) != X509_V_OK) @@ -1085,7 +1086,7 @@ int verify_certificate(SSL *ssl, char *hostname, char **errstr) } /** Grab the certificate name */ -char *certificate_name(SSL *ssl) +const char *certificate_name(SSL *ssl) { static char buf[384]; X509 *cert; @@ -1128,7 +1129,7 @@ int cipher_check(SSL_CTX *ctx, char **errstr) ssl = SSL_new(ctx); if (!ssl) { - snprintf(errbuf, sizeof(errbuf), "Could not create SSL structure"); + snprintf(errbuf, sizeof(errbuf), "Could not create TLS structure"); return 0; } @@ -1169,6 +1170,8 @@ int cipher_check(SSL_CTX *ctx, char **errstr) /** Check if a certificate (or actually: key) is weak */ int certificate_quality_check(SSL_CTX *ctx, char **errstr) { +#if OPENSSL_VERSION_NUMBER < 0x30000000L + // FIXME: this only works on OpenSSL <3.0.0 SSL *ssl; X509 *cert; EVP_PKEY *public_key; @@ -1185,14 +1188,14 @@ int certificate_quality_check(SSL_CTX *ctx, char **errstr) ssl = SSL_new(ctx); if (!ssl) { - snprintf(errbuf, sizeof(errbuf), "Could not create SSL structure"); + snprintf(errbuf, sizeof(errbuf), "Could not create TLS structure"); return 0; } cert = SSL_get_certificate(ssl); if (!cert) { - snprintf(errbuf, sizeof(errbuf), "Could not retrieve SSL/TLS certificate"); + snprintf(errbuf, sizeof(errbuf), "Could not retrieve TLS certificate"); SSL_free(ssl); return 0; } @@ -1221,14 +1224,15 @@ int certificate_quality_check(SSL_CTX *ctx, char **errstr) if (key_length < 2048) { - snprintf(errbuf, sizeof(errbuf), "Your SSL/TLS certificate key is only %d bits, which is insecure", key_length); + snprintf(errbuf, sizeof(errbuf), "Your TLS certificate key is only %d bits, which is insecure", key_length); return 0; } +#endif return 1; } -char *spki_fingerprint_ex(X509 *x509_cert); +const char *spki_fingerprint_ex(X509 *x509_cert); /** Return the SPKI Fingerprint for a client. * @@ -1237,10 +1241,10 @@ char *spki_fingerprint_ex(X509 *x509_cert); * openssl dgst -sha256 -binary public.key | openssl enc -base64 * ( from https://tools.ietf.org/html/draft-ietf-websec-key-pinning-21#appendix-A ) */ -char *spki_fingerprint(Client *cptr) +const char *spki_fingerprint(Client *cptr) { X509 *x509_cert = NULL; - char *ret; + const char *ret; if (!MyConnect(cptr) || !cptr->local->ssl) return NULL; @@ -1253,12 +1257,11 @@ char *spki_fingerprint(Client *cptr) return ret; } -char *spki_fingerprint_ex(X509 *x509_cert) +const char *spki_fingerprint_ex(X509 *x509_cert) { unsigned char *der_cert = NULL, *p; int der_cert_len, n; static char retbuf[256]; - SHA256_CTX ckctx; unsigned char checksum[SHA256_DIGEST_LENGTH]; memset(retbuf, 0, sizeof(retbuf)); @@ -1274,9 +1277,7 @@ char *spki_fingerprint_ex(X509 *x509_cert) /* The DER encoded SPKI is stored in 'der_cert' with length 'der_cert_len'. * Now we need to create an SHA256 hash out of it. */ - SHA256_Init(&ckctx); - SHA256_Update(&ckctx, der_cert, der_cert_len); - SHA256_Final(checksum, &ckctx); + sha256hash_binary(checksum, der_cert, der_cert_len); /* And convert the binary to a base64 string... */ n = b64_encode(checksum, SHA256_DIGEST_LENGTH, retbuf, sizeof(retbuf)); @@ -1317,7 +1318,7 @@ int outdated_tls_client(Client *client) } /** Returns the expanded string used for set::outdated-tls-policy::user-message etc. */ -char *outdated_tls_client_build_string(char *pattern, Client *client) +const char *outdated_tls_client_build_string(const char *pattern, Client *client) { static char buf[512]; const char *name[3], *value[3]; @@ -1404,8 +1405,10 @@ void check_certificate_expiry_tlsoptions_and_warn(TLSOptions *tlsoptions) if (check_certificate_expiry_ctx(ctx, &errstr)) { - sendto_umode_global(UMODE_OPER, "Warning: TLS certificate '%s': %s", tlsoptions->certificate_file, errstr); - ircd_log(LOG_ERROR, "[warning] TLS certificate '%s': %s", tlsoptions->certificate_file, errstr); + unreal_log(ULOG_ERROR, "tls", "TLS_CERT_EXPIRING", NULL, + "Warning: TLS certificate '$filename': $error_string", + log_data_string("filename", tlsoptions->certificate_file), + log_data_string("error_string", errstr)); } SSL_CTX_free(ctx); } diff --git a/src/unrealdb.c b/src/unrealdb.c index e8a7226..6b77c21 100644 --- a/src/unrealdb.c +++ b/src/unrealdb.c @@ -40,15 +40,15 @@ * and I/O speeds of the underlying hardware. */ -/* In UnrealIRCd 5.2.0 we don't write the v1 header yet for unencrypted - * database files, this so users using unencrypted can easily downgrade - * to 5.0.9 and lower should there be any need to do so. +/* In UnrealIRCd 5.2.x we didn't write the v1 header yet for unencrypted + * database files, this so users using unencrypted could easily downgrade + * to version 5.0.9 and older. * We DO support READING encypted, unencrypted v1, and unencrypted raw (v0) - * in 5.2.0, though. - * Presumably in 2022 or so we will stop writing v0 by default and change - * this #undef to a #define to write v1. + * in 5.2.0 onwards, though. + * Starting with UnrealIRCd 6 we now write the header, so people can only + * downgrade from UnrealIRCd 6 to 5.2.0 and later (not 5.0.9). */ -#undef UNREALDB_WRITE_V1 +#define UNREALDB_WRITE_V1 /* If a key is specified, it must be this size */ #define UNREALDB_KEY_LEN crypto_secretstream_xchacha20poly1305_KEYBYTES @@ -68,6 +68,7 @@ /* Forward declarations - only used for internal (static) functions, of course */ static SecretCache *find_secret_cache(Secret *secr, UnrealDBConfig *cfg); static void unrealdb_add_to_secret_cache(Secret *secr, UnrealDBConfig *cfg); +static void unrealdb_set_error(UnrealDB *c, UnrealDBError errcode, FORMAT_STRING(const char *pattern), ...) __attribute__((format(printf,3,4))); UnrealDBError unrealdb_last_error_code; static char *unrealdb_last_error_string = NULL; @@ -136,7 +137,7 @@ static int unrealdb_kdf(UnrealDB *c, Secret *secr) * For programmatically checking of error conditions * use unrealdb_get_error_code() instead. */ -char *unrealdb_get_error_string(void) +const char *unrealdb_get_error_string(void) { return unrealdb_last_error_string; } @@ -321,12 +322,16 @@ UnrealDB *unrealdb_open(const char *filename, UnrealDBMode mode, char *secret_bl if (cached) { #ifdef DEBUGMODE - ircd_log(LOG_ERROR, "[UnrealDB] unrealdb_open(): Cache hit for '%s' while writing", secr->name); + unreal_log(ULOG_DEBUG, "unrealdb", "DEBUG_UNREALDB_CACHE_HIT", NULL, + "Cache hit for '$secret_block' while writing", + log_data_string("secret_block", secr->name)); #endif } else { #ifdef DEBUGMODE - ircd_log(LOG_ERROR, "[UnrealDB] unrealdb_open(): Need to run argon2 '%s' while writing", secr->name); + unreal_log(ULOG_DEBUG, "unrealdb", "DEBUG_UNREALDB_CACHE_MISS", NULL, + "Cache miss for '$secret_block' while writing, need to run argon2", + log_data_string("secret_block", secr->name)); #endif if (!unrealdb_kdf(c, secr)) { @@ -414,11 +419,15 @@ UnrealDB *unrealdb_open(const char *filename, UnrealDBMode mode, char *secret_bl /* Use cached key, no need to run expensive argon2.. */ memcpy(c->config->key, dbcache->config->key, c->config->keylen); #ifdef DEBUGMODE - ircd_log(LOG_ERROR, "[UnrealDB] unrealdb_open(): Cache hit for '%s' while reading", secr->name); + unreal_log(ULOG_DEBUG, "unrealdb", "DEBUG_UNREALDB_CACHE_HIT", NULL, + "Cache hit for '$secret_block' while reading", + log_data_string("secret_block", secr->name)); #endif } else { #ifdef DEBUGMODE - ircd_log(LOG_ERROR, "[UnrealDB] unrealdb_open(): Need to run argon2 for '%s' while reading", secr->name); + unreal_log(ULOG_DEBUG, "unrealdb", "DEBUG_UNREALDB_CACHE_MISS", NULL, + "Cache miss for '$secret_block' while reading, need to run argon2", + log_data_string("secret_block", secr->name)); #endif if (!unrealdb_kdf(c, secr)) { @@ -563,11 +572,11 @@ char *unrealdb_test_db(const char *filename, char *secret_block) * unrealdb_write_int64(), unrealdb_write_int32(), unrealdb_write_int16(), * unrealdb_write_char(), unrealdb_write_str(). */ -static int unrealdb_write(UnrealDB *c, void *wbuf, int len) +static int unrealdb_write(UnrealDB *c, const void *wbuf, int len) { char buf_out[UNREALDB_CRYPT_FILE_CHUNK_SIZE + crypto_secretstream_xchacha20poly1305_ABYTES]; unsigned long long out_len; - char *buf = wbuf; + const char *buf = wbuf; if (c->error_code) return 0; @@ -643,7 +652,7 @@ static int unrealdb_write(UnrealDB *c, void *wbuf, int len) * Note that 'x' can safely be NULL. * @returns 1 on success, 0 on failure. */ -int unrealdb_write_str(UnrealDB *c, char *x) +int unrealdb_write_str(UnrealDB *c, const char *x) { uint16_t len; @@ -934,6 +943,7 @@ int unrealdb_read_char(UnrealDB *c, char *t) /** @} */ +#if 0 void fatal_error(FORMAT_STRING(const char *pattern), ...) { va_list vl; @@ -1045,10 +1055,11 @@ void unrealdb_test(void) fprintf(stderr, "**** TESTING UNENCRYPTED ****\n"); unrealdb_test_speed(NULL); } +#endif /** TODO: document and implement */ -char *unrealdb_test_secret(char *name) +const char *unrealdb_test_secret(const char *name) { // FIXME: check if exists, if not then return an error, with a nice FAQ reference etc. return NULL; /* no error */ diff --git a/src/updconf.c b/src/updconf.c deleted file mode 100644 index 8294960..0000000 --- a/src/updconf.c +++ /dev/null @@ -1,1730 +0,0 @@ -/* - * Configuration file updater - upgrade from 3.2.x to 4.x - * (C) Copyright 2015 Bram Matthys and the UnrealIRCd team - * - * License: GPLv2 - */ - -#include "unrealircd.h" - -extern void config_free(ConfigFile *cfptr); - -char configfiletmp[512]; - -struct Upgrade -{ - char *locop_host; - char *oper_host; - char *coadmin_host; - char *admin_host; - char *sadmin_host; - char *netadmin_host; - int host_on_oper_up; -}; - -struct Upgrade upgrade; - -typedef struct FlagMapping FlagMapping; -struct FlagMapping -{ - char shortflag; - char *longflag; -}; - -static FlagMapping FlagMappingTable[] = { - { 'o', "local" }, - { 'O', "global" }, - { 'r', "can_rehash" }, - { 'D', "can_die" }, - { 'R', "can_restart" }, - { 'w', "can_wallops" }, - { 'g', "can_globops" }, - { 'c', "can_localroute" }, - { 'L', "can_globalroute" }, - { 'K', "can_globalkill" }, - { 'b', "can_kline" }, - { 'B', "can_unkline" }, - { 'n', "can_localnotice" }, - { 'G', "can_globalnotice" }, - { 'A', "admin" }, - { 'a', "services-admin" }, - { 'N', "netadmin" }, - { 'C', "coadmin" }, - { 'z', "can_zline" }, - { 'W', "get_umodew" }, - { 'H', "get_host" }, - { 't', "can_gkline" }, - { 'Z', "can_gzline" }, - { 'v', "can_override" }, - { 'q', "can_setq" }, - { 'd', "can_dccdeny" }, - { 'T', "can_tsctl" }, - { 0, NULL }, -}; - -int needs_modules_default_conf = 1; -int needs_operclass_default_conf = 1; - -static void die() -{ -#ifdef _WIN32 - win_error(); /* ? */ -#endif - exit(0); -} - -#define CFGBUFSIZE 1024 -void modify_file(int start, char *ins, int stop) -{ - char configfiletmp2[512]; - FILE *fdi, *fdo; - char *rdbuf = NULL, *wbuf; - int n; - int first = 1; - - snprintf(configfiletmp2, sizeof(configfiletmp2), "%s.tmp", configfiletmp); // .tmp.tmp :D - -#ifndef _WIN32 - fdi = fopen(configfiletmp, "r"); - fdo = fopen(configfiletmp2, "w"); -#else - fdi = fopen(configfiletmp, "rb"); - fdo = fopen(configfiletmp2, "wb"); -#endif - - if (!fdi || !fdo) - { - config_error("could not read/write to %s/%s", configfiletmp, configfiletmp2); - die(); - } - - rdbuf = safe_alloc(start); - - if ((n = fread(rdbuf, 1, start, fdi)) != start) - { - config_error("read error in remove_section(%d,%d): %d", start, stop, n); - die(); - } - - fwrite(rdbuf, 1, start, fdo); - - safe_free(rdbuf); - - if (ins) - fwrite(ins, 1, strlen(ins), fdo); /* insert this piece */ - - if (stop > 0) - { - if (fseek(fdi, stop+1, SEEK_SET) != 0) - goto end; /* end of file we hope.. */ - } - - // read the remaining stuff - rdbuf = safe_alloc(CFGBUFSIZE); - - while(1) - { - n = fread(rdbuf, 1, CFGBUFSIZE, fdi); - if (n <= 0) - break; // done - - wbuf = rdbuf; - - if (first && (stop > 0)) - { - if ((n > 0) && (*wbuf == '\r')) - { - wbuf++; - n--; - } - if ((n > 0) && (*wbuf == '\n')) - { - wbuf++; - n--; - } - first = 0; - if (n <= 0) - break; /* we are done (EOF) */ - } - - fwrite(wbuf, 1, n, fdo); - } - -end: - fclose(fdi); - fclose(fdo); - - safe_free(rdbuf); - // todo: handle write errors and such.. - - unlink(configfiletmp); - if (rename(configfiletmp2, configfiletmp) < 0) - { - config_error("Could not rename '%s' to '%s': %s", configfiletmp2, configfiletmp, strerror(errno)); - die(); - } -} - -void remove_section(int start, int stop) -{ - modify_file(start, NULL, stop); -} - -void insert_section(int start, char *buf) -{ -#ifdef _WIN32 -static char realbuf[16384]; -char *i, *o; - - if (strlen(buf) > ((sizeof(realbuf)/2)-2)) - abort(); /* damn lazy you !!! */ - - for (i = buf, o = realbuf; *i; i++) - { - if (*i == '\n') - { - *o++ = '\r'; - *o++ = '\n'; - } else - { - *o++ = *i; - } - } - *o = '\0'; - - modify_file(start, realbuf, 0); -#else - modify_file(start, buf, 0); -#endif -} - -void replace_section(ConfigEntry *ce, char *buf) -{ - remove_section(ce->ce_fileposstart, ce->ce_fileposend); - insert_section(ce->ce_fileposstart, buf); -} - -static char buf[8192]; - -int upgrade_me_block(ConfigEntry *ce) -{ - ConfigEntry *cep; - char *name = NULL; - char *info = NULL; - int numeric = 0; - - char sid[16]; - - for (cep = ce->ce_entries; cep; cep = cep->ce_next) - { - if (!strcmp(cep->ce_varname, "sid")) - return 0; /* no upgrade needed */ - else if (!cep->ce_vardata) - { - config_error_empty(cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - "me", cep->ce_varname); - return 0; - } - else if (!strcmp(cep->ce_varname, "name")) - name = cep->ce_vardata; - else if (!strcmp(cep->ce_varname, "info")) - info = cep->ce_vardata; - else if (!strcmp(cep->ce_varname, "numeric")) - numeric = atoi(cep->ce_vardata); - } - - if (!name || !info || !numeric) - { - /* Invalid block as it does not contain the 3.2.x mandatory items */ - return 0; - } - - snprintf(sid, sizeof(sid), "%.3d", numeric); - - snprintf(buf, sizeof(buf), - "me {\n" - "\tname %s;\n" - "\tinfo \"%s\";\n" - "\tsid %s;\n" - "};\n", - name, - info, - sid); - - replace_section(ce, buf); - - config_status("- me block upgraded"); - return 1; -} - -int upgrade_link_block(ConfigEntry *ce) -{ - ConfigEntry *cep, *cepp; - char *bind_ip = NULL; - char *username = NULL; - char *hostname = NULL; - char *port = NULL; - char *password_receive = NULL; - char *password_connect = NULL; - char *class = NULL; - int options_ssl = 0; - int options_autoconnect = 0; - int options_nohostcheck = 0; - int options_quarantine = 0; - /* options_nodnscache is deprecated, always now.. */ - char *hub = NULL; - char *leaf = NULL; - int leaf_depth = -1; - char *ciphers = NULL; - char *password_receive_authmethod = NULL; - int need_incoming = 0, need_outgoing = 0; - - /* ripped from test_link */ - for (cep = ce->ce_entries; cep; cep = cep->ce_next) - { - if (!strcmp(cep->ce_varname, "incoming") || !strcmp(cep->ce_varname, "outgoing")) - return 0; /* no upgrade needed */ - else if (!strcmp(cep->ce_varname, "options")) - { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) - { - if (!strcmp(cepp->ce_varname, "ssl")) - options_ssl = 1; - if (!strcmp(cepp->ce_varname, "autoconnect")) - options_autoconnect = 1; - if (!strcmp(cepp->ce_varname, "nohostcheck")) - options_nohostcheck = 1; - if (!strcmp(cepp->ce_varname, "quarantine")) - options_quarantine = 1; - } - } - else if (!cep->ce_vardata) - { - config_error_empty(cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - "link", cep->ce_varname); - return 0; - } - else if (!strcmp(cep->ce_varname, "username")) - username = cep->ce_vardata; - else if (!strcmp(cep->ce_varname, "hostname")) - hostname = cep->ce_vardata; - else if (!strcmp(cep->ce_varname, "bind-ip")) - bind_ip = cep->ce_vardata; - else if (!strcmp(cep->ce_varname, "port")) - port = cep->ce_vardata; - else if (!strcmp(cep->ce_varname, "password-receive")) - { - password_receive = cep->ce_vardata; - if (cep->ce_entries) - password_receive_authmethod = cep->ce_entries->ce_varname; - } - else if (!strcmp(cep->ce_varname, "password-connect")) - password_connect = cep->ce_vardata; - else if (!strcmp(cep->ce_varname, "class")) - class = cep->ce_vardata; - else if (!strcmp(cep->ce_varname, "hub")) - hub = cep->ce_vardata; - else if (!strcmp(cep->ce_varname, "leaf")) - leaf = cep->ce_vardata; - else if (!strcmp(cep->ce_varname, "leafdepth")) - leaf_depth = atoi(cep->ce_vardata); - else if (!strcmp(cep->ce_varname, "ciphers")) - ciphers = cep->ce_vardata; - } - - if (!username || !hostname || !class || !password_receive || - !password_connect || !port) - { - /* Invalid link block as it does not contain the 3.2.x mandatory items */ - return 0; - } - - if (strchr(hostname, '?') || strchr(hostname, '*')) - { - /* Wildcards in hostname: incoming only */ - need_incoming = 1; - need_outgoing = 0; - } - else - { - /* IP (or hostname with nohostcheck) */ - need_incoming = 1; - need_outgoing = 1; - } - - snprintf(buf, sizeof(buf), "link %s {\n", ce->ce_vardata); - - if (need_incoming) - { - char upg_mask[HOSTLEN+USERLEN+8]; - - if (options_nohostcheck) - { - strlcpy(upg_mask, "*", sizeof(upg_mask)); - } - else - { - if (!strcmp(username, "*")) - strlcpy(upg_mask, hostname, sizeof(upg_mask)); /* just host */ - else - snprintf(upg_mask, sizeof(upg_mask), "%s@%s", username, hostname); /* user@host */ - } - - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "\tincoming {\n\t\tmask %s;\n\t};\n", upg_mask); - } - - if (need_outgoing) - { - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), - "\toutgoing {\n" - "\t\tbind-ip %s;\n" - "\t\thostname %s;\n" - "\t\tport %s;\n" - "\t\toptions { %s%s};\n" - "\t};\n", - bind_ip, - hostname, - port, - options_ssl ? "ssl; " : "", - options_autoconnect ? "autoconnect; " : ""); - } - - if (strcasecmp(password_connect, password_receive)) - { - if (!password_receive_authmethod) - { - /* Prompt user ? */ - config_warn("Link block '%s' has a different connect/receive password. " - "This is no longer supported in UnrealIRCd 4.x", - ce->ce_vardata); - - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), - "\tpassword \"%s\"; /* WARNING: password changed due to 4.x upgrade */\n", - options_autoconnect ? password_connect : password_receive); - } else - { - /* sslcertificate or sslcertficatefp */ - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), - "\tpassword \"%s\" { %s; };\n", - password_receive, - password_receive_authmethod); - } - } else { - /* identical connect & receive passwords. easy. */ - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), - "\tpassword \"%s\";\n", password_receive); - } - - if (hub) - { - if (strcmp(hub, "*")) // only if it's something other than *, as * is the default anyway.. - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "\thub %s;\n", hub); - } else - if (leaf) - { - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "\tleaf %s;\n", leaf); - if (leaf_depth) - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "\tleaf-depth %d;\n", leaf_depth); - } - - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "\tclass %s;\n", class); - - if (ciphers) - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "\tciphers %s;\n", ciphers); - - if (options_quarantine) - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "\toptions { quarantine; };\n"); - - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "};\n"); /* end */ - - replace_section(ce, buf); - - config_status("- link block '%s' upgraded", ce->ce_vardata); - return 1; -} - -/** oper::from::userhost becomes oper::mask & vhost::from::userhost becomes vhost::mask */ -#define MAXFROMENTRIES 100 -int upgrade_from_subblock(ConfigEntry *ce) -{ - ConfigEntry *cep; - char *list[MAXFROMENTRIES]; - int listcnt = 0; - - memset(list, 0, sizeof(list)); - - for (cep = ce->ce_entries; cep; cep = cep->ce_next) - { - if (!cep->ce_vardata) - continue; - else if (!strcmp(cep->ce_varname, "userhost")) - { - if (listcnt == MAXFROMENTRIES) - break; // no room, sorry. - list[listcnt++] = cep->ce_vardata; - } - } - - if (listcnt == 0) - return 0; /* invalid block. strange. */ - - if (listcnt == 1) - { - char *m = !strncmp(list[0], "*@", 2) ? list[0]+2 : list[0]; /* skip or don't skip the user@ part */ - snprintf(buf, sizeof(buf), "mask %s;\n", m); - } else - { - /* Multiple (list of masks) */ - int i; - snprintf(buf, sizeof(buf), "mask {\n"); - - for (i=0; i < listcnt; i++) - { - char *m = !strncmp(list[i], "*@", 2) ? list[i]+2 : list[i]; /* skip or don't skip the user@ part */ - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "\t%s;\n", m); - } - - strlcat(buf, "\t};\n", sizeof(buf)); - } - - replace_section(ce, buf); - - config_status("- %s::from::userhost sub-block upgraded", ce->ce_prevlevel ? ce->ce_prevlevel->ce_varname : "???"); - return 1; -} - -int upgrade_loadmodule(ConfigEntry *ce) -{ - char *file = ce->ce_vardata; - char tmp[512], *p, *newfile; - - if (!file) - return 0; - - if (our_strcasestr(file, "commands.dll") || our_strcasestr(file, "/commands.so")) - { - snprintf(buf, sizeof(buf), "include \"modules.default.conf\";\n"); - needs_modules_default_conf = 0; - if (needs_operclass_default_conf) - { - /* This is a nice place :) */ - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "include \"operclass.default.conf\";\n"); - needs_operclass_default_conf = 0; - } - replace_section(ce, buf); - config_status("- loadmodule for '%s' replaced with an include \"modules.default.conf\"", file); - return 1; - } - - if (our_strcasestr(file, "cloak.dll") || our_strcasestr(file, "/cloak.so")) - { - replace_section(ce, "/* NOTE: cloaking module is included in modules.default.conf */"); - config_status("- loadmodule for '%s' removed as this is now in modules.default.conf", file); - return 1; - } - - /* All other loadmodule commands... */ - - strlcpy(tmp, file, sizeof(tmp)); - p = strstr(tmp, ".so"); - if (p) - *p = '\0'; - p = our_strcasestr(tmp, ".dll"); - if (p) - *p = '\0'; - - newfile = !strncmp(tmp, "src/", 4) ? tmp+4 : tmp; - - newfile = !strncmp(newfile, "modules/", 8) ? newfile+8 : newfile; - - if (!strcmp(newfile, file)) - return 0; /* no change */ - - snprintf(buf, sizeof(buf), "loadmodule \"%s\";\n", newfile); - replace_section(ce, buf); - config_status("- loadmodule line converted to new syntax"); - return 1; -} - -int upgrade_include(ConfigEntry *ce) -{ - char *file = ce->ce_vardata; - static int badwords_upgraded_already = 0; - - if (!file) - return 0; - - if (!strstr(file, "help/") && match_simple("help*.conf", file)) - { - snprintf(buf, sizeof(buf), "include \"help/%s\";\n", file); - replace_section(ce, buf); - config_status("- include for '%s' replaced with 'help/%s'", file, file); - return 1; - } - - if (!strcmp("badwords.quit.conf", file)) - { - *buf = '\0'; - replace_section(ce, buf); - config_status("- include for '%s' removed (now in badwords.conf)", file); - return 1; - } - - if (match_simple("badwords.*.conf", file)) - { - if (badwords_upgraded_already) - { - *buf = '\0'; - config_status("- include for '%s' removed (now in badwords.conf)", file); - } else { - strcpy(buf, "/* all badwords are now in badwords.conf */\ninclude \"badwords.conf\";\n"); - badwords_upgraded_already = 1; - config_status("- include for '%s' replaced with 'badwords.conf'", file); - } - replace_section(ce, buf); - return 1; - } - - return 0; -} - -#define MAXSPFTARGETS 32 -int upgrade_spamfilter_block(ConfigEntry *ce) -{ - ConfigEntry *cep, *cepp; - char *reason = NULL; - char *regex = NULL; - char *action = NULL; - char *ban_time = NULL; - char *target[MAXSPFTARGETS]; - char targets[512]; - int targetcnt = 0; - char *match_type = NULL; - char *p; - - memset(target, 0, sizeof(target)); - - for (cep = ce->ce_entries; cep; cep = cep->ce_next) - { - if (!strcmp(cep->ce_varname, "match") || !strcmp(cep->ce_varname, "match-type")) - return 0; /* no upgrade needed */ - else if (!strcmp(cep->ce_varname, "target")) - { - if (cep->ce_vardata) - { - target[0] = cep->ce_vardata; - } - else if (cep->ce_entries) - { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) - { - if (targetcnt == MAXSPFTARGETS) - break; - target[targetcnt++] = cepp->ce_varname; - } - } - } - else if (!cep->ce_vardata) - continue; /* invalid */ - else if (!strcmp(cep->ce_varname, "regex")) - { - regex = cep->ce_vardata; - } - else if (!strcmp(cep->ce_varname, "action")) - { - action = cep->ce_vardata; - } - else if (!strcmp(cep->ce_varname, "reason")) - { - reason = cep->ce_vardata; - } - else if (!strcmp(cep->ce_varname, "ban-time")) - { - ban_time = cep->ce_vardata; - } - } - - if (!regex || !target[0] || !action) - return 0; /* invalid spamfilter block */ - - /* build target(s) list */ - if (targetcnt > 1) - { - int i; - - strlcpy(targets, "{ ", sizeof(targets)); - - for (i=0; i < targetcnt; i++) - { - snprintf(targets+strlen(targets), sizeof(targets)-strlen(targets), - "%s; ", target[i]); - } - strlcat(targets, "}", sizeof(target)); - } else { - strlcpy(targets, target[0], sizeof(targets)); - } - - /* Determine match-type, fallback to 'posix' (=3.2.x regex engine) */ - - match_type = "simple"; - for (p = regex; *p; p++) - if (!isalnum(*p) && !isspace(*p)) - { - match_type = "posix"; - break; - } - - snprintf(buf, sizeof(buf), "spamfilter {\n" - "\tmatch-type %s;\n" - "\tmatch \"%s\";\n" - "\ttarget %s;\n" - "\taction %s;\n", - match_type, - unreal_add_quotes(regex), - targets, - action); - - /* optional: reason */ - if (reason) - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "\treason \"%s\";\n", unreal_add_quotes(reason)); - - /* optional: ban-time */ - if (ban_time) - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "\tban-time \"%s\";\n", ban_time); - - strlcat(buf, "};\n", sizeof(buf)); - - replace_section(ce, buf); - config_status("- spamfilter block converted to new syntax"); - return 1; -} - -#define MAXOPTIONS 32 -int upgrade_allow_block(ConfigEntry *ce) -{ - ConfigEntry *cep, *cepp; - char *hostname = NULL; - char *ip = NULL; - char *maxperip = NULL; - char *ipv6_clone_mask = NULL; - char *password = NULL; - char *password_type = NULL; - char *class = NULL; - char *redirect_server = NULL; - int redirect_port = 0; - char *options[MAXOPTIONS]; - int optionscnt = 0; - char options_str[512], comment[512]; - - memset(options, 0, sizeof(options)); - *comment = *options_str = '\0'; - - for (cep = ce->ce_entries; cep; cep = cep->ce_next) - { - if (!strcmp(cep->ce_varname, "options")) - { - if (cep->ce_vardata) - { - options[0] = cep->ce_vardata; - optionscnt = 1; - } - else if (cep->ce_entries) - { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) - { - if (optionscnt == MAXOPTIONS) - break; - options[optionscnt++] = cepp->ce_varname; - } - } - } - else if (!cep->ce_vardata) - continue; /* invalid */ - else if (!strcmp(cep->ce_varname, "hostname")) - { - hostname = cep->ce_vardata; - } - else if (!strcmp(cep->ce_varname, "ip")) - { - ip = cep->ce_vardata; - } - else if (!strcmp(cep->ce_varname, "maxperip")) - { - maxperip = cep->ce_vardata; - } - else if (!strcmp(cep->ce_varname, "ipv6-clone-mask")) - { - ipv6_clone_mask = cep->ce_vardata; - } - else if (!strcmp(cep->ce_varname, "password")) - { - password = cep->ce_vardata; - if (cep->ce_entries) - password_type = cep->ce_entries->ce_varname; - } - else if (!strcmp(cep->ce_varname, "class")) - { - class = cep->ce_vardata; - } - else if (!strcmp(cep->ce_varname, "redirect-server")) - { - redirect_server = cep->ce_vardata; - } - else if (!strcmp(cep->ce_varname, "redirect-port")) - { - redirect_port = atoi(cep->ce_vardata); - } - } - - if (!ip || !hostname || !class) - return 0; /* missing 3.2.x items in allow block, upgraded already! (or invalid) */ - - /* build target(s) list */ - if (optionscnt == 0) - { - *options_str = '\0'; - } - else - { - int i; - - for (i=0; i < optionscnt; i++) - { - snprintf(options_str+strlen(options_str), sizeof(options_str)-strlen(options_str), - "%s; ", options[i]); - } - } - - /* drop either 'ip' or 'hostname' */ - if (!strcmp(ip, "*@*") && !strcmp(hostname, "*@*")) - hostname = NULL; /* just ip */ - else if (strstr(ip, "NOMATCH")) - ip = NULL; - else if (strstr(hostname, "NOMATCH")) - hostname = NULL; - else if (!strchr(hostname, '.') && strcmp(hostname, "localhost")) - hostname = NULL; - else if (!strchr(ip, '.')) - ip = NULL; - else - { - /* very rare case -- let's bet on IP */ - snprintf(comment, sizeof(comment), "/* CHANGED BY 3.2.x TO 4.x CONF UPGRADE!! Was: ip %s; hostname %s; */\n", ip, hostname); - hostname = NULL; - } - - snprintf(buf, sizeof(buf), "allow {\n"); - - if (*comment) - strlcat(buf, comment, sizeof(buf)); - - if (ip) - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "\tip \"%s\";\n", ip); - - if (hostname) - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "\thostname \"%s\";\n", hostname); - - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "\tclass %s;\n", class); - - /* maxperip: optional in 3.2.x, mandatory in 4.x */ - if (maxperip) - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "\tmaxperip %s;\n", maxperip); - else - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "\tmaxperip 3; /* CHANGED BY 3.2.x TO 4.x CONF UPGRADE! */\n"); - - if (ipv6_clone_mask) - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "\tipv6-clone-mask %s;\n", ipv6_clone_mask); - - if (password) - { - if (password_type) - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "\tpassword \"%s\" { %s; };\n", password, password_type); - else - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "\tpassword \"%s\";\n", password); - } - - if (redirect_server) - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "\tredirect-server %s;\n", redirect_server); - - if (redirect_port) - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "\tredirect-port %d;\n", redirect_port); - - if (*options_str) - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "\toptions { %s};\n", options_str); - - strlcat(buf, "};\n", sizeof(buf)); - - replace_section(ce, buf); - config_status("- allow block converted to new syntax"); - return 1; -} - -/* Pick out the ip address and the port number from a string. - * The string syntax is: ip:port. ip must be enclosed in brackets ([]) if its an ipv6 - * address because they contain colon (:) separators. The ip part is optional. If the string - * contains a single number its assumed to be a port number. - * - * Returns with ip pointing to the ip address (if one was specified), a "*" (if only a port - * was specified), or an empty string if there was an error. port is returned pointing to the - * port number if one was specified, otherwise it points to a empty string. - */ -void ipport_separate(char *string, char **ip, char **port) -{ - char *f; - - /* assume failure */ - *ip = *port = ""; - - /* sanity check */ - if (string && strlen(string) > 0) - { - /* handle ipv6 type of ip address */ - if (*string == '[') - { - if ((f = strrchr(string, ']'))) - { - *ip = string + 1; /* skip [ */ - *f = '\0'; /* terminate the ip string */ - /* next char must be a : if a port was specified */ - if (*++f == ':') - { - *port = ++f; - } - } - } - /* handle ipv4 and port */ - else if ((f = strchr(string, ':'))) - { - /* we found a colon... we may have ip:port or just :port */ - if (f == string) - { - /* we have just :port */ - *ip = "*"; - } - else - { - /* we have ip:port */ - *ip = string; - *f = '\0'; - } - *port = ++f; - } - /* no ip was specified, just a port number */ - else if (!strcmp(string, my_itoa(atoi(string)))) - { - *ip = "*"; - *port = string; - } - } -} - -int upgrade_listen_block(ConfigEntry *ce) -{ - ConfigEntry *cep, *cepp; - char *ip = NULL; - char *port = NULL; - char *options[MAXOPTIONS]; - int optionscnt = 0; - char options_str[512]; - char copy[128]; - - memset(options, 0, sizeof(options)); - *options_str = '\0'; - - if (!ce->ce_vardata) - return 0; /* already upgraded */ - - strlcpy(copy, ce->ce_vardata, sizeof(copy)); - ipport_separate(copy, &ip, &port); - if (!ip || !*ip || !port || !*port) - return 0; /* invalid conf */ - - for (cep = ce->ce_entries; cep; cep = cep->ce_next) - { - if (!strcmp(cep->ce_varname, "options")) - { - if (cep->ce_entries) - { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) - { - if (optionscnt == MAXOPTIONS) - break; - options[optionscnt++] = cepp->ce_varname; - } - } - } - } - - /* build options list */ - if (optionscnt == 0) - { - *options_str = '\0'; - } - else - { - int i; - - for (i=0; i < optionscnt; i++) - { - snprintf(options_str+strlen(options_str), sizeof(options_str)-strlen(options_str), - "%s; ", options[i]); - } - } - - snprintf(buf, sizeof(buf), "listen {\n" - "\tip %s;\n" - "\tport %s;\n", - ip, - port); - - if (*options_str) - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "\toptions { %s};\n", options_str); - - strlcat(buf, "};\n", sizeof(buf)); - - replace_section(ce, buf); - config_status("- listen block converted to new syntax"); - return 1; -} - -int upgrade_cgiirc_block(ConfigEntry *ce) -{ - ConfigEntry *cep; - char *type = NULL; - char *username = NULL; - char *hostname = NULL; - char *password = NULL, *password_type = NULL; - char mask[USERLEN+HOSTLEN+8]; - - for (cep = ce->ce_entries; cep; cep = cep->ce_next) - { - if (!cep->ce_vardata) - { - config_error_empty(cep->ce_fileptr->cf_filename, cep->ce_varlinenum, - "cgiirc", cep->ce_varname); - return 0; - } - else if (!strcmp(cep->ce_varname, "type")) - type = cep->ce_vardata; - else if (!strcmp(cep->ce_varname, "username")) - username = cep->ce_vardata; - else if (!strcmp(cep->ce_varname, "hostname")) - hostname = cep->ce_vardata; - else if (!strcmp(cep->ce_varname, "password")) - { - password = cep->ce_vardata; - if (cep->ce_entries) - password_type = cep->ce_entries->ce_varname; - } - } - - if (!type || !hostname) - { - /* Invalid block as it does not contain the 3.2.x mandatory items */ - return 0; - } - - if (username) - snprintf(mask, sizeof(mask), "%s@%s", username, hostname); - else - strlcpy(mask, hostname, sizeof(mask)); - - if (!strcmp(type, "old")) - { - snprintf(buf, sizeof(buf), - "webirc {\n" - "\ttype old;\n" - "\tmask %s;\n", - mask); - } else - { - if (password_type) - { - snprintf(buf, sizeof(buf), - "webirc {\n" - "\tmask %s;\n" - "\tpassword \"%s\" { %s; };\n" - "};\n", - mask, - password, - password_type); - } else - { - snprintf(buf, sizeof(buf), - "webirc {\n" - "\tmask %s;\n" - "\tpassword \"%s\";\n" - "};\n", - mask, - password); - } - } - - replace_section(ce, buf); - - config_status("- cgiirc block upgraded and renamed to webirc"); - return 1; -} - -int contains_flag(char **flags, int flagscnt, char *needle) -{ - int i; - - for (i = 0; i < flagscnt; i++) - if (!strcmp(flags[i], needle)) - return 1; - - return 0; -} - -int upgrade_oper_block(ConfigEntry *ce) -{ - ConfigEntry *cep, *cepp; - char *name = NULL; - char *password = NULL; - char *password_type = NULL; - char *require_modes = NULL; - char *class = NULL; - char *flags[MAXOPTIONS]; - int flagscnt = 0; - char *swhois = NULL; - char *snomask = NULL; - char *modes = NULL; - int maxlogins = -1; - char *fromlist[MAXFROMENTRIES]; - int fromlistcnt = 0; - char maskbuf[1024]; - char *operclass = NULL; /* set by us, not read from conf */ - char *vhost = NULL; /* set by us, not read from conf */ - int i; - char silly[64]; - - memset(flags, 0, sizeof(flags)); - *maskbuf = '\0'; - - name = ce->ce_vardata; - - if (!name) - return 0; /* oper block without a name = invalid */ - - for (cep = ce->ce_entries; cep; cep = cep->ce_next) - { - if (!strcmp(cep->ce_varname, "operclass")) - return 0; /* already 4.x conf */ - else if (!strcmp(cep->ce_varname, "flags")) - { - if (cep->ce_vardata) /* short options (flag letters) */ - { - char *p; - for (p = cep->ce_vardata; *p; p++) - { - if (flagscnt == MAXOPTIONS) - break; - for (i = 0; FlagMappingTable[i].shortflag; i++) - { - if (FlagMappingTable[i].shortflag == *p) - { - flags[flagscnt] = FlagMappingTable[i].longflag; - flagscnt++; - break; - } - } - } - } - else if (cep->ce_entries) /* long options (flags written out) */ - { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) - { - if (flagscnt == MAXOPTIONS) - break; - flags[flagscnt++] = cepp->ce_varname; - } - } - } - else if (!strcmp(cep->ce_varname, "from")) - { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) - { - if (!strcmp(cepp->ce_varname, "userhost") && cepp->ce_vardata) - { - if (fromlistcnt == MAXFROMENTRIES) - break; // no room, sorry. - fromlist[fromlistcnt++] = cepp->ce_vardata; - } - } - } - else if (!strcmp(cep->ce_varname, "mask")) - { - /* processing mask here means we can also upgrade 3.4-alphaX oper blocks.. */ - if (cep->ce_vardata) - { - if (fromlistcnt == MAXFROMENTRIES) - break; // no room, sorry. - fromlist[fromlistcnt++] = cep->ce_vardata; - } else - { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) - { - if (fromlistcnt == MAXFROMENTRIES) - break; // no room, sorry. - fromlist[fromlistcnt++] = cepp->ce_varname; - } - } - } - else if (!cep->ce_vardata) - continue; /* invalid */ - else if (!strcmp(cep->ce_varname, "password")) - { - password = cep->ce_vardata; - if (cep->ce_entries) - password_type = cep->ce_entries->ce_varname; - } - else if (!strcmp(cep->ce_varname, "require-modes")) - { - require_modes = cep->ce_vardata; - } - else if (!strcmp(cep->ce_varname, "class")) - { - class = cep->ce_vardata; - } - else if (!strcmp(cep->ce_varname, "swhois")) - { - swhois = cep->ce_vardata; - } - else if (!strcmp(cep->ce_varname, "snomasks")) - { - snomask = cep->ce_vardata; - } - else if (!strcmp(cep->ce_varname, "modes")) - { - modes = cep->ce_vardata; - } - else if (!strcmp(cep->ce_varname, "maxlogins")) - { - maxlogins = atoi(cep->ce_vardata); - } - } - - if ((fromlistcnt == 0) || !password || !class) - return 0; /* missing 3.2.x items in allow block (invalid or upgraded already) */ - - /* build oper::mask list in 'maskbuf' (includes variable name) */ - if (fromlistcnt == 1) - { - char *m = !strncmp(fromlist[0], "*@", 2) ? fromlist[0]+2 : fromlist[0]; /* skip or don't skip the user@ part */ - snprintf(maskbuf, sizeof(maskbuf), "mask %s;\n", m); - } else - { - /* Multiple (list of masks) */ - int i; - snprintf(maskbuf, sizeof(maskbuf), "mask {\n"); - - for (i=0; i < fromlistcnt; i++) - { - char *m = !strncmp(fromlist[i], "*@", 2) ? fromlist[i]+2 : fromlist[i]; /* skip or don't skip the user@ part */ - snprintf(maskbuf+strlen(maskbuf), sizeof(maskbuf)-strlen(maskbuf), "\t%s;\n", m); - } - strlcat(maskbuf, "\t};\n", sizeof(maskbuf)); - } - - /* Figure out which default operclass looks most suitable (="find highest rank") */ - if (contains_flag(flags, flagscnt, "netadmin")) - operclass = "netadmin"; - else if (contains_flag(flags, flagscnt, "services-admin")) - operclass = "services-admin"; - else if (contains_flag(flags, flagscnt, "coadmin")) - operclass = "coadmin"; - else if (contains_flag(flags, flagscnt, "admin")) - operclass = "admin"; - else if (contains_flag(flags, flagscnt, "global")) - operclass = "globop"; - else if (contains_flag(flags, flagscnt, "local")) - operclass = "locop"; - else - { - /* Hmm :) */ - config_status("WARNING: I have trouble converting oper block '%s' to the new system. " - "I made it use the locop operclass. Feel free to change", name); - operclass = "locop"; - } - - if (contains_flag(flags, flagscnt, "get_host") || upgrade.host_on_oper_up) - { - if (!strcmp(operclass, "netadmin")) - vhost = upgrade.netadmin_host; - else if (!strcmp(operclass, "services-admin")) - vhost = upgrade.sadmin_host; - else if (!strcmp(operclass, "coadmin")) - vhost = upgrade.coadmin_host; - else if (!strcmp(operclass, "admin")) - vhost = upgrade.admin_host; - else if (!strcmp(operclass, "globop")) - vhost = upgrade.oper_host; - else if (!strcmp(operclass, "locop")) - vhost = upgrade.locop_host; - } - - /* If no swhois is set, then set a title. Just because people are used to it. */ - if (!swhois) - { - if (!strcmp(operclass, "netadmin")) - swhois = "is a Network Administrator"; - else if (!strcmp(operclass, "services-admin")) - swhois = "is a Services Administrator"; - else if (!strcmp(operclass, "coadmin")) - swhois = "is a Co Administrator"; - else if (!strcmp(operclass, "admin")) - swhois = "is a Server Administrator"; - } - - /* The 'coadmin' operclass is actually 'admin'. There's no difference in privileges. */ - if (!strcmp(operclass, "coadmin")) - operclass = "admin"; - - /* convert globop and above w/override to operclassname-with-override */ - if (contains_flag(flags, flagscnt, "can_override") && strcmp(operclass, "locop")) - { - snprintf(silly, sizeof(silly), "%s-with-override", operclass); - operclass = silly; - } - - /* Ok, we got everything we need. Now we will write out the actual new oper block! */ - - /* oper block header & oper::mask */ - snprintf(buf, sizeof(buf), "oper %s {\n" - "\t%s", - name, - maskbuf); - - /* oper::password */ - if (password_type) - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "\tpassword \"%s\" { %s; };\n", password, password_type); - else - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "\tpassword \"%s\";\n", password); - - /* oper::require-modes */ - if (require_modes) - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "\trequire-modes \"%s\";\n", require_modes); - - /* oper::maxlogins */ - if (maxlogins != -1) - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "\tmaxlogins %d;\n", maxlogins); - - /* oper::class */ - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "\tclass %s;\n", class); - - /* oper::operclass */ - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "\toperclass %s;\n", operclass); - - /* oper::modes */ - if (modes) - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "\tmodes \"%s\";\n", modes); - - /* oper::snomask */ - if (snomask) - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "\tsnomask \"%s\";\n", snomask); - - /* oper::vhost */ - if (vhost) - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "\tvhost \"%s\";\n", vhost); - - /* oper::swhois */ - if (swhois) - snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), "\tswhois \"%s\";\n", swhois); - - strlcat(buf, "};\n", sizeof(buf)); - - replace_section(ce, buf); - config_status("- oper block (%s) converted to new syntax", name); - return 1; -} - -void update_read_settings(char *cfgfile) -{ - ConfigFile *cf = NULL; - ConfigEntry *ce = NULL, *cep, *cepp; - - cf = config_load(cfgfile, NULL); - if (!cf) - return; - - if (strstr(cfgfile, "modules.default.conf")) - needs_modules_default_conf = 0; - else if (strstr(cfgfile, "operclass.default.conf")) - needs_operclass_default_conf = 0; - - /* This needs to be read early, as the rest may depend on it */ - for (ce = cf->cf_entries; ce; ce = ce->ce_next) - { - if (!strcmp(ce->ce_varname, "set")) - { - for (cep = ce->ce_entries; cep; cep = cep->ce_next) - { - if (!strcmp(cep->ce_varname, "hosts")) - { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) - { - if (!cepp->ce_vardata) - continue; - if (!strcmp(cepp->ce_varname, "local")) { - safe_strdup(upgrade.locop_host, cepp->ce_vardata); - } - else if (!strcmp(cepp->ce_varname, "global")) { - safe_strdup(upgrade.oper_host, cepp->ce_vardata); - } - else if (!strcmp(cepp->ce_varname, "coadmin")) { - safe_strdup(upgrade.coadmin_host, cepp->ce_vardata); - } - else if (!strcmp(cepp->ce_varname, "admin")) { - safe_strdup(upgrade.admin_host, cepp->ce_vardata); - } - else if (!strcmp(cepp->ce_varname, "servicesadmin")) { - safe_strdup(upgrade.sadmin_host, cepp->ce_vardata); - } - else if (!strcmp(cepp->ce_varname, "netadmin")) { - safe_strdup(upgrade.netadmin_host, cepp->ce_vardata); - } - else if (!strcmp(cepp->ce_varname, "host-on-oper-up")) { - upgrade.host_on_oper_up = config_checkval(cepp->ce_vardata,CFG_YESNO); - } - } - } - } - } - } - - config_free(cf); -} - - -int update_conf_file(void) -{ - ConfigFile *cf = NULL; - ConfigEntry *ce = NULL, *cep, *cepp; - int update_conf_runs = 0; - -again: - if (update_conf_runs++ > 100) - { - config_error("update conf re-run overflow. whoops! upgrade failed! sorry!"); - return 0; - } - - if (cf) - { - config_free(cf); - cf = NULL; - } - - cf = config_load(configfiletmp, NULL); - if (!cf) - { - config_error("could not load configuration file '%s'", configfile); - return 0; - } - - for (ce = cf->cf_entries; ce; ce = ce->ce_next) - { - /*printf("%s%s%s\n", - ce->ce_varname, - ce->ce_vardata ? " " : "", - ce->ce_vardata ? ce->ce_vardata : ""); */ - - if (!strcmp(ce->ce_varname, "loadmodule")) - { - if (upgrade_loadmodule(ce)) - goto again; - } - if (!strcmp(ce->ce_varname, "include")) - { - if (upgrade_include(ce)) - goto again; - } - if (!strcmp(ce->ce_varname, "me")) - { - if (upgrade_me_block(ce)) - goto again; - } - if (!strcmp(ce->ce_varname, "link")) - { - if (upgrade_link_block(ce)) - goto again; - } - if (!strcmp(ce->ce_varname, "oper")) - { - if (upgrade_oper_block(ce)) - goto again; - } - if (!strcmp(ce->ce_varname, "vhost")) - { - for (cep = ce->ce_entries; cep; cep = cep->ce_next) - { - if (!strcmp(cep->ce_varname, "from")) - { - if (upgrade_from_subblock(cep)) - goto again; - } - } - } - if (!strcmp(ce->ce_varname, "spamfilter")) - { - if (upgrade_spamfilter_block(ce)) - goto again; - } - if (!strcmp(ce->ce_varname, "allow") && !ce->ce_vardata) /* 'allow' block for clients, not 'allow channel' etc.. */ - { - if (upgrade_allow_block(ce)) - goto again; - } - if (!strcmp(ce->ce_varname, "listen")) - { - if (upgrade_listen_block(ce)) - goto again; - } - if (!strcmp(ce->ce_varname, "cgiirc")) - { - if (upgrade_cgiirc_block(ce)) - goto again; - } - if (!strcmp(ce->ce_varname, "set")) - { - for (cep = ce->ce_entries; cep; cep = cep->ce_next) - { - if (!strcmp(cep->ce_varname, "throttle")) - { - int n = 0, t = 0; - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) - { - if (!cepp->ce_vardata) - continue; - if (!strcmp(cepp->ce_varname, "period")) - t = config_checkval(cepp->ce_vardata, CFG_TIME); - else if (!strcmp(cepp->ce_varname, "connections")) - n = atoi(cepp->ce_vardata); - } - - remove_section(cep->ce_fileposstart, cep->ce_fileposend); - snprintf(buf, sizeof(buf), "anti-flood { connect-flood %d:%d; };\n", - n, t); - - insert_section(cep->ce_fileposstart, buf); - goto again; - } else - if (!strcmp(cep->ce_varname, "hosts")) - { - config_status("- removed set::hosts. we now use oper::vhost for this."); - remove_section(cep->ce_fileposstart, cep->ce_fileposend); /* hmm something is wrong here */ - goto again; - } else - if (!strcmp(cep->ce_varname, "dns")) - { - for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) - if (!strcmp(cepp->ce_varname, "nameserver") || - !strcmp(cepp->ce_varname, "timeout") || - !strcmp(cepp->ce_varname, "retries")) - { - config_status("- removed set::dns::%s. this option is never used.", cepp->ce_varname); - remove_section(cepp->ce_fileposstart, cepp->ce_fileposend); - goto again; - } - } - } - } - - } - - if (cf) - config_free(cf); - - return (update_conf_runs > 1) ? 1 : 0; -} - -static int already_included(char *fname, ConfigFile *cf) -{ - for (; cf; cf = cf->cf_next) - if (!strcmp(cf->cf_filename, fname)) - return 1; - - return 0; -} - -static void add_include_list(char *fname, ConfigFile **cf) -{ - ConfigFile *n = safe_alloc(sizeof(ConfigFile)); - -// config_status("INCLUDE: %s", fname); - safe_strdup(n->cf_filename, fname); - n->cf_next = *cf; - *cf = n; -} - -void build_include_list_ex(char *fname, ConfigFile **cf_list) -{ - ConfigFile *cf; - ConfigEntry *ce; - - if (strstr(fname, "://")) - return; /* Remote include - ignored */ - - add_include_list(fname, cf_list); - - cf = config_load(fname, NULL); - if (!cf) - return; - - for (ce = cf->cf_entries; ce; ce = ce->ce_next) - if (!strcmp(ce->ce_varname, "include")) - { - if ((ce->ce_vardata[0] != '/') && (ce->ce_vardata[0] != '\\') && strcmp(ce->ce_vardata, CPATH)) - { - char *str = safe_alloc(strlen(ce->ce_vardata) + strlen(CONFDIR) + 4); - sprintf(str, "%s/%s", CONFDIR, ce->ce_vardata); - safe_free(ce->ce_vardata); - ce->ce_vardata = str; - } - if (!already_included(ce->ce_vardata, *cf_list)) - build_include_list_ex(ce->ce_vardata, cf_list); - } - - config_free(cf); -} - -ConfigFile *build_include_list(char *fname) -{ - ConfigFile *cf_list = NULL; - - build_include_list_ex(fname, &cf_list); - return cf_list; -} - -void update_conf(void) -{ - ConfigFile *files; - ConfigFile *cf; - char *mainconf = configfile; - int upgraded_files = 0; - char answerbuf[128], *answer; - - config_status("You have requested to upgrade your configuration files."); - config_status("If you are upgrading from 4.x to 5.x then DO NOT run this script. This script does NOT update config files from 4.x -> 5.x."); - config_status("UnrealIRCd 4.2.x configuration files should work OK on 5.x, with only some warnings printed when you boot the IRCd."); - config_status("See https://www.unrealircd.org/docs/Upgrading_from_4.x#Configuration_changes"); - config_status("This upgrade-conf script is only useful if you are upgrading from 3.2.x."); - config_status(""); -#ifndef _WIN32 - do - { - printf("Continue upgrading 3.2.x to 4.x configuration file format? (Y/N): "); - *answerbuf = '\0'; - answer = fgets(answerbuf, sizeof(answerbuf), stdin); - if (answer && (toupper(*answer) == 'N')) - { - printf("Configuration unchanged.\n"); - return; - } - if (answer && (toupper(*answer) == 'Y')) - { - break; - } - printf("Invalid response. Please enter either Y or N\n\n"); - } while(1); -#endif - - strlcpy(me.name, "", sizeof(me.name)); - memset(&upgrade, 0, sizeof(upgrade)); - - files = build_include_list(mainconf); - - /* We need to read some original settings first, before we touch anything... */ - for (cf = files; cf; cf = cf->cf_next) - { - update_read_settings(cf->cf_filename); - } - - /* Now go upgrade... */ - for (cf = files; cf; cf = cf->cf_next) - { - if (!file_exists(cf->cf_filename)) - continue; /* skip silently. errors were already shown earlier by build_include_list anyway. */ - configfile = cf->cf_filename; - config_status("Checking '%s'...", cf->cf_filename); - snprintf(configfiletmp, sizeof(configfiletmp), "%s.tmp", configfile); - unlink(configfiletmp); - if (!unreal_copyfileex(configfile, configfiletmp, 0)) - { - config_error("Could not create temp file for processing!"); - die(); - } - if (update_conf_file()) - { - char buf[512]; - snprintf(buf, sizeof(buf), "%s.old", configfile); - if (file_exists(buf)) - { - int i; - for (i=0; i<100; i++) - { - snprintf(buf, sizeof(buf), "%s.old.%d", configfile, i); - if (!file_exists(buf)) - break; - } - } - /* rename original config file to ... */ - if (rename(configfile, buf) < 0) - { - config_error("Could not rename original conf '%s' to '%s'", configfile, buf); - die(); - } - - /* Rename converted conf to config file */ -#ifdef _WIN32 - /* "If newpath already exists it will be atomically replaced".. - * well.. not on Windows! Error: "File exists"... - */ - unlink(configfile); -#endif - if (rename(configfiletmp, configfile) < 0) - { - config_error("Could not rename converted configuration file '%s' to '%s' -- please rename this file yourself!", - configfiletmp, configfile); - die(); - } - - config_status("File '%s' upgrade complete.", configfile); - upgraded_files++; - } else { - unlink(configfiletmp); - config_status("File '%s' left unchanged (no upgrade necessary)", configfile); - } - } - configfile = mainconf; /* restore */ - - if (needs_operclass_default_conf) - { - /* There's a slight chance we never added this include, and you get mysterious - * oper permissions errors if you try to use such an operclass and it's missing. - */ - FILE *fd = fopen(mainconf, "a"); - if (fd) - { - fprintf(fd, "\ninclude \"operclass.default.conf\";\n"); - fclose(fd); - config_status("Oh wait, %s needs an include for operclass.default.conf. Added.", mainconf); - upgraded_files++; - } - } - - if (upgraded_files > 0) - { - config_status(""); - config_status("%d configuration file(s) upgraded. You can now boot UnrealIRCd with your freshly converted conf's!", upgraded_files); - config_status("You should probably take a look at the converted configuration files now or at a later time."); - config_status("See also https://www.unrealircd.org/docs/Upgrading_from_3.2.x and the sections in there (eg: Oper block)"); - config_status(""); - } else { - config_status(""); - config_status("No configuration files were changed. No upgrade was needed. If this is incorrect then please report on https://bugs.unrealircd.org/ !"); - config_status(""); - } -} - diff --git a/src/url.c b/src/url_curl.c similarity index 51% rename from src/url.c rename to src/url_curl.c index 8535651..7ff7cdb 100644 --- a/src/url.c +++ b/src/url_curl.c @@ -1,6 +1,7 @@ /* * Unreal Internet Relay Chat Daemon, src/url.c * (C) 2003 Dominick Meglio and the UnrealIRCd Team + * (C) 2004-2021 Bram Matthys * (C) 2012 William Pitcock * * This program is free software; you can redistribute it and/or modify @@ -19,110 +20,35 @@ */ #include "unrealircd.h" +#include "dns.h" -extern char *SSLKeyPasswd; - -#ifndef _WIN32 -extern uid_t irc_uid; -extern gid_t irc_gid; -#endif - -CURLM *multihandle; +extern char *TLSKeyPasswd; /* Stores information about the async transfer. * Used to maintain information about the transfer * to trigger the callback upon completion. */ -typedef struct +typedef struct Download Download; + +struct Download { vFP callback; void *callback_data; - FILE *fd; + FILE *file_fd; /**< File open for writing (otherwise NULL) */ char filename[PATH_MAX]; char *url; /*< must be free()d by url_do_transfers_async() */ char errorbuf[CURL_ERROR_SIZE]; time_t cachetime; -} FileHandle; +}; -/* - * Determines if the given string is a valid URL. Since libcurl - * supports telnet, ldap, and dict such strings are treated as - * invalid URLs here since we don't want them supported in - * unreal. - */ -int url_is_valid(const char *string) +CURLM *multihandle = NULL; + +void url_free_handle(Download *handle) { - if (strstr(string, "telnet://") == string || - strstr(string, "ldap://") == string || - strstr(string, "dict://") == string) - { - return 0; - } - return (strstr(string, "://") != NULL); -} - -/** A displayable URL for in error messages and such. - * This leaves out any authentication information (user:pass) - * the URL may contain. - */ -const char *displayurl(const char *url) -{ - static char buf[512]; - char *proto, *rest; - - /* protocol://user:pass@host/etc.. */ - rest = strchr(url, '@'); - - if (!rest) - return url; /* contains no auth information */ - - rest++; /* now points to the rest (remainder) of the URL */ - - proto = strstr(url, "://"); - if (!proto || (proto > rest) || (proto == url)) - return url; /* incorrectly formatted, just show entire URL. */ - - /* funny, we don't ship strlncpy.. */ - *buf = '\0'; - strlncat(buf, url, sizeof(buf), proto - url); - strlcat(buf, "://***:***@", sizeof(buf)); - strlcat(buf, rest, sizeof(buf)); - - return buf; -} - -/* - * Returns the filename portion of the URL. The returned string - * is malloc()'ed and must be freed by the caller. If the specified - * URL does not contain a filename, a '-' is allocated and returned. - */ -char *url_getfilename(const char *url) -{ - const char *c, *start; - - if ((c = strstr(url, "://"))) - c += 3; - else - c = url; - - while (*c && *c != '/') - c++; - - if (*c == '/') - { - c++; - if (!*c || *c == '?') - return raw_strdup("-"); - start = c; - while (*c && *c != '?') - c++; - if (!*c) - return raw_strdup(start); - else - return raw_strldup(start, c-start+1); - - } - return raw_strdup("-"); + if (handle->file_fd) + fclose(handle->file_fd); + safe_free(handle->url); + safe_free(handle); } /* @@ -132,15 +58,15 @@ char *url_getfilename(const char *url) static void set_curl_tls_options(CURL *curl) { char buf[512]; - + #if 0 /* This would only be necessary if you use client certificates over HTTPS and such. * But this information is not known yet since the configuration file has not been * parsed yet at this point. */ curl_easy_setopt(curl, CURLOPT_SSLCERT, iConf.tls_options->certificate_file); - if (SSLKeyPasswd) - curl_easy_setopt(curl, CURLOPT_SSLKEYPASSWD, SSLKeyPasswd); + if (TLSKeyPasswd) + curl_easy_setopt(curl, CURLOPT_SSLKEYPASSWD, TLSKeyPasswd); curl_easy_setopt(curl, CURLOPT_SSLKEY, iConf.tls_options->key_file); #endif @@ -157,91 +83,6 @@ static size_t do_download(void *ptr, size_t size, size_t nmemb, void *stream) return fwrite(ptr, size, nmemb, (FILE *)stream); } -/* - * Handles synchronous downloading of a file. This function allows - * a download to be made transparently without the caller having any - * knowledge of how libcurl works. If the function succeeds, the - * filename the file was downloaded to is returned. Otherwise NULL - * is returned and the string pointed to by error contains the error - * message. The returned filename is malloc'ed and must be freed by - * the caller. - */ -char *download_file(const char *url, char **error) -{ - static char errorbuf[CURL_ERROR_SIZE]; - CURL *curl = curl_easy_init(); - CURLcode res; - char *file = url_getfilename(url); - char *filename = unreal_getfilename(file); - char *tmp = unreal_mktemp(TMPDIR, filename ? filename : "download.conf"); - FILE *fd; - - - if (!curl) - { - safe_free(file); - strlcpy(errorbuf, "curl_easy_init() failed", sizeof(errorbuf)); - *error = errorbuf; - return NULL; - } - - fd = fopen(tmp, "wb"); - if (!fd) - { - snprintf(errorbuf, CURL_ERROR_SIZE, "Cannot write to %s: %s", tmp, strerror(errno)); - safe_free(file); - *error = errorbuf; - return NULL; - } - curl_easy_setopt(curl, CURLOPT_URL, url); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, fd); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, do_download); - curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1); - curl_easy_setopt(curl, CURLOPT_FILETIME, 1); - curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); - curl_easy_setopt(curl, CURLOPT_TIMEOUT, 45); - curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 15); -#if LIBCURL_VERSION_NUM >= 0x070f01 - curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); - curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 1); -#endif - /* We need to set CURLOPT_FORBID_REUSE because otherwise libcurl does not - * notify us (or not in time) about FD close/opens, thus we end up closing and - * screwing up another innocent FD, like a listener (BAD!). In my view a bug, but - * mailing list archives seem to indicate curl devs have a different opinion - * on these matters... - * Actually I don't know for sure if this option alone fixes 100% of the cases - * but at least I can't crash my server anymore. - * As a side-effect we also fix useless CLOSE_WAIT connections. - */ - curl_easy_setopt(curl, CURLOPT_FORBID_REUSE, 1); - - set_curl_tls_options(curl); - memset(errorbuf, 0, CURL_ERROR_SIZE); - curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorbuf); - res = curl_easy_perform(curl); - fclose(fd); - safe_free(file); - if (res == CURLE_OK) - { - long last_mod; - - curl_easy_getinfo(curl, CURLINFO_FILETIME, &last_mod); - curl_easy_cleanup(curl); - - if (last_mod != -1) - unreal_setfilemodtime(tmp, last_mod); - return raw_strdup(tmp); - } - else - { - curl_easy_cleanup(curl); - remove(tmp); - *error = errorbuf; - return NULL; - } -} - /* * Interface for new-style evented I/O. * @@ -260,7 +101,7 @@ static void url_check_multi_handles(void) { if (msg->msg == CURLMSG_DONE) { - FileHandle *handle; + Download *handle; long code; long last_mod; CURL *easyhand = msg->easy_handle; @@ -268,7 +109,8 @@ static void url_check_multi_handles(void) curl_easy_getinfo(easyhand, CURLINFO_RESPONSE_CODE, &code); curl_easy_getinfo(easyhand, CURLINFO_PRIVATE, (char **) &handle); curl_easy_getinfo(easyhand, CURLINFO_FILETIME, &last_mod); - fclose(handle->fd); + fclose(handle->file_fd); + handle->file_fd = NULL; if (msg->data.result == CURLE_OK) { @@ -292,8 +134,7 @@ static void url_check_multi_handles(void) remove(handle->filename); } - safe_free(handle->url); - safe_free(handle); + url_free_handle(handle); curl_multi_remove_handle(multihandle, easyhand); /* NOTE: after curl_multi_remove_handle() you cannot use @@ -321,22 +162,22 @@ static void url_socket_pollcb(int fd, int revents, void *data) static int url_socket_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *sockp) { - Debug((DEBUG_DEBUG, "url_socket_cb: %d (%s)", (int)s, (what == CURL_POLL_REMOVE)?"remove":"add-or-modify")); if (what == CURL_POLL_REMOVE) { - /* Socket is going to be closed *BY CURL*.. so don't call fd_close() but fd_unmap(). - * Otherwise we (or actually, they) may end up closing the wrong fd. - */ - fd_unmap(s); + fd_close(s); } else { FDEntry *fde = &fd_table[s]; int flags = 0; - + if (!fde->is_open) { - fd_open(s, "CURL transfer"); + /* NOTE: We use FDCLOSE_NONE here because cURL will take + * care of the closing of the socket. So *WE* must never + * close the socket ourselves. + */ + fd_open(s, "CURL transfer", FDCLOSE_NONE); } if (what == CURL_POLL_IN || what == CURL_POLL_INOUT) @@ -352,7 +193,7 @@ static int url_socket_cb(CURL *e, curl_socket_t s, int what, void *cbp, void *so } /* Handle timeouts. */ -static EVENT(curl_socket_timeout) +EVENT(url_socket_timeout) { int dummy; @@ -360,7 +201,7 @@ static EVENT(curl_socket_timeout) url_check_multi_handles(); } -static Event *curl_socket_timeout_hdl = NULL; +static Event *url_socket_timeout_hdl = NULL; /* * Initializes the URL system @@ -371,7 +212,7 @@ void url_init(void) multihandle = curl_multi_init(); curl_multi_setopt(multihandle, CURLMOPT_SOCKETFUNCTION, url_socket_cb); - curl_socket_timeout_hdl = EventAdd(NULL, "curl_socket_timeout", curl_socket_timeout, NULL, 500, 0); + url_socket_timeout_hdl = EventAdd(NULL, "url_socket_timeout", url_socket_timeout, NULL, 500, 0); } /* @@ -395,64 +236,80 @@ void url_init(void) * than 10 seconds to happen and the config file can be rehashed * multiple times during that time. */ -void download_file_async(const char *url, time_t cachetime, vFP callback, void *callback_data) +void download_file_async(const char *url, time_t cachetime, vFP callback, void *callback_data, char *original_url, int maxredirects) { static char errorbuf[CURL_ERROR_SIZE]; - CURL *curl = curl_easy_init(); - if (curl) - { - char *file = url_getfilename(url); - char *filename = unreal_getfilename(file); - char *tmp = unreal_mktemp(TMPDIR, filename ? filename : "download.conf"); - FileHandle *handle = safe_alloc(sizeof(FileHandle)); - handle->fd = fopen(tmp, "wb"); - if (!handle->fd) - { - snprintf(errorbuf, sizeof(errorbuf), "Cannot create '%s': %s", tmp, strerror(ERRNO)); - callback(url, NULL, errorbuf, 0, callback_data); - safe_free(file); - safe_free(handle); - return; - } - handle->callback = callback; - handle->callback_data = callback_data; - handle->cachetime = cachetime; - safe_strdup(handle->url, url); - strlcpy(handle->filename, tmp, sizeof(handle->filename)); - safe_free(file); + char user_agent[256]; + CURL *curl; + char *file; + const char *filename; + char *tmp; + Download *handle; - curl_easy_setopt(curl, CURLOPT_URL, url); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, do_download); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)handle->fd); - curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1); - set_curl_tls_options(curl); - memset(handle->errorbuf, 0, CURL_ERROR_SIZE); - curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, handle->errorbuf); - curl_easy_setopt(curl, CURLOPT_PRIVATE, (char *)handle); - curl_easy_setopt(curl, CURLOPT_FILETIME, 1); - /* We need to set CURLOPT_FORBID_REUSE because otherwise libcurl does not - * notify us (or not in time) about FD close/opens, thus we end up closing and - * screwing up another innocent FD, like a listener (BAD!). In my view a bug, but - * mailing list archives seem to indicate curl devs have a different opinion - * on these matters... - * Actually I don't know for sure if this option alone fixes 100% of the cases - * but at least I can't crash my server anymore. - * As a side-effect we also fix useless CLOSE_WAIT connections. - */ - curl_easy_setopt(curl, CURLOPT_FORBID_REUSE, 1); - if (cachetime) - { - curl_easy_setopt(curl, CURLOPT_TIMECONDITION, CURL_TIMECOND_IFMODSINCE); - curl_easy_setopt(curl, CURLOPT_TIMEVALUE, cachetime); - } - curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); - curl_easy_setopt(curl, CURLOPT_TIMEOUT, 45); - curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 15); + curl = curl_easy_init(); + if (!curl) + { + unreal_log(ULOG_ERROR, "main", "CURL_INTERNAL_FAILURE", NULL, + "Could not initialize curl handle. Maybe out of memory/resources?"); + snprintf(errorbuf, sizeof(errorbuf), "Could not initialize curl handle"); + return; + } + + file = url_getfilename(url); + filename = unreal_getfilename(file); + tmp = unreal_mktemp(TMPDIR, filename ? filename : "download.conf"); + + handle = safe_alloc(sizeof(Download)); + handle->file_fd = fopen(tmp, "wb"); + if (!handle->file_fd) + { + snprintf(errorbuf, sizeof(errorbuf), "Cannot create '%s': %s", tmp, strerror(ERRNO)); + callback(url, NULL, errorbuf, 0, callback_data); + safe_free(file); + safe_free(handle); + return; + } + + handle->callback = callback; + handle->callback_data = callback_data; + handle->cachetime = cachetime; + safe_strdup(handle->url, url); + strlcpy(handle->filename, tmp, sizeof(handle->filename)); + safe_free(file); + + curl_easy_setopt(curl, CURLOPT_URL, url); + snprintf(user_agent, sizeof(user_agent), "UnrealIRCd %s", VERSIONONLY); + curl_easy_setopt(curl, CURLOPT_USERAGENT, user_agent); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, do_download); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)handle->file_fd); + curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1); + set_curl_tls_options(curl); + memset(handle->errorbuf, 0, CURL_ERROR_SIZE); + curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, handle->errorbuf); + curl_easy_setopt(curl, CURLOPT_PRIVATE, (char *)handle); + curl_easy_setopt(curl, CURLOPT_FILETIME, 1); + /* We need to set CURLOPT_FORBID_REUSE because otherwise libcurl does not + * notify us (or not in time) about FD close/opens, thus we end up closing and + * screwing up another innocent FD, like a listener (BAD!). In my view a bug, but + * mailing list archives seem to indicate curl devs have a different opinion + * on these matters... + * Actually I don't know for sure if this option alone fixes 100% of the cases + * but at least I can't crash my server anymore. + * As a side-effect we also fix useless CLOSE_WAIT connections. + */ + curl_easy_setopt(curl, CURLOPT_FORBID_REUSE, 1); + if (cachetime) + { + curl_easy_setopt(curl, CURLOPT_TIMECONDITION, CURL_TIMECOND_IFMODSINCE); + curl_easy_setopt(curl, CURLOPT_TIMEVALUE, cachetime); + } + curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); + curl_easy_setopt(curl, CURLOPT_TIMEOUT, DOWNLOAD_TRANSFER_TIMEOUT); + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, DOWNLOAD_CONNECT_TIMEOUT); #if LIBCURL_VERSION_NUM >= 0x070f01 - curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); - curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 1); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); + curl_easy_setopt(curl, CURLOPT_MAXREDIRS, maxredirects); #endif - curl_multi_add_handle(multihandle, curl); - } + curl_multi_add_handle(multihandle, curl); } diff --git a/src/url_unreal.c b/src/url_unreal.c new file mode 100644 index 0000000..f176a95 --- /dev/null +++ b/src/url_unreal.c @@ -0,0 +1,1068 @@ +/* + * Unreal Internet Relay Chat Daemon, src/url.c + * (C) 2021 Bram Matthys and the UnrealIRCd team + * + * This program is free 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 1, or (at your option) + * any later version. + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "unrealircd.h" +#include "dns.h" + +/* Structs */ + +typedef enum TransferEncoding { + TRANSFER_ENCODING_NONE=0, + TRANSFER_ENCODING_CHUNKED=1 +} TransferEncoding; + +/* Stores information about the async transfer. + * Used to maintain information about the transfer + * to trigger the callback upon completion. + */ +typedef struct Download Download; + +struct Download +{ + Download *prev, *next; + vFP callback; + void *callback_data; + FILE *file_fd; /**< File open for writing (otherwise NULL) */ + char filename[PATH_MAX]; + char *url; /*< must be free()d by url_do_transfers_async() */ + char errorbuf[512]; + time_t cachetime; + char *hostname; /**< Parsed hostname (from 'url') */ + int port; /**< Parsed port (from 'url') */ + char *username; + char *password; + char *document; /**< Parsed document (from 'url') */ + char *ip; /**< Resolved IP */ + int ipv6; + SSL *ssl; + int fd; /**< Socket */ + int connected; + int got_response; + int http_status_code; + char *lefttoparse; + long long lefttoparselen; /* size of data in lefttoparse (note: not used for first header parsing) */ + time_t last_modified; + time_t download_started; + int dns_refcnt; + TransferEncoding transfer_encoding; + long chunk_remaining; + /* for redirects: */ + int redirects_remaining; + char *redirect_new_location; + char *redirect_original_url; +}; + +/* Variables */ +Download *downloads = NULL; +SSL_CTX *https_ctx = NULL; + +/* Forward declarations */ +void url_resolve_cb(void *arg, int status, int timeouts, struct hostent *he); +void unreal_https_initiate_connect(Download *handle); +int url_parse(const char *url, char **host, int *port, char **username, char **password, char **document); +SSL_CTX *https_new_ctx(void); +void unreal_https_connect_handshake(int fd, int revents, void *data); +int https_connect(Download *handle); +int https_fatal_tls_error(int ssl_error, int my_errno, Download *handle); +void https_connect_send_header(Download *handle); +void https_receive_response(int fd, int revents, void *data); +int https_handle_response_header(Download *handle, char *readbuf, int n); +int https_handle_response_file(Download *handle, char *readbuf, int n); +void https_done(Download *handle); +void https_done_cached(Download *handle); +void https_redirect(Download *handle); +int https_parse_header(char *buffer, int len, char **key, char **value, char **lastloc, int *end_of_request); +char *url_find_end_of_request(char *header, int totalsize, int *remaining_bytes); +void https_cancel(Download *handle, FORMAT_STRING(const char *pattern), ...) __attribute__((format(printf,2,3))); + +void url_free_handle(Download *handle) +{ + DelListItem(handle, downloads); + if (handle->fd > 0) + { + fd_close(handle->fd); + fd_unnotify(handle->fd); + } + if (handle->file_fd) + fclose(handle->file_fd); + safe_free(handle->url); + safe_free(handle->hostname); + safe_free(handle->username); + safe_free(handle->password); + safe_free(handle->document); + safe_free(handle->ip); + if (handle->ssl) + SSL_free(handle->ssl); + safe_free(handle->lefttoparse); + safe_free(handle->redirect_new_location); + safe_free(handle->redirect_original_url); + safe_free(handle); +} + +void https_cancel(Download *handle, FORMAT_STRING(const char *pattern), ...) +{ + va_list vl; + va_start(vl, pattern); + vsnprintf(handle->errorbuf, sizeof(handle->errorbuf), pattern, vl); + va_end(vl); + handle->callback(handle->url, NULL, handle->errorbuf, 0, handle->callback_data); + url_free_handle(handle); +} + +void download_file_async(const char *url, time_t cachetime, vFP callback, void *callback_data, char *original_url, int maxredirects) +{ + char *file; + const char *filename; + char *tmp; + Download *handle = NULL; + int ipv6 = 0; + char *host; + int port; + char *username; + char *password; + char *document; + + handle = safe_alloc(sizeof(Download)); + handle->download_started = TStime(); + handle->callback = callback; + handle->callback_data = callback_data; + handle->cachetime = cachetime; + safe_strdup(handle->url, url); + safe_strdup(handle->redirect_original_url, original_url); + handle->redirects_remaining = maxredirects; + AddListItem(handle, downloads); + + if (strncmp(url, "https://", 8)) + { + https_cancel(handle, "Only https:// is supported (either rebuild UnrealIRCd with curl support or use https)"); + return; + } + if (!url_parse(url, &host, &port, &username, &password, &document)) + { + https_cancel(handle, "Failed to parse HTTP url"); + return; + } + + safe_strdup(handle->hostname, host); + handle->port = port; + safe_strdup(handle->username, username); + safe_strdup(handle->password, password); + safe_strdup(handle->document, document); + + file = url_getfilename(url); + filename = unreal_getfilename(file); + tmp = unreal_mktemp(TMPDIR, filename ? filename : "download.conf"); + + handle->file_fd = fopen(tmp, "wb"); + if (!handle->file_fd) + { + https_cancel(handle, "Cannot create '%s': %s", tmp, strerror(ERRNO)); + safe_free(file); + return; + } + + strlcpy(handle->filename, tmp, sizeof(handle->filename)); + safe_free(file); + + + // todo: allocate handle, select en weetikt allemaal + // add to some global struct linkedlist, for timeouts + // register in i/o + + if (is_valid_ip(handle->hostname)) + { + /* Nothing to resolve, eg https://127.0.0.1/ */ + safe_strdup(handle->ip, handle->hostname); + unreal_https_initiate_connect(handle); + } else { + /* Hostname, so start resolving... */ + handle->dns_refcnt++; + ares_gethostbyname(resolver_channel, handle->hostname, AF_INET, url_resolve_cb, handle); + // TODO: check return value? + } +} + +void url_resolve_cb(void *arg, int status, int timeouts, struct hostent *he) +{ + Download *handle = (Download *)arg; + int n; + struct hostent *he2; + char ipbuf[HOSTLEN+1]; + const char *ip = NULL; + + handle->dns_refcnt--; + + if ((status != 0) || !he->h_addr_list || !he->h_addr_list[0]) + { + https_cancel(handle, "Unable to resolve hostname '%s'", handle->hostname); + return; + } + + if (!he->h_addr_list[0] || (he->h_length != (handle->ipv6 ? 16 : 4)) || + !(ip = inetntop(handle->ipv6 ? AF_INET6 : AF_INET, he->h_addr_list[0], ipbuf, sizeof(ipbuf)))) + { + /* Illegal response -- fatal */ + https_cancel(handle, "Unable to resolve hostname '%s'", handle->hostname); + return; + } + + /* Ok, since we got here, it seems things were actually succesfull */ + + safe_strdup(handle->ip, ip); + + unreal_https_initiate_connect(handle); +} + +void unreal_https_initiate_connect(Download *handle) +{ + // todo: allocate handle, select en weetikt allemaal + // add to some global struct linkedlist, for timeouts + // register in i/o + + if (!handle->ip) + { + https_cancel(handle, "No IP address found to connect to"); + return; + } + + handle->fd = fd_socket(handle->ipv6 ? AF_INET6 : AF_INET, SOCK_STREAM, 0, "HTTPS"); + if (handle->fd < 0) + { + https_cancel(handle, "Could not create socket: %s", strerror(ERRNO)); + return; + } + set_sock_opts(handle->fd, NULL, handle->ipv6); + if (!unreal_connect(handle->fd, handle->ip, handle->port, handle->ipv6)) + { + https_cancel(handle, "Could not connect: %s", strerror(ERRNO)); + return; + } + + fd_setselect(handle->fd, FD_SELECT_WRITE, unreal_https_connect_handshake, handle); +} + +// based on unreal_tls_client_handshake() +void unreal_https_connect_handshake(int fd, int revents, void *data) +{ + Download *handle = data; + handle->ssl = SSL_new(https_ctx); + if (!handle->ssl) + { + https_cancel(handle, "Failed to setup SSL"); + return; + } + SSL_set_fd(handle->ssl, handle->fd); + SSL_set_connect_state(handle->ssl); + SSL_set_nonblocking(handle->ssl); + SSL_set_tlsext_host_name(handle->ssl, handle->hostname); + + if (https_connect(handle) < 0) + { + /* Some fatal error already */ + https_cancel(handle, "TLS_connect() failed early"); + return; + } + + /* Is now connecting... */ +} + +SSL_CTX *https_new_ctx(void) +{ + SSL_CTX *ctx_client; + char buf1[512], buf2[512]; + char *curl_ca_bundle = buf1; + + SSL_load_error_strings(); + SSLeay_add_ssl_algorithms(); + + ctx_client = SSL_CTX_new(SSLv23_client_method()); + if (!ctx_client) + return NULL; +#ifdef HAS_SSL_CTX_SET_MIN_PROTO_VERSION + SSL_CTX_set_min_proto_version(ctx_client, TLS1_2_VERSION); +#endif + SSL_CTX_set_options(ctx_client, SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|SSL_OP_NO_TLSv1|SSL_OP_NO_TLSv1_1); + + /* Verify peer certificate */ + snprintf(buf1, sizeof(buf1), "%s/tls/curl-ca-bundle.crt", CONFDIR); + if (!file_exists(buf1)) + { + snprintf(buf2, sizeof(buf2), "%s/doc/conf/tls/curl-ca-bundle.crt", BUILDDIR); + if (!file_exists(buf2)) + { + unreal_log(ULOG_ERROR, "url", "CA_BUNDLE_NOT_FOUND", NULL, + "Neither $filename1 nor $filename2 exist.\n" + "Cannot use built-in https client without curl-ca-bundle.crt\n", + log_data_string("filename1", buf1), + log_data_string("filename2", buf2)); + exit(-1); + } + curl_ca_bundle = buf2; + } + SSL_CTX_load_verify_locations(ctx_client, curl_ca_bundle, NULL); + SSL_CTX_set_verify(ctx_client, SSL_VERIFY_PEER, NULL); + + /* Limit ciphers as well */ + SSL_CTX_set_cipher_list(ctx_client, UNREALIRCD_DEFAULT_CIPHERS); + + return ctx_client; +} + +// Based on unreal_tls_connect_retry +void https_connect_retry(int fd, int revents, void *data) +{ + Download *handle = data; + https_connect(handle); +} + +// Based on unreal_tls_connect() +int https_connect(Download *handle) +{ + int ssl_err; + char *errstr; + + if ((ssl_err = SSL_connect(handle->ssl)) <= 0) + { + ssl_err = SSL_get_error(handle->ssl, ssl_err); + switch(ssl_err) + { + case SSL_ERROR_SYSCALL: + if (ERRNO == P_EINTR || ERRNO == P_EWOULDBLOCK || ERRNO == P_EAGAIN) + { + /* Hmmm. This implementation is different than in unreal_tls_accept(). + * One of them must be wrong -- better check! (TODO) + */ + fd_setselect(handle->fd, FD_SELECT_READ|FD_SELECT_WRITE, https_connect_retry, handle); + return 0; + } + return https_fatal_tls_error(ssl_err, ERRNO, handle); + case SSL_ERROR_WANT_READ: + fd_setselect(handle->fd, FD_SELECT_READ, https_connect_retry, handle); + fd_setselect(handle->fd, FD_SELECT_WRITE, NULL, handle); + return 0; + case SSL_ERROR_WANT_WRITE: + fd_setselect(handle->fd, FD_SELECT_READ, NULL, handle); + fd_setselect(handle->fd, FD_SELECT_WRITE, https_connect_retry, handle); + return 0; + default: + return https_fatal_tls_error(ssl_err, ERRNO, handle); + } + /* NOTREACHED */ + return -1; + } + + /* We are connected now. */ + + if (!verify_certificate(handle->ssl, handle->hostname, &errstr)) + { + https_cancel(handle, "TLS Certificate error for server: %s", errstr); + return -1; + } + https_connect_send_header(handle); + return 1; +} + +/** + * Report a fatal TLS error and terminate the download. + * + * @param ssl_error The error as from OpenSSL. + * @param where The location, one of the SAFE_SSL_* defines. + * @param my_errno A preserved value of errno to pass to ssl_error_str(). + * @param client The client the error is associated with. + */ +int https_fatal_tls_error(int ssl_error, int my_errno, Download *handle) +{ + const char *ssl_errstr; + unsigned long additional_errno = ERR_get_error(); + char additional_info[256]; + const char *one, *two; + +#if OPENSSL_VERSION_NUMBER >= 0x30000000L + /* Fetch additional error information from OpenSSL 3.0.0+ */ + two = ERR_reason_error_string(additional_errno); + if (two && *two) + { + snprintf(additional_info, sizeof(additional_info), ": %s", two); + } else { + *additional_info = '\0'; + } +#else + /* Fetch additional error information from OpenSSL. This is new as of Nov 2017 (4.0.16+) */ + one = ERR_func_error_string(additional_errno); + two = ERR_reason_error_string(additional_errno); + if (one && *one && two && *two) + { + snprintf(additional_info, sizeof(additional_info), ": %s: %s", one, two); + } else { + *additional_info = '\0'; + } +#endif + + ssl_errstr = ssl_error_str(ssl_error, my_errno); + + https_cancel(handle, "%s [%s]", ssl_errstr, additional_info); + return -1; +} + +// copied 100% from modulemanager parse_url() +int url_parse(const char *url, char **hostname, int *port, char **username, char **password, char **document) +{ + char *p, *p2; + static char hostbuf[256]; + static char documentbuf[512]; + + *hostname = *username = *password = *document = NULL; + *port = 443; + + if (strncmp(url, "https://", 8)) + return 0; + url += 8; /* skip over https:// part */ + + p = strchr(url, '/'); + if (!p) + return 0; + + strlncpy(hostbuf, url, sizeof(hostbuf), p - url); + + strlcpy(documentbuf, p, sizeof(documentbuf)); + + *hostname = hostbuf; + *document = documentbuf; + + /* Actually we may still need to extract the port */ + p = strchr(hostbuf, '@'); + if (p) + { + *p++ = '\0'; + + *username = hostbuf; + p2 = strchr(hostbuf, ':'); + if (p2) + { + *p2++ = '\0'; + *password = p2; + } + *hostname = p; + } + p = strchr(*hostname, ':'); + if (p) + { + *p++ = '\0'; + *port = atoi(p); + } + + return 1; +} + +void https_connect_send_header(Download *handle) +{ + char buf[1024]; + char hostandport[512]; + int ssl_err; + char *host; + int port; + char *document; + + handle->connected = 1; + snprintf(hostandport, sizeof(hostandport), "%s:%d", handle->hostname, handle->port); + + /* Prepare the header */ + snprintf(buf, sizeof(buf), "GET %s HTTP/1.1\r\n" + "User-Agent: UnrealIRCd %s\r\n" + "Host: %s\r\n" + "Connection: close\r\n", + handle->document, + VERSIONONLY, + hostandport); + if (handle->username && handle->password) + { + char wbuf[128]; + char obuf[256]; + char header[512]; + + snprintf(wbuf, sizeof(wbuf), "%s:%s", handle->username, handle->password); + if (b64_encode(wbuf, strlen(wbuf), obuf, sizeof(obuf)-1) > 0) + { + snprintf(header, sizeof(header), "Authorization: Basic %s\r\n", obuf); + strlcat(buf, header, sizeof(buf)); + } + } + if (handle->cachetime > 0) + { + const char *datestr = rfc2616_time(handle->cachetime); + if (datestr) + { + // snprintf_append... + snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), + "If-Modified-Since: %s\r\n", datestr); + } + } + strlcat(buf, "\r\n", sizeof(buf)); + + ssl_err = SSL_write(handle->ssl, buf, strlen(buf)); + if (ssl_err < 0) + { + https_fatal_tls_error(ssl_err, ERRNO, handle); + return; + } + fd_setselect(handle->fd, FD_SELECT_WRITE, NULL, handle); + fd_setselect(handle->fd, FD_SELECT_READ, https_receive_response, handle); +} + +void https_receive_response(int fd, int revents, void *data) +{ + Download *handle = data; + int n; + char readbuf[2048]; + + n = SSL_read(handle->ssl, readbuf, sizeof(readbuf)-1); + if (n == 0) + { + /* Graceful close */ + https_done(handle); + return; + } + if (n < 0) + { + int ssl_err = SSL_get_error(handle->ssl, n); + switch (ssl_err) + { + case SSL_ERROR_WANT_WRITE: + fd_setselect(fd, FD_SELECT_READ, NULL, handle); + fd_setselect(fd, FD_SELECT_WRITE, https_receive_response, handle); + return; + case SSL_ERROR_WANT_READ: + /* Wants to read more data; let it call us next time again */ + return; + case SSL_ERROR_SYSCALL: + case SSL_ERROR_SSL: + default: + https_fatal_tls_error(ssl_err, ERRNO, handle); + return; + } + return; + } + readbuf[n] = '\0'; + + //fprintf(stderr, "Got: '%s'\n", readbuf); + + if (!handle->got_response) + { + https_handle_response_header(handle, readbuf, n); + return; + } else + if (handle->got_response) + { + if (!https_handle_response_file(handle, readbuf, n)) + return; /* handle is already freed! */ + } +} + +// Based on websocket_handle_handshake() +int https_handle_response_header(Download *handle, char *readbuf, int n) +{ + char *key, *value; + int r, end_of_request; + char netbuf[4096], netbuf2[4096]; + char *lastloc = NULL; + int maxcopy, nprefix=0; + int totalsize; + + /* Yeah, totally paranoid: */ + memset(netbuf, 0, sizeof(netbuf)); + memset(netbuf2, 0, sizeof(netbuf2)); + + /** Frame re-assembling starts here **/ + *netbuf = '\0'; + if (handle->lefttoparse) + { + strlcpy(netbuf, handle->lefttoparse, sizeof(netbuf)); + nprefix = strlen(netbuf); + } + maxcopy = sizeof(netbuf) - nprefix - 1; + /* (Need to some manual checking here as strlen() can't be safely used + * on readbuf. Same is true for strlncat since it uses strlen().) + */ + if (n > maxcopy) + n = maxcopy; + if (n <= 0) + { + https_cancel(handle, "Oversized line in HTTP response"); + return 0; + } + memcpy(netbuf+nprefix, readbuf, n); /* SAFE: see checking above */ + totalsize = n + nprefix; + netbuf[totalsize] = '\0'; + memcpy(netbuf2, netbuf, totalsize+1); // copy, including the "always present \0 at the end just in case we use strstr etc". + safe_free(handle->lefttoparse); + + /** Now step through the lines.. **/ + for (r = https_parse_header(netbuf, strlen(netbuf), &key, &value, &lastloc, &end_of_request); + r; + r = https_parse_header(NULL, 0, &key, &value, &lastloc, &end_of_request)) + { + // do something actually with the header here ;) + if (!strcasecmp(key, "RESPONSE")) + { + handle->http_status_code = atoi(value); + if (handle->http_status_code == 304) + { + /* 304 Not Modified: cache hit */ + https_done_cached(handle); + return 0; + } + else if ((handle->http_status_code >= 301) && (handle->http_status_code <= 308)) + { + /* Redirect */ + if (handle->redirects_remaining == 0) + { + https_cancel(handle, "Too many HTTP redirects (%d)", DOWNLOAD_MAX_REDIRECTS); + return 0; + } + /* Let it continue.. we handle it later, as we need to + * receive the "Location" header as well. + */ + } + else if (handle->http_status_code != 200) + { + /* HTTP Failure code */ + https_cancel(handle, "HTTP Error: %s", value); + return 0; + } + } else + if (!strcasecmp(key, "Last-Modified") && value) + { + handle->last_modified = rfc2616_time_to_unix_time(value); + } else + if (!strcasecmp(key, "Location") && value) + { + safe_strdup(handle->redirect_new_location, value); + } else + if (!strcasecmp(key, "Transfer-Encoding") && value) + { + if (value && !strcasecmp(value, "chunked")) + handle->transfer_encoding = TRANSFER_ENCODING_CHUNKED; + } + //fprintf(stderr, "\nHEADER '%s'\n\n", key); + } + + if (end_of_request) + { + int remaining_bytes = 0; + char *nextframe; + + safe_free(handle->lefttoparse); + handle->got_response = 1; + + if (handle->http_status_code == 0) + { + https_cancel(handle, "Invalid HTTP response"); + return 0; + } + if (handle->http_status_code != 200) + { + if (handle->redirect_new_location) + { + https_redirect(handle); + return 0; /* this old request dies */ + } else { + https_cancel(handle, "HTTP Redirect encountered but no URL specified!?"); + return 0; + } + } + + nextframe = url_find_end_of_request(netbuf2, totalsize, &remaining_bytes); + if (nextframe) + { + if (!https_handle_response_file(handle, nextframe, remaining_bytes)) + return 0; + } + } + + if (lastloc) + { + /* Last line was cut somewhere, save it for next round. */ + safe_strdup(handle->lefttoparse, lastloc); + } + + return 1; +} + +int https_handle_response_file(Download *handle, char *readbuf, int pktsize) +{ + char *buf; + long long n; + char *free_this_buffer = NULL; + + // TODO we fail to check for write errors ;) + // TODO: Makes sense to track if we got everything? :D + + if (handle->transfer_encoding == TRANSFER_ENCODING_NONE) + { + /* Ohh.. so easy! */ + fwrite(readbuf, 1, pktsize, handle->file_fd); + return 1; + } + + /* Fill 'buf' nd set 'buflen' with what we had + what we have now. + * Makes things easy. + */ + if (handle->lefttoparse) + { + n = handle->lefttoparselen + pktsize; + free_this_buffer = buf = safe_alloc(n); + memcpy(buf, handle->lefttoparse, handle->lefttoparselen); + memcpy(buf+handle->lefttoparselen, readbuf, pktsize); + safe_free(handle->lefttoparse); + handle->lefttoparselen = 0; + } else { + n = pktsize; + buf = readbuf; + } + + /* Chunked transfers.. yayyyy.. */ + while (n > 0) + { + if (handle->chunk_remaining > 0) + { + /* Eat it */ + int eat = MIN(handle->chunk_remaining, n); + fwrite(buf, 1, eat, handle->file_fd); + n -= eat; + buf += eat; + handle->chunk_remaining -= eat; + } else + { + int gotlf = 0; + int i; + + /* First check if it is a (trailing) empty line, + * eg from a previous chunk. Skip over. + */ + if ((n >= 2) && !strncmp(buf, "\r\n", 2)) + { + buf += 2; + n -= 2; + } else + if ((n >= 1) && !strncmp(buf, "\n", 1)) + { + buf++; + n--; + } + + /* Now we are (possibly) at the chunk size line, + * this is or example '7f' + newline. + * So first, check if we have a newline at all. + */ + for (i=0; i < n; i++) + { + if (buf[i] == '\n') + { + gotlf = 1; + break; + } + } + if (!gotlf) + { + /* The line telling us the chunk size is incomplete, + * as it does not contain an \n. Wait for more data + * from the network socket. + */ + if (n > 0) + { + /* Store what we have first.. */ + handle->lefttoparselen = n; + handle->lefttoparse = safe_alloc(n); + memcpy(handle->lefttoparse, buf, n); + } + safe_free(free_this_buffer); + return 1; /* WE WANT MORE! */ + } + buf[i] = '\0'; /* cut at LF */ + i++; /* point to next data */ + handle->chunk_remaining = strtol(buf, NULL, 16); + if (handle->chunk_remaining < 0) + { + https_cancel(handle, "Negative chunk encountered (%ld)", handle->chunk_remaining); + safe_free(free_this_buffer); + return 0; + } + if (handle->chunk_remaining == 0) + { + https_done(handle); + safe_free(free_this_buffer); + return 0; + } + buf += i; + n -= i; + } + } + + safe_free(free_this_buffer); + return 1; +} + +void https_done(Download *handle) +{ + char *url = handle->redirect_original_url ? handle->redirect_original_url : handle->url; + + fclose(handle->file_fd); + handle->file_fd = NULL; + + if (!handle->got_response) + handle->callback(url, NULL, "HTTPS response not received", 0, handle->callback_data); + else + { + if (handle->last_modified > 0) + unreal_setfilemodtime(handle->filename, handle->last_modified); + handle->callback(url, handle->filename, NULL, 0, handle->callback_data); + } + url_free_handle(handle); + return; +} + +void https_done_cached(Download *handle) +{ + char *url = handle->redirect_original_url ? handle->redirect_original_url : handle->url; + + fclose(handle->file_fd); + handle->file_fd = NULL; + handle->callback(url, NULL, NULL, 1, handle->callback_data); + url_free_handle(handle); +} + +void https_redirect(Download *handle) +{ + if (handle->redirects_remaining == 0) + { + https_cancel(handle, "Too many HTTP redirects (%d)", DOWNLOAD_MAX_REDIRECTS); + return; + } + handle->redirects_remaining--; + + download_file_async(handle->redirect_new_location, handle->cachetime, handle->callback, handle->callback_data, + handle->url, handle->redirects_remaining); + /* Don't call the hook, just free this, the new redirect from above will call the hook later */ + url_free_handle(handle); +} + +/** Helper function to parse the HTTP header consisting of multiple 'Key: value' pairs */ +int https_parse_header(char *buffer, int len, char **key, char **value, char **lastloc, int *end_of_request) +{ + static char buf[4096], *nextptr; + char *p; + char *k = NULL, *v = NULL; + int foundlf = 0; + + if (buffer) + { + /* Initialize */ + if (len > sizeof(buf) - 1) + len = sizeof(buf) - 1; + + memcpy(buf, buffer, len); + buf[len] = '\0'; + nextptr = buf; + } + + *end_of_request = 0; + + p = nextptr; + + if (!p) + { + *key = *value = NULL; + return 0; /* done processing data */ + } + + if (!strncmp(p, "\n", 1) || !strncmp(p, "\r\n", 2)) + { + *key = *value = NULL; + *end_of_request = 1; + // new compared to websocket handling: + if (*p == '\n') + *lastloc = p + 1; + else + *lastloc = p + 2; + return 0; + } + + /* Note: p *could* point to the NUL byte ('\0') */ + + /* Special handling for response line itself. */ + if (!strncmp(p, "HTTP/1", 6) && (strlen(p)>=13)) + { + k = "RESPONSE"; + p += 9; + v = p; /* SET VALUE */ + nextptr = NULL; /* set to "we are done" in case next for loop fails */ + for (; *p; p++) + { + if (*p == '\r') + { + *p = '\0'; /* eat silently, but don't consider EOL */ + } + else if (*p == '\n') + { + *p = '\0'; + nextptr = p+1; /* safe, there is data or at least a \0 there */ + break; + } + } + *key = k; + *value = v; + return 1; + } + + /* Header parsing starts here. + * Example line "Host: www.unrealircd.org" + */ + k = p; /* SET KEY */ + + /* First check if the line contains a terminating \n. If not, don't process it + * as it may have been a cut header. + */ + for (; *p; p++) + { + if (*p == '\n') + { + foundlf = 1; + break; + } + } + + if (!foundlf) + { + *key = *value = NULL; + *lastloc = k; + return 0; + } + + p = k; + + for (; *p; p++) + { + if ((*p == '\n') || (*p == '\r')) + { + /* Reached EOL but 'value' not found */ + *p = '\0'; + break; + } + if (*p == ':') + { + *p++ = '\0'; + if (*p++ != ' ') + break; /* missing mandatory space after ':' */ + + v = p; /* SET VALUE */ + nextptr = NULL; /* set to "we are done" in case next for loop fails */ + for (; *p; p++) + { + if (*p == '\r') + { + *p = '\0'; /* eat silently, but don't consider EOL */ + } + else if (*p == '\n') + { + *p = '\0'; + nextptr = p+1; /* safe, there is data or at least a \0 there */ + break; + } + } + /* A key-value pair was succesfully parsed, return it */ + *key = k; + *value = v; + return 1; + } + } + + /* Fatal parse error */ + *key = *value = NULL; + return 0; +} + +/** Check if there is any data at the end of the request */ +char *url_find_end_of_request(char *header, int totalsize, int *remaining_bytes) +{ + char *nextframe1; + char *nextframe2; + char *nextframe = NULL; + + // find first occurance, yeah this is just stupid, but it works. + nextframe1 = strstr(header, "\r\n\r\n"); // = +4 + nextframe2 = strstr(header, "\n\n"); // = +2 + if (nextframe1 && nextframe2) + { + if (nextframe1 < nextframe2) + { + nextframe = nextframe1 + 4; + } else { + nextframe = nextframe2 + 2; + } + } else + if (nextframe1) + { + nextframe = nextframe1 + 4; + } else + if (nextframe2) + { + nextframe = nextframe2 + 2; + } + if (nextframe) + { + *remaining_bytes = totalsize - (nextframe - header); + if (*remaining_bytes > 0) + return nextframe; + } + return NULL; +} + +/* Handle timeouts. */ +EVENT(url_socket_timeout) +{ + Download *d, *d_next; + for (d = downloads; d; d = d_next) + { + d_next = d->next; + if (d->dns_refcnt) + continue; /* can't touch this... */ + if (!d->connected && (TStime() - d->download_started > DOWNLOAD_CONNECT_TIMEOUT)) + { + https_cancel(d, "Connect or DNS timeout after %ld seconds", (long)DOWNLOAD_CONNECT_TIMEOUT); + continue; + } + if (d->connected && (TStime() - d->download_started > DOWNLOAD_TRANSFER_TIMEOUT)) + { + https_cancel(d, "Download timeout after %ld seconds", (long)DOWNLOAD_TRANSFER_TIMEOUT); + continue; + } + } +} + +void url_init(void) +{ + https_ctx = https_new_ctx(); + if (!https_ctx) + { + unreal_log(ULOG_ERROR, "url", "HTTPS_NEW_CTX_FAILED", NULL, + "Unable to initialize SSL context"); + exit(-1); + } + EventAdd(NULL, "url_socket_timeout", url_socket_timeout, NULL, 500, 0); +} diff --git a/src/user.c b/src/user.c index f8bd291..7a34c92 100644 --- a/src/user.c +++ b/src/user.c @@ -59,7 +59,7 @@ MODVAR int non_utf8_nick_chars_in_use = 0; * @param client The client (user) * @param host The new vhost */ -void iNAH_host(Client *client, char *host) +void iNAH_host(Client *client, const char *host) { if (!client->user) return; @@ -80,45 +80,45 @@ void iNAH_host(Client *client, char *host) * @param umode The user mode string * @returns the user mode value (long) */ -long set_usermode(char *umode) +long set_usermode(const char *umode) { - int newumode; - int what; - char *m; - int i; + Umode *um; + int newumode; + int what; + const char *m; newumode = 0; what = MODE_ADD; for (m = umode; *m; m++) + { switch (*m) { - case '+': - what = MODE_ADD; - break; - case '-': - what = MODE_DEL; - break; - case ' ': - case '\n': - case '\r': - case '\t': - break; - default: - for (i = 0; i <= Usermode_highest; i++) - { - if (!Usermode_Table[i].flag) - continue; - if (*m == Usermode_Table[i].flag) - { - if (what == MODE_ADD) - newumode |= Usermode_Table[i].mode; - else - newumode &= ~Usermode_Table[i].mode; - } - } + case '+': + what = MODE_ADD; + break; + case '-': + what = MODE_DEL; + break; + case ' ': + case '\n': + case '\r': + case '\t': + break; + default: + for (um = usermodes; um; um = um->next) + { + if (um->letter == *m) + { + if (what == MODE_ADD) + newumode |= um->mode; + else + newumode &= ~um->mode; + } + } } + } - return (newumode); + return newumode; } /** Convert a target pointer to an 8 bit hash, used for target limiting. */ @@ -177,10 +177,10 @@ int target_limit_exceeded(Client *client, void *target, const char *name) { /* Target limit reached */ client->local->nexttarget += 2; /* punish them some more */ - client->local->since += 2; /* lag them up as well */ + add_fake_lag(client, 2000); /* lag them up as well */ flood_limit_exceeded_log(client, "max-concurrent-conversations"); - sendnumeric(client, ERR_TARGETTOOFAST, name, client->local->nexttarget - TStime()); + sendnumeric(client, ERR_TARGETTOOFAST, name, (long long)(client->local->nexttarget - TStime())); return 1; } @@ -207,9 +207,10 @@ int target_limit_exceeded(Client *client, void *target, const char *name) * @param buffer Input string * @returns The new de-duplicated buffer (temporary storage, only valid until next canonize call) */ -char *canonize(char *buffer) +char *canonize(const char *buffer) { static char cbuf[2048]; + char tbuf[2048]; char *s, *t, *cp = cbuf; int l = 0; char *p = NULL, *p2; @@ -219,11 +220,8 @@ char *canonize(char *buffer) if (!buffer) return NULL; - /* Ohh.. so lazy. But then again, this should never happen with a 2K buffer anyway. */ - if (strlen(buffer) >= sizeof(cbuf)) - buffer[sizeof(cbuf)-1] = '\0'; - - for (s = strtoken(&p, buffer, ","); s; s = strtoken(&p, NULL, ",")) + strlcpy(tbuf, buffer, sizeof(tbuf)); + for (s = strtoken(&p, tbuf, ","); s; s = strtoken(&p, NULL, ",")) { if (l) { @@ -252,99 +250,98 @@ char *canonize(char *buffer) return cbuf; } -/** Get snomasks as a string. - * @param client The client - * @returns string of snomasks (temporary storage) - */ -char *get_snomask_string(Client *client) -{ - int i; - char *m; - - m = buf; - - *m++ = '+'; - for (i = 0; i <= Snomask_highest && (m - buf < BUFSIZE - 4); i++) - if (Snomask_Table[i].flag && client->user->snomask & Snomask_Table[i].mode) - *m++ = Snomask_Table[i].flag; - *m = 0; - return buf; -} - /** Get user modes as a string. * @param client The client * @returns string of user modes (temporary storage) */ -char *get_usermode_string(Client *client) +const char *get_usermode_string(Client *client) { - int i; - char *m; + static char buf[128]; + Umode *um; + + strlcpy(buf, "+", sizeof(buf)); + for (um = usermodes; um; um = um->next) + if (client->umodes & um->mode) + strlcat_letter(buf, um->letter, sizeof(buf)); - m = buf; - *m++ = '+'; - for (i = 0; (i <= Usermode_highest) && (m - buf < BUFSIZE - 4); i++) - if (Usermode_Table[i].flag && (client->umodes & Usermode_Table[i].mode)) - *m++ = Usermode_Table[i].flag; - *m = '\0'; return buf; } +/** Get user modes as a string - buffer is specified. + * @param client The client + * @param buf The buffer to write to + * @param buflen The size of the buffer + * @returns string of user modes (buf) + */ +const char *get_usermode_string_r(Client *client, char *buf, size_t buflen) +{ + Umode *um; + + strlcpy(buf, "+", buflen); + for (um = usermodes; um; um = um->next) + if (client->umodes & um->mode) + strlcat_letter(buf, um->letter, buflen); + + return buf; +} /** Get user modes as a string - this one does not work on 'client' but directly on 'umodes'. * @param umodes The user modes that are set * @returns string of user modes (temporary storage) */ -char *get_usermode_string_raw(long umodes) +const char *get_usermode_string_raw(long umodes) { - int i; - char *m; + static char buf[128]; + Umode *um; + + strlcpy(buf, "+", sizeof(buf)); + for (um = usermodes; um; um = um->next) + if (umodes & um->mode) + strlcat_letter(buf, um->letter, sizeof(buf)); - m = buf; - *m++ = '+'; - for (i = 0; (i <= Usermode_highest) && (m - buf < BUFSIZE - 4); i++) - - if (Usermode_Table[i].flag && (umodes & Usermode_Table[i].mode)) - *m++ = Usermode_Table[i].flag; - *m = '\0'; return buf; } -/** Get snomasks as a string - this one does not work on 'client' but directly on 'sno'. - * @param sno The snomasks that are set - * @returns string of snomasks (temporary storage) +/** Get user modes as a string - this one does not work on 'client' but directly on 'umodes'. + * @param umodes The user modes that are set + * @param buf The buffer to write to + * @param buflen The size of the buffer + * @returns string of user modes (buf) */ -char *get_snomask_string_raw(long sno) +const char *get_usermode_string_raw_r(long umodes, char *buf, size_t buflen) { - int i; - char *m; + Umode *um; - m = buf; + strlcpy(buf, "+", buflen); + for (um = usermodes; um; um = um->next) + if (umodes & um->mode) + strlcat_letter(buf, um->letter, buflen); - *m++ = '+'; - for (i = 0; i <= Snomask_highest && (m - buf < BUFSIZE - 4); i++) - if (Snomask_Table[i].flag && sno & Snomask_Table[i].mode) - *m++ = Snomask_Table[i].flag; - *m = 0; return buf; } + /** Set a new snomask on the user. * The user is not informed of the change by this function. * @param client The client * @param snomask The snomask to add or delete (eg: "+k-c") */ -void set_snomask(Client *client, char *snomask) +void set_snomask(Client *client, const char *snomask) { int what = MODE_ADD; /* keep this an int. -- Syzop */ - char *p; + const char *p; int i; - if (snomask == NULL) { - client->user->snomask = 0; + + if (snomask == NULL) + { + remove_all_snomasks(client); return; } - for (p = snomask; p && *p; p++) { - switch (*p) { + for (p = snomask; p && *p; p++) + { + switch (*p) + { case '+': what = MODE_ADD; break; @@ -352,22 +349,20 @@ void set_snomask(Client *client, char *snomask) what = MODE_DEL; break; default: - for (i = 0; i <= Snomask_highest; i++) - { - if (!Snomask_Table[i].flag) - continue; - if (*p == Snomask_Table[i].flag) - { - if (Snomask_Table[i].allowed && !Snomask_Table[i].allowed(client,what)) + if (what == MODE_ADD) + { + if (!isalpha(*p) || !is_valid_snomask(*p)) continue; - if (what == MODE_ADD) - client->user->snomask |= Snomask_Table[i].mode; - else - client->user->snomask &= ~Snomask_Table[i].mode; - } - } + addlettertodynamicstringsorted(&client->user->snomask, *p); + } else { + delletterfromstring(client->user->snomask, *p); + } + break; } } + /* If the snomask becomes empty ("") then set it to NULL and user mode -s */ + if (client->user->snomask && !*client->user->snomask) + remove_all_snomasks(client); } /** Build the MODE line with (modified) user modes for this user. @@ -375,7 +370,7 @@ void set_snomask(Client *client, char *snomask) */ void build_umode_string(Client *client, long old, long sendmask, char *umode_buf) { - int i; + Umode *um; long flag; char *m; int what = MODE_NULL; @@ -386,33 +381,31 @@ void build_umode_string(Client *client, long old, long sendmask, char *umode_buf */ m = umode_buf; *m = '\0'; - for (i = 0; i <= Usermode_highest; i++) + for (um = usermodes; um; um = um->next) { - if (!Usermode_Table[i].flag) - continue; - flag = Usermode_Table[i].mode; + flag = um->mode; if (MyUser(client) && !(flag & sendmask)) continue; if ((flag & old) && !(client->umodes & flag)) { if (what == MODE_DEL) - *m++ = Usermode_Table[i].flag; + *m++ = um->letter; else { what = MODE_DEL; *m++ = '-'; - *m++ = Usermode_Table[i].flag; + *m++ = um->letter; } } else if (!(flag & old) && (client->umodes & flag)) { if (what == MODE_ADD) - *m++ = Usermode_Table[i].flag; + *m++ = um->letter; else { what = MODE_ADD; *m++ = '+'; - *m++ = Usermode_Table[i].flag; + *m++ = um->letter; } } } @@ -485,7 +478,7 @@ static void maxtarget_add_sorted(MaxTarget *n) } /** Find a maxtarget structure for a cmd (internal) */ -MaxTarget *findmaxtarget(char *cmd) +MaxTarget *findmaxtarget(const char *cmd) { MaxTarget *m; @@ -496,17 +489,14 @@ MaxTarget *findmaxtarget(char *cmd) } /** Set a maximum targets per command restriction */ -void setmaxtargets(char *cmd, int limit) +void setmaxtargets(const char *cmd, int limit) { MaxTarget *m = findmaxtarget(cmd); if (!m) { - char cmdupper[64], *i, *o; - if (strlen(cmd) > 63) - cmd[63] = '\0'; - for (i=cmd,o=cmdupper; *i; i++) - *o++ = toupper(*i); - *o = '\0'; + char cmdupper[64]; + strlcpy(cmdupper, cmd, sizeof(cmdupper)); + strtoupper(cmdupper); m = safe_alloc(sizeof(MaxTarget)); safe_strdup(m->cmd, cmdupper); maxtarget_add_sorted(m); @@ -529,7 +519,7 @@ void freemaxtargets(void) } /** Return the maximum number of targets permitted for a command */ -int max_targets_for_command(char *cmd) +int max_targets_for_command(const char *cmd) { MaxTarget *m = findmaxtarget(cmd); if (m) @@ -626,7 +616,7 @@ int is_handshake_finished(Client *client) int should_show_connect_info(Client *client) { if (SHOWCONNECTINFO && - !client->serv && + !client->server && !IsServersOnlyListener(client->local->listener) && !client->local->listener->websocket_options) { @@ -672,7 +662,7 @@ const char *uid_get(void) } /** Get cloaked host for user */ -char *getcloak(Client *client) +const char *getcloak(Client *client) { if (!*client->user->cloakedhost) { @@ -689,9 +679,11 @@ char *getcloak(Client *client) * @param buf Buffer to store the new cloaked host in * @param buflen Length of the buffer (should be HOSTLEN+1) */ -void make_cloakedhost(Client *client, char *curr, char *buf, size_t buflen) +void make_cloakedhost(Client *client, const char *curr, char *buf, size_t buflen) { - char host[256], *mask, *p, *q; + const char *p; + char host[256], *q; + const char *mask; /* Convert host to lowercase and cut off at 255 bytes just to be sure */ for (p = curr, q = host; *p && (q < host+sizeof(host)-1); p++, q++) @@ -700,9 +692,9 @@ void make_cloakedhost(Client *client, char *curr, char *buf, size_t buflen) /* Call the cloaking layer */ if (RCallbacks[CALLBACKTYPE_CLOAK_EX] != NULL) - mask = RCallbacks[CALLBACKTYPE_CLOAK_EX]->func.pcharfunc(client, host); + mask = RCallbacks[CALLBACKTYPE_CLOAK_EX]->func.stringfunc(client, host); else if (RCallbacks[CALLBACKTYPE_CLOAK] != NULL) - mask = RCallbacks[CALLBACKTYPE_CLOAK]->func.pcharfunc(host); + mask = RCallbacks[CALLBACKTYPE_CLOAK]->func.stringfunc(host); else mask = curr; @@ -718,7 +710,7 @@ void user_account_login(MessageTag *recv_mtags, Client *client) if (find_tkline_match(client, 0) && IsDead(client)) return; } - RunHook2(HOOKTYPE_ACCOUNT_LOGIN, client, recv_mtags); + RunHook(HOOKTYPE_ACCOUNT_LOGIN, client, recv_mtags); } /** Should we hide the idle time of 'target' to user 'client'? @@ -751,11 +743,13 @@ int hide_idle_time(Client *client, Client *target) * @param name The name of the group * @returns 1 if name is valid, 0 if not (eg: illegal characters) */ -int security_group_valid_name(char *name) +int security_group_valid_name(const char *name) { - char *p; + const char *p; + if (strlen(name) > SECURITYGROUPLEN) return 0; /* Too long */ + for (p = name; *p; p++) { if (!isalnum(*p) && !strchr("_-", *p)) @@ -768,7 +762,7 @@ int security_group_valid_name(char *name) * @param name The name of the security group * @returns A SecurityGroup struct, or NULL if not found. */ -SecurityGroup *find_security_group(char *name) +SecurityGroup *find_security_group(const char *name) { SecurityGroup *s; for (s = securitygroups; s; s = s->next) @@ -782,7 +776,7 @@ SecurityGroup *find_security_group(char *name) * @param name The name of the security group * @returns 1 if it exists, 0 if not */ -int security_group_exists(char *name) +int security_group_exists(const char *name) { if (!strcmp(name, "unknown-users") || find_security_group(name)) return 1; @@ -793,7 +787,7 @@ int security_group_exists(char *name) * @param name The name of the security group * @returns A SecurityGroup struct (already added to the 'securitygroups' linked list) */ -SecurityGroup *add_security_group(char *name, int priority) +SecurityGroup *add_security_group(const char *name, int priority) { SecurityGroup *s = find_security_group(name); @@ -812,9 +806,7 @@ SecurityGroup *add_security_group(char *name, int priority) /** Free a SecurityGroup struct */ void free_security_group(SecurityGroup *s) { - /* atm there is nothing else to free, - * but who knows this may change in the future - */ + unreal_delete_masks(s->include_mask); safe_free(s); } @@ -866,7 +858,9 @@ int user_allowed_by_security_group(Client *client, SecurityGroup *s) return 1; if (s->reputation_score && (GetReputation(client) >= s->reputation_score)) return 1; - if (s->tls && (IsSecureConnect(client) || IsSecure(client))) + if (s->tls && (IsSecureConnect(client) || (MyConnect(client) && IsSecure(client)))) + return 1; + if (s->include_mask && unreal_mask_match(client, s->include_mask)) return 1; return 0; } @@ -876,7 +870,7 @@ int user_allowed_by_security_group(Client *client, SecurityGroup *s) * @param secgroupname The name of the security-group to check against * @retval 1 if user is allowed by security-group, 0 if not. */ -int user_allowed_by_security_group_name(Client *client, char *secgroupname) +int user_allowed_by_security_group_name(Client *client, const char *secgroupname) { SecurityGroup *s; @@ -897,33 +891,81 @@ int user_allowed_by_security_group_name(Client *client, char *secgroupname) return user_allowed_by_security_group(client, s); } +/** Get comma separated list of matching security groups for 'client'. + * This is usually only used for displaying purposes. + * @returns string like "unknown-users,tls-users" from a static buffer. + */ +const char *get_security_groups(Client *client) +{ + SecurityGroup *s; + static char buf[512]; + + *buf = '\0'; + + /* We put known-users or unknown-users at the beginning. + * The latter is special and doesn't actually exist + * in the linked list, hence the special code here, + * and again later in the for loop to skip it. + */ + if (user_allowed_by_security_group_name(client, "known-users")) + strlcat(buf, "known-users,", sizeof(buf)); + else + strlcat(buf, "unknown-users,", sizeof(buf)); + + for (s = securitygroups; s; s = s->next) + { + if (strcmp(s->name, "known-users") && + user_allowed_by_security_group(client, s)) + { + strlcat(buf, s->name, sizeof(buf)); + strlcat(buf, ",", sizeof(buf)); + } + } + + if (*buf) + buf[strlen(buf)-1] = '\0'; + return buf; +} + /** Return extended information about user for the "Client connecting" line. * @returns A string such as "[secure] [reputation: 5]", never returns NULL. */ -char *get_connect_extinfo(Client *client) +const char *get_connect_extinfo(Client *client) { static char retbuf[512]; char tmp[512]; + const char *s; + const char *secgroups; NameValuePrioList *list = NULL, *e; /* From modules... */ - RunHook2(HOOKTYPE_CONNECT_EXTINFO, client, &list); + RunHook(HOOKTYPE_CONNECT_EXTINFO, client, &list); /* And some built-in: */ - /* "class": this should be first */ + /* "vhost": this should be first */ + if (IsHidden(client)) + add_nvplist(&list, -1000000, "vhost", client->user->virthost); + + /* "class": second */ if (MyUser(client) && client->local->class) add_nvplist(&list, -100000, "class", client->local->class->name); - /* "secure": SSL/TLS */ - if (MyUser(client) && IsSecure(client)) - add_nvplist(&list, -1000, "secure", tls_get_cipher(client->local->ssl)); - else if (!MyUser(client) && IsSecureConnect(client)) - add_nvplist(&list, -1000, "secure", NULL); + /* "secure": TLS */ + s = tls_get_cipher(client); + if (s) + add_nvplist(&list, -1000, "secure", s); + else if (IsSecure(client) || IsSecureConnect(client)) + add_nvplist(&list, -1000, "secure", NULL); /* old server or otherwise no details (eg: fake secure) */ /* services account? */ if (IsLoggedIn(client)) - add_nvplist(&list, -500, "account", client->user->svid); + add_nvplist(&list, -500, "account", client->user->account); + + /* security groups */ + secgroups = get_security_groups(client); + if (secgroups) + add_nvplist(&list, 100, "security-groups", secgroups); *retbuf = '\0'; for (e = list; e; e = e->next) @@ -949,18 +991,13 @@ char *get_connect_extinfo(Client *client) * @param client The client to check flood for (local user) * @param opt The flood option (eg FLD_AWAY) */ -void flood_limit_exceeded_log(Client *client, char *floodname) +void flood_limit_exceeded_log(Client *client, const char *floodname) { char buf[1024]; - snprintf(buf, sizeof(buf), "Flood blocked (%s) from %s!%s@%s [%s]", - floodname, - client->name, - client->user->username, - client->user->realhost, - GetIP(client)); - ircd_log(LOG_FLOOD, "%s", buf); - sendto_snomask_global(SNO_FLOOD, "%s", buf); + unreal_log(ULOG_INFO, "flood", "FLOOD_BLOCKED", client, + "Flood blocked ($flood_type) from $client.details [$client.ip]", + log_data_string("flood_type", floodname)); } /** Is the flood limit exceeded for an option? eg for away-flood. @@ -980,9 +1017,6 @@ int flood_limit_exceeded(Client *client, FloodOption opt) if (f->limit[opt] <= 0) return 0; /* No limit set or unlimited */ - ircd_log(LOG_ERROR, "Checking flood_limit_exceeded() for '%s', type %d with max %d:%ld...", - client->name, (int)opt, (int)f->limit[opt], (long)f->period[opt]); - /* Ok, let's do the flood check */ if ((client->local->flood[opt].t + f->period[opt]) <= timeofday) { @@ -1041,12 +1075,76 @@ FloodSettings *get_floodsettings_for_user(Client *client, FloodOption opt) return f; } -MODVAR char *floodoption_names[] = { +MODVAR const char *floodoption_names[] = { "nick-flood", "join-flood", "away-flood", "invite-flood", "knock-flood", "max-concurrent-conversations", + "lag-penalty", NULL }; + +/** Lookup GEO information for an IP address. + * @param ip The IP to lookup + * @returns A struct containing all the details. Must be freed by caller! + */ +GeoIPResult *geoip_lookup(const char *ip) +{ + if (!RCallbacks[CALLBACKTYPE_GEOIP_LOOKUP]) + return NULL; + return RCallbacks[CALLBACKTYPE_GEOIP_LOOKUP]->func.pvoidfunc(ip); +} + +void free_geoip_result(GeoIPResult *r) +{ + if (!r) + return; + safe_free(r->country_code); + safe_free(r->country_name); + safe_free(r); +} + +/** Grab geoip information for client */ +GeoIPResult *geoip_client(Client *client) +{ + ModData *m = moddata_client_get_raw(client, "geoip"); + if (!m) + return NULL; + return m->ptr; /* can still be NULL */ +} + +/** Get the oper block that was used to become OPER. + * @param client The client to fetch the info for + * @returns the oper block name (eg: "OpEr") or NULL. + */ +const char *get_operlogin(Client *client) +{ + if (client->user->operlogin) + return client->user->operlogin; + return moddata_client_get(client, "operlogin"); +} + +/** Get the operclass of the IRCOp. + * @param client The client to fetch the info for + * @returns the operclass name or NULL + */ +const char *get_operclass(Client *client) +{ + const char *operlogin = NULL; + + if (MyUser(client) && client->user->operlogin) + { + ConfigItem_oper *oper; + operlogin = client->user->operlogin; + oper = find_oper(operlogin); + if (oper && oper->operclass) + return oper->operclass; + } + + /* Remote user or locally no longer available + * (eg oper block removed but user is still oper) + */ + return moddata_client_get(client, "operclass"); +} diff --git a/src/utf8.c b/src/utf8.c index 701479b..fb9fa56 100644 --- a/src/utf8.c +++ b/src/utf8.c @@ -140,38 +140,51 @@ char *unrl_utf8_find_prev_char (const char *begin, const char *p) } /** Return a valid UTF8 string based on the input. - * @param str The input string, with a maximum of 1024 bytes. - * @retval Returns a valid UTF8 string (which may be sanitized - * or simply the original string if it was OK already) + * @param str The input string + * @param outputbuf The output buffer + * @param outputbuflen Length of the output buffer + * @param strictlen If set to 1 we never return more than + * outputbuflen-1 characters. + * If set to 0, we may do that, if the + * input string was already 100% valid UTF8. + * @retval Returns a valid UTF8 string, either the input buffer + * (if it was already valid UTF8) or the output buffer. + * NULL is returned if either 'str' was NULL or outputlen is zero. + * @notes The 'outputbuf' is unused if the string is already valid UTF8. + * So don't rely on it being always set, use the returned string. */ -char *unrl_utf8_make_valid(const char *str) +char *unrl_utf8_make_valid(const char *str, char *outputbuf, size_t outputbuflen, int strictlen) { - static char string[4096]; /* crazy, but lazy, max amplification is x3, so x4 is safe. */ const char *remainder, *invalid; int remaining_bytes, valid_bytes, len; int replaced = 0; /**< UTF8 string needed replacement (was invalid) */ - if (!str) + if (!str || !outputbuflen) return NULL; len = strlen(str); - if (len >= 1024) - abort(); /* better safe than sorry */ - - *string = '\0'; + *outputbuf = '\0'; remainder = str; remaining_bytes = len; while (remaining_bytes != 0) { if (unrl_utf8_validate(remainder, &invalid)) + { + if (!replaced && strictlen) + { + /* Caller wants us to go through the 'replaced' branch */ + strlcpy(outputbuf, str, outputbuflen); + replaced = 1; + } break; + } replaced = 1; valid_bytes = invalid - remainder; - strlncat(string, remainder, sizeof(string), valid_bytes); /*g_string_append_len(string, remainder, valid_bytes);*/ - strlcat(string, "\357\277\275", sizeof(string)); + strlncat(outputbuf, remainder, outputbuflen, valid_bytes); /*g_string_append_len(string, remainder, valid_bytes);*/ + strlcat(outputbuf, "\357\277\275", outputbuflen); remaining_bytes -= valid_bytes + 1; remainder = invalid + 1; @@ -180,21 +193,25 @@ char *unrl_utf8_make_valid(const char *str) if (!replaced) return (char *)str; /* return original string (no changes needed) */ - /* If output size is too much for an IRC message then cut the string at - * the appropriate place (as in: not to cause invalid UTF8 due to - * cutting half-way a byte sequence). + /* If we took up all the space, then backtrack one character and cut + * things off from there. This to ensure that we don't end up with + * invalid UTF8 due to cutting half-way a UTF8 byte sequence. + * NOTE: This may cause us to remove 1 character needlessly at the + * end even though there was still (some) space. So be it. */ - if (strlen(string) >= 510) + if (strlen(outputbuf) == outputbuflen-1) { - char *cut_at = unrl_utf8_find_prev_char(string, string+509); + char *cut_at = unrl_utf8_find_prev_char(outputbuf, outputbuf+outputbuflen-1); if (cut_at) *cut_at = '\0'; } - if (!unrl_utf8_validate(string, NULL)) +#ifdef DEBUGMODE + if (!unrl_utf8_validate(outputbuf, NULL)) abort(); /* this should never happen, it means our conversion resulted in an invalid UTF8 string */ +#endif - return string; + return outputbuf; } /**************** END OF UTF8 HELPER FUNCTIONS *****************/ @@ -206,12 +223,14 @@ void utf8_test(void) char *res; int cnt = 0; char *heapbuf; /* for strict OOB testing with ASan */ + char *workbuf = safe_alloc(500); + size_t workbuflen = 500; while ((fgets(buf, sizeof(buf), stdin))) { stripcrlf(buf); heapbuf = strdup(buf); - res = unrl_utf8_make_valid(heapbuf); + res = unrl_utf8_make_valid(heapbuf, workbuf, workbuflen, 1); if (heapbuf == res) { printf(" %s\n", res); @@ -220,4 +239,5 @@ void utf8_test(void) } free(heapbuf); } + safe_free(workbuf); } diff --git a/src/version.c.SH b/src/version.c.SH index f499120..38a0439 100644 --- a/src/version.c.SH +++ b/src/version.c.SH @@ -4,7 +4,10 @@ echo "Extracting src/version.c..." #id=`grep '$Id: Changes,v' ../Changes` #id=`echo $id |sed 's/.* Changes\,v \(.*\) .* Exp .*/\1/'` -id="5.2.0.1" +if [ -d ../.git ]; then + SUFFIX="-$(git rev-parse --short HEAD)" +fi +id="6.0.1.1$SUFFIX" echo "$id" if test -r version.c @@ -19,7 +22,9 @@ generation=`expr $generation + 1` export LANG=C export LC_TIME=C export LC_ALL=C -creation=`date | \ +SOURCE_DATE_EPOCH="${SOURCE_DATE_EPOCH:-$(date +%s)}" +BUILD_DATE=$(date -u -d "@$SOURCE_DATE_EPOCH" 2>/dev/null || date -u -r "$SOURCE_DATE_EPOCH" 2>/dev/null || date -u) +creation=`echo "$BUILD_DATE" | \ awk '{if (NF == 6) \ { print $1 " " $2 " " $3 " " $6 " at " $4 " " $5 } \ else \ @@ -143,7 +148,8 @@ char *unrealcredits[] = "officially joining the staff.", " ", "===========================[ Coders ]=============================", - "Syzop - Head Coder / Project leader", + "Bram Matthys (Syzop) - Head Coder / Project leader", + "Krzysztof Beresztant (k4be) - Coder", "Gottem - Coder", "i - Coder", " ", diff --git a/src/whowas.c b/src/whowas.c index d9f9ed0..6a4c6f7 100644 --- a/src/whowas.c +++ b/src/whowas.c @@ -24,19 +24,19 @@ // Some users may not want to load cmd_whowas at all. /* internally defined function */ -static void add_whowas_to_clist(aWhowas **, aWhowas *); -static void del_whowas_from_clist(aWhowas **, aWhowas *); -static void add_whowas_to_list(aWhowas **, aWhowas *); -static void del_whowas_from_list(aWhowas **, aWhowas *); +static void add_whowas_to_clist(WhoWas **, WhoWas *); +static void del_whowas_from_clist(WhoWas **, WhoWas *); +static void add_whowas_to_list(WhoWas **, WhoWas *); +static void del_whowas_from_list(WhoWas **, WhoWas *); -aWhowas MODVAR WHOWAS[NICKNAMEHISTORYLENGTH]; -aWhowas MODVAR *WHOWASHASH[WHOWAS_HASH_TABLE_SIZE]; +WhoWas MODVAR WHOWAS[NICKNAMEHISTORYLENGTH]; +WhoWas MODVAR *WHOWASHASH[WHOWAS_HASH_TABLE_SIZE]; MODVAR int whowas_next = 0; void add_history(Client *client, int online) { - aWhowas *new; + WhoWas *new; new = &WHOWAS[whowas_next]; @@ -87,7 +87,7 @@ void add_history(Client *client, int online) void off_history(Client *client) { - aWhowas *temp, *next; + WhoWas *temp, *next; for (temp = client->user->whowas; temp; temp = next) { @@ -97,9 +97,9 @@ void off_history(Client *client) } } -Client *get_history(char *nick, time_t timelimit) +Client *get_history(const char *nick, time_t timelimit) { - aWhowas *temp; + WhoWas *temp; int blah; timelimit = TStime() - timelimit; @@ -118,7 +118,7 @@ Client *get_history(char *nick, time_t timelimit) void count_whowas_memory(int *wwu, u_long *wwum) { - aWhowas *tmp; + WhoWas *tmp; int i; int u = 0; u_long um = 0; @@ -129,7 +129,7 @@ void count_whowas_memory(int *wwu, u_long *wwum) if (tmp->hashv != -1) { u++; - um += sizeof(aWhowas); + um += sizeof(WhoWas); } *wwu = u; *wwum = um; @@ -142,14 +142,14 @@ void initwhowas() for (i = 0; i < NICKNAMEHISTORYLENGTH; i++) { - memset(&WHOWAS[i], 0, sizeof(aWhowas)); + memset(&WHOWAS[i], 0, sizeof(WhoWas)); WHOWAS[i].hashv = -1; } for (i = 0; i < WHOWAS_HASH_TABLE_SIZE; i++) WHOWASHASH[i] = NULL; } -static void add_whowas_to_clist(aWhowas ** bucket, aWhowas * whowas) +static void add_whowas_to_clist(WhoWas ** bucket, WhoWas * whowas) { whowas->cprev = NULL; if ((whowas->cnext = *bucket) != NULL) @@ -157,7 +157,7 @@ static void add_whowas_to_clist(aWhowas ** bucket, aWhowas * whowas) *bucket = whowas; } -static void del_whowas_from_clist(aWhowas ** bucket, aWhowas * whowas) +static void del_whowas_from_clist(WhoWas ** bucket, WhoWas * whowas) { if (whowas->cprev) whowas->cprev->cnext = whowas->cnext; @@ -167,7 +167,7 @@ static void del_whowas_from_clist(aWhowas ** bucket, aWhowas * whowas) whowas->cnext->cprev = whowas->cprev; } -static void add_whowas_to_list(aWhowas ** bucket, aWhowas * whowas) +static void add_whowas_to_list(WhoWas ** bucket, WhoWas * whowas) { whowas->prev = NULL; if ((whowas->next = *bucket) != NULL) @@ -175,7 +175,7 @@ static void add_whowas_to_list(aWhowas ** bucket, aWhowas * whowas) *bucket = whowas; } -static void del_whowas_from_list(aWhowas ** bucket, aWhowas * whowas) +static void del_whowas_from_list(WhoWas ** bucket, WhoWas * whowas) { if (whowas->prev) whowas->prev->next = whowas->next; diff --git a/src/windows/UnrealIRCd.exe.manifest b/src/windows/UnrealIRCd.exe.manifest index d6fb05d..d45baa8 100644 --- a/src/windows/UnrealIRCd.exe.manifest +++ b/src/windows/UnrealIRCd.exe.manifest @@ -2,8 +2,8 @@ Internet Relay Chat Daemon @@ -12,7 +12,7 @@ next) - { - if (inc->flag.type & INCLUDE_NOTLOADED) - continue; -#ifdef USE_LIBCURL - if (inc->flag.type & INCLUDE_REMOTE) - AppendMenu(hConfig, MF_STRING, i++, inc->url); - else #endif - AppendMenu(hConfig, MF_STRING, i++, inc->file); - } - AppendMenu(hConfig, MF_SEPARATOR, 0, NULL); - } if (conf_files) { AppendMenu(hConfig, MF_STRING, IDM_MOTD, conf_files->motd_file); @@ -458,6 +448,7 @@ LRESULT CALLBACK MainDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) hLogs = CreatePopupMenu(); AppendMenu(hConfig, MF_STRING, IDM_CONF, CPATH); +#if 0 if (conf_log) { ConfigItem_log *logs; @@ -468,22 +459,7 @@ LRESULT CALLBACK MainDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) } } AppendMenu(hConfig, MF_SEPARATOR, 0, NULL); - - if (conf_include) - { - ConfigItem_include *inc; - for (inc = conf_include; inc; inc = inc->next) - { -#ifdef USE_LIBCURL - if (inc->flag.type & INCLUDE_REMOTE) - AppendMenu(hConfig, MF_STRING, i++, inc->url); - else #endif - AppendMenu(hConfig, MF_STRING, i++, inc->file); - } - AppendMenu(hConfig, MF_SEPARATOR, 0, NULL); - } - if (conf_files) { AppendMenu(hConfig, MF_STRING, IDM_MOTD, conf_files->motd_file); @@ -520,7 +496,16 @@ LRESULT CALLBACK MainDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) return 0; } else if ((p.x >= 336) && (p.x <= 411) && (p.y >= TOOLBAR_START) && (p.y <= TOOLBAR_STOP)) - return CloseUnreal(hDlg); + return AskCloseUnreal(hDlg); + } + case WM_SYSCOMMAND: + { + if (wParam == SC_CLOSE) + { + AskCloseUnreal(hDlg); + return 1; + } + break; } case WM_COMMAND: { @@ -533,20 +518,13 @@ LRESULT CALLBACK MainDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) else { GetMenuString(hConfig,LOWORD(wParam), path, MAX_PATH, MF_BYCOMMAND); -#ifdef USE_LIBCURL - if (url_is_valid(path)) - { - char *file = find_loaded_remote_include(path); - DialogBoxParam(hInst, "FromVar", hDlg, (DLGPROC)FromFileReadDLG, (LPARAM)file); - } - else -#endif + if (!url_is_valid(path)) DialogBoxParam(hInst, "FromFile", hDlg, (DLGPROC)FromFileDLG, (LPARAM)path); } return FALSE; } - if (!loop.ircd_booted) + if (!loop.booted) { MessageBox(NULL, "UnrealIRCd not booted due to configuration errors. " "Check other window for error details. Then close that window, " @@ -561,34 +539,28 @@ LRESULT CALLBACK MainDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) ShowDialog(&hStatusWnd, hInst, "Status", hDlg,StatusDLG); break; case IDM_SHUTDOWN: - return CloseUnreal(hDlg); + return AskCloseUnreal(hDlg); case IDM_RHALL: MessageBox(NULL, "Rehashing all files", "Rehashing", MB_OK); - sendto_realops("Rehashing all files via the console"); - rehash(&me,0); - reread_motdsandrules(); + request_rehash(NULL); break; case IDM_RHCONF: MessageBox(NULL, "Rehashing the Config file", "Rehashing", MB_OK); - sendto_realops("Rehashing the Config file via the console"); - rehash(&me,0); + request_rehash(NULL); break; case IDM_RHMOTD: { MessageBox(NULL, "Rehashing all MOTD and Rules files", "Rehashing", MB_OK); rehash_motdrules(); - sendto_realops("Rehashing all MOTD and Rules files via the console"); break; } case IDM_RHOMOTD: MessageBox(NULL, "Rehashing the OperMOTD", "Rehashing", MB_OK); read_motd(conf_files->opermotd_file, &opermotd); - sendto_realops("Rehashing the OperMOTD via the console"); break; case IDM_RHBMOTD: MessageBox(NULL, "Rehashing the BotMOTD", "Rehashing", MB_OK); read_motd(conf_files->botmotd_file, &botmotd); - sendto_realops("Rehashing the BotMOTD via the console"); break; case IDM_LICENSE: DialogBox(hInst, "FromVar", hDlg, (DLGPROC)LicenseDLG); @@ -1016,7 +988,7 @@ void win_map(Client *server, HWND hwTreeView, short remap) for (lp = Servers; lp; lp = lp->next) { acptr = lp->value.client; - if (acptr->srvptr != server) + if (acptr->uplink != server) continue; win_map(acptr, hwTreeView, 0); } @@ -1076,27 +1048,6 @@ void win_error() { if (errors && !IsService) DialogBox(hInst, "ConfigError", hwIRCDWnd, (DLGPROC)ConfigErrorDLG); - if (need_34_upgrade) - { - need_34_upgrade = 0; /* anti-recursion. yes, is needed. */ - if (MessageBox(NULL, - "Shall I try to upgrade your configuration files to UnrealIRCd 4 format?", - "3.2.x configuration detected", - MB_YESNO|MB_ICONQUESTION) == IDNO) - { - return; - } - else - { - update_conf(); - MessageBox(NULL, - "Configuration file(s) upgraded! In next screen you can see what I did (just for reference). " - "After that, simply try to start UnrealIRCd again and see if it loads.", - "Configuration upgrade", - MB_OK); - DialogBox(hInst, "ConfigError", hwIRCDWnd, (DLGPROC)ConfigErrorDLG); - } - } } LRESULT CALLBACK ConfigErrorDLG(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) diff --git a/src/windows/service.c b/src/windows/service.c index dc76411..7db873d 100644 --- a/src/windows/service.c +++ b/src/windows/service.c @@ -77,8 +77,7 @@ VOID WINAPI IRCDCtrlHandler(DWORD opcode) /* Rehash */ else if (opcode == IRCD_SERVICE_CONTROL_REHASH) { - rehash(&me,0); - reread_motdsandrules(); + request_rehash(NULL); } SetServiceStatus(IRCDStatusHandle, &IRCDStatus); @@ -112,7 +111,7 @@ VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv) chdir(path); /* Go one level up, since we are currently in the bin\ subdir - * and we want to be in (f.e.) "C:\Program Files\UnrealIRCd 5" + * and we want to be in (f.e.) "C:\Program Files\UnrealIRCd 6" */ chdir(".."); diff --git a/src/windows/unrealinst.iss b/src/windows/unrealinst.iss old mode 100644 new mode 100755 index c071af5..c7800b5 --- a/src/windows/unrealinst.iss +++ b/src/windows/unrealinst.iss @@ -5,15 +5,15 @@ #define USE_CURL [Setup] -AppName=UnrealIRCd 5 -AppVerName=UnrealIRCd 5.2.0.1 +AppName=UnrealIRCd 6 +AppVerName=UnrealIRCd 6.0.1.1 AppPublisher=UnrealIRCd Team AppPublisherURL=https://www.unrealircd.org AppSupportURL=https://www.unrealircd.org AppUpdatesURL=https://www.unrealircd.org AppMutex=UnrealMutex,Global\UnrealMutex -DefaultDirName={pf}\UnrealIRCd 5 -DefaultGroupName=UnrealIRCd 5 +DefaultDirName={pf}\UnrealIRCd 6 +DefaultGroupName=UnrealIRCd 6 AllowNoIcons=yes LicenseFile=src\windows\gplplusssl.rtf Compression=lzma @@ -26,8 +26,11 @@ UninstallFilesDir={app}\bin\uninstaller DisableWelcomePage=no ArchitecturesInstallIn64BitMode=x64 ArchitecturesAllowed=x64 +;These are set only on release: +;SignedUninstaller=yes +;SignTool=signtool -; !!! Make sure to update SSL/TLS validation (WizardForm.TasksList.Checked[9]) if tasks are added/removed !!! +; !!! Make sure to update TLS validation (WizardForm.TasksList.Checked[9]) if tasks are added/removed !!! [Tasks] Name: "desktopicon"; Description: "Create a &desktop icon"; GroupDescription: "Additional icons:" Name: "quicklaunchicon"; Description: "Create a &Quick Launch icon"; GroupDescription: "Additional icons:"; Flags: unchecked @@ -35,13 +38,42 @@ Name: "installservice"; Description: "Install as a &service (not for beginners)" Name: "installservice/startboot"; Description: "S&tart UnrealIRCd when Windows starts"; GroupDescription: "Service support:"; MinVersion: 0,4.0; Flags: exclusive unchecked Name: "installservice/startdemand"; Description: "Start UnrealIRCd on &request"; GroupDescription: "Service support:"; MinVersion: 0,4.0; Flags: exclusive unchecked Name: "installservice/crashrestart"; Description: "Restart UnrealIRCd if it &crashes"; GroupDescription: "Service support:"; Flags: unchecked; MinVersion: 0,5.0; -Name: "makecert"; Description: "&Create certificate"; GroupDescription: "SSL/TLS options:"; +Name: "makecert"; Description: "&Create certificate"; GroupDescription: "TLS options:"; Name: "fixperm"; Description: "Make UnrealIRCd folder writable by current user"; [Files] -Source: "UnrealIRCd.exe"; DestDir: "{app}\bin"; Flags: ignoreversion +; UnrealIRCd binaries +Source: "UnrealIRCd.exe"; DestDir: "{app}\bin"; Flags: ignoreversion signonce Source: "UnrealIRCd.pdb"; DestDir: "{app}\bin"; Flags: ignoreversion +Source: "unrealsvc.exe"; DestDir: "{app}\bin"; Flags: ignoreversion signonce +; TLS certificate generation helpers +Source: "src\windows\makecert.bat"; DestDir: "{app}\bin"; Flags: ignoreversion +Source: "extras\tls.cnf"; DestDir: "{app}\bin"; Flags: ignoreversion + +; UnrealIRCd modules +Source: "src\modules\*.dll"; DestDir: "{app}\modules"; Flags: ignoreversion signonce +Source: "src\modules\chanmodes\*.dll"; DestDir: "{app}\modules\chanmodes"; Flags: ignoreversion signonce +Source: "src\modules\usermodes\*.dll"; DestDir: "{app}\modules\usermodes"; Flags: ignoreversion signonce +Source: "src\modules\extbans\*.dll"; DestDir: "{app}\modules\extbans"; Flags: ignoreversion signonce +Source: "src\modules\third\*.dll"; DestDir: "{app}\modules\third"; Flags: ignoreversion skipifsourcedoesntexist signonce + +; Libraries +Source: "c:\dev\unrealircd-6-libs\pcre2\bin\pcre*.dll"; DestDir: "{app}\bin"; Flags: ignoreversion signonce +Source: "c:\dev\unrealircd-6-libs\argon2\vs2015\build\*.dll"; DestDir: "{app}\bin"; Flags: ignoreversion signonce +Source: "c:\dev\unrealircd-6-libs\libsodium\bin\x64\Release\v142\dynamic\*.dll"; DestDir: "{app}\bin"; Flags: ignoreversion signonce +Source: "c:\dev\unrealircd-6-libs\jansson\bin\*.dll"; DestDir: "{app}\bin"; Flags: ignoreversion signonce +Source: "c:\dev\unrealircd-6-libs\c-ares\msvc\cares\dll-release\cares.dll"; DestDir: "{app}\bin"; Flags: ignoreversion signonce +Source: "c:\dev\unrealircd-6-libs\libressl\bin\openssl.exe"; DestDir: "{app}\bin"; Flags: ignoreversion signonce +Source: "c:\dev\unrealircd-6-libs\libressl\bin\*.dll"; DestDir: "{app}\bin"; Flags: ignoreversion signonce +Source: "c:\dev\unrealircd-6-libs\GeoIP\libGeoIP\*.dll"; DestDir: "{app}\bin"; Flags: ignoreversion signonce +Source: "c:\dev\unrealircd-6-libs\setacl.exe"; DestDir: "{app}\tmp"; Flags: ignoreversion signonce +#ifdef USE_CURL +Source: "c:\dev\unrealircd-6-libs\curl\builds\libcurl-vc-x64-release-dll-ssl-dll-cares-dll-ipv6-obj-lib\libcurl.dll"; DestDir: "{app}\bin"; Flags: ignoreversion signonce +#endif +Source: "doc\conf\tls\curl-ca-bundle.crt"; DestDir: "{app}\conf\tls"; Flags: ignoreversion + +; Config files Source: "doc\conf\*.default.conf"; DestDir: "{app}\conf"; Flags: ignoreversion Source: "doc\conf\*.optional.conf"; DestDir: "{app}\conf"; Flags: ignoreversion Source: "doc\conf\spamfilter.conf"; DestDir: "{app}\conf"; Flags: onlyifdoesntexist @@ -50,38 +82,13 @@ Source: "doc\conf\dccallow.conf"; DestDir: "{app}\conf"; Flags: onlyifdoesntexis Source: "doc\conf\aliases\*.conf"; DestDir: "{app}\conf\aliases"; Flags: ignoreversion Source: "doc\conf\help\*.conf"; DestDir: "{app}\conf\help"; Flags: ignoreversion Source: "doc\conf\examples\*.conf"; DestDir: "{app}\conf\examples"; Flags: ignoreversion - -Source: "doc\Donation"; DestDir: "{app}\doc"; DestName: "Donation.txt"; Flags: ignoreversion -Source: "LICENSE"; DestDir: "{app}\doc"; DestName: "LICENSE.txt"; Flags: ignoreversion - -Source: "doc\*.*"; DestDir: "{app}\doc"; Flags: ignoreversion -Source: "doc\technical\*.*"; DestDir: "{app}\doc\technical"; Flags: ignoreversion Source: "doc\conf\aliases\*"; DestDir: "{app}\conf\aliases"; Flags: ignoreversion -Source: "unrealsvc.exe"; DestDir: "{app}\bin"; Flags: ignoreversion; MinVersion: 0,4.0 - -Source: "src\windows\makecert.bat"; DestDir: "{app}\bin"; Flags: ignoreversion -Source: "extras\tls.cnf"; DestDir: "{app}\bin"; Flags: ignoreversion - -Source: "src\modules\*.dll"; DestDir: "{app}\modules"; Flags: ignoreversion -Source: "src\modules\chanmodes\*.dll"; DestDir: "{app}\modules\chanmodes"; Flags: ignoreversion -Source: "src\modules\usermodes\*.dll"; DestDir: "{app}\modules\usermodes"; Flags: ignoreversion -Source: "src\modules\snomasks\*.dll"; DestDir: "{app}\modules\snomasks"; Flags: ignoreversion -Source: "src\modules\extbans\*.dll"; DestDir: "{app}\modules\extbans"; Flags: ignoreversion -Source: "src\modules\third\*.dll"; DestDir: "{app}\modules\third"; Flags: ignoreversion skipifsourcedoesntexist - -Source: "c:\dev\unrealircd-5-libs\pcre2\bin\pcre*.dll"; DestDir: "{app}\bin"; Flags: ignoreversion -Source: "c:\dev\unrealircd-5-libs\argon2\vs2015\build\*.dll"; DestDir: "{app}\bin"; Flags: ignoreversion -Source: "c:\dev\unrealircd-5-libs\libsodium\bin\x64\Release\v142\dynamic\*.dll"; DestDir: "{app}\bin"; Flags: ignoreversion -Source: "c:\dev\unrealircd-5-libs\c-ares\msvc\cares\dll-release\cares.dll"; DestDir: "{app}\bin"; Flags: ignoreversion -Source: "c:\dev\unrealircd-5-libs\libressl\bin\openssl.exe"; DestDir: "{app}\bin"; Flags: ignoreversion -Source: "c:\dev\unrealircd-5-libs\libressl\bin\*.dll"; DestDir: "{app}\bin"; Flags: ignoreversion -Source: "c:\dev\unrealircd-5-libs\setacl.exe"; DestDir: "{app}\tmp"; Flags: ignoreversion - -#ifdef USE_CURL -Source: "c:\dev\unrealircd-5-libs\curl\builds\libcurl-vc-x64-release-dll-ssl-dll-cares-dll-ipv6-obj-lib\libcurl.dll"; DestDir: "{app}\bin"; Flags: ignoreversion -Source: "doc\conf\tls\curl-ca-bundle.crt"; DestDir: "{app}\conf\tls"; Flags: ignoreversion -#endif +; Documentation etc. +Source: "doc\Donation"; DestDir: "{app}\doc"; DestName: "Donation.txt"; Flags: ignoreversion +Source: "LICENSE"; DestDir: "{app}\doc"; DestName: "LICENSE.txt"; Flags: ignoreversion +Source: "doc\*.*"; DestDir: "{app}\doc"; Flags: ignoreversion +Source: "doc\technical\*.*"; DestDir: "{app}\doc\technical"; Flags: ignoreversion [Dirs] Name: "{app}\tmp" @@ -156,7 +163,7 @@ if CurStep = ssPostInstall then end; //********************************************************************************* -// Checks if SSL/TLS cert file exists +// Checks if TLS cert file exists //********************************************************************************* procedure CurPageChanged(CurPage: Integer); diff --git a/src/windows/unrealsvc.c b/src/windows/unrealsvc.c index adb6d82..ed360ec 100644 --- a/src/windows/unrealsvc.c +++ b/src/windows/unrealsvc.c @@ -83,11 +83,11 @@ int main(int argc, char *argv[]) { uChangeServiceConfig2(hService, SERVICE_CONFIG_DESCRIPTION, &info); CloseServiceHandle(hService); printf("\n[!!!] IMPORTANT: By default the network service user cannot write to the \n" - "UnrealIRCd 5 folder and this will make UnrealIRCd fail to boot without\n" + "UnrealIRCd 6 folder and this will make UnrealIRCd fail to boot without\n" "writing any meaningful error to the log files.\n" "You have two options:\n" "1) Manually grant FULL permissions to NT AUTHORITY\\NetworkService\n" - " for the UnrealIRCd 5 folder, all its subfolders and files.\n" + " for the UnrealIRCd 6 folder, all its subfolders and files.\n" "OR, easier and recommended:\n" "2) just re-run the UnrealIRCd installer and select 'Install as a service',\n" " which sets all the necessary permissions automatically.\n"); diff --git a/src/windows/win.c b/src/windows/win.c index 5047bb7..2cfa918 100644 --- a/src/windows/win.c +++ b/src/windows/win.c @@ -143,7 +143,7 @@ int GetOSName(char *pszOS) osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); - if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) ) + if ( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) ) return -1; // Call GetNativeSystemInfo if supported or GetSystemInfo otherwise. @@ -151,7 +151,7 @@ int GetOSName(char *pszOS) pGNSI = (PGNSI) GetProcAddress( GetModuleHandle(TEXT("kernel32.dll")), "GetNativeSystemInfo"); - if(NULL != pGNSI) + if (NULL != pGNSI) pGNSI(&si); else GetSystemInfo(&si); @@ -164,14 +164,14 @@ int GetOSName(char *pszOS) if ( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 1 ) { - if( osvi.wProductType == VER_NT_WORKSTATION ) + if ( osvi.wProductType == VER_NT_WORKSTATION ) StringCchCat(pszOS, OSVER_SIZE, TEXT("Windows 7 ")); else StringCchCat(pszOS, OSVER_SIZE, TEXT("Windows Server 2008 R2 " )); } if ( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0 ) { - if( osvi.wProductType == VER_NT_WORKSTATION ) + if ( osvi.wProductType == VER_NT_WORKSTATION ) StringCchCat(pszOS, OSVER_SIZE, TEXT("Windows Vista ")); else StringCchCat(pszOS, OSVER_SIZE, TEXT("Windows Server 2008 " )); @@ -243,13 +243,13 @@ int GetOSName(char *pszOS) if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 ) { - if( GetSystemMetrics(SM_SERVERR2) ) + if ( GetSystemMetrics(SM_SERVERR2) ) StringCchCat(pszOS, OSVER_SIZE, TEXT( "Windows Server 2003 R2, ")); else if ( osvi.wSuiteMask==VER_SUITE_STORAGE_SERVER ) StringCchCat(pszOS, OSVER_SIZE, TEXT( "Windows Storage Server 2003")); else if ( osvi.wSuiteMask==VER_SUITE_WH_SERVER ) StringCchCat(pszOS, OSVER_SIZE, TEXT( "Windows Home Server")); - else if( osvi.wProductType == VER_NT_WORKSTATION && + else if ( osvi.wProductType == VER_NT_WORKSTATION && si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64) { StringCchCat(pszOS, OSVER_SIZE, TEXT( "Windows XP Professional x64 Edition")); @@ -261,17 +261,17 @@ int GetOSName(char *pszOS) { if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_IA64 ) { - if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) + if ( osvi.wSuiteMask & VER_SUITE_DATACENTER ) StringCchCat(pszOS, OSVER_SIZE, TEXT( "Datacenter Edition for Itanium-based Systems" )); - else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) + else if ( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) StringCchCat(pszOS, OSVER_SIZE, TEXT( "Enterprise Edition for Itanium-based Systems" )); } else if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 ) { - if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) + if ( osvi.wSuiteMask & VER_SUITE_DATACENTER ) StringCchCat(pszOS, OSVER_SIZE, TEXT( "Datacenter x64 Edition" )); - else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) + else if ( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) StringCchCat(pszOS, OSVER_SIZE, TEXT( "Enterprise x64 Edition" )); else StringCchCat(pszOS, OSVER_SIZE, TEXT( "Standard x64 Edition" )); } @@ -280,9 +280,9 @@ int GetOSName(char *pszOS) { if ( osvi.wSuiteMask & VER_SUITE_COMPUTE_SERVER ) StringCchCat(pszOS, OSVER_SIZE, TEXT( "Compute Cluster Edition" )); - else if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) + else if ( osvi.wSuiteMask & VER_SUITE_DATACENTER ) StringCchCat(pszOS, OSVER_SIZE, TEXT( "Datacenter Edition" )); - else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) + else if ( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) StringCchCat(pszOS, OSVER_SIZE, TEXT( "Enterprise Edition" )); else if ( osvi.wSuiteMask & VER_SUITE_BLADE ) StringCchCat(pszOS, OSVER_SIZE, TEXT( "Web Edition" )); @@ -294,7 +294,7 @@ int GetOSName(char *pszOS) if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 ) { StringCchCat(pszOS, OSVER_SIZE, TEXT("Windows XP ")); - if( osvi.wSuiteMask & VER_SUITE_PERSONAL ) + if ( osvi.wSuiteMask & VER_SUITE_PERSONAL ) StringCchCat(pszOS, OSVER_SIZE, TEXT( "Home Edition" )); else StringCchCat(pszOS, OSVER_SIZE, TEXT( "Professional" )); } @@ -309,9 +309,9 @@ int GetOSName(char *pszOS) } else { - if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) + if ( osvi.wSuiteMask & VER_SUITE_DATACENTER ) StringCchCat(pszOS, OSVER_SIZE, TEXT( "Datacenter Server" )); - else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) + else if ( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) StringCchCat(pszOS, OSVER_SIZE, TEXT( "Advanced Server" )); else StringCchCat(pszOS, OSVER_SIZE, TEXT( "Server" )); } @@ -319,7 +319,7 @@ int GetOSName(char *pszOS) // Include service pack (if any) and build number. - if( _tcslen(osvi.szCSDVersion) > 0 ) + if ( _tcslen(osvi.szCSDVersion) > 0 ) { StringCchCat(pszOS, OSVER_SIZE, TEXT(" ") ); StringCchCat(pszOS, OSVER_SIZE, osvi.szCSDVersion); diff --git a/src/windows/wingui.rc b/src/windows/wingui.rc index ec3c091..c3023be 100644 --- a/src/windows/wingui.rc +++ b/src/windows/wingui.rc @@ -143,9 +143,9 @@ BEGIN CONTROL "",IDC_GRAY,"Button",BS_OWNERDRAW | WS_TABSTOP,137,21,13,12 END -SSLPASS DIALOG 0, 0, 174, 57 +TLSKEY DIALOG 0, 0, 174, 57 STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "SSL Private Key Password" +CAPTION "TLS Private Key Password" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDOK,33,35,50,14 @@ -261,7 +261,7 @@ BEGIN BOTTOMMARGIN, 30 END - "SSLPASS", DIALOG + "TLSKEY", DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 167 diff --git a/unrealircd.in b/unrealircd.in index ef03bb4..bdfdc82 100644 --- a/unrealircd.in +++ b/unrealircd.in @@ -2,6 +2,11 @@ PID_FILE="@PIDFILE@" PID_BACKUP="@PIDFILE@.bak" + +# When built with --with-asan, ASan does not dump core by default because +# older gcc/clang might dump a 16TB core file. We explicitly enable it here. +export ASAN_OPTIONS="abort_on_error=1:disable_coredump=0:unmap_shadow_on_exit=1:log_path=@TMPDIR@/unrealircd_asan:detect_leaks=0" + if [ ! -f @BINDIR@/unrealircd ]; then echo "ERROR: Could not find the IRCd binary (@BINDIR@/unrealircd)" echo "This could mean two things:" @@ -14,9 +19,6 @@ if [ "$1" = "start" ] ; then if [ -r $PID_FILE ] ; then mv -f $PID_FILE $PID_BACKUP fi - # When built with --with-asan, ASan does not dump core by default because - # older gcc/clang might dump a 16TB core file. We explicitly enable it here. - export ASAN_OPTIONS="abort_on_error=1:disable_coredump=0:unmap_shadow_on_exit=1:log_path=@TMPDIR@/unrealircd_asan:detect_leaks=0" # Check if ~/Unrealxxx/unrealircd.conf exists but the file # ~/unrealircd/conf/unrealircd.conf does not. @@ -132,8 +134,6 @@ elif [ "$1" = "version" ] ; then @BINDIR@/unrealircd -v elif [ "$1" = "gencloak" ] ; then @BINDIR@/unrealircd -k -elif [ "$1" = "upgrade-conf" ] ; then - @BINDIR@/unrealircd -U elif [ "$1" = "backtrace" ] ; then cd @TMPDIR@ @@ -227,9 +227,15 @@ elif [ "$1" = "spki" -o "$1" = "spkifp" ] ; then CERT="@CONFDIR@/tls/server.cert.pem" if [ "$2" != "" ]; then CERT="$2" + else + echo "NOTE: This script uses the default certificate location (any set::tls settings" + echo "are ignored). If this is not what you want then specify a certificate" + echo "explicitly like this: ./unrealircd spkifp conf/tls/example.pem" + echo "" fi if [ ! -f "$CERT" ]; then echo "Could not open certificate: $CERT" + echo "You can specify a certificate like this: ./unrealircd spkifp conf/tls/example.pem" exit 1 fi openssl x509 -noout -in "$CERT" -pubkey | openssl asn1parse -noout -inform pem -out @TMPDIR@/tmp.public.key @@ -295,6 +301,7 @@ elif [ "$1" = "hot-patch" -o "$1" = "cold-patch" ] ; then fi elif [ "$1" = "upgrade" ] ; then @BINDIR@/unrealircd-upgrade-script $* + exit elif [ "$1" = "genlinkblock" ] ; then @BINDIR@/unrealircd -L else

    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ǘ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 BsWSio literal 0 HcmV?d00001 diff --git a/extras/jansson.tar.gz b/extras/jansson.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..bd1d16c2dd7c9564d12bacaeb9eb77524dad442f GIT binary patch literal 531924 zcmV(%K;pk2iwFP!000021MFN`ciTp?_A~y%ed(c@(9$8nMT^Ih<%E_fn*GjgH;ku-nZC z|B6owpT}EU^xb~E)hd3Q&x7{H_SRNwtFyha{h-xub+)%2h^+_zMjx{g^Zjq~`L)dd zR3>R-9D7$X{#^WTw_BT?CI8!KZ+A8xw;zZHU-ToS6z+9e?Y}o#8;#auyS1?^9*T?Mz6F^3(fm60rn6K$ z+FuhG)oyfJot8L^r4;AUBwaYM6o*k3j-3>M>Y^XIw)GHGhchn`^EjHuP9X4eLQ@hw zWmjBBnQ)y@#B%Hss;4biC!pzz2^3CmbSa~ib< zC{B1Sd?#HFy?d+69gT$-^4ha#4)kXLi4840-xnh(vP4cYzYYi(D_-@7FHbLqqI>eA zc-0*Yx+lXQcQH1dMd+1RQbF>9x$glmHW52vdJS>_z;SP|{}MC0&-+LH;g5v>VSjki zJ3kkPrvuRyXWhZDzkhMm9f-4w!P)6~&lcib5>gWLKS0b0vjY?x%hd7wMD6)U@Gk*o z{#eYMD+xZj5)w8Rj&LC~A7>Jg(~rU_?+{~`Bm`ppi3p>#E)pR4be5*`WT)9&EEe`O z%Upff^nMZNTLO4x` zWKZ#<;pk!CYKlK2kxFDZ20>DHCTS$*JT>DQx;Y=ucpRe#+r!Ss9&LuXGl$ipjRA4m z`GhgMa$?UJ`G5@wi20& zMrK)A;!NcwLlTeHtlupmq&tg5rP|sN)%A*a_H_qs^BBar;@CwRVl4K^NX-M#)5$9QIlng=3EgMky(98fz49Ga8 zxp4+ft|)(LC?7@^)B94<8;^>vmqgb~O;?cBTFmI2F`Vi{(U_*9wJXLE3k!}{wGElY zL!&`ryjB#rT_tPPZ+3TifHo>?T2PCERV~@;%IeIVFKc2++G=MPD%zW*dXVAPn#ifU zI>hh~Uf3@zrT-`bmsp>AY2q>uaKT`YT>| z<@nxM%jAxzRok@+4;2`?oG25=#TNs##!)COEAWy80(pt4$sUWXcvq?BG_Hs}@lJgG zwJ43NREv*A_Ed5Zh6NRIKM;m_O9+NT_l011Td`pC43OfOiufA;tR z{b)gIH$TwjW3FKBl!00k&&pS%10w%H2js3r^gIBYW&t$(%G`pmVaGUnIh2RuJ1OVN zZo@z%*P*N2ikk0@noiJ!WpdxzPOwvb1-4XS#cnyPx}+r1oHH;B9gHG4>A2OkGLJ z7@(Ox55-BO&KA^?4_`^4$O!S`yadDJnM|i~bV*8KuNDWQF%h|hiCj{4#UrIQl61{z zkR+`^Wjb?FNz%P`=gF?9YCsjyF7#})ianh|&t|(cXQSA)QR>=a*JP=z$vJ`Q6{MtX zt5W?IMtO;L=h@e73xl0B!?FLSAPBeB0^}i#=m_WmY8K1dlP9^DqzjyMi8&f*+YooP z!vJ8qDlNV;WT#qIXG+Jnb|96k75A!O82M*=Kb&>pgu^{15hQ~lrsN>gFIGCO9q1sT z=77IEho|Iouroa;jCji9$2^CpKoEG!`FH)ZyQY|Bo;+F3f!y$%-e7>(;Qgqr7q;W; zIX@hB`$r#GXT7i;Ljs=i-gQ{(T6E~h`Y(+#Y`h!6879|)WmPj(M^uoL1OY;%oL?ww z3MT>PZ5S=YVkSAF%Yn_EguD!B8DbcIB@{h~IK`g1=WO7m;w%dPiZ?55JD}NNT#L}eb zGpfZbm*q8_jpgAe(94i1C5;g#kuP(=zk>^ZRDTD2{Dq$QW2dlAMZuUN)F=`PgEJqI z7g0T88p6GnSBNxo*U7-&VY8+t05X06$ECJ0qo#f|a{R_!gYOuvrG$s@ue*nl{4~6< zp@D-gn88xDG9H^eid@7U-i`9yzX?6p!(wN%Q304;E6)K@##jjvjrfc}ha z{CT-Dl7IdNLC4^W;eKnS8=)CGbnb@wdT6j7eEIwbe^&CpNB#ZY$$9U8KQ+3&x%s~Q zf2Z}h&H3NW_I77`oASTyPP_Fb|NA*Uh4idT>Dks3m7YD5Y3zw3IYTflL-BM@&)<%{ zsW<1`jAfn4n7!>NBqxj;=T z!U6oE~yA`@8t_Kz+O`X?{MbIdzA9g3s=aeoM)!&5;EYEb>&IRRTqa@VborMR*D z0l=R0PYwrIrANsu8>^yC^uEV~IDgqaI-;el?gg+P5Po9+^z6q$|HaFpczJqs&_m<% z9x&@ZKkBKau&Mo{ZvVJ04!XzP7d@VJ3Md1MhAHgCtCu}$qV>A?Z-3Z7J)v#vpPmc{ zc&uZWgJC}PRsXzK7u`YsoCtC_I6bagL{7{&WgwV$(o;}~)S|=@458T2nH|lN#yLE=n zcnm*P2qD!rv2>ej;IXd zYf-DVbgiqlWU?2kJO|aTOo_E!$gXmYjO#gG((p;eEF}G1vs5~qON7`lof}8*8XI=w zh+Sct55pHB>vP2s--!iRHRKUtvY>(euG z{NC8MO`i9QLHAg^HuYI*wX8uFirSrhwK|xZQslug8+b|v!WmytgaE3AS~%$(ig6|> zYBGREk_$fCY>RdX1MbB0^j{ zuB&!1@#VX`LcaV>d+7uYg!OxkZjwzV-aEbzk)wtazCg@K-y|gSSgIj4XqpC<&hcI2 z(9x<*Yg|0@reQ?+a%Kn1Gv9BZtTPTTsC`a%FGkr^SIIwcQ^T$-rMdb|QQEE`Ui`o0 zKe76o=r7NFM>oq_bU_e}5R_}t;t^>=bE{}2>Sv9XLWXi}*Ju-J%rO}xPWH5q&c%Wt>>8?sqyLjTV(?c>G)S0=ilw-<|EF|-c zO2oFR$5!z_t3@h8X+1(FgenF6NL2}_&;{#eU4wXpjVzobtf7V6hPAr6N1AFS`C6obqE8$^r9wnuOLO~%CkfkdDflQ#Sc(p|ozr~i79`2B5 zkuPtQQC=$C-4%wWJ!*2HL&f%n2qXfL`~X8v0=f*OFYv&Yki$14w-lqazF|Lw?NjWj z!$UU6p(F2lgqwlJRuW3b7o-oA1!dC|%YS4Z)lSG*243g|S+I1Va&x5_v%QfUtRR{0 zRX~jq?8CLuXBA8Ot8?0&$AuE}nWi6DV)UVHpym28RK8tuouo3TnEGOQGV@xiHtA-Z zaU)kvNd>6(0&*&{xos>Z@L^jCt?gf44374S&I>iN_hOOCDs@j`rLvI?o7G%kUvO+_ zhy^`yX*}jz;EXS12GA`iM*UJdYRj8Yh086u4!$wkXiZ--QmTWm577}X3ZeFaj5B3a z2s+%ibhoNf0`auEig(kj^{hOypQ;L7E+7WF@|EZ**kt;jfp#SEQOu!0MAhi~ElZ%D zeRO27*}OH#Ffs2?7g2K4bz_Xx&C-N@8Zp@r{wZS8jOKl)`IqQ-f2y#u`NOhEabIeG zMT;L@k$~>^z29U`2QHuH?%;%OPY5VpJ#2ib$L;;1>!a<8xDlj2Ysxum{!I3{*~FnQ zG?btDsrHLyt`1H_?W^P`XzB{H1gxk+BftdH5z!vJ#MzlAdzD(=U^{M&oGH*zrNi^| zEF8!3uu6W`Zto;Ne42ObWkD%~Q&9+2$MtLI6BVAQV3>lw@`Cj;Z{CNcm)d6Fs)nc; zd}_BvTnY52A`176QMG48zA~cKGPysDokHUd{79dCDt2_+l?Y`!!Cyp=uvkS-DcDb^ zoMxUKZ2lGG6c%ONjK;bHw}8_{9L(pqBy?RNzmyzn*(%!fGID$?!>qB?dN}AKidILN z=YK>Nd19HI?DMbRki-9pBy~j1zOFI$cIEcQ5&bOa)&$T*M4wX4#VF_J9BV}Sg{Tn#=zO5LKWEFQ4MSU{r5K>83HQeip z_^EiExx(%uKm(`gpXJL-jn@5HV>V*AqxWZG%fG;y6f~~sJ4maimGXt^ZjQR*AC7Tm z+!PR<$pk-4Jk%Z6aT|^lI32fv3^hni&Rr^jJOES-5FUpdfIGj7t zi?fF@lKLK1m_QAHxm1HL1IpC>P>O@6FqEt&#iMTjhq^epsEhuf|HB#;hY@9X2$k4w zUYjkJL9OnW-5S8VhyQ|6w~phV(S1tcnH($z7>23L%!>9y=#y~FJIP{Z`V6j@ucuI6 zbD!NE){=u>_u#l^s59#TgZEwgEfDg{*-S55WSjsi}k2R&_Evoh%kW z!JI68Gfuvx+jJzRL{%qtXB5#8RANpU67z`3qC{E)UFJf0DHC87{a*W{zGA_}Yk)d! zIB?BZ-N8x!iKZ5U54h*%uVLAyAqT;BV`F)Q9te57uNsxm+1 z8j++f$Y|UFC5&{~U#Aed)T@l4&Jv6>c4}9nYq~#Zg2Vih+g0(B+n2j*|7G=GSVhWD zf6n^v)^@AYTCM+XVfdH&@8_=nYVM1Mpf4^o<@!XIjYxy$t`nu*oCI2VEE|&jhUAkA z!B6g02>w#O{ZhXDQojAadMEhqOBh{*XgFQqh*UmyjdBNNs#YE6j zzPDB@7KW&h!!Ila^kNvL{qIq+u`68ODb#ItmmySR2Dc5fwO6g)y8WqldZ=H!&6VA2 zwFJM{s!!jWQi1gRjjD|5wsS#k>SYO|B$c!L9u;Y=s7O$v7hZXB6b4+SSUOyS=22Cd zy~Tq(LKSK3sA?W{^2=V(AFdh(&BMQ0vSR6|1YikSenTx%S48=9s($knT|2#d(n0U+ zpg%AbS#nb8mAys&PHd_U@N%=Z+5|&h*@UXQM0!CQm`(^tD0brII1))N^{5HA z=*q9rc_S|D(C3w|Rhc%NHZG(;y2gPHqctjUs~28A{F=ILk(As~gQW5&3)NMz5?L{V zwDN-OT@Xy^>xEQ7(~_hF0nTlh$J)Bm=%h1M(&N{Uy;LiHz)3sYM^E=U$ML@_xSGXNSBIb2^HboLtW@!PtBj~*FW3XNwZn|Md8afr;u$@;!Q<7 z&@^LR>f+RDg|4DORx1=aUm+x8?+1Vu*mFu2o(&_ZAD%|3tSktw&8bsY?XMzlEcAZCnZAXoPhCxZBV!I<7k|@vXm)QdY(ZPH$;UDG@9CPV*;uyajWD7V4Bx+ z+!-`f$p5T{rUDr>QJX}O9qklWvu8D1&pLp|v4~WuKB@Doia_z#46EUEhEsO85^B^F zgs3WgUk0dq`OQ29L%+nRRBS%EIA=$XCGg&4rIiE`Ab9AEOBld8PCzY4&tbUCy0C;@u@f>doD0(_zvCMGC3_RV= zujDC(@7~iWTd)1Wc0Pk|Tk4q@F<`J%90C#uZv?-^ES9zPI?Sinmtu<|wFU-<+qAr|FQ|YbY49#(6(@1%zdgJo!9Z<5fIA3U)b?JXUr^w63q`?sG6ecvKcoT zL$g*rIj`4{P9|+y<9wur3T<`A*C4w2J?xpWbS`p@Fj~#r^m^9==Vn{8`?hJpgh%`ZfE6JQJLa=t7OxwIt=f6!|*YjTTMvhg|PkhMkAUH_cai0 zBzfp4KV(K*rR;yBEe|barJw&59E>1Ecw2G9p2LEme8M(iC~gdBkG*%seIjDN1=`{D zqnS)7yXt1#P0 ztBqo2brtD|4N`Z}Vh-&h^*Nh(M?Y}Us?(u+(R+A;+3#Jt=foQ;=kYJhY8t%FAddu@ z9B<~;8MI#ABr<5AiS0uQd|g}F-+}*#OQ06@T0tm4gMib(;RZ^0I|LC5a-3pMOr}2Y zpTT39^o_4NJEHgEI}lw_E9LM_Cv#ibAUOTPVGpxQSr;`cEPATN&sJA25dy>MvmnP5 z4|cIn`8L{eU_k~YmgW&(Ev_S{E1TsT=w$7qL)G$=c(Jv3KkE0G4$8_M$t zY#racZgx&!_xuL+f8$ASI^lae9D2Ih8lwSzKakoSJYK>hb-=9jiYO3>Yaf~<2nVLJ ze`0Ods=Kj!BikeV0yxhspm>M%qXTp*w$f$RTmRLE^dKsoVP5HP&Ku$0h)yAN^+ml#^@FpGcf%?% zAfJ=VogJ2olK1!y+`tEzpl(>`eJwmaR!)03mq6Ie}Bg(`7RV zF$ECLMhFLcuU39P=z+lQJQks8XswP`1G3_n=SmU@wflwCbHr*a511^C!GR8{kynhp z%8fZC-2qfWTdT0y_;~93$^b%3U6XsV^`r|9kXb`n4Oj*~_dDb$M$YYcLXp$XKC~MV zZKtf(9&?yqMrEBNwqU>ha#tzsj*!l=G#zn%TofRnhW*@h76RX#_D$NWX(yk@71 zozD?!$ExtE6p(xnl3|UyysZtL8#oY?wt=-mS*dRjQs2O&wAO)nh5C)liq8V5Om^%% za?bGv7xFT#9?>h>sY9jMC`Xq#>|+i|^>h+JcL@)snmJ6k4Ap>p@8bv!-OyAk5OT?~ z!67q8X`M|cB&|<@a$$|YmW*C!KtwC}qUTx{bxBrhP(K?4AO-em4J$SednO419_N~d zdihXK(a}yStw|+?d69kM)tA%5lNZ{2@S<#>e)*7(X7FDyeq`E82%rqSC{Y}OLj4iQbZe2`i5bSXxPKM5D8)U-%M+VVi>3h`>J z5WXf7WCMN) z3QHnHHDft-u0nn$Q%R9IzuJKFQC_hw>V4`xncdoSkSy!em*5aF9)a5PprP1ASX-@@ zB1}W{^HxTn&$O|W9}>e%bK!@S(YJ&RysXd{JfXg(f`;QAZ`$_tC$>y6xrQaF#OuFM z`9F^x!lCEioF6*gLs1KiElSvgN!v=(V)CXLCeA&SpQWg&5=nM_>Bp{i*0OC0GoT~f z0OU-i@+BIiLV$&&@2>UP0*l0YX*r)Nl2;c=dD&;&0TXFuwe~^2F!###npfE%UHtUGAA)+Rm4E#QkNoOu2ttT?sOifp-sh-&D`O^U16g0H!GNh^E8 zwd!}(^(`XwdiVW)y8&z0F@Dc{ufkT2ec%p*U_`r&$)h1bh2%H zB&lH!!$ioEzCwwZNnPeYOYb1f82rGmu-(vXg9aP~@>3;U4t9E;rvXS#+K`1!7QesG`Lz;fyNFP*hS)vqMut++ws@l0Y4vxrE z^&5F25<8GTmY21Lpo;s-bV!KOc>%Ot;2HXeo5tM6^84oC*Cb(Ouc z-1TuU7a-NcGh}ZHwF5*TwEIN^X6AoEK)S-A<3IArT51Xjv-@6J0=RxS9n0fE{4Rww znW$HVPZ?&Qni<_F=6eL~9>Dv2Xep>I<{NVL}rJ*}<99X^5pc9QiLR*6@1tKl01(q=<6-D<}sO;dI7YzZU zW_lj$swD1JfgM5`4jx)<3Zyw@&>#y5=Ar7_ZAMuVS==1?H7{d!vqJ{jm`Mteh%`$! zgk#SUnP`q+MaWLpDV7!0MhR3_XeQ$!E_S{+4Y@<)jOQH%wz@p(vHS9}kNbrh*T)-= zpqe7aNh_C#Evpp6`WfDs17ZMwrz-TDCRvg*NKZk$ZzT;S4?A-unp$X>F&MZ5t{d8GoRY1?AmHoJaDs=pn@7Xu zV0FTjCA^Z1I^R>b^Y7hzQlVB zN-XM^^0^efrPz{|N~WO6SBcCMEi6IWK~z#Q4hqtn64w9^9rqsZH+o_TlwpSy3`aXB zXcCMoB3o_EVJoeg$b4}5^QE{n+3hlBj5?{_=2@ozqiVgZ1Gk2cb&~7Ix#<#rZ}8(y zOWb>s1?#G~Oqj1?6;cdWFRk|tEgPb_C|^32wQyKoLOA^6Hvpu(_zG75Z04t0Ay`bz zmCx(tmrCLPl63tqrAmMCHNh9C_}7g_D0@4~A}jL$;Ybj1EoP8KARo?JEm3HF`)!d% z>g^G1sGhU6DSJhWZ+z=U0yf$t-mnSyXza>f4aOnqw~S{rOK-f>NY4;y)gIF1{T7d_ z{g>ngHzwEf_;tKv1SCG3()pyHSG5_Cz(@CvkxL{M#05pWJ3i6zUaZi_NN>%Pe1EDW zVz%*uISNwUSP_I1^VTLw;4jGqP3wUt9KI+f<^0+DqkgJN$JP_|qk1ClwT8+0a(fyelDM)V{E@qM^eN4Sn#fzGJHlL_!vhh0RACL zwOaDAI6p_tdGZD7&Ero;(FdRN3r?+Hrd>}C2&vC-AsNI$ah=S^~$rgP2>VY;vnk86)QtADFV@OoxVExYIriKq2t2|>|f@9NbMZc0g`bf zzKp*t$6zpi9UDBF3m?2S!*j(%anevbn69IJsDow`DehPT(j^dZF^vA?L)2G$ElAkwSQ7G7%dUmaYj0*5DN@p$_$`R7Wn&A$MS+ z$Q?3*!&a|4hpl5>^}kii#P!+2jYMX}Y4X9n_d>V2@Q$Ld%1K!_@#~A7udyek-(U1I zu@f0@B>(TxnNRTbEjGqoAhLh18s0;R67Ry(iP=*#(e4P7Z}$dpGJ5SBiP zoOZUrQyQA^R;KE_hGhV6hdctZKz62@&!W>~Hh*4+IZzwHi>kaoK>BqM(%xorvgm3_ zC&wzhQ3WUDvVb~&uPwLfSaK_FJ-4>{8I+wJ*L?SA-Rtbhklk){xd@d$|bDHae!CT87ZKptFFiFn~qI_ZUULO_`Wu_G+6EUv+> zy1>E1IQv!T<)W;^83B!rri`Rq!W)zlEAshfgAUIMab9w8>=6mcz{TP%?~OA?<6%;g zR04f1`RS8}Jjk%FlI)^XoCBmGCB^D;dw``d%)Uq8`@d|9{QF9U+RV|Nca24yH2w`;g5X0&hj+R18dTo(O^|Q$9fJiC zK>#Tusi=wCnA7gV_d*f(dIqNt;ULz)t045o%>xm6D+q@rpW-2Kae2f)M$L(mCwYt4 zEhGny>P_xF`HTCL~Ryuylrbq`VJ2Rom{7Fj1sFLujDHgwqZShyM zBevaHDY_VyJMJWB0a)%=wImrP}@!p-%r^@bp7Ah;K zssn2fVPa^2q^$wTex{oUI}3H$=Jp>Z7murTjt*3q&7f>}k4=WHh@5fAm~*6OGWWZD z>a8FvEm}QbbzDU=q2g1vj97c^&47TPx{Q{yod7XVZ~~-?tW^=U23SOZd^o;Xb07Dc zKeySJtYVt{88$;AD9Zo|`8uw``zbr?1}ZiJD0H~eZIFCA3`&80O|DS-EmseT=g)x1 zM=%g4~B4Z;0}Yxj{l?pYwt`b(I?D#ZTw;PuV|% z+e^!`KkFK)US99#XK?z+cJR++|IuI7E7Cn6yX}oe|022eKT_=fGAWkTZtdti^W|h* z6=!Re?=I+1Nn{ZYC5vzwh6 zPO2msOOvLK;8lrt!lG7tNq0Co`toE!%tEyI&-z=m{uV8>n8@v{f)UW!&!0#WPOGK|vrNvP{uuo`JCp4V|5 z&QP0utyMTf;YWMhH{zS~bMeiM+6<*h230Pin8SLeYS}o^Qp;FN_|IfdFZ~T85tfLa%{?qXPH?}r6p2hJ0*VpU+iU0mj!v8n$|0<46 zMSpWls8eQ2WaHU)CJx>9&A|Gv*WsXRVg2)^9Ak%16!PHvdj0sBC=9(xZ94G=H6|6R z8CVT(i^?>QBbYKizVa_aX%tCpiNZs##@;DR$Rc1v-(ClUL2%E3mR0Bh2E-!B_G)G| zEh@pLKo3|S7t?Ix`R8e1m=$3|NI0`eumbtMJz0*a|v+A&B;?bcL;2MbM(CIV8jbJRR8@ zAk_k%XD4slqI3BAcSOdZQ*aAtVw zVIYsxp@SC6Xw;=r5i6(=OTP(qT@pNDH1^O-Lxys2rtoy^{X=pZrFc~}t&sRQ9a5Wd zu5?~Y)BTWFo%ZRcC=Gnr=dc+409}S9i9LS<>4;}@+CZlmqSf-Uy>XmLH$%dglFW7B_Hqqyt8{uZ|Et!yi;%9 z@#DMCnek9QJKm>flWHp5MaWC%y+OjzA=GDz)K zHA6Zklz(Oa^oIRy?hO2v)7`>-KyQb4^or{XRm5M}99I>uSGb0hG!u?{+nIhifj{23 z3ql9|;x8H8;<|y~<#oD!?V!P&7k2pyz3X(fJLxtwD}sXDt()%Y`AS>E-llonXk;@=q{~t zBirCQau)J!o#oD*9u$c7z_E%0(08w$>0qMJ zd}*?2Mk_Q|6`F+#$uR}*qhnehqD=rXVY*`Beh%9xe(+p)kdh`WobH~J1o zrWnIPj1c|0Pw`xcGew@?KsLn~v(^mBt;bZ(ItQ(-qEf07zskN;R|Y!Out+?4JGZXM zaP8R|#J6sRN_mkliBF=$Dq8s!_G0>$FY(L#kMi>@Z|TaT4xXNW=M22QR2b%1=cs%; zb#e|?^-@37_7cgq2G~1tW5`<5dUo%GMWOcxGpF_IiK%+}PQX_-I+5Bbr$v|**fiziV(ln4uT1xrwh`$S z*V2CFYzxVCP1b4^gNOOpd(w8dOriio9Z~5LF`a#??EOy%VyaqnCWa2P?Qnv+FR3$f z251=n$ku2W)0wj#s`FjhY|I*|-3#NCw0#oZo6z|p_fslZ`l10LSEZl${4?P|U=5^c zVi79a(3}ifk$Od_D9^n3mnL26g}VIL{6#(ZqugZ%XIYl3*jJbFDdqldd38jC;KY}K zJ<)xHOD9Bf+*Zx7r_W;sq{@fl@MoG`I1}^M5xIg$Gx7v)hw;!idcO2c<~5|x!Zz5t zHG}o_+FGQ!>8-Lm;|6N1!~0}&sk|1i;(0%@Iz|!s3u8c}PD#^w>U~4(N>rOvPGI$+ z?8O*MNN-R-=wiO@e1UoV*qsy=zlZO6ja33aw(INPy@dL3mMoQJz1&!{U#>@AZq_3? zH)3x$B5$9u*#jy8rb8$EKmi)K@h0vYf=sC3Zb48X$4kV-r|>yEAKn5dy~8aaPhvn` zd2NO4`AESc3BiY~Gcc4y$hsUPUCpG)OTeaJs~KVd9~s(BV;{oiwY9kk;>xH?wT2$q zP^JZN{Iy=Juj}pZY_0PALP;c%p;9tTbY2KC?T!Z1usgorR^x79P3*V%Z^ZiAT3)`9 z%tx3?FgQrQkQdLNKNl6*%x^?}ZEa2Di+PdLv@YWo5?{5V<>|NM`j{b zA@7ZQnLeXt{1Lv%Lk+~VXdmU5sAm9P2_L2kiQPWQ1W_}AnbZ%$0)kJ=7g6#64OzqA zyXX`*4cQ%!dQQ&2UmOA}l+MJS1YjVDr=AsE0Ayu(jKDTw0h8eY|D$><}B< z)Pbao%c!rRlp}&`%*d}C?Q?w1B^CG<0T!YxvuHL_I7n3E91txvAfG|Nkz5g<&Ekky zjz-@gj+IE#>wsNE;X*E{6*9qCjFz+(q?n`T5vp

    h4{6cIQV7$D01MQrdIz&`WFUE$M5lZE~=@d5a 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 z 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ࡘ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

    Yk=1Ydqa;LR7|7i!kJ}LZ0;_cSi^7(VpDt2 zDICCmHr3IX{kKov0qr)<1(pP*m(Fo|;jwXE{pmmO{i!y%*ZZf(dvB^wR*heu03};E zwmup^E*c-B$SRRDXp+~hp`g>Z@Fs%R|7ErOATm3?ZUxU$Z{O*+ zc(qE2f!cG(OJy$->dnUhNo?WJbUx*a82?%vHPdWX_dAjJwL#ifjv8Yd{_$?5Uy?Nh?7U$^!%15;*mtX()H z4E&=rt@xxR9v9(Tm3mRuHGa-=E|bH9m-t`&h(&EPK*IkNbA=i`=T@YEx|x>+?-K3? z;5x(Jxi#3|&vU&?FFTDu5$RhySTzIpb(2DUw$%CBIKK6d|~#0 zrL0jhVWLnto>Z737Q$R{Dl85sxFb=TmxlP%(rE(n z%jwsH(|W6ZyKncug5)fErIXdu?W4V;Fe{5vPmK97FUwUowgy1O-PC1X1w6l_1O|@_e%+69E%C2AOCb{rhz9;KkvzsYHMx zqp5^a^ubVxpid*HgjOz#N+<=#q7vbnXQp(C$YCHtwpjm~OA^!MP(`%Kqm~Y}zmbYD z{cn;4l*1x51N&1^-^=;b>3+b@hXP0X1FJu9+ZNvQ1tJ0seiS$ozR4l4i$1-0eXzZ? zzrTHW@T<|Hi-Q0&xGS4bNdq{O^Ug7BK+^(qD8l+HT<$n10m6>{NMB5_i7Bib54_YkD; zoT#X-6BX9AhR^V444`)9JAFV|VLm6G=O{7Pk)WOVyKH1Z6W zE1H4Z^ZtY`VQ66hgP5A)i}*;!_=H4Wqp%m(L`U5zr{_w zUG~{5xtcj^jIfVcYa9&#nO!z^Q!E$$0E1pqVmXdMF|(3u1t(3yF%-+KB_e8#b2j2} zK_1x|GpL=4$rTdMLoAwo9tui4>~;mul2$O~7N5#U$3tdfb}a=qb9Y{|;-Fu%tXc_* z(#a{ytl{%Oa>|4Ro0~XO{35aoroc3QFjgyay<~Pmno!v3^O5ozR}krd7gUJ%Dmhqp z`hsMg=Onz$Cp4~5BRP@!k>vOK0r_i|(~j`6R%cT^2IZ_40gGgoDrLjvMJfuIYh^%Q z%7U0$F9?k{74B(X?S8N$MEun(_hE zTq*$O{_X)fTx3w7VjV^=ja2xFI4R+m*lj$+cf)pCD27KJVbsU}CElyi>f<}FPW#qx z?20ngjNMP>Timgb(`l|U%91BvZz&uVSx=-Y!5bL=|Dy?bI_gSqQkA&XMus*BO1G%= z*jAe`LPG>%B+rZ@xR*5zR9RJ6X>ZcBQpxSjKqK|Iv%jXDoku%I0(jFv2!w3LLb*{} ztv#u&l_#3RCSw6TAuF?%u6fcrOTfB z35C8Cg7(OAWG`gSOA6w;1rB~|XXhAxA0BVLOuH6XN;JU2>1=itgKN$!d$L|RVvFVH zsJP4PLLRFa^CHiC`DE|q!PdTJJXbH~jk+Rz*)n~%XSd@QrL{LY>WL;*v=b9E+BaJV zoYzMinrv;I9=_V!PW9A|cqb$@rg|rYCfKpF5vjm2%7@tb8P9>uZR0vr+fRmi5JgQzD{)sD!yw4t`Qk@FT^omT$xU% zi>l4^U7B4n&8bk*AZNUr$TNzE5bW)QO)bW~v>--IhWo`u_#`cOV{+jSl)0k2Pg?i` z^(A)gJ_8^qeM#}4irG@EFzLu2Buf_s|+x?T;h$ zTv%i(8O%1xV9TsUJfC;F)b%2Q)Z+Z*e{7CMc?jSEAEpKG<2y zM(}-A`Tj)tzLv{(H?R_fo7QW_e0XD}R*m!FMUHY$(8)JPxi#aWYhI3QnPv;l9oSMd zA>K0fgFK0s8N%YkeTJi^jVQHL7DZVTWl6$8E{CI-psR60=JAN@amoYjr}AS0#*-)s zOtGEBi{Wu+%o$tT)$OhAUv{hT-}b*tccZgewv_(B#l&2ECJT#-JPQm48?~e;chIQu z{=oX!+Iw-*oQFS~27aq7S40Vnw#+K8_anys3Cech(5jy;;r}ly?*#|~t+ga!U)dL- zjwY9gx&14V!`9aE%Z4#u=%Tk)dDWO-9lP=qWB$q5mDh~j6|1@H=n#+At z4I#zus43})6?Qtq zuT1*KMO8EaUz8pI`#x)30JnL6`T*Xmv(pKTpbhzfNgJ|uiNjGKH0l^R{9D2M+BK&v@>)b-%IljcBrcbrM^gy^W zW=&`g4M>17`LrO9nvgLyAuo;(Up+K!h}x%YjYw205>k;EoOA%e2|TaSm1RTwy}FzM zLf19~bRq&`tvHCM5fJNzbTctbQ;IbOfa%=o-P+2qx+iyR6UI6x33Qs;NZvRLaAL zpvF?pu~Dilt!TPBYtA^Z%t80o=$deJ_H1Y9TX_G_xny3ClGK2hZJ}2iMJw@)D{EjC zQdc19jHoOk3JZnrFWf62>7q|}=K^xC(QjMF2YUxEH;lYmJWk)0v~=9e9U-o6eooQ~ z(va_}8C2$Nw02NyF;PPp?VUgHiGDQaSEKL#9Gcyrz|-dZ)3nO#&H44BDoDi2JE4ReToHD)J|-hj-O-`@YwluSVYT?M}6fdL4b~Lc4{n+_To6BOX;R zk_sxXJhi?U?AGg1r=u$AE1bjwJ@;X)27TxnZoQ!dOp(G2SL!RhkGUVXQs#zpuCU z5#rM*M$l^9Wg9=Q(xhbxeOyG_30FbOu@$UWZ4hIx# z!0K`G&2!86IP5ysK(^|+Jz~Imq#@loI59|XiAh>L*TGDwqed{HHh7SaCb=)eBOK&iSoUmn{K$Jvz%qa{g&;18*Zgh?ziDAu+fAD>d7#^ zvvs~zD5Nsg%1kR09S(6h9K(Nu^Q}VIvMd%_vBJ)`IjHA2&bJ75wDT=Beis$H()(=n zy4F&LYMsiFHY?N=2D~ zhO;=6=o|j1gnFPk?q8j}Y#khOOqCIeD79!>NQs_z*>c?RV@f<`xBueRTb%a_`R%5P zF%wS@ucBIdsw=(Jy=S>nyOR>0BU&UWx0POIoU~Tz(iBTS=%O3kZ<}%ij;3v}&=ifRor6ciI>s4lfXu<%6}~kIj5}(O88s8<>A+e)r|^ z?h%Yxo${aR9qVJ=8Fsr^uo2}|rW189g|5b#plO62Olds20eBvlN@}_Y9f4y&riH+K zD5KC?2!X?DQ$gTTYSKL&hsPlAqY3;}lGsfT*%MfV*&%yE;}a1iQa47d!KrMFp=VxN z2C-H}D7#iIwlS2bx{S0P+lz5;WyH+#O=LjR#GeEPGEjCYD*I_+P(t&FL4m664oT%A ztJAYDuP7(=&?~a2TD8cc=H)t!@4n+9=OXb*rPJ{~sdNHb-C>vHM5(;;_4fYZ$u0}B z=@(p*@UgfPWo}$dYnf3oa2ZS$?OJWKXLUylcq!##tD90Twyp`~#@;L22==6~$d_7e zb|RmW*L1X8r}X!0kn1D{+>>-Cn|}Z@9(QG8{D6wr1th)HYBQAd)ctTLaZVY`LlWoG zaDIkDT^inxA=*tBZ}SRxsnupH;N>Faqlx*KF2l_p!&AF3V|i|hyP<$oms)K+sZI{+ z-eo%tukK62Q!#5oa-O|P(SbH?JL_f1gr<_^-Dc` z=uW@720$QEqWquyj`w}?JKpK>cVkmW0#!urPpB}Js4HSYxH;Q#-1g8NN(>OYqSb;O zwB2gKjtDkH*Y4TAr(7BdUzwg~4YWHNeD@^+v)%6wJ^ZgEu8x%EN)_* zAiZ;|<@v*N?x6AMQ}lUDbRDMjgJtxrj0+-ynGBnG@ahGDkh4@Sh$in#wLr~JjL8&O zo?oqyP+^8j1;*sN=>)_C-m^v^1#zdX4@g1YyxM>%AzxliKthGt>H!4)!kzK)#2?^}H3I)XVgbF!?bsg8zMfK6; zl5jU&OusvhPgqDNu`*pm*Qib?-6(@@!HT%fdDm@!$P!r6ip|MeyYp8r)Nq3^5Z=&n zy|pC}yiEJ%34WeiuBU~6z?$(*sI?Sq3H82ilmtb`J7F4h*g7~oc)owQ{qN%EY+Bt1 zcjSuO>=;!_i9Z!PiC?r%c28gIi%?UrsNn#=iUT^1e6v2QwI0mu*j8Gd-tH-Un5We( zdai4uyT>CwnY7LJw2$G}L=S#t#R~HPX>~K%fe|=7;v}CG+E3$9Zz=PUeZD85)ogU} zX&8lC)tUAo%NpQVe&>9u)_{ZE)1Bv$I@Idjbo&Ct16Ju%4-=Yd=D9T! zsr6>;5U6ANSPp@sj)XfL3iq#&xF^Ip%e>91;m<5JURuNVrSMWZF){%GKO zo|tV)bsgx8q!u8iGnn>%^DL`JdEtL!rfJRqP*4s>dy=2-EheZHQ z%eEQ9>;WcP{=# z{+V3)(Ld@(?@~~fx<=R*>P?G!HH1;_O!~ht0bKe3CBrnfPDJE zASZd86fnW0Rx4nEi4AA=2ADX$&eZ-A!`KO#U)0qpV0}rgmc#gxg~<5?k#y5b-qHzZ zl~H=KduqaFnwPt$qpdVa*gG2|O(NnZzi;_h1Iz57dQvgxWLy)Ofsh(@sgRHwR!b04 z6Rz19c)jLrWA(|}yPCLc^R)JMr2)SdWBIXDl(=$owG6BPC_e<{nvMdZV-BuuhdTH4 z&i!FvckL2d{?5IQGGXEgOd37AV=o1?yLR)cKjcMyy8i5kAGxFWtg#Y)ZPZqj?~Ro^ z_8j5dwcEhoi^;w7axx-s;`D667=1&$U=>Erok)+7Qpx^F}ui*-l9FO_B&IJ~eRDGZ}mD7!mu$xx)3IdN=(EZ(-HGLTX_lL#fv zq;P(Yrv$?Z^lp3SZnq_(hs4E`q%spyDCsMyHIsyr>CNULYI2l^(`q}7C?;kFe>Jz@OJg`wjpI}C}ZFfFT_%44a^ z6|Z&5GX?E!WLjO=2R7=-TiuUlcW5Pv*(0k=2(2f!nn??xL;zZ79UY$Ry=iT?P7Yrm zZ|^Pw@in3kjh|qlR#tvk`Efr%pUyN!1^MRiX!k$|s6Ik)&sJ7aL1{{w5oBvhxZs@w zMtk1SYCRi`1zO<=uD?#&wB1h>1qn-dR2qqeqX?R}qB15~C4qQlG7~ZSmCZ8$?U=?(jiPe~9^f%F782*hPOgR2q6zIqRaH3l&5#Yqz zq!4hTrTj7Al$O2(uN*?n89U@qoA>C81MN>z0Yvy-$O9)SxUAm|e_%7^_jt zbV&WbH>+WYA+t6Z1~@V~TOqDQF*9MTMm`InigTI9!BGVhu{hHtcvp0vynS!?;MYvk zo{C~Kv+60>r6k{q31DdGI=@8`E?o}GC=)DSMwwvcQp(%~;X{xGWwf-44<wn7wP8!BRrx1IDQo#^z36l&_B83vzM64&qBo;+5rRx|kXWccuz<|AEes6^j5PG% zW2B(C+=aB{#p{FZt^NJ&!-HQn!Z9xwXxWfoS24(0=8f#!RA`Equ}2_cFqny5uvKo( zlhCAn8Se&a3Th_YLQO51auYSB{I>~_Dn`qeLeYV04wC#^TgNX~Ge)3kLUcvgOekUG zxG%04orGHS0VqZ9StU9xh3J^-(7Px@i>X43DME{>K_93RG?xnW{uH1w^=G20%d-X_ z&u{zgz;9(-r^qZ7tZZhfU_~=aIY3LZ`*oL{qyjCdBulS4<(u+a!`hX3_08n(&L>09 zbBSK-ar$j~tys#ndaVA9x%P?40VAM zat6|;_x|;L*+@SFonJQM7ts5SLR`IC;!&3_qfZ3uee;9m8EdHR@M^`dUaK0z`l&}& z%M&zB5zp1Gr)9gCl8`=~EtAP=X@Mm(*r>Hwl&)!PuFS4ZEc#bsoXY##Q%}d=Q%}F_ zJ@vS)o<44?X>F_Z@we6b7r(6@ch>sXx3eZCy%aD4r&rC$zmz&9$+3E;fkabP-saNL z&qNe0rmIh{T1;QB5AEJ`_9=8>mU{d6exID~UR$kV`up^%`E>Y+xSOfR&s`&Xe`M>8m*r14n>*CQlyAGI2^Beld`iuO-BXx})7IWWq$YG3yIr@Pl$u+|M_Vnbt5?Jk z*RkpybHXbIz4`psx_I*s-c}bu@L5{w zB2C|yolfh<#6+XWuE}qs%cwX*3tf1G+|5cCncRD}(Tza%X8)5uUaOf z;%vS16`alCf3J1>D@r4OZ#bUV{6kA6Ka0InAf0?h#m9v54Yv$WEtpp4S=9n*JAPDGF1JV1!`e9{bW3{oiv37BBv2kIo zoNqi^Z~suvth$O-H#VS#wejp?Wo4t0UH%D{e|E771vfV8>ucGi*R;~mw`XfVJXv4+ zF}>EB98TlM)mmfyhgxF=)5d3(UyYQnKUvML@Fdnia^C=ns%onF9_(7nU!YZ4HX6%P zRYeaL^;GsxR^w;S)(g^QEE{s5{0(5OE#^&kAMFz~WpD@HuH3Awyu(&kZrUr0An#~) zxUf(|6f%FvD6}dHt*>PidLjy~G%^aUDTT%z<)mkR^{birl?OEQ)yC+Ve=>oY5Bszp z?bCX+PmR?dQaiOyeOV87B0*cfGeWFu2ytO0uF$%M5I?MB6#79f<7!5sA4Q?YT1FvL z6k5B;D0D76o>i!wXLKFe@$-yAmMHXWJ)_Wt++9DU7iz3b0NwR9lv^=tb)MuXvzDXG z(;Q{ibCh`&mYK}{TFKa7%GC4BkFobwC%^a1JScpg2Zbe`KfB0*ohirQw6Jp}2R1Zv zl=;H3d^Fw6K{i+Nkg*(8Y+}1E`&3(B%dxSZjI*(lQ7jYvC62A;LZC*T6>H>KvPO=R zF0;^ioLQw+%kJ{wIy1+M>yss zt0NP%mkEPpb*G-Jdji_a0zP~h6$^OqB@Alz{(DK-J5%qy1pJ+l@1DL&1w8jMD(3Lp z%SP?IR;_fOz5L}9(JZ6OiwV#a9vvE>OL}n$mMY7kA@Afl2 zev;m+xRCT-UCX5RDsDvI-*LwQxZ>VDu}ahT?7=3ZUOn(^Djq!=+??J#*uP9q9xRaV z#e+>2_27|Bej(mFgt)W!+@WUg*J}s5FkvGu?S`V>Ihs&zt`i&zr#E z1}eT4I=}J-`N^dHS$+Dnrundj}70r@|J_BsVYp+CKH28)2L-fTezgS<3zIc*g5oB+s_=}`| z@?gS~Lh~aqm*rSAe+2j)(cyk8KowAu%f|7X5-{^umhHhz7O2&;dhK3+AsAA``Dxi` zJXs{w_tseVxI5~=CN)s-^0!2q+83=y0JXYZRL?Sm9uXtk8?x$ z3%i|sPdAevz^&xTUs47IJUzrLWZ(D#Zyc+)jlT-x#yws$ ze!y3Zr?f$e8aE!V6+d1pp6In=Z_pm^R`HssnRbEqE*A_NI(5}-0?@254ou`m=g8}v zqwjK#zQ{TH{_JG0aOSu!nK;8jZ7rvG-JHlht#`(#3s?jHm53)%5?Z_Wxk@UNf z!HtUan~{yi$V+97)sa`q8c#;viEONmyb;-WI`TebV|}vs%~peXPHXYW$P#NKOFSJ} zVtr(ZXG)3xA}hl^-p2UyZekR;g)#XX7-QYOxckkEd%tyYuQx8HbK7F9n-=5WvM6%H zqR8!vA~!3F+^TqxH!5=6rns-06tP&jf`jKZXto?NcGsjN{5V~nFkygSoHCshXsxp&v1g%3}=b& z1PM!gCrDQ8-S`9_K@~ED#VbtJ2u95*1~B|RY2%j;bF|@$`jlq$qL+yVFKVWMu`6ii z;TyUbA!lmj;wJCSz=h3EPDRRCUcj&wuP{TSmL$Y?G->e^-nTg`8Fi;_%1TDx+-9ul zpkHqDRlLG%O;-U1<}qAhXTKVw)vVD~Yj)Dcszg=B6i~Z}ULszhh)#k#e^2@d1vh4^ ziwLn}QhEqlg(5nLc!fOr2MyOUbPprTCE;#{&f(5DK4~2S%Bvar1C{E85{@$H)`jgl z=eC2-UznZFAoJu-D>u{A`vex?<=%^} zot@+2CwOY*`#Hsfn-*%?z`A{b+R3aFUL=sTF9z11_&4K_S4Ip6J(T@Aj(H6g@8_u3 zx-h%rUTJoUJFD=qpIW)_(XS2gK9B!6j@<(b5W}*GvH|L<6=nreE9Yhhl5lwxOE4+? zp9))`PRR(?APKu>$sQyi7P}bDuoJOshY40wHdJTXPE$%Kh?Y`9L92ukciUPFu&_-v zsoFFwtI2%Hwe4UBRx_9njltmFCTP`*^A-1Owv_8XbK|9K_+Cwz+=4e5- zCiqPe|BDKHN!5yqd2%@SDBx-MGkeia#h^(Fbz*gjigQWT@)}PgxH-avnxk|&-j5Iu zC$LMVAsDg`@d%Mnr)P<(S}u~u%$iX$TU|RvIy0`}HLLnVJa=>0U&G`0YqY{fk?$T) z=zFlp>J3kICyjY>PsBzW9p=5C{;E>irkcPaU@JG7e~8zxv{t59)dk7tlCYjHqA>j zYNO%R8RhAOFVG}H9(j#M?Pbbk8nsB$l^V6-{1gLk9K^D^lA(p`N--I??CUm(Dg?hc^nb% z{p`O#eYw{BRQJ}HJi#Qj=8?fZ5FX*7XwVZdaSA-c7<%-P)eGv;lX1Sl8UN6A>U7o@ z)2t_B;_UV7iAZ=)T6Ud#RS?v^ z!Bski3A%;)`OZC!O1`sYp%Cu>rPj*jH7(G17@V|}|u&A;*ECB?+<$zGwg`XpZq}0NxYUb(Emy^TR0m$O}Fd<_e z$Egs$rla}fa9_mzURDSEwVl>FcHZB~t@mTLr?}eow0GQir+X@du}*q@y!UJ~$&0 zcxFJ3%vc_N#K0zOQ&6vkdhyojp=S?!24- z^ZkbPxW9-VQwZi!JdVehAv|(N@5mjvBX`V>hZnA6RHTjwip@wq%X8J%^9OCyv)a9W znrxO{KrCB&0kK@k1;$750A3+kEv42pFViY*hIeVhhZDX^n*?~|O2D(&8z5E=AgatwyDFA4~gDYa&MT^2fXSAkHO(EAn&Gw^!q zf?)=3=N1m9jhnfJ#FSbyzeGdmnMcSAI=t{zNO|{y$nmykBJE8T>5E8xDYc47e#%(x zN&1Uo&TJ*X2<}Wu3Jh1Kh$NU&D~~i7$H@$dFkj(RY|oGkC$lvsEgha7Z*QIKZofLp zkPzc&I3p=BhJhK9A}mOTn3(i7T*Rce;i^U7-U;;qSW(e1R%P09AvUNBh45qw5}^h) zmpF($%a8@}b($cEjTMsuWn*822uMgeYx$2Fy-(o}Ixta2gD}6C*cYqvCCYp>j}JiL zOT^+?NPCHxTtw8H5+)WA@?upUw1fwp{A$Fz8KZ5a;aLfG(?IcpB3-OXL3xgbaDT#F zh$l0b1D8HNiTzCioU!HZUd}>Vp^=ml%+ImPZQGM!Q^E$4QL(_4ZD>tq2b#U z0S#L!B%jHaz69}%P;w+4 zmQ4o-3kYSg8V^|}gU&8|4f5EGu~lz(M$*_6FuRy67OPQA6r=v%n+F z+7tH4v5R|1+Fyfvr2RmABklWgjI{6S6*(6~6g(d7;_i<2n7)p7ZbwHux0j=x+r`m-c>axhqnsPQhjSjneK=?Ko%F*W;#&{l!E?X973mocq5b=iKidIcG|j*AbK{N|kVMO~e9?&a>BbMKeuoJn8kaK^Yk=X@3S=bVRffzG+N z8+6W{uh2~o9}7u@U(_u+=WDt~=iJ*pI%lRA>86C}MTNgR-lcQy`7)hzkGJWZX14ZhI@!LR&P1I% zoiV&Sote9LI&uF_XF3j^PH_)UXM~HVljY;-6nFA;z9=tG=U&`AoqPB5bSCY43kKgp3Xz@^>psd+0(hRx99Zmv4~XnWjTC0Uz5kDb8jx6&P;tir-bMQrMkPieLDB- z_vzfDkG|IdSw4xrBccz`-F7tn;_sdPYVNS%?I$x#wS_< zf6(%--k0RTMw>;Jj-7DKDE8m>WM=GBoUf(E)O=B93 zhsr={#uEn!Z0UOiM-dx3t^;RflBj<@uzl-eilCqJl6P~;OWwZ;FUO{Q46BHMpHyR- z;=O1u6z=)Kghl%((2;_@=vInYFWx2z^`fQxBE8bmgBR!}YR*!emu=pcFwgBzjH8tJ zo?nnpsxeD3UXbRy$?Pgp|#?Rf8W_t$j!Jc44gkv(VL`Tp*2 zTPHiaFW}vdtf0_6!#Mb#-P7O&1HKav8*et9pJg<59nUu%nblKtPJ5BT5QZd6sS(na z2S79A!YEW@dZZyB0ORiet$h1`>v8`-u>HUFxc?vK{@=Qn{XaGV@chBB?ZfU{Z<(FW zU<4hAl%4`P_%f)0TKHu3bo*%UNH6TI`t82mk8k5iQ4l~eL^HrOt(s%`FnYgkI|&pd zRY?$8R`I)K)Anjx32K3&S^?VO3^um$FI-r2-t~7Es5Jt?4L&IHaB_P5dK;H*y|uNo zbNpp+2?9S5{}Dd`G1l`D3bn=~vG}Tpg}Stl1Y_z1191!q22zfYXpn*1{Ajh*)o4O9 zGoU8A&AVsy&aHuJ>rNyZWe*P-ukH4&mfa~!`#RSa)2|Jt6|L~N>8H5q$<;t=bBiub z(?BI}Xb8xQ;0k89PUz3};n8kuZ$~{Gi=Z5K&~`3dL@&E_(KRo<6ikyPTS~b{1e*qe zjVt`>?d?2|Hq|*#5|u~dal*oni@r>s5rg**UK~aoW#BKnA))FPosiCLA8*W%75>ul zeYD}Oi8R9V0)D1b5_KTrio}(qFA+452bu%C@|?^v1ZuYv3S^yW%Yql;8M(Uv#HE$wCFT6Ug^9QHA!wS57qC5HAE`% z(E_mJ(x3F=$VyQfB@tl^40Y7>xZT>MV2I~`PiR4q)wK0cO;AScZc-m>cdAIZ>H zLxv_ng$Rue7Z!eSIqX@E?-d|JqbqB42!=ENw;TycW=hEx!0^7`_-tI5u+EAMp|-rx zHlgv(BE!@$A``B5^GZr+myV4u8z`VvBIlChK^@nA~(&ic78iN-iZR#Kt3agTw1FftCWOq ziL*(VCnr>MiVpvMIp@uVvGA=BQ5ITU68;{XE-s?*qCGPHX{_9=JY8ul%C4zzgXXj< zT;X9HZ=!!M5B9dV_V>3B4}LX%JK5Sg+WQhtzIf;5DT)8mlz$`-FNL+&)@NB=R(pmgdImp`RA<%jOrR)DIQ_GV0Xe#IJwIPb&l-HpQSzBV z28*;}I1o6qfx<-i80s*wFrrKJT{ODPKo=)?14vt`?6W0Aq!5pkMGZzikt;VEnYXnE zq!UZ|sr+Eo8PqMzM2$KYbhc`AY2*rwIb&Lj*9mn-yPT?qGMX}&-d>3z@L^&HHamd`#-GQ!deja-uL{MMuo*rzy+9jLbHM6#K zk4BtyBRifKi0r81rHkm^A6Oq-doNC!^YCZWz;Bi1igdxTe4{h$^=_p-Wz-@ECX%xy z{QqU;y?{h5sO`xXuIvlBS>}{({W&zdEnEQFuFd&IP$q}*N0|*e8CzS&FISEE)zD5e z9t@zJ^H1&yr>Q3F_5G zwA&Szov*JfIB^EX`K@mm?x150=<=dxoZFYknVL?9>^!=1Tz2O1v|B-uapYw=Eee>X zI6^rfig99DbOqC@43O5FUFxsxUm2z`bnK7T0GKgxY1|srCZ%7Ll3c5`b#%19+uBAG z*Ea%5@Z`~2H~V;BJ?MofC?o>@L17h0eiY};<`~@IH*>}|t{ENGeb=`f--h<9=AeDW zTqpE?&&QR+K88IUI$g{2us*J{1xGvl=Nnzi1ghg-yDA8tUFi7*l!V@XG`mBPu}a@S zC$UtMzTw7$Z^F8K4M>Bs{rvVe{P$vi>*Wc29vz8q`#bc7r2KCJeyZxQg%?3dhUuGN zXNOS54BG$tVI3&u%@6CX^)>j?@3;By`r2Z!Gy&|t7&dmejIwj+n97fu`~#Z^+Wy9n zLzJ%qxP+}-Acn4DlJWKVz%oAsm0&Y}6VjD$Bvtu_sezb50IhopP?xZOH?%0~%*a~! z93F%$H?h%^;OAvm=3@he9*Lc)@wUMZMX|bX4$L0xIHrjnmNTCJe!AN_Jl@$o2BEM$ zaBHQBDP>Yr0b=)QFGbION|H`d?eeX$AWg$chrjzSFc?4Id)eAO*xB1UFwStL@t^W~ zfA91Z$b={XFLWp=wY6FS5}&)5LyEqIvrcp7=@exG9^rFHCOR&MD(Ic#;HDnJOPxpvaP* z{hc^!CYd98++%Qd~WZMS;8x9^N5oq2y7D>rMa zYdnt~dDi(__@EJ_FzMO%$eWYcSV;T-(MvPuHF@tf%YS z0yektqiAE7+F+OnZRml7i4cti{An*5e-luFw!r}GcgFW&)Al>8|5@vob>8mS?P$k- z_;H5@v-@P1K7V-nBYpn(belT%!;jl*{QHMS!e9l^$P8|;Zqp2IKl|aS0Jg@!2nhV% zUB%C>ALvsbErU!RZrB`+HylzpV8xJe;kug{4sy!WLdiv=+0@#{XPXls5l|FS8xMZV z*@4Yq?QhNZP*9 zZou^@{qzLP~h8$?NMWr4Rv&8;24$TGYspRD!*20tH0m;07$4TflC?1T7}H=x-hGo~V3U)GvQ? zQvh&Wsf7$41$u;J$lF2@_4;7%*WKfjt^L;X*L(Xrao2wxs?>HCx7@VdVYlN{kU6*< z!rJ5d@;m@fu?)wdH|!w+61$6EeLK>YGd@_d?x22_lql$tA(UZ~U#?bBb5$LfP6u}O zwdom`Fr`i{yooXYH&4#wZnHcu z3Y9glpY(s3yc@c3#T-}oKEn$*_Yy9u!P8cm4x1tOuN=92G2SJFGY#fhdBjbGXz{3u znC@tt&Hp_gj%7R*aVFc#G4KEe&_Fno@UGdvprdT+YzN9xoHN6^u|3~%+9YDZ8IAxA z1z>nBGQ>}~R_g8g_*-$y9{x}7;4#pv=GnYbCOA{ZB6$PLOQLfF z#j`Q}@(ebga&<<>er+}aN*yu0j!AT)>!!8^tA?u>S+>oPW;m{6jV3@7X(F_VOPdY; z)im46oMEI!e)A^s{M)AS#&IRTn8(nhRF5>G-Ur1Y*DxhL zIH;hPz#DlvEK0fHL>$Bqk4{?$hX>F154ZmfOV%t0H@`?qj?jDtUj^_1^kmY{1zSqN zloNmp(isr1vl;8&d{AEO1z}T;lnV^X;n~msu1&{RTL^=l2IfdH0i)^#ro^D)Qqd~H z>{*=pL_x>)VNwCU+fYmvpD#l@ee==%sas#&8h6XNRE1uhK4(L?g zc(Dh-_YQM_=1C~pfS9_%&9u#)Rb(`KSofqrW3aN=l-tJ`9z|9qtZ1A>*G8xfi*LNJ zf!LPQU&XOZD=<0dHF3grEZ-XR@W|2-Uo0y(Tg!V~=LRMZ<}grn-r?prdtaaIwj@0l zuEi%2M~~vul`tUBz`);dsN|TS(baiM#t&O2&)O@SG*0dX2xsR5b8w4f%^EnsO?tPz zbGPfUW1iXehi12XEA&q}xP&nwN9ZT{9kjMd2tWD#)$_ys)-QWI#6jR5>$uQHi{Z7n zMS0Xp6uFUV0S6e9k5)_g#VcXgWyo#y7}7w-f^&vh2984p?Y=qPJw7lZF!||t2%r1v)zo5tGmQ-vdp=>NwLlC|dglrNC%OBOtR)O1idRK(fLqi^8#T*?j*j+KjVJs0M(mbrlG3q*Z`6rSs$Bhz%Zg|g-k(Fu`pe=i za1#C$Zbrd_o!uAV58-+g{)Wyfpkm`;B6-tpotqtu(*wwM?xD7nFEZUIzD`&?xVR*k z{u}AP6Zj%lyGzC=kW&O@Ybq@HM%*D&c^mBmYGotk1-CBz=>wBvq^4>gEVi$P9&QO7 z=LQcq?KDa(xGs+3+|6M{gO*%;@0quT>j1qMNf(H(?ptm9;#Qm#w&fWM)h@bIE~cK9 zlYqM(9-{ivbodHMGKMIAZ`nw)ld|vvdcxX6rPt$B+8d`*Iu7Rpkpoe=@||&&XM7`= z`wpaMUG5SD|weNZ&$cfzu=Q#UJNU4x^Dg@g=91Fqk ztaD)-FGBSPZX1Y)JNkTxAxHKB5k-(Y@2y*7Fmy1!W}FJhQ}7NOZXD?8BxVGTPhc*l zGY69x`+qfg%_6RMWW(EIaN+GSnDERxS!91gME~w2|1Jc7GUPs>-FZlTyl^U+*NJ={ z5-+cVjVAAp-2Wr@|6joUKk_Aye93?gMJ?EV^QO^Y z_k~92sfIbI6P#6V(4wYZZ_t_}Gvzn(nnLU~T3f#n%R_&Zt|$dVSBjve^ggeIg}#Zp zfi5jA8P5?e1qh@GA6S15Z4ByU8U!QY(scLFZ}0|$nvOeZDzqLZHhxNNq634l{{jk+ z_C5V(T(5U+4kP<5@=my3krR3AK5dbU=b&BF2dU49~@Cx9ItTa)oyVUFyI$|Jt$~4FosnQRv;^ zIfC?-=^|LwZD`1c7NIcrq2~FfKlE6F>YKMP5Z`A? zkC1Tgc;it$0cfrXPAjGbG2&wd@2^Rac|x)lQsNE->G zXDpzj9&`|9&GHx7&jh9&x;+@!oerKvh~INY*EN}r$hBV<^Rz@&mt-3RUxG0`5#65(5JD!R^@E;Y(NR8gMD|b>n`2G1}TyOE(098?q$(! zFNEN@1~4%n%mJo)W9&p^vwM9U0um*hh-Jbe>*B(0+pq?R87J;C!NH+~^Chr=oS{YY zSon3pMfiPb5vnCEx!su-cDiT6IvaYryy3Dd$~y0_SGEQ2m`G}bHo@(MHj z;LswNz`;zgYdpIWS)h;5m4#A}^8y}V_4f<3vY0Lh;94etmUOGK=l?&pBrRSFK2f>0Fk zW@&LOU%NJsoK`0Q9&A-pE>aFhy8@7a%}NZFlsdu|%>3Sq6ZlJWvKZb_f`8AqPJY42 zPrt%z`hIfw`gnVHk>^~1YidjnfIYzrt_!!Px-vqlpDtyb#&a`Yx!eEdATaNK|dk`e3R_4K2|lf5@I z86B6SD+O~B8AQ4MN1nbm)oumrE|%B>l2=-!9~6F#3)cS#kBIs?UOW?WmC^26Vy7D$ z%6BFpe>90+;Jm#3`|~@PoyGaO0lS!R=L(eD59du0V{2gJ7fTTOn>2FzhlzT z#=X@VNKx8m)(9nZ+3Rod{;EDZG7?nvDsjx;$ZN`C2DLJ!giB6LF2X_@(ZkEcsQLKU z#uCL8>3x(**crSAeSRK2MuSq(clt0?Qb_x46m$wer4VZ2ZcZP?{Vj=Gl#4NR@U-Uu zXn9w%5P-n-O3P!bhO(PgMc%{XQj8yO%B&)}dsnvaC}*SHhR z?!YoT=ur*qb{BoZMM7W_9-0`)bpG{OtzN5d!q=KRUl(7_{{vquT-a7`p^6SME5*5f z30C<%^=Y+c91W~K-r(oafQ$z+#BWG^$VkG``-Z-Y3-D93QERM(B?$yxRT2y|(oMnN zNloM}a^wR`)HxABOgsu|hcc>P3vPsxn|Q|vSHLLamDHfM&oma80Oe|WIjOdvRli&T z0A07jiNHj+2=7F#QfdEGd+Y}*FFd+caW!cNaJ9p=i}@PXw?XtSMO8H-`z_DUj#v7H4SEeG?W@W-C0w;P0O%Kl4Yk6G|=v#feqn+||#xHiqf;kyD6nMlu z$9wz(i}v@?-i~D3u1y;`as>>qA_3!23J#*es;*ALRbTl`-g8zEY3tR_?ol$1@vCAu zMRjJrabOx-7bXhS{q61K!RSSb4N9wfuY-H@X7uQw%=p85^JWI))3?&@o88?vr%Gp` zJNzuTNuoT8T^)%Q=er`Y8u~4CrlEAjVgIys@(Ub6Exf{p0Yvr=4_X{{Ig#*=s8o;y zXG5F)2^8Xdn)x*FeY68;UP*P7IR3*bwWL3YKuA$JWE4jQ1C-K+M#ewADBYPn!H{*INR6$O zZwI{531baRZB)W0JCRt^u6v0L3b5xC6$vd-RIN$z znP}C#mN2eq&phah>HH<(c?gvTo44WbnN3+=-j0v6(%~nA$m`n()t< zo5NSH*1RiY5B&|zuKgF!ns}8~3#R2cY!r-W_uL&09FE)%RnNOtY3KFU{x#Y{5W{MzrX!z zr^$g_j|NtCt+r}lXgKsUM1$V{!GJqt)aw{t9|NV)<$1@L|GV*hdH(0}=Vgpz)V?AJ zHk<6omkV$X#tW!oUSg=j9gY$pkPZMT$AXb_c{H&19+{XwOz^=U9 zKYWfx{FBo#%A;qoz0Ih)i>j;_+Dw-Eu4msYEsE=}T-Kn6fnGCsi+W2^Tat4CSz4Nv zQbl4GJt*Nc*$&Nu$pIQUASUd2(?c`7h(B#SGwMTcP(QbwdLL_C)JlR*G|4J5gMXEv zMMsfFyfP#w!o%r`&TID z!`b4CAaEZz$>upsGuqJq@~&$7SxV+Su`lM8JyI4)NO6;}p7YIn>Hr2@gIy}e@SZ$P z-pHS24X4y|l^0O~Q3;>7obZi9uPC&O-tdL-5ARORB7id|sabpzNOFNm<<0vA!p33y zyiP|I5EA&mY*XJo+#lt&s*aKEox7deW`(SxG05fl23s}D6|D~RFU< z`Sr&ZSI6!c zLHa=8A^_$`%UcFEieuHE!y4Y=#L}9h3l{JY?*WCk4`037I@qZI7~5gSg!ewL5CKI8 zT6BIw4<%)(YO4ETFcPwbsYEzf0abbx#^113P$ME6(Ay1pv!|^jN#s|X!lR7MRxqq{ z&+QI<;f#b4BFH0#wlm;#gLdYe@tV9*Lcb~6bJv#iaG>3460Y)uUGfmeR! za1&Oa)K-kwAPVCVz6j|2eCSIUN+p;yI)qniE6iCMW#FW_LuK4l;;sr>0-Rf;d}3Xq zQ#G;621i!}8PY?>kZAz4R9RT4aJ*h53HzGVNR3oMt7Zzs?c?0AOj0Ne_LuDulGLI?7PGfnkFqYk5 zi`>ykqgj~;@_lr&+N}IUU)GwH@8JuK>|p=IaE3sGoHn|f>~FWWK&080EGGXh?Qb2t ze7*H@S9u|xP$1$R99*p=`pZ8v`p5-{eychGAr0*wA0HkYZ&}hc_77jSUhKRpCCf8O z|Dfn0%ZlaqfE50g_V#<A$IGCCR4DC+4 zowX6jNXQHu@|jV!{xntu)f2@UTBxM82;0O;g{G=tD9=ABe-7Uv9FTyczvm+l2w+ad zg;<37Riqp9Ymym=t1PsFtD*kr##TpN!nC!@R4G^ms3xa|r#c;p(BBg`&%baz<+@0Y zA31$kA-N(7Sg|Z3GW~o*=}cHkL38YSdRO4tuD}!_t!QXM_dXH@MxJ_)WO|gl}bU=!Uq9>!hid(cT-moUTkq$oIRWfoGPj#9Vqand%?aG z!5vM>2w5F2e+*mJ{D3>v?0hug6`TlA2~Q1P67;n02~CSQ)=YF-Hq0JOg#8x)LX-yz zd^vEhVfj$f1aRmRLP{|nlDAAQDV7=Z$-nK}z$+Sm4$Tg#zuFQ2o?OU_BDZGRAF*%b zy&Rli9x)0F9C4e;KdNuU$ zJnqTQp^YxP0(uQML>=G}41I+|WCM-?#=Ld>vR11lt~R2aHGnt=EFQ2Ec+92N2zXzD}mxe zZ|ISSxAZDEOupzczp${l$R6e(bE&Jvame94kpJ)DKPc8TaxM)`lrqsgh$aG?2j+Y+ zX?0TS2oZAr=g>tENFkmljrXwyLm2G2L$yqh9V=%G=GkH;;lwWmF(BV?BP;N)fmJ}% zT!1x(Y9!vjSrM$8R4qW^CjL=IK+jn9D$EuO!2w^b8udh$L$EQZ%GUGko!u8Nf7$z=fA7CKI6V5_>}w#nQmM4N{mWr%yJ^tp zf%rTX(*1j>C%X}fYW!EKI^@c(l&IX?p0z9QIU>VS8-#rUrt(c?bMu=y@sn@ZIG3ng zH_s_S5KSn`>NmHGh9Npr0bo*V0K^Sj;C4W^`r!u>wO~EA_TCulwZ?nnCqwg{!hdS> zB7Qr3p>B(TR;o@#O7e>T?EJj=s986b{E8xNsKD*W$FTQ;O{zk`7j?C&*sjqs@Tm6z z6&>Lt%@2&l_5~XGPYS$bwJQ|uI!4t~J1vKlRGv9~;QE>ss#g)IrP1~6oJARt5*afg zU%Ealm$xAbfuwop7_Ux#2mX_CZN2BV`TC$esL-i~55p&Dx2lQytBc0Y|GYdpGX9CO z`I>QshFllJ8e?ogZ&Sdluziy5rCtw^B^Z#K@sN&D32e{dJ|IGRbUEwF{7C9L;oyv4 z-?#flwSQdUN@+6{U4wvHf2%AVVurk59!{cwUlI}0yH4?i=sFP{a}+Y>NC`;4{!;S- zPsHK~R%*yS=w;wx$b=EPw)#>23q^f4*@l`p6W1(IAufwssYp!wCR%hoL|DhdP+#WY zR*D9q0TvEQ%Dp3@4<=eGVF1F%e2UkW@EnHozrGY4$`M{buYe2zmdY-X1z&2jYZy3_BmAYq2)SHE zcOs7i*wdKsCsUb&kq40QP@W*Xr0yu^35bE0!>&0HiC+`o3!Mdb7xm~$WQghw{noT4 zVO4~N#acJbiYU%DZ>3B#p&BWmSU%*KN_dv_%syVPXKTKTw;D~f{s7Cm4M!^Odg{GT z(N3CW!VcOuxBpnu`N@AA=^W)hHobqm{X@St_>a~{pH=RJW8oJ_u^hV0n_EpdA7~kJS zo5Ri4)?IfpynVK%w@;)BOui}ZGog=?FiI@T*aB#WBbA1WoH4q+!Gc^2yR7K&T~;)a zRh5!Oz(I!UYLWLC=16n}_r-}}`R!Un4P~RQN)$IQPzd7C0-iy)?pY1mZb9FgiK`Yy61z$UK$h%pzOk1prO zqHI|>I#jDsWsH}v4g>x*gVmr%VToUMw{`&E)e_=SSZ06k;NKA_^e8MLjCdzX3HbSAAsFUH|#R19`)Ukx^T)1_v`BN<<5`_sKlL+o( zvmCih9QY`=%)zB6rAds?V$?x)@ak{R&dTMp_h<9(>L^)$SHG;hFAJDr?*QRBD~TcM z1eMR;QqTx{Wv?t7*+=lQ$ORl6|ImlCd37A{0N0~`JFqXWd}Co74!M=as_|lAS;mQb z;a?+hd4WzXVk_=B?Hcn8dKZOF9C-<>>xsJT$dLxFgrSf);d{@oGTEMWjp<~PF zTLmoZIl8MLRRP8gW7FC`t|g46f8A+T=J`vd9Lj z(A%&fg?kyiL&&&XRC7!eMX8{O@evj#7Nf}uN79F2yLV_c6>e-OWc*gEl66w4On*yy zcF>X%=0`-`qS=}=ei00^H0X+*gNn$2@_$lJf$)3yHTWjKh)@0q2B2I{*pQPZPti}o z_wZ}*O@0xd{DFUeH5Ow|94dh+Z?cLlj5IAYejy_3J?E!cYCjovr&3vrX<&#* zq5nAcR9cVAkpN8*bGjz(l#NQ*i%MDIgucf)&p6MCIE_EaufaF@VIFK`=^dej)vv&^Xr8|_d12+s{>>HKRDR6c0ZAAd8&F@#>maV&osu%y731lv0qIx>CdZE5GK559hGW?OoI|(?7}y}l5oJ!aT!YJ zqvXcKK@jv3h50w)HXiJrm5LE(GDYR&{yA<{sE6r0z#q~P5KN$9oQ3#17&_z-uik)b ziq_BOm*|3Fs7T@06@Fg{?*OQ;dzC%HW*{&Qp#W#<%`RuS?g1go)v5)2r9& z)%qoT{sB^LeQwUc5J2#CzHZFT)i?W_H~3$LFF-y&e1q!5V=-)Tzfq_T@nv*#L!+oH z#%q~lFE_^U+&kDitp-}Bxl$O^1F$XpQ8r#}{Tm?rFF(Jc=UkG*%v#&7w>oql1~TNK=`MUnlG-`1aCAR&wc z7%3Hh2nDUKdE1gI=&)$Q<4TFH1_uID<^4Q*2*4U?&++7%KiS>E#G(X+{TS3{%kL$u zf%VZ&1SVhPgtm2}K-fCTS!-v1|Mc*1U#Tjd@+fucPx z2n!t=+X=Afc}`e;yWPV4@(LLFs90|>UP?;@4vY6meVY?5PYKZ3_7&z=?pdhsYN5oY zfKM-!vlT&O1Az29XI-qKRK<^+HTCN~3Jm>4PH3n^Z_!0u1ycC10F+4mBJI1e#@)Ov zbFlE}0FVq5aK<-gM2^EiacXHNy<7or|f99XS7O49o zQujrHy8G%B?dP4LgI7wegI9UmI%ugU1^&!^Ufs0Xy-o`NTR^10I8W`c3ZCYK6NCv= zpoF0Vb5hqEO9#LYa@Owp;<`XsUp~qY;pAxbU|)wokMct}*k3(4(jm~J{1Dn7TfW;O zvVy7rTnHUrLV=>tG2VYBbge*6=mQI5!M8BGiULx3S_}>}?8V{W)0}WRRv)v=v`7qs z^U}X^)v+eM&Iy?&re|IP_n^<8{-QWEymycc4&UU2NBQI(7xgp|c#$`SxD%MG7Fr?k z;?@WJp^rShP+neF*@^ZItx7AmpJl0=8bD0CdUQCcsr+<)wBm>}$0y zX*0<7t&+U-QaRh%-d4bEZ|AKQ#oO&7SS!=>DD}gPJ^45)t=lhi_nVIh@78PaB`NsY zJBP!fZ}+X(Ns?UbjxE9Q)b3dAZjRPu(Yv>3qvhVu*Cdynz$jbjCe$)J9dt9uIb5yI zr2Bx8n}ZPF#k-?aFVr)q2LiQk4K66@M5JByWlpG2g^t!Fk{^4Qzo#$*1J{ipiFjCy zLmLd8wh7PAZ70s1DKGQV*7N_61v{ju^dM*LS6eUlwp$o{D+CZc%Rer3muX2N1zbo= zgj|X;jH8N<+hSi+ASJyX7xHyC3-EP!T(~iJvnVfbeP)nyqeIH-(S5x-P2T|;!$pSe0OK>RFlc^L0-9h??}~};m^D} z*vRM)i|B8$?D|@?_WD|0Jh9JpIh-HlmKFw3ILg8)PjhPnhz-N5DsY^5QGiLWi*fu^ zg>8e~1fE}eJ&xwPg>F(}hqgq@TrW)>o>(~dOd-3`>fFLn3$>9(Mh~^LB6%gsE4OO} z402KfDJ2SWvozgai!)awu(sO!G2{voO&#kxOTf^|jN3*E(q@($1A9}jwjd<#L>fTl zZC;(C+ZlFa9aNqcgOl97_{+Swj2rFJ8MZY2x$-pc>|t<^*3c1whof9f((AnEsGANp z_Aam8!W?wkZU@;~OhTHthf~Xp*+vjGE~Aa0Owl&j3Y`R*-;4*ZC8L<70}hH5ZJ}p7 zL$9@;1X;W)3emfQS;T;F6xk&Ku2!HZbWTO2GobO8IicFll{K*a7UjBE0BX;3^C!-S z7HXG-23O-$^jEp}^0j$Ow_@>>Wa(9-g-P#=oz9|CoQ;XS%?+2b{K_LlgQ>mAy+Ud5 zB5(3q+Xoh{Mr6S14gf(RY{7M z$eSYY;_fc$Ynm6H-%xNfSjkOGfv|B0yHAUDlw+DBh%6` zwv_|J%XwE(aLUtSaPTg591cD$dfH=d+*af?jlax`F}JMh^(>SkTC_W&=#x?;x5Ox2 zR8dlHb-D^1O>j&vHeO4t(QV1il-*uJ;lf;4)Ls>NQ%p0_>AHQ*(?fec4y+c%7)}A$ z;<&_PLQVDhi=*s92)yMg*+z}w+$%O1y5#V`>-@$%0sx?t$d^^^t2DrrC>{+AQ2ut0~ zt`%=5t<)Xt29ZY6icHLY5NR)8g*)02qHSgryPG{B(ojaJyVw=dh)T4~UF{1Q$})HVniaP%=mVXWJV%dVm$jt40i18cy^H3T8;}> zHGD*XMqiC%7m0$5z8lLv5&;^2Ii5Bvb>jtZ@2EpbWAPG-jipP8uV3WlcsiAYH5?Nz zYf=)sIY$3dI_BMRr4mSGRvD)>YA+0VKz+ zfBv(ze@emV@#_ECe50iNu9QAwPcR9gMRhQVAw^mBIIEaQDYkWDoXHE{@J(FQhHoO! z0$tpN5B;(&zK4lCqidB|NPNB!pZoak;1zy5XkiQT9vpwA3vKXKQA5G6r2ACxSicgb zKR|bJcoMmm1W(d$6T!=^WBS9leBf*Rk`9g!FWkT<-<^Rk+uQg@){*PZ14_NAknvhx zEyymyR{=(V(R}2KlvQlMK{eGK9v;Tr*@J?rA2~nFR9z(%>D%q3$JgDYr>vL=nvZE> zu(N@)F#OOQei6%s=PscpI^iOE?j0d^A4>FRKUYGaz~2;prKv0s_mY(i3W{io0jv>< zWr%zUvJ{TQjXz73SrXm_G6wZt<2m3-gbR_IN?qf0uLE2G#k9;nBbH&DL02u3Xq%;W z1B)a4QVl5xBK(?m1j8%+^u!1Hxfc{s-gzk?DUs=!(7WptN<2|@$T_e+t(efXCS!lv zn^3cvz6-?LEG1hy)<(w|RcYziE1slj1Cp>cBU5ty4W3_l1XF4;`NxY6T zWO208ibl$K8O=y`B*+j!@zBoR^A^B=%*^1oa+x2Tp%V~&FQ2^+0;atc;m_XVV<`1b z1R@knLK!fGDmJ-TnTrPC%K>Eg4!jZmq*I;WM1tpp^{HRR+?*j+fpZvpZN$YZ`y2#S z$MSqxTgH|Z!P!Q4QFe*j(Q8w9r} zLRD8162@;3L`rIU+N5`px{($V)R^#8Q9_2l^dbq8F{5fA(g|FR{*H_~aVivN6Qt28 zei(%P>CO}J*9pE3Apw?BXu?V)JdUZyM@_w?WO1-5nq++$^e6G6DT<27k|-oZd-h-n zMb(lo;~})LWcWT#OVr8ZMwf;+19y0N6=aB|xZluq_rf@X{cx9eGVJ_(3_yLJadZ^nV0j5ZU9SPD%+1+E28`W^b2{owOWpB`~ z1D&a3RBKVBc2!=C#0YJcBZ(c1BhtuxJT}P2sqdTZlrdz0( zaJy_g4P#d`k;GV%YUFT$hJnN32R#h-GsS%r(ZulukboXNRAT=x12A8x%M8o;$V{A6 zO9+Kp&7kDkuG2+8F13S{7056&j9Gqvvx4TkF2+X2?7m1%d?oa`>3R00gIzPut+t63 zC^IuAo&f@Eb#DREx&4?0zy)mXo7Dyr9Rqg1&GCfRTa%m!BU`|HLU;*Et44kEVnI&B(W&!qI~P6rNm=pAP!B5VsL=-P%NxHHZzqusSk5RNx6 z9T{as!d7`0Fmz0#d2U@$9AkJ+Nq;cY%NhE}PS=0%Y6Pn>3~*Kgvv ziJ$lrle%c;&tc|A(^&8@BCxfH{f^)hKB0xIm4cDIUl{gG z?}M@O>=|~T_W_ZSx?7_(m2c>up7Q!VXO0dt+TjRFpAB`!Y9h&H72_uD9KM3b(Uvf| z9M@eeeIA_+FL|E;cGNU_S`tfzfSIub;@RhXEtJW^qq)#e8H?-;jE@FVAVde5f&=UJ zL^=nNixu{j3ZPaJ@wcxi7B;uQbQtI?CF*$36B4G?kep9NXF|18N3x$B4|~w$^t*3B zdhiGEQ8`;_JgvNk#t$8%eR~NTX4yD5y(`+DFlojab;AaR|NVO{A;rM@b4VP&0odOj z-~gV(HUakggM$q91rCu@A#niWYaTmx!?<>bKzd-`!Fu?&hRGR)07Tz~(`6acp8+83 z1Cj-kx@3DjPDU#2G2yVwH*`c&2JV|MoHtSo9yZ7qm9w+K8Kqa{u-fMJ2bvJfKYE5<+7XvZP?hAq#l&?w)yNxQf`_J_z`fP^8hl~w>{D3xw(2hvL8Cd5e9k(_$5ZAZM8_^naqyvM|&su_;ObdQl{jw^85qR7?&0T(4)+}q(U5%XUuU6s80 zAN7;BWlF#FE#Q0kU9(>5moD+e+dsa2xAbkjUfO^a=$26WhYzn_3CCEj%)@)%pdY0T zr%NEu7HVgIH`abQ`+T-o1E82O)~ECb4S4&ue0GKjp1!MJVyl1Dx%GK?CU69O&b?S2rx)AZV~E|CFHN$M@eaigei6(g_-bq_K=(7madR)PXNr0c`qv*@y3qCsHX$KZ8C|-9>n>4g34= z?RT<#I7gh{>2pYq0$`1xCCr|TgqTlu>pvX3@ok4^2DN9&um}8 z>)(_0kk%C+(`S(N&)$Yw`~m#Ci@h@5|Iw@c|TF;gz;EM&Gu zU|Gq~%4iEf89K94giH(No9*=J%rj#R)CFMU4~X z9uq5CQyIXIeORAn1xVjF#=9lz0)1=JUm%4@uz?67eciwhdOpwJH_n17+<+&S{76n@ z@JLRkeDKG{5<%Qp!t?5eP6Td`lAGgk@UkR`FP(f%*&i(bnb_qqb_XEqT$(^KTA~Wn zyyMGM0>n5{l~nPiNL2!|WbJ8gf(^(fb}wK-#OVQyq+sNg-E=xI9gp;2*gn+sYFDUQ za}nwAtQ1)j-zz{X%LZnP=yWK}D*(ZvS37Q-6nc0rX=7PtwFuEm+aLNCCy?zA+`cuC zNuaSwGJUWxS+gC+bGI{WTjAr9sv)4`-9|Nu$QVxT1Stxw8`}$d!y}^v*Ouv_s_9BG zE|4~`OXDlf%uCiCXWtLm>v|}-2)>&8pz_hxzXaLz%hTbTC7w)}amLijLTwu2$g;5` z@^+bnfk~;-DNT)BVmJsn3n(hCkOFt@57xB}GkAp4a;`rASq;rn`^0vUQOg|0gJ1De(pJ4ory(I#@Pb5Cc0d% zoGqR$EWG_=Ve#G4;@KioNy=qeKZ3dq5E05}tL3xOj{IeuJt^1wX~0wfN|jZt0)3oj zuh@=CQboT+8I%2@y-WfDy{1oR#G0WpbpU1QLtlq>w%8HOOgmd(Qu=nzeG{^VprcaG zhzM;cubh?2^~-!>Msbls7ZP?Bjh!qZ;WNrXXFj1ceJn6ieuHUSM}n7NRGF)IiQ27N*UmNx`C4uJR!vv6{1r7+dF=t`NFrMxV9dn6h# zcElH|;#fC+bh_q@V-V-Dr8%B9;yKWULk4vt$hqiPZA?BsxLqa;vTn>?ziTZEAi`in z=5!$LEz0ZGIyroOyuG_DY#RWCeBj8*k9c6z(Aw}w0CCygVtBV68Twcs8+iYO=8%rn zMtv_F*bEKxDF;$whyYE@1PR~Dp{yvhr}ZV6DlvDmyqG&!`lY(`?+`P_Nb(s)W&z>z zo#itluk0fXb7|5~GAAn!_fn}uN@h;UST>A}7lv;1H8y^UvIIEbjcp@p_Ai$>`J&)? zeDgBmLjh0Nb7JG|i(mG)-%*lQ3cV!WZW1N5ouL(4gq8YOG!Ez8(#FyvmEYK30=l`e zjSo`I(pZ@d((o<842>|~RTsqwn$?YJ_;@LJEb4EFPvAM#9;3<^gs;}#i<9O&{DDXK zbwlL7ypgjZp3f`gl@ylnl-yz{2{b>9&W4zVed?Fz4hL;49(Fj$mP)>>w$mT_9;crc zi*&&>(G~a{0KbqfE{4H#anTHgbRVcqS-2073&5PQFKwN;%PDX0g+1^R47JNF*ox=e zWwzjc17H?}eTIDYZ05z~4bep+HdgSP3kmz!xn=Aeo>V>m7HJNGl6GJojWnY%uV}pA z0O9Bxu`Mo`k;d>qpWtD17VybiIH=Lt&5((Fzu|$009b6T3qap}C+AFiE-E6H$hK58 zZ3N~%AX;dWhUKEklr9t(3HYidDvtC$Ooem8jQw15#aI4^w%zk_!5+5^% z&(s?D=86a6l})KTfg{Hu(G{lm0m-gN(jWS3cz^^otG0}=D!zcl3yFD57lAHYZXcC4 z(gFuZAP`-Tg=>(1Ivb)E{Hrg80-#~M6p}ZI5}Ke1FPG}<8yPs0(h!@KuoCHYD(`XK zl*wEQ?M|Qmc>Bi&aPpr%ZF-+J#P?<6(`BXf&HGB&C_t}O zuf_Wm6ozikM_$UK>2EE`D^A_U{NES0BNJTL0#VfGOMd%n9PzQ6#r!^Lxp=lxG)Nph-EVmPby*Evj;pi@P!;h zs#QZlM<7%*Z#Vsc@kV*RVN~9r*!A|0`a2N4>huNwTdFV3SB$ey(DiQ;YSil>vq7;D zMKVF0Ez;YXYSIomO8x=r07}8K*8fntd{#eGIt}0F>wgnX1`&-Ei}d|Z{P>K2s4`aK z{@0dr7taZJaTG{0Y}Y`B{Il|&8AMz=mJjVgc~f8rxs|l~yt;JsVzC-ZgMfiSam2ye zqQHQbH@v`*uEgND{h%7!uA4ROsf_-Lh(vzTI)r-Uq!H;|B!xVy;bHpj(ZDTIMy-HK8esb}!zbsGzi4fBOeEyY#7Et9`lz@>~}^2zO-!EN{_rd9mP> z5P3*^o774@+>ZE-wk5iSpL<$Ss@uQr$am4_`nXGTG@q#Lx;6(L6xV=Rvd?XhVsAG} zk#6Yy5}g&uGB2$cI2V8{26;l71Hsaf8=Yei^{z=?ldCj?-w0YfOPT>$Ob%Ho3IpTm zA(TNn`L7M}mAbMeSwSRQ(e_2x^_kgB>J)#b^+U{nTv-%|yD*s_Q(8@!%fz0HnjO7v z_9WGnPO2EBl+r6kx{@YWyujT(N84193F%o-WA6Z@+5LU4A^2o{p#Y{R)C@|?*;L;p zjb1AsN>{J`y|Z`RI%>{~FF|j_?~LAX%XMx$fRog=gcY_u{*8pdp&9-6x+dK-6Sf9& zHZ#xhl19h$O-#`ROS5diflH35xhn z6?Amz(~|5bewE$C?_n?Tm*^xNZn^pB-?okq_6}ZdM7s+okn~EwbkG48(V$vYdW%W{ zWUSK|@5w-3-TXX48HThAeEaTFyx_Tp=k!HBmh=AIy!a+xgp2Uq zeDGbq6l?O`Jbw|7@#59rO2$A=DP!ZkWsP5U9SEPp{*M1X@F=dx_g!cej;z6#(CF+?r>mJZg6t*fzodfG%#g{^C z4{DZKKQhag=4D65S2=F@utDFN)xWl?|JQmazpPY$e7E#-{oC`B_vz<|jPvuS`IsQ| zX%og z)ki3QX^`|H>XTT5@uKR}ptv{|xs>=3ycFjazZ5_C<$S^}E|sMQxTBI^!ltuwCaQjZV`IDNv-L&@^{ zO+`h{wZ(OWWO!`GRY213jin|+mJ)k%3x6fHFzy)>TE9&oI2YCcE!jwJ@F?%HDeByU!vlDTAhrS;%e(01z`g+9a9|0gohXp|jJlVe;TZ?>$=;O_O^V9nQU{4g z6lxc3tx$a%0YS?pcvj^VV=dm~_!t2Zz7FNPkv?si`+@n;jbCCsIa_7K(>w}AY3vGD zvAz`7vH_DEYM=044#kU#?S0i_s1hd^!oM+8YlXL6@2uI98q|(`p{++kTR){ZGZxa6 zhM404Ube4H=Q4dmq!yMMQ^n;oic#XRid5lHl!2a=zPa1vk=8co$Sm-o(5hFXJ%;`Q z+Pl3z3jN_kR6I7VlgdcHuUIR!%wEeJTsD>I#YdiR_WHoK3>_c+{h$l@lxrox30$?9 zhG=DZ@IeJv3eC<{gSw9y|KMmfL2*IR(q&f zYl7GiX%uTj6{1^;?I3!d>bfH}-~jeq9!guUc6N_ir^l~%`CKZ~RnWibJUi^-e%c!P zF77>p<8T1-Qdh!D-=r!A;^+Xyfr-Y z!Xh^ly7tWh?D>{B04G2kjH6@u7;g>VV3+99F1|fI+&SDpW(C`)Yl0-&5$DWG8od6e zXlPvW*#+JOI3Axsu!9Ruc`)kL+Ori5;D}11K`of%NSFh*M6r37&7FZ8$4%5<*^q{- zpsa90&|t<21(I{1KhgI;UUZmtN& zGWgX)p9A4>05UeY!@qhVT<+0GJnXZR5l%RfFZUvFD-h~dgrckc@rhLTS1mN)ZPd^O zoOJxeEMYK6eWlprbc=#4150@s7<#1#bzq&Qs1lxl1b7YI1a|heigBAh;D`sP6NZ|D zAznn_3*}s?CThKenW{)HEq3OoCfMEq2q@egF7fEwFt+yI@cp?fx-m+(J{S-=F5{f6 zuB`pQdjM~W!@vQt<>l2Y^!-QPd4PuX4&F~i=GiyaR#sMO0sTZ_##{cw>{Y9Bx5Bh7 zzgcDhNlq$t`@g4B~&qy|&3bt2zN)C){*eaz|o+t5#K zKB+g1c84cd>==#3mc*Tr^{+dXjZ|JLtuSgRqH@m(1`)Z!v*8*&V6F#vr9?kbd-6oO z7?_vD28CXHGD(1PFd6b-0*+_z!gzV`nzbg^rY9rmbe555V_XC_E)J}!j5tP~x`9`% zxWz+9GA?cNtbB>U&dSCDG=F^s2j54OgFN9xEc}4cU+;H!NKBB~h2tIXzbLJ!e!G0y zQ~e5{jO`&WR!ul)D68a6HQU-bMHZP+oa6Xw#eUhB4wl&ZSrDeJDvDUWw=h?78&WyK@9O22&^sT}^X@ zBMod;47#*1bV8lMo>mu^>^b{41(f^DZz+IGdH(p7aaNueMa}>+2a_ptFd5d1V44kA?W;8xG)+EGC)({*8+%i zt1FE)=|Z}=&$}R@i?@P!4J;r?Af}w7(g{!nFuP79pkrU) zty_3RoVKv<4|<-ISP(v=L)SPOo_B%B?8A&Z7!d}9P<-NDktZYvDNCJAKvJ9J7Lm{z zFcq2*tq73IFl@R5>|@UdVuvo`6*v|qWo1|uOf5h`ri6#4bVJAVd;}TK;l9ZX8N*QJP{Ej2nW@XUg}qFU&QC4GlaJx0KXWr4g&Yj-svxg zuTPDwgWu5J*#-gcq|JC z5)u?a0<~=RA;C>J8htUy7+ri7M>k#F;W;IS19s;!ZSj9z`F?++UcbJ+u3b9Anmf3x zcNvCP|EWfy{!WFQA8Z@nyu7qJ0fS)jNh8P>I}THm%$d|m=0_MBg?xpYUbBMXZ!1i% z1dGv;A^KQ*Bts4BfrNWQha<8f|Z6iY}684wmGl;6fXzXM_YX>e^cfV z&$D{xm{%e|_N|j9=APU-p_teE`(bprpoqxdLFL4EEPTir2Rg%EUj-;~d{AleoyW&I z7MN(H(vmAPIF*JV1U8;KY}^;a=bYbqBFRi}oW&sq&Sj7aC@RRHFizKPpJrVK^_Ku^ zB@Cs{*OBD64G|XF=;5_^blGH? zdznB3$s++ApGM~IR#J1ppl$8FsflDIL3C<{$@$Lb)8CZ>R~Hx?(#&hVq4Uut)fUG- z6HyLooX&-ooEaX(HHYOlN$n+#^=W>CJJ+~G7zmmw;}^O4$q6USGa*T~SZ2EHSBvD0 zAsG523GE8_qo5Z4XaOT+0y>1>=`lax60UshdJ>G@I-`~Vr2OC);*mtapa?_TB5_)q zoWS`{ral4Y+3yd5mYwYG@Z|39aGZ$_*MLRnBWW^a_(2cEiCdINoEmV{UiOJ)Nv>KlF$>%M!u z3rDrzzCvB~Zct)3C<2vzIzU96g`n_@pzw>Z@biJL13Zi8pyn1eN6j+-TnaG#>7EX1-}GTz~)F2J@dxy4SOO~4>K)7dO;F=gR#?F z@DfRE@IxVq#FelYt+C*^gB~qN*)4=wC*M;3iuHEM$U@?3N?ojK-B?tWKe1k@ zxVFTO47Ix+-eU!!s9eKb9`uz4Oy97wKO8uGUznq1$k+$CoiUjbm6n;6f(o(_SK;a~ z|Cn+~R-hjx4!!~O$cKZI_YIAW4|S+}Mw^Rb=9+-xzT2YBMs{JC)22v?9DSY!m|)_O z(Y`{5It479BMD%&=Lq%{CxrqyZOtwqbpU>Nu8=4!Xshk2=BMfI#z)Q0|ug6M+yjaC`FHrNNci&yEoVy?z&3e!DB+rnoQz9Xp>X5*FA zS^1ldB;BHBBhMl;XnLO8#>;|oUGO<&6jHc>^vqqPE3dy&iMrS-rh$35 zh%10P0mCGcrVzu01zKuej__r3KI0`%;I<*N>(n@9A9inh8(-qj;4K+Fy;_*bkIDs0 ze2NNIQjO73PVr-VgqboFkr}Kxyc?L;V(HjkxXt9UR*L6-lhigfIh-DiDb@#!Z7pLa zZDVkRt~n5_YH}vI%m!tlk&WU;r4i#3IaKn5b~s2Gres0pC!rght!`95xKy6e^XwWj zvt8e`2T6n1a@viY1+Da$y4igi_~sLJ1h#R{Y2*Gg&% zKcx-zF>$FP27e&12;Wb>9wu+Gv+R8~fAFdnPXya~8;(>S*s6uxlRQDrrEp)y12V{MLwiX*(` zNbGjtD;tLQ7E-YcRt}s8UFG6W1SwrHFwzRfI0*+DxWg#fF3+t?girb!I)35ceYN#+ zZ@abq3M7u;D=|kykHTOx-Bp+fm({aK4vBvJOUaYS3mE()IHqG?px%wN8+sZ=Dy}`D zX~GdRiLm=ax+f*5cE{NHZR_|22hNvg9`}uu)otVO!~hXk=4NCShWMd^W=~9mw+KF< zn0Bb0#x73iFy01alq6iO~8DZd)Em-K?- zgvyka=&0jaG74QtKq!+X(sa2?uhCG8(F8>>NRI1?N@th4;xl`SO2b-4Moj8e`fE;B z7f8Dl?+JQPmS+cRdog#IC%2|@L_{7$fSG}9;lfp@rhpUZA=O{RA;q;(s9=LZ@`D!s zYR;>_5-(tu1v>a|1<)#hR^Mf}5_=?l#-fu^H@m!+oVMCBtzdBAhd zJeAy+%s3h#m|@5rf+f@&cn1ykI!E1M8wfi`l4gW=7)FTHD!ERWjf9FK>ucj4q|>9? zJ=l7+n~LDn~E=wPNydxquanO0bW38lsWkTU<6LMq?dbUT%OCG3l z*28G2LN`mCXiN>Am{OM7Nqmza&WnsIk(T0=C{c2XNlj_+15s&23klLzvZNK0200@m zvF%LPB!X%U6E7QZFf}!gqtF=yzu6Rl97ph|ye!O(*n3KxE?rEdZ;QD4BT{g(fsMkR zUAfmzP0jSHHb-8&x=t{#ad8q@jaUe^mVyRBu2_5_ObGF3V%|_9tP;&)6|qVkbP8Ha z&1@+-&cv5Qp2_o=+)ACIjcK;6u(_;MnyjDfckMQC3<>rxa{lNHNslXo4x|4LpK7B` zV@VxID5frArwdZ6gOn*S|J6$TuqB=Z78ZV-P#ZRi(1~~{kbrNBfT3r}u-KkNj0{o7 zP7dh82$j@`VxQVpm>m%(JX}~crFEb|kq=7Ro8YOWy@HC%ZO*Dx1@=B09rkw=U6oL8 zao$u?Si7Ol8|o+-t*Nr|TTQmAzDuP$+@WM0R5VR%Fn0B!ur&Z{KSYNwP6}tY70r&& z>&OR!31C+@q2G}(5Q&DUDR(a}43VqbxB$VAomWbc4Bk>a z%uMr50}+YHFm#rtd*Y}r(vL?{vp^}`7x}r98|pKTiPi0!p71OG5R67RYpHWmD_wV! z!CiL~=L49Sk4VBrzHn-QjOvt$R^%N|?_{_acF;r?4BxYR!>(^SmOJ#iw}A^&wN3I? z)s+UXf0fh}=88ZbOK+ZR+BG`>t=rZodX(Xs8EZfiE$y#(n%oY$IFi#`2wMo*k`<;W zWO|?}sfq09sCoP&QRNfJSDHwg znq)dg-L$t_4Es=56mOO|8xS~=Z?nu!GOw7K$vU|sQAs(ClE>PLQE-iVCnU$#3MtPs zTMdpXmVy%m3%RM$gDKWYB@;I_ul!EP$*mTNbWq_zwOCn%et5({Z#2MoZTU|Cx zDZiz;N%6AvV$_I%2KVGuP5U`F?Mvbj6bdPD(hI#=%K>88CVz!^D|E;ufQ>y3VY(qd zeug?D4lhQ=0-;=G>G{D^{58wiatVaBN9zJa{X!ioisaZ}FZ6jE{|~JA22NN*JZ?GwH@--T0Ad z3T73vYCsj9Qz7;byJU9a`Bl2eWKR)u_`&S@B2(QcFC<%|xZ_h|#j*_iTVA$n(;9%nk@eE15$oy-o`!i@+8A$L<8N{tcsYC>;3>>1T=_|=? zHNg&rZZxj0*+eBZs+)ko*dP?KOsxG>Ns!dR5Z$BGJanj*1H!4mgucpVQP@=Cxl!RG z{4h{QuRlpztB7iyxlkF3ACHo2^VXA$pC|*oZ_?u=Ek0@LqiqCSruePu=wr{R)AE#~ z{6JShbG#-?z8NvH${Hsl9>_BXwPCz&?4{{NjG&Pg?!yc7G|5YNI1t9EY+3t>fJty4E3}zCPZ?!l>S9;Y|UH6{|$e;Dp`V zdcMC)p3G3FI{F`48D%Zo3(O)xU@T>CwaE3dr7)YqsfMnE`sAz&&yJLsLB0&9@7oRd^KPSDnv;Ri*@Ktf;qm;g99)J0+#zHqVN8w- z;cNtea>3yw1931=>WIJ`z1!G$3!hsX@9=LT&?AC+G^%@iol#DL2-$`}srpvFUPZ?i z0GD+|XnR@^WyGaKJX%;R{T+siznNc^u~cq?sP;h&p^fknh5ndtG|$TK=h3g;fQp|C za`nbI7}?1Mh3Jvprws;NM~_S9HXNKwd(bXjMx!_oiQ>| zWuvwf2aqz>rGiryhd}XAK9gE~+w8X4`=i|sLM7m}tPggdVsJPL1!V64W>DJ$kXx$K z*h_ezKnQVwu0*z5c`~wG>SO|DCTkayWKY72n=8F&qX6hBVy3y zw{|-y68!9g=m00bd@g=!RnMwR+Hd$pL9gOTO2o~4!-$T(#ga!;EJ;}ouPm3Q?EM3l z`yc<0-%p3nQ+lyV;Og;C+6Y-F&4l1*;I~<_r`s$XX6OaaR zFzClDJYo>4`!A7JxibGJhSuO&D(jdgV{Cl-WGu*df%2Wa!_N2kdmr_;@YM}cc_4_O zz8l1^Z1)o@D1k8LOWYIfE0`xg^iUhQR(gm zOM;YPw3IDP-f$@)7cySTN(Bv=$|$C5#0&;CEkkBx^oc}#gYgx;Trm@0m z&1g_vDkCG&E4iz+d}xu3Qygzb+-d=QMi?SQM;HKhS+Zq-;jj!|B$0RkLp)$s9FH6{ z31KWr+&~l|lkJMJ1`xz+lr#LH1322fT_y$i;fV-@h;jUuG0tLGh3&a$a{Pc7tLPrg zoR)8V83XL=9lOQ^>uT^^o-zyy;%{P)0fdNQfZ#E9;VtTR+CUvBAJYkk><3E1!7F#L zZV<408LC?#ezq}JDk{^vt{2Ar<(c%bEtw`EP`fV-tVJ9G2X;YBRt&HSncIJ(wQzgH zjbYw}U^;2w*T~rNg;|%wAdB7xaRZq<2n{6Vc@Wu{LQs|pOe87IB8ZuQki#|}2+a-g zgmcAkk1$DzhXxY?%R>_Hmkol$3BS@RQI4AUbE8@XM#7@p?lj#`!?@`1h(pgtP}@iW z#d-gfAzYZ8|3?7+DO?|!@d4^A6MyjCcgv(mqYz}cfhpO8yswF-D?DT=Xm>++8W4J}@`xM1#axg$ zb7X=Y_C*G3;K`MHa1vcGO!&b1NTxQC6qV9+1nVdZmz9(pg0jNnFsp_ZOIbkGBPc6P zvCUY?-axUdmE10v(@5Btm3c8fY15?t)P4!WmGVgW9)1nJ$uHuQKNce$rz)JIMi`it z&NP=Iy^B7G{Dz;gK59kOAIkUeYw%46)eJliWGAbufaF@C1J)> z_G_eEP%jDZWu_f|8qGJ)IjP8iTlVUedgV;~t5oWj<@ZM11442ue6A%^1fy(J1oTQ- z^FI+D6hvmWSfCOPPT`VZvJ z*p>7U$VXs`2>}Gdi+gO~=|YEt81g;_Pe-*2tcFKgXNvkyCn4rKVbWI*I;o~DlIYO$ z0O^~}X3#v#ngd-o%mVBLRMp#Kh1yig>kN67&HlzbreuDJVwo1M0{7 zvb!=daI;q8bm~C`+?cgRv0^Qbz|%Amaxgb*MnbCPChkk3i8_ROWOwsKvh#}f>5sD- z`GGn+}B;?J~xsH_sKEQ$aabCS{v=?59@ zMvw`(cqVYi)!8@Lvh2rC-#vxUj!fNM4AiQ~W1KKlEg6r9;3(y81cbpEYl)(&1}8f6 zucYpVrKcdqH1v9a=L%6x`~$*qWwB6r}g!WQvGQ?RsjT^1_(j7WdZtiMmcW*KO!3I_-vty45%`t zc9t72A%(X_;F)bNODPdvNB7v!fi2-)I+z`*1u}t0e!fCf68?28Dzv1iK*}=54fbPk zGNm>ug%)Os6S^~kP8EcOgbHV=G?(XQmN7Sn1&tG5WHF*k5NL}qU|X}gp6qL)U_OYH zVEl&GS4dEmTBX!+OTp@V%V$tfrY@7vhEz~Y#|_B}h&V<j1WM2XJfhY2n(rx_MCA`zsJ67QvwO6& zcf43h9-o@!^F6|9JAMmxYX@M3Lk=21zW=&yRIlOFAFybLQ1Ox+e(}xo^7|6q!ple` zX!IzL8A;gZmgOiZ5!qX!D{^wNB?#v8N{I1<1wm>jGkfA{;R4UABQvU(evpW=lzTe` z7??PZ$=haB9VDVK)aT?y7%Xw%gx<%59mdtr`M?X^Z>o!k53oSZ@Ab>{e$Z>ll%FZf zhYHf*uGK#Tn*8IND%~{rM@2^m1c^pfp=~Gv@~!a>{=f7O9b}}e#LaqbDfpgP!9&;V zPZ)#oPv}+H3uU}8oA{(3>~`$9*zWWCIK)jZ0p@Q;+s{AW5HLiO=GptM7t~@kFk*dI z?b_Mmgu@caK*i1^3jGkc&sjxZQ5zlKxk)2<+8jSDwU^S)4YFOk+N|7gG*Wk4o z>Y~@6i)Oorr=|KI!MTG-yis4S|MB*ZZ{Fd5@C&a9dYJDxz~5G@#gmVsA8reHP%nK3 zKzNx5T}!M%bpr6HcS@I6!!9RPnJ3T(@L$U7odlRq@D>rzLSi=%Bp-f=Fr5IxoUzqM zBQ?`3pw+<|)5S|1Jlfz&e1TLRw~cbjxx~nm^bQvQRY0o0u2GJ_Sxtt+Wz*rTM&Ue3 zhqIai=Sev{Yf@MVE*9_;@}gK;!Q^Qnu3=Ow4ejn&>I9Agvzi0U>S!=ea)80<)8O>W zMx<6h+ERR!u`$I*5bJNeci0!4WkIk;GntZU-E}$>U|ES_E&V^^{%cpwf#p>jwZ^kr zqmG#^U+$j#Ka>5p0{_<6*6_3O?CFa7xw5kMZ1w5->i^St^6cr;r;TUN8jb&FrLppC z^~wKZ{6AmPzZL!$e10MSfM{|SV{}ZC$@~~8(8mXz<7!HlWHMu2+WsoLse844w^aI7 z#G+>;G8P&?8VBx2V|8V9WwBIxY5Ttn&m&K(#@puuvt#_?(!F82{^tw7M1uSd1?AI$ z`OyYx5%0s<=u(9iB%g1Ga96fT&9pH0ig{@+-{A589ldF_@DRhO?%Zc>4k*L%WUXhM7%Box9x|c0H7v4Y zCyBknOcVn&BzUckr4AgTR4zOMWB9YS;@bE zAqdcqsiXP9)lj1-Dw*dfy7JyC2_!-0_Y%D|uLrJksbGuV=-VCBv8}Fg;#Sk)VWKBg-Y+a}7@Z+T zbVp}r5OOdziQV$t_6JIXOWx8p-Xr$iw%cXzaQ6A+*~ltPo6^2?D8otM1;~w%3p=N8 zza@*J<6a}HF8k66FRTa`Q{0g^eF}FE^|ptD0V!c{i9J{f|CTc~V(J3EIh5a!$N zV6I{`;hW@;X)zh@^TJX@3qBC|1k@l}7-|arNQfc}e_kS}v=!lKoLhbREV6jd8u05_ zgw>!GeC75~V(*GC)<;;#UQc{q%(2vxwmprIwjn0sF!qN|=g%Q(J=17g$894Ef#~8{ zev2|lwe0@d!Xl~>Jx)PB{b#4vl|Oz)LT2IBCENW8_r}}*_y0TmV0wRnNImfW zGXLNIU+Ux_1-vz`0C@+u)t`iYZX_Df96ehM_KsE`8epgk&1U&*rM$Roe5V$83xu_6 zIScBu#cJc7*cpA-=EJ)@02=1@%HqlhjGp@-STh`l$urDs$c53n4YKtS6|(=r{RP{S zZl0ihCNitBXwG-bJ8+cP-GAAg=IZ)NW0jlL_TmoUYsc6b+W)!4W-t&hxc3|yjs6m5e8m5@`ZG@wx`Eg;`l$RpW4tv@?`A@1%_ zTmj>>b$E1&?i3jXZ@W+Bl+!(ol_BS`R51MOCOkQI2a;(F<>N zLBx|}4&J~k^2f!q^629_rg*H12$)Bw$Go-kO`(FCI#y6FTDqlea!_569le&1R&}HL z6XV<6P>MJ_8pm%SI8~plqGaFs&t<=Fd~f^)ZDWuRoTjH@nhr2or-K}>>D&ruAE?4v zyxPM-mmR8&%0I>LD&}(isopo+A7H_~`p)4=9SI{$Y3Dx`JT^PPjrH*svY@SjM!55z zkk0z7@qwnGSJlRfK~d!vLeF~HS>(&0Adi9KJO-CD7bl9*iBl(gfz;{M3EmgP$y*bX z_ezpMlHW+6gNdsM3S@u8Jj_>>!bsE5)_urZEXYeHNEnVw5Mq??E!D9s`<=?c|EM)3 zz3Ic-ufnY!0UoOWd)~*kOhAlMYEP_jh`l=GJZi*a3m7I7{Y*6PbC~e8AH{?p4(v;t zFY0>eOTx!=s#<|h$+^brlVxs=jaY-AAy3t#s*Td6?~izwnZ!&CV@Oi!txF;}D%X&F zToBHT&rcn;Sapvd2L+ck44rk;Bd`b%E*d`jMcfc$iYv<9H1b)G&ii_ z1MVId6C(f&43X)S{5m{iuhJu@8S@(Z?q1~7yQ3e=zpVn^d&pgn$Gaw%N`B-g6wF9y5sdBM*sPd?}h_4)Vtapy%qEqz6=B zVEK5*JaA^kNUTKYUK}33+C4rF)fIuii(??8L9d9>6>UhVf)=i3TmA)!6v%Vc2N!K@ zeooxUtUd!COT;Y$aKu6RL976v>_aDzV%a+mm`M&Kh^?6-R;r9NhZkaKFfJ=SaJn2T zDwhRQyYRCGU%Tc_Wc5~`0V{r~31o;Ku%VwW3mq_)tN4Qsv2cuMbX+cDI8yCB}+R9hf(}ABd)~t}Aj~ zFJO1H=pb_Z1(qiiyui8vV7h)oKy`3fNBI9pg)6rjcFFdIY^|s~J9w7|7ozLBABKHx zkr|Ifm~mviMGuwhX<-K`P4M~mg7`=-bK3B=9EZ~Kz3X}8Pbs{PZjCa zCE_|xl&5u{Lk!XjqVbY(I}Ir^N7fzU4SJkE8A2mS;YxL%K3Q1-0*5jP$7j05M~!9t zySf-~q#-OIbGx(@M2K0gVqXrDyA%TGxW?ts9GH%8(K#=gWLm7;bVo-BimanBoaGG^TWJ1JQpBN(VT(D&?#r;bzM!ZD z!mc6r0PFl*U{?_q@KPr744Oipww~!R4+?Bdmo*)T8X!}dtka@y!NH4Oh!%(Urv>#4 zO(`T-q-(*p5nV;~Cbnx|uqFxSZeWLKjJ+Jv=y^y00@{P$(6iVGSkbToEGOzT$tptq zmEncNtSIsy?%7&`n(5~g;B7vbUH9Y50{Y$6HJvQ~kL#GUpI@1`R`nP6{M<`tvHy4H zKm-jMzy=}P0-PLfM>#H0&ceC5pv2o$Sg7EE6Bjc?YyLD;Y??yxV$->atgi6zrk&z; z&TB)j3J08DZPd)3`4@Eg+N%MVTjK^0ve$gNEb%}PV0p)s!^P0X-K4xUzzQy5&|61 zP4TiIe*@(At#;QG_w|YTlfQ%+K&mMMzfx9SjPl*SJhg!Gwyh2yBGlS>*X0m81B;Fm z>^WW7wh{G`i1Ytg7Z(HI9DXyqJ__vt`PC-k?F;AtNEWvLSI-=h$3v=yodV395AotV zu?3`cMP2yz8V!&2p99-tmE9AS9~-pSg81b?z(k;bmk3D!^TO~@cITh1E-Eaq+=?fS zu>gvRH}q@o;I#E>>y3r@H%XHcS`ZHk44Fp2awcI#p$|B~53WWneEbw9$VA(8>Mg&C$xO997&QT2&ijzzD zgdy%Q_7umN;vo}16)XpK!Xf$$FfJ)rl4uxjd;d8!yL|kIU95$RL|1#oZ9p|Dld`TT zj#~aTDd27~q%~SM5iInh<6i|TJ7MYI__|?di3h~lihA3`uyEn$3w$Qz2nTq=9_-{R zI5uqWO89SOoDx9pps03Nk~AtE8$*Q&QZLjhDD{x)_sLpl4krCPscwMKlV>xp*W8N*@qr9!%`@LDE~5TA`Va?z1Cfk2jaDA-`ykL_kkk(pFwp8$(NU^O zj#A4M3>jfbBFvkN9z|A1?>cJ!JXl7r?RtxvBhWf|JT{P#k&Zyx0i(XDO8HaNi+ThJ zjjYcOhJuN|K|;U(T{s6nx>tjAlQv@J zwNTZ+KG@qn+}TAvxe~=8h-Ds~5=6??9~RZ!gVTKBqD7j$yp>oG!pCfbT;VW`+p%@| zzc~0`@i5rE*;4&RBJYAayElE9)ZH-i&Gi)^hY+KT$ZSr{q|J1@GZNeL9K zoK51iwRP~j)Q5PaQ0vkKbXKk)<|AN0UGfz%j2+fk)=CQa^I@-#F0JU%+Cy!D4CPD= zK9+2wJP2rh=>%pD((6#{J~|nM-a$&<%hEm~tkE*sDLKxn!H5__5`2!~YNC@6((6bA zuu|l7sXc7LmRyo~^&&6UjisDA^(wN!hbJ4rIuoOg;Y%%G7(Qx_9;mvuEmCcSdT>Fc z(R&&fs-|e#BYSlRcm@#X_AUn$$v55ZjTXTTXV{m#T;Iqp;+k@#Xi@3$ovxmVgZ2z(- zVUo6tnMPr|BAkCOJiu$`umJCu!{6K-J~7GF$O}p!H%hT8=mG89_jX5CkUl!%B7>=r zJ@SwnwyzjvP-Ks6Z83Ae>i#^q1zy#>^6dypKGo)07;FRLBXZ>E$6xIUI&T<#)>7gE zc#5-}gO0vGF4IK>l%zTs97$XhfSpv^JCK4jtB#I2Gbf+4wd0d|?RYolIQ(ON$6@uH zmfb{!PKP8UQUD?1!mCxZiYd&QEbXz>onAxZ5m(6T;*~i_{*ZDuy70p_C+IV*HqvrOZHuE;(4VboZa7%BHEI`hy=>84F{1PNr#4K*#xDW>Q zhE$#g?vAM657yn(`Ws|i)PR$<-;mx29g07*Nz@C=lbX(`)v;G~TuO2(q+cwq0Ejx& z1omTq52{bspFDf^ay;Kdh{9_nzBi-xRtk8F-p}Pd&bgL2{~?!)KizfB3;z zC?BD`WSkssNg9GIA|gLI+pwRDaPwZ6Ypgt3EDPP-XdeY}bnP+eg@tk$$#71k_{kTT zU~{8=QxIv2jvxxF8v76*-`M_az36XuP-~ZLRb;)PC@kCJ#dh$>SV(!Zz z|D^0@16`0wF7$>84Owih3bQkCdK`g9?5)DLdStwK_WK#f6QH4O3v^Ts#&vFXE=eXQ zu1^SWf>tA%@K&v{{VS*??-@}@<8b@w?c|wuk&l@2U<^IN2VyfUKsKOW3yX^6K~MX> z>)=zFHkuR_;`#-yk<cHmgVjZE2Wf?{&ysgXsKYM?--o}xn3!`(o zcoo&Or%Ad25a2&)%by{VlF+6|E`pNmY4-vPK!L0lfI_1HQFKpV%RXK=un+dL&*sK< z#2XQrSp`s{+`VRf>)WGlOC(U0m6??p89#5lLCVbt7f7Ty(Zg?RceiH$(cA$O7Z2Ga zR3K*%SJJh-T|fM%t!3S5mea^<@ABliVvf}FA!-NDm?;F$wRU9RZBf2y-4^Z%bRDUo zv7v1-zSF~I9#Dd6Dp_$7ht)9xFQ})BTSGJD>69%epq|qH-q{W2Q~H|}?KuDS zeVUNL{3}h*WFjBM8|eH$W$LaHplfaaI{&TXD&>iDcX_ z+v^(@4S1$A4Hd_}8P;+tf$fI87*e`u-*FKRIWY8ERLsgPL}@(|iNL&3bJRrg!EmXa z6u6vob$P)*@vuZE>cW?s+3b}hH0tmD+5DAP|!U5>6|Rv{mMoeRg=rw_9b{wl<7lUSV>BtZ;f@0+s< zgRU9x&v%c2R~}9t1=4Zh0;D~OAJvf2koG+PGHIA|e%f`1pN9t4f+VY0&3Q6s;IxKC z-4{R-;(^o$9divXZnq%p6*jL<+nv+r%@g|fl9$am3x{UwX5FKA#K#s)0`*dZahkP8I%e@RkvA2KG1#w^E$dm$-;Beq89 zi8Xz7G!VFDYK9uNG}$;8awfZg?-u|D%YvAXW=t?EgjJs>!zDR->;W3E2Z%%QoA=aQ z^$zsiNxwQyKF+E%T;`dgo@1GD0uH^1%|cVlz;V#RtNdBDKhCpBm4pH(@X*b6Ot62v zQ7>dignM!Q2mV!mlfBxWB@=evJfA+qDOQmTQ{;iglC;qhjiprb z$fIpnn$VBJAXmjwITg*0>?a?RVKzaUo}9oYy5&`toQ}m=CjmOBcJXsAuVwa^dxS{8 z2n%>6`}g$x;-q=qRJkEOZ>;rZv+2bn4jwuy9UO46MFj45>}INlr>qceK^lf;#pif&K^#VE<%C%~g(Nw;lT2fk;Vl@aIcG64DI$&yL$~S0aZ;)JakB_4Gl{Ca9Y1^b)94?hW)?L{?au za)?|#Q57fT)qmK6NtR$ok5Nj9gi1{fLTxLa!LGp_*r|TSS%Fqn=D|5Rw>#aW#m` z`zHL9{^%DzjF%!-z+M)S1@Rb$x9m5b;HGE{B&oFJuk#z7A0^ z;@DYsrS1-sqrP1SH7G61LZ{b%;9p;maQQKvajt|~dbDuPGZLzI^YrnNHG4hQCGCxF zCbQnAgm!9tVjFN=V4-9tsVU%UTs!cy7iRlAj!}dq^Dz|6=WkkPC!OPq^Xq2o{Pe1G zeM%OhPKg4BIpEyyFFt}-*jYNBf2?M*lk|z;n#EJ~82FN*ED^Wj47A&C)Gu6B{vOBBozSz z$}|!nYq4GA;WoBx8um{gF0j)ZRgHu`2S?~)-)buk3a{V7SiBK<{)p=V`?Tj9HV&Ae zsAI1<2J3r2b7grz)33PKn$xEx#^U3hH??d`t=<#_I-ivwKamW@E}INDyxKc2)=%WM z9!ok5pO_U6oHunC7u?zjz`+|g#kXF5tLs0wPw;`f`?n9#`R)86d0d+X0+At0Qe@aM zz6iol&Iz&NtdzY#kmh6lz50RqpxDYVhuJ%c4$=2L1|=DH*q^HJkS0`#s_*=*^3XpQ zN9Oyy{zFDv`$LvJbud=~%>@~Ug_T^7dCLz|@&2PvniY|a)nw3YFh6O(Qn)dsEN9!?_@`gesA(Ez({MSmPgaX1M#1wlz z>6JUQ1jfBE%Jm;6iNJ!88ZhOR5dAUE=`ek40xUEpqnhhzk*phGuRDe$se8_mJ-hDru8ac@l0#3-xcA+603&mOatR$;t3pM> z{csOu+U|MMp&x73A9R`&W0KqHOsXkQrs~o7o8I?#57s5v>34K5aCnnQr_ij}UT}l>@jerg45(0$#_PfpyNq^XAdO?q#2trTR*g zWtR5lL#D{&(24hoiCTIq)`76Pa9%@SnC!$rXXm`({^b*q=zNPuG<+izIb}?Sg;WIl zfef!9C;+ggsrTC(MSO1cDU?%Qa{bfheQ_qteF6};Oq>eGxaXbSl#+jlFN9gm!_Vf}IhEy{A0g$;?B zzHDpY6|t2FpTFtd>Xvl<5V|XAl(#2tG z$yB?6RsgBEta%T#w^8%f)L8_cGrr7mu7YEOdB%Bsmfo9GB$ zS*{Q%rV*%5;HKr+Q{302VDN#Mih3fc5=h_bOGuqo?9^>=(Si6j{>|L^LMI@YG4Beg z!1@ZFj^-**rx9lRV|Crg7rP$4S9{|A``)tja?+~{2`Iwo~3n>;!-CbXJY zuQ%zxy&W(0n*9&WNs3g|t=%xYiBV>TK7!T*<=$&y0@skZvT|3mZpu!>Zes0Y!s&_8 zy3kT9cc}7-U~{9dtXwL8+(s=r(SZ2fTzC`=_{Qi#Itm`{t$v=LrQJqhmUL!xTIhtl z@8QRdFJ4IE->`f@NxoEHKQEE}(YjDtM>vGoM|Axm2?BuvPxZ zHCOQ#^BoE55pXn_l3A#IsB0Lqbe)N-xykPYVQ_JI-8nzGxNc*C+LzxyD}4*hkb0ru zdEqk7@yu7tmQ;Po9p#2J8y(?F;~Is3Px|7aCAx9S>3M$fazxGKywf+ANG@r>P3S)Ee6SpTq_d=-M#p#aPbV$$yJEl%?KAOY zi|8{cXVJdYaX|u+tF;+L9d!xwh%{jag%d{Gka;WspQM1}Fu?eWJ4AXy4`t6$EoySH zM=jlj2ZN7--euO~!jn=`T8$S{#=HYU2uMm14?iR8Km0^C^l%ve^o1%T+ic5TDAH#1 zFey5(bAk1V@{EIY`*5Qi&%%A2IK`Y!`&&CMHG78pCC5^&Q)toLVcx>enH|1ol=>kN zY%EvQ#O@MiF+{=4oZIZ;-pxO3CWno~Zlkf+-`vrgdleg zlM<{rfN}KAmEj6S6j~M&H=EvOddR{<-%lj(#$S#;2r+|lLsGN9C1CR8Ivb;%&5ylm zkN(e!V{No^1ReLMb(_v=a1Sy0W{vlY`)!kH2aS%?qU&6`r%L0KVxw9c zS9{#a2Kq5G5!FD_p&^|%j=pL(7{G<}lJs2CRib~3d#qRI(Ra7<$q&EkC*aVDr{6E$ zyYOPZv+^6YfqeDDEtB4gODfzG%kKW7jX>&~o&HOLpz6Rfc{k?+*hRh_g@BZmA^q-3 zX}JVBAA`YPl_hs3P;;GG=8afoXN>drO2xpA8jcgWD^jpBYUnObJFM_PI|f{i`3!(I zU*1p4By{#cXzJf9x(nv}k&k?8GrUiY-%x}*=f5%XaG8{VfPYQDULRiuG0$d8KR*3P zqU~Zb%L|{LXDEVxmE@D9H=Uff%b#Cmq&Xz7*(S&1?DO;Nv2TjQ3NTvhML<$85XKU{ zOlGgLeD?g|oKCs7J4-*^TYfFcX?*p?GU}=8_G-ZrG~Nwbe3efuhUKCDZSUy&T)PIt zpo2@}`e)(-VOL5UL3D{~1Hcyi%HE?Fw2Lpsj3i(J(JPJf&sk@nbCC=>4K)G~Hew|a zq)vS?I+DDsDE@ONl~qP%XDfr&m*E{4L+{dWT2H@keM4Ab>EY)W*MR~Fjfs>E)-@`T zvsfiW?VsL-TCn>n(t=F=issXwVr2lf~Teie=c zih=Ly1H|VH|KegWP7gF-S8)=$PkvKRgE49PBJ+;Xp(+z2PvY`JlMj1>51*mjky~@JOQ(-lAHg0 z9ijO1|KO+j3-n9=kpIXNY=Xk)Jso^xj*o-gFL-a*2$mLor@RZMp0gA(tc2y+Dnf{t zsvxIkh6-X!cXs=0Ex#+cVYUvJ)FmJz?Sjl?p|H_pVf7zLAl=N7?IU*8vpe;HmhQ(W zAt6dqjF0nv)O_1)oi(4g&RW+$7czl&ITLtmJ9tJBg1B9H`jDCX=qX&7Om8+}{RJ~A z@fgkKAR+SN;?4O9)>*-jR}MR$(6YaGu!mr;V=?*f^Gp&0$j0GsgT=&08R}{%RaEn` zCGy}5lgEd{daYL5h+e;GUq?v_-?4y9``Uy$&)n&wy_0TrA9Urbdvl}=dlH(_7XCEL zrd8x*|N4O@^v{fi?OGm_Ped@sRn2$5$@z+Lk5PFkJ0+NHD;>xE4-ADsX{#XbTDPF{ zglHQQD7eF0fJ7yI#KmLbM~jiPL!x*-Rm&53RCuH|l9ov#d0kwKl%9f-JND(iRle59 z+Tmyr4Ov^!9!_&5i0v}-_butWi57C|#S;WW1nz_&3j!b63PFwb2{BTbPx+iUPm$+~nysHS zN0ZuAHI6>=w3nGXwz?TJb4s0#j*#$hxeoXqOP|)la);^{*K}HxT*!sJ5Kt^O(mJiH zHq*+8GmG8J3(rviUC|@FwezI3KEyf-f#m*tvc6%=No)x?pDF!&arXB3;`~LBTOyaU z=RRM=2GKX{G?&tBB+R1hek}aYasl8pWO@iR8_XBVnlGQH;uo2r#2g=A%liUiN8$d> z6Xv$__O7E27b5<|5k9I^EhbEM089~66z?PkuX81bp zC*i~}Q|^*Z7yI>OVw^vRuhi8eBS$5dK)e=%3RO10Wb9)4&IPpHDv=>UR$Gx3}Di$ufXOuR+>;{Co zQ_N`wbJD+O9dTM4(~Sk1+-(TRvv$u3%Y{4FHxv$%xEOV*QNX=ez^E61+p-4~t|wsv z_2$*9)8@%32_9F(!*UP8B9>T@SMz)bT06#MecBx!g7dF0F3w7jd{PS>FGaJ6%}+k6 zoVDyfJ_Ar(bX|ECS(o&5i=gw9hMLZ|G*kbb)1b2lZ1Tx zE#%ubne5_2(ue=?6Y@SD#GhhbCPSB-5n3rsA%HxyX)IWDZ02|A`21R9?^A@~T*B8M zGlg8=4zq4Nv`jb)p?Iy(zn&aRAX3l9KW-6s8@K&Y7l?pdVj5D+``#AIVI*DEJOI%+y&)ZxZrSrP^E zphHI1<*d{tao#6OEuJ~8B6Qp987bFM0ff6I45w>6ZELiy#=XhI8q`3juogg1K29wC zPUGehZ8IOfkPzw@qP$<+@S-tW+j>o3bz%C*2e^%RY%Mglx$s zo^02qgxM~SkFjYBv2!g0WABNt5yu=beqz&Dg%AXeAAN))QWgqy=ok;i52*yBOcGh0 zWO<4hq23rYPm`v#hT$w74CDK7!akc}IhhZKn>0cLu~@LNIDQ`* zcjL(fWJ-Y8=P9H4U<5ra7+)zS4d4tEPjA$_pJoWG<#%|Mli9k0bUw{~~y2aUm2 zZ@U+*ui8V9lH1R)ai#f9)}jOz#@-0%rt-wqGLzJPaeVl$J>ggLiKBip(dapdkTitS zr4#SHK#nrVe6=I_JK2&Wa_qi zcJK`UeAC6Go6?z!b^_EmI7+452CkhzuXCqj6yHvnSRH7W`R%Rby`c*&P3Gn@(g7AF z&%&Hw*3ffJLbLA3i@=K%mLDCvXW>WnFxhX)7ZMG`kF6#q*;E}r)SStP#+iv9c*4tb zU2}EWRH;w3Ut+aQKJ0bm`i|>p(r0_L=-SrgEr35>71VSI2Nob7Iyb zIASE=OjF6kFz-tZGTuCvRN0yg@;3bdrcom}hBi=$UMo9@M2}=k=86K5a+@b-XHl0y@8TZ@G}&m5 zX6i&s1_RP>!PSfknleo!)Yed^LAXUm0ce&Jss)5*{1mPRj$Q6&iCKXjcnkGn_^xOJ zpkYnXm3?LuhGDvJ0IoMQ`pA%WnE{9WYnH4XmAj}nHX1J0PW$I{wV-q@3bTqsFQAvRt!(?aE3A;swPJ zm2mYf>k8AQql7mSuh6+38~kLSSMkO7E7OjvtUaY$>1^UmB9le# zu6W3~MIs!8&OdPuPiV4M(KH#u)Hkx2hl)Xw<}*DSt<8ZJbaQp+Ku^TP#1@O>D<{Kw z9zC;ikk#+)?(e>f))l+UrJ5vZY13af*2T8*ZLy(s_wzSgG4>D9IuARdasNKr-`Loo zHX3_;PYY37#wv#7mCCrqJbb7qXVNVfp1&Jum6E;#_tR)dC$J~33)X_x>{h*gh>8vQ zd^(w?Icj)chrW8%e?=4YjKMQ;#ft!N~kHg~ThTa^VQ5j(|04>=ykidYQCh*XAE zo*;GS<&*hT$^C+w*;3L@i}%?=;+{{9!h6UWQIiy|vk+O&7qJ#O6c!;zW{I~x_UBsH zNp>Vw^%vfEl*4&Ch`9`e3zT8$OgN!UL=RZ_-Kib6k%AXc(vT|Zad}`+TEu?7p;YF9 zWiomIG=q*VlE%g@DV!>-n!xAQQ}TRioQ%Jq6NaHNvPSEHRw-sOLGEJVtmk>T9RtjY z8C&N=Uz8tK49L!KgzVz5975sNgmi(0^pz|-d_TyNe<3CJcz_i@8~xlb#FY4rQHn=pV% zX^#bd1pv3GbdXUwa{J?{<~{gonK)nd1#VzSCNPlU&G9E0Q>{>m$A}S&=3~WR>OrS{ zBDj_Nl;^r_g_@v@+!~S&_pM8vfhZY2Xjw9qM7w+ciUruH*Z);CgILRAhIYhkM$^xw zfP{x2h_73kGVgFvECeM$+R)fjAC>6lipK`lCuTa&CU=bZ>Is3byf9@75`hlu2S;b2 z2D`e%G!`N9rgU2B`JxiJ@86ZpMBNGGMk7Lkyy7TWS3q2%bPnq&CWXtnxNlftEe=jM zXZ>ktH|hIRt)e`xYKtUt0+ycS78tx!!=WFAlN3!_TQO3fTEaOEoxP$&eldK$QpY=^ zC(yg(+ybf4l1HncT%LtaVJ42{##dp5*_`&%fpQb5D1ukNm-(e9cdHQRt z@$!Qz;2n@!C8t8nMF-Wv|?w1wrihWy?xPaoh|dPKY7h;hifLFS3o`kt;il%r6a?k zPm41;o~DyYETw>Yq|%&A85l=|BgP55j6vGB5M)TEx3B&qMOS$RLT4en1=i#v0|1qV z_R#=I&hevu%~E1ct;m*QG#%7{&a?H4hA_E{Nj#$vb^%ejgW4*4(Tk*Oh{^>}XW{E= zQ9|?t9PHv|t@cH9%=%e3?ZZmr^X)-Wt<*GTlswPy)#=%3vwd1UzqmeaA4w({4llSz zS<6x;%t?}Q)cXD|lfZbt6gMb#&q5LT`*adD=d(<}6FI{ZTz&??aD0M#7m}~ep#c%n z`nZh=&P&%$coLy(JE~X~YMfa`9(F7U>SHD$PV2XxNe6_#9pTv66q98!A+sDVMt3JX!-LLuGf`&*HQD_Tp$zB9JsEC^il4GK=i zdJ4)x>edKJ1zpp~>E`N~_zeA6WrX%26e;3bYR&)c;|2m#!#ZP5qb$1UVyW7PSjd$iVfVdvo$+9#J+ z7ssb3Z>~;jqrTRvci_=5!+{%PQ+b*S^6(FT&<&>kKS05FM6)TWN`k#(IV#Jdf=bND zz{{i4i?f=mLN2^RfM!U+Hhno*D+-$^K^GQMO1EkUwZ;}J=wj{NC$2I(Q1H<6eGwX& zvS5;~l4>@+jZsG}PZT0UYo>MHzHXkK@yr<8lI(81NI;9cv`N>=h9u6|@%@SFH1H{g z#2YRgz=EEm1nXbz>~H94ByfZ~CiF5?m|ET*U`Gq42OGl3n)HLtKw!%NgYib(Mftg= zfYn<9d1~zLRur8I6IZDcg^xk`y_Hm5>%6e(S<%V{tc+L`ehpD_&U)3f9Hi4Ty)_z`kUN|AQhj65{arjy{?sHR zew=2}b^MokGR!_xVSwG9mIg#O2}z6IG>-+k*>obJE25yI1{Y;hS=s~D)qqElW>3Q4sG7kvt@tAF9cYf2%+S$R2 zD$T#Qo9A{8@MFyhud8lJKt`Ia_R`=dC8R#AZ*N!pLl|BJ(3`fet5r>ZHegY&aKh-Y zByb2Cx5*jzO?0Iu{a7o?@9pBGkOg-~yOb7lRkG--y=?S3@L}}F^Oi(pkQAU~ssSTi zszh=^BhM4GTcCH=a=d3}K)W>GT)(=wYCG=#*dUIlp4CtCxglry;pHb*l);A7bbQaT z!mJ;)PT(zck?W8aJ9y58_@NPTa=9?A^VW5%dDi;3)04pH!q|%KX;8a#sBUrnVK>jG zqb|E9@rrctoK{L&>OrkuO7v+M*ZBU%(_x`*EXad(tQ)*uv+iGHb~NqQYNiR{h7%;s zOPW@$laUunl-n!!h)SeGbeVlZ^A-37@9oLKjp>uj^y{B5Pkr$k^9UHAS{w!jkJ4I5 z6AL+T50oUgSPc2g!u(;Zj1CoGCp=&TsR=Sx_}#hsP%^`(-$w^Bteqt?w6RloLnVCB z6VO4Sikj(NlXPPC6<-eS@`dZ5Yx8k^`C$i;u~36uqko~01T|5;7tk~ao&(X5k^LyL zB%rd8xD3O7oY!s;kJ6#c{8h$9F0UEPmwq}}8iP{Rc1x%G&=F972cUkQ+9mbS!)g8D z_Cq{QG~5J@p?Y<)Y`{WV2BCbR-ql9-^bdL z`i%VcnQ=wJ9a05GnL~}xU^4HLh>sX1%duLntc{Qd1}*+0d4nv+mD-(0gD+sIn>Te04StRAfx!YL#& z5en~sc*iMD(=earLO_-I8|T2Dn!All@i9kt1~1Wjwj(v~7y<1~dW9cIOjO4LknvSQ z#6QkkoOIM7vwtDsh~_eoLy&A35BC#;Vlg<(#G5E2i8>x(VM&Ixd4G6`kXT^k=)%xT7E92&$`1}=qu{#G|6=#o>Hbm9| zZ|{v|4LSZ%D;TkElcsgUl4;HP1OQ7ww7*G}2cT`!%$QBu5SdX?RY{$zDt-?h&kccC zh`k8%VuT~p-0-%QXf>7W560T1A2`!k!;;2gwOTXx06Vb-W`m?*Otl8~g=15)5du%U zE1q}n0ettdz;$&d?vld$;WkoaRSOJ~zdsI&9dQBT_!bc?$eBOJA7agAwsfG#@o;!c zLGzU#Z4J)QIY$E)`=c-w9JSW1<)R;}$-P+Nxm4Gk(;{8HrZ=A+pW~L~E1D>+);T}D zes^*8W2b%Hygp@94-RV4nizJO%SSVUl~$F4=aWVmLR59LV7ecqUGpxnM@T}c ze#{_icl)cLrn{)MR_eCXUK#2YRz-@Tx1s`KSyvCm=r?5n{E^IY<3SB5NK34{OW$QW z%ah@t=Gno=nQa5xJWKC0!n$y&p9;`Rq8A!R>vKXhJ8-@KS_lSA85AJ3%@$`zvByzH zs?y%PMW5;rFDc-c#Ef%JRL7+mAS-IZ3du@l%&49$C;e`ay&pnRe$z_-i)@PW)V4XA=j~Qu6~9ZzY|Hxf#HT`` zG@1ust2EVeyP{v}xdQntp~XCUbKW|>I61ArH`D+0HuUViX$V2lz-jFzct=0_u{?o+A>*G9_Hn#B; zc%hZ3B==5M4LsC;w(!=(>Z1;zARG%c2Y3k9AuLLQdRmD_`IX)EA@HH>)n?eSDq3!NBCgV#&5!q zQrI6mvJ5{L*0E<;5Mw|VdWBsnA95DrG<%>=E1DqM(r$1|Ne>N8g?_+6eZZ+Z)(Q^6 zG&-osU@5wPOd{bgIsP#xGAX`|odR-(MDoEB=hZ>+oj%DlHRlmD7tL*Xo93J-*q+V% zDIDzRlxGJFBlGgw($s};MxVSLgW?I}cru$xS&^eigW0IO zK1{~9%+&#RC2ahd36~vw=x}HM;IMuW?;O_Sz3!l1KkUZ42mOOaKRM_%`t`m3Zar=^ z_CwrwTxgY3WV5NOCy)MM%s0#XM;oa|YYBygD;8*X-VwzbgEo7nRUSYGkotmp;E0f@ z3eEhudfvRezCv^oUHDcMSo>8@&ztGAL%oi^kM?g2^yBbIqG2M#7&$L|DC}sa94fFp za1kTTWcKw~Dz3^17b~|;^25<1Hzh3Mq%Hvq5GAFD${b_^;X@|l$&BwxyXngEN%r*E z0z=p?@sMM5?6J`^(NLhij(l9`4b%Venmp{6X--?=Ej+_C#;+P%yR{`J*LGp2EJFYsfsr0^L8AVJ z<;3j-%H}{oxPo{w;D48vc4mE_m_PT@-)3@GJeXY8$<@j}f@m+R>PvpJoGx;Rq`sOs&W$21Sq zZtOT4)~^-Aq{gPB#l;Gi+*nj@o{y!hMu<197;TlFPgaMp#{~^@rz)mF_%6RoIekN7 z9YIP2+~($TWR(Sjsvb+<_^%uDaPv`A+wi;6kXY=cteVWyE{Krfg}g*hEWQ~Y*pYb~ zcuQ<@U!%*D7v3;Q#}0R^?niZK)@rpNJwu{D@M>_XEz*^R;!jdY9$-96WP#tRq1#+_ z83xuNmx1r9#m;N~2z_J$Ke!D>#(FTeB}1@(cK_u=z4BoDMAhXi+!zD$%x{ ze~@89ts|#C*gZAxRiQe9&JPY4S#~cH89l8^Qnuujc3(EN;Fy*h6AGVY7sf`FwlFb3 z=b&a8%&Kvg{`xtTiTKLH8V{wU?f-uMlh|nV4oM4pIgEdO+(K(3UBl&dvpbEG;POOc zOv%)nlC^-7Pp7Tc6L;_3j5H1l$Vl?_cky%*Z*pv-cK5v#S2b&Zwgm5Gtt4nflN`xN zdrG7?6pmUc8g6e;_-S&~Q5@J4tMBBZ>JXu(p#!I}uxB=*IhurH!9qR|oHOP<%auqm zEJRJ!<3rXn% z=K3+e7HgUy4dPR&ZlMKH44A62zO#hFK78_bQW#W=A$s=tQnK*!Bloj3(@7BqYU&2t z9&KS#5~8Mv5rs4aM*(sj6wX%CU?m6J-FAdnzTrY`YhhyHNA+o(kRxREo0^?Fn^`u9?*u>+KoTZ;$frK z=hZn)gcRcv5B73zj^?DxGP}OZM)VGU{Ez=Pok*m~%s;W#TpGub!O?_l1>j8Xuj6p! zI5h-8(HF6|wM3!YE_4VIi;jMpBE(6LB%dnC^)mtoJ~zGK4^9U#$H*avcy+8y1+dN` zOZ{z3I;H6_V`+nykC9yUr=*cgWe6A9Bos8IUO&}KN3V++g9Yw^729fGR1Xez533FC z-<#_fRfaGg9u_@whx<nz9Y5%1>!URODcgv=hx36}T+uqB4q=7uf> z*}TjcS~4Y{@hP#JlhrWJ_IRR$37v0j6wSyqqmu=Bj$>N?oYxhI!T?|}eeihzc-_p{ zA?zaK#mhOr@V!t2yL42P@wQ4qZ#1kkW3Giem(T|_PYoSY!nI~ELr`#NGx4m%9s0?H zvv8RJt}1joo|#CNpdQ8SpQkhF1+ zh2i?$R={Rt7vMM=s27e2MtV3zp*{8ujS$B)CTqH+!Yb zPhp>C|6ZRJgV<6upxJZt(KpdapurEQ-_grt_MF!8RYuytmcBW4{JDX>Wv077C^Ap* z((2h{H$^PcPRf2*BBeMi7L*TE(nYZ`vM)L`VV!25tSvHLn!etL1mlaNaOAziCt> zS}>e2>j?rl)*3N%C~;BC;54a~7Qu)?F1Jb^DAGR*E(Ipoz*qHg-GtISP50ESGf zb^2iCs7`1goVJ-(qOC(35!UZs)Yv)N+B+hxqgvmt*R=;@Pj`hml;cDRKfv!FNz%6R z0T`F>fDtwd6XHku#qKHPx{M&6j~Gp84oMMDbUZQec=N-ax0Ea^6WaEz1FGhXxg3{7e70y0e9aum_3Q8F8?mQ1$&E&$P*Nu; zZ6o%Y=?jsr&e}wxn#=!>))do@>%IB10K8URs&>LtQsREA=~ey)nvo+?or0Z)A1Kj7zJKTlqZ;DHpH=BMa9c8xD&PX8!`e zKm~hoYX~93V%FmG4m@4aV_fi~2x$ZL;`xUVF%BQVon%vkmwylFHMg@fAqn>aw-zom zsN1;}GNDI}#F3r{oI^_w3=b+YUBiwE76SMVB@}92nR6^$u_J$@aRsd(!}aFY!Ir-8 zT=|JHSrAdE&^k(Ia^WO{}ly{Gu}eKl;W}?)n*=V*=-N97I;&Iha?$8<^NY-;Js!=$OWx&>X$N zj}K}*>Q;WR`@>tt4mez(%HfID#TK(}$9p$WIw4WSnXN5^uG3sO-xd!231pJHv{DvG zx;q&2C9#fTZp#Dm z(>0&MoCF2-1j#4SIVjnRxg-S(bmI~g3yMN``iSd0tt?8CI`yDzlxl+T%HA3ZOBF z#zHzb^OeghD^TzkJ;M82Up8}99}mP!lR6@~CjRE?Pbn>^)~!DGkjE7zO9QI9s;&o_JOk-bCr*eRWm`P%?uA< zVn1NpG%)sVVkwb;j*-DxGN__#o&Fs`-Htj4dkTV2R-2=pqBp?lj z!TVBrix{>9Itz>TM8W5Ajij2R^!^&l&3d&-Mo5vdfo0Y3rgqYw0*tu z1-*J#$OT3KZ^g6doPI=HLqJF27aXH`dH$v)Dc>jQG}jj)Dd3KhT@}`RiKDeB^wksQ zNVMXS;w||_^aF;M0)W5p9-bJ=5=Ek?{$y>K=kawseSgC6!rznhl%2jkU#&(;mQ5%L5 zQ?VbEr$k1j3_zHZ#rWN15*M2I>`Zu)c8&T;h8=q~13H~ zW-4aWgfv*lW>?uyu-U9R8|sunhyXAsqgau7SL@+u?YC?33VaZxg4#uxF<%uS$oG-2 zI@;wCs~64V zQ+05A+>T8=a+a$u;Artp4k(UN#Nfusy$14LunV6Wnj?!}@g_8r>~sv4Q8w%^y+K${ zT%p2^Wj4c}Q7i0ugh|w##-mTb?w`?0#W zqm`1hAk*e3&S!>rX*&A1LPlgD#Ez>?j%^mB@5RaXWt}dsF8+9WeBC*3zCJa47xEmG z*}+LkVNVl~1l(TnEeZC*?E>hM#LttH&ROgERrBg+IWqWoK~V$bNhq2degft;7IDKf zKQ~ROchUYSYSj5WRibrax;uriiGDg}`>ZJY2GX>hhG;{Y2#Ri{7wyIp6z@)9ey$Rz zPp-TefK3q81(A(?m=(R-#ggpA2tpS z>5KlLv2$=xPvXPER{GSltk^`dEdOBg(2F;FBtK`_?KGa;Jy`nLHghzWh{nRv+DjB! z)j4Thg-6>lmtpK2zqz_PJuh6NCFg$-6eV6BN*$0WVt=iWq_Dy-Cd=aGEjdk5%TYAe zT*;t9wplndv0NBdT5xr0lUXWJS~xw|H^j$5N9G4QGb0}@ zHLw!A1_n{mKps$(Qer8d4*8{_0ehhVD5CtZ)I#r4$WT}pjABUWgGH;BCl<-aLh3QL z`ZMEciC#6|(qVOWar|TF<>~cx>-A~p^#$$yi}TiTP05|}5OwT1= zrj_resm81`M>0lo7lk?0x`~VY-^SQ3g{*hm^!%9vb5;Yq$oHGzzeJlV7nb>vk%2E|y4<{nCloJb5i? zw954?HL`J(Gxf`gyXXkN`^qYiG^VhDLil$}jIR(vUNpV7eFcNZG!J9O6GjGbw)tx& z8SRiecae!esX;HHY?PkvX(f6jf-qA!0IH_;@cr#m(pX#9KOaeorw#GLe8>oHz-SqQ z2hu)Raf@{U=p-_1KtGQ6x3+h?jd*wIan7CO@kLA{K6in+YulBsW{x8YM7)9n0|MM! z<`r6064}5JX9u+@)e5+GTtNK$XVG5mqdu0NCUw#u$yAnvC;f+;HcMf@zWWt^ba}|z zyY)TR1eYzlVi%tR}sKLKH!XMgt_~CF&wLTRT>Fm zz|nf1fr`W`B^p^n&}XbobdM1M?!lYMthXr;;2NBx$cXZ>F1ln*Ug??!QT-E3PjGV) zl-9Bd*;pt^nL1XM37to&VuwhpO%XbEBlodg@qW@Bnw0V_iWmv~|DZfC*0@#8MBtXy zf%0&8KQ2syU}za>kxG1-12SIsnj%SAUmpzb@#i*{mOGbh2skrk9*fz9OepPgZWL5M zpUQJw0inW{s3;puu~3}b0n(H_imP~Y0WM9srOVbI-yl+mh+p)QYix)cL9MxjR0at) z_uf|v)P6coNkDC=OO$ov@_UmCQ5o~k$*jo`Dmn)7{6ifn-|1;_Vk_&uWWpZpj6hAF z(k1B%A1T5rFYj>E0TkFklny>~*^bTlH?T9UoX8RIbZGdhRL|o+eQSgpNGp&>sp^y%*{WxOb?>j{q(DYF)7}XPWl8@^ckpr8Ip@=+~{hn|&1|IwkO%@ zd-ae;0;!MF#IfiPoQH@bFYTWSu`R_S22}Y$Vd6Whre~#`d^nJXemhOaTAjlv){EDS zIn<&x?qM*iKkrs|o>YLimXg;D1( zdrVwY3r%4e-Rg0xB?(7{dB|7A6b{WwjLk>UR&!=)XBf9aNLL-!QllYDAVT|v*Wy>` zF=|mMA8Sn7=|k@J1OuY5N7O8*Rg;tC(V}R;+lPocoiNEp1?{#XJ>C;SEWi1k7F7DU@>o4S?dhhgmE|+ zR#E+{I$&t${gg$`bi>!kW|W~d%vB=BS-yjktZ#9pZk|( z0|~$n>v=j#hf*QkrIw?*6+>M)MT}>O9_XIFp^ge?0HXAOnntO50_C`E)IV~v_pJ7*UcmolSPr6Gc`#do(QX5i4ysOOF}Gac z@NkE|P;(W59q@ImVooJm|Z-TlM-sL%G(|9=NR6#DLBfE!k9MkGe3Yd{)8T>rKZ`<_PUHf`_<;n1~B@N1xOm-{~ z0)$U_l%WJO0Dy?aPt^~J-hM^fIUOtye_KX2HvlFlA;AEV;~JO8PVQG-{^wHO-Jk*8 zUCa_4E+fxnle=R`D7=-H$bkz=tT(DbN;N46X!_D5jii>{XG+z!&L2udxphLP5HKqo zFb%HG=fGkCAhEKNe;^$h}4P$Qzrs_)1e@EBo^oF3O zRsrcJg{Z-Z2ZR~yHZQ=M&>Dj}x0NGgA!3wN|_-indNp6I?$Z= zB_fQc?XgEQRh*DLYb0SUe(TOLC^Rr)J<{E;z5gI zX$IsFSaqn+gG3Uy0CeKqZ*j!f0GE^Bh=#G`-T1`QP=&O}pd|0{F~Ws3)d~$7BI_sR z&S+yejRriOnN}G?cthr$hP&yR-F;z!F}4#ptoSv1=VP8&yYPhAdzVbqS;Fuo_^~x2 z?9%N$*@09+l>}rq-(3zJ4T#l9cBe{0BfU#_aW%Wx_$%_#6q2$B2ACO2VciE4sj{D~ zDq&Kb_Vd|%I{IYspRsUum;FAx1z`cwLx;)77>4G_l)=m&$b@*%u+o!>RCcQMeI`=b zaYQP=<@Sc%?q)=oGp#-g2J@`$yv;dg6W9rVi;6beiSCU6Lcz&?GJL13IWL-{U(Xzr9ZPyNJ3Rtv4nG)regdqvejAy1)%#G&wV(hA2NDAz0t{Lj;AQ^=l z+^6%2rBoXLANGw1Cfr!{CQ#z5S{pBd!TU+A^s(<8BvFrt4Z#|n($wUe_v!m|^EI3j zZTs{r?e;!?e3ji_XB%?Jp)jwnCy5eGR(oMS4sbc<-{4!IezK**%C#%=#yc|0Q%OR$ zLV_F?Z&IS6Q4qTeDrvGeA>}}FtJ3gz`aervho{Xv6Yfo3T!gKrR31>E7^;kYfI3F_9lSYk3d;18BtR_mwAZoxOxA1ZB78v?h3R9vI;Rg}b z{z8=OWVbS{5ee~feGF#jb{;zT+8LF>HTGDw=*2=-z$=2+v|6L?Y}AWk_pnE@su!S8 z5#JC3kIzn$?~PO#6rs2V5S{gYB0~mlp2Gf6%)P9 zu^}Lifg0E}!8Pn+e(CzgWr0;KgF9TIMk5nE93*}A{85xhu`tCPGUpc({RLd=?4yb> zP)Udih%S{H=2BErCYDhZM=!x3ynE_`kl46lH9}(MQ=1VxGYo{XrmGj8IS-5--MMR* z7-Ypg{5E}0%5BvCHGUt@9AoO%YEl+=VChJx-WWNGx+&r^(`1r}btwqnSu(Me znN6yw|1MwgJKXewj*$)YE^cp=spG>|iLuEl1)038ZUmihKJv^h=HWxo9gulV!1^;E z`<);sS0Dlr>siL|`N)ccn$6K7-+3c+MBAMAQEuNs|CF{;Wc@wHfu@4%5qM{}>ykHJ z?39dCIV>;EJI9(PfBMrUr$X7U(}bb&EVbSzfv4il$z`NUhPQ8cv-Y&092d8KpwlXB zjt39K^#n&_z=h^Ww&E$r$gE(f!1um&-Ge{K1YnF#;5j(yWbx!dML}Ubv$%*6b-2dp zp0Ib$gFONXkt#pjk}jo+9;orm2vhh+4TiA`jPu2zyvigvt4KTSI_8$S4Lm45uE_#H z$7)}+z!uil8uxY0Yum44SDFdSj`s$y9mc`3Q60pPRcqsF2LQdR`X*5#)B#h_>W93B z(sVN`%4*7*=)&%V8|oel`l~ygy=$mu{^06Iniah>Eu-Ms^0 z&N=7WMI=0aS-qsCJ^W>rc0>1bH5)tjHA(H$u)>33>-mSVL?UI$%H*VOg}UzfT_Sx%^CMbzuO-y#MX( zWhHlv@94-6 zVCd6c^j%b!d|@e@qb@Qau0?(49*AFdSrl%2Po}&1@?En!;PB}}{`SJ?ZNl9=ghU7G z*a3>qQB{qU(b(fwIV?A}i~@a!8Z(HUl8~60A)@#m6pQTP@8(i8)!!vPsuxM0IW@-p z`Ro&7q9yb~H-l`FjBgB|q{4gwnC2);LwMu%?p8h7uP1xG-9f##+t}XT+T9-X`g@1H zesr@0D90s5^+7Veh*M;l8vGsyrL5kY1aFhE0gy7^ct@oDmFyGFp?z$ z@Z3Ddv>upoqE%W|Zn@H=S|R?84)GE56UmUdm7qoAhDHR&;VMHENjxaPOa)idT2 zQ1;^#Ksy$gch83M0DchmwaM+}IU#Yu71WdasQEz4bG>MuotV|*1TVrT>Db$}z6iwP zv7m{YPZONpBNdXkK|^;BSHfB?S{%g?N5QFqS0x!{%SP;tXKk4g1x3cZCC;70B{s`rbL7C${!l2z$$|=OvyU^Wzt$le zoUGLVNA+~6PmLV;eBwf_*h2d^mby^9lCR-!0|q^p)ec|Ljf7r0a30(M@sJGrUeJiw zOgQ*r!576yy1oACTEjLK5V)2$fLq_b&cWTBOMeDNkGtO@&hCmhY{3=GD~(Y4!BsgV z0siO{vm>iffL2bkqM3frNM?3OVtQ(tTIuuwmeeq!CRsokTfPdpk~pf=T~mN(Ud_h^ z5J4oFxgPc@m@G0(qrc8m)S(H`j=%}Ha@plpd|gh>=g8){OJs#VpUsnsOGkiXJ&zxF z1G^BT$EhRQJ)cOBMN@DUq(hIKifZJ}ViM$?h6DxYiDEf_twU`8+K5IB@BsM?9T{uC zt{HhT2YTqL-#z0Gqu>9Yua#dm;JY4!&A*ERPOj9KfXVg`E9G*y4q4{jiE;w~P3%|% zRh?rE5iirfom2748-Iy`WB)*cS2dF|IJYSYQk;XYes0iE`3qE0Yqwrrwk}W2`4Y77 zTHw6}HK%k*Ys5ts5-Z0|auUYJe2V~C?S~xI| zK7u7H+*Q0YG|TA}NIltUBVG{RZROluvbETjAJ=L%x$n6!w9Un}?!&kWmi7P=iREBBN2*QFBu?qRK!{0v2d4Xfzu6X>-MO=s``pw=X_sqf)s0S zPHDg}M!~$Y@IIXT?7|F1nF?B|Gl)M;pOr8K?}0bh?a=wB*lxvQ$&MyXIZx*Otm>YJ zIj|JHX*Zq0NQTlNp%=j&ms9^LOH51sj00f#M!7})lsmWC&v;Mpk52GPyx(a}933*u zm763(*b1&n;LQP_AQVP{<2kxstRHa$h3lXc&yLOX&^i=KO+bBM$04UQ=LPRm)}zKH zM2AO}l5w;V)i?s+IO76S%{4Nol|&^b1p@uB8|FW;6rM)CKEjJ_?D9|L^=C?itUk$7 z&$@FHttal_bL0g^!5&8SffWEg%V%>12SQMC7H2jWS{UQBWM$@C0pRrtRdM02fLS5- ze{RvceBQ&BqoJOjU%WnjEy5g?&lFwd?iEJMS>i&w)PF|!(3=i1**(&yWl5YKU!0#` zoxXU}K0RT@`kp!Q=wEu$^^1!)=O@ARy-a2SvfM>>B}vC>*x@0xs9Pdoqp>7NaJGtM zEO3`C-tWJZn~uRft!@oAT0G9r!xD7Y@UqlghA0OQ@w(P{8O0M^j}N6a^GdUpr{5ED$UP!Wk#CeixbdQPsdE^RbIbyXz$Ox+z_<>m_ka zw-*TlZ`iMvj7}UZ^w8OW0yQ4-R;;dp4eB9A^#vjktOBxg{0&;^VcT_glc?G9SB6SWmIYbPEJzvRqu+qX{z{C0*+TedzB1Y^XfcH|Ki7Y^R}qMQKLHS@vG5TTE%Ar@~n?nXxclTv)G*tzKSV@m%Hw zDf&i+_v(TP+gk#6aj(VpN0S$PsN7{-W!SND8+hN$ zsSj`A0~BZ3_%l7gptP8_=;NekBwV#O3x=-8z2(~{g8vasG>G_>goIb4=&*iYMcLXV zv*`wi>ve%J2Ap?c@C_F!B-5eG%%RD;g8&C1mTSl9Sh%*s-79lW2Wx~EtKP(yv!xea zeGSGu-91Qz2J$mhu}fXRzJ=y#oA*=0*3bq?a{iB3AIZ}|nA;^xUZ1gR)PL!H42Xc( z3HOf7q##Y9^mJXcVJ})HW7Yg?gQ*LSA-KAVRfD94$Xv_5yAxl-O=v(p7|XOfJHA}& zA$~u&U4wLDK78h;5`BQUWdj7|GVjR3@Pp;xj+x+KRK zowUwhO7)v>11z?|8A2?uIto2(OK1|Scc~S#OvZ+x%oB$mEGlgUr=0~qN?H`oo8CFC;fN%;LUL=g{c#!GlI_JSukbz>MMT z_SyH(>b1r;I}g!a8{MCb6yVPrtHlX)Mne!^32WJwjS0z}3PXva@)vUKlsAT7nfQ8s z&%7G8?!2>xq|`KaE_VrT=#(N3Dm(x$84RBl#*Q_#ChHO?QQ(|i2_cuYGKy!@A``db zgQUt`ft$m8dCXm*X2Ns#wuI_Pykoe*NL^1Cib!~Ife~WrQX4?l5?&6 ze4fQJdxWm0;tErJj#F}Gfx4n(b1Ha>3FcxauxD}xmP%O@mB8i+=~TEFHhyLM5B@0i z%qaopgDVA@P9u)L({6Aqe6FMfP0f7boVyN+RmzpXDs_}QCi+i$JVGIjDjN!P&RE@oF*C3mtognLQBV^WvI4cf}VF`%kBl|xY8&_y% z9$cP9-q)Px7#qCrO4(zg)!HTxhi_U%z&7|Gs(x6Ns=gZoSCphr99Y|E1y@lsiL9)Zz6p5B+-<**N{>|z}ZP{8HXOi?b=1e*Bae@eS zz30w{yHs|Eu;f!4d-Z?y8!^rUPAED|=!=bt=b-9)xnvBllKm-mhxcNlo=a|gt*Yaw zM(uLGUE)$6kV#be(^{|RfD>+|IAzWHg=lvZYz<0>Bm9#S{dCBWRB$*31OGH8% z5M?6)IfXmqm3_%v#ll}54^>AOE-rw8rHz77Cpr^|fLUjBUef|Utrn(FhmjE!#%#6? zq}GUxrBjq(k(ToRG3+nuG*3faDj<+Xr|%I4n{uV^+p(4llWEi8wo{-p-F(>I_ zcmka z!=yb@3(V9C6~o|G^@|wel~~u2TGy!-x)(UFZRKUQyf0y=*&F3zVgg8#yi|Lb_f_Mm zs%QCpG?YLujFZg_QzPL%$i0OoyH+I5WOm0;QuFlBh2qU9H|$PJ=6ZSl#y6{U3~sL$ zQZ21qnX!>=F8L0)tj@^whHH1t13s49Ma<9Ci}^;K%oZx zAo=Si*sL6VM~>O&8(h`Qjf&|LT8nFJeMpw}fLgQH3J9tq9W=aAOy z1NROEX`L6u9h2I_xf&{krDL0p_iErY47i+F1*@7`7B&G*;%{7(mFDg5rJ(4x*-yL( zd66q~3T{FQFJIRg^NtI%P8Kd3D^4HaT#q(&%5uCAURDUpx01jvkY0JSG-%S5vPwwF zUcKkdf%_!MLDYs^farqbF(O_eb_DA_ihEzG6BkYc60nFe-$5S1;y zG5~x&&ZG)0lm2E(8bFP2It&2lc4wI;Dw#n7FIvT`XDBTvNxWh-cqcr+$)E_qBAvgy z+3=x3vVnxzT~g>Q98i&b!$pdiSelo0!SN^>zaat2Bt5h_HuIz$YA?StO)enCE+_SL ziUjSc)LrjwRfE!c{pKRX;1pivX=I zak=7(4w(R)|8;?=KX@T)xr^{IH>q344?^Y5$t>Wn^#`_0k(~)_ywdAW@aTnN1ae%5 zq!y~RnZ_WtB%g>rW&}l%pCB?w&ZS1>V#6WiSEa$KoYx!E>K64f!c+ZP+7}MoF z15BgD0@m-&k+%wifOJ5u=cG=#lo)VPMTT>W;Q7pQ7lab$mRD@UX@aX!-c8`rm7Z0E zWfbAi-wRgHzZlV7!TGP|KW{>lpEJ$E2xE)N+L=dQx08)~JIuPY8J*j_;SFl9!d@=AfFgz3Nilt9kUDcw)aV7JTqzLBc!1 zN{K^h0|udNa1x%Y=FUHV&&Lt=6LQ6zlFX@JPO|WlG&_~eaOMnEVJV5MF&&)qF+0{F ztJs;Fht$xck=vQvMmHIga_AV9S=mR{M};=TRHI;M!_-aT-bvVX&)(#RiR#od<6Hr* zsj9#x_HC+gi>IT&*=MA@P;^DJ_Z~D(;^iH#ep#>(^J7UXU{xR%?hz%83kEAx(CHXj zF&O+u2?zkNTXN6NY;}}iBi?6{oCm2R9^H*vF}K+tnoKAHJ1ry+46>WqicDwY9&@EA ziq5ESU9zusAxQ2rQIT><(AiW9gyk9X|3E}+kZDqi@7Vn|4i?)G7$z&IfLId>KaZ83 zD3uz3f`|{QM$%}v>h)c5W?P}-Zd~u~@9!q@c0F2OZGs`D42`jxk)#3lECoIMx_Q}J z-SGSfPGdL{fy%0=t0iOKu|2m=6JJ2qxGbQ1XityeN$AHdPOzHlmV#2^GzX_+SRx9S zn1SM_b1GnSA=RI0UaYd{Ss;~LrLw&#)ZI&Nl>u(qUhN-$Lcr=MgRXF+ur%R;7GP>)P&|9Vj!OpG9YG~c1ds!*z$ z$g<|9$!$FCa}tWiKBppDQy14$Gss|A!v{A91rVH@1fF0-C#%$6l^2tw{7a$QBKlSN3}A&XfSXvnffH)%GX6Ut!H6Lb&)(T=iH z+AYT06YH^G?&yL;zD9Tt!sx~$W;uowA-M38K}~Hf=FSE+ zmsms@l?>N|`c@HDG2EusWw2ZOPU~!>V@4ivmrWedF|40p9*RuKN7^(smPepbFjE#| zfri8n0vx&QMd17smLf4qQf3CKKjx9lvfc~fs%7oxPja%l!04Qfj3LLq+h7M zWpxW}B!x;F!kkT)(P}i;rLSP(92_Ex0((d3MMde+r=sqqrM1qoZ@tS;6hY3Q`)hYT z5Y1JnkD$IluSB2LpQ~R8+!IUz11fFDz^=ARUsDTN)8Uga*UFpfvmcsD30)+*=*>7Q zeoM{g#5?m8XQdn&s*iJA(CKo(4E57K%QUH}G`&swM_-9z@YSaZapf$_-8VQE)cAh6oYh7(ee~ibT4)e*>ii?bjLuFJf z5ISvdJ)Ju%V9nyaRwz%b@zox`_@gM_Y;DR=0=7GK#l>Np_WjsGjyTp~M(1QLJ70l*cpPqj!nXn5w(fgIfaTMAH?=0kM+j z18`0mcLcE=qxVSe6J7Eb(6Q+iMS3-5$T$ksKy`r!idAt?hd?pvI11w{>tn*HCD3{@ zxVpnk*++O|Nfkh&%u916&1AFBII2M@z2Q|`>trqP9#{@6YiUDTnXWEx&~xF{;{G?b z_ZtU~^AIepdlK#z-Upsvj{Q|G$5+C~w_39={WU3+sqF0>#s~XJ67OywIKKRlsV<<| zQvN*OlE`pnvxudZ1sG$LJ#!{{Ljr`Fm7y)t#;c)KaB2%SSFF>)ptrZ(>rx+g`$6=< zZ5f<8@oR{|aq)y?g+Xy|>507Tij??e3Q)n2<-syoS|IPsW%(O*8^gse7<8YM z349>ON-po%za!)rxuZxZek`O_=|!6+gXiR;4FaSO^smr@!xOs@Lh!CG1jY&p9O!_f zERd+K7AFG{pL5C5m;}JtH)e-IY(dUWbI~3jML*B!rXSPkB;^Vn(RUB;?dKmJxOm6M zDm`mdo6f&q_9Bb(Y~>IGrg3%yfM@2-)!CBwv{QUfXGt2h@6t~lw{YPMwS0*&Wif6w z@K4F6e$s4AqNjj{wlJfa%8*+7|5XqdO1=2QOHcW|USU zFM7Fx)R~saGSi0r(`jR*J&CN*%yUw!1RpQSlpdMW%q&IGZx$|6P=)vxnNi+Kawp}H zMC-$Brf3J{DumA4=jBQgUT8MZV<_SRwAM_kjO<1uR7@C-eMn^Fz-1@vaJ-M+;W0tXvF}+vt*%_6J(C>t)T2OLs+Y<8ktM1)EPb zzJzx3Jo|tz(Y}$Djr;Ha!aDk6WT4{89E$<(@_l6&C`7L1rU&v$4IT zNZ8hH^vC(wO~;cO`D6Tk-i=;OvtN_<(fXdv=g!75(+56VwtSXbJSWUMm_4{CMmkum ztu0`p51?<*99N~iBed(ubUJJLW z+YnBXc)&W0?)AkEF~)$89aSOaDe3}D9VhTp>;4^EZFDF_Gy}qS#IMZgaiFpc`4A(8 zLS3!SHzHnO4Ssf&wFRtShQx@$}_A-?332vkr`)d-U&Q97mZ11U95Rj$>0ZU zRJ`-9pUt~N6@j!^*eRX!Q4PF1bxB4!OQvCNQ&Dr`D+2D$yO>Ax?iIrcUo_9!r_qdA zEywXJ)6(aTkSqx`IjEY-jfyryMA2=A+FYD%62-SPhT8HngzA^@J0gg0a0n=*2(|Co zy~*D%DeX{?+R4N<_%sFRQnk+6Xu`Ws7(*F2E-5_DX7EOi*j{D;?Kz;*?KtUIv%#R+ zeK;!W#oyijh5!9Q3PQ1igzH0n|8&#%3h~?N%&%gYH{pi=L>IUI6MFapF?`KqeQ*c@ zJ|U$uq@LU@>8bYdu>POXN3MItgnGPd04U;K3;+%pC?1QfePs+{Q*_?eR2F_=XLWZKIo)&7kgDD zDm9i~hTTG%P1tSVz^TDX@JQ(AWOqp>u4>7QI}^oA8c~QL>qrvY>n3-pqKd_|a{O4m zNd)`7CMHr?RLo$m;tyfD^WdK>gad9O2I_l7Buw=5v|sz&dfq?yPgpDGtW(HHlvhmZ z+JZImvpen|S z%A=`d1vzi1dX^)L!Ad=dsniQ(;6rs5%>#%D+%f@@UsFPGJoEynr121v?Uj!8YSoTj!_O5%_K4nfBGt{qyulkkhdu$8|hj66agr&}Phs z?gM#>#drL8`s6(cBB({LaAVZd%YCfP^V1@tt+Xv{*=j4b1)EP?ViqO`n~tPbyaC~K z#cXEaxd*;C0)dPf!Vn{`_AaBf95dsSbW#CRdaJ5|iVkv7#xGLGUQ3A>#yrVnbQ4|$ z<~Va$ZrW|Vp(ex_u12$G4Cq19KjN{~XC{BQxr>a7D$@K*A zKbj>PTiG7SUIxkr~4%mwE@(~_jcFGc@caFV5-Eg!YE z#G}QpO$Vn{O&o);!Ir;ZB#)FAE804Iq!eX3ids~2yXaFn;~(|7Yv-`?owCf z9D@BS0j_d2SS~UBvGu~s%|L%+q3iPUszK9~#=<`}&P;Nx26A+o2<}lG;5$3@Mx)-{ zu5SNxFvzz244lf4{!7+t88^bpDYN(2HJ@;lz{l$wDdrl)lS* zrKdzc-p8MLAdJ@9ojk|oGt*ny+o^VGuoJQlr<0yjY&DmVLyJvURYm)l#eiL**! zznxyZ=$u`gzf|z+4#bh%;Y%Rm4Z1moR)8LAhhINsS`OVkz~SiQYmc}#$znkxy$ zur5ZNe>ify%|MLMA;<{bp%iKhI6AQqs;R)VWoI*mYbwS%ZN#pz5h-^U^EwX(d4i%; zeFtght0&X+1MQQb9%08{Zt%jf@O^VqU{4T*27=UDbjpElRphw^648oXmZz1UK;MVW z1GXv*7<}}*XK0#?JYZ$zXO?r6l>v<2;@_boup{}&Gp6W=8va929-x;3AMp>k|6s@%>ffcI=jFNj$A$;sG#Y6 zd^70}a7ZBvbo{D${_?b4L=<%YHegPBecr+anqK}7Z(t$)^5ncx=yw(UA7u%2n5PA$d zw>8)oWPwJGXTi54sbPEpt4dfU<0)-6g)Y*_^9NFSKC-x+`QnkG$|U-d0DYEeQX&x8 zpUutvGI$<{C~E4L!KKx27qTPxWSYa|V+_jiABXWA_V)An?a`NE+qSFq?ag|fmH@DA zcx&8nbe7HE(>{tHuK}#N@J=^F-g*9^*J!Mii~M;nT2;ekRpbF^z1DiMj;w{Hr;7yQ zx^JEJrLFOC!gL^0;2IOASc7`qt+txi3shk_+3mCuGOMvkz{>n*Gou3kS@#h&MTFzD~?4;p*%!C+@=knE9y zzke8ax03C{{^3@V#P!|YLAz*ni7W%vrjT$0b_ zY%ktnX}n?jmt+dsoY^-$M>CH_Bxw8~tpdnbms1mZVo}@1u~vtvm{xDJ^yxn|BVANF zn$w2)kSx9~SEJU@!jFv+Z_@WHHvn;wldBSBC7^f!?Lcs3u^y2xomxRt^W!-i1aHZu zK%t7Agk7B{4BRu>EkFxovdbYy;uD}V97gg0hFKxi0I+Uec@<$o5CN$XkwmK^Vp#}! znWxjc-YVhia0oA*Vdz5=H;C;hVeL|LDIZ@lz-Bqt_|M)bQ&s!IEe`&$UN*Ed^vIDR zv0Va}la>aYdQ_^Ja9uiu6flgUT)CA^@6x10)9o?&K+-n~lHYIy?eGz_XGc)UWNDDe zGMPHf;~1sd3JwBiyh^1!LH8-VQWDgvCu(h6H?LdAXRYVJWpK^;cCAcFD@wAc+m6-) zE(5$}D|GK{Wif5_23ruEY>dIj%Z#Uk!ib)}p=*m8p#mDyVUjP3H`04@1zPfe{p}{6 zlEHw3v3SwNmRw>MqmI^Y)0t-1S8>@I+#AV91>!p#0Yk^~l=*VLP*jBo43tz4WbqNZ zj|7+|bh`%BroBDT46)J`kQd#=Jjfa9bSv`CWvfZr{)(e#1P^Blrwsa`8F)`0#7VK& zoG6n_;cwECh**QC$IbKO)3dYFlf@U-!TdB)?5uYC((z!mrp;sDI0gwQe6p@{@m045_jD1kG`fG__>N@sP7v z@9-c;(ac@}N#E=Vn8%JIHyu)%C}MV5Ks)TwS&+I|E1ZRlQkcWb8x)dMcv!g1Y~EZR zV!2b2Xv0vkOw`i(MBGCj$IAh_F60T7=3 zM4L}CB?VO0+QOX10=1`Kh91KnLvV2C3R_BNzOd936jdu&`E|}QchXIcfFpOpsNd)G zr|Z+Ja~#|pkm++CnyNmi{c3byQY%UoW?CJzg@eRcJpgJ_ygV7-@mP=)?HxNWkB_6~ z^Ok0O@azT;;4fX|F77im7#ssi09)0Q())PTt}jvM%)C8Z5jP3c(U$Kd@a38->C zXGZ>prc8GkfsT!|>Y+Hcqe6pH>_xQ~xT{EiW*&W5)@N=^y5xGev`g~rC1>^F($%~G?_v-nhXDg-2)`wY zZ4^vn@fJ56+1x ztG8WJeQlt3z6t{poP34$0V(T{g>3t26`I=ORBaXqe59vskVqGtFS~^|^(0&oX?Vj9 zC@MSb59c=<>@%*$(|mi{IX=5+pLW_V0OzaeX$`$jE=6CS_Dt-xYCp@}ID_JDgWXk9tMQNcDKx+TUJS`wSQY7=c4VM=r>s z{J244A9w~36Tq2dE*?fH^d8!dbFyT6s3ziiVAfBE&Yn)nQ4v}7D(r=BpjS%a6kL37 zCtzd*CvU9q>QX&2zYRM1eLU%aWliHRHbC&(1hE(x=HP6>0kozzsnTCgE3SH)K1*XV z;^R}E;$C4h6<>WJ%R!NJY=69MyB)6Xx+gB9Ak&$}VNY!~b_a2x7C>(``#kK{cHL4$ z(A2NL?$oPv>|`INIB^gMy6>$8I$hOx7)Zt5GR1;%j+|+p!h+I8@z;4alf(>xr0WMp zly`OJ{TC!Pirx!44%KDR*sO2w?$+S3@Q(S29rHmbbmfaXZ(YB}i^THj^|XR9$$8w! z#;y8L=}72Hxd!kP(Ohpb(lzepPQ7aH8F@uic!Lq zwwJ{2Q;}We+dy^=5^+x3$VE^1H4dk+9e$`_MX1?3CY5{xqaEer6)Ip-wvI2(U$kDn zxjOA!UY#~yKR-Kt{2R_d>b!3L@#5-p*R;-qYhIlm|Jb=~Ucc(JPcNHS&1-yDjhZO+ z#9~L-(8GFI47r`UrQ)iATF4cjop3RCdceiotIogu+fLmpjOAHOMp7q@D=QldfrLfO zzI%Rg@^i?n#$C&o-C}ggz$$5(laP~{dH*Yp<}z1*LBM|CQ#@;ALW*gDHQ`&KcJrnC zXf~b06XX-iJQ1%!%v>C$`uVF!mxsS@J{A#6%m1fiT_O0IH?9h}`-}s>8cRyFDBQA* z?s6aEoGXGl-21$n-?65uGf0d7&Q*T@U%M^qdyj6*X@Xi-vqW7BQS-QSb^71mw5~M3 z9$87D-Xl9y3YO_4$>~tVVL*o|lU*#iWx~#HP@Lp64a1n)miWyYgPPWSl98$;v}^x5 zkNeY{JFk(&d7&?w?IOCQ*k2BiP(!x_ij}c-_%osYBJDJNj zXpUtxmhXMaY8G{o6?Uv9EWPghcKK4aoh~F+ckz4}EZk+g{q!SO<4p`;iKS?3O0IYz zB?~yy##pMXu%A1~&6~N#NT4-qY$d4WYg$vV3trR7H)2#zus9xlxzj`>m(d#WDpqV% zE-E#tq0{Ad^rARb9s}`1SWf=Pjt-aHD=Hh3e3e~F?vsQ*6s#~;{1PJmz{%sO(YI>5 zKRJuN7M-*IBwSR^6QVWAgtA9_1Xz<5;qVoAO3xKqS60haMvizQhM+5ZgWfEk6N#*0 zpd;~Va@{iwn3omgn07=x5Xd{2PlMuF;(4MA-4K`VRPU8o(hqmulmI{M?8r-CAL(-y zRS2V&&!ExWDze7!8*!0Y?_Ha2(uEb{*w-ji+uZx!)R(6dQCk9n3b9GsCAW}BWhuX7 zr2`DEA*>BWON4VqM_!!hXk^(z<*Vk{aV~Ra`db0%EHR(ygF^3 zoL*@z&2jP5w!(o5Z%hSDI#_JPc-9L#j%+$v35cH>D7~=M{i9zukFPE|C#|c{%@ODl z7IL}NJ7bcnQyLQ={%fCW2PS91xvcdQ3TsO1NGa0Vy2zw{!Cc=fNcdjr?DUa*I|p?f zV|KXG0B)2>Nk345mUdFM7C>^P?&P({mO|-uhrKHanU>(yoT%}+jlvDT#>vQ~-K z1`G*ULtp5<&Xcv^_2pr%ODTJx+e^AT_4?s%T#`A87Z`YA_69tmxM zgH^;Dl9C(;k*z{?06>PtpYRxJqx7HxP@5FpJY|q}JWj+D=&Ib@XTA(1qc{@D=?HW9 z1Q||Kj>e?c(YOy)H7L}8!e`3c>Y>`^G(hi-b=-oUH5A(#yG#kKQZomnY9w_m!pOUD zSZW3fN}8c0E23EzM@@}xIi9e3Lgw5IZcxdKQP(;d>~1o;LFC>S)E-3*ooN2=<- zfuhOx$m=cWFnXv37jhtS%3c5t=Q#yP{2Xe>3~1L63l+Ph8H-K0X^^F(U``27#5uwY z{O^5Osqp0r^z7ZLQldjX>@zv&BwHx`n;legvCV`6b29I`P5|{EI{cp z7<}092_DPccqJG5$0E$*Jb_v>>8^BD?(*jzYxk2U#r4&jQ;bM>GlJ70FjVv&WC*#~ zkU8(sf=LDva*d!l`nB%QTjVCpXB?qp)zvK-U0LqB;z4>8wXRw}6&42FjZ;AKR{7+} zlPM35&l6nHLZY?AW4&+0Hd{|j)C=&upGd;ntq-<#`v>t(cdOsn z8|?IUlX^1P+p2GEAM70*bob-!#%^yvE@zQ`;%TZxj)PoKB~iJLMZ;oWdf${q**T`G+NrWEnZAwgWjRR1Lb-8QCi-$OYUWiJh^8B$*N7^y=#T!qh76 z2#1!Il2Xa2f!Hsg{omxSPN#6|YQPJLF$J74R85}C5}&kyAc4lJ{Z^dfR<*vjS+8#$ zC{D5D^>4@j@&6e{tuFITM8_P>o!$P&|AgWwg6{}v8M<2lde`!l^Q4Ftme{9_>1c6x zNDxx1AQmC)2ix_-?YOtITX%V`^wm~FbL4XuJxX&AOXDSkd%_knShpb{@d@Iojx_^D6;RMn3) z&#|%=J$t5v3cL}oJI|XZ;vtkuFvx4`S@A@z`GW5EK5SYC)T}MGVuA+b-c=A?GM$Q2 zz={e2D)6cjfBV?p)?r~jMX9$_Ay-En4!!C-@$6QSNKE43*|tDUk(pY??Fu2weEfcl zg7QA^9N2?^Lsv3yl^)t91*<}tFFv(KnyFNH(xyGtF|1bM*Wq$}!?1d?X{c#vw-?8` zbby&V8Y8KL)0gaJPAEjrB~9=Vp3Y!qo!o)+_W56jwXJA921P+W+Xyqk4r`54E1!Kx zDV;{zpizn;Uu>MS%=SLr_+Fv$a*huQ$J(1rWh`LR`x95S$)X>p$>-8f*~;Xmu%1tv z*UjsnFHdPbG=EB_k{5+sjY_mnWfL z5cq{sLQfh8byg0!smfjzA67Y->%yZthT92tqw*n*Ts&66O-}#do(Z3x|2p8P z*ernF9-U5q?*dPTY`mp#Ii?v6R>6Z#14B+SHJrv5`XNY zdxwrl&2JPbf6l2D&0&uV*?)?aYoP=p>I8@nn6>hlaU)6)7!VRK+y)`CP~foGm|Au? znFVspuR=__7`XtsdJYY!5|%iTg9KzL-0X@1Q$ZRqmq^4M%%oDbh+X;+whKImk2J(p zp(@~$rxngzBG6I|ZGSH>QEH5#arj^>4j;f>22y%l;_~OaVM}ubXgY1Q7!7D%C2T%` z!&G>zv=qfM(j%is0JU@Ot2Bb8aIVFl=F?$BoA-fn$3}~wsZHjY?LOc#gGHjg@H?8xXd<5}1Z@_;jvl?uLZ0{5ZlMdU^Y(S~?Ci+cmmJ7?S?`OtzHD7r zTjwt>yz1#Z{!e+J>Jdl=%M&XB=a1-kGLfR0@`j&ovVN}Le|k>K<~*Z)aW_vNPoed2 ztL-f{`KbAOW(MG4%6s_+_H9kr%#d)Sanh`q1jVFUB($K~;x>dE;($}SE1YOJn;;IW zj!kOGDJRQ-J@jk2))Zq#Agq!`ZNIj=plNSy6(-@0(s}sIT+YWWZihzU4kxpC=3i(G z(mXR7XgAI)@k>zGm{@v{Xd0cASS$CdUU&-g0cQ;A6J8HjFC+sQv)GAT5rB4N%_T|> zG~mY=iTvB>J&QB?@muT)wq`G{E-pLFh{i$27p( zvRvt_3b~b1xcoBV!M)_uJ&(Sd-2T8Ws&xFlCA>M+lTSgAQ%r{Fq^khNJZmxwW)35* zp<+++1tR-Ok;r6lzJ;Ixm&(GzTaPWDqp3BOgFDS%;fh>7!a|zxLGk8cMnk>JP)+PR zd{zrT`ytQ94{B+C@6-KM07z*-qmbmejHg}BtPC;(A(J2=(m_8NNSq(Vj~2FlQIa?I zKPhu!KFMr4RrWk?28^@nBInvVN>zyn6c*N(4ccRNxuLx62%>Gv4`Nhl1nK({9kB<#-iIuCjA8 zaIAv)#IEy!$Fx*%7sio`mck^S;0xqDX)s6%VoA_mLS;eB$q_$TXL46(s2qSlZ(g_F zo_5}~&QC7hwF9ubxkFv(*0HNBd+X|T_t@qj3Cf7M4T2EQw7$%W)n6ziD;by0&##|f zoONEcPFm+LKie-|L<@)#c2+yW`VfB>c!>qN?sGe=3bOJoa$%JvJ+kad=}q?`hy+-o zZEiYO5WgtTzb*6d2y-4{8uD3977t zateW#V75F5mXG9Uf`$~s^kKDe-$ndiyL@BPb3a&SZ7|WyzZ;I2HI+q{r;=KJj=P`gL(!Z)h8AqD7@B!L~v0jZH#OWzc`y+KN7h;2#XsCs!A(lTN2B4E2lP^#3iliPqtCfYSN@E`Ct7Hd~b7H2e2udr)JHG7_%f}*HZT#S}06;`R=iFET zpV-5ixXO7aXWuv={1o&eH%hJtk96$(1DFMCtq>_&l_Ck$? zNUwMe^9LjosD z*Qq7@vn;yH(q8gdeUN>vL>AxP&4;w7C$ni7n_%%pb1-)9nJWKN=>G4w=8)ajC+iHoj0D67u zl%!;oT4AXrp$k0%VjxLLY3Uqgt5RpHwV&IjM?f7?Eg{52O_+B0<(Z zEgr%1yE?Y=z>0Xp_%Ws4%4rl`XGO@4R09>o+k^MPgmA)_Vu<4S`MmQ_?{dC9fjMr1e7oLH8CPY5K` zaNOg-2LAkY`|a`Kc32BFYm$;2r`D(jBgtlDbFGz)Dc2F$a1Z02P@*Pdy6HLFtnaf= z2S0)uCDP|9wL}udGLMAzRRpoPc+?VGtnfZcM!kuzn}_YBkaa#M^Uy6IMe>aGYuZg` z;K)&UgJuQiQf(%9_om({ z%EId9p+;J!A1u-WcSdiC-t0je-3O!mm~-~76|WS{TG=I!yv-xW5X?m%($LGqzEGT& zXAu(ovlS_p#PZv8wx!;;+GMy^ftdP`y%*z97-`-ov)f;NvO_8q#8z-mOks<+siGCe zS=eL2ShqQ+lC$B$bqm6d3WcnsE6+TWW*y2xI$Q8o2D9zVGFA{{KEssEw*89r%OZBQ zxR{|P|HhS^FUbc`DS9W+=y`4|4wgZKA_OC$3eJ>3Cy_!Jz>h&}kBdwtTuLcf?u3Z^ zBPv?^38pTF<-8oFIQX)bBAm~$gob?K!{xNu~UuJ7-|EE5<_~!RNYm+-{znTy;3qvlgvmEg@{n)h`qe9Yt#jKjBMH z+iiCtpRasfjSMoO9FND5R%29mUe!GqEq!;NZ_$GTF6gHt!=hr7E zEfo7}U7W9}+e8eOX`HIes(-BS)*E$R9HNW3jmPuCW5isvuP?5eFHfUn)~gwcT;?l* z)1DuCWs2Ndwg0Al+IiQ!zTVziQ}J5u>+g2Cyuq*6PflN7v^Olcutv*o&3wj^xam1Q z*822IzNS6Zi=;OIyyr6j$N+Dy-PVc(0_eLwd+qeR$vMWY%eQ-LN}Qu!Hx}l#=oQYW z!n6OCzCj6~HPML}jbQBw{c{yETxKs%IN~6EOGjX4p{}j#s{BxE9B$}SbTn(G)X)iA zqxRM$0L~1-98iZ5&Hdo-%)P1Pop~g;DHr21_pW#uk1x(?Ib3&?-==eY(P_1RZeO3i zE(AhdO$xmW`t&w>J>6Ix)&VR1w+bL+kOi|HHn>(qQ4A&2r6gXz*$MG3SHGh!k z0UDO$QQ($THbR1=*s@?h=k{rl&bdq}sW8ddC-8;YX;rfCwzq_fSLwBbF*=e1Mg=|X zmL=l4C_evmO>g!UZPO%w5o(|IN#c6H*Xtf`^>-Tk{a$yl zzrbAnWj#<%CsNACIUUbDPM#pngjU5lY+G`sB~R8ZlxDkgebxEKGH(|f^c8URLj&r_ z9U?*QIi=Z!2b2e*w&Vy^bWkHiZU2*w(oejO?(V_Xc7JbozrGg__73)Y^<=lvsK{Xwx85Bj+r4^!YisLpKQ49}K(Q-&nHrr^5RAo3pbGJFvPEY0oC196u;Lr(`NQSo5w>vx#E**LggYq9;CcaNW+U zjg^0(8F#k3)LVlH1U@mebb4{NWY%^HgP|=(#{7|c2OV{-^b#(8C;X%AW(lXG*uuwQ z&!l)U*5wm?MXbxJ5MpiTw6KaQX|ESC(l_u6mMC^RYS={wSh#aJG$}l1HBmm=I|$8X!rbyJKDXy6jV2^mHVPm8#e~c}Rz%E3{goM@Hp^S>c%3>?#3)Rd*RGjq0tpj(RWQ5!!_NERc z)$o^_h9jU6-uKGaaIH}p|K zcvz1apZMUon~WruPdv$bD3$LCQJ%wcbWx6 z8)$`VRUXvvKdu+qJpVaLKE}K`7^H^kF+OwgGY|B>XTQ#{C~Yawc`zRgeEAUlxWGeT zpWUs5iTc)mSD zA1>UI7x^;$ktELVQnsz{^)fnXV_X;(c3XIl`bgiYOl{N}PaDWTsr$j1%<>{6XOQ<3 z@G1B>t}8fO5;@bVpa@-6b(RK-OX(M>861k&QNbER!->0$57?zGx#~F4-u_Nf-`OFv zc&jnk8tiTFZtwTw-R<4I-9axo*gF_3JC1e>ay%G7PW=dS-TMiXtRsxkd`-G@>)My{ zlG;yC_8uzHtE^?btTLUiUg2w-@Re)0bS(l7Rv;2|iMZpIWIP^NbYCrG@u^w$;eK>{ z_JSp>cfqlzQYE2)qog(lcG!6`dlyd)rmOWdM*R3p(V_)q1eW~AgT2n)jt>QVE9J1o zWN^+2hT4+iR2@uuy{fqPsv0E()YFK-t(n^LbhL1+PkspoxK~s%uYI5TelPh_V~w*z zMXrQz#8!sAtXXfenNBzufp812AI|i(u!O{E(@`8$F;UL>^ z$sXuI&43#meFGh9BDklILqLS`2^tI zrNpzp@g_aN_+k(Ta?XzPXBS#ro>im3llq1~mP%FYT){F!8w!7^5S0taK&p^*gtBV6 zmhWPhKz^xd*AHwvJuG#3u5p^%JYNe85?L9D(h1*jEov#N(S0KC*~-A&u|33@4k^Q@ zrjC3=6xRW}*$m}0O)JE6mb8=N#gcm6`Q*`vvf z&ylbImejwN0AkGfW6JQdHlB|_O`M9YRIi+5_#T9OO0r}1H}d@1@{x{^PW3t1#;Bt;A) ztisdl4t`Vqf1&$g+NYr@CI9HCHi|gpXxhsqrHnD9IA}s5F3(<6^NHc^=~k{7eD>ai zG&RREcl`B>MEbvdBnxkcDb!`YJ#o3jHJaz`R&-1!;=@o%VLH>dz#3MhuM6(icnI1K z_;{C&f)A674E(Ne{EIE7pfZ4J3J9 zKr05Or;Uc9`w>}Cyjo+<2POqsi4DLdqNNr*=iGP>Y7xN|iL`R}s%`Ot(asXO7ht9< z?joT=ETJw38j7wFOT!pEjZ0QK0yeqFXKt%}|@a-IE+ly(?$J zEpk<=Y4Vpq&?BQI9s;9ArzwJ>!+hZdYAgB@RR@%86=AlLH^*ptsOQ56QKL-$Y0>x! zCo+uUTvFc^b@2k+w*33z3fPD%DmV)d>UA>qNCQlBtNa%_ zdhC>LwVUnZR%tpxZe)P{=B-mtng;2 zj4GtB%5gAGqEuWcuY&@_PZ54Aq2UL{;?6fmAzKV}prT=Mj_MZ*nk>_TZDSa0l>X^l zmkWRui`n_q32j4D6#H2L#v0ZKTKU`q6~0>1n~Mw@Ec%cBLBSZ3rjJR#^sMEok}@DI z(2l85t`(!n%0`h?%=%m2BLpPrrwaN3;!SXKgPvrVNl9WlnC7(hAGBBr>ypb1|H6xV zBCo?^m?JO%pll~;1WA$P?kZ6(idZiL>zYGTvR@~bq(KSDhXDJ<=PC27k&bx^uha7j zrs-KsV7sNUO!C@omfcFILO$8#ir;_9H)*K%Tp}DqwwwA-+}PSX=p82UZgLp+54#1! zuP|}{;E_7ZQlD8*zjzM+k_7#ytWINChd2%L2h!q!zAVL{R2bkNSlmkE?(V2aI#7wX z!zcM~*Xmf^@r>(0sbjX(JX5>Phe@%rL4k%gY@S7lc$mX+sA0(Ydy?wL5wL1LC+($D zD2wPE8LreyU#aa#2OpyBdU^EdTqt~ew#p^@s1!W`fRuXv4|aFA>ixaFq#pP7>Hph1 zjYhY(MGNv^fA26pIOuNaLHUOBft0_}G}%Es;+MhGq0S5(O>tO+)if^KKG&_+my%HB zYr_hak%blEPjX=`$FnHMgaxQw-Z!e1=QAzf%DIutjnBe#yp?VypB<1cq$gbO>j)Mv z(TU+B->14WKtLnw8t-Bk6B;9>QYQ{*G^NN4B+&Eb$&2Re7L%>{IecWC$mqMzmV+TA z7Ga4&Z`+M}$?t2ZDX#Lmvm^)0I}YK{f0&RiK&zDjdKs#m7&$gPhb68)S*>fe0JNuT za_4YoYkw!%+uc6g-rL^ZrRBIA@9gg$9v<%3`^k2Hu+>QRdpn;JJ6pBA124pAJ2j6x zjN&yua1c3(z9{ReoAn*2Y*7j_E9nEW>?HDj$1ybyGOxki@Sio+{kXeV?{(|RAuc{Vq@!wkzrVfJJ0!`l-#CmL2_0Yk?(ShDPLi#|oyNgo zqvyTvllgR#1;n#=*)R#%Njd_zvQgcE3YH=#0E83#WP^++hS9y0m zpac!WI}FU>@`@Qf&$Id9N5TOWTR33`wN(iBu!%%4Q(AURlG|W_ssyXB!Q|`H!+EDE zuhbc({-YCS#JVA>EP5*?fR7#p6}|FOiHqLkA&gMDJCtLd6FWJ^h&sg-7ztAjE%i z(B{CPW{b>?&^6|#W%3Xo3b5UkUC;Z>vhVuy5^4haG?@5RQ~%W0CtQ?ko;EEA-z30*%(e`W_?i0T_A&8dz6$ESJYUP6!hSnn>bN}GLl7m91NWgc4qbN8mY%V9$KxD9?X|oo_ADBCi&5I z&gy3Cr%Gfj$`zjy0gMGdg&)$WW;jsz}H! z%eU2&R;g7DtCot`M&HpOen1$6F0PHU@0SS9#RXY@LETv5J4QD}0=bk+S$c8Xj<_AI zlEy;@L8#wyi9!JZ+KLOwJ(s@-=lFmYNBeu4_2)hD^p1e}@j)V}rvJc%>gq2W_ed=V zE#D4%EFBZKJ;`M@kk((~!o7u!E&1DqZx92W{TPh+xV;^wZjJt?PA{Ho#rLor`@*ZV z)jnyxY+ZXDy4C(>eFNYki}OmXVFFEd>Ip8V$t~a~Y0fwJiZ?hk=mOGwk|9S3Rpx*j zAXD-#ruj%`10{AWte|?K=Zv?IT#byLMEa8uQ=|saJfo91m$KmWjcC(e$q$HZ&edZo za`7KpAm-GfLm7Gv*XyJXZEtmEj(b#=<3L!uZlN6xlKX$`xxl_j82Q5{t5X(zW=u-B zQWyQeR`~okJ{g|#Dk4qP2?oY!W|NC^nW-T->t!(3=sVDw@jaZxEeI67pYG8dqaUG`3@e<7iT5ST#v4a>v6xOnu3(!+EKoYK`Yj%w%Y!TNs!}`SH z)2q5R{U<_S^p6adv#bT&gQ%qNYQX%-okpU2)xSTh-0_dhbD665u&`rYg1hYrnfwp| z0bP#y$EMkPqeBIaScnJ=Rg&cu4TeP@zjpjFz1`0NEs(Z?xA|99yriC`E8e}?x(sr> zw+poYxxrxF+`5L$!$#Ip^)?e*Rh@I5|6CXvT{*&%V3s%lHy^{+k~p5J!HoEUaI6AFfsp3nxE8(6Xbs;#I^m^qNXxQGi=n`6E&MWm zG!|I++8|A&L*-Uf(6fJRqqEPmTWTbF8#Au}dO(H0)?*!&P=q401Z6T4`mBI6Il5@C zgpXvm1VbN03FIek8E{3gm7$+=(nrFFAUI2=MK~b0BqT62`e><5immJC6XmB}oSJ%} zC8bRkAjQ|~#|m}Zpr2nU$PLTv^r!2qX6K~UzBcE`n&`x!U4uJ_4b2Bep*moh_%QB4 zq#CQ6V-zz`&4ban4X{(Nn+g@xx^w3U0YaY_ws!LgVdL%MTG=X%__GtTQ1pb`=qEEW zDZ_e5Pfu`_RdWVQ0>!+*w+)yw?@z8sD0VeU5pp(+CBWWGUL?>+notR?5CjmU4Tq$W zbaB5Jm3Boh>Pn~JmHtN;xRxtjo=_;Dq72x6q&SS{qtM?}K)IP7^0v)ASmxtjCaaYh zR(kx$|M;KN|M;Jy2b#O#Cp>@sWa(ZI1#A+hQ)M}4I}!}?1;y;^R{v|@9`e!`wcdwZ zk<<<@nokm}QcWJ6`Wj&@F>h&x{}|`v2dl-%M4`Mg;Z^$r#4!wu;DlrANc>+6WF66V z8>h<7;jrFG^z!m0v_2`gC0l8hWwL@|;XIB0lFg^%~G@o&Nu-%@p19?tA0A54@*G+ z?xWVrC6z*sIAt^u;@!s(6+&RfNi)j|GCnB`CuykTM73VGj{+d@TE2&Tk+lk6?OFDe zU?!B1gzpIgY9EdhSJ1WIS4A?vSTxZ-qG)zCYH=*q{Ga6cL+VgpP(qZjyy(D zZb^V0&X^e)6Ua{=jZzZUT>FS*vV`{}UpHol1lx}D+j3dJ&Y;iE7ErNq#z@*9ug%bd zo?{?aBgtD2>h1{J;j*7;zZN|=e;xbODp3nfjhL2L{4X4q_eKmTU}B8|h;SqsYgLiu zVrG3Mo3&pgkKe8h85?3yJGm?HKKm zsVG|cj6dwmLS2Q8OIIMGCQZFVylXliR}nQ)l!x#u!5S}+gQ|SqeEDziHcB4+Ovy1Z zpH8w1h1y@|>4zA_M>emnkMlWR+S@eeN@?xcyq{(~Puoh$&*eOPeS2NH#|sbt$=Em_ zf7t1(yoYDSL5{Kxxi!9Jb>eDH6Uygd+DjBH;tDYoxV(x~j&?prjw;qA(v*>ofYBbG zU9?Yy=uZQFL7E5J@!(*_a=DC;bR57_h7XP+v?qu!skHe>*iHh6^xb4^;tZfvMxKuS*BI4myo&&ZHID5Nx@tGJWYh? zSSC&!n5Ox#z;0i?rKOYK1FfIGPbXkW0OV+raoQ+U0l5$jWn4))CrQRG0>BbwRRqk` zX|GrD{w`5HCK|e6_89q06qi0%Vx#W_+mt3@A)YlCE+^|&EdBg3wc<| zD>hGO^VlVSAdE_{V6LD*eaH8pCYn#Q9Hr633Pm8^z7gwjJsFhf=>ZO63KNWHnPkY1?2nUl?DacuXFzkaLYxppkLDhLBgO%$} z2$j8hA$aB?o5mkxzy)R(kZ967E`aAoIHhgJ>AhEL)Rw#{ku->_I`K+NdzSIhmxr)LaaTT!dnk_~(#Ca_ zrG+Fxd0KV>puZN!gz1ZFLnEoE5MXv`VhXBf#}251k&h6T@8Uf#se{wRZ#wtYvc(~L zMJX;;ErY0S5hJ+(y0r{x~K846*-1Ep! zOc<>y-s~$S@PZRF&C6D~Ae49Tine0dNv#KN{=PtLxM%81H+raa{N?g2|GYqxB$6N_!c6HTyVo zUrD{sfTtd(7xJ=lvG|oG9|g2?u9P{|%qaI%2_|A%k!ous#IDQc!47lV@2Wz?G3HrdkHl}p4UU+k> zlw0TwU()yZWJ4hZq*f1s9)w*9b^svN>2Yc98H1qIi33(ZgW|Ka*9mGENdLQzWcoTN zVOUg(!}4~45(V&_vv~kt33AJW{9BYGhdOEH&gJO4V?J%60pP0Wbks1U9o4pi(XHj- zu*M8`4K}{`AH5?jsMq1^yapjqt}Ep4*5IeMziG+z_JO}m457ld#ZX}kb=iYt^_ej{ z3cQ!(a3q>@UuL{f!&gMVPBN0&s4{3!ItMJ|UP^tl=nnPt7A0%v`V}i!op$rZX}Ih( z!C#ISTHPbfnkX%rpf438eD*Je2IXH%&Vx{Rk(A!xZWULFqA9iO67Y2gyF3fSMzUmT zYHHA@BX58TDJYvd?RY{G;n(ajc@7A)9ZcSK4EtumvHfkmG0UWrydwbJWX4*yq0y+9-DZ~ zyY@0nL6*%QkThtb4_XT5TvKXw(z%`1Ao!jEO!{qwgJbj)@DFjYAmB;h3w@8Ir9Z~( zK03?ZGZCqCS@KB9l$xZ0Mj`l2=sxJUEV|ZD(Qa+4JpG@X{H76lxLj3OSzM`AD_qWy zbL2BhZ8Ws+Vc2nnLnq(gg(G#O?H7?#m%?i|L;Q8uJN@70W3*b`8`y~Zn8)Ii~d zx*&4eM?vXKbYw& zg~}_gdeXuJR)V6{Fo-?qo7b%_6zA|aZ-!LV<@d_TMLxJzPVcHDUvG#3xZrjkC+fheIUCV5F$Zg07zxj+=$PbPq# zkHsbU%>t*-l@VeppWxcHtzA>s-_&*l@(dC8nH$G-<1E%p#KtC2zDcr*mpZoV=-b+vhMzb$lJkcF20 zz-D$(^>qzvqp)FgRR%XmC6gGOZ@@RXdu>FYX;P^uaOyqYm{$e)16O_*`;s%p*%x9- zwC2ze1QT8XPP9b)FPgqphzyK4K_w8U_PLuek)>5Fqg2))MOcM}mdaNYa`2&9WRpa+ zd#S}b>eA&>j_#3%@+?)WrpuPT%cVp@>@azbd>03fR&@Z3S(i@qIoFqOb@jB%Zr7*PG*HfwBY+#E z78&#Sl3C=-e3}8w=U(p0e}a#~9MX&F@qn=AcPN%FDoL6nSjC!IZzkz)u{Z3I1!Zp8 zQcE>gB+q#$Q91D8@rN_?z1FH-*J$ncl5sAX)4aT?p~m6ifqm_dc?rB&BnSIwqOk=< zLD`UzlS?m(w_L7b7|N*2^$5E34Rh_gNCAulDLLXpVTL^I=7^uxHau&H1cJZgvN{Y+0sNx z(jd>hcw$mU7zO0j&iF12mAs{+vpFB#yiVJ(8_lHXp8Cg6Ir>`?PFCAJy_V7$vsXhCH!=2l*(kUCuvPfp^lV*2Gb?Q6FEgqTR! z5R!)|F5HVU+fztTRH9bwshN}P?;RINw|@ss@s7P73R6ua{T`}94x-_B7ND|JYhZY| zdWiYNUGQ=*;2A@C$dhpW)3r-)UJ-Uc!9O`)_?qNRNm>~{q{?eEEuzp$^UYhu&4mw0 zl)UVO!2%>H#t|zuxV<7Sy-oalbr&bBs0B>D&&pt_rI*iljUK&5BXx;b;%^{Z5BH z&y0vE5Dn_Ml!rt3zyaE#?xkd6kuY;dTT8RtmaD8z5hX2?PWq}Tdva)aU9|LdfMRg^ zyBONb4u52pFfuk^<+!9@X=aZLZ03uYKP(Rh;6)L?QwsHWN$bgW+l;v;%zjR zoT$zz%3MS*l|{&vl&ogfH(L7dvU&Zg(>}dyUNx^Tt~ytz|NTwtiuw!6b@ui5b(FR4RY=as$p%#=&@>k8$JRwQaVy|c zJT3pM&wU9%3n}(2r<9JBvBdH8Y(!Eddp?C5R0?~s?uLax;rqmYF3}DI2LFNFLKi#WVGa9+8bnBC%XcntoVazDt1=#f5tL0G1shuDdpm_>faZ|2pNFWOjsy-p z$^t~b%kBxh+9U-|&#$kV1)QvKEGZo;40EJ_NEkr_?n6!RDwy;d6Xb(>#x9jv$Y|5e zZpDLKT2-r;9wo*~w%I&^j3eKOy%W{}_i6bhHei4TvwHqMM zi=HW4hwsR;JMIJVOAAR40#jB< z-XWDjIO0;>ma7EU^onBAQ}CdgBWiCc6#-+czvZ#%R7k+poZOgRMqSRwDW5l78O4@+ zTr8_7NHXJ@lZqV??fxDhT(za;1H)Wf>%(L)1L_rCYuL}6%CzC6d6y&WoS4idC6-}^3s0k+pN_KVnnswr zjVMu0q!>Ykw3Vir01W^41cLC-@!&o5vB#NzT&h=BX+^`6WfeBixa6zr*6Y)YH`j6+ zL>7dVbOvaA_E2h%!`%qVuI0)JWcoX+-1*%+j((*5sQ5sMAT!SpiRV9!=q5L=Oo>FG>c6zU_myE#Er zf(qP>Kq!imx3Q<0-tyjnd?BI3$`VQRT5XfV765UnEbhtJ<@xGp6nY`$qw!VyT;#&e z5sUG-4?+y9go%5@IQIou#f)-N3Gz!*e#Kj41=S#O6%t{s7qfdT6WDe`07dbxBld3K zfYQK#W`zV8u}WAc?H_7L<3HX{*NamW7#Vo0YMk!+#MF0%`Lsa`cXxuj8R=&->!%tF zKo>s3teqF!hDTZqihh;r>4T$Lgu1P%_H5xS2?XCsA@Vz=sW7F|T`5;NWKcK&W$p|h zDHUBIh0L4sW^HVhHmm4q$8WCAFeTCfKRdOhj0SSEVB3{Wn3YUTcb_~spN$w$!I?;t ztu>4Vu)Y$67aobOvuJlE)=cyd7mxxV|>-@!qh<35Uq~r=OM(aXFYpemJB_m@- z%Hqfn8P&1zdDj>rCf{5a}Jb%V4u=O3DeXxRJ?xh;Y21C?T2eR=*y zL2PP|%K;TsFpf;=mILDJ^;tHN#21q7Vs3rYIXh{doD{atIIB9YQ$>d??4VL6>>H#5 zst=rjL@*r?(lbgLUf@&5yHXZJ#k7t`iDKV4j&o-4OC03+uoWZU?G_veXZX9TCF22A8YNsZebinbH~+yem+ zE%%d#K1;P8R{rJxR)6G;RU5U&eyy?DI%gKvv)ZWt&wNI`&Sh{V|#n+U!s5cKk1JQrtbdzKjhCh-z^Q@|cp9mK23$k@B4VTo2JD32aVzTzU5BpOuv}<%5|d8KWo|88FO9_;jU> z5I=(JVwN0l^-9+ne#_7im(jZoD3Q87zqYMcf z;`kC5k=X@osR$U|a`q4po30ce89OpTyefyoYm)uL$2Tn{P8|vR3;@Eii^C+WQ6PSfE|1^ zXKNplmHC)AgSskpA**)0aU^0P;M8Ax}WZ7DO znSeN!<90($QfKrZXvZ1@R1@dxBkj zm(mKNH}oJfVRN2OH?iO=*atSFvZWskDJMRofygAD@rAM2r z2L~?#r1&%StxD8-!u2XOZ$)!vov^9kHue$sv*-p3Nk@F+!~Gy9;nh%!nq#XT;XukR zoMuiO-R{$ZBJqVvYBROb6FD#kIm$d`pqcvM9Yg4%1WmWgdMjrx4XKd}aOo_rvLl{_W zH)u^RcGInBidC4{#GSq=dP{CBcU4|kn>PUo$>SJ_4dB9e>A_5{c+C2snb>Z4&dRzu zzPyAJ_8D2|WU#8e^{jETqJbHpVR|zy!;THAiRIJOk16e15zySTg=G9YrVegam;&dK7fS-*L<^dO<5x z{!Iu3^;tR5dQ!WsMRY;rjKcle-VL?hrgul%CY@#|@e;tn`3T4qd5!0V1>TtZaoD>9 zF(O9*STy)IB4c8zN?oQVkV)fs&I@CjXnk#y%~-&Eg5Cfd$dFc?lalO5bbZ4#vhn^}I0oPGm3yE&KfVIxXX zzhjgoeb8C$GMaj*i7NC26A^J2&O^Ohv-4C#oK|&-CY8G=v#$gG@8>^#>G5n!c(?nvXxK#@)tmHyL&*^94Wgezn#m|sW4$8)h^~Fi2eR|C- zpEnXcuK>%_eK5QTZ=UU~TBNaS!&)yJH0C%z(xSFK*55ir4} zY_?l3+ovzz(kT+)E+)*<(iZ~D8$|}xY8y8z$Zpcp<7Uw3WL+Hr4CLrG%aE^D6>ge5 z(?ox)JFNtod9ZYVkSV&rb-7i5hmouCNYPhrqW*kZ&{ivEMd)7nDp*XaZxBW05KV59 zK}RKC6r2V;2QvZVjNgmlrEz_g18O(YoNY2$1AYR@bS=KA>Fg@W|H{g1#<Q(E)@YtfSo3k%ZpvPoRS#;68$mx8mkw;YeC~fAl8-Vw7Dee|G(FHo0`J%7%34HnBN#Ne@z7jTYm})-}99 zfpy77Hp?zQd%~10@UbD|%^Xw$n7kzu<0y6E{SsY6SZ`}JcTsCB*>Oef{buPLtR1=A zw6&Y?TSd?GvfDATUtB+YH9SD)k4*J;lV8i{-Dvr=^Es+*+1P^VQ0XQ>MkykLZK(tm zycw)BmE-i;$8vJY?Pq$S(1olWI-gux6112td_?gNF9vtYNXlLvgs{< zc%O7P|F6k2YcrjF8$W|Xiti1bU&`An@<`^h%Ko4tHJEI>p$T$9T?%WO)i1SmFu=Ny zPTrtk5v#^g6{Lybz*knpqpYx`q6gT>OVxWEL^nc+xB8?%Z2v(W-?qF!h!p3@g<4S& zXkKGq&`op+ep9OHRid&B`E}g8Xjed6#8ziph|@$db%nyZah`(WcvLCHo~3`XnHaTf z(nHKYGPb?bkSA|bl%0JMOdHU>1J?!?C#&J2N z>P73Pz%tpCk_EKyASLp7KP$TKV7Zvrt}1`r2fSKjJSej!noVZPE;Mf8AeP0yT0Qyt zZx@%>t&8)&Kl}P`Z<}XtPXE4IgIa)mxIA*mgQ=9f;Nl)hEdBz3r}R3QNEhQubTJrI zqU-6L)RY%wSg}jv8)JpIZeF*JN!}r(V1C8Wlef-6Bd-~5_*-8!IsdJ2Ytg~CE~Q=< z?$nv4TVL_ZWoqHT7O3zEN%oGyLPT#LM0)s`f>sOf6gn+Fi3NEilDlPn!dksdr-!ZA_Yk{oIG z$GYN4U?jFx7XL^@oVxuBkL{OP_6vIc%m0e89UuJ?j0rEw5JI_(4!eH5xZ~Zx((%i8 z)q7Iu!_h?_(wN5lbNlgOmInR5Y0TWm(vUIY#R0Ea(6H*lx#0%*R8U^eC*+6O&SJ&f z#j2I8#NKM5Z%$)GJIHJ z*cr_)eb}#P^nJ$BB_vPMEv^bIqP1LhBF(*G%lRCVH4sasZ8B@vD}SXmn`13II88`P zHX@wYDQn@`U>5!8hz*|uA<02+PR#r9`Qgsi&H--!@p)sXzI(6(x2r&;;e?`x*^Ieh zM=d(dB^*H`6W-)la%>S{^qhY%#6`d5GX$l)G6joS$@#lvCGNxNb(?Y;5L`qwHj=V` z(hmN4U9~BTM~rM}Tx@RheRmU=Z6@RDJl}w{2gKuz2C$CV=~KN`!$E7FYIh%SLU9h#iyR%p42m9p9Q^_m6 zj0N<}%k82o86r(7Vb3e_IV*oaDO%iWYO89L=2A3Wyd*{r2tKX*_@TlMD}k}*a}L+? zAqXSHk>E_H^NAdwnnxVx@691^EEyaVu8=M#*a8M;psX1*TG`9Wnkq#@?EG{c1#MYC zdc|L?$QNd{D$bc5K0@=zSV5&t!KOxZK@D?~owx6pc+R`;poK!FZf~vSjHqF&EAkbY zwb~ks$qEKn^u4er3-)C1=ojWbxZmFTg&O(xU-`p-U0IoFh+1<@G)(be!U6c9_aUC<+gpN(F=8Fm^D_pL zz}pBC-j!uHr8&Sl=JoKhO@$I7UttuCtpW2!!^#nYfg3uJF4e2^f{&qJd{c#5E5Cf` z9Uk!OyjclYRCS`AL*4E<-aP)pANb7_lHr2*-O9=fqmR*2fpqDgf+7olUJriR(CKYC z*;=Fk5@Kx{?3W!>%S!7J!(qn9;Kvyj~QPpWr0)K@wiEij55A@x$)^kK8u`kUl zNh;)ptIsIOE@1FPya8quv&Gw1RAPOFV)H8JfZauVb8E$`VeWXw;el^0(}s&Fg~$EVOG`6u%`^GUKQ^G$RHZE3107cE;2;1+CVno1YqUP3$CV_<1Lxu#Jky${` zza0T%5&8-A-F4`_bzWb0POq-cFFKu@6|?_~Sz{i`aI5@ecXL`%02PAB$-$a%vvHy3 zKHPCry}dz{!`1|wGs)~7gFxI{z4rdBo4{EbZ3e&64>xWkM>s2!RH*7m_h8rZW;7m- zn2!TT({a{M=qcc3-;XX&evEebW3U9*_->9L3Y>;v-S_Vu~yg7~C~q|M3nRy?WPGj%nclY&DVfmG5;FH+$@~FV=3W&6YQ&OVvs>6v%h6Ki`iR4_T-1%T0PpWHQaYsuU%xJQQNJsh~vMu?Sj{>%XZYd zYW)=L)wU}1*RFj73+qEseb%!t5scmx${15%M%Rlcb(>wdXw-5Go-85?3{GdAj zwS`CWUpxHQUg2_k;VN^&ugqXMq^BPqRHE0XmFWDs!s-yU`_menF+xp(|?3rl+!j+JojDv@nbDdu*aci9z_K;i&R7Sef4{>;oUX(ot3so+q{jF7SX%y<|N8U)z(2+OAN@^z^l-`4(((V={GWPbdu#V! z8ryr@TibhkTf1BTLZ9q!H~uUC=Rf1m50}m3ADb`Pt=78!VTGX=9TNE+#O&5(JA7tQ0-sP&qU?b8#wiziHa&=G5s75U}&UtV2Yo?czIPTRgI>f!m1+D-mqwQ%RE zJitaHeO*2%eaOa2GR%`;c(AcPGdwZce*5s`{@*k_rsp247vG5MayWE}jXW}Rbig~C%DasDU${9p3_KjTk;KmO{g=;R_g zzqpP_ieEGBluHZ^s?oDOqxosoc>d9r4B6>)fAJ46KCeBfFfslfcj?%X;;$cX;L|E~dl!I!sGSX9 z*hMek{T3H>Yuw|9n(>CZcDY{ot%GD5^EcRuCJ&0aQ%Ju+Z>93*`2{sb_fF&S?BQED zsK8#vcfLNoI)2qWzivKnowcriX3P9V>-wCj%3oYuMa}54NfP+@%~|s*x_onWdC@-Q z><&1U&UCI9yJ&evbbeSqDQNsi5!hrhN3K)wK&_xQEGVYnC}IGGdP})|OV_&;O1U#7 z@#lCof0EyUlZ%>x1No8J{MKAEst-h4_J}j9Wsps&jrCZQK?VM_0auRHaWYL}p6XgGVx3O%~s{ zn`CMM(Yj)tQcQfoC2x5OR^Sj{YOiD-N(;b`$+5<9F%eh!%W&NSU*KpYkLF$L`W17( zHP3&J-Zih7EcEAZT`n3HDM;KHj?FkIUBlEPy7{*(-6(47?xFs#eD&B8L!}*IVu$Bj zhRn`dWkiHekzH8n2j%^jf*YS+1Js5u_bac*<`gJ*+L@9`{9WjyQv{aQu*f&RXTK%s zMlY|Lub-)iTTva_{r>j!s@=Lcf3^zI7o8-`vR%b5)yB^1iYD-MtPIIB5s~b}kHi%k zef1Up@`nBPHT}hZLqp+!$r?E5um~ilQi$65rx3M8M zF2NpaBB->4GDOARezGmz&`8J)z^;~F0KTX@u+u0hAtU!(O%Zw9yrJ$A&^B`N@qMD+ z?Yp?dF=$1XLJIy|K|w5@d9u1$Hsi47gjPYO9z|wpgCG~gFxbFYwB|G2Q9KP*YGDe# zb9)3mZi-zdJZKX3V5j1QS8ZR3B9Ef4|JHnSeZgdC&sHrsu=;oR1sh881#F?ef9@se z%(vxea#c!wnS{^28htCT=TgCeB{EYi4cYr!syi-)nIwN%4#QIIbI}K^(1Vf@PJ`qU zzWM9P`&-gGB%1kEBtB$2EY!>E7{-irT>jOop7C+cTF6$NwBBzcTA$a)D}i*86{73E zn;`{}UHV$wjdx3tK(MHAu=syli{8fbTUu7|1nw*<7X0b|0~CwvKq~$prde$NcFp1+ zQ7jhK3UvHS6pK%(71Y=h6pJUR71Y$H6^kYB{|glhYJr8`{~E>O6MDsOR4e{hYZYIl zRFHinu@~We=W^6}q-9t57()D6a&&KL<@}(H)V@e-IAs8CTu^<-LIEiuEenpRw8XQ7 z@KDO{>8A8YC`(YEKWzA4LAA5i7Dct_Ch6T}(dyUr)#%^pWNV+EROvYWd$gAS`=9>D z=AXa$`rrS3?Iy56xpj^zvJp#7Xk5$U)-FW~$;N{Md}3KvGwTQvvd)pED7<_ELrP>i zoRTDU0v?7BB0ka*DS%uPgb3JB;eyL${kmWX=^Q-~O%rs-ybtA82C#z8d}h_tAPXnzK-)%QvF$k?ji3|E=$T z-}qKSs~k=CSJ5wAI^p>B$us_fodZdAr?yo{tN6G44y>bO;FE0T+0v-|*MDpLVfE`D zR{vgch0edyO0iP1n%BvEDzKMYNcG1rSvWRpprcP|Vyd^%nrm_G*&6@5wgR{o9U64b zc3z%cJnyvMJa1paAIoIByi;%1Sxc;Dbo~1L*#QVTdB(qU^R(z z9@n$zm(^ds{@d5mIu^q(tMax3PAwi(N3VJI%h&o-aDjbyyz<{%)|FjFpOnV;%c^VZ zmtVd{Z6TZy-@>up5q!&c4ARvV&U%BEcf#1b+RFNT%tMx67nV40 zf$#$8&~7WXUbNMc$r)_R3(=BU^U1TdXl-RYe73f-wn7&^Tm3qp{I{>i!&NzsS=R$9 zV8R)FT*OuEpDCST(|+Or&JMU0t$n*Dq@LUndLqO5XW8_3ZX44cE|%)iZT!1u{8ruj zD_(YyZQnzTd^u^z? zr9N#Psf0eudPYeKat#A(ebzRD7-t=dPN$Af-0n0D!hcpOwRkRUhi=_P1i#O-T z(Vuu4|Ge^9E4@6FwxD|eZB@*bQx`EnEsq2>rD{&+M zN6ssn#=RLxV#}}9EeXDhKj|=n=h@c{`%wD9w>|rM%RZE?_P6coD)t+D6s(Q#$|4%*a@Wr6=1 zL1fe2SoQMbGfOtrw$V%EBvs;HU1JLj8?@^;rX_pH#?vKM(o z%1E)j4R;v(rBhs#EC21k*(jGharx?(dkW8j3RFD)OTFWlEQK?+-Gw-iOFz0FmaZPZ zc9wT})gMdLDVQi+1`GQhVmU{F4y9ak$+5r4)``CV{g&PPk@mN2yuYgye&;I_1;S0UXoAKxWY<55Q zXLH4go|NBXBif3#qn&6s+Kcv`I4M5*>%y<3l|^CKaAyK2E%hvzOw;jf5Y-!7+dI2^`v-@?V^uQI z%A-Ymq&suPWScN}>4k-#eG9YEM6Vxxh{8{!@TFBE$_C`Ib4vRBl$42pR zn2ri>Ib1V^6*e9gULnkim4)*zTIFSOOMk5{-B-%=#%akPC$~G`bzA6zY*Z3a&mK9O z^cZ=PIDL6_diex-dOJ-fPN4EHUn)`gIZmXOhmHonP^LVhcK#nHYItIvDsB?F{OdLR zSY21%H`H+4sIL8&{P{2W^Evs0t#-?QuP)z)%S8|`yHAUo|1I%?#<3$kEQRHLC1YXlk6o-oAU>A+I6|$zD4(aZ!Wb=TCYGio z9GZ&k(x*5CTI5kt@hr|n1o)3HpRJOBsanAQ^!U}qvsD#-|C;|Yw$Jh6MEpk8Q~mTs z;nNrT>Hm+te{E>vI`_um*XS!eZzhABK|}|G({>l4v;<>^yV!68Zk$?uHtFODqjRf9C07X>jR!*$e(}=_C_;=n8OOOaq?IISqM8x z&)U=<>}PB34G8(I*4tL)uGMO7++A>=3BMs>7z1`1L9~()chWf%CcIOs=ay5gG@zC6 z9W~OxMj97$CI*#lq?Tqs3j#I7q)Qj^4c|x(Xf8@*TuidFVxny92JWr4JZsapIM_FD z>u-L6!LGL&Z(+1w-_7d>r%p$CGq`@TDP~EW7BqhXO(Clzm*WsX=o2AeCY%zp%3a4h z#w&;B|2XM(#&NG=SDC2B4g=W?JGhi+h$ihI+wy2w^rr1>jaynn_}@DGdv~!7ds2Ua zANWGXcpTTFR^$M}!nN8NCMxd>i-nF%xr?ZT=o$rWsHn!KcfOXy9|6t%?6ihyF?v10 zg{9QO*fe_?^@0x66O|+H`}|fV7!V61P$;I+j=Sn147Hdspc5aZMkeJd*NSZtDZCD* z*CYHBmPEt4$xbV{wX4`e4nI8SybM@YkUhjhODeE2nH}sEG>ffhC&}z}mNcVQE8<@_ z@ptprxBQoR(t{Q{6L?sT+_Phrw;3Y7WI`%F_`30Rt5s@T(4$}Y*=E^PBc;A>(EApg zI4SeC)v9Dm!zpwgo+ZvJZlN`7G%msdDk^mH`CxR`8Mqf;0sT}%KWlW<;o~CpIj-lR z-|eG4i9>g+rDjiY0Q zl!cqJb3q3&QrOxm`$KVGtg4JNo&b#;Ls!uWiM$qMl%{0^O3q-9t7K%TvsEp^{VM6# z2ZUonhog($EpB(!9#58g>H{)@O@o$As&CbcJYU$kYMvwfB1ew0-hwcX#jP z1SC%S^V!b+!K>rF<_7=yV*ljD>%t%|AXtA))-2pc%lgnx~O+mGt^#M^qjCRX?E{ zlTveVdeOQx^|$?_=AZtwVru%+pK@#JkVt)E#hxAh%XoymDf-F zyevo(->O5&00cDvr6zqrR3;ppcK50m1rlkWOw~yZb}X&8nRvTW7o-6O){91&V9pqu zFPMyR6Fqe5{1cd_nvv)=m2jz9rq(@vWwp`;4M(~m)`+51J`Mnly z0n>?EcY3ph)APfvGu|o!xb&qylX}qY7OCvZR0T$x%@TT%jO;{`moFwtuw`)6n7#40 zcrr?(u<9~WEegVQjk3!11iixq=!308Y7#|3-4Ky8NsCAir{ZYE@CA5Ta)QZv$>~qC z?CxbUJJ7jfglW9nh)GgUqCUCpGQcTxKw|O#P!A5xAK!jcMc*9qrFjqYcQ$j30_;ai zU`Gh5OQ}P{?RR+XV6?Zc&-F_EM>3AhJ{fr^l$;#g;Z4e_AW zSQJJPxELH3E+^<x zOkXH(+g;PKrd%!Ju0=VcfQ!4;l&}e<0-yAR*NAYOS_?wSBoW0tAvKTmId&wX?6lDq zB^Ztex1|IY>X*N5-h-h2)6I&N{_5SFQ!xv6z9nv=bE7&_aWU7 zQFhk7<|*AZ<6|-Iy|hy=WhT2x$;uY!qH=_dC7gG?Od3WF;bvVwA2~b|vk@dA$D9ou zC2;_6K#;$iJkn;-SnH5LBeRCw1+ezh+Z1lPxiQZvra@2zE96P0$3sv;&)wrq+Y9qo zb*IKhn*B=gLc~Kr5CB6wBNCIwsV3`iI@!DG%Hk&im4+iW>SE1EU?LUv)+5_PN?qo` zII-I*Uvva!Iwg>87&3)Hk&E{f#4+UECQOkA{WH#f$?6(kzy`x1E@-!d?lA#kjL_nT@x_2{zmZ8*Yw7_GmF%1}4%iXD&PYqjDqEf=%xM{Ksu{!(lXdDQ~$t;NeIW^(hd8HQCvzc2DueeukVNKuW&mL|Ouh_zh{*YS{ z?JTdDt?1sj$;v^?BWPQNMoPK9pQ#Wiv2}~N?7Taj^>HypqbZ4Z?)4FCIz%gm(mrVy zFqsvKeTcBCJh{~^PB2&OM0f;_K1oa@4!blHUvvd*=wv8CLh8y#yzMzlWT&_WAES#{p$;DDwZtyGV;dF{oYa4)KlT0>IqS&B-mx#6s6i1AkBj*$$LsgV@M!m?2ny zH-wKSrHZ#A%k(IsB?M~Vn;t2H5)Z>Yv5sR^nmOaJtn$V;%~p9cM5mERW7JjysLuir zcr=8WdUW_vI@3?Y#L$r?q>$wPu&zER%l8Gtyf(Bu9Gc@%pte}c7ZM^%kNz*&!kHWq zOfPpv=@L6;aKDWx0@YVF0E#stwOMSFh|8>bVv^NTVG>ezLSgOXvfnqO^N_BR(ngvDmAdQdl z+Tib@jd~C~bAkBT0FW7mD%mjZqBEpJQ{!jys;0`MkgA|tnRF9&CziDm*jtP12}0Jh zyADK>44t?Ez700lmzvw7Q9)L^!>#&F3tmA_zbIg#U7VUmAK zDVLDFq^RsBP@eMI8b}1+z<-s>qN~X;9dmCc(`YUMqd8baHr%l{v4`b#=w1#ndU$QR zE&fVI2%oN~9i=#;(p?}e?W_@nS90hdy7w?+F{9vmPN5^|;lwgEfIB#7kY5uTUW+dU z;pXg&5-I^>(lELVs~I>0O8*AEmJkF7Hq6xsCcny_ER;fvO}l7&r+SbxCQq~7%h%S4v;L>jQa`ZlCo@#^{0gSpMNN$0rxM7B(eb$WfrmR{1xUssr-nhr3+wL_Z zKA0PBtl4@)PnZ~woNpgB*6+)kZgkgr5EPVtlHxV_ct)k=nU#czocV zuY>N_^K53;75a5Kryk-mUqdA+T~Pj<Vwmu7^ z(tTtPo;1PdXXof>@8#3r<>AYx`^W9$y`zJj-MtrkFHav9E=&+fS7XN6qaa;1vSKR= zxi%Cz0<%#_!yc_gNEy2;P;#@UJ=?>&I~CgE+?nX*&jeXVJaY7S5QgADHz^s>ih|j_`$X$Wd#|7)*7h=x<6Xo3>YH()i5YcBk z8CzyVsFnAIQ&_!Udx}zE^~4hbsqXgUVHft_b*x^uz+%J~VmnD;-B2!i^oc+SGhnZv zp5Bae=lFr0jF5&5T;7iKH`l_0TC`QkpJwOyc|J3PK7d$2qw}dP;4e9+?Nyu*G)l?V zRM-!=1f_VhyzX4<_?2(%r#~e2MM5Jff2agxOD*ZBZ?7_W;kq&K9wu=NB?|kA7e&S^1z@H7PkO*V>7+VRAws(i#8vcRe)g=b5Gi+Vxy=rog0jiA}UB9 z0L0^Bdg<=YX_u*l+8aXt9gP9kj?6G;4997E{I!cm_j& z=avJJVt0YVg=D?#!*^~SGRJNm{K(dm+?7pZcXt=&`+NUH*~;973E$a}mEC*+1(~+e1p+%xZ=tO-f|%eOZ#?RGK0!W&`SqD}`}( zgN^aG+ttp%TuS6N?2-d=|Gf70Jtt+VO2J8-n0_yf&A06+VkOCgr4s>2! zM7<5{j~b_)I<5rCkB}&FGYdO|^;V5zD94G&=rp{xU|lH+j6@gGx1<6--SGeo3{Fmu z_g_BGj=&YJpfF8;p1=;7b!jL1cIcz zx^bUXo;~J}s=Thv|S|BGBcl&JEUqUuG376!q602f(K9?VcVU|6C)qvblTN z^JrydJNoGuR3yJH&m~DVueLgm!!$|M+U#z*;k;mIBQEM;5oW%#pjcZ7XBL(n*F;@O z<2G`{F-|srn?#+`F77L$XH<(y4opwBO;=e`Td(8{rryZ;%2R{bPW?oY?PLu`MUJ?5 zVx}Hr6uV`w^kmA)9UBi%1OFU}iLpUOB3+Fs!*F20K8I8&Nh8an6d;)n9QzCbW z*BV--due4=KciVm_m@U!OzP0PsRX0AEQ?v$Y-hL1&ij(n>-}@9xYPE4!^KFD4h8g3 zG#ACYO{>OjkdSQMc=F<mE zSQ7@f2>pq^fKD9=!rb;X@D%pJSLS7zVxt|bu@r&b%FcQIsLg5q0f&m0ISlF=M16Em zBlLP=31o;Bnh}l$lA(3nM8K{T(JR;`cXG>_#dO)B@L9TkwAV2A1GmGydp}@g87|Zt z%%F)3$y|^?y&F1CM4H|DG{x8Ci`k`P$uNL4b_tnta>keiXV#81Zy zqB0ACO)v|5HP8-g^oLQfa13O}ORk(6?Yx@_%OKP$T;r!Nj$nh-8q=%seWUzwqh<+ZsDK$}B(jbYdr~)!&{&a7Gu6M7Pj&N|re4ecyo2&C?J8+6B(5*(CHYJupRhyZ z9!$_PblM4`6KVDF&daBVFO2B~!_+aD(jlt3lkt(it3AGldGSw(S^f6xs*}8LzM~&j zsHQ)I$B+N?r(6OdgGm)H=T&W8+}s7Zjxn1uUg)Xyg-tNJIwP_%8fxHI9u<%-EIR!H zF(dma@1RDuHcJ*tDPdU$?2rqFz;1WW61qJX@RAf7e}yVkj=t{IW@C;Wo5%(*;rwAe zR2~9)i|*+ODyy+@7vYkbsG|H7*0V(o2q?Rv0-M8>h7uJxky!ARP=eGz3dzALqm3YP zlREy9%^t08Nt~%&Z#jQ}br<}oi&5#x-7kpSfCv|@N*%7|*2Z1rmFh_;DsyLFl6^7m zjiwk|kTjz$_%#`nR#uX`MyuYqYuq7fBa#&7aTy**7LaK$=!}8v^4t^FM(g87wRMjl zn_}nWdQPG8SYn;)F#0%@`$*d}8I6e0(psSpUlLz2^0rR6*`)rYtC&;xe(DMac?CLy zsqyr0I(`O)m08X`3@Z*j+M@^zEFq`}|3q(RhEyzfuX}a>u#x$gZki|xqDB;i6hIdG zrSeBx_G?f$9{rLnC8dn%RDu>UG62}mIQCp)G_p7uqh|@;w8WCbVFz|~aBHeSF3UKH z@ah}o16y2&WC-awUNv}+!(OrdxR%5=o!*BIu=^LplHt4~tOMRHH4ckDi!VDL`lH!I zC$G_HthMj1q^cNaE-9=!Gaad_Uc$JCF)|aKNgq9QD2xN4GI>?E zgQLTf{nu#6iYEwwsk0C@8j(|v+=}Wu6ztw!T=$2J5F}=N&WnJjP|Q=DQ^;jnF=RW~ z1-7tp^5O?_W4$JhhT2B)OB!dQr~=G61CG|`ZX$2TH*)61o0gpi%&7O_aXjEG_xvI3 zBr;Ct9EIE?OQ)exd<=8FP=&JWI@Dg!o)dDJ1U`Oteoot*(ZnPm60u!=!e~02=Z@%T zS3MYK?7I+Vo@`oUNevHlG@5fviCpH(V z<>Jl+`H!Zi1 z@_ZNa$FlAZWrsi?GBYAxKmBZ{U4Nk5z64=o!AgaBJu_I`MyEj$vQu0b|6;0{iwUV8 zMlLWS_Gn1V$L&JKuDs|5o3kFi&@rXZ@`X12CCo}hzbSe|V0~03O|-`c5=-~UQHQiT8FLR zBP&gzRe@TomvZ_u-@2FAVxdsMi8BhmoeuhEq*0i&FN^ElEUxzq!D8mut6PR{P!6=D zOnhpZpxNU772fOw3o4pNf+67p+mT~H0mjsmEV<9^uuJO8#q;G;I%yNronR0;2?J^3 zma2v&d?4ser=WW~r)cY(zO3hV#$p@tOr-l`1-fuf-64v5;hgyjmmcQ=DKL)-%G>5y z9%$Z~@a~xYa#QWir+1sqnWzQR;GMF_pt>+`!=zzmdBn7&3Y(=I1&WAT|Je#DZq`dDHT;7FlP zPf<2Yb5taAcJTsQKIgEc+iJ{d%&tS2H7w^g;qR>sTb6s(DOZ-M%hR&rEPKfW_mwo` z_0BuHD$1ZBsz;hE$+Mne#$&Illn{H2{JPqO)uS!DNG=^4Tf9!rGC=RJpzhw_RxN5(Va?q`DN`1hO`UTa_hFnLge#$yWVImI!GuE#q>coRbR`=J`M9=5R=6AMPSkQg% zxHvHIdUnloKzZazun5 zpv~tDdip+|;z%ZFPaC*h#i&a`DN0m2BM5}^TU58HPx;`s?rz&Rt^e0rZT-^vy0zX~ zYgJkwTlcNI)^_W=*7vQyw4zqfT6w#Ew+{dL8W)&)XCt;UOV$dP;OhKJ(pBI&%Jp1Y zxW6B`t-am+nS0sY!nqq*5|tXCb>e^WZx!50J-i(jxJ4A)DLGflHYe{k2=J0adoc!l ze%A^qafU=Hfh6(>Q$sY-jiFP0;)+ov=3|G4nV06ua0#cg&7?I;EA3V?RKz15Ux0L^ z2?tw~^JvFh((w6&;SF20PKD(ekB;{+5as06GyJiP zd$gPqR^!U&xDHYUsW;dinpTJOk*Ma%V=L>F&of=c720gc?}4`ofrFnB%;iK<99V=| zyKAb*Gm#Gh<|Lt5{Qd=kAmf?Tsynx)R%5@zSTJa9Ee(j$nHqm@h6})AmHH?79ore7 z<2Sq-jC+XP`-l2wedAl}Hrhj#fa1o*9GgON2YYC<7HviMbLgR%T(5dAj*4$7 zD9Qqm2{Wt7&q_yAH! zi|gdJ$celY=0qs8ylk6NJ|v)QW|o(bZ7Yd62zk5q+fMBtk86K!lL}@MQ%VqVM~T`| zJ$N>opxF+k0GKK0?^%37F%;~u((7MfU_%EBGsYVE;xHKhb&Q~!wqHxj0&k#4ZxKvx z{moaliw0ai$P6`4PQZMIN#mE+8r9aSG}^6=MkJ5l{NmKxXg4k*bw!X{Ydt7#OwLYF zgzF>7;&Ziq%h`irskAb*0Tah2Gpf($+kv&z*Izr9UMAoR+)D#cjt8P`Qh=;%gw>(PC@V!7a@RqDrB+-p7#eZOgvC7vb%P# zYQQQT9WW&pqO7c@GA?BXB`{wCVJ-wAm6HhpwR7;}OWrii@k}<2k>qn0YcpAVb?V1g zmJozNIj2zQqHiIw$c5bkavD#D*4ey21nS+lYakWga>z+m=)}uJis(6KJ&f1A%)F#~ z=Tt-eEW4oh))k|Of+V8}o!#K?d&e92&*t2K=X^O7L+~B`TYoGmxAgh9^=~`$ z>f74*Nk=qD0#8MFtOQHdjro?4n4B}CbRemCfN&<-EA+y}s!3Mv&EV`{76tX^sy`+- zmeFVm*Jx*4N3ePvFT4HqX!+3#3*)Bz>@&o4T^pEKga}25SI)Z`Tz%V?4zzh%1VR93 zh1>8~tMD|qnteyRPr=dZA9ok8dmn66H-`9gv${z?pH!dF&u^>W($7Cs|3E+g zSp6gY{8RN$^z*-}|3yFlT>bM9ca(-%a|e%(_x>L2zB)dhgS0E5K*-$Ul~14G;^Jq- zC74X2B(w`6y-S_ayV%9+p==w%+V+tGz2_Y%K!|Q<5$+-WfWL-}yn-y>ukYk=9w6&z;p5S=hWGLoGis74ic*l(7?Oc_ z^sNAoFS3za!CI%+t6gF$!ia%EYRKHn6U=l{gR9|cTtP%Q^H)va+qQym<8gyqk&W4W zv~^p1^my|M|LN7?pC7l;d;N4b^sAs>e;W-EJ44>?4SO(xuL8-Os!2CG=F|yO$^mP5 zc&X)j$?w7DLXp3?r?T*H`lm5l!G+5iM(9;@rBY1{hNhhQ8={4@u zXXszk;S5~+!>%!w;$2DZOHyzf( z8iFJAkLU&mK!t}15#ljEfmIL$aQvWnIwh66?vy9mgw%)mLonMZCoh}Gs#h3d0<8@C zW$wW3_zZJ$iFpw9{voi_vsmEJ)k5*p{^^g0uTF!Vmp=zT?HnJ&3jDlnB1mX;uqK5h z)y3nqFQ2kzm`W#>Y+iGw_M8@nFk+{u1E3-Q42vn34*9}i>WMx|`5oGLi&qT8&juq! z1@Q8O38>n%O56Io%jtBy)o5H_U)L{&v-)Uq(HL+YN#lF!%+Y|t4M29o8we;RU9>`R z(Vc_T#lUu6zj0*fzTlSHx<)!xgWM*$R^u@dKZG~#S8&m<`+M{*z_yR?blT@jTb z7gm(M6tH*oE2WzFSKTW?iru+ENk<6TwN z21@e1+11spnmVPdwQ({FOZ}+VF|`bi-$_PD5)Q$R$#t%ITBBM`dJ`$-mUNm`o9K!r z2Oe{7IlTT@i*YM#+mwCb31nC3d6xBfF?k z?NYLM)oPe@JId)iMdq-FGW7{vozZp@^UR0>&zY+TDdmJt2H9J5WE{SVEH}aOF5NqYK`2hpg0Wos-N9nu7uV1#AAlKn-Zkx3V1q@`%r&4*>O z1N&L-Y|1>kcZP7O%~H9G4=pzYmXrbWN9Jnqe0r>-8f)!-!B|=f;t& zt+8aV@^bdNDM~xpIYr){5n-JCQZ{1M8Y(a7OwO ziZ;O28F{nAx)PI!+vbSXW6s-x54vdabx+l4__zz=t20C+_7tm}35AUFw7HCbjyar| zf)IZ(in+w5x?@{xni@hi>>I#Wl=TRxIW7T`|9C)dzbNfcazIRSMwvpiD>!o|?WsYe zrz~dVxKS_B#5E(Et@F*{(dqu-%eO$;Inn(kQVX0LSGfpR!5AYyDbZevcxM2`ubQ*VKINYaGT4xU~i zZum*kT}6OVxkC>a}$Sd*wec{WjNT zNsS$Y^2>qI3K$j|vsU44sor8}Z=j|wu_;d#A0=saGdP-ZoX63i_tFJ+ ze(t!&r^*vCFdx|bmy?*)P;7#55>F;H7eBhwMDs|g<_V&c3+ED@dWkg+I04P@6!nKK z1GW+<(J`F9vzB#ewlD{zOUZvk6@a-mm&*pZIDM2w3)brnT@)#FmwqEy1W6Z6LYw69f@H*(A%**!yoD_KiPT5@0#-{W8MAP= z=ez2_o2PMi(9v9u<`X8o*b)sv?iyqb@k(HKyk3vmay~-RC>lJ|i}`-T;?t+4+vk*^ z14FjltPa_hemp$3ZvGYE^EZop&R%t zjuA4ACa@QTI*O3f&~U=^kxZAq)Cn?!ns35`$w*DkGCF%tiHCZ5>mP+>y_QGA(x8Z+4EKzg-3bTE+|q4R?#bD(J+9 z_M{14EY1)ypDKy{m^vr!8OG5}QK}+CyaW$|Xew!>5YWbf@2h3=`65=jWSXQ7TQRJ42^}P#TO*waV|1V*!a)&C&Fnnqi-}WEb5H+%=SRgv zGsAR#hD8Sm`iCX4ZOX*N-Q0FfV1m2H*8v0X=_gM7L;qa1s}_w=XAxz98Q7E30Prhk zNUKTNHpo4~`u;heS}#EA6M@e}Fw>EhcC8n?H##xn!vH_Zqx*CeT1Kzpe;c}p;&}_Z z<-3E}0Jd_fq_NDKC$5L9(nlk9%!xzm0_8dzsLvDp>73PhW)`1Fk-bKl?+LYUpfIpHTHeb0NWR zjMIGbYIhek#Zv?@(h0)0BO&^e;QbI7U)5i$wGp$Kqi#qPCD`=*E<>N#Jcr}GjGQ$%As^<<9OC^vPJRk{MP@$RCE(a+C zUJzW}8vWx~P@?JiN1GhOA&aZ_>1wcdGu7~NlYos?0wzC%DecRNWnYZZVzmTirv%e< zOalX!8MUHlDngXQsdolOUBKT*Zr@&x(35J&a&uJvYZR>U>@dy;tUHQ+G_9~>a9%5p zy~wR;I5Ha3o@ARdnNx!`)Fp62)ruT}E%)QRU^ibStoWw>GWd~@bAtc_Hq!E+Qm4-Z zdP-(mg1GxfjH?boEPjsHyRWEjhBQ*xBp!&sgM^d|JmG1<*M-#@3>PxuOM&{ ztA1$viNuOvQXiXIP*fGX4593t_+3wp0|JtpH7+CW+@mUU)NcTnf&(#!M!D4!vC1ejH zsC~CrUY8b;S)ydd`j_s7M`)#E6URC}R~eG#9q$ z)ePaK;CiG)EJ^=ETo2vWm%49cSl(P@MohK-JeozGWe+odcZS>rvg`ytzmQf}gD5fS z_=;-2QIIDj10cmclEw&mXo1N(S5s3}%_Ha^1RJ40_8nggbFEIEeE85i9sPTatgcro z=3h)Mmle~|_(>n=)#ch+_ZBOJj5=oDCPG4vy)>QNJq}rVFZB#(Z#VuzsB_`+F zwXdkD+s=j2vnmH3kQ`b)QJZxI*iB&3+DksxjMEqko?RX7xW&!6_*rFVC+D~`6QQkI*!zsP5?C%T`?8NV zz%;FmWWq={;AdDKQUUr$~+>*;$(Kc=L8;zDoosF57qsxj7Jc^Aa(?SV>^i%pSWY@lVbqQRhqXG{pri!ibbx2=^ay` z>GmgeD<`AG4$oR9|xqsO|Dy2o@wRMT1tjn33I$xc!vXa*yr!%G}KNWRB!)#$mo3NlNQ(pB+ z!$#mLvM4!-iSGaA?Z52*(oluo()9~o%n3rn(2#y{=ZulA6wJ|(*z_A{JygH1#KM3Q z<}Or3KACf>a_rsh*|7g>kQbMxh_Z!StZ*=J(aal2_VUb`u}^FoH|N9J9=iF|vj21A z@8;~6`Mn|&>+d-wUN6(O-B0XvWzhz5&Bv|MeD&yTC>G^78&bLDr15%SHyvQQdBg{AD~=)@x*%9FP677C(dn)%r3B~C+Jnm^oV&nz zA5HM10wgI-ar3EM?3n6*4z@e61B)9>(G1 zA|sab81-uoj!BW~IuV5;n;HOKo%jlAFg}w)Blzh3_HPU7ph$JiHT)IU({m7o3H-L#qYzc2DGSFduQWsa6PDfA|v>qSnk zLaCZKubcQ0Sv8}&KIH{_;}TH15A?K1y8V9bj3G%SyR$um4k2Cuz_J{WP6l$ND$!XQ z?cCu23J||owMxn$If71S<~!%M*dezSh7<_9C1%F373P&G+j_MGYZHhQ_vs#kPkGzI zp;%ajJ3%@p*}xEY9wbC6HQ4#Xw5+h&PQA38nIMtS_WrS#*w>N!VSyJwbbjI*Ggc?u z#*A!3(NuiGG~uq(i}^zq=h_$ifpz6UT7ptf-42wrMrrGz$G@MP9`C<=K7YI>V@;Zc z=g7i5K0OoEMgdwFQfMG%xn+%Ni<%L+4c1FGl|>r%Q@A@|4%Qg>^QPHpoHe@JuAc4> z9e4&0yM!G2arNfD{PE_|qsBV@HorvNmm`T5sNhw7d|Rv?Mox1$XES z19)kmUIr2$R^>=kTEO5OJ-;U@+bU-U9)CR}KB zy?O7>X?Rm4!ZiiC#PZ#$P0Q5l;f$v8#AAG$F%z+tIldWBG>#Y}{?0LOSyAZDX8i$d zqIxM$B>kkRd57)EV1Tv0!IZO2OgS69n>$;dI!y{1lc_M>5$Z;>wN{6|l&Ld_UK*@s zzD^%-D_foXczAqzcyzi1cv|YH`{GslxO*a$iSJIGdH2LiKjZ}-`^}+~LACxLaJ=lS zEx(Ptd7$(2m%rT4D~6LvhjES+fB*ZRm(Lq34I;f;Yp_xC&x}7wneXazcewf3ZgRT# z(?FJVGbh>b;>D~6tJFS`*T5j8C>??s+?78b?L6N*u3^Z~Jx63xq{3_-H{v&vcVZtj zPIq|5#q9GqM`)WrCS*$(d2;v5DiAb7+Zw-EoQcLqM;~yrJ>Iq%#qLWhm!%c2@UKzu z9ph_J^Asf7O2**RO=tu($m z3ob_H(H4c8nF6hP<12SEUpl`hcda2TL2&1$Dhs^ttzv7-X`}Ir2MW@tHeC3UM)1*V z#9wB4vR+O-YpuapT9r4!p4-09Rc9w*JS+9x1Xc7fQese?wog zv#UT-Bm%@Sq5QN29NRbNjxqBU$3fa*pdzP93o6BU9_UR&4h;rznu^WSGnvqw^)xo? z{Uwy91eEqcR9(MOVlBG@fd>@jHDwopk*OxxRal6_S^zxCBg+oL zizZAKgcGXH=tqeK^?hEaPQvoQk1*s}5$})QY{F0{DQ`RLG&C38BzW`U@abMnRJ0Gk zI>|td9HxvbwOW_Jby7A70kG)0z&n<76~L7&30gA5aJAm#wuV>+&i@oDNz%h42Gx#1 z|JXz5mXLXz9vBd`Y(;0Cq~A@Ap$LG4E5ozX#HqHGAw=qEEQ#)!&R~I3p2v!r0vqZ^ z>+lode%Mbmz`E9(jbRGM2}kTrC1MnI3oxg6mf$Q9ipj8hE2uMlckF~*?+5>JJ#)kU z%;(e2Me}s$xw{59+JZ%wp#RQA0N)hA!??&TX^ar33moJwzKaF8F$>UR=D^>43et^% zpV6N+-2NU2O_el_i1{df>2R#wQQBQj?BqPfN!AiK05Z&Y&-_0V{(VO#%z;Oy;CXLF?xwf1851DY(-f zeS{77-t)O4%pM0BlGL}(m-^vs=r<_~VB2Ga=Arf^cGsb#cf|=F-dmv|1U|{v7rw6t z!A}}*E+|42UdMM+wG=tTFe2{_jNmytn=qy}eG&0XO5%W?Su>}EOewl)*GmK?lo4aS z7C04zgCL4S^5F@o+ock9n@>1vVc=XK_Aa4&@+a6;*7tBeDD)7A)_b$AV#$^S!pT1Y zE`hP9;c}ErYnUYnHqI8FF?>)mS0!9;TaLTq$&Y&n2dT3#(E{az)7{3tJA(S(9upEcz>ko*gbstY;hf>V+WfR7VSIur6z|` z0a?GVmmFCF)&`9vq)f$b2ei#?oI!$myB^6-6;US%-a90i9z z{GYwu)7m@}5853;TujJv?v$6a97OfOC}Pa`8%3uAHfBoY1r-vbK$%oZK{yZCeluyb zTJU|V+^Cnaz|FK#8f^~bg*?KygHfaONomk%n2tIxo7oWRuGlHDDZ(}$!JB*SgoEq? z|K)wKk?-K4DYl|g$zTNB(BvHK{{Zt@J3OwP9KJf<-J|#O)X}8pHEWUn+%Cw7h+9(#4a_R!c3BH;>$9XCm!WZ_3v1p~?rUY7<0B41(PC%FJ_4HW}m_ zHb)_AN=t6n=65)!swlZ@)!+P5f4g43gMr)`^=sPv?Q@&UC1d%5264Z6Omu{j+#CzJ z|AFDpsD$TbYV%*HaVC_&$Dn+)v-`K5=X=1dcW1_MP=KswKYvEheSQZxwTh>qKG)coMfMO;Y!~8U3;fQu1o>!`}1#mw28|4-XF_ zEd|VnQ)chwQ(K~BB1{PU*Xvf@Dm255YNKr13-CJGf8OYA(^INnpH*AsUYMtg!+5r9 z;pa0`kQgjz9Dm*DY2Yu~S*WLh-!W>;QPQZgHS{`%5*2r5i$1~%fbv$Iz7`Z2hdD}W z8=L8C6M0LD@S8p`spU2@vh{0L3>R;SO*ym39Q1(<&ldANp_lSrFAx$1+Cu*DXX2;3 zcVb6SBS6@EhM5i1(Ux2qr1&|-C9WaABO~t2+)m(`>n`7k+~Vr|l(RD2Ok2d|g^-Vb zk0+RimZBP^JQ~}`6G{jX=ORE}kz@wr`+<#1CIT57F1c0$9Y9t;X5A?QVVO50HzAU4 zZ^zCWAgqrnLhW$O-dGKu`^l78sU-Uu1C!EpBFv)`1*akO$w!zaA9Fv%Br1e((4E59 z?g4dAVq>ht;qT&errobQOpc`jCNuC?wf0W!AD!B7Xo_gObzG9OV0D_E2`3Nhv7Mch z7Z`Idqb7%Tw-TpNR3>4ti?vk+>xW>s`qL;eA%Ez0hZswQj>idiL2$n6Ox`nxP&l$6 z*xfbYd(NoPANKk2-Vq!zJCmVHtOAFn-~9gT4NWXa8v=J$Gt@oij33{_qH03O3}J@7 z`$Mb<(zsZtCgL(19}~JZt%!tO_*SsQyBabj|6) z&9NpDlP>|cY< zt8Zcdbtfaq4ypp2AY&V)5~gLRP-~XwtyV_4kZgx6Mbg^z;*pzTBEI0e@7f2a?Y+ZiB_pA4;RV2k z<9@<}lAL+QAI0#D+P$je8;jj)tnI|a!$Vv9FZWMT-QXyW;EIeVI?Z*r3I{@e6063l zOZi0Wu!v-@;g#gdG97a(6Xa#17YI5R9dsAb8Spmof8tcxy1do>_s^I)yWZ4&@rl#3 z5@e24)va3Qcgab$mHG$rvu3rpr*5s#tIQ~uoO2ua?KmpG*gtu(bGrMZ@`Fq}l@oqA zdWQs9OgKJDrL&P^s$}NfP{rJ)(q;oxv@S%B;EOi}9MKz$#__Oe|K_yCsZxX(?>{2l zuK7zXUhUp&+(wI6sx(=$+z1W0g)zEaJYeKwjHdHo4+hgT(1fDcpvC5r^OHIANcRCzo;2CsmyN&mF{=&5BztxaGlA(GrvA#%DL0u^cVTbKj>fl2mZU8 zEo#@=hvqkKIQabI;)dL1BoG?{m-;LfjdbK87Mo-V{6YNzL2r4K>=VP@QauK$ya?Mh zuW^r*e+p8JL(fMa&<#d$SBNSZ7FcxqcFywKToCUDW6lex6oRNBd+MV?KqUwT&p~;4 zD6->Gl91!GP{Gw8?w}9wG} zIu2D9rb-equjGKT%%kpxw@NrQVV1Xj;&zvPKI zpN zMjQ)G^liZzmkL5B8x~pBEmOD}oQwvYNk7@N$z;*XNL766rhrF@m2JhhnjbjgpxS$+um++%=O?8BW@i zyx~!ASBAO6KT4hirH=7!b)IZrkXPR{?up=1%Fq#~6U)_6&XtLZZM9{UJaG9x+J*GC zKkd;imssT4*4(IX^lA92z`Meai_a@=d?0c{=<__8LWJSG5jJLCvazh6V$dHfWz?0-Dseyl_&r7Wr43(HEv}<+#RDo;q(f z6qAFI+{j5}xeKp|elK(5<=$qQi=e0ly3&p~VVbMbiaQg`j^XIGG{v{f8B!kOr(9a4 z)D@Bi4Yjx$*#He^0@Eb;4F2~5O;5BIt2t##SDlM~w;4Tp^ytOT z^Zi}pd;xT?CB{SSx|Zl3`q>~{vu$COx4?0Uvc zh_IB%+kq5_997a$cz8iz$A~U0LaFd5?b;a|7I1G#LXu%mZIK2o7Cl*N>Ln?LKFu0V z$=)!+5V>CR!>4h?T~Zg&7TB@q@|>1V0G%|?IHfJaTxIMRC};+p0~4dJjpyfJfJefM z2W6jLG`Nzn73l&STsKP2pOltVoGI)zb9SrboV>zk(2etRq?yq8C2UX1Vrz=y_$1`A z&hukNg@6n|M9Gzv!`)n_Ya6{#XtFOcYr-wi&{=Xxc-1{*W8oskgdJCS@x~JcW6SGi z+t?Jv4d@rxL~j4;>uOdFgYN_1708)_0UXpbs0?F(+@U|)KOl!U8xa)M2c5_blwlWZ zajnMh>x$%+o{b021ynOn4hIPRF5fbGIoV-a#G3j6Qu?Y$l(=ebB<&mRwBRE5_uvc*hy^X5m zw*}SG;$PFT?gYd50xq}@v8HsqCRc(piUub~YM@rvom=#d98KO6_+NzWIf-Q{Kclw~ z%;K2sAhXpRjyz$*ZV>r~hWZz4aV#rLxf7&eQ7&%0ZJhuisKzT0RL38p6NeglGG?=&*zEJ)OX}$a0*) zQhoOshu*Yq!vG&NQ%>~Yzjn5~{`!FsexWu8!Zh<-E7t2!!tpqr_dOO(MFW}psBBmt z^h(_*7gv+Vy<-M9jlYe|&0NC_CX#MusmJrR7TAiKM{<982Vyx4j9^rX%#JW8nT-4{=B76|CJ z$_y>B$+NMIg~IZtFlV*y^lAWJK%u{wB|GsUSR5wbhz9V@SEX#f3q2W7o7e82Cxo1` zO<*O_|BFmG4#LKwqG%(Hl#+}UT}AkElmJ>`8Gf`vub?#G!HA*eOFXPei5HeXZq~N$ z^N>@__b%+E4QoeS4*m=GXcbj>$kUkEY;xIx3K5*)95@u5L^$q#wypk@g_5Z)fXY+W z!8J(#<|Jh7Ko6&!SDVfS3Qk!0*=TynPjFH27b2g;(rnp?`WjbL!7)sy z9ht_$y^+2+8l+@wwbm;ubv{bw5?R3~^@j5-?bnVR?EscCxlJY`=-|=L>5uU4I35o$ zTM1AW*yXr%P26z!mK{!k_2e&rZ9JJu+HmDC5!0Zc0aa_{HZDV+^BwD_c?RYby z!ZS_en-LQFa9#xtp)cwPus-sroJ-J4Mn$S~Zf1n$Ha+D)i)eZ&rX*1~pjhV_J&<`# zh#-t^}-B|WQ`a{D2(FI==4-Ii{(zpQVC&hs#TcD*7z&l}!s=JluvYqDq- zr8$@=LM*^NIUJc?xUdB=Y~(FSe|QeJ4cbmS6Fjy1L(22jxwxQo@2+x~B8>6!B^3__ zb#y+!^*}V9R|8%lrpR?CK_!3p5+psi2l^e3TOvbqXs!s7Q8X2nsDTlr>}ot^IZ|N6 z4MKw8E+Jc@4^f_!>X6J}tL)S+Zs-zF$`#bvu*CWwPLXTSPbODEbkXew1gw;rm_lOY z>7UJ9;5UgQ^I=ek2Hkk7=iOaad-fFOl{ml&q0^LicjDl8mNms?umR69}}s8^ps8{mE!ZYG=bza4t%CF1Im%3%s68nWC&eY;_Ew`5GoRfK9y>Y`NZVkW zm7EOZ*Rj~tSbrl?f>#_BI2hEe{fm?fztQgUH!JTnH@O>^l5~j-vna9snX9dCOS6D47f@381s=QW&TwkJGy%`Q=@WKvvH1iYr5b6^ zM72iDkBPxerg-A}bdx2qCa{IOKCct_F_OM>;GlaPP$_woXPAV7B7#Yn$hm&;TjvHg zm|!!44_Wa-8dJB|ikAy=Hq_+s{X*6uG~akJ(QM>I*&DA};_D*nWfYcHS16=yb;YJG zBZRq-14+$<6*PzQoAn`*&@6*KIRT;A=;K6T&H%lPNIvd&`Iq5nsK3L&ppeJ%M|U#r zPlNBiLtETxPDS$vIUtGKXiua%yTUi zOlqNCiSgtuj?20}?BC$2CSN7?;YtEh&QwLsK~Rwi0+cb6fIVZV$$hJbQ>=1S`A*IyUcWkUTcHfs-17wP&icu5uU~0;>k!x)gAR>!a}~*jNB+b zLw#MIW9Hq3Kc13Zc0{fKa2wS@G-f7-HV``bRz)_Jx{T5_5xv|Di;!4BEGbD5=$%0@ zll>`m2OHSf{1dGP`8h~s>jqawypq-#L5sU`fAsB!dn*65WRH(wFG+-Lke^VvZ0#sJFGm_oaMl zi!1N|YD){YG@%tO)8`XfOJ<4WejcH9$t?Dc2(2*`A{o1+T!KcMj1s!$#ioi9j`PRk z;|PupsisnC(#$9lLcobW6SeLSpKLyiP^Z_-XiAahNl9{(WB%6IF)DOrkmd*bi4-k) zPimfRGHi?-lLwV7G1+sf6#2%{-wMbq5sP|hi4B%Z_E&@19BNJ6H&;qin+PC)xdxNm zo10S*kvOhMIj|fuCT&RhQe+mHC)@o zWF@we7bicT_$>9VCGl%d-1hiIJ=h1JZDUFvut~f(^k{SUu zp`Aet;AIA|T=!9_A@if%IF^=?9Td)OA^>WP7^D}}iKMt72yx_Pxf{-n32e%gRB+_9 zD{w36UXj(*z2LZk6VVZo+ss)q8lYPPO&m!IPc|z?aM3L+iaxu0>F{K&2uMD0m}y(f>>P4iI{M@t*sCv#_nx=PYPPS5`#0(;=$-Tz2Te*TD;-DO>MX*57}@Oi-wy{MDk_!+mqjG zzd2}x9aO6K&qytgX96~_iL4};(8{=G`+ zLcgM9x|_ZbGMF0A8j=^|aT_J|q!}i6<&C@Y=AH4v@b-Xr!wY?WlCRk*YN9~5lh;D| zNuDyN=)@JAMz}18Q@RSYA9%!Gp2Fz}e%RUl8~!}rJ30sskN5HFeZdj(Nny80%`-9C zXXsm)a{OFvwWbBpr1Pa%SX#P~cT{qEpL=fDjpbW*V<~TF28#SyEf>8@IaQ^r-PCGb zaWZd)a8qO)w2BrlJH$^l$q1EHdgz#F9LvmSnq<%j@nQ5{}BG6n1Sf`grZ{LH%0hYb>I0Xk&_$9f?%?KY_c4LFX}v$gey z>}8lxkTFTk@Mz8WmZ`Qh?p3JQ=!@)rKkd8+8bOrQPNW@dF*&G~H><|4xEhwd4x>wW z)nEt|4ag!$q@foxwYg9=#nlyU5x12ry>P24V9)b z)}F)k2N-aU94rEFNpeH$hp-oBW#wGwbXc?wT%>T7_(?IOVldtYGx#rPnTfc z=kA1eT6^t^did^lTy<|YiwIT!X6Z#IwP1G1f1ULap)#v{R(6ww5KcqPR-$@#qdbf> z+D`w@$2`Z*^9g6Y*hcbuExnzg1s8w>3oTrGrTv~7+g*O=IDo{?OycLPajJv=Hgayx z>nzvEmL=oMZ4XcF`!AsUJdN{-z_NQm=|JILP~((pCYZ;}5{PPsGO+hjYA>blm8IDG zIRpH{_llaj(=<|y@09IXHqmtCm&WbJmKC(JeHsl~utDcqN&i!Jskc54mA7+5?X>^n zCrjCd0yZmpem4R8)Ou_zA!Iv?#8$l{&+R4QU^2|Ww8*{17pg&g6ek%89K;Y+O&T9` z3cYKp5?-tDZoOdbjBLGGEwND|BXS|RhKu2IFqq@LgyTV))RVkNeu828WXLXVtE91; z<8z9~U@K=!zQ)=88EFMpQPdUV*RYkNN^+|pz?3S7zzlCW8eFEo!4m<}_ZedL^(BFH z#Ggl^#OBR}A(@ysjU@ZRsbNq|=27591xJ3;!B4Cmp53upJ8#1E%?$@DtY)9j`z40Sbmb26kO zPXp&$cRy44=Fz8Y^TqdZ{>BM%_Cv8|F5l8kA14MV^+%({XRiQ8?#oY3Nn4 zmd0P6{~QI)g4ueQf+jVE^SQ9&_-gbaHcp_Fu5h6jC{G{eLk?*2jHW;U8qh{YxVhqA zfkb@Ua&ziBbj4xuQGGk2hNJCzw5^Wl!=Ckyq?CcNe1nm77|()mhdH!i3;r)(+N61z zUX3@JbK=?;$vF8n7Pa<3JyuX?hlVk2JK2_tx{>=P!?`Z9O@&+QP}BNWNR7&5&Nbc5 zRh02C<|xYiQ~Bj}WH}x9!lwvLxN~P^>-XBKxi(!#Symet@0NG}owwWqEgjzxMOr$4 z$30X*Cl3F43c63%-lRMHKW2x{_mlr}6t%z!`oHrYpQn!W)-P8DmE&pnFVaNj_3eM= zetsZx;3%CeVScz`H0LCwRZjEv{MNsI$8SA|jVRK(x`$$kE&pJJE2&$VvVR$s>%-ZU zhpJrvMa;fbKrBD5(tKXOn#1c$4Ox!A`X9vWf6Dc=_)Hf?6#akaU}qH7f(JSnw0rS+ zdrVGV`7oM4^@qLDbrL*1IDmZvr6U6#{kIspf(agOhh5gKVp3!%*nYbAtbK&9)UWdD z+fu5<;-h8Ca0IX7|M1kZulg@~jf*Ky*n zMOh0pOTOaGn9Rng3{NNx=WU#%9+Kjl8-sCjmct=Z`GMwmK(r2l!UkFl2A7fP)sYexMGOI6jTtUMuK!g^|?k*-hH@8fVL90ra{JXC#JN5K}S$Y6YDOm zq>VOV z8|cI>m`Yj5oZHb1(^24rD0)s*8%3PZ19M#mqhU8Dyd5(D9w0ulL*PVWD>Yc6;4Y}0 z>(8V8y-Gneq^>67I4N9Jw!#FiGq~TOE|`9F(}v$*6P?EsXv_Tzwn~=Ex7)Em_6S@&yQt#` zf9h7(?Q}Xye0(End!1BDqF!)guLOY}9-7@O9B-9canRDRI*XU)gXFFhz@JGQPNx+5 zEc1POK!J=#stDaK7YquEz!~i^Q8oF+(sZMq-i{s|Ul@2zW;Pj5zaa%KFtSOVBl+e% zvc94SXBsx@?47e1T91?5%J@rf^zt1ooL&n=&lrOYokeMn8CsOW$&xMTlVzK^Xa}g( zWen$<;4>KwZ|Zj3cC8Ti&Yw~{qZ$GoteUH$RD4Ci-<~^ehD?%;&_Ik0{j{@&9E85Z zF4M|~RIK-hz?Y4pu)qb_UiU)>w8`Y{5U3|7^%oiIoJ--Opn*Do?&c0RcUK;AyHt8# zl;j=d70G%9f(bB_aHaKtIgBS7vl%dIek`fCR@HBtaOP~RXKlnAdZY$+L&<1%=-puC zEUF-KnKS@zy1UO#`sY{4=&ixxT(5U}9YlGCpJ(zj;h)KsQ>y#TH}tgIr62u1|24o= zR`lC=%s+2#oUh)TKYRP;@t@!Rh2G)Tz@Pu@eBdT8M)U(ai9eGYu3{!X#@D`yz%ECt25HQ`A{+473Ka%#+ zyW93U1)A&On0ovlT^Mw;ZRfComID-40!Zp2EIVeG6hl8Zubm85lGz2qrI<{1D?Vr) zF%fzEo-j2P{lM)8eUz#PIqCe0EKdZLAxs-_BMZx0uE~6p>1zt~(B?kPOV;M^Rt|)F zZKw`L!@Zu9q0Opvfj$Yqk^TBk;AEpWZ~x!wFY6!gx4--TFJXlLw-S84R=Imue)BeR zt6;oC&MX~-as>F!*9~YQ2L*psFs_IQA?CkD&psC+j{-NgRLXoKh~jyc;J+Tnv?xKV=9)ltM5y8f8ZF4|Gz0 zFl^(5)LF>%Hfhq}{PMrNK;@4HHZUEm=zTf&Bb#aUaA-`EsN;$VJSm*Sok2*bh$Mt0 z7Kn@wHGz-`$(r7dMTE84RokOPX^Tx{YVw$B8q*P{E#+jUN;}O_6GZVG66nq-^cE*n zzp_!eh><~%ykBv`*fGwuWB|R2rku=+Zo>N z47#&{LNc2SG{Taww6Am7KexEM2%c2Zo|#th+Nb-ymOBq7!D_cX^2aAot9WP(I-22o z?>IO%N*?`EUvE5mv>hamTJ<--)Zea`A3ciR)o~+&z^1qCsQaF|U0Z7%AEtMt)2IsZ zaSWRtiYA)B%c(9ka|a{B>BCrxNuStY;Fu(n%(*7*fcjz$NB)VJB>qGa(`ZhhtIqpa zc);O%;+Q%gMt#iag2=Fp1WRsjc!TC0S=(`cUT1I_3^GuugP{l4jmMG4=wXdGsPi1K z{8Oh-eZkw?d?N0me7b@7tRw?eG;OA#=;7o`pOL7~?X;IO&2&v6hh=-TO6%+E!QS!l z;c?aJ4dIJ$#$dS>lC9D^#DukFJUo>WhnEj~lml2q>dugnAw1 zjHvENq6FtYplyUVWHJL8H11U~{2K1WVONj~@H)BdpymJ_CQG#AD5d#e5D%D?CczqQ z&DuXJCUOYa_$jik+~8U!v%3Pp&ed z8KUvMyLaXS2d8^BziGeD>7+9ThGc$?+c~L#BTDDD@rP0=H|*0L$@~~OPwQJ0K01fz z^K`$z`ZeXJ;w?GJnw5*TV8fD#0DXJuB_0|*3Ffk@e-bt|kWk4DNgENa(Ef#33Oz*v zY)Zx->LYZN?4`4$*S_rc;?XQ=CzqJnyqP1Icvsd}-rcSAN7$^U&$$I%pB^k zVvSDqa(B#<7t0xAi3tjce6&?Edb$6-dHw@$9z$yW56Tl{x+g~1&^Bi2Bw*@d6tH8m zo?6#-keiy`-|s49yN`KC4&2k4N=p|pPP_XNOH^UR`j3e8I?eK5wu2?FCi)=CnT8z- ztnhG;Gzpw$<~i?AlBv7?_0-6fzPrX5Gq$v4F-oW7jC{7h6%L&XXgo^#*mkW)_%f)i z^zI`r2Quw)mr%a&>z2*G96puEm(`@^-x&|TYYg+09#@|1HHXaSQu)>3L{`fZ4G|IL z)*oOt$lIXTSEe9mTjVxcPVIwm$%`eh7t1HHVgGxZ{O@h@Z@*1G>!x_ zcg@)XC$DyQ_fAgGH;CqgG`BJt)DNZM*cU8d^nzJ;q4LL#Zx8^Ma;@0cRHbnxBE6DA ze)ReYZ0p;AicpqT4D%Ib9)2vB9_vE2d2471L+kP(IdJ-2t_>kwZ>FSB@7cS5h718w zaWtVj-=>qMgaurq3eN}tO@X6vN6s!TgyF?#>sCFJzM9s$7 z$|d;Y_yzQEKQH;U==iHjW=0e3Gtl$Fz$kj%zLu!3sCUHNQ#78Qhk!{eAGbA4;=wsK zDdi-v89Ef^tt4;eO6gNpQVzoI;fo_^x+XcRvBb&YtK;20n%B~<`rWy%6zsHCvmx8qEf3U&NL#oRF76$0>^6I_^rU z9yM2FE?b3X_-Zzo_QwNRd^}{X8j8FIm4@pc>1j>_2tbWTiu__JG9Cn^#^ zUM6tz{k9d0sF}>pl4*ZBo9d^#y4%Sj#9kRNlfYvs+IlHvzUMMkC^Q&FxrbGZnybaisSeu4VCLEGsd>=|WJ!nm|*bF&S!+RY#bLU9O z;`apXpGRh$z>?hkb`DFBTz=wqcKvqwmRQt2%B<5QdEIMMW)x@BZO7~WW>8tHsIAy29Cr2heE#0At71g}7NA{>oc z4fy98oP$V{arQ|z3jR4G*>p&V28a=T?RkFcLezIBJrNZC2^ajnUV@3Y%l7LBadwO2rE(%&qP@_iBOy zz{ut@mwsU<2u1{2!;ZMehL0a@M82@r=x+YuL>0A{1gt&%fETM;Q*gHccs4=4>YT&F6uHk%AvclY6%?)t1#k=?T7| z4^f*@QwR+EAzo>nK%dL)55!_TN)p@>`0W{LgC@Zb`!8wJ2F7p5z&zpAfNNuk-WoAp zx5+fVN*D>K6y*HRE~{n>=FG#Aa7BajrZSib`XO8qUy;3?@sfm{PxqvV7$nN8qaNJb z^a-8}Qx(@FpJ`>ZFZ=Q*-FH1yP$e*+tFzI74%1-ThOY*r4%}^Rd5)FEH>jkl=}KVO z3~IjhOWGhVpmQNY{7{_HR zNmXB)z)f-!9Pd5fd;KX*5S}`ttaA;u1Gy8;|B|>fu~#MT62m`OUc+n)tYSa_;?Dov z>6>UgsB;@wRs?_I*H{fuoY^3Ds!^#y%QATcdZF7yB(3uf5OAf8s2bty)OecRH{{jM zUzoy%KvKYzDN7Ytsw7{*zK2U?X{}mO>2O zr$z!%XX~DdZBzsOO3n&g2U5Ha?IEOB9(guLRyVZL2e-atvo{#fMZn8RnM%oT7IzXx z2(ofy7#yB7HiNYxjO_fJ^bSMGzj$~OClwJwyBHc!qxKhWT27A5+BsLS%G$>kzN2LWY+XKcV5iN8!JL?vii0k5U&<+B%%}9PZi~aaz{v4}2 zeiOX)P7YEac_56m5HKdfuq1K?C8}$;2Ph+b)47EUAbnlr@wQyS1Z|Ngubu&?LKVP; zF;TE26>w87(1G|-P2*uAla!I(=igq?9ajL!?;2HElXv(tDcA!GTFR|m?!_7|cCh>E z_;~N->6@+Ny}$1x#^Rf;o#%UR-{!Wb+eRnDV$nlQZ%CPEL_P7Sq-*6dR#&@@JIEOQ zU?`tQ4G6%FLqsqW39JK?KmCAs!1GQwc2phstBF?&MEOBl51fN|QWGlBU7!WQ8V9yU z{x~qol;vyWLR87_u3wF*BvnPKFF_AvANaAhyIU!h5IvE}gi(B2=9jP>hYSHgF*Q+z zxn&Ai@1gt#HQh=DCaj0dTzrIyHCMM*kT9MR{g9j@aCD>kpc7%8CFhH|ySFN>i3)Y% z93;c<-j-54qy)*hbezyBwFe^PXVsPcM5$4=M8`kn!5yrTHisLkXwFn~HB`mmMr1C6 z+DdwBSK)|LXd0z%bQE6bLWy4X4++5|r5{pD0F|@0T!E zScaSK|IW}Cq5mhDEsAUuL7t7G^d)Q*>lNQ9d}=}&eTQp759YS&`JLxVFq0w9HgKa7Rac)6&xbj#Q$@pT3k)Yu{2B$1xIm)aYS z&@!rzM?~V);%E$^#Ad7NSPz8g_Us8Eqn_iD?)Jd*Gr!kxff|s94H(&GwVX75;q%x4 z7HF~+G{(`tw8yj!7Wdm`XN)$~eBJovCsK{aD7e8EZd4n;9Md0-kEN9#ODnxpNN4#* zznr_78m0l-cs-0m$Lp@X{^IcIo_T9#uD&irtF`v#m*DMss{%zEPh$>b5Cv;%gDT%@ zL<+#omhr!o&_}?-%FyY{U}flwIanE1OX%JBRvAl#Pb}S6Jq5!^#a$s%?L)(@MAKtJ ztbT;X@U)3egOvP1|LQ94^*auN&S;`0NpX^(;!ez?4R>Id?^bEWk748_Smnw3FLpGD1X+vcwKM&flprHhO+F*d^>6(L`IlH^yZR zZhfkbN(12b>eBE4Xz5vdHcUF_F*z@r@us6Tb;QU3*a0&wPE{UKr;g)JPc0Shg#u0Y zNPulpXf!@*Q)c(3`pd8xP3HjXI(gq8^Oy_+Q=pQ9+C5)uZpyfpkbefclv(eTbjWEv z1N~vUm_YzB0g<{Dutw|>apFB?lYM1Yl!7S0!?@xGE}C@+;s4>9St$%{bViH2RXuj- zXJ+WGqaP|F!-jEFUt#}7d*OWLRG6t~PRufpUEm?*lZbditc00Dw|_hdFmxQg6HZIv z)VSv4qBYl2h%cbDA~k&446b-=$4Y8d)m}&tUo7M>I64Tk8A*irXORQK;>h0&=zvL{ zjY5GXl>xrMe!uJXcqwT6jjwy}JTis5luOck8Y%y6n?fEXJC{f?E}{E`PX%JM<0#D0 zD0+@sVXIvBincRj}@%`*Kkfty5w`<^-33eH4> z{qEHjDEe+iStZi+RiR`Xm)to#-5eKthZ< z5Z}*K%+^!!N%Sq&_;o$c@6|gusWaaa@fvpCyuv}NV)97UoA#F1@Ihb-3Bkxv zk*sHDDu{TA&aVc0+zHaU`UFr$wy2k8Hjkk#WY`fCsh8`4k~q@KV2bsSihAeebNc7i z&hx$CV7I+Qi3-M2yz z8sQgj{q6sxD6EzH<+j?S zP?J)l%mDX2kV5J=+6@q%#>txfhw(@t!Ja_ zya7(H#>Br$fGozez~ArY_i@F|z3xm=pfg;1b8rmP+~k=J?8Nhvkm^z??fan2y=cIX z+Mt6^uRh>;@t@O2AST$6KsP=fzqp@ZMja{{=7(8$JC6wnb~n-AkyP7|5#7Fcoc+xy zlYxSn%me}e-!1irJ++vpxtGX&>sy8 z!&j+Ka2OxjBj=L`^hc&|es4fr>Y>kloA)7w-?ni@P2c!MQ`|zBc_#GZ)|{_f6m4jB zdCjhS8Ouasc@O4B`?7LI2~#=(m8zvPNTHhS=ErobpG+Bq9tj_OlvvN^EvLf5cF%)G zJnc3Hy?QdLBjR4pIxT3~U&bg^UzBN^PP=y!FhK>WL)caa3n~ruMqOh1Tw_QEKnti( z=xISHaU9|^C!+xrNjB?m{`jZ=`t#d6^Y_M^$F)DdC8$^KLE4H}4b&V;r@FVcQK<&q z$smSb*x?5Uxb|OYxgUb0656W97;0Y+6|QytVXfp<9{5#eGzMS(29UMNkB_8{BizCq z*-ACQ^JR5HNcz;Uvi=O`!qmWzpSwqm0f?Y6WVfjoO%CEjC`i zt|!CG(~1u@5SCAV+&ef3InG?fHDE62C7IY|M(n#%-~%!U;wsYg=PzGDfAOM;5@U@_ zNx8D21r#1`vUUDqy%KC~ZwK(>yaS9h{A#v?r^Cs^`tAF`z8PR4>AW9=Koivr=fDdY zW{NP3H`ES!**~9VR4;Cw?pKbz&+=XDfRB{eHyxVzf{e?A=V4*AmWyX3e?APbvCBhx z`)A&?@TXdwX%`Q??ABqUdqFJmD|ak`Z(6NZ(0JP&w{YpTSa;mqauvJo3)&ueaKTRS zaYs<^mFG}Djvr2*S}Qq+L9uIGGF42yK`fdLST^|$VWgYhpb^SZo{*V>`o#EG2=RR- zFNY(>JKQSHGyo4an|U`U_9<5(!oDbBz$HL#!_G5iwlTY;CF(pN+g?RF@62@Vyh4&q z+0Hk20nTQiY7v?aZqQTs)-Di8AHk0)iGWkg7C~ryouUx_%(oTQ@PLb#s5!umyJ=XYge~-_ajFT6fSyi}b`fK5 zGG`@&4)91O6vC+`H)&NAfjklE@a*+dlp(@3vHET&;neV!ANoP?j<(tb_7@OaUYX!X}2NeyRLwckR8P-*T zfp45t9a(Kx4mb8tCk10O6xRf)W@!fnrBYc31&;5q_N(*RbT(0?hdh%UCjP^MnYQL+ z(K@@#d3~2-V(Y==PCAe;9+$D#j@{&Xo1!a|3-w5yyT z;^DIlY#^XVsWkpm1%2eq*;el@RXKk|L zsj<{7{hc+`C68ndTIENN!gnRL{9wRf$JLO~mZQuw0m?74X@cQz7zqhIh;PQ^InQ4s zwjkZ=XN|5v#7!vZFCi~Oq=gn-(ur$_^U4))9KV_oL=}zbdNLc5-DzjaUN|f@VT=hK ze~b{N?sN3ywP=s(y#XqAidrEE5Sfccy^h+WU`@92;I^t6!Y1!&5V2&XVlY9dHW^{I z0YNL_41vQSzQuS>>zB$LtFtz&xiafAFH0T$*iy$?ydvJ zpO5Uur4^ovRhJyDW2=5kRR5OolXe(J?|M?kaV0+y?@B;dDKoemln;%HOJ+2Ft|feL z?DU+#RySXK)KBhDh5jfWO1AT)j_1I2iMz*o9pkvW5P7m6yE04LhLLTUZky#oR7VcF zh-fIP_$kXT=1Ou?p{&f!grX@>RxFRD&C18f4FR31cPiQm)2=??t4c2``vlXhEU3Eu ziB;?0-mcKEQ~D-)icTgOuXA^0v{dc_c=Ij?(W?AKj(P0UD#_79@Nuv=bYF1TrUd_E z;t$~Zle&IHQDlQ*P)jH=?<7G0e8ym9gW+Hp3G5Rr=Edby?k%WAt8g|U;`T~%wy%QV zgiTv)hJZEQ}YOwI`m0S`R(8y{=X7x zXNR$~tcA`m;}P<&o(+a)05(lCyJ?DiW1MQ#LB?(_A(<|*87J|qH>#NkenKCz(O=`) z1Zt!mlujEca>^Xxe+4_j@2T$}iRAS&V6(o~k8iycu}Ys49L9^zt%Xy_3TMc|j7D|I z{Km+*RuZwM!d#h+!#|wjxq%-#k!$^WT!&Q~-&P!f%iu*q$!C~Gj-V(!Esz2GtJ*Lh zW<(hc+fjV1WXuhzP#1i}LZg{AEtT?-%r2t)b^cNo*3XGTWoJE&d$VrV9Oe!gCbgDK zZ~fS6lh;^lv^o*%JkKc$wFLE=7tK+~IoS)1`C9|LE9oz6_np!CR`ZM)EbJ(*b!Mr_ z`M}f~`AV4d!ApG#tBZQ(IHAzw6@R7AZGyLXw?3a9Mt8TL`G>~s0^S?8d06kWfw$A< z1KW$}mb>6Zi|j9DY8i8LP%a*Dt86|uzq2mWr+h0pz67a|s{hZNQ?btRNlW0WPtfPF zs`=ts2ipniaJf*L3MdOSvdZRC7(dpbd;_asuF&IU(0?C$0Xvec3@>_hrxzDGtU;Dh zOpIe-SmBg5GpbP}xX=;d;!;qJWZxb1gBshw$` z9|k6moH+r?P2#U)O>DA!=j$W0aadZ9@Nc4Wg(G2g;G`=NcM$8T3PPt7qKh`N3&cf7 zM2hy=t%0-`prHBM5Dh}m4dm8~QS=_}=TOIj{-W^OVWNs5(e2 zMtdZ@xwtF(CzF%!r39k%q>@*@x9ISMPo$`%Y{&x?&17=Ch~A}IweHDQK>Nycrs#Ay z@gfv2ekoDW8CPRY9&5sZ1%s9++4u?QXxOryv%BVRE=DSoi1SPiOvIj3yGcq0EmW@N zM#W?Jrxg<4^BSVV}4Pvk7toO+hPHY|13^$;q~p;_Q zK)hyS29hM;G|F^z6;qmX&1*d9`RXP*mQMSrOruj7xyie-BA+am zw(rQed4VapdRvrdGrHSMyKbqV?2N%}G#e55ASItOh*EV$X*a2Y*nKCmTNiOo^nn)12|rLVpiQvPiNgy8qe=e) zwGNnir{8UlOBnV?$&-9QX+p3ToI9)VFMqUE-JjGsr8-p62`u6@R}+xnC{YjT{uBm2 zT-~-^zHP%iG`((?H}xU)zghnHq(=Ply?IW?M|-z=-@DA&n_oJ$-*#&Mz(|=#ZDPr! z3hrk!XD9XsG$~~}KQ=%@6M4bc@!)(;RQAgkDOzzc7@dJE##09a8(U&;dsF`CO%Kd} zH|x|WOc?7Bhv%ej>ItYbtui;2v)BS;&SP34z}IxlA1L4b=B1ax%kkl_ciHQypLEgL zlr?;c1?}brlL-f|X~=odY|c2kLA*Js53fo&L>5geTzUB;{k%Uhzn!u-&{1cSIC@4Z zEP0xo)JGY4Am(g?d<+-=lNbGDF1!$7~zQV zo6>6kyceGb?RIxOm?ijMi2=fcR=C>=L0VZw&xms>87Sa*yA4(Dw%fSR*Vfj|pUr0Q zZG|4nqZj)x50Bx+_xPfMvttW?kB>^L<4Nb@suMil-3@yE&czTftgZo}YK66*@CNOo zYr|+d!eES~6`Eebp#O&MBa*$50TYwkVHcAsUZWT;I*n3jKGVQn~g|yL;H7r#q)RK_By4PUQ$bJvc}x zG>fVODI_8nOgO`?4b`R?AP`v=P#NkMgnTrsK~uFFDOd)*C`pAEqQQ;rarCtgM>-iC zoVK4Hoc#Qvy?glb3>UD|pMb*zG2TPEL>a{_k3{Q4NyKO0Widp?fukO_yLq;~G4x;I4aIp{=mzW7`W1 zwsaH^l8Xn8ho)6>UCq>F;gfikfDKuY3ymquIjjm1fmqA@t=Pui9onuQz7aYxG?nU?_Ar4Sfb$m4*ZN5CP$RB7a zq316THcyV;sj^RNBWc1^ZFPNlyu21$#Le3Z%yi1#h0`h5*RFqoMTHE%%I*d52`^s+ zg`eWEvlnyl{rAuuEeF?abaCG87~gaUGs52)yLaS#m6@bQ-Ftq#cNEk<1Yxk2uBcKD z&2Dfu#%YwQgVL+YJM&xQXfIN3Akt~1NSb>@P+mTv=W$V8U$pCRX)B!4Wo+_DaJzBO zB(GRW#gX_O^M>cY%CH&^p8+Ko%m^_ZeudsRLxlo{*@_y!xF^2c=tcB6Y5Y=O4_a$= z)cqi&%Qybk(c$sw3ACTXw>UEc zL^+J|D~d3Sbf&|2pcYrS;viYCI9iT8b=>@28mg;qM0h!G>u=V7DZg!18ZG?aM&rWF zeIsb-?`8PED2#&d^7=ow`%pSe?{GdP=L^3JzWeM0Q?L&f?u3;uunAW3*Ix(pz$ywC z-l#zFW-@XaT}@U>)4S=x7mKOF@lAE3n)EfjouenS1IbyC%h`ASmi)f%S6F6$VO%pjRc*Ab;2(%(mcO-%hf`2hc3i$C zC}nHQyB+4Pk#-<=os|0_zIrRj|Bwk@ia6&lfUiT{C9^-vSXW~V#xuFC7=bQlE2MkG z8>p}g?)>C)?{<-vVc)&$7I^GdSjc6!!eI0JMlb%*7$V$MKF@uZ+E03eH}*j;g}rAP zCVViwYB!z+jqRj?zqT82i>I0Pl-(1TfVTbAr>{%ynupHzf86{om>$<}Mt#{9PRoNP z<;zUT?>iy)W)hqwAXY>~z}(3|>%@D!gC?jRVecIaL^2HGtMT;K`Y&1!7h#j2o~^V7 zV0lUNQ$$JmG?%ON#4q&rPdNDpsmNx-{;#wC`K=<-GdEY49+yp5K-lqE+dGF*!TN&Q z``}6Non0emxi-K5dP7IJVhX3QdFlB#n|Ax!Ca{mrU{BoH+DeHLg&lUj&l9E3^Q)KL z>F+k!pk35KiEJUCFh=Z3u9 zmgzkc%W#>2O3~Cv&F}kecnXc_`-LiUR!1UI)_9EDPF1?1{^Fo5+?&GHv-S~H#HiCw zrjuEBO38LuL5YCl!8!$5z%$|$*E_u)5RPQKbdO45Y8$(|ty=Juj?yhtfwAAZ?{>==uCBDXT_V@54%TJvn!!@N$B9D0 zYi(QRxb{5b3K=-9gx*J)(l#1^|3OgTIm|3zHmI-4{>T$^xR-W{ePCRG+#ov4k3p{*XqT zUVdVGs(4s_Mjv|%R=VFV83PK3K6fUR>X!0-gYbDpNpB}{jL>8PtH~B8q*u?5_x9jL z`=`U>zwI0!zIypok2;etZpqIh9ZzTDwF=R=3H%NOYsq7M@7nd!7C?Q8glpv6#WjNPO?<0?>&gkY++IFLIE9E4^2i_g&c4l${dx+s@Q0h)o`5-*w2Zq zP}&P`vL#sEO!L|7LNhgku$$Plx0H?@(R?ToWo>|I7bPH{a~g^FA_036w(imXu7+g= z!4EU?|06UNic?g02HUGkvOaPIG<8^p4_}{hW<=T(@eOR$#0*_KzFFU_|B-IDKE}}B zuphC$eNx{b)@!}CUOR_pXGw3fzJBNY`K12X`#T<-<0Cm#`74M{FWUXu)9i*+t%k3VU53FWWJszS!U3(5zlyO<32L{)?yI^GHcem^} zUh5(%7=~5>e@;_W&YeWhlcN%)!nt-aRiL`{ndkyd9=npyKF%SEN^=d5dE)$j8v48^ zcEDzzagMp@cTM)*3BojJJ{l;4?$NK3e=DDPxBHO)=Q>4$@ zV^c3YR0ZHBFn#D>A1!PvDBB5mqzXv&!_PLFe)Hv8werblj`;T&Po_?0@SGdx3-|fU z_t+9Q4;nKY+A|xzAEKu~GCM~G&3Fs(p^U;j$6?1=k&sjgfaPL@_Y}EVqDx0d9HvM^ z-0SzyWreb5VECPW>oX%p2s<_Ty4e~1ywe}xnaZkSOidEwhG_*gQ*_kid*lI zP_emu!g2<7_8*yCC!e;CIaRTN@nB6&hhh-0H?te_AneJ79K8P zZsE6hGNRztSrV+B9>0QX3HY^D{E`DKpTB&CZu+xne~?JPtgorB2gh6?d_`3bM?EZCv$wI>qr0e;>D3sf{N;F}^K4D2}!Mw1?U)JJh=8hHr6rBxPX&_Qn|pk^dxlzAl(2GIyz=npB;mKbTD zjQdmT0$XM5lpf-e)Asq}x4{{3h7{e@NA52(Ke@ZaDZn_{avhmh*s%%vrP1uw4ubNA ztDwh4WA4l=&VI$~ok>ff0b4SMEnODi&Bc+hj~S2UH4)!Tr^1{6`lD7P1=$Chu12>R zs^$Gc zRClL89zHej{Iu`Ohd=zEr>|a+?+DD2MV*T_9{(EoW(|}0M~EHGE(5OwYvZ`TUh6;k zuRpHU*J)f+V4!D{cq_n%mA~AL<638ORlCM8GW-Lkr}oEhK|HWcI6-WzG3=bMVq>cF=nN5%J66^g-!oXMw4xj}ujTLx_mC{HfjMyBrDCKEuk=s~ zw&GU$j@Jdq7A(nllmLHK+gV_Jy0eMB*!zol+KuYQ$gX?< zMxWFU60x>iHR9bdZ>DlDpSjfmy8+X4dU$vc)M|ai&IAFX#-Rkx6QT+47A_UYT!X<` zr;8EOum?}}c2D;YU$$TFyx7CsLHIMFr9{z3FlDJEtW+n^k8v>uvE#81FX5Z7C{v+Oa^825v0^|nsQd(6=7wt7ikcm&ds9GtW zj3Ebk{qyp83uV%m!uqXLtdmx?|Q z%bQ`&P0e<(#xJ`gpgRcc3PacLqOk0BCycflAC2UDL=Xm7oe2ulovD`#$PiwG_ zz-Dl+BC(blkVtn1*PYu0?eWMl5Ec^WLTPNhSqa{*yZp*He$#*3`dHm)-Pao2nZ_^s zLo>QJziho--;y`5iH78DAyY!46*i(DdLtc|ycDAtP{|{sO*TM-V|FZ3QN8u?+b6C2 z##h?#GjzwA#27&&Ioo0wx5VXha-VEHiLIy+xw`?lgUGD%{}}_pt_MHHvq>L=*|so&@f8|*&DR7bF-qin83ykmlr&=KUe9hNmHPDSAgV{fnmnwc zO$s^i2vui-@NDmwA#5Q!A#@MR;I-m+-gf3InnM3)rBOR6AJCe`B_67{2@VGneJ+ezRAlEk#Q6Cs(gz6gNMib(K&P85W1fM zD3Y?|m0=rjFp4Z#329C_F^va zEU$Is^WwpzOnYW}q6()=Jf~aE*lqSqS-rSt*U$J*l}(N4LS z6@&8~5C+(O zPoM$^`$vaC4YA#`m8SzP$Re@h*c}qT#2pBPv-n-c`P^&MbE--AMicaSAGih+)Oi5w zu>~^syG#|$JP?9%&h!wR=M~IIANcB^WAMm&EYzTKqtz2&8 z^`z$3VnSAARd73c%>*@pyL>>Uxh2BD0$M?sAx+1kiH9GIt0o+?sb+TcXP+q}y(+{`>l znwi~fL$3WEyW82TAw3dF$l%mw`YgvJUdg1Z9SN&;QVXEI?cJ<-tEgKQwje~`rg0jY} zu+!cM1Jg7w8|V4LjG!3I++jZs#au!c?vBNkM_73fazS|Rh_{5)YxISvpFvh$;8z>u zK#EQ{(hqB$tOvmhWDpKt9{fybPYec4QN3J?4wexA2$I%;#b=WX!A5n0;fyr=Kwb=N zINC>INqX8JvOY-MhFFy{m^s;Fe>&bdI@&vKv%5_DhrNTtm(Ney`!CyQ%-BDMk4=a? zY4N6=_c((6^B@B0ERsaqcS+MUAgIMO?I_wP6@znD^o)C>L(@6 z1tf^KPA=Pkm0INB=1#FutCdi5c-i^TA5B!=arX+zIxCsyh~c<_!c1*Ay2ofv<{?_8 z)vp4^e#EUOp0GhJK+x(DDce#Tj704$q6K{XAn-L~EYv0y=}91p&tki81=h1Cx`R{> zkkV=@DPVf@xOw{=wP9*pq5>Yqh}Q?Llk$L4S%{vJvxqrKhba+6pH^_RO(<@f zt9aV6CKj#)M+o)eCIlw_L#$^M$N+5T8X;u�CKJBwme-noa#_M&;C#2>bg(9Q-hv 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