diff --git a/.CHANGES.NEW b/.CHANGES.NEW index 9d25c885a..8616f5892 100644 --- a/.CHANGES.NEW +++ b/.CHANGES.NEW @@ -7,7 +7,7 @@ \___/|_| |_|_| \___|\__,_|_|\___/\_| \_| \____/\__,_| Configuration Program - for Unreal3.2-RC2 + for Unreal3.2 This program will help you to compile your IRC server, and ask you questions regarding the compile-time settings of it during the process. diff --git a/.RELEASE.NOTES b/.RELEASE.NOTES index aec9bdffc..38ddaae82 100644 --- a/.RELEASE.NOTES +++ b/.RELEASE.NOTES @@ -1,77 +1,50 @@ -Unreal3.2-RC2 Release Notes -============================ +Unreal3.2 Release Notes +======================== ==[ GENERAL INFORMATION ]== -* This is the second (and hopefully last) Release Candidate. - After this we intend to release 3.2 final. -* If you are upgrading, make sure you run ./Config and make clean before doing make +* If you are upgrading, make sure you run make clean and ./Config before doing make * The official UnrealIRCd documentation is doc/unreal32docs.html online version at: http://www.vulnscan.org/UnrealIrcd/unreal32docs.html FAQ: http://www.vulnscan.org/UnrealIrcd/faq/ Read them before asking for help. * Report bugs at http://bugs.unrealircd.org/ -* This is a recommended release because various crashbugs have been fixed. -== [NEW FEATURES (see unreal32docs.html for more information) ]== -* Lots of spamfilter improvements. - * The new syntax is: - /spamfilter [what] [type] [action] [tkltime] [reason] [regex] - [tkltime] specifies the duration of any *lines placed by this rule. - [reason] specifies the *line, kill and/or block reason.. no spaces - allowed, but '_' will be translated to a space. - In both cases you can simply use '-' to skip and use the default. - Ex: /spamfilter add p block - - Come watch me on my webcam - /spamfilter add p gline 3h Please_go_to_www.viruscan.xx/[linewrap] - nicepage/virus=blah Come watch me on my webcam - * The spamfilter { } blocks also have a new 'reason' and 'ban-time' field. - * The user will now receive a notice if the msg/notice/dcc is blocked. - * There are 2 new spamfilter action types: - 'dccblock' will mark the user so (s)he's unable to send any files by DCC. - 'viruschan' will part the user from all channels and join - set::spamfilter::virus-help-channel (default: #help). - After this all commands for the user are disabled except: PONG, ADMIN - and NOTICE/PRIVMSG's to the virus-help-channel. - Also any ops (+oaq) in the virus help channel will receive a notice - explaining which filter the user matched (so they can help the user out). - * Added set::spamfilter::except which allows you to specify targets where - spamfilter should not take action. Useful for spam-report/help chans. - Ex: set { spamfilter { except "#spamreport,#help"; }; }; - * there's now a 'spamfilter.conf' file with some effective spamfilter rules. -* Added '/tempshun' command (/tempshun nick reason, /tempshun -nick). +== [ NEW ]== +- Added german docs (doc/unreal32docs.de.html) +- In a spamfilter reason field '_' gets converted to a space (' '), + now also added '__' which gets converted to underscore itself ('_'). ==[ MAJOR BUGS FIXED ]== -* The ircd was unable to boot on some OSs because unreal removed tmp/ -* crash: if an invalid regex was entered (eg: in spamfilter) the ircd could crash -* crash: The TRE regex library could be crashed in case of some (advanced) regexes. -* crash: several remote includes problems (also non-crash) -* crash/security: an user-triggerable crash bug -* Fixed problem with 'tkl update' which could lead to server fights in some cases. +- '/spamfiltere remove' was often removing the wrong entry (RC2 bug) +- The TRE regex library was sometimes matching too much if [range].+ + was used multiple times. +- Fixed a remote include issue and added timeouts in case a connection/transfer fails ==[ MINOR BUGS FIXED ]== -* allow::options::noident now actually works -* Fixed compile problem on Solaris -* Some OperOverride + ExtModes fixes (eg: globop w/can_override couldn't set +T) -* +qaohv'ing a network service was disallowed -* chanmode +f was often reset on synch when it was already the same at both sides -* Spamfilter single-target are now supported, eg: - spamfilter { regex "blah"; action kill; target private; }; - previously the ircd didn't warn about this (but it didn't work). +- Sometimes hosts were not resolved on Windows due to a resolver bug +- spamfilter and sqline: memory leak on /rehash (a few kb) +- spamfilter: protect against insane long reason/regex fields in configfile +- set::modes-on-join now accepts extended channelmodes +- Opteron: various crashbugs fixed, should work ok now. +- Win32 GUI "rehash all" option did not reload motd/rules. +- Same for ./unreal rehash on *NIX +- Usermode 'r' (registered) was unset if you changed the case of your + nick (eg: 'blah'->'Blah'), this affected at least ircservices. +- vhost::swhois wasn't shown if you did a remote /whois. +- Made './curlinstall' work with new c-ares-1.0.0. +- Fixed compile problem on some machines related to TRE / libintl. +- /who +m was incorrectly hiding +H users even for opers. +- Fixed /rehash bug if an .so or remote include didn't load properly ==[ CHANGED ]== -* Updated /credits. Now includes everyone who has sent in donations, - thanks to everyone! -* Various help.conf/docs updates as usual -* New hooks for module coders and other module system improvements. -* Modulized A LOT of commands (34): this allows better "hot patching" - and leaving out commands (eg: loading all m_*.so mods except m_addline.so). -* Moved SQLINE system (and ban nick) to TKL and introduced "holds", - this might later be used by services for nick enforcement. -* Restricted class::pingfreq to 30-600.. anything higher and you might get - mysterious (mass) disconnect issues... Anything lower is dumb too. -* Added checking for insane listen port ranges (eg 6667-7000). -* Improved DCC blocking (like dcc to channels) -* Made some numerics more clear by including the channelname (+V/+O/+A) +- spamfilter.conf: fixed fyle sig, added sigs for: soex, Nkie, LOI, Gaggle, + changed a lot of sigs from block to gline. +- Windows: now using new Inno Setup which made the installer 300k smaller +- Docs, help.conf and other text updates. + +==[ COMMING UP ]== +- You can expect module support on windows in a nearby release. ==[ ADDITIONAL INFO ]== * See Changelog diff --git a/Changes b/Changes index 97423880c..03247046f 100644 --- a/Changes +++ b/Changes @@ -3012,3 +3012,103 @@ seen. gmtime warning still there - Fixed a bug regarding the new HOOKTYPE_PRE_LOCAL_JOIN reported by bla - Fixed a compile problem on Solaris due to tar not supporting the z option *** RC2fix release *** +- spamfilter.conf: fixed fyle sig (was bad!), some minor updates to the rest, + added mirc 6.12 exploit sig. Reported by PHANTOm. +- Added a check to try and prevent people from adding all-encompassing + regexp's in /spamfilter. Thanks to Ville Laurikari for coming up with the + method! +- Removed the old/unused src/win32/version.c (#0001630) reported by fez +- Updated docs to mention except tkl {} type qline/gqline +- spamfilter.conf: added soex trojan. Sig provided by Jay. +- Fixed a spamfilter memory leak +- Added '__' -> '_' decoding for spamfilter reason field. +- Made it so set::modes-on-join correctly works with extcmodes. Note: to + correctly work with modes created by modules, the module _must_ call CmodeAdd + from Mod_Test (#0001624) reported by thunderbirdjl +- Made some changes to the curlinstall script to make it work with c-ares-1.0.0 + also updated INSTALL.REMOTEINC +- Fixed a typo in the /credits +- Made it so curlinstall doesn't use cp -f since it is nonportable +- Hide server IP in /stats z +- First Opteron crash bugfix. Thanks to Liverbugg for helping us trace this issue. +- More Opteron fixes... sizeof() fun, %B fun (always use a 'long'!), etc.. +- Added __attribute__ stuff for ircsprintf() to catch more warnings. +- Fixed win32 compile problem. Reported by Troco (#0001644). +- Added a missing ',' to the version.c.SH script reported by docco (#0001643) +- Added conf check for too large spamfilter regex + reason field. Reported by + Z3l3zT (#0001648). +- Added spamfilters for the Nkie worm +- Fixed a little sqline recode memory leak +- Fixed /spamfilter removal problem... often the wrong entry was removed [!] or + nothing was removed at all. Reported by MiNdErAsR, RealCFC and others (#0001669). +- Fixed /spamfilter reason field bug.. things were double escaped sometimes, + especially in post-RC2-cvs this was noticable. Reported by Fury (#0001670). +- help.conf: updated snomasks section. +- Added a patch by baafie to fix a problem where environment variables could not + be specified in the Config script (#0001657) +- Imported TRE 0.6.6 on Win32 and Linux +- Made use of TRE's pkg-config support to solve a problem with libintl reported by + raistlinmajere (#0001592) +- Fixed a problem with /stats S and extended channel modes (#0001675) reported by + AngryWolf +- Fixed a resolver problem that could cause hosts to not be resolved on some Windows + systems +- Fixed a problem where the win32 GUI's "rehash all" option did not reload motd/rules + (#0001678) reported by w00t +- Made some changes to the win32 setup script to make it work with the latest version + of Inno Setup (4.2.0) +- Made the setup script use the new compression method 'lzma' which makes the setup.exe + ~300Kb smaller. Now also requires Inno Setup 4.1.6 (tested with 4.2.0). +- Usermode 'r' (registered) was unset even in case of "case"-nickchanges (like: + 'Syzop' -> 'syzop'). This affected f.e. ircservices. Reported by LoVeR (#0001679). +- spamfilter.conf: changed a lot of rules from 'block' to 'gline', left some + on 'block' however if there was some (very low) chance on false positives (even though + just like 0.01%). +- Fixed an SVSMODE #chan -qaohv bug that would cause the user to be able to readd the mode + (#0001690) reported by auspice +- spamfilter.conf: added signature for LOI trojan. +- Added german translation of unreal32docs (doc/unreal32docs.de.html), translated + by Stylus740 which will also maintain it. +- Patched TRE 0.6.6 to fix known crashbug (#0001684), testing is welcomed. +- Applied the above patch to the win32 TRE dll/lib files. +- Fixed a problem with vhost::swhois not being displayed remotely (#0001702) reported by + medice. +- Windows: Updated makefile/unrealinst.iss/zip.h to use zlib 1.2.1. +- Updated credits +- German doc updates (spelling+synch). +- Updated /credits a bit more +- Updated the /stats ? output to say Q is sqline and q is ban nick (#0001689) reported + by Alzirr +- Made a note in example.conf about not using link::options::autoconnect for services + (#0001674) suggested by fez +- Fixed a typo in /credits +- Fixed something if sptr->user->virthost was NULL (which is/should never be the case), + just to be sure... (#0001724). +- Updated server<->server code for MODE so operoverride bug #0001704 and other + feature requests can be fixed/added in the future (3.2.1). +- Fixed /who +m bug for opers, reported by Bugz (#0001715). +- Fixed halfop mode code to not check remote halfop modes (desynch danger). +- Force a TRE recompile if ./Config is re-run, due to timestamp fun if you were + upgrading to CVS every time TRE was not recompiled even if you did make clean. +- Made ./unreal rehash (= kill -1 ) also reread motd/rules/etc just as a + normal /rehash does, reported by superh (#0001699). +- Various doc/text updates +- Added some release notes already. +- Fixed /rehash bug if an .so (or remote include?) failed to load properly, + reported by fez (#0001736). +- doc/unreal32docs.html and help.conf updates (#0001734 + other stuff). +- spamfilter.conf: added signatures for Gaggle worm. +- Changed version to pre1 +- Fixed SJOIN bug: it sometimes was setting too many modes at once. +- Minor sajoin/sapart ERR_NEEDMOREPARAMS tweak. +** internal pre1 release ** +- Docs/help.conf tweak on /connect syntax (#0001755). +- German doc updates (from April 18) + gzline docs tweak. +- Fixed some remote includes issues and added a connect/transfer timeout, server should + now no longer be frozen if the site is unreachable. Reported by Ron2K (#0001751). +- Changed version to 3.2 already +** internal pre2 release ** +- Added temporary fix for include "http://www.blah.com/"; crashbug...although I doubt + many people would use it. Reported by Angrywolf (#0001757). +- Some doc/release notes updates on win module support. +*** 3.2 release *** diff --git a/Config b/Config index 9f0d34207..901af9522 100755 --- a/Config +++ b/Config @@ -16,6 +16,8 @@ # in the cache file is valid and therefore doesn't check it, so if you messed with # default values thats your problem :P +# some bits edited by baafie on March 17 2004, every change marked. + RUN_CONFIGURE () { ARG="" @@ -195,7 +197,7 @@ read cc if [ -z "$cc" ] ; then DPATH=$TEST else - DPATH=$cc + DPATH=`eval echo $cc` # modified fi TEST="$SPATH" @@ -206,7 +208,7 @@ echo $n "[$TEST] -> $c" if [ -z "$cc" ] ; then SPATH=$TEST else - SPATH=$cc + SPATH=`eval echo $cc` # modified fi TEST="" @@ -247,7 +249,7 @@ echo $n "[$TEST] -> $c" if [ -z "$cc" ] ; then DOMAINNAME=$TEST else -DOMAINNAME=$cc +DOMAINNAME=`eval echo $cc` # modified fi TEST="" @@ -314,7 +316,7 @@ echo $n "[$TEST] -> $c" if [ -z "$cc" ] ; then SSLDIR="" else - SSLDIR=$cc + SSLDIR=`eval echo $cc` # modified fi fi @@ -386,7 +388,7 @@ echo $n "[$TEST] -> $c" if [ -z "$cc" ] ; then ZIPLINKSDIR="" else - ZIPLINKSDIR=$cc + ZIPLINKSDIR=`eval echo $cc` # modified fi fi @@ -432,7 +434,7 @@ if [ "$REMOTEINC" = "1" ] ; then cc=$TEST else TEST=$cc - CURLDIR=$cc + CURLDIR=`eval echo $cc` # modified fi done fi diff --git a/INSTALL.REMOTEINC b/INSTALL.REMOTEINC index 6a6283f9f..3eadbbd1c 100644 --- a/INSTALL.REMOTEINC +++ b/INSTALL.REMOTEINC @@ -1,10 +1,8 @@ **** Remote Includes **** Setting up UnrealIRCd to work with remote includes is not very difficult. The first step is to -download c-ares (also known as arescurl). At the time of this writing, only a pre-release -version of c-ares is available and can be downloaded at in the -future stable versions will be available at download -the latest version of c-ares and extract the .tar.gz somewhere. +download c-ares. C-ares can be downloaded from +download the latest version of c-ares and extract the .tar.gz somewhere. Now, download the latest version of curl, available at again, extract the tar.gz somewhere. @@ -14,10 +12,10 @@ as follows: ./curlinstall ares_path curl_path -Paths should be complete pathnames. If you extracted ares to /home/username/arescurl-1.0-pre1 -and curl to /home/username/curl-7.10.8 then you would run: +Paths should be complete pathnames. If you extracted c-ares to /home/username/c-ares-1.0.0 +and curl to /home/username/curl-7.11.0 then you would run: -./curlinstall /home/username/arescurl-1.0-pre1 /home/username/curl-7.10.8 +./curlinstall /home/username/c-ares-1.0.0 /home/username/curl-7.11.0 Lastly, run ./Config. When asked whether to enable remote includes say "yes" and when asked for the path curl was installed to include the path that is printed out after ./curlinstall diff --git a/Makefile.in b/Makefile.in index 004ab5f03..0a4f7bcdc 100644 --- a/Makefile.in +++ b/Makefile.in @@ -34,7 +34,7 @@ FROMDOS=/home/cmunk/bin/4dos # #XCFLAGS=-O -g -export-dynamic -IRCDLIBS=@IRCDLIBS@ -L../extras/regexp/lib -ltre +IRCDLIBS=@IRCDLIBS@ @TRELIBS@ CRYPTOLIB=@CRYPTOLIB@ OPENSSLINCLUDES= diff --git a/READTHIS.NOW b/READTHIS.NOW deleted file mode 100644 index 9543b856e..000000000 --- a/READTHIS.NOW +++ /dev/null @@ -1,15 +0,0 @@ -Some notes to remember: ------------------------ -* Don't EVER try to link it to incompatible IRCds (this does not - include services). It is *INCOMPATIBLE*. Please HEED this warning!!! - -* If you need any help you can email me at stskeeps@tspre.org - -* Please read the Changes file about release notes - -* Bugs? Read Unreal.nfo - -* Unreal IRCd is not meant to be a simple IRCd, rather an advanced - IRCd, please read the documentation before asking questions - -[ $Id$ ] diff --git a/Unreal.nfo b/Unreal.nfo index 03448a8bd..fff9ae74a 100644 --- a/Unreal.nfo +++ b/Unreal.nfo @@ -1,5 +1,5 @@ =============================================== -= UnrealIRCd v3.2 (RC2) = += UnrealIRCd v3.2 = =============================================== Was brought to you by: @@ -9,10 +9,10 @@ * codemastr * Syzop * Luke - * McSkaf Contributors ============ + * McSkaf * Zogg * NiQuiL * assyrian @@ -28,40 +28,43 @@ Precenses on the Internet: * http://www.unrealircd.com - CVS: -To get anonymous access: (read only) -"cvs -d :pserver:anonymous@cvs.ircsystems.net:/home/cmunk/ircsystems/cvsroot login" + CVS + ==== + To get anonymous access: (read only) + "cvs -d :pserver:anonymous@cvs.ircsystems.net:/home/cmunk/ircsystems/cvsroot login" -press enter when asked for password + press enter when asked for password + Then, choose the appropiate branch you want: -and to get latest stable: -"cvs -d :pserver:anonymous@cvs.ircsystems.net:/home/cmunk/ircsystems/cvsroot checkout -r stable -d Unreal-stable unreal" + latest 3.2 release ("stable"): + "cvs -d :pserver:anonymous@cvs.ircsystems.net:/home/cmunk/ircsystems/cvsroot checkout -r stable -d Unreal-stable unreal" -latest beta: -"cvs -d :pserver:anonymous@cvs.ircsystems.net:/home/cmunk/ircsystems/cvsroot checkout -r beta -d Unreal-beta unreal" + latest 3.2 fixes / development ("unreal3_2_fixes"): + "cvs -d :pserver:anonymous@cvs.ircsystems.net:/home/cmunk/ircsystems/cvsroot checkout -r unreal3_2_fixes -d Unreal-stable unreal" -latest devel: -"cvs -d :pserver:anonymous@cvs.ircsystems.net:/home/cmunk/ircsystems/cvsroot checkout -r devel -d Unreal-devel unreal" + To get support + ================ + Before asking others for help you MUST: + * read the docs (doc/unreal32docs.html or online: www.unrealircd.com/unreal32docs.html) + * check the FAQ (www.vulnscan.org/UnrealIrcd/faq/) - * To get support - ================ - * IRC: /server irc.ircsystems.net 6667 - /join #unreal-support - [Note: Please be patient after asking questions, we may do other stuff - or we're away. Don't repeat questions, we heard you first time, - READ THE TOPIC before you ask anything. We do this on a free - base so we are volunteeringly helping you, but we are humans - like you, and we got to have peace at times as well.] - * Mailing list: supporters@lists.unrealircd.org (for support) - * READ THE DOCS BEFORE ASKING QUESTIONS! doc/unreal32docs.html - or on the web http://www.unrealircd.com/unreal32docs.html - * READ http://support.unrealircd.org - - * Want to discuss, chat, etc? - ============================= - * IRC: /server irc.ircsystems.net 6667 - /join #UnrealIRCd - - * UnrealIRCd Bugtracker (Where to report bugs or make suggestions) - ============================================== - http://bugs.unrealircd.org + Means of support: + * IRC: /server irc.ircsystems.net 6667 - /join #unreal-support + [Note: Follow the bots instructions in order to get voice. + Please be patient after asking questions, we may do other stuff + or we're away. Don't repeat questions, we heard you first time, + READ THE TOPIC before you ask anything. We do this on a free + base so we are volunteeringly helping you, but we are humans + like you, and we got to have peace at times as well.] + * Forum: http://forums.unrealircd.com/ + * Mailing list: unreal-users@lists.sourceforge.net + (http://lists.sourceforge.net/lists/listinfo/unreal-users also + has links to the archive). + UnrealIRCd Bugtracker (Where to report bugs or make suggestions) + ================================================================== + http://bugs.unrealircd.org + Want to discuss, chat, etc? + ============================= + * IRC: /server irc.ircsystems.net 6667 - /join #UnrealIRCd diff --git a/autoconf/configure.in b/autoconf/configure.in index 2da9692a6..4326c5657 100644 --- a/autoconf/configure.in +++ b/autoconf/configure.in @@ -28,6 +28,8 @@ AC_PATH_PROG(INSTALL,install) AC_CHECK_PROG(MAKER, gmake, gmake, make) AC_PATH_PROG(GMAKE,gmake) AC_PATH_PROG(GUNZIP, gunzip) +AC_PATH_PROG(PKGCONFIG, pkg-config) + dnl Checks for libraries. AC_CHECK_LIB(descrypt, crypt, [AC_DEFINE(HAVE_CRYPT) IRCDLIBS="$IRCDLIBS-ldescrypt " MKPASSWDLIBS="-ldescrypt"], AC_CHECK_LIB(crypt, crypt,[ AC_DEFINE(HAVE_CRYPT) IRCDLIBS="$IRCDLIBS-lcrypt " MKPASSWDLIBS="-lcrypt"])) @@ -362,9 +364,13 @@ IRCDLIBS="$IRCDLIBS -lresolv " ;; esac +dnl REMEMBER TO CHANGE WITH A NEW RELEASE! +tre_version="0.6.6" AC_MSG_RESULT(extracting TRE regex library) cur_dir=`pwd` cd extras +dnl remove old tre directory to force a recompile... +rm -rf tre-$tre_version if test "x$ac_cv_path_GUNZIP" = "x" ; then tar xfz tre.tar.gz else @@ -373,9 +379,8 @@ else cp tre.tar.gz.bak tre.tar.gz tar xf tre.tar fi -dnl REMEMBER TO CHANGE WITH A NEW RELEASE! AC_MSG_RESULT(configuring TRE regex library) -cd tre-0.6.5 +cd tre-$tre_version ./configure --disable-agrep --disable-shared --disable-system-abi --disable-wchar --disable-multibyte --prefix=$cur_dir/extras/regexp AC_MSG_RESULT(compiling TRE regex library) $ac_cv_prog_MAKER @@ -383,6 +388,12 @@ AC_MSG_RESULT(installing TRE regex library) $ac_cv_prog_MAKER install TREINCDIR="$cur_dir/extras/regexp/include" AC_SUBST(TREINCDIR) +if test "x$ac_cv_path_PKGCONFIG" = "x" ; then + TRELIBS="-L../extras/regexp/lib -ltre" +else + TRELIBS=`$ac_cv_path_PKGCONFIG --libs tre.pc` +fi +AC_SUBST(TRELIBS) cd $cur_dir AC_OUTPUT(Makefile src/modules/Makefile unreal ircdcron/ircdchk) chmod 0700 unreal diff --git a/configure b/configure index 2b3454137..d0802df74 100755 --- a/configure +++ b/configure @@ -2340,6 +2340,46 @@ else echo "${ECHO_T}no" >&6 fi +# Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_PKGCONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $PKGCONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKGCONFIG="$PKGCONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + ;; +esac +fi +PKGCONFIG=$ac_cv_path_PKGCONFIG + +if test -n "$PKGCONFIG"; then + echo "$as_me:$LINENO: result: $PKGCONFIG" >&5 +echo "${ECHO_T}$PKGCONFIG" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + echo "$as_me:$LINENO: checking for crypt in -ldescrypt" >&5 echo $ECHO_N "checking for crypt in -ldescrypt... $ECHO_C" >&6 if test "${ac_cv_lib_descrypt_crypt+set}" = set; then @@ -9986,10 +10026,12 @@ IRCDLIBS="$IRCDLIBS -lresolv " ;; esac +tre_version="0.6.6" echo "$as_me:$LINENO: result: extracting TRE regex library" >&5 echo "${ECHO_T}extracting TRE regex library" >&6 cur_dir=`pwd` cd extras +rm -rf tre-$tre_version if test "x$ac_cv_path_GUNZIP" = "x" ; then tar xfz tre.tar.gz else @@ -10000,7 +10042,7 @@ else fi echo "$as_me:$LINENO: result: configuring TRE regex library" >&5 echo "${ECHO_T}configuring TRE regex library" >&6 -cd tre-0.6.5 +cd tre-$tre_version ./configure --disable-agrep --disable-shared --disable-system-abi --disable-wchar --disable-multibyte --prefix=$cur_dir/extras/regexp echo "$as_me:$LINENO: result: compiling TRE regex library" >&5 echo "${ECHO_T}compiling TRE regex library" >&6 @@ -10010,6 +10052,12 @@ echo "${ECHO_T}installing TRE regex library" >&6 $ac_cv_prog_MAKER install TREINCDIR="$cur_dir/extras/regexp/include" +if test "x$ac_cv_path_PKGCONFIG" = "x" ; then + TRELIBS="-L../extras/regexp/lib -ltre" +else + TRELIBS=`$ac_cv_path_PKGCONFIG --libs tre.pc` +fi + cd $cur_dir ac_config_files="$ac_config_files Makefile src/modules/Makefile unreal ircdcron/ircdchk" cat >confcache <<\_ACEOF @@ -10583,6 +10631,7 @@ s,@INSTALL@,$INSTALL,;t t s,@MAKER@,$MAKER,;t t s,@GMAKE@,$GMAKE,;t t s,@GUNZIP@,$GUNZIP,;t t +s,@PKGCONFIG@,$PKGCONFIG,;t t s,@IRCDLIBS@,$IRCDLIBS,;t t s,@MKPASSWDLIBS@,$MKPASSWDLIBS,;t t s,@CPP@,$CPP,;t t @@ -10595,6 +10644,7 @@ s,@IRCDDIR@,$IRCDDIR,;t t s,@BINDIR@,$BINDIR,;t t s,@FD_SETSIZE@,$FD_SETSIZE,;t t s,@TREINCDIR@,$TREINCDIR,;t t +s,@TRELIBS@,$TRELIBS,;t t CEOF _ACEOF diff --git a/curlinstall b/curlinstall index abbae0097..5036e6c6b 100755 --- a/curlinstall +++ b/curlinstall @@ -37,6 +37,12 @@ while [ -z "$SSLFLAG" ] ; do ;; esac done +if [ -f $HOME/ares/lib/libcares.a ] ; then + if [ -f $HOME/ares/lib/libares.a ] ; then + rm -f $HOME/ares/lib/libares.a + fi + cp $HOME/ares/lib/libcares.a $HOME/ares/lib/libares.a +fi echo "Installing libcurl" cd $2 @@ -45,6 +51,9 @@ CPPFLAGS="-I$HOME/ares/include" ./configure --prefix=$HOME/curl --disable-shared cp -R $HOME/ares/lib ares make && make install +if [ -f $HOME/curl/lib/libares.a ] ; then + rm -f $HOME/curl/lib/libares.a +fi cp $HOME/ares/lib/libares.a $HOME/curl/lib cd $save_PWD diff --git a/doc/example.conf b/doc/example.conf index 1d40dc772..8668e5015 100644 --- a/doc/example.conf +++ b/doc/example.conf @@ -327,6 +327,9 @@ link hub.mynet.com password-receive "LiNk"; class servers; options { + /* Note: You should not use autoconnect when linking + * services + */ autoconnect; ssl; zip; diff --git a/doc/unreal32docs.de.html b/doc/unreal32docs.de.html new file mode 100644 index 000000000..e46bd6918 --- /dev/null +++ b/doc/unreal32docs.de.html @@ -0,0 +1,3834 @@ + + + +UnrealIRCd - 3.2 - Offical Documentation + + + + + +English | German

+ +
UnrealIRCd
+ http://www.unrealircd.com
+ Version: 3.2
+ Aktuelle Version: 3.2
+ Letztes Dokumentation Update: 2004-04-24
+ Head Coders: Stskeeps / codemastr / Syzop / Luke
+ Contributors: McSkaf / Zogg / NiQuiL / assyrian / chasm / DrBin / llthangel / Griever / nighthawk
+Dokumentation: CKnight^ / Syzop
+Deutsche Übersetzung: Stylus740
+

Aufgrund des wachsenden Umfangs der Dokumentation von UnrealIRCd3.2 wurde das +Dokument auf HTML umgestellt, um leichter navigieren und besser +Querverweisen folgen zu können. Um diese Dokumentation zu lesen, wird einer der +nachfolgenden Browser benötigt. Aktuelle Dokumentationen sind erhältlich  @ http://www.vulnscan.org/UnrealIrcd/unreal32docs.html +und  eine FAQ @ +http://www.vulnscan.org/UnrealIrcd/faq/.

+

Kompatible Browser:
+

    +
  • Opera 6.02 +
  • Microsoft Internet Explorer 6.X / 5.5 +
  • Netscape Navigator 6.X +
  • Mozilla 1.2.X +
  • Lynx (to a point) +
+

INHALTSVERZEICHNIS
+ 1. Einführung & Anmerkungen
+ ---1.1. Anmerkungen zu Upgrade/Mixing 3.1.x -> 3.2
+ ---1.2. Anmerkungen zu Upgrade von 3.2 Versionen
+ 2. Installation
+ 3. Features
+ -- 3.1. Cloaking
+ -- 3.2. Module
+ -- 3.3. Snomasks
+ -- 3.4. Aliases
+ -- 3.5. Helpop
+ -- 3.6. Oper Zugriffs-Levels
+ -- 3.7. Oper Befehle
+ -- 3.8. SSL
+ -- 3.9. IPv6
+ -- 3.10. Zip Links
+ -- 3.11. Dynamische DNS/IP Link Unterstützung
+ -- 3.12. Anti-Flood Features
+
-- 3.13. Bann Typen
+-- 3.14. Spamfilter
+ -- 3.15. Andere Features
+ 4. Konfiguration der unrealircd.conf +Datei
+ ---4.1. Erklärung der +Konfigurationsdatei
+ ---4.2. Me Block -=- (M:Line)
+ ---4.3. Admin Block -=- (A:Line)
+ ---4.4. Class Block -=- (Y:Line)
+ ---4.5. Allow Block -=- (I:Line)
+ ---4.6. Listen Block -=- (P:Line)
+ ---4.7. Oper Block -=- (O:Line)
+ ---4.8. DRpass Block -=-(X:Line)
+ ---4.9. Include Anweisung
+ ---4.10. Loadmodule Anweisung
+ ---4.11. Log Block
+ ---4.12. TLD Block -=- (T:Line)
+ ---4.13. Ban Nick Block -=- (Q:Line)
+ ---4.14. Ban User Block -=- (K:Line)
+ ---4.15. Ban IP Block -=- (Z:Line)
+ ---4.16. Ban Server Block -=-(q:Line)
+ ---4.17. Ban Realname Block -=- (n:Line)
+ ---4.18. Ban Version Block
+ ---4.19. Ban Exception Block -=- (E:Line)
+ ---4.20. TKL Exception Block
+ ---4.21. Throttle Exception Block
+ ---4.22. Deny DCC Block -=- (dccdeny.conf)
+ ---4.23. Deny Version Block -=- (V:Line)
+ ---4.24. Deny Link Block -=- (D:Line / d:Line)
+ ---4.25. Deny Channel Block -=- (chrestrict.conf)
+ ---4.26. Allow Channel Block
+ ---4.27. Vhost Block -=- (vhost.conf)
+ ---4.28. Badword Block -=- (badwords.conf)
+ ---4.29. Uline Block -=- (U:Line)
+ ---4.30. Link Block -=- (C/N/H:Lines)
+ ---4.31. Alias Block
+ ---4.32. Help Block
+
---4.33. Official Channels Block
+---4.34. Spamfilter Block
+---4.35. Set Block -=- (networks/unrealircd.conf)
+ 5. Additional Files
+ 6. User & Channel Modi
+ 7. User & Oper Befehlsliste
+
8. Sicherheitstipps/Checkliste
+---8.1. Passworte
+---8.2. Nicht IRCD betreffende Angriffsmöglichkeiten
+---8.3. Berechtigungen und Config Datei
+---8.4. User bezogene Probleme
+---8.5. SSL/SSH & Sniffing
+---8.6. Denial of Service Angriffe (DoS) [oder: wie schütze ich meinen Hub]
+---8.7. Informationsbeschaffung
+---8.8. Schutz gegen Exploits
+---8.9. Zusammenfassung
+9. Frequently Asked Questions (FAQ)
+

+

1.0 – Einführung & +Anmerkungen 
+

+

Diese Anleitung wurde exklusiv zur Verwendung von UnrealIRCd geschrieben. Die +Verwendung des Textes mit anderer Software oder das Anbieten zusammen mit +anderer Software ohne schriftliche Genehmigung des UnrealIRCd Entwicklungsteams +ist streng verboten. Solange es der Benutzung von UnrealIRCd dient, darf dieses +Dokument beliebig kopiert/gedruckt/veröffentlicht, jedoch nicht verändert +werden. – Copyright UnrealIRCd Development Team 2002-2004

+

Bitte lesen Sie diese Anleitung, bevor Sie um Hilfe bitten und schauen Sie +WIRKLICH erst ein mal in die FAQ, da rund 80% der Fragen dort +beantwortet sind. Hilft +dies alles nicht, kann bzgl. Support bei irc.ircsystems.net +(Port 6667) Channel #unreal-support +nach Unterstützung gefragt werden (Wir erwarten UNBEDINGT, dass zuvor Dokumentation +und +FAQ gelesen wurden und wir helfen nur zu UnrealIRCd, nicht zu Services!). Im Falle eines echten Bugs (z.B. einem Crash) bitte Nachricht an + http://bugs.unrealircd.org.

+ +

1.1 – Anmerkungen zu Upgrade/Mixing 3.1.x -> 3.2 
+

+
+

Bei einem Upgrade von Unreal3.1.x auf Unreal3.2 wird als erstes die völlig +veränderte Konfigurations- Datei auffallen. Anfänglich ist dies eine große Umstellung, +aber nachdem man erst einmal umgestellt hat, wird man feststellen, dass die neue +Form viel besser ist!

+

Nicht vergessen, im Teil 3 über neue Features nachzulesen! Auch wenn einige +Features aus früheren Versionen bekannt sind, finden sich hier auch eine Reihe +neuer Features!

+

Am besten verzichtet man auf mischen/linken von 3.1.x mit 3.2, aber wenn das +doch gewollt ist, wird mindestens 3.1.4 benötigt. Jedoch wird Version 3.1.5.1 +unbedingt empfohlen.

+ +

1.2 – Anmerkungen zu +Upgrade von 3.2 Versionen
+

+

Der empfohlene Weg für ein Upgrade ist:
+Linux:
+

    +
  • Altes UnrealIRCd Verzeichnis umbenennen (oder es wird im nächsten Schritt + überschrieben) +
  • Neue UnrealIRCd Version entpacken und "./Config" und "make" + laufen lassen (*NIX). +
  • Alte Konfigurationsdateien in das neue Verzeichnis kopieren (unrealircd.conf, + motd, rules, server.* [SSL certs], network file, etc)
+Windows:
+
    +
  • Alle Konfigurationsdateien in einen temporären Ordner kopieren. +
  • Die Deinstallation des vorhandenen Unreal starten. +
  • Den Installer für den neuen Unreal starten. +
  • Die alten Config Files in den neuen Ordner kopieren. +
+

Bitte auch die RELEASE.NOTES lesen und ggf. jede Changes Datei um zu sehen, +was sich geändert hat. Falls Änderungen (oder Bugs) zwischen Versionen +festgestellt werden, AUF JEDEN FALL ERST IN DIESEN DATEIEN NACHLESEN bevor ein +Bug gemeldet wird!

+ +

2.0 - Installation

+
+ Getestete & unterstützte Betriebs Systeme:
+
    +
  • *NIX Versionen: +
      +
    • Linux 2.2.x +
    • Linux 2.4.x +
    • FreeBSD 4.6-STABLE +
    • FreeBSD 4.5-STABLE +
    • Solaris 2.x +
    +
  • Windows Versionen: +
      +
    • WindowsXP Home +
    • WindowsXP Pro +
    • Windows 2000 Pro +
    • Windows 2000 Server +
    • Windows 2000 Advanced Server +
    • Windows 98 +
    • Windows Me +
    +
+
+ Im Falle, dass Unreal3.2 korrekt unter anderen Betriebssystemen läuft, bitte + Details an docs@unrealircd.com + senden.

Installationsanleitungen
+Linux:
+

    +
  1. gunzip -d Unreal3.2.tar.gz +
  2. tar xvf Unreal3.2.tar +
  3. cd Unreal3.2 +
  4. ./Config +
  5. Die hierbei angezeigten Fragen nach bestem Wissen beantworten. Allgemein ist + es empfehlenswert, bei Unsicherheiten den Default zu belassen. +
  6. make +
  7. Nun die eigene unrealircd.conf und die anderen Konfigurationsdateien + erstellen, siehe Teil 4. +
+

+Windows:
+

    +
  1. Den Unreal Installer starten +
  2. Nun die eigene unrealircd.conf und die anderen Konfigurationsdateien + erstellen, siehe Teil 4. +
+

+

3.0 - Features

+

In diesem Abschnitt werden einiger der größeren besonderen Features +erläutert. Es wird ein genereller Überblick gegeben, in dem sich manchmal auf +die .conf Datei bezogen wird (die Neuanfängern momentan noch unbekannt sein +dürfte).

+

Dieser Abschnitt kann auch übersprungen werden, obwohl es sinnvoll ist ihn +vor oder nach der Installation zu lesen.

+ +

3.1 - Cloaking

+

Das Cloaking ist eine Möglichkeit, den echten Hostnamen vor Usern zu verbergen. +Wenn z.B. der echte Host d5142341.cable.wanadoo.nl lautet, wird er (in +join, part, whois, etc) +als rox-2DCA3201.cable.wanadoo.nl angezeigt. Das ist hilfreich, um sich +davor zu schützen, dass User flooden, da sie die echte Host/IP nicht erkennen +können.

+

Eingestellt wird dies durch den Usermode +x (also: /mode yournick +x), Admins +können +x auch als Default erzwingen oder so einstellen, dass User kein -x +einstellen können.

+

Ein durch Cloaking geschützter Host wird durch  3 "cloak keys" +erzeugt. Diese 3 Keys müssen in der unrealircd.conf gesetzt werden, indem man +drei zufällige Zahlen zwischen 10,000 and 4,294,967,295 einträgt. Wenn jemand +diese drei keys kennt, kann er den geschützten Host erkennen und den realen +Host ermitteln. Aus diesem Grund sollten die Keys geheimgehalten werden. Die +Keys müssen auf allen Servern des Netzwerks identisch sein.

+
+

3.2 - Module

+

UnrealIRCd unterstützt Module, was sehr nützlich +ist, weil:
+ - Module können durch /rehash geladen und entladen werden, wodurch Bugs +behoben werden können, ohne dass ein Neustart erforderlich ist.
+ - Andere Entwickler können weitere Module mit neuen Befehlen oder anderen +Usermodi erstellen.
+ UnrealIRCd selbst enthält nur wenige Module. Durch eine Suche auf www.unrealircd.com + (modules) oder per Google können weitere 3rd party Module gefunden werden.
+Momentan werden Module in Windows nicht unterstützt, in einer späteren +Version kann jedoch damit gerechnet werden.

+

Achtung: Minimal muss das commands Modul geladen sein!

+ +

3.3 - Snomasks

+

Bei Snomasks handelt es sich um Server notice masks, eine spezielle Form +der Usermodi, durch die gesteuert wird, welche Server Nachrichten man empfängt +(in der Regel von Opern benutzt)

+

Sie können durch "/mode yournick +s SNOMASK" eingestellt werden, +z.B.: /mode yournick +s +cF
+
(d.h. +s leitet dem Modus "snomask" ein, danach folgen die +Flags)
+Um aktuelle snomasks zu löschen, gibt man z.B. ein: /mode yournick +s -c
+Will man sämtliche snomask Flags löschen, gibt man ein: /mode yournick -s

+

Momentan unterstützte snomasks Flags sind:
+ c - lokale Connects
+ F - ferne Connects (also auf anderen Servern im Netz - mit Ausnahme der U-lined +Server)
+ f - Flood Meldungen
+k - Kill Meldungen
+ e - 'eyes' Meldungen
+ j - 'junk' Meldungen
+ v - vhost Meldungen
+ G - gline/shun Meldungen
+ n - lokale nick Änderungs-Meldungen
+N - globale nick Änderungs- Meldungen
+ q - deny nick (Q:line) Meldungen zu Abweisung gesperrter +Nicks
+s- Server nachrichten anzeigen [*]
+[*: Diese snomask ist auch für Nicht-IrcOps möglich]
+

+

Es kann eingestellt werden, welche snomasks man automatisch erhält (set::snomask-on-connect) +und welche man als Oper erhält (set::snomask-on-oper, set::oper::snomask)

+ +

3.4 - Aliases

+

Mit Alias können serverseitig bestimmte Befehle eingestellt und dadurch +vereinfacht werden. So ist es z.B. möglich, dass der Befehl "/ns identify +blah" direkt an Nickserv geleitet und übersetzt wird in: "privmsg nickserv identify +blah". Man kann auch recht komplexe Alias Definitionen vornehmen, +die beispielsweise den Befehl /register +an Chanserv weiterleitet, wenn der erste Parameter mit einem # beginnt oder an +Nickserv, wenn der erste Parameter nicht mit einem # beginnt. (Im ersten Fall +soll ein Channel registriert werden, im zweiten Fall ein Nickname)

+

Aliases werden in alias Blocks in der Konfigurationsdatei definiert oder in +einer Include Datei mit den häufigsten Default Aliassen. 

+ +

3.5 - Helpop

+

UnrealIRCd hat ein integriertes Hilfesystem, auf welches mit dem Befehl +"/helpop" zugegriffen werden kann. Über den Help Block in der +Konfigurationsdatei bzw. die beigefügte "help.conf" ist die +anzuzeigende Hilfe völlig frei konfigurierbar. Grundlegende Hilfen sind in der +mitgelieferten help.conf schon vorkonfiguriert.
+Beispielsweise wird nach dem Befehl  /helpop chmodes +ein Überblick über sämtliche Channel Modi von UnrealIRCd angezeigt.
+Zu beachten ist, dass ein ircop (helpop) vor den Suchbegriff ein '?' setzten muss, also statt /helpop ist /helpop ? einzugeben und statt + /helpop chmodes ist /helpop ?chmodes einzugeben etc.. +(Alternative: Vor der Abfrage das +h Flag per "/mode +<nick> -h" entfernen)

+ +

3.6 - Oper Zugriffs-Levels

+

Es gibt verschiedene Oper Levels in UnrealIRCd und jeder Level kann um +zusätzliche Rechte (wie z.B. use /gline) erweitert werden, so dass jedem Oper +genau die benötigten Rechte gegeben werden können..

+

Gesteuert wird dies über die Oper Flags im Oper Block. (siehe oper block +für weitere Informationen.)

+ +

3.7 - Oper Befehle

+

UnrealIRCd hat eine Reihe mächtiger Befehle für Opers, die im Abschnitt User +& Oper Befehlsliste +erklärt werden. Es empfiehl sich, diese nach der Installation zu lesen :).

+ +

3.8 - SSL

+

SSL ist die Abkürzung für "Secure Socket Layer" und ermöglicht +sichere verschlüsselte Verbindungen. Dadurch kann  server<->server Traffic +verschlüsselt werden, aber auch die Verschlüsselung client<->server ist +möglich. Üblicherweise wird SSL als Schutz vor "Sniffing" (Abhören +von Netz Traffic) und zur sicheren Authentifizierung eingesetzt.

+

Um das zu ermöglichen, ist es erforderlich, dass der IRC Server mit SSL +Support kompiliert wird. Um einen SSL Port einzustellen, muss
+"set listen::options::ssl" eingetragen +sein.

+

Zu einem SSL Port kann nicht normal verbunden werden (also nicht den Port 6667 +auf  SSL einstellen!), sondern es wird ein Client oder ein Tunnel +benötigt, der das SSL Protokoll unterstützt.

+

Diese Clients unterstützen SSL: XChat, +irssi, mIRC (6.14 +und höher, weitere zusätzliche +Schritte erforderlich)

+

Für Clients, die kein SSL unterstützen, kann man einen Tunnel wie stunnel + benutzen. Hie ein Beispiel für eine stunnel.conf Beispiel (für stunnel 4.x):

+
+   client = yes
+   [irc]
+   accept = 127.0.0.1:6667
+   connect = irc.myserv.com:6900
+
+Damit wird zu 127.0.0.1 über Port 6667 verbunden, der Datenverkehr wird +verschlüsselt und weitergeleitet an irc.myserv.com + port 6900 (ein SSL Port).

StunTour +für mIRC kann ebenfalls hilfreich sein.

+

Es sollten auch +die Zertifikate überprüft werden, wenn man zu einem Server verbindet und +diesen nicht blind vertrauen (wie im stunnel Beispiel), andernfalls ist man noch +durch "active sniffing" Angriffe (ssl redirects) empfänglich. Das ist allerdings ein anderes +Thema und führt zu weit von der Erklärung zum IRCd weg. Hierzu gibt es eigene +Sites im Internet um das zu lernen. Nicht bei Unreal nachfragen, es hat nichts +mit dem UnrealIRCd zu tun. (mIRC und XChat öffnen ein Popup Fenster und fragen +nach, ob ein Zertifikat erlaubt oder zurückgewiesen wird und das ist gut!)

+

3.9 - IPv6

+

UnrealIRCd unterstützt  IPv6, seit beta15 stabil zu sein scheint.
+Das Betriebssystem muss IPv6 unterstützen und es ist erforderlich, IPv6 +Unterstützung in UnrealIRCD zu aktivieren (die entsprechende Frage bei ./config +mit "yes" beantworten). 

+

Obwohl Microsoft eine experimentelle IPv6 Unterstützung in w2k/XP +implementiert hat, wird diese (noch) nicht von UnrealIRCd unterstützt.

+
+ +

3.10 - Zip Links

+

Zip Links können für  server<->server Verbindungen aktiviert +werden. Dadurch werden die Daten durch Verwendung von zlib komprimiert und es +können so  60-80% Bandbreite eingespart werden. Das ist sinnvoll für +Links mit niedriger Bandbreite oder für Links mit vielen Usern und kann ein +wenig beim Linken helfen, da eine Menge von Daten über jeden User und jeden +Channel zu übertragen sind.

+

Um mit  zip links Support zu kompilieren, muss die zlib Frage mit "Yes" +bei ./config beantwortet werden und dieses mit  link::options::zip +eingetragen sein.

+ +

3.11 - Dynamische DNS/IP Link +Unterstützung

+

UnrealIRCd hat einige (neue) Features, die es ermöglichen, dass User +dynamische IP's verwenden können (wie z.B.: blah.dyndns.org). Sollen zwei Hosts +mit dynamischer DNS gelinkt werden, so ist set link::options::nodnscache +und link::options::nohostcheck einzutragen. +

+ +

3.12 - Anti-Flood Features

+ +

Throttling
+Throttling nennt man die Methode, mit der geregelt wird, wie schnell ein User die +Verbindung trennen und sich erneut zum Server verbinden kann. Im  "set::throttle block" kann eingestellt werden, +X Verbindungen +innerhalb von YY Sekunden von derselben IP zu gestatten.

+ +

Channel Modi
+Weiterhin gibt es einige Channel Modi, welche sehr effektiv gegen Flood sein +können. Einige davon sind:
+K = no /knock (kein Anklopfen, um in Channel eingeladen zu werden), N = no +nickchanges (keine Änderung der Nicknamen möglich), C = no CTCPs +(keine CTCP möglich), M = nur registrierte User können schreiben
+Seit der Beta 18 gibt es zusätzlich noch den erweiterten Modus +f...
+Channel mode f
+
Um nicht Scripts und Bots zum Schutz gegen Channel Flood benutzen zu +müssen, ist der notwendige Schutz nun im IRCd integriert.
+Ein Beispiel für den +f Modus ist: *** Blah sets mode: +f [10j]:15
+Das bedeutet, dass 10 joins innerhalb von 15 Sekunden im Channel gestattet sind. +Wird dieser Wert überschritten, wird der Channel automatisch auf  +i +eingestellt. +

+

Für folgende Flood Arten stehen Aktionen zur Verfügung:
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +

Typ:   

+ +

Name:   

+ +

Default Action:   

mögliche weitere Actions:   

Kommentar

+ +

c   

+ +

 CTCPs   

+ +

 auto +C   

+ +

m, M   

+ +

 

+ +

j   

+ +

 joins   

+ +

 auto +i R   

+ +

 

+ +

 

+ +

k   

+ +

 knocks   

+ +

 auto +K   

+ +

 

(nur für lokale Clients)

+ +

m   

+ +

 messages/notices

+ +

 auto +m   

+ +

M

+ +

 

+ +

n   

+ +

 nickchanges   

+ +

 auto +N   

+ +

 

+ +

 

+ +

t   

+ +

 text   

+ +

 kick   

+ +

b

+ +

in messages/notices wie das alte +f. Kickt oder bannt User.

+ +

Beispiel:
+
+ +*** ChanOp sets mode: +f [20j,50m,7n]:15
+<ChanOp> lalala
+ +*** Evil1 (~fdsdsfddf@Clk-17B4D84B.blah.net) has joined #test
+*** Evil2 (~jcvibhcih@Clk-3472A942.xx.someispcom) has joined #test
+*** Evil3 (~toijhlihs@Clk-38D374A3.aol.com) has joined #test
+*** Evil4 (~eihjifihi@Clk-5387B42F.dfdfd.blablalba.be) has joined #test

+-- snip XX lines --
+ +*** Evil21 (~jiovoihew@Clk-48D826C3.e.something.org) has joined #test
+
+-server1.test.net:#test *** Channel joinflood detected (limit is 20 per 15 seconds), putting +i
+
+*** server1.test.net sets mode: +i
+
+<Evil2> fsdjfdshfdkjfdkjfdsgdskjgsdjgsdsdfsfdujsflkhsfdl
+<Evil12> fsdjfdshfdkjfdkjfdsgdskjgsdjgsdsdfsfdujsflkhsfdl
+<Evil15> fsdjfdshfdkjfdkjfdsgdskjgsdjgsdsdfsfdujsflkhsfdl
+<Evil10> fsdjfdshfdkjfdkjfdsgdskjgsdjgsdsdfsfdujsflkhsfdl
+<Evil8> fsdjfdshfdkjfdkjfdsgdskjgsdjgsdsdfsfdujsflkhsfdl
+-- snip XX lines --
+ +-server1.test.net:#test *** Channel msg/noticeflood detected (limit is 50 per 15 seconds), putting +m
+
+*** server1.test.net sets mode: +m
+*** Evil1 is now known as Hmmm1
+*** Evil2 is now known as Hmmm2
+*** Evil3 is now known as Hmmm3
+*** Evil4 is now known as Hmmm4
+*** Evil5 is now known as Hmmm5
+*** Evil6 is now known as Hmmm6
+*** Evil7 is now known as Hmmm7
+*** Evil8 is now known as Hmmm8
+
+-server1.test.net:#test *** Channel nickflood detected (limit is 7 per 15 seconds), putting +N
+
+*** server1.test.net sets mode: +N
+
+
+Das Ganze kann noch erweitert (damit aber auch komplizierter) werden:
+Anstelle der Default Aktion kann für einige Flood Typen auch eine andere Aktion +gewählt werden, wie z.B.: +f [20j#R,50m#M]:15
+Dieser Channel wird auf +R gestellt, wenn das Join-Limit erreicht ist (>20 Joins in 15 +Sekunden), und wird auf +M gesetzt, wenn das Msg Limit erreicht ist (>50 +Nachrichten in 15 Sekunden).
+
+Zusätzlich gibt es eine  "Lösche nach X Minuten" Einstellung: +f [20j#R5]:15 +setzt den Channel auf +R, wenn das Limit erreicht wird und nach 5 Minuten wieder +auf -R.
+Ein Server kann eine Default Unset-Zeit haben (set::modef-default-unsettime), +die bewirkt, dass eine Angabe von  +f [20j]:15 +automatisch in +f [20j#i10]:15 umgewandelt +wird. Es handelt sich hierbei lediglich um einen Default und man kann weiterhin +auch andere Angaben wie [20j#i2]:15 setzen. +Ebenso kann man den Lösch Channel Modus  auch ganz abschalten, indem man +f [20j#i0]:15 +angibt (also explizit den Wert 0 setzt).
+
+Der alte +f Modus (messageflood per User) ist weiterhin vorhanden, allerdings +als 't'. Der Eintrag +f 10:6 lautet nun +f [10t]:6 +und 
+ +f *20:10
ist jetzt +f [20t#b]:10. +Aktuell wird der ircd alte +f Modi automatisch in die neuen Modi umwandeln. Zu +beachten ist, dass es keine Unsettime Einstellung für 't' Banns gibt.  ([20t#b30]:15 +funktioniert nicht!).
+
+Was der beste +f Modus ist, hängt vom jeweiligen Channel ab. Wie viele User hat +der Channel? Läuft möglicherweise ein Spiel in dem Channel, welches viele +längere Messages erfordert? Handelt es sich um einen Hauptchannel, +möglicherweise mit auto-join? Das, was in dem einen Channel Flood ist, kann in +einem anderen völlig normal sein...
+Es gibt also keinen perfekten Channelmodus +f, der für alle Channels geeignet +ist. Aber für den Anfang seien hier einige Beispiele gegeben, die man auf die +eigenen Bedürfnisse anpassen kann:
+ ++f [30j#i10,40m#m10,7c#C15,10n#N15,30k#K10]:15
+
+30 Joins pro 15 Sekunden, bei Erreichen des Limits wird der Channel für 10 min +auf +i gesetzt
+40 Messages pro 15 Sekunden, bei Erreichen des Limits wird der Channel für 10 +min auf +m gesetzt
+7 CTCP pro 15 Sekunden, bei Erreichen des Limits wird der Channel für 15 min +auf +C gesetzt
+10 Nickänderungen pro 15 Sekunden, bei Erreichen des Limits wird der Channel +für 15 min auf +N gesetzt
+30 Knocks pro 15 Sekunden, bei Erreichen des Limits wird der Channel für 5 min +auf +K gesetzt
+
+In bestimmten größeren Channels (>75 User?) sollte man die Join Grenze +erhöhen (auf z.B.: 50) und auch das Message Limit (z.B. 60 oder 75).
+Speziell die Lösch-Modi erfordern viel Feinabstimmung. Man sollte bedenken, was +passiert, wenn kein Op anwesend ist, der eine Situation regulieren kann. Soll +ein Channel 15 Minuten gesperrt sein (nicht so schön für die User)? Oder nur 5 +Minuten (dann warten Flooder möglicherweise 5 min um dann erneut zu flooden)? +Das hängt auch vom Typ des Floods ab. Es beeinträchtigt User mehr, wenn sie +nicht joinen können (+i) oder nicht schreiben können (+m) als wenn sie keinen +Nick ändern können (+N) oder keine CTCP senden können (+C). Es sollten daher +unterschiedliche Zeiten für das Löschen der Modi angegeben werden..
+

+ +  +

+ +3.13 - Bann Typen

+ +Einfache Bann-Typen und verdeckte Hosts
+
+UnrealIRCd unterstützt die einfache Bann Form: +b +nick!user@host.
+Angenommen, der verdeckte Host von jemandem ist 'rox-ACB17294.isp.com' und es +wird ein Bann auf *!*@rox-ACB17294.isp.com gesetzt, dann wird auch, wenn der +User sich selbst -x setzt (und sein Host z.B. zu 'dial-123.isp.com' wird), der +Bann weiterhin gelten. Banns werden immer sowohl gegen reale Hosts UND verdeckte +Hosts geprüft.
+Auch IP Banns (z.B.: *!*@128.*) sind möglich und werden ebenso immer geprüft.
+
+Banns auf verdeckte IPs erfordern einige Erklärungen:
+Angenommen, ein User hat die IP 1.2.3.4, dann könnte sein verdeckter Host '341C6CEC.8FC6128B.303AEBC6.IP' +sein.
+Wenn man auf '*!*@341C6CEC.8FC6128B.303AEBC6.IP' einen Bann setzt, bannt man '*!*@1.2.3.4' +(einleuchtend...)
+Wenn man auf '*!*@*.8FC6128B.303AEBC6.IP' einen Bann setzt, bannt man '*!*@1.2.3.*'
+Wenn man auf '*!*@*.303AEBC6.IP' einen Bann setzt, bannt man '*!*@1.2.*'
+(Die "Stelle" in der verdeckten IP ist also genau anders herum, wie in +der realen IP)
+Diese Information könnte hilfreich sein, wenn man entscheidet, wie breit eine +Maske sein soll.
+
+Erweiterte bann Typen
+
Erweiterte Bann Typen sind so aufgebaut: '~[!]<type>:<stuff>'. +Gegenwärtig gibt es folgende Typen: + + + + + + + + + + + + + + + + + + + + + +
TypNameErklärung
~qquietUser, auf die dieser Bann gesetzt ist, können joinen, aber + nicht schreiben, solange sie nicht +v oder höher haben. Beispiel: ~q:*!*@blah.blah.com
~cChannelWenn der User in diesem Channel ist, kann er nicht joinen. + Beispiel: ~c:#lamers
~rRealnameWenn der Realname des Users gebannt ist, kann der User nicht + joinen. Beispiel: ~r:*Stupid_bot_script*
+
Zu Beachten: Ein Unterstrich ('_') bedeutet beides, sowohl ein +Leerzeichen (' '), als auch den Unterstrich ('_') selbst. Der Bann aus dem +Beispiel oben würde also  'Stupid bot script v1.4' treffen.
+

+Diese Bann Typen werden auch in der Ausnahme Liste der Channels (channel exception list +[+e]) berücksichtigt.
+Ebenso können über Module andere erweiterte Bann Typen definiert werden. +

+  +

+3.14 - Spamfilter

+
+
+Spamfilter ist ein neues System gegen Spam, Belästigungen, Würmer etc. Es +arbeitet ein wenig ähnlich wie 'badwords', hat aber einige Erweiterungen..
+
+Spamfilter werden durch den  /spamfilter Befehl gesetzt, der die folgende +Syntax hat:
+/spamfilter [add|del|remove|+|-] [type] [action] [tkltime] [reason] [regex]
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
[type]  gibt den Zieltyp an, also welche Art von Nachrichten. Man kann +verschiedene angeben. es gilt: 'c' für Channel Nachrichten, 'p' für private +Nachrichten, 'n' für private Notice, 'N' für Channel Notice, 'P' Part Meldung, 'q' +für Quit Meldung und  'd' für dcc
[action][action] gibt an, welche Aktion erfolgen soll (es kann nur 1 Aktion +angegeben werden)
killKillt den User
tempshunsetzt für die laufende Verbindung einen Shun auf den User + (bei Reconnect ist der Shun aufgehoben
shunSetzt einen Shun auf den Host
klineSetzt eine kline auf den Host
glineSetzt eine gline auf den Host
zlineSetzt eine zline auf den Host
gzlineSetzt eine gzline (globale zline) auf den Host
blockBlockiert lediglich die Nachricht
dccblockmarkiert den User derart, dass er nicht in der Lage ist, + irgend welche DCCs zu senden
viruschanUser wird aus allen Channels entfernt, wird in den unter set::spamfilter::virus-help-channel + eingetragenen Channel geforwardet, alle Befehle außer PONG und ADMIN + werden deaktiviert und msg/notices werden zum Channel aus set::spamfilter::virus-help-channel + geleitet
[tkltime]Die Zeitdauer, die für eine durch den Filter + gesetzte Line gilt. Um den Default zu benutzen oder zum Übergehen (z.B. wenn action = 'block'), + lediglich ein '-' eintragen,
[reason]Der anzuzeigende Grund für Block- oder *lines + Befehle. Man kann hier KEINE Leerzeichen eintragen, aber Unterstriche + ('_') werden zur Laufzeit in Leerzeichen umgesetzt. Ein doppelter + Underscore ('__') erzeugt einen Underscore ('_') in der Ausgabe. Auch hier + ein '-' eintragen, um den Default zu benutzen.
[regex] gibt den Ausdruck oder das 'bad word' an, welches geblockt werden +soll, oder worauf die Aktion erfolgen soll
+

Beispiele: (man beachte die Striche '-', die Default Angaben erzwingen)
+
+ /spamfilter add pc gline - - Come watch me on my webcam

+Wenn der Text "come watch me on my webcam" entweder in einer priv msg +oder in einer Channel Nachricht auftaucht, wird er blockiert und auf den Sender +eine G-Line gesetzt.
+
+ /spamfilter add pc block - - come to irc\..+\..+
+Hier wird auf Werbungen wie "Hi, come to irc.blah.net" +usw. geprüft und die Nachricht wird einfach nur geblockt.
+
+Und ein Beispiel mit time/reason:
+
+/spamfilter add p gline 3h Please_go_to_www.viruscan.xx/nicepage/virus=blah Come watch me on my webcam
+Wenn der Text "come watch me on my webcam" in einer privaten Nachricht +gefunden wird, erfolgt eine G-Line für 3 Stunden mit dem Grund: "Please go to +www.viruscan.xx/nicepage/virus=blah".
+
+Spamfilter die über /spamfilter definiert werden, gelten netzweit. Sie wirken +unabhängig davon, ob der User +G gesetzt hat und nur Oper und U-Lines +(Services) sind von der Filterung ausgenommen.
+
+Spamfilter können auch in der Config Datei eingetragen sein, doch sie sind dann +nur lokal für den Server, auf dem sie eingetragen sind (also nicht netzweit), +gültig. +Die Syntax dieser spamfilter { } Blöcke wird hier +erklärt:
+
+ +set::spamfilter::ban-time ermöglicht die Festlegung einer Default Bann +Dauer für *lines die durch den Spamfilter gesetzt wurden (default: 1 Tag)
+ +set::spamfilter::ban-reason ermöglicht die Festlegung eines Grundes für +die *lines (Default: 'Spam/advertising'). Mehrere Worte sind durch Underscores +("_") und nicht durch Leerzeichen zu trennen.
+set::spamfilter::virus-help-channel ermöglicht die Angabe eines +Channels, in den bei der Action 'viruschan' gejoined wird (Default: #help) +

+ +

3.15 - Andere Features

+

UnrealIRCd hat eine Reihe weiterer Features, die hier nicht alle einzeln +aufgeführt sind. Man wird sie während der Konfiguration selbst herausfinden ;)

+ +

+

4.0 - Konfiguration +der unrealircd.conf + 

+

Beim ersten Mal wird das Erstellen einer guten unrealircd.conf Datei eine +gewisse Zeit in Anspruch nehmen - je nach Vorerfahrung etwa 10 - 60 Minuten. Man +kann versuchen, so rasch wie möglich den ircd zu starten und später zu +verfeinern oder man kann die Haupt Abschnitte Schritt für Schritt erlernen (was +der empfohlene Weg ist ;P). Im Falle auftretender Probleme zuerst die Syntax +überprüfen, diese Anleitung und auch die FAQ bevor man nach Hilfe fragt oder +einen Bug meldet.

+

4.1 Erklärung der +Konfigurationsdatei
+

+

Das neue System benutzt ein Block-basiertes Format. Jeder Eintrag, also jeder +Block, in der neuen Form hat ein spezielles Format, welches etwa so aussieht:

+
+<block-name> <block-value> {
+	<block-directive> <directive-value>;
+};
+
+

<block-name> ist der Typ des Blocks wie z.B. "me", oder +"admin". 
+ <block-value> gibt bei einigen Typen einen notwendigen Wert an, +wie z.B. "/oper login", oder in anderen Fällen einen Untertyp wie +in  "ban user".

+

<block-directive> ist eine speziell auf den Block bezogene +Variable 
+<directive-value> ist der zugewiesene Wert. Falls <directive-value> +Leerzeichen oder Kommentarzeichen enthält, muss die Abgabe von +Anführungszeichen eingeschlossen sein. Soll das Anführungszeichen ebenfalls +Bestandteil des Eintrags sein, muss im das Zeichen "\" vorangestellt +werden, damit es als Anführungszeichen erkannt wird.

+

Innerhalb von <block-directive> können Anweisungen stehen, die dann +mit geschweiften Klammern "{ }" eingeschlossen sind. Einige Blöcke +haben keine Anweisungen sondern lediglich eine <block-value> Angabe, wie +z.B. "include". Ebenso ist zu beachten, dass es kein spezielles +Einstellungsformat gibt. Ein Block kann also in einer einzigen Zeile angegeben +werden oder in mehreren Zeilen. Normalerweise wird das oben angegebene Format +benutzt, welches leicht zu lesen ist und auch in der mitgelieferten +unrealircd.conf benutzt wird.

+

Achtung: Die Konfigurationsdatei ist derzeit "case sensitive", +daher ist "BLOCK-NAME" nicht dasselbe wie "block-name". Es +gibt eine spezielle Notation wie Einträge in der Konfigurationsdatei als +Beschreibung angegeben werden. Spricht man z.B. über "<directive-name>" +im obigen Beispiel, so wird angegeben "<block-name>::<block-directive>" +(also zwei Doppelpunkte dazwischen), und falls die Anweisung einen Unterblock +hat, auf den sich bezogen wird, würde ein weiteres Paar "::" +hinzugefügt, gefolgt vom Namen der Unteranweisung.

+

Bei einer Anweisung ohne Namen wird  "<block-name>::" +gesagt, was einfach nur "<block-value>" bedeutet, oder es +könnte ein Eintrag in +einem Unterblock sein, der keinen Namen hat.

+

Es gibt drei Arten von Kommentaren::

+

# Ein-Zeilen Kommentar
+ // Ein-Zeilen Kommentar
+ /* Kommentar
+    über mehrere
+     Zeilen */
+

+

Es sollte nun klar sein, wie das Block Format der .conf funktioniert und nun +kann begonnen werden, eine eigene unrealircd.conf zu erstellen. Hierzu kann man +auch dei Beispielsdatei oder Teile der Dokumentation verwenden und sich die +entsprechenden Blöcke in die eigene Datei kopieren und editieren. Es ist +empfehlenswert, sich Schritt für Schritt durch alle Blöcke und diese Anleitung +als Referenz durchzuarbeiten.

+

+

4.2 - Me Block + ERFORDERLICH (Früher +bekannt als M:Line)

+

Syntax: +

me {
+name <Name-des-Servers>;
+info <Server-Beschreibung>;
+numeric <Server-Nummer>;
+};
+

Diese Werte sollten klar sein. Der name gibt den Namen des Servers an +(nicht dessen Internetadresse!), + info eine kurze Info Zeile zur Beschreibung des Servers und numeric + bedeutet eine Zahl zur Identifikation des Servers. Hierbei muss es sich um einen +Wert zwischen 1 und 255 handeln, der EINMALIG im Netzwerk ist, es darf also KEIN +Server im Netzwerk denselben numeric Wert haben.

+

Beispiel: +

me {
+	name "irc.foonet.com";
+	info "FooNet Server";
+	numeric 1;
+};
+
+

+

4.3 - Admin Block + ERFORDERLICH (Früher +bekannt als A:Line)

+

Syntax: +

admin {
+	<Text-Zeile>;
+	<Text-Zeile>;
+};
+

Im Admin Block werden die Informationen über die Serveradministration +angegeben. Wenn ein User später eintippt:  +"/admin" (oder "/admin <servername>"), so wird +ihm die hier angegebene Information dargestellt. +Es können beliebig viele Zeilen eingetragen werden, die jede beliebige +Information enthalten können, aber es gilt als Standard, mindestens den +Nicknamen des Admins und dessen email Adresse anzugeben. Weitere Informationen +können Kontakt Infos sein, die man angeben möchte.

+

Beispiel: +

admin {
+	"Bob Smith";
+	"bob";
+	"widely@used.name";
+};
+
+

+

4.4 - Class Block + ERFORDERLICH (Früher +bekannt als Y:Line)

+

Syntax: +

class <name> {
+	pingfreq <Ping-Frequenz>;
+	connfreq <Connect-Frequenz>;
+	maxclients <Maximum-Clients>;
+	sendq <send-queue>;
+	recvq <recv-queue>;
+};
+
+

+

Class Blöcke definieren Verbindungs Klassen in welche Verbindungen +eingeordnet werden (z.B. von Allow Blöcken oder Server von Link Blöcken). Im +Allgemeinen hat man mehrere Class Blöcke (z.B. für Server, +für Clients, für Opers)

+

Verbindungsklassen definieren eine Reihe von Parametern für +Verbindungen, die folgendes umfassen:

+

name ist ein beschreibender Name wie "clients" oder "servers", +dieser Name wird später in anderen Blöcken als Referenz verwendet.

+

pingfreq ist die Anzahl von Sekunden zwischen PINGs von diesem +Server.

+

connfreq wird nur für Server verwendet und ist die Anzahl Sekunden +zwischen zwei Verbindungsversuchen, falls autoconnect eingeschaltet ist.

+

maxclients gibt die maximale Gesamtzahl an Clients und Servern an, +die in dieser Klasse sein können.

+

sendq gibt die Menge an Daten an, die sich in der Sende Queue +befinden dürfen (sehr hoch für Server mit geringer Bandbreite, mittel für Clients)

+

recvq gibt die Menge an Daten an, die sich in der Empfangsqueue +befinden können und wird zur Flood Kontrolle verwendet (das betrifft nur +normale User, es sollte mit Werten zwischen 3000-8000 experimentiert werden, >8000 +ergibt keine Änderung und 8000 ist Default).

+

Beispiele: +

class clients {
+	pingfreq 90;
+	maxclients 500;
+	sendq 100000;
+	recvq 8000;
+};
+
+class servers{
+	pingfreq 90;
+	maxclients 10; /* Maximum an gleichzeitigen möglichen Server Verbindungen */
+	sendq 1000000;
+	connfreq 100;  /* Wieviele Sekunden zwischen jedem Verbindungs Versuch */
+};
+
+
+

4.5 - Allow Block + ERFORDERLICH (Früher +bekannt als I:Line)

+

Syntax: +

allow {
+	ip <user@ip-connection-mask>;
+	hostname <user@host-connection-mask>;
+	class <connection-class>;
+	password <connection-password> { <auth-type>; };
+	maxperip <max-connections-per-ip>;
+	redirect-server <server-to-forward-to>;
+	redirect-port <port-to-forward-to>;
+	options {
+		<option>;
+		<option>;
+		...
+	};
+};
+
+

In Allow Blöcken wird angegeben, wer zum Server connecten darf. Es können +mehrere Allow Blöcke vorhanden sein (was in der Regel auch erforderlich ist).

+

Anmerkungen zu Übereinstimmung (matching)
+Die Zugangskontrolle arbeitet folgendermaßen: Es müssen entweder IPs +übereinstimmen ODER Hosts. Einträge von "hostname *@*;" und "ip +*@1.2.3.4;" stimmen also mit allem überein und gestatten einen +universellen Zugang. Allow Blöcke in der unrealircd.conf werden von unten +nach oben ausgewertet, deswegen müssen spezielle Host/IP Böcke NACH den +allgemeinen *@* Allow Blöcken aufgeführt werden. Soll ein Block +ausschliesslich für eine IP gelten, so ist das Feld "hostname" auf +irgendeinen ungültigen Wert zu setzen, wie z.B. "hostname NOBODY;". +Dadurch wird der Allow Block ausschliesslich auf Übereinstimmung der IP +eingestellt.

+

ip
+Für die IP Maske gilt die Form user@ip, dabei ist user der ident und meist mit +* eingetragen, ip ist eine gültige IP Adresse, die ebenfalls Wildcards +enthalten kann. Einige Beispiele: *@* (jeder von überall her), *@192.168.* (jeder, +dessen IP Adresse mit 192.168 beginnt), etc.

+

host
+Für die host gilt die Form user@hostmask, dabei ist user der ident und meist +mit * eingetragen, hostmask eine Internetadresse. Einige Beispiele: *@* (jeder +von überall her), *@*.wanadoo.fr (nur User von wanadoo.fr).

+

password (optional)
+Die Verbindung erfordert ein Passwort. Zusätzlich kann hier eine +Verschlüsselungs Methode angegeben werden. +

+

maxperip (optional, aber empfohlen)
+Festlegung, wieviele Verbindungen mit derselben IP auf dem Server erlaubt sind (z.B.: maxperip 4;). +

+

redirect-server (optional)
+Wenn die Klasse voll ist, werden User zu diesem Server umgeleitet (wenn der +Client das unterstützt [mIRC 6 unterstützt es]).

+

redirect-port (optional)
+Wenn ein redirect-server angegeben ist, kann hier der Port eingetragen werden. +Ohne Eintrag wird 6667 als Default angenommen.

+

options block (optional)
+Gültige Optionen sind:
+   useip immer nur IP stat Hostnamen anzeigen
+   noident kein ident verwendensondern den vom Client +übergebenen Usernamen
+   ssl Übereinstimmung ist nur gegeben, wenn der User +via SSL verbindet
+   nopasscont Überprüfung fortsetzen, wenn kein +Passwort angegeben wurde (dadurch kann man User, die ein Passwort übermitteln +in eine extra Klasse
+   packen).

Beispiele: +

allow {
+	ip *;
+	hostname *;
+	class clients;
+	maxperip 5;
+};
+
+allow {
+	ip *@*;
+	hostname *@*.passworded.ugly.people;
+	class clients;
+	password "f00Ness";
+	maxperip 1;
+};
+
+

 

+

4.6 - Listen Block + ERFORDERLICH (Früher +bekannt als P:Line)

+

Syntax: +

listen <ip:port> {
+	options {
+		<option>;
+		<option>;
+		...
+	};
+};
+
+

+

Mit diesem Block können spezielle Ports angegeben werden, auf die der IRCD +reagiert. Falls keine Optionen erforderlich sind, kann man diesen Eintrag auch +in der einfachen Form setzen:
+<ip:port>;.

+

ip und port
+Die IP wird normalerweise auf "*" eingestellt, aber man kann auch eine +IP eingeben, um ausschließlich diese an den Port zu binden.. Der Port ist die +Nummer des Ports, der hier eingestellt werden soll. Man kann sowohl einen +Portbereich als auch einen einzelnen Port angeben Beispielsweise bewirkt die +Angabe "6660-6669", dass auf jeden Port von 6660 bis 6669 (einschließlich) +reagiert wird. IPv6 User: siehe nächster Absatz.

+

Info für IPv6 User
+Wenn für den Server IPv6 aktiviert ist, müssen die IPs in eckige Klammern (Brackets, +"[ ]") eingeschlossen sein, wie z.B.: "[::1]:6667" (reagiere +auf Local Host an Port 6667). Verwendet man IPv6 und es soll eine bestimmte IPv4 +Adresse definiert werden, gilt das Format: "::ffff:ipv4ip". Ein +Beispiel: + [::ffff:203.123.67.1]:6667 (reagiert wird auf IP 203.123.67.1 auf Port 6667). +Allerdings kann man auch "*" mit IPv6 verwenden.

+

options block (optional)
+Für den Port können besondere Optionen angegeben werden. Gültige Optionen +sind:
+ + + + + +
clientsonly
Port ist nur für Clients
serversonly
Port ist nur für Server
java
CR javachat support
ssl
SSL encrypted port
+ +

Beispiele:

+
listen *:6601 {
+	options {
+		ssl;
+		clientsonly;
+	};
+};
+
+
+

Oder, wenn es keine Optionen gibt:

+

listen *:8067;
+ listen *:6660-6669;

+

4.7 - Oper Block + EMPFOHLEN (Früher +bekannt als O:Line)

+
oper <name> {
+	from {
+		userhost <hostmask>;
+		userhost <hostmask>;
+	};
+	password <password> { <auth-type>; };
+	class <class-name>;
+	flags <flags>;
+	flags {
+		<flag>;
+		<flag>;
+		...
+	};
+	swhois <whois info>;
+	snomask <snomask>;
+	maxlogins <num>;
+};
+

Mit dem Oper Block können für den Server IRC Operatoren festgelegt werden. 
+Der oper:: Eintrag legt den Login Namen für den /oper Befehl fest. 
+Der Eintrag oper::from::userhost ist eine user@host Maske, die zum User passen +muss. Man kann hier mehr als eine Maske angeben, indem man mehrere +oper::from::userhost Einträge erstellt. 
+Der Eintrag oper::password enthält das Passwort, dass der User angeben muss. +Hier kann zusätzlich eine Verschlüsselungsmethode für dieses Passwort angegeben +werden, gültige +Typen sind dann: crypt, md5, und sha1, ripemd-160. Soll ein einfaches +unverschlüsseltes Passwort verwendet werden, bleibt dieses Feld einfach leer.

+

Zu beachten ist, dass sowohl der Loginname als auch das Passwort case sensitive +sind.

+

Beim Eintrag oper::class muss es sich um eine schon definierte Klasse +handeln, die in der Konfigurationsdatei schon vor dieser Blockdefinition +auftaucht (also ERST Class definieren und erst DANACH oper!).

+

Bei der oper::flags Anweisung gibt es zwei Formate. Falls man die frühere +Form der Operflags vorzieht (mit Buchstaben wie z.B.: "OAa", verwendet +man die  "flags <flags>" Methode. Wenn man dagegen die neue +Form (wie z.B.: "services-admin") verwenden möchte, benutzt man die +"flags { <flag>; + }" Methode.

+

Nachfolgend eine Liste aller Flags in beiden Formaten und ihre Bedeutung.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Altes Flag
Neues Flag
Description
o
local
Macht User zu lokalem Operator
O
global
Macht User zu globalem Operator
C
coadmin
Macht User zum Coadmin
A
admin
Macht User zum Admin
a
services-admin
Macht User zum Services Admin
N
netadmin
Macht User zum Netzwerk Admin
r
can_rehash
Oper kann /rehash durchführen
D
can_die
Oper kann /die durchführen
R
can_restart
Oper kann /restart durchführen
h
helpop
Oper empfängt umode +h (helpop)
w
can_wallops
Oper kann /wallops senden
g
can_globops
Oper kann /globops senden
c
can_localroute
Kann zu Servern lokal verbinden
L
can_globalroute
Kann zu Servern global verbinden
k
can_localkill
Kann /kill auf lokale User ausführen
K
can_globalkill
Kann /kill auf globale User ausführen
b
can_kline
Kann /kline setzen
B
can_unkline
Kann  mit /kline -u@h K-Line löschen
n
can_localnotice
Kann lokale Server Notices senden
G
can_globalnotice
Kann globale Server Notices senden
z
can_zline
Kann /zline setzen
t
can_gkline
Kann /gline, /shun und /spamfilter setzen
Z
can_gzline
Kann /gzline setzen
W
get_umodew
Setzt Umode +W (Anzeige von externem /whois) wenn man (via + /oper) als Operator identifiziert
H
get_host
Setzt Host auf Oper host (Durch das Flag wird die Anzeige + der Funktion unterdrückt)
v
can_override
Kann OperOverride ausführen
qcan_setqKann Usermode +q setzen
dcan_dccdenyKann /dccdny und /undccdny benutzen
+

Bestimmte Flags setzen andere Flags per Default:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
localglobaladmin/coadminservices-adminnetadmin
can_rehashcan_rehashcan_rehashcan_rehashcan_rehash
helpophelpophelpophelpophelpop
can_globopscan_glopopscan_glopopscan_glopopscan_glopops
can_wallopscan_wallopscan_wallopscan_wallopscan_wallops
can_localroutecan_localroutecan_localroutecan_localroutecan_localroute
can_localkillcan_localkillcan_localkillcan_localkillcan_localkill
can_klinecan_klinecan_klinecan_klinecan_kline
can_unklinecan_unklinecan_unklinecan_unklinecan_unkline
can_localnoticecan_localnoticecan_localnoticecan_localnoticecan_localnotice
 can_globalroutecan_globalroutecan_globalroutecan_globalroute
 can_globalkillcan_globalkillcan_globalkillcan_globalkill
 can_globalnoticecan_globalnoticecan_globalnoticecan_globalnotice
  globalglobalglobal
  can_dccdenycan_dccdenycan_dccdeny
   can_setqcan_setq
    admin
    services-admin
+

Mit der oper::swhois Anweisung kann eine zusätzliche Zeile für die whois +Information eines Opers gesetzt werden. [optional]

+

Mit der oper::snomask Anweisung kann eine server notice Mask für einen Oper +voreingestellt werden, so dass man beim oper Befehl bestimmte Flags automatisch +voreingestellt bekommt. Siehe Abschnitt 3.3  +für +Infos über snomasks. [optional] +

Mit der oper::maxlogins Anweisung kann man die +die Anzahl gleichzeitiger Oper Logins einschränken. Wenn hier z.B. der Wert 1 +eingestellt wird, kann immer nur eine Person über diesen Oper Block eingeloggt +sein. [optional] + +

Beispiel: +

oper bobsmith {
+	class clients;
+	from {
+		userhost bob@smithco.com;
+		userhost boblaptop@somedialupisp.com
+	};
+	password "f00";
+	flags {
+		netadmin;
+		can_gkline;
+		can_gzline;
+		can_zline;
+		can_restart;
+		can_die;
+		global;
+	};
+	swhois "Beispiel einer whois Maske";
+	snomask frebWqFv;
+};
+
+Einige Infos zu OperOverride:
+OperOverride bedeutet z.B. joining in einen +ikl Channel und Übergehung von +Banns (trotzdem muss man zuvor für sich selbst ein /invite durchführen), sich +selbst Op in einem Channel zu geben etc.
+Das "can_override" gibt es, um Missbrauch dieser Möglichkeiten +einzuschränken. Per Default kann kein Oper vorhandene Einstellungen übergehen, +solange nicht das Operflag "v" explizit gesetzt ist.
+

4.8 - DRpass Block + EMPFOHLEN (Früher +bekannt als X:Line)

+

Syntax: +

drpass {
+	restart <restart-password> { <auth-type>; };
+	die <die-password> { <auth-type>; };
+};
+

Mit den Blöcken drpass::restart und drpass::die werden die Passworte für +die Befehle "/restart" und "/die" festgelegt. Ebenfalls ist +es möglich, einen Typ der Authentifizierung festzulegen. Gültige Typen sind +hierbei crypt, md5, und sha1, ripemd-160.

+

Beispiel:

+
drpass {
+	restart "I-love-to-restart";
+	die "die-you-stupid";
+};
+
+
+

4.9 - Include +Anweisung

+

Syntax:

+

+ include <file-name>;

+

Mit dieser Anweisung wird eine separate Konfigurationsdatei mit dem Namen +"file-name" geladen. Diese Datei kann jeden Typ von Config Blöcken +enthalten und ihrerseits weitere Include Anweisungen enthalten. Wildcards im +Dateinamen werden unterstützt, wodurch es auch möglich ist, mehrere Dateien +auf einmal zu laden..

+

Beispiel 1: eine network Datei +

include mynetwork.network;
+

Diese Anweisung lädt die Datei "mynetwork.network, wenn man eine eigene +network Datei verwenden möchte. Eigene network Dateien sind eigentlich nicht +mehr erforderlich, da sämtliche Anweisungen auch in der unrealircd.conf stehen +können. Mit einer Include Anweisung kann man das File statt dessen getrennt +halten und laden.

+

Beispiel 2: aliases +

+
include aliases/ircservices.conf
+

Ein weiteres Beispiel für die Anwendung von Alias Blöcken. UnrealIRCd wird +mit einigen Dateien geliefert, die schon die wesentlichen Aliasse für die +meisten Services enthalten.:
+

    +
  • aliases/ircservices.conf (IRCServices, Daylight) +
  • aliases/epona.conf (Epona) +
  • aliases/anope.conf (Anope) +
  • aliases/auspice.conf (Auspice) +
  • aliases/generic.conf (Magick, Sirius, Wrecked) +
  • aliases/cygnus.conf (Cygnus) +
  • aliases/operstats.conf (OperStats) +
  • aliases/genericstats.conf (GeoStats, NeoStats) +
+

+

4.10 - LoadModule +Anweisung ERFORDERLICH

+

Syntax:
+ loadmodule <file-name>;

+

UnrealIRCd unterstützt nun für *NIX Systeme die Verwendung von Modulen. +Dadurch ist es leichter möglich, Erweiterungen zum ircd zu schreiben und man +kann sie sowohl laden als auch entfernen, während der ircd läuft.

+

Folgende Module werden standardmäßig bei Unreal3.2 mitgeliefert:

+

commands.so - Enthält sämtliche  / Befehle (noch nicht wirklich alle, +aber sicher in einer der nächsten Versionen) ERFORDERLICH

+

Es ist sicherzustellen, dass dieses Modul in jedem Fall geladen wird:

+
loadmodule "src/modules/commands.so";
+
+

4.11 - Log Block + + OPTIONAL

+

Syntax: +

log <file-name> {
+	maxsize <max-file-size>;
+	flags {
+		<flag>;
+		<flag>;
+		...
+	};
+};
+
+

Mit dem Log Block kann man verschiedene Logfiles zu den unterschiedlichsten +Zwecken erstellen lassen. 
+log:: ist der Name der Logdatei.
+log::maxsize ist eine optionale Anweisung, um eine Größe +anzugeben, ab der die Datei gelöscht und neu begonnen wird. Die Zahlenangabe +dahinter kann gefolgt sein von  MB für Megabytes, KB für Kilobytes oder +GB  für Gigabytes.
+Bei log::flags wird angegeben, welche Art von Informationen in der +Log Datei gespeichert werden sollen. Angegeben werden kann hier einer oder +mehrere der unten aufgelisteten Flags.

+

Es können auch mehrere Log Blocks definiert sein, um unterschiedliche Dinge +in verschiedenen Dateien zu loggen.

+

Gültige Flags:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Flag

+
+

Bedeutung

+
+

errors

+

selbsterklärend

+
+

+ kills

+

zeichnet /kill Meldungen auf

+
+

+ tkl

+
+

zeichnet Infos auf über glines, shuns, tklines, tzlines, gzlines

+
+

+ connects

+

Zeichnet connects/quits der User auf

+
+

+ server-connects

+
+

Zeichnet connects/squits der Server auf

+
+

+ kline

+

Zeichnet Infos über kline und unkline auf

+
+

+ oper

+

Zeichnet Oper Zugriffe auf (sowohl fehlgeschlagene als + auch erfolgreiche)

+
+sadmin-commands + Zeichnet die Verwendung von /sa* (samode, sajoin etc.) auf +
+chg-commands + Zeichnet die Verwendung von /chg* (chghost, chgname, + chgident, etc.) auf +
+oper-override + Zeichnet die Verwendung von Operoverrides auf +
+

Beispiel:

+
log ircd.log {
+	maxsize 5MB;
+	flags {
+		errors;
+		kills;
+		oper;
+		kline;
+		tkl;
+	};
+};
+
+
+

4.12 - TLD Block + + OPTIONAL (Früher +bekannt als T:Line)

+

Syntax: +

tld {
+	mask <hostmask>;
+	motd <motd-file>;
+	rules <rules-file>;
+	shortmotd <shortmotd-file>;
+	channel <channel-name>;
+	options {
+		ssl;
+	}
+};
+

Mit dem TLD Block eine motd (Messageoftheday), rules und channels für einen +User basierend auf deren Host festlegen. Das ist nützlich, falls man +verschiedene motd's für verschiedene Sprachen verwenden möchte.
+ tld::mask ist eine user@host Maske, die zum Usernamen und seiner +Hostmask passen muss.
+ tld::motd, tld::shortmotd, und tld::rules legen die +jeweiligen Dateien für motd und rules fest, die in Abhängigkeit von der +Hostmask angezeigt werden.
+ tld::channel ist optional, und ermöglicht es, einen Channel +festzulegen, in den der User beim Connect geleitet wird. Wenn dieser Eintrag +existiert, überschreibt er einen Default Auto join.
+ tld::options ermöglicht es, noch weitere notwendige Bedingungen zu +setzen, bislang ist hier aber nur  tld::options::ssl möglich.

+

TLD Einträge werden von unten nach oben abgearbeitet.

+

Beispiel: +

tld {
+	mask *@*.fr;<
+	motd "ircd.motd.fr";
+	rules "ircd.rules.fr";
+};
+

+

4.13 - Ban Nick Block + + OPTIONAL (Früher +bekannt als Q:Line)

+

Syntax: +

ban nick {
+
+	mask <nickname>;
+	reason <grund-für-bann>;
+};
+

Mit dem Ban Nick Block können bestimmte Nicknamen auf dem Server gesperrt +werden. 
+ + ban::mask gestattet Masken mit Wildcards um mehrere Nicknamen zu erfassen
+ban::reason ermöglicht es, einen Grund für den Bann anzugeben. 
+In der Regel werden in TLD Blöcken die Namen der Services angegeben, so dass +kein User diese Namen als seinen Nick wählen kann.

+

Beispiel: +

ban nick {
+	mask "*C*h*a*n*S*e*r*v*";
+	reason "Reserved for Services";
+};
+

+

4.14 - Ban User Block + + OPTIONAL (Früher +bekannt als K:Line)

+

Syntax: +

ban user {
+	mask <hostmask>;
+	reason <reason-for-ban>;
+};
+

Mit diesem Block kann man verbieten, dass sich ein user@host zum Server +verbindet.
+ban::mask ist eine user@host Maske, die gebannt werden soll, wobei +Wildcards möglich sind.
+ ban::reason ist der Grund, der dem gesperrten User beim +Verbindungsversuch angezeigt wird.
+Zu beachten ist, dass dieser Bann nur lokal wirkt und deswegen der betreffende +User ohne weiteres über andere Server zum Netzwerk verbinden kann.

+

Beispiel: +

ban user {
+	mask *tirc@*.saturn.bbn.com;
+	reason "Idiot";
+};
+

+

4.15 - Ban IP Block + + OPTIONAL (Früher +bekannt als Z:Line)

+

Syntax: +

ban ip {
+	mask <ipmask>;
+	reason <reason-for-ban>;
+};
+

Der Ban IP Block verhindert das Verbinden von bestimmten IP Adressen her zum +Server. Das gilt sowohl für Verbindungsversuche von Usern als auch von Servern.
+ban::mask ist eine IP, die Wildcards enthalten kann
+ban::reason ist der Grund, warum der Bann eingetragen wurde.
+Da dieser Bann auch Server betreffen kann, sollte man beim Eintrag von IP +Adressen sehr vorsichtig sein.

+

Beispiel: +

ban ip {
+	mask 192.168.1.*;
+	reason "Nimm eine richtige IP, du Lamer!";
+};
+
+

4.16 - Ban Server Block + + OPTIONAL (Früher +bekannt als  q:Line)

+

Syntax: +

ban server {
+	mask <server-name>;
+	reason <reason-for-ban>;
+};
+

Dieser Block verhindert, dass sich bestimmte Server zum eigenen Server +verbinden können.
+ban::mask beinhaltet eine Maske, die Wildcards gestattet und zu dem Namen +eines Servers passt, der nicht verbinden darf.
+ban::reason Der Grund, warum dieser Bann existiert.

+

Beispiel: +

ban server {
+	mask broken.server.my.network.com;
+	reason "Its broken!";
+};
+

+

4.17 - Ban RealName Block + + OPTIONAL (Früher +bekannt als n:Line)

+

Syntax: +

ban realname {
+	mask <realname-mask>;
+	reason <reason-for-ban>;
+};
+

Der Ban Realname Block ermöglicht es, Clients auf das GECOS (Realname) Feld +zu testen und entsprechend zu bannen, Das kann hilfreich sein, um Floods von +Clones zu vermindern, da Floodbots des öfteren denselben Eintrag im Realnamen +Feld verwenden.
+ ban::mask legt den Realnamen fest, der gebannt werden soll. Die Maske +kann Wildcards enthalten.
+ ban::reason legt den anzuzeigenden Grund für den Bann fest.

+

Beispiel: +

ban realname {
+	mask "Bob*";
+	reason "Bob sucks!";
+};
+
+

4.18 - Ban Version Block + + OPTIONAL (Früher +nicht vorhanden)

+

Syntax: +

ban version {
+	mask <version-mask>;
+	reason <reason-for-ban>;
+	action [kill|tempshun|shun|kline|zline|gline|gzline];
+};
+

Mit dem "ban version block" kann man Clients in Abhängigkeit der +von ihnen verwendeten IRC Software bannen. Dazu wird die Antwort auf die CTCP Versions +Abfrage ausgewertet. Deshalb wird dieser Bann dann nicht wirksam sein, wenn der +entsprechende Client keine CTCP Version sendet. Mit diesem Feature ist es +möglich, bestimmte möglicherweise störende Scripts zu blocken und damit zu +verbieten.
+ban::mask legt die Version des Clients fest, der gebannt werden soll. Die +Maske kann Wildcards enthalten.
+ban::reason legt den Grund fest, der dem User angezeigt wird.
+ban::action kann ebenfalls festgelegt werden. Dabei ist der Default auf +"kill". tempshun setzt ein shun auf die Verbindung des Users +und arbeitet effektiv gegen zombies und/oder Bots mit dynamischer IP, weil sie +unschuldige User nicht beeinträchtigen. shun/kline/zline/gzline setzen +einen Bann auf die IP (*@IPADDR). Die Dauer dieser Banns kann mit 'set::ban-version-tkl-time' +konfiguriert werden und beträgt per Default 1 Tag.

+

Beispiele: +

ban version {
+	mask "*SomeLameScript*";
+	reason "SomeLameScript enthält Backdoors!";
+};
+

ban version {
+        mask "*w00tZombie*";
+        reason "I hate those hundreds of zombies";
+        action zline;
+};

+

4.19 - Ban Exceptions Block + + OPTIONAL (Früher +bekannt als E:Line)

+

Syntax: +

except ban {
+	mask <hostmask>;
+};
+

Mit dem "except ban Block" kann man user@host +Masken angeben, die von den gesetzten Banns der Blöcke zuvor ausgenommen werden +sollen. So etwas kann verwendet werden, falls man z.B. ganze ISP bannen möchte, +aber einzelnen Usern trotzdem die Verbindung erlauben möchte. Dazu bei except::mask +den oder die Hosts eintragen (als user@host Mask) die trotz globalem Bann +connecten dürfen.

+

Beispiel: +

except ban {
+	mask myident@my.isp.com;
+};
+
+

4.20 - TKL Exceptions Block + + OPTIONAL (Früher +nicht vorhanden)

+

Syntax: +

except tkl {
+	mask <hostmask>;
+	type <type>;
+};
+

Mit dem "except tkl Block" kann man user@host +Masken angeben, die von den gesetzten Banns tkl Banns (also G-Lines, Shuns, GZ +Lines) ausgenommen werden sollen. So etwas kann verwendet werden, falls man z.B. +ganze ISP bannen möchte, aber einzelnen Usern trotzdem die Verbindung erlauben +möchte. Dazu bei except::mask den oder die Hosts eintragen (als user@host +Mask) die trotz globalem Bann connecten dürfen. Bei except::type wird +angegeben, welcher Bann Typ ausgenommen werden soll. Gültige Typen sind hier: +gline, gzline, qline, gqline und shun, für Ausnahmen von Glines, Global Zlines, +Qlines, Global Qlines und Shuns.

+

Beispiel: +

except tkl {
+	mask myident@my.isp.com;
+	type gline;
+};
+
+

4.21 - Throttle Exceptions Block + + OPTIONAL (Früher +nicht vorhanden) +

+

Syntax: +

except throttle {
+	mask <ipmask>;
+};
+

Der "except throttle block" gestattet die Angabe einer IP Maske, +für die das + throttling System nicht gelten soll. Dieser Block hat nur eine Auswirkung, +wenn throttling im "set Block" auch aktiviert +ist. Die bei + except::mask angegebene IP Maske wird nicht wegen Throttlings gebannt.

+

Beispiel: +

except throttle {
+	mask 192.168.1.*;
+};
+
+

4.22 - Deny DCC Block + + OPTIONAL (Früher +bekannt als dccdeny.conf) +

+

Syntax: +

deny dcc {
+	filename <file-to-block>;
+	reason <reason-for-ban>;
+};
+

Im "deny dcc Block" können Dateinamen angegeben werden, die nicht +per DCC über den Server versandt werden dürfen. Das kann helfen, die +Verteilung von Viren und Trojanern zu verhindern.

+

Der Parameter deny::filename definiert eine Maske von Dateinamen, +deren Versand blockiert wird, Wildcards sind hier möglich. deny::reason +legt den anzuzeigenden Grund für die Sperrung der Datei fest.

+

Beispiel: +

deny dcc {
+	filename virus.exe;
+	reason "Das ist ein Virus";
+};
+

+

4.23 - Deny Version Block + + OPTIONAL (Früher +bekannt als V:Line)

+

Syntax: +

deny version {
+	mask <server-name>;
+	version <version-number>;
+	flags <compile-flags>;
+};
+

Mit diesem Block ist es möglich, Server aufgrund der Version ihres Unreal +Ircds bzw. des Compilierungszeitpunktes oder bestimmter Optionen vom Linken +auszuschliessen. Das Format des Blockes ist etwas komplex, aber nicht so schwer +zu verstehen.
+deny::mask definiert eine Wildcard Maske, für welchen Server die +Ablhnung gelten soll.
+ deny::version bezeichnet eine Protokoll Nummer, um welche Version es +geht.

+

Ein Beispiel: Für den UnrealIRCD Version 3.0 ist die Versionsnummer 2301, +für 3.1.1/3.1.2 ist es 2302 und für  3.2 ist es 2303. Das erste Zeichen +des Parameters kann eines der folgenden sein: >, <, =, !. Dieses Zeichen +gibt an, wie der IRCD die Version interpretieren soll. Ist also z.B. das erste +Zeichen ein ">" so werden alle Versionen mit einer größeren +Nummer abgelehnt. Handelt es sich um ein "<", so werden alle +kleineren Versionen abgelehnt. Bei einem "=" wird nur die angegebene +Version abgelehnt. Bei einem "!" werden alle Versionen außer der +angegebenen abgelehnt.
+deny::flags ermöglicht die Angabe von Compile Zeit Flag, die der Server +haben oder nicht haben darf. Die Flags müssen direkt nacheinander ohne +Zwischenräume angegeben sein. Wird einem Zeichen ein "!" +vorangestellt, darf der Server dieses Flag nicht haben, steht kein "!" +davor, so muss der Server dieses Flag haben, um vom Linken ausgeschlossen zu +sein.

+
+

4.24 - Deny Link Block + + OPTIONAL (Früher +bekannt als D/d:Line)

+

Syntax: +

deny link {
+	mask <server-name>;
+	rule <crule-expression>;
+	type <type-of-denial>;
+};
+

Mit diesem Block können Regeln angegeben werden, nach denen man Server vom +Linken ausschliessen kann.
+deny::mask definiert eine Wildcard Maske auf den Servernamen, für den +die Regel gelten soll.
+deny::rule ist ein sehr komplexer Ausdruck. Ein crule Ausdruck erlaubt +es, den Link sehr detailliert zu steuern und ist aufgebaut wie eine Programm +Anweisung. Vier Operatoren werden unterstützt:
+    connected(<servermask>) ergibt 'wahr', wenn ein Server +zu dem die angegebene deny::mask passt, verbunden ist.
+    directcon(<servermask>) ergibt 'wahr', wenn ein Server +zu dem die angegebene deny::mask passt, direkt verbunden ist.
+    via(<viamask>,<servermask>) ergibt 'wahr', wenn +ein Server aus deny::mask über einen Server verbunden ist, auf den viamask +passt.
+    directop() ergibt wahr, wenn der Operator über /connect +direkt zu diesem Server verbunden hat. 
+Diese Operatoren können durch Verwendung von && (und) und || (oder) miteinander +kombiniert werden. Durch Verwendung von Klammern um die eizelnen Items sind auch +Gruppierungen möglich. Darüber hinaus kann einem Operator ein "!" +vorangestellt sein, um darauf zu testen, ob der Operator 'falsch' ergibt. Wenn +der gesamte Ausdruck 'wahr' ergibt, wird der Link abgelehnt.
+deny::type kann zwei Werte haben: "auto" (gilt nur für +autoconnects, /connect funktioniert trotzdem), und "all" (gilt für +alle Verbindungsanfragen).

+
+

4.25 - Deny Channel Block + + OPTIONAL (Früher +bekannt als chrestrict.conf) +

+

Syntax: +

deny channel {
+	channel "<channel-mask>";
+	reason <reason-for-ban>;
+	redirect "<channel-name>";
+	warn [on|off];
+};
+

Mit dem "deny channel Block" kann man Usern das joinen bestimmter +Channels verbieten. In deny::channel wird die Maske der Channels +angegeben, die die User nicht betreten dürfen, Wildcards sind erlaubt. In deny::reason +wird der anzuzeigende Grund eingetragen, weswegen der Channel nicht betreten +werden kann.  Darüber hinaus kann in deny::redirect ein Channel +angegeben werden, in den ein User umgeleitet wird, falls er versucht einen +gesperrten Channel zu betreten. Darüber hinaus kann über deny::warn +(falls eingestellt) angegeben werden, dass eine OperNotice (an EYES snomask) +gesendet wird, wenn ein User versucht, einen solchen Channel zu joinen.

+

Beispiel:

+
deny channel {
+	channel "#unrealsucks";
+	reason "Nein, tut es nicht!";
+};
+
+deny channel {
+	channel "#*teen*sex*";
+	reason "You == dead";
+	warn on;
+};
+
+deny channel {
+	channel "#operhelp";
+	reason "Unser Hilfe Channel ist #help und nicht #operhelp";
+	redirect "#help";
+};
+ +
+

4.26 - Allow Channel Block + + OPTIONAL (Früher +nicht vorhanden) +

+

Syntax: +

allow channel {
+	channel "<channel-mask>";
+};
+

Mit dem "allow channel Block" kann man Channels festlegen, in die +User joinen dürfen. In allow::channel wird eine Channel Maske angegeben, +die auch Wildcards enthalten kann und festlegt, in welche Channels die User +joinen dürfen.

+

Beispiele:
+

allow channel {
+	channel "#something";
+};
+
allow channel {
+	channel "#smart_*";
+};
+
+

4.27 - Vhost Block + + OPTIONAL (Früher +bekannt als vhosts.conf) +

+

Syntax: +

vhost {
+	vhost <vhost>;
+	from {
+		userhost <hostmask>;
+		userhost <hostmask>;
+		...
+	};
+	login <login-name>;
+	password <password> { <auth-type>; };
+	swhois "<swhois info>";
+};
+

Der "vhost Block" ermöglicht es, eine "login"/"Passwort" +Kombination festzulegen, die in Verbindung mit dem /vhost Befehl einen Fake +Hostnamen ermöglicht. Der vhost::vhost Parameter kann entweder in der +Form "user@host"  oder einfach als Hos angegeben werden, damit +der User erfolgreich /vhost durchführen kann. vhost::from::userhost +enthält einen "user@host"  der zu dem User passen muß, um einen +vhost zu erhalten. Es kann mehr als eine Host Maske angegeben werden. vhost::login +ist der Login Name, den der User eingeben muss und vhost::password ist +das einzugebende Passwort. Darüber hinaus kann bei vhost::password:: +auch ein Authentifizierungstyp für Verschlüsselung angegeben werden. +Unterstützt werden hier z.Zt.  crypt, md5, und sha1, ripemd-160. vhost::swhois +ermöglicht es, eine Extra Zeile für eine /whois Abfrage einzufügen, genau wie +im Oper Block bei "oper::svhost".

+

Beispiel: +

vhost {
+	vhost my.own.personal.vhost.com;
+	from {
+		userhost my@isp.com;
+		userhost myother@isp.com;
+	};
+	login mynick;
+	password mypassword;
+	swhois "Ich bin wichtig ;)";
+};
+
+

4.28 - Badword Block + + OPTIONAL (Früher +bekannt als badwords.*.conf) +

+

Syntax: +

badword <type> {
+	word <text-to-match>;
+	replace <replace-with>;
+	action <replace|block>;
+};
+

Mit dem Badword Block kann die Liste für User- und Channelmodus +G +bearbeitet werden, um bestimmte "badwords" zu beahandeln. badword:: +legt den Typ fest, wobei gültige Werte hier sind: channel, message und quit. channel +gilt für Channel Modus +G list, message gilt für User Modus +G list, und quit +gilt für die quit Meldung. badword::word kann ein einfaches Wort sein +oder ein Ausdruck, nach dem gesucht werden soll. badword::replace ist ein +Ersetzungstext, der anstelle des gefundenen Badwords angezeigt wird. Wird hier +nichts eingetragen, so wird ein gefundenes Badword durch  <censored> +erstezt. Bei badword::action wird angegeben, was im Falle eines +gefundenen Badwords geschehen soll. Wird hier das Wort "replace" +eingetragen, dann wird das Badword ersetzt. Falls hier "block" +angegeben wird, wird die gesamte Nachricht gar nicht erst angezeigt. Falls +"badword::action" nicht gesetzt ist, wird "replace" als +Default angenommen.

+

Beispiel: +

badword channel {
+	word shit;
+	replace shoot;
+};
+
+

4.29 - ULines Block + + OPTIONAL (Früher +bekannt als U:Line)

+

Syntax: +

ulines {
+	<server-name>;
+	<server-name>;
+	...
+};
+

Mit dem ulines block können bestimmte Server mit speziellen Zwecken +definiert werden. Das sollte ausschließlich für Server wie "services" +oder "stats" benutzt werden und nicht für normale Server. Jeder +Eintrag steht für den Namen des Servers mit einem besonderen Zweck.

+

Beispiel:
+

ulines {
+	services.mynetwork.com;
+	stats.mynetwork.com;
+};
+
+

4.30 - Link Block + + OPTIONAL (Früher +bekannt als C/N/H:Lines) +

+

Syntax: +

link <server-name> {
+	username <usermask>;
+	hostname <ipmask>;
+	bind-ip <ip-to-bind-to>;
+	port <port-to-connect-on>;
+	password-connect <password-to-connect-with>;
+	password-receive <password-to-receive> { <auth-type>; };
+	hub <hub-mask>;
+	leaf <leaf-mask>;
+	leafdepth <depth>;
+	class <class-name>;
+	options {
+		<option>;
+		<option>;
+		...
+	};
+};
+

Dieser Block wird benötigt, um Server zueinander linken zu lassen. Man +sollte sich Zeit nehmen, hierzu alles genau zu lesen, weil das Ganze nicht +unkompliziert ist und hier die häufigsten Fehler gemacht werden.

+

Der erste Eintrag, server-name, ist der Name des zu verbindenden +entfernten Servers, so wie er in dessen Me { } Block definiert wurde (z.B.: +hub.blah.com). +Es darf sich nicht um eine IP handeln und der Eintrag kann sich von "hostname" +unterscheiden.

+

username
+Hier kann zu Zwecken der Authentifizierung über ident ein Eintrag erfolgen, +aber normalerweise wird nur "*" eingestellt. +

+

hostname
+Der Hostname oder die IP des entfernten Servers. Der Eintrag gilt gleichermaßen +für das Verbinden UND die Authentifizierung seitens des eigenen Servers.
+Einige Beispiele:
+ + + + + +
1.2.3.4 normale IP
hub.blah.com Host: nur für ausgehende Verbindung, + kann keine eingehenden Verbindungen akzeptieren, solange nicht "link::options::nohostcheck" + gesetzt ist.
* kann nicht selbst zu anderen Servern verbinden, aber + akzeptiert eingehende Serververbindungen (mit korrektem Passwort) von + überall her.
::ffff:1.2.3.4 für Linking ipv6 zu ipv4.
+

bind-ip (optional)
+Kann genutzt werden, um eine bestimmte IP (z.B.: 192.168.0.1) daran zu binden, +von wo aus verbunden werden soll, wird allerdings so gut wie nie benutzt. +

+

port
+ Port zu dem verbunden wird (auf welchen der entfernte Server reagiert). +

+

password-connect
+Das Passwort, welches zum Verbinden erforderlich ist. Es muss im Klartext +vorliegen und darf nicht verschlüsselt sein. +

+

password-receive
+Das Passwort, welches zur Überprüfung eingehender Verbindungen verwendet wird, +kann auch verschlüsselt sein (gültige Methoden sind  crypt, md5, sha1, ripemd-160). +Der "auth-type" Parameter kann auch frei gelassen werden, um das +passwort im Klartext zu verwenden. Normalerweise ist das Passwort hier dasselbe, +wie bei "password-connect". +

+

hub oder leaf
+Zu einem hub sind mehrere Server verbunden, ein leaf hat immer nur eine +Verbindung. Ein Server ist entweder ein hub oder ein leaf - die beiden Optionen +können nicht kombiniert werden. +

+

hub (optional)
+Der Wert ist eine Maske, auf welche Server dieser hub connecten darf (z.B.: *.my.net). +

+

leaf (optional)
+Der Wert ist eine Maske, dass dieser Server wie ein leaf in Richtung zum eigenen +Server fungiert. +

+

leaf-depth (optional)
+Falls dies angegeben ist, sollte auch "leaf" angegeben sein. Angegeben +wird die Tiefe (Anzahl der hops) die dieser Server darunter haben darf. +

+

class
+Die Klasse, in die der Server kommt, oft ist eine eigene Klasse für Server +definiert. +

+

compression-level (optional)
+Gibt den Kompressions Level (1-9) für diesen Link an. Wird nur verwendet, wenn +auch "link::options::zip" gesetzt ist. +

+

options block
+Eine oder mehrere Optionen für eine Verbindung zu diesem Server. Wird manchmal +nicht benötigt.
+ + + + + + + +
ssl wenn zu einem SSL Port verbunden wird.
autoconnect Server versucht autoconnect, Zeit, wie in + "class::connfreq" spezifiziert wird (wird am besten nur auf + einer Seite aktiviert,wie leaf->hub)
zip wenn komprimierte Verbindungen gewollt sind, muß + auf beiden Seiten mit +set zip compiliert sein.
nodnscache IP für ausgehende Serververbindung nicht im + cache speichern, wird bei oft wechselndem Host benutzt (wie dyndns.org)
nohostcheck den entfernten Host nicht überprüfen (link::hostname), + wird bei oft wechselndem Host benutzt (wie dyndns.org)
quarantine Opers auf diesem Server behalten locop Status bei
+

Beispiel:

+
link hub.mynet.com {
+	username *;
+	hostname 1.2.3.4;
+	bind-ip *;
+	port 7029;
+	hub *;
+	password-connect "LiNk";
+	password-receive "LiNk";
+	class servers;
+	options {
+		autoconnect;
+		ssl;
+		zip;
+	};
+};
+
+

4.31 - Alias Block + + OPTIONAL (Früher +nicht vorhanden) +

+

Syntax [standard alias]:
+

alias <name> {
+	nick <nick-to-forward-to>;
+	type <type-of-alias>;
+};
+

(Hinweis: siehe auch hier , welche Standard +Alias Dateien bei UnrealIRCd mitgeliefert werden.)

+

Mit dem "alias block [standard alias]" kann festgelegt werden, daß +ein Befehl an einen User geleitet wird. So wird z.B. durch /chanserv eine +Nachricht an den "User" chanserv weitergeleitet. alias:: legt +den Namen des Befehls fest, der das Alias wird, z.B. "/chanserv". alias::nick ist +der Nickname, an den weitergeleitet wird. Wenn "alias::" identisch mit +dem Nick ist, an den weitergeleitet wird, kann "alias::nick" +weggelassen werden. alias::type gibt den Typ des Alias an, gültige +Typen sind hier "services" (der User ist auf dem Services Server), +"stats" (der User ist auf dem Stats Server), und "normal" (der +User ist normaler User auf irgendeinem Server). Der "alias block" hat +auch einen weiteren Zweck, der nachfolgend erklärt ist.

+

Syntax [Befehl alias]: +

alias <name> {
+	format <regex-expression> {
+		nick <nick-to-forward-to>;
+		type <type-of-alias>;
+		parameters <parameter-string>;
+	};
+	format <regex-expression> {
+		...
+	};
+	type command;
+};
+

Wird der "alias Block" in diesem Format benutzt, ermöglicht er +eine breitere Anwendungsweise. Beispielsweise kann man einen Alias wie /identify +erstellen. alias:: + ist dasselbe wie oben, der Name des Alias Befehls. alias::format legt +einen regulären Ausdruck fest, der mit dem Text verglichen wird, der als Alias +Befehl gesandt wurde. Es können mehrere "alias::format" angegeben +werden, um unterschiedliche Dinge in Abhängigkeit vom gesandten Text +durchführen zu lassen. alias::format::nick ist der Nickname, an den der +Alias weitergeleitet wird. alias::format::type definiert den Typ des +Alias, zu dem die Nachricht geleitet wird. alias::format::parameters +ist, was als Parameter an den Alias geschickt wird. Um Parameter für einen +Befehl an den Alias anzugeben, wird ein "%" gefolgt von einer Nummer +angegeben. So ist z.B. %1 der erste Parameter, %2 der zweite Parameter usw.  +Man kann auch festlegen, dass ab einem Parameter alle bis zum Ende gelten +sollen, dann gibt man z.B. an:  %1- (das Minuszeichen bedeutet: "alle +weiteren")

+

Beispiele:

+

alias "identify" {
+
             +format "^#" {
+
                          +nick "chanserv";
+
                          +type services;
+
                          +parameters "IDENTIFY %1-";
+
             +};
+
             +format "^[^#]" {
+
                          +nick "nickserv";
+            
type +services;
+            
parameters +"IDENTIFY %1-";
+
             +};
+      type command;
+};

+ +
+

4.32 - Help Block + + OPTIONAL (Früher +nicht vorhanden) +

+

Syntax: +

help <name> {
+	<text-line>;
+	<text-line>;
+	...
+};
+

(zu beachten: Normalerweise genügt es statt dessen die help.conf per Include +einzufügen)

+

Der "help block" ermöglicht es, Einträge zur Verwendung für den +Befehl "/helpop" zu erstellen. help:: + ist der Begriff, der später dem /helpop Befehl als Parameter übergeben wird. +Wird hier kein Begriff angegeben, wird das Feld so verwendet, wie wenn bei +"/helpop" kein weiterer Parameter angegeben ist (also z.B. eine +globale Hilfe Übersicht).  Die Einträge für den "help Block" +sind der Text, der später dem User nach der Eingabe von "/helpop" +angezeigt werden.

+
+

4.33 - Offizielle +Channels Block + OPTIONAL (Früher +nicht vorhanden) +

+

Syntax: +

official-channels {
+"#channel" { topic "The default topic"; };
+};

Offizielle Channels werden in der Channelliste (/list) auch +angezeigt, wenn keine User im Channel sind. Das topic ist optional und +wird nur angezeigt, wenn der Channel 0 User hat.

+

Beispiel:

+

official-channels {
+ "#Help" { topic "The official help channel, if nobody is present type /helpop helpme"; };
+ "#Home";
+ "#Main" { topic "The main channel"; };
+};

+
+

4.34 - Spamfilter Block +OPTIONAL (Früher +nicht vorhanden) +

+Mit dem Spamfilter Block kann man lokale (nicht netzweite) Spam Filter festlegen.
+Siehe auch Features - Spamfilter für +genauere Erläuterungen zu Spam Filtern.
+
+Syntax:
+
+spamfilter {
+        regex <word>;
+        target { <target(s)> };
+        action <action>;
+        reason <reason>;
+        ban-time <time>;
+};
+

+regex ist der Ausdruck, auf den geprüft wird.
+target gibt die Art der Nachrichten an.  Möglich ist hier: channel, +private, private-notice, channel-notice, part, quit, dcc.
+action gibt die Aktion an, die erfolgen soll. Eine Liste möglicher +Aktionen kann hier nachgelesen werden.
+reason ist optional und legt den Grund für die Aktion fest, der dem User +angezeigt wird. Der Text ist in Anführungszeichen anzugeben und sollte - anders +als beim /spamfilter Befehl - keinerlei Undersores "_" zwischen den +Worten enthalten (andernfalls werden die Underscores mit angezeigt).
+ban-time ist optional und legt die Zeit für einen *line Bann fest. Ohne +Angabe gilt der Default von 1 Tag.
+
+Beispiele: +

spamfilter {
+        regex "Come watch me on my webcam";
+        target { private; channel; };
+        action gline;
+        reason "Du hast einen Trojaner, +bitte schaue hier nach: www.antivirus.xx/blah/virus=GrrTrojan";
+        ban-time 6h;
+};
+
+spamfilter {
+        regex "come to irc\..+\..+";
+        target { private; channel; };
+        action gline;
+        reason "Kein Spam erlaubt"
+};
+

+

4.35 - Set Block + ERFORDERLICH (Früher +bekannt als unrealircd.conf/networks file) +

+

Im Set Block findet sich das, was früher in der networks/unrealircd.conf und +der networks Datei von UnrealIRCd angegeben wurde. In Einzel-Server Netzwerken +kann man die Set Anweisungen einfach in die unrealircd.conf eintragen, während +es empfehlenswert ist, in größeren Netzwerken mit mehreren Servern weiterhin +eine "networks" Datei zu verwenden.

+

Wenn nämlich der Server in ein Netzwerk eingebunden ist, werden +wahrscheinlich überall die selben "Set" Einstellungen verwendet, so +dass es mehr Sinn macht, eine "network" Datei zu verwenden, die mit +der include:: Anweisung eingebunden wird. Zum Einbinden von Files siehe +auch Abschnitt 4.9. Weiter unten werden sämtliche +möglichen "Set" Anweisungen im Einzelnen beschrieben.

+

In dieser Dokumentation werden Einstellungen / Anweisungen im <block-name>::<block-directive> +Format angegeben. Dieses Format kann jedoch NICHT so in die +unrealircd.conf eingetragen werden! Die Angaben MÜSSEN in das +nachfolgend beschriebene Format konvertiert werden!  Die Darstellung im +vereinfachten Format dient nur der vereinfachten Beschreibung der möglichen +Einstellungen.

+

Syntax: +

set {
+	<entry> <value>;
+	<entry> <value>;
+	...
+};
+

Im  "Set Block" werden die Optionen für bestimmte Server +Funktionen eingestellt. Jeder Eintrag bewirkt etwas anderes und deshalb wird +jeder einzeln beschrieben. Es gibt viele zu berücksichtigende Anweisungen und +alle nachfolgend beschriebenen Anweisungen können in EINER "Set" +Definition eingetragen werden. Wenn eine Anweisung Optionen ermöglicht oder +erfordert, werden diese genauso in der einzelnen "Set" Anweisung mit +angegeben.

Beispiel: +

set {
+	kine-address my@emailaddress.com;
+	auto-join #welcome;
+	options {
+		hide-ulines;
+	};
+	hosts {
+		local LocalOp.MyNet.com;
+		global globalop.mynet.com;
+	};
+};
+

Sollen die "Set" Anweisungen getrennt erfolgen, also z.B. die +Optionen in einer einzelnen Zeile aufgeführt werden,  ist auch dies +möglich:.
+Beispiel:
+ set { options { hide-ulines; no-stealth; }; };
+

+

set::kline-address <email-address>;
+Eine email Adresse, an die Fragen zur K-Line gesandt werden sollen. Es muss hier +ein Wert angegeben sein.

+

set::modes-on-connect <+modes>;
+Die Modi, die für einen User nach einer Verbindung eingestellt werden.

+

set::snomask-on-connect <+modes>
+Die snomask (Server Notice mask), die für einen User nach einer Verbindung +eingestellt wird.

+

set::modes-on-oper <+modes>;
+Die Modi, die eingestellt werden, wenn User (berechtigterweise) den /oper Befehl +verwenden.

+

set::snomask-on-oper <+modes>;
+Die snomask (Server Notice mask), die eingestellt wird, wenn User +(berechtigterweise) den /oper Befehl verwenden.

+

set::modes-on-join <+modes>;
+Die Modi, die für einen Channel eingestellt werden, wenn er das erste mal +(durch /join) erstellt wird. Nicht alle Modi sind mit diesem Befehl möglich. Die Modi +qaohvbeOAzlLk +können NICHT durch diesen Befehl gesetzt werden.

+

set::restrict-usermodes <modes>
+Die User-Modi, die User wählen können werden auf die hier angegebenen Modi +eingeschränkt. (kein + oder - angeben!).
+Beispielsweise kann man  +G in 'modes-on-connect' setzen und G in 'restrict-usermodes', +wodurch erreicht wird, dass sämtliche User  +G erhalten, aber kein -G +anwenden können.

+

set::restrict-channelmodes <modes>
+Die Channel-Modi, die User wählen können werden auf die hier angegebenen Modi +eingeschränkt. (kein + oder - angeben!).
+Beispielsweise kann man  +G in 'modes-on-join' setzen und G in 'restrict-channelmodes', +wodurch erreicht wird, dass sämtliche (neuen) Channels  +G erhalten, aber kein -G +eingestellt werden kann.

+

set::auto-join <channels>;
+Der oder die Channel(s), in den/die User beim Connect automatisch geforwardet +werden. Soll mehr als ein Channel angegeben werden, so sind diese durch Kommata +zu trennen.
+[Achtung: nicht vergessen, Anführungszeichen zu verwenden, wie: auto-join "#chan";]

+

set::oper-auto-join <channels>;
+Der oder die Channel(s), in den/die User bei /oper automatisch geforwardet +werden. Soll mehr als ein Channel angegeben werden, so sind diese durch Kommata +zu trennen.
+[Achtung: nicht vergessen, Anführungszeichen zu verwenden, wie: auto-join "#chan";]

+

set::anti-spam-quit-message-time <timevalue>;
+Eine Zeitangabe, in der festgelegt wird, wie lange ein User verbunden gewesen +sein muss, bevor eine /quit Meldung angezeigt wird. Das dient der Vermeidung von +Spam. Ein Zeitwert ist ein numerischer String, in dem 'd" Tage bedeutet, +'h' Stunden, 'm' Minuten und 's' Sekunden. Beispiel: 1d2h3m bedeutet 1 Tag, 2 +Stunden und 3 Minuten.

+

set::prefix-quit <text-to-prefix-quit>;
+Hier wird der Text festgelegt, der einer Quit Meldung vorangestellt wird. Ist +hier eine 0 eingetragen, wird der Standard "Quit:" verwendet.

+

set::static-quit <quit message>;
+Hiermit kann eine feste Quit Meldung eingestellt werden, die immer angezeigt +wird, wenn ein Client ausloggt. Das kann die 'anti-spam-quit-message-time' +ebenso überflüssig machen, wie das 'set::prefix-quit'. Fehlermeldungen werden +NICHT durch diese Einstellung ersetzt! (z.B. wird "ping timeout" +weiterhin angezeigt)

+

set::static-part <no|yes|part message>;
+Ein Wert von 'yes' unterdrückt sämtliche Kommentare bei 'part', ein Wert von 'no' +läßt 'part' wie gewohnt arbeiten, jede andere Angabe wird als Kommentar für +'part' fest eingestellt (z.B.: static-part "Bye!"). Da dies auch als +belästigend empfunden werden kann, sollte man dies mit Bedacht wählen.

+

set::who-limit <limit>;
+
Stellt den Maximalwert ein, wie viele Angaben bei einem  /who +angezeigt werden sollen. Ohne Eintrag hier gibt es kein Limit.

+

set::silence-limit <limit>;
+
Stellt den Maximalwert der anzeigbaren SILENCE Einträge ein. Ohne Eintrag ist hier ein Limit von 15 voreingestellt.

+

set::oper-only-stats <stats-list>;
+Definiert eine Liste von Stats-Flags, die nur von Opers benutzt werden können. +Die Flags sind ohne Trennungen (keine Kommata, keine Leerzeichen) anzugeben. +Wird hier nichts angegeben, können alle User sämtliche Flags benutzen, bei +Angabe von '*' keines. Es dürfen nur kurze Operflags angegeben werden.

+

set::oper-only-stats {<stats-flag>; <stats-flag>;};
+Definiert eine Liste von Stats Flags, die nur von Opers benutzt werden können. +In dieser Syntax dürfen nur lange Operflags angegeben wwerden.

+

set::maxchannelsperuser <amount-of-channels>;
+Einstellung, in wie vielen Channels ein User gleichzeitig sein darf.

+

set::channel-command-prefix <command-prefixes>;
+
Stellt das Vorzeichen für Services in "channel Befehlen" ein. +Nachrichten, die mit einem dieser Zeichen beginnen, werden auch noch gesendet, +wenn der Client +d ist. Die Voreinstellung lautet "`".

+

set::allow-userhost-change [never|always|not-on-channels|force-rejoin]
+Einstellung, was passiert, wenn sich der user@host ändert (+x/-x/chghost/chgident/setident/vhost/etc).
+ never schaltet sämtliche Befehle ab, always gestattet so +etwas auch in Channel immer (was zu desyncs von Clients führen kann)  [default], not-on-channels +bedeutet, dass solche Befehle nur erlaubt sind, wenn der User in keinem Channel +ist, force-rejoin bewirkt einen rejoin in sämtlichen Channels sowie +re-op/voice/etc falls notwendig.

+

set::options::hide-ulines;
+Wenn dies eingestellt ist, werden Ulined Server bei  /links von Nicht-Opers +nicht angezeigt.

+

set::options::show-opermotd;
+Falls eingestellt wird die opermotd den Usern angezeigt, die erfolgreich /oper +benutzen.

+

set::options::identd-check;
+Falls eingestellt, wird die Präsenz eines identd Servers geprüft und der +Rückgabewert für den Usernamen verwendet. Wird kein Rückgabewert geliefert +oder existiert der identd Server nicht, wird dem Usernamen ein '~' +vorangestellt. Wird diese Einstellung ausgelassen, erfolgt keine Überprüfung.

+

set::options::show-connect-info;
+Falls eingestellt, werden dem User beim Connect Notices wie "ident request", "hostname lookup", + etc. angezeigt.

+

set::options::dont-resolve;
+Wenn eingestellt, werden die Hosts connectender User nicht aufgelöst. Das kann +nützlich sein, um die Verbindung zu beschleunigen, falls viele User keinen Host +haben.
+Zu beachten ist, dass man keine host basierten allow Blöcke verwenden kann, +wenn dies eingestellt ist.

+

set::options::mkpasswd-for-everyone;
+Stellt ein, dass /mkpasswd von jedem User verwendet werden kann und nicht nur +von Opers. Die Anwendung dieses Befehls durch Nicht-Oper wird an die EYES +snomask gesendet.

+

set::options::allow-part-if-shunned;
+
Erlaubt es Usern, auf die ein /shun gesetzt ist, den /part Befehl zu +benutzen.

+

set::dns::timeout <timevalue>;
+Ein Wert, der angibt, innerhalb welcher Zeit ein DNS Server zu antworten hat, bevor +"timeout" gemeldet wird. Der Zeitwert ist ein numerischer String, in +dem 'd' Tage bedeutet, 'h' Sunden, 'm' Minuten und 's' Sekunden. Beispiel: '1d2h3m' +bedeutet 1 Tag, 2 Stunden, 3 Minuten.

+

set::dns::retries <number-of-retries>;
+Ein Zahlenwert, durch den festgelegt wird, wie oft versucht werden soll, die DNS +aufzulösen, bevor ein Fehler gemeldet wird.

+

set::dns::nameserver <name-of-dns-server>;
+Gibt den Hostnamen des Servers an, der zur DNS Namensauflösungen dient.

+

set::network-name <name-of-network>;
+Gibt den Namen des Netzwerks an, in dem der Server läuft (also den Namen des +irc Netzes!) Dieser Eintrag sollte auf allen Servern im Netzwerk absolut +identisch sein.

+

set::default-server <server-name>;
+Legt den Namen des Servers fest, der den Usern mitteilt, wo sie connecten +sollen, wenn dieser Server voll ist.

+

set::services-server <server-name>;
+Legt den Namen des Servers fest, zu dem die Services Bots verbunden sind. Muß +angegeben sein, der Wert ist auf so etwas wie 'services.yournet.com' zu setzen, +wenn man keine Services hat.

+

set::stats-server <server-name>;
+Stellt den Namen des Servers ein, auf dem die Stats laufen. Die Angabe kann +ausgelassen werden, wenn man keine Stats laufen hat.

+

set::help-channel <network-help-channel>;
+Legt den Namen des Hilfe Channels in diesem Netzwerk fest.

+

set::cloak-keys { <value>; <value>; <value>; };
+Stellt die Verschlüsselungs Keys ein, die für die Erstellung eines +x Host +erforderlich sind. Diese Einstellung muss auf allen Servern identisch sein, +ansonsten linken die Server nicht. Jeder Wert in 'set::cloak-keys::' muß ein +numerischer Wert > 10000 sein. Es müssen exakt 3 Werte angegeben werden.

+

set::hiddenhost-prefix <prefix-value>;
+Legt die ersten Zeichen eines verdeckten Hosts (+x) fest. Üblicherweise nimmt +man hier 3 oder 4 Buchstaben, die den Netzwerksnamen bezeichnen.

+

set::hosts::local <locop-host-name>;
+Legt den Hostnamen fest, der lokalen Operatoren zugewiesen wird, wenn sie +x +setzen.

+

set::hosts::global <globop-host-name>;
+Legt den Hostnamen fest, der globalen Operatoren zugewiesen wird, wenn sie +x +setzen.

+

set::hosts::coadmin <coadmin-host-name>;
+Legt den Hostnamen fest, der co-admins zugewiesen wird, wenn sie +x setzen.

+

set::hosts::admin <admin-host-name>;
+Legt den Hostnamen fest, der Admins zugewiesen wird, wenn sie +x setzen.

+

set::hosts::servicesadmin <servicesadmin-host-name>;
+Legt den Hostnamen fest, der Service-Admins zugewiesen wird, wenn sie +x setzen.

+

set::hosts::netadmin <netadmin-host-name>;
+Legt den Hostnamen fest, der Netadmins zugewiesen wird, wenn sie +x setzen.

+

set::hosts::host-on-oper-up <yes/no>;
+Falls auf 'yes' eingestellt, wird das H/get_host Flag akzeptiert und  +x +wird automatisch bei /oper gesetzt.. Falls 'no', muss sich der User manuell +x +setzen, um einen oper Host zu erhalten.

+

set::ssl::egd <filename>;
+Gibt an, dass EGD (Entropy Gathering Daemon) Unterstützung aktiviert wird. Hat +man OpenSSL 0.9.7 oder höher laufen, dann wird /var/run/egd-pool, /dev/egd-pool, +/etc/egd-pool, und /etc/entropy per Default gesucht und es ist kein Dateiname +erforderlich. Dann legt man einfach 'set::ssl::egd' ohne Wert fest. Verwendet +man ältere Versionen von + OpenSSL, oder soll der EGD socket woanders als in den oben angegebenen Ordnern +liegen, muss man den Dateinamen des UNIX Domain + Socket angeben, an dem  EGD lauscht.

+

set::ssl::certificate <filename>;
+Gibt den Dateinamen an, wo das SSL Zertifikat des Servers liegt.

+

set::ssl::key <filename>;
+Gibt den Dateinamen an, wo der private SSL Key des Servers liegt.

+

set::ssl::trusted-ca-file <filename>;
+Gibt den Dateinamen der Zertifikate der vertrauten CAs an.

+

set::ssl::options::fail-if-no-clientcert;
+Stellt ein, dass Clients ohne Zertifikat nicht connecten können.

+

set::ssl::options::no-self-signed;
+Verbietet Verbindungen von Usern mit selbst erstellten Zertifikaten.

+

set::ssl::options::verify-certificate;
+Stellt ein, dass Unreal  SSL Zertifikate auf Gültigkeit überprüft, bevor +eine Verbindung akzeptiert wird.

+

set::throttle::period <timevalue>
+Wie lange muss ein User zum erneuten Connecten warten, wenn er häufiger, als +unter 'set::throttle::connections' eingestellt, verbunden war.

+

set::throttle::connections <amount>;
+Wie oft muss ein User mit demselben Host verbinden, bevor er temporär gesperrt +wird.

+

set::ident::connect-timeout <amount>;
+Zeitangabe von Sekunden, ab wann aufgegeben wird zum Ident Server zu verbinden (Default: 10s).

+

set::ident::read-timeout <amount>;
+Nach wie viele Sekunden Warten auf einen Reply soll aufgegeben werden (Default: 30s).

+

set::anti-flood::unknown-flood-bantime <timevalue>;
+Gibt an, wie lang ein Flooder mit 'unknown connection' gebannt wird.

+

set::anti-flood::unknown-flood-amount <amount>;
+Legt eine Datenmenge (in KiloBytes) fest, die eine ' unknown connection' senden +muss, damit der User gekillt wird.

+

set::anti-flood::away-flood <count>:<period>
+Schutz vor 'Away Flood': legt fest, wie viele  ('count') /away Änderungen +innderhalb welcher Zeit in Sekunden ('period') erfolgen dürfen.. Das erfordert, +dass in der config.h die Einstellung 'NO_FLOOD_AWAY' aktiviert wurde. Beispiel: away-flood 5:60s; +bedeutet maximal 5 Änderungen innerhalb von 60 Sekunden.

+

set::anti-flood::nick-flood <count>:<period>
+
Nickflood Schutz: Beschränkt Nickänderungen auf  'count' pro 'period' +Sekunden. Beispiel: nick-flood 4:90 bedeutet maximal  4 Nickänderungen in 90 +Sekunden. Default ist  3 per 60.

+

set::default-bantime <time>
+Default Bann Dauer wenn /kline, /gline, /zline, /shun, etc ohne Zeitangabe +gesetzt werden (wie /gline *@some.nasty.isp). Default ist permanent (0). +Beispiel: default-bantime 90d; (90 Tage)

+

set::modef-default-unsettime <value>
+
Für den Channel Modus +f kann eine Default Abschaltzeit festgelegt werden. +Wird z.B. der Wert 10 festgelegt, dann wird +f [5j]:15 in [5j#i10]:15 +umgewandelt. Default ist keine Abschaltzeit.

+

set::modef-max-unsettime <value>
+Maximalwert in Minuten für eine Modus +f Abschaltzeit (z.B. in +f [5j#i<TIME>]:15). +Der Wert kann zwischen 0 und 255 liegen und Default ist 60 (= 1 Stunde).

+

set::ban-version-tkl-time <value>
+Definiert man in 'ban version' eine Aktion, wie zline/gline/etc, dann kann man +hier die Dauer des Banns auf die IP in Sekunden angeben. Default ist 86400 (1 +Tag).

+

set::spamfilter::ban-time <value>
+Genauso, wie oben, aber für  *lines, die durch den Spam Filter gesetzt +wurden.

+

set::spamfilter::ban-reason <reason>
+Anzuzeigender Grund bei  *lines, die durch den Spam Filter gesetzt wurden. +Mehrere Worte sind durch Underscores ("_") und nicht durch Leerzeichen +zu trennen.

+

set::spamfilter::virus-help-channel <channel>
+Festlegung des Channels für die Aktion 'viruschan'  in Spamfilter
+
+set::spamfilter::except <target(s)>
+Diese Ziele werden vom Spamfilter ausgenommen (es wird also keine Aktion +durchgeführt). Es sind einzelne Ziele oder eine durch Kommata getrennte Liste +möglich. Beispiel: except "#help,#spamreport"

+

5 – Additional Files

+ Zusätzlich zu den Konfigurationsdateien hat Unreal einige weitere Dateien, + wie MOTD, OperMOTD, BotMOTD, und Rules. In der nachfolgenden Liste stehen die + Namen dieser dateien und ihr Verwendungszweck.
+ Zu beachten ist, dass die motd Dateien (alle Typen) und die rules Dateien auch + in einem speziellen tld Block angegeben sein können. Dies sind nur die + Dateien, die per Default benutzt werden (und für Anforderungen von + MOTD/RULES). + + + + + + + + + + + + + +
ircd.motdWird angezeigt, wenn der /motd Befehl ausgeführt wird + und wenn ein User connected
ircd.rulesWird angezeigt, wenn der /rules Befehl ausgeführt + wird
oper.motdWird angezeigt, wenn der /opermotd Befehl ausgeführt + wird, oder wenn man  /oper (erfolgreich) benutzt
bot.motdWird angezeigt, wenn der /botmotd Befehl ausgeführt + wird.
+
+

6 – User & Channel Modi

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Mode
Beschreibung
Channel Modi
A
Nur ein Administrator kann joinen
a <nick>
Macht einen User zum Channel Admin
b <nick!user@host> +
Bannt den angegebenen User vom Channel
c
Es können keine ANSI Farbcodes im Channel benutzt werden
C
Es sind keine CTCP's im Channel erlaubt
e <nick!user@host>
Bann Ausnahme – Wenn für jemanden dieser user@host + zutrifft, kann er auch dann in den Channel joinen, wenn auf ihn eine + Ban-Mask passt.
f * <lines:seconds>
Flood Schutz, wenn der '*' angegeben ist, wird ein User + gekickt und gebannt, wenn er <lines:seconds> sendet, ohne '*' wird + man nur gekickt.  Vergleiche auch die erweiterten + Modi.
G
'G rated'. Es werden Worte im Badword Block überprüft und + bei Vorhandensein durch die dort angegebenen Worte esetzt
M
Nur registrierte Nicks(+r) können im Nachrichten in den + Channel senden
h <nick>
Gibt dem User Half-Op Status
i
Es ist eine Einladung (/invite) erforderlich, um diesen + Channel zu joinen
K
Der Befehl /knock ist nicht erlaubt
k <key>
Stellt ein, dass man einen 'key', ein Passwort, benötigt, + um joinen zu können
l <##>
Stellt die maximale Anzahl von Usern im Channel ein
L <Chan>
Wenn so viele User, wie bei +l eingestellt ist, im Channel + sind, werden weitere User in diesen Channel geforwardet
m
Moderierter Channel. Nur +v/o/h User können Nachrichten in + den Channel senden
N
Kein Wechsel des Nicknamens erlaubt
n
Keine Nachrichten von außerhalb des Channels erlaubt
O
Nur IRCOps dürfen joinen
o <nick>
Gibt dem User Channel Op Status
p
Macht einen Channel privat
q
Stellt den Channel Owner ein
Q
Nur U:Lined Server können User kicken
R
Erfordert einen registrierten Usernamen, um joinen zu + können
S
Löscht sämtliche eingehenden Farbcodes
s
Macht den Channel geheim (Wird bei /list nicht mehr + angezeigt)
t
Nur ein Channel Op kann das Topic verändern
+

T

Im Channel sind keine NOTICE's gestattet
u
Auditorium. Bewirkt, dass /names und /who #channel nur + Channel OPs angezeigt wird
V
Der Befehl /invite ist nicht erlaubt
v <nick>
Gibt dem User voice Status. (Darf in +m Channels schreiben)
z
Nur Clients mit einer Secure (SSL) Verbindung dürfen joinen
+

 

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Mode
Beschreibung
User Modi
r
Identifiziert einen Nick als registriert
s
Kann Server Notices lesen
v
Empfängt Rejection Notices, wenn bei DCC File infiziert ist
o
Globaler IRC Operator (wird im Oper Block eingestellt)
O
Lokaler IRC Operator (wird im Oper Block eingestellt)
B
Markiert User als Bot
i
Unsichtbar (wird bei /who nicht angezeigt)
A
Server Admin (wird im Oper Block eingestellt)
x
Verschlüsselt den Hostnamen des Users (vgl. Cloaking)
q
Nur U:Lines können User kicken (Nur Services Admins)
a
Services Admin (wird im Oper Block eingestellt)
g
Kann Globops und Locops lesen und senden
H
IRCop Status verbergen (nur IRCops)
S
Zum Schutz von Services Daemons
t
zeigt, dass der User einen  /vhost benutzt
C
Co-Admin (wird im Oper Block eingestellt)
d
User kann keine Channel PRIVMSGs empfangen
N
Network Administrator (wird im Oper Block eingestellt)
w
Kann wallop Nachrichten empfangen
h
Verfügbar für Hilfe (HelpOp) (wird im Oper Block eingestellt)
G
Filtert Badwords per Konfiguration aus
W
User kann sehen, wenn ein anderer User auf ihn ein  /whois auf ihn + ausführt (nur + IRCops)
p
Zeigt bei einer /whois Antwort nicht die Channels an, in denen man ist
RGestattet es,  PRIVMSGs/NOTICEs nur von registrierten (+r) Usern zu + empfangen
VWebTV User
zZeigt an, dass man einen SSL Client benutzt
TSchützt vor dem Empfang von  CTCPs
+

+

7 – User & Oper +Befehlsliste

+

ACHTUNG: die /helpop Dokumentation ist aktueller, nutze /helpop Befehl +(oder /helpop ?Befehl wenn Du Oper bist), um zusätzliche Informationen +über einen Befehl zu erhalten.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Befehl
Beschreibung
Wer
nick <neuernickname>Ändert Deine Online Identität auf dem Server.  Alle in den + Channels, in denen Du bist, werden über den Wechsel des Nicknamens + benachrichtigt.Alle
whois <nick>Zeigt Informationen über den User, für den der Befehl ausgeführt + wurde an, wie den Name, Channels in denen der User aktuell ist, Hostmask, etc.Alle
who <mask>Mit /who kann man User enstprechend einer Maske + suchen. Maske beinhaltet: nickname, #channel, hostmask (*.attbi.com) Siehe + auch /helpop ?whoAlle
whowas <nick> <maxreplys>Liefert Informationen über User, die nicht mehr zum server verbunden sind. + Das <max replies> Feldt ist optional und schränkt ggf. die Anzahl + der Antworten ein.
Alle
ison <nick1 nick2 nick3 ...>Überprüfung, ob bestimmte User mit angegebenem Nicknamen momentan online sind. + Einfache Rückgabe, wird meist in Scripts verwendetAlle
join <channel1,channel2, ...>Wird verwendet, um einen oder mehrere Channels auf einem Server zu betreten. Alle schon im Channel befindlichen User werden über das betreten informiert. Wird JOIN mit 0 als Parameter verwendet, werden sämtliche Channels verlassen.Alle
cycle <channel1, channel2, ...>Dieser Befehl ist gleichbedeutend mit /part und + nachfolgendem /join. Alle
motd <server>Zeigt die Message Of The Day des IRC Servers an, auf dem man eingeloggt ist. Dabei handelt es sich um eine Information über den Server. + Bei Angabe eines Servers erhält man die Motd des entsprechenden Servers.Alle
rules <server>Zeigt die Regeln des Servers an, mit dem man verbunden ist. + Bei Angabe eines Servers erhält man die Regeln des entsprechenden + Servers.Alle
lusers <server> Liefert Informationen über die Anzahl lokaler und globaler User und die maximal + erreichte Userzahl.Alle
mapZeigt eine (pseudo-)grafische Netzwerks Karte an, aus der die Struktur des IRC Netzwerkes hervorgeht. Das wird hauptsächlich zu Routing Zwecken benötigt.Alle
quit <reason>Beendet die Verbindung zum IRC Server. Wird ein + Grund angegeben, wird dieser in allen Channels angezeigt, die man + verlässtAlle
ping <user>Der Ping Befehl dient dazu, die Anwesenheit eines Users oder Servers auf der anderen Seite der Verbindung zu überprüfen. + Server senden in regelmäßigen Abständen eine PING Nachricht, wenn keine andere Aktivität von der anderen Seite aus eingeht. Wird eine solche Ping Nachricht nicht innerhalb einer festgelegten Zeit beantwortet, wird die Verbindung beendet. Eine Ping Nachricht kann auch bei einer aktiven Verbindung gesendet werden. Zu beachten ist, dass dies unterschiedlich zum CTCP PING Befehl ist.Alle
version <nick>Sendet eine CTCP Versions Anfrage an den User. + Dessen Client sendet, falls entsprechend konfiguriert, die Client Version + als Antwort.Alle
linksListet sämtliche Server auf, die momentan zum Netzwerk verbunden sind.
+ Je nach Einstellung können möglicherweise nur IRCops gelinkte U-lined Servers + /Services sehen.
Alle
Admin <server>Liefert Informationen über die Administration des Servers. + Wird ein Servername mit angegeben, werden die Admin Infos dieses Servers + angezeigt.Alle
userhost <nick>Zeigt den userhost des angegebenen Nicknamen an. Wird üblicherweise von Scripts oder Bots benutzt.Alle
topic <channel> <topic>Setzt oder ändert das Topic des angegebenen Channels oder zeigt das aktuelle Topic an. + Topic <channel> zeigt das aktuelle Topic, Topic + <channel> <topic> ändert das Topic des angegebenen Channels.Alle
invite <nick> <channel>Sendet einem User eine Einladung, einen bestimmten Channel zu betreten. Man muss Oper im Channel sein, um einen User einladen zu können.ChanOp
kick <channel, channel> <user, user> <reason>Entfernt einen User aus einem Channel. Kann nur von Operators oder HalfOps benutzt werden. + Ein Grund kann mit angegeben werden.ChanOp
away <reason>Stellt den eigenen Online Status auf "Away" ein. + Ein Grund kann mit angegeben werden (und wird dann bei /whois auch + angezeigt).Alle
Watch +-<nick> +-<nick>Watch ist ein Benachrichtigungssystem welches schneller und ressourcenschonender arbeitet, als das alte Notify System. Der Server sendet eine Nachricht an einen selbst, wann immer ein User, der in der eigenen "Watch" Liste steht, ein- oder ausloggt.
+ Die Watch Liste wird nicht gespeichert, man muß über den eigenen Client oder ein Script bei jeder neuen Verbindung dafür sorgen, dass sie erneut an den Server übertragen wird. D.h. der Watch Befehl ist dann erneut einzugeben.
Alle
helpop ?<topic> or !<topic>HelpOp ist ein System, um IRC Server Hilfe zu + bekommen. Man gibt etweder ein "/HELPOP + ? <help system topic>" oder "/HELPOP ! <question>". + Das "?" + in /HELPOP bedeutet, dass das Hilfesystem befragt wird und wenn man keine + Antwort erhält, kann man die Frage mit '!' einem Help Operator online + senden. Benutzt man weder ? noch !, bedeutet das, dass zunächst im Hilfe + System gefragt wird und, wenn nichts passendes gefunden wird, ein Forward + an die Help Operators erfolgt.Alle
list <search string> + Ohne Angabe eines Suchstrings wird defaultmäßig die ungefilterte + gesammte Channel Liste angezeigt. Nachfolgend Optionen, die man benutzen + kann und die Ergebnisse, die LIST dann liefert:
/list >zahl + Zeigt Channels mit mehr als  <zahl> Usern an.
/list <zahl + Zeigt Channels mit weniger als <zahl> Usern an.
+ /list C>zahl Channels, die in den letzten <zahl> + Minuten eröffnet wurden.
+ /list C<zahl Channels, die vor mehr als <zahl> + Minuten eröffnet wurden.
+ /list T>zahl Channels, deren topic älter als + <zahl> Minuten ist.
+ /list T<zahl Channels, deren topic neuer als <zahl> + Minuten ist.
+ /list *mask* Channels, deren Name zur angegebenen Maske + passt.
+ /list !*mask* Channels, deren Name nicht zur + angegebenen Maske passt.
Alle
Knock <channel> <message>Ermöglicht es, in einem invite only Channel + "anzuklopfen" und um eine Einladung zu bitten. Funktioniert + nicht in Channels, in denen  +K und/oder +V gesetzt ist. Auch wer + gebannt ist, kann diesen Befehl nicht benutzen.Alle
setnameErmöglicht es Usern, ihren ‘Real Name’ + ohne reconnecting zu ändern.Alle
vhost <login> <password>Verbirgt den eigenen Host durch Anzeige eines + vom Server gelieferten virtuellen Hosts.Alle
mode <chan/nick> <mode>Ermöglicht es, Channel- oder User-Modi zu + setzen oder zu ändern. Siehe auch Liste der Modi in Abschnitt + 6Alle
creditsZeigt eine Dankesliste der Unterstützer von UnrealIRCD + an.Alle
licenseZeigt die GNU Lizenz anAlle
time <server>Zeigt Datum und Zeit des Servers an. Die Angabe + des Servers ermöglicht es, Datum und Zeit aller Server im Netz zu + überprüfen.Alle
botmotd <server>Zeigt die botmotd (Bot Message Of The Day) an. + Bei Angabe eines Servers, wird dessen botmotd angezeigt.Alle
identify <password>Schickt das eigene Passwort an die Services, um + den eigenen Nick zu identifizieren.Alle
identify <channel> <password>Schickt das eigene Passwort an die Services, um + sich als Owner eines Channels zu identifizieren.Alle
dns <option>Liefert Informationen des DNS Cache des Servers. + Da viele Clients einen eingebauten DNS Befehl haben, wird man den Befehl + meist in der Form /raw DNS eingeben müssen, um das + gewünschte Ergebnis zu erhalten. Opers dürfen eine 1 als ersten + Parameter angeben, um eine Liste der Einträge im DNS Cache zu erhalten.Alle
oper <userid> <password>Befehl, um dem User IRCOp Status zu geben, wenn + userid und passwort mit den Angaben im Operblock übereinstimmen.IRCop
wallop <message>Schickt eine Nachricht an alle User mit dem + Usermode +wIRCop
globops <message>Schickt eine Nachricht an alle IRCopsIRCop
chatops <message>Schickt eine Nachricht an alle IRCops mit dem + Usermode +cIRCop
locops <message>Schickt eine Nachricht an alle lokalen IRCopsIRCop
adchat <message>Schickt eine Nachricht an alle AdminsIRCop
nachat <message>Schickt eine Nachricht an alle Net AdminsIRCop
kill <nick> <reason>Disconnected (killt) einen User vom Netzwerk.IRCop
kline [+-]<user@host> [<time to ban> <reason>]Bannt die Host Mask von dem Server, auf dem die + Line gesetzt wurde. Eine kline ist kein globaler Bann. time to ban ist + entweder a) ein Wert in + Sekunden, b) ein Zeitwert, wie '1d' für1 Tag, oder c) '0' für permanent. + Zeit und Grund sind optional, falls nicht angegeben, werden der Werte aus + 'set::default-bantime (Default: 0/permanent) und 'no reason' verwendet. Um + eine kline zu löschen, benutzt man den Befehl /kline -user@host.IRCop
zline [+-]<*@ip> [<time to ban> <reason>]Bannt eine IP Adresse vom lokalen Server, auf dem die + Line gesetzt wurde (nicht global).  Siehe bei kline für genauere + Informationen zur Syntax. Zum Löschen benutzt man /zline -*@ip.IRCop
gline [+-]<user@host>| nick> [<time to ban> + <reason>]
Setzt einen globalen Bann auf alle, auf die die + Maske zutrifft. Siehe bei kline für genauere Informationen zur Syntax. + Zum Löschen benutzt man /gline -user@host.IRCop
shun [+-]<user@host | nick> [<time to shun> + <reason>]
Bewirkt, dass der User KEINERLEI Befehle auf dem + Server mehr ausführen und auch nichts mehr schreiben kann. Shuns sind + global (wie glines) Siehe bei kline für genauere Informationen zur + Syntax. Zum Löschen benutzt man /shun -user@host..IRCop
gzline [+-]<ip> <time to ban> :<reason>Setzt eine globale zline (Bann auf IP). Siehe + bei kline für genauere Informationen zur Syntax. Zum Löschen benutzt man + /gzline -*@ip.IRCop
rehash <server> –<flags>Rehasht die Config Datei des Servers (liest sie + neu ein). Indem man den Server Namen angibt, kann man die Config Datei + dieses Servers remote rehashen. Ebenso sind einige Flags möglich:
+ -all - Rehasht sämtliche Config Dateien
+ -motd - Rehasht all MOTD und RULES Dateien (incl. tld {})
+ -opermotd - Rehasht die OPERMOTD
+ -botmotd - Rehasht die BOTMOTD
+ -garbage - Bewirkt Garbage Collection (Garbage Collection ist eine Methode, + mit der nicht mehr verwendeter Speicher automatisch freigegeben wird). +
IRCop
restart <server> <password>Restartet den IRCD Prozess. Das Passwort ist + erforderlich. Durch Angabe des Servernamens kann man auch einen entfernten + Server restarten.IRCop
die <password>Beendet den IRCD Prozess. Das Passwort ist + erforderlich.IRCop
lag <server>Dieser Befehl ähnelt einem TraceRoute für IRC + server. Nach Eingabe von + /LAG irc.fyremoon.net erhält man Antwort von jedem Server mit Zeit. + Nützlich, um herauszufinden, wo ein Lag ist und optional (TS future/past + travels [??])IRCop
sethost <newhost>Ermöglicht es, den eigenen vHost zu was immer + man möchte, zu ändern.IRCop
setident <newident>Ermöglicht es, die eigene Ident zu was immer + man möchte, zu ändern.IRCop
chghost <nick> <newhost>Ermöglicht es, den Host eines Users, der online + ist, zu ändern.IRCop
chgident <nick> <newident>Ermöglicht es, den Ident eines Users, der + online ist, zu ändern.IRCop
chgname <nick> <newname>Ermöglicht es, den Real Name eines Users, der + online ist, zu ändern.IRCop
squit <sever>Entfernt einen Server aus dem Netzwerk.IRCop
connect <server> <port> <server>Wenn nur ein Server angegeben ist, wird + versucht, den Server, auf dem man aktuell ist, zum zweiten Server zu + verbinden. Sind 2 Server angegeben, wird versucht, die beiden Server + miteinander zu verbinden. Ein Leaf ist an erster Stelle anzugeben, ein Hub + an zweiter Stelle.IRCop
dccdeny <filemask> <reason>Setzt ein  DCCDENY für diese Dateimaske. + Verhindert, dass diese Datei gesendet wird.IRCop
undccdeny <filemask>Löscht ein DCCDENYIRCop
sajoin <nick> <channel>, <channel>Zwingt einen User den/die angegebenen Channels + zu joinen. Steht nur Services und Admins zur Verfügung.IRCop
sapart <nick> <channel>, <channel>Zwingt einen User den/die angegebenen Channels + zu verlassen. Steht nur Services und Admins zur Verfügung.IRCop
samode <channel> <mode>Erlaubt es Netadmins und Service-Admins die Modi + eines Channels zu ändern, ohne dort Channel Op zu sein.IRCop
rping <servermask>Berechnet den Lag zwischen Servern in + Millisekunden.IRCop
trace <servermask>Berechnet den Lag zwischen Servern in + Millisekunden.IRCop
opermotdZeigt die OperMotd Datei des Servers an.IRCop
addmotd :<text>Fügt den gegebenen Text an das Ende der  Motd + an.IRCop
addomotd :<text>Fügt den gegebenen Text an das Ende der  + OperMotd an.IRCop
sdesc <newdescription>Gestattet es Server Admins den Eintrag mit der Beschreibung des + Servers zu ändern, ohne dass ein Restart erforderlich + ist.IRCop
addline <text>Ermöglicht die Ergänzung der Unrealircd.conf + um die in <text> angegebenen Zeilen.IRCop
mkpasswd <password>Verschlüsselt ein Clear Text Passwort zum + Eintrag in die Unrealircd.conf.IRCop
tsctl offset +/- <time>Stellt die IRCD interne Uhr nach (NICHT + benutzen, wenn man nicht genau versteht, was dieser Befehl tut!).IRCop
tsctl time
Liefert einen TS Report.IRCop
tsctl alltimeLiefert einen TS Report ALLER Server.IRCop
tsctl svstime <timestamp>
Stellt die TS Zeit aller Server (NICHT benutzen, + wenn man nicht genau versteht, was dieser Befehl tut!).IRCop
htm <option>Steuert Einstellungen, die sich auf den High Traffic + Modus beziehen. Der High Traffic Modus (HTM) deaktiviert einige User + Befehle, wie /list, /whois, /who etc als Antwort auf extrem hohen Traffic + auf dem Server. Mögliche Optionen sind:
+ -ON Schaltet  HTM für den Server ein
+ -OFF Schaltet  HTM für den Server aus
+ -NOISY Der Server benachrichtigt users/admins bei Wechsel in oder aus HTM + Modus
+ -QUIET Der Server benachrichtigt NIEMANDEN bei HTM Modus Wechsel
+ -TO <value> Stellt die Traffic Rate ein, ab der HTM aktiviert wird.
IRCop
stats <option>
B - banversion - Anzeige der Bann auf Version + Liste
+ b - badword - Anzeige der Badword Liste
+ C - link - Anzeige der Liste geblockter Links
+ d - denylinkauto - Anzeige der Liste geblockter Links (deny link (auto)
+ D - denylinkall - Anzeige der Liste geblockter Links (deny link (all)
+ e - exceptthrottle - Anzeige der Ausnahmen bei throttle block
+ E - exceptban - Anzeige der Ausnahmen von Banns
+ f - spamfilter - Anzeige der Spamfilter Liste
+ F - denydcc - Anzeige der Liste geblockter DCCs
+ G - gline - Anzeige der Liste von glines
+   Erweiterte Flags: [+/-mrs] [mask] [reason] [setby]
+     m Liefert glines, die zur angegebenen Maske + passen/nicht passen
+     r  Liefert glines, die zum angegebenen Grund + passen/nicht passen
+     s  Return glines, die von angegebenem Namen + gesetzt/nicht gesetzt wurden
+ I - allow - Anzeige der Allow block Liste
+ j - officialchans - Liste der offiziellen Channels
+ K - kline - Liste der User/Bann und IP/Ausnahmen
+ l - linkinfo - Anzeige von Link Informationen
+ L - linkinfoall - Anzeige aller Link Informationen
+ M - command - Anzeige, wie oft jeder Befehl benutzt wurde
+ n - banrealname - Liste von Banns auf Realname
+ O - oper - Liste der Opers
+ S - set - Liste der Einträge im set Block
+ s - shun - Liste der Shuns
+   Erweiterte Flags: [+/-mrs] [mask] [reason] [setby]
+     + m Liefert shuns, die zur angegebenen Maske passen/nicht passen
+     + r  Liefert shuns, die zum angegebenen Grund passen/nicht passen
+     + s  Return shuns, die von angegebenem Namen gesetzt/nicht gesetzt wurden
+ P - port - Liste verwendeter Ports
+ q - sqline - Anzeige der SQLINE Liste
+ Q - bannick - Anzeige der Liste gebannter Nicks
+ r - chanrestrict - Anzeige der Liste verbotener Channels
+ R - usage - Zeigt Benutzungs Informationen an
+ t - tld - Zeigt die tld Block Liste an
+ T - traffic - Zeigt Traffic Informationen an
+ u - uptime - Gibt an, wielange der Server schon up ist und wie viele User + max
+ U - uline - Anzeige der ulines (Services)
+ v - denyver - Anzeige der deny version Block Liste
+ V - vhost - Anzeige der vHosts (soweit im vHost Block gesetzt)
+ X - notlink - Liste der Server, die momentan nicht gekinkt sind
+ Y - class - Anzeige Klassen im class Block
+ z - zip - Anzeige der Kompression bei ziplinked Servern (wenn mit ziplink + Unterstützung kompiliert wurde)
+ Z - mem - Anzeige, für welche Zwecke wie viel Speicher benutzt wird
Admin
module
+ Anzeige aller geladenen Module + Alle
close + Dieser befehl disconnected alle unbekannten Verbindungen vom Server. + IRCOp
+ +

+

8 – Sicherheits Tipps/Checkliste

+

Wenn man um die Sicherheit besorgt ist (und das sollte man + sein!), findet man in diesem Abschnitt Hilfe, um einen Überblick über + Risiken und deren Bedeutung zu erhalten. Man kann diesen Abschnitt auch als + "Checkliste" benutzen, um die Netzwerk Konfiguration zu überprüfen + und sie sicherer zu machen. +

Die Liste ist na Popularität/Risiko und Level der am meisten + verwendeten Methoden bei Attacken geordnet:
+

+

8.1 Passworte

+
Wähle gute Oper Passworte, Link Passworte, etc:
+ - benutze eine Mischung aus Groß -und Kleinschreibung und Ziffern ("Whbviwf5") + und/oder etwas Langes ("blaheatsafish", "AlphaBeta555").
+ - VERWENDE KEINE link/oper Passwords für andere Zwecke, wie Mail Account, Bot + Passwort, Foren, etc...
+
+

8.2 Nicht IRCD betreffende Angriffsmöglichkeiten

+
Die Wahrscheinlichkeit, dass ein System durch nicht den IRCd + betreffende Angriffsmöglichkeiten gehackt wird, ist weit größer, als durch + einen Bug im UnrealIRCd. Läßt man z.B.  http, dns, smtp und ftp servers + im selben System laufen, wie den IRCd, so ist das Risiko bedeutend höher. + Wenn man ein Multi-User System benutzt (z.B. man hat eine Shell gemietet), + riskiert mal lokale Exploits und schlechte/unsichere + Berechtigungseinstellungen (siehe nächsten Absatz). Dieses Risiko ist recht + hoch und man sollte deswegen vorsichtig bei der Auswahl des Shell Providers + sein.
+

8.3 Berechtigungen und Config +Datei

+
Grundsätzlich sollte sicher gestellt sein, dass das /home + Verzeichnis und das /UnrealIRCd Verzeichnis korrekte + Berechtigungseinstellungen hat. "Gruppe" und "Andere" + sollten keine Lese Berechtigung haben. Andernfalls könnte ein lokaler User + einfach die Config datei zum Lesen öffnen und die Passworte auslesen.... Ist + man sich dessen unsicher, hier ein Kurz-Befehl um das sicherzustellen: chmod -R go-rwx + /path/to/Unreal3.2 
+ Weiter zu beachten ist: Niemals sollte der UnrealIRCd Ordner innerhalb eines webroot + Verzeichnisses oder anderer öffentlicher Verzeichnisse liegen.
+ Auch bei Backups ist sicher zu stellen, dass hier wieder auf korrekte + Berechtigungseinstellungen geachtet wird. (es passiert häufiger, dass alles + korrekt und sicher eingestellt ist, aber irgendwelche backup.tar.gz + ungeschützt und für jedermann lesbar auf dem Server liegen).
+
+ Möglicherweise möchte man verschlüsselte Passworte verwenden, wo immer das + möglich ist. Das ist kein ausreichender Schutz, sondern nur eine andere Ebene + von Sicherheit. Eine reihe von 1-8 Zeichen Passworten können innerhalb + weniger Stunden/Tage entschlüsselt werden. Außerdem gibt es üblicherweise + weitere interessante Informationen in Config Dateien, die nicht verschlüsselt + sind (wie: link::password-connect).
+

8.4 User bezogene Probleme

+
Wie die meisten dieser Punkte ist auch dies nicht + UnrealIRCd-spezifisch, aber...
+ Man sollte seine Opers und Admins weise auswählen und sich immer an das + Prinzip des schwächsten Glieds einer Kette erinnern. Da hat man gerade + sorgfältigst an alles gedacht, was in dieser Doku beschrieben ist und dann + macht möglicherweise ein Freund, der Oper ist, irgend etwas Dummes. Wie z.B. + die Festplatte via netbios/kazaa/morpheus/.. freigeben, einen Trojaner fangen, + ein unsicheres Passwort nutzen , etc etc.. Unglücklicherweise hat man dadurch + nicht alles unter eigener Konrolle.
+

8.5 SSL/SSH & Sniffing

+
Es sollten unbedingt SSL Verbindungen zwischen Servern und als + Oper benutzt werden, um gegen "Sniffing" geschützt zu sein. + Sniffing ist möglich, wenn ein Angreifer ein System irgendwo zwischen Dir und + dem Server gehackt hat. Der Angreifer kann dann den GESAMTEN Netzwerksverkehr, + der durchläuft, beobachten, und u.a. sämtliche Passworte (Oper Logins, + Nickserv etc.) aufzeichnen. Aus dem selben Grund sollte immer SSH statt Telnet + benutzt werden.
+

8.6 Denial of Service Angriffe (DoS) +[oder: wie schütze ich meinen hub

+
Viele Netzwerke haben erfahren müssen, wie viel "Fun" + ein Flood oder ein (D)DoS Angriff ist, allerdings kann man einige Dinge tun, + um den daraus resultierenden Schaden in Grenzen zu halten. Die meisten Netze + haben einen Hub Server und einige Menschen scheinen zu vergessen, dass es + vergleichsweise einfach ist, einen solchen Hub Server vor Angriffen zu + schützen.
+ Dies soll hier erklärt werden: +
    +
  1. Der Name des Hubs sollte auf einen Host eingestellt sein, der nicht + existiert (z.B.: 'hub.yournet.com'), aber es sollte kein DNS Eintrag für + ihn erfolgen. Dadurch kann ein Angreifer den Host nicht zu einer IP + auflösen und ihn damit nicht flooden. Dann werden Server und Hub einfach + durch Angabe der IP oder einen weiteren nicht öffentlichen Hostnamen + gelinkt.
    + Beispiel 1: link visibiblename.yournet.com { hostname 194.15.123.16; [etc] };.
    + Beispiel2: link visibiblename.yournet.com { hostname thehostnamethatworks.yournet.com; [etc] };.
    + Nebenbei bemerkt muss für das zweite Beispiel sichergestellt sein, dass + der Nameserver keine Zonenübertragungen erlaubt, aber das führt hier zu + weit vom Thema weg.
  2. +
  3. Ein weiterer wichtiger Punkt ist,  '/stats c' und andere Stats + Informationen zu verbergen, andernfalls können Angreifer einfach die Link + Blöcke einsehen. Sinnvollerweise, wenn man so extrem wie der Autor auf + Sicherheit bedacht ist, kann man folgendes eintragen: set { oper-only-stats "*"; }; + und verhindert somit jeglichen Gebrauch von  /stats.
    + Wenn das nicht gewollt ist, ist wenigstens "CdDlLXz" zu + verbergen. Mehr dazu im nächsten Abschnitt.
  4. +
+

Allerdings sind solche Dinge wenig hilfreich, wenn sie später (z.B. nach + einigen Monaten) durchgeführt werden, statt von Anfang an. Sonst könnte die + IP nämlich bereits bekannt sein und auch einigen böswilligen Menschen.

+

Es ist auch zu beachten, dass Angreifer weiterhin die Nicht-Hub Server + flooden können, aber das bedeutet einen höheren Aufwand, als lediglich 1-2 + Schwachpunkte (die Hubs) anzugreifen. Das trägt damit ebenso zum Überleben + von Hubs & Services bei :).

+

8.7 Informationsbeschaffung

+
Der /stats Befehl ist sehr informativ und es ist vielleicht + sinnvoll, dessen Verwendung so weit wie möglich einzuschränken. Man sollte + sich dabei von der frage leiten lassen: "Was möchte ich, dass meine User + es sehen können?". Die meisten großen Netzwerke stellen hier + "nichts" ein, während in anderen Netzwerken den Usern erlaubt + wird,  '/stats g' und '/stats k' zu benutzen.
+ Ich empfehle die Einstellung { oper-only-stats "*"; }; zu setzen und damit + sämtliche /stats Aufrufe für Nicht-Opers zu verbieten. Ist dies nicht + gewollt, sollte mit /stats list die gesamte Liste möglicher /stats + Parameter angezeigt werden und alles geblockt werden, was man nicht + ausdrücklich anzuzeigen erlauben möchte. (im Zweifelsfalle einfach + verbieten.... warum sollten die User das wirklich alles wissen müssen?).
+ Einige Beispiele:
+ - /stats o: zeigt die Nicks der Opers an (in der Schreibweise, wie sie sich + opern!) und deren Hostmasks.
+ - /stats c: zeigt eine Übersicht der Serverlinks und welcher als  'backup', + etc. benutzt wird.
+ - /stats g, /stats k: wird üblicherweise für gebannte Proxies benutzt.... + und zeigt daher einem Angreifer, welche Proxies er nutzen kann.
+ - /stats E, /stats e: ziemlich sensitive Information, besonders, wenn ein + Angreifer diese Adresse benutzen kann
+ - /stats i, /stats y: könnte einem Angreifer helfen, Hosts zu finden, welche + viele Verbindungen gestatten.
+ - /stats P: hilft dem Angreifer, serveronly Ports zu finden
+ etc etc...
+
+ Das ganze "Verbergen von Informationen" ist natürlich keine + "echte" Sicherheit. Allerdings macht es Angriffe schwieriger und + erhöht den Aufwand für einen Angriff oder hack.
+

8.8 Schutz gegen Expolits

+
Es gibt Kernel Patches, die es Stack- oder Heap-basierenden + Expolits erschweren, zu arbeiten. Allerdings sollte man nicht nur primär + hierauf achten, es gibt weit größere Risiken mit Expolits, die andere + Punkte, als den Kernel angreifen.... aus verschiedenen Gründen.
+
+ Eines allerdings sollte man tun: IMMER DIE NEUESTE VERSION BENUTZEN. Wenn man + sich in die Unreal-notify mailinglist einträgt, erhält man die Ankündigung + über neue Versionen (unreal-notify ist nur für Ankündigungen und man + erhält nur alle X Monate 1 Mail). Üblicherweise gibt es neue Releases, wenn + es (bedeutende) Sicherheits Fixes gibt..
+

8.9 Zusammenfassung

+
Wie jetzt hoffentlich einleuchtend erklärt wurde, kann man + niemals 100% sicher sein. Anwender und Entwickler haben jedes Sicherheitsloch + zu finden und zu fixen, währen der Angreifer lediglich 1 Server mit 1 + Sicherheitsloch finden muss. Alles, was hier erklärt wurde, hilft jedoch, die + Risiken zu minimieren. Man sollte sich die Zeit nehmen, das netzwerk sicher zu + machen und die eigenen Opers zum Sicherheitsbewußtsein anzuleiten. Viele + Menschen kümmern sich so lange nicht um Sicherheit, bis sie gehackt wurden. + Man sollte versuchen, dies zu vermeiden :).
+

 

+

9 – Frequently Asked Questions (FAQ)

+

Die FAQ kann man online hier + lesen .

+

+ + diff --git a/doc/unreal32docs.html b/doc/unreal32docs.html index 04fc263e6..684c73268 100644 --- a/doc/unreal32docs.html +++ b/doc/unreal32docs.html @@ -16,14 +16,18 @@ + + +English | German

UnrealIRCd
http://www.unrealircd.com
Version: 3.2
- Current Version: 3.2 RC2
- Last doc update: 2004-03-07
- Head Coders: Stskeeps / codemastr / Syzop / Luke / McSkaf
- Contributors: Zogg / NiQuiL / assyrian / chasm / DrBin / llthangel / Griever / nighthawk
+ Current Version: 3.2
+ Last doc update: 2004-04-24 +
+ Head Coders: Stskeeps / codemastr / Syzop / Luke
+ Contributors: McSkaf / Zogg / NiQuiL / assyrian / chasm / DrBin / llthangel / Griever / nighthawk
Documentation: CKnight^ / Syzop

Due to the increasing complexity of UnrealIRCd3.2 We have switched to an easier to navigate, more inclusive documentation set. To view this documentation you @@ -113,7 +117,7 @@ ---8.9. Summary
9. Frequently Asked Questions (FAQ)

-

1.0 –Introduction & Notes
+

1.0 – Introduction & Notes

This document was written for exclusive use with UnrealIRCd. Use of this document with another software package, or distribution of this document with @@ -184,8 +188,8 @@ Windows:

Installation Instructions
Linux:

    -
  1. gunzip -d Unreal3.2-RC2.tar.gz -
  2. tar xvf Unreal3.2-RC2.tar +
  3. gunzip -d Unreal3.2.tar.gz +
  4. tar xvf Unreal3.2.tar
  5. cd Unreal3.2
  6. ./Config
  7. Answer these questions to the best of your knowledge. Generally if your not @@ -219,12 +223,14 @@ Windows:
    have to keep them secret. _The cloak keys must be the same on all servers on the network_.

3.2 - Modules

-

UnrealIRCd supports modules (except under windows) which is nice because:
+

UnrealIRCd supports modules which is nice because:
- You can load/reload/unload them while the ircd is running (by /rehash). This allows some bugs to be fixed or new features to be added without requiring a restart.
- Other people can create (3rd party) modules with new commands, usermodes and even channelmodes.
UnrealIRCd only comes with a few modules, take a look at www.unrealircd.com -> modules - or use google to find 3rd party modules.

-

Note that you need to load at least the commands module!

+ or use google to find 3rd party modules.
+NOTE: currently modules are not supported on windows, you can however expect this is in a nearby release

+

You need to load at least the commands module or else the ircd won't load!

+

3.3 - Snomasks

Snomasks are server notice masks, it's a special type of usermode that controls which @@ -273,7 +279,7 @@ Windows:

This is controlled by the oper flags in the oper block, see the oper block for more information.

3.7 - Oper commands

-

UnrealIRCd has a lot of powerful oper commands which are explained in section 6, +

UnrealIRCd has a lot of powerful oper commands which are explained in User & Oper Commands, you probably want to read those after installing :).

3.8 - SSL

@@ -286,7 +292,7 @@ Windows:

Clients that support SSL: XChat, irssi, mIRC (6.14 and up, - also requires some additional steps)

For clients which do not support SSL you can use a tunnel like stunnel, here's a stunnel.conf example (for stunnel 4.x):

@@ -466,7 +472,7 @@ Modules can also add other extended ban types.
[tkltime] The duration of the *line added by the filter, use '-' to use the default or to skip (eg: if action = 'block') [reason] Block or *line reason.. you CANNOT use spaces in this, but underscores ('_') will be translated -into spaces at runtime. Again, use '-' to use the default. +into spaces at runtime. And double underscore ('__') gets an underscore ('_'). Again, use '-' to use the default reason. [regex] this is the actual regex or 'bad word' where we should block on and perform the action at
@@ -1420,8 +1426,8 @@ except tkl { still want specific users to be able to connect. The except::mask directive specifies the user@host mask of the client who will be allowed to connect. The except::type specifies which type of ban this should override. Valid types are - gline, gzline, and shun, which make an exception from Glines, Global Zlines, and - shuns.

+ gline, gzline, qline, gqline, and shun, which make an exception from Glines, + Global Zlines, Qlines, Global Qlines, and shuns.

Example:

 except tkl {
@@ -2713,35 +2719,37 @@ to get more information on a command.

IRCop - kline +-<hostmask> <time to ban> <reason> - Bans the hostmask from the server it is issued on. It is not a global - ban. Time to ban is in seconds, or you can use 1d for 1 days. If the hostmask is prefixed with a -, the kline is removed + kline [+|-]<user@host | nick> [<time to ban> <reason>] + Bans the hostmask from the server it is issued on. A kline is not a global ban.
+ time to ban is either: a) a value in seconds, b) a time value, like '1d' is 1 day or c) '0' for permanent. + Time and reason are optional, if unspecified set::default-bantime (default: 0/permanent) and 'no reason' are used.
+ To remove a kline use /kline -user@host IRCop - zline +-<ip> <time to ban> <reason> - Bans an IP Address from the local server it is issued on. Time to ban is in seconds, or you can use 1d for 1 days. If the ip is prefixed with a - then the zline is removed.
+ zline [+|-]<*@ip> [<time to ban> <reason>] + Bans an IP Address from the local server it is issued on (not global). See kline for more syntax info. + Use /zline -*@ip to remove.
IRCop - gline +-<user@host> <time to ban> :<reason>
- Adds a global ban to anyone that matches. Time to ban is in seconds, or - you can use 1d for 1 days. To remove a gline, put a –user@host
+ gline [+|-]<user@host | nick> [<time to ban> <reason>]
+ Adds a global ban to anyone that matches. See kline for more syntax info. + Use /gline -user@host to remove.
IRCop - shun +-<user@host> <time to shun> :<reason>
+ shun [+|-]<user@host | nick> [<time to shun> <reason>]
Prevents a user from executing ANY commands and prevents them from speaking. - Shuns are global (like glines). Time to shun is in seconds, or you can use 1d for 1 days. - To remove a shun, put a –user@host. Setting time to 0 makes it permanent. + Shuns are global (like glines). See kline for more syntax info. + Use /shun -user@host to remove a shun.
IRCop - gzline +-<ip> <time to ban> :<reason>
- Adds a global zline. Time to ban is in seconds, or you can use 1d for 1 - days. To remove a gzline, put a –user@host. Setting time to 0 makes - it permanent.
+ gzline [+|-]<ip> <time to ban> :<reason>
+ Adds a global zline. See kline for more syntax info. + Use /gzline -*@ip to remove a gzline.
IRCop @@ -2808,7 +2816,7 @@ to get more information on a command.

connect <server> <port> <server> If only one server is given, it will attempt to connect the server you are ON to the given server. If 2 servers are given, it will attempt to connect - the 2 servers together. Put the hub server as the first, and the leaf server + the 2 servers together. Put the leaf server as the first, and the hub server as the second.
IRCop diff --git a/extras/tre.tar.gz b/extras/tre.tar.gz index 68dadbc5e..8cfe89737 100644 Binary files a/extras/tre.tar.gz and b/extras/tre.tar.gz differ diff --git a/help.conf b/help.conf index bcdd4d1b9..bd75b2b5e 100644 --- a/help.conf +++ b/help.conf @@ -51,7 +51,7 @@ help Opercmds { " OPER WALLOPS GLOBOPS CHATOPS LOCOPS DNS"; " ADCHAT NACHAT KILL KLINE ZLINE SPAMFILTER"; " GLINE SHUN GZLINE HTM TSCTL TEMPSHUN"; - " AKILL RAKILL REHASH RESTART DIE"; + " REHASH RESTART DIE"; " LAG SETHOST SETIDENT CHGHOST CHGIDENT"; " CHGNAME SQUIT CONNECT DCCDENY UNDCCDENY"; " SAJOIN SAPART SAMODE RPING TRACE"; @@ -112,24 +112,27 @@ help Umodes { }; help Snomasks { - " This section lists all of the snomasks available."; - " A snomask is used with usermode +s. They are an additional parameter."; - " For example, to set snomask +f you'd do:"; - " /MODE mynick +s +f"; - " You can remove individual snomasks or set -s to remove them all"; - " -"; + " Snomask stands for 'Service NOtice MASK', it (mainly) controls which"; + " server notices you will receive."; + " Usage: /MODE nick +s "; + " Ex: /MODE blah +s +cF-j"; + " The parameter specifies which snomasks you want (or don't want)." + " You can also remove all snomasks by simply doing /MODE nick -s."; + "-"; + " Below is a list of possible snomasks:"; " ==-------------------------oOo-----------------------=="; - " c = See's all Connects/Disconnects on local server"; - " e = Can listen to Server Messages sent to +e users (Eyes)"; - " f = Listen to Flood Alerts from server"; - " F = Lets you receive Far and Local connect notices (except from U-lines)"; - " G = Lets you see TKL (G:line,Shun) noties"; - " j = See's Misc. Messages generated by the server"; - " k = See's all the /KILL's which were executed"; - " n = Nick change notices"; - " N = Far nick change notices"; - " q = Lets you see notices when a user is rejected because of a Q:line"; - " v = Lets you receive notice of /VHOST usages"; + " c = View connects/disconnects on local server"; + " e = View 'Eyes' server messages (OperOverride, /CHG* and /SET* usage, ..)"; + " f = View flood alerts"; + " F = View connects/disconnects on remote servers (except U-lines)"; + " G = View TKL notices (Gline, GZline, Shun, etc)"; + " j = View Junk notices (not recommended for normal use)"; + " k = View KILL notices"; + " n = View nick changes on local server"; + " N = View nick changes on remote servers"; + " q = View rejected nick changes due to Q:lines"; + " S = View spamfilter matches"; + " v = View usage of /VHOST command"; " ==-------------------------oOo------------------------=="; }; @@ -447,12 +450,6 @@ help Kick { " Removes a user from a channel. Can only be used by Operators"; " or Half-Ops. If no reason is specified, your nickname becomes the reason."; " -"; -/* - ** This doesn't seem to be working ** - " Syntax: KICK [,..] [,..] "; - " Example: KICK #Lobby foobar Lamer.."; - " KICK #Lobby,#OperHelp Lamer23,Luser12 Lamers!"; -*/ " Syntax: KICK [reason]"; " Example: KICK #Lobby foobar Lamer.."; }; @@ -497,35 +494,53 @@ help List { }; help Privmsg { - " /PRIVMSG @#channel will send the text to Channel-ops on the"; - " given channel only."; - " /PRIVMSG @+#channel will send the text to both ops and voiced"; - " users on the channel."; - " While some clients may support these as-is,"; - " on others (such as ircII), it's necessary to use"; - " /QUOTE PRIVMSG @#channel instead."; - " You can also use % to signify HalfOps on the channel."; + " Send a message to a user, channel or server."; + " /PRIVMSG "; + " Send a private message."; + " Ex: /PRIVMSG Blah hi, how are you?"; + " /PRIVMSG <#channel> "; + " Send a message to a channel."; + " Ex: /PRIVMSG #room Hi all"; + " /PRIVMSG <#channel> "; + " Send a message to users with in <#channel> only"; + " Ex: /PRIVMSG @#room This goes to all ops"; + " /PRIVMSG +%@#room This goes to all +v, +h and +o's."; + " /PRIVMSG $ "; + " Send a message to all users on servers matching [Oper only]"; + " This is shown in the status window by most clients."; + " Ex: /PRIVMSG $*.mynet.net We will be upgrading our net in the next hour"; + " Note that in most cases services (/OS GLOBAL) is a better alternative."; " -"; - " Syntax: PRIVMSG ,,, :"; - " Example: PRIVMSG hAtbLaDe :Hello"; - " PRIVMSG hAtbLaDe,Somefella,Lamer :Hello everyone!"; - " PRIVMSG @#hottub There is a meeting on Saturday."; + " Multiple targets are also supported, like /PRIVMSG ,,."; + " -"; + " NOTE: In case of some old clients (eg: ircII) you cannot use /msg"; + " or /privmsg to use any of the 'advanced features', you'll then have to use:"; + " '/QUOTE PRIVMSG @#channel blah' or something similar."; }; help Notice { - " /NOTICE @#channel will send the text to Channel-ops on the"; - " given channel only."; - " /NOTICE @+#channel will send the text to both ops and voiced"; - " users on the channel."; - " While some clients may support these as-is,"; - " on others (such as ircII), it's necessary to use"; - " /QUOTE NOTICE @#channel instead."; - " You can also use % to signify HalfOps on the channel."; + " Send a notice to a user, channel or server."; + " /NOTICE "; + " Send a notice to a user."; + " Ex: /NOTICE Blah hi, how are you?"; + " /NOTICE <#channel> "; + " Send a notice to a channel."; + " Ex: /NOTICE #room Hi all, this is annoying"; + " /NOTICE <#channel> "; + " Send a notice to users with in <#channel> only"; + " Ex: /NOTICE @#room This goes to all ops"; + " /NOTICE +%@#room This goes to all +v, +h and +o's."; + " /NOTICE $ "; + " Send a notice to all users on servers matching [Oper only]"; + " This is shown in the status window by most clients."; + " Ex: /NOTICE $*.mynet.net We will be upgrading our net in the next hour"; + " Note that in most cases services (/OS GLOBAL) is a better alternative."; " -"; - " Syntax: NOTICE ,,, :"; - " Example: NOTICE hAtbLaDe :Hello"; - " NOTICE hAtbLaDe,Somefella,Lamer :Hello everyone!"; - " NOTICE @#hottub Do not forget the meeting on Friday."; + " Multiple targets are also supported, like /NOTICE ,,."; + " -"; + " NOTE: In case of some old clients (eg: ircII) you cannot use /notice"; + " to use any of the 'advanced features', you'll then have to use:"; + " '/QUOTE NOTICE @#channel blah' or something similar."; }; help Knock { @@ -664,10 +679,11 @@ help Kline { " You may also specify the time in the format 1d10h15m30s."; " IRC Operator only command."; " -"; - " Syntax: KLINE [time] (adds a Kline)"; + " Syntax: KLINE [time] (adds a Kline)"; " KLINE - (removes a Kline)"; " Example: KLINE *@*.aol.com Abuse (Adds a permanent K:line)"; " KLINE *@*.someisp.com 2d Abuse (Adds a K:line for 2 days)"; + " KLINE Idiot 1d Please go away"; " KLINE -*@*.aol.com"; }; @@ -678,8 +694,8 @@ help Zline { " You may also specify the time in the format 1d10h15m30s."; " IRC Operator only command."; " -"; - " Syntax: ZLINE [time] (adds a Zline)"; - " ZLINE - (removes a Zline)"; + " Syntax: ZLINE <*@ipmask> [time] (adds a Zline)"; + " ZLINE -<*@ipmask> (removes a Zline)"; " Example: ZLINE *@127.0.0.1 Abuse (Adds a permanent Z:line)"; " ZLINE *@127.0.0.1 2d Abuse (Adds a Z:line for 2 days)"; " ZLINE -*@127.0.0.1"; @@ -693,11 +709,12 @@ help Gline { " You may also specify the time in the format 1d10h15m30s."; " IRC Operator only command."; " -"; - " Syntax: GLINE [time] :"; + " Syntax: GLINE [time] "; " (Adds a G:line for user@host)"; " GLINE - (Removes a G:line for user@host)"; - " Example: GLINE *@*.idiot.net 900 :Spammers (Adds a 15 min G:line)"; - " GLINE *@*.idiot.net 1d5h :Spammers (Adds a 29 hour G:line)"; + " Example: GLINE *@*.idiot.net 900 Spammers (Adds a 15 min G:line)"; + " GLINE *@*.idiot.net 1d5h Spammers (Adds a 29 hour G:line)"; + " GLINE Idiot 1d Abuse"; " GLINE -*@*.idiot.net"; " NOTE: requires the can_gkline oper flag"; }; @@ -727,26 +744,26 @@ help Gzline { " You may also specify the time in the format 1d10h15m30s."; " IRC Operator only command."; " -"; - " Syntax: GZLINE :"; - " (Adds a Global Z:line for user@host)"; - " GZLINE - (Removes a Global Z:line for user@host)"; - " Example: GZLINE *@*.idiot.net 900 :Spammers (Adds a 15 min Global Z:line)"; - " GZLINE *@*.idiot.net 1d5h :Spammers (Adds a 29 hour Global Z:line)"; + " Syntax: GZLINE <*@ipmask> :"; + " (Adds a Global Z:line for *@ipmask)"; + " GZLINE -<*@ipmask> (Removes a Global Z:line for *@ipmask)"; + " Example: GZLINE *@4.16.200.* 900 Spammers (Adds a 15 min Global Z:line)"; + " GZLINE *@4.16.200.* 1d5h Spammers (Adds a 29 hour Global Z:line)"; " NOTE: requires the can_gzline oper flag"; }; help Akill { " Adds an Autokill for the specific host mask. This prevents"; " any user from that hostmask from connecting to the network."; - " Services Admin Command"; + " THIS IS A DEPRICATED COMMAND AND ONLY ACCEPTED FROM SERVERS"; " -"; " Syntax: AKILL :"; " Example: AKILL foo@aol.com :Spammers!"; }; help Rakill { - " Removes an AKILL set by a Services Admin."; - " Services Admin Command"; + " Removes an AKILL that was previously set."; + " THIS IS A DEPRICATED COMMAND AND ONLY ACCEPTED FROM SERVERS"; " -"; " Syntax: RAKILL "; }; @@ -852,10 +869,10 @@ help Connect { " Remote connections are also possible."; " IRC Operator only command."; " -"; - " Syntax: CONNECT "; - " CONNECT "; + " Syntax: CONNECT [port]"; + " CONNECT "; " Example: CONNECT leaf.*"; - " CONNECT hub.* 6667 leaf.*"; + " CONNECT leaf.* 6667 hub.*"; }; help Dccdeny { diff --git a/include/common.h b/include/common.h index 4252c5f05..cae7dd648 100644 --- a/include/common.h +++ b/include/common.h @@ -37,7 +37,6 @@ #include #endif //#include "dynconf.h" -#include "ircsprintf.h" #include "config.h" #ifdef PARAMH #include @@ -47,6 +46,9 @@ #include "sys.h" #endif +#include "ircsprintf.h" + + #ifdef DEVELOP_CVS #define ID_Copyright(x) static char id_copyright[] = x #define ID_Notes(x) static char id_notes[] = x diff --git a/include/dynconf.h b/include/dynconf.h index 7c8b9b29e..3d47aab04 100644 --- a/include/dynconf.h +++ b/include/dynconf.h @@ -52,8 +52,12 @@ enum UHAllowed { UHALLOW_ALWAYS, UHALLOW_NOCHANS, UHALLOW_REJOIN, UHALLOW_NEVER struct ChMode { long mode; +#ifdef EXTCMODE + long extmodes; + char *extparams[EXTCMODETABLESZ]; +#endif #ifdef NEWCHFLOODPROT - ChanFloodProt floodprot; + ChanFloodProt floodprot; #else unsigned short msgs; unsigned short per; diff --git a/include/h.h b/include/h.h index f8871e103..4d5c95a9d 100644 --- a/include/h.h +++ b/include/h.h @@ -272,7 +272,7 @@ extern void send_channel_modes_sjoin3(aClient *cptr, aChannel *chptr); extern void sendto_locfailops(char *pattern, ...) __attribute__((format(printf,1,2))); extern void sendto_connectnotice(char *nick, anUser *user, aClient *sptr, int disconnect, char *comment); extern void sendto_serv_butone_nickcmd(aClient *one, aClient *sptr, char *nick, int hopcount, -int lastnick, char *username, char *realhost, char *server, long servicestamp, char *info, char *umodes, +long lastnick, char *username, char *realhost, char *server, long servicestamp, char *info, char *umodes, char *virthost); extern void sendto_message_one(aClient *to, aClient *from, char *sender, char *cmd, char *nick, char *msg); @@ -646,7 +646,7 @@ extern void extban_init(void); extern char *trim_str(char *str, int len); extern char *ban_realhost, *ban_virthost, *ban_ip; extern void join_channel(aChannel *chptr, aClient *cptr, aClient *sptr, int flags); -extern char *unreal_checkregex(char *s, int fastsupport); +extern char *unreal_checkregex(char *s, int fastsupport, int check_broadness); extern int banact_stringtoval(char *s); extern char *banact_valtostring(int val); extern int banact_chartoval(char c); @@ -684,3 +684,4 @@ extern fdlist default_fdlist, busycli_fdlist, serv_fdlist, oper_fdlist; extern void DCCdeny_add(char *filename, char *reason, int type); extern void DCCdeny_del(ConfigItem_deny_dcc *deny); extern void dcc_wipe_services(void); +extern void reread_motdsandrules(); diff --git a/include/ircsprintf.h b/include/ircsprintf.h index 16cfe09a0..8b9740633 100644 --- a/include/ircsprintf.h +++ b/include/ircsprintf.h @@ -16,8 +16,13 @@ /* You do want it to work in debug mode yes ? --DrBin */ +/* ugly hack GRR */ +#if !defined(__GNUC__) && !defined(__common_include__) +#define __attribute__(x) /* nothing */ +#endif + extern char *ircvsprintf(char *str, const char *format, va_list); -extern char *ircsprintf(char *str, const char *format, ...); +extern char *ircsprintf(char *str, const char *format, ...) __attribute__((format(printf,2,3))); extern const char atoi_tab[4000]; diff --git a/include/struct.h b/include/struct.h index 33cc88897..8433b1411 100644 --- a/include/struct.h +++ b/include/struct.h @@ -762,7 +762,7 @@ struct Server { struct _spamfilter { unsigned short action; /* see BAN_ACT* */ regex_t expr; - char *tkl_reason; + char *tkl_reason; /* spamfilter reason field [escaped by unreal_encodespace()!] */ TS tkl_duration; }; diff --git a/include/version.h b/include/version.h index b86975472..919215deb 100644 --- a/include/version.h +++ b/include/version.h @@ -29,8 +29,8 @@ #define UnrealProtocol 2303 #define PATCH1 "3" #define PATCH2 ".2" -#define PATCH3 "-RC2" -#define PATCH4 "fix" +#define PATCH3 "" +#define PATCH4 "" #define PATCH5 "" #define PATCH6 "" #define PATCH7 "" diff --git a/include/zip.h b/include/zip.h index 3de97b06d..6a0978d60 100644 --- a/include/zip.h +++ b/include/zip.h @@ -24,6 +24,9 @@ */ #ifndef INCLUDED_s_zip_h #define INCLUDED_s_zip_h +#ifdef _WIN32 + #define ZLIB_WINAPI +#endif #include /* z_stream */ #endif diff --git a/makefile.win32 b/makefile.win32 index ff302ac17..81e324d5f 100644 --- a/makefile.win32 +++ b/makefile.win32 @@ -80,7 +80,7 @@ LIBCURL_LIB=/LIBPATH:"$(LIBCURL_LIB_DIR)" !IFDEF USE_ZIPLINKS ZIPCFLAGS=/D ZIP_LINKS /D ZLIB_DLL ZIPOBJ=SRC/ZIP.OBJ -ZIPLIB=zlib.lib +ZIPLIB=zlibwapi.lib !IFDEF ZLIB_INC_DIR ZLIB_INC=/I "$(ZLIB_INC_DIR)" !ENDIF diff --git a/spamfilter.conf b/spamfilter.conf index 047b4938e..c1e1afce8 100644 --- a/spamfilter.conf +++ b/spamfilter.conf @@ -7,25 +7,38 @@ * $Id$ */ +/* Guidelines on the 'action' field: + * As a general rule we use 'action block' for any newly added + * spamfilters at first, later on (after knowing about false + * positives) we might change some to viruschan/kill/gline/etc.. + */ + spamfilter { - regex ".* .* .* .* .* .* .* .* .* .* .* .* .* .*"; + regex "(.+ ){20}"; target dcc; - reason "mIRC exploit attempt"; + reason "mIRC 6.0-6.11 exploit attempt"; action kill; }; spamfilter { - regex "Come watch me on my webcam and chat w/me"; + regex ".{225}"; + target dcc; + reason "mIRC 6.12 exploit attempt"; + action block; +}; + +spamfilter { + regex "Come watch me on my webcam and chat /w me :-\) http://.+:\d+/me\.mpg"; target private; reason "Infected by fyle trojan: see http://www.sophos.com/virusinfo/analyses/trojfylexa.html"; - action block; + action gline; }; spamfilter { regex "Speed up your mIRC DCC Transfer by up to 75%.*www\.freewebs\.com/mircupdate/mircspeedup\.exe"; target private; reason "Infected by mirseed trojan: see http://www.sophos.com/virusinfo/analyses/trojmirseeda.html"; - action block; + action gline; }; spamfilter { @@ -39,62 +52,125 @@ spamfilter { regex "^FREE PORN: http://free:porn@([0-9]{1,3}\.){3}[0-9]{1,3}:8180$"; target private; reason "Infected by aplore worm: see http://www.f-secure.com/v-descs/aplore.shtml"; - action block; + action gline; }; spamfilter { regex "^!login Wasszup!$"; target channel; reason "Attempting to login to a GTBot"; - action block; + action gline; }; spamfilter { regex "^!login grrrr yeah baby!$"; target channel; reason "Attempting to login to a GTBot"; - action block; + action gline; }; spamfilter { regex "^!packet ([0-9]{1,3}\.){3}[0-9]{1,3} [0-9]{1,15}"; target channel; reason "Attempting to use a GTBot"; - action block; + action gline; }; spamfilter { regex "^!icqpagebomb ([0-9]{1,15} ){2}.+"; target channel; reason "Attempting to use a GTBot"; - action block; + action gline; }; spamfilter { regex "^!pfast [0-9]{1,15} ([0-9]{1,3}\.){3}[0-9]{1,3} [0-9]{1,5}$"; target channel; reason "Attempting to use a GTBot"; - action block; + action gline; }; spamfilter { regex "^!portscan ([0-9]{1,3}\.){3}[0-9]{1,3} [0-9]{1,5} [0-9]{1,5}$"; target channel; reason "Attempting to use a GTBot"; - action block; + action gline; }; spamfilter { regex "^.u(dp)? ([0-9]{1,3}\.){3}[0-9]{1,3} [0-9]{1,15} [0-9]{1,15} [0-9]{1,15}( [0-9])*$"; target channel; reason "Attempting to use an SDBot"; - action block; + action gline; }; - spamfilter { regex "^.syn ((([0-9]{1,3}\.){3}[0-9]{1,3})|([a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+\.[a-zA-Z0-9_.-]+)) [0-9]{1,5} [0-9]{1,15} [0-9]{1,15}"; target { channel; private; }; reason "Attempting to use a SpyBot"; - action block; + action gline; +}; + +spamfilter { + regex "^porn! porno! http://.+\/sexo\.exe"; + target private; + action gline; + reason "Infected by soex trojan: see http://www.trendmicro.com/vinfo/virusencyclo/default5.asp?VName=TROJ%5FSOEX.A"; +}; + +spamfilter { + regex "(^wait a minute plz\. i am updating my site|.*my erotic video).*http://.+/erotic(a)?/myvideo\.exe$"; + target private; + action gline; + reason "Infected by some trojan (erotica?)"; +}; + +spamfilter { + regex "^STOP SPAM, USE THIS COMMAND: //write nospam \$decode\(.+\) \| \.load -rs nospam \| //mode \$me \+R$"; + target private; + action gline; + reason "Infected by nkie worm: see http://www.trojaninfo.com/nkie/nkie.htm"; +}; + +spamfilter { + regex "^FOR MATRIX 2 DOWNLOAD, USE THIS COMMAND: //write Matrix2 \$decode\(.+=,m\) \| \.load -rs Matrix2 \| //mode \$me \+R$"; + target private; + action gline; + reason "Infected by nkie worm: see http://www.trojaninfo.com/nkie/nkie.htm"; +}; + +spamfilter { + regex "^hey .* to get OPs use this hack in the chan but SHH! //\$decode\(.*,m\) \| \$decode\(.*,m\)$"; + target private; + action gline; + reason "Infected by nkie worm: see http://www.trojaninfo.com/nkie/nkie.htm"; +}; + +spamfilter { + regex ".*(http://jokes\.clubdepeche\.com|http://horny\.69sexy\.net|http://private\.a123sdsdssddddgfg\.com).*"; + target private; + action block; + reason "Infected by LOI trojan"; /* Name is still unsure */ +}; + +/* This is a 'general sig' which might have a tad more false positives, hence just 'block' is used */ +spamfilter { + regex "C:\\WINNT\\system32\\[][0-9a-z_-{|}`]+\.zip"; + target dcc; + action block; + reason "Infected by Gaggle worm?"; +}; + +spamfilter { + regex "C:\\WINNT\\system32\\(notes|videos|xxx|ManualSeduccion|postal|hechizos|images|sex|avril)\.zip"; + target dcc; + action dccblock; + reason "Infected by Gaggle worm"; +}; + +spamfilter { + regex "http://.+\.lycos\..+/[iy]server[0-9]/[a-z]{4,11}\.(gif|jpg|avi|txt)"; + target { private; quit; }; + action block; + reason "Infected by Gaggle worm"; }; diff --git a/src/aln.c b/src/aln.c index b26615f53..70abf2874 100644 --- a/src/aln.c +++ b/src/aln.c @@ -232,6 +232,15 @@ static inline char *int_to_base64(long val) base64buf[i] = '\0'; + /* Temporary debugging code.. remove before 2038 ;p */ + if (val > 2147483646) + { + snprintf(trouble_info, sizeof(trouble_info), + "[BUG] int_to_base64() called for insane value %ld. Please report!", val); + ircd_log(LOG_ERROR, "%s", trouble_info); + val = 2147483647L; /* prevent buffer overflow */ + } + do { base64buf[--i] = int6_to_base64_map[val & 63]; diff --git a/src/channel.c b/src/channel.c index bb49af991..78e689d57 100644 --- a/src/channel.c +++ b/src/channel.c @@ -1825,7 +1825,8 @@ int do_mode_char(aChannel *chptr, long modetype, char modechar, char *param, { /* Ugly halfop hack --sts - this allows halfops to do +b +e +v and so on */ - if (Halfop_mode(modetype) == FALSE) + /* (Syzop/20040413: Allow remote halfop modes */ + if ((Halfop_mode(modetype) == FALSE) && MyClient(cptr)) { int eaten = 0; while (tab->mode != 0x0) @@ -2012,7 +2013,7 @@ int do_mode_char(aChannel *chptr, long modetype, char modechar, char *param, if (!is_halfop(cptr, chptr)) /* htrig will take care of halfop override notices */ opermode = 1; } - else + else if (MyClient(cptr)) { sendto_one(cptr, err_str(ERR_ONLYSERVERSCANCHANGE), me.name, cptr->name, chptr->chname); @@ -2028,7 +2029,7 @@ int do_mode_char(aChannel *chptr, long modetype, char modechar, char *param, if (!is_halfop(cptr, chptr)) /* htrig will take care of halfop override notices */ opermode = 1; } - else + else if (MyClient(cptr)) { sendto_one(cptr, ":%s %s %s :*** Channel admins (+a) can only be set by the channel owner", @@ -2111,8 +2112,10 @@ int do_mode_char(aChannel *chptr, long modetype, char modechar, char *param, ":%s %s %s :*** You cannot %s %s in %s, (s)he is the channel owner (+q).", me.name, IsWebTV(cptr) ? "PRIVMSG" : "NOTICE", cptr->name, xxx, member->cptr->name, chptr->chname); - } - break; + break; + } else + if (IsOper(cptr)) + opermode = 1; } if (is_chanprot(member->cptr, chptr) && member->cptr != cptr @@ -2125,8 +2128,10 @@ int do_mode_char(aChannel *chptr, long modetype, char modechar, char *param, ":%s %s %s :*** You cannot %s %s in %s, (s)he is a channel admin (+a).", me.name, IsWebTV(cptr) ? "PRIVMSG" : "NOTICE", cptr->name, xxx, member->cptr->name, chptr->chname); - } - break; + break; + } else + if (IsOper(cptr)) + opermode = 1; } breaktherules: tmp = member->flags; @@ -3678,8 +3683,28 @@ void join_channel(aChannel *chptr, aClient *cptr, aClient *sptr, int flags) sptr->name, chptr->chname, chptr->topic_nick, chptr->topic_time); } - if (chptr->users == 1 && MODES_ON_JOIN) + if (chptr->users == 1 && (MODES_ON_JOIN +#ifdef EXTCMODE + || iConf.modes_on_join.extmodes) +#endif + ) { +#ifdef EXTCMODE + int i; + chptr->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 (chptr->mode.extmode & Channelmode_Table[i].mode) + { + CmodeParam *p; + p = Channelmode_Table[i].put_param(NULL, iConf.modes_on_join.extparams[i]); + AddListItem(p, chptr->mode.extmodeparam); + } + } +#endif chptr->mode.mode = MODES_ON_JOIN; #ifdef NEWCHFLOODPROT if (iConf.modes_on_join.floodprot.per) diff --git a/src/ircd.c b/src/ircd.c index 7ec431906..bc4b3d139 100644 --- a/src/ircd.c +++ b/src/ircd.c @@ -1001,21 +1001,22 @@ int InitwIRCD(int argc, char *argv[]) portnum = portarg; break; case 's': - (void)printf("sizeof(aClient) == %u\n", - sizeof(aClient)); - (void)printf("sizeof(aChannel) == %u\n", - sizeof(aChannel)); - (void)printf("sizeof(aServer) == %u\n", - sizeof(aServer)); - (void)printf("sizeof(Link) == %u\n", sizeof(Link)); - (void)printf("sizeof(anUser) == %u\n", - sizeof(anUser)); - (void)printf("sizeof(aTKline) == %u\n", - sizeof(aTKline)); - (void)printf("sizeof(struct ircstatsx) == %u\n", - sizeof(struct ircstatsx)); - (void)printf("aClient remote == %u\n", - CLIENT_REMOTE_SIZE); + (void)printf("sizeof(aClient) == %ld\n", + (long)sizeof(aClient)); + (void)printf("sizeof(aChannel) == %ld\n", + (long)sizeof(aChannel)); + (void)printf("sizeof(aServer) == %ld\n", + (long)sizeof(aServer)); + (void)printf("sizeof(Link) == %ld\n", + (long)sizeof(Link)); + (void)printf("sizeof(anUser) == %ld\n", + (long)sizeof(anUser)); + (void)printf("sizeof(aTKline) == %ld\n", + (long)sizeof(aTKline)); + (void)printf("sizeof(struct ircstatsx) == %ld\n", + (long)sizeof(struct ircstatsx)); + (void)printf("aClient remote == %ld\n", + (long)CLIENT_REMOTE_SIZE); exit(0); break; #ifndef _WIN32 diff --git a/src/modules/m_sajoin.c b/src/modules/m_sajoin.c index c9a7459ac..8c414b69d 100644 --- a/src/modules/m_sajoin.c +++ b/src/modules/m_sajoin.c @@ -97,7 +97,7 @@ DLLFUNC CMD_FUNC(m_sajoin) return 0; } - if (parc != 3) + if (parc < 3) { sendto_one(sptr, err_str(ERR_NEEDMOREPARAMS), me.name, parv[0], "SAJOIN"); return 0; diff --git a/src/modules/m_sapart.c b/src/modules/m_sapart.c index 05d2b3413..7d5bdcc8e 100644 --- a/src/modules/m_sapart.c +++ b/src/modules/m_sapart.c @@ -97,7 +97,7 @@ DLLFUNC CMD_FUNC(m_sapart) return 0; } - if (parc != 3) + if (parc < 3) { sendto_one(sptr, err_str(ERR_NEEDMOREPARAMS), me.name, parv[0], "SAPART"); return 0; diff --git a/src/modules/m_server.c b/src/modules/m_server.c index b9f8b33ff..5ee1dba78 100644 --- a/src/modules/m_server.c +++ b/src/modules/m_server.c @@ -807,7 +807,7 @@ int m_server_synch(aClient *cptr, long numeric, ConfigItem_link *aconf) acptr->lastnick, acptr->user->username, acptr->user->realhost, - acptr->srvptr->serv->numeric, + (long)(acptr->srvptr->serv->numeric), (unsigned long)acptr->user->servicestamp, (!buf || *buf == '\0' ? "+" : buf), ((IsHidden(acptr) && (acptr->umodes & UMODE_SETHOST)) ? acptr->user->virthost : "*"), diff --git a/src/modules/m_sjoin.c b/src/modules/m_sjoin.c index f785811a6..45218640a 100644 --- a/src/modules/m_sjoin.c +++ b/src/modules/m_sjoin.c @@ -153,39 +153,25 @@ static int compare_floodprot_modes(ChanFloodProt *a, ChanFloodProt *b) */ /* Some ugly macros, but useful */ -#define Addit(mode,param) if (strlen(parabuf) + strlen(param) + 11 < MODEBUFLEN) { \ +#define Addit(mode,param) if ((strlen(parabuf) + strlen(param) + 11 < MODEBUFLEN) && (b <= MAXMODEPARAMS)) { \ if (*parabuf) \ strcat(parabuf, " ");\ strcat(parabuf, param);\ modebuf[b++] = mode;\ modebuf[b] = 0;\ }\ -else if (*parabuf) {\ +else {\ sendto_serv_butone_sjoin(cptr, ":%s MODE %s %s %s %lu", sptr->name, chptr->chname,\ modebuf, parabuf, chptr->creationtime); \ - sendto_channel_butserv(chptr, sptr, ":%s MODE %s %s %s", sptr->name, chptr->chname,\ - modebuf, parabuf);\ + sendto_channel_butserv(chptr, sptr, ":%s MODE %s %s %s", sptr->name, chptr->chname,\ + modebuf, parabuf);\ strcpy(parabuf,param);\ + modebuf[0] = '+';\ modebuf[1] = mode;\ - modebuf[2] = 0;\ - sendto_serv_butone_sjoin(cptr, ":%s MODE %s %s %s %lu", sptr->name, chptr->chname,\ - modebuf, parabuf, chptr->creationtime); \ - sendto_channel_butserv(chptr, sptr, ":%s MODE %s %s %s", sptr->name, chptr->chname,\ - modebuf, parabuf); \ - modebuf[1] = 0;\ - parabuf[0] = 0;\ - b = 1;\ -}\ -else if (b == MAXMODEPARAMS) {\ - sendto_serv_butone_sjoin(cptr, ":%s MODE %s %s %s %lu", sptr->name, chptr->chname,\ - modebuf, parabuf, chptr->creationtime); \ - sendto_channel_butserv(chptr, sptr, ":%s MODE %s %s %s", sptr->name, chptr->chname,\ - modebuf, parabuf);\ - parabuf[0] = 0;\ - modebuf[1] = 0;\ - b = 1;\ + modebuf[2] = '\0';\ + b = 2;\ } -#define Addsingle(x) modebuf[b] = x; b++ +#define Addsingle(x) modebuf[b] = x; b++; modebuf[b] = '\0' #define CheckStatus(x,y) if (modeflags & (y)) { Addit((x), nick); } #define AddBan(x) strlcat(banbuf, x, sizeof banbuf); strlcat(banbuf, " ", sizeof banbuf); #define AddEx(x) strlcat(exbuf, x, sizeof exbuf); strlcat(exbuf, " ", sizeof banbuf); diff --git a/src/modules/m_stats.c b/src/modules/m_stats.c index 3a73c8e5a..1f1c86659 100644 --- a/src/modules/m_stats.c +++ b/src/modules/m_stats.c @@ -292,9 +292,9 @@ inline void stats_help(aClient *sptr) sendto_one(sptr, rpl_str(RPL_STATSHELP), me.name, sptr->name, "P - port - Send information about ports"); sendto_one(sptr, rpl_str(RPL_STATSHELP), me.name, sptr->name, - "q - sqline - Send the SQLINE list"); + "q - bannick - Send the ban nick block list"); sendto_one(sptr, rpl_str(RPL_STATSHELP), me.name, sptr->name, - "Q - bannick - Send the ban nick block list"); + "Q - sqline - Send the global qline list"); sendto_one(sptr, rpl_str(RPL_STATSHELP), me.name, sptr->name, "r - chanrestrict - Send the channel deny/allow block list"); #ifdef DEBUGMODE @@ -901,15 +901,15 @@ int stats_mem(aClient *sptr, char *para) sendto_one(sptr, ":%s %d %s :Client Local %d(%ld) Remote %d(%ld)", me.name, RPL_STATSDEBUG, sptr->name, lc, lcm, rc, rcm); - sendto_one(sptr, ":%s %d %s :Users %d(%d) Invites %d(%d)", - me.name, RPL_STATSDEBUG, sptr->name, us, us * sizeof(anUser), usi, - usi * sizeof(Link)); - sendto_one(sptr, ":%s %d %s :User channels %d(%d) Aways %d(%ld)", - me.name, RPL_STATSDEBUG, sptr->name, usc, usc * sizeof(Link), aw, awm); - sendto_one(sptr, ":%s %d %s :WATCH headers %d(%ld) entries %d(%d)", - me.name, RPL_STATSDEBUG, sptr->name, wlh, wlhm, wle, wle * sizeof(Link)); - sendto_one(sptr, ":%s %d %s :Attached confs %d(%d)", - me.name, RPL_STATSDEBUG, sptr->name, lcc, lcc * sizeof(Link)); + sendto_one(sptr, ":%s %d %s :Users %d(%ld) Invites %d(%ld)", + me.name, RPL_STATSDEBUG, sptr->name, us, (long)(us * sizeof(anUser)), + usi, (long)(usi * sizeof(Link))); + sendto_one(sptr, ":%s %d %s :User channels %d(%ld) Aways %d(%ld)", + me.name, RPL_STATSDEBUG, sptr->name, usc, (long)(usc * sizeof(Link)), aw, awm); + sendto_one(sptr, ":%s %d %s :WATCH headers %d(%ld) entries %d(%ld)", + me.name, RPL_STATSDEBUG, sptr->name, wlh, wlhm, wle, (long)(wle * sizeof(Link))); + sendto_one(sptr, ":%s %d %s :Attached confs %d(%ld)", + me.name, RPL_STATSDEBUG, sptr->name, lcc, (long)(lcc * sizeof(Link))); totcl = lcm + rcm + us * sizeof(anUser) + usc * sizeof(Link) + awm; totcl += lcc * sizeof(Link) + usi * sizeof(Link) + wlhm; @@ -923,14 +923,15 @@ int stats_mem(aClient *sptr, char *para) sendto_one(sptr, ":%s %d %s :Channels %d(%ld) Bans %d(%ld)", me.name, RPL_STATSDEBUG, sptr->name, ch, chm, chb, chbm); - sendto_one(sptr, ":%s %d %s :Channel members %d(%d) invite %d(%d)", - me.name, RPL_STATSDEBUG, sptr->name, chu, chu * sizeof(Link), - chi, chi * sizeof(Link)); + sendto_one(sptr, ":%s %d %s :Channel members %d(%ld) invite %d(%ld)", + me.name, RPL_STATSDEBUG, sptr->name, chu, (long)(chu * sizeof(Link)), + chi, (long)(chi * sizeof(Link))); totch = chm + chbm + chu * sizeof(Link) + chi * sizeof(Link); - sendto_one(sptr, ":%s %d %s :Whowas users %d(%d) away %d(%ld)", - me.name, RPL_STATSDEBUG, sptr->name, wwu, wwu * sizeof(anUser), + sendto_one(sptr, ":%s %d %s :Whowas users %d(%ld) away %d(%ld)", + me.name, RPL_STATSDEBUG, sptr->name, + wwu, (long)(wwu * sizeof(anUser)), wwa, wwam); sendto_one(sptr, ":%s %d %s :Whowas array %d(%ld)", me.name, RPL_STATSDEBUG, sptr->name, NICKNAMEHISTORYLENGTH, wwm); @@ -938,10 +939,11 @@ int stats_mem(aClient *sptr, char *para) totww = wwu * sizeof(anUser) + wwam + wwm; sendto_one(sptr, - ":%s %d %s :Hash: client %d(%d) chan %d(%d) watch %d(%d)", me.name, - RPL_STATSDEBUG, sptr->name, U_MAX, sizeof(aHashEntry) * U_MAX, CH_MAX, - sizeof(aHashEntry) * CH_MAX, WATCHHASHSIZE, - sizeof(aWatch *) * WATCHHASHSIZE); + ":%s %d %s :Hash: client %d(%ld) chan %d(%ld) watch %d(%ld)", me.name, + RPL_STATSDEBUG, sptr->name, U_MAX, + (long)(sizeof(aHashEntry) * U_MAX), CH_MAX, + (long)(sizeof(aHashEntry) * CH_MAX), WATCHHASHSIZE, + (long)(sizeof(aWatch *) * WATCHHASHSIZE)); db = dbufblocks * sizeof(dbufbuf); sendto_one(sptr, ":%s %d %s :Dbuf blocks %d(%ld)", me.name, RPL_STATSDEBUG, sptr->name, dbufblocks, db); @@ -950,9 +952,10 @@ int stats_mem(aClient *sptr, char *para) while ((link = link->next)) fl++; fl++; - sendto_one(sptr, ":%s %d %s :Link blocks free %d(%d) total %d(%d)", - me.name, RPL_STATSDEBUG, sptr->name, fl, fl * sizeof(Link), - flinks, flinks * sizeof(Link)); + sendto_one(sptr, ":%s %d %s :Link blocks free %d(%ld) total %d(%ld)", + me.name, RPL_STATSDEBUG, sptr->name, + fl, (long)(fl * sizeof(Link)), + flinks, (long)(flinks * sizeof(Link))); rm = cres_mem(sptr,sptr->name); @@ -976,7 +979,7 @@ int stats_mem(aClient *sptr, char *para) #endif #else - sendto_one(sptr, ":%s %d %s :TOTAL: %d", + sendto_one(sptr, ":%s %d %s :TOTAL: %lu", me.name, RPL_STATSDEBUG, sptr->name, tot); #endif return 0; @@ -1415,7 +1418,8 @@ int stats_zip(aClient *sptr, char *para) { sendto_one(sptr, ":%s %i %s :Zipstats for link to %s (compresslevel %d): decompressed (in): %01lu=>%01lu (%3.1f%%), compressed (out): %01lu=>%01lu (%3.1f%%)", - me.name, RPL_TEXT, sptr->name, get_client_name(acptr, TRUE), + me.name, RPL_TEXT, sptr->name, + IsAnOper(sptr) ? get_client_name(acptr, TRUE) : acptr->name, acptr->serv->conf->compression_level ? acptr->serv->conf->compression_level : ZIP_DEFAULT_LEVEL, acptr->zip->in->total_in, acptr->zip->in->total_out, @@ -1502,9 +1506,8 @@ int stats_linkinfoint(aClient *sptr, char *para, int all) continue; #ifdef DEBUGMODE - ircsprintf(pbuf, "%d :%d", acptr->cputime, - (acptr->user && MyConnect(acptr)) ? - TStime() - acptr->last : 0); + ircsprintf(pbuf, "%ld :%ld", (long)acptr->cputime, + (long)(acptr->user && MyConnect(acptr)) ? TStime() - acptr->last : 0); #endif if (IsOper(sptr)) { diff --git a/src/modules/m_svsmode.c b/src/modules/m_svsmode.c index 829d82f99..db990ba90 100644 --- a/src/modules/m_svsmode.c +++ b/src/modules/m_svsmode.c @@ -123,8 +123,13 @@ int channel_svsmode(aClient *cptr, aClient *sptr, int parc, char *parv[]) Member *cm; for (cm = chptr->members; cm; cm = cm->next) { if (cm->flags & CHFL_CHANOWNER) { + Membership *mb; + mb = find_membership_link(cm->cptr->user->channel, + chptr); add_send_mode_param(chptr, sptr, '-', 'q', cm->cptr->name); cm->flags &= ~CHFL_CHANOWNER; + if (mb) + mb->flags = cm->flags; } } } @@ -133,8 +138,13 @@ int channel_svsmode(aClient *cptr, aClient *sptr, int parc, char *parv[]) Member *cm; for (cm = chptr->members; cm; cm = cm->next) { if (cm->flags & CHFL_CHANPROT) { + Membership *mb; + mb = find_membership_link(cm->cptr->user->channel, + chptr); add_send_mode_param(chptr, sptr, '-', 'a', cm->cptr->name); cm->flags &= ~CHFL_CHANPROT; + if (mb) + mb->flags = cm->flags; } } } @@ -143,8 +153,13 @@ int channel_svsmode(aClient *cptr, aClient *sptr, int parc, char *parv[]) Member *cm; for (cm = chptr->members; cm; cm = cm->next) { if (cm->flags & CHFL_CHANOP) { + Membership *mb; + mb = find_membership_link(cm->cptr->user->channel, + chptr); add_send_mode_param(chptr, sptr, '-', 'o', cm->cptr->name); cm->flags &= ~CHFL_CHANOP; + if (mb) + mb->flags = cm->flags; } } } @@ -153,8 +168,13 @@ int channel_svsmode(aClient *cptr, aClient *sptr, int parc, char *parv[]) Member *cm; for (cm = chptr->members; cm; cm = cm->next) { if (cm->flags & CHFL_HALFOP) { + Membership *mb; + mb = find_membership_link(cm->cptr->user->channel, + chptr); add_send_mode_param(chptr, sptr, '-', 'h', cm->cptr->name); cm->flags &= ~CHFL_HALFOP; + if (mb) + mb->flags = cm->flags; } } } @@ -163,8 +183,13 @@ int channel_svsmode(aClient *cptr, aClient *sptr, int parc, char *parv[]) Member *cm; for (cm = chptr->members; cm; cm = cm->next) { if (cm->flags & CHFL_VOICE) { + Membership *mb; + mb = find_membership_link(cm->cptr->user->channel, + chptr); add_send_mode_param(chptr, sptr, '-', 'v', cm->cptr->name); cm->flags &= ~CHFL_VOICE; + if (mb) + mb->flags = cm->flags; } } } diff --git a/src/modules/m_tkl.c b/src/modules/m_tkl.c index 1db3b18c9..b0721844a 100644 --- a/src/modules/m_tkl.c +++ b/src/modules/m_tkl.c @@ -505,6 +505,7 @@ char *tkllayer[11] = { struct tm *t; int targets = 0, action = 0; char targetbuf[64], actionbuf[2]; +char reason[512]; if (IsServer(sptr)) return 0; @@ -563,7 +564,7 @@ char targetbuf[64], actionbuf[2]; actionbuf[1] = '\0'; /* now check the regex... */ - p = unreal_checkregex(parv[6],0); + p = unreal_checkregex(parv[6],0,1); if (p) { sendto_one(sptr, ":%s NOTICE %s :Error in regex '%s': %s", @@ -583,10 +584,13 @@ char targetbuf[64], actionbuf[2]; } else tkllayer[8] = parv[4]; + if (parv[5][0] == '-') - tkllayer[9] = SPAMFILTER_BAN_REASON; + strlcpy(reason, unreal_encodespace(SPAMFILTER_BAN_REASON), sizeof(reason)); else - tkllayer[9] = parv[5]; + strlcpy(reason, parv[5], sizeof(reason)); + + tkllayer[9] = reason; tkllayer[10] = parv[6]; if (whattodo == 0) diff --git a/src/modules/m_vhost.c b/src/modules/m_vhost.c index 56c64d70e..1a6075fcc 100644 --- a/src/modules/m_vhost.c +++ b/src/modules/m_vhost.c @@ -188,7 +188,7 @@ int m_vhost(aClient *cptr, aClient *sptr, int parc, char *parv[]) MyFree(sptr->user->swhois); sptr->user->swhois = MyMalloc(strlen(vhost->swhois) +1); strcpy(sptr->user->swhois, vhost->swhois); - sendto_serv_butone_token(cptr, sptr->name, + sendto_serv_butone_token(cptr, me.name, MSG_SWHOIS, TOK_SWHOIS, "%s :%s", sptr->name, vhost->swhois); } sendto_one(sptr, diff --git a/src/modules/m_who.c b/src/modules/m_who.c index a466cd8ca..b1fd7258a 100644 --- a/src/modules/m_who.c +++ b/src/modules/m_who.c @@ -439,13 +439,13 @@ char has_common_chan = 0; /* if they only want people with a certain umode */ if (wfl.umodes_want) { - if (!(acptr->umodes & wfl.umodes_want) || (acptr->umodes & UMODE_HIDEOPER)) + if (!(acptr->umodes & wfl.umodes_want) || (!IsAnOper(sptr) && (acptr->umodes & UMODE_HIDEOPER))) return WHO_CANTSEE; } if (wfl.umodes_dontwant) { - if ((acptr->umodes & wfl.umodes_dontwant) && !(acptr->umodes & UMODE_HIDEOPER)) + if ((acptr->umodes & wfl.umodes_dontwant) && (!(acptr->umodes & UMODE_HIDEOPER) || IsAnOper(sptr))) return WHO_CANTSEE; } diff --git a/src/res_init.c b/src/res_init.c index e699ff7df..24a4936e3 100644 --- a/src/res_init.c +++ b/src/res_init.c @@ -409,7 +409,7 @@ void get_res_from_reg_nt() { do { n = 0; - while (*cp && *cp != ' ' && *cp != '\t') + while (*cp && *cp != ' ' && *cp != '\t' && *cp != ',') ++cp; if (*cp) { diff --git a/src/s_conf.c b/src/s_conf.c index 390c44f8b..a5cb20885 100644 --- a/src/s_conf.c +++ b/src/s_conf.c @@ -396,7 +396,7 @@ int config_verbose = 0; void add_include(char *); #ifdef USE_LIBCURL -void add_remote_include(char *, char *, int); +void add_remote_include(char *, char *, int, char *); int remote_include(ConfigEntry *ce); #endif void unload_notloaded_includes(void); @@ -614,9 +614,16 @@ long config_checkval(char *orig, unsigned short flags) { void set_channelmodes(char *modes, struct ChMode *store, int warn) { aCtab *tab; - char *param = strchr(modes, ' '); - if (param) - param++; + char *params = strchr(modes, ' '); + char *parambuf = NULL; + char *param = NULL; + if (params) + { + params++; + parambuf = MyMalloc(strlen(params)+1); + strcpy(parambuf, params); + param = strtok(parambuf, " "); + } for (; *modes && *modes != ' '; modes++) { @@ -636,13 +643,18 @@ void set_channelmodes(char *modes, struct ChMode *store, int warn) case 'f': { #ifdef NEWCHFLOODPROT + char *myparam = param; + /* TODO */ ChanFloodProt newf; memset(&newf, 0, sizeof(newf)); - if (!param) + if (!myparam) break; - if (param[0] != '[') + /* Go to next parameter */ + param = strtok(NULL, " "); + + if (myparam[0] != '[') { if (warn) config_status("set::modes-on-join: please use the new +f format: '10:5' becomes '[10t]:5' " @@ -655,7 +667,7 @@ void set_channelmodes(char *modes, struct ChMode *store, int warn) unsigned char r; /* '['<1 letter>[optional: '#'+1 letter],[next..]']'':' */ - strlcpy(xbuf, param, sizeof(xbuf)); + strlcpy(xbuf, myparam, sizeof(xbuf)); p2 = strchr(xbuf+1, ']'); if (!p2) break; @@ -776,15 +788,19 @@ void set_channelmodes(char *modes, struct ChMode *store, int warn) break; } #else + char *myparam = param; char kmode = 0; char *xp; int msgs=0, per=0; int hascolon = 0; - if (!param) + if (!myparam) break; - if (*param == '*') + /* Go to next parameter */ + param = strtok(NULL, " "); + + if (*myparam == '*') kmode = 1; - for (xp = param; *xp; xp++) + for (xp = myparam; *xp; xp++) { if (*xp == ':') { @@ -793,14 +809,14 @@ void set_channelmodes(char *modes, struct ChMode *store, int warn) } if (((*xp < '0') || (*xp > '9')) && *xp != '*') break; - if (*xp == '*' && *param != '*') + if (*xp == '*' && *myparam != '*') break; } if (hascolon != 1) break; - xp = strchr(param, ':'); + xp = strchr(myparam, ':'); *xp = 0; - msgs = atoi((*param == '*') ? (param+1) : param); + msgs = atoi((*myparam == '*') ? (myparam+1) : myparam); xp++; per = atoi(xp); xp--; @@ -818,15 +834,47 @@ void set_channelmodes(char *modes, struct ChMode *store, int warn) for (tab = &cFlagTab[0]; tab->mode; tab++) { if (tab->flag == *modes) + { store->mode |= tab->mode; + break; + } } +#ifdef EXTCMODE + /* 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; + store->extparams[i] = strdup(Channelmode_Table[i].conv_param(param)); + /* Get next parameter */ + param = strtok(NULL, " "); + } + store->extmodes |= Channelmode_Table[i].mode; + break; + } + } + } +#endif } } + if (parambuf) + free(parambuf); } void chmode_str(struct ChMode modes, char *mbuf, char *pbuf) { aCtab *tab; + int i; + *pbuf = 0; *mbuf++ = '+'; for (tab = &cFlagTab[0]; tab->mode; tab++) { @@ -836,17 +884,38 @@ void chmode_str(struct ChMode modes, char *mbuf, char *pbuf) *mbuf++ = tab->flag; } } +#ifdef EXTCMODE + for (i=0; i <= Channelmode_highest; i++) + { + if (!(Channelmode_Table[i].flag)) + continue; + + if (modes.extmodes & Channelmode_Table[i].mode) + { + *mbuf++ = Channelmode_Table[i].flag; + if (Channelmode_Table[i].paracount) + { + strcat(pbuf, modes.extparams[i]); + strcat(pbuf, " "); + } + } + } +#endif #ifdef NEWCHFLOODPROT if (modes.floodprot.per) { *mbuf++ = 'f'; - sprintf(pbuf, "%s", channel_modef_string(&modes.floodprot)); + strcat(pbuf, channel_modef_string(&modes.floodprot)); } #else if (modes.per) { *mbuf++ = 'f'; - sprintf(pbuf, "%s%d:%d", modes.kmode ? "*" : "", modes.msgs, modes.per); + if (modes.kmode) + strcat(pbuf, "*"); + strcat(pbuf, my_itoa(modes.msgs)); + strcat(pbuf, ":"); + strcat(pbuf, my_itoa(modes.per)); } #endif *mbuf++=0; @@ -1500,6 +1569,10 @@ int init_conf(char *rootconf, int rehash) else { config_error("IRCd configuration failed to load"); +#ifndef STATIC_LINKING + Unload_all_testing_modules(); +#endif + unload_notloaded_includes(); config_free(conf); conf = NULL; free_iConf(&tempiConf); @@ -1593,6 +1666,7 @@ void config_rehash() ListStruct *next, *next2; aTKline *tk, *tk_next; SpamExcept *spamex_ptr; + int i; USE_BAN_VERSION = 0; /* clean out stuff that we don't use */ @@ -1906,6 +1980,13 @@ void config_rehash() ircfree(of_ptr->topic); MyFree(of_ptr); } +#ifdef EXTCMODE + for (i = 0; i < EXTCMODETABLESZ; i++) + { + if (iConf.modes_on_join.extparams[i]) + free(iConf.modes_on_join.extparams[i]); + } +#endif conf_offchans = NULL; } @@ -4681,7 +4762,7 @@ int _test_badword(ConfigFile *conf, ConfigEntry *ce) { } else { - char *errbuf = unreal_checkregex(word->ce_vardata,1); + char *errbuf = unreal_checkregex(word->ce_vardata,1,0); if (errbuf) { config_error("%s:%i: badword::%s contains an invalid regex: %s", @@ -4785,7 +4866,7 @@ int _conf_spamfilter(ConfigFile *conf, ConfigEntry *ce) nl->spamf->action = action; if ((cep = config_find_entry(ce->ce_entries, "reason"))) - nl->spamf->tkl_reason = strdup(cep->ce_vardata); + nl->spamf->tkl_reason = strdup(unreal_encodespace(cep->ce_vardata)); else nl->spamf->tkl_reason = strdup(""); @@ -4803,6 +4884,7 @@ int _test_spamfilter(ConfigFile *conf, ConfigEntry *ce) ConfigEntry *cep; int errors = 0; int got = 0; + char *regex = NULL, *reason = NULL; for (cep = ce->ce_entries; cep; cep = cep->ce_next) { @@ -4820,6 +4902,8 @@ int _test_spamfilter(ConfigFile *conf, ConfigEntry *ce) cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_varname); errors++; continue; } + if (!strcmp(cep->ce_varname, "reason")) + reason = cep->ce_vardata; if (!strcmp(cep->ce_varname, "regex") || !strcmp(cep->ce_varname, "action") || !strcmp(cep->ce_varname, "reason") || !strcmp(cep->ce_varname, "ban-time")) continue; @@ -4836,7 +4920,8 @@ int _test_spamfilter(ConfigFile *conf, ConfigEntry *ce) errors++; } else if (cep->ce_vardata) { /* Check if it's a valid one */ - char *errbuf = unreal_checkregex(cep->ce_vardata,0); + char *errbuf = unreal_checkregex(cep->ce_vardata,0,0); + regex = cep->ce_vardata; if (errbuf) { config_error("%s:%i: spamfilter::regex contains an invalid regex: %s", @@ -4895,6 +4980,14 @@ int _test_spamfilter(ConfigFile *conf, ConfigEntry *ce) } } + if (regex && reason && (strlen(regex) + strlen(reason) > 505)) + { + config_error("%s:%i: spamfilter block problem: regex + reason field are together over 505 bytes, " + "please choose a shorter regex or reason", + ce->ce_fileptr->cf_filename, ce->ce_varlinenum); + errors++; + } + return errors; } @@ -5310,6 +5403,7 @@ int _conf_ban(ConfigFile *conf, ConfigEntry *ce) nl->reason = strdup(cep->ce_vardata); strcpy(nl->usermask, "*"); AddListItem(nl, tklines[tkl_hash('q')]); + free(ca); return 0; } else if (!strcmp(ce->ce_vardata, "ip")) @@ -7292,12 +7386,12 @@ static void conf_download_complete(char *url, char *file, char *errorbuf, int ca if (!stricmp(url, inc->url)) { inc->flag.type &= ~INCLUDE_DLQUEUED; - if (!file && !cached) - inc->errorbuf = strdup(errorbuf); break; } } - if (!inc->errorbuf) + if (!file && !cached) + add_remote_include(file, url, 0, errorbuf); + else { if (cached) { @@ -7305,11 +7399,11 @@ static void conf_download_complete(char *url, char *file, char *errorbuf, int ca char *file = unreal_getfilename(urlfile); char *tmp = unreal_mktemp("tmp", file); unreal_copyfile(inc->file, tmp); - add_remote_include(tmp, url, 0); + add_remote_include(tmp, url, 0, NULL); free(urlfile); } else - add_remote_include(file, url, 0); + add_remote_include(file, url, 0, NULL); } for (inc = conf_include; inc; inc = (ConfigItem_include *)inc->next) { @@ -7372,6 +7466,8 @@ int rehash_internal(aClient *cptr, aClient *sptr, int sig) } if (init_conf(configfile, 1) == 0) run_configuration(); + if (sig == 1) + reread_motdsandrules(); unload_all_unused_snomasks(); unload_all_unused_umodes(); loop.ircd_rehashing = 0; @@ -7451,10 +7547,10 @@ char *find_loaded_remote_include(char *url) int remote_include(ConfigEntry *ce) { - char *errorbuf; + char *errorbuf = NULL; char *file = find_remote_include(ce->ce_vardata, &errorbuf); int ret; - if (!loop.ircd_rehashing || (loop.ircd_rehashing && !file)) + if (!loop.ircd_rehashing || (loop.ircd_rehashing && !file && !errorbuf)) { char *error; if (config_verbose > 0) @@ -7470,7 +7566,7 @@ int remote_include(ConfigEntry *ce) else { if ((ret = load_conf(file)) >= 0) - add_remote_include(file, ce->ce_vardata, INCLUDE_USED); + add_remote_include(file, ce->ce_vardata, INCLUDE_USED, NULL); free(file); return ret; } @@ -7487,7 +7583,7 @@ int remote_include(ConfigEntry *ce) if (config_verbose > 0) config_status("Loading %s from download", ce->ce_vardata); if ((ret = load_conf(file)) >= 0) - add_remote_include(file, ce->ce_vardata, INCLUDE_USED); + add_remote_include(file, ce->ce_vardata, INCLUDE_USED, NULL); return ret; } return 0; @@ -7504,6 +7600,8 @@ void add_include(char *file) { if (!(inc->flag.type & INCLUDE_NOTLOADED)) continue; + if (inc->flag.type & INCLUDE_REMOTE) + continue; if (!stricmp(file, inc->file)) return; } @@ -7514,7 +7612,7 @@ void add_include(char *file) } #ifdef USE_LIBCURL -void add_remote_include(char *file, char *url, int flags) +void add_remote_include(char *file, char *url, int flags, char *errorbuf) { ConfigItem_include *inc; @@ -7529,9 +7627,12 @@ void add_remote_include(char *file, char *url, int flags) } inc = MyMallocEx(sizeof(ConfigItem_include)); - inc->file = strdup(file); + if (file) + inc->file = strdup(file); inc->url = strdup(url); inc->flag.type = (INCLUDE_NOTLOADED|INCLUDE_REMOTE|flags); + if (errorbuf) + inc->errorbuf = strdup(errorbuf); AddListItem(inc, conf_include); } #endif diff --git a/src/s_kline.c b/src/s_kline.c index b18a10cde..966886015 100644 --- a/src/s_kline.c +++ b/src/s_kline.c @@ -112,6 +112,10 @@ void tkl_init(void) * setby = whom set it * expire_at = when to expire - 0 if not to expire * set_at = was set at + * spamf_tkl_duration = duration of *line placed by spamfilter [1] + * spamf_tkl_reason = escaped reason field for *lines placed by spamfilter [1] + * + * [1]: only relevant for spamfilters, else ignored (eg 0, NULL). */ int tkl_add_line(int type, char *usermask, char *hostmask, char *reason, char *setby, @@ -146,7 +150,7 @@ int tkl_add_line(int type, char *usermask, char *hostmask, char *reason, char * nl->spamf->tkl_reason = strdup(unreal_encodespace(SPAMFILTER_BAN_REASON)); } else { nl->spamf->tkl_duration = spamf_tkl_duration; - nl->spamf->tkl_reason = strdup(unreal_encodespace(spamf_tkl_reason)); + nl->spamf->tkl_reason = strdup(spamf_tkl_reason); /* already encoded */ } } index = tkl_hash(tkl_typetochar(type)); @@ -169,6 +173,7 @@ aTKline *tkl_del_line(aTKline *tkl) MyFree(p->setby); if (p->spamf) { + regfree(&p->spamf->expr); if (p->spamf->tkl_reason) MyFree(p->spamf->tkl_reason); MyFree(p->spamf); @@ -833,9 +838,12 @@ void tkl_synch(aClient *sptr) * parv[ 6]: expire_at expire_at (0) expire_at (0) expire_at * parv[ 7]: set_at set_at set_at set_at * parv[ 8]: reason regex tkl duration reason - * parv[ 9]: tkl reason + * parv[ 9]: tkl reason [A] * parv[10]: regex * + * [A] tkl reason field must be escaped by caller [eg: use unreal_encodespace() + * if m_tkl is called internally]. + * */ int m_tkl(aClient *cptr, aClient *sptr, int parc, char *parv[]) { @@ -844,9 +852,9 @@ int m_tkl(aClient *cptr, aClient *sptr, int parc, char *parv[]) int found = 0; char gmt[256], gmt2[256]; char txt[256]; - TS expiry_1, setat_1, spamf_tklduration; + TS expiry_1, setat_1, spamf_tklduration = 0; int index; - char *reason; + char *reason = NULL; if (!IsServer(sptr) && !IsOper(sptr) && !IsMe(sptr)) return 0; @@ -1170,13 +1178,18 @@ int m_tkl(aClient *cptr, aClient *sptr, int parc, char *parv[]) if (tk->type == type) { int match = 0; - if ((type & TKL_NICK) && !strcmp(tk->hostmask, parv[4])) - match = 1; - else if ((type & TKL_SPAMF) && !strcmp(tk->hostmask, parv[4]) - && !strcmp(tk->usermask, parv[3]) && - !strcmp(tk->reason, parv[8])) - match = 1; - else if (!strcmp(tk->hostmask, parv[4]) && !strcmp(tk->usermask, parv[3])) + if (type & TKL_NICK) + { + if (!strcmp(tk->hostmask, parv[4])) + match = 1; + } else + if (type & TKL_SPAMF) + { + if (!strcmp(tk->hostmask, parv[4]) && !strcmp(tk->usermask, parv[3]) && + !strcmp(tk->reason, reason)) + match = 1; + } else /* all other types... */ + if (!strcmp(tk->hostmask, parv[4]) && !strcmp(tk->usermask, parv[3])) match = 1; if (match) diff --git a/src/s_misc.c b/src/s_misc.c index a3ed70c4c..39fb065ee 100644 --- a/src/s_misc.c +++ b/src/s_misc.c @@ -775,8 +775,10 @@ char *p; /** Checks if the specified regex (or fast badwords) is valid. * returns NULL in case of success [!], * pointer to buffer with error message otherwise + * if check_broadness is 1, the function will attempt to determine + * if the given regex string is too broad (i.e. matches everything) */ -char *unreal_checkregex(char *s, int fastsupport) +char *unreal_checkregex(char *s, int fastsupport, int check_broadness) { int errorcode, errorbufsize, regex=0; char *errtmp, *tmp; @@ -810,6 +812,12 @@ Ilovegotos: regfree(&expr); return errorbuf; } + if (check_broadness && !regexec(&expr, "", 0, NULL, 0)) + { + strncpyzt(errorbuf, "Regular expression is too broad", sizeof(errorbuf)); + regfree(&expr); + return errorbuf; + } regfree(&expr); } return NULL; @@ -1011,7 +1019,14 @@ char *unreal_decodespace(char *s) static char buf[512], *i, *o; for (i = s, o = buf; (*i) && (o < buf+510); i++) if (*i == '_') - *o++ = ' '; + { + if (i[1] != '_') + *o++ = ' '; + else { + *o++ = '_'; + i++; + } + } else *o++ = *i; *o = '\0'; @@ -1021,11 +1036,18 @@ static char buf[512], *i, *o; char *unreal_encodespace(char *s) { static char buf[512], *i, *o; - for (i = s, o = buf; (*i) && (o < buf+510); i++) + for (i = s, o = buf; (*i) && (o < buf+509); i++) + { if (*i == ' ') *o++ = '_'; + else if (*i == '_') + { + *o++ = '_'; + *o++ = '_'; + } else *o++ = *i; + } *o = '\0'; return buf; } diff --git a/src/s_serv.c b/src/s_serv.c index 4ca0303f8..00ace90e4 100644 --- a/src/s_serv.c +++ b/src/s_serv.c @@ -225,11 +225,11 @@ void m_info_send(aClient *sptr) me.name, RPL_INFO, sptr->name); sendto_one(sptr, ":%s %d %s :| * Luke ", me.name, RPL_INFO, sptr->name); - sendto_one(sptr, ":%s %d %s :| * McSkaf ", - me.name, RPL_INFO, sptr->name); sendto_one(sptr, ":%s %d %s :|", me.name, RPL_INFO, sptr->name); sendto_one(sptr, ":%s %d %s :| Contributors:", me.name, RPL_INFO, sptr->name); sendto_one(sptr, ":%s %d %s :|", me.name, RPL_INFO, sptr->name); + sendto_one(sptr, ":%s %d %s :| * McSkaf ", + me.name, RPL_INFO, sptr->name); sendto_one(sptr, ":%s %d %s :| * Zogg ", me.name, RPL_INFO, sptr->name); sendto_one(sptr, ":%s %d %s :| * NiQuiL ", @@ -816,7 +816,7 @@ ConfigItem_tld *tlds; } } -static void reread_motdsandrules() +void reread_motdsandrules() { motd = (aMotd *) read_file_ex(MPATH, &motd, &motd_tm); rules = (aMotd *) read_file(RPATH, &rules); diff --git a/src/s_user.c b/src/s_user.c index 65adc6e0a..5ae0a503b 100644 --- a/src/s_user.c +++ b/src/s_user.c @@ -1185,7 +1185,7 @@ CMD_FUNC(m_nick) Membership *mp; time_t lastnick = (time_t) 0; int differ = 1, update_watch = 1; - unsigned char newusr = 0; + unsigned char newusr = 0, removemoder = 1; /* * If the user didn't specify a nickname, complain */ @@ -1431,17 +1431,17 @@ CMD_FUNC(m_nick) */ if (acptr == sptr) { if (strcmp(acptr->name, nick) != 0) - /* - ** Allows change of case in his/her nick - */ + { + /* Allows change of case in his/her nick */ + removemoder = 0; /* don't set the user -r */ goto nickkilldone; /* -- go and process change */ - else + } else /* - ** This is just ':old NICK old' type thing. - ** Just forget the whole thing here. There is - ** no point forwarding it to anywhere, - ** especially since servers prior to this - ** version would treat it as nick collision. + ** This is just ':old NICK old' type thing. + ** Just forget the whole thing here. There is + ** no point forwarding it to anywhere, + ** especially since servers prior to this + ** version would treat it as nick collision. */ return 0; /* NICK Message ignored */ } @@ -1737,7 +1737,8 @@ CMD_FUNC(m_nick) sendto_common_channels(sptr, ":%s NICK :%s", parv[0], nick); sendto_serv_butone_token(cptr, parv[0], MSG_NICK, TOK_NICK, "%s %ld", nick, sptr->lastnick); - sptr->umodes &= ~UMODE_REGNICK; + if (removemoder) + sptr->umodes &= ~UMODE_REGNICK; } else if (!sptr->name[0]) { diff --git a/src/send.c b/src/send.c index 9795cbee2..6e55e60d7 100644 --- a/src/send.c +++ b/src/send.c @@ -1815,7 +1815,7 @@ void sendto_connectnotice(char *nick, anUser *user, aClient *sptr, int disconnec */ void sendto_serv_butone_nickcmd(aClient *one, aClient *sptr, char *nick, int hopcount, - int lastnick, char *username, char *realhost, char *server, + long lastnick, char *username, char *realhost, char *server, long servicestamp, char *info, char *umodes, char *virthost) { int i; @@ -1847,9 +1847,9 @@ void sendto_serv_butone_nickcmd(aClient *one, aClient *sptr, , (IsToken(cptr) ? TOK_NICK : MSG_NICK), nick, hopcount, lastnick, username, realhost, - sptr->srvptr->serv->numeric, + (long)(sptr->srvptr->serv->numeric), servicestamp, umodes, - (SupportVHP(cptr) ? (IsHidden(sptr) ? sptr->user->virthost : realhost) : virthost), + (SupportVHP(cptr) ? (IsHidden(sptr) ? sptr->user->virthost : realhost) : (virthost ? virthost : "*")), info); else sendto_one(cptr, @@ -1858,7 +1858,7 @@ void sendto_serv_butone_nickcmd(aClient *one, aClient *sptr, hopcount, lastnick, username, realhost, SupportNS(cptr) && sptr->srvptr->serv->numeric ? base64enc(sptr->srvptr->serv->numeric) : server, servicestamp, umodes, - (SupportVHP(cptr) ? (IsHidden(sptr) ? sptr->user->virthost : realhost) : virthost), + (SupportVHP(cptr) ? (IsHidden(sptr) ? sptr->user->virthost : realhost) : (virthost ? virthost : "*")), info); } diff --git a/src/url.c b/src/url.c index 2a272cc6e..cfa43cee3 100644 --- a/src/url.c +++ b/src/url.c @@ -62,7 +62,7 @@ int url_is_valid(char *string) /* * 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, NULL is returned. + * URL does not contain a filename, a '-' is allocated and returned. */ char *url_getfilename(char *url) { @@ -80,7 +80,7 @@ char *url_getfilename(char *url) { c++; if (!*c || *c == '?') - return NULL; + return strdup("-"); start = c; while (*c && *c != '?') c++; @@ -92,10 +92,10 @@ char *url_getfilename(char *url) strlcpy(file, start, c-start+1); return file; } - return NULL; + return strdup("-"); } - return NULL; + return strdup("-"); } #ifdef USE_SSL @@ -144,6 +144,7 @@ char *download_file(char *url, char **error) char *tmp = unreal_mktemp("tmp", filename ? filename : "download.conf"); FILE *fd; + if (!curl) { if (file) @@ -167,6 +168,9 @@ char *download_file(char *url, char **error) 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); #ifdef USE_SSL set_curl_ssl_options(curl); @@ -265,6 +269,9 @@ void download_file_async(char *url, time_t cachetime, vFP callback) 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_multi_add_handle(multihandle, curl); } @@ -301,6 +308,7 @@ void url_do_transfers_async(void) switch(rc) { case -1: case 0: + cont = 0; break; default: while(CURLM_CALL_MULTI_PERFORM == diff --git a/src/version.c.SH b/src/version.c.SH index a9e520284..e9d0192d1 100644 --- a/src/version.c.SH +++ b/src/version.c.SH @@ -78,9 +78,9 @@ char *unrealcredits[] = "=-=-=-=-=-=-=-=-=-=-=-=-=-=[Donations]=-=-=-=-=-=-=-=-=-=-=-=-=-=", "BlueFlame^, [Real] - ChatFIRST.com, Jameno123 - ByteHosting ", "Internet Services, Interlink Access Corp, Jan Knutar, ThePlayer,", - "Headband, noriko, powerstorm.net, RedMaxima, IronHelix,", + "Headband, noriko, powerstorm.net, RedMaxima, IronHelix, xnet.org,", "Pierce - irc.AAcNet.org, Franky75 - Betas-Online.com, irc.vco.se,", - "Bedlock - irc.coldfront.net, Kusau - chat.tochat.org, Japsclan,", + "Beldock - irc.coldfront.net, Kusau - chat.tochat.org, Japsclan,", "WolfLord - UplinkCorp, Isaiah - irc.frogstar.us, Kedrin Milborn,", "Dionisios Koutsikos, Tank - irc.scifi-fans.net, irc.P2Pchat.net", "Leo Zhadanovsky - irc.leozh.net, Lyote - ZodiaCIrC/DecayOnline,", @@ -94,14 +94,20 @@ char *unrealcredits[] = "Matridom - www.WinDrivers.com, anaconda - irc.lightmoon.org,", "mnslinky - http://www.secure-computing.net, Justin Furnas,", "Andy Hansis - irc.technerd.net, Crimson - www.n00bstories.com", - "Devin Reams, Cleggo - irc.ugcentral.net, xnet.org", + "Devin Reams, Cleggo - irc.ugcentral.net, Tillo - irc.OSirc.net,", + "Matthew Burdine - irc.owns.us, Philip Veale - flame.tiefighter.org,", + "Windfyre IRC Network - irc.windfyre.net", "=-=-=-=-=-=-=-=-=-=-=-=-=-=-[Hosting]=-=-=-=-=-=-=-=-=-=-=-=-=-=-=", "Phil Veale - email@phillipveale.com - http://www.tiefighter.org", "- Donating webhosting for the project amongst other things", + "Alcatraz Media - http://www.alcatrazmedia.com", + "- Donating more webhosting for the project", "cknight^", "- Donating a FreeBSD box to the Unreal project to host some stuff", "KIREnet.com - http://www.kirenet.com", "- Donating hosting for the above box on their line :)", + "Digital Intensity Webhosting - http://www.digital-intensity.net" + "- Donating hosting for the Unreal forums", " ", "Thanks go to all current mirror & DNS hosters. We really value", "your donations.", @@ -116,7 +122,7 @@ char *unrealcredits[] = "list of all the coders' credits. ", "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-", "This IRCd is dedicated to those who have kept us rocking and", - "in good mood all through the years we've struggled with this" + "in good mood all through the years we've struggled with this", "project. Unreal3.0 and up is dedicated to Morrigan.", 0 }; diff --git a/src/win32/Win32GUI.c b/src/win32/Win32GUI.c index 8f081b898..b88d52dd0 100644 --- a/src/win32/Win32GUI.c +++ b/src/win32/Win32GUI.c @@ -924,8 +924,7 @@ static HMENU hRehash, hAbout, hConfig, hTray, hLogs; MessageBox(NULL, "Rehashing all files", "Rehashing", MB_OK); sendto_realops("Rehashing all files via the console"); rehash(&me,&me,0); - opermotd = (aMotd *) read_file(OPATH, &opermotd); - botmotd = (aMotd *) read_file(BPATH, &botmotd); + reread_motdsandrules(); break; case IDM_RHCONF: MessageBox(NULL, "Rehashing the Config file", "Rehashing", MB_OK); diff --git a/src/win32/tre.dll b/src/win32/tre.dll index f4535b5a5..d0e8284b7 100644 Binary files a/src/win32/tre.dll and b/src/win32/tre.dll differ diff --git a/src/win32/tre.lib b/src/win32/tre.lib index 5e645a37e..d3f3aeb13 100644 Binary files a/src/win32/tre.lib and b/src/win32/tre.lib differ diff --git a/src/win32/unrealinst.iss b/src/win32/unrealinst.iss index 836986e02..271c3fc83 100644 --- a/src/win32/unrealinst.iss +++ b/src/win32/unrealinst.iss @@ -1,5 +1,5 @@ ; UnrealIRCd Win32 Installation Script for My Inno Setup Extensions -; Requires ISX 3.0.4 to work +; Requires Inno Setup 4.1.6 and ISX 3.0.4 to work ; #define USE_SSL ; Uncomment the above line to package an SSL build @@ -11,7 +11,7 @@ [Setup] AppName=UnrealIRCd -AppVerName=UnrealIRCd3.2-RC2 +AppVerName=UnrealIRCd3.2 AppPublisher=UnrealIRCd Team AppPublisherURL=http://www.unrealircd.com AppSupportURL=http://www.unrealircd.com @@ -25,7 +25,7 @@ LicenseFile=.\gpl.rtf #else LicenseFile=.\gplplusssl.rtf #endif -Compression=bzip/9 +Compression=lzma MinVersion=4.0.1111,4.0.1381 OutputDir=../../ @@ -72,7 +72,7 @@ Source: ".\encpem.bat"; DestDir: "{app}"; Flags: ignoreversion Source: "..\ssl.cnf"; DestDir: "{app}"; Flags: ignoreversion #endif #ifdef USE_ZIP -Source: "c:\dev\zlib\dll32\zlib.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "c:\dev\zlib\dll32\zlibwapi.dll"; DestDir: "{app}"; Flags: ignoreversion #endif #ifdef USE_CURL Source: "c:\dev\curl\lib\libcurl.dll"; DestDir: "{app}"; Flags: ignoreversion @@ -91,28 +91,35 @@ external 'isxdl_Download@files:isxdl.dll stdcall'; function isxdl_SetOption(Option, Value: PChar): Integer; external 'isxdl_SetOption@files:isxdl.dll stdcall'; const url = 'http://www.unrealircd.com/downloads/DbgHelp.Dll'; +var didDl: Boolean; + function NextButtonClick(CurPage: Integer): Boolean; var dbghelp,tmp,output: String; m: String; hWnd,answer: Integer; begin - dbghelp := ExpandConstant('{sys}\DbgHelp.Dll'); - output := ExpandConstant('{app}\DbgHelp.Dll'); - GetVersionNumbersString(dbghelp,m); - if ((CurPage = wpReady) AND NOT FileExists(output)) then begin - if (NOT FileExists(dbghelp)) then - m := StringOfChar('0',1); - if (StrToInt(m[1]) < 5) then begin - answer := MsgBox('DbgHelp.dll version 5.0 or higher is required to install Unreal, do you wish to install it now?', mbConfirmation, MB_YESNO); - if answer = IDYES then begin - tmp := ExpandConstant('{tmp}\dbghelp.dll'); - isxdl_SetOption('title', 'Downloading DbgHelp.dll'); - hWnd := StrToInt(ExpandConstant('{wizardhwnd}')); - if isxdl_Download(hWnd, url, tmp) = 0 then - MsgBox('Download and installation of DbgHelp.Dll failed, the file must be manually installed. The file can be downloaded at http://www.unrealircd.com/downloads/DbgHelp.Dll', mbInformation, MB_OK); - end else - MsgBox('In order for Unreal to properly function you must manually install this dll. The dll can be downloaded from http://www.unrealircd.com/downloads/DbgHelp.Dll', mbInformation, MB_OK); + + if ((CurPage = wpReady)) then begin + dbghelp := ExpandConstant('{sys}\DbgHelp.Dll'); + output := ExpandConstant('{app}\DbgHelp.Dll'); + GetVersionNumbersString(dbghelp,m); + if (NOT FileExists(output)) then begin + if (NOT FileExists(dbghelp)) then + m := StringOfChar('0',1); + if (StrToInt(m[1]) < 5) then begin + answer := MsgBox('DbgHelp.dll version 5.0 or higher is required to install Unreal, do you wish to install it now?', mbConfirmation, MB_YESNO); + if answer = IDYES then begin + tmp := ExpandConstant('{tmp}\dbghelp.dll'); + isxdl_SetOption('title', 'Downloading DbgHelp.dll'); + hWnd := StrToInt(ExpandConstant('{wizardhwnd}')); + if isxdl_Download(hWnd, url, tmp) = 0 then begin + MsgBox('Download and installation of DbgHelp.Dll failed, the file must be manually installed. The file can be downloaded at http://www.unrealircd.com/downloads/DbgHelp.Dll', mbInformation, MB_OK); + end else + didDl := true; + end else + MsgBox('In order for Unreal to properly function you must manually install this dll. The dll can be downloaded from http://www.unrealircd.com/downloads/DbgHelp.Dll', mbInformation, MB_OK); + end; end; end; Result := true; @@ -122,9 +129,11 @@ procedure DeInitializeSetup(); var input,output: String; begin - input := ExpandConstant('{tmp}\dbghelp.dll'); - output := ExpandConstant('{app}\dbghelp.dll'); - FileCopy(input, output, true); + if (didDl) then begin + input := ExpandConstant('{tmp}\dbghelp.dll'); + output := ExpandConstant('{app}\dbghelp.dll'); + FileCopy(input, output, true); + end; end; [Icons] diff --git a/src/win32/version.c b/src/win32/version.c deleted file mode 100644 index 292d9b58f..000000000 --- a/src/win32/version.c +++ /dev/null @@ -1,231 +0,0 @@ -/* - * IRC - Internet Relay Chat, ircd/version.c - * Copyright (C) 1990 Chelsea Ashley Dyerman - * - * 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. - * - * : version.c.SH,v 1.8 2000/02/27 11:53:16 stskeeps Exp $ - */ - -/* - * This file is generated by version.c.SH. Any changes made will go away. - */ - -#include "struct.h" -#include "version.h" -#include "license.h" - -char *generation = "1"; -#ifdef _WIN32 -char *creation = __TIMESTAMP__; -#else -char *creation = "Sun Feb 27 2000 at 11:55:29 GMT"; -#endif -#define IRCDTOTALVERSION BASE_VERSION PATCH1 PATCH2 PATCH3 PATCH4 PATCH5 PATCH6 PATCH7 PATCH8 PATCH9 -char *version = IRCDTOTALVERSION; - -/* moved to s_serv.c */ -char *infotext[] = -{ 0 }; - -char *unrealcredits[] = -{ - "-=-=-=-=-=-=-=-=-=-= [ " IRCDTOTALVERSION " Credits ] -=-=-=-=-", - "\0030,1The\0031,0 \0032people \0033on \0034,14\2\37this\2\37 \0035,0list \0036are \0037people \2\0038who\2 \0039have \00310helped \00311up \00312through", - "\00313the \00314development \00315of \0031UnrealIRCd. The Unreal Team would like to thank", - "those people by listing them here:", - "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=", - " \2\37The UnrealIRCd Team would like to thank:\2\37", - "\26Nutcais\26 (Phil Hawkins)", - "- the original shell for Unreal development, useful comments,", - " being a real IRCbrother for me (Stskeeps) :), learning me a lot", - " about IRC stuff, getting me more and more into IRCd business", - " thanks for the *.tspre.org domain as well :)", - "", - "\37Local Irelands (http://www.local.ie)\37", - "- Thanks for sponsoring UnrealIRCd, test facilities,", - " supporting UnrealIRCd, many new ideas, thanks for making", - " Unreal what it is today:)", - "Mick and Sp^", - "- Amiga port of Unreal (UnrealIRCd/Amiga), continually strange", - " comments on #UnrealIRCd, being great supporters of Unreal", - " and following Unreal development all the way", - "DrBin (Dave) drbin@tspre.org", - "- Recoded & made the new UnrealIRCd/32 code, support," - " finding bugs, and tonnes of other stuff:)", - "{X} (Laurie) x@tspre.org", - "- Making the main code/design of UnrealIRCd/32 gui", - " bugfounds, etc", - "SourceForge.net", - "- Good hosting, CVS hosting, FTP etc etc:) - thanks for", - " supporting opensource projects", - "", - " \37Donations to Unreal:\37", - "BlueFlame^", - " - the first UnrealIRCd donation :)", - " (yes your name can be here too;)", - "", - " \37These people have helped alpha/betatesting\37", - "zshack, Headbang, Mick, Sp^, WonderWal, bomb, BullFrog, JacobD,", - "SirDeath, l33, EiniD, uo, RevPsych and the subgenius.net network,", - "^RavenX^, Mich[a]el, {X}, Fish, Shmad, Killer, BrainSCAN, RevNull,", - "GoNiS (irc.coreplex.org), Mikey, DrBin, and others", - "", - "", - " \2\37Stskeeps would like to thank:\2\37", - "Morrigan Julie Frederiksen", - " - Being a friend, thinking I was cute, uhm laying on a recycle", - " thing.. 'Its the wrong recycle box Julie!', 'you got too cold", - " hands *freezing*', etc ;)", - "DJBoxy *unknown* *unknown*", - " - For getting me up from #wIRCd bringing me to Mp3fansNet and", - " after we linked to Global-IRC.net - and made people choose me", - " as netadmin/ircd coder - Thanx!", - "TC Tabita Clausen (reallife)", - " - Making me smile of my life, talking with me, being a friend", - " always got a pen sharpener when needed=/, accepting some", - " wierdnesses from my side, going to the cinema with me", - " and many other stuff. You'll always be in my heart,", - " sorry for all the things I did or maybe didn't", - " love you :(", - "KUFO John MacKenzie", - " - Support, helping me always with getting through my life", - " shells, etc etc ;)", - "Sporty_McFly Cedric", - " - Comments, helping me when I got problems with my life and so on", - " *toh* to him - Thanks!", - "Del_Monte K. Hawkes k.hawkes@zombies.force9.net", - " - Is just trying to put the lamer side of things across :cP", - " No. I saw 2 moos. - Well having to input in seconds", - " is fine if you're real quick at maths - but if not - it's a PAIN", - " - Comments, bugfixes, moral support etc.;)", - "Skywalker Chris Morley skywalker@irc.ru.ac.za", - " - Helping me start up ROXnet at first (which brought me", - " into IRCd business.. + Numerous kicks /Kills akills and alike;)", - "zero9000 Kevin Alford", - " - UnrealIRCd logo, graphics, null desu ;), ideas etc.", - " \2\37codemastr would like to thank:\2\37", - "", - " \2\37Also thanks to:\2\37", - "Enforcer, Andy Church, Mick, Sp^, ShadowMastr, Almaris", - "}{, Erik/Dr|zzt, Hedge, Kyle, MissKel, jfc, Fish, kore, Syndicate, Bagge,", - "#Coder-Com@Undernet, ^NeVeR^, flygirl^, DannyM, JuliuZ, wah-wah^, Lisa,", - "Melisa, NonMortal, Andryan, TomaHawk, Lushes, Skywalker, Merlin, Sporty_McFly,", - "zero9000, #wIRCd@DALnet, comstud, dog3, Dianora, Isomer, and others who arent listed here:)", - "", - "------------------------------------------------------", - "Unreal 3.0 and up is dedicated to Morrigan - Julie Frederiksen", - "- a girl who have helped me through anything in my life, hugging", - "me at the right times, a definate dedication. Thanks for the kisses", - "long phonetalks, waste of my mobilephone ;), crying together", - "and making life go on for us both. I will never forget you", - "never leave you, love ya forever", - "------------------------------------------------------", - "This IRCd is dedicated to the love that has always been", - "and will always be there - Thanks to the girls & friends that kept me up", - "when I was down", - 0 -}; -char *unrealcreditsold[] = -{ - "------------------------------------------------------", - "Unreal 3.0 and up is dedicated to Morrigan - Julie Frederiksen", - "- a girl who have helped me through anything in my life, hugging", - "me at the right times, a definate dedication. Thanks for the kisses", - "long phonetalks, waste of my mobilephone ;), crying together", - "and making life go on for us both. I will never forget you", - "never leave you, love ya forever", - "------------------------------------------------------", - "This IRCd is dedicated to the love that has always been", - "and will always be there - Thanks to the girls & friends that kept me up", - "when I was down", - 0 -}; - -char *dalinfotext[] = - { - "IRC --", - "Based on the original code written by Jarkko Oikarinen", - "Copyright 1988, 1989, 1990, 1991 University of Oulu, Computing Center", - "", - "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.", - "- Any name/comment should never be changed except by the one who made it -", - "", - "UnrealIRCd contains code developed by:", - "Potvin Chris Wolkowski potvin@acestar.org", - "RogerY Roger Y. rogery@austnet.org", - "GZ gz@starchat.net", - "binary", - "", - "", - "The following people have helped in making the DALnet ircd", - "that is based on irc2.8.21.mu3.2 :", - "", - "Russell Russell Miller russell@dal.net", - "Donwulff Jukka Santala donwulff@dal.net", - "Aetobatus Michael Sawyer aetobatus@dal.net", - "Dalvenjah Sven Nielsen dalvenjah@dal.net", - "Skandranon Michael Graff explorer@flame.org", - "Barubary - barubary@dal.net", - "white_dragon Chip Norkus wd@dal.net", - "DuffJ Dafydd James duffj@dal.net", - "taz David Kopstain taz@dal.net", - "NikB Nik Bougalis nikb@dal.net", - "Rakarra - rakarra@dal.net", - "DarkRot Lucas Madar darkrot@dal.net", - "Studded - studded@dal.net", - "JoelKatz David Schwartz joelkatz@dal.net", - "", - "This product includes software developed by Colin Plumb.", - "", - "The following persons have made many changes and enhancements to the", - "code and still know how IRC really works if you have questions about it:", - "", - "Run Carlo Kid carlo@runaway.xs4all.nl", - "Avalon Darren Reed avalon@coombs.anu.edu.au", - "msa Markku Savela Markku.Savela@vtt.fi", - "Wumpus Greg Lindahl gl8f@virginia.edu", - "WiZ Jarkko Oikarinen jto@tolsun.oulu.fi", - "Argv Armin Gruner Armin.Gruner@Informatik.TU-Muenchen.de", - "", - "Thanks to the following people for help with preparing 2.8", - "", - "phone Matthew Green phone@coombs.anu.edu.au", - "Sodapop Chuck Kane ckane@ece.uiuc.edu", - "Skygod Matt Lyle matt@oc.com", - "Vesa Vesa Ruokonen ruokonen@lut.fi", - "Nap Nicolas PIOCH pioch@poly.polytechnique.fr", - "", - "Those who helped in prior versions and continue to be helpful:", - "", - "Stellan Klebom Dan Goodwin Mike Bolotski", - "Ian Frechette Markku Jarvinen Kimmo Suominen", - "Jeff Trim Vijay Subramaniam Karl Kleinpaste", - "Bill Wisner Tom Davis Hugo Calendar", - "Tom Hopkins Stephen van den Berg", - "Bo Adler Michael Sandrof Jon Solomon", - "Jan Peterson Helen Rose Paul Graham", - "", - "Thanks also goes to those persons not mentioned here who have added", - "their advice, opinions, and code to IRC.", - "Thanks also to those who provide the kind sys admins who let me and", - "others continue to develop IRC.", - "", - - 0 - };